Contents of /trunk/kernel-alx/patches-5.4/0259-5.4.160-all-fixes.patch
Parent Directory | Revision Log
Revision 3637 -
(show annotations)
(download)
Mon Oct 24 12:40:44 2022 UTC (23 months ago) by niro
File size: 373034 byte(s)
Mon Oct 24 12:40:44 2022 UTC (23 months ago) by niro
File size: 373034 byte(s)
-add missing
1 | diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt |
2 | index dbb68067ba4ea..b11e1fd95ee5f 100644 |
3 | --- a/Documentation/admin-guide/kernel-parameters.txt |
4 | +++ b/Documentation/admin-guide/kernel-parameters.txt |
5 | @@ -5480,6 +5480,13 @@ |
6 | as generic guest with no PV drivers. Currently support |
7 | XEN HVM, KVM, HYPER_V and VMWARE guest. |
8 | |
9 | + xen.balloon_boot_timeout= [XEN] |
10 | + The time (in seconds) to wait before giving up to boot |
11 | + in case initial ballooning fails to free enough memory. |
12 | + Applies only when running as HVM or PVH guest and |
13 | + started with less memory configured than allowed at |
14 | + max. Default is 180. |
15 | + |
16 | xen.event_eoi_delay= [XEN] |
17 | How long to delay EOI handling in case of event |
18 | storms (jiffies). Default is 10. |
19 | diff --git a/Documentation/devicetree/bindings/regulator/samsung,s5m8767.txt b/Documentation/devicetree/bindings/regulator/samsung,s5m8767.txt |
20 | index 093edda0c8dfc..6cd83d920155f 100644 |
21 | --- a/Documentation/devicetree/bindings/regulator/samsung,s5m8767.txt |
22 | +++ b/Documentation/devicetree/bindings/regulator/samsung,s5m8767.txt |
23 | @@ -13,6 +13,14 @@ common regulator binding documented in: |
24 | |
25 | |
26 | Required properties of the main device node (the parent!): |
27 | + - s5m8767,pmic-buck-ds-gpios: GPIO specifiers for three host gpio's used |
28 | + for selecting GPIO DVS lines. It is one-to-one mapped to dvs gpio lines. |
29 | + |
30 | + [1] If either of the 's5m8767,pmic-buck[2/3/4]-uses-gpio-dvs' optional |
31 | + property is specified, then all the eight voltage values for the |
32 | + 's5m8767,pmic-buck[2/3/4]-dvs-voltage' should be specified. |
33 | + |
34 | +Optional properties of the main device node (the parent!): |
35 | - s5m8767,pmic-buck2-dvs-voltage: A set of 8 voltage values in micro-volt (uV) |
36 | units for buck2 when changing voltage using gpio dvs. Refer to [1] below |
37 | for additional information. |
38 | @@ -25,26 +33,13 @@ Required properties of the main device node (the parent!): |
39 | units for buck4 when changing voltage using gpio dvs. Refer to [1] below |
40 | for additional information. |
41 | |
42 | - - s5m8767,pmic-buck-ds-gpios: GPIO specifiers for three host gpio's used |
43 | - for selecting GPIO DVS lines. It is one-to-one mapped to dvs gpio lines. |
44 | - |
45 | - [1] If none of the 's5m8767,pmic-buck[2/3/4]-uses-gpio-dvs' optional |
46 | - property is specified, the 's5m8767,pmic-buck[2/3/4]-dvs-voltage' |
47 | - property should specify atleast one voltage level (which would be a |
48 | - safe operating voltage). |
49 | - |
50 | - If either of the 's5m8767,pmic-buck[2/3/4]-uses-gpio-dvs' optional |
51 | - property is specified, then all the eight voltage values for the |
52 | - 's5m8767,pmic-buck[2/3/4]-dvs-voltage' should be specified. |
53 | - |
54 | -Optional properties of the main device node (the parent!): |
55 | - s5m8767,pmic-buck2-uses-gpio-dvs: 'buck2' can be controlled by gpio dvs. |
56 | - s5m8767,pmic-buck3-uses-gpio-dvs: 'buck3' can be controlled by gpio dvs. |
57 | - s5m8767,pmic-buck4-uses-gpio-dvs: 'buck4' can be controlled by gpio dvs. |
58 | |
59 | Additional properties required if either of the optional properties are used: |
60 | |
61 | - - s5m8767,pmic-buck234-default-dvs-idx: Default voltage setting selected from |
62 | + - s5m8767,pmic-buck-default-dvs-idx: Default voltage setting selected from |
63 | the possible 8 options selectable by the dvs gpios. The value of this |
64 | property should be between 0 and 7. If not specified or if out of range, the |
65 | default value of this property is set to 0. |
66 | diff --git a/Makefile b/Makefile |
67 | index 602b5167dacd7..e938662dab289 100644 |
68 | --- a/Makefile |
69 | +++ b/Makefile |
70 | @@ -1,7 +1,7 @@ |
71 | # SPDX-License-Identifier: GPL-2.0 |
72 | VERSION = 5 |
73 | PATCHLEVEL = 4 |
74 | -SUBLEVEL = 159 |
75 | +SUBLEVEL = 160 |
76 | EXTRAVERSION = |
77 | NAME = Kleptomaniac Octopus |
78 | |
79 | diff --git a/arch/arm/Makefile b/arch/arm/Makefile |
80 | index 1fc32b611f8a4..4f098edfbf202 100644 |
81 | --- a/arch/arm/Makefile |
82 | +++ b/arch/arm/Makefile |
83 | @@ -66,15 +66,15 @@ KBUILD_CFLAGS += $(call cc-option,-fno-ipa-sra) |
84 | # Note that GCC does not numerically define an architecture version |
85 | # macro, but instead defines a whole series of macros which makes |
86 | # testing for a specific architecture or later rather impossible. |
87 | -arch-$(CONFIG_CPU_32v7M) =-D__LINUX_ARM_ARCH__=7 -march=armv7-m -Wa,-march=armv7-m |
88 | -arch-$(CONFIG_CPU_32v7) =-D__LINUX_ARM_ARCH__=7 $(call cc-option,-march=armv7-a,-march=armv5t -Wa$(comma)-march=armv7-a) |
89 | -arch-$(CONFIG_CPU_32v6) =-D__LINUX_ARM_ARCH__=6 $(call cc-option,-march=armv6,-march=armv5t -Wa$(comma)-march=armv6) |
90 | +arch-$(CONFIG_CPU_32v7M) =-D__LINUX_ARM_ARCH__=7 -march=armv7-m |
91 | +arch-$(CONFIG_CPU_32v7) =-D__LINUX_ARM_ARCH__=7 -march=armv7-a |
92 | +arch-$(CONFIG_CPU_32v6) =-D__LINUX_ARM_ARCH__=6 -march=armv6 |
93 | # Only override the compiler option if ARMv6. The ARMv6K extensions are |
94 | # always available in ARMv7 |
95 | ifeq ($(CONFIG_CPU_32v6),y) |
96 | -arch-$(CONFIG_CPU_32v6K) =-D__LINUX_ARM_ARCH__=6 $(call cc-option,-march=armv6k,-march=armv5t -Wa$(comma)-march=armv6k) |
97 | +arch-$(CONFIG_CPU_32v6K) =-D__LINUX_ARM_ARCH__=6 -march=armv6k |
98 | endif |
99 | -arch-$(CONFIG_CPU_32v5) =-D__LINUX_ARM_ARCH__=5 $(call cc-option,-march=armv5te,-march=armv4t) |
100 | +arch-$(CONFIG_CPU_32v5) =-D__LINUX_ARM_ARCH__=5 -march=armv5te |
101 | arch-$(CONFIG_CPU_32v4T) =-D__LINUX_ARM_ARCH__=4 -march=armv4t |
102 | arch-$(CONFIG_CPU_32v4) =-D__LINUX_ARM_ARCH__=4 -march=armv4 |
103 | arch-$(CONFIG_CPU_32v3) =-D__LINUX_ARM_ARCH__=3 -march=armv3m |
104 | @@ -88,7 +88,7 @@ tune-$(CONFIG_CPU_ARM720T) =-mtune=arm7tdmi |
105 | tune-$(CONFIG_CPU_ARM740T) =-mtune=arm7tdmi |
106 | tune-$(CONFIG_CPU_ARM9TDMI) =-mtune=arm9tdmi |
107 | tune-$(CONFIG_CPU_ARM940T) =-mtune=arm9tdmi |
108 | -tune-$(CONFIG_CPU_ARM946E) =$(call cc-option,-mtune=arm9e,-mtune=arm9tdmi) |
109 | +tune-$(CONFIG_CPU_ARM946E) =-mtune=arm9e |
110 | tune-$(CONFIG_CPU_ARM920T) =-mtune=arm9tdmi |
111 | tune-$(CONFIG_CPU_ARM922T) =-mtune=arm9tdmi |
112 | tune-$(CONFIG_CPU_ARM925T) =-mtune=arm9tdmi |
113 | @@ -96,11 +96,11 @@ tune-$(CONFIG_CPU_ARM926T) =-mtune=arm9tdmi |
114 | tune-$(CONFIG_CPU_FA526) =-mtune=arm9tdmi |
115 | tune-$(CONFIG_CPU_SA110) =-mtune=strongarm110 |
116 | tune-$(CONFIG_CPU_SA1100) =-mtune=strongarm1100 |
117 | -tune-$(CONFIG_CPU_XSCALE) =$(call cc-option,-mtune=xscale,-mtune=strongarm110) -Wa,-mcpu=xscale |
118 | -tune-$(CONFIG_CPU_XSC3) =$(call cc-option,-mtune=xscale,-mtune=strongarm110) -Wa,-mcpu=xscale |
119 | -tune-$(CONFIG_CPU_FEROCEON) =$(call cc-option,-mtune=marvell-f,-mtune=xscale) |
120 | -tune-$(CONFIG_CPU_V6) =$(call cc-option,-mtune=arm1136j-s,-mtune=strongarm) |
121 | -tune-$(CONFIG_CPU_V6K) =$(call cc-option,-mtune=arm1136j-s,-mtune=strongarm) |
122 | +tune-$(CONFIG_CPU_XSCALE) =-mtune=xscale |
123 | +tune-$(CONFIG_CPU_XSC3) =-mtune=xscale |
124 | +tune-$(CONFIG_CPU_FEROCEON) =-mtune=xscale |
125 | +tune-$(CONFIG_CPU_V6) =-mtune=arm1136j-s |
126 | +tune-$(CONFIG_CPU_V6K) =-mtune=arm1136j-s |
127 | |
128 | # Evaluate tune cc-option calls now |
129 | tune-y := $(tune-y) |
130 | diff --git a/arch/arm/boot/dts/at91-tse850-3.dts b/arch/arm/boot/dts/at91-tse850-3.dts |
131 | index 3ca97b47c69ce..7e5c598e7e68f 100644 |
132 | --- a/arch/arm/boot/dts/at91-tse850-3.dts |
133 | +++ b/arch/arm/boot/dts/at91-tse850-3.dts |
134 | @@ -262,7 +262,7 @@ |
135 | &macb1 { |
136 | status = "okay"; |
137 | |
138 | - phy-mode = "rgmii"; |
139 | + phy-mode = "rmii"; |
140 | |
141 | #address-cells = <1>; |
142 | #size-cells = <0>; |
143 | diff --git a/arch/arm/boot/dts/omap3-gta04.dtsi b/arch/arm/boot/dts/omap3-gta04.dtsi |
144 | index b6ef1a7ac8a4e..186b2af7743e3 100644 |
145 | --- a/arch/arm/boot/dts/omap3-gta04.dtsi |
146 | +++ b/arch/arm/boot/dts/omap3-gta04.dtsi |
147 | @@ -515,7 +515,7 @@ |
148 | compatible = "bosch,bma180"; |
149 | reg = <0x41>; |
150 | pinctrl-names = "default"; |
151 | - pintcrl-0 = <&bma180_pins>; |
152 | + pinctrl-0 = <&bma180_pins>; |
153 | interrupt-parent = <&gpio4>; |
154 | interrupts = <19 IRQ_TYPE_LEVEL_HIGH>; /* GPIO_115 */ |
155 | }; |
156 | diff --git a/arch/arm/boot/dts/qcom-msm8974.dtsi b/arch/arm/boot/dts/qcom-msm8974.dtsi |
157 | index 369e58f64145d..9de4f17955e31 100644 |
158 | --- a/arch/arm/boot/dts/qcom-msm8974.dtsi |
159 | +++ b/arch/arm/boot/dts/qcom-msm8974.dtsi |
160 | @@ -1213,8 +1213,8 @@ |
161 | #phy-cells = <0>; |
162 | qcom,dsi-phy-index = <0>; |
163 | |
164 | - clocks = <&mmcc MDSS_AHB_CLK>; |
165 | - clock-names = "iface"; |
166 | + clocks = <&mmcc MDSS_AHB_CLK>, <&xo_board>; |
167 | + clock-names = "iface", "ref"; |
168 | }; |
169 | }; |
170 | }; |
171 | diff --git a/arch/arm/boot/dts/stm32mp157c.dtsi b/arch/arm/boot/dts/stm32mp157c.dtsi |
172 | index eca469a64a977..a687c024daa92 100644 |
173 | --- a/arch/arm/boot/dts/stm32mp157c.dtsi |
174 | +++ b/arch/arm/boot/dts/stm32mp157c.dtsi |
175 | @@ -773,7 +773,7 @@ |
176 | #sound-dai-cells = <0>; |
177 | |
178 | compatible = "st,stm32-sai-sub-a"; |
179 | - reg = <0x4 0x1c>; |
180 | + reg = <0x4 0x20>; |
181 | clocks = <&rcc SAI1_K>; |
182 | clock-names = "sai_ck"; |
183 | dmas = <&dmamux1 87 0x400 0x01>; |
184 | @@ -783,7 +783,7 @@ |
185 | sai1b: audio-controller@4400a024 { |
186 | #sound-dai-cells = <0>; |
187 | compatible = "st,stm32-sai-sub-b"; |
188 | - reg = <0x24 0x1c>; |
189 | + reg = <0x24 0x20>; |
190 | clocks = <&rcc SAI1_K>; |
191 | clock-names = "sai_ck"; |
192 | dmas = <&dmamux1 88 0x400 0x01>; |
193 | @@ -804,7 +804,7 @@ |
194 | sai2a: audio-controller@4400b004 { |
195 | #sound-dai-cells = <0>; |
196 | compatible = "st,stm32-sai-sub-a"; |
197 | - reg = <0x4 0x1c>; |
198 | + reg = <0x4 0x20>; |
199 | clocks = <&rcc SAI2_K>; |
200 | clock-names = "sai_ck"; |
201 | dmas = <&dmamux1 89 0x400 0x01>; |
202 | @@ -814,7 +814,7 @@ |
203 | sai2b: audio-controller@4400b024 { |
204 | #sound-dai-cells = <0>; |
205 | compatible = "st,stm32-sai-sub-b"; |
206 | - reg = <0x24 0x1c>; |
207 | + reg = <0x24 0x20>; |
208 | clocks = <&rcc SAI2_K>; |
209 | clock-names = "sai_ck"; |
210 | dmas = <&dmamux1 90 0x400 0x01>; |
211 | @@ -835,7 +835,7 @@ |
212 | sai3a: audio-controller@4400c004 { |
213 | #sound-dai-cells = <0>; |
214 | compatible = "st,stm32-sai-sub-a"; |
215 | - reg = <0x04 0x1c>; |
216 | + reg = <0x04 0x20>; |
217 | clocks = <&rcc SAI3_K>; |
218 | clock-names = "sai_ck"; |
219 | dmas = <&dmamux1 113 0x400 0x01>; |
220 | @@ -845,7 +845,7 @@ |
221 | sai3b: audio-controller@4400c024 { |
222 | #sound-dai-cells = <0>; |
223 | compatible = "st,stm32-sai-sub-b"; |
224 | - reg = <0x24 0x1c>; |
225 | + reg = <0x24 0x20>; |
226 | clocks = <&rcc SAI3_K>; |
227 | clock-names = "sai_ck"; |
228 | dmas = <&dmamux1 114 0x400 0x01>; |
229 | @@ -1191,7 +1191,7 @@ |
230 | sai4a: audio-controller@50027004 { |
231 | #sound-dai-cells = <0>; |
232 | compatible = "st,stm32-sai-sub-a"; |
233 | - reg = <0x04 0x1c>; |
234 | + reg = <0x04 0x20>; |
235 | clocks = <&rcc SAI4_K>; |
236 | clock-names = "sai_ck"; |
237 | dmas = <&dmamux1 99 0x400 0x01>; |
238 | @@ -1201,7 +1201,7 @@ |
239 | sai4b: audio-controller@50027024 { |
240 | #sound-dai-cells = <0>; |
241 | compatible = "st,stm32-sai-sub-b"; |
242 | - reg = <0x24 0x1c>; |
243 | + reg = <0x24 0x20>; |
244 | clocks = <&rcc SAI4_K>; |
245 | clock-names = "sai_ck"; |
246 | dmas = <&dmamux1 100 0x400 0x01>; |
247 | diff --git a/arch/arm/boot/dts/sun7i-a20-olinuxino-lime2.dts b/arch/arm/boot/dts/sun7i-a20-olinuxino-lime2.dts |
248 | index 9ba62774e89a1..488933b87ad5a 100644 |
249 | --- a/arch/arm/boot/dts/sun7i-a20-olinuxino-lime2.dts |
250 | +++ b/arch/arm/boot/dts/sun7i-a20-olinuxino-lime2.dts |
251 | @@ -112,7 +112,7 @@ |
252 | pinctrl-names = "default"; |
253 | pinctrl-0 = <&gmac_rgmii_pins>; |
254 | phy-handle = <&phy1>; |
255 | - phy-mode = "rgmii"; |
256 | + phy-mode = "rgmii-id"; |
257 | status = "okay"; |
258 | }; |
259 | |
260 | diff --git a/arch/arm/kernel/stacktrace.c b/arch/arm/kernel/stacktrace.c |
261 | index 76ea4178a55cb..db798eac74315 100644 |
262 | --- a/arch/arm/kernel/stacktrace.c |
263 | +++ b/arch/arm/kernel/stacktrace.c |
264 | @@ -54,8 +54,7 @@ int notrace unwind_frame(struct stackframe *frame) |
265 | |
266 | frame->sp = frame->fp; |
267 | frame->fp = *(unsigned long *)(fp); |
268 | - frame->pc = frame->lr; |
269 | - frame->lr = *(unsigned long *)(fp + 4); |
270 | + frame->pc = *(unsigned long *)(fp + 4); |
271 | #else |
272 | /* check current frame pointer is within bounds */ |
273 | if (fp < low + 12 || fp > high - 4) |
274 | diff --git a/arch/arm/mm/Kconfig b/arch/arm/mm/Kconfig |
275 | index 0ab3a86b1f523..fc388eb60e0b7 100644 |
276 | --- a/arch/arm/mm/Kconfig |
277 | +++ b/arch/arm/mm/Kconfig |
278 | @@ -752,7 +752,7 @@ config CPU_BIG_ENDIAN |
279 | config CPU_ENDIAN_BE8 |
280 | bool |
281 | depends on CPU_BIG_ENDIAN |
282 | - default CPU_V6 || CPU_V6K || CPU_V7 |
283 | + default CPU_V6 || CPU_V6K || CPU_V7 || CPU_V7M |
284 | help |
285 | Support for the BE-8 (big-endian) mode on ARMv6 and ARMv7 processors. |
286 | |
287 | diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c |
288 | index ee943ac325560..538d5da741b09 100644 |
289 | --- a/arch/arm/mm/mmu.c |
290 | +++ b/arch/arm/mm/mmu.c |
291 | @@ -415,9 +415,9 @@ void __set_fixmap(enum fixed_addresses idx, phys_addr_t phys, pgprot_t prot) |
292 | FIXADDR_END); |
293 | BUG_ON(idx >= __end_of_fixed_addresses); |
294 | |
295 | - /* we only support device mappings until pgprot_kernel has been set */ |
296 | + /* We support only device mappings before pgprot_kernel is set. */ |
297 | if (WARN_ON(pgprot_val(prot) != pgprot_val(FIXMAP_PAGE_IO) && |
298 | - pgprot_val(pgprot_kernel) == 0)) |
299 | + pgprot_val(prot) && pgprot_val(pgprot_kernel) == 0)) |
300 | return; |
301 | |
302 | if (pgprot_val(prot)) |
303 | diff --git a/arch/arm64/boot/dts/amlogic/meson-g12a-sei510.dts b/arch/arm64/boot/dts/amlogic/meson-g12a-sei510.dts |
304 | index c9fa23a565624..b8d9e92197ac8 100644 |
305 | --- a/arch/arm64/boot/dts/amlogic/meson-g12a-sei510.dts |
306 | +++ b/arch/arm64/boot/dts/amlogic/meson-g12a-sei510.dts |
307 | @@ -139,7 +139,7 @@ |
308 | regulator-min-microvolt = <721000>; |
309 | regulator-max-microvolt = <1022000>; |
310 | |
311 | - vin-supply = <&dc_in>; |
312 | + pwm-supply = <&dc_in>; |
313 | |
314 | pwms = <&pwm_AO_cd 1 1250 0>; |
315 | pwm-dutycycle-range = <100 0>; |
316 | diff --git a/arch/arm64/boot/dts/amlogic/meson-g12a-u200.dts b/arch/arm64/boot/dts/amlogic/meson-g12a-u200.dts |
317 | index 2a324f0136e3f..02ec6eda03b1c 100644 |
318 | --- a/arch/arm64/boot/dts/amlogic/meson-g12a-u200.dts |
319 | +++ b/arch/arm64/boot/dts/amlogic/meson-g12a-u200.dts |
320 | @@ -139,7 +139,7 @@ |
321 | regulator-min-microvolt = <721000>; |
322 | regulator-max-microvolt = <1022000>; |
323 | |
324 | - vin-supply = <&main_12v>; |
325 | + pwm-supply = <&main_12v>; |
326 | |
327 | pwms = <&pwm_AO_cd 1 1250 0>; |
328 | pwm-dutycycle-range = <100 0>; |
329 | diff --git a/arch/arm64/boot/dts/amlogic/meson-g12a-x96-max.dts b/arch/arm64/boot/dts/amlogic/meson-g12a-x96-max.dts |
330 | index c48125bf9d1e3..5209c44fda01a 100644 |
331 | --- a/arch/arm64/boot/dts/amlogic/meson-g12a-x96-max.dts |
332 | +++ b/arch/arm64/boot/dts/amlogic/meson-g12a-x96-max.dts |
333 | @@ -139,7 +139,7 @@ |
334 | regulator-min-microvolt = <721000>; |
335 | regulator-max-microvolt = <1022000>; |
336 | |
337 | - vin-supply = <&dc_in>; |
338 | + pwm-supply = <&dc_in>; |
339 | |
340 | pwms = <&pwm_AO_cd 1 1250 0>; |
341 | pwm-dutycycle-range = <100 0>; |
342 | diff --git a/arch/arm64/boot/dts/rockchip/rk3328.dtsi b/arch/arm64/boot/dts/rockchip/rk3328.dtsi |
343 | index 44ad744c4710d..6ddb6b8c1fad5 100644 |
344 | --- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi |
345 | +++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi |
346 | @@ -555,7 +555,7 @@ |
347 | |
348 | gpu: gpu@ff300000 { |
349 | compatible = "rockchip,rk3328-mali", "arm,mali-450"; |
350 | - reg = <0x0 0xff300000 0x0 0x40000>; |
351 | + reg = <0x0 0xff300000 0x0 0x30000>; |
352 | interrupts = <GIC_SPI 90 IRQ_TYPE_LEVEL_HIGH>, |
353 | <GIC_SPI 87 IRQ_TYPE_LEVEL_HIGH>, |
354 | <GIC_SPI 93 IRQ_TYPE_LEVEL_HIGH>, |
355 | diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h |
356 | index a92a187ec8919..3a057d4279007 100644 |
357 | --- a/arch/arm64/include/asm/pgtable.h |
358 | +++ b/arch/arm64/include/asm/pgtable.h |
359 | @@ -54,9 +54,15 @@ extern unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)]; |
360 | * page table entry, taking care of 52-bit addresses. |
361 | */ |
362 | #ifdef CONFIG_ARM64_PA_BITS_52 |
363 | -#define __pte_to_phys(pte) \ |
364 | - ((pte_val(pte) & PTE_ADDR_LOW) | ((pte_val(pte) & PTE_ADDR_HIGH) << 36)) |
365 | -#define __phys_to_pte_val(phys) (((phys) | ((phys) >> 36)) & PTE_ADDR_MASK) |
366 | +static inline phys_addr_t __pte_to_phys(pte_t pte) |
367 | +{ |
368 | + return (pte_val(pte) & PTE_ADDR_LOW) | |
369 | + ((pte_val(pte) & PTE_ADDR_HIGH) << 36); |
370 | +} |
371 | +static inline pteval_t __phys_to_pte_val(phys_addr_t phys) |
372 | +{ |
373 | + return (phys | (phys >> 36)) & PTE_ADDR_MASK; |
374 | +} |
375 | #else |
376 | #define __pte_to_phys(pte) (pte_val(pte) & PTE_ADDR_MASK) |
377 | #define __phys_to_pte_val(phys) (phys) |
378 | diff --git a/arch/arm64/net/bpf_jit_comp.c b/arch/arm64/net/bpf_jit_comp.c |
379 | index afc7d41347f73..a343677837c77 100644 |
380 | --- a/arch/arm64/net/bpf_jit_comp.c |
381 | +++ b/arch/arm64/net/bpf_jit_comp.c |
382 | @@ -996,6 +996,11 @@ out: |
383 | return prog; |
384 | } |
385 | |
386 | +u64 bpf_jit_alloc_exec_limit(void) |
387 | +{ |
388 | + return BPF_JIT_REGION_SIZE; |
389 | +} |
390 | + |
391 | void *bpf_jit_alloc_exec(unsigned long size) |
392 | { |
393 | return __vmalloc_node_range(size, PAGE_SIZE, BPF_JIT_REGION_START, |
394 | diff --git a/arch/ia64/Kconfig.debug b/arch/ia64/Kconfig.debug |
395 | index 40ca23bd228d6..2ce008e2d1644 100644 |
396 | --- a/arch/ia64/Kconfig.debug |
397 | +++ b/arch/ia64/Kconfig.debug |
398 | @@ -39,7 +39,7 @@ config DISABLE_VHPT |
399 | |
400 | config IA64_DEBUG_CMPXCHG |
401 | bool "Turn on compare-and-exchange bug checking (slow!)" |
402 | - depends on DEBUG_KERNEL |
403 | + depends on DEBUG_KERNEL && PRINTK |
404 | help |
405 | Selecting this option turns on bug checking for the IA-64 |
406 | compare-and-exchange instructions. This is slow! Itaniums |
407 | diff --git a/arch/ia64/kernel/kprobes.c b/arch/ia64/kernel/kprobes.c |
408 | index b3dc39050c1ad..8a223d0e4918c 100644 |
409 | --- a/arch/ia64/kernel/kprobes.c |
410 | +++ b/arch/ia64/kernel/kprobes.c |
411 | @@ -398,7 +398,8 @@ static void kretprobe_trampoline(void) |
412 | |
413 | int __kprobes trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs) |
414 | { |
415 | - regs->cr_iip = __kretprobe_trampoline_handler(regs, kretprobe_trampoline, NULL); |
416 | + regs->cr_iip = __kretprobe_trampoline_handler(regs, |
417 | + dereference_function_descriptor(kretprobe_trampoline), NULL); |
418 | /* |
419 | * By returning a non-zero value, we are telling |
420 | * kprobe_handler() that we don't want the post_handler |
421 | @@ -414,7 +415,7 @@ void __kprobes arch_prepare_kretprobe(struct kretprobe_instance *ri, |
422 | ri->fp = NULL; |
423 | |
424 | /* Replace the return addr with trampoline addr */ |
425 | - regs->b0 = ((struct fnptr *)kretprobe_trampoline)->ip; |
426 | + regs->b0 = (unsigned long)dereference_function_descriptor(kretprobe_trampoline); |
427 | } |
428 | |
429 | /* Check the instruction in the slot is break */ |
430 | @@ -918,14 +919,14 @@ static struct kprobe trampoline_p = { |
431 | int __init arch_init_kprobes(void) |
432 | { |
433 | trampoline_p.addr = |
434 | - (kprobe_opcode_t *)((struct fnptr *)kretprobe_trampoline)->ip; |
435 | + dereference_function_descriptor(kretprobe_trampoline); |
436 | return register_kprobe(&trampoline_p); |
437 | } |
438 | |
439 | int __kprobes arch_trampoline_kprobe(struct kprobe *p) |
440 | { |
441 | if (p->addr == |
442 | - (kprobe_opcode_t *)((struct fnptr *)kretprobe_trampoline)->ip) |
443 | + dereference_function_descriptor(kretprobe_trampoline)) |
444 | return 1; |
445 | |
446 | return 0; |
447 | diff --git a/arch/m68k/Kconfig.machine b/arch/m68k/Kconfig.machine |
448 | index 1bbe0dd0c4fe5..b88a980f56f8a 100644 |
449 | --- a/arch/m68k/Kconfig.machine |
450 | +++ b/arch/m68k/Kconfig.machine |
451 | @@ -190,6 +190,7 @@ config INIT_LCD |
452 | config MEMORY_RESERVE |
453 | int "Memory reservation (MiB)" |
454 | depends on (UCSIMM || UCDIMM) |
455 | + default 0 |
456 | help |
457 | Reserve certain memory regions on 68x328 based boards. |
458 | |
459 | diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig |
460 | index 2bfef67d52c63..041d34975ea2c 100644 |
461 | --- a/arch/mips/Kconfig |
462 | +++ b/arch/mips/Kconfig |
463 | @@ -1393,6 +1393,7 @@ config CPU_LOONGSON3 |
464 | select WEAK_REORDERING_BEYOND_LLSC |
465 | select MIPS_PGD_C0_CONTEXT |
466 | select MIPS_L1_CACHE_SHIFT_6 |
467 | + select MIPS_FP_SUPPORT |
468 | select GPIOLIB |
469 | select SWIOTLB |
470 | help |
471 | diff --git a/arch/mips/include/asm/mips-cm.h b/arch/mips/include/asm/mips-cm.h |
472 | index aeae2effa123d..23c67c0871b17 100644 |
473 | --- a/arch/mips/include/asm/mips-cm.h |
474 | +++ b/arch/mips/include/asm/mips-cm.h |
475 | @@ -11,6 +11,7 @@ |
476 | #ifndef __MIPS_ASM_MIPS_CM_H__ |
477 | #define __MIPS_ASM_MIPS_CM_H__ |
478 | |
479 | +#include <linux/bitfield.h> |
480 | #include <linux/bitops.h> |
481 | #include <linux/errno.h> |
482 | |
483 | @@ -153,8 +154,8 @@ GCR_ACCESSOR_RO(32, 0x030, rev) |
484 | #define CM_GCR_REV_MINOR GENMASK(7, 0) |
485 | |
486 | #define CM_ENCODE_REV(major, minor) \ |
487 | - (((major) << __ffs(CM_GCR_REV_MAJOR)) | \ |
488 | - ((minor) << __ffs(CM_GCR_REV_MINOR))) |
489 | + (FIELD_PREP(CM_GCR_REV_MAJOR, major) | \ |
490 | + FIELD_PREP(CM_GCR_REV_MINOR, minor)) |
491 | |
492 | #define CM_REV_CM2 CM_ENCODE_REV(6, 0) |
493 | #define CM_REV_CM2_5 CM_ENCODE_REV(7, 0) |
494 | @@ -362,10 +363,10 @@ static inline int mips_cm_revision(void) |
495 | static inline unsigned int mips_cm_max_vp_width(void) |
496 | { |
497 | extern int smp_num_siblings; |
498 | - uint32_t cfg; |
499 | |
500 | if (mips_cm_revision() >= CM_REV_CM3) |
501 | - return read_gcr_sys_config2() & CM_GCR_SYS_CONFIG2_MAXVPW; |
502 | + return FIELD_GET(CM_GCR_SYS_CONFIG2_MAXVPW, |
503 | + read_gcr_sys_config2()); |
504 | |
505 | if (mips_cm_present()) { |
506 | /* |
507 | @@ -373,8 +374,7 @@ static inline unsigned int mips_cm_max_vp_width(void) |
508 | * number of VP(E)s, and if that ever changes then this will |
509 | * need revisiting. |
510 | */ |
511 | - cfg = read_gcr_cl_config() & CM_GCR_Cx_CONFIG_PVPE; |
512 | - return (cfg >> __ffs(CM_GCR_Cx_CONFIG_PVPE)) + 1; |
513 | + return FIELD_GET(CM_GCR_Cx_CONFIG_PVPE, read_gcr_cl_config()) + 1; |
514 | } |
515 | |
516 | if (IS_ENABLED(CONFIG_SMP)) |
517 | diff --git a/arch/mips/kernel/mips-cm.c b/arch/mips/kernel/mips-cm.c |
518 | index a9eab83d9148d..611ef512c0b81 100644 |
519 | --- a/arch/mips/kernel/mips-cm.c |
520 | +++ b/arch/mips/kernel/mips-cm.c |
521 | @@ -179,8 +179,7 @@ static void mips_cm_probe_l2sync(void) |
522 | phys_addr_t addr; |
523 | |
524 | /* L2-only sync was introduced with CM major revision 6 */ |
525 | - major_rev = (read_gcr_rev() & CM_GCR_REV_MAJOR) >> |
526 | - __ffs(CM_GCR_REV_MAJOR); |
527 | + major_rev = FIELD_GET(CM_GCR_REV_MAJOR, read_gcr_rev()); |
528 | if (major_rev < 6) |
529 | return; |
530 | |
531 | @@ -263,13 +262,13 @@ void mips_cm_lock_other(unsigned int cluster, unsigned int core, |
532 | preempt_disable(); |
533 | |
534 | if (cm_rev >= CM_REV_CM3) { |
535 | - val = core << __ffs(CM3_GCR_Cx_OTHER_CORE); |
536 | - val |= vp << __ffs(CM3_GCR_Cx_OTHER_VP); |
537 | + val = FIELD_PREP(CM3_GCR_Cx_OTHER_CORE, core) | |
538 | + FIELD_PREP(CM3_GCR_Cx_OTHER_VP, vp); |
539 | |
540 | if (cm_rev >= CM_REV_CM3_5) { |
541 | val |= CM_GCR_Cx_OTHER_CLUSTER_EN; |
542 | - val |= cluster << __ffs(CM_GCR_Cx_OTHER_CLUSTER); |
543 | - val |= block << __ffs(CM_GCR_Cx_OTHER_BLOCK); |
544 | + val |= FIELD_PREP(CM_GCR_Cx_OTHER_CLUSTER, cluster); |
545 | + val |= FIELD_PREP(CM_GCR_Cx_OTHER_BLOCK, block); |
546 | } else { |
547 | WARN_ON(cluster != 0); |
548 | WARN_ON(block != CM_GCR_Cx_OTHER_BLOCK_LOCAL); |
549 | @@ -299,7 +298,7 @@ void mips_cm_lock_other(unsigned int cluster, unsigned int core, |
550 | spin_lock_irqsave(&per_cpu(cm_core_lock, curr_core), |
551 | per_cpu(cm_core_lock_flags, curr_core)); |
552 | |
553 | - val = core << __ffs(CM_GCR_Cx_OTHER_CORENUM); |
554 | + val = FIELD_PREP(CM_GCR_Cx_OTHER_CORENUM, core); |
555 | } |
556 | |
557 | write_gcr_cl_other(val); |
558 | @@ -343,8 +342,8 @@ void mips_cm_error_report(void) |
559 | cm_other = read_gcr_error_mult(); |
560 | |
561 | if (revision < CM_REV_CM3) { /* CM2 */ |
562 | - cause = cm_error >> __ffs(CM_GCR_ERROR_CAUSE_ERRTYPE); |
563 | - ocause = cm_other >> __ffs(CM_GCR_ERROR_MULT_ERR2ND); |
564 | + cause = FIELD_GET(CM_GCR_ERROR_CAUSE_ERRTYPE, cm_error); |
565 | + ocause = FIELD_GET(CM_GCR_ERROR_MULT_ERR2ND, cm_other); |
566 | |
567 | if (!cause) |
568 | return; |
569 | @@ -386,8 +385,8 @@ void mips_cm_error_report(void) |
570 | ulong core_id_bits, vp_id_bits, cmd_bits, cmd_group_bits; |
571 | ulong cm3_cca_bits, mcp_bits, cm3_tr_bits, sched_bit; |
572 | |
573 | - cause = cm_error >> __ffs64(CM3_GCR_ERROR_CAUSE_ERRTYPE); |
574 | - ocause = cm_other >> __ffs(CM_GCR_ERROR_MULT_ERR2ND); |
575 | + cause = FIELD_GET(CM3_GCR_ERROR_CAUSE_ERRTYPE, cm_error); |
576 | + ocause = FIELD_GET(CM_GCR_ERROR_MULT_ERR2ND, cm_other); |
577 | |
578 | if (!cause) |
579 | return; |
580 | diff --git a/arch/mips/kernel/r2300_fpu.S b/arch/mips/kernel/r2300_fpu.S |
581 | index 12e58053544fc..cbf6db98cfb38 100644 |
582 | --- a/arch/mips/kernel/r2300_fpu.S |
583 | +++ b/arch/mips/kernel/r2300_fpu.S |
584 | @@ -29,8 +29,8 @@ |
585 | #define EX2(a,b) \ |
586 | 9: a,##b; \ |
587 | .section __ex_table,"a"; \ |
588 | - PTR 9b,bad_stack; \ |
589 | - PTR 9b+4,bad_stack; \ |
590 | + PTR 9b,fault; \ |
591 | + PTR 9b+4,fault; \ |
592 | .previous |
593 | |
594 | .set mips1 |
595 | diff --git a/arch/mips/kernel/syscall.c b/arch/mips/kernel/syscall.c |
596 | index 3f16f38230310..9a28e79f2e66e 100644 |
597 | --- a/arch/mips/kernel/syscall.c |
598 | +++ b/arch/mips/kernel/syscall.c |
599 | @@ -239,12 +239,3 @@ SYSCALL_DEFINE3(cachectl, char *, addr, int, nbytes, int, op) |
600 | { |
601 | return -ENOSYS; |
602 | } |
603 | - |
604 | -/* |
605 | - * If we ever come here the user sp is bad. Zap the process right away. |
606 | - * Due to the bad stack signaling wouldn't work. |
607 | - */ |
608 | -asmlinkage void bad_stack(void) |
609 | -{ |
610 | - do_exit(SIGSEGV); |
611 | -} |
612 | diff --git a/arch/mips/lantiq/xway/dma.c b/arch/mips/lantiq/xway/dma.c |
613 | index aeb1b989cd4ee..e45077aecf83a 100644 |
614 | --- a/arch/mips/lantiq/xway/dma.c |
615 | +++ b/arch/mips/lantiq/xway/dma.c |
616 | @@ -11,6 +11,7 @@ |
617 | #include <linux/export.h> |
618 | #include <linux/spinlock.h> |
619 | #include <linux/clk.h> |
620 | +#include <linux/delay.h> |
621 | #include <linux/err.h> |
622 | |
623 | #include <lantiq_soc.h> |
624 | @@ -29,6 +30,7 @@ |
625 | #define LTQ_DMA_PCTRL 0x44 |
626 | #define LTQ_DMA_IRNEN 0xf4 |
627 | |
628 | +#define DMA_ID_CHNR GENMASK(26, 20) /* channel number */ |
629 | #define DMA_DESCPT BIT(3) /* descriptor complete irq */ |
630 | #define DMA_TX BIT(8) /* TX channel direction */ |
631 | #define DMA_CHAN_ON BIT(0) /* channel on / off bit */ |
632 | @@ -39,7 +41,6 @@ |
633 | #define DMA_POLL BIT(31) /* turn on channel polling */ |
634 | #define DMA_CLK_DIV4 BIT(6) /* polling clock divider */ |
635 | #define DMA_2W_BURST BIT(1) /* 2 word burst length */ |
636 | -#define DMA_MAX_CHANNEL 20 /* the soc has 20 channels */ |
637 | #define DMA_ETOP_ENDIANNESS (0xf << 8) /* endianness swap etop channels */ |
638 | #define DMA_WEIGHT (BIT(17) | BIT(16)) /* default channel wheight */ |
639 | |
640 | @@ -205,7 +206,7 @@ ltq_dma_init(struct platform_device *pdev) |
641 | { |
642 | struct clk *clk; |
643 | struct resource *res; |
644 | - unsigned id; |
645 | + unsigned int id, nchannels; |
646 | int i; |
647 | |
648 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
649 | @@ -221,21 +222,24 @@ ltq_dma_init(struct platform_device *pdev) |
650 | clk_enable(clk); |
651 | ltq_dma_w32_mask(0, DMA_RESET, LTQ_DMA_CTRL); |
652 | |
653 | + usleep_range(1, 10); |
654 | + |
655 | /* disable all interrupts */ |
656 | ltq_dma_w32(0, LTQ_DMA_IRNEN); |
657 | |
658 | /* reset/configure each channel */ |
659 | - for (i = 0; i < DMA_MAX_CHANNEL; i++) { |
660 | + id = ltq_dma_r32(LTQ_DMA_ID); |
661 | + nchannels = ((id & DMA_ID_CHNR) >> 20); |
662 | + for (i = 0; i < nchannels; i++) { |
663 | ltq_dma_w32(i, LTQ_DMA_CS); |
664 | ltq_dma_w32(DMA_CHAN_RST, LTQ_DMA_CCTRL); |
665 | ltq_dma_w32(DMA_POLL | DMA_CLK_DIV4, LTQ_DMA_CPOLL); |
666 | ltq_dma_w32_mask(DMA_CHAN_ON, 0, LTQ_DMA_CCTRL); |
667 | } |
668 | |
669 | - id = ltq_dma_r32(LTQ_DMA_ID); |
670 | dev_info(&pdev->dev, |
671 | "Init done - hw rev: %X, ports: %d, channels: %d\n", |
672 | - id & 0x1f, (id >> 16) & 0xf, id >> 20); |
673 | + id & 0x1f, (id >> 16) & 0xf, nchannels); |
674 | |
675 | return 0; |
676 | } |
677 | diff --git a/arch/parisc/kernel/entry.S b/arch/parisc/kernel/entry.S |
678 | index 873bf3434da94..7d14e9ae18fb1 100644 |
679 | --- a/arch/parisc/kernel/entry.S |
680 | +++ b/arch/parisc/kernel/entry.S |
681 | @@ -1841,7 +1841,7 @@ syscall_restore: |
682 | LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1 |
683 | |
684 | /* Are we being ptraced? */ |
685 | - ldw TASK_FLAGS(%r1),%r19 |
686 | + LDREG TI_FLAGS-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r19 |
687 | ldi _TIF_SYSCALL_TRACE_MASK,%r2 |
688 | and,COND(=) %r19,%r2,%r0 |
689 | b,n syscall_restore_rfi |
690 | diff --git a/arch/parisc/kernel/smp.c b/arch/parisc/kernel/smp.c |
691 | index e202c37e56af3..9997465c11820 100644 |
692 | --- a/arch/parisc/kernel/smp.c |
693 | +++ b/arch/parisc/kernel/smp.c |
694 | @@ -29,6 +29,7 @@ |
695 | #include <linux/bitops.h> |
696 | #include <linux/ftrace.h> |
697 | #include <linux/cpu.h> |
698 | +#include <linux/kgdb.h> |
699 | |
700 | #include <linux/atomic.h> |
701 | #include <asm/current.h> |
702 | @@ -71,7 +72,10 @@ enum ipi_message_type { |
703 | IPI_CALL_FUNC, |
704 | IPI_CPU_START, |
705 | IPI_CPU_STOP, |
706 | - IPI_CPU_TEST |
707 | + IPI_CPU_TEST, |
708 | +#ifdef CONFIG_KGDB |
709 | + IPI_ENTER_KGDB, |
710 | +#endif |
711 | }; |
712 | |
713 | |
714 | @@ -169,7 +173,12 @@ ipi_interrupt(int irq, void *dev_id) |
715 | case IPI_CPU_TEST: |
716 | smp_debug(100, KERN_DEBUG "CPU%d is alive!\n", this_cpu); |
717 | break; |
718 | - |
719 | +#ifdef CONFIG_KGDB |
720 | + case IPI_ENTER_KGDB: |
721 | + smp_debug(100, KERN_DEBUG "CPU%d ENTER_KGDB\n", this_cpu); |
722 | + kgdb_nmicallback(raw_smp_processor_id(), get_irq_regs()); |
723 | + break; |
724 | +#endif |
725 | default: |
726 | printk(KERN_CRIT "Unknown IPI num on CPU%d: %lu\n", |
727 | this_cpu, which); |
728 | @@ -225,6 +234,12 @@ send_IPI_allbutself(enum ipi_message_type op) |
729 | } |
730 | } |
731 | |
732 | +#ifdef CONFIG_KGDB |
733 | +void kgdb_roundup_cpus(void) |
734 | +{ |
735 | + send_IPI_allbutself(IPI_ENTER_KGDB); |
736 | +} |
737 | +#endif |
738 | |
739 | inline void |
740 | smp_send_stop(void) { send_IPI_allbutself(IPI_CPU_STOP); } |
741 | diff --git a/arch/parisc/kernel/unwind.c b/arch/parisc/kernel/unwind.c |
742 | index 87ae476d1c4f5..86a57fb0e6fae 100644 |
743 | --- a/arch/parisc/kernel/unwind.c |
744 | +++ b/arch/parisc/kernel/unwind.c |
745 | @@ -21,6 +21,8 @@ |
746 | #include <asm/ptrace.h> |
747 | |
748 | #include <asm/unwind.h> |
749 | +#include <asm/switch_to.h> |
750 | +#include <asm/sections.h> |
751 | |
752 | /* #define DEBUG 1 */ |
753 | #ifdef DEBUG |
754 | @@ -203,6 +205,11 @@ int __init unwind_init(void) |
755 | return 0; |
756 | } |
757 | |
758 | +static bool pc_is_kernel_fn(unsigned long pc, void *fn) |
759 | +{ |
760 | + return (unsigned long)dereference_kernel_function_descriptor(fn) == pc; |
761 | +} |
762 | + |
763 | static int unwind_special(struct unwind_frame_info *info, unsigned long pc, int frame_size) |
764 | { |
765 | /* |
766 | @@ -221,7 +228,7 @@ static int unwind_special(struct unwind_frame_info *info, unsigned long pc, int |
767 | extern void * const _call_on_stack; |
768 | #endif /* CONFIG_IRQSTACKS */ |
769 | |
770 | - if (pc == (unsigned long) &handle_interruption) { |
771 | + if (pc_is_kernel_fn(pc, handle_interruption)) { |
772 | struct pt_regs *regs = (struct pt_regs *)(info->sp - frame_size - PT_SZ_ALGN); |
773 | dbg("Unwinding through handle_interruption()\n"); |
774 | info->prev_sp = regs->gr[30]; |
775 | @@ -229,13 +236,13 @@ static int unwind_special(struct unwind_frame_info *info, unsigned long pc, int |
776 | return 1; |
777 | } |
778 | |
779 | - if (pc == (unsigned long) &ret_from_kernel_thread || |
780 | - pc == (unsigned long) &syscall_exit) { |
781 | + if (pc_is_kernel_fn(pc, ret_from_kernel_thread) || |
782 | + pc_is_kernel_fn(pc, syscall_exit)) { |
783 | info->prev_sp = info->prev_ip = 0; |
784 | return 1; |
785 | } |
786 | |
787 | - if (pc == (unsigned long) &intr_return) { |
788 | + if (pc_is_kernel_fn(pc, intr_return)) { |
789 | struct pt_regs *regs; |
790 | |
791 | dbg("Found intr_return()\n"); |
792 | @@ -246,20 +253,20 @@ static int unwind_special(struct unwind_frame_info *info, unsigned long pc, int |
793 | return 1; |
794 | } |
795 | |
796 | - if (pc == (unsigned long) &_switch_to_ret) { |
797 | + if (pc_is_kernel_fn(pc, _switch_to) || |
798 | + pc_is_kernel_fn(pc, _switch_to_ret)) { |
799 | info->prev_sp = info->sp - CALLEE_SAVE_FRAME_SIZE; |
800 | info->prev_ip = *(unsigned long *)(info->prev_sp - RP_OFFSET); |
801 | return 1; |
802 | } |
803 | |
804 | #ifdef CONFIG_IRQSTACKS |
805 | - if (pc == (unsigned long) &_call_on_stack) { |
806 | + if (pc_is_kernel_fn(pc, _call_on_stack)) { |
807 | info->prev_sp = *(unsigned long *)(info->sp - FRAME_SIZE - REG_SZ); |
808 | info->prev_ip = *(unsigned long *)(info->sp - FRAME_SIZE - RP_OFFSET); |
809 | return 1; |
810 | } |
811 | #endif |
812 | - |
813 | return 0; |
814 | } |
815 | |
816 | diff --git a/arch/parisc/kernel/vmlinux.lds.S b/arch/parisc/kernel/vmlinux.lds.S |
817 | index 99cd24f2ea01b..164483b37d854 100644 |
818 | --- a/arch/parisc/kernel/vmlinux.lds.S |
819 | +++ b/arch/parisc/kernel/vmlinux.lds.S |
820 | @@ -56,6 +56,8 @@ SECTIONS |
821 | { |
822 | . = KERNEL_BINARY_TEXT_START; |
823 | |
824 | + _stext = .; /* start of kernel text, includes init code & data */ |
825 | + |
826 | __init_begin = .; |
827 | HEAD_TEXT_SECTION |
828 | MLONGCALL_DISCARD(INIT_TEXT_SECTION(8)) |
829 | @@ -79,7 +81,6 @@ SECTIONS |
830 | /* freed after init ends here */ |
831 | |
832 | _text = .; /* Text and read-only data */ |
833 | - _stext = .; |
834 | MLONGCALL_KEEP(INIT_TEXT_SECTION(8)) |
835 | .text ALIGN(PAGE_SIZE) : { |
836 | TEXT_TEXT |
837 | diff --git a/arch/parisc/mm/fixmap.c b/arch/parisc/mm/fixmap.c |
838 | index 474cd241c1509..02e19a32e6c5f 100644 |
839 | --- a/arch/parisc/mm/fixmap.c |
840 | +++ b/arch/parisc/mm/fixmap.c |
841 | @@ -18,12 +18,9 @@ void notrace set_fixmap(enum fixed_addresses idx, phys_addr_t phys) |
842 | pte_t *pte; |
843 | |
844 | if (pmd_none(*pmd)) |
845 | - pmd = pmd_alloc(NULL, pgd, vaddr); |
846 | - |
847 | - pte = pte_offset_kernel(pmd, vaddr); |
848 | - if (pte_none(*pte)) |
849 | pte = pte_alloc_kernel(pmd, vaddr); |
850 | |
851 | + pte = pte_offset_kernel(pmd, vaddr); |
852 | set_pte_at(&init_mm, vaddr, pte, __mk_pte(phys, PAGE_KERNEL_RWX)); |
853 | flush_tlb_kernel_range(vaddr, vaddr + PAGE_SIZE); |
854 | } |
855 | diff --git a/arch/parisc/mm/init.c b/arch/parisc/mm/init.c |
856 | index 3e54484797f62..d769d61cde7ca 100644 |
857 | --- a/arch/parisc/mm/init.c |
858 | +++ b/arch/parisc/mm/init.c |
859 | @@ -892,9 +892,9 @@ void flush_tlb_all(void) |
860 | { |
861 | int do_recycle; |
862 | |
863 | - __inc_irq_stat(irq_tlb_count); |
864 | do_recycle = 0; |
865 | spin_lock(&sid_lock); |
866 | + __inc_irq_stat(irq_tlb_count); |
867 | if (dirty_space_ids > RECYCLE_THRESHOLD) { |
868 | BUG_ON(recycle_inuse); /* FIXME: Use a semaphore/wait queue here */ |
869 | get_dirty_sids(&recycle_ndirty,recycle_dirty_array); |
870 | @@ -913,8 +913,8 @@ void flush_tlb_all(void) |
871 | #else |
872 | void flush_tlb_all(void) |
873 | { |
874 | - __inc_irq_stat(irq_tlb_count); |
875 | spin_lock(&sid_lock); |
876 | + __inc_irq_stat(irq_tlb_count); |
877 | flush_tlb_all_local(NULL); |
878 | recycle_sids(); |
879 | spin_unlock(&sid_lock); |
880 | diff --git a/arch/powerpc/include/asm/code-patching.h b/arch/powerpc/include/asm/code-patching.h |
881 | index be0f7257b13c8..96ef54bc7d968 100644 |
882 | --- a/arch/powerpc/include/asm/code-patching.h |
883 | +++ b/arch/powerpc/include/asm/code-patching.h |
884 | @@ -22,6 +22,7 @@ |
885 | #define BRANCH_ABSOLUTE 0x2 |
886 | |
887 | bool is_offset_in_branch_range(long offset); |
888 | +bool is_offset_in_cond_branch_range(long offset); |
889 | unsigned int create_branch(const unsigned int *addr, |
890 | unsigned long target, int flags); |
891 | unsigned int create_cond_branch(const unsigned int *addr, |
892 | diff --git a/arch/powerpc/include/asm/security_features.h b/arch/powerpc/include/asm/security_features.h |
893 | index e9e3f85134e54..316a9c8d1929e 100644 |
894 | --- a/arch/powerpc/include/asm/security_features.h |
895 | +++ b/arch/powerpc/include/asm/security_features.h |
896 | @@ -39,6 +39,11 @@ static inline bool security_ftr_enabled(u64 feature) |
897 | return !!(powerpc_security_features & feature); |
898 | } |
899 | |
900 | +#ifdef CONFIG_PPC_BOOK3S_64 |
901 | +enum stf_barrier_type stf_barrier_type_get(void); |
902 | +#else |
903 | +static inline enum stf_barrier_type stf_barrier_type_get(void) { return STF_BARRIER_NONE; } |
904 | +#endif |
905 | |
906 | // Features indicating support for Spectre/Meltdown mitigations |
907 | |
908 | diff --git a/arch/powerpc/kernel/security.c b/arch/powerpc/kernel/security.c |
909 | index 1740a66cea84d..ff022e7256934 100644 |
910 | --- a/arch/powerpc/kernel/security.c |
911 | +++ b/arch/powerpc/kernel/security.c |
912 | @@ -256,6 +256,11 @@ static int __init handle_no_stf_barrier(char *p) |
913 | |
914 | early_param("no_stf_barrier", handle_no_stf_barrier); |
915 | |
916 | +enum stf_barrier_type stf_barrier_type_get(void) |
917 | +{ |
918 | + return stf_enabled_flush_types; |
919 | +} |
920 | + |
921 | /* This is the generic flag used by other architectures */ |
922 | static int __init handle_ssbd(char *p) |
923 | { |
924 | diff --git a/arch/powerpc/lib/code-patching.c b/arch/powerpc/lib/code-patching.c |
925 | index 3345f039a8769..a05f289e613ed 100644 |
926 | --- a/arch/powerpc/lib/code-patching.c |
927 | +++ b/arch/powerpc/lib/code-patching.c |
928 | @@ -221,6 +221,11 @@ bool is_offset_in_branch_range(long offset) |
929 | return (offset >= -0x2000000 && offset <= 0x1fffffc && !(offset & 0x3)); |
930 | } |
931 | |
932 | +bool is_offset_in_cond_branch_range(long offset) |
933 | +{ |
934 | + return offset >= -0x8000 && offset <= 0x7fff && !(offset & 0x3); |
935 | +} |
936 | + |
937 | /* |
938 | * Helper to check if a given instruction is a conditional branch |
939 | * Derived from the conditional checks in analyse_instr() |
940 | @@ -274,7 +279,7 @@ unsigned int create_cond_branch(const unsigned int *addr, |
941 | offset = offset - (unsigned long)addr; |
942 | |
943 | /* Check we can represent the target in the instruction format */ |
944 | - if (offset < -0x8000 || offset > 0x7FFF || offset & 0x3) |
945 | + if (!is_offset_in_cond_branch_range(offset)) |
946 | return 0; |
947 | |
948 | /* Mask out the flags and target, so they don't step on each other. */ |
949 | diff --git a/arch/powerpc/net/bpf_jit.h b/arch/powerpc/net/bpf_jit.h |
950 | index 55d4377ccfae3..6d2a268528dfc 100644 |
951 | --- a/arch/powerpc/net/bpf_jit.h |
952 | +++ b/arch/powerpc/net/bpf_jit.h |
953 | @@ -11,6 +11,7 @@ |
954 | #ifndef __ASSEMBLY__ |
955 | |
956 | #include <asm/types.h> |
957 | +#include <asm/code-patching.h> |
958 | |
959 | #ifdef PPC64_ELF_ABI_v1 |
960 | #define FUNCTION_DESCR_SIZE 24 |
961 | @@ -180,13 +181,26 @@ |
962 | #define PPC_NEG(d, a) EMIT(PPC_INST_NEG | ___PPC_RT(d) | ___PPC_RA(a)) |
963 | |
964 | /* Long jump; (unconditional 'branch') */ |
965 | -#define PPC_JMP(dest) EMIT(PPC_INST_BRANCH | \ |
966 | - (((dest) - (ctx->idx * 4)) & 0x03fffffc)) |
967 | +#define PPC_JMP(dest) \ |
968 | + do { \ |
969 | + long offset = (long)(dest) - (ctx->idx * 4); \ |
970 | + if (!is_offset_in_branch_range(offset)) { \ |
971 | + pr_err_ratelimited("Branch offset 0x%lx (@%u) out of range\n", offset, ctx->idx); \ |
972 | + return -ERANGE; \ |
973 | + } \ |
974 | + EMIT(PPC_INST_BRANCH | (offset & 0x03fffffc)); \ |
975 | + } while (0) |
976 | /* "cond" here covers BO:BI fields. */ |
977 | -#define PPC_BCC_SHORT(cond, dest) EMIT(PPC_INST_BRANCH_COND | \ |
978 | - (((cond) & 0x3ff) << 16) | \ |
979 | - (((dest) - (ctx->idx * 4)) & \ |
980 | - 0xfffc)) |
981 | +#define PPC_BCC_SHORT(cond, dest) \ |
982 | + do { \ |
983 | + long offset = (long)(dest) - (ctx->idx * 4); \ |
984 | + if (!is_offset_in_cond_branch_range(offset)) { \ |
985 | + pr_err_ratelimited("Conditional branch offset 0x%lx (@%u) out of range\n", offset, ctx->idx); \ |
986 | + return -ERANGE; \ |
987 | + } \ |
988 | + EMIT(PPC_INST_BRANCH_COND | (((cond) & 0x3ff) << 16) | (offset & 0xfffc)); \ |
989 | + } while (0) |
990 | + |
991 | /* Sign-extended 32-bit immediate load */ |
992 | #define PPC_LI32(d, i) do { \ |
993 | if ((int)(uintptr_t)(i) >= -32768 && \ |
994 | @@ -225,11 +239,6 @@ |
995 | #define PPC_FUNC_ADDR(d,i) do { PPC_LI32(d, i); } while(0) |
996 | #endif |
997 | |
998 | -static inline bool is_nearbranch(int offset) |
999 | -{ |
1000 | - return (offset < 32768) && (offset >= -32768); |
1001 | -} |
1002 | - |
1003 | /* |
1004 | * The fly in the ointment of code size changing from pass to pass is |
1005 | * avoided by padding the short branch case with a NOP. If code size differs |
1006 | @@ -238,7 +247,7 @@ static inline bool is_nearbranch(int offset) |
1007 | * state. |
1008 | */ |
1009 | #define PPC_BCC(cond, dest) do { \ |
1010 | - if (is_nearbranch((dest) - (ctx->idx * 4))) { \ |
1011 | + if (is_offset_in_cond_branch_range((long)(dest) - (ctx->idx * 4))) { \ |
1012 | PPC_BCC_SHORT(cond, dest); \ |
1013 | PPC_NOP(); \ |
1014 | } else { \ |
1015 | diff --git a/arch/powerpc/net/bpf_jit64.h b/arch/powerpc/net/bpf_jit64.h |
1016 | index cf3a7e337f025..68ddf3502ab03 100644 |
1017 | --- a/arch/powerpc/net/bpf_jit64.h |
1018 | +++ b/arch/powerpc/net/bpf_jit64.h |
1019 | @@ -16,18 +16,18 @@ |
1020 | * with our redzone usage. |
1021 | * |
1022 | * [ prev sp ] <------------- |
1023 | - * [ nv gpr save area ] 6*8 | |
1024 | + * [ nv gpr save area ] 5*8 | |
1025 | * [ tail_call_cnt ] 8 | |
1026 | - * [ local_tmp_var ] 8 | |
1027 | + * [ local_tmp_var ] 16 | |
1028 | * fp (r31) --> [ ebpf stack space ] upto 512 | |
1029 | * [ frame header ] 32/112 | |
1030 | * sp (r1) ---> [ stack pointer ] -------------- |
1031 | */ |
1032 | |
1033 | /* for gpr non volatile registers BPG_REG_6 to 10 */ |
1034 | -#define BPF_PPC_STACK_SAVE (6*8) |
1035 | +#define BPF_PPC_STACK_SAVE (5*8) |
1036 | /* for bpf JIT code internal usage */ |
1037 | -#define BPF_PPC_STACK_LOCALS 16 |
1038 | +#define BPF_PPC_STACK_LOCALS 24 |
1039 | /* stack frame excluding BPF stack, ensure this is quadword aligned */ |
1040 | #define BPF_PPC_STACKFRAME (STACK_FRAME_MIN_SIZE + \ |
1041 | BPF_PPC_STACK_LOCALS + BPF_PPC_STACK_SAVE) |
1042 | diff --git a/arch/powerpc/net/bpf_jit_comp64.c b/arch/powerpc/net/bpf_jit_comp64.c |
1043 | index 81e6279c9874f..687cd352648aa 100644 |
1044 | --- a/arch/powerpc/net/bpf_jit_comp64.c |
1045 | +++ b/arch/powerpc/net/bpf_jit_comp64.c |
1046 | @@ -15,6 +15,7 @@ |
1047 | #include <linux/if_vlan.h> |
1048 | #include <asm/kprobes.h> |
1049 | #include <linux/bpf.h> |
1050 | +#include <asm/security_features.h> |
1051 | |
1052 | #include "bpf_jit64.h" |
1053 | |
1054 | @@ -56,9 +57,9 @@ static inline bool bpf_has_stack_frame(struct codegen_context *ctx) |
1055 | * [ prev sp ] <------------- |
1056 | * [ ... ] | |
1057 | * sp (r1) ---> [ stack pointer ] -------------- |
1058 | - * [ nv gpr save area ] 6*8 |
1059 | + * [ nv gpr save area ] 5*8 |
1060 | * [ tail_call_cnt ] 8 |
1061 | - * [ local_tmp_var ] 8 |
1062 | + * [ local_tmp_var ] 16 |
1063 | * [ unused red zone ] 208 bytes protected |
1064 | */ |
1065 | static int bpf_jit_stack_local(struct codegen_context *ctx) |
1066 | @@ -66,12 +67,12 @@ static int bpf_jit_stack_local(struct codegen_context *ctx) |
1067 | if (bpf_has_stack_frame(ctx)) |
1068 | return STACK_FRAME_MIN_SIZE + ctx->stack_size; |
1069 | else |
1070 | - return -(BPF_PPC_STACK_SAVE + 16); |
1071 | + return -(BPF_PPC_STACK_SAVE + 24); |
1072 | } |
1073 | |
1074 | static int bpf_jit_stack_tailcallcnt(struct codegen_context *ctx) |
1075 | { |
1076 | - return bpf_jit_stack_local(ctx) + 8; |
1077 | + return bpf_jit_stack_local(ctx) + 16; |
1078 | } |
1079 | |
1080 | static int bpf_jit_stack_offsetof(struct codegen_context *ctx, int reg) |
1081 | @@ -224,7 +225,7 @@ static void bpf_jit_emit_func_call_rel(u32 *image, struct codegen_context *ctx, |
1082 | PPC_BLRL(); |
1083 | } |
1084 | |
1085 | -static void bpf_jit_emit_tail_call(u32 *image, struct codegen_context *ctx, u32 out) |
1086 | +static int bpf_jit_emit_tail_call(u32 *image, struct codegen_context *ctx, u32 out) |
1087 | { |
1088 | /* |
1089 | * By now, the eBPF program has already setup parameters in r3, r4 and r5 |
1090 | @@ -285,14 +286,39 @@ static void bpf_jit_emit_tail_call(u32 *image, struct codegen_context *ctx, u32 |
1091 | bpf_jit_emit_common_epilogue(image, ctx); |
1092 | |
1093 | PPC_BCTR(); |
1094 | + |
1095 | /* out: */ |
1096 | + return 0; |
1097 | } |
1098 | |
1099 | +/* |
1100 | + * We spill into the redzone always, even if the bpf program has its own stackframe. |
1101 | + * Offsets hardcoded based on BPF_PPC_STACK_SAVE -- see bpf_jit_stack_local() |
1102 | + */ |
1103 | +void bpf_stf_barrier(void); |
1104 | + |
1105 | +asm ( |
1106 | +" .global bpf_stf_barrier ;" |
1107 | +" bpf_stf_barrier: ;" |
1108 | +" std 21,-64(1) ;" |
1109 | +" std 22,-56(1) ;" |
1110 | +" sync ;" |
1111 | +" ld 21,-64(1) ;" |
1112 | +" ld 22,-56(1) ;" |
1113 | +" ori 31,31,0 ;" |
1114 | +" .rept 14 ;" |
1115 | +" b 1f ;" |
1116 | +" 1: ;" |
1117 | +" .endr ;" |
1118 | +" blr ;" |
1119 | +); |
1120 | + |
1121 | /* Assemble the body code between the prologue & epilogue */ |
1122 | static int bpf_jit_build_body(struct bpf_prog *fp, u32 *image, |
1123 | struct codegen_context *ctx, |
1124 | u32 *addrs, bool extra_pass) |
1125 | { |
1126 | + enum stf_barrier_type stf_barrier = stf_barrier_type_get(); |
1127 | const struct bpf_insn *insn = fp->insnsi; |
1128 | int flen = fp->len; |
1129 | int i, ret; |
1130 | @@ -347,18 +373,25 @@ static int bpf_jit_build_body(struct bpf_prog *fp, u32 *image, |
1131 | PPC_SUB(dst_reg, dst_reg, src_reg); |
1132 | goto bpf_alu32_trunc; |
1133 | case BPF_ALU | BPF_ADD | BPF_K: /* (u32) dst += (u32) imm */ |
1134 | - case BPF_ALU | BPF_SUB | BPF_K: /* (u32) dst -= (u32) imm */ |
1135 | case BPF_ALU64 | BPF_ADD | BPF_K: /* dst += imm */ |
1136 | + if (!imm) { |
1137 | + goto bpf_alu32_trunc; |
1138 | + } else if (imm >= -32768 && imm < 32768) { |
1139 | + PPC_ADDI(dst_reg, dst_reg, IMM_L(imm)); |
1140 | + } else { |
1141 | + PPC_LI32(b2p[TMP_REG_1], imm); |
1142 | + PPC_ADD(dst_reg, dst_reg, b2p[TMP_REG_1]); |
1143 | + } |
1144 | + goto bpf_alu32_trunc; |
1145 | + case BPF_ALU | BPF_SUB | BPF_K: /* (u32) dst -= (u32) imm */ |
1146 | case BPF_ALU64 | BPF_SUB | BPF_K: /* dst -= imm */ |
1147 | - if (BPF_OP(code) == BPF_SUB) |
1148 | - imm = -imm; |
1149 | - if (imm) { |
1150 | - if (imm >= -32768 && imm < 32768) |
1151 | - PPC_ADDI(dst_reg, dst_reg, IMM_L(imm)); |
1152 | - else { |
1153 | - PPC_LI32(b2p[TMP_REG_1], imm); |
1154 | - PPC_ADD(dst_reg, dst_reg, b2p[TMP_REG_1]); |
1155 | - } |
1156 | + if (!imm) { |
1157 | + goto bpf_alu32_trunc; |
1158 | + } else if (imm > -32768 && imm <= 32768) { |
1159 | + PPC_ADDI(dst_reg, dst_reg, IMM_L(-imm)); |
1160 | + } else { |
1161 | + PPC_LI32(b2p[TMP_REG_1], imm); |
1162 | + PPC_SUB(dst_reg, dst_reg, b2p[TMP_REG_1]); |
1163 | } |
1164 | goto bpf_alu32_trunc; |
1165 | case BPF_ALU | BPF_MUL | BPF_X: /* (u32) dst *= (u32) src */ |
1166 | @@ -654,6 +687,30 @@ emit_clear: |
1167 | * BPF_ST NOSPEC (speculation barrier) |
1168 | */ |
1169 | case BPF_ST | BPF_NOSPEC: |
1170 | + if (!security_ftr_enabled(SEC_FTR_FAVOUR_SECURITY) || |
1171 | + (!security_ftr_enabled(SEC_FTR_L1D_FLUSH_PR) && |
1172 | + (!security_ftr_enabled(SEC_FTR_L1D_FLUSH_HV) || !cpu_has_feature(CPU_FTR_HVMODE)))) |
1173 | + break; |
1174 | + |
1175 | + switch (stf_barrier) { |
1176 | + case STF_BARRIER_EIEIO: |
1177 | + EMIT(0x7c0006ac | 0x02000000); |
1178 | + break; |
1179 | + case STF_BARRIER_SYNC_ORI: |
1180 | + EMIT(PPC_INST_SYNC); |
1181 | + PPC_LD(b2p[TMP_REG_1], 13, 0); |
1182 | + PPC_ORI(31, 31, 0); |
1183 | + break; |
1184 | + case STF_BARRIER_FALLBACK: |
1185 | + EMIT(PPC_INST_MFLR | ___PPC_RT(b2p[TMP_REG_1])); |
1186 | + PPC_LI64(12, dereference_kernel_function_descriptor(bpf_stf_barrier)); |
1187 | + PPC_MTCTR(12); |
1188 | + EMIT(PPC_INST_BCTR | 0x1); |
1189 | + PPC_MTLR(b2p[TMP_REG_1]); |
1190 | + break; |
1191 | + case STF_BARRIER_NONE: |
1192 | + break; |
1193 | + } |
1194 | break; |
1195 | |
1196 | /* |
1197 | @@ -1001,7 +1058,9 @@ cond_branch: |
1198 | */ |
1199 | case BPF_JMP | BPF_TAIL_CALL: |
1200 | ctx->seen |= SEEN_TAILCALL; |
1201 | - bpf_jit_emit_tail_call(image, ctx, addrs[i + 1]); |
1202 | + ret = bpf_jit_emit_tail_call(image, ctx, addrs[i + 1]); |
1203 | + if (ret < 0) |
1204 | + return ret; |
1205 | break; |
1206 | |
1207 | default: |
1208 | diff --git a/arch/powerpc/platforms/44x/fsp2.c b/arch/powerpc/platforms/44x/fsp2.c |
1209 | index b299e43f5ef94..823397c802def 100644 |
1210 | --- a/arch/powerpc/platforms/44x/fsp2.c |
1211 | +++ b/arch/powerpc/platforms/44x/fsp2.c |
1212 | @@ -208,6 +208,7 @@ static void node_irq_request(const char *compat, irq_handler_t errirq_handler) |
1213 | if (irq == NO_IRQ) { |
1214 | pr_err("device tree node %pOFn is missing a interrupt", |
1215 | np); |
1216 | + of_node_put(np); |
1217 | return; |
1218 | } |
1219 | |
1220 | @@ -215,6 +216,7 @@ static void node_irq_request(const char *compat, irq_handler_t errirq_handler) |
1221 | if (rc) { |
1222 | pr_err("fsp_of_probe: request_irq failed: np=%pOF rc=%d", |
1223 | np, rc); |
1224 | + of_node_put(np); |
1225 | return; |
1226 | } |
1227 | } |
1228 | diff --git a/arch/powerpc/platforms/85xx/mpc85xx_pm_ops.c b/arch/powerpc/platforms/85xx/mpc85xx_pm_ops.c |
1229 | index 7c0133f558d02..ffa8a7a6a2db7 100644 |
1230 | --- a/arch/powerpc/platforms/85xx/mpc85xx_pm_ops.c |
1231 | +++ b/arch/powerpc/platforms/85xx/mpc85xx_pm_ops.c |
1232 | @@ -94,9 +94,8 @@ int __init mpc85xx_setup_pmc(void) |
1233 | pr_err("Could not map guts node address\n"); |
1234 | return -ENOMEM; |
1235 | } |
1236 | + qoriq_pm_ops = &mpc85xx_pm_ops; |
1237 | } |
1238 | |
1239 | - qoriq_pm_ops = &mpc85xx_pm_ops; |
1240 | - |
1241 | return 0; |
1242 | } |
1243 | diff --git a/arch/powerpc/platforms/powernv/opal-prd.c b/arch/powerpc/platforms/powernv/opal-prd.c |
1244 | index 45f4223a790f2..6ebc906e07b0a 100644 |
1245 | --- a/arch/powerpc/platforms/powernv/opal-prd.c |
1246 | +++ b/arch/powerpc/platforms/powernv/opal-prd.c |
1247 | @@ -372,6 +372,12 @@ static struct notifier_block opal_prd_event_nb = { |
1248 | .priority = 0, |
1249 | }; |
1250 | |
1251 | +static struct notifier_block opal_prd_event_nb2 = { |
1252 | + .notifier_call = opal_prd_msg_notifier, |
1253 | + .next = NULL, |
1254 | + .priority = 0, |
1255 | +}; |
1256 | + |
1257 | static int opal_prd_probe(struct platform_device *pdev) |
1258 | { |
1259 | int rc; |
1260 | @@ -393,9 +399,10 @@ static int opal_prd_probe(struct platform_device *pdev) |
1261 | return rc; |
1262 | } |
1263 | |
1264 | - rc = opal_message_notifier_register(OPAL_MSG_PRD2, &opal_prd_event_nb); |
1265 | + rc = opal_message_notifier_register(OPAL_MSG_PRD2, &opal_prd_event_nb2); |
1266 | if (rc) { |
1267 | pr_err("Couldn't register PRD2 event notifier\n"); |
1268 | + opal_message_notifier_unregister(OPAL_MSG_PRD, &opal_prd_event_nb); |
1269 | return rc; |
1270 | } |
1271 | |
1272 | @@ -404,6 +411,8 @@ static int opal_prd_probe(struct platform_device *pdev) |
1273 | pr_err("failed to register miscdev\n"); |
1274 | opal_message_notifier_unregister(OPAL_MSG_PRD, |
1275 | &opal_prd_event_nb); |
1276 | + opal_message_notifier_unregister(OPAL_MSG_PRD2, |
1277 | + &opal_prd_event_nb2); |
1278 | return rc; |
1279 | } |
1280 | |
1281 | @@ -414,6 +423,7 @@ static int opal_prd_remove(struct platform_device *pdev) |
1282 | { |
1283 | misc_deregister(&opal_prd_dev); |
1284 | opal_message_notifier_unregister(OPAL_MSG_PRD, &opal_prd_event_nb); |
1285 | + opal_message_notifier_unregister(OPAL_MSG_PRD2, &opal_prd_event_nb2); |
1286 | return 0; |
1287 | } |
1288 | |
1289 | diff --git a/arch/s390/kvm/priv.c b/arch/s390/kvm/priv.c |
1290 | index 560310e29e275..fa69610fe6b12 100644 |
1291 | --- a/arch/s390/kvm/priv.c |
1292 | +++ b/arch/s390/kvm/priv.c |
1293 | @@ -398,6 +398,8 @@ static int handle_sske(struct kvm_vcpu *vcpu) |
1294 | up_read(¤t->mm->mmap_sem); |
1295 | if (rc == -EFAULT) |
1296 | return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING); |
1297 | + if (rc == -EAGAIN) |
1298 | + continue; |
1299 | if (rc < 0) |
1300 | return rc; |
1301 | start += PAGE_SIZE; |
1302 | diff --git a/arch/s390/mm/gmap.c b/arch/s390/mm/gmap.c |
1303 | index 4fa7a562c6fc1..5e5a4e1f0e6cf 100644 |
1304 | --- a/arch/s390/mm/gmap.c |
1305 | +++ b/arch/s390/mm/gmap.c |
1306 | @@ -684,9 +684,10 @@ void __gmap_zap(struct gmap *gmap, unsigned long gaddr) |
1307 | vmaddr |= gaddr & ~PMD_MASK; |
1308 | /* Get pointer to the page table entry */ |
1309 | ptep = get_locked_pte(gmap->mm, vmaddr, &ptl); |
1310 | - if (likely(ptep)) |
1311 | + if (likely(ptep)) { |
1312 | ptep_zap_unused(gmap->mm, vmaddr, ptep, 0); |
1313 | - pte_unmap_unlock(ptep, ptl); |
1314 | + pte_unmap_unlock(ptep, ptl); |
1315 | + } |
1316 | } |
1317 | } |
1318 | EXPORT_SYMBOL_GPL(__gmap_zap); |
1319 | diff --git a/arch/sh/kernel/cpu/fpu.c b/arch/sh/kernel/cpu/fpu.c |
1320 | index ae354a2931e7e..fd6db0ab19288 100644 |
1321 | --- a/arch/sh/kernel/cpu/fpu.c |
1322 | +++ b/arch/sh/kernel/cpu/fpu.c |
1323 | @@ -62,18 +62,20 @@ void fpu_state_restore(struct pt_regs *regs) |
1324 | } |
1325 | |
1326 | if (!tsk_used_math(tsk)) { |
1327 | - local_irq_enable(); |
1328 | + int ret; |
1329 | /* |
1330 | * does a slab alloc which can sleep |
1331 | */ |
1332 | - if (init_fpu(tsk)) { |
1333 | + local_irq_enable(); |
1334 | + ret = init_fpu(tsk); |
1335 | + local_irq_disable(); |
1336 | + if (ret) { |
1337 | /* |
1338 | * ran out of memory! |
1339 | */ |
1340 | - do_group_exit(SIGKILL); |
1341 | + force_sig(SIGKILL); |
1342 | return; |
1343 | } |
1344 | - local_irq_disable(); |
1345 | } |
1346 | |
1347 | grab_fpu(regs); |
1348 | diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c |
1349 | index 79583bac9ac4a..812db1ac8cb11 100644 |
1350 | --- a/arch/x86/hyperv/hv_init.c |
1351 | +++ b/arch/x86/hyperv/hv_init.c |
1352 | @@ -155,7 +155,6 @@ void set_hv_tscchange_cb(void (*cb)(void)) |
1353 | struct hv_reenlightenment_control re_ctrl = { |
1354 | .vector = HYPERV_REENLIGHTENMENT_VECTOR, |
1355 | .enabled = 1, |
1356 | - .target_vp = hv_vp_index[smp_processor_id()] |
1357 | }; |
1358 | struct hv_tsc_emulation_control emu_ctrl = {.enabled = 1}; |
1359 | |
1360 | @@ -169,8 +168,12 @@ void set_hv_tscchange_cb(void (*cb)(void)) |
1361 | /* Make sure callback is registered before we write to MSRs */ |
1362 | wmb(); |
1363 | |
1364 | + re_ctrl.target_vp = hv_vp_index[get_cpu()]; |
1365 | + |
1366 | wrmsrl(HV_X64_MSR_REENLIGHTENMENT_CONTROL, *((u64 *)&re_ctrl)); |
1367 | wrmsrl(HV_X64_MSR_TSC_EMULATION_CONTROL, *((u64 *)&emu_ctrl)); |
1368 | + |
1369 | + put_cpu(); |
1370 | } |
1371 | EXPORT_SYMBOL_GPL(set_hv_tscchange_cb); |
1372 | |
1373 | diff --git a/arch/x86/include/asm/page_64_types.h b/arch/x86/include/asm/page_64_types.h |
1374 | index 288b065955b72..9d0b479452720 100644 |
1375 | --- a/arch/x86/include/asm/page_64_types.h |
1376 | +++ b/arch/x86/include/asm/page_64_types.h |
1377 | @@ -15,7 +15,7 @@ |
1378 | #define THREAD_SIZE_ORDER (2 + KASAN_STACK_ORDER) |
1379 | #define THREAD_SIZE (PAGE_SIZE << THREAD_SIZE_ORDER) |
1380 | |
1381 | -#define EXCEPTION_STACK_ORDER (0 + KASAN_STACK_ORDER) |
1382 | +#define EXCEPTION_STACK_ORDER (1 + KASAN_STACK_ORDER) |
1383 | #define EXCEPTION_STKSZ (PAGE_SIZE << EXCEPTION_STACK_ORDER) |
1384 | |
1385 | #define IRQ_STACK_ORDER (2 + KASAN_STACK_ORDER) |
1386 | diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c |
1387 | index 753f3dfbc9c91..88cef978380bf 100644 |
1388 | --- a/arch/x86/kernel/cpu/amd.c |
1389 | +++ b/arch/x86/kernel/cpu/amd.c |
1390 | @@ -987,6 +987,8 @@ static void init_amd(struct cpuinfo_x86 *c) |
1391 | if (cpu_has(c, X86_FEATURE_IRPERF) && |
1392 | !cpu_has_amd_erratum(c, amd_erratum_1054)) |
1393 | msr_set_bit(MSR_K7_HWCR, MSR_K7_HWCR_IRPERF_EN_BIT); |
1394 | + |
1395 | + check_null_seg_clears_base(c); |
1396 | } |
1397 | |
1398 | #ifdef CONFIG_X86_32 |
1399 | diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c |
1400 | index f961a56e9da3f..4c85ca112a2a9 100644 |
1401 | --- a/arch/x86/kernel/cpu/common.c |
1402 | +++ b/arch/x86/kernel/cpu/common.c |
1403 | @@ -1336,9 +1336,8 @@ void __init early_cpu_init(void) |
1404 | early_identify_cpu(&boot_cpu_data); |
1405 | } |
1406 | |
1407 | -static void detect_null_seg_behavior(struct cpuinfo_x86 *c) |
1408 | +static bool detect_null_seg_behavior(void) |
1409 | { |
1410 | -#ifdef CONFIG_X86_64 |
1411 | /* |
1412 | * Empirically, writing zero to a segment selector on AMD does |
1413 | * not clear the base, whereas writing zero to a segment |
1414 | @@ -1359,10 +1358,43 @@ static void detect_null_seg_behavior(struct cpuinfo_x86 *c) |
1415 | wrmsrl(MSR_FS_BASE, 1); |
1416 | loadsegment(fs, 0); |
1417 | rdmsrl(MSR_FS_BASE, tmp); |
1418 | - if (tmp != 0) |
1419 | - set_cpu_bug(c, X86_BUG_NULL_SEG); |
1420 | wrmsrl(MSR_FS_BASE, old_base); |
1421 | -#endif |
1422 | + return tmp == 0; |
1423 | +} |
1424 | + |
1425 | +void check_null_seg_clears_base(struct cpuinfo_x86 *c) |
1426 | +{ |
1427 | + /* BUG_NULL_SEG is only relevant with 64bit userspace */ |
1428 | + if (!IS_ENABLED(CONFIG_X86_64)) |
1429 | + return; |
1430 | + |
1431 | + /* Zen3 CPUs advertise Null Selector Clears Base in CPUID. */ |
1432 | + if (c->extended_cpuid_level >= 0x80000021 && |
1433 | + cpuid_eax(0x80000021) & BIT(6)) |
1434 | + return; |
1435 | + |
1436 | + /* |
1437 | + * CPUID bit above wasn't set. If this kernel is still running |
1438 | + * as a HV guest, then the HV has decided not to advertize |
1439 | + * that CPUID bit for whatever reason. For example, one |
1440 | + * member of the migration pool might be vulnerable. Which |
1441 | + * means, the bug is present: set the BUG flag and return. |
1442 | + */ |
1443 | + if (cpu_has(c, X86_FEATURE_HYPERVISOR)) { |
1444 | + set_cpu_bug(c, X86_BUG_NULL_SEG); |
1445 | + return; |
1446 | + } |
1447 | + |
1448 | + /* |
1449 | + * Zen2 CPUs also have this behaviour, but no CPUID bit. |
1450 | + * 0x18 is the respective family for Hygon. |
1451 | + */ |
1452 | + if ((c->x86 == 0x17 || c->x86 == 0x18) && |
1453 | + detect_null_seg_behavior()) |
1454 | + return; |
1455 | + |
1456 | + /* All the remaining ones are affected */ |
1457 | + set_cpu_bug(c, X86_BUG_NULL_SEG); |
1458 | } |
1459 | |
1460 | static void generic_identify(struct cpuinfo_x86 *c) |
1461 | @@ -1398,8 +1430,6 @@ static void generic_identify(struct cpuinfo_x86 *c) |
1462 | |
1463 | get_model_name(c); /* Default name */ |
1464 | |
1465 | - detect_null_seg_behavior(c); |
1466 | - |
1467 | /* |
1468 | * ESPFIX is a strange bug. All real CPUs have it. Paravirt |
1469 | * systems that run Linux at CPL > 0 may or may not have the |
1470 | diff --git a/arch/x86/kernel/cpu/cpu.h b/arch/x86/kernel/cpu/cpu.h |
1471 | index 9d033693519aa..4d04c127c4a79 100644 |
1472 | --- a/arch/x86/kernel/cpu/cpu.h |
1473 | +++ b/arch/x86/kernel/cpu/cpu.h |
1474 | @@ -73,6 +73,7 @@ extern int detect_extended_topology_early(struct cpuinfo_x86 *c); |
1475 | extern int detect_extended_topology(struct cpuinfo_x86 *c); |
1476 | extern int detect_ht_early(struct cpuinfo_x86 *c); |
1477 | extern void detect_ht(struct cpuinfo_x86 *c); |
1478 | +extern void check_null_seg_clears_base(struct cpuinfo_x86 *c); |
1479 | |
1480 | unsigned int aperfmperf_get_khz(int cpu); |
1481 | |
1482 | diff --git a/arch/x86/kernel/cpu/hygon.c b/arch/x86/kernel/cpu/hygon.c |
1483 | index 62e9a982adaf9..b232bd0be78d6 100644 |
1484 | --- a/arch/x86/kernel/cpu/hygon.c |
1485 | +++ b/arch/x86/kernel/cpu/hygon.c |
1486 | @@ -350,6 +350,8 @@ static void init_hygon(struct cpuinfo_x86 *c) |
1487 | /* Hygon CPUs don't reset SS attributes on SYSRET, Xen does. */ |
1488 | if (!cpu_has(c, X86_FEATURE_XENPV)) |
1489 | set_cpu_bug(c, X86_BUG_SYSRET_SS_ATTRS); |
1490 | + |
1491 | + check_null_seg_clears_base(c); |
1492 | } |
1493 | |
1494 | static void cpu_detect_tlb_hygon(struct cpuinfo_x86 *c) |
1495 | diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c |
1496 | index 21efee32e2b12..7dfd0185767cc 100644 |
1497 | --- a/arch/x86/kernel/irq.c |
1498 | +++ b/arch/x86/kernel/irq.c |
1499 | @@ -295,8 +295,10 @@ void kvm_set_posted_intr_wakeup_handler(void (*handler)(void)) |
1500 | { |
1501 | if (handler) |
1502 | kvm_posted_intr_wakeup_handler = handler; |
1503 | - else |
1504 | + else { |
1505 | kvm_posted_intr_wakeup_handler = dummy_handler; |
1506 | + synchronize_rcu(); |
1507 | + } |
1508 | } |
1509 | EXPORT_SYMBOL_GPL(kvm_set_posted_intr_wakeup_handler); |
1510 | |
1511 | diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c |
1512 | index e177848a36313..0f7c051984062 100644 |
1513 | --- a/arch/x86/kvm/vmx/vmx.c |
1514 | +++ b/arch/x86/kvm/vmx/vmx.c |
1515 | @@ -785,15 +785,15 @@ void update_exception_bitmap(struct kvm_vcpu *vcpu) |
1516 | /* |
1517 | * Check if MSR is intercepted for currently loaded MSR bitmap. |
1518 | */ |
1519 | -static bool msr_write_intercepted(struct kvm_vcpu *vcpu, u32 msr) |
1520 | +static bool msr_write_intercepted(struct vcpu_vmx *vmx, u32 msr) |
1521 | { |
1522 | unsigned long *msr_bitmap; |
1523 | int f = sizeof(unsigned long); |
1524 | |
1525 | - if (!cpu_has_vmx_msr_bitmap()) |
1526 | + if (!(exec_controls_get(vmx) & CPU_BASED_USE_MSR_BITMAPS)) |
1527 | return true; |
1528 | |
1529 | - msr_bitmap = to_vmx(vcpu)->loaded_vmcs->msr_bitmap; |
1530 | + msr_bitmap = vmx->loaded_vmcs->msr_bitmap; |
1531 | |
1532 | if (msr <= 0x1fff) { |
1533 | return !!test_bit(msr, msr_bitmap + 0x800 / f); |
1534 | @@ -6579,7 +6579,7 @@ static void vmx_vcpu_run(struct kvm_vcpu *vcpu) |
1535 | * If the L02 MSR bitmap does not intercept the MSR, then we need to |
1536 | * save it. |
1537 | */ |
1538 | - if (unlikely(!msr_write_intercepted(vcpu, MSR_IA32_SPEC_CTRL))) |
1539 | + if (unlikely(!msr_write_intercepted(vmx, MSR_IA32_SPEC_CTRL))) |
1540 | vmx->spec_ctrl = native_read_msr(MSR_IA32_SPEC_CTRL); |
1541 | |
1542 | x86_spec_ctrl_restore_host(vmx->spec_ctrl, 0); |
1543 | diff --git a/arch/x86/mm/mem_encrypt_identity.c b/arch/x86/mm/mem_encrypt_identity.c |
1544 | index 84cda5dc03870..ebc8e3af1c675 100644 |
1545 | --- a/arch/x86/mm/mem_encrypt_identity.c |
1546 | +++ b/arch/x86/mm/mem_encrypt_identity.c |
1547 | @@ -27,6 +27,15 @@ |
1548 | #undef CONFIG_PARAVIRT_XXL |
1549 | #undef CONFIG_PARAVIRT_SPINLOCKS |
1550 | |
1551 | +/* |
1552 | + * This code runs before CPU feature bits are set. By default, the |
1553 | + * pgtable_l5_enabled() function uses bit X86_FEATURE_LA57 to determine if |
1554 | + * 5-level paging is active, so that won't work here. USE_EARLY_PGTABLE_L5 |
1555 | + * is provided to handle this situation and, instead, use a variable that |
1556 | + * has been set by the early boot code. |
1557 | + */ |
1558 | +#define USE_EARLY_PGTABLE_L5 |
1559 | + |
1560 | #include <linux/kernel.h> |
1561 | #include <linux/mm.h> |
1562 | #include <linux/mem_encrypt.h> |
1563 | diff --git a/block/blk-mq.c b/block/blk-mq.c |
1564 | index 0674f53c60528..84798d09ca464 100644 |
1565 | --- a/block/blk-mq.c |
1566 | +++ b/block/blk-mq.c |
1567 | @@ -733,7 +733,6 @@ void blk_mq_requeue_request(struct request *rq, bool kick_requeue_list) |
1568 | /* this request will be re-inserted to io scheduler queue */ |
1569 | blk_mq_sched_requeue_request(rq); |
1570 | |
1571 | - BUG_ON(!list_empty(&rq->queuelist)); |
1572 | blk_mq_add_to_requeue_list(rq, true, kick_requeue_list); |
1573 | } |
1574 | EXPORT_SYMBOL(blk_mq_requeue_request); |
1575 | diff --git a/crypto/Kconfig b/crypto/Kconfig |
1576 | index b2cc0ad3792ad..ce60ec30e78df 100644 |
1577 | --- a/crypto/Kconfig |
1578 | +++ b/crypto/Kconfig |
1579 | @@ -242,12 +242,12 @@ config CRYPTO_DH |
1580 | |
1581 | config CRYPTO_ECC |
1582 | tristate |
1583 | + select CRYPTO_RNG_DEFAULT |
1584 | |
1585 | config CRYPTO_ECDH |
1586 | tristate "ECDH algorithm" |
1587 | select CRYPTO_ECC |
1588 | select CRYPTO_KPP |
1589 | - select CRYPTO_RNG_DEFAULT |
1590 | help |
1591 | Generic implementation of the ECDH algorithm |
1592 | |
1593 | diff --git a/crypto/pcrypt.c b/crypto/pcrypt.c |
1594 | index a4f3b3f342c8d..276d2fd9e911c 100644 |
1595 | --- a/crypto/pcrypt.c |
1596 | +++ b/crypto/pcrypt.c |
1597 | @@ -79,12 +79,14 @@ static void pcrypt_aead_enc(struct padata_priv *padata) |
1598 | { |
1599 | struct pcrypt_request *preq = pcrypt_padata_request(padata); |
1600 | struct aead_request *req = pcrypt_request_ctx(preq); |
1601 | + int ret; |
1602 | |
1603 | - padata->info = crypto_aead_encrypt(req); |
1604 | + ret = crypto_aead_encrypt(req); |
1605 | |
1606 | - if (padata->info == -EINPROGRESS) |
1607 | + if (ret == -EINPROGRESS) |
1608 | return; |
1609 | |
1610 | + padata->info = ret; |
1611 | padata_do_serial(padata); |
1612 | } |
1613 | |
1614 | @@ -124,12 +126,14 @@ static void pcrypt_aead_dec(struct padata_priv *padata) |
1615 | { |
1616 | struct pcrypt_request *preq = pcrypt_padata_request(padata); |
1617 | struct aead_request *req = pcrypt_request_ctx(preq); |
1618 | + int ret; |
1619 | |
1620 | - padata->info = crypto_aead_decrypt(req); |
1621 | + ret = crypto_aead_decrypt(req); |
1622 | |
1623 | - if (padata->info == -EINPROGRESS) |
1624 | + if (ret == -EINPROGRESS) |
1625 | return; |
1626 | |
1627 | + padata->info = ret; |
1628 | padata_do_serial(padata); |
1629 | } |
1630 | |
1631 | diff --git a/drivers/acpi/acpica/acglobal.h b/drivers/acpi/acpica/acglobal.h |
1632 | index fd3beea934213..42c4bfd796f42 100644 |
1633 | --- a/drivers/acpi/acpica/acglobal.h |
1634 | +++ b/drivers/acpi/acpica/acglobal.h |
1635 | @@ -220,6 +220,8 @@ extern struct acpi_bit_register_info |
1636 | acpi_gbl_bit_register_info[ACPI_NUM_BITREG]; |
1637 | ACPI_GLOBAL(u8, acpi_gbl_sleep_type_a); |
1638 | ACPI_GLOBAL(u8, acpi_gbl_sleep_type_b); |
1639 | +ACPI_GLOBAL(u8, acpi_gbl_sleep_type_a_s0); |
1640 | +ACPI_GLOBAL(u8, acpi_gbl_sleep_type_b_s0); |
1641 | |
1642 | /***************************************************************************** |
1643 | * |
1644 | diff --git a/drivers/acpi/acpica/hwesleep.c b/drivers/acpi/acpica/hwesleep.c |
1645 | index dee3affaca491..aa502ae3b6b31 100644 |
1646 | --- a/drivers/acpi/acpica/hwesleep.c |
1647 | +++ b/drivers/acpi/acpica/hwesleep.c |
1648 | @@ -147,17 +147,13 @@ acpi_status acpi_hw_extended_sleep(u8 sleep_state) |
1649 | |
1650 | acpi_status acpi_hw_extended_wake_prep(u8 sleep_state) |
1651 | { |
1652 | - acpi_status status; |
1653 | u8 sleep_type_value; |
1654 | |
1655 | ACPI_FUNCTION_TRACE(hw_extended_wake_prep); |
1656 | |
1657 | - status = acpi_get_sleep_type_data(ACPI_STATE_S0, |
1658 | - &acpi_gbl_sleep_type_a, |
1659 | - &acpi_gbl_sleep_type_b); |
1660 | - if (ACPI_SUCCESS(status)) { |
1661 | + if (acpi_gbl_sleep_type_a_s0 != ACPI_SLEEP_TYPE_INVALID) { |
1662 | sleep_type_value = |
1663 | - ((acpi_gbl_sleep_type_a << ACPI_X_SLEEP_TYPE_POSITION) & |
1664 | + ((acpi_gbl_sleep_type_a_s0 << ACPI_X_SLEEP_TYPE_POSITION) & |
1665 | ACPI_X_SLEEP_TYPE_MASK); |
1666 | |
1667 | (void)acpi_write((u64)(sleep_type_value | ACPI_X_SLEEP_ENABLE), |
1668 | diff --git a/drivers/acpi/acpica/hwsleep.c b/drivers/acpi/acpica/hwsleep.c |
1669 | index b62db8ec446fa..5f7d63badbe9d 100644 |
1670 | --- a/drivers/acpi/acpica/hwsleep.c |
1671 | +++ b/drivers/acpi/acpica/hwsleep.c |
1672 | @@ -179,7 +179,7 @@ acpi_status acpi_hw_legacy_sleep(u8 sleep_state) |
1673 | |
1674 | acpi_status acpi_hw_legacy_wake_prep(u8 sleep_state) |
1675 | { |
1676 | - acpi_status status; |
1677 | + acpi_status status = AE_OK; |
1678 | struct acpi_bit_register_info *sleep_type_reg_info; |
1679 | struct acpi_bit_register_info *sleep_enable_reg_info; |
1680 | u32 pm1a_control; |
1681 | @@ -192,10 +192,7 @@ acpi_status acpi_hw_legacy_wake_prep(u8 sleep_state) |
1682 | * This is unclear from the ACPI Spec, but it is required |
1683 | * by some machines. |
1684 | */ |
1685 | - status = acpi_get_sleep_type_data(ACPI_STATE_S0, |
1686 | - &acpi_gbl_sleep_type_a, |
1687 | - &acpi_gbl_sleep_type_b); |
1688 | - if (ACPI_SUCCESS(status)) { |
1689 | + if (acpi_gbl_sleep_type_a_s0 != ACPI_SLEEP_TYPE_INVALID) { |
1690 | sleep_type_reg_info = |
1691 | acpi_hw_get_bit_register_info(ACPI_BITREG_SLEEP_TYPE); |
1692 | sleep_enable_reg_info = |
1693 | @@ -216,9 +213,9 @@ acpi_status acpi_hw_legacy_wake_prep(u8 sleep_state) |
1694 | |
1695 | /* Insert the SLP_TYP bits */ |
1696 | |
1697 | - pm1a_control |= (acpi_gbl_sleep_type_a << |
1698 | + pm1a_control |= (acpi_gbl_sleep_type_a_s0 << |
1699 | sleep_type_reg_info->bit_position); |
1700 | - pm1b_control |= (acpi_gbl_sleep_type_b << |
1701 | + pm1b_control |= (acpi_gbl_sleep_type_b_s0 << |
1702 | sleep_type_reg_info->bit_position); |
1703 | |
1704 | /* Write the control registers and ignore any errors */ |
1705 | diff --git a/drivers/acpi/acpica/hwxfsleep.c b/drivers/acpi/acpica/hwxfsleep.c |
1706 | index abbf9702aa7f2..79731efbe8fe2 100644 |
1707 | --- a/drivers/acpi/acpica/hwxfsleep.c |
1708 | +++ b/drivers/acpi/acpica/hwxfsleep.c |
1709 | @@ -214,6 +214,13 @@ acpi_status acpi_enter_sleep_state_prep(u8 sleep_state) |
1710 | return_ACPI_STATUS(status); |
1711 | } |
1712 | |
1713 | + status = acpi_get_sleep_type_data(ACPI_STATE_S0, |
1714 | + &acpi_gbl_sleep_type_a_s0, |
1715 | + &acpi_gbl_sleep_type_b_s0); |
1716 | + if (ACPI_FAILURE(status)) { |
1717 | + acpi_gbl_sleep_type_a_s0 = ACPI_SLEEP_TYPE_INVALID; |
1718 | + } |
1719 | + |
1720 | /* Execute the _PTS method (Prepare To Sleep) */ |
1721 | |
1722 | arg_list.count = 1; |
1723 | diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c |
1724 | index 254a7d98b9d4c..6e96ed68b3379 100644 |
1725 | --- a/drivers/acpi/battery.c |
1726 | +++ b/drivers/acpi/battery.c |
1727 | @@ -185,7 +185,7 @@ static int acpi_battery_is_charged(struct acpi_battery *battery) |
1728 | return 1; |
1729 | |
1730 | /* fallback to using design values for broken batteries */ |
1731 | - if (battery->design_capacity == battery->capacity_now) |
1732 | + if (battery->design_capacity <= battery->capacity_now) |
1733 | return 1; |
1734 | |
1735 | /* we don't do any sort of metric based on percentages */ |
1736 | diff --git a/drivers/acpi/pmic/intel_pmic.c b/drivers/acpi/pmic/intel_pmic.c |
1737 | index 452041398b347..36d5a5d50b2ff 100644 |
1738 | --- a/drivers/acpi/pmic/intel_pmic.c |
1739 | +++ b/drivers/acpi/pmic/intel_pmic.c |
1740 | @@ -211,31 +211,36 @@ static acpi_status intel_pmic_regs_handler(u32 function, |
1741 | void *handler_context, void *region_context) |
1742 | { |
1743 | struct intel_pmic_opregion *opregion = region_context; |
1744 | - int result = 0; |
1745 | + int result = -EINVAL; |
1746 | + |
1747 | + if (function == ACPI_WRITE) { |
1748 | + switch (address) { |
1749 | + case 0: |
1750 | + return AE_OK; |
1751 | + case 1: |
1752 | + opregion->ctx.addr |= (*value64 & 0xff) << 8; |
1753 | + return AE_OK; |
1754 | + case 2: |
1755 | + opregion->ctx.addr |= *value64 & 0xff; |
1756 | + return AE_OK; |
1757 | + case 3: |
1758 | + opregion->ctx.val = *value64 & 0xff; |
1759 | + return AE_OK; |
1760 | + case 4: |
1761 | + if (*value64) { |
1762 | + result = regmap_write(opregion->regmap, opregion->ctx.addr, |
1763 | + opregion->ctx.val); |
1764 | + } else { |
1765 | + result = regmap_read(opregion->regmap, opregion->ctx.addr, |
1766 | + &opregion->ctx.val); |
1767 | + } |
1768 | + opregion->ctx.addr = 0; |
1769 | + } |
1770 | + } |
1771 | |
1772 | - switch (address) { |
1773 | - case 0: |
1774 | - return AE_OK; |
1775 | - case 1: |
1776 | - opregion->ctx.addr |= (*value64 & 0xff) << 8; |
1777 | - return AE_OK; |
1778 | - case 2: |
1779 | - opregion->ctx.addr |= *value64 & 0xff; |
1780 | + if (function == ACPI_READ && address == 3) { |
1781 | + *value64 = opregion->ctx.val; |
1782 | return AE_OK; |
1783 | - case 3: |
1784 | - opregion->ctx.val = *value64 & 0xff; |
1785 | - return AE_OK; |
1786 | - case 4: |
1787 | - if (*value64) { |
1788 | - result = regmap_write(opregion->regmap, opregion->ctx.addr, |
1789 | - opregion->ctx.val); |
1790 | - } else { |
1791 | - result = regmap_read(opregion->regmap, opregion->ctx.addr, |
1792 | - &opregion->ctx.val); |
1793 | - if (result == 0) |
1794 | - *value64 = opregion->ctx.val; |
1795 | - } |
1796 | - memset(&opregion->ctx, 0x00, sizeof(opregion->ctx)); |
1797 | } |
1798 | |
1799 | if (result < 0) { |
1800 | diff --git a/drivers/android/binder.c b/drivers/android/binder.c |
1801 | index 2be6687c0148f..47f839bc0234f 100644 |
1802 | --- a/drivers/android/binder.c |
1803 | +++ b/drivers/android/binder.c |
1804 | @@ -424,6 +424,9 @@ enum binder_deferred_state { |
1805 | * (invariant after initialized) |
1806 | * @tsk task_struct for group_leader of process |
1807 | * (invariant after initialized) |
1808 | + * @cred struct cred associated with the `struct file` |
1809 | + * in binder_open() |
1810 | + * (invariant after initialized) |
1811 | * @deferred_work_node: element for binder_deferred_list |
1812 | * (protected by binder_deferred_lock) |
1813 | * @deferred_work: bitmap of deferred work to perform |
1814 | @@ -469,6 +472,7 @@ struct binder_proc { |
1815 | struct list_head waiting_threads; |
1816 | int pid; |
1817 | struct task_struct *tsk; |
1818 | + const struct cred *cred; |
1819 | struct hlist_node deferred_work_node; |
1820 | int deferred_work; |
1821 | bool is_dead; |
1822 | @@ -2442,7 +2446,7 @@ static int binder_translate_binder(struct flat_binder_object *fp, |
1823 | ret = -EINVAL; |
1824 | goto done; |
1825 | } |
1826 | - if (security_binder_transfer_binder(proc->tsk, target_proc->tsk)) { |
1827 | + if (security_binder_transfer_binder(proc->cred, target_proc->cred)) { |
1828 | ret = -EPERM; |
1829 | goto done; |
1830 | } |
1831 | @@ -2488,7 +2492,7 @@ static int binder_translate_handle(struct flat_binder_object *fp, |
1832 | proc->pid, thread->pid, fp->handle); |
1833 | return -EINVAL; |
1834 | } |
1835 | - if (security_binder_transfer_binder(proc->tsk, target_proc->tsk)) { |
1836 | + if (security_binder_transfer_binder(proc->cred, target_proc->cred)) { |
1837 | ret = -EPERM; |
1838 | goto done; |
1839 | } |
1840 | @@ -2576,7 +2580,7 @@ static int binder_translate_fd(u32 fd, binder_size_t fd_offset, |
1841 | ret = -EBADF; |
1842 | goto err_fget; |
1843 | } |
1844 | - ret = security_binder_transfer_file(proc->tsk, target_proc->tsk, file); |
1845 | + ret = security_binder_transfer_file(proc->cred, target_proc->cred, file); |
1846 | if (ret < 0) { |
1847 | ret = -EPERM; |
1848 | goto err_security; |
1849 | @@ -2975,8 +2979,8 @@ static void binder_transaction(struct binder_proc *proc, |
1850 | return_error_line = __LINE__; |
1851 | goto err_invalid_target_handle; |
1852 | } |
1853 | - if (security_binder_transaction(proc->tsk, |
1854 | - target_proc->tsk) < 0) { |
1855 | + if (security_binder_transaction(proc->cred, |
1856 | + target_proc->cred) < 0) { |
1857 | return_error = BR_FAILED_REPLY; |
1858 | return_error_param = -EPERM; |
1859 | return_error_line = __LINE__; |
1860 | @@ -3091,7 +3095,7 @@ static void binder_transaction(struct binder_proc *proc, |
1861 | t->from = thread; |
1862 | else |
1863 | t->from = NULL; |
1864 | - t->sender_euid = task_euid(proc->tsk); |
1865 | + t->sender_euid = proc->cred->euid; |
1866 | t->to_proc = target_proc; |
1867 | t->to_thread = target_thread; |
1868 | t->code = tr->code; |
1869 | @@ -3102,7 +3106,7 @@ static void binder_transaction(struct binder_proc *proc, |
1870 | u32 secid; |
1871 | size_t added_size; |
1872 | |
1873 | - security_task_getsecid(proc->tsk, &secid); |
1874 | + security_cred_getsecid(proc->cred, &secid); |
1875 | ret = security_secid_to_secctx(secid, &secctx, &secctx_sz); |
1876 | if (ret) { |
1877 | return_error = BR_FAILED_REPLY; |
1878 | @@ -4707,6 +4711,7 @@ static void binder_free_proc(struct binder_proc *proc) |
1879 | } |
1880 | binder_alloc_deferred_release(&proc->alloc); |
1881 | put_task_struct(proc->tsk); |
1882 | + put_cred(proc->cred); |
1883 | binder_stats_deleted(BINDER_STAT_PROC); |
1884 | kfree(proc); |
1885 | } |
1886 | @@ -4917,7 +4922,7 @@ static int binder_ioctl_set_ctx_mgr(struct file *filp, |
1887 | ret = -EBUSY; |
1888 | goto out; |
1889 | } |
1890 | - ret = security_binder_set_context_mgr(proc->tsk); |
1891 | + ret = security_binder_set_context_mgr(proc->cred); |
1892 | if (ret < 0) |
1893 | goto out; |
1894 | if (uid_valid(context->binder_context_mgr_uid)) { |
1895 | @@ -5234,6 +5239,7 @@ static int binder_open(struct inode *nodp, struct file *filp) |
1896 | spin_lock_init(&proc->outer_lock); |
1897 | get_task_struct(current->group_leader); |
1898 | proc->tsk = current->group_leader; |
1899 | + proc->cred = get_cred(filp->f_cred); |
1900 | INIT_LIST_HEAD(&proc->todo); |
1901 | proc->default_priority = task_nice(current); |
1902 | /* binderfs stashes devices in i_private */ |
1903 | diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c |
1904 | index 7c6c05fd5dfc3..bed433fd9c700 100644 |
1905 | --- a/drivers/ata/libata-core.c |
1906 | +++ b/drivers/ata/libata-core.c |
1907 | @@ -2057,7 +2057,7 @@ unsigned int ata_read_log_page(struct ata_device *dev, u8 log, |
1908 | |
1909 | retry: |
1910 | ata_tf_init(dev, &tf); |
1911 | - if (dev->dma_mode && ata_id_has_read_log_dma_ext(dev->id) && |
1912 | + if (ata_dma_enabled(dev) && ata_id_has_read_log_dma_ext(dev->id) && |
1913 | !(dev->horkage & ATA_HORKAGE_NO_DMA_LOG)) { |
1914 | tf.command = ATA_CMD_READ_LOG_DMA_EXT; |
1915 | tf.protocol = ATA_PROT_DMA; |
1916 | diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c |
1917 | index 3bfd9da584734..c6a21a784ec65 100644 |
1918 | --- a/drivers/ata/libata-eh.c |
1919 | +++ b/drivers/ata/libata-eh.c |
1920 | @@ -97,6 +97,12 @@ static const unsigned long ata_eh_identify_timeouts[] = { |
1921 | ULONG_MAX, |
1922 | }; |
1923 | |
1924 | +static const unsigned long ata_eh_revalidate_timeouts[] = { |
1925 | + 15000, /* Some drives are slow to read log pages when waking-up */ |
1926 | + 15000, /* combined time till here is enough even for media access */ |
1927 | + ULONG_MAX, |
1928 | +}; |
1929 | + |
1930 | static const unsigned long ata_eh_flush_timeouts[] = { |
1931 | 15000, /* be generous with flush */ |
1932 | 15000, /* ditto */ |
1933 | @@ -133,6 +139,8 @@ static const struct ata_eh_cmd_timeout_ent |
1934 | ata_eh_cmd_timeout_table[ATA_EH_CMD_TIMEOUT_TABLE_SIZE] = { |
1935 | { .commands = CMDS(ATA_CMD_ID_ATA, ATA_CMD_ID_ATAPI), |
1936 | .timeouts = ata_eh_identify_timeouts, }, |
1937 | + { .commands = CMDS(ATA_CMD_READ_LOG_EXT, ATA_CMD_READ_LOG_DMA_EXT), |
1938 | + .timeouts = ata_eh_revalidate_timeouts, }, |
1939 | { .commands = CMDS(ATA_CMD_READ_NATIVE_MAX, ATA_CMD_READ_NATIVE_MAX_EXT), |
1940 | .timeouts = ata_eh_other_timeouts, }, |
1941 | { .commands = CMDS(ATA_CMD_SET_MAX, ATA_CMD_SET_MAX_EXT), |
1942 | diff --git a/drivers/auxdisplay/ht16k33.c b/drivers/auxdisplay/ht16k33.c |
1943 | index 33b887b389061..59109b410c67f 100644 |
1944 | --- a/drivers/auxdisplay/ht16k33.c |
1945 | +++ b/drivers/auxdisplay/ht16k33.c |
1946 | @@ -219,6 +219,15 @@ static const struct backlight_ops ht16k33_bl_ops = { |
1947 | .check_fb = ht16k33_bl_check_fb, |
1948 | }; |
1949 | |
1950 | +/* |
1951 | + * Blank events will be passed to the actual device handling the backlight when |
1952 | + * we return zero here. |
1953 | + */ |
1954 | +static int ht16k33_blank(int blank, struct fb_info *info) |
1955 | +{ |
1956 | + return 0; |
1957 | +} |
1958 | + |
1959 | static int ht16k33_mmap(struct fb_info *info, struct vm_area_struct *vma) |
1960 | { |
1961 | struct ht16k33_priv *priv = info->par; |
1962 | @@ -231,6 +240,7 @@ static struct fb_ops ht16k33_fb_ops = { |
1963 | .owner = THIS_MODULE, |
1964 | .fb_read = fb_sys_read, |
1965 | .fb_write = fb_sys_write, |
1966 | + .fb_blank = ht16k33_blank, |
1967 | .fb_fillrect = sys_fillrect, |
1968 | .fb_copyarea = sys_copyarea, |
1969 | .fb_imageblit = sys_imageblit, |
1970 | @@ -418,6 +428,33 @@ static int ht16k33_probe(struct i2c_client *client, |
1971 | if (err) |
1972 | return err; |
1973 | |
1974 | + /* Backlight */ |
1975 | + memset(&bl_props, 0, sizeof(struct backlight_properties)); |
1976 | + bl_props.type = BACKLIGHT_RAW; |
1977 | + bl_props.max_brightness = MAX_BRIGHTNESS; |
1978 | + |
1979 | + bl = devm_backlight_device_register(&client->dev, DRIVER_NAME"-bl", |
1980 | + &client->dev, priv, |
1981 | + &ht16k33_bl_ops, &bl_props); |
1982 | + if (IS_ERR(bl)) { |
1983 | + dev_err(&client->dev, "failed to register backlight\n"); |
1984 | + return PTR_ERR(bl); |
1985 | + } |
1986 | + |
1987 | + err = of_property_read_u32(node, "default-brightness-level", |
1988 | + &dft_brightness); |
1989 | + if (err) { |
1990 | + dft_brightness = MAX_BRIGHTNESS; |
1991 | + } else if (dft_brightness > MAX_BRIGHTNESS) { |
1992 | + dev_warn(&client->dev, |
1993 | + "invalid default brightness level: %u, using %u\n", |
1994 | + dft_brightness, MAX_BRIGHTNESS); |
1995 | + dft_brightness = MAX_BRIGHTNESS; |
1996 | + } |
1997 | + |
1998 | + bl->props.brightness = dft_brightness; |
1999 | + ht16k33_bl_update_status(bl); |
2000 | + |
2001 | /* Framebuffer (2 bytes per column) */ |
2002 | BUILD_BUG_ON(PAGE_SIZE < HT16K33_FB_SIZE); |
2003 | fbdev->buffer = (unsigned char *) get_zeroed_page(GFP_KERNEL); |
2004 | @@ -450,6 +487,7 @@ static int ht16k33_probe(struct i2c_client *client, |
2005 | fbdev->info->screen_size = HT16K33_FB_SIZE; |
2006 | fbdev->info->fix = ht16k33_fb_fix; |
2007 | fbdev->info->var = ht16k33_fb_var; |
2008 | + fbdev->info->bl_dev = bl; |
2009 | fbdev->info->pseudo_palette = NULL; |
2010 | fbdev->info->flags = FBINFO_FLAG_DEFAULT; |
2011 | fbdev->info->par = priv; |
2012 | @@ -462,34 +500,6 @@ static int ht16k33_probe(struct i2c_client *client, |
2013 | if (err) |
2014 | goto err_fbdev_unregister; |
2015 | |
2016 | - /* Backlight */ |
2017 | - memset(&bl_props, 0, sizeof(struct backlight_properties)); |
2018 | - bl_props.type = BACKLIGHT_RAW; |
2019 | - bl_props.max_brightness = MAX_BRIGHTNESS; |
2020 | - |
2021 | - bl = devm_backlight_device_register(&client->dev, DRIVER_NAME"-bl", |
2022 | - &client->dev, priv, |
2023 | - &ht16k33_bl_ops, &bl_props); |
2024 | - if (IS_ERR(bl)) { |
2025 | - dev_err(&client->dev, "failed to register backlight\n"); |
2026 | - err = PTR_ERR(bl); |
2027 | - goto err_fbdev_unregister; |
2028 | - } |
2029 | - |
2030 | - err = of_property_read_u32(node, "default-brightness-level", |
2031 | - &dft_brightness); |
2032 | - if (err) { |
2033 | - dft_brightness = MAX_BRIGHTNESS; |
2034 | - } else if (dft_brightness > MAX_BRIGHTNESS) { |
2035 | - dev_warn(&client->dev, |
2036 | - "invalid default brightness level: %u, using %u\n", |
2037 | - dft_brightness, MAX_BRIGHTNESS); |
2038 | - dft_brightness = MAX_BRIGHTNESS; |
2039 | - } |
2040 | - |
2041 | - bl->props.brightness = dft_brightness; |
2042 | - ht16k33_bl_update_status(bl); |
2043 | - |
2044 | ht16k33_fb_queue(priv); |
2045 | return 0; |
2046 | |
2047 | diff --git a/drivers/auxdisplay/img-ascii-lcd.c b/drivers/auxdisplay/img-ascii-lcd.c |
2048 | index efb928e25aef3..9556d6827f005 100644 |
2049 | --- a/drivers/auxdisplay/img-ascii-lcd.c |
2050 | +++ b/drivers/auxdisplay/img-ascii-lcd.c |
2051 | @@ -280,6 +280,16 @@ static int img_ascii_lcd_display(struct img_ascii_lcd_ctx *ctx, |
2052 | if (msg[count - 1] == '\n') |
2053 | count--; |
2054 | |
2055 | + if (!count) { |
2056 | + /* clear the LCD */ |
2057 | + devm_kfree(&ctx->pdev->dev, ctx->message); |
2058 | + ctx->message = NULL; |
2059 | + ctx->message_len = 0; |
2060 | + memset(ctx->curr, ' ', ctx->cfg->num_chars); |
2061 | + ctx->cfg->update(ctx); |
2062 | + return 0; |
2063 | + } |
2064 | + |
2065 | new_msg = devm_kmalloc(&ctx->pdev->dev, count + 1, GFP_KERNEL); |
2066 | if (!new_msg) |
2067 | return -ENOMEM; |
2068 | diff --git a/drivers/block/ataflop.c b/drivers/block/ataflop.c |
2069 | index bd7d3bb8b890b..ad4cf10749100 100644 |
2070 | --- a/drivers/block/ataflop.c |
2071 | +++ b/drivers/block/ataflop.c |
2072 | @@ -653,9 +653,6 @@ static inline void copy_buffer(void *from, void *to) |
2073 | *p2++ = *p1++; |
2074 | } |
2075 | |
2076 | - |
2077 | - |
2078 | - |
2079 | /* General Interrupt Handling */ |
2080 | |
2081 | static void (*FloppyIRQHandler)( int status ) = NULL; |
2082 | @@ -1225,6 +1222,7 @@ static void fd_rwsec_done1(int status) |
2083 | } |
2084 | else { |
2085 | /* all sectors finished */ |
2086 | + finish_fdc(); |
2087 | fd_end_request_cur(BLK_STS_OK); |
2088 | } |
2089 | return; |
2090 | @@ -1472,15 +1470,6 @@ static void setup_req_params( int drive ) |
2091 | ReqTrack, ReqSector, (unsigned long)ReqData )); |
2092 | } |
2093 | |
2094 | -static void ataflop_commit_rqs(struct blk_mq_hw_ctx *hctx) |
2095 | -{ |
2096 | - spin_lock_irq(&ataflop_lock); |
2097 | - atari_disable_irq(IRQ_MFP_FDC); |
2098 | - finish_fdc(); |
2099 | - atari_enable_irq(IRQ_MFP_FDC); |
2100 | - spin_unlock_irq(&ataflop_lock); |
2101 | -} |
2102 | - |
2103 | static blk_status_t ataflop_queue_rq(struct blk_mq_hw_ctx *hctx, |
2104 | const struct blk_mq_queue_data *bd) |
2105 | { |
2106 | @@ -1488,6 +1477,8 @@ static blk_status_t ataflop_queue_rq(struct blk_mq_hw_ctx *hctx, |
2107 | int drive = floppy - unit; |
2108 | int type = floppy->type; |
2109 | |
2110 | + DPRINT(("Queue request: drive %d type %d last %d\n", drive, type, bd->last)); |
2111 | + |
2112 | spin_lock_irq(&ataflop_lock); |
2113 | if (fd_request) { |
2114 | spin_unlock_irq(&ataflop_lock); |
2115 | @@ -1547,8 +1538,6 @@ static blk_status_t ataflop_queue_rq(struct blk_mq_hw_ctx *hctx, |
2116 | setup_req_params( drive ); |
2117 | do_fd_action( drive ); |
2118 | |
2119 | - if (bd->last) |
2120 | - finish_fdc(); |
2121 | atari_enable_irq( IRQ_MFP_FDC ); |
2122 | |
2123 | out: |
2124 | @@ -1958,7 +1947,6 @@ static const struct block_device_operations floppy_fops = { |
2125 | |
2126 | static const struct blk_mq_ops ataflop_mq_ops = { |
2127 | .queue_rq = ataflop_queue_rq, |
2128 | - .commit_rqs = ataflop_commit_rqs, |
2129 | }; |
2130 | |
2131 | static struct kobject *floppy_find(dev_t dev, int *part, void *data) |
2132 | diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c |
2133 | index 719c6b7741afa..1cc9b67e9bcaa 100644 |
2134 | --- a/drivers/block/zram/zram_drv.c |
2135 | +++ b/drivers/block/zram/zram_drv.c |
2136 | @@ -901,7 +901,7 @@ static ssize_t read_block_state(struct file *file, char __user *buf, |
2137 | zram_test_flag(zram, index, ZRAM_HUGE) ? 'h' : '.', |
2138 | zram_test_flag(zram, index, ZRAM_IDLE) ? 'i' : '.'); |
2139 | |
2140 | - if (count < copied) { |
2141 | + if (count <= copied) { |
2142 | zram_slot_unlock(zram, index); |
2143 | break; |
2144 | } |
2145 | diff --git a/drivers/bluetooth/btmtkuart.c b/drivers/bluetooth/btmtkuart.c |
2146 | index 8a81fbca5c9d8..2beb2321825e3 100644 |
2147 | --- a/drivers/bluetooth/btmtkuart.c |
2148 | +++ b/drivers/bluetooth/btmtkuart.c |
2149 | @@ -158,8 +158,10 @@ static int mtk_hci_wmt_sync(struct hci_dev *hdev, |
2150 | int err; |
2151 | |
2152 | hlen = sizeof(*hdr) + wmt_params->dlen; |
2153 | - if (hlen > 255) |
2154 | - return -EINVAL; |
2155 | + if (hlen > 255) { |
2156 | + err = -EINVAL; |
2157 | + goto err_free_skb; |
2158 | + } |
2159 | |
2160 | hdr = (struct mtk_wmt_hdr *)&wc; |
2161 | hdr->dir = 1; |
2162 | @@ -173,7 +175,7 @@ static int mtk_hci_wmt_sync(struct hci_dev *hdev, |
2163 | err = __hci_cmd_send(hdev, 0xfc6f, hlen, &wc); |
2164 | if (err < 0) { |
2165 | clear_bit(BTMTKUART_TX_WAIT_VND_EVT, &bdev->tx_state); |
2166 | - return err; |
2167 | + goto err_free_skb; |
2168 | } |
2169 | |
2170 | /* The vendor specific WMT commands are all answered by a vendor |
2171 | @@ -190,13 +192,14 @@ static int mtk_hci_wmt_sync(struct hci_dev *hdev, |
2172 | if (err == -EINTR) { |
2173 | bt_dev_err(hdev, "Execution of wmt command interrupted"); |
2174 | clear_bit(BTMTKUART_TX_WAIT_VND_EVT, &bdev->tx_state); |
2175 | - return err; |
2176 | + goto err_free_skb; |
2177 | } |
2178 | |
2179 | if (err) { |
2180 | bt_dev_err(hdev, "Execution of wmt command timed out"); |
2181 | clear_bit(BTMTKUART_TX_WAIT_VND_EVT, &bdev->tx_state); |
2182 | - return -ETIMEDOUT; |
2183 | + err = -ETIMEDOUT; |
2184 | + goto err_free_skb; |
2185 | } |
2186 | |
2187 | /* Parse and handle the return WMT event */ |
2188 | diff --git a/drivers/char/hw_random/mtk-rng.c b/drivers/char/hw_random/mtk-rng.c |
2189 | index e649be5a5f132..6670516fa194d 100644 |
2190 | --- a/drivers/char/hw_random/mtk-rng.c |
2191 | +++ b/drivers/char/hw_random/mtk-rng.c |
2192 | @@ -173,8 +173,13 @@ static int mtk_rng_runtime_resume(struct device *dev) |
2193 | return mtk_rng_init(&priv->rng); |
2194 | } |
2195 | |
2196 | -static UNIVERSAL_DEV_PM_OPS(mtk_rng_pm_ops, mtk_rng_runtime_suspend, |
2197 | - mtk_rng_runtime_resume, NULL); |
2198 | +static const struct dev_pm_ops mtk_rng_pm_ops = { |
2199 | + SET_RUNTIME_PM_OPS(mtk_rng_runtime_suspend, |
2200 | + mtk_rng_runtime_resume, NULL) |
2201 | + SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, |
2202 | + pm_runtime_force_resume) |
2203 | +}; |
2204 | + |
2205 | #define MTK_RNG_PM_OPS (&mtk_rng_pm_ops) |
2206 | #else /* CONFIG_PM */ |
2207 | #define MTK_RNG_PM_OPS NULL |
2208 | diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c |
2209 | index ac656a6d5daf1..bd3c9fb029fa5 100644 |
2210 | --- a/drivers/char/ipmi/ipmi_msghandler.c |
2211 | +++ b/drivers/char/ipmi/ipmi_msghandler.c |
2212 | @@ -4797,7 +4797,9 @@ static atomic_t recv_msg_inuse_count = ATOMIC_INIT(0); |
2213 | static void free_smi_msg(struct ipmi_smi_msg *msg) |
2214 | { |
2215 | atomic_dec(&smi_msg_inuse_count); |
2216 | - kfree(msg); |
2217 | + /* Try to keep as much stuff out of the panic path as possible. */ |
2218 | + if (!oops_in_progress) |
2219 | + kfree(msg); |
2220 | } |
2221 | |
2222 | struct ipmi_smi_msg *ipmi_alloc_smi_msg(void) |
2223 | @@ -4816,7 +4818,9 @@ EXPORT_SYMBOL(ipmi_alloc_smi_msg); |
2224 | static void free_recv_msg(struct ipmi_recv_msg *msg) |
2225 | { |
2226 | atomic_dec(&recv_msg_inuse_count); |
2227 | - kfree(msg); |
2228 | + /* Try to keep as much stuff out of the panic path as possible. */ |
2229 | + if (!oops_in_progress) |
2230 | + kfree(msg); |
2231 | } |
2232 | |
2233 | static struct ipmi_recv_msg *ipmi_alloc_recv_msg(void) |
2234 | @@ -4834,7 +4838,7 @@ static struct ipmi_recv_msg *ipmi_alloc_recv_msg(void) |
2235 | |
2236 | void ipmi_free_recv_msg(struct ipmi_recv_msg *msg) |
2237 | { |
2238 | - if (msg->user) |
2239 | + if (msg->user && !oops_in_progress) |
2240 | kref_put(&msg->user->refcount, free_user); |
2241 | msg->done(msg); |
2242 | } |
2243 | diff --git a/drivers/char/ipmi/ipmi_watchdog.c b/drivers/char/ipmi/ipmi_watchdog.c |
2244 | index ae06e5402e9d5..72ad7fff64a7a 100644 |
2245 | --- a/drivers/char/ipmi/ipmi_watchdog.c |
2246 | +++ b/drivers/char/ipmi/ipmi_watchdog.c |
2247 | @@ -337,13 +337,17 @@ static atomic_t msg_tofree = ATOMIC_INIT(0); |
2248 | static DECLARE_COMPLETION(msg_wait); |
2249 | static void msg_free_smi(struct ipmi_smi_msg *msg) |
2250 | { |
2251 | - if (atomic_dec_and_test(&msg_tofree)) |
2252 | - complete(&msg_wait); |
2253 | + if (atomic_dec_and_test(&msg_tofree)) { |
2254 | + if (!oops_in_progress) |
2255 | + complete(&msg_wait); |
2256 | + } |
2257 | } |
2258 | static void msg_free_recv(struct ipmi_recv_msg *msg) |
2259 | { |
2260 | - if (atomic_dec_and_test(&msg_tofree)) |
2261 | - complete(&msg_wait); |
2262 | + if (atomic_dec_and_test(&msg_tofree)) { |
2263 | + if (!oops_in_progress) |
2264 | + complete(&msg_wait); |
2265 | + } |
2266 | } |
2267 | static struct ipmi_smi_msg smi_msg = { |
2268 | .done = msg_free_smi |
2269 | @@ -429,8 +433,10 @@ static int _ipmi_set_timeout(int do_heartbeat) |
2270 | rv = __ipmi_set_timeout(&smi_msg, |
2271 | &recv_msg, |
2272 | &send_heartbeat_now); |
2273 | - if (rv) |
2274 | + if (rv) { |
2275 | + atomic_set(&msg_tofree, 0); |
2276 | return rv; |
2277 | + } |
2278 | |
2279 | wait_for_completion(&msg_wait); |
2280 | |
2281 | @@ -575,6 +581,7 @@ restart: |
2282 | &recv_msg, |
2283 | 1); |
2284 | if (rv) { |
2285 | + atomic_set(&msg_tofree, 0); |
2286 | pr_warn("heartbeat send failure: %d\n", rv); |
2287 | return rv; |
2288 | } |
2289 | diff --git a/drivers/char/tpm/tpm2-space.c b/drivers/char/tpm/tpm2-space.c |
2290 | index 784b8b3cb903f..97e916856cf3e 100644 |
2291 | --- a/drivers/char/tpm/tpm2-space.c |
2292 | +++ b/drivers/char/tpm/tpm2-space.c |
2293 | @@ -455,6 +455,9 @@ static int tpm2_map_response_body(struct tpm_chip *chip, u32 cc, u8 *rsp, |
2294 | if (be32_to_cpu(data->capability) != TPM2_CAP_HANDLES) |
2295 | return 0; |
2296 | |
2297 | + if (be32_to_cpu(data->count) > (UINT_MAX - TPM_HEADER_SIZE - 9) / 4) |
2298 | + return -EFAULT; |
2299 | + |
2300 | if (len != TPM_HEADER_SIZE + 9 + 4 * be32_to_cpu(data->count)) |
2301 | return -EFAULT; |
2302 | |
2303 | diff --git a/drivers/clk/at91/pmc.c b/drivers/clk/at91/pmc.c |
2304 | index b71515acdec1f..976ca41e9157e 100644 |
2305 | --- a/drivers/clk/at91/pmc.c |
2306 | +++ b/drivers/clk/at91/pmc.c |
2307 | @@ -275,6 +275,11 @@ static int __init pmc_register_ops(void) |
2308 | |
2309 | np = of_find_matching_node(NULL, sama5d2_pmc_dt_ids); |
2310 | |
2311 | + if (!of_device_is_available(np)) { |
2312 | + of_node_put(np); |
2313 | + return -ENODEV; |
2314 | + } |
2315 | + |
2316 | pmcreg = device_node_to_regmap(np); |
2317 | if (IS_ERR(pmcreg)) |
2318 | return PTR_ERR(pmcreg); |
2319 | diff --git a/drivers/clk/mvebu/ap-cpu-clk.c b/drivers/clk/mvebu/ap-cpu-clk.c |
2320 | index af5e5acad3706..bde4a7d6a1d33 100644 |
2321 | --- a/drivers/clk/mvebu/ap-cpu-clk.c |
2322 | +++ b/drivers/clk/mvebu/ap-cpu-clk.c |
2323 | @@ -256,12 +256,15 @@ static int ap_cpu_clock_probe(struct platform_device *pdev) |
2324 | int cpu, err; |
2325 | |
2326 | err = of_property_read_u32(dn, "reg", &cpu); |
2327 | - if (WARN_ON(err)) |
2328 | + if (WARN_ON(err)) { |
2329 | + of_node_put(dn); |
2330 | return err; |
2331 | + } |
2332 | |
2333 | /* If cpu2 or cpu3 is enabled */ |
2334 | if (cpu & APN806_CLUSTER_NUM_MASK) { |
2335 | nclusters = 2; |
2336 | + of_node_put(dn); |
2337 | break; |
2338 | } |
2339 | } |
2340 | @@ -288,8 +291,10 @@ static int ap_cpu_clock_probe(struct platform_device *pdev) |
2341 | int cpu, err; |
2342 | |
2343 | err = of_property_read_u32(dn, "reg", &cpu); |
2344 | - if (WARN_ON(err)) |
2345 | + if (WARN_ON(err)) { |
2346 | + of_node_put(dn); |
2347 | return err; |
2348 | + } |
2349 | |
2350 | cluster_index = cpu & APN806_CLUSTER_NUM_MASK; |
2351 | cluster_index >>= APN806_CLUSTER_NUM_OFFSET; |
2352 | @@ -301,6 +306,7 @@ static int ap_cpu_clock_probe(struct platform_device *pdev) |
2353 | parent = of_clk_get(np, cluster_index); |
2354 | if (IS_ERR(parent)) { |
2355 | dev_err(dev, "Could not get the clock parent\n"); |
2356 | + of_node_put(dn); |
2357 | return -EINVAL; |
2358 | } |
2359 | parent_name = __clk_get_name(parent); |
2360 | @@ -319,8 +325,10 @@ static int ap_cpu_clock_probe(struct platform_device *pdev) |
2361 | init.parent_names = &parent_name; |
2362 | |
2363 | ret = devm_clk_hw_register(dev, &ap_cpu_clk[cluster_index].hw); |
2364 | - if (ret) |
2365 | + if (ret) { |
2366 | + of_node_put(dn); |
2367 | return ret; |
2368 | + } |
2369 | ap_cpu_data->hws[cluster_index] = &ap_cpu_clk[cluster_index].hw; |
2370 | } |
2371 | |
2372 | diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig |
2373 | index 3bb5625504e2f..9bfe4c5af87e3 100644 |
2374 | --- a/drivers/clocksource/Kconfig |
2375 | +++ b/drivers/clocksource/Kconfig |
2376 | @@ -24,6 +24,7 @@ config I8253_LOCK |
2377 | |
2378 | config OMAP_DM_TIMER |
2379 | bool |
2380 | + select TIMER_OF |
2381 | |
2382 | config CLKBLD_I8253 |
2383 | def_bool y if CLKSRC_I8253 || CLKEVT_I8253 || I8253_LOCK |
2384 | diff --git a/drivers/cpuidle/sysfs.c b/drivers/cpuidle/sysfs.c |
2385 | index f8747322b3c70..e591f56f98c03 100644 |
2386 | --- a/drivers/cpuidle/sysfs.c |
2387 | +++ b/drivers/cpuidle/sysfs.c |
2388 | @@ -481,6 +481,7 @@ static int cpuidle_add_state_sysfs(struct cpuidle_device *device) |
2389 | &kdev->kobj, "state%d", i); |
2390 | if (ret) { |
2391 | kobject_put(&kobj->kobj); |
2392 | + kfree(kobj); |
2393 | goto error_state; |
2394 | } |
2395 | cpuidle_add_s2idle_attr_group(kobj); |
2396 | @@ -612,6 +613,7 @@ static int cpuidle_add_driver_sysfs(struct cpuidle_device *dev) |
2397 | &kdev->kobj, "driver"); |
2398 | if (ret) { |
2399 | kobject_put(&kdrv->kobj); |
2400 | + kfree(kdrv); |
2401 | return ret; |
2402 | } |
2403 | |
2404 | @@ -698,7 +700,6 @@ int cpuidle_add_sysfs(struct cpuidle_device *dev) |
2405 | if (!kdev) |
2406 | return -ENOMEM; |
2407 | kdev->dev = dev; |
2408 | - dev->kobj_dev = kdev; |
2409 | |
2410 | init_completion(&kdev->kobj_unregister); |
2411 | |
2412 | @@ -706,9 +707,11 @@ int cpuidle_add_sysfs(struct cpuidle_device *dev) |
2413 | "cpuidle"); |
2414 | if (error) { |
2415 | kobject_put(&kdev->kobj); |
2416 | + kfree(kdev); |
2417 | return error; |
2418 | } |
2419 | |
2420 | + dev->kobj_dev = kdev; |
2421 | kobject_uevent(&kdev->kobj, KOBJ_ADD); |
2422 | |
2423 | return 0; |
2424 | diff --git a/drivers/crypto/caam/caampkc.c b/drivers/crypto/caam/caampkc.c |
2425 | index 83f96d4f86e03..30e3f41ed8721 100644 |
2426 | --- a/drivers/crypto/caam/caampkc.c |
2427 | +++ b/drivers/crypto/caam/caampkc.c |
2428 | @@ -1087,16 +1087,27 @@ static struct caam_akcipher_alg caam_rsa = { |
2429 | int caam_pkc_init(struct device *ctrldev) |
2430 | { |
2431 | struct caam_drv_private *priv = dev_get_drvdata(ctrldev); |
2432 | - u32 pk_inst; |
2433 | + u32 pk_inst, pkha; |
2434 | int err; |
2435 | init_done = false; |
2436 | |
2437 | /* Determine public key hardware accelerator presence. */ |
2438 | - if (priv->era < 10) |
2439 | + if (priv->era < 10) { |
2440 | pk_inst = (rd_reg32(&priv->ctrl->perfmon.cha_num_ls) & |
2441 | CHA_ID_LS_PK_MASK) >> CHA_ID_LS_PK_SHIFT; |
2442 | - else |
2443 | - pk_inst = rd_reg32(&priv->ctrl->vreg.pkha) & CHA_VER_NUM_MASK; |
2444 | + } else { |
2445 | + pkha = rd_reg32(&priv->ctrl->vreg.pkha); |
2446 | + pk_inst = pkha & CHA_VER_NUM_MASK; |
2447 | + |
2448 | + /* |
2449 | + * Newer CAAMs support partially disabled functionality. If this is the |
2450 | + * case, the number is non-zero, but this bit is set to indicate that |
2451 | + * no encryption or decryption is supported. Only signing and verifying |
2452 | + * is supported. |
2453 | + */ |
2454 | + if (pkha & CHA_VER_MISC_PKHA_NO_CRYPT) |
2455 | + pk_inst = 0; |
2456 | + } |
2457 | |
2458 | /* Do not register algorithms if PKHA is not present. */ |
2459 | if (!pk_inst) |
2460 | diff --git a/drivers/crypto/caam/regs.h b/drivers/crypto/caam/regs.h |
2461 | index 05127b70527d7..43975f01465d2 100644 |
2462 | --- a/drivers/crypto/caam/regs.h |
2463 | +++ b/drivers/crypto/caam/regs.h |
2464 | @@ -317,6 +317,9 @@ struct version_regs { |
2465 | /* CHA Miscellaneous Information - AESA_MISC specific */ |
2466 | #define CHA_VER_MISC_AES_GCM BIT(1 + CHA_VER_MISC_SHIFT) |
2467 | |
2468 | +/* CHA Miscellaneous Information - PKHA_MISC specific */ |
2469 | +#define CHA_VER_MISC_PKHA_NO_CRYPT BIT(7 + CHA_VER_MISC_SHIFT) |
2470 | + |
2471 | /* |
2472 | * caam_perfmon - Performance Monitor/Secure Memory Status/ |
2473 | * CAAM Global Status/Component Version IDs |
2474 | diff --git a/drivers/crypto/qat/qat_common/adf_pf2vf_msg.c b/drivers/crypto/qat/qat_common/adf_pf2vf_msg.c |
2475 | index c64481160b711..180016e157771 100644 |
2476 | --- a/drivers/crypto/qat/qat_common/adf_pf2vf_msg.c |
2477 | +++ b/drivers/crypto/qat/qat_common/adf_pf2vf_msg.c |
2478 | @@ -195,6 +195,13 @@ static int __adf_iov_putmsg(struct adf_accel_dev *accel_dev, u32 msg, u8 vf_nr) |
2479 | val = ADF_CSR_RD(pmisc_bar_addr, pf2vf_offset); |
2480 | } while ((val & int_bit) && (count++ < ADF_IOV_MSG_ACK_MAX_RETRY)); |
2481 | |
2482 | + if (val != msg) { |
2483 | + dev_dbg(&GET_DEV(accel_dev), |
2484 | + "Collision - PFVF CSR overwritten by remote function\n"); |
2485 | + ret = -EIO; |
2486 | + goto out; |
2487 | + } |
2488 | + |
2489 | if (val & int_bit) { |
2490 | dev_dbg(&GET_DEV(accel_dev), "ACK not received from remote\n"); |
2491 | val &= ~int_bit; |
2492 | @@ -243,6 +250,11 @@ void adf_vf2pf_req_hndl(struct adf_accel_vf_info *vf_info) |
2493 | |
2494 | /* Read message from the VF */ |
2495 | msg = ADF_CSR_RD(pmisc_addr, hw_data->get_pf2vf_offset(vf_nr)); |
2496 | + if (!(msg & ADF_VF2PF_INT)) { |
2497 | + dev_info(&GET_DEV(accel_dev), |
2498 | + "Spurious VF2PF interrupt, msg %X. Ignored\n", msg); |
2499 | + goto out; |
2500 | + } |
2501 | |
2502 | /* To ACK, clear the VF2PFINT bit */ |
2503 | msg &= ~ADF_VF2PF_INT; |
2504 | @@ -326,6 +338,7 @@ void adf_vf2pf_req_hndl(struct adf_accel_vf_info *vf_info) |
2505 | if (resp && adf_iov_putmsg(accel_dev, resp, vf_nr)) |
2506 | dev_err(&GET_DEV(accel_dev), "Failed to send response to VF\n"); |
2507 | |
2508 | +out: |
2509 | /* re-enable interrupt on PF from this VF */ |
2510 | adf_enable_vf2pf_interrupts(accel_dev, (1 << vf_nr)); |
2511 | return; |
2512 | diff --git a/drivers/crypto/qat/qat_common/adf_vf_isr.c b/drivers/crypto/qat/qat_common/adf_vf_isr.c |
2513 | index ef90902c8200d..86274e3c6781d 100644 |
2514 | --- a/drivers/crypto/qat/qat_common/adf_vf_isr.c |
2515 | +++ b/drivers/crypto/qat/qat_common/adf_vf_isr.c |
2516 | @@ -123,6 +123,11 @@ static void adf_pf2vf_bh_handler(void *data) |
2517 | |
2518 | /* Read the message from PF */ |
2519 | msg = ADF_CSR_RD(pmisc_bar_addr, hw_data->get_pf2vf_offset(0)); |
2520 | + if (!(msg & ADF_PF2VF_INT)) { |
2521 | + dev_info(&GET_DEV(accel_dev), |
2522 | + "Spurious PF2VF interrupt, msg %X. Ignored\n", msg); |
2523 | + goto out; |
2524 | + } |
2525 | |
2526 | if (!(msg & ADF_PF2VF_MSGORIGIN_SYSTEM)) |
2527 | /* Ignore legacy non-system (non-kernel) PF2VF messages */ |
2528 | @@ -171,6 +176,7 @@ static void adf_pf2vf_bh_handler(void *data) |
2529 | msg &= ~ADF_PF2VF_INT; |
2530 | ADF_CSR_WR(pmisc_bar_addr, hw_data->get_pf2vf_offset(0), msg); |
2531 | |
2532 | +out: |
2533 | /* Re-enable PF2VF interrupts */ |
2534 | adf_enable_pf2vf_interrupts(accel_dev); |
2535 | return; |
2536 | diff --git a/drivers/crypto/s5p-sss.c b/drivers/crypto/s5p-sss.c |
2537 | index 010f1bb20dada..86a13b738c2de 100644 |
2538 | --- a/drivers/crypto/s5p-sss.c |
2539 | +++ b/drivers/crypto/s5p-sss.c |
2540 | @@ -2208,6 +2208,8 @@ static int s5p_aes_probe(struct platform_device *pdev) |
2541 | |
2542 | variant = find_s5p_sss_version(pdev); |
2543 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
2544 | + if (!res) |
2545 | + return -EINVAL; |
2546 | |
2547 | /* |
2548 | * Note: HASH and PRNG uses the same registers in secss, avoid |
2549 | diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c |
2550 | index 758de0e9b2ddc..16bbc9bc9e6d1 100644 |
2551 | --- a/drivers/dma-buf/dma-buf.c |
2552 | +++ b/drivers/dma-buf/dma-buf.c |
2553 | @@ -79,6 +79,7 @@ static void dma_buf_release(struct dentry *dentry) |
2554 | if (dmabuf->resv == (struct dma_resv *)&dmabuf[1]) |
2555 | dma_resv_fini(dmabuf->resv); |
2556 | |
2557 | + WARN_ON(!list_empty(&dmabuf->attachments)); |
2558 | module_put(dmabuf->owner); |
2559 | kfree(dmabuf->name); |
2560 | kfree(dmabuf); |
2561 | diff --git a/drivers/dma/at_xdmac.c b/drivers/dma/at_xdmac.c |
2562 | index b58ac720d9a12..6f1e97ba3e786 100644 |
2563 | --- a/drivers/dma/at_xdmac.c |
2564 | +++ b/drivers/dma/at_xdmac.c |
2565 | @@ -145,7 +145,7 @@ |
2566 | #define AT_XDMAC_CC_WRIP (0x1 << 23) /* Write in Progress (read only) */ |
2567 | #define AT_XDMAC_CC_WRIP_DONE (0x0 << 23) |
2568 | #define AT_XDMAC_CC_WRIP_IN_PROGRESS (0x1 << 23) |
2569 | -#define AT_XDMAC_CC_PERID(i) (0x7f & (i) << 24) /* Channel Peripheral Identifier */ |
2570 | +#define AT_XDMAC_CC_PERID(i) ((0x7f & (i)) << 24) /* Channel Peripheral Identifier */ |
2571 | #define AT_XDMAC_CDS_MSP 0x2C /* Channel Data Stride Memory Set Pattern */ |
2572 | #define AT_XDMAC_CSUS 0x30 /* Channel Source Microblock Stride */ |
2573 | #define AT_XDMAC_CDUS 0x34 /* Channel Destination Microblock Stride */ |
2574 | diff --git a/drivers/dma/dmaengine.h b/drivers/dma/dmaengine.h |
2575 | index 501c0b063f852..302f13efd35d9 100644 |
2576 | --- a/drivers/dma/dmaengine.h |
2577 | +++ b/drivers/dma/dmaengine.h |
2578 | @@ -168,7 +168,7 @@ dmaengine_desc_get_callback_invoke(struct dma_async_tx_descriptor *tx, |
2579 | static inline bool |
2580 | dmaengine_desc_callback_valid(struct dmaengine_desc_callback *cb) |
2581 | { |
2582 | - return (cb->callback) ? true : false; |
2583 | + return cb->callback || cb->callback_result; |
2584 | } |
2585 | |
2586 | #endif |
2587 | diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c |
2588 | index aed0f26c9af5d..ac4a5015c146b 100644 |
2589 | --- a/drivers/edac/amd64_edac.c |
2590 | +++ b/drivers/edac/amd64_edac.c |
2591 | @@ -797,12 +797,14 @@ static void debug_dump_dramcfg_low(struct amd64_pvt *pvt, u32 dclr, int chan) |
2592 | #define CS_ODD_PRIMARY BIT(1) |
2593 | #define CS_EVEN_SECONDARY BIT(2) |
2594 | #define CS_ODD_SECONDARY BIT(3) |
2595 | +#define CS_3R_INTERLEAVE BIT(4) |
2596 | |
2597 | #define CS_EVEN (CS_EVEN_PRIMARY | CS_EVEN_SECONDARY) |
2598 | #define CS_ODD (CS_ODD_PRIMARY | CS_ODD_SECONDARY) |
2599 | |
2600 | static int f17_get_cs_mode(int dimm, u8 ctrl, struct amd64_pvt *pvt) |
2601 | { |
2602 | + u8 base, count = 0; |
2603 | int cs_mode = 0; |
2604 | |
2605 | if (csrow_enabled(2 * dimm, ctrl, pvt)) |
2606 | @@ -815,6 +817,20 @@ static int f17_get_cs_mode(int dimm, u8 ctrl, struct amd64_pvt *pvt) |
2607 | if (csrow_sec_enabled(2 * dimm + 1, ctrl, pvt)) |
2608 | cs_mode |= CS_ODD_SECONDARY; |
2609 | |
2610 | + /* |
2611 | + * 3 Rank inteleaving support. |
2612 | + * There should be only three bases enabled and their two masks should |
2613 | + * be equal. |
2614 | + */ |
2615 | + for_each_chip_select(base, ctrl, pvt) |
2616 | + count += csrow_enabled(base, ctrl, pvt); |
2617 | + |
2618 | + if (count == 3 && |
2619 | + pvt->csels[ctrl].csmasks[0] == pvt->csels[ctrl].csmasks[1]) { |
2620 | + edac_dbg(1, "3R interleaving in use.\n"); |
2621 | + cs_mode |= CS_3R_INTERLEAVE; |
2622 | + } |
2623 | + |
2624 | return cs_mode; |
2625 | } |
2626 | |
2627 | @@ -1623,10 +1639,14 @@ static int f17_addr_mask_to_cs_size(struct amd64_pvt *pvt, u8 umc, |
2628 | * |
2629 | * The MSB is the number of bits in the full mask because BIT[0] is |
2630 | * always 0. |
2631 | + * |
2632 | + * In the special 3 Rank interleaving case, a single bit is flipped |
2633 | + * without swapping with the most significant bit. This can be handled |
2634 | + * by keeping the MSB where it is and ignoring the single zero bit. |
2635 | */ |
2636 | msb = fls(addr_mask_orig) - 1; |
2637 | weight = hweight_long(addr_mask_orig); |
2638 | - num_zero_bits = msb - weight; |
2639 | + num_zero_bits = msb - weight - !!(cs_mode & CS_3R_INTERLEAVE); |
2640 | |
2641 | /* Take the number of zero bits off from the top of the mask. */ |
2642 | addr_mask_deinterleaved = GENMASK_ULL(msb - num_zero_bits, 1); |
2643 | diff --git a/drivers/edac/sb_edac.c b/drivers/edac/sb_edac.c |
2644 | index d39f5bfb8bd92..b0b280eef1d00 100644 |
2645 | --- a/drivers/edac/sb_edac.c |
2646 | +++ b/drivers/edac/sb_edac.c |
2647 | @@ -1055,7 +1055,7 @@ static u64 haswell_get_tohm(struct sbridge_pvt *pvt) |
2648 | pci_read_config_dword(pvt->info.pci_vtd, HASWELL_TOHM_1, ®); |
2649 | rc = ((reg << 6) | rc) << 26; |
2650 | |
2651 | - return rc | 0x1ffffff; |
2652 | + return rc | 0x3ffffff; |
2653 | } |
2654 | |
2655 | static u64 knl_get_tolm(struct sbridge_pvt *pvt) |
2656 | diff --git a/drivers/firmware/psci/psci_checker.c b/drivers/firmware/psci/psci_checker.c |
2657 | index 03eb798ad3ed9..250b7232f9816 100644 |
2658 | --- a/drivers/firmware/psci/psci_checker.c |
2659 | +++ b/drivers/firmware/psci/psci_checker.c |
2660 | @@ -155,7 +155,7 @@ static int alloc_init_cpu_groups(cpumask_var_t **pcpu_groups) |
2661 | if (!alloc_cpumask_var(&tmp, GFP_KERNEL)) |
2662 | return -ENOMEM; |
2663 | |
2664 | - cpu_groups = kcalloc(nb_available_cpus, sizeof(cpu_groups), |
2665 | + cpu_groups = kcalloc(nb_available_cpus, sizeof(*cpu_groups), |
2666 | GFP_KERNEL); |
2667 | if (!cpu_groups) { |
2668 | free_cpumask_var(tmp); |
2669 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c |
2670 | index 85b0515c0fdcf..e0d2f79571ef5 100644 |
2671 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c |
2672 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c |
2673 | @@ -61,7 +61,7 @@ static void amdgpu_bo_list_free(struct kref *ref) |
2674 | |
2675 | int amdgpu_bo_list_create(struct amdgpu_device *adev, struct drm_file *filp, |
2676 | struct drm_amdgpu_bo_list_entry *info, |
2677 | - unsigned num_entries, struct amdgpu_bo_list **result) |
2678 | + size_t num_entries, struct amdgpu_bo_list **result) |
2679 | { |
2680 | unsigned last_entry = 0, first_userptr = num_entries; |
2681 | struct amdgpu_bo_list_entry *array; |
2682 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.h |
2683 | index a130e766cbdbe..529d52a204cf4 100644 |
2684 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.h |
2685 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.h |
2686 | @@ -60,7 +60,7 @@ int amdgpu_bo_create_list_entry_array(struct drm_amdgpu_bo_list_in *in, |
2687 | int amdgpu_bo_list_create(struct amdgpu_device *adev, |
2688 | struct drm_file *filp, |
2689 | struct drm_amdgpu_bo_list_entry *info, |
2690 | - unsigned num_entries, |
2691 | + size_t num_entries, |
2692 | struct amdgpu_bo_list **list); |
2693 | |
2694 | static inline struct amdgpu_bo_list_entry * |
2695 | diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c |
2696 | index 9fb1765e92d15..e9f5de35f7953 100644 |
2697 | --- a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c |
2698 | +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c |
2699 | @@ -863,12 +863,12 @@ static int gmc_v6_0_sw_init(void *handle) |
2700 | |
2701 | adev->gmc.mc_mask = 0xffffffffffULL; |
2702 | |
2703 | - r = dma_set_mask_and_coherent(adev->dev, DMA_BIT_MASK(44)); |
2704 | + r = dma_set_mask_and_coherent(adev->dev, DMA_BIT_MASK(40)); |
2705 | if (r) { |
2706 | dev_warn(adev->dev, "amdgpu: No suitable DMA available.\n"); |
2707 | return r; |
2708 | } |
2709 | - adev->need_swiotlb = drm_need_swiotlb(44); |
2710 | + adev->need_swiotlb = drm_need_swiotlb(40); |
2711 | |
2712 | r = gmc_v6_0_init_microcode(adev); |
2713 | if (r) { |
2714 | diff --git a/drivers/gpu/drm/drm_panel_orientation_quirks.c b/drivers/gpu/drm/drm_panel_orientation_quirks.c |
2715 | index f6bdec7fa9253..a950d5db211c5 100644 |
2716 | --- a/drivers/gpu/drm/drm_panel_orientation_quirks.c |
2717 | +++ b/drivers/gpu/drm/drm_panel_orientation_quirks.c |
2718 | @@ -109,6 +109,12 @@ static const struct drm_dmi_panel_orientation_data lcd1200x1920_rightside_up = { |
2719 | .orientation = DRM_MODE_PANEL_ORIENTATION_RIGHT_UP, |
2720 | }; |
2721 | |
2722 | +static const struct drm_dmi_panel_orientation_data lcd1280x1920_rightside_up = { |
2723 | + .width = 1280, |
2724 | + .height = 1920, |
2725 | + .orientation = DRM_MODE_PANEL_ORIENTATION_RIGHT_UP, |
2726 | +}; |
2727 | + |
2728 | static const struct dmi_system_id orientation_data[] = { |
2729 | { /* Acer One 10 (S1003) */ |
2730 | .matches = { |
2731 | @@ -134,6 +140,12 @@ static const struct dmi_system_id orientation_data[] = { |
2732 | DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "T103HAF"), |
2733 | }, |
2734 | .driver_data = (void *)&lcd800x1280_rightside_up, |
2735 | + }, { /* AYA NEO 2021 */ |
2736 | + .matches = { |
2737 | + DMI_EXACT_MATCH(DMI_SYS_VENDOR, "AYADEVICE"), |
2738 | + DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "AYA NEO 2021"), |
2739 | + }, |
2740 | + .driver_data = (void *)&lcd800x1280_rightside_up, |
2741 | }, { /* GPD MicroPC (generic strings, also match on bios date) */ |
2742 | .matches = { |
2743 | DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Default string"), |
2744 | @@ -185,6 +197,12 @@ static const struct dmi_system_id orientation_data[] = { |
2745 | DMI_EXACT_MATCH(DMI_BOARD_NAME, "Default string"), |
2746 | }, |
2747 | .driver_data = (void *)&gpd_win2, |
2748 | + }, { /* GPD Win 3 */ |
2749 | + .matches = { |
2750 | + DMI_EXACT_MATCH(DMI_SYS_VENDOR, "GPD"), |
2751 | + DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "G1618-03") |
2752 | + }, |
2753 | + .driver_data = (void *)&lcd720x1280_rightside_up, |
2754 | }, { /* I.T.Works TW891 */ |
2755 | .matches = { |
2756 | DMI_EXACT_MATCH(DMI_SYS_VENDOR, "To be filled by O.E.M."), |
2757 | @@ -193,6 +211,13 @@ static const struct dmi_system_id orientation_data[] = { |
2758 | DMI_EXACT_MATCH(DMI_BOARD_NAME, "TW891"), |
2759 | }, |
2760 | .driver_data = (void *)&itworks_tw891, |
2761 | + }, { /* KD Kurio Smart C15200 2-in-1 */ |
2762 | + .matches = { |
2763 | + DMI_EXACT_MATCH(DMI_SYS_VENDOR, "KD Interactive"), |
2764 | + DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Kurio Smart"), |
2765 | + DMI_EXACT_MATCH(DMI_BOARD_NAME, "KDM960BCP"), |
2766 | + }, |
2767 | + .driver_data = (void *)&lcd800x1280_rightside_up, |
2768 | }, { /* |
2769 | * Lenovo Ideapad Miix 310 laptop, only some production batches |
2770 | * have a portrait screen, the resolution checks makes the quirk |
2771 | @@ -211,10 +236,15 @@ static const struct dmi_system_id orientation_data[] = { |
2772 | DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "Lenovo MIIX 320-10ICR"), |
2773 | }, |
2774 | .driver_data = (void *)&lcd800x1280_rightside_up, |
2775 | - }, { /* Lenovo Ideapad D330 */ |
2776 | + }, { /* Lenovo Ideapad D330-10IGM (HD) */ |
2777 | + .matches = { |
2778 | + DMI_EXACT_MATCH(DMI_SYS_VENDOR, "LENOVO"), |
2779 | + DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "Lenovo ideapad D330-10IGM"), |
2780 | + }, |
2781 | + .driver_data = (void *)&lcd800x1280_rightside_up, |
2782 | + }, { /* Lenovo Ideapad D330-10IGM (FHD) */ |
2783 | .matches = { |
2784 | DMI_EXACT_MATCH(DMI_SYS_VENDOR, "LENOVO"), |
2785 | - DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "81H3"), |
2786 | DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "Lenovo ideapad D330-10IGM"), |
2787 | }, |
2788 | .driver_data = (void *)&lcd1200x1920_rightside_up, |
2789 | @@ -225,6 +255,19 @@ static const struct dmi_system_id orientation_data[] = { |
2790 | DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "Default string"), |
2791 | }, |
2792 | .driver_data = (void *)&onegx1_pro, |
2793 | + }, { /* Samsung GalaxyBook 10.6 */ |
2794 | + .matches = { |
2795 | + DMI_EXACT_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."), |
2796 | + DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Galaxy Book 10.6"), |
2797 | + }, |
2798 | + .driver_data = (void *)&lcd1280x1920_rightside_up, |
2799 | + }, { /* Valve Steam Deck */ |
2800 | + .matches = { |
2801 | + DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Valve"), |
2802 | + DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Jupiter"), |
2803 | + DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "1"), |
2804 | + }, |
2805 | + .driver_data = (void *)&lcd800x1280_rightside_up, |
2806 | }, { /* VIOS LTH17 */ |
2807 | .matches = { |
2808 | DMI_EXACT_MATCH(DMI_SYS_VENDOR, "VIOS"), |
2809 | diff --git a/drivers/gpu/drm/drm_plane_helper.c b/drivers/gpu/drm/drm_plane_helper.c |
2810 | index 3aae7ea522f23..c3f2292dc93d5 100644 |
2811 | --- a/drivers/gpu/drm/drm_plane_helper.c |
2812 | +++ b/drivers/gpu/drm/drm_plane_helper.c |
2813 | @@ -123,7 +123,6 @@ static int drm_plane_helper_check_update(struct drm_plane *plane, |
2814 | .crtc_w = drm_rect_width(dst), |
2815 | .crtc_h = drm_rect_height(dst), |
2816 | .rotation = rotation, |
2817 | - .visible = *visible, |
2818 | }; |
2819 | struct drm_crtc_state crtc_state = { |
2820 | .crtc = crtc, |
2821 | diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c |
2822 | index 4f8b813aab810..8256f06218d0f 100644 |
2823 | --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c |
2824 | +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c |
2825 | @@ -137,11 +137,13 @@ static int _sspp_subblk_offset(struct dpu_hw_pipe *ctx, |
2826 | u32 *idx) |
2827 | { |
2828 | int rc = 0; |
2829 | - const struct dpu_sspp_sub_blks *sblk = ctx->cap->sblk; |
2830 | + const struct dpu_sspp_sub_blks *sblk; |
2831 | |
2832 | - if (!ctx) |
2833 | + if (!ctx || !ctx->cap || !ctx->cap->sblk) |
2834 | return -EINVAL; |
2835 | |
2836 | + sblk = ctx->cap->sblk; |
2837 | + |
2838 | switch (s_id) { |
2839 | case DPU_SSPP_SRC: |
2840 | *idx = sblk->src_blk.base; |
2841 | @@ -404,7 +406,7 @@ static void _dpu_hw_sspp_setup_scaler3(struct dpu_hw_pipe *ctx, |
2842 | |
2843 | (void)pe; |
2844 | if (_sspp_subblk_offset(ctx, DPU_SSPP_SCALER_QSEED3, &idx) || !sspp |
2845 | - || !scaler3_cfg || !ctx || !ctx->cap || !ctx->cap->sblk) |
2846 | + || !scaler3_cfg) |
2847 | return; |
2848 | |
2849 | dpu_hw_setup_scaler3(&ctx->hw, scaler3_cfg, idx, |
2850 | diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c |
2851 | index d92a0ffe2a767..8e6a4d5f3a405 100644 |
2852 | --- a/drivers/gpu/drm/msm/msm_gem.c |
2853 | +++ b/drivers/gpu/drm/msm/msm_gem.c |
2854 | @@ -1036,7 +1036,7 @@ static struct drm_gem_object *_msm_gem_new(struct drm_device *dev, |
2855 | |
2856 | ret = msm_gem_new_impl(dev, size, flags, &obj); |
2857 | if (ret) |
2858 | - goto fail; |
2859 | + return ERR_PTR(ret); |
2860 | |
2861 | msm_obj = to_msm_bo(obj); |
2862 | |
2863 | @@ -1124,7 +1124,7 @@ struct drm_gem_object *msm_gem_import(struct drm_device *dev, |
2864 | |
2865 | ret = msm_gem_new_impl(dev, size, MSM_BO_WC, &obj); |
2866 | if (ret) |
2867 | - goto fail; |
2868 | + return ERR_PTR(ret); |
2869 | |
2870 | drm_gem_private_object_init(dev, obj, size); |
2871 | |
2872 | diff --git a/drivers/gpu/drm/v3d/v3d_gem.c b/drivers/gpu/drm/v3d/v3d_gem.c |
2873 | index 19c092d75266b..1609a85429cef 100644 |
2874 | --- a/drivers/gpu/drm/v3d/v3d_gem.c |
2875 | +++ b/drivers/gpu/drm/v3d/v3d_gem.c |
2876 | @@ -195,8 +195,8 @@ v3d_clean_caches(struct v3d_dev *v3d) |
2877 | |
2878 | V3D_CORE_WRITE(core, V3D_CTL_L2TCACTL, V3D_L2TCACTL_TMUWCF); |
2879 | if (wait_for(!(V3D_CORE_READ(core, V3D_CTL_L2TCACTL) & |
2880 | - V3D_L2TCACTL_L2TFLS), 100)) { |
2881 | - DRM_ERROR("Timeout waiting for L1T write combiner flush\n"); |
2882 | + V3D_L2TCACTL_TMUWCF), 100)) { |
2883 | + DRM_ERROR("Timeout waiting for TMU write combiner flush\n"); |
2884 | } |
2885 | |
2886 | mutex_lock(&v3d->cache_clean_lock); |
2887 | diff --git a/drivers/gpu/drm/virtio/virtgpu_vq.c b/drivers/gpu/drm/virtio/virtgpu_vq.c |
2888 | index bb46e7a0f1b5d..0ca996e6fd5cb 100644 |
2889 | --- a/drivers/gpu/drm/virtio/virtgpu_vq.c |
2890 | +++ b/drivers/gpu/drm/virtio/virtgpu_vq.c |
2891 | @@ -80,9 +80,7 @@ virtio_gpu_get_vbuf(struct virtio_gpu_device *vgdev, |
2892 | { |
2893 | struct virtio_gpu_vbuffer *vbuf; |
2894 | |
2895 | - vbuf = kmem_cache_zalloc(vgdev->vbufs, GFP_KERNEL); |
2896 | - if (!vbuf) |
2897 | - return ERR_PTR(-ENOMEM); |
2898 | + vbuf = kmem_cache_zalloc(vgdev->vbufs, GFP_KERNEL | __GFP_NOFAIL); |
2899 | |
2900 | BUG_ON(size > MAX_INLINE_CMD_SIZE); |
2901 | vbuf->buf = (void *)vbuf + sizeof(*vbuf); |
2902 | @@ -142,10 +140,6 @@ static void *virtio_gpu_alloc_cmd_resp(struct virtio_gpu_device *vgdev, |
2903 | |
2904 | vbuf = virtio_gpu_get_vbuf(vgdev, cmd_size, |
2905 | resp_size, resp_buf, cb); |
2906 | - if (IS_ERR(vbuf)) { |
2907 | - *vbuffer_p = NULL; |
2908 | - return ERR_CAST(vbuf); |
2909 | - } |
2910 | *vbuffer_p = vbuf; |
2911 | return (struct virtio_gpu_command *)vbuf->buf; |
2912 | } |
2913 | diff --git a/drivers/hid/hid-u2fzero.c b/drivers/hid/hid-u2fzero.c |
2914 | index d70cd3d7f583b..67ae2b18e33ac 100644 |
2915 | --- a/drivers/hid/hid-u2fzero.c |
2916 | +++ b/drivers/hid/hid-u2fzero.c |
2917 | @@ -132,7 +132,7 @@ static int u2fzero_recv(struct u2fzero_device *dev, |
2918 | |
2919 | ret = (wait_for_completion_timeout( |
2920 | &ctx.done, msecs_to_jiffies(USB_CTRL_SET_TIMEOUT))); |
2921 | - if (ret < 0) { |
2922 | + if (ret == 0) { |
2923 | usb_kill_urb(dev->urb); |
2924 | hid_err(hdev, "urb submission timed out"); |
2925 | } else { |
2926 | @@ -191,6 +191,8 @@ static int u2fzero_rng_read(struct hwrng *rng, void *data, |
2927 | struct u2f_hid_msg resp; |
2928 | int ret; |
2929 | size_t actual_length; |
2930 | + /* valid packets must have a correct header */ |
2931 | + int min_length = offsetof(struct u2f_hid_msg, init.data); |
2932 | |
2933 | if (!dev->present) { |
2934 | hid_dbg(dev->hdev, "device not present"); |
2935 | @@ -200,12 +202,12 @@ static int u2fzero_rng_read(struct hwrng *rng, void *data, |
2936 | ret = u2fzero_recv(dev, &req, &resp); |
2937 | |
2938 | /* ignore errors or packets without data */ |
2939 | - if (ret < offsetof(struct u2f_hid_msg, init.data)) |
2940 | + if (ret < min_length) |
2941 | return 0; |
2942 | |
2943 | /* only take the minimum amount of data it is safe to take */ |
2944 | - actual_length = min3((size_t)ret - offsetof(struct u2f_hid_msg, |
2945 | - init.data), U2F_HID_MSG_LEN(resp), max); |
2946 | + actual_length = min3((size_t)ret - min_length, |
2947 | + U2F_HID_MSG_LEN(resp), max); |
2948 | |
2949 | memcpy(data, resp.init.data, actual_length); |
2950 | |
2951 | diff --git a/drivers/hv/hyperv_vmbus.h b/drivers/hv/hyperv_vmbus.h |
2952 | index cabcb66e7c5ef..356382a340b2c 100644 |
2953 | --- a/drivers/hv/hyperv_vmbus.h |
2954 | +++ b/drivers/hv/hyperv_vmbus.h |
2955 | @@ -13,6 +13,7 @@ |
2956 | #define _HYPERV_VMBUS_H |
2957 | |
2958 | #include <linux/list.h> |
2959 | +#include <linux/bitops.h> |
2960 | #include <asm/sync_bitops.h> |
2961 | #include <asm/hyperv-tlfs.h> |
2962 | #include <linux/atomic.h> |
2963 | diff --git a/drivers/hwmon/hwmon.c b/drivers/hwmon/hwmon.c |
2964 | index d018b20089ecd..a2175394cd253 100644 |
2965 | --- a/drivers/hwmon/hwmon.c |
2966 | +++ b/drivers/hwmon/hwmon.c |
2967 | @@ -645,8 +645,10 @@ __hwmon_device_register(struct device *dev, const char *name, void *drvdata, |
2968 | dev_set_drvdata(hdev, drvdata); |
2969 | dev_set_name(hdev, HWMON_ID_FORMAT, id); |
2970 | err = device_register(hdev); |
2971 | - if (err) |
2972 | - goto free_hwmon; |
2973 | + if (err) { |
2974 | + put_device(hdev); |
2975 | + goto ida_remove; |
2976 | + } |
2977 | |
2978 | if (dev && dev->of_node && chip && chip->ops->read && |
2979 | chip->info[0]->type == hwmon_chip && |
2980 | diff --git a/drivers/hwmon/pmbus/lm25066.c b/drivers/hwmon/pmbus/lm25066.c |
2981 | index 05fce86f1f817..41c4bbb9c0572 100644 |
2982 | --- a/drivers/hwmon/pmbus/lm25066.c |
2983 | +++ b/drivers/hwmon/pmbus/lm25066.c |
2984 | @@ -51,26 +51,31 @@ struct __coeff { |
2985 | #define PSC_CURRENT_IN_L (PSC_NUM_CLASSES) |
2986 | #define PSC_POWER_L (PSC_NUM_CLASSES + 1) |
2987 | |
2988 | -static struct __coeff lm25066_coeff[6][PSC_NUM_CLASSES + 2] = { |
2989 | +static struct __coeff lm25066_coeff[][PSC_NUM_CLASSES + 2] = { |
2990 | [lm25056] = { |
2991 | [PSC_VOLTAGE_IN] = { |
2992 | .m = 16296, |
2993 | + .b = 1343, |
2994 | .R = -2, |
2995 | }, |
2996 | [PSC_CURRENT_IN] = { |
2997 | .m = 13797, |
2998 | + .b = -1833, |
2999 | .R = -2, |
3000 | }, |
3001 | [PSC_CURRENT_IN_L] = { |
3002 | .m = 6726, |
3003 | + .b = -537, |
3004 | .R = -2, |
3005 | }, |
3006 | [PSC_POWER] = { |
3007 | .m = 5501, |
3008 | + .b = -2908, |
3009 | .R = -3, |
3010 | }, |
3011 | [PSC_POWER_L] = { |
3012 | .m = 26882, |
3013 | + .b = -5646, |
3014 | .R = -4, |
3015 | }, |
3016 | [PSC_TEMPERATURE] = { |
3017 | @@ -82,26 +87,32 @@ static struct __coeff lm25066_coeff[6][PSC_NUM_CLASSES + 2] = { |
3018 | [lm25066] = { |
3019 | [PSC_VOLTAGE_IN] = { |
3020 | .m = 22070, |
3021 | + .b = -1800, |
3022 | .R = -2, |
3023 | }, |
3024 | [PSC_VOLTAGE_OUT] = { |
3025 | .m = 22070, |
3026 | + .b = -1800, |
3027 | .R = -2, |
3028 | }, |
3029 | [PSC_CURRENT_IN] = { |
3030 | .m = 13661, |
3031 | + .b = -5200, |
3032 | .R = -2, |
3033 | }, |
3034 | [PSC_CURRENT_IN_L] = { |
3035 | .m = 6852, |
3036 | + .b = -3100, |
3037 | .R = -2, |
3038 | }, |
3039 | [PSC_POWER] = { |
3040 | .m = 736, |
3041 | + .b = -3300, |
3042 | .R = -2, |
3043 | }, |
3044 | [PSC_POWER_L] = { |
3045 | .m = 369, |
3046 | + .b = -1900, |
3047 | .R = -2, |
3048 | }, |
3049 | [PSC_TEMPERATURE] = { |
3050 | @@ -111,26 +122,32 @@ static struct __coeff lm25066_coeff[6][PSC_NUM_CLASSES + 2] = { |
3051 | [lm5064] = { |
3052 | [PSC_VOLTAGE_IN] = { |
3053 | .m = 4611, |
3054 | + .b = -642, |
3055 | .R = -2, |
3056 | }, |
3057 | [PSC_VOLTAGE_OUT] = { |
3058 | .m = 4621, |
3059 | + .b = 423, |
3060 | .R = -2, |
3061 | }, |
3062 | [PSC_CURRENT_IN] = { |
3063 | .m = 10742, |
3064 | + .b = 1552, |
3065 | .R = -2, |
3066 | }, |
3067 | [PSC_CURRENT_IN_L] = { |
3068 | .m = 5456, |
3069 | + .b = 2118, |
3070 | .R = -2, |
3071 | }, |
3072 | [PSC_POWER] = { |
3073 | .m = 1204, |
3074 | + .b = 8524, |
3075 | .R = -3, |
3076 | }, |
3077 | [PSC_POWER_L] = { |
3078 | .m = 612, |
3079 | + .b = 11202, |
3080 | .R = -3, |
3081 | }, |
3082 | [PSC_TEMPERATURE] = { |
3083 | @@ -140,26 +157,32 @@ static struct __coeff lm25066_coeff[6][PSC_NUM_CLASSES + 2] = { |
3084 | [lm5066] = { |
3085 | [PSC_VOLTAGE_IN] = { |
3086 | .m = 4587, |
3087 | + .b = -1200, |
3088 | .R = -2, |
3089 | }, |
3090 | [PSC_VOLTAGE_OUT] = { |
3091 | .m = 4587, |
3092 | + .b = -2400, |
3093 | .R = -2, |
3094 | }, |
3095 | [PSC_CURRENT_IN] = { |
3096 | .m = 10753, |
3097 | + .b = -1200, |
3098 | .R = -2, |
3099 | }, |
3100 | [PSC_CURRENT_IN_L] = { |
3101 | .m = 5405, |
3102 | + .b = -600, |
3103 | .R = -2, |
3104 | }, |
3105 | [PSC_POWER] = { |
3106 | .m = 1204, |
3107 | + .b = -6000, |
3108 | .R = -3, |
3109 | }, |
3110 | [PSC_POWER_L] = { |
3111 | .m = 605, |
3112 | + .b = -8000, |
3113 | .R = -3, |
3114 | }, |
3115 | [PSC_TEMPERATURE] = { |
3116 | diff --git a/drivers/i2c/busses/i2c-xlr.c b/drivers/i2c/busses/i2c-xlr.c |
3117 | index 34cd4b3085402..dda6cb848405b 100644 |
3118 | --- a/drivers/i2c/busses/i2c-xlr.c |
3119 | +++ b/drivers/i2c/busses/i2c-xlr.c |
3120 | @@ -433,11 +433,15 @@ static int xlr_i2c_probe(struct platform_device *pdev) |
3121 | i2c_set_adapdata(&priv->adap, priv); |
3122 | ret = i2c_add_numbered_adapter(&priv->adap); |
3123 | if (ret < 0) |
3124 | - return ret; |
3125 | + goto err_unprepare_clk; |
3126 | |
3127 | platform_set_drvdata(pdev, priv); |
3128 | dev_info(&priv->adap.dev, "Added I2C Bus.\n"); |
3129 | return 0; |
3130 | + |
3131 | +err_unprepare_clk: |
3132 | + clk_unprepare(clk); |
3133 | + return ret; |
3134 | } |
3135 | |
3136 | static int xlr_i2c_remove(struct platform_device *pdev) |
3137 | diff --git a/drivers/iio/dac/ad5446.c b/drivers/iio/dac/ad5446.c |
3138 | index 61c670f7fc5f1..1f55cd8abb558 100644 |
3139 | --- a/drivers/iio/dac/ad5446.c |
3140 | +++ b/drivers/iio/dac/ad5446.c |
3141 | @@ -527,8 +527,15 @@ static int ad5622_write(struct ad5446_state *st, unsigned val) |
3142 | { |
3143 | struct i2c_client *client = to_i2c_client(st->dev); |
3144 | __be16 data = cpu_to_be16(val); |
3145 | + int ret; |
3146 | + |
3147 | + ret = i2c_master_send(client, (char *)&data, sizeof(data)); |
3148 | + if (ret < 0) |
3149 | + return ret; |
3150 | + if (ret != sizeof(data)) |
3151 | + return -EIO; |
3152 | |
3153 | - return i2c_master_send(client, (char *)&data, sizeof(data)); |
3154 | + return 0; |
3155 | } |
3156 | |
3157 | /** |
3158 | diff --git a/drivers/infiniband/hw/bnxt_re/qplib_fp.c b/drivers/infiniband/hw/bnxt_re/qplib_fp.c |
3159 | index 4d07d22bfa7b1..5fc5ab7813c0f 100644 |
3160 | --- a/drivers/infiniband/hw/bnxt_re/qplib_fp.c |
3161 | +++ b/drivers/infiniband/hw/bnxt_re/qplib_fp.c |
3162 | @@ -642,12 +642,13 @@ int bnxt_qplib_query_srq(struct bnxt_qplib_res *res, |
3163 | int rc = 0; |
3164 | |
3165 | RCFW_CMD_PREP(req, QUERY_SRQ, cmd_flags); |
3166 | - req.srq_cid = cpu_to_le32(srq->id); |
3167 | |
3168 | /* Configure the request */ |
3169 | sbuf = bnxt_qplib_rcfw_alloc_sbuf(rcfw, sizeof(*sb)); |
3170 | if (!sbuf) |
3171 | return -ENOMEM; |
3172 | + req.resp_size = sizeof(*sb) / BNXT_QPLIB_CMDQE_UNITS; |
3173 | + req.srq_cid = cpu_to_le32(srq->id); |
3174 | sb = sbuf->sb; |
3175 | rc = bnxt_qplib_rcfw_send_message(rcfw, (void *)&req, (void *)&resp, |
3176 | (void *)sbuf, 0); |
3177 | diff --git a/drivers/infiniband/hw/mlx4/qp.c b/drivers/infiniband/hw/mlx4/qp.c |
3178 | index 17ce928e41bde..bca5358f3ef29 100644 |
3179 | --- a/drivers/infiniband/hw/mlx4/qp.c |
3180 | +++ b/drivers/infiniband/hw/mlx4/qp.c |
3181 | @@ -1149,8 +1149,10 @@ static int create_qp_common(struct ib_pd *pd, struct ib_qp_init_attr *init_attr, |
3182 | if (dev->steering_support == |
3183 | MLX4_STEERING_MODE_DEVICE_MANAGED) |
3184 | qp->flags |= MLX4_IB_QP_NETIF; |
3185 | - else |
3186 | + else { |
3187 | + err = -EINVAL; |
3188 | goto err; |
3189 | + } |
3190 | } |
3191 | |
3192 | err = set_kernel_sq_size(dev, &init_attr->cap, qp_type, qp); |
3193 | diff --git a/drivers/infiniband/hw/qedr/verbs.c b/drivers/infiniband/hw/qedr/verbs.c |
3194 | index 4408d33646647..717f174647647 100644 |
3195 | --- a/drivers/infiniband/hw/qedr/verbs.c |
3196 | +++ b/drivers/infiniband/hw/qedr/verbs.c |
3197 | @@ -2383,15 +2383,18 @@ int qedr_query_qp(struct ib_qp *ibqp, |
3198 | int rc = 0; |
3199 | |
3200 | memset(¶ms, 0, sizeof(params)); |
3201 | - |
3202 | - rc = dev->ops->rdma_query_qp(dev->rdma_ctx, qp->qed_qp, ¶ms); |
3203 | - if (rc) |
3204 | - goto err; |
3205 | - |
3206 | memset(qp_attr, 0, sizeof(*qp_attr)); |
3207 | memset(qp_init_attr, 0, sizeof(*qp_init_attr)); |
3208 | |
3209 | - qp_attr->qp_state = qedr_get_ibqp_state(params.state); |
3210 | + if (qp->qp_type != IB_QPT_GSI) { |
3211 | + rc = dev->ops->rdma_query_qp(dev->rdma_ctx, qp->qed_qp, ¶ms); |
3212 | + if (rc) |
3213 | + goto err; |
3214 | + qp_attr->qp_state = qedr_get_ibqp_state(params.state); |
3215 | + } else { |
3216 | + qp_attr->qp_state = qedr_get_ibqp_state(QED_ROCE_QP_STATE_RTS); |
3217 | + } |
3218 | + |
3219 | qp_attr->cur_qp_state = qedr_get_ibqp_state(params.state); |
3220 | qp_attr->path_mtu = ib_mtu_int_to_enum(params.mtu); |
3221 | qp_attr->path_mig_state = IB_MIG_MIGRATED; |
3222 | diff --git a/drivers/infiniband/sw/rxe/rxe_param.h b/drivers/infiniband/sw/rxe/rxe_param.h |
3223 | index fe52073867006..8d3f6d93dfb8d 100644 |
3224 | --- a/drivers/infiniband/sw/rxe/rxe_param.h |
3225 | +++ b/drivers/infiniband/sw/rxe/rxe_param.h |
3226 | @@ -140,7 +140,7 @@ enum rxe_device_param { |
3227 | /* default/initial rxe port parameters */ |
3228 | enum rxe_port_param { |
3229 | RXE_PORT_GID_TBL_LEN = 1024, |
3230 | - RXE_PORT_PORT_CAP_FLAGS = RDMA_CORE_CAP_PROT_ROCE_UDP_ENCAP, |
3231 | + RXE_PORT_PORT_CAP_FLAGS = IB_PORT_CM_SUP, |
3232 | RXE_PORT_MAX_MSG_SZ = 0x800000, |
3233 | RXE_PORT_BAD_PKEY_CNTR = 0, |
3234 | RXE_PORT_QKEY_VIOL_CNTR = 0, |
3235 | diff --git a/drivers/input/joystick/iforce/iforce-usb.c b/drivers/input/joystick/iforce/iforce-usb.c |
3236 | index 6c554c11a7ac3..ea58805c480fa 100644 |
3237 | --- a/drivers/input/joystick/iforce/iforce-usb.c |
3238 | +++ b/drivers/input/joystick/iforce/iforce-usb.c |
3239 | @@ -92,7 +92,7 @@ static int iforce_usb_get_id(struct iforce *iforce, u8 id, |
3240 | id, |
3241 | USB_TYPE_VENDOR | USB_DIR_IN | |
3242 | USB_RECIP_INTERFACE, |
3243 | - 0, 0, buf, IFORCE_MAX_LENGTH, HZ); |
3244 | + 0, 0, buf, IFORCE_MAX_LENGTH, 1000); |
3245 | if (status < 0) { |
3246 | dev_err(&iforce_usb->intf->dev, |
3247 | "usb_submit_urb failed: %d\n", status); |
3248 | diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c |
3249 | index 053fe2da1e08f..0b5ed963cb0e1 100644 |
3250 | --- a/drivers/input/mouse/elantech.c |
3251 | +++ b/drivers/input/mouse/elantech.c |
3252 | @@ -517,6 +517,19 @@ static void elantech_report_trackpoint(struct psmouse *psmouse, |
3253 | case 0x16008020U: |
3254 | case 0x26800010U: |
3255 | case 0x36808000U: |
3256 | + |
3257 | + /* |
3258 | + * This firmware misreport coordinates for trackpoint |
3259 | + * occasionally. Discard packets outside of [-127, 127] range |
3260 | + * to prevent cursor jumps. |
3261 | + */ |
3262 | + if (packet[4] == 0x80 || packet[5] == 0x80 || |
3263 | + packet[1] >> 7 == packet[4] >> 7 || |
3264 | + packet[2] >> 7 == packet[5] >> 7) { |
3265 | + elantech_debug("discarding packet [%6ph]\n", packet); |
3266 | + break; |
3267 | + |
3268 | + } |
3269 | x = packet[4] - (int)((packet[1]^0x80) << 1); |
3270 | y = (int)((packet[2]^0x80) << 1) - packet[5]; |
3271 | |
3272 | diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h |
3273 | index 23442a144b834..202e43a6ffae2 100644 |
3274 | --- a/drivers/input/serio/i8042-x86ia64io.h |
3275 | +++ b/drivers/input/serio/i8042-x86ia64io.h |
3276 | @@ -272,6 +272,13 @@ static const struct dmi_system_id __initconst i8042_dmi_nomux_table[] = { |
3277 | DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook S6230"), |
3278 | }, |
3279 | }, |
3280 | + { |
3281 | + /* Fujitsu Lifebook T725 laptop */ |
3282 | + .matches = { |
3283 | + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), |
3284 | + DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK T725"), |
3285 | + }, |
3286 | + }, |
3287 | { |
3288 | /* Fujitsu Lifebook U745 */ |
3289 | .matches = { |
3290 | @@ -840,6 +847,13 @@ static const struct dmi_system_id __initconst i8042_dmi_notimeout_table[] = { |
3291 | DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK AH544"), |
3292 | }, |
3293 | }, |
3294 | + { |
3295 | + /* Fujitsu Lifebook T725 laptop */ |
3296 | + .matches = { |
3297 | + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), |
3298 | + DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK T725"), |
3299 | + }, |
3300 | + }, |
3301 | { |
3302 | /* Fujitsu U574 laptop */ |
3303 | /* https://bugzilla.kernel.org/show_bug.cgi?id=69731 */ |
3304 | diff --git a/drivers/irqchip/irq-bcm6345-l1.c b/drivers/irqchip/irq-bcm6345-l1.c |
3305 | index e3483789f4df3..1bd0621c4ce2a 100644 |
3306 | --- a/drivers/irqchip/irq-bcm6345-l1.c |
3307 | +++ b/drivers/irqchip/irq-bcm6345-l1.c |
3308 | @@ -140,7 +140,7 @@ static void bcm6345_l1_irq_handle(struct irq_desc *desc) |
3309 | for_each_set_bit(hwirq, &pending, IRQS_PER_WORD) { |
3310 | irq = irq_linear_revmap(intc->domain, base + hwirq); |
3311 | if (irq) |
3312 | - do_IRQ(irq); |
3313 | + generic_handle_irq(irq); |
3314 | else |
3315 | spurious_interrupt(); |
3316 | } |
3317 | diff --git a/drivers/irqchip/irq-s3c24xx.c b/drivers/irqchip/irq-s3c24xx.c |
3318 | index d2031fecc3861..5e97ae54782d6 100644 |
3319 | --- a/drivers/irqchip/irq-s3c24xx.c |
3320 | +++ b/drivers/irqchip/irq-s3c24xx.c |
3321 | @@ -359,11 +359,25 @@ static inline int s3c24xx_handle_intc(struct s3c_irq_intc *intc, |
3322 | asmlinkage void __exception_irq_entry s3c24xx_handle_irq(struct pt_regs *regs) |
3323 | { |
3324 | do { |
3325 | - if (likely(s3c_intc[0])) |
3326 | - if (s3c24xx_handle_intc(s3c_intc[0], regs, 0)) |
3327 | - continue; |
3328 | + /* |
3329 | + * For platform based machines, neither ERR nor NULL can happen here. |
3330 | + * The s3c24xx_handle_irq() will be set as IRQ handler iff this succeeds: |
3331 | + * |
3332 | + * s3c_intc[0] = s3c24xx_init_intc() |
3333 | + * |
3334 | + * If this fails, the next calls to s3c24xx_init_intc() won't be executed. |
3335 | + * |
3336 | + * For DT machine, s3c_init_intc_of() could set the IRQ handler without |
3337 | + * setting s3c_intc[0] only if it was called with num_ctrl=0. There is no |
3338 | + * such code path, so again the s3c_intc[0] will have a valid pointer if |
3339 | + * set_handle_irq() is called. |
3340 | + * |
3341 | + * Therefore in s3c24xx_handle_irq(), the s3c_intc[0] is always something. |
3342 | + */ |
3343 | + if (s3c24xx_handle_intc(s3c_intc[0], regs, 0)) |
3344 | + continue; |
3345 | |
3346 | - if (s3c_intc[2]) |
3347 | + if (!IS_ERR_OR_NULL(s3c_intc[2])) |
3348 | if (s3c24xx_handle_intc(s3c_intc[2], regs, 64)) |
3349 | continue; |
3350 | |
3351 | diff --git a/drivers/irqchip/irq-sifive-plic.c b/drivers/irqchip/irq-sifive-plic.c |
3352 | index 7d0a12fe2714a..7cd7b140dfe97 100644 |
3353 | --- a/drivers/irqchip/irq-sifive-plic.c |
3354 | +++ b/drivers/irqchip/irq-sifive-plic.c |
3355 | @@ -138,7 +138,13 @@ static void plic_irq_eoi(struct irq_data *d) |
3356 | { |
3357 | struct plic_handler *handler = this_cpu_ptr(&plic_handlers); |
3358 | |
3359 | - writel(d->hwirq, handler->hart_base + CONTEXT_CLAIM); |
3360 | + if (irqd_irq_masked(d)) { |
3361 | + plic_irq_unmask(d); |
3362 | + writel(d->hwirq, handler->hart_base + CONTEXT_CLAIM); |
3363 | + plic_irq_mask(d); |
3364 | + } else { |
3365 | + writel(d->hwirq, handler->hart_base + CONTEXT_CLAIM); |
3366 | + } |
3367 | } |
3368 | |
3369 | static struct irq_chip plic_chip = { |
3370 | diff --git a/drivers/media/dvb-frontends/mn88443x.c b/drivers/media/dvb-frontends/mn88443x.c |
3371 | index e4528784f8477..fff212c0bf3b5 100644 |
3372 | --- a/drivers/media/dvb-frontends/mn88443x.c |
3373 | +++ b/drivers/media/dvb-frontends/mn88443x.c |
3374 | @@ -204,11 +204,18 @@ struct mn88443x_priv { |
3375 | struct regmap *regmap_t; |
3376 | }; |
3377 | |
3378 | -static void mn88443x_cmn_power_on(struct mn88443x_priv *chip) |
3379 | +static int mn88443x_cmn_power_on(struct mn88443x_priv *chip) |
3380 | { |
3381 | + struct device *dev = &chip->client_s->dev; |
3382 | struct regmap *r_t = chip->regmap_t; |
3383 | + int ret; |
3384 | |
3385 | - clk_prepare_enable(chip->mclk); |
3386 | + ret = clk_prepare_enable(chip->mclk); |
3387 | + if (ret) { |
3388 | + dev_err(dev, "Failed to prepare and enable mclk: %d\n", |
3389 | + ret); |
3390 | + return ret; |
3391 | + } |
3392 | |
3393 | gpiod_set_value_cansleep(chip->reset_gpio, 1); |
3394 | usleep_range(100, 1000); |
3395 | @@ -222,6 +229,8 @@ static void mn88443x_cmn_power_on(struct mn88443x_priv *chip) |
3396 | } else { |
3397 | regmap_write(r_t, HIZSET3, 0x8f); |
3398 | } |
3399 | + |
3400 | + return 0; |
3401 | } |
3402 | |
3403 | static void mn88443x_cmn_power_off(struct mn88443x_priv *chip) |
3404 | @@ -738,7 +747,10 @@ static int mn88443x_probe(struct i2c_client *client, |
3405 | chip->fe.demodulator_priv = chip; |
3406 | i2c_set_clientdata(client, chip); |
3407 | |
3408 | - mn88443x_cmn_power_on(chip); |
3409 | + ret = mn88443x_cmn_power_on(chip); |
3410 | + if (ret) |
3411 | + goto err_i2c_t; |
3412 | + |
3413 | mn88443x_s_sleep(chip); |
3414 | mn88443x_t_sleep(chip); |
3415 | |
3416 | diff --git a/drivers/media/i2c/ir-kbd-i2c.c b/drivers/media/i2c/ir-kbd-i2c.c |
3417 | index 92376592455ee..56674173524fd 100644 |
3418 | --- a/drivers/media/i2c/ir-kbd-i2c.c |
3419 | +++ b/drivers/media/i2c/ir-kbd-i2c.c |
3420 | @@ -791,6 +791,7 @@ static int ir_probe(struct i2c_client *client, const struct i2c_device_id *id) |
3421 | rc_proto = RC_PROTO_BIT_RC5 | RC_PROTO_BIT_RC6_MCE | |
3422 | RC_PROTO_BIT_RC6_6A_32; |
3423 | ir_codes = RC_MAP_HAUPPAUGE; |
3424 | + ir->polling_interval = 125; |
3425 | probe_tx = true; |
3426 | break; |
3427 | } |
3428 | diff --git a/drivers/media/i2c/mt9p031.c b/drivers/media/i2c/mt9p031.c |
3429 | index dc23b9ed510a4..18440c5104ad9 100644 |
3430 | --- a/drivers/media/i2c/mt9p031.c |
3431 | +++ b/drivers/media/i2c/mt9p031.c |
3432 | @@ -78,7 +78,9 @@ |
3433 | #define MT9P031_PIXEL_CLOCK_INVERT (1 << 15) |
3434 | #define MT9P031_PIXEL_CLOCK_SHIFT(n) ((n) << 8) |
3435 | #define MT9P031_PIXEL_CLOCK_DIVIDE(n) ((n) << 0) |
3436 | -#define MT9P031_FRAME_RESTART 0x0b |
3437 | +#define MT9P031_RESTART 0x0b |
3438 | +#define MT9P031_FRAME_PAUSE_RESTART (1 << 1) |
3439 | +#define MT9P031_FRAME_RESTART (1 << 0) |
3440 | #define MT9P031_SHUTTER_DELAY 0x0c |
3441 | #define MT9P031_RST 0x0d |
3442 | #define MT9P031_RST_ENABLE 1 |
3443 | @@ -445,9 +447,23 @@ static int mt9p031_set_params(struct mt9p031 *mt9p031) |
3444 | static int mt9p031_s_stream(struct v4l2_subdev *subdev, int enable) |
3445 | { |
3446 | struct mt9p031 *mt9p031 = to_mt9p031(subdev); |
3447 | + struct i2c_client *client = v4l2_get_subdevdata(subdev); |
3448 | + int val; |
3449 | int ret; |
3450 | |
3451 | if (!enable) { |
3452 | + /* enable pause restart */ |
3453 | + val = MT9P031_FRAME_PAUSE_RESTART; |
3454 | + ret = mt9p031_write(client, MT9P031_RESTART, val); |
3455 | + if (ret < 0) |
3456 | + return ret; |
3457 | + |
3458 | + /* enable restart + keep pause restart set */ |
3459 | + val |= MT9P031_FRAME_RESTART; |
3460 | + ret = mt9p031_write(client, MT9P031_RESTART, val); |
3461 | + if (ret < 0) |
3462 | + return ret; |
3463 | + |
3464 | /* Stop sensor readout */ |
3465 | ret = mt9p031_set_output_control(mt9p031, |
3466 | MT9P031_OUTPUT_CONTROL_CEN, 0); |
3467 | @@ -467,6 +483,16 @@ static int mt9p031_s_stream(struct v4l2_subdev *subdev, int enable) |
3468 | if (ret < 0) |
3469 | return ret; |
3470 | |
3471 | + /* |
3472 | + * - clear pause restart |
3473 | + * - don't clear restart as clearing restart manually can cause |
3474 | + * undefined behavior |
3475 | + */ |
3476 | + val = MT9P031_FRAME_RESTART; |
3477 | + ret = mt9p031_write(client, MT9P031_RESTART, val); |
3478 | + if (ret < 0) |
3479 | + return ret; |
3480 | + |
3481 | return mt9p031_pll_enable(mt9p031); |
3482 | } |
3483 | |
3484 | diff --git a/drivers/media/i2c/tda1997x.c b/drivers/media/i2c/tda1997x.c |
3485 | index 18a2027ba1450..5faffedb0feba 100644 |
3486 | --- a/drivers/media/i2c/tda1997x.c |
3487 | +++ b/drivers/media/i2c/tda1997x.c |
3488 | @@ -1247,13 +1247,13 @@ tda1997x_parse_infoframe(struct tda1997x_state *state, u16 addr) |
3489 | { |
3490 | struct v4l2_subdev *sd = &state->sd; |
3491 | union hdmi_infoframe frame; |
3492 | - u8 buffer[40]; |
3493 | + u8 buffer[40] = { 0 }; |
3494 | u8 reg; |
3495 | int len, err; |
3496 | |
3497 | /* read data */ |
3498 | len = io_readn(sd, addr, sizeof(buffer), buffer); |
3499 | - err = hdmi_infoframe_unpack(&frame, buffer, sizeof(buffer)); |
3500 | + err = hdmi_infoframe_unpack(&frame, buffer, len); |
3501 | if (err) { |
3502 | v4l_err(state->client, |
3503 | "failed parsing %d byte infoframe: 0x%04x/0x%02x\n", |
3504 | @@ -1927,13 +1927,13 @@ static int tda1997x_log_infoframe(struct v4l2_subdev *sd, int addr) |
3505 | { |
3506 | struct tda1997x_state *state = to_state(sd); |
3507 | union hdmi_infoframe frame; |
3508 | - u8 buffer[40]; |
3509 | + u8 buffer[40] = { 0 }; |
3510 | int len, err; |
3511 | |
3512 | /* read data */ |
3513 | len = io_readn(sd, addr, sizeof(buffer), buffer); |
3514 | v4l2_dbg(1, debug, sd, "infoframe: addr=%d len=%d\n", addr, len); |
3515 | - err = hdmi_infoframe_unpack(&frame, buffer, sizeof(buffer)); |
3516 | + err = hdmi_infoframe_unpack(&frame, buffer, len); |
3517 | if (err) { |
3518 | v4l_err(state->client, |
3519 | "failed parsing %d byte infoframe: 0x%04x/0x%02x\n", |
3520 | diff --git a/drivers/media/pci/cx23885/cx23885-alsa.c b/drivers/media/pci/cx23885/cx23885-alsa.c |
3521 | index a8e980c6dacb9..50772c2611cad 100644 |
3522 | --- a/drivers/media/pci/cx23885/cx23885-alsa.c |
3523 | +++ b/drivers/media/pci/cx23885/cx23885-alsa.c |
3524 | @@ -550,7 +550,7 @@ struct cx23885_audio_dev *cx23885_audio_register(struct cx23885_dev *dev) |
3525 | SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1, |
3526 | THIS_MODULE, sizeof(struct cx23885_audio_dev), &card); |
3527 | if (err < 0) |
3528 | - goto error; |
3529 | + goto error_msg; |
3530 | |
3531 | chip = (struct cx23885_audio_dev *) card->private_data; |
3532 | chip->dev = dev; |
3533 | @@ -576,6 +576,7 @@ struct cx23885_audio_dev *cx23885_audio_register(struct cx23885_dev *dev) |
3534 | |
3535 | error: |
3536 | snd_card_free(card); |
3537 | +error_msg: |
3538 | pr_err("%s(): Failed to register analog audio adapter\n", |
3539 | __func__); |
3540 | |
3541 | diff --git a/drivers/media/pci/netup_unidvb/netup_unidvb_core.c b/drivers/media/pci/netup_unidvb/netup_unidvb_core.c |
3542 | index 80a7c41baa901..eb5621c9ebf85 100644 |
3543 | --- a/drivers/media/pci/netup_unidvb/netup_unidvb_core.c |
3544 | +++ b/drivers/media/pci/netup_unidvb/netup_unidvb_core.c |
3545 | @@ -258,19 +258,24 @@ static irqreturn_t netup_unidvb_isr(int irq, void *dev_id) |
3546 | if ((reg40 & AVL_IRQ_ASSERTED) != 0) { |
3547 | /* IRQ is being signaled */ |
3548 | reg_isr = readw(ndev->bmmio0 + REG_ISR); |
3549 | - if (reg_isr & NETUP_UNIDVB_IRQ_I2C0) { |
3550 | - iret = netup_i2c_interrupt(&ndev->i2c[0]); |
3551 | - } else if (reg_isr & NETUP_UNIDVB_IRQ_I2C1) { |
3552 | - iret = netup_i2c_interrupt(&ndev->i2c[1]); |
3553 | - } else if (reg_isr & NETUP_UNIDVB_IRQ_SPI) { |
3554 | + if (reg_isr & NETUP_UNIDVB_IRQ_SPI) |
3555 | iret = netup_spi_interrupt(ndev->spi); |
3556 | - } else if (reg_isr & NETUP_UNIDVB_IRQ_DMA1) { |
3557 | - iret = netup_dma_interrupt(&ndev->dma[0]); |
3558 | - } else if (reg_isr & NETUP_UNIDVB_IRQ_DMA2) { |
3559 | - iret = netup_dma_interrupt(&ndev->dma[1]); |
3560 | - } else if (reg_isr & NETUP_UNIDVB_IRQ_CI) { |
3561 | - iret = netup_ci_interrupt(ndev); |
3562 | + else if (!ndev->old_fw) { |
3563 | + if (reg_isr & NETUP_UNIDVB_IRQ_I2C0) { |
3564 | + iret = netup_i2c_interrupt(&ndev->i2c[0]); |
3565 | + } else if (reg_isr & NETUP_UNIDVB_IRQ_I2C1) { |
3566 | + iret = netup_i2c_interrupt(&ndev->i2c[1]); |
3567 | + } else if (reg_isr & NETUP_UNIDVB_IRQ_DMA1) { |
3568 | + iret = netup_dma_interrupt(&ndev->dma[0]); |
3569 | + } else if (reg_isr & NETUP_UNIDVB_IRQ_DMA2) { |
3570 | + iret = netup_dma_interrupt(&ndev->dma[1]); |
3571 | + } else if (reg_isr & NETUP_UNIDVB_IRQ_CI) { |
3572 | + iret = netup_ci_interrupt(ndev); |
3573 | + } else { |
3574 | + goto err; |
3575 | + } |
3576 | } else { |
3577 | +err: |
3578 | dev_err(&pci_dev->dev, |
3579 | "%s(): unknown interrupt 0x%x\n", |
3580 | __func__, reg_isr); |
3581 | diff --git a/drivers/media/platform/mtk-vpu/mtk_vpu.c b/drivers/media/platform/mtk-vpu/mtk_vpu.c |
3582 | index cc2ff40d060d1..acf64723f9381 100644 |
3583 | --- a/drivers/media/platform/mtk-vpu/mtk_vpu.c |
3584 | +++ b/drivers/media/platform/mtk-vpu/mtk_vpu.c |
3585 | @@ -809,7 +809,8 @@ static int mtk_vpu_probe(struct platform_device *pdev) |
3586 | vpu->wdt.wq = create_singlethread_workqueue("vpu_wdt"); |
3587 | if (!vpu->wdt.wq) { |
3588 | dev_err(dev, "initialize wdt workqueue failed\n"); |
3589 | - return -ENOMEM; |
3590 | + ret = -ENOMEM; |
3591 | + goto clk_unprepare; |
3592 | } |
3593 | INIT_WORK(&vpu->wdt.ws, vpu_wdt_reset_func); |
3594 | mutex_init(&vpu->vpu_mutex); |
3595 | @@ -908,6 +909,8 @@ disable_vpu_clk: |
3596 | vpu_clock_disable(vpu); |
3597 | workqueue_destroy: |
3598 | destroy_workqueue(vpu->wdt.wq); |
3599 | +clk_unprepare: |
3600 | + clk_unprepare(vpu->clk); |
3601 | |
3602 | return ret; |
3603 | } |
3604 | diff --git a/drivers/media/platform/rcar-vin/rcar-csi2.c b/drivers/media/platform/rcar-vin/rcar-csi2.c |
3605 | index d27eccfa57cae..e01f22bf826d4 100644 |
3606 | --- a/drivers/media/platform/rcar-vin/rcar-csi2.c |
3607 | +++ b/drivers/media/platform/rcar-vin/rcar-csi2.c |
3608 | @@ -488,6 +488,8 @@ static int rcsi2_start_receiver(struct rcar_csi2 *priv) |
3609 | |
3610 | /* Code is validated in set_fmt. */ |
3611 | format = rcsi2_code_to_fmt(priv->mf.code); |
3612 | + if (!format) |
3613 | + return -EINVAL; |
3614 | |
3615 | /* |
3616 | * Enable all supported CSI-2 channels with virtual channel and |
3617 | diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc.c b/drivers/media/platform/s5p-mfc/s5p_mfc.c |
3618 | index b776f83e395e0..9faecd049002f 100644 |
3619 | --- a/drivers/media/platform/s5p-mfc/s5p_mfc.c |
3620 | +++ b/drivers/media/platform/s5p-mfc/s5p_mfc.c |
3621 | @@ -1279,11 +1279,15 @@ static int s5p_mfc_probe(struct platform_device *pdev) |
3622 | spin_lock_init(&dev->condlock); |
3623 | dev->plat_dev = pdev; |
3624 | if (!dev->plat_dev) { |
3625 | - dev_err(&pdev->dev, "No platform data specified\n"); |
3626 | + mfc_err("No platform data specified\n"); |
3627 | return -ENODEV; |
3628 | } |
3629 | |
3630 | dev->variant = of_device_get_match_data(&pdev->dev); |
3631 | + if (!dev->variant) { |
3632 | + dev_err(&pdev->dev, "Failed to get device MFC hardware variant information\n"); |
3633 | + return -ENOENT; |
3634 | + } |
3635 | |
3636 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
3637 | dev->regs_base = devm_ioremap_resource(&pdev->dev, res); |
3638 | diff --git a/drivers/media/platform/stm32/stm32-dcmi.c b/drivers/media/platform/stm32/stm32-dcmi.c |
3639 | index d41475f56ab54..72798aae7a628 100644 |
3640 | --- a/drivers/media/platform/stm32/stm32-dcmi.c |
3641 | +++ b/drivers/media/platform/stm32/stm32-dcmi.c |
3642 | @@ -135,6 +135,7 @@ struct stm32_dcmi { |
3643 | int sequence; |
3644 | struct list_head buffers; |
3645 | struct dcmi_buf *active; |
3646 | + int irq; |
3647 | |
3648 | struct v4l2_device v4l2_dev; |
3649 | struct video_device *vdev; |
3650 | @@ -1720,6 +1721,14 @@ static int dcmi_graph_notify_complete(struct v4l2_async_notifier *notifier) |
3651 | return ret; |
3652 | } |
3653 | |
3654 | + ret = devm_request_threaded_irq(dcmi->dev, dcmi->irq, dcmi_irq_callback, |
3655 | + dcmi_irq_thread, IRQF_ONESHOT, |
3656 | + dev_name(dcmi->dev), dcmi); |
3657 | + if (ret) { |
3658 | + dev_err(dcmi->dev, "Unable to request irq %d\n", dcmi->irq); |
3659 | + return ret; |
3660 | + } |
3661 | + |
3662 | return 0; |
3663 | } |
3664 | |
3665 | @@ -1881,6 +1890,8 @@ static int dcmi_probe(struct platform_device *pdev) |
3666 | if (irq <= 0) |
3667 | return irq ? irq : -ENXIO; |
3668 | |
3669 | + dcmi->irq = irq; |
3670 | + |
3671 | dcmi->res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
3672 | if (!dcmi->res) { |
3673 | dev_err(&pdev->dev, "Could not get resource\n"); |
3674 | @@ -1893,14 +1904,6 @@ static int dcmi_probe(struct platform_device *pdev) |
3675 | return PTR_ERR(dcmi->regs); |
3676 | } |
3677 | |
3678 | - ret = devm_request_threaded_irq(&pdev->dev, irq, dcmi_irq_callback, |
3679 | - dcmi_irq_thread, IRQF_ONESHOT, |
3680 | - dev_name(&pdev->dev), dcmi); |
3681 | - if (ret) { |
3682 | - dev_err(&pdev->dev, "Unable to request irq %d\n", irq); |
3683 | - return ret; |
3684 | - } |
3685 | - |
3686 | mclk = devm_clk_get(&pdev->dev, "mclk"); |
3687 | if (IS_ERR(mclk)) { |
3688 | if (PTR_ERR(mclk) != -EPROBE_DEFER) |
3689 | diff --git a/drivers/media/radio/radio-wl1273.c b/drivers/media/radio/radio-wl1273.c |
3690 | index 1123768731676..484046471c03f 100644 |
3691 | --- a/drivers/media/radio/radio-wl1273.c |
3692 | +++ b/drivers/media/radio/radio-wl1273.c |
3693 | @@ -1279,7 +1279,7 @@ static int wl1273_fm_vidioc_querycap(struct file *file, void *priv, |
3694 | |
3695 | strscpy(capability->driver, WL1273_FM_DRIVER_NAME, |
3696 | sizeof(capability->driver)); |
3697 | - strscpy(capability->card, "Texas Instruments Wl1273 FM Radio", |
3698 | + strscpy(capability->card, "TI Wl1273 FM Radio", |
3699 | sizeof(capability->card)); |
3700 | strscpy(capability->bus_info, radio->bus_type, |
3701 | sizeof(capability->bus_info)); |
3702 | diff --git a/drivers/media/radio/si470x/radio-si470x-i2c.c b/drivers/media/radio/si470x/radio-si470x-i2c.c |
3703 | index f491420d7b538..a972c0705ac79 100644 |
3704 | --- a/drivers/media/radio/si470x/radio-si470x-i2c.c |
3705 | +++ b/drivers/media/radio/si470x/radio-si470x-i2c.c |
3706 | @@ -11,7 +11,7 @@ |
3707 | |
3708 | /* driver definitions */ |
3709 | #define DRIVER_AUTHOR "Joonyoung Shim <jy0922.shim@samsung.com>"; |
3710 | -#define DRIVER_CARD "Silicon Labs Si470x FM Radio Receiver" |
3711 | +#define DRIVER_CARD "Silicon Labs Si470x FM Radio" |
3712 | #define DRIVER_DESC "I2C radio driver for Si470x FM Radio Receivers" |
3713 | #define DRIVER_VERSION "1.0.2" |
3714 | |
3715 | diff --git a/drivers/media/radio/si470x/radio-si470x-usb.c b/drivers/media/radio/si470x/radio-si470x-usb.c |
3716 | index fedff68d8c496..3f8634a465730 100644 |
3717 | --- a/drivers/media/radio/si470x/radio-si470x-usb.c |
3718 | +++ b/drivers/media/radio/si470x/radio-si470x-usb.c |
3719 | @@ -16,7 +16,7 @@ |
3720 | |
3721 | /* driver definitions */ |
3722 | #define DRIVER_AUTHOR "Tobias Lorenz <tobias.lorenz@gmx.net>" |
3723 | -#define DRIVER_CARD "Silicon Labs Si470x FM Radio Receiver" |
3724 | +#define DRIVER_CARD "Silicon Labs Si470x FM Radio" |
3725 | #define DRIVER_DESC "USB radio driver for Si470x FM Radio Receivers" |
3726 | #define DRIVER_VERSION "1.0.10" |
3727 | |
3728 | diff --git a/drivers/media/rc/ite-cir.c b/drivers/media/rc/ite-cir.c |
3729 | index 4b8aee390518d..742b7f41b75f8 100644 |
3730 | --- a/drivers/media/rc/ite-cir.c |
3731 | +++ b/drivers/media/rc/ite-cir.c |
3732 | @@ -283,7 +283,7 @@ static irqreturn_t ite_cir_isr(int irq, void *data) |
3733 | } |
3734 | |
3735 | /* check for the receive interrupt */ |
3736 | - if (iflags & ITE_IRQ_RX_FIFO) { |
3737 | + if (iflags & (ITE_IRQ_RX_FIFO | ITE_IRQ_RX_FIFO_OVERRUN)) { |
3738 | /* read the FIFO bytes */ |
3739 | rx_bytes = |
3740 | dev->params.get_rx_bytes(dev, rx_buf, |
3741 | diff --git a/drivers/media/rc/mceusb.c b/drivers/media/rc/mceusb.c |
3742 | index c68e52c17ae13..31e56f4f34791 100644 |
3743 | --- a/drivers/media/rc/mceusb.c |
3744 | +++ b/drivers/media/rc/mceusb.c |
3745 | @@ -1386,6 +1386,7 @@ static void mceusb_dev_recv(struct urb *urb) |
3746 | case -ECONNRESET: |
3747 | case -ENOENT: |
3748 | case -EILSEQ: |
3749 | + case -EPROTO: |
3750 | case -ESHUTDOWN: |
3751 | usb_unlink_urb(urb); |
3752 | return; |
3753 | diff --git a/drivers/media/spi/cxd2880-spi.c b/drivers/media/spi/cxd2880-spi.c |
3754 | index 93194f03764d2..11273be702b6e 100644 |
3755 | --- a/drivers/media/spi/cxd2880-spi.c |
3756 | +++ b/drivers/media/spi/cxd2880-spi.c |
3757 | @@ -618,7 +618,7 @@ fail_frontend: |
3758 | fail_attach: |
3759 | dvb_unregister_adapter(&dvb_spi->adapter); |
3760 | fail_adapter: |
3761 | - if (!dvb_spi->vcc_supply) |
3762 | + if (dvb_spi->vcc_supply) |
3763 | regulator_disable(dvb_spi->vcc_supply); |
3764 | fail_regulator: |
3765 | kfree(dvb_spi); |
3766 | diff --git a/drivers/media/usb/dvb-usb/az6027.c b/drivers/media/usb/dvb-usb/az6027.c |
3767 | index 8de18da0c4bd1..5aa9c501ed9c9 100644 |
3768 | --- a/drivers/media/usb/dvb-usb/az6027.c |
3769 | +++ b/drivers/media/usb/dvb-usb/az6027.c |
3770 | @@ -391,6 +391,7 @@ static struct rc_map_table rc_map_az6027_table[] = { |
3771 | /* remote control stuff (does not work with my box) */ |
3772 | static int az6027_rc_query(struct dvb_usb_device *d, u32 *event, int *state) |
3773 | { |
3774 | + *state = REMOTE_NO_KEY_PRESSED; |
3775 | return 0; |
3776 | } |
3777 | |
3778 | diff --git a/drivers/media/usb/dvb-usb/dibusb-common.c b/drivers/media/usb/dvb-usb/dibusb-common.c |
3779 | index 59ce2dec11e98..9c1ebea68b544 100644 |
3780 | --- a/drivers/media/usb/dvb-usb/dibusb-common.c |
3781 | +++ b/drivers/media/usb/dvb-usb/dibusb-common.c |
3782 | @@ -223,7 +223,7 @@ int dibusb_read_eeprom_byte(struct dvb_usb_device *d, u8 offs, u8 *val) |
3783 | u8 *buf; |
3784 | int rc; |
3785 | |
3786 | - buf = kmalloc(2, GFP_KERNEL); |
3787 | + buf = kzalloc(2, GFP_KERNEL); |
3788 | if (!buf) |
3789 | return -ENOMEM; |
3790 | |
3791 | diff --git a/drivers/media/usb/em28xx/em28xx-cards.c b/drivers/media/usb/em28xx/em28xx-cards.c |
3792 | index 5983e72a0622c..3e96b4b711d75 100644 |
3793 | --- a/drivers/media/usb/em28xx/em28xx-cards.c |
3794 | +++ b/drivers/media/usb/em28xx/em28xx-cards.c |
3795 | @@ -4029,8 +4029,11 @@ static void em28xx_usb_disconnect(struct usb_interface *intf) |
3796 | |
3797 | em28xx_close_extension(dev); |
3798 | |
3799 | - if (dev->dev_next) |
3800 | + if (dev->dev_next) { |
3801 | + em28xx_close_extension(dev->dev_next); |
3802 | em28xx_release_resources(dev->dev_next); |
3803 | + } |
3804 | + |
3805 | em28xx_release_resources(dev); |
3806 | |
3807 | if (dev->dev_next) { |
3808 | diff --git a/drivers/media/usb/em28xx/em28xx-core.c b/drivers/media/usb/em28xx/em28xx-core.c |
3809 | index 3daa64bb1e1d9..af9216278024f 100644 |
3810 | --- a/drivers/media/usb/em28xx/em28xx-core.c |
3811 | +++ b/drivers/media/usb/em28xx/em28xx-core.c |
3812 | @@ -1152,8 +1152,9 @@ int em28xx_suspend_extension(struct em28xx *dev) |
3813 | dev_info(&dev->intf->dev, "Suspending extensions\n"); |
3814 | mutex_lock(&em28xx_devlist_mutex); |
3815 | list_for_each_entry(ops, &em28xx_extension_devlist, next) { |
3816 | - if (ops->suspend) |
3817 | - ops->suspend(dev); |
3818 | + if (!ops->suspend) |
3819 | + continue; |
3820 | + ops->suspend(dev); |
3821 | if (dev->dev_next) |
3822 | ops->suspend(dev->dev_next); |
3823 | } |
3824 | diff --git a/drivers/media/usb/tm6000/tm6000-video.c b/drivers/media/usb/tm6000/tm6000-video.c |
3825 | index c46cbcfafab3f..8874b0b922eee 100644 |
3826 | --- a/drivers/media/usb/tm6000/tm6000-video.c |
3827 | +++ b/drivers/media/usb/tm6000/tm6000-video.c |
3828 | @@ -854,8 +854,7 @@ static int vidioc_querycap(struct file *file, void *priv, |
3829 | struct tm6000_core *dev = ((struct tm6000_fh *)priv)->dev; |
3830 | |
3831 | strscpy(cap->driver, "tm6000", sizeof(cap->driver)); |
3832 | - strscpy(cap->card, "Trident TVMaster TM5600/6000/6010", |
3833 | - sizeof(cap->card)); |
3834 | + strscpy(cap->card, "Trident TM5600/6000/6010", sizeof(cap->card)); |
3835 | usb_make_path(dev->udev, cap->bus_info, sizeof(cap->bus_info)); |
3836 | cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE | |
3837 | V4L2_CAP_DEVICE_CAPS; |
3838 | diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c |
3839 | index 40ca1d4e03483..378cfc46fc195 100644 |
3840 | --- a/drivers/media/usb/uvc/uvc_driver.c |
3841 | +++ b/drivers/media/usb/uvc/uvc_driver.c |
3842 | @@ -1972,6 +1972,7 @@ int uvc_register_video_device(struct uvc_device *dev, |
3843 | const struct v4l2_file_operations *fops, |
3844 | const struct v4l2_ioctl_ops *ioctl_ops) |
3845 | { |
3846 | + const char *name; |
3847 | int ret; |
3848 | |
3849 | /* Initialize the video buffers queue. */ |
3850 | @@ -2000,16 +2001,20 @@ int uvc_register_video_device(struct uvc_device *dev, |
3851 | case V4L2_BUF_TYPE_VIDEO_CAPTURE: |
3852 | default: |
3853 | vdev->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; |
3854 | + name = "Video Capture"; |
3855 | break; |
3856 | case V4L2_BUF_TYPE_VIDEO_OUTPUT: |
3857 | vdev->device_caps = V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_STREAMING; |
3858 | + name = "Video Output"; |
3859 | break; |
3860 | case V4L2_BUF_TYPE_META_CAPTURE: |
3861 | vdev->device_caps = V4L2_CAP_META_CAPTURE | V4L2_CAP_STREAMING; |
3862 | + name = "Metadata"; |
3863 | break; |
3864 | } |
3865 | |
3866 | - strscpy(vdev->name, dev->name, sizeof(vdev->name)); |
3867 | + snprintf(vdev->name, sizeof(vdev->name), "%s %u", name, |
3868 | + stream->header.bTerminalLink); |
3869 | |
3870 | /* |
3871 | * Set the driver data before calling video_register_device, otherwise |
3872 | diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v4l2.c |
3873 | index db7f8f8ee2f9f..3126ee9e965c9 100644 |
3874 | --- a/drivers/media/usb/uvc/uvc_v4l2.c |
3875 | +++ b/drivers/media/usb/uvc/uvc_v4l2.c |
3876 | @@ -467,10 +467,13 @@ static int uvc_v4l2_set_streamparm(struct uvc_streaming *stream, |
3877 | uvc_simplify_fraction(&timeperframe.numerator, |
3878 | &timeperframe.denominator, 8, 333); |
3879 | |
3880 | - if (parm->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) |
3881 | + if (parm->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) { |
3882 | parm->parm.capture.timeperframe = timeperframe; |
3883 | - else |
3884 | + parm->parm.capture.capability = V4L2_CAP_TIMEPERFRAME; |
3885 | + } else { |
3886 | parm->parm.output.timeperframe = timeperframe; |
3887 | + parm->parm.output.capability = V4L2_CAP_TIMEPERFRAME; |
3888 | + } |
3889 | |
3890 | return 0; |
3891 | } |
3892 | diff --git a/drivers/media/usb/uvc/uvc_video.c b/drivers/media/usb/uvc/uvc_video.c |
3893 | index 5d095b2a03464..96b85d66e7a87 100644 |
3894 | --- a/drivers/media/usb/uvc/uvc_video.c |
3895 | +++ b/drivers/media/usb/uvc/uvc_video.c |
3896 | @@ -112,6 +112,11 @@ int uvc_query_ctrl(struct uvc_device *dev, u8 query, u8 unit, |
3897 | case 5: /* Invalid unit */ |
3898 | case 6: /* Invalid control */ |
3899 | case 7: /* Invalid Request */ |
3900 | + /* |
3901 | + * The firmware has not properly implemented |
3902 | + * the control or there has been a HW error. |
3903 | + */ |
3904 | + return -EIO; |
3905 | case 8: /* Invalid value within range */ |
3906 | return -EINVAL; |
3907 | default: /* reserved or unknown */ |
3908 | diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c |
3909 | index 24db33f803c06..98633fa5d46fd 100644 |
3910 | --- a/drivers/media/v4l2-core/v4l2-ioctl.c |
3911 | +++ b/drivers/media/v4l2-core/v4l2-ioctl.c |
3912 | @@ -902,7 +902,7 @@ static void v4l_print_default(const void *arg, bool write_only) |
3913 | pr_cont("driver-specific ioctl\n"); |
3914 | } |
3915 | |
3916 | -static int check_ext_ctrls(struct v4l2_ext_controls *c, int allow_priv) |
3917 | +static bool check_ext_ctrls(struct v4l2_ext_controls *c, unsigned long ioctl) |
3918 | { |
3919 | __u32 i; |
3920 | |
3921 | @@ -911,23 +911,41 @@ static int check_ext_ctrls(struct v4l2_ext_controls *c, int allow_priv) |
3922 | for (i = 0; i < c->count; i++) |
3923 | c->controls[i].reserved2[0] = 0; |
3924 | |
3925 | - /* V4L2_CID_PRIVATE_BASE cannot be used as control class |
3926 | - when using extended controls. |
3927 | - Only when passed in through VIDIOC_G_CTRL and VIDIOC_S_CTRL |
3928 | - is it allowed for backwards compatibility. |
3929 | - */ |
3930 | - if (!allow_priv && c->which == V4L2_CID_PRIVATE_BASE) |
3931 | - return 0; |
3932 | - if (!c->which) |
3933 | - return 1; |
3934 | + switch (c->which) { |
3935 | + case V4L2_CID_PRIVATE_BASE: |
3936 | + /* |
3937 | + * V4L2_CID_PRIVATE_BASE cannot be used as control class |
3938 | + * when using extended controls. |
3939 | + * Only when passed in through VIDIOC_G_CTRL and VIDIOC_S_CTRL |
3940 | + * is it allowed for backwards compatibility. |
3941 | + */ |
3942 | + if (ioctl == VIDIOC_G_CTRL || ioctl == VIDIOC_S_CTRL) |
3943 | + return false; |
3944 | + break; |
3945 | + case V4L2_CTRL_WHICH_DEF_VAL: |
3946 | + /* Default value cannot be changed */ |
3947 | + if (ioctl == VIDIOC_S_EXT_CTRLS || |
3948 | + ioctl == VIDIOC_TRY_EXT_CTRLS) { |
3949 | + c->error_idx = c->count; |
3950 | + return false; |
3951 | + } |
3952 | + return true; |
3953 | + case V4L2_CTRL_WHICH_CUR_VAL: |
3954 | + return true; |
3955 | + case V4L2_CTRL_WHICH_REQUEST_VAL: |
3956 | + c->error_idx = c->count; |
3957 | + return false; |
3958 | + } |
3959 | + |
3960 | /* Check that all controls are from the same control class. */ |
3961 | for (i = 0; i < c->count; i++) { |
3962 | if (V4L2_CTRL_ID2WHICH(c->controls[i].id) != c->which) { |
3963 | - c->error_idx = i; |
3964 | - return 0; |
3965 | + c->error_idx = ioctl == VIDIOC_TRY_EXT_CTRLS ? i : |
3966 | + c->count; |
3967 | + return false; |
3968 | } |
3969 | } |
3970 | - return 1; |
3971 | + return true; |
3972 | } |
3973 | |
3974 | static int check_fmt(struct file *file, enum v4l2_buf_type type) |
3975 | @@ -2145,7 +2163,7 @@ static int v4l_g_ctrl(const struct v4l2_ioctl_ops *ops, |
3976 | ctrls.controls = &ctrl; |
3977 | ctrl.id = p->id; |
3978 | ctrl.value = p->value; |
3979 | - if (check_ext_ctrls(&ctrls, 1)) { |
3980 | + if (check_ext_ctrls(&ctrls, VIDIOC_G_CTRL)) { |
3981 | int ret = ops->vidioc_g_ext_ctrls(file, fh, &ctrls); |
3982 | |
3983 | if (ret == 0) |
3984 | @@ -2179,7 +2197,7 @@ static int v4l_s_ctrl(const struct v4l2_ioctl_ops *ops, |
3985 | ctrls.controls = &ctrl; |
3986 | ctrl.id = p->id; |
3987 | ctrl.value = p->value; |
3988 | - if (check_ext_ctrls(&ctrls, 1)) |
3989 | + if (check_ext_ctrls(&ctrls, VIDIOC_S_CTRL)) |
3990 | return ops->vidioc_s_ext_ctrls(file, fh, &ctrls); |
3991 | return -EINVAL; |
3992 | } |
3993 | @@ -2201,8 +2219,8 @@ static int v4l_g_ext_ctrls(const struct v4l2_ioctl_ops *ops, |
3994 | vfd, vfd->v4l2_dev->mdev, p); |
3995 | if (ops->vidioc_g_ext_ctrls == NULL) |
3996 | return -ENOTTY; |
3997 | - return check_ext_ctrls(p, 0) ? ops->vidioc_g_ext_ctrls(file, fh, p) : |
3998 | - -EINVAL; |
3999 | + return check_ext_ctrls(p, VIDIOC_G_EXT_CTRLS) ? |
4000 | + ops->vidioc_g_ext_ctrls(file, fh, p) : -EINVAL; |
4001 | } |
4002 | |
4003 | static int v4l_s_ext_ctrls(const struct v4l2_ioctl_ops *ops, |
4004 | @@ -2222,8 +2240,8 @@ static int v4l_s_ext_ctrls(const struct v4l2_ioctl_ops *ops, |
4005 | vfd, vfd->v4l2_dev->mdev, p); |
4006 | if (ops->vidioc_s_ext_ctrls == NULL) |
4007 | return -ENOTTY; |
4008 | - return check_ext_ctrls(p, 0) ? ops->vidioc_s_ext_ctrls(file, fh, p) : |
4009 | - -EINVAL; |
4010 | + return check_ext_ctrls(p, VIDIOC_S_EXT_CTRLS) ? |
4011 | + ops->vidioc_s_ext_ctrls(file, fh, p) : -EINVAL; |
4012 | } |
4013 | |
4014 | static int v4l_try_ext_ctrls(const struct v4l2_ioctl_ops *ops, |
4015 | @@ -2243,8 +2261,8 @@ static int v4l_try_ext_ctrls(const struct v4l2_ioctl_ops *ops, |
4016 | vfd, vfd->v4l2_dev->mdev, p); |
4017 | if (ops->vidioc_try_ext_ctrls == NULL) |
4018 | return -ENOTTY; |
4019 | - return check_ext_ctrls(p, 0) ? ops->vidioc_try_ext_ctrls(file, fh, p) : |
4020 | - -EINVAL; |
4021 | + return check_ext_ctrls(p, VIDIOC_TRY_EXT_CTRLS) ? |
4022 | + ops->vidioc_try_ext_ctrls(file, fh, p) : -EINVAL; |
4023 | } |
4024 | |
4025 | /* |
4026 | diff --git a/drivers/memory/fsl_ifc.c b/drivers/memory/fsl_ifc.c |
4027 | index 2790258346070..84fa32f288c80 100644 |
4028 | --- a/drivers/memory/fsl_ifc.c |
4029 | +++ b/drivers/memory/fsl_ifc.c |
4030 | @@ -263,7 +263,7 @@ static int fsl_ifc_ctrl_probe(struct platform_device *dev) |
4031 | |
4032 | ret = fsl_ifc_ctrl_init(fsl_ifc_ctrl_dev); |
4033 | if (ret < 0) |
4034 | - goto err; |
4035 | + goto err_unmap_nandirq; |
4036 | |
4037 | init_waitqueue_head(&fsl_ifc_ctrl_dev->nand_wait); |
4038 | |
4039 | @@ -272,7 +272,7 @@ static int fsl_ifc_ctrl_probe(struct platform_device *dev) |
4040 | if (ret != 0) { |
4041 | dev_err(&dev->dev, "failed to install irq (%d)\n", |
4042 | fsl_ifc_ctrl_dev->irq); |
4043 | - goto err_irq; |
4044 | + goto err_unmap_nandirq; |
4045 | } |
4046 | |
4047 | if (fsl_ifc_ctrl_dev->nand_irq) { |
4048 | @@ -281,17 +281,16 @@ static int fsl_ifc_ctrl_probe(struct platform_device *dev) |
4049 | if (ret != 0) { |
4050 | dev_err(&dev->dev, "failed to install irq (%d)\n", |
4051 | fsl_ifc_ctrl_dev->nand_irq); |
4052 | - goto err_nandirq; |
4053 | + goto err_free_irq; |
4054 | } |
4055 | } |
4056 | |
4057 | return 0; |
4058 | |
4059 | -err_nandirq: |
4060 | - free_irq(fsl_ifc_ctrl_dev->nand_irq, fsl_ifc_ctrl_dev); |
4061 | - irq_dispose_mapping(fsl_ifc_ctrl_dev->nand_irq); |
4062 | -err_irq: |
4063 | +err_free_irq: |
4064 | free_irq(fsl_ifc_ctrl_dev->irq, fsl_ifc_ctrl_dev); |
4065 | +err_unmap_nandirq: |
4066 | + irq_dispose_mapping(fsl_ifc_ctrl_dev->nand_irq); |
4067 | irq_dispose_mapping(fsl_ifc_ctrl_dev->irq); |
4068 | err: |
4069 | iounmap(fsl_ifc_ctrl_dev->gregs); |
4070 | diff --git a/drivers/memstick/core/ms_block.c b/drivers/memstick/core/ms_block.c |
4071 | index d9ee8e3dc72da..55907e4c36b18 100644 |
4072 | --- a/drivers/memstick/core/ms_block.c |
4073 | +++ b/drivers/memstick/core/ms_block.c |
4074 | @@ -1727,7 +1727,7 @@ static int msb_init_card(struct memstick_dev *card) |
4075 | msb->pages_in_block = boot_block->attr.block_size * 2; |
4076 | msb->block_size = msb->page_size * msb->pages_in_block; |
4077 | |
4078 | - if (msb->page_size > PAGE_SIZE) { |
4079 | + if ((size_t)msb->page_size > PAGE_SIZE) { |
4080 | /* this isn't supported by linux at all, anyway*/ |
4081 | dbg("device page %d size isn't supported", msb->page_size); |
4082 | return -EINVAL; |
4083 | diff --git a/drivers/memstick/host/jmb38x_ms.c b/drivers/memstick/host/jmb38x_ms.c |
4084 | index 64fff6abe60e8..74d6686b35f77 100644 |
4085 | --- a/drivers/memstick/host/jmb38x_ms.c |
4086 | +++ b/drivers/memstick/host/jmb38x_ms.c |
4087 | @@ -899,7 +899,7 @@ static struct memstick_host *jmb38x_ms_alloc_host(struct jmb38x_ms *jm, int cnt) |
4088 | |
4089 | iounmap(host->addr); |
4090 | err_out_free: |
4091 | - kfree(msh); |
4092 | + memstick_free_host(msh); |
4093 | return NULL; |
4094 | } |
4095 | |
4096 | diff --git a/drivers/memstick/host/r592.c b/drivers/memstick/host/r592.c |
4097 | index d2ef46337191c..eaa2a94d18be4 100644 |
4098 | --- a/drivers/memstick/host/r592.c |
4099 | +++ b/drivers/memstick/host/r592.c |
4100 | @@ -837,15 +837,15 @@ static void r592_remove(struct pci_dev *pdev) |
4101 | } |
4102 | memstick_remove_host(dev->host); |
4103 | |
4104 | + if (dev->dummy_dma_page) |
4105 | + dma_free_coherent(&pdev->dev, PAGE_SIZE, dev->dummy_dma_page, |
4106 | + dev->dummy_dma_page_physical_address); |
4107 | + |
4108 | free_irq(dev->irq, dev); |
4109 | iounmap(dev->mmio); |
4110 | pci_release_regions(pdev); |
4111 | pci_disable_device(pdev); |
4112 | memstick_free_host(dev->host); |
4113 | - |
4114 | - if (dev->dummy_dma_page) |
4115 | - dma_free_coherent(&pdev->dev, PAGE_SIZE, dev->dummy_dma_page, |
4116 | - dev->dummy_dma_page_physical_address); |
4117 | } |
4118 | |
4119 | #ifdef CONFIG_PM_SLEEP |
4120 | diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig |
4121 | index 49ea02c467bf1..1b4a40d910cfb 100644 |
4122 | --- a/drivers/mmc/host/Kconfig |
4123 | +++ b/drivers/mmc/host/Kconfig |
4124 | @@ -449,7 +449,7 @@ config MMC_OMAP_HS |
4125 | |
4126 | config MMC_WBSD |
4127 | tristate "Winbond W83L51xD SD/MMC Card Interface support" |
4128 | - depends on ISA_DMA_API |
4129 | + depends on ISA_DMA_API && !M68K |
4130 | help |
4131 | This selects the Winbond(R) W83L51xD Secure digital and |
4132 | Multimedia card Interface. |
4133 | diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c |
4134 | index 7b280cb363271..ba37be8e423c2 100644 |
4135 | --- a/drivers/mmc/host/dw_mmc.c |
4136 | +++ b/drivers/mmc/host/dw_mmc.c |
4137 | @@ -2013,7 +2013,8 @@ static void dw_mci_tasklet_func(unsigned long priv) |
4138 | * delayed. Allowing the transfer to take place |
4139 | * avoids races and keeps things simple. |
4140 | */ |
4141 | - if (err != -ETIMEDOUT) { |
4142 | + if (err != -ETIMEDOUT && |
4143 | + host->dir_status == DW_MCI_RECV_STATUS) { |
4144 | state = STATE_SENDING_DATA; |
4145 | continue; |
4146 | } |
4147 | diff --git a/drivers/mmc/host/mxs-mmc.c b/drivers/mmc/host/mxs-mmc.c |
4148 | index 52054931c3507..3a90037254a4d 100644 |
4149 | --- a/drivers/mmc/host/mxs-mmc.c |
4150 | +++ b/drivers/mmc/host/mxs-mmc.c |
4151 | @@ -565,6 +565,11 @@ static const struct of_device_id mxs_mmc_dt_ids[] = { |
4152 | }; |
4153 | MODULE_DEVICE_TABLE(of, mxs_mmc_dt_ids); |
4154 | |
4155 | +static void mxs_mmc_regulator_disable(void *regulator) |
4156 | +{ |
4157 | + regulator_disable(regulator); |
4158 | +} |
4159 | + |
4160 | static int mxs_mmc_probe(struct platform_device *pdev) |
4161 | { |
4162 | const struct of_device_id *of_id = |
4163 | @@ -606,6 +611,11 @@ static int mxs_mmc_probe(struct platform_device *pdev) |
4164 | "Failed to enable vmmc regulator: %d\n", ret); |
4165 | goto out_mmc_free; |
4166 | } |
4167 | + |
4168 | + ret = devm_add_action_or_reset(&pdev->dev, mxs_mmc_regulator_disable, |
4169 | + reg_vmmc); |
4170 | + if (ret) |
4171 | + goto out_mmc_free; |
4172 | } |
4173 | |
4174 | ssp->clk = devm_clk_get(&pdev->dev, NULL); |
4175 | diff --git a/drivers/mmc/host/sdhci-omap.c b/drivers/mmc/host/sdhci-omap.c |
4176 | index d3135249b2e40..346ca41b28f8b 100644 |
4177 | --- a/drivers/mmc/host/sdhci-omap.c |
4178 | +++ b/drivers/mmc/host/sdhci-omap.c |
4179 | @@ -675,7 +675,8 @@ static void sdhci_omap_set_power(struct sdhci_host *host, unsigned char mode, |
4180 | { |
4181 | struct mmc_host *mmc = host->mmc; |
4182 | |
4183 | - mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, vdd); |
4184 | + if (!IS_ERR(mmc->supply.vmmc)) |
4185 | + mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, vdd); |
4186 | } |
4187 | |
4188 | static int sdhci_omap_enable_dma(struct sdhci_host *host) |
4189 | diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c |
4190 | index 32a76b8feaa5d..ac5d3b6db9b84 100644 |
4191 | --- a/drivers/mtd/mtdcore.c |
4192 | +++ b/drivers/mtd/mtdcore.c |
4193 | @@ -727,8 +727,6 @@ int del_mtd_device(struct mtd_info *mtd) |
4194 | |
4195 | mutex_lock(&mtd_table_mutex); |
4196 | |
4197 | - debugfs_remove_recursive(mtd->dbg.dfs_dir); |
4198 | - |
4199 | if (idr_find(&mtd_idr, mtd->index) != mtd) { |
4200 | ret = -ENODEV; |
4201 | goto out_error; |
4202 | @@ -744,6 +742,8 @@ int del_mtd_device(struct mtd_info *mtd) |
4203 | mtd->index, mtd->name, mtd->usecount); |
4204 | ret = -EBUSY; |
4205 | } else { |
4206 | + debugfs_remove_recursive(mtd->dbg.dfs_dir); |
4207 | + |
4208 | /* Try to remove the NVMEM provider */ |
4209 | if (mtd->nvmem) |
4210 | nvmem_unregister(mtd->nvmem); |
4211 | diff --git a/drivers/mtd/spi-nor/hisi-sfc.c b/drivers/mtd/spi-nor/hisi-sfc.c |
4212 | index 8fcc48056a8bc..569cfd473c87b 100644 |
4213 | --- a/drivers/mtd/spi-nor/hisi-sfc.c |
4214 | +++ b/drivers/mtd/spi-nor/hisi-sfc.c |
4215 | @@ -474,7 +474,6 @@ static int hisi_spi_nor_remove(struct platform_device *pdev) |
4216 | |
4217 | hisi_spi_nor_unregister_all(host); |
4218 | mutex_destroy(&host->lock); |
4219 | - clk_disable_unprepare(host->clk); |
4220 | return 0; |
4221 | } |
4222 | |
4223 | diff --git a/drivers/net/bonding/bond_sysfs_slave.c b/drivers/net/bonding/bond_sysfs_slave.c |
4224 | index fd07561da0348..6a6cdd0bb2585 100644 |
4225 | --- a/drivers/net/bonding/bond_sysfs_slave.c |
4226 | +++ b/drivers/net/bonding/bond_sysfs_slave.c |
4227 | @@ -108,15 +108,15 @@ static ssize_t ad_partner_oper_port_state_show(struct slave *slave, char *buf) |
4228 | } |
4229 | static SLAVE_ATTR_RO(ad_partner_oper_port_state); |
4230 | |
4231 | -static const struct slave_attribute *slave_attrs[] = { |
4232 | - &slave_attr_state, |
4233 | - &slave_attr_mii_status, |
4234 | - &slave_attr_link_failure_count, |
4235 | - &slave_attr_perm_hwaddr, |
4236 | - &slave_attr_queue_id, |
4237 | - &slave_attr_ad_aggregator_id, |
4238 | - &slave_attr_ad_actor_oper_port_state, |
4239 | - &slave_attr_ad_partner_oper_port_state, |
4240 | +static const struct attribute *slave_attrs[] = { |
4241 | + &slave_attr_state.attr, |
4242 | + &slave_attr_mii_status.attr, |
4243 | + &slave_attr_link_failure_count.attr, |
4244 | + &slave_attr_perm_hwaddr.attr, |
4245 | + &slave_attr_queue_id.attr, |
4246 | + &slave_attr_ad_aggregator_id.attr, |
4247 | + &slave_attr_ad_actor_oper_port_state.attr, |
4248 | + &slave_attr_ad_partner_oper_port_state.attr, |
4249 | NULL |
4250 | }; |
4251 | |
4252 | @@ -137,24 +137,10 @@ const struct sysfs_ops slave_sysfs_ops = { |
4253 | |
4254 | int bond_sysfs_slave_add(struct slave *slave) |
4255 | { |
4256 | - const struct slave_attribute **a; |
4257 | - int err; |
4258 | - |
4259 | - for (a = slave_attrs; *a; ++a) { |
4260 | - err = sysfs_create_file(&slave->kobj, &((*a)->attr)); |
4261 | - if (err) { |
4262 | - kobject_put(&slave->kobj); |
4263 | - return err; |
4264 | - } |
4265 | - } |
4266 | - |
4267 | - return 0; |
4268 | + return sysfs_create_files(&slave->kobj, slave_attrs); |
4269 | } |
4270 | |
4271 | void bond_sysfs_slave_del(struct slave *slave) |
4272 | { |
4273 | - const struct slave_attribute **a; |
4274 | - |
4275 | - for (a = slave_attrs; *a; ++a) |
4276 | - sysfs_remove_file(&slave->kobj, &((*a)->attr)); |
4277 | + sysfs_remove_files(&slave->kobj, slave_attrs); |
4278 | } |
4279 | diff --git a/drivers/net/dsa/rtl8366rb.c b/drivers/net/dsa/rtl8366rb.c |
4280 | index 7f731bf369980..d047004360615 100644 |
4281 | --- a/drivers/net/dsa/rtl8366rb.c |
4282 | +++ b/drivers/net/dsa/rtl8366rb.c |
4283 | @@ -1264,7 +1264,7 @@ static int rtl8366rb_set_mc_index(struct realtek_smi *smi, int port, int index) |
4284 | |
4285 | static bool rtl8366rb_is_vlan_valid(struct realtek_smi *smi, unsigned int vlan) |
4286 | { |
4287 | - unsigned int max = RTL8366RB_NUM_VLANS; |
4288 | + unsigned int max = RTL8366RB_NUM_VLANS - 1; |
4289 | |
4290 | if (smi->vlan4k_enabled) |
4291 | max = RTL8366RB_NUM_VIDS - 1; |
4292 | diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-common.h b/drivers/net/ethernet/amd/xgbe/xgbe-common.h |
4293 | index b2cd3bdba9f89..533b8519ec352 100644 |
4294 | --- a/drivers/net/ethernet/amd/xgbe/xgbe-common.h |
4295 | +++ b/drivers/net/ethernet/amd/xgbe/xgbe-common.h |
4296 | @@ -1331,6 +1331,10 @@ |
4297 | #define MDIO_VEND2_PMA_CDR_CONTROL 0x8056 |
4298 | #endif |
4299 | |
4300 | +#ifndef MDIO_VEND2_PMA_MISC_CTRL0 |
4301 | +#define MDIO_VEND2_PMA_MISC_CTRL0 0x8090 |
4302 | +#endif |
4303 | + |
4304 | #ifndef MDIO_CTRL1_SPEED1G |
4305 | #define MDIO_CTRL1_SPEED1G (MDIO_CTRL1_SPEED10G & ~BMCR_SPEED100) |
4306 | #endif |
4307 | @@ -1389,6 +1393,10 @@ |
4308 | #define XGBE_PMA_RX_RST_0_RESET_ON 0x10 |
4309 | #define XGBE_PMA_RX_RST_0_RESET_OFF 0x00 |
4310 | |
4311 | +#define XGBE_PMA_PLL_CTRL_MASK BIT(15) |
4312 | +#define XGBE_PMA_PLL_CTRL_ENABLE BIT(15) |
4313 | +#define XGBE_PMA_PLL_CTRL_DISABLE 0x0000 |
4314 | + |
4315 | /* Bit setting and getting macros |
4316 | * The get macro will extract the current bit field value from within |
4317 | * the variable |
4318 | diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c |
4319 | index d6f6afb67bcc6..0b325ae875b52 100644 |
4320 | --- a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c |
4321 | +++ b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c |
4322 | @@ -1972,12 +1972,26 @@ static void xgbe_phy_rx_reset(struct xgbe_prv_data *pdata) |
4323 | } |
4324 | } |
4325 | |
4326 | +static void xgbe_phy_pll_ctrl(struct xgbe_prv_data *pdata, bool enable) |
4327 | +{ |
4328 | + XMDIO_WRITE_BITS(pdata, MDIO_MMD_PMAPMD, MDIO_VEND2_PMA_MISC_CTRL0, |
4329 | + XGBE_PMA_PLL_CTRL_MASK, |
4330 | + enable ? XGBE_PMA_PLL_CTRL_ENABLE |
4331 | + : XGBE_PMA_PLL_CTRL_DISABLE); |
4332 | + |
4333 | + /* Wait for command to complete */ |
4334 | + usleep_range(100, 200); |
4335 | +} |
4336 | + |
4337 | static void xgbe_phy_perform_ratechange(struct xgbe_prv_data *pdata, |
4338 | unsigned int cmd, unsigned int sub_cmd) |
4339 | { |
4340 | unsigned int s0 = 0; |
4341 | unsigned int wait; |
4342 | |
4343 | + /* Disable PLL re-initialization during FW command processing */ |
4344 | + xgbe_phy_pll_ctrl(pdata, false); |
4345 | + |
4346 | /* Log if a previous command did not complete */ |
4347 | if (XP_IOREAD_BITS(pdata, XP_DRIVER_INT_RO, STATUS)) { |
4348 | netif_dbg(pdata, link, pdata->netdev, |
4349 | @@ -1998,7 +2012,7 @@ static void xgbe_phy_perform_ratechange(struct xgbe_prv_data *pdata, |
4350 | wait = XGBE_RATECHANGE_COUNT; |
4351 | while (wait--) { |
4352 | if (!XP_IOREAD_BITS(pdata, XP_DRIVER_INT_RO, STATUS)) |
4353 | - return; |
4354 | + goto reenable_pll; |
4355 | |
4356 | usleep_range(1000, 2000); |
4357 | } |
4358 | @@ -2008,6 +2022,10 @@ static void xgbe_phy_perform_ratechange(struct xgbe_prv_data *pdata, |
4359 | |
4360 | /* Reset on error */ |
4361 | xgbe_phy_rx_reset(pdata); |
4362 | + |
4363 | +reenable_pll: |
4364 | + /* Enable PLL re-initialization */ |
4365 | + xgbe_phy_pll_ctrl(pdata, true); |
4366 | } |
4367 | |
4368 | static void xgbe_phy_rrc(struct xgbe_prv_data *pdata) |
4369 | diff --git a/drivers/net/ethernet/cavium/thunder/nic_main.c b/drivers/net/ethernet/cavium/thunder/nic_main.c |
4370 | index 9361f964bb9b2..816453a4f8d6c 100644 |
4371 | --- a/drivers/net/ethernet/cavium/thunder/nic_main.c |
4372 | +++ b/drivers/net/ethernet/cavium/thunder/nic_main.c |
4373 | @@ -1193,7 +1193,7 @@ static int nic_register_interrupts(struct nicpf *nic) |
4374 | dev_err(&nic->pdev->dev, |
4375 | "Request for #%d msix vectors failed, returned %d\n", |
4376 | nic->num_vec, ret); |
4377 | - return 1; |
4378 | + return ret; |
4379 | } |
4380 | |
4381 | /* Register mailbox interrupt handler */ |
4382 | diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_main.c b/drivers/net/ethernet/cavium/thunder/nicvf_main.c |
4383 | index 5c45c0c6dd234..27ea528ef4484 100644 |
4384 | --- a/drivers/net/ethernet/cavium/thunder/nicvf_main.c |
4385 | +++ b/drivers/net/ethernet/cavium/thunder/nicvf_main.c |
4386 | @@ -1226,7 +1226,7 @@ static int nicvf_register_misc_interrupt(struct nicvf *nic) |
4387 | if (ret < 0) { |
4388 | netdev_err(nic->netdev, |
4389 | "Req for #%d msix vectors failed\n", nic->num_vec); |
4390 | - return 1; |
4391 | + return ret; |
4392 | } |
4393 | |
4394 | sprintf(nic->irq_name[irq], "%s Mbox", "NICVF"); |
4395 | @@ -1245,7 +1245,7 @@ static int nicvf_register_misc_interrupt(struct nicvf *nic) |
4396 | if (!nicvf_check_pf_ready(nic)) { |
4397 | nicvf_disable_intr(nic, NICVF_INTR_MBOX, 0); |
4398 | nicvf_unregister_interrupts(nic); |
4399 | - return 1; |
4400 | + return -EIO; |
4401 | } |
4402 | |
4403 | return 0; |
4404 | diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_ethtool.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_ethtool.c |
4405 | index f537be9cb3155..5ba30b8eb1e11 100644 |
4406 | --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_ethtool.c |
4407 | +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_ethtool.c |
4408 | @@ -1466,12 +1466,15 @@ static int cxgb4_get_module_info(struct net_device *dev, |
4409 | if (ret) |
4410 | return ret; |
4411 | |
4412 | - if (!sff8472_comp || (sff_diag_type & 4)) { |
4413 | + if (!sff8472_comp || (sff_diag_type & SFP_DIAG_ADDRMODE)) { |
4414 | modinfo->type = ETH_MODULE_SFF_8079; |
4415 | modinfo->eeprom_len = ETH_MODULE_SFF_8079_LEN; |
4416 | } else { |
4417 | modinfo->type = ETH_MODULE_SFF_8472; |
4418 | - modinfo->eeprom_len = ETH_MODULE_SFF_8472_LEN; |
4419 | + if (sff_diag_type & SFP_DIAG_IMPLEMENTED) |
4420 | + modinfo->eeprom_len = ETH_MODULE_SFF_8472_LEN; |
4421 | + else |
4422 | + modinfo->eeprom_len = ETH_MODULE_SFF_8472_LEN / 2; |
4423 | } |
4424 | break; |
4425 | |
4426 | diff --git a/drivers/net/ethernet/chelsio/cxgb4/t4_hw.h b/drivers/net/ethernet/chelsio/cxgb4/t4_hw.h |
4427 | index 002fc62ea7262..63bc956d20376 100644 |
4428 | --- a/drivers/net/ethernet/chelsio/cxgb4/t4_hw.h |
4429 | +++ b/drivers/net/ethernet/chelsio/cxgb4/t4_hw.h |
4430 | @@ -293,6 +293,8 @@ enum { |
4431 | #define I2C_PAGE_SIZE 0x100 |
4432 | #define SFP_DIAG_TYPE_ADDR 0x5c |
4433 | #define SFP_DIAG_TYPE_LEN 0x1 |
4434 | +#define SFP_DIAG_ADDRMODE BIT(2) |
4435 | +#define SFP_DIAG_IMPLEMENTED BIT(6) |
4436 | #define SFF_8472_COMP_ADDR 0x5e |
4437 | #define SFF_8472_COMP_LEN 0x1 |
4438 | #define SFF_REV_ADDR 0x1 |
4439 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.c |
4440 | index 9076605403a74..bb22d91f6e53e 100644 |
4441 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.c |
4442 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.c |
4443 | @@ -124,7 +124,7 @@ static int hclge_ets_validate(struct hclge_dev *hdev, struct ieee_ets *ets, |
4444 | if (ret) |
4445 | return ret; |
4446 | |
4447 | - for (i = 0; i < hdev->tc_max; i++) { |
4448 | + for (i = 0; i < HNAE3_MAX_TC; i++) { |
4449 | switch (ets->tc_tsa[i]) { |
4450 | case IEEE_8021QAZ_TSA_STRICT: |
4451 | if (hdev->tm_info.tc_info[i].tc_sch_mode != |
4452 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c |
4453 | index d98f0e2ec7aa3..8448607742a6b 100644 |
4454 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c |
4455 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c |
4456 | @@ -974,7 +974,6 @@ static int hclge_tm_pri_tc_base_dwrr_cfg(struct hclge_dev *hdev) |
4457 | |
4458 | static int hclge_tm_ets_tc_dwrr_cfg(struct hclge_dev *hdev) |
4459 | { |
4460 | -#define DEFAULT_TC_WEIGHT 1 |
4461 | #define DEFAULT_TC_OFFSET 14 |
4462 | |
4463 | struct hclge_ets_tc_weight_cmd *ets_weight; |
4464 | @@ -987,13 +986,7 @@ static int hclge_tm_ets_tc_dwrr_cfg(struct hclge_dev *hdev) |
4465 | for (i = 0; i < HNAE3_MAX_TC; i++) { |
4466 | struct hclge_pg_info *pg_info; |
4467 | |
4468 | - ets_weight->tc_weight[i] = DEFAULT_TC_WEIGHT; |
4469 | - |
4470 | - if (!(hdev->hw_tc_map & BIT(i))) |
4471 | - continue; |
4472 | - |
4473 | - pg_info = |
4474 | - &hdev->tm_info.pg_info[hdev->tm_info.tc_info[i].pgid]; |
4475 | + pg_info = &hdev->tm_info.pg_info[hdev->tm_info.tc_info[i].pgid]; |
4476 | ets_weight->tc_weight[i] = pg_info->tc_dwrr[i]; |
4477 | } |
4478 | |
4479 | diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c |
4480 | index cfe7229593ead..9adfc0a7ab823 100644 |
4481 | --- a/drivers/net/ethernet/ibm/ibmvnic.c |
4482 | +++ b/drivers/net/ethernet/ibm/ibmvnic.c |
4483 | @@ -1462,8 +1462,6 @@ static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev) |
4484 | netdev_tx_t ret = NETDEV_TX_OK; |
4485 | |
4486 | if (test_bit(0, &adapter->resetting)) { |
4487 | - if (!netif_subqueue_stopped(netdev, skb)) |
4488 | - netif_stop_subqueue(netdev, queue_num); |
4489 | dev_kfree_skb_any(skb); |
4490 | |
4491 | tx_send_failed++; |
4492 | @@ -4936,6 +4934,9 @@ static int init_crq_queue(struct ibmvnic_adapter *adapter) |
4493 | crq->cur = 0; |
4494 | spin_lock_init(&crq->lock); |
4495 | |
4496 | + /* process any CRQs that were queued before we enabled interrupts */ |
4497 | + tasklet_schedule(&adapter->tasklet); |
4498 | + |
4499 | return retrc; |
4500 | |
4501 | req_irq_failed: |
4502 | diff --git a/drivers/net/ethernet/netronome/nfp/bpf/main.c b/drivers/net/ethernet/netronome/nfp/bpf/main.c |
4503 | index 8f732771d3fad..bd2966eb6b7d3 100644 |
4504 | --- a/drivers/net/ethernet/netronome/nfp/bpf/main.c |
4505 | +++ b/drivers/net/ethernet/netronome/nfp/bpf/main.c |
4506 | @@ -182,15 +182,21 @@ static int |
4507 | nfp_bpf_check_mtu(struct nfp_app *app, struct net_device *netdev, int new_mtu) |
4508 | { |
4509 | struct nfp_net *nn = netdev_priv(netdev); |
4510 | - unsigned int max_mtu; |
4511 | + struct nfp_bpf_vnic *bv; |
4512 | + struct bpf_prog *prog; |
4513 | |
4514 | if (~nn->dp.ctrl & NFP_NET_CFG_CTRL_BPF) |
4515 | return 0; |
4516 | |
4517 | - max_mtu = nn_readb(nn, NFP_NET_CFG_BPF_INL_MTU) * 64 - 32; |
4518 | - if (new_mtu > max_mtu) { |
4519 | - nn_info(nn, "BPF offload active, MTU over %u not supported\n", |
4520 | - max_mtu); |
4521 | + if (nn->xdp_hw.prog) { |
4522 | + prog = nn->xdp_hw.prog; |
4523 | + } else { |
4524 | + bv = nn->app_priv; |
4525 | + prog = bv->tc_prog; |
4526 | + } |
4527 | + |
4528 | + if (nfp_bpf_offload_check_mtu(nn, prog, new_mtu)) { |
4529 | + nn_info(nn, "BPF offload active, potential packet access beyond hardware packet boundary"); |
4530 | return -EBUSY; |
4531 | } |
4532 | return 0; |
4533 | diff --git a/drivers/net/ethernet/netronome/nfp/bpf/main.h b/drivers/net/ethernet/netronome/nfp/bpf/main.h |
4534 | index fac9c6f9e197b..c74620fcc539c 100644 |
4535 | --- a/drivers/net/ethernet/netronome/nfp/bpf/main.h |
4536 | +++ b/drivers/net/ethernet/netronome/nfp/bpf/main.h |
4537 | @@ -560,6 +560,8 @@ bool nfp_is_subprog_start(struct nfp_insn_meta *meta); |
4538 | void nfp_bpf_jit_prepare(struct nfp_prog *nfp_prog); |
4539 | int nfp_bpf_jit(struct nfp_prog *prog); |
4540 | bool nfp_bpf_supported_opcode(u8 code); |
4541 | +bool nfp_bpf_offload_check_mtu(struct nfp_net *nn, struct bpf_prog *prog, |
4542 | + unsigned int mtu); |
4543 | |
4544 | int nfp_verify_insn(struct bpf_verifier_env *env, int insn_idx, |
4545 | int prev_insn_idx); |
4546 | diff --git a/drivers/net/ethernet/netronome/nfp/bpf/offload.c b/drivers/net/ethernet/netronome/nfp/bpf/offload.c |
4547 | index 88fab6a82acff..7ff388ecc7e3a 100644 |
4548 | --- a/drivers/net/ethernet/netronome/nfp/bpf/offload.c |
4549 | +++ b/drivers/net/ethernet/netronome/nfp/bpf/offload.c |
4550 | @@ -477,19 +477,28 @@ int nfp_bpf_event_output(struct nfp_app_bpf *bpf, const void *data, |
4551 | return 0; |
4552 | } |
4553 | |
4554 | +bool nfp_bpf_offload_check_mtu(struct nfp_net *nn, struct bpf_prog *prog, |
4555 | + unsigned int mtu) |
4556 | +{ |
4557 | + unsigned int fw_mtu, pkt_off; |
4558 | + |
4559 | + fw_mtu = nn_readb(nn, NFP_NET_CFG_BPF_INL_MTU) * 64 - 32; |
4560 | + pkt_off = min(prog->aux->max_pkt_offset, mtu); |
4561 | + |
4562 | + return fw_mtu < pkt_off; |
4563 | +} |
4564 | + |
4565 | static int |
4566 | nfp_net_bpf_load(struct nfp_net *nn, struct bpf_prog *prog, |
4567 | struct netlink_ext_ack *extack) |
4568 | { |
4569 | struct nfp_prog *nfp_prog = prog->aux->offload->dev_priv; |
4570 | - unsigned int fw_mtu, pkt_off, max_stack, max_prog_len; |
4571 | + unsigned int max_stack, max_prog_len; |
4572 | dma_addr_t dma_addr; |
4573 | void *img; |
4574 | int err; |
4575 | |
4576 | - fw_mtu = nn_readb(nn, NFP_NET_CFG_BPF_INL_MTU) * 64 - 32; |
4577 | - pkt_off = min(prog->aux->max_pkt_offset, nn->dp.netdev->mtu); |
4578 | - if (fw_mtu < pkt_off) { |
4579 | + if (nfp_bpf_offload_check_mtu(nn, prog, nn->dp.netdev->mtu)) { |
4580 | NL_SET_ERR_MSG_MOD(extack, "BPF offload not supported with potential packet access beyond HW packet split boundary"); |
4581 | return -EOPNOTSUPP; |
4582 | } |
4583 | diff --git a/drivers/net/ethernet/realtek/r8169_main.c b/drivers/net/ethernet/realtek/r8169_main.c |
4584 | index 623d86e5e970f..8d2b184ff5758 100644 |
4585 | --- a/drivers/net/ethernet/realtek/r8169_main.c |
4586 | +++ b/drivers/net/ethernet/realtek/r8169_main.c |
4587 | @@ -212,6 +212,7 @@ static const struct pci_device_id rtl8169_pci_tbl[] = { |
4588 | { PCI_VDEVICE(REALTEK, 0x8129) }, |
4589 | { PCI_VDEVICE(REALTEK, 0x8136), RTL_CFG_NO_GBIT }, |
4590 | { PCI_VDEVICE(REALTEK, 0x8161) }, |
4591 | + { PCI_VDEVICE(REALTEK, 0x8162) }, |
4592 | { PCI_VDEVICE(REALTEK, 0x8167) }, |
4593 | { PCI_VDEVICE(REALTEK, 0x8168) }, |
4594 | { PCI_VDEVICE(NCUBE, 0x8168) }, |
4595 | diff --git a/drivers/net/ethernet/sfc/ptp.c b/drivers/net/ethernet/sfc/ptp.c |
4596 | index 59b4f16896a81..1fa1b71dbfa11 100644 |
4597 | --- a/drivers/net/ethernet/sfc/ptp.c |
4598 | +++ b/drivers/net/ethernet/sfc/ptp.c |
4599 | @@ -648,7 +648,7 @@ static int efx_ptp_get_attributes(struct efx_nic *efx) |
4600 | } else if (rc == -EINVAL) { |
4601 | fmt = MC_CMD_PTP_OUT_GET_ATTRIBUTES_SECONDS_NANOSECONDS; |
4602 | } else if (rc == -EPERM) { |
4603 | - netif_info(efx, probe, efx->net_dev, "no PTP support\n"); |
4604 | + pci_info(efx->pci_dev, "no PTP support\n"); |
4605 | return rc; |
4606 | } else { |
4607 | efx_mcdi_display_error(efx, MC_CMD_PTP, sizeof(inbuf), |
4608 | @@ -824,7 +824,7 @@ static int efx_ptp_disable(struct efx_nic *efx) |
4609 | * should only have been called during probe. |
4610 | */ |
4611 | if (rc == -ENOSYS || rc == -EPERM) |
4612 | - netif_info(efx, probe, efx->net_dev, "no PTP support\n"); |
4613 | + pci_info(efx->pci_dev, "no PTP support\n"); |
4614 | else if (rc) |
4615 | efx_mcdi_display_error(efx, MC_CMD_PTP, |
4616 | MC_CMD_PTP_IN_DISABLE_LEN, |
4617 | diff --git a/drivers/net/ethernet/sfc/siena_sriov.c b/drivers/net/ethernet/sfc/siena_sriov.c |
4618 | index dfbdf05dcf794..68f092881d137 100644 |
4619 | --- a/drivers/net/ethernet/sfc/siena_sriov.c |
4620 | +++ b/drivers/net/ethernet/sfc/siena_sriov.c |
4621 | @@ -1056,7 +1056,7 @@ void efx_siena_sriov_probe(struct efx_nic *efx) |
4622 | return; |
4623 | |
4624 | if (efx_siena_sriov_cmd(efx, false, &efx->vi_scale, &count)) { |
4625 | - netif_info(efx, probe, efx->net_dev, "no SR-IOV VFs probed\n"); |
4626 | + pci_info(efx->pci_dev, "no SR-IOV VFs probed\n"); |
4627 | return; |
4628 | } |
4629 | if (count > 0 && count > max_vfs) |
4630 | diff --git a/drivers/net/ethernet/ti/davinci_emac.c b/drivers/net/ethernet/ti/davinci_emac.c |
4631 | index 6869c5c74b9f7..fac59032bf83a 100644 |
4632 | --- a/drivers/net/ethernet/ti/davinci_emac.c |
4633 | +++ b/drivers/net/ethernet/ti/davinci_emac.c |
4634 | @@ -412,8 +412,20 @@ static int emac_set_coalesce(struct net_device *ndev, |
4635 | u32 int_ctrl, num_interrupts = 0; |
4636 | u32 prescale = 0, addnl_dvdr = 1, coal_intvl = 0; |
4637 | |
4638 | - if (!coal->rx_coalesce_usecs) |
4639 | - return -EINVAL; |
4640 | + if (!coal->rx_coalesce_usecs) { |
4641 | + priv->coal_intvl = 0; |
4642 | + |
4643 | + switch (priv->version) { |
4644 | + case EMAC_VERSION_2: |
4645 | + emac_ctrl_write(EMAC_DM646X_CMINTCTRL, 0); |
4646 | + break; |
4647 | + default: |
4648 | + emac_ctrl_write(EMAC_CTRL_EWINTTCNT, 0); |
4649 | + break; |
4650 | + } |
4651 | + |
4652 | + return 0; |
4653 | + } |
4654 | |
4655 | coal_intvl = coal->rx_coalesce_usecs; |
4656 | |
4657 | diff --git a/drivers/net/phy/micrel.c b/drivers/net/phy/micrel.c |
4658 | index f95bd1b0fb965..0b61d80ea3f8c 100644 |
4659 | --- a/drivers/net/phy/micrel.c |
4660 | +++ b/drivers/net/phy/micrel.c |
4661 | @@ -1040,8 +1040,9 @@ static struct phy_driver ksphy_driver[] = { |
4662 | .get_sset_count = kszphy_get_sset_count, |
4663 | .get_strings = kszphy_get_strings, |
4664 | .get_stats = kszphy_get_stats, |
4665 | - .suspend = genphy_suspend, |
4666 | - .resume = genphy_resume, |
4667 | + /* No suspend/resume callbacks because of errata DS80000700A, |
4668 | + * receiver error following software power down. |
4669 | + */ |
4670 | }, { |
4671 | .phy_id = PHY_ID_KSZ8041RNLI, |
4672 | .phy_id_mask = MICREL_PHY_ID_MASK, |
4673 | diff --git a/drivers/net/phy/phylink.c b/drivers/net/phy/phylink.c |
4674 | index bf5bbb565cf5e..7be43a1eaefda 100644 |
4675 | --- a/drivers/net/phy/phylink.c |
4676 | +++ b/drivers/net/phy/phylink.c |
4677 | @@ -1331,7 +1331,7 @@ int phylink_ethtool_set_pauseparam(struct phylink *pl, |
4678 | return -EOPNOTSUPP; |
4679 | |
4680 | if (!phylink_test(pl->supported, Asym_Pause) && |
4681 | - !pause->autoneg && pause->rx_pause != pause->tx_pause) |
4682 | + pause->rx_pause != pause->tx_pause) |
4683 | return -EINVAL; |
4684 | |
4685 | config->pause &= ~(MLO_PAUSE_AN | MLO_PAUSE_TXRX_MASK); |
4686 | diff --git a/drivers/net/vmxnet3/vmxnet3_drv.c b/drivers/net/vmxnet3/vmxnet3_drv.c |
4687 | index a06e6ab453f50..cf090f88dac03 100644 |
4688 | --- a/drivers/net/vmxnet3/vmxnet3_drv.c |
4689 | +++ b/drivers/net/vmxnet3/vmxnet3_drv.c |
4690 | @@ -3634,7 +3634,6 @@ vmxnet3_suspend(struct device *device) |
4691 | vmxnet3_free_intr_resources(adapter); |
4692 | |
4693 | netif_device_detach(netdev); |
4694 | - netif_tx_stop_all_queues(netdev); |
4695 | |
4696 | /* Create wake-up filters. */ |
4697 | pmConf = adapter->pm_conf; |
4698 | diff --git a/drivers/net/vrf.c b/drivers/net/vrf.c |
4699 | index f08ed52d51f3f..f436b8c130611 100644 |
4700 | --- a/drivers/net/vrf.c |
4701 | +++ b/drivers/net/vrf.c |
4702 | @@ -33,6 +33,7 @@ |
4703 | #include <net/l3mdev.h> |
4704 | #include <net/fib_rules.h> |
4705 | #include <net/netns/generic.h> |
4706 | +#include <net/netfilter/nf_conntrack.h> |
4707 | |
4708 | #define DRV_NAME "vrf" |
4709 | #define DRV_VERSION "1.0" |
4710 | @@ -147,12 +148,26 @@ static int vrf_local_xmit(struct sk_buff *skb, struct net_device *dev, |
4711 | return NETDEV_TX_OK; |
4712 | } |
4713 | |
4714 | +static void vrf_nf_set_untracked(struct sk_buff *skb) |
4715 | +{ |
4716 | + if (skb_get_nfct(skb) == 0) |
4717 | + nf_ct_set(skb, NULL, IP_CT_UNTRACKED); |
4718 | +} |
4719 | + |
4720 | +static void vrf_nf_reset_ct(struct sk_buff *skb) |
4721 | +{ |
4722 | + if (skb_get_nfct(skb) == IP_CT_UNTRACKED) |
4723 | + nf_reset_ct(skb); |
4724 | +} |
4725 | + |
4726 | #if IS_ENABLED(CONFIG_IPV6) |
4727 | static int vrf_ip6_local_out(struct net *net, struct sock *sk, |
4728 | struct sk_buff *skb) |
4729 | { |
4730 | int err; |
4731 | |
4732 | + vrf_nf_reset_ct(skb); |
4733 | + |
4734 | err = nf_hook(NFPROTO_IPV6, NF_INET_LOCAL_OUT, net, |
4735 | sk, skb, NULL, skb_dst(skb)->dev, dst_output); |
4736 | |
4737 | @@ -232,6 +247,8 @@ static int vrf_ip_local_out(struct net *net, struct sock *sk, |
4738 | { |
4739 | int err; |
4740 | |
4741 | + vrf_nf_reset_ct(skb); |
4742 | + |
4743 | err = nf_hook(NFPROTO_IPV4, NF_INET_LOCAL_OUT, net, sk, |
4744 | skb, NULL, skb_dst(skb)->dev, dst_output); |
4745 | if (likely(err == 1)) |
4746 | @@ -351,8 +368,7 @@ static void vrf_finish_direct(struct sk_buff *skb) |
4747 | skb_pull(skb, ETH_HLEN); |
4748 | } |
4749 | |
4750 | - /* reset skb device */ |
4751 | - nf_reset_ct(skb); |
4752 | + vrf_nf_reset_ct(skb); |
4753 | } |
4754 | |
4755 | #if IS_ENABLED(CONFIG_IPV6) |
4756 | @@ -366,7 +382,7 @@ static int vrf_finish_output6(struct net *net, struct sock *sk, |
4757 | struct neighbour *neigh; |
4758 | int ret; |
4759 | |
4760 | - nf_reset_ct(skb); |
4761 | + vrf_nf_reset_ct(skb); |
4762 | |
4763 | skb->protocol = htons(ETH_P_IPV6); |
4764 | skb->dev = dev; |
4765 | @@ -477,6 +493,8 @@ static struct sk_buff *vrf_ip6_out_direct(struct net_device *vrf_dev, |
4766 | |
4767 | skb->dev = vrf_dev; |
4768 | |
4769 | + vrf_nf_set_untracked(skb); |
4770 | + |
4771 | err = nf_hook(NFPROTO_IPV6, NF_INET_LOCAL_OUT, net, sk, |
4772 | skb, NULL, vrf_dev, vrf_ip6_out_direct_finish); |
4773 | |
4774 | @@ -584,7 +602,7 @@ static int vrf_finish_output(struct net *net, struct sock *sk, struct sk_buff *s |
4775 | bool is_v6gw = false; |
4776 | int ret = -EINVAL; |
4777 | |
4778 | - nf_reset_ct(skb); |
4779 | + vrf_nf_reset_ct(skb); |
4780 | |
4781 | /* Be paranoid, rather than too clever. */ |
4782 | if (unlikely(skb_headroom(skb) < hh_len && dev->header_ops)) { |
4783 | @@ -712,6 +730,8 @@ static struct sk_buff *vrf_ip_out_direct(struct net_device *vrf_dev, |
4784 | |
4785 | skb->dev = vrf_dev; |
4786 | |
4787 | + vrf_nf_set_untracked(skb); |
4788 | + |
4789 | err = nf_hook(NFPROTO_IPV4, NF_INET_LOCAL_OUT, net, sk, |
4790 | skb, NULL, vrf_dev, vrf_ip_out_direct_finish); |
4791 | |
4792 | diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c |
4793 | index 20e248fd43642..3026eb54a7f23 100644 |
4794 | --- a/drivers/net/wireless/ath/ath10k/mac.c |
4795 | +++ b/drivers/net/wireless/ath/ath10k/mac.c |
4796 | @@ -985,8 +985,12 @@ static void ath10k_mac_vif_beacon_cleanup(struct ath10k_vif *arvif) |
4797 | ath10k_mac_vif_beacon_free(arvif); |
4798 | |
4799 | if (arvif->beacon_buf) { |
4800 | - dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN, |
4801 | - arvif->beacon_buf, arvif->beacon_paddr); |
4802 | + if (ar->bus_param.dev_type == ATH10K_DEV_TYPE_HL) |
4803 | + kfree(arvif->beacon_buf); |
4804 | + else |
4805 | + dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN, |
4806 | + arvif->beacon_buf, |
4807 | + arvif->beacon_paddr); |
4808 | arvif->beacon_buf = NULL; |
4809 | } |
4810 | } |
4811 | @@ -1040,7 +1044,7 @@ static int ath10k_monitor_vdev_start(struct ath10k *ar, int vdev_id) |
4812 | arg.channel.min_power = 0; |
4813 | arg.channel.max_power = channel->max_power * 2; |
4814 | arg.channel.max_reg_power = channel->max_reg_power * 2; |
4815 | - arg.channel.max_antenna_gain = channel->max_antenna_gain * 2; |
4816 | + arg.channel.max_antenna_gain = channel->max_antenna_gain; |
4817 | |
4818 | reinit_completion(&ar->vdev_setup_done); |
4819 | reinit_completion(&ar->vdev_delete_done); |
4820 | @@ -1486,7 +1490,7 @@ static int ath10k_vdev_start_restart(struct ath10k_vif *arvif, |
4821 | arg.channel.min_power = 0; |
4822 | arg.channel.max_power = chandef->chan->max_power * 2; |
4823 | arg.channel.max_reg_power = chandef->chan->max_reg_power * 2; |
4824 | - arg.channel.max_antenna_gain = chandef->chan->max_antenna_gain * 2; |
4825 | + arg.channel.max_antenna_gain = chandef->chan->max_antenna_gain; |
4826 | |
4827 | if (arvif->vdev_type == WMI_VDEV_TYPE_AP) { |
4828 | arg.ssid = arvif->u.ap.ssid; |
4829 | @@ -3145,7 +3149,7 @@ static int ath10k_update_channel_list(struct ath10k *ar) |
4830 | ch->min_power = 0; |
4831 | ch->max_power = channel->max_power * 2; |
4832 | ch->max_reg_power = channel->max_reg_power * 2; |
4833 | - ch->max_antenna_gain = channel->max_antenna_gain * 2; |
4834 | + ch->max_antenna_gain = channel->max_antenna_gain; |
4835 | ch->reg_class_id = 0; /* FIXME */ |
4836 | |
4837 | /* FIXME: why use only legacy modes, why not any |
4838 | @@ -5251,10 +5255,25 @@ static int ath10k_add_interface(struct ieee80211_hw *hw, |
4839 | if (vif->type == NL80211_IFTYPE_ADHOC || |
4840 | vif->type == NL80211_IFTYPE_MESH_POINT || |
4841 | vif->type == NL80211_IFTYPE_AP) { |
4842 | - arvif->beacon_buf = dma_alloc_coherent(ar->dev, |
4843 | - IEEE80211_MAX_FRAME_LEN, |
4844 | - &arvif->beacon_paddr, |
4845 | - GFP_ATOMIC); |
4846 | + if (ar->bus_param.dev_type == ATH10K_DEV_TYPE_HL) { |
4847 | + arvif->beacon_buf = kmalloc(IEEE80211_MAX_FRAME_LEN, |
4848 | + GFP_KERNEL); |
4849 | + |
4850 | + /* Using a kernel pointer in place of a dma_addr_t |
4851 | + * token can lead to undefined behavior if that |
4852 | + * makes it into cache management functions. Use a |
4853 | + * known-invalid address token instead, which |
4854 | + * avoids the warning and makes it easier to catch |
4855 | + * bugs if it does end up getting used. |
4856 | + */ |
4857 | + arvif->beacon_paddr = DMA_MAPPING_ERROR; |
4858 | + } else { |
4859 | + arvif->beacon_buf = |
4860 | + dma_alloc_coherent(ar->dev, |
4861 | + IEEE80211_MAX_FRAME_LEN, |
4862 | + &arvif->beacon_paddr, |
4863 | + GFP_ATOMIC); |
4864 | + } |
4865 | if (!arvif->beacon_buf) { |
4866 | ret = -ENOMEM; |
4867 | ath10k_warn(ar, "failed to allocate beacon buffer: %d\n", |
4868 | @@ -5469,8 +5488,12 @@ err_vdev_delete: |
4869 | |
4870 | err: |
4871 | if (arvif->beacon_buf) { |
4872 | - dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN, |
4873 | - arvif->beacon_buf, arvif->beacon_paddr); |
4874 | + if (ar->bus_param.dev_type == ATH10K_DEV_TYPE_HL) |
4875 | + kfree(arvif->beacon_buf); |
4876 | + else |
4877 | + dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN, |
4878 | + arvif->beacon_buf, |
4879 | + arvif->beacon_paddr); |
4880 | arvif->beacon_buf = NULL; |
4881 | } |
4882 | |
4883 | diff --git a/drivers/net/wireless/ath/ath10k/usb.c b/drivers/net/wireless/ath/ath10k/usb.c |
4884 | index 05c0d5e92475e..326e1dc4c6734 100644 |
4885 | --- a/drivers/net/wireless/ath/ath10k/usb.c |
4886 | +++ b/drivers/net/wireless/ath/ath10k/usb.c |
4887 | @@ -525,7 +525,7 @@ static int ath10k_usb_submit_ctrl_in(struct ath10k *ar, |
4888 | req, |
4889 | USB_DIR_IN | USB_TYPE_VENDOR | |
4890 | USB_RECIP_DEVICE, value, index, buf, |
4891 | - size, 2 * HZ); |
4892 | + size, 2000); |
4893 | |
4894 | if (ret < 0) { |
4895 | ath10k_warn(ar, "Failed to read usb control message: %d\n", |
4896 | @@ -865,6 +865,11 @@ static int ath10k_usb_setup_pipe_resources(struct ath10k *ar, |
4897 | le16_to_cpu(endpoint->wMaxPacketSize), |
4898 | endpoint->bInterval); |
4899 | } |
4900 | + |
4901 | + /* Ignore broken descriptors. */ |
4902 | + if (usb_endpoint_maxp(endpoint) == 0) |
4903 | + continue; |
4904 | + |
4905 | urbcount = 0; |
4906 | |
4907 | pipe_num = |
4908 | diff --git a/drivers/net/wireless/ath/ath10k/wmi.c b/drivers/net/wireless/ath/ath10k/wmi.c |
4909 | index 91604a14a8f46..796bd93c599b1 100644 |
4910 | --- a/drivers/net/wireless/ath/ath10k/wmi.c |
4911 | +++ b/drivers/net/wireless/ath/ath10k/wmi.c |
4912 | @@ -2541,6 +2541,10 @@ int ath10k_wmi_event_mgmt_rx(struct ath10k *ar, struct sk_buff *skb) |
4913 | if (ieee80211_is_beacon(hdr->frame_control)) |
4914 | ath10k_mac_handle_beacon(ar, skb); |
4915 | |
4916 | + if (ieee80211_is_beacon(hdr->frame_control) || |
4917 | + ieee80211_is_probe_resp(hdr->frame_control)) |
4918 | + status->boottime_ns = ktime_get_boottime_ns(); |
4919 | + |
4920 | ath10k_dbg(ar, ATH10K_DBG_MGMT, |
4921 | "event mgmt rx skb %pK len %d ftype %02x stype %02x\n", |
4922 | skb, skb->len, |
4923 | diff --git a/drivers/net/wireless/ath/ath10k/wmi.h b/drivers/net/wireless/ath/ath10k/wmi.h |
4924 | index 761bc4a7064df..de22396d085ce 100644 |
4925 | --- a/drivers/net/wireless/ath/ath10k/wmi.h |
4926 | +++ b/drivers/net/wireless/ath/ath10k/wmi.h |
4927 | @@ -2045,7 +2045,9 @@ struct wmi_channel { |
4928 | union { |
4929 | __le32 reginfo1; |
4930 | struct { |
4931 | + /* note: power unit is 1 dBm */ |
4932 | u8 antenna_max; |
4933 | + /* note: power unit is 0.5 dBm */ |
4934 | u8 max_tx_power; |
4935 | } __packed; |
4936 | } __packed; |
4937 | @@ -2065,6 +2067,7 @@ struct wmi_channel_arg { |
4938 | u32 min_power; |
4939 | u32 max_power; |
4940 | u32 max_reg_power; |
4941 | + /* note: power unit is 1 dBm */ |
4942 | u32 max_antenna_gain; |
4943 | u32 reg_class_id; |
4944 | enum wmi_phy_mode mode; |
4945 | diff --git a/drivers/net/wireless/ath/ath6kl/usb.c b/drivers/net/wireless/ath/ath6kl/usb.c |
4946 | index 53b66e9434c99..8b24964304b1f 100644 |
4947 | --- a/drivers/net/wireless/ath/ath6kl/usb.c |
4948 | +++ b/drivers/net/wireless/ath/ath6kl/usb.c |
4949 | @@ -340,6 +340,11 @@ static int ath6kl_usb_setup_pipe_resources(struct ath6kl_usb *ar_usb) |
4950 | le16_to_cpu(endpoint->wMaxPacketSize), |
4951 | endpoint->bInterval); |
4952 | } |
4953 | + |
4954 | + /* Ignore broken descriptors. */ |
4955 | + if (usb_endpoint_maxp(endpoint) == 0) |
4956 | + continue; |
4957 | + |
4958 | urbcount = 0; |
4959 | |
4960 | pipe_num = |
4961 | @@ -907,7 +912,7 @@ static int ath6kl_usb_submit_ctrl_in(struct ath6kl_usb *ar_usb, |
4962 | req, |
4963 | USB_DIR_IN | USB_TYPE_VENDOR | |
4964 | USB_RECIP_DEVICE, value, index, buf, |
4965 | - size, 2 * HZ); |
4966 | + size, 2000); |
4967 | |
4968 | if (ret < 0) { |
4969 | ath6kl_warn("Failed to read usb control message: %d\n", ret); |
4970 | diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c |
4971 | index 28ccdcb197de2..ec13bd8d5487d 100644 |
4972 | --- a/drivers/net/wireless/ath/ath9k/main.c |
4973 | +++ b/drivers/net/wireless/ath/ath9k/main.c |
4974 | @@ -530,8 +530,10 @@ irqreturn_t ath_isr(int irq, void *dev) |
4975 | ath9k_debug_sync_cause(sc, sync_cause); |
4976 | status &= ah->imask; /* discard unasked-for bits */ |
4977 | |
4978 | - if (test_bit(ATH_OP_HW_RESET, &common->op_flags)) |
4979 | + if (test_bit(ATH_OP_HW_RESET, &common->op_flags)) { |
4980 | + ath9k_hw_kill_interrupts(sc->sc_ah); |
4981 | return IRQ_HANDLED; |
4982 | + } |
4983 | |
4984 | /* |
4985 | * If there are no status bits set, then this interrupt was not |
4986 | diff --git a/drivers/net/wireless/ath/dfs_pattern_detector.c b/drivers/net/wireless/ath/dfs_pattern_detector.c |
4987 | index a274eb0d19688..a0ad6e48a35b4 100644 |
4988 | --- a/drivers/net/wireless/ath/dfs_pattern_detector.c |
4989 | +++ b/drivers/net/wireless/ath/dfs_pattern_detector.c |
4990 | @@ -182,10 +182,12 @@ static void channel_detector_exit(struct dfs_pattern_detector *dpd, |
4991 | if (cd == NULL) |
4992 | return; |
4993 | list_del(&cd->head); |
4994 | - for (i = 0; i < dpd->num_radar_types; i++) { |
4995 | - struct pri_detector *de = cd->detectors[i]; |
4996 | - if (de != NULL) |
4997 | - de->exit(de); |
4998 | + if (cd->detectors) { |
4999 | + for (i = 0; i < dpd->num_radar_types; i++) { |
5000 | + struct pri_detector *de = cd->detectors[i]; |
5001 | + if (de != NULL) |
5002 | + de->exit(de); |
5003 | + } |
5004 | } |
5005 | kfree(cd->detectors); |
5006 | kfree(cd); |
5007 | diff --git a/drivers/net/wireless/ath/wcn36xx/dxe.c b/drivers/net/wireless/ath/wcn36xx/dxe.c |
5008 | index bab30f7a443ce..4da25e84793b7 100644 |
5009 | --- a/drivers/net/wireless/ath/wcn36xx/dxe.c |
5010 | +++ b/drivers/net/wireless/ath/wcn36xx/dxe.c |
5011 | @@ -563,6 +563,10 @@ static int wcn36xx_rx_handle_packets(struct wcn36xx *wcn, |
5012 | dxe = ctl->desc; |
5013 | |
5014 | while (!(READ_ONCE(dxe->ctrl) & WCN36xx_DXE_CTRL_VLD)) { |
5015 | + /* do not read until we own DMA descriptor */ |
5016 | + dma_rmb(); |
5017 | + |
5018 | + /* read/modify DMA descriptor */ |
5019 | skb = ctl->skb; |
5020 | dma_addr = dxe->dst_addr_l; |
5021 | ret = wcn36xx_dxe_fill_skb(wcn->dev, ctl, GFP_ATOMIC); |
5022 | @@ -573,9 +577,15 @@ static int wcn36xx_rx_handle_packets(struct wcn36xx *wcn, |
5023 | dma_unmap_single(wcn->dev, dma_addr, WCN36XX_PKT_SIZE, |
5024 | DMA_FROM_DEVICE); |
5025 | wcn36xx_rx_skb(wcn, skb); |
5026 | - } /* else keep old skb not submitted and use it for rx DMA */ |
5027 | + } |
5028 | + /* else keep old skb not submitted and reuse it for rx DMA |
5029 | + * (dropping the packet that it contained) |
5030 | + */ |
5031 | |
5032 | + /* flush descriptor changes before re-marking as valid */ |
5033 | + dma_wmb(); |
5034 | dxe->ctrl = ctrl; |
5035 | + |
5036 | ctl = ctl->next; |
5037 | dxe = ctl->desc; |
5038 | } |
5039 | diff --git a/drivers/net/wireless/ath/wcn36xx/main.c b/drivers/net/wireless/ath/wcn36xx/main.c |
5040 | index 556ba3c6c5d8e..eb5d08bf25032 100644 |
5041 | --- a/drivers/net/wireless/ath/wcn36xx/main.c |
5042 | +++ b/drivers/net/wireless/ath/wcn36xx/main.c |
5043 | @@ -134,7 +134,9 @@ static struct ieee80211_supported_band wcn_band_2ghz = { |
5044 | .cap = IEEE80211_HT_CAP_GRN_FLD | |
5045 | IEEE80211_HT_CAP_SGI_20 | |
5046 | IEEE80211_HT_CAP_DSSSCCK40 | |
5047 | - IEEE80211_HT_CAP_LSIG_TXOP_PROT, |
5048 | + IEEE80211_HT_CAP_LSIG_TXOP_PROT | |
5049 | + IEEE80211_HT_CAP_SGI_40 | |
5050 | + IEEE80211_HT_CAP_SUP_WIDTH_20_40, |
5051 | .ht_supported = true, |
5052 | .ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K, |
5053 | .ampdu_density = IEEE80211_HT_MPDU_DENSITY_16, |
5054 | diff --git a/drivers/net/wireless/ath/wcn36xx/smd.c b/drivers/net/wireless/ath/wcn36xx/smd.c |
5055 | index 523550f94a3f0..a7532028bf9db 100644 |
5056 | --- a/drivers/net/wireless/ath/wcn36xx/smd.c |
5057 | +++ b/drivers/net/wireless/ath/wcn36xx/smd.c |
5058 | @@ -2340,30 +2340,52 @@ static int wcn36xx_smd_delete_sta_context_ind(struct wcn36xx *wcn, |
5059 | size_t len) |
5060 | { |
5061 | struct wcn36xx_hal_delete_sta_context_ind_msg *rsp = buf; |
5062 | - struct wcn36xx_vif *tmp; |
5063 | + struct wcn36xx_vif *vif_priv; |
5064 | + struct ieee80211_vif *vif; |
5065 | + struct ieee80211_bss_conf *bss_conf; |
5066 | struct ieee80211_sta *sta; |
5067 | + bool found = false; |
5068 | |
5069 | if (len != sizeof(*rsp)) { |
5070 | wcn36xx_warn("Corrupted delete sta indication\n"); |
5071 | return -EIO; |
5072 | } |
5073 | |
5074 | - wcn36xx_dbg(WCN36XX_DBG_HAL, "delete station indication %pM index %d\n", |
5075 | - rsp->addr2, rsp->sta_id); |
5076 | + wcn36xx_dbg(WCN36XX_DBG_HAL, |
5077 | + "delete station indication %pM index %d reason %d\n", |
5078 | + rsp->addr2, rsp->sta_id, rsp->reason_code); |
5079 | |
5080 | - list_for_each_entry(tmp, &wcn->vif_list, list) { |
5081 | + list_for_each_entry(vif_priv, &wcn->vif_list, list) { |
5082 | rcu_read_lock(); |
5083 | - sta = ieee80211_find_sta(wcn36xx_priv_to_vif(tmp), rsp->addr2); |
5084 | - if (sta) |
5085 | - ieee80211_report_low_ack(sta, 0); |
5086 | + vif = wcn36xx_priv_to_vif(vif_priv); |
5087 | + |
5088 | + if (vif->type == NL80211_IFTYPE_STATION) { |
5089 | + /* We could call ieee80211_find_sta too, but checking |
5090 | + * bss_conf is clearer. |
5091 | + */ |
5092 | + bss_conf = &vif->bss_conf; |
5093 | + if (vif_priv->sta_assoc && |
5094 | + !memcmp(bss_conf->bssid, rsp->addr2, ETH_ALEN)) { |
5095 | + found = true; |
5096 | + wcn36xx_dbg(WCN36XX_DBG_HAL, |
5097 | + "connection loss bss_index %d\n", |
5098 | + vif_priv->bss_index); |
5099 | + ieee80211_connection_loss(vif); |
5100 | + } |
5101 | + } else { |
5102 | + sta = ieee80211_find_sta(vif, rsp->addr2); |
5103 | + if (sta) { |
5104 | + found = true; |
5105 | + ieee80211_report_low_ack(sta, 0); |
5106 | + } |
5107 | + } |
5108 | + |
5109 | rcu_read_unlock(); |
5110 | - if (sta) |
5111 | + if (found) |
5112 | return 0; |
5113 | } |
5114 | |
5115 | - wcn36xx_warn("STA with addr %pM and index %d not found\n", |
5116 | - rsp->addr2, |
5117 | - rsp->sta_id); |
5118 | + wcn36xx_warn("BSS or STA with addr %pM not found\n", rsp->addr2); |
5119 | return -ENOENT; |
5120 | } |
5121 | |
5122 | diff --git a/drivers/net/wireless/broadcom/b43/phy_g.c b/drivers/net/wireless/broadcom/b43/phy_g.c |
5123 | index 1e022ec733a37..8b8fdb4965bde 100644 |
5124 | --- a/drivers/net/wireless/broadcom/b43/phy_g.c |
5125 | +++ b/drivers/net/wireless/broadcom/b43/phy_g.c |
5126 | @@ -2297,7 +2297,7 @@ static u8 b43_gphy_aci_scan(struct b43_wldev *dev) |
5127 | b43_phy_mask(dev, B43_PHY_G_CRS, 0x7FFF); |
5128 | b43_set_all_gains(dev, 3, 8, 1); |
5129 | |
5130 | - start = (channel - 5 > 0) ? channel - 5 : 1; |
5131 | + start = (channel > 5) ? channel - 5 : 1; |
5132 | end = (channel + 5 < 14) ? channel + 5 : 13; |
5133 | |
5134 | for (i = start; i <= end; i++) { |
5135 | diff --git a/drivers/net/wireless/broadcom/b43legacy/radio.c b/drivers/net/wireless/broadcom/b43legacy/radio.c |
5136 | index da40d1ca8723d..e4dce76a4481d 100644 |
5137 | --- a/drivers/net/wireless/broadcom/b43legacy/radio.c |
5138 | +++ b/drivers/net/wireless/broadcom/b43legacy/radio.c |
5139 | @@ -283,7 +283,7 @@ u8 b43legacy_radio_aci_scan(struct b43legacy_wldev *dev) |
5140 | & 0x7FFF); |
5141 | b43legacy_set_all_gains(dev, 3, 8, 1); |
5142 | |
5143 | - start = (channel - 5 > 0) ? channel - 5 : 1; |
5144 | + start = (channel > 5) ? channel - 5 : 1; |
5145 | end = (channel + 5 < 14) ? channel + 5 : 13; |
5146 | |
5147 | for (i = start; i <= end; i++) { |
5148 | diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/dmi.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/dmi.c |
5149 | index 6d5188b78f2de..0af452dca7664 100644 |
5150 | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/dmi.c |
5151 | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/dmi.c |
5152 | @@ -75,6 +75,16 @@ static const struct dmi_system_id dmi_platform_data[] = { |
5153 | }, |
5154 | .driver_data = (void *)&acepc_t8_data, |
5155 | }, |
5156 | + { |
5157 | + /* Cyberbook T116 rugged tablet */ |
5158 | + .matches = { |
5159 | + DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "Default string"), |
5160 | + DMI_EXACT_MATCH(DMI_BOARD_NAME, "Cherry Trail CR"), |
5161 | + DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "20170531"), |
5162 | + }, |
5163 | + /* The factory image nvram file is identical to the ACEPC T8 one */ |
5164 | + .driver_data = (void *)&acepc_t8_data, |
5165 | + }, |
5166 | { |
5167 | /* Match for the GPDwin which unfortunately uses somewhat |
5168 | * generic dmi strings, which is why we test for 4 strings. |
5169 | diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/utils.c b/drivers/net/wireless/intel/iwlwifi/mvm/utils.c |
5170 | index 8686107da1168..a637d7fb4b261 100644 |
5171 | --- a/drivers/net/wireless/intel/iwlwifi/mvm/utils.c |
5172 | +++ b/drivers/net/wireless/intel/iwlwifi/mvm/utils.c |
5173 | @@ -758,6 +758,9 @@ bool iwl_mvm_rx_diversity_allowed(struct iwl_mvm *mvm) |
5174 | |
5175 | lockdep_assert_held(&mvm->mutex); |
5176 | |
5177 | + if (iwlmvm_mod_params.power_scheme != IWL_POWER_SCHEME_CAM) |
5178 | + return false; |
5179 | + |
5180 | if (num_of_ant(iwl_mvm_get_valid_rx_ant(mvm)) == 1) |
5181 | return false; |
5182 | |
5183 | diff --git a/drivers/net/wireless/marvell/libertas/if_usb.c b/drivers/net/wireless/marvell/libertas/if_usb.c |
5184 | index 20436a289d5cd..5d6dc1dd050d4 100644 |
5185 | --- a/drivers/net/wireless/marvell/libertas/if_usb.c |
5186 | +++ b/drivers/net/wireless/marvell/libertas/if_usb.c |
5187 | @@ -292,6 +292,7 @@ err_add_card: |
5188 | if_usb_reset_device(cardp); |
5189 | dealloc: |
5190 | if_usb_free(cardp); |
5191 | + kfree(cardp); |
5192 | |
5193 | error: |
5194 | return r; |
5195 | @@ -316,6 +317,7 @@ static void if_usb_disconnect(struct usb_interface *intf) |
5196 | |
5197 | /* Unlink and free urb */ |
5198 | if_usb_free(cardp); |
5199 | + kfree(cardp); |
5200 | |
5201 | usb_set_intfdata(intf, NULL); |
5202 | usb_put_dev(interface_to_usbdev(intf)); |
5203 | diff --git a/drivers/net/wireless/marvell/libertas_tf/if_usb.c b/drivers/net/wireless/marvell/libertas_tf/if_usb.c |
5204 | index bedc092150884..b30bcb28503ae 100644 |
5205 | --- a/drivers/net/wireless/marvell/libertas_tf/if_usb.c |
5206 | +++ b/drivers/net/wireless/marvell/libertas_tf/if_usb.c |
5207 | @@ -230,6 +230,7 @@ static int if_usb_probe(struct usb_interface *intf, |
5208 | |
5209 | dealloc: |
5210 | if_usb_free(cardp); |
5211 | + kfree(cardp); |
5212 | error: |
5213 | lbtf_deb_leave(LBTF_DEB_MAIN); |
5214 | return -ENOMEM; |
5215 | @@ -254,6 +255,7 @@ static void if_usb_disconnect(struct usb_interface *intf) |
5216 | |
5217 | /* Unlink and free urb */ |
5218 | if_usb_free(cardp); |
5219 | + kfree(cardp); |
5220 | |
5221 | usb_set_intfdata(intf, NULL); |
5222 | usb_put_dev(interface_to_usbdev(intf)); |
5223 | diff --git a/drivers/net/wireless/marvell/mwifiex/11n.c b/drivers/net/wireless/marvell/mwifiex/11n.c |
5224 | index e435f801bc912..acbef9f1a83b6 100644 |
5225 | --- a/drivers/net/wireless/marvell/mwifiex/11n.c |
5226 | +++ b/drivers/net/wireless/marvell/mwifiex/11n.c |
5227 | @@ -657,14 +657,15 @@ int mwifiex_send_delba(struct mwifiex_private *priv, int tid, u8 *peer_mac, |
5228 | uint16_t del_ba_param_set; |
5229 | |
5230 | memset(&delba, 0, sizeof(delba)); |
5231 | - delba.del_ba_param_set = cpu_to_le16(tid << DELBA_TID_POS); |
5232 | |
5233 | - del_ba_param_set = le16_to_cpu(delba.del_ba_param_set); |
5234 | + del_ba_param_set = tid << DELBA_TID_POS; |
5235 | + |
5236 | if (initiator) |
5237 | del_ba_param_set |= IEEE80211_DELBA_PARAM_INITIATOR_MASK; |
5238 | else |
5239 | del_ba_param_set &= ~IEEE80211_DELBA_PARAM_INITIATOR_MASK; |
5240 | |
5241 | + delba.del_ba_param_set = cpu_to_le16(del_ba_param_set); |
5242 | memcpy(&delba.peer_mac_addr, peer_mac, ETH_ALEN); |
5243 | |
5244 | /* We don't wait for the response of this command */ |
5245 | diff --git a/drivers/net/wireless/marvell/mwifiex/cfg80211.c b/drivers/net/wireless/marvell/mwifiex/cfg80211.c |
5246 | index 9e6dc289ec3e8..1599ae74b066b 100644 |
5247 | --- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c |
5248 | +++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c |
5249 | @@ -912,16 +912,20 @@ mwifiex_init_new_priv_params(struct mwifiex_private *priv, |
5250 | switch (type) { |
5251 | case NL80211_IFTYPE_STATION: |
5252 | case NL80211_IFTYPE_ADHOC: |
5253 | - priv->bss_role = MWIFIEX_BSS_ROLE_STA; |
5254 | + priv->bss_role = MWIFIEX_BSS_ROLE_STA; |
5255 | + priv->bss_type = MWIFIEX_BSS_TYPE_STA; |
5256 | break; |
5257 | case NL80211_IFTYPE_P2P_CLIENT: |
5258 | - priv->bss_role = MWIFIEX_BSS_ROLE_STA; |
5259 | + priv->bss_role = MWIFIEX_BSS_ROLE_STA; |
5260 | + priv->bss_type = MWIFIEX_BSS_TYPE_P2P; |
5261 | break; |
5262 | case NL80211_IFTYPE_P2P_GO: |
5263 | - priv->bss_role = MWIFIEX_BSS_ROLE_UAP; |
5264 | + priv->bss_role = MWIFIEX_BSS_ROLE_UAP; |
5265 | + priv->bss_type = MWIFIEX_BSS_TYPE_P2P; |
5266 | break; |
5267 | case NL80211_IFTYPE_AP: |
5268 | priv->bss_role = MWIFIEX_BSS_ROLE_UAP; |
5269 | + priv->bss_type = MWIFIEX_BSS_TYPE_UAP; |
5270 | break; |
5271 | default: |
5272 | mwifiex_dbg(adapter, ERROR, |
5273 | @@ -1233,29 +1237,15 @@ mwifiex_cfg80211_change_virtual_intf(struct wiphy *wiphy, |
5274 | break; |
5275 | case NL80211_IFTYPE_P2P_CLIENT: |
5276 | case NL80211_IFTYPE_P2P_GO: |
5277 | + if (mwifiex_cfg80211_deinit_p2p(priv)) |
5278 | + return -EFAULT; |
5279 | + |
5280 | switch (type) { |
5281 | - case NL80211_IFTYPE_STATION: |
5282 | - if (mwifiex_cfg80211_deinit_p2p(priv)) |
5283 | - return -EFAULT; |
5284 | - priv->adapter->curr_iface_comb.p2p_intf--; |
5285 | - priv->adapter->curr_iface_comb.sta_intf++; |
5286 | - dev->ieee80211_ptr->iftype = type; |
5287 | - if (mwifiex_deinit_priv_params(priv)) |
5288 | - return -1; |
5289 | - if (mwifiex_init_new_priv_params(priv, dev, type)) |
5290 | - return -1; |
5291 | - if (mwifiex_sta_init_cmd(priv, false, false)) |
5292 | - return -1; |
5293 | - break; |
5294 | case NL80211_IFTYPE_ADHOC: |
5295 | - if (mwifiex_cfg80211_deinit_p2p(priv)) |
5296 | - return -EFAULT; |
5297 | + case NL80211_IFTYPE_STATION: |
5298 | return mwifiex_change_vif_to_sta_adhoc(dev, curr_iftype, |
5299 | type, params); |
5300 | - break; |
5301 | case NL80211_IFTYPE_AP: |
5302 | - if (mwifiex_cfg80211_deinit_p2p(priv)) |
5303 | - return -EFAULT; |
5304 | return mwifiex_change_vif_to_ap(dev, curr_iftype, type, |
5305 | params); |
5306 | case NL80211_IFTYPE_UNSPECIFIED: |
5307 | diff --git a/drivers/net/wireless/marvell/mwifiex/pcie.c b/drivers/net/wireless/marvell/mwifiex/pcie.c |
5308 | index bc46a0aa06eb7..b316e34917958 100644 |
5309 | --- a/drivers/net/wireless/marvell/mwifiex/pcie.c |
5310 | +++ b/drivers/net/wireless/marvell/mwifiex/pcie.c |
5311 | @@ -1326,6 +1326,14 @@ mwifiex_pcie_send_data(struct mwifiex_adapter *adapter, struct sk_buff *skb, |
5312 | ret = -1; |
5313 | goto done_unmap; |
5314 | } |
5315 | + |
5316 | + /* The firmware (latest version 15.68.19.p21) of the 88W8897 PCIe+USB card |
5317 | + * seems to crash randomly after setting the TX ring write pointer when |
5318 | + * ASPM powersaving is enabled. A workaround seems to be keeping the bus |
5319 | + * busy by reading a random register afterwards. |
5320 | + */ |
5321 | + mwifiex_read_reg(adapter, PCI_VENDOR_ID, &rx_val); |
5322 | + |
5323 | if ((mwifiex_pcie_txbd_not_full(card)) && |
5324 | tx_param->next_pkt_len) { |
5325 | /* have more packets and TxBD still can hold more */ |
5326 | diff --git a/drivers/net/wireless/marvell/mwifiex/usb.c b/drivers/net/wireless/marvell/mwifiex/usb.c |
5327 | index 528107d70c1cb..cb8a9ad40cfe9 100644 |
5328 | --- a/drivers/net/wireless/marvell/mwifiex/usb.c |
5329 | +++ b/drivers/net/wireless/marvell/mwifiex/usb.c |
5330 | @@ -505,6 +505,22 @@ static int mwifiex_usb_probe(struct usb_interface *intf, |
5331 | } |
5332 | } |
5333 | |
5334 | + switch (card->usb_boot_state) { |
5335 | + case USB8XXX_FW_DNLD: |
5336 | + /* Reject broken descriptors. */ |
5337 | + if (!card->rx_cmd_ep || !card->tx_cmd_ep) |
5338 | + return -ENODEV; |
5339 | + if (card->bulk_out_maxpktsize == 0) |
5340 | + return -ENODEV; |
5341 | + break; |
5342 | + case USB8XXX_FW_READY: |
5343 | + /* Assume the driver can handle missing endpoints for now. */ |
5344 | + break; |
5345 | + default: |
5346 | + WARN_ON(1); |
5347 | + return -ENODEV; |
5348 | + } |
5349 | + |
5350 | usb_set_intfdata(intf, card); |
5351 | |
5352 | ret = mwifiex_add_card(card, &card->fw_done, &usb_ops, |
5353 | diff --git a/drivers/net/wireless/marvell/mwl8k.c b/drivers/net/wireless/marvell/mwl8k.c |
5354 | index 1b76b24191866..14ac2384218df 100644 |
5355 | --- a/drivers/net/wireless/marvell/mwl8k.c |
5356 | +++ b/drivers/net/wireless/marvell/mwl8k.c |
5357 | @@ -5796,8 +5796,8 @@ static void mwl8k_fw_state_machine(const struct firmware *fw, void *context) |
5358 | fail: |
5359 | priv->fw_state = FW_STATE_ERROR; |
5360 | complete(&priv->firmware_loading_complete); |
5361 | - device_release_driver(&priv->pdev->dev); |
5362 | mwl8k_release_firmware(priv); |
5363 | + device_release_driver(&priv->pdev->dev); |
5364 | } |
5365 | |
5366 | #define MAX_RESTART_ATTEMPTS 1 |
5367 | diff --git a/drivers/net/wireless/mediatek/mt76/mt76x02_mac.c b/drivers/net/wireless/mediatek/mt76/mt76x02_mac.c |
5368 | index abacb4ea7179d..5c12cd7fce940 100644 |
5369 | --- a/drivers/net/wireless/mediatek/mt76/mt76x02_mac.c |
5370 | +++ b/drivers/net/wireless/mediatek/mt76/mt76x02_mac.c |
5371 | @@ -154,7 +154,7 @@ void mt76x02_mac_wcid_set_drop(struct mt76x02_dev *dev, u8 idx, bool drop) |
5372 | mt76_wr(dev, MT_WCID_DROP(idx), (val & ~bit) | (bit * drop)); |
5373 | } |
5374 | |
5375 | -static __le16 |
5376 | +static u16 |
5377 | mt76x02_mac_tx_rate_val(struct mt76x02_dev *dev, |
5378 | const struct ieee80211_tx_rate *rate, u8 *nss_val) |
5379 | { |
5380 | @@ -200,14 +200,14 @@ mt76x02_mac_tx_rate_val(struct mt76x02_dev *dev, |
5381 | rateval |= MT_RXWI_RATE_SGI; |
5382 | |
5383 | *nss_val = nss; |
5384 | - return cpu_to_le16(rateval); |
5385 | + return rateval; |
5386 | } |
5387 | |
5388 | void mt76x02_mac_wcid_set_rate(struct mt76x02_dev *dev, struct mt76_wcid *wcid, |
5389 | const struct ieee80211_tx_rate *rate) |
5390 | { |
5391 | s8 max_txpwr_adj = mt76x02_tx_get_max_txpwr_adj(dev, rate); |
5392 | - __le16 rateval; |
5393 | + u16 rateval; |
5394 | u32 tx_info; |
5395 | s8 nss; |
5396 | |
5397 | @@ -320,7 +320,7 @@ void mt76x02_mac_write_txwi(struct mt76x02_dev *dev, struct mt76x02_txwi *txwi, |
5398 | struct ieee80211_key_conf *key = info->control.hw_key; |
5399 | u32 wcid_tx_info; |
5400 | u16 rate_ht_mask = FIELD_PREP(MT_RXWI_RATE_PHY, BIT(1) | BIT(2)); |
5401 | - u16 txwi_flags = 0; |
5402 | + u16 txwi_flags = 0, rateval; |
5403 | u8 nss; |
5404 | s8 txpwr_adj, max_txpwr_adj; |
5405 | u8 ccmp_pn[8], nstreams = dev->mt76.chainmask & 0xf; |
5406 | @@ -356,14 +356,15 @@ void mt76x02_mac_write_txwi(struct mt76x02_dev *dev, struct mt76x02_txwi *txwi, |
5407 | |
5408 | if (wcid && (rate->idx < 0 || !rate->count)) { |
5409 | wcid_tx_info = wcid->tx_info; |
5410 | - txwi->rate = FIELD_GET(MT_WCID_TX_INFO_RATE, wcid_tx_info); |
5411 | + rateval = FIELD_GET(MT_WCID_TX_INFO_RATE, wcid_tx_info); |
5412 | max_txpwr_adj = FIELD_GET(MT_WCID_TX_INFO_TXPWR_ADJ, |
5413 | wcid_tx_info); |
5414 | nss = FIELD_GET(MT_WCID_TX_INFO_NSS, wcid_tx_info); |
5415 | } else { |
5416 | - txwi->rate = mt76x02_mac_tx_rate_val(dev, rate, &nss); |
5417 | + rateval = mt76x02_mac_tx_rate_val(dev, rate, &nss); |
5418 | max_txpwr_adj = mt76x02_tx_get_max_txpwr_adj(dev, rate); |
5419 | } |
5420 | + txwi->rate = cpu_to_le16(rateval); |
5421 | |
5422 | txpwr_adj = mt76x02_tx_get_txpwr_adj(dev, dev->mt76.txpower_conf, |
5423 | max_txpwr_adj); |
5424 | diff --git a/drivers/net/wireless/realtek/rtl818x/rtl8187/rtl8225.c b/drivers/net/wireless/realtek/rtl818x/rtl8187/rtl8225.c |
5425 | index b2616d61b66d8..843e3f41a2bc3 100644 |
5426 | --- a/drivers/net/wireless/realtek/rtl818x/rtl8187/rtl8225.c |
5427 | +++ b/drivers/net/wireless/realtek/rtl818x/rtl8187/rtl8225.c |
5428 | @@ -28,7 +28,7 @@ u8 rtl818x_ioread8_idx(struct rtl8187_priv *priv, |
5429 | usb_control_msg(priv->udev, usb_rcvctrlpipe(priv->udev, 0), |
5430 | RTL8187_REQ_GET_REG, RTL8187_REQT_READ, |
5431 | (unsigned long)addr, idx & 0x03, |
5432 | - &priv->io_dmabuf->bits8, sizeof(val), HZ / 2); |
5433 | + &priv->io_dmabuf->bits8, sizeof(val), 500); |
5434 | |
5435 | val = priv->io_dmabuf->bits8; |
5436 | mutex_unlock(&priv->io_mutex); |
5437 | @@ -45,7 +45,7 @@ u16 rtl818x_ioread16_idx(struct rtl8187_priv *priv, |
5438 | usb_control_msg(priv->udev, usb_rcvctrlpipe(priv->udev, 0), |
5439 | RTL8187_REQ_GET_REG, RTL8187_REQT_READ, |
5440 | (unsigned long)addr, idx & 0x03, |
5441 | - &priv->io_dmabuf->bits16, sizeof(val), HZ / 2); |
5442 | + &priv->io_dmabuf->bits16, sizeof(val), 500); |
5443 | |
5444 | val = priv->io_dmabuf->bits16; |
5445 | mutex_unlock(&priv->io_mutex); |
5446 | @@ -62,7 +62,7 @@ u32 rtl818x_ioread32_idx(struct rtl8187_priv *priv, |
5447 | usb_control_msg(priv->udev, usb_rcvctrlpipe(priv->udev, 0), |
5448 | RTL8187_REQ_GET_REG, RTL8187_REQT_READ, |
5449 | (unsigned long)addr, idx & 0x03, |
5450 | - &priv->io_dmabuf->bits32, sizeof(val), HZ / 2); |
5451 | + &priv->io_dmabuf->bits32, sizeof(val), 500); |
5452 | |
5453 | val = priv->io_dmabuf->bits32; |
5454 | mutex_unlock(&priv->io_mutex); |
5455 | @@ -79,7 +79,7 @@ void rtl818x_iowrite8_idx(struct rtl8187_priv *priv, |
5456 | usb_control_msg(priv->udev, usb_sndctrlpipe(priv->udev, 0), |
5457 | RTL8187_REQ_SET_REG, RTL8187_REQT_WRITE, |
5458 | (unsigned long)addr, idx & 0x03, |
5459 | - &priv->io_dmabuf->bits8, sizeof(val), HZ / 2); |
5460 | + &priv->io_dmabuf->bits8, sizeof(val), 500); |
5461 | |
5462 | mutex_unlock(&priv->io_mutex); |
5463 | } |
5464 | @@ -93,7 +93,7 @@ void rtl818x_iowrite16_idx(struct rtl8187_priv *priv, |
5465 | usb_control_msg(priv->udev, usb_sndctrlpipe(priv->udev, 0), |
5466 | RTL8187_REQ_SET_REG, RTL8187_REQT_WRITE, |
5467 | (unsigned long)addr, idx & 0x03, |
5468 | - &priv->io_dmabuf->bits16, sizeof(val), HZ / 2); |
5469 | + &priv->io_dmabuf->bits16, sizeof(val), 500); |
5470 | |
5471 | mutex_unlock(&priv->io_mutex); |
5472 | } |
5473 | @@ -107,7 +107,7 @@ void rtl818x_iowrite32_idx(struct rtl8187_priv *priv, |
5474 | usb_control_msg(priv->udev, usb_sndctrlpipe(priv->udev, 0), |
5475 | RTL8187_REQ_SET_REG, RTL8187_REQT_WRITE, |
5476 | (unsigned long)addr, idx & 0x03, |
5477 | - &priv->io_dmabuf->bits32, sizeof(val), HZ / 2); |
5478 | + &priv->io_dmabuf->bits32, sizeof(val), 500); |
5479 | |
5480 | mutex_unlock(&priv->io_mutex); |
5481 | } |
5482 | @@ -183,7 +183,7 @@ static void rtl8225_write_8051(struct ieee80211_hw *dev, u8 addr, __le16 data) |
5483 | usb_control_msg(priv->udev, usb_sndctrlpipe(priv->udev, 0), |
5484 | RTL8187_REQ_SET_REG, RTL8187_REQT_WRITE, |
5485 | addr, 0x8225, &priv->io_dmabuf->bits16, sizeof(data), |
5486 | - HZ / 2); |
5487 | + 500); |
5488 | |
5489 | mutex_unlock(&priv->io_mutex); |
5490 | |
5491 | diff --git a/drivers/net/wireless/rsi/rsi_91x_core.c b/drivers/net/wireless/rsi/rsi_91x_core.c |
5492 | index 3644d7d994638..c6c29034b2ead 100644 |
5493 | --- a/drivers/net/wireless/rsi/rsi_91x_core.c |
5494 | +++ b/drivers/net/wireless/rsi/rsi_91x_core.c |
5495 | @@ -400,6 +400,8 @@ void rsi_core_xmit(struct rsi_common *common, struct sk_buff *skb) |
5496 | |
5497 | info = IEEE80211_SKB_CB(skb); |
5498 | tx_params = (struct skb_info *)info->driver_data; |
5499 | + /* info->driver_data and info->control part of union so make copy */ |
5500 | + tx_params->have_key = !!info->control.hw_key; |
5501 | wh = (struct ieee80211_hdr *)&skb->data[0]; |
5502 | tx_params->sta_id = 0; |
5503 | |
5504 | diff --git a/drivers/net/wireless/rsi/rsi_91x_hal.c b/drivers/net/wireless/rsi/rsi_91x_hal.c |
5505 | index 5e6c5d13319d5..7d0b44fd56901 100644 |
5506 | --- a/drivers/net/wireless/rsi/rsi_91x_hal.c |
5507 | +++ b/drivers/net/wireless/rsi/rsi_91x_hal.c |
5508 | @@ -203,7 +203,7 @@ int rsi_prepare_data_desc(struct rsi_common *common, struct sk_buff *skb) |
5509 | wh->frame_control |= cpu_to_le16(RSI_SET_PS_ENABLE); |
5510 | |
5511 | if ((!(info->flags & IEEE80211_TX_INTFL_DONT_ENCRYPT)) && |
5512 | - info->control.hw_key) { |
5513 | + tx_params->have_key) { |
5514 | if (rsi_is_cipher_wep(common)) |
5515 | ieee80211_size += 4; |
5516 | else |
5517 | @@ -214,15 +214,17 @@ int rsi_prepare_data_desc(struct rsi_common *common, struct sk_buff *skb) |
5518 | RSI_WIFI_DATA_Q); |
5519 | data_desc->header_len = ieee80211_size; |
5520 | |
5521 | - if (common->min_rate != RSI_RATE_AUTO) { |
5522 | + if (common->rate_config[common->band].fixed_enabled) { |
5523 | /* Send fixed rate */ |
5524 | + u16 fixed_rate = common->rate_config[common->band].fixed_hw_rate; |
5525 | + |
5526 | data_desc->frame_info = cpu_to_le16(RATE_INFO_ENABLE); |
5527 | - data_desc->rate_info = cpu_to_le16(common->min_rate); |
5528 | + data_desc->rate_info = cpu_to_le16(fixed_rate); |
5529 | |
5530 | if (conf_is_ht40(&common->priv->hw->conf)) |
5531 | data_desc->bbp_info = cpu_to_le16(FULL40M_ENABLE); |
5532 | |
5533 | - if ((common->vif_info[0].sgi) && (common->min_rate & 0x100)) { |
5534 | + if (common->vif_info[0].sgi && (fixed_rate & 0x100)) { |
5535 | /* Only MCS rates */ |
5536 | data_desc->rate_info |= |
5537 | cpu_to_le16(ENABLE_SHORTGI_RATE); |
5538 | diff --git a/drivers/net/wireless/rsi/rsi_91x_mac80211.c b/drivers/net/wireless/rsi/rsi_91x_mac80211.c |
5539 | index ca1e609f637e4..1279339a4b59b 100644 |
5540 | --- a/drivers/net/wireless/rsi/rsi_91x_mac80211.c |
5541 | +++ b/drivers/net/wireless/rsi/rsi_91x_mac80211.c |
5542 | @@ -510,7 +510,6 @@ static int rsi_mac80211_add_interface(struct ieee80211_hw *hw, |
5543 | if ((vif->type == NL80211_IFTYPE_AP) || |
5544 | (vif->type == NL80211_IFTYPE_P2P_GO)) { |
5545 | rsi_send_rx_filter_frame(common, DISALLOW_BEACONS); |
5546 | - common->min_rate = RSI_RATE_AUTO; |
5547 | for (i = 0; i < common->max_stations; i++) |
5548 | common->stations[i].sta = NULL; |
5549 | } |
5550 | @@ -1211,20 +1210,32 @@ static int rsi_mac80211_set_rate_mask(struct ieee80211_hw *hw, |
5551 | struct ieee80211_vif *vif, |
5552 | const struct cfg80211_bitrate_mask *mask) |
5553 | { |
5554 | + const unsigned int mcs_offset = ARRAY_SIZE(rsi_rates); |
5555 | struct rsi_hw *adapter = hw->priv; |
5556 | struct rsi_common *common = adapter->priv; |
5557 | - enum nl80211_band band = hw->conf.chandef.chan->band; |
5558 | + int i; |
5559 | |
5560 | mutex_lock(&common->mutex); |
5561 | - common->fixedrate_mask[band] = 0; |
5562 | |
5563 | - if (mask->control[band].legacy == 0xfff) { |
5564 | - common->fixedrate_mask[band] = |
5565 | - (mask->control[band].ht_mcs[0] << 12); |
5566 | - } else { |
5567 | - common->fixedrate_mask[band] = |
5568 | - mask->control[band].legacy; |
5569 | + for (i = 0; i < ARRAY_SIZE(common->rate_config); i++) { |
5570 | + struct rsi_rate_config *cfg = &common->rate_config[i]; |
5571 | + u32 bm; |
5572 | + |
5573 | + bm = mask->control[i].legacy | (mask->control[i].ht_mcs[0] << mcs_offset); |
5574 | + if (hweight32(bm) == 1) { /* single rate */ |
5575 | + int rate_index = ffs(bm) - 1; |
5576 | + |
5577 | + if (rate_index < mcs_offset) |
5578 | + cfg->fixed_hw_rate = rsi_rates[rate_index].hw_value; |
5579 | + else |
5580 | + cfg->fixed_hw_rate = rsi_mcsrates[rate_index - mcs_offset]; |
5581 | + cfg->fixed_enabled = true; |
5582 | + } else { |
5583 | + cfg->configured_mask = bm; |
5584 | + cfg->fixed_enabled = false; |
5585 | + } |
5586 | } |
5587 | + |
5588 | mutex_unlock(&common->mutex); |
5589 | |
5590 | return 0; |
5591 | @@ -1360,46 +1371,6 @@ void rsi_indicate_pkt_to_os(struct rsi_common *common, |
5592 | ieee80211_rx_irqsafe(hw, skb); |
5593 | } |
5594 | |
5595 | -static void rsi_set_min_rate(struct ieee80211_hw *hw, |
5596 | - struct ieee80211_sta *sta, |
5597 | - struct rsi_common *common) |
5598 | -{ |
5599 | - u8 band = hw->conf.chandef.chan->band; |
5600 | - u8 ii; |
5601 | - u32 rate_bitmap; |
5602 | - bool matched = false; |
5603 | - |
5604 | - common->bitrate_mask[band] = sta->supp_rates[band]; |
5605 | - |
5606 | - rate_bitmap = (common->fixedrate_mask[band] & sta->supp_rates[band]); |
5607 | - |
5608 | - if (rate_bitmap & 0xfff) { |
5609 | - /* Find out the min rate */ |
5610 | - for (ii = 0; ii < ARRAY_SIZE(rsi_rates); ii++) { |
5611 | - if (rate_bitmap & BIT(ii)) { |
5612 | - common->min_rate = rsi_rates[ii].hw_value; |
5613 | - matched = true; |
5614 | - break; |
5615 | - } |
5616 | - } |
5617 | - } |
5618 | - |
5619 | - common->vif_info[0].is_ht = sta->ht_cap.ht_supported; |
5620 | - |
5621 | - if ((common->vif_info[0].is_ht) && (rate_bitmap >> 12)) { |
5622 | - for (ii = 0; ii < ARRAY_SIZE(rsi_mcsrates); ii++) { |
5623 | - if ((rate_bitmap >> 12) & BIT(ii)) { |
5624 | - common->min_rate = rsi_mcsrates[ii]; |
5625 | - matched = true; |
5626 | - break; |
5627 | - } |
5628 | - } |
5629 | - } |
5630 | - |
5631 | - if (!matched) |
5632 | - common->min_rate = 0xffff; |
5633 | -} |
5634 | - |
5635 | /** |
5636 | * rsi_mac80211_sta_add() - This function notifies driver about a peer getting |
5637 | * connected. |
5638 | @@ -1498,9 +1469,9 @@ static int rsi_mac80211_sta_add(struct ieee80211_hw *hw, |
5639 | |
5640 | if ((vif->type == NL80211_IFTYPE_STATION) || |
5641 | (vif->type == NL80211_IFTYPE_P2P_CLIENT)) { |
5642 | - rsi_set_min_rate(hw, sta, common); |
5643 | + common->bitrate_mask[common->band] = sta->supp_rates[common->band]; |
5644 | + common->vif_info[0].is_ht = sta->ht_cap.ht_supported; |
5645 | if (sta->ht_cap.ht_supported) { |
5646 | - common->vif_info[0].is_ht = true; |
5647 | common->bitrate_mask[NL80211_BAND_2GHZ] = |
5648 | sta->supp_rates[NL80211_BAND_2GHZ]; |
5649 | if ((sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) || |
5650 | @@ -1574,7 +1545,6 @@ static int rsi_mac80211_sta_remove(struct ieee80211_hw *hw, |
5651 | bss->qos = sta->wme; |
5652 | common->bitrate_mask[NL80211_BAND_2GHZ] = 0; |
5653 | common->bitrate_mask[NL80211_BAND_5GHZ] = 0; |
5654 | - common->min_rate = 0xffff; |
5655 | common->vif_info[0].is_ht = false; |
5656 | common->vif_info[0].sgi = false; |
5657 | common->vif_info[0].seq_start = 0; |
5658 | diff --git a/drivers/net/wireless/rsi/rsi_91x_main.c b/drivers/net/wireless/rsi/rsi_91x_main.c |
5659 | index 29d83049c5f56..441fda71f6289 100644 |
5660 | --- a/drivers/net/wireless/rsi/rsi_91x_main.c |
5661 | +++ b/drivers/net/wireless/rsi/rsi_91x_main.c |
5662 | @@ -210,9 +210,10 @@ int rsi_read_pkt(struct rsi_common *common, u8 *rx_pkt, s32 rcv_pkt_len) |
5663 | bt_pkt_type = frame_desc[offset + BT_RX_PKT_TYPE_OFST]; |
5664 | if (bt_pkt_type == BT_CARD_READY_IND) { |
5665 | rsi_dbg(INFO_ZONE, "BT Card ready recvd\n"); |
5666 | - if (rsi_bt_ops.attach(common, &g_proto_ops)) |
5667 | - rsi_dbg(ERR_ZONE, |
5668 | - "Failed to attach BT module\n"); |
5669 | + if (common->fsm_state == FSM_MAC_INIT_DONE) |
5670 | + rsi_attach_bt(common); |
5671 | + else |
5672 | + common->bt_defer_attach = true; |
5673 | } else { |
5674 | if (common->bt_adapter) |
5675 | rsi_bt_ops.recv_pkt(common->bt_adapter, |
5676 | @@ -277,6 +278,15 @@ void rsi_set_bt_context(void *priv, void *bt_context) |
5677 | } |
5678 | #endif |
5679 | |
5680 | +void rsi_attach_bt(struct rsi_common *common) |
5681 | +{ |
5682 | +#ifdef CONFIG_RSI_COEX |
5683 | + if (rsi_bt_ops.attach(common, &g_proto_ops)) |
5684 | + rsi_dbg(ERR_ZONE, |
5685 | + "Failed to attach BT module\n"); |
5686 | +#endif |
5687 | +} |
5688 | + |
5689 | /** |
5690 | * rsi_91x_init() - This function initializes os interface operations. |
5691 | * @void: Void. |
5692 | @@ -358,6 +368,7 @@ struct rsi_hw *rsi_91x_init(u16 oper_mode) |
5693 | if (common->coex_mode > 1) { |
5694 | if (rsi_coex_attach(common)) { |
5695 | rsi_dbg(ERR_ZONE, "Failed to init coex module\n"); |
5696 | + rsi_kill_thread(&common->tx_thread); |
5697 | goto err; |
5698 | } |
5699 | } |
5700 | diff --git a/drivers/net/wireless/rsi/rsi_91x_mgmt.c b/drivers/net/wireless/rsi/rsi_91x_mgmt.c |
5701 | index ed67f65986775..0c0e4c08be8aa 100644 |
5702 | --- a/drivers/net/wireless/rsi/rsi_91x_mgmt.c |
5703 | +++ b/drivers/net/wireless/rsi/rsi_91x_mgmt.c |
5704 | @@ -276,7 +276,7 @@ static void rsi_set_default_parameters(struct rsi_common *common) |
5705 | common->channel_width = BW_20MHZ; |
5706 | common->rts_threshold = IEEE80211_MAX_RTS_THRESHOLD; |
5707 | common->channel = 1; |
5708 | - common->min_rate = 0xffff; |
5709 | + memset(&common->rate_config, 0, sizeof(common->rate_config)); |
5710 | common->fsm_state = FSM_CARD_NOT_READY; |
5711 | common->iface_down = true; |
5712 | common->endpoint = EP_2GHZ_20MHZ; |
5713 | @@ -1304,7 +1304,7 @@ static int rsi_send_auto_rate_request(struct rsi_common *common, |
5714 | u8 band = hw->conf.chandef.chan->band; |
5715 | u8 num_supported_rates = 0; |
5716 | u8 rate_table_offset, rate_offset = 0; |
5717 | - u32 rate_bitmap; |
5718 | + u32 rate_bitmap, configured_rates; |
5719 | u16 *selected_rates, min_rate; |
5720 | bool is_ht = false, is_sgi = false; |
5721 | u16 frame_len = sizeof(struct rsi_auto_rate); |
5722 | @@ -1354,6 +1354,10 @@ static int rsi_send_auto_rate_request(struct rsi_common *common, |
5723 | is_sgi = true; |
5724 | } |
5725 | |
5726 | + /* Limit to any rates administratively configured by cfg80211 */ |
5727 | + configured_rates = common->rate_config[band].configured_mask ?: 0xffffffff; |
5728 | + rate_bitmap &= configured_rates; |
5729 | + |
5730 | if (band == NL80211_BAND_2GHZ) { |
5731 | if ((rate_bitmap == 0) && (is_ht)) |
5732 | min_rate = RSI_RATE_MCS0; |
5733 | @@ -1379,10 +1383,13 @@ static int rsi_send_auto_rate_request(struct rsi_common *common, |
5734 | num_supported_rates = jj; |
5735 | |
5736 | if (is_ht) { |
5737 | - for (ii = 0; ii < ARRAY_SIZE(mcs); ii++) |
5738 | - selected_rates[jj++] = mcs[ii]; |
5739 | - num_supported_rates += ARRAY_SIZE(mcs); |
5740 | - rate_offset += ARRAY_SIZE(mcs); |
5741 | + for (ii = 0; ii < ARRAY_SIZE(mcs); ii++) { |
5742 | + if (configured_rates & BIT(ii + ARRAY_SIZE(rsi_rates))) { |
5743 | + selected_rates[jj++] = mcs[ii]; |
5744 | + num_supported_rates++; |
5745 | + rate_offset++; |
5746 | + } |
5747 | + } |
5748 | } |
5749 | |
5750 | sort(selected_rates, jj, sizeof(u16), &rsi_compare, NULL); |
5751 | @@ -1467,7 +1474,7 @@ void rsi_inform_bss_status(struct rsi_common *common, |
5752 | qos_enable, |
5753 | aid, sta_id, |
5754 | vif); |
5755 | - if (common->min_rate == 0xffff) |
5756 | + if (!common->rate_config[common->band].fixed_enabled) |
5757 | rsi_send_auto_rate_request(common, sta, sta_id, vif); |
5758 | if (opmode == RSI_OPMODE_STA && |
5759 | !(assoc_cap & WLAN_CAPABILITY_PRIVACY) && |
5760 | @@ -2056,6 +2063,9 @@ static int rsi_handle_ta_confirm_type(struct rsi_common *common, |
5761 | if (common->reinit_hw) { |
5762 | complete(&common->wlan_init_completion); |
5763 | } else { |
5764 | + if (common->bt_defer_attach) |
5765 | + rsi_attach_bt(common); |
5766 | + |
5767 | return rsi_mac80211_attach(common); |
5768 | } |
5769 | } |
5770 | diff --git a/drivers/net/wireless/rsi/rsi_91x_sdio.c b/drivers/net/wireless/rsi/rsi_91x_sdio.c |
5771 | index d51ec7104fb7c..4fe837090cdae 100644 |
5772 | --- a/drivers/net/wireless/rsi/rsi_91x_sdio.c |
5773 | +++ b/drivers/net/wireless/rsi/rsi_91x_sdio.c |
5774 | @@ -24,10 +24,7 @@ |
5775 | /* Default operating mode is wlan STA + BT */ |
5776 | static u16 dev_oper_mode = DEV_OPMODE_STA_BT_DUAL; |
5777 | module_param(dev_oper_mode, ushort, 0444); |
5778 | -MODULE_PARM_DESC(dev_oper_mode, |
5779 | - "1[Wi-Fi], 4[BT], 8[BT LE], 5[Wi-Fi STA + BT classic]\n" |
5780 | - "9[Wi-Fi STA + BT LE], 13[Wi-Fi STA + BT classic + BT LE]\n" |
5781 | - "6[AP + BT classic], 14[AP + BT classic + BT LE]"); |
5782 | +MODULE_PARM_DESC(dev_oper_mode, DEV_OPMODE_PARAM_DESC); |
5783 | |
5784 | /** |
5785 | * rsi_sdio_set_cmd52_arg() - This function prepares cmd 52 read/write arg. |
5786 | diff --git a/drivers/net/wireless/rsi/rsi_91x_usb.c b/drivers/net/wireless/rsi/rsi_91x_usb.c |
5787 | index 1e5a2a0cc6700..68ce3d2bc5357 100644 |
5788 | --- a/drivers/net/wireless/rsi/rsi_91x_usb.c |
5789 | +++ b/drivers/net/wireless/rsi/rsi_91x_usb.c |
5790 | @@ -25,10 +25,7 @@ |
5791 | /* Default operating mode is wlan STA + BT */ |
5792 | static u16 dev_oper_mode = DEV_OPMODE_STA_BT_DUAL; |
5793 | module_param(dev_oper_mode, ushort, 0444); |
5794 | -MODULE_PARM_DESC(dev_oper_mode, |
5795 | - "1[Wi-Fi], 4[BT], 8[BT LE], 5[Wi-Fi STA + BT classic]\n" |
5796 | - "9[Wi-Fi STA + BT LE], 13[Wi-Fi STA + BT classic + BT LE]\n" |
5797 | - "6[AP + BT classic], 14[AP + BT classic + BT LE]"); |
5798 | +MODULE_PARM_DESC(dev_oper_mode, DEV_OPMODE_PARAM_DESC); |
5799 | |
5800 | static int rsi_rx_urb_submit(struct rsi_hw *adapter, u8 ep_num, gfp_t flags); |
5801 | |
5802 | diff --git a/drivers/net/wireless/rsi/rsi_hal.h b/drivers/net/wireless/rsi/rsi_hal.h |
5803 | index 46e36df9e8e3c..a2fbec1cec4c3 100644 |
5804 | --- a/drivers/net/wireless/rsi/rsi_hal.h |
5805 | +++ b/drivers/net/wireless/rsi/rsi_hal.h |
5806 | @@ -28,6 +28,17 @@ |
5807 | #define DEV_OPMODE_AP_BT 6 |
5808 | #define DEV_OPMODE_AP_BT_DUAL 14 |
5809 | |
5810 | +#define DEV_OPMODE_PARAM_DESC \ |
5811 | + __stringify(DEV_OPMODE_WIFI_ALONE) "[Wi-Fi alone], " \ |
5812 | + __stringify(DEV_OPMODE_BT_ALONE) "[BT classic alone], " \ |
5813 | + __stringify(DEV_OPMODE_BT_LE_ALONE) "[BT LE alone], " \ |
5814 | + __stringify(DEV_OPMODE_BT_DUAL) "[BT classic + BT LE alone], " \ |
5815 | + __stringify(DEV_OPMODE_STA_BT) "[Wi-Fi STA + BT classic], " \ |
5816 | + __stringify(DEV_OPMODE_STA_BT_LE) "[Wi-Fi STA + BT LE], " \ |
5817 | + __stringify(DEV_OPMODE_STA_BT_DUAL) "[Wi-Fi STA + BT classic + BT LE], " \ |
5818 | + __stringify(DEV_OPMODE_AP_BT) "[Wi-Fi AP + BT classic], " \ |
5819 | + __stringify(DEV_OPMODE_AP_BT_DUAL) "[Wi-Fi AP + BT classic + BT LE]" |
5820 | + |
5821 | #define FLASH_WRITE_CHUNK_SIZE (4 * 1024) |
5822 | #define FLASH_SECTOR_SIZE (4 * 1024) |
5823 | |
5824 | diff --git a/drivers/net/wireless/rsi/rsi_main.h b/drivers/net/wireless/rsi/rsi_main.h |
5825 | index b3e25bc28682c..de595025c0197 100644 |
5826 | --- a/drivers/net/wireless/rsi/rsi_main.h |
5827 | +++ b/drivers/net/wireless/rsi/rsi_main.h |
5828 | @@ -61,6 +61,7 @@ enum RSI_FSM_STATES { |
5829 | extern u32 rsi_zone_enabled; |
5830 | extern __printf(2, 3) void rsi_dbg(u32 zone, const char *fmt, ...); |
5831 | |
5832 | +#define RSI_MAX_BANDS 2 |
5833 | #define RSI_MAX_VIFS 3 |
5834 | #define NUM_EDCA_QUEUES 4 |
5835 | #define IEEE80211_ADDR_LEN 6 |
5836 | @@ -139,6 +140,7 @@ struct skb_info { |
5837 | u8 internal_hdr_size; |
5838 | struct ieee80211_vif *vif; |
5839 | u8 vap_id; |
5840 | + bool have_key; |
5841 | }; |
5842 | |
5843 | enum edca_queue { |
5844 | @@ -229,6 +231,12 @@ struct rsi_9116_features { |
5845 | u32 ps_options; |
5846 | }; |
5847 | |
5848 | +struct rsi_rate_config { |
5849 | + u32 configured_mask; /* configured by mac80211 bits 0-11=legacy 12+ mcs */ |
5850 | + u16 fixed_hw_rate; |
5851 | + bool fixed_enabled; |
5852 | +}; |
5853 | + |
5854 | struct rsi_common { |
5855 | struct rsi_hw *priv; |
5856 | struct vif_priv vif_info[RSI_MAX_VIFS]; |
5857 | @@ -254,8 +262,8 @@ struct rsi_common { |
5858 | u8 channel_width; |
5859 | |
5860 | u16 rts_threshold; |
5861 | - u16 bitrate_mask[2]; |
5862 | - u32 fixedrate_mask[2]; |
5863 | + u32 bitrate_mask[RSI_MAX_BANDS]; |
5864 | + struct rsi_rate_config rate_config[RSI_MAX_BANDS]; |
5865 | |
5866 | u8 rf_reset; |
5867 | struct transmit_q_stats tx_stats; |
5868 | @@ -276,7 +284,6 @@ struct rsi_common { |
5869 | u8 mac_id; |
5870 | u8 radio_id; |
5871 | u16 rate_pwr[20]; |
5872 | - u16 min_rate; |
5873 | |
5874 | /* WMM algo related */ |
5875 | u8 selected_qnum; |
5876 | @@ -320,6 +327,7 @@ struct rsi_common { |
5877 | struct ieee80211_vif *roc_vif; |
5878 | |
5879 | bool eapol4_confirm; |
5880 | + bool bt_defer_attach; |
5881 | void *bt_adapter; |
5882 | |
5883 | struct cfg80211_scan_request *hwscan; |
5884 | @@ -401,5 +409,6 @@ struct rsi_host_intf_ops { |
5885 | |
5886 | enum rsi_host_intf rsi_get_host_intf(void *priv); |
5887 | void rsi_set_bt_context(void *priv, void *bt_context); |
5888 | +void rsi_attach_bt(struct rsi_common *common); |
5889 | |
5890 | #endif |
5891 | diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c |
5892 | index 88280057e0321..7d389c2cc9026 100644 |
5893 | --- a/drivers/net/xen-netfront.c |
5894 | +++ b/drivers/net/xen-netfront.c |
5895 | @@ -1439,6 +1439,10 @@ static int netfront_resume(struct xenbus_device *dev) |
5896 | |
5897 | dev_dbg(&dev->dev, "%s\n", dev->nodename); |
5898 | |
5899 | + netif_tx_lock_bh(info->netdev); |
5900 | + netif_device_detach(info->netdev); |
5901 | + netif_tx_unlock_bh(info->netdev); |
5902 | + |
5903 | xennet_disconnect_backend(info); |
5904 | return 0; |
5905 | } |
5906 | @@ -1987,6 +1991,10 @@ static int xennet_connect(struct net_device *dev) |
5907 | * domain a kick because we've probably just requeued some |
5908 | * packets. |
5909 | */ |
5910 | + netif_tx_lock_bh(np->netdev); |
5911 | + netif_device_attach(np->netdev); |
5912 | + netif_tx_unlock_bh(np->netdev); |
5913 | + |
5914 | netif_carrier_on(np->netdev); |
5915 | for (j = 0; j < num_queues; ++j) { |
5916 | queue = &np->queues[j]; |
5917 | diff --git a/drivers/nfc/pn533/pn533.c b/drivers/nfc/pn533/pn533.c |
5918 | index 3ea38ce86cc9f..807b7b37d9dce 100644 |
5919 | --- a/drivers/nfc/pn533/pn533.c |
5920 | +++ b/drivers/nfc/pn533/pn533.c |
5921 | @@ -2072,7 +2072,7 @@ static int pn533_fill_fragment_skbs(struct pn533 *dev, struct sk_buff *skb) |
5922 | frag = pn533_alloc_skb(dev, frag_size); |
5923 | if (!frag) { |
5924 | skb_queue_purge(&dev->fragment_skb); |
5925 | - break; |
5926 | + return -ENOMEM; |
5927 | } |
5928 | |
5929 | if (!dev->tgt_mode) { |
5930 | @@ -2143,7 +2143,7 @@ static int pn533_transceive(struct nfc_dev *nfc_dev, |
5931 | /* jumbo frame ? */ |
5932 | if (skb->len > PN533_CMD_DATAEXCH_DATA_MAXLEN) { |
5933 | rc = pn533_fill_fragment_skbs(dev, skb); |
5934 | - if (rc <= 0) |
5935 | + if (rc < 0) |
5936 | goto error; |
5937 | |
5938 | skb = skb_dequeue(&dev->fragment_skb); |
5939 | @@ -2215,7 +2215,7 @@ static int pn533_tm_send(struct nfc_dev *nfc_dev, struct sk_buff *skb) |
5940 | /* let's split in multiple chunks if size's too big */ |
5941 | if (skb->len > PN533_CMD_DATAEXCH_DATA_MAXLEN) { |
5942 | rc = pn533_fill_fragment_skbs(dev, skb); |
5943 | - if (rc <= 0) |
5944 | + if (rc < 0) |
5945 | goto error; |
5946 | |
5947 | /* get the first skb */ |
5948 | diff --git a/drivers/nvme/host/multipath.c b/drivers/nvme/host/multipath.c |
5949 | index 016a67fd41989..9f01af2f03e68 100644 |
5950 | --- a/drivers/nvme/host/multipath.c |
5951 | +++ b/drivers/nvme/host/multipath.c |
5952 | @@ -156,13 +156,12 @@ void nvme_mpath_clear_ctrl_paths(struct nvme_ctrl *ctrl) |
5953 | { |
5954 | struct nvme_ns *ns; |
5955 | |
5956 | - mutex_lock(&ctrl->scan_lock); |
5957 | down_read(&ctrl->namespaces_rwsem); |
5958 | - list_for_each_entry(ns, &ctrl->namespaces, list) |
5959 | - if (nvme_mpath_clear_current_path(ns)) |
5960 | - kblockd_schedule_work(&ns->head->requeue_work); |
5961 | + list_for_each_entry(ns, &ctrl->namespaces, list) { |
5962 | + nvme_mpath_clear_current_path(ns); |
5963 | + kblockd_schedule_work(&ns->head->requeue_work); |
5964 | + } |
5965 | up_read(&ctrl->namespaces_rwsem); |
5966 | - mutex_unlock(&ctrl->scan_lock); |
5967 | } |
5968 | |
5969 | static bool nvme_path_is_disabled(struct nvme_ns *ns) |
5970 | diff --git a/drivers/nvme/host/rdma.c b/drivers/nvme/host/rdma.c |
5971 | index dcc3d2393605e..08a23bb4b8b57 100644 |
5972 | --- a/drivers/nvme/host/rdma.c |
5973 | +++ b/drivers/nvme/host/rdma.c |
5974 | @@ -1019,11 +1019,13 @@ static int nvme_rdma_setup_ctrl(struct nvme_rdma_ctrl *ctrl, bool new) |
5975 | return ret; |
5976 | |
5977 | if (ctrl->ctrl.icdoff) { |
5978 | + ret = -EOPNOTSUPP; |
5979 | dev_err(ctrl->ctrl.device, "icdoff is not supported!\n"); |
5980 | goto destroy_admin; |
5981 | } |
5982 | |
5983 | if (!(ctrl->ctrl.sgls & (1 << 2))) { |
5984 | + ret = -EOPNOTSUPP; |
5985 | dev_err(ctrl->ctrl.device, |
5986 | "Mandatory keyed sgls are not supported!\n"); |
5987 | goto destroy_admin; |
5988 | diff --git a/drivers/nvme/target/configfs.c b/drivers/nvme/target/configfs.c |
5989 | index 98613a45bd3b4..baf8a3e4ed12a 100644 |
5990 | --- a/drivers/nvme/target/configfs.c |
5991 | +++ b/drivers/nvme/target/configfs.c |
5992 | @@ -1148,6 +1148,8 @@ static void nvmet_port_release(struct config_item *item) |
5993 | { |
5994 | struct nvmet_port *port = to_nvmet_port(item); |
5995 | |
5996 | + /* Let inflight controllers teardown complete */ |
5997 | + flush_scheduled_work(); |
5998 | list_del(&port->global_entry); |
5999 | |
6000 | kfree(port->ana_state); |
6001 | diff --git a/drivers/nvme/target/tcp.c b/drivers/nvme/target/tcp.c |
6002 | index 2f4e512bd449f..fac1985870765 100644 |
6003 | --- a/drivers/nvme/target/tcp.c |
6004 | +++ b/drivers/nvme/target/tcp.c |
6005 | @@ -1020,7 +1020,7 @@ recv: |
6006 | } |
6007 | |
6008 | if (queue->hdr_digest && |
6009 | - nvmet_tcp_verify_hdgst(queue, &queue->pdu, queue->offset)) { |
6010 | + nvmet_tcp_verify_hdgst(queue, &queue->pdu, hdr->hlen)) { |
6011 | nvmet_tcp_fatal_error(queue); /* fatal */ |
6012 | return -EPROTO; |
6013 | } |
6014 | @@ -1343,6 +1343,7 @@ static void nvmet_tcp_uninit_data_in_cmds(struct nvmet_tcp_queue *queue) |
6015 | |
6016 | static void nvmet_tcp_release_queue_work(struct work_struct *w) |
6017 | { |
6018 | + struct page *page; |
6019 | struct nvmet_tcp_queue *queue = |
6020 | container_of(w, struct nvmet_tcp_queue, release_work); |
6021 | |
6022 | @@ -1362,6 +1363,8 @@ static void nvmet_tcp_release_queue_work(struct work_struct *w) |
6023 | nvmet_tcp_free_crypto(queue); |
6024 | ida_simple_remove(&nvmet_tcp_queue_ida, queue->idx); |
6025 | |
6026 | + page = virt_to_head_page(queue->pf_cache.va); |
6027 | + __page_frag_cache_drain(page, queue->pf_cache.pagecnt_bias); |
6028 | kfree(queue); |
6029 | } |
6030 | |
6031 | @@ -1664,6 +1667,17 @@ err_port: |
6032 | return ret; |
6033 | } |
6034 | |
6035 | +static void nvmet_tcp_destroy_port_queues(struct nvmet_tcp_port *port) |
6036 | +{ |
6037 | + struct nvmet_tcp_queue *queue; |
6038 | + |
6039 | + mutex_lock(&nvmet_tcp_queue_mutex); |
6040 | + list_for_each_entry(queue, &nvmet_tcp_queue_list, queue_list) |
6041 | + if (queue->port == port) |
6042 | + kernel_sock_shutdown(queue->sock, SHUT_RDWR); |
6043 | + mutex_unlock(&nvmet_tcp_queue_mutex); |
6044 | +} |
6045 | + |
6046 | static void nvmet_tcp_remove_port(struct nvmet_port *nport) |
6047 | { |
6048 | struct nvmet_tcp_port *port = nport->priv; |
6049 | @@ -1673,6 +1687,11 @@ static void nvmet_tcp_remove_port(struct nvmet_port *nport) |
6050 | port->sock->sk->sk_user_data = NULL; |
6051 | write_unlock_bh(&port->sock->sk->sk_callback_lock); |
6052 | cancel_work_sync(&port->accept_work); |
6053 | + /* |
6054 | + * Destroy the remaining queues, which are not belong to any |
6055 | + * controller yet. |
6056 | + */ |
6057 | + nvmet_tcp_destroy_port_queues(port); |
6058 | |
6059 | sock_release(port->sock); |
6060 | kfree(port); |
6061 | diff --git a/drivers/opp/of.c b/drivers/opp/of.c |
6062 | index 30cc407c8f93f..ba30694508153 100644 |
6063 | --- a/drivers/opp/of.c |
6064 | +++ b/drivers/opp/of.c |
6065 | @@ -639,7 +639,7 @@ free_required_opps: |
6066 | free_opp: |
6067 | _opp_free(new_opp); |
6068 | |
6069 | - return ERR_PTR(ret); |
6070 | + return ret ? ERR_PTR(ret) : NULL; |
6071 | } |
6072 | |
6073 | /* Initializes OPP tables based on new bindings */ |
6074 | diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c |
6075 | index 18753fd218a31..45794ba643d40 100644 |
6076 | --- a/drivers/pci/controller/pci-aardvark.c |
6077 | +++ b/drivers/pci/controller/pci-aardvark.c |
6078 | @@ -108,26 +108,69 @@ |
6079 | #define PCIE_ISR0_MSI_INT_PENDING BIT(24) |
6080 | #define PCIE_ISR0_INTX_ASSERT(val) BIT(16 + (val)) |
6081 | #define PCIE_ISR0_INTX_DEASSERT(val) BIT(20 + (val)) |
6082 | -#define PCIE_ISR0_ALL_MASK GENMASK(26, 0) |
6083 | +#define PCIE_ISR0_ALL_MASK GENMASK(31, 0) |
6084 | #define PCIE_ISR1_REG (CONTROL_BASE_ADDR + 0x48) |
6085 | #define PCIE_ISR1_MASK_REG (CONTROL_BASE_ADDR + 0x4C) |
6086 | #define PCIE_ISR1_POWER_STATE_CHANGE BIT(4) |
6087 | #define PCIE_ISR1_FLUSH BIT(5) |
6088 | #define PCIE_ISR1_INTX_ASSERT(val) BIT(8 + (val)) |
6089 | -#define PCIE_ISR1_ALL_MASK GENMASK(11, 4) |
6090 | +#define PCIE_ISR1_ALL_MASK GENMASK(31, 0) |
6091 | #define PCIE_MSI_ADDR_LOW_REG (CONTROL_BASE_ADDR + 0x50) |
6092 | #define PCIE_MSI_ADDR_HIGH_REG (CONTROL_BASE_ADDR + 0x54) |
6093 | #define PCIE_MSI_STATUS_REG (CONTROL_BASE_ADDR + 0x58) |
6094 | #define PCIE_MSI_MASK_REG (CONTROL_BASE_ADDR + 0x5C) |
6095 | #define PCIE_MSI_PAYLOAD_REG (CONTROL_BASE_ADDR + 0x9C) |
6096 | +#define PCIE_MSI_DATA_MASK GENMASK(15, 0) |
6097 | |
6098 | /* LMI registers base address and register offsets */ |
6099 | #define LMI_BASE_ADDR 0x6000 |
6100 | #define CFG_REG (LMI_BASE_ADDR + 0x0) |
6101 | #define LTSSM_SHIFT 24 |
6102 | #define LTSSM_MASK 0x3f |
6103 | -#define LTSSM_L0 0x10 |
6104 | #define RC_BAR_CONFIG 0x300 |
6105 | + |
6106 | +/* LTSSM values in CFG_REG */ |
6107 | +enum { |
6108 | + LTSSM_DETECT_QUIET = 0x0, |
6109 | + LTSSM_DETECT_ACTIVE = 0x1, |
6110 | + LTSSM_POLLING_ACTIVE = 0x2, |
6111 | + LTSSM_POLLING_COMPLIANCE = 0x3, |
6112 | + LTSSM_POLLING_CONFIGURATION = 0x4, |
6113 | + LTSSM_CONFIG_LINKWIDTH_START = 0x5, |
6114 | + LTSSM_CONFIG_LINKWIDTH_ACCEPT = 0x6, |
6115 | + LTSSM_CONFIG_LANENUM_ACCEPT = 0x7, |
6116 | + LTSSM_CONFIG_LANENUM_WAIT = 0x8, |
6117 | + LTSSM_CONFIG_COMPLETE = 0x9, |
6118 | + LTSSM_CONFIG_IDLE = 0xa, |
6119 | + LTSSM_RECOVERY_RCVR_LOCK = 0xb, |
6120 | + LTSSM_RECOVERY_SPEED = 0xc, |
6121 | + LTSSM_RECOVERY_RCVR_CFG = 0xd, |
6122 | + LTSSM_RECOVERY_IDLE = 0xe, |
6123 | + LTSSM_L0 = 0x10, |
6124 | + LTSSM_RX_L0S_ENTRY = 0x11, |
6125 | + LTSSM_RX_L0S_IDLE = 0x12, |
6126 | + LTSSM_RX_L0S_FTS = 0x13, |
6127 | + LTSSM_TX_L0S_ENTRY = 0x14, |
6128 | + LTSSM_TX_L0S_IDLE = 0x15, |
6129 | + LTSSM_TX_L0S_FTS = 0x16, |
6130 | + LTSSM_L1_ENTRY = 0x17, |
6131 | + LTSSM_L1_IDLE = 0x18, |
6132 | + LTSSM_L2_IDLE = 0x19, |
6133 | + LTSSM_L2_TRANSMIT_WAKE = 0x1a, |
6134 | + LTSSM_DISABLED = 0x20, |
6135 | + LTSSM_LOOPBACK_ENTRY_MASTER = 0x21, |
6136 | + LTSSM_LOOPBACK_ACTIVE_MASTER = 0x22, |
6137 | + LTSSM_LOOPBACK_EXIT_MASTER = 0x23, |
6138 | + LTSSM_LOOPBACK_ENTRY_SLAVE = 0x24, |
6139 | + LTSSM_LOOPBACK_ACTIVE_SLAVE = 0x25, |
6140 | + LTSSM_LOOPBACK_EXIT_SLAVE = 0x26, |
6141 | + LTSSM_HOT_RESET = 0x27, |
6142 | + LTSSM_RECOVERY_EQUALIZATION_PHASE0 = 0x28, |
6143 | + LTSSM_RECOVERY_EQUALIZATION_PHASE1 = 0x29, |
6144 | + LTSSM_RECOVERY_EQUALIZATION_PHASE2 = 0x2a, |
6145 | + LTSSM_RECOVERY_EQUALIZATION_PHASE3 = 0x2b, |
6146 | +}; |
6147 | + |
6148 | #define VENDOR_ID_REG (LMI_BASE_ADDR + 0x44) |
6149 | |
6150 | /* PCIe core controller registers */ |
6151 | @@ -160,7 +203,7 @@ |
6152 | #define PCIE_IRQ_MSI_INT2_DET BIT(21) |
6153 | #define PCIE_IRQ_RC_DBELL_DET BIT(22) |
6154 | #define PCIE_IRQ_EP_STATUS BIT(23) |
6155 | -#define PCIE_IRQ_ALL_MASK 0xfff0fb |
6156 | +#define PCIE_IRQ_ALL_MASK GENMASK(31, 0) |
6157 | #define PCIE_IRQ_ENABLE_INTS_MASK PCIE_IRQ_CORE_INT |
6158 | |
6159 | /* Transaction types */ |
6160 | @@ -219,13 +262,49 @@ static inline u32 advk_readl(struct advk_pcie *pcie, u64 reg) |
6161 | return readl(pcie->base + reg); |
6162 | } |
6163 | |
6164 | -static int advk_pcie_link_up(struct advk_pcie *pcie) |
6165 | +static u8 advk_pcie_ltssm_state(struct advk_pcie *pcie) |
6166 | { |
6167 | - u32 val, ltssm_state; |
6168 | + u32 val; |
6169 | + u8 ltssm_state; |
6170 | |
6171 | val = advk_readl(pcie, CFG_REG); |
6172 | ltssm_state = (val >> LTSSM_SHIFT) & LTSSM_MASK; |
6173 | - return ltssm_state >= LTSSM_L0; |
6174 | + return ltssm_state; |
6175 | +} |
6176 | + |
6177 | +static inline bool advk_pcie_link_up(struct advk_pcie *pcie) |
6178 | +{ |
6179 | + /* check if LTSSM is in normal operation - some L* state */ |
6180 | + u8 ltssm_state = advk_pcie_ltssm_state(pcie); |
6181 | + return ltssm_state >= LTSSM_L0 && ltssm_state < LTSSM_DISABLED; |
6182 | +} |
6183 | + |
6184 | +static inline bool advk_pcie_link_active(struct advk_pcie *pcie) |
6185 | +{ |
6186 | + /* |
6187 | + * According to PCIe Base specification 3.0, Table 4-14: Link |
6188 | + * Status Mapped to the LTSSM, and 4.2.6.3.6 Configuration.Idle |
6189 | + * is Link Up mapped to LTSSM Configuration.Idle, Recovery, L0, |
6190 | + * L0s, L1 and L2 states. And according to 3.2.1. Data Link |
6191 | + * Control and Management State Machine Rules is DL Up status |
6192 | + * reported in DL Active state. |
6193 | + */ |
6194 | + u8 ltssm_state = advk_pcie_ltssm_state(pcie); |
6195 | + return ltssm_state >= LTSSM_CONFIG_IDLE && ltssm_state < LTSSM_DISABLED; |
6196 | +} |
6197 | + |
6198 | +static inline bool advk_pcie_link_training(struct advk_pcie *pcie) |
6199 | +{ |
6200 | + /* |
6201 | + * According to PCIe Base specification 3.0, Table 4-14: Link |
6202 | + * Status Mapped to the LTSSM is Link Training mapped to LTSSM |
6203 | + * Configuration and Recovery states. |
6204 | + */ |
6205 | + u8 ltssm_state = advk_pcie_ltssm_state(pcie); |
6206 | + return ((ltssm_state >= LTSSM_CONFIG_LINKWIDTH_START && |
6207 | + ltssm_state < LTSSM_L0) || |
6208 | + (ltssm_state >= LTSSM_RECOVERY_EQUALIZATION_PHASE0 && |
6209 | + ltssm_state <= LTSSM_RECOVERY_EQUALIZATION_PHASE3)); |
6210 | } |
6211 | |
6212 | static int advk_pcie_wait_for_link(struct advk_pcie *pcie) |
6213 | @@ -252,7 +331,7 @@ static void advk_pcie_wait_for_retrain(struct advk_pcie *pcie) |
6214 | size_t retries; |
6215 | |
6216 | for (retries = 0; retries < RETRAIN_WAIT_MAX_RETRIES; ++retries) { |
6217 | - if (!advk_pcie_link_up(pcie)) |
6218 | + if (advk_pcie_link_training(pcie)) |
6219 | break; |
6220 | udelay(RETRAIN_WAIT_USLEEP_US); |
6221 | } |
6222 | @@ -460,7 +539,7 @@ static int advk_pcie_check_pio_status(struct advk_pcie *pcie, bool allow_crs, u3 |
6223 | else |
6224 | str_posted = "Posted"; |
6225 | |
6226 | - dev_err(dev, "%s PIO Response Status: %s, %#x @ %#x\n", |
6227 | + dev_dbg(dev, "%s PIO Response Status: %s, %#x @ %#x\n", |
6228 | str_posted, strcomp_status, reg, advk_readl(pcie, PIO_ADDR_LS)); |
6229 | |
6230 | return -EFAULT; |
6231 | @@ -501,6 +580,7 @@ advk_pci_bridge_emul_pcie_conf_read(struct pci_bridge_emul *bridge, |
6232 | case PCI_EXP_RTCTL: { |
6233 | u32 val = advk_readl(pcie, PCIE_ISR0_MASK_REG); |
6234 | *value = (val & PCIE_MSG_PM_PME_MASK) ? 0 : PCI_EXP_RTCTL_PMEIE; |
6235 | + *value |= le16_to_cpu(bridge->pcie_conf.rootctl) & PCI_EXP_RTCTL_CRSSVE; |
6236 | *value |= PCI_EXP_RTCAP_CRSVIS << 16; |
6237 | return PCI_BRIDGE_EMUL_HANDLED; |
6238 | } |
6239 | @@ -512,12 +592,26 @@ advk_pci_bridge_emul_pcie_conf_read(struct pci_bridge_emul *bridge, |
6240 | return PCI_BRIDGE_EMUL_HANDLED; |
6241 | } |
6242 | |
6243 | + case PCI_EXP_LNKCAP: { |
6244 | + u32 val = advk_readl(pcie, PCIE_CORE_PCIEXP_CAP + reg); |
6245 | + /* |
6246 | + * PCI_EXP_LNKCAP_DLLLARC bit is hardwired in aardvark HW to 0. |
6247 | + * But support for PCI_EXP_LNKSTA_DLLLA is emulated via ltssm |
6248 | + * state so explicitly enable PCI_EXP_LNKCAP_DLLLARC flag. |
6249 | + */ |
6250 | + val |= PCI_EXP_LNKCAP_DLLLARC; |
6251 | + *value = val; |
6252 | + return PCI_BRIDGE_EMUL_HANDLED; |
6253 | + } |
6254 | + |
6255 | case PCI_EXP_LNKCTL: { |
6256 | /* u32 contains both PCI_EXP_LNKCTL and PCI_EXP_LNKSTA */ |
6257 | u32 val = advk_readl(pcie, PCIE_CORE_PCIEXP_CAP + reg) & |
6258 | ~(PCI_EXP_LNKSTA_LT << 16); |
6259 | - if (!advk_pcie_link_up(pcie)) |
6260 | + if (advk_pcie_link_training(pcie)) |
6261 | val |= (PCI_EXP_LNKSTA_LT << 16); |
6262 | + if (advk_pcie_link_active(pcie)) |
6263 | + val |= (PCI_EXP_LNKSTA_DLLLA << 16); |
6264 | *value = val; |
6265 | return PCI_BRIDGE_EMUL_HANDLED; |
6266 | } |
6267 | @@ -525,7 +619,6 @@ advk_pci_bridge_emul_pcie_conf_read(struct pci_bridge_emul *bridge, |
6268 | case PCI_CAP_LIST_ID: |
6269 | case PCI_EXP_DEVCAP: |
6270 | case PCI_EXP_DEVCTL: |
6271 | - case PCI_EXP_LNKCAP: |
6272 | *value = advk_readl(pcie, PCIE_CORE_PCIEXP_CAP + reg); |
6273 | return PCI_BRIDGE_EMUL_HANDLED; |
6274 | default: |
6275 | @@ -851,7 +944,7 @@ static int advk_msi_irq_domain_alloc(struct irq_domain *domain, |
6276 | domain->host_data, handle_simple_irq, |
6277 | NULL, NULL); |
6278 | |
6279 | - return hwirq; |
6280 | + return 0; |
6281 | } |
6282 | |
6283 | static void advk_msi_irq_domain_free(struct irq_domain *domain, |
6284 | @@ -1032,8 +1125,12 @@ static void advk_pcie_handle_msi(struct advk_pcie *pcie) |
6285 | if (!(BIT(msi_idx) & msi_status)) |
6286 | continue; |
6287 | |
6288 | + /* |
6289 | + * msi_idx contains bits [4:0] of the msi_data and msi_data |
6290 | + * contains 16bit MSI interrupt number |
6291 | + */ |
6292 | advk_writel(pcie, BIT(msi_idx), PCIE_MSI_STATUS_REG); |
6293 | - msi_data = advk_readl(pcie, PCIE_MSI_PAYLOAD_REG) & 0xFF; |
6294 | + msi_data = advk_readl(pcie, PCIE_MSI_PAYLOAD_REG) & PCIE_MSI_DATA_MASK; |
6295 | generic_handle_irq(msi_data); |
6296 | } |
6297 | |
6298 | @@ -1055,12 +1152,6 @@ static void advk_pcie_handle_int(struct advk_pcie *pcie) |
6299 | isr1_mask = advk_readl(pcie, PCIE_ISR1_MASK_REG); |
6300 | isr1_status = isr1_val & ((~isr1_mask) & PCIE_ISR1_ALL_MASK); |
6301 | |
6302 | - if (!isr0_status && !isr1_status) { |
6303 | - advk_writel(pcie, isr0_val, PCIE_ISR0_REG); |
6304 | - advk_writel(pcie, isr1_val, PCIE_ISR1_REG); |
6305 | - return; |
6306 | - } |
6307 | - |
6308 | /* Process MSI interrupts */ |
6309 | if (isr0_status & PCIE_ISR0_MSI_INT_PENDING) |
6310 | advk_pcie_handle_msi(pcie); |
6311 | diff --git a/drivers/pci/pci-bridge-emul.c b/drivers/pci/pci-bridge-emul.c |
6312 | index 06c800595e036..b3d63e319bb39 100644 |
6313 | --- a/drivers/pci/pci-bridge-emul.c |
6314 | +++ b/drivers/pci/pci-bridge-emul.c |
6315 | @@ -432,8 +432,21 @@ int pci_bridge_emul_conf_write(struct pci_bridge_emul *bridge, int where, |
6316 | /* Clear the W1C bits */ |
6317 | new &= ~((value << shift) & (behavior[reg / 4].w1c & mask)); |
6318 | |
6319 | + /* Save the new value with the cleared W1C bits into the cfgspace */ |
6320 | cfgspace[reg / 4] = cpu_to_le32(new); |
6321 | |
6322 | + /* |
6323 | + * Clear the W1C bits not specified by the write mask, so that the |
6324 | + * write_op() does not clear them. |
6325 | + */ |
6326 | + new &= ~(behavior[reg / 4].w1c & ~mask); |
6327 | + |
6328 | + /* |
6329 | + * Set the W1C bits specified by the write mask, so that write_op() |
6330 | + * knows about that they are to be cleared. |
6331 | + */ |
6332 | + new |= (value << shift) & (behavior[reg / 4].w1c & mask); |
6333 | + |
6334 | if (write_op) |
6335 | write_op(bridge, reg, old, new, mask); |
6336 | |
6337 | diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c |
6338 | index 686298c0f6cda..fb7c5518447da 100644 |
6339 | --- a/drivers/pci/quirks.c |
6340 | +++ b/drivers/pci/quirks.c |
6341 | @@ -3584,6 +3584,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATHEROS, 0x0032, quirk_no_bus_reset); |
6342 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATHEROS, 0x003c, quirk_no_bus_reset); |
6343 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATHEROS, 0x0033, quirk_no_bus_reset); |
6344 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATHEROS, 0x0034, quirk_no_bus_reset); |
6345 | +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATHEROS, 0x003e, quirk_no_bus_reset); |
6346 | |
6347 | /* |
6348 | * Root port on some Cavium CN8xxx chips do not successfully complete a bus |
6349 | diff --git a/drivers/phy/qualcomm/phy-qcom-qusb2.c b/drivers/phy/qualcomm/phy-qcom-qusb2.c |
6350 | index bf94a52d30871..946e9b05f0ae6 100644 |
6351 | --- a/drivers/phy/qualcomm/phy-qcom-qusb2.c |
6352 | +++ b/drivers/phy/qualcomm/phy-qcom-qusb2.c |
6353 | @@ -432,7 +432,7 @@ static void qusb2_phy_set_tune2_param(struct qusb2_phy *qphy) |
6354 | { |
6355 | struct device *dev = &qphy->phy->dev; |
6356 | const struct qusb2_phy_cfg *cfg = qphy->cfg; |
6357 | - u8 *val; |
6358 | + u8 *val, hstx_trim; |
6359 | |
6360 | /* efuse register is optional */ |
6361 | if (!qphy->cell) |
6362 | @@ -446,7 +446,13 @@ static void qusb2_phy_set_tune2_param(struct qusb2_phy *qphy) |
6363 | * set while configuring the phy. |
6364 | */ |
6365 | val = nvmem_cell_read(qphy->cell, NULL); |
6366 | - if (IS_ERR(val) || !val[0]) { |
6367 | + if (IS_ERR(val)) { |
6368 | + dev_dbg(dev, "failed to read a valid hs-tx trim value\n"); |
6369 | + return; |
6370 | + } |
6371 | + hstx_trim = val[0]; |
6372 | + kfree(val); |
6373 | + if (!hstx_trim) { |
6374 | dev_dbg(dev, "failed to read a valid hs-tx trim value\n"); |
6375 | return; |
6376 | } |
6377 | @@ -454,12 +460,10 @@ static void qusb2_phy_set_tune2_param(struct qusb2_phy *qphy) |
6378 | /* Fused TUNE1/2 value is the higher nibble only */ |
6379 | if (cfg->update_tune1_with_efuse) |
6380 | qusb2_write_mask(qphy->base, cfg->regs[QUSB2PHY_PORT_TUNE1], |
6381 | - val[0] << HSTX_TRIM_SHIFT, |
6382 | - HSTX_TRIM_MASK); |
6383 | + hstx_trim << HSTX_TRIM_SHIFT, HSTX_TRIM_MASK); |
6384 | else |
6385 | qusb2_write_mask(qphy->base, cfg->regs[QUSB2PHY_PORT_TUNE2], |
6386 | - val[0] << HSTX_TRIM_SHIFT, |
6387 | - HSTX_TRIM_MASK); |
6388 | + hstx_trim << HSTX_TRIM_SHIFT, HSTX_TRIM_MASK); |
6389 | } |
6390 | |
6391 | static int qusb2_phy_set_mode(struct phy *phy, |
6392 | diff --git a/drivers/pinctrl/core.c b/drivers/pinctrl/core.c |
6393 | index 6381745e3bb18..9ebeef2ac7b18 100644 |
6394 | --- a/drivers/pinctrl/core.c |
6395 | +++ b/drivers/pinctrl/core.c |
6396 | @@ -2055,6 +2055,8 @@ int pinctrl_enable(struct pinctrl_dev *pctldev) |
6397 | if (error) { |
6398 | dev_err(pctldev->dev, "could not claim hogs: %i\n", |
6399 | error); |
6400 | + pinctrl_free_pindescs(pctldev, pctldev->desc->pins, |
6401 | + pctldev->desc->npins); |
6402 | mutex_destroy(&pctldev->mutex); |
6403 | kfree(pctldev); |
6404 | |
6405 | diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c |
6406 | index f027609fdab6d..3028d9f1ac59c 100644 |
6407 | --- a/drivers/platform/x86/thinkpad_acpi.c |
6408 | +++ b/drivers/platform/x86/thinkpad_acpi.c |
6409 | @@ -9086,7 +9086,7 @@ static int fan_write_cmd_level(const char *cmd, int *rc) |
6410 | |
6411 | if (strlencmp(cmd, "level auto") == 0) |
6412 | level = TP_EC_FAN_AUTO; |
6413 | - else if ((strlencmp(cmd, "level disengaged") == 0) | |
6414 | + else if ((strlencmp(cmd, "level disengaged") == 0) || |
6415 | (strlencmp(cmd, "level full-speed") == 0)) |
6416 | level = TP_EC_FAN_FULLSPEED; |
6417 | else if (sscanf(cmd, "level %d", &level) != 1) |
6418 | diff --git a/drivers/platform/x86/wmi.c b/drivers/platform/x86/wmi.c |
6419 | index 59e9aa0f96436..cb029126a68c6 100644 |
6420 | --- a/drivers/platform/x86/wmi.c |
6421 | +++ b/drivers/platform/x86/wmi.c |
6422 | @@ -353,7 +353,14 @@ static acpi_status __query_block(struct wmi_block *wblock, u8 instance, |
6423 | * the WQxx method failed - we should disable collection anyway. |
6424 | */ |
6425 | if ((block->flags & ACPI_WMI_EXPENSIVE) && ACPI_SUCCESS(wc_status)) { |
6426 | - status = acpi_execute_simple_method(handle, wc_method, 0); |
6427 | + /* |
6428 | + * Ignore whether this WCxx call succeeds or not since |
6429 | + * the previously executed WQxx method call might have |
6430 | + * succeeded, and returning the failing status code |
6431 | + * of this call would throw away the result of the WQxx |
6432 | + * call, potentially leaking memory. |
6433 | + */ |
6434 | + acpi_execute_simple_method(handle, wc_method, 0); |
6435 | } |
6436 | |
6437 | return status; |
6438 | diff --git a/drivers/power/supply/bq27xxx_battery_i2c.c b/drivers/power/supply/bq27xxx_battery_i2c.c |
6439 | index 2677c38a8a424..34229c1f43e31 100644 |
6440 | --- a/drivers/power/supply/bq27xxx_battery_i2c.c |
6441 | +++ b/drivers/power/supply/bq27xxx_battery_i2c.c |
6442 | @@ -195,7 +195,8 @@ static int bq27xxx_battery_i2c_probe(struct i2c_client *client, |
6443 | dev_err(&client->dev, |
6444 | "Unable to register IRQ %d error %d\n", |
6445 | client->irq, ret); |
6446 | - return ret; |
6447 | + bq27xxx_battery_teardown(di); |
6448 | + goto err_failed; |
6449 | } |
6450 | } |
6451 | |
6452 | diff --git a/drivers/power/supply/max17042_battery.c b/drivers/power/supply/max17042_battery.c |
6453 | index f8f8207a1895e..170639a1e734a 100644 |
6454 | --- a/drivers/power/supply/max17042_battery.c |
6455 | +++ b/drivers/power/supply/max17042_battery.c |
6456 | @@ -312,7 +312,10 @@ static int max17042_get_property(struct power_supply *psy, |
6457 | val->intval = data * 625 / 8; |
6458 | break; |
6459 | case POWER_SUPPLY_PROP_CAPACITY: |
6460 | - ret = regmap_read(map, MAX17042_RepSOC, &data); |
6461 | + if (chip->pdata->enable_current_sense) |
6462 | + ret = regmap_read(map, MAX17042_RepSOC, &data); |
6463 | + else |
6464 | + ret = regmap_read(map, MAX17042_VFSOC, &data); |
6465 | if (ret < 0) |
6466 | return ret; |
6467 | |
6468 | @@ -834,7 +837,8 @@ static void max17042_set_soc_threshold(struct max17042_chip *chip, u16 off) |
6469 | regmap_read(map, MAX17042_RepSOC, &soc); |
6470 | soc >>= 8; |
6471 | soc_tr = (soc + off) << 8; |
6472 | - soc_tr |= (soc - off); |
6473 | + if (off < soc) |
6474 | + soc_tr |= soc - off; |
6475 | regmap_write(map, MAX17042_SALRT_Th, soc_tr); |
6476 | } |
6477 | |
6478 | diff --git a/drivers/power/supply/rt5033_battery.c b/drivers/power/supply/rt5033_battery.c |
6479 | index 6609f8cb8ca01..ef53891b88bbc 100644 |
6480 | --- a/drivers/power/supply/rt5033_battery.c |
6481 | +++ b/drivers/power/supply/rt5033_battery.c |
6482 | @@ -60,7 +60,7 @@ static int rt5033_battery_get_watt_prop(struct i2c_client *client, |
6483 | regmap_read(battery->regmap, regh, &msb); |
6484 | regmap_read(battery->regmap, regl, &lsb); |
6485 | |
6486 | - ret = ((msb << 4) + (lsb >> 4)) * 1250 / 1000; |
6487 | + ret = ((msb << 4) + (lsb >> 4)) * 1250; |
6488 | |
6489 | return ret; |
6490 | } |
6491 | diff --git a/drivers/regulator/s5m8767.c b/drivers/regulator/s5m8767.c |
6492 | index 5276f8442f3c6..1e9f03a2ea1cc 100644 |
6493 | --- a/drivers/regulator/s5m8767.c |
6494 | +++ b/drivers/regulator/s5m8767.c |
6495 | @@ -851,18 +851,15 @@ static int s5m8767_pmic_probe(struct platform_device *pdev) |
6496 | /* DS4 GPIO */ |
6497 | gpio_direction_output(pdata->buck_ds[2], 0x0); |
6498 | |
6499 | - if (pdata->buck2_gpiodvs || pdata->buck3_gpiodvs || |
6500 | - pdata->buck4_gpiodvs) { |
6501 | - regmap_update_bits(s5m8767->iodev->regmap_pmic, |
6502 | - S5M8767_REG_BUCK2CTRL, 1 << 1, |
6503 | - (pdata->buck2_gpiodvs) ? (1 << 1) : (0 << 1)); |
6504 | - regmap_update_bits(s5m8767->iodev->regmap_pmic, |
6505 | - S5M8767_REG_BUCK3CTRL, 1 << 1, |
6506 | - (pdata->buck3_gpiodvs) ? (1 << 1) : (0 << 1)); |
6507 | - regmap_update_bits(s5m8767->iodev->regmap_pmic, |
6508 | - S5M8767_REG_BUCK4CTRL, 1 << 1, |
6509 | - (pdata->buck4_gpiodvs) ? (1 << 1) : (0 << 1)); |
6510 | - } |
6511 | + regmap_update_bits(s5m8767->iodev->regmap_pmic, |
6512 | + S5M8767_REG_BUCK2CTRL, 1 << 1, |
6513 | + (pdata->buck2_gpiodvs) ? (1 << 1) : (0 << 1)); |
6514 | + regmap_update_bits(s5m8767->iodev->regmap_pmic, |
6515 | + S5M8767_REG_BUCK3CTRL, 1 << 1, |
6516 | + (pdata->buck3_gpiodvs) ? (1 << 1) : (0 << 1)); |
6517 | + regmap_update_bits(s5m8767->iodev->regmap_pmic, |
6518 | + S5M8767_REG_BUCK4CTRL, 1 << 1, |
6519 | + (pdata->buck4_gpiodvs) ? (1 << 1) : (0 << 1)); |
6520 | |
6521 | /* Initialize GPIO DVS registers */ |
6522 | for (i = 0; i < 8; i++) { |
6523 | diff --git a/drivers/reset/reset-socfpga.c b/drivers/reset/reset-socfpga.c |
6524 | index 96953992c2bb5..1c5236a69dc49 100644 |
6525 | --- a/drivers/reset/reset-socfpga.c |
6526 | +++ b/drivers/reset/reset-socfpga.c |
6527 | @@ -86,3 +86,29 @@ void __init socfpga_reset_init(void) |
6528 | for_each_matching_node(np, socfpga_early_reset_dt_ids) |
6529 | a10_reset_init(np); |
6530 | } |
6531 | + |
6532 | +/* |
6533 | + * The early driver is problematic, because it doesn't register |
6534 | + * itself as a driver. This causes certain device links to prevent |
6535 | + * consumer devices from probing. The hacky solution is to register |
6536 | + * an empty driver, whose only job is to attach itself to the reset |
6537 | + * manager and call probe. |
6538 | + */ |
6539 | +static const struct of_device_id socfpga_reset_dt_ids[] = { |
6540 | + { .compatible = "altr,rst-mgr", }, |
6541 | + { /* sentinel */ }, |
6542 | +}; |
6543 | + |
6544 | +static int reset_simple_probe(struct platform_device *pdev) |
6545 | +{ |
6546 | + return 0; |
6547 | +} |
6548 | + |
6549 | +static struct platform_driver reset_socfpga_driver = { |
6550 | + .probe = reset_simple_probe, |
6551 | + .driver = { |
6552 | + .name = "socfpga-reset", |
6553 | + .of_match_table = socfpga_reset_dt_ids, |
6554 | + }, |
6555 | +}; |
6556 | +builtin_platform_driver(reset_socfpga_driver); |
6557 | diff --git a/drivers/s390/char/tape_std.c b/drivers/s390/char/tape_std.c |
6558 | index 1f5fab617b679..f7e75d9fedf61 100644 |
6559 | --- a/drivers/s390/char/tape_std.c |
6560 | +++ b/drivers/s390/char/tape_std.c |
6561 | @@ -53,7 +53,6 @@ int |
6562 | tape_std_assign(struct tape_device *device) |
6563 | { |
6564 | int rc; |
6565 | - struct timer_list timeout; |
6566 | struct tape_request *request; |
6567 | |
6568 | request = tape_alloc_request(2, 11); |
6569 | @@ -70,7 +69,7 @@ tape_std_assign(struct tape_device *device) |
6570 | * So we set up a timeout for this call. |
6571 | */ |
6572 | timer_setup(&request->timer, tape_std_assign_timeout, 0); |
6573 | - mod_timer(&timeout, jiffies + 2 * HZ); |
6574 | + mod_timer(&request->timer, jiffies + msecs_to_jiffies(2000)); |
6575 | |
6576 | rc = tape_do_io_interruptible(device, request); |
6577 | |
6578 | diff --git a/drivers/s390/cio/css.c b/drivers/s390/cio/css.c |
6579 | index 7950ac59b1744..ad447437a27c5 100644 |
6580 | --- a/drivers/s390/cio/css.c |
6581 | +++ b/drivers/s390/cio/css.c |
6582 | @@ -433,8 +433,8 @@ static ssize_t dev_busid_show(struct device *dev, |
6583 | struct subchannel *sch = to_subchannel(dev); |
6584 | struct pmcw *pmcw = &sch->schib.pmcw; |
6585 | |
6586 | - if ((pmcw->st == SUBCHANNEL_TYPE_IO || |
6587 | - pmcw->st == SUBCHANNEL_TYPE_MSG) && pmcw->dnv) |
6588 | + if ((pmcw->st == SUBCHANNEL_TYPE_IO && pmcw->dnv) || |
6589 | + (pmcw->st == SUBCHANNEL_TYPE_MSG && pmcw->w)) |
6590 | return sysfs_emit(buf, "0.%x.%04x\n", sch->schid.ssid, |
6591 | pmcw->dev); |
6592 | else |
6593 | diff --git a/drivers/s390/cio/device_ops.c b/drivers/s390/cio/device_ops.c |
6594 | index ccecf6b9504e8..5a411595347b5 100644 |
6595 | --- a/drivers/s390/cio/device_ops.c |
6596 | +++ b/drivers/s390/cio/device_ops.c |
6597 | @@ -717,13 +717,23 @@ EXPORT_SYMBOL_GPL(ccw_device_get_schid); |
6598 | */ |
6599 | void *ccw_device_dma_zalloc(struct ccw_device *cdev, size_t size) |
6600 | { |
6601 | - return cio_gp_dma_zalloc(cdev->private->dma_pool, &cdev->dev, size); |
6602 | + void *addr; |
6603 | + |
6604 | + if (!get_device(&cdev->dev)) |
6605 | + return NULL; |
6606 | + addr = cio_gp_dma_zalloc(cdev->private->dma_pool, &cdev->dev, size); |
6607 | + if (IS_ERR_OR_NULL(addr)) |
6608 | + put_device(&cdev->dev); |
6609 | + return addr; |
6610 | } |
6611 | EXPORT_SYMBOL(ccw_device_dma_zalloc); |
6612 | |
6613 | void ccw_device_dma_free(struct ccw_device *cdev, void *cpu_addr, size_t size) |
6614 | { |
6615 | + if (!cpu_addr) |
6616 | + return; |
6617 | cio_gp_dma_free(cdev->private->dma_pool, cpu_addr, size); |
6618 | + put_device(&cdev->dev); |
6619 | } |
6620 | EXPORT_SYMBOL(ccw_device_dma_free); |
6621 | |
6622 | diff --git a/drivers/scsi/csiostor/csio_lnode.c b/drivers/scsi/csiostor/csio_lnode.c |
6623 | index 23cbe4cda760e..c3bf590f5d685 100644 |
6624 | --- a/drivers/scsi/csiostor/csio_lnode.c |
6625 | +++ b/drivers/scsi/csiostor/csio_lnode.c |
6626 | @@ -619,7 +619,7 @@ csio_ln_vnp_read_cbfn(struct csio_hw *hw, struct csio_mb *mbp) |
6627 | struct fc_els_csp *csp; |
6628 | struct fc_els_cssp *clsp; |
6629 | enum fw_retval retval; |
6630 | - __be32 nport_id; |
6631 | + __be32 nport_id = 0; |
6632 | |
6633 | retval = FW_CMD_RETVAL_G(ntohl(rsp->alloc_to_len16)); |
6634 | if (retval != FW_SUCCESS) { |
6635 | diff --git a/drivers/scsi/dc395x.c b/drivers/scsi/dc395x.c |
6636 | index 13fbb2eab842e..5fb06930912a0 100644 |
6637 | --- a/drivers/scsi/dc395x.c |
6638 | +++ b/drivers/scsi/dc395x.c |
6639 | @@ -4698,6 +4698,7 @@ static int dc395x_init_one(struct pci_dev *dev, const struct pci_device_id *id) |
6640 | /* initialise the adapter and everything we need */ |
6641 | if (adapter_init(acb, io_port_base, io_port_len, irq)) { |
6642 | dprintkl(KERN_INFO, "adapter init failed\n"); |
6643 | + acb = NULL; |
6644 | goto fail; |
6645 | } |
6646 | |
6647 | diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c |
6648 | index 580d30cd5c35c..8f85ca0112961 100644 |
6649 | --- a/drivers/scsi/qla2xxx/qla_attr.c |
6650 | +++ b/drivers/scsi/qla2xxx/qla_attr.c |
6651 | @@ -1759,6 +1759,18 @@ qla2x00_port_speed_store(struct device *dev, struct device_attribute *attr, |
6652 | return strlen(buf); |
6653 | } |
6654 | |
6655 | +static const struct { |
6656 | + u16 rate; |
6657 | + char *str; |
6658 | +} port_speed_str[] = { |
6659 | + { PORT_SPEED_4GB, "4" }, |
6660 | + { PORT_SPEED_8GB, "8" }, |
6661 | + { PORT_SPEED_16GB, "16" }, |
6662 | + { PORT_SPEED_32GB, "32" }, |
6663 | + { PORT_SPEED_64GB, "64" }, |
6664 | + { PORT_SPEED_10GB, "10" }, |
6665 | +}; |
6666 | + |
6667 | static ssize_t |
6668 | qla2x00_port_speed_show(struct device *dev, struct device_attribute *attr, |
6669 | char *buf) |
6670 | @@ -1766,7 +1778,8 @@ qla2x00_port_speed_show(struct device *dev, struct device_attribute *attr, |
6671 | struct scsi_qla_host *vha = shost_priv(dev_to_shost(dev)); |
6672 | struct qla_hw_data *ha = vha->hw; |
6673 | ssize_t rval; |
6674 | - char *spd[7] = {"0", "0", "0", "4", "8", "16", "32"}; |
6675 | + u16 i; |
6676 | + char *speed = "Unknown"; |
6677 | |
6678 | rval = qla2x00_get_data_rate(vha); |
6679 | if (rval != QLA_SUCCESS) { |
6680 | @@ -1775,7 +1788,14 @@ qla2x00_port_speed_show(struct device *dev, struct device_attribute *attr, |
6681 | return -EINVAL; |
6682 | } |
6683 | |
6684 | - return scnprintf(buf, PAGE_SIZE, "%s\n", spd[ha->link_data_rate]); |
6685 | + for (i = 0; i < ARRAY_SIZE(port_speed_str); i++) { |
6686 | + if (port_speed_str[i].rate != ha->link_data_rate) |
6687 | + continue; |
6688 | + speed = port_speed_str[i].str; |
6689 | + break; |
6690 | + } |
6691 | + |
6692 | + return scnprintf(buf, PAGE_SIZE, "%s\n", speed); |
6693 | } |
6694 | |
6695 | /* ----- */ |
6696 | diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h |
6697 | index 7aa233771ec86..1a98e37c9be22 100644 |
6698 | --- a/drivers/scsi/qla2xxx/qla_gbl.h |
6699 | +++ b/drivers/scsi/qla2xxx/qla_gbl.h |
6700 | @@ -156,7 +156,6 @@ extern int ql2xasynctmfenable; |
6701 | extern int ql2xgffidenable; |
6702 | extern int ql2xenabledif; |
6703 | extern int ql2xenablehba_err_chk; |
6704 | -extern int ql2xtargetreset; |
6705 | extern int ql2xdontresethba; |
6706 | extern uint64_t ql2xmaxlun; |
6707 | extern int ql2xmdcapmask; |
6708 | @@ -770,7 +769,6 @@ extern void qlafx00_abort_iocb(srb_t *, struct abort_iocb_entry_fx00 *); |
6709 | extern void qlafx00_fxdisc_iocb(srb_t *, struct fxdisc_entry_fx00 *); |
6710 | extern void qlafx00_timer_routine(scsi_qla_host_t *); |
6711 | extern int qlafx00_rescan_isp(scsi_qla_host_t *); |
6712 | -extern int qlafx00_loop_reset(scsi_qla_host_t *vha); |
6713 | |
6714 | /* qla82xx related functions */ |
6715 | |
6716 | diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c |
6717 | index 5dae7ac0d3efe..37c1f27a76cf6 100644 |
6718 | --- a/drivers/scsi/qla2xxx/qla_init.c |
6719 | +++ b/drivers/scsi/qla2xxx/qla_init.c |
6720 | @@ -978,8 +978,6 @@ static void qla24xx_async_gnl_sp_done(srb_t *sp, int res) |
6721 | sp->name, res, sp->u.iocb_cmd.u.mbx.in_mb[1], |
6722 | sp->u.iocb_cmd.u.mbx.in_mb[2]); |
6723 | |
6724 | - if (res == QLA_FUNCTION_TIMEOUT) |
6725 | - return; |
6726 | |
6727 | sp->fcport->flags &= ~(FCF_ASYNC_SENT|FCF_ASYNC_ACTIVE); |
6728 | memset(&ea, 0, sizeof(ea)); |
6729 | @@ -1017,8 +1015,8 @@ static void qla24xx_async_gnl_sp_done(srb_t *sp, int res) |
6730 | spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags); |
6731 | |
6732 | list_for_each_entry_safe(fcport, tf, &h, gnl_entry) { |
6733 | - list_del_init(&fcport->gnl_entry); |
6734 | spin_lock_irqsave(&vha->hw->tgt.sess_lock, flags); |
6735 | + list_del_init(&fcport->gnl_entry); |
6736 | fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE); |
6737 | spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags); |
6738 | ea.fcport = fcport; |
6739 | diff --git a/drivers/scsi/qla2xxx/qla_mr.c b/drivers/scsi/qla2xxx/qla_mr.c |
6740 | index 605b59c76c901..badd09c5dd429 100644 |
6741 | --- a/drivers/scsi/qla2xxx/qla_mr.c |
6742 | +++ b/drivers/scsi/qla2xxx/qla_mr.c |
6743 | @@ -740,29 +740,6 @@ qlafx00_lun_reset(fc_port_t *fcport, uint64_t l, int tag) |
6744 | return qla2x00_async_tm_cmd(fcport, TCF_LUN_RESET, l, tag); |
6745 | } |
6746 | |
6747 | -int |
6748 | -qlafx00_loop_reset(scsi_qla_host_t *vha) |
6749 | -{ |
6750 | - int ret; |
6751 | - struct fc_port *fcport; |
6752 | - struct qla_hw_data *ha = vha->hw; |
6753 | - |
6754 | - if (ql2xtargetreset) { |
6755 | - list_for_each_entry(fcport, &vha->vp_fcports, list) { |
6756 | - if (fcport->port_type != FCT_TARGET) |
6757 | - continue; |
6758 | - |
6759 | - ret = ha->isp_ops->target_reset(fcport, 0, 0); |
6760 | - if (ret != QLA_SUCCESS) { |
6761 | - ql_dbg(ql_dbg_taskm, vha, 0x803d, |
6762 | - "Bus Reset failed: Reset=%d " |
6763 | - "d_id=%x.\n", ret, fcport->d_id.b24); |
6764 | - } |
6765 | - } |
6766 | - } |
6767 | - return QLA_SUCCESS; |
6768 | -} |
6769 | - |
6770 | int |
6771 | qlafx00_iospace_config(struct qla_hw_data *ha) |
6772 | { |
6773 | diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c |
6774 | index 28cbefe715e59..c1d4c964b0dd4 100644 |
6775 | --- a/drivers/scsi/qla2xxx/qla_os.c |
6776 | +++ b/drivers/scsi/qla2xxx/qla_os.c |
6777 | @@ -191,12 +191,6 @@ MODULE_PARM_DESC(ql2xdbwr, |
6778 | " 0 -- Regular doorbell.\n" |
6779 | " 1 -- CAMRAM doorbell (faster).\n"); |
6780 | |
6781 | -int ql2xtargetreset = 1; |
6782 | -module_param(ql2xtargetreset, int, S_IRUGO); |
6783 | -MODULE_PARM_DESC(ql2xtargetreset, |
6784 | - "Enable target reset." |
6785 | - "Default is 1 - use hw defaults."); |
6786 | - |
6787 | int ql2xgffidenable; |
6788 | module_param(ql2xgffidenable, int, S_IRUGO); |
6789 | MODULE_PARM_DESC(ql2xgffidenable, |
6790 | @@ -1229,6 +1223,7 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd) |
6791 | uint32_t ratov_j; |
6792 | struct qla_qpair *qpair; |
6793 | unsigned long flags; |
6794 | + int fast_fail_status = SUCCESS; |
6795 | |
6796 | if (qla2x00_isp_reg_stat(ha)) { |
6797 | ql_log(ql_log_info, vha, 0x8042, |
6798 | @@ -1236,15 +1231,16 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd) |
6799 | return FAILED; |
6800 | } |
6801 | |
6802 | + /* Save any FAST_IO_FAIL value to return later if abort succeeds */ |
6803 | ret = fc_block_scsi_eh(cmd); |
6804 | if (ret != 0) |
6805 | - return ret; |
6806 | + fast_fail_status = ret; |
6807 | |
6808 | sp = scsi_cmd_priv(cmd); |
6809 | qpair = sp->qpair; |
6810 | |
6811 | if ((sp->fcport && sp->fcport->deleted) || !qpair) |
6812 | - return SUCCESS; |
6813 | + return fast_fail_status != SUCCESS ? fast_fail_status : FAILED; |
6814 | |
6815 | spin_lock_irqsave(qpair->qp_lock_ptr, flags); |
6816 | if (sp->completed) { |
6817 | @@ -1290,7 +1286,7 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd) |
6818 | __func__, ha->r_a_tov/10); |
6819 | ret = FAILED; |
6820 | } else { |
6821 | - ret = SUCCESS; |
6822 | + ret = fast_fail_status; |
6823 | } |
6824 | break; |
6825 | default: |
6826 | @@ -1636,27 +1632,10 @@ int |
6827 | qla2x00_loop_reset(scsi_qla_host_t *vha) |
6828 | { |
6829 | int ret; |
6830 | - struct fc_port *fcport; |
6831 | struct qla_hw_data *ha = vha->hw; |
6832 | |
6833 | - if (IS_QLAFX00(ha)) { |
6834 | - return qlafx00_loop_reset(vha); |
6835 | - } |
6836 | - |
6837 | - if (ql2xtargetreset == 1 && ha->flags.enable_target_reset) { |
6838 | - list_for_each_entry(fcport, &vha->vp_fcports, list) { |
6839 | - if (fcport->port_type != FCT_TARGET) |
6840 | - continue; |
6841 | - |
6842 | - ret = ha->isp_ops->target_reset(fcport, 0, 0); |
6843 | - if (ret != QLA_SUCCESS) { |
6844 | - ql_dbg(ql_dbg_taskm, vha, 0x802c, |
6845 | - "Bus Reset failed: Reset=%d " |
6846 | - "d_id=%x.\n", ret, fcport->d_id.b24); |
6847 | - } |
6848 | - } |
6849 | - } |
6850 | - |
6851 | + if (IS_QLAFX00(ha)) |
6852 | + return QLA_SUCCESS; |
6853 | |
6854 | if (ha->flags.enable_lip_full_login && !IS_CNA_CAPABLE(ha)) { |
6855 | atomic_set(&vha->loop_state, LOOP_DOWN); |
6856 | @@ -4064,7 +4043,7 @@ qla2x00_mem_alloc(struct qla_hw_data *ha, uint16_t req_len, uint16_t rsp_len, |
6857 | ql_dbg_pci(ql_dbg_init, ha->pdev, |
6858 | 0xe0ee, "%s: failed alloc dsd\n", |
6859 | __func__); |
6860 | - return 1; |
6861 | + return -ENOMEM; |
6862 | } |
6863 | ha->dif_bundle_kallocs++; |
6864 | |
6865 | diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c |
6866 | index 57068e2faef54..0111c543f0e64 100644 |
6867 | --- a/drivers/scsi/qla2xxx/qla_target.c |
6868 | +++ b/drivers/scsi/qla2xxx/qla_target.c |
6869 | @@ -3251,8 +3251,7 @@ int qlt_xmit_response(struct qla_tgt_cmd *cmd, int xmit_type, |
6870 | "RESET-RSP online/active/old-count/new-count = %d/%d/%d/%d.\n", |
6871 | vha->flags.online, qla2x00_reset_active(vha), |
6872 | cmd->reset_count, qpair->chip_reset); |
6873 | - spin_unlock_irqrestore(qpair->qp_lock_ptr, flags); |
6874 | - return 0; |
6875 | + goto out_unmap_unlock; |
6876 | } |
6877 | |
6878 | /* Does F/W have an IOCBs for this request */ |
6879 | @@ -3375,10 +3374,6 @@ int qlt_rdy_to_xfer(struct qla_tgt_cmd *cmd) |
6880 | prm.sg = NULL; |
6881 | prm.req_cnt = 1; |
6882 | |
6883 | - /* Calculate number of entries and segments required */ |
6884 | - if (qlt_pci_map_calc_cnt(&prm) != 0) |
6885 | - return -EAGAIN; |
6886 | - |
6887 | if (!qpair->fw_started || (cmd->reset_count != qpair->chip_reset) || |
6888 | (cmd->sess && cmd->sess->deleted)) { |
6889 | /* |
6890 | @@ -3396,6 +3391,10 @@ int qlt_rdy_to_xfer(struct qla_tgt_cmd *cmd) |
6891 | return 0; |
6892 | } |
6893 | |
6894 | + /* Calculate number of entries and segments required */ |
6895 | + if (qlt_pci_map_calc_cnt(&prm) != 0) |
6896 | + return -EAGAIN; |
6897 | + |
6898 | spin_lock_irqsave(qpair->qp_lock_ptr, flags); |
6899 | /* Does F/W have an IOCBs for this request */ |
6900 | res = qlt_check_reserve_free_req(qpair, prm.req_cnt); |
6901 | @@ -3800,9 +3799,6 @@ void qlt_free_cmd(struct qla_tgt_cmd *cmd) |
6902 | |
6903 | BUG_ON(cmd->cmd_in_wq); |
6904 | |
6905 | - if (cmd->sg_mapped) |
6906 | - qlt_unmap_sg(cmd->vha, cmd); |
6907 | - |
6908 | if (!cmd->q_full) |
6909 | qlt_decr_num_pend_cmds(cmd->vha); |
6910 | |
6911 | diff --git a/drivers/soc/fsl/dpaa2-console.c b/drivers/soc/fsl/dpaa2-console.c |
6912 | index 27243f706f376..53917410f2bdb 100644 |
6913 | --- a/drivers/soc/fsl/dpaa2-console.c |
6914 | +++ b/drivers/soc/fsl/dpaa2-console.c |
6915 | @@ -231,6 +231,7 @@ static ssize_t dpaa2_console_read(struct file *fp, char __user *buf, |
6916 | cd->cur_ptr += bytes; |
6917 | written += bytes; |
6918 | |
6919 | + kfree(kbuf); |
6920 | return written; |
6921 | |
6922 | err_free_buf: |
6923 | diff --git a/drivers/soc/tegra/pmc.c b/drivers/soc/tegra/pmc.c |
6924 | index 0447afa970f5e..ab75f41e9c0c9 100644 |
6925 | --- a/drivers/soc/tegra/pmc.c |
6926 | +++ b/drivers/soc/tegra/pmc.c |
6927 | @@ -591,7 +591,7 @@ static int tegra_powergate_power_up(struct tegra_powergate *pg, |
6928 | |
6929 | err = reset_control_deassert(pg->reset); |
6930 | if (err) |
6931 | - goto powergate_off; |
6932 | + goto disable_clks; |
6933 | |
6934 | usleep_range(10, 20); |
6935 | |
6936 | diff --git a/drivers/spi/spi-bcm-qspi.c b/drivers/spi/spi-bcm-qspi.c |
6937 | index 8a4be34bccfd2..8a1176efa4c85 100644 |
6938 | --- a/drivers/spi/spi-bcm-qspi.c |
6939 | +++ b/drivers/spi/spi-bcm-qspi.c |
6940 | @@ -1300,7 +1300,7 @@ int bcm_qspi_probe(struct platform_device *pdev, |
6941 | &qspi->dev_ids[val]); |
6942 | if (ret < 0) { |
6943 | dev_err(&pdev->dev, "IRQ %s not found\n", name); |
6944 | - goto qspi_probe_err; |
6945 | + goto qspi_unprepare_err; |
6946 | } |
6947 | |
6948 | qspi->dev_ids[val].dev = qspi; |
6949 | @@ -1315,7 +1315,7 @@ int bcm_qspi_probe(struct platform_device *pdev, |
6950 | if (!num_ints) { |
6951 | dev_err(&pdev->dev, "no IRQs registered, cannot init driver\n"); |
6952 | ret = -EINVAL; |
6953 | - goto qspi_probe_err; |
6954 | + goto qspi_unprepare_err; |
6955 | } |
6956 | |
6957 | /* |
6958 | @@ -1359,6 +1359,7 @@ int bcm_qspi_probe(struct platform_device *pdev, |
6959 | |
6960 | qspi_reg_err: |
6961 | bcm_qspi_hw_uninit(qspi); |
6962 | +qspi_unprepare_err: |
6963 | clk_disable_unprepare(qspi->clk); |
6964 | qspi_probe_err: |
6965 | kfree(qspi->dev_ids); |
6966 | diff --git a/drivers/spi/spi-pl022.c b/drivers/spi/spi-pl022.c |
6967 | index 7fedea67159c5..8523bb4f6a62e 100644 |
6968 | --- a/drivers/spi/spi-pl022.c |
6969 | +++ b/drivers/spi/spi-pl022.c |
6970 | @@ -1720,12 +1720,13 @@ static int verify_controller_parameters(struct pl022 *pl022, |
6971 | return -EINVAL; |
6972 | } |
6973 | } else { |
6974 | - if (chip_info->duplex != SSP_MICROWIRE_CHANNEL_FULL_DUPLEX) |
6975 | + if (chip_info->duplex != SSP_MICROWIRE_CHANNEL_FULL_DUPLEX) { |
6976 | dev_err(&pl022->adev->dev, |
6977 | "Microwire half duplex mode requested," |
6978 | " but this is only available in the" |
6979 | " ST version of PL022\n"); |
6980 | - return -EINVAL; |
6981 | + return -EINVAL; |
6982 | + } |
6983 | } |
6984 | } |
6985 | return 0; |
6986 | diff --git a/drivers/staging/ks7010/Kconfig b/drivers/staging/ks7010/Kconfig |
6987 | index 0987fdc2f70db..8ea6c09286798 100644 |
6988 | --- a/drivers/staging/ks7010/Kconfig |
6989 | +++ b/drivers/staging/ks7010/Kconfig |
6990 | @@ -5,6 +5,9 @@ config KS7010 |
6991 | select WIRELESS_EXT |
6992 | select WEXT_PRIV |
6993 | select FW_LOADER |
6994 | + select CRYPTO |
6995 | + select CRYPTO_HASH |
6996 | + select CRYPTO_MICHAEL_MIC |
6997 | help |
6998 | This is a driver for KeyStream KS7010 based SDIO WIFI cards. It is |
6999 | found on at least later Spectec SDW-821 (FCC-ID "S2Y-WLAN-11G-K" only, |
7000 | diff --git a/drivers/staging/media/imx/imx-media-dev-common.c b/drivers/staging/media/imx/imx-media-dev-common.c |
7001 | index 66b505f7e8dff..137e414cda186 100644 |
7002 | --- a/drivers/staging/media/imx/imx-media-dev-common.c |
7003 | +++ b/drivers/staging/media/imx/imx-media-dev-common.c |
7004 | @@ -373,6 +373,8 @@ struct imx_media_dev *imx_media_dev_init(struct device *dev, |
7005 | imxmd->v4l2_dev.notify = imx_media_notify; |
7006 | strscpy(imxmd->v4l2_dev.name, "imx-media", |
7007 | sizeof(imxmd->v4l2_dev.name)); |
7008 | + snprintf(imxmd->md.bus_info, sizeof(imxmd->md.bus_info), |
7009 | + "platform:%s", dev_name(imxmd->md.dev)); |
7010 | |
7011 | media_device_init(&imxmd->md); |
7012 | |
7013 | diff --git a/drivers/staging/media/ipu3/ipu3-v4l2.c b/drivers/staging/media/ipu3/ipu3-v4l2.c |
7014 | index 908ae74aa970d..53239ea67fe48 100644 |
7015 | --- a/drivers/staging/media/ipu3/ipu3-v4l2.c |
7016 | +++ b/drivers/staging/media/ipu3/ipu3-v4l2.c |
7017 | @@ -594,11 +594,12 @@ static const struct imgu_fmt *find_format(struct v4l2_format *f, u32 type) |
7018 | static int imgu_vidioc_querycap(struct file *file, void *fh, |
7019 | struct v4l2_capability *cap) |
7020 | { |
7021 | - struct imgu_video_device *node = file_to_intel_imgu_node(file); |
7022 | + struct imgu_device *imgu = video_drvdata(file); |
7023 | |
7024 | strscpy(cap->driver, IMGU_NAME, sizeof(cap->driver)); |
7025 | strscpy(cap->card, IMGU_NAME, sizeof(cap->card)); |
7026 | - snprintf(cap->bus_info, sizeof(cap->bus_info), "PCI:%s", node->name); |
7027 | + snprintf(cap->bus_info, sizeof(cap->bus_info), "PCI:%s", |
7028 | + pci_name(imgu->pci_dev)); |
7029 | |
7030 | return 0; |
7031 | } |
7032 | @@ -695,7 +696,7 @@ static int imgu_fmt(struct imgu_device *imgu, unsigned int pipe, int node, |
7033 | |
7034 | /* CSS expects some format on OUT queue */ |
7035 | if (i != IPU3_CSS_QUEUE_OUT && |
7036 | - !imgu_pipe->nodes[inode].enabled) { |
7037 | + !imgu_pipe->nodes[inode].enabled && !try) { |
7038 | fmts[i] = NULL; |
7039 | continue; |
7040 | } |
7041 | diff --git a/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c b/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c |
7042 | index c3cd6f389a989..2a369fdaf0cbb 100644 |
7043 | --- a/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c |
7044 | +++ b/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c |
7045 | @@ -97,8 +97,7 @@ static void cfg_scan_result(enum scan_event scan_event, |
7046 | info->frame_len, |
7047 | (s32)info->rssi * 100, |
7048 | GFP_KERNEL); |
7049 | - if (!bss) |
7050 | - cfg80211_put_bss(wiphy, bss); |
7051 | + cfg80211_put_bss(wiphy, bss); |
7052 | } else if (scan_event == SCAN_EVENT_DONE) { |
7053 | mutex_lock(&priv->scan_req_lock); |
7054 | |
7055 | diff --git a/drivers/tty/serial/8250/8250_dw.c b/drivers/tty/serial/8250/8250_dw.c |
7056 | index 51a7d3b19b394..381c5117aec1b 100644 |
7057 | --- a/drivers/tty/serial/8250/8250_dw.c |
7058 | +++ b/drivers/tty/serial/8250/8250_dw.c |
7059 | @@ -660,7 +660,7 @@ static struct platform_driver dw8250_platform_driver = { |
7060 | .name = "dw-apb-uart", |
7061 | .pm = &dw8250_pm_ops, |
7062 | .of_match_table = dw8250_of_match, |
7063 | - .acpi_match_table = ACPI_PTR(dw8250_acpi_match), |
7064 | + .acpi_match_table = dw8250_acpi_match, |
7065 | }, |
7066 | .probe = dw8250_probe, |
7067 | .remove = dw8250_remove, |
7068 | diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c |
7069 | index fa3bd8a97b244..38ee13bbcab81 100644 |
7070 | --- a/drivers/tty/serial/serial_core.c |
7071 | +++ b/drivers/tty/serial/serial_core.c |
7072 | @@ -220,7 +220,11 @@ static int uart_port_startup(struct tty_struct *tty, struct uart_state *state, |
7073 | if (retval == 0) { |
7074 | if (uart_console(uport) && uport->cons->cflag) { |
7075 | tty->termios.c_cflag = uport->cons->cflag; |
7076 | + tty->termios.c_ispeed = uport->cons->ispeed; |
7077 | + tty->termios.c_ospeed = uport->cons->ospeed; |
7078 | uport->cons->cflag = 0; |
7079 | + uport->cons->ispeed = 0; |
7080 | + uport->cons->ospeed = 0; |
7081 | } |
7082 | /* |
7083 | * Initialise the hardware port settings. |
7084 | @@ -288,8 +292,11 @@ static void uart_shutdown(struct tty_struct *tty, struct uart_state *state) |
7085 | /* |
7086 | * Turn off DTR and RTS early. |
7087 | */ |
7088 | - if (uport && uart_console(uport) && tty) |
7089 | + if (uport && uart_console(uport) && tty) { |
7090 | uport->cons->cflag = tty->termios.c_cflag; |
7091 | + uport->cons->ispeed = tty->termios.c_ispeed; |
7092 | + uport->cons->ospeed = tty->termios.c_ospeed; |
7093 | + } |
7094 | |
7095 | if (!tty || C_HUPCL(tty)) |
7096 | uart_port_dtr_rts(uport, 0); |
7097 | @@ -2110,8 +2117,11 @@ uart_set_options(struct uart_port *port, struct console *co, |
7098 | * Allow the setting of the UART parameters with a NULL console |
7099 | * too: |
7100 | */ |
7101 | - if (co) |
7102 | + if (co) { |
7103 | co->cflag = termios.c_cflag; |
7104 | + co->ispeed = termios.c_ispeed; |
7105 | + co->ospeed = termios.c_ospeed; |
7106 | + } |
7107 | |
7108 | return 0; |
7109 | } |
7110 | @@ -2245,6 +2255,8 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *uport) |
7111 | */ |
7112 | memset(&termios, 0, sizeof(struct ktermios)); |
7113 | termios.c_cflag = uport->cons->cflag; |
7114 | + termios.c_ispeed = uport->cons->ispeed; |
7115 | + termios.c_ospeed = uport->cons->ospeed; |
7116 | |
7117 | /* |
7118 | * If that's unset, use the tty termios setting. |
7119 | diff --git a/drivers/tty/serial/xilinx_uartps.c b/drivers/tty/serial/xilinx_uartps.c |
7120 | index 9359c80fbb9f5..a1409251fbcc3 100644 |
7121 | --- a/drivers/tty/serial/xilinx_uartps.c |
7122 | +++ b/drivers/tty/serial/xilinx_uartps.c |
7123 | @@ -595,9 +595,10 @@ static void cdns_uart_start_tx(struct uart_port *port) |
7124 | if (uart_circ_empty(&port->state->xmit)) |
7125 | return; |
7126 | |
7127 | + writel(CDNS_UART_IXR_TXEMPTY, port->membase + CDNS_UART_ISR); |
7128 | + |
7129 | cdns_uart_handle_tx(port); |
7130 | |
7131 | - writel(CDNS_UART_IXR_TXEMPTY, port->membase + CDNS_UART_ISR); |
7132 | /* Enable the TX Empty interrupt */ |
7133 | writel(CDNS_UART_IXR_TXEMPTY, port->membase + CDNS_UART_IER); |
7134 | } |
7135 | diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c |
7136 | index b7da2a273c451..74cdc7ef476ae 100644 |
7137 | --- a/drivers/usb/chipidea/core.c |
7138 | +++ b/drivers/usb/chipidea/core.c |
7139 | @@ -534,7 +534,7 @@ int hw_device_reset(struct ci_hdrc *ci) |
7140 | return 0; |
7141 | } |
7142 | |
7143 | -static irqreturn_t ci_irq(int irq, void *data) |
7144 | +static irqreturn_t ci_irq_handler(int irq, void *data) |
7145 | { |
7146 | struct ci_hdrc *ci = data; |
7147 | irqreturn_t ret = IRQ_NONE; |
7148 | @@ -587,6 +587,15 @@ static irqreturn_t ci_irq(int irq, void *data) |
7149 | return ret; |
7150 | } |
7151 | |
7152 | +static void ci_irq(struct ci_hdrc *ci) |
7153 | +{ |
7154 | + unsigned long flags; |
7155 | + |
7156 | + local_irq_save(flags); |
7157 | + ci_irq_handler(ci->irq, ci); |
7158 | + local_irq_restore(flags); |
7159 | +} |
7160 | + |
7161 | static int ci_cable_notifier(struct notifier_block *nb, unsigned long event, |
7162 | void *ptr) |
7163 | { |
7164 | @@ -596,7 +605,7 @@ static int ci_cable_notifier(struct notifier_block *nb, unsigned long event, |
7165 | cbl->connected = event; |
7166 | cbl->changed = true; |
7167 | |
7168 | - ci_irq(ci->irq, ci); |
7169 | + ci_irq(ci); |
7170 | return NOTIFY_DONE; |
7171 | } |
7172 | |
7173 | @@ -634,7 +643,7 @@ static int ci_usb_role_switch_set(struct device *dev, enum usb_role role) |
7174 | if (cable) { |
7175 | cable->changed = true; |
7176 | cable->connected = false; |
7177 | - ci_irq(ci->irq, ci); |
7178 | + ci_irq(ci); |
7179 | spin_unlock_irqrestore(&ci->lock, flags); |
7180 | if (ci->wq && role != USB_ROLE_NONE) |
7181 | flush_workqueue(ci->wq); |
7182 | @@ -652,7 +661,7 @@ static int ci_usb_role_switch_set(struct device *dev, enum usb_role role) |
7183 | if (cable) { |
7184 | cable->changed = true; |
7185 | cable->connected = true; |
7186 | - ci_irq(ci->irq, ci); |
7187 | + ci_irq(ci); |
7188 | } |
7189 | spin_unlock_irqrestore(&ci->lock, flags); |
7190 | pm_runtime_put_sync(ci->dev); |
7191 | @@ -1156,7 +1165,7 @@ static int ci_hdrc_probe(struct platform_device *pdev) |
7192 | } |
7193 | } |
7194 | |
7195 | - ret = devm_request_irq(dev, ci->irq, ci_irq, IRQF_SHARED, |
7196 | + ret = devm_request_irq(dev, ci->irq, ci_irq_handler, IRQF_SHARED, |
7197 | ci->platdata->name, ci); |
7198 | if (ret) |
7199 | goto stop; |
7200 | @@ -1277,11 +1286,11 @@ static void ci_extcon_wakeup_int(struct ci_hdrc *ci) |
7201 | |
7202 | if (!IS_ERR(cable_id->edev) && ci->is_otg && |
7203 | (otgsc & OTGSC_IDIE) && (otgsc & OTGSC_IDIS)) |
7204 | - ci_irq(ci->irq, ci); |
7205 | + ci_irq(ci); |
7206 | |
7207 | if (!IS_ERR(cable_vbus->edev) && ci->is_otg && |
7208 | (otgsc & OTGSC_BSVIE) && (otgsc & OTGSC_BSVIS)) |
7209 | - ci_irq(ci->irq, ci); |
7210 | + ci_irq(ci); |
7211 | } |
7212 | |
7213 | static int ci_controller_resume(struct device *dev) |
7214 | diff --git a/drivers/usb/gadget/legacy/hid.c b/drivers/usb/gadget/legacy/hid.c |
7215 | index 5b27d289443fe..3912cc805f3af 100644 |
7216 | --- a/drivers/usb/gadget/legacy/hid.c |
7217 | +++ b/drivers/usb/gadget/legacy/hid.c |
7218 | @@ -99,8 +99,10 @@ static int do_config(struct usb_configuration *c) |
7219 | |
7220 | list_for_each_entry(e, &hidg_func_list, node) { |
7221 | e->f = usb_get_function(e->fi); |
7222 | - if (IS_ERR(e->f)) |
7223 | + if (IS_ERR(e->f)) { |
7224 | + status = PTR_ERR(e->f); |
7225 | goto put; |
7226 | + } |
7227 | status = usb_add_function(c, e->f); |
7228 | if (status < 0) { |
7229 | usb_put_function(e->f); |
7230 | diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c |
7231 | index 6358d4e0653ed..9a4260927ce31 100644 |
7232 | --- a/drivers/usb/host/xhci-hub.c |
7233 | +++ b/drivers/usb/host/xhci-hub.c |
7234 | @@ -171,7 +171,6 @@ static void xhci_common_hub_descriptor(struct xhci_hcd *xhci, |
7235 | { |
7236 | u16 temp; |
7237 | |
7238 | - desc->bPwrOn2PwrGood = 10; /* xhci section 5.4.9 says 20ms max */ |
7239 | desc->bHubContrCurrent = 0; |
7240 | |
7241 | desc->bNbrPorts = ports; |
7242 | @@ -206,6 +205,7 @@ static void xhci_usb2_hub_descriptor(struct usb_hcd *hcd, struct xhci_hcd *xhci, |
7243 | desc->bDescriptorType = USB_DT_HUB; |
7244 | temp = 1 + (ports / 8); |
7245 | desc->bDescLength = USB_DT_HUB_NONVAR_SIZE + 2 * temp; |
7246 | + desc->bPwrOn2PwrGood = 10; /* xhci section 5.4.8 says 20ms */ |
7247 | |
7248 | /* The Device Removable bits are reported on a byte granularity. |
7249 | * If the port doesn't exist within that byte, the bit is set to 0. |
7250 | @@ -258,6 +258,7 @@ static void xhci_usb3_hub_descriptor(struct usb_hcd *hcd, struct xhci_hcd *xhci, |
7251 | xhci_common_hub_descriptor(xhci, desc, ports); |
7252 | desc->bDescriptorType = USB_DT_SS_HUB; |
7253 | desc->bDescLength = USB_DT_SS_HUB_SIZE; |
7254 | + desc->bPwrOn2PwrGood = 50; /* usb 3.1 may fail if less than 100ms */ |
7255 | |
7256 | /* header decode latency should be zero for roothubs, |
7257 | * see section 4.23.5.2. |
7258 | diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c |
7259 | index ae8fa4ff05ee3..beee3543950fe 100644 |
7260 | --- a/drivers/usb/host/xhci-pci.c |
7261 | +++ b/drivers/usb/host/xhci-pci.c |
7262 | @@ -59,6 +59,13 @@ |
7263 | #define PCI_DEVICE_ID_AMD_PROMONTORYA_3 0x43ba |
7264 | #define PCI_DEVICE_ID_AMD_PROMONTORYA_2 0x43bb |
7265 | #define PCI_DEVICE_ID_AMD_PROMONTORYA_1 0x43bc |
7266 | +#define PCI_DEVICE_ID_AMD_YELLOW_CARP_XHCI_1 0x161a |
7267 | +#define PCI_DEVICE_ID_AMD_YELLOW_CARP_XHCI_2 0x161b |
7268 | +#define PCI_DEVICE_ID_AMD_YELLOW_CARP_XHCI_3 0x161d |
7269 | +#define PCI_DEVICE_ID_AMD_YELLOW_CARP_XHCI_4 0x161e |
7270 | +#define PCI_DEVICE_ID_AMD_YELLOW_CARP_XHCI_5 0x15d6 |
7271 | +#define PCI_DEVICE_ID_AMD_YELLOW_CARP_XHCI_6 0x15d7 |
7272 | + |
7273 | #define PCI_DEVICE_ID_ASMEDIA_1042_XHCI 0x1042 |
7274 | #define PCI_DEVICE_ID_ASMEDIA_1042A_XHCI 0x1142 |
7275 | #define PCI_DEVICE_ID_ASMEDIA_1142_XHCI 0x1242 |
7276 | @@ -290,6 +297,15 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) |
7277 | pdev->device == PCI_DEVICE_ID_AMD_PROMONTORYA_4)) |
7278 | xhci->quirks |= XHCI_NO_SOFT_RETRY; |
7279 | |
7280 | + if (pdev->vendor == PCI_VENDOR_ID_AMD && |
7281 | + (pdev->device == PCI_DEVICE_ID_AMD_YELLOW_CARP_XHCI_1 || |
7282 | + pdev->device == PCI_DEVICE_ID_AMD_YELLOW_CARP_XHCI_2 || |
7283 | + pdev->device == PCI_DEVICE_ID_AMD_YELLOW_CARP_XHCI_3 || |
7284 | + pdev->device == PCI_DEVICE_ID_AMD_YELLOW_CARP_XHCI_4 || |
7285 | + pdev->device == PCI_DEVICE_ID_AMD_YELLOW_CARP_XHCI_5 || |
7286 | + pdev->device == PCI_DEVICE_ID_AMD_YELLOW_CARP_XHCI_6)) |
7287 | + xhci->quirks |= XHCI_DEFAULT_PM_RUNTIME_ALLOW; |
7288 | + |
7289 | if (xhci->quirks & XHCI_RESET_ON_RESUME) |
7290 | xhci_dbg_trace(xhci, trace_xhci_dbg_quirks, |
7291 | "QUIRK: Resetting on resume"); |
7292 | diff --git a/drivers/usb/misc/iowarrior.c b/drivers/usb/misc/iowarrior.c |
7293 | index 103c69c692bad..888defdea546f 100644 |
7294 | --- a/drivers/usb/misc/iowarrior.c |
7295 | +++ b/drivers/usb/misc/iowarrior.c |
7296 | @@ -99,10 +99,6 @@ struct iowarrior { |
7297 | /* globals */ |
7298 | /*--------------*/ |
7299 | |
7300 | -/* |
7301 | - * USB spec identifies 5 second timeouts. |
7302 | - */ |
7303 | -#define GET_TIMEOUT 5 |
7304 | #define USB_REQ_GET_REPORT 0x01 |
7305 | //#if 0 |
7306 | static int usb_get_report(struct usb_device *dev, |
7307 | @@ -114,7 +110,7 @@ static int usb_get_report(struct usb_device *dev, |
7308 | USB_DIR_IN | USB_TYPE_CLASS | |
7309 | USB_RECIP_INTERFACE, (type << 8) + id, |
7310 | inter->desc.bInterfaceNumber, buf, size, |
7311 | - GET_TIMEOUT*HZ); |
7312 | + USB_CTRL_GET_TIMEOUT); |
7313 | } |
7314 | //#endif |
7315 | |
7316 | @@ -129,7 +125,7 @@ static int usb_set_report(struct usb_interface *intf, unsigned char type, |
7317 | USB_TYPE_CLASS | USB_RECIP_INTERFACE, |
7318 | (type << 8) + id, |
7319 | intf->cur_altsetting->desc.bInterfaceNumber, buf, |
7320 | - size, HZ); |
7321 | + size, 1000); |
7322 | } |
7323 | |
7324 | /*---------------------*/ |
7325 | diff --git a/drivers/usb/serial/keyspan.c b/drivers/usb/serial/keyspan.c |
7326 | index aa3dbce22cfbe..451759f38b573 100644 |
7327 | --- a/drivers/usb/serial/keyspan.c |
7328 | +++ b/drivers/usb/serial/keyspan.c |
7329 | @@ -2910,22 +2910,22 @@ static int keyspan_port_probe(struct usb_serial_port *port) |
7330 | for (i = 0; i < ARRAY_SIZE(p_priv->in_buffer); ++i) { |
7331 | p_priv->in_buffer[i] = kzalloc(IN_BUFLEN, GFP_KERNEL); |
7332 | if (!p_priv->in_buffer[i]) |
7333 | - goto err_in_buffer; |
7334 | + goto err_free_in_buffer; |
7335 | } |
7336 | |
7337 | for (i = 0; i < ARRAY_SIZE(p_priv->out_buffer); ++i) { |
7338 | p_priv->out_buffer[i] = kzalloc(OUT_BUFLEN, GFP_KERNEL); |
7339 | if (!p_priv->out_buffer[i]) |
7340 | - goto err_out_buffer; |
7341 | + goto err_free_out_buffer; |
7342 | } |
7343 | |
7344 | p_priv->inack_buffer = kzalloc(INACK_BUFLEN, GFP_KERNEL); |
7345 | if (!p_priv->inack_buffer) |
7346 | - goto err_inack_buffer; |
7347 | + goto err_free_out_buffer; |
7348 | |
7349 | p_priv->outcont_buffer = kzalloc(OUTCONT_BUFLEN, GFP_KERNEL); |
7350 | if (!p_priv->outcont_buffer) |
7351 | - goto err_outcont_buffer; |
7352 | + goto err_free_inack_buffer; |
7353 | |
7354 | p_priv->device_details = d_details; |
7355 | |
7356 | @@ -2971,15 +2971,14 @@ static int keyspan_port_probe(struct usb_serial_port *port) |
7357 | |
7358 | return 0; |
7359 | |
7360 | -err_outcont_buffer: |
7361 | +err_free_inack_buffer: |
7362 | kfree(p_priv->inack_buffer); |
7363 | -err_inack_buffer: |
7364 | +err_free_out_buffer: |
7365 | for (i = 0; i < ARRAY_SIZE(p_priv->out_buffer); ++i) |
7366 | kfree(p_priv->out_buffer[i]); |
7367 | -err_out_buffer: |
7368 | +err_free_in_buffer: |
7369 | for (i = 0; i < ARRAY_SIZE(p_priv->in_buffer); ++i) |
7370 | kfree(p_priv->in_buffer[i]); |
7371 | -err_in_buffer: |
7372 | kfree(p_priv); |
7373 | |
7374 | return -ENOMEM; |
7375 | diff --git a/drivers/video/backlight/backlight.c b/drivers/video/backlight/backlight.c |
7376 | index cac3e35d76308..813a264a1b119 100644 |
7377 | --- a/drivers/video/backlight/backlight.c |
7378 | +++ b/drivers/video/backlight/backlight.c |
7379 | @@ -630,12 +630,6 @@ struct backlight_device *of_find_backlight(struct device *dev) |
7380 | of_node_put(np); |
7381 | if (!bd) |
7382 | return ERR_PTR(-EPROBE_DEFER); |
7383 | - /* |
7384 | - * Note: gpio_backlight uses brightness as |
7385 | - * power state during probe |
7386 | - */ |
7387 | - if (!bd->props.brightness) |
7388 | - bd->props.brightness = bd->props.max_brightness; |
7389 | } |
7390 | } |
7391 | |
7392 | diff --git a/drivers/video/fbdev/chipsfb.c b/drivers/video/fbdev/chipsfb.c |
7393 | index f4dc320dcafe2..80fdd3ee0565f 100644 |
7394 | --- a/drivers/video/fbdev/chipsfb.c |
7395 | +++ b/drivers/video/fbdev/chipsfb.c |
7396 | @@ -331,7 +331,7 @@ static const struct fb_var_screeninfo chipsfb_var = { |
7397 | |
7398 | static void init_chips(struct fb_info *p, unsigned long addr) |
7399 | { |
7400 | - memset(p->screen_base, 0, 0x100000); |
7401 | + fb_memset(p->screen_base, 0, 0x100000); |
7402 | |
7403 | p->fix = chipsfb_fix; |
7404 | p->fix.smem_start = addr; |
7405 | diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig |
7406 | index 1aa42e879e633..3fabd4177b0ee 100644 |
7407 | --- a/drivers/watchdog/Kconfig |
7408 | +++ b/drivers/watchdog/Kconfig |
7409 | @@ -1682,7 +1682,7 @@ config SIBYTE_WDOG |
7410 | |
7411 | config AR7_WDT |
7412 | tristate "TI AR7 Watchdog Timer" |
7413 | - depends on AR7 || (MIPS && COMPILE_TEST) |
7414 | + depends on AR7 || (MIPS && 32BIT && COMPILE_TEST) |
7415 | help |
7416 | Hardware driver for the TI AR7 Watchdog Timer. |
7417 | |
7418 | diff --git a/drivers/watchdog/f71808e_wdt.c b/drivers/watchdog/f71808e_wdt.c |
7419 | index 893cef70c1599..aa57498009c34 100644 |
7420 | --- a/drivers/watchdog/f71808e_wdt.c |
7421 | +++ b/drivers/watchdog/f71808e_wdt.c |
7422 | @@ -228,15 +228,17 @@ static int watchdog_set_timeout(int timeout) |
7423 | |
7424 | mutex_lock(&watchdog.lock); |
7425 | |
7426 | - watchdog.timeout = timeout; |
7427 | if (timeout > 0xff) { |
7428 | watchdog.timer_val = DIV_ROUND_UP(timeout, 60); |
7429 | watchdog.minutes_mode = true; |
7430 | + timeout = watchdog.timer_val * 60; |
7431 | } else { |
7432 | watchdog.timer_val = timeout; |
7433 | watchdog.minutes_mode = false; |
7434 | } |
7435 | |
7436 | + watchdog.timeout = timeout; |
7437 | + |
7438 | mutex_unlock(&watchdog.lock); |
7439 | |
7440 | return 0; |
7441 | diff --git a/drivers/watchdog/omap_wdt.c b/drivers/watchdog/omap_wdt.c |
7442 | index 9b91882fe3c41..6d7ccbc0b666c 100644 |
7443 | --- a/drivers/watchdog/omap_wdt.c |
7444 | +++ b/drivers/watchdog/omap_wdt.c |
7445 | @@ -268,8 +268,12 @@ static int omap_wdt_probe(struct platform_device *pdev) |
7446 | wdev->wdog.bootstatus = WDIOF_CARDRESET; |
7447 | } |
7448 | |
7449 | - if (!early_enable) |
7450 | + if (early_enable) { |
7451 | + omap_wdt_start(&wdev->wdog); |
7452 | + set_bit(WDOG_HW_RUNNING, &wdev->wdog.status); |
7453 | + } else { |
7454 | omap_wdt_disable(wdev); |
7455 | + } |
7456 | |
7457 | ret = watchdog_register_device(&wdev->wdog); |
7458 | if (ret) { |
7459 | diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c |
7460 | index 07f362c63ae90..39bbb127852f9 100644 |
7461 | --- a/drivers/xen/balloon.c |
7462 | +++ b/drivers/xen/balloon.c |
7463 | @@ -58,6 +58,7 @@ |
7464 | #include <linux/percpu-defs.h> |
7465 | #include <linux/slab.h> |
7466 | #include <linux/sysctl.h> |
7467 | +#include <linux/moduleparam.h> |
7468 | |
7469 | #include <asm/page.h> |
7470 | #include <asm/pgalloc.h> |
7471 | @@ -75,6 +76,12 @@ |
7472 | #include <xen/page.h> |
7473 | #include <xen/mem-reservation.h> |
7474 | |
7475 | +#undef MODULE_PARAM_PREFIX |
7476 | +#define MODULE_PARAM_PREFIX "xen." |
7477 | + |
7478 | +static uint __read_mostly balloon_boot_timeout = 180; |
7479 | +module_param(balloon_boot_timeout, uint, 0444); |
7480 | + |
7481 | static int xen_hotplug_unpopulated; |
7482 | |
7483 | #ifdef CONFIG_XEN_BALLOON_MEMORY_HOTPLUG |
7484 | @@ -127,12 +134,12 @@ static struct ctl_table xen_root[] = { |
7485 | * BP_ECANCELED: error, balloon operation canceled. |
7486 | */ |
7487 | |
7488 | -enum bp_state { |
7489 | +static enum bp_state { |
7490 | BP_DONE, |
7491 | BP_WAIT, |
7492 | BP_EAGAIN, |
7493 | BP_ECANCELED |
7494 | -}; |
7495 | +} balloon_state = BP_DONE; |
7496 | |
7497 | /* Main waiting point for xen-balloon thread. */ |
7498 | static DECLARE_WAIT_QUEUE_HEAD(balloon_thread_wq); |
7499 | @@ -201,18 +208,15 @@ static struct page *balloon_next_page(struct page *page) |
7500 | return list_entry(next, struct page, lru); |
7501 | } |
7502 | |
7503 | -static enum bp_state update_schedule(enum bp_state state) |
7504 | +static void update_schedule(void) |
7505 | { |
7506 | - if (state == BP_WAIT) |
7507 | - return BP_WAIT; |
7508 | - |
7509 | - if (state == BP_ECANCELED) |
7510 | - return BP_ECANCELED; |
7511 | + if (balloon_state == BP_WAIT || balloon_state == BP_ECANCELED) |
7512 | + return; |
7513 | |
7514 | - if (state == BP_DONE) { |
7515 | + if (balloon_state == BP_DONE) { |
7516 | balloon_stats.schedule_delay = 1; |
7517 | balloon_stats.retry_count = 1; |
7518 | - return BP_DONE; |
7519 | + return; |
7520 | } |
7521 | |
7522 | ++balloon_stats.retry_count; |
7523 | @@ -221,7 +225,8 @@ static enum bp_state update_schedule(enum bp_state state) |
7524 | balloon_stats.retry_count > balloon_stats.max_retry_count) { |
7525 | balloon_stats.schedule_delay = 1; |
7526 | balloon_stats.retry_count = 1; |
7527 | - return BP_ECANCELED; |
7528 | + balloon_state = BP_ECANCELED; |
7529 | + return; |
7530 | } |
7531 | |
7532 | balloon_stats.schedule_delay <<= 1; |
7533 | @@ -229,7 +234,7 @@ static enum bp_state update_schedule(enum bp_state state) |
7534 | if (balloon_stats.schedule_delay > balloon_stats.max_schedule_delay) |
7535 | balloon_stats.schedule_delay = balloon_stats.max_schedule_delay; |
7536 | |
7537 | - return BP_EAGAIN; |
7538 | + balloon_state = BP_EAGAIN; |
7539 | } |
7540 | |
7541 | #ifdef CONFIG_XEN_BALLOON_MEMORY_HOTPLUG |
7542 | @@ -511,9 +516,9 @@ static enum bp_state decrease_reservation(unsigned long nr_pages, gfp_t gfp) |
7543 | * Stop waiting if either state is BP_DONE and ballooning action is |
7544 | * needed, or if the credit has changed while state is not BP_DONE. |
7545 | */ |
7546 | -static bool balloon_thread_cond(enum bp_state state, long credit) |
7547 | +static bool balloon_thread_cond(long credit) |
7548 | { |
7549 | - if (state == BP_DONE) |
7550 | + if (balloon_state == BP_DONE) |
7551 | credit = 0; |
7552 | |
7553 | return current_credit() != credit || kthread_should_stop(); |
7554 | @@ -527,13 +532,12 @@ static bool balloon_thread_cond(enum bp_state state, long credit) |
7555 | */ |
7556 | static int balloon_thread(void *unused) |
7557 | { |
7558 | - enum bp_state state = BP_DONE; |
7559 | long credit; |
7560 | unsigned long timeout; |
7561 | |
7562 | set_freezable(); |
7563 | for (;;) { |
7564 | - switch (state) { |
7565 | + switch (balloon_state) { |
7566 | case BP_DONE: |
7567 | case BP_ECANCELED: |
7568 | timeout = 3600 * HZ; |
7569 | @@ -549,7 +553,7 @@ static int balloon_thread(void *unused) |
7570 | credit = current_credit(); |
7571 | |
7572 | wait_event_freezable_timeout(balloon_thread_wq, |
7573 | - balloon_thread_cond(state, credit), timeout); |
7574 | + balloon_thread_cond(credit), timeout); |
7575 | |
7576 | if (kthread_should_stop()) |
7577 | return 0; |
7578 | @@ -560,22 +564,23 @@ static int balloon_thread(void *unused) |
7579 | |
7580 | if (credit > 0) { |
7581 | if (balloon_is_inflated()) |
7582 | - state = increase_reservation(credit); |
7583 | + balloon_state = increase_reservation(credit); |
7584 | else |
7585 | - state = reserve_additional_memory(); |
7586 | + balloon_state = reserve_additional_memory(); |
7587 | } |
7588 | |
7589 | if (credit < 0) { |
7590 | long n_pages; |
7591 | |
7592 | n_pages = min(-credit, si_mem_available()); |
7593 | - state = decrease_reservation(n_pages, GFP_BALLOON); |
7594 | - if (state == BP_DONE && n_pages != -credit && |
7595 | + balloon_state = decrease_reservation(n_pages, |
7596 | + GFP_BALLOON); |
7597 | + if (balloon_state == BP_DONE && n_pages != -credit && |
7598 | n_pages < totalreserve_pages) |
7599 | - state = BP_EAGAIN; |
7600 | + balloon_state = BP_EAGAIN; |
7601 | } |
7602 | |
7603 | - state = update_schedule(state); |
7604 | + update_schedule(); |
7605 | |
7606 | mutex_unlock(&balloon_mutex); |
7607 | |
7608 | @@ -782,3 +787,38 @@ static int __init balloon_init(void) |
7609 | return 0; |
7610 | } |
7611 | subsys_initcall(balloon_init); |
7612 | + |
7613 | +static int __init balloon_wait_finish(void) |
7614 | +{ |
7615 | + long credit, last_credit = 0; |
7616 | + unsigned long last_changed = 0; |
7617 | + |
7618 | + if (!xen_domain()) |
7619 | + return -ENODEV; |
7620 | + |
7621 | + /* PV guests don't need to wait. */ |
7622 | + if (xen_pv_domain() || !current_credit()) |
7623 | + return 0; |
7624 | + |
7625 | + pr_notice("Waiting for initial ballooning down having finished.\n"); |
7626 | + |
7627 | + while ((credit = current_credit()) < 0) { |
7628 | + if (credit != last_credit) { |
7629 | + last_changed = jiffies; |
7630 | + last_credit = credit; |
7631 | + } |
7632 | + if (balloon_state == BP_ECANCELED) { |
7633 | + pr_warn_once("Initial ballooning failed, %ld pages need to be freed.\n", |
7634 | + -credit); |
7635 | + if (jiffies - last_changed >= HZ * balloon_boot_timeout) |
7636 | + panic("Initial ballooning failed!\n"); |
7637 | + } |
7638 | + |
7639 | + schedule_timeout_interruptible(HZ / 10); |
7640 | + } |
7641 | + |
7642 | + pr_notice("Initial ballooning down finished.\n"); |
7643 | + |
7644 | + return 0; |
7645 | +} |
7646 | +late_initcall_sync(balloon_wait_finish); |
7647 | diff --git a/drivers/xen/xen-pciback/conf_space_capability.c b/drivers/xen/xen-pciback/conf_space_capability.c |
7648 | index e5694133ebe57..42f0f64fcba47 100644 |
7649 | --- a/drivers/xen/xen-pciback/conf_space_capability.c |
7650 | +++ b/drivers/xen/xen-pciback/conf_space_capability.c |
7651 | @@ -160,7 +160,7 @@ static void *pm_ctrl_init(struct pci_dev *dev, int offset) |
7652 | } |
7653 | |
7654 | out: |
7655 | - return ERR_PTR(err); |
7656 | + return err ? ERR_PTR(err) : NULL; |
7657 | } |
7658 | |
7659 | static const struct config_field caplist_pm[] = { |
7660 | diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c |
7661 | index 946ae198b3449..1499531bc1511 100644 |
7662 | --- a/fs/btrfs/disk-io.c |
7663 | +++ b/fs/btrfs/disk-io.c |
7664 | @@ -3145,7 +3145,8 @@ retry_root_backup: |
7665 | goto fail_sysfs; |
7666 | } |
7667 | |
7668 | - if (!sb_rdonly(sb) && !btrfs_check_rw_degradable(fs_info, NULL)) { |
7669 | + if (!sb_rdonly(sb) && fs_info->fs_devices->missing_devices && |
7670 | + !btrfs_check_rw_degradable(fs_info, NULL)) { |
7671 | btrfs_warn(fs_info, |
7672 | "writable mount is not allowed due to too many missing devices"); |
7673 | goto fail_sysfs; |
7674 | diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c |
7675 | index f342055699870..7bc4477d7ee7d 100644 |
7676 | --- a/fs/btrfs/tree-log.c |
7677 | +++ b/fs/btrfs/tree-log.c |
7678 | @@ -2490,7 +2490,9 @@ again: |
7679 | else { |
7680 | ret = find_dir_range(log, path, dirid, key_type, |
7681 | &range_start, &range_end); |
7682 | - if (ret != 0) |
7683 | + if (ret < 0) |
7684 | + goto out; |
7685 | + else if (ret > 0) |
7686 | break; |
7687 | } |
7688 | |
7689 | diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c |
7690 | index f302bbb93f32c..344d18de1f08c 100644 |
7691 | --- a/fs/btrfs/volumes.c |
7692 | +++ b/fs/btrfs/volumes.c |
7693 | @@ -1315,8 +1315,10 @@ static void btrfs_close_one_device(struct btrfs_device *device) |
7694 | if (device->devid == BTRFS_DEV_REPLACE_DEVID) |
7695 | clear_bit(BTRFS_DEV_STATE_REPLACE_TGT, &device->dev_state); |
7696 | |
7697 | - if (test_bit(BTRFS_DEV_STATE_MISSING, &device->dev_state)) |
7698 | + if (test_bit(BTRFS_DEV_STATE_MISSING, &device->dev_state)) { |
7699 | + clear_bit(BTRFS_DEV_STATE_MISSING, &device->dev_state); |
7700 | fs_devices->missing_devices--; |
7701 | + } |
7702 | |
7703 | btrfs_close_bdev(device); |
7704 | |
7705 | @@ -2160,8 +2162,11 @@ int btrfs_rm_device(struct btrfs_fs_info *fs_info, const char *device_path, |
7706 | u64 num_devices; |
7707 | int ret = 0; |
7708 | |
7709 | - mutex_lock(&uuid_mutex); |
7710 | - |
7711 | + /* |
7712 | + * The device list in fs_devices is accessed without locks (neither |
7713 | + * uuid_mutex nor device_list_mutex) as it won't change on a mounted |
7714 | + * filesystem and another device rm cannot run. |
7715 | + */ |
7716 | num_devices = btrfs_num_devices(fs_info); |
7717 | |
7718 | ret = btrfs_check_raid_min_devices(fs_info, num_devices - 1); |
7719 | @@ -2205,11 +2210,9 @@ int btrfs_rm_device(struct btrfs_fs_info *fs_info, const char *device_path, |
7720 | mutex_unlock(&fs_info->chunk_mutex); |
7721 | } |
7722 | |
7723 | - mutex_unlock(&uuid_mutex); |
7724 | ret = btrfs_shrink_device(device, 0); |
7725 | if (!ret) |
7726 | btrfs_reada_remove_dev(device); |
7727 | - mutex_lock(&uuid_mutex); |
7728 | if (ret) |
7729 | goto error_undo; |
7730 | |
7731 | @@ -2291,7 +2294,6 @@ int btrfs_rm_device(struct btrfs_fs_info *fs_info, const char *device_path, |
7732 | } |
7733 | |
7734 | out: |
7735 | - mutex_unlock(&uuid_mutex); |
7736 | return ret; |
7737 | |
7738 | error_undo: |
7739 | diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c |
7740 | index 502bd491336a8..2383d52b1f424 100644 |
7741 | --- a/fs/f2fs/inode.c |
7742 | +++ b/fs/f2fs/inode.c |
7743 | @@ -455,7 +455,7 @@ make_now: |
7744 | inode->i_op = &f2fs_dir_inode_operations; |
7745 | inode->i_fop = &f2fs_dir_operations; |
7746 | inode->i_mapping->a_ops = &f2fs_dblock_aops; |
7747 | - inode_nohighmem(inode); |
7748 | + mapping_set_gfp_mask(inode->i_mapping, GFP_NOFS); |
7749 | } else if (S_ISLNK(inode->i_mode)) { |
7750 | if (file_is_encrypt(inode)) |
7751 | inode->i_op = &f2fs_encrypted_symlink_inode_operations; |
7752 | diff --git a/fs/f2fs/namei.c b/fs/f2fs/namei.c |
7753 | index 81a18ba18e301..ed95c27e93026 100644 |
7754 | --- a/fs/f2fs/namei.c |
7755 | +++ b/fs/f2fs/namei.c |
7756 | @@ -679,7 +679,7 @@ static int f2fs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) |
7757 | inode->i_op = &f2fs_dir_inode_operations; |
7758 | inode->i_fop = &f2fs_dir_operations; |
7759 | inode->i_mapping->a_ops = &f2fs_dblock_aops; |
7760 | - inode_nohighmem(inode); |
7761 | + mapping_set_gfp_mask(inode->i_mapping, GFP_NOFS); |
7762 | |
7763 | set_inode_flag(inode, FI_INC_LINK); |
7764 | f2fs_lock_op(sbi); |
7765 | diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c |
7766 | index 7205a89fbb5f3..fa4d2aba5a701 100644 |
7767 | --- a/fs/fuse/dev.c |
7768 | +++ b/fs/fuse/dev.c |
7769 | @@ -839,6 +839,12 @@ static int fuse_try_move_page(struct fuse_copy_state *cs, struct page **pagep) |
7770 | goto out_put_old; |
7771 | } |
7772 | |
7773 | + /* |
7774 | + * Release while we have extra ref on stolen page. Otherwise |
7775 | + * anon_pipe_buf_release() might think the page can be reused. |
7776 | + */ |
7777 | + pipe_buf_release(cs->pipe, buf); |
7778 | + |
7779 | get_page(newpage); |
7780 | |
7781 | if (!(buf->flags & PIPE_BUF_FLAG_LRU)) |
7782 | @@ -2027,8 +2033,12 @@ static ssize_t fuse_dev_splice_write(struct pipe_inode_info *pipe, |
7783 | |
7784 | pipe_lock(pipe); |
7785 | out_free: |
7786 | - for (idx = 0; idx < nbuf; idx++) |
7787 | - pipe_buf_release(pipe, &bufs[idx]); |
7788 | + for (idx = 0; idx < nbuf; idx++) { |
7789 | + struct pipe_buffer *buf = &bufs[idx]; |
7790 | + |
7791 | + if (buf->ops) |
7792 | + pipe_buf_release(pipe, buf); |
7793 | + } |
7794 | pipe_unlock(pipe); |
7795 | |
7796 | kvfree(bufs); |
7797 | diff --git a/fs/jfs/jfs_mount.c b/fs/jfs/jfs_mount.c |
7798 | index 616de103dccc5..d41733540df91 100644 |
7799 | --- a/fs/jfs/jfs_mount.c |
7800 | +++ b/fs/jfs/jfs_mount.c |
7801 | @@ -80,14 +80,14 @@ int jfs_mount(struct super_block *sb) |
7802 | * (initialize mount inode from the superblock) |
7803 | */ |
7804 | if ((rc = chkSuper(sb))) { |
7805 | - goto errout20; |
7806 | + goto out; |
7807 | } |
7808 | |
7809 | ipaimap = diReadSpecial(sb, AGGREGATE_I, 0); |
7810 | if (ipaimap == NULL) { |
7811 | jfs_err("jfs_mount: Failed to read AGGREGATE_I"); |
7812 | rc = -EIO; |
7813 | - goto errout20; |
7814 | + goto out; |
7815 | } |
7816 | sbi->ipaimap = ipaimap; |
7817 | |
7818 | @@ -98,7 +98,7 @@ int jfs_mount(struct super_block *sb) |
7819 | */ |
7820 | if ((rc = diMount(ipaimap))) { |
7821 | jfs_err("jfs_mount: diMount(ipaimap) failed w/rc = %d", rc); |
7822 | - goto errout21; |
7823 | + goto err_ipaimap; |
7824 | } |
7825 | |
7826 | /* |
7827 | @@ -107,7 +107,7 @@ int jfs_mount(struct super_block *sb) |
7828 | ipbmap = diReadSpecial(sb, BMAP_I, 0); |
7829 | if (ipbmap == NULL) { |
7830 | rc = -EIO; |
7831 | - goto errout22; |
7832 | + goto err_umount_ipaimap; |
7833 | } |
7834 | |
7835 | jfs_info("jfs_mount: ipbmap:0x%p", ipbmap); |
7836 | @@ -119,7 +119,7 @@ int jfs_mount(struct super_block *sb) |
7837 | */ |
7838 | if ((rc = dbMount(ipbmap))) { |
7839 | jfs_err("jfs_mount: dbMount failed w/rc = %d", rc); |
7840 | - goto errout22; |
7841 | + goto err_ipbmap; |
7842 | } |
7843 | |
7844 | /* |
7845 | @@ -138,7 +138,7 @@ int jfs_mount(struct super_block *sb) |
7846 | if (!ipaimap2) { |
7847 | jfs_err("jfs_mount: Failed to read AGGREGATE_I"); |
7848 | rc = -EIO; |
7849 | - goto errout35; |
7850 | + goto err_umount_ipbmap; |
7851 | } |
7852 | sbi->ipaimap2 = ipaimap2; |
7853 | |
7854 | @@ -150,7 +150,7 @@ int jfs_mount(struct super_block *sb) |
7855 | if ((rc = diMount(ipaimap2))) { |
7856 | jfs_err("jfs_mount: diMount(ipaimap2) failed, rc = %d", |
7857 | rc); |
7858 | - goto errout35; |
7859 | + goto err_ipaimap2; |
7860 | } |
7861 | } else |
7862 | /* Secondary aggregate inode table is not valid */ |
7863 | @@ -167,7 +167,7 @@ int jfs_mount(struct super_block *sb) |
7864 | jfs_err("jfs_mount: Failed to read FILESYSTEM_I"); |
7865 | /* open fileset secondary inode allocation map */ |
7866 | rc = -EIO; |
7867 | - goto errout40; |
7868 | + goto err_umount_ipaimap2; |
7869 | } |
7870 | jfs_info("jfs_mount: ipimap:0x%p", ipimap); |
7871 | |
7872 | @@ -177,41 +177,34 @@ int jfs_mount(struct super_block *sb) |
7873 | /* initialize fileset inode allocation map */ |
7874 | if ((rc = diMount(ipimap))) { |
7875 | jfs_err("jfs_mount: diMount failed w/rc = %d", rc); |
7876 | - goto errout41; |
7877 | + goto err_ipimap; |
7878 | } |
7879 | |
7880 | - goto out; |
7881 | + return rc; |
7882 | |
7883 | /* |
7884 | * unwind on error |
7885 | */ |
7886 | - errout41: /* close fileset inode allocation map inode */ |
7887 | +err_ipimap: |
7888 | + /* close fileset inode allocation map inode */ |
7889 | diFreeSpecial(ipimap); |
7890 | - |
7891 | - errout40: /* fileset closed */ |
7892 | - |
7893 | +err_umount_ipaimap2: |
7894 | /* close secondary aggregate inode allocation map */ |
7895 | - if (ipaimap2) { |
7896 | + if (ipaimap2) |
7897 | diUnmount(ipaimap2, 1); |
7898 | +err_ipaimap2: |
7899 | + /* close aggregate inodes */ |
7900 | + if (ipaimap2) |
7901 | diFreeSpecial(ipaimap2); |
7902 | - } |
7903 | - |
7904 | - errout35: |
7905 | - |
7906 | - /* close aggregate block allocation map */ |
7907 | +err_umount_ipbmap: /* close aggregate block allocation map */ |
7908 | dbUnmount(ipbmap, 1); |
7909 | +err_ipbmap: /* close aggregate inodes */ |
7910 | diFreeSpecial(ipbmap); |
7911 | - |
7912 | - errout22: /* close aggregate inode allocation map */ |
7913 | - |
7914 | +err_umount_ipaimap: /* close aggregate inode allocation map */ |
7915 | diUnmount(ipaimap, 1); |
7916 | - |
7917 | - errout21: /* close aggregate inodes */ |
7918 | +err_ipaimap: /* close aggregate inodes */ |
7919 | diFreeSpecial(ipaimap); |
7920 | - errout20: /* aggregate closed */ |
7921 | - |
7922 | - out: |
7923 | - |
7924 | +out: |
7925 | if (rc) |
7926 | jfs_err("Mount JFS Failure: %d", rc); |
7927 | |
7928 | diff --git a/fs/nfs/flexfilelayout/flexfilelayoutdev.c b/fs/nfs/flexfilelayout/flexfilelayoutdev.c |
7929 | index 3eda40a320a53..1f12297109b41 100644 |
7930 | --- a/fs/nfs/flexfilelayout/flexfilelayoutdev.c |
7931 | +++ b/fs/nfs/flexfilelayout/flexfilelayoutdev.c |
7932 | @@ -378,10 +378,10 @@ nfs4_ff_layout_prepare_ds(struct pnfs_layout_segment *lseg, |
7933 | goto noconnect; |
7934 | |
7935 | ds = mirror->mirror_ds->ds; |
7936 | + if (READ_ONCE(ds->ds_clp)) |
7937 | + goto out; |
7938 | /* matching smp_wmb() in _nfs4_pnfs_v3/4_ds_connect */ |
7939 | smp_rmb(); |
7940 | - if (ds->ds_clp) |
7941 | - goto out; |
7942 | |
7943 | /* FIXME: For now we assume the server sent only one version of NFS |
7944 | * to use for the DS. |
7945 | diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c |
7946 | index 5ecaf7b6b0fa1..fb3d1532f11dd 100644 |
7947 | --- a/fs/nfs/nfs4proc.c |
7948 | +++ b/fs/nfs/nfs4proc.c |
7949 | @@ -1549,15 +1549,16 @@ static bool nfs_stateid_is_sequential(struct nfs4_state *state, |
7950 | { |
7951 | if (test_bit(NFS_OPEN_STATE, &state->flags)) { |
7952 | /* The common case - we're updating to a new sequence number */ |
7953 | - if (nfs4_stateid_match_other(stateid, &state->open_stateid) && |
7954 | - nfs4_stateid_is_next(&state->open_stateid, stateid)) { |
7955 | - return true; |
7956 | + if (nfs4_stateid_match_other(stateid, &state->open_stateid)) { |
7957 | + if (nfs4_stateid_is_next(&state->open_stateid, stateid)) |
7958 | + return true; |
7959 | + return false; |
7960 | } |
7961 | - } else { |
7962 | - /* This is the first OPEN in this generation */ |
7963 | - if (stateid->seqid == cpu_to_be32(1)) |
7964 | - return true; |
7965 | + /* The server returned a new stateid */ |
7966 | } |
7967 | + /* This is the first OPEN in this generation */ |
7968 | + if (stateid->seqid == cpu_to_be32(1)) |
7969 | + return true; |
7970 | return false; |
7971 | } |
7972 | |
7973 | diff --git a/fs/nfs/pnfs_nfs.c b/fs/nfs/pnfs_nfs.c |
7974 | index 249cf9037dbd7..aff44a7b98f86 100644 |
7975 | --- a/fs/nfs/pnfs_nfs.c |
7976 | +++ b/fs/nfs/pnfs_nfs.c |
7977 | @@ -641,7 +641,7 @@ static int _nfs4_pnfs_v3_ds_connect(struct nfs_server *mds_srv, |
7978 | } |
7979 | |
7980 | smp_wmb(); |
7981 | - ds->ds_clp = clp; |
7982 | + WRITE_ONCE(ds->ds_clp, clp); |
7983 | dprintk("%s [new] addr: %s\n", __func__, ds->ds_remotestr); |
7984 | out: |
7985 | return status; |
7986 | @@ -714,7 +714,7 @@ static int _nfs4_pnfs_v4_ds_connect(struct nfs_server *mds_srv, |
7987 | } |
7988 | |
7989 | smp_wmb(); |
7990 | - ds->ds_clp = clp; |
7991 | + WRITE_ONCE(ds->ds_clp, clp); |
7992 | dprintk("%s [new] addr: %s\n", __func__, ds->ds_remotestr); |
7993 | out: |
7994 | return status; |
7995 | diff --git a/fs/nfs/write.c b/fs/nfs/write.c |
7996 | index 613c3ef23e07b..30d8e7bc1cef3 100644 |
7997 | --- a/fs/nfs/write.c |
7998 | +++ b/fs/nfs/write.c |
7999 | @@ -1050,25 +1050,11 @@ nfs_scan_commit_list(struct list_head *src, struct list_head *dst, |
8000 | struct nfs_page *req, *tmp; |
8001 | int ret = 0; |
8002 | |
8003 | -restart: |
8004 | list_for_each_entry_safe(req, tmp, src, wb_list) { |
8005 | kref_get(&req->wb_kref); |
8006 | if (!nfs_lock_request(req)) { |
8007 | - int status; |
8008 | - |
8009 | - /* Prevent deadlock with nfs_lock_and_join_requests */ |
8010 | - if (!list_empty(dst)) { |
8011 | - nfs_release_request(req); |
8012 | - continue; |
8013 | - } |
8014 | - /* Ensure we make progress to prevent livelock */ |
8015 | - mutex_unlock(&NFS_I(cinfo->inode)->commit_mutex); |
8016 | - status = nfs_wait_on_request(req); |
8017 | nfs_release_request(req); |
8018 | - mutex_lock(&NFS_I(cinfo->inode)->commit_mutex); |
8019 | - if (status < 0) |
8020 | - break; |
8021 | - goto restart; |
8022 | + continue; |
8023 | } |
8024 | nfs_request_remove_commit_list(req, cinfo); |
8025 | clear_bit(PG_COMMIT_TO_DS, &req->wb_flags); |
8026 | @@ -1935,6 +1921,7 @@ static int __nfs_commit_inode(struct inode *inode, int how, |
8027 | int may_wait = how & FLUSH_SYNC; |
8028 | int ret, nscan; |
8029 | |
8030 | + how &= ~FLUSH_SYNC; |
8031 | nfs_init_cinfo_from_inode(&cinfo, inode); |
8032 | nfs_commit_begin(cinfo.mds); |
8033 | for (;;) { |
8034 | diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c |
8035 | index 58d4546a208e6..c30747bdfb127 100644 |
8036 | --- a/fs/ocfs2/file.c |
8037 | +++ b/fs/ocfs2/file.c |
8038 | @@ -478,10 +478,11 @@ int ocfs2_truncate_file(struct inode *inode, |
8039 | * greater than page size, so we have to truncate them |
8040 | * anyway. |
8041 | */ |
8042 | - unmap_mapping_range(inode->i_mapping, new_i_size + PAGE_SIZE - 1, 0, 1); |
8043 | - truncate_inode_pages(inode->i_mapping, new_i_size); |
8044 | |
8045 | if (OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL) { |
8046 | + unmap_mapping_range(inode->i_mapping, |
8047 | + new_i_size + PAGE_SIZE - 1, 0, 1); |
8048 | + truncate_inode_pages(inode->i_mapping, new_i_size); |
8049 | status = ocfs2_truncate_inline(inode, di_bh, new_i_size, |
8050 | i_size_read(inode), 1); |
8051 | if (status) |
8052 | @@ -500,6 +501,9 @@ int ocfs2_truncate_file(struct inode *inode, |
8053 | goto bail_unlock_sem; |
8054 | } |
8055 | |
8056 | + unmap_mapping_range(inode->i_mapping, new_i_size + PAGE_SIZE - 1, 0, 1); |
8057 | + truncate_inode_pages(inode->i_mapping, new_i_size); |
8058 | + |
8059 | status = ocfs2_commit_truncate(osb, inode, di_bh); |
8060 | if (status < 0) { |
8061 | mlog_errno(status); |
8062 | diff --git a/fs/orangefs/dcache.c b/fs/orangefs/dcache.c |
8063 | index fe484cf93e5cd..8bbe9486e3a62 100644 |
8064 | --- a/fs/orangefs/dcache.c |
8065 | +++ b/fs/orangefs/dcache.c |
8066 | @@ -26,8 +26,10 @@ static int orangefs_revalidate_lookup(struct dentry *dentry) |
8067 | gossip_debug(GOSSIP_DCACHE_DEBUG, "%s: attempting lookup.\n", __func__); |
8068 | |
8069 | new_op = op_alloc(ORANGEFS_VFS_OP_LOOKUP); |
8070 | - if (!new_op) |
8071 | + if (!new_op) { |
8072 | + ret = -ENOMEM; |
8073 | goto out_put_parent; |
8074 | + } |
8075 | |
8076 | new_op->upcall.req.lookup.sym_follow = ORANGEFS_LOOKUP_LINK_NO_FOLLOW; |
8077 | new_op->upcall.req.lookup.parent_refn = parent->refn; |
8078 | diff --git a/fs/overlayfs/file.c b/fs/overlayfs/file.c |
8079 | index 81c9eab8529b6..6bf5fb12395ac 100644 |
8080 | --- a/fs/overlayfs/file.c |
8081 | +++ b/fs/overlayfs/file.c |
8082 | @@ -296,6 +296,51 @@ out_unlock: |
8083 | return ret; |
8084 | } |
8085 | |
8086 | +/* |
8087 | + * Calling iter_file_splice_write() directly from overlay's f_op may deadlock |
8088 | + * due to lock order inversion between pipe->mutex in iter_file_splice_write() |
8089 | + * and file_start_write(real.file) in ovl_write_iter(). |
8090 | + * |
8091 | + * So do everything ovl_write_iter() does and call iter_file_splice_write() on |
8092 | + * the real file. |
8093 | + */ |
8094 | +static ssize_t ovl_splice_write(struct pipe_inode_info *pipe, struct file *out, |
8095 | + loff_t *ppos, size_t len, unsigned int flags) |
8096 | +{ |
8097 | + struct fd real; |
8098 | + const struct cred *old_cred; |
8099 | + struct inode *inode = file_inode(out); |
8100 | + struct inode *realinode = ovl_inode_real(inode); |
8101 | + ssize_t ret; |
8102 | + |
8103 | + inode_lock(inode); |
8104 | + /* Update mode */ |
8105 | + ovl_copyattr(realinode, inode); |
8106 | + ret = file_remove_privs(out); |
8107 | + if (ret) |
8108 | + goto out_unlock; |
8109 | + |
8110 | + ret = ovl_real_fdget(out, &real); |
8111 | + if (ret) |
8112 | + goto out_unlock; |
8113 | + |
8114 | + old_cred = ovl_override_creds(inode->i_sb); |
8115 | + file_start_write(real.file); |
8116 | + |
8117 | + ret = iter_file_splice_write(pipe, real.file, ppos, len, flags); |
8118 | + |
8119 | + file_end_write(real.file); |
8120 | + /* Update size */ |
8121 | + ovl_copyattr(realinode, inode); |
8122 | + revert_creds(old_cred); |
8123 | + fdput(real); |
8124 | + |
8125 | +out_unlock: |
8126 | + inode_unlock(inode); |
8127 | + |
8128 | + return ret; |
8129 | +} |
8130 | + |
8131 | static int ovl_fsync(struct file *file, loff_t start, loff_t end, int datasync) |
8132 | { |
8133 | struct fd real; |
8134 | @@ -653,7 +698,7 @@ const struct file_operations ovl_file_operations = { |
8135 | .unlocked_ioctl = ovl_ioctl, |
8136 | .compat_ioctl = ovl_compat_ioctl, |
8137 | .splice_read = generic_file_splice_read, |
8138 | - .splice_write = iter_file_splice_write, |
8139 | + .splice_write = ovl_splice_write, |
8140 | |
8141 | .copy_file_range = ovl_copy_file_range, |
8142 | .remap_file_range = ovl_remap_file_range, |
8143 | diff --git a/fs/quota/quota_tree.c b/fs/quota/quota_tree.c |
8144 | index c5562c871c8be..1a188fbdf34e5 100644 |
8145 | --- a/fs/quota/quota_tree.c |
8146 | +++ b/fs/quota/quota_tree.c |
8147 | @@ -423,6 +423,7 @@ static int free_dqentry(struct qtree_mem_dqinfo *info, struct dquot *dquot, |
8148 | quota_error(dquot->dq_sb, "Quota structure has offset to " |
8149 | "other block (%u) than it should (%u)", blk, |
8150 | (uint)(dquot->dq_off >> info->dqi_blocksize_bits)); |
8151 | + ret = -EIO; |
8152 | goto out_buf; |
8153 | } |
8154 | ret = read_blk(info, blk, buf); |
8155 | @@ -488,6 +489,13 @@ static int remove_tree(struct qtree_mem_dqinfo *info, struct dquot *dquot, |
8156 | goto out_buf; |
8157 | } |
8158 | newblk = le32_to_cpu(ref[get_index(info, dquot->dq_id, depth)]); |
8159 | + if (newblk < QT_TREEOFF || newblk >= info->dqi_blocks) { |
8160 | + quota_error(dquot->dq_sb, "Getting block too big (%u >= %u)", |
8161 | + newblk, info->dqi_blocks); |
8162 | + ret = -EUCLEAN; |
8163 | + goto out_buf; |
8164 | + } |
8165 | + |
8166 | if (depth == info->dqi_qtree_depth - 1) { |
8167 | ret = free_dqentry(info, dquot, newblk); |
8168 | newblk = 0; |
8169 | @@ -587,6 +595,13 @@ static loff_t find_tree_dqentry(struct qtree_mem_dqinfo *info, |
8170 | blk = le32_to_cpu(ref[get_index(info, dquot->dq_id, depth)]); |
8171 | if (!blk) /* No reference? */ |
8172 | goto out_buf; |
8173 | + if (blk < QT_TREEOFF || blk >= info->dqi_blocks) { |
8174 | + quota_error(dquot->dq_sb, "Getting block too big (%u >= %u)", |
8175 | + blk, info->dqi_blocks); |
8176 | + ret = -EUCLEAN; |
8177 | + goto out_buf; |
8178 | + } |
8179 | + |
8180 | if (depth < info->dqi_qtree_depth - 1) |
8181 | ret = find_tree_dqentry(info, dquot, blk, depth+1); |
8182 | else |
8183 | diff --git a/fs/tracefs/inode.c b/fs/tracefs/inode.c |
8184 | index 0caa151cae4ee..efe078fe5d4a9 100644 |
8185 | --- a/fs/tracefs/inode.c |
8186 | +++ b/fs/tracefs/inode.c |
8187 | @@ -427,7 +427,8 @@ static struct dentry *__create_dir(const char *name, struct dentry *parent, |
8188 | if (unlikely(!inode)) |
8189 | return failed_creating(dentry); |
8190 | |
8191 | - inode->i_mode = S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO; |
8192 | + /* Do not set bits for OTH */ |
8193 | + inode->i_mode = S_IFDIR | S_IRWXU | S_IRUSR| S_IRGRP | S_IXUSR | S_IXGRP; |
8194 | inode->i_op = ops; |
8195 | inode->i_fop = &simple_dir_operations; |
8196 | |
8197 | diff --git a/include/linux/console.h b/include/linux/console.h |
8198 | index d09951d5a94e4..d1d03c9c7a512 100644 |
8199 | --- a/include/linux/console.h |
8200 | +++ b/include/linux/console.h |
8201 | @@ -153,6 +153,8 @@ struct console { |
8202 | short flags; |
8203 | short index; |
8204 | int cflag; |
8205 | + uint ispeed; |
8206 | + uint ospeed; |
8207 | void *data; |
8208 | struct console *next; |
8209 | }; |
8210 | diff --git a/include/linux/filter.h b/include/linux/filter.h |
8211 | index c4f89340f4986..440014875acf4 100644 |
8212 | --- a/include/linux/filter.h |
8213 | +++ b/include/linux/filter.h |
8214 | @@ -952,6 +952,7 @@ extern int bpf_jit_enable; |
8215 | extern int bpf_jit_harden; |
8216 | extern int bpf_jit_kallsyms; |
8217 | extern long bpf_jit_limit; |
8218 | +extern long bpf_jit_limit_max; |
8219 | |
8220 | typedef void (*bpf_jit_fill_hole_t)(void *area, unsigned int size); |
8221 | |
8222 | diff --git a/include/linux/libata.h b/include/linux/libata.h |
8223 | index 3d5adbaf8214f..2e448d65a04c7 100644 |
8224 | --- a/include/linux/libata.h |
8225 | +++ b/include/linux/libata.h |
8226 | @@ -391,7 +391,7 @@ enum { |
8227 | /* This should match the actual table size of |
8228 | * ata_eh_cmd_timeout_table in libata-eh.c. |
8229 | */ |
8230 | - ATA_EH_CMD_TIMEOUT_TABLE_SIZE = 6, |
8231 | + ATA_EH_CMD_TIMEOUT_TABLE_SIZE = 7, |
8232 | |
8233 | /* Horkage types. May be set by libata or controller on drives |
8234 | (some horkage may be drive/controller pair dependent */ |
8235 | diff --git a/include/linux/lsm_hooks.h b/include/linux/lsm_hooks.h |
8236 | index a3763247547c3..a21dc5413653e 100644 |
8237 | --- a/include/linux/lsm_hooks.h |
8238 | +++ b/include/linux/lsm_hooks.h |
8239 | @@ -1241,22 +1241,22 @@ |
8240 | * |
8241 | * @binder_set_context_mgr: |
8242 | * Check whether @mgr is allowed to be the binder context manager. |
8243 | - * @mgr contains the task_struct for the task being registered. |
8244 | + * @mgr contains the struct cred for the current binder process. |
8245 | * Return 0 if permission is granted. |
8246 | * @binder_transaction: |
8247 | * Check whether @from is allowed to invoke a binder transaction call |
8248 | * to @to. |
8249 | - * @from contains the task_struct for the sending task. |
8250 | - * @to contains the task_struct for the receiving task. |
8251 | + * @from contains the struct cred for the sending process. |
8252 | + * @to contains the struct cred for the receiving process. |
8253 | * @binder_transfer_binder: |
8254 | * Check whether @from is allowed to transfer a binder reference to @to. |
8255 | - * @from contains the task_struct for the sending task. |
8256 | - * @to contains the task_struct for the receiving task. |
8257 | + * @from contains the struct cred for the sending process. |
8258 | + * @to contains the struct cred for the receiving process. |
8259 | * @binder_transfer_file: |
8260 | * Check whether @from is allowed to transfer @file to @to. |
8261 | - * @from contains the task_struct for the sending task. |
8262 | + * @from contains the struct cred for the sending process. |
8263 | * @file contains the struct file being transferred. |
8264 | - * @to contains the task_struct for the receiving task. |
8265 | + * @to contains the struct cred for the receiving process. |
8266 | * |
8267 | * @ptrace_access_check: |
8268 | * Check permission before allowing the current process to trace the |
8269 | @@ -1456,13 +1456,13 @@ |
8270 | * @what: kernel feature being accessed |
8271 | */ |
8272 | union security_list_options { |
8273 | - int (*binder_set_context_mgr)(struct task_struct *mgr); |
8274 | - int (*binder_transaction)(struct task_struct *from, |
8275 | - struct task_struct *to); |
8276 | - int (*binder_transfer_binder)(struct task_struct *from, |
8277 | - struct task_struct *to); |
8278 | - int (*binder_transfer_file)(struct task_struct *from, |
8279 | - struct task_struct *to, |
8280 | + int (*binder_set_context_mgr)(const struct cred *mgr); |
8281 | + int (*binder_transaction)(const struct cred *from, |
8282 | + const struct cred *to); |
8283 | + int (*binder_transfer_binder)(const struct cred *from, |
8284 | + const struct cred *to); |
8285 | + int (*binder_transfer_file)(const struct cred *from, |
8286 | + const struct cred *to, |
8287 | struct file *file); |
8288 | |
8289 | int (*ptrace_access_check)(struct task_struct *child, |
8290 | diff --git a/include/linux/rpmsg.h b/include/linux/rpmsg.h |
8291 | index 9fe156d1c018e..a68972b097b72 100644 |
8292 | --- a/include/linux/rpmsg.h |
8293 | +++ b/include/linux/rpmsg.h |
8294 | @@ -177,7 +177,7 @@ static inline struct rpmsg_endpoint *rpmsg_create_ept(struct rpmsg_device *rpdev |
8295 | /* This shouldn't be possible */ |
8296 | WARN_ON(1); |
8297 | |
8298 | - return ERR_PTR(-ENXIO); |
8299 | + return NULL; |
8300 | } |
8301 | |
8302 | static inline int rpmsg_send(struct rpmsg_endpoint *ept, void *data, int len) |
8303 | diff --git a/include/linux/sched/task_stack.h b/include/linux/sched/task_stack.h |
8304 | index 2413427e439c7..d10150587d819 100644 |
8305 | --- a/include/linux/sched/task_stack.h |
8306 | +++ b/include/linux/sched/task_stack.h |
8307 | @@ -25,7 +25,11 @@ static inline void *task_stack_page(const struct task_struct *task) |
8308 | |
8309 | static inline unsigned long *end_of_stack(const struct task_struct *task) |
8310 | { |
8311 | +#ifdef CONFIG_STACK_GROWSUP |
8312 | + return (unsigned long *)((unsigned long)task->stack + THREAD_SIZE) - 1; |
8313 | +#else |
8314 | return task->stack; |
8315 | +#endif |
8316 | } |
8317 | |
8318 | #elif !defined(__HAVE_THREAD_FUNCTIONS) |
8319 | diff --git a/include/linux/security.h b/include/linux/security.h |
8320 | index df90399a8af98..3f6b8195ae9eb 100644 |
8321 | --- a/include/linux/security.h |
8322 | +++ b/include/linux/security.h |
8323 | @@ -249,13 +249,13 @@ extern int security_init(void); |
8324 | extern int early_security_init(void); |
8325 | |
8326 | /* Security operations */ |
8327 | -int security_binder_set_context_mgr(struct task_struct *mgr); |
8328 | -int security_binder_transaction(struct task_struct *from, |
8329 | - struct task_struct *to); |
8330 | -int security_binder_transfer_binder(struct task_struct *from, |
8331 | - struct task_struct *to); |
8332 | -int security_binder_transfer_file(struct task_struct *from, |
8333 | - struct task_struct *to, struct file *file); |
8334 | +int security_binder_set_context_mgr(const struct cred *mgr); |
8335 | +int security_binder_transaction(const struct cred *from, |
8336 | + const struct cred *to); |
8337 | +int security_binder_transfer_binder(const struct cred *from, |
8338 | + const struct cred *to); |
8339 | +int security_binder_transfer_file(const struct cred *from, |
8340 | + const struct cred *to, struct file *file); |
8341 | int security_ptrace_access_check(struct task_struct *child, unsigned int mode); |
8342 | int security_ptrace_traceme(struct task_struct *parent); |
8343 | int security_capget(struct task_struct *target, |
8344 | @@ -481,25 +481,25 @@ static inline int early_security_init(void) |
8345 | return 0; |
8346 | } |
8347 | |
8348 | -static inline int security_binder_set_context_mgr(struct task_struct *mgr) |
8349 | +static inline int security_binder_set_context_mgr(const struct cred *mgr) |
8350 | { |
8351 | return 0; |
8352 | } |
8353 | |
8354 | -static inline int security_binder_transaction(struct task_struct *from, |
8355 | - struct task_struct *to) |
8356 | +static inline int security_binder_transaction(const struct cred *from, |
8357 | + const struct cred *to) |
8358 | { |
8359 | return 0; |
8360 | } |
8361 | |
8362 | -static inline int security_binder_transfer_binder(struct task_struct *from, |
8363 | - struct task_struct *to) |
8364 | +static inline int security_binder_transfer_binder(const struct cred *from, |
8365 | + const struct cred *to) |
8366 | { |
8367 | return 0; |
8368 | } |
8369 | |
8370 | -static inline int security_binder_transfer_file(struct task_struct *from, |
8371 | - struct task_struct *to, |
8372 | +static inline int security_binder_transfer_file(const struct cred *from, |
8373 | + const struct cred *to, |
8374 | struct file *file) |
8375 | { |
8376 | return 0; |
8377 | @@ -985,6 +985,11 @@ static inline void security_transfer_creds(struct cred *new, |
8378 | { |
8379 | } |
8380 | |
8381 | +static inline void security_cred_getsecid(const struct cred *c, u32 *secid) |
8382 | +{ |
8383 | + *secid = 0; |
8384 | +} |
8385 | + |
8386 | static inline int security_kernel_act_as(struct cred *cred, u32 secid) |
8387 | { |
8388 | return 0; |
8389 | diff --git a/include/net/llc.h b/include/net/llc.h |
8390 | index df282d9b40170..9c10b121b49b0 100644 |
8391 | --- a/include/net/llc.h |
8392 | +++ b/include/net/llc.h |
8393 | @@ -72,7 +72,9 @@ struct llc_sap { |
8394 | static inline |
8395 | struct hlist_head *llc_sk_dev_hash(struct llc_sap *sap, int ifindex) |
8396 | { |
8397 | - return &sap->sk_dev_hash[ifindex % LLC_SK_DEV_HASH_ENTRIES]; |
8398 | + u32 bucket = hash_32(ifindex, LLC_SK_DEV_HASH_BITS); |
8399 | + |
8400 | + return &sap->sk_dev_hash[bucket]; |
8401 | } |
8402 | |
8403 | static inline |
8404 | diff --git a/include/net/neighbour.h b/include/net/neighbour.h |
8405 | index 2be8d6b0dfb69..b6494e87c897c 100644 |
8406 | --- a/include/net/neighbour.h |
8407 | +++ b/include/net/neighbour.h |
8408 | @@ -253,6 +253,7 @@ static inline void *neighbour_priv(const struct neighbour *n) |
8409 | #define NEIGH_UPDATE_F_OVERRIDE 0x00000001 |
8410 | #define NEIGH_UPDATE_F_WEAK_OVERRIDE 0x00000002 |
8411 | #define NEIGH_UPDATE_F_OVERRIDE_ISROUTER 0x00000004 |
8412 | +#define NEIGH_UPDATE_F_USE 0x10000000 |
8413 | #define NEIGH_UPDATE_F_EXT_LEARNED 0x20000000 |
8414 | #define NEIGH_UPDATE_F_ISROUTER 0x40000000 |
8415 | #define NEIGH_UPDATE_F_ADMIN 0x80000000 |
8416 | @@ -505,10 +506,15 @@ static inline int neigh_output(struct neighbour *n, struct sk_buff *skb, |
8417 | { |
8418 | const struct hh_cache *hh = &n->hh; |
8419 | |
8420 | - if ((n->nud_state & NUD_CONNECTED) && hh->hh_len && !skip_cache) |
8421 | + /* n->nud_state and hh->hh_len could be changed under us. |
8422 | + * neigh_hh_output() is taking care of the race later. |
8423 | + */ |
8424 | + if (!skip_cache && |
8425 | + (READ_ONCE(n->nud_state) & NUD_CONNECTED) && |
8426 | + READ_ONCE(hh->hh_len)) |
8427 | return neigh_hh_output(hh, skb); |
8428 | - else |
8429 | - return n->output(n, skb); |
8430 | + |
8431 | + return n->output(n, skb); |
8432 | } |
8433 | |
8434 | static inline struct neighbour * |
8435 | diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h |
8436 | index 0cb0a4bcb5447..939fda8f97215 100644 |
8437 | --- a/include/net/sch_generic.h |
8438 | +++ b/include/net/sch_generic.h |
8439 | @@ -299,6 +299,8 @@ struct Qdisc_ops { |
8440 | struct netlink_ext_ack *extack); |
8441 | void (*attach)(struct Qdisc *sch); |
8442 | int (*change_tx_queue_len)(struct Qdisc *, unsigned int); |
8443 | + void (*change_real_num_tx)(struct Qdisc *sch, |
8444 | + unsigned int new_real_tx); |
8445 | |
8446 | int (*dump)(struct Qdisc *, struct sk_buff *); |
8447 | int (*dump_stats)(struct Qdisc *, struct gnet_dump *); |
8448 | @@ -675,6 +677,8 @@ void qdisc_class_hash_grow(struct Qdisc *, struct Qdisc_class_hash *); |
8449 | void qdisc_class_hash_destroy(struct Qdisc_class_hash *); |
8450 | |
8451 | int dev_qdisc_change_tx_queue_len(struct net_device *dev); |
8452 | +void dev_qdisc_change_real_num_tx(struct net_device *dev, |
8453 | + unsigned int new_real_tx); |
8454 | void dev_init_scheduler(struct net_device *dev); |
8455 | void dev_shutdown(struct net_device *dev); |
8456 | void dev_activate(struct net_device *dev); |
8457 | diff --git a/include/net/strparser.h b/include/net/strparser.h |
8458 | index 1d20b98493a10..bec1439bd3be6 100644 |
8459 | --- a/include/net/strparser.h |
8460 | +++ b/include/net/strparser.h |
8461 | @@ -54,10 +54,24 @@ struct strp_msg { |
8462 | int offset; |
8463 | }; |
8464 | |
8465 | +struct _strp_msg { |
8466 | + /* Internal cb structure. struct strp_msg must be first for passing |
8467 | + * to upper layer. |
8468 | + */ |
8469 | + struct strp_msg strp; |
8470 | + int accum_len; |
8471 | +}; |
8472 | + |
8473 | +struct sk_skb_cb { |
8474 | +#define SK_SKB_CB_PRIV_LEN 20 |
8475 | + unsigned char data[SK_SKB_CB_PRIV_LEN]; |
8476 | + struct _strp_msg strp; |
8477 | +}; |
8478 | + |
8479 | static inline struct strp_msg *strp_msg(struct sk_buff *skb) |
8480 | { |
8481 | return (struct strp_msg *)((void *)skb->cb + |
8482 | - offsetof(struct qdisc_skb_cb, data)); |
8483 | + offsetof(struct sk_skb_cb, strp)); |
8484 | } |
8485 | |
8486 | /* Structure for an attached lower socket */ |
8487 | diff --git a/include/net/udp.h b/include/net/udp.h |
8488 | index fabf507bce5d1..d9d39cc20a847 100644 |
8489 | --- a/include/net/udp.h |
8490 | +++ b/include/net/udp.h |
8491 | @@ -480,8 +480,9 @@ static inline struct sk_buff *udp_rcv_segment(struct sock *sk, |
8492 | * CHECKSUM_NONE in __udp_gso_segment. UDP GRO indeed builds partial |
8493 | * packets in udp_gro_complete_segment. As does UDP GSO, verified by |
8494 | * udp_send_skb. But when those packets are looped in dev_loopback_xmit |
8495 | - * their ip_summed is set to CHECKSUM_UNNECESSARY. Reset in this |
8496 | - * specific case, where PARTIAL is both correct and required. |
8497 | + * their ip_summed CHECKSUM_NONE is changed to CHECKSUM_UNNECESSARY. |
8498 | + * Reset in this specific case, where PARTIAL is both correct and |
8499 | + * required. |
8500 | */ |
8501 | if (skb->pkt_type == PACKET_LOOPBACK) |
8502 | skb->ip_summed = CHECKSUM_PARTIAL; |
8503 | diff --git a/include/uapi/linux/pci_regs.h b/include/uapi/linux/pci_regs.h |
8504 | index 29d6e93fd15e3..b485d8b0d5a79 100644 |
8505 | --- a/include/uapi/linux/pci_regs.h |
8506 | +++ b/include/uapi/linux/pci_regs.h |
8507 | @@ -502,6 +502,12 @@ |
8508 | #define PCI_EXP_DEVCTL_URRE 0x0008 /* Unsupported Request Reporting En. */ |
8509 | #define PCI_EXP_DEVCTL_RELAX_EN 0x0010 /* Enable relaxed ordering */ |
8510 | #define PCI_EXP_DEVCTL_PAYLOAD 0x00e0 /* Max_Payload_Size */ |
8511 | +#define PCI_EXP_DEVCTL_PAYLOAD_128B 0x0000 /* 128 Bytes */ |
8512 | +#define PCI_EXP_DEVCTL_PAYLOAD_256B 0x0020 /* 256 Bytes */ |
8513 | +#define PCI_EXP_DEVCTL_PAYLOAD_512B 0x0040 /* 512 Bytes */ |
8514 | +#define PCI_EXP_DEVCTL_PAYLOAD_1024B 0x0060 /* 1024 Bytes */ |
8515 | +#define PCI_EXP_DEVCTL_PAYLOAD_2048B 0x0080 /* 2048 Bytes */ |
8516 | +#define PCI_EXP_DEVCTL_PAYLOAD_4096B 0x00a0 /* 4096 Bytes */ |
8517 | #define PCI_EXP_DEVCTL_EXT_TAG 0x0100 /* Extended Tag Field Enable */ |
8518 | #define PCI_EXP_DEVCTL_PHANTOM 0x0200 /* Phantom Functions Enable */ |
8519 | #define PCI_EXP_DEVCTL_AUX_PME 0x0400 /* Auxiliary Power PM Enable */ |
8520 | diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c |
8521 | index d9a3d995bd966..1238ef9c569df 100644 |
8522 | --- a/kernel/bpf/core.c |
8523 | +++ b/kernel/bpf/core.c |
8524 | @@ -523,6 +523,7 @@ int bpf_jit_enable __read_mostly = IS_BUILTIN(CONFIG_BPF_JIT_ALWAYS_ON); |
8525 | int bpf_jit_harden __read_mostly; |
8526 | int bpf_jit_kallsyms __read_mostly; |
8527 | long bpf_jit_limit __read_mostly; |
8528 | +long bpf_jit_limit_max __read_mostly; |
8529 | |
8530 | static __always_inline void |
8531 | bpf_get_prog_addr_region(const struct bpf_prog *prog, |
8532 | @@ -759,7 +760,8 @@ u64 __weak bpf_jit_alloc_exec_limit(void) |
8533 | static int __init bpf_jit_charge_init(void) |
8534 | { |
8535 | /* Only used as heuristic here to derive limit. */ |
8536 | - bpf_jit_limit = min_t(u64, round_up(bpf_jit_alloc_exec_limit() >> 2, |
8537 | + bpf_jit_limit_max = bpf_jit_alloc_exec_limit(); |
8538 | + bpf_jit_limit = min_t(u64, round_up(bpf_jit_limit_max >> 2, |
8539 | PAGE_SIZE), LONG_MAX); |
8540 | return 0; |
8541 | } |
8542 | diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c |
8543 | index ede370ec245d9..1904ffcee0f1e 100644 |
8544 | --- a/kernel/cgroup/cgroup.c |
8545 | +++ b/kernel/cgroup/cgroup.c |
8546 | @@ -1721,6 +1721,7 @@ int rebind_subsystems(struct cgroup_root *dst_root, u16 ss_mask) |
8547 | struct cgroup *dcgrp = &dst_root->cgrp; |
8548 | struct cgroup_subsys *ss; |
8549 | int ssid, i, ret; |
8550 | + u16 dfl_disable_ss_mask = 0; |
8551 | |
8552 | lockdep_assert_held(&cgroup_mutex); |
8553 | |
8554 | @@ -1737,8 +1738,28 @@ int rebind_subsystems(struct cgroup_root *dst_root, u16 ss_mask) |
8555 | /* can't move between two non-dummy roots either */ |
8556 | if (ss->root != &cgrp_dfl_root && dst_root != &cgrp_dfl_root) |
8557 | return -EBUSY; |
8558 | + |
8559 | + /* |
8560 | + * Collect ssid's that need to be disabled from default |
8561 | + * hierarchy. |
8562 | + */ |
8563 | + if (ss->root == &cgrp_dfl_root) |
8564 | + dfl_disable_ss_mask |= 1 << ssid; |
8565 | + |
8566 | } while_each_subsys_mask(); |
8567 | |
8568 | + if (dfl_disable_ss_mask) { |
8569 | + struct cgroup *scgrp = &cgrp_dfl_root.cgrp; |
8570 | + |
8571 | + /* |
8572 | + * Controllers from default hierarchy that need to be rebound |
8573 | + * are all disabled together in one go. |
8574 | + */ |
8575 | + cgrp_dfl_root.subsys_mask &= ~dfl_disable_ss_mask; |
8576 | + WARN_ON(cgroup_apply_control(scgrp)); |
8577 | + cgroup_finalize_control(scgrp, 0); |
8578 | + } |
8579 | + |
8580 | do_each_subsys_mask(ss, ssid, ss_mask) { |
8581 | struct cgroup_root *src_root = ss->root; |
8582 | struct cgroup *scgrp = &src_root->cgrp; |
8583 | @@ -1747,10 +1768,12 @@ int rebind_subsystems(struct cgroup_root *dst_root, u16 ss_mask) |
8584 | |
8585 | WARN_ON(!css || cgroup_css(dcgrp, ss)); |
8586 | |
8587 | - /* disable from the source */ |
8588 | - src_root->subsys_mask &= ~(1 << ssid); |
8589 | - WARN_ON(cgroup_apply_control(scgrp)); |
8590 | - cgroup_finalize_control(scgrp, 0); |
8591 | + if (src_root != &cgrp_dfl_root) { |
8592 | + /* disable from the source */ |
8593 | + src_root->subsys_mask &= ~(1 << ssid); |
8594 | + WARN_ON(cgroup_apply_control(scgrp)); |
8595 | + cgroup_finalize_control(scgrp, 0); |
8596 | + } |
8597 | |
8598 | /* rebind */ |
8599 | RCU_INIT_POINTER(scgrp->subsys[ssid], NULL); |
8600 | diff --git a/kernel/kprobes.c b/kernel/kprobes.c |
8601 | index a7812c115e487..1668439b269d3 100644 |
8602 | --- a/kernel/kprobes.c |
8603 | +++ b/kernel/kprobes.c |
8604 | @@ -2712,14 +2712,13 @@ static const struct file_operations fops_kp = { |
8605 | static int __init debugfs_kprobe_init(void) |
8606 | { |
8607 | struct dentry *dir; |
8608 | - unsigned int value = 1; |
8609 | |
8610 | dir = debugfs_create_dir("kprobes", NULL); |
8611 | |
8612 | debugfs_create_file("list", 0400, dir, NULL, |
8613 | &debugfs_kprobes_operations); |
8614 | |
8615 | - debugfs_create_file("enabled", 0600, dir, &value, &fops_kp); |
8616 | + debugfs_create_file("enabled", 0600, dir, NULL, &fops_kp); |
8617 | |
8618 | debugfs_create_file("blacklist", 0400, dir, NULL, |
8619 | &debugfs_kprobe_blacklist_ops); |
8620 | diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c |
8621 | index 3ec8fd2e80e53..db109d38f301e 100644 |
8622 | --- a/kernel/locking/lockdep.c |
8623 | +++ b/kernel/locking/lockdep.c |
8624 | @@ -830,7 +830,7 @@ look_up_lock_class(const struct lockdep_map *lock, unsigned int subclass) |
8625 | if (DEBUG_LOCKS_WARN_ON(!irqs_disabled())) |
8626 | return NULL; |
8627 | |
8628 | - hlist_for_each_entry_rcu(class, hash_head, hash_entry) { |
8629 | + hlist_for_each_entry_rcu_notrace(class, hash_head, hash_entry) { |
8630 | if (class->key == key) { |
8631 | /* |
8632 | * Huh! same key, different name? Did someone trample |
8633 | diff --git a/kernel/power/swap.c b/kernel/power/swap.c |
8634 | index 0516c422206d8..bcc9769e8a3b5 100644 |
8635 | --- a/kernel/power/swap.c |
8636 | +++ b/kernel/power/swap.c |
8637 | @@ -292,7 +292,7 @@ static int hib_submit_io(int op, int op_flags, pgoff_t page_off, void *addr, |
8638 | return error; |
8639 | } |
8640 | |
8641 | -static blk_status_t hib_wait_io(struct hib_bio_batch *hb) |
8642 | +static int hib_wait_io(struct hib_bio_batch *hb) |
8643 | { |
8644 | wait_event(hb->wait, atomic_read(&hb->count) == 0); |
8645 | return blk_status_to_errno(hb->error); |
8646 | @@ -1509,9 +1509,10 @@ end: |
8647 | int swsusp_check(void) |
8648 | { |
8649 | int error; |
8650 | + void *holder; |
8651 | |
8652 | hib_resume_bdev = blkdev_get_by_dev(swsusp_resume_device, |
8653 | - FMODE_READ, NULL); |
8654 | + FMODE_READ | FMODE_EXCL, &holder); |
8655 | if (!IS_ERR(hib_resume_bdev)) { |
8656 | set_blocksize(hib_resume_bdev, PAGE_SIZE); |
8657 | clear_page(swsusp_header); |
8658 | @@ -1533,7 +1534,7 @@ int swsusp_check(void) |
8659 | |
8660 | put: |
8661 | if (error) |
8662 | - blkdev_put(hib_resume_bdev, FMODE_READ); |
8663 | + blkdev_put(hib_resume_bdev, FMODE_READ | FMODE_EXCL); |
8664 | else |
8665 | pr_debug("Image signature found, resuming\n"); |
8666 | } else { |
8667 | diff --git a/kernel/rcu/tree_exp.h b/kernel/rcu/tree_exp.h |
8668 | index df90d4d7ad2e2..4c4d7683a4e5b 100644 |
8669 | --- a/kernel/rcu/tree_exp.h |
8670 | +++ b/kernel/rcu/tree_exp.h |
8671 | @@ -738,7 +738,7 @@ static void sync_sched_exp_online_cleanup(int cpu) |
8672 | my_cpu = get_cpu(); |
8673 | /* Quiescent state either not needed or already requested, leave. */ |
8674 | if (!(READ_ONCE(rnp->expmask) & rdp->grpmask) || |
8675 | - __this_cpu_read(rcu_data.cpu_no_qs.b.exp)) { |
8676 | + rdp->cpu_no_qs.b.exp) { |
8677 | put_cpu(); |
8678 | return; |
8679 | } |
8680 | diff --git a/kernel/signal.c b/kernel/signal.c |
8681 | index 8c97fc72d78bd..3f61367fd1685 100644 |
8682 | --- a/kernel/signal.c |
8683 | +++ b/kernel/signal.c |
8684 | @@ -2101,15 +2101,6 @@ static inline bool may_ptrace_stop(void) |
8685 | return true; |
8686 | } |
8687 | |
8688 | -/* |
8689 | - * Return non-zero if there is a SIGKILL that should be waking us up. |
8690 | - * Called with the siglock held. |
8691 | - */ |
8692 | -static bool sigkill_pending(struct task_struct *tsk) |
8693 | -{ |
8694 | - return sigismember(&tsk->pending.signal, SIGKILL) || |
8695 | - sigismember(&tsk->signal->shared_pending.signal, SIGKILL); |
8696 | -} |
8697 | |
8698 | /* |
8699 | * This must be called with current->sighand->siglock held. |
8700 | @@ -2136,17 +2127,16 @@ static void ptrace_stop(int exit_code, int why, int clear_code, kernel_siginfo_t |
8701 | * calling arch_ptrace_stop, so we must release it now. |
8702 | * To preserve proper semantics, we must do this before |
8703 | * any signal bookkeeping like checking group_stop_count. |
8704 | - * Meanwhile, a SIGKILL could come in before we retake the |
8705 | - * siglock. That must prevent us from sleeping in TASK_TRACED. |
8706 | - * So after regaining the lock, we must check for SIGKILL. |
8707 | */ |
8708 | spin_unlock_irq(¤t->sighand->siglock); |
8709 | arch_ptrace_stop(exit_code, info); |
8710 | spin_lock_irq(¤t->sighand->siglock); |
8711 | - if (sigkill_pending(current)) |
8712 | - return; |
8713 | } |
8714 | |
8715 | + /* |
8716 | + * schedule() will not sleep if there is a pending signal that |
8717 | + * can awaken the task. |
8718 | + */ |
8719 | set_special_state(TASK_TRACED); |
8720 | |
8721 | /* |
8722 | diff --git a/kernel/trace/tracing_map.c b/kernel/trace/tracing_map.c |
8723 | index 9e31bfc818ff8..10657b8dc2c2d 100644 |
8724 | --- a/kernel/trace/tracing_map.c |
8725 | +++ b/kernel/trace/tracing_map.c |
8726 | @@ -834,29 +834,35 @@ int tracing_map_init(struct tracing_map *map) |
8727 | return err; |
8728 | } |
8729 | |
8730 | -static int cmp_entries_dup(const struct tracing_map_sort_entry **a, |
8731 | - const struct tracing_map_sort_entry **b) |
8732 | +static int cmp_entries_dup(const void *A, const void *B) |
8733 | { |
8734 | + const struct tracing_map_sort_entry *a, *b; |
8735 | int ret = 0; |
8736 | |
8737 | - if (memcmp((*a)->key, (*b)->key, (*a)->elt->map->key_size)) |
8738 | + a = *(const struct tracing_map_sort_entry **)A; |
8739 | + b = *(const struct tracing_map_sort_entry **)B; |
8740 | + |
8741 | + if (memcmp(a->key, b->key, a->elt->map->key_size)) |
8742 | ret = 1; |
8743 | |
8744 | return ret; |
8745 | } |
8746 | |
8747 | -static int cmp_entries_sum(const struct tracing_map_sort_entry **a, |
8748 | - const struct tracing_map_sort_entry **b) |
8749 | +static int cmp_entries_sum(const void *A, const void *B) |
8750 | { |
8751 | const struct tracing_map_elt *elt_a, *elt_b; |
8752 | + const struct tracing_map_sort_entry *a, *b; |
8753 | struct tracing_map_sort_key *sort_key; |
8754 | struct tracing_map_field *field; |
8755 | tracing_map_cmp_fn_t cmp_fn; |
8756 | void *val_a, *val_b; |
8757 | int ret = 0; |
8758 | |
8759 | - elt_a = (*a)->elt; |
8760 | - elt_b = (*b)->elt; |
8761 | + a = *(const struct tracing_map_sort_entry **)A; |
8762 | + b = *(const struct tracing_map_sort_entry **)B; |
8763 | + |
8764 | + elt_a = a->elt; |
8765 | + elt_b = b->elt; |
8766 | |
8767 | sort_key = &elt_a->map->sort_key; |
8768 | |
8769 | @@ -873,18 +879,21 @@ static int cmp_entries_sum(const struct tracing_map_sort_entry **a, |
8770 | return ret; |
8771 | } |
8772 | |
8773 | -static int cmp_entries_key(const struct tracing_map_sort_entry **a, |
8774 | - const struct tracing_map_sort_entry **b) |
8775 | +static int cmp_entries_key(const void *A, const void *B) |
8776 | { |
8777 | const struct tracing_map_elt *elt_a, *elt_b; |
8778 | + const struct tracing_map_sort_entry *a, *b; |
8779 | struct tracing_map_sort_key *sort_key; |
8780 | struct tracing_map_field *field; |
8781 | tracing_map_cmp_fn_t cmp_fn; |
8782 | void *val_a, *val_b; |
8783 | int ret = 0; |
8784 | |
8785 | - elt_a = (*a)->elt; |
8786 | - elt_b = (*b)->elt; |
8787 | + a = *(const struct tracing_map_sort_entry **)A; |
8788 | + b = *(const struct tracing_map_sort_entry **)B; |
8789 | + |
8790 | + elt_a = a->elt; |
8791 | + elt_b = b->elt; |
8792 | |
8793 | sort_key = &elt_a->map->sort_key; |
8794 | |
8795 | @@ -989,10 +998,8 @@ static void sort_secondary(struct tracing_map *map, |
8796 | struct tracing_map_sort_key *primary_key, |
8797 | struct tracing_map_sort_key *secondary_key) |
8798 | { |
8799 | - int (*primary_fn)(const struct tracing_map_sort_entry **, |
8800 | - const struct tracing_map_sort_entry **); |
8801 | - int (*secondary_fn)(const struct tracing_map_sort_entry **, |
8802 | - const struct tracing_map_sort_entry **); |
8803 | + int (*primary_fn)(const void *, const void *); |
8804 | + int (*secondary_fn)(const void *, const void *); |
8805 | unsigned i, start = 0, n_sub = 1; |
8806 | |
8807 | if (is_key(map, primary_key->field_idx)) |
8808 | @@ -1061,8 +1068,7 @@ int tracing_map_sort_entries(struct tracing_map *map, |
8809 | unsigned int n_sort_keys, |
8810 | struct tracing_map_sort_entry ***sort_entries) |
8811 | { |
8812 | - int (*cmp_entries_fn)(const struct tracing_map_sort_entry **, |
8813 | - const struct tracing_map_sort_entry **); |
8814 | + int (*cmp_entries_fn)(const void *, const void *); |
8815 | struct tracing_map_sort_entry *sort_entry, **entries; |
8816 | int i, n_entries, ret; |
8817 | |
8818 | diff --git a/kernel/workqueue.c b/kernel/workqueue.c |
8819 | index 885d4792abdfc..77e6964ae1a99 100644 |
8820 | --- a/kernel/workqueue.c |
8821 | +++ b/kernel/workqueue.c |
8822 | @@ -5302,9 +5302,6 @@ int workqueue_set_unbound_cpumask(cpumask_var_t cpumask) |
8823 | int ret = -EINVAL; |
8824 | cpumask_var_t saved_cpumask; |
8825 | |
8826 | - if (!zalloc_cpumask_var(&saved_cpumask, GFP_KERNEL)) |
8827 | - return -ENOMEM; |
8828 | - |
8829 | /* |
8830 | * Not excluding isolated cpus on purpose. |
8831 | * If the user wishes to include them, we allow that. |
8832 | @@ -5312,6 +5309,15 @@ int workqueue_set_unbound_cpumask(cpumask_var_t cpumask) |
8833 | cpumask_and(cpumask, cpumask, cpu_possible_mask); |
8834 | if (!cpumask_empty(cpumask)) { |
8835 | apply_wqattrs_lock(); |
8836 | + if (cpumask_equal(cpumask, wq_unbound_cpumask)) { |
8837 | + ret = 0; |
8838 | + goto out_unlock; |
8839 | + } |
8840 | + |
8841 | + if (!zalloc_cpumask_var(&saved_cpumask, GFP_KERNEL)) { |
8842 | + ret = -ENOMEM; |
8843 | + goto out_unlock; |
8844 | + } |
8845 | |
8846 | /* save the old wq_unbound_cpumask. */ |
8847 | cpumask_copy(saved_cpumask, wq_unbound_cpumask); |
8848 | @@ -5324,10 +5330,11 @@ int workqueue_set_unbound_cpumask(cpumask_var_t cpumask) |
8849 | if (ret < 0) |
8850 | cpumask_copy(wq_unbound_cpumask, saved_cpumask); |
8851 | |
8852 | + free_cpumask_var(saved_cpumask); |
8853 | +out_unlock: |
8854 | apply_wqattrs_unlock(); |
8855 | } |
8856 | |
8857 | - free_cpumask_var(saved_cpumask); |
8858 | return ret; |
8859 | } |
8860 | |
8861 | diff --git a/lib/decompress_unxz.c b/lib/decompress_unxz.c |
8862 | index 25d59a95bd668..abea25310ac73 100644 |
8863 | --- a/lib/decompress_unxz.c |
8864 | +++ b/lib/decompress_unxz.c |
8865 | @@ -167,7 +167,7 @@ |
8866 | * memeq and memzero are not used much and any remotely sane implementation |
8867 | * is fast enough. memcpy/memmove speed matters in multi-call mode, but |
8868 | * the kernel image is decompressed in single-call mode, in which only |
8869 | - * memcpy speed can matter and only if there is a lot of uncompressible data |
8870 | + * memmove speed can matter and only if there is a lot of uncompressible data |
8871 | * (LZMA2 stores uncompressible chunks in uncompressed form). Thus, the |
8872 | * functions below should just be kept small; it's probably not worth |
8873 | * optimizing for speed. |
8874 | diff --git a/lib/iov_iter.c b/lib/iov_iter.c |
8875 | index 41b06af195368..957e3e58df652 100644 |
8876 | --- a/lib/iov_iter.c |
8877 | +++ b/lib/iov_iter.c |
8878 | @@ -1302,7 +1302,7 @@ ssize_t iov_iter_get_pages(struct iov_iter *i, |
8879 | res = get_user_pages_fast(addr, n, |
8880 | iov_iter_rw(i) != WRITE ? FOLL_WRITE : 0, |
8881 | pages); |
8882 | - if (unlikely(res < 0)) |
8883 | + if (unlikely(res <= 0)) |
8884 | return res; |
8885 | return (res == n ? len : res * PAGE_SIZE) - *start; |
8886 | 0;}),({ |
8887 | @@ -1384,8 +1384,9 @@ ssize_t iov_iter_get_pages_alloc(struct iov_iter *i, |
8888 | return -ENOMEM; |
8889 | res = get_user_pages_fast(addr, n, |
8890 | iov_iter_rw(i) != WRITE ? FOLL_WRITE : 0, p); |
8891 | - if (unlikely(res < 0)) { |
8892 | + if (unlikely(res <= 0)) { |
8893 | kvfree(p); |
8894 | + *pages = NULL; |
8895 | return res; |
8896 | } |
8897 | *pages = p; |
8898 | diff --git a/lib/xz/xz_dec_lzma2.c b/lib/xz/xz_dec_lzma2.c |
8899 | index 156f26fdc4c91..dd80989ca5a6b 100644 |
8900 | --- a/lib/xz/xz_dec_lzma2.c |
8901 | +++ b/lib/xz/xz_dec_lzma2.c |
8902 | @@ -387,7 +387,14 @@ static void dict_uncompressed(struct dictionary *dict, struct xz_buf *b, |
8903 | |
8904 | *left -= copy_size; |
8905 | |
8906 | - memcpy(dict->buf + dict->pos, b->in + b->in_pos, copy_size); |
8907 | + /* |
8908 | + * If doing in-place decompression in single-call mode and the |
8909 | + * uncompressed size of the file is larger than the caller |
8910 | + * thought (i.e. it is invalid input!), the buffers below may |
8911 | + * overlap and cause undefined behavior with memcpy(). |
8912 | + * With valid inputs memcpy() would be fine here. |
8913 | + */ |
8914 | + memmove(dict->buf + dict->pos, b->in + b->in_pos, copy_size); |
8915 | dict->pos += copy_size; |
8916 | |
8917 | if (dict->full < dict->pos) |
8918 | @@ -397,7 +404,11 @@ static void dict_uncompressed(struct dictionary *dict, struct xz_buf *b, |
8919 | if (dict->pos == dict->end) |
8920 | dict->pos = 0; |
8921 | |
8922 | - memcpy(b->out + b->out_pos, b->in + b->in_pos, |
8923 | + /* |
8924 | + * Like above but for multi-call mode: use memmove() |
8925 | + * to avoid undefined behavior with invalid input. |
8926 | + */ |
8927 | + memmove(b->out + b->out_pos, b->in + b->in_pos, |
8928 | copy_size); |
8929 | } |
8930 | |
8931 | @@ -421,6 +432,12 @@ static uint32_t dict_flush(struct dictionary *dict, struct xz_buf *b) |
8932 | if (dict->pos == dict->end) |
8933 | dict->pos = 0; |
8934 | |
8935 | + /* |
8936 | + * These buffers cannot overlap even if doing in-place |
8937 | + * decompression because in multi-call mode dict->buf |
8938 | + * has been allocated by us in this file; it's not |
8939 | + * provided by the caller like in single-call mode. |
8940 | + */ |
8941 | memcpy(b->out + b->out_pos, dict->buf + dict->start, |
8942 | copy_size); |
8943 | } |
8944 | diff --git a/lib/xz/xz_dec_stream.c b/lib/xz/xz_dec_stream.c |
8945 | index bd1d182419d7e..0b161f90d8d80 100644 |
8946 | --- a/lib/xz/xz_dec_stream.c |
8947 | +++ b/lib/xz/xz_dec_stream.c |
8948 | @@ -402,12 +402,12 @@ static enum xz_ret dec_stream_header(struct xz_dec *s) |
8949 | * we will accept other check types too, but then the check won't |
8950 | * be verified and a warning (XZ_UNSUPPORTED_CHECK) will be given. |
8951 | */ |
8952 | + if (s->temp.buf[HEADER_MAGIC_SIZE + 1] > XZ_CHECK_MAX) |
8953 | + return XZ_OPTIONS_ERROR; |
8954 | + |
8955 | s->check_type = s->temp.buf[HEADER_MAGIC_SIZE + 1]; |
8956 | |
8957 | #ifdef XZ_DEC_ANY_CHECK |
8958 | - if (s->check_type > XZ_CHECK_MAX) |
8959 | - return XZ_OPTIONS_ERROR; |
8960 | - |
8961 | if (s->check_type > XZ_CHECK_CRC32) |
8962 | return XZ_UNSUPPORTED_CHECK; |
8963 | #else |
8964 | diff --git a/mm/oom_kill.c b/mm/oom_kill.c |
8965 | index f1b810ddf2327..dcbb9a28706fc 100644 |
8966 | --- a/mm/oom_kill.c |
8967 | +++ b/mm/oom_kill.c |
8968 | @@ -1114,25 +1114,22 @@ bool out_of_memory(struct oom_control *oc) |
8969 | } |
8970 | |
8971 | /* |
8972 | - * The pagefault handler calls here because it is out of memory, so kill a |
8973 | - * memory-hogging task. If oom_lock is held by somebody else, a parallel oom |
8974 | - * killing is already in progress so do nothing. |
8975 | + * The pagefault handler calls here because some allocation has failed. We have |
8976 | + * to take care of the memcg OOM here because this is the only safe context without |
8977 | + * any locks held but let the oom killer triggered from the allocation context care |
8978 | + * about the global OOM. |
8979 | */ |
8980 | void pagefault_out_of_memory(void) |
8981 | { |
8982 | - struct oom_control oc = { |
8983 | - .zonelist = NULL, |
8984 | - .nodemask = NULL, |
8985 | - .memcg = NULL, |
8986 | - .gfp_mask = 0, |
8987 | - .order = 0, |
8988 | - }; |
8989 | + static DEFINE_RATELIMIT_STATE(pfoom_rs, DEFAULT_RATELIMIT_INTERVAL, |
8990 | + DEFAULT_RATELIMIT_BURST); |
8991 | |
8992 | if (mem_cgroup_oom_synchronize(true)) |
8993 | return; |
8994 | |
8995 | - if (!mutex_trylock(&oom_lock)) |
8996 | + if (fatal_signal_pending(current)) |
8997 | return; |
8998 | - out_of_memory(&oc); |
8999 | - mutex_unlock(&oom_lock); |
9000 | + |
9001 | + if (__ratelimit(&pfoom_rs)) |
9002 | + pr_warn("Huh VM_FAULT_OOM leaked out to the #PF handler. Retrying PF\n"); |
9003 | } |
9004 | diff --git a/mm/zsmalloc.c b/mm/zsmalloc.c |
9005 | index 443b3b1c95818..490e5f3ae614a 100644 |
9006 | --- a/mm/zsmalloc.c |
9007 | +++ b/mm/zsmalloc.c |
9008 | @@ -1835,10 +1835,11 @@ static inline void zs_pool_dec_isolated(struct zs_pool *pool) |
9009 | VM_BUG_ON(atomic_long_read(&pool->isolated_pages) <= 0); |
9010 | atomic_long_dec(&pool->isolated_pages); |
9011 | /* |
9012 | - * There's no possibility of racing, since wait_for_isolated_drain() |
9013 | - * checks the isolated count under &class->lock after enqueuing |
9014 | - * on migration_wait. |
9015 | + * Checking pool->destroying must happen after atomic_long_dec() |
9016 | + * for pool->isolated_pages above. Paired with the smp_mb() in |
9017 | + * zs_unregister_migration(). |
9018 | */ |
9019 | + smp_mb__after_atomic(); |
9020 | if (atomic_long_read(&pool->isolated_pages) == 0 && pool->destroying) |
9021 | wake_up_all(&pool->migration_wait); |
9022 | } |
9023 | diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c |
9024 | index 3f47abf9ef4a6..cd7c0429cddf8 100644 |
9025 | --- a/net/8021q/vlan.c |
9026 | +++ b/net/8021q/vlan.c |
9027 | @@ -116,9 +116,6 @@ void unregister_vlan_dev(struct net_device *dev, struct list_head *head) |
9028 | } |
9029 | |
9030 | vlan_vid_del(real_dev, vlan->vlan_proto, vlan_id); |
9031 | - |
9032 | - /* Get rid of the vlan's reference to real_dev */ |
9033 | - dev_put(real_dev); |
9034 | } |
9035 | |
9036 | int vlan_check_real_dev(struct net_device *real_dev, |
9037 | diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c |
9038 | index 2a78da4072de9..415a29d42cdf0 100644 |
9039 | --- a/net/8021q/vlan_dev.c |
9040 | +++ b/net/8021q/vlan_dev.c |
9041 | @@ -790,6 +790,9 @@ static void vlan_dev_free(struct net_device *dev) |
9042 | |
9043 | free_percpu(vlan->vlan_pcpu_stats); |
9044 | vlan->vlan_pcpu_stats = NULL; |
9045 | + |
9046 | + /* Get rid of the vlan's reference to real_dev */ |
9047 | + dev_put(vlan->real_dev); |
9048 | } |
9049 | |
9050 | void vlan_setup(struct net_device *dev) |
9051 | diff --git a/net/9p/client.c b/net/9p/client.c |
9052 | index 1d48afc7033ca..b03fce66eb8de 100644 |
9053 | --- a/net/9p/client.c |
9054 | +++ b/net/9p/client.c |
9055 | @@ -538,6 +538,8 @@ static int p9_check_errors(struct p9_client *c, struct p9_req_t *req) |
9056 | kfree(ename); |
9057 | } else { |
9058 | err = p9pdu_readf(&req->rc, c->proto_version, "d", &ecode); |
9059 | + if (err) |
9060 | + goto out_err; |
9061 | err = -ecode; |
9062 | |
9063 | p9_debug(P9_DEBUG_9P, "<<< RLERROR (%d)\n", -ecode); |
9064 | diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c |
9065 | index 82e76ff01267a..08e9f332adad3 100644 |
9066 | --- a/net/bluetooth/l2cap_sock.c |
9067 | +++ b/net/bluetooth/l2cap_sock.c |
9068 | @@ -1347,6 +1347,9 @@ static void l2cap_sock_close_cb(struct l2cap_chan *chan) |
9069 | { |
9070 | struct sock *sk = chan->data; |
9071 | |
9072 | + if (!sk) |
9073 | + return; |
9074 | + |
9075 | l2cap_sock_kill(sk); |
9076 | } |
9077 | |
9078 | @@ -1355,6 +1358,9 @@ static void l2cap_sock_teardown_cb(struct l2cap_chan *chan, int err) |
9079 | struct sock *sk = chan->data; |
9080 | struct sock *parent; |
9081 | |
9082 | + if (!sk) |
9083 | + return; |
9084 | + |
9085 | BT_DBG("chan %p state %s", chan, state_to_string(chan->state)); |
9086 | |
9087 | /* This callback can be called both for server (BT_LISTEN) |
9088 | @@ -1538,8 +1544,10 @@ static void l2cap_sock_destruct(struct sock *sk) |
9089 | { |
9090 | BT_DBG("sk %p", sk); |
9091 | |
9092 | - if (l2cap_pi(sk)->chan) |
9093 | + if (l2cap_pi(sk)->chan) { |
9094 | + l2cap_pi(sk)->chan->data = NULL; |
9095 | l2cap_chan_put(l2cap_pi(sk)->chan); |
9096 | + } |
9097 | |
9098 | if (l2cap_pi(sk)->rx_busy_skb) { |
9099 | kfree_skb(l2cap_pi(sk)->rx_busy_skb); |
9100 | diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c |
9101 | index 1915943bb646a..2c616c1c62958 100644 |
9102 | --- a/net/bluetooth/sco.c |
9103 | +++ b/net/bluetooth/sco.c |
9104 | @@ -133,6 +133,7 @@ static struct sco_conn *sco_conn_add(struct hci_conn *hcon) |
9105 | return NULL; |
9106 | |
9107 | spin_lock_init(&conn->lock); |
9108 | + INIT_DELAYED_WORK(&conn->timeout_work, sco_sock_timeout); |
9109 | |
9110 | hcon->sco_data = conn; |
9111 | conn->hcon = hcon; |
9112 | @@ -196,11 +197,11 @@ static void sco_conn_del(struct hci_conn *hcon, int err) |
9113 | sco_chan_del(sk, err); |
9114 | bh_unlock_sock(sk); |
9115 | sock_put(sk); |
9116 | - |
9117 | - /* Ensure no more work items will run before freeing conn. */ |
9118 | - cancel_delayed_work_sync(&conn->timeout_work); |
9119 | } |
9120 | |
9121 | + /* Ensure no more work items will run before freeing conn. */ |
9122 | + cancel_delayed_work_sync(&conn->timeout_work); |
9123 | + |
9124 | hcon->sco_data = NULL; |
9125 | kfree(conn); |
9126 | } |
9127 | @@ -213,8 +214,6 @@ static void __sco_chan_add(struct sco_conn *conn, struct sock *sk, |
9128 | sco_pi(sk)->conn = conn; |
9129 | conn->sk = sk; |
9130 | |
9131 | - INIT_DELAYED_WORK(&conn->timeout_work, sco_sock_timeout); |
9132 | - |
9133 | if (parent) |
9134 | bt_accept_enqueue(parent, sk, true); |
9135 | } |
9136 | @@ -280,7 +279,8 @@ static int sco_connect(struct hci_dev *hdev, struct sock *sk) |
9137 | return err; |
9138 | } |
9139 | |
9140 | -static int sco_send_frame(struct sock *sk, struct msghdr *msg, int len) |
9141 | +static int sco_send_frame(struct sock *sk, void *buf, int len, |
9142 | + unsigned int msg_flags) |
9143 | { |
9144 | struct sco_conn *conn = sco_pi(sk)->conn; |
9145 | struct sk_buff *skb; |
9146 | @@ -292,15 +292,11 @@ static int sco_send_frame(struct sock *sk, struct msghdr *msg, int len) |
9147 | |
9148 | BT_DBG("sk %p len %d", sk, len); |
9149 | |
9150 | - skb = bt_skb_send_alloc(sk, len, msg->msg_flags & MSG_DONTWAIT, &err); |
9151 | + skb = bt_skb_send_alloc(sk, len, msg_flags & MSG_DONTWAIT, &err); |
9152 | if (!skb) |
9153 | return err; |
9154 | |
9155 | - if (memcpy_from_msg(skb_put(skb, len), msg, len)) { |
9156 | - kfree_skb(skb); |
9157 | - return -EFAULT; |
9158 | - } |
9159 | - |
9160 | + memcpy(skb_put(skb, len), buf, len); |
9161 | hci_send_sco(conn->hcon, skb); |
9162 | |
9163 | return len; |
9164 | @@ -714,6 +710,7 @@ static int sco_sock_sendmsg(struct socket *sock, struct msghdr *msg, |
9165 | size_t len) |
9166 | { |
9167 | struct sock *sk = sock->sk; |
9168 | + void *buf; |
9169 | int err; |
9170 | |
9171 | BT_DBG("sock %p, sk %p", sock, sk); |
9172 | @@ -725,14 +722,24 @@ static int sco_sock_sendmsg(struct socket *sock, struct msghdr *msg, |
9173 | if (msg->msg_flags & MSG_OOB) |
9174 | return -EOPNOTSUPP; |
9175 | |
9176 | + buf = kmalloc(len, GFP_KERNEL); |
9177 | + if (!buf) |
9178 | + return -ENOMEM; |
9179 | + |
9180 | + if (memcpy_from_msg(buf, msg, len)) { |
9181 | + kfree(buf); |
9182 | + return -EFAULT; |
9183 | + } |
9184 | + |
9185 | lock_sock(sk); |
9186 | |
9187 | if (sk->sk_state == BT_CONNECTED) |
9188 | - err = sco_send_frame(sk, msg, len); |
9189 | + err = sco_send_frame(sk, buf, len, msg->msg_flags); |
9190 | else |
9191 | err = -ENOTCONN; |
9192 | |
9193 | release_sock(sk); |
9194 | + kfree(buf); |
9195 | return err; |
9196 | } |
9197 | |
9198 | diff --git a/net/can/j1939/main.c b/net/can/j1939/main.c |
9199 | index 266c189f1e809..ca75d1b8f415c 100644 |
9200 | --- a/net/can/j1939/main.c |
9201 | +++ b/net/can/j1939/main.c |
9202 | @@ -75,6 +75,13 @@ static void j1939_can_recv(struct sk_buff *iskb, void *data) |
9203 | skcb->addr.pgn = (cf->can_id >> 8) & J1939_PGN_MAX; |
9204 | /* set default message type */ |
9205 | skcb->addr.type = J1939_TP; |
9206 | + |
9207 | + if (!j1939_address_is_valid(skcb->addr.sa)) { |
9208 | + netdev_err_once(priv->ndev, "%s: sa is broadcast address, ignoring!\n", |
9209 | + __func__); |
9210 | + goto done; |
9211 | + } |
9212 | + |
9213 | if (j1939_pgn_is_pdu1(skcb->addr.pgn)) { |
9214 | /* Type 1: with destination address */ |
9215 | skcb->addr.da = skcb->addr.pgn; |
9216 | diff --git a/net/can/j1939/transport.c b/net/can/j1939/transport.c |
9217 | index 7a54170da09df..811682e06951b 100644 |
9218 | --- a/net/can/j1939/transport.c |
9219 | +++ b/net/can/j1939/transport.c |
9220 | @@ -2065,6 +2065,12 @@ static void j1939_tp_cmd_recv(struct j1939_priv *priv, struct sk_buff *skb) |
9221 | break; |
9222 | |
9223 | case J1939_ETP_CMD_ABORT: /* && J1939_TP_CMD_ABORT */ |
9224 | + if (j1939_cb_is_broadcast(skcb)) { |
9225 | + netdev_err_once(priv->ndev, "%s: abort to broadcast (%02x), ignoring!\n", |
9226 | + __func__, skcb->addr.sa); |
9227 | + return; |
9228 | + } |
9229 | + |
9230 | if (j1939_tp_im_transmitter(skcb)) |
9231 | j1939_xtp_rx_abort(priv, skb, true); |
9232 | |
9233 | diff --git a/net/core/dev.c b/net/core/dev.c |
9234 | index e4e492bf72af0..ff336417c9b90 100644 |
9235 | --- a/net/core/dev.c |
9236 | +++ b/net/core/dev.c |
9237 | @@ -2589,6 +2589,8 @@ int netif_set_real_num_tx_queues(struct net_device *dev, unsigned int txq) |
9238 | if (dev->num_tc) |
9239 | netif_setup_tc(dev, txq); |
9240 | |
9241 | + dev_qdisc_change_real_num_tx(dev, txq); |
9242 | + |
9243 | dev->real_num_tx_queues = txq; |
9244 | |
9245 | if (disabling) { |
9246 | @@ -3487,7 +3489,8 @@ int dev_loopback_xmit(struct net *net, struct sock *sk, struct sk_buff *skb) |
9247 | skb_reset_mac_header(skb); |
9248 | __skb_pull(skb, skb_network_offset(skb)); |
9249 | skb->pkt_type = PACKET_LOOPBACK; |
9250 | - skb->ip_summed = CHECKSUM_UNNECESSARY; |
9251 | + if (skb->ip_summed == CHECKSUM_NONE) |
9252 | + skb->ip_summed = CHECKSUM_UNNECESSARY; |
9253 | WARN_ON(!skb_dst(skb)); |
9254 | skb_dst_force(skb); |
9255 | netif_rx_ni(skb); |
9256 | diff --git a/net/core/filter.c b/net/core/filter.c |
9257 | index 0e161a6dff7e5..5ebc973ed4c50 100644 |
9258 | --- a/net/core/filter.c |
9259 | +++ b/net/core/filter.c |
9260 | @@ -8356,6 +8356,27 @@ static u32 sk_skb_convert_ctx_access(enum bpf_access_type type, |
9261 | *insn++ = BPF_LDX_MEM(BPF_SIZEOF(void *), si->dst_reg, |
9262 | si->src_reg, off); |
9263 | break; |
9264 | + case offsetof(struct __sk_buff, cb[0]) ... |
9265 | + offsetofend(struct __sk_buff, cb[4]) - 1: |
9266 | + BUILD_BUG_ON(sizeof_field(struct sk_skb_cb, data) < 20); |
9267 | + BUILD_BUG_ON((offsetof(struct sk_buff, cb) + |
9268 | + offsetof(struct sk_skb_cb, data)) % |
9269 | + sizeof(__u64)); |
9270 | + |
9271 | + prog->cb_access = 1; |
9272 | + off = si->off; |
9273 | + off -= offsetof(struct __sk_buff, cb[0]); |
9274 | + off += offsetof(struct sk_buff, cb); |
9275 | + off += offsetof(struct sk_skb_cb, data); |
9276 | + if (type == BPF_WRITE) |
9277 | + *insn++ = BPF_STX_MEM(BPF_SIZE(si->code), si->dst_reg, |
9278 | + si->src_reg, off); |
9279 | + else |
9280 | + *insn++ = BPF_LDX_MEM(BPF_SIZE(si->code), si->dst_reg, |
9281 | + si->src_reg, off); |
9282 | + break; |
9283 | + |
9284 | + |
9285 | default: |
9286 | return bpf_convert_ctx_access(type, si, insn_buf, prog, |
9287 | target_size); |
9288 | diff --git a/net/core/neighbour.c b/net/core/neighbour.c |
9289 | index f94d405358a21..02e55041a8813 100644 |
9290 | --- a/net/core/neighbour.c |
9291 | +++ b/net/core/neighbour.c |
9292 | @@ -380,7 +380,7 @@ EXPORT_SYMBOL(neigh_ifdown); |
9293 | |
9294 | static struct neighbour *neigh_alloc(struct neigh_table *tbl, |
9295 | struct net_device *dev, |
9296 | - bool exempt_from_gc) |
9297 | + u8 flags, bool exempt_from_gc) |
9298 | { |
9299 | struct neighbour *n = NULL; |
9300 | unsigned long now = jiffies; |
9301 | @@ -413,6 +413,7 @@ do_alloc: |
9302 | n->updated = n->used = now; |
9303 | n->nud_state = NUD_NONE; |
9304 | n->output = neigh_blackhole; |
9305 | + n->flags = flags; |
9306 | seqlock_init(&n->hh.hh_lock); |
9307 | n->parms = neigh_parms_clone(&tbl->parms); |
9308 | timer_setup(&n->timer, neigh_timer_handler, 0); |
9309 | @@ -576,19 +577,18 @@ struct neighbour *neigh_lookup_nodev(struct neigh_table *tbl, struct net *net, |
9310 | } |
9311 | EXPORT_SYMBOL(neigh_lookup_nodev); |
9312 | |
9313 | -static struct neighbour *___neigh_create(struct neigh_table *tbl, |
9314 | - const void *pkey, |
9315 | - struct net_device *dev, |
9316 | - bool exempt_from_gc, bool want_ref) |
9317 | +static struct neighbour * |
9318 | +___neigh_create(struct neigh_table *tbl, const void *pkey, |
9319 | + struct net_device *dev, u8 flags, |
9320 | + bool exempt_from_gc, bool want_ref) |
9321 | { |
9322 | - struct neighbour *n1, *rc, *n = neigh_alloc(tbl, dev, exempt_from_gc); |
9323 | - u32 hash_val; |
9324 | - unsigned int key_len = tbl->key_len; |
9325 | - int error; |
9326 | + u32 hash_val, key_len = tbl->key_len; |
9327 | + struct neighbour *n1, *rc, *n; |
9328 | struct neigh_hash_table *nht; |
9329 | + int error; |
9330 | |
9331 | + n = neigh_alloc(tbl, dev, flags, exempt_from_gc); |
9332 | trace_neigh_create(tbl, dev, pkey, n, exempt_from_gc); |
9333 | - |
9334 | if (!n) { |
9335 | rc = ERR_PTR(-ENOBUFS); |
9336 | goto out; |
9337 | @@ -675,7 +675,7 @@ out_neigh_release: |
9338 | struct neighbour *__neigh_create(struct neigh_table *tbl, const void *pkey, |
9339 | struct net_device *dev, bool want_ref) |
9340 | { |
9341 | - return ___neigh_create(tbl, pkey, dev, false, want_ref); |
9342 | + return ___neigh_create(tbl, pkey, dev, 0, false, want_ref); |
9343 | } |
9344 | EXPORT_SYMBOL(__neigh_create); |
9345 | |
9346 | @@ -1221,7 +1221,7 @@ static void neigh_update_hhs(struct neighbour *neigh) |
9347 | lladdr instead of overriding it |
9348 | if it is different. |
9349 | NEIGH_UPDATE_F_ADMIN means that the change is administrative. |
9350 | - |
9351 | + NEIGH_UPDATE_F_USE means that the entry is user triggered. |
9352 | NEIGH_UPDATE_F_OVERRIDE_ISROUTER allows to override existing |
9353 | NTF_ROUTER flag. |
9354 | NEIGH_UPDATE_F_ISROUTER indicates if the neighbour is known as |
9355 | @@ -1259,6 +1259,12 @@ static int __neigh_update(struct neighbour *neigh, const u8 *lladdr, |
9356 | goto out; |
9357 | |
9358 | ext_learn_change = neigh_update_ext_learned(neigh, flags, ¬ify); |
9359 | + if (flags & NEIGH_UPDATE_F_USE) { |
9360 | + new = old & ~NUD_PERMANENT; |
9361 | + neigh->nud_state = new; |
9362 | + err = 0; |
9363 | + goto out; |
9364 | + } |
9365 | |
9366 | if (!(new & NUD_VALID)) { |
9367 | neigh_del_timer(neigh); |
9368 | @@ -1945,7 +1951,9 @@ static int neigh_add(struct sk_buff *skb, struct nlmsghdr *nlh, |
9369 | |
9370 | exempt_from_gc = ndm->ndm_state & NUD_PERMANENT || |
9371 | ndm->ndm_flags & NTF_EXT_LEARNED; |
9372 | - neigh = ___neigh_create(tbl, dst, dev, exempt_from_gc, true); |
9373 | + neigh = ___neigh_create(tbl, dst, dev, |
9374 | + ndm->ndm_flags & NTF_EXT_LEARNED, |
9375 | + exempt_from_gc, true); |
9376 | if (IS_ERR(neigh)) { |
9377 | err = PTR_ERR(neigh); |
9378 | goto out; |
9379 | @@ -1964,22 +1972,20 @@ static int neigh_add(struct sk_buff *skb, struct nlmsghdr *nlh, |
9380 | |
9381 | if (protocol) |
9382 | neigh->protocol = protocol; |
9383 | - |
9384 | if (ndm->ndm_flags & NTF_EXT_LEARNED) |
9385 | flags |= NEIGH_UPDATE_F_EXT_LEARNED; |
9386 | - |
9387 | if (ndm->ndm_flags & NTF_ROUTER) |
9388 | flags |= NEIGH_UPDATE_F_ISROUTER; |
9389 | + if (ndm->ndm_flags & NTF_USE) |
9390 | + flags |= NEIGH_UPDATE_F_USE; |
9391 | |
9392 | - if (ndm->ndm_flags & NTF_USE) { |
9393 | + err = __neigh_update(neigh, lladdr, ndm->ndm_state, flags, |
9394 | + NETLINK_CB(skb).portid, extack); |
9395 | + if (!err && ndm->ndm_flags & NTF_USE) { |
9396 | neigh_event_send(neigh, NULL); |
9397 | err = 0; |
9398 | - } else |
9399 | - err = __neigh_update(neigh, lladdr, ndm->ndm_state, flags, |
9400 | - NETLINK_CB(skb).portid, extack); |
9401 | - |
9402 | + } |
9403 | neigh_release(neigh); |
9404 | - |
9405 | out: |
9406 | return err; |
9407 | } |
9408 | diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c |
9409 | index 98474d85fb51f..05b0c60bfba2b 100644 |
9410 | --- a/net/core/net-sysfs.c |
9411 | +++ b/net/core/net-sysfs.c |
9412 | @@ -174,6 +174,14 @@ static int change_carrier(struct net_device *dev, unsigned long new_carrier) |
9413 | static ssize_t carrier_store(struct device *dev, struct device_attribute *attr, |
9414 | const char *buf, size_t len) |
9415 | { |
9416 | + struct net_device *netdev = to_net_dev(dev); |
9417 | + |
9418 | + /* The check is also done in change_carrier; this helps returning early |
9419 | + * without hitting the trylock/restart in netdev_store. |
9420 | + */ |
9421 | + if (!netdev->netdev_ops->ndo_change_carrier) |
9422 | + return -EOPNOTSUPP; |
9423 | + |
9424 | return netdev_store(dev, attr, buf, len, change_carrier); |
9425 | } |
9426 | |
9427 | @@ -195,6 +203,12 @@ static ssize_t speed_show(struct device *dev, |
9428 | struct net_device *netdev = to_net_dev(dev); |
9429 | int ret = -EINVAL; |
9430 | |
9431 | + /* The check is also done in __ethtool_get_link_ksettings; this helps |
9432 | + * returning early without hitting the trylock/restart below. |
9433 | + */ |
9434 | + if (!netdev->ethtool_ops->get_link_ksettings) |
9435 | + return ret; |
9436 | + |
9437 | if (!rtnl_trylock()) |
9438 | return restart_syscall(); |
9439 | |
9440 | @@ -215,6 +229,12 @@ static ssize_t duplex_show(struct device *dev, |
9441 | struct net_device *netdev = to_net_dev(dev); |
9442 | int ret = -EINVAL; |
9443 | |
9444 | + /* The check is also done in __ethtool_get_link_ksettings; this helps |
9445 | + * returning early without hitting the trylock/restart below. |
9446 | + */ |
9447 | + if (!netdev->ethtool_ops->get_link_ksettings) |
9448 | + return ret; |
9449 | + |
9450 | if (!rtnl_trylock()) |
9451 | return restart_syscall(); |
9452 | |
9453 | @@ -438,6 +458,14 @@ static ssize_t proto_down_store(struct device *dev, |
9454 | struct device_attribute *attr, |
9455 | const char *buf, size_t len) |
9456 | { |
9457 | + struct net_device *netdev = to_net_dev(dev); |
9458 | + |
9459 | + /* The check is also done in change_proto_down; this helps returning |
9460 | + * early without hitting the trylock/restart in netdev_store. |
9461 | + */ |
9462 | + if (!netdev->netdev_ops->ndo_change_proto_down) |
9463 | + return -EOPNOTSUPP; |
9464 | + |
9465 | return netdev_store(dev, attr, buf, len, change_proto_down); |
9466 | } |
9467 | NETDEVICE_SHOW_RW(proto_down, fmt_dec); |
9468 | @@ -448,6 +476,12 @@ static ssize_t phys_port_id_show(struct device *dev, |
9469 | struct net_device *netdev = to_net_dev(dev); |
9470 | ssize_t ret = -EINVAL; |
9471 | |
9472 | + /* The check is also done in dev_get_phys_port_id; this helps returning |
9473 | + * early without hitting the trylock/restart below. |
9474 | + */ |
9475 | + if (!netdev->netdev_ops->ndo_get_phys_port_id) |
9476 | + return -EOPNOTSUPP; |
9477 | + |
9478 | if (!rtnl_trylock()) |
9479 | return restart_syscall(); |
9480 | |
9481 | @@ -470,6 +504,13 @@ static ssize_t phys_port_name_show(struct device *dev, |
9482 | struct net_device *netdev = to_net_dev(dev); |
9483 | ssize_t ret = -EINVAL; |
9484 | |
9485 | + /* The checks are also done in dev_get_phys_port_name; this helps |
9486 | + * returning early without hitting the trylock/restart below. |
9487 | + */ |
9488 | + if (!netdev->netdev_ops->ndo_get_phys_port_name && |
9489 | + !netdev->netdev_ops->ndo_get_devlink_port) |
9490 | + return -EOPNOTSUPP; |
9491 | + |
9492 | if (!rtnl_trylock()) |
9493 | return restart_syscall(); |
9494 | |
9495 | @@ -492,6 +533,14 @@ static ssize_t phys_switch_id_show(struct device *dev, |
9496 | struct net_device *netdev = to_net_dev(dev); |
9497 | ssize_t ret = -EINVAL; |
9498 | |
9499 | + /* The checks are also done in dev_get_phys_port_name; this helps |
9500 | + * returning early without hitting the trylock/restart below. This works |
9501 | + * because recurse is false when calling dev_get_port_parent_id. |
9502 | + */ |
9503 | + if (!netdev->netdev_ops->ndo_get_port_parent_id && |
9504 | + !netdev->netdev_ops->ndo_get_devlink_port) |
9505 | + return -EOPNOTSUPP; |
9506 | + |
9507 | if (!rtnl_trylock()) |
9508 | return restart_syscall(); |
9509 | |
9510 | @@ -1097,6 +1146,12 @@ static ssize_t tx_maxrate_store(struct netdev_queue *queue, |
9511 | if (!capable(CAP_NET_ADMIN)) |
9512 | return -EPERM; |
9513 | |
9514 | + /* The check is also done later; this helps returning early without |
9515 | + * hitting the trylock/restart below. |
9516 | + */ |
9517 | + if (!dev->netdev_ops->ndo_set_tx_maxrate) |
9518 | + return -EOPNOTSUPP; |
9519 | + |
9520 | err = kstrtou32(buf, 10, &rate); |
9521 | if (err < 0) |
9522 | return err; |
9523 | diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c |
9524 | index 9bf15512601bf..cd1d40195e461 100644 |
9525 | --- a/net/core/net_namespace.c |
9526 | +++ b/net/core/net_namespace.c |
9527 | @@ -480,7 +480,9 @@ struct net *copy_net_ns(unsigned long flags, |
9528 | |
9529 | if (rv < 0) { |
9530 | put_userns: |
9531 | +#ifdef CONFIG_KEYS |
9532 | key_remove_domain(net->key_domain); |
9533 | +#endif |
9534 | put_user_ns(user_ns); |
9535 | net_drop_ns(net); |
9536 | dec_ucounts: |
9537 | @@ -612,7 +614,9 @@ static void cleanup_net(struct work_struct *work) |
9538 | list_for_each_entry_safe(net, tmp, &net_exit_list, exit_list) { |
9539 | list_del_init(&net->exit_list); |
9540 | dec_net_namespaces(net->ucounts); |
9541 | +#ifdef CONFIG_KEYS |
9542 | key_remove_domain(net->key_domain); |
9543 | +#endif |
9544 | put_user_ns(net->user_ns); |
9545 | net_drop_ns(net); |
9546 | } |
9547 | diff --git a/net/core/stream.c b/net/core/stream.c |
9548 | index 4f1d4aa5fb38d..a166a32b411fa 100644 |
9549 | --- a/net/core/stream.c |
9550 | +++ b/net/core/stream.c |
9551 | @@ -195,9 +195,6 @@ void sk_stream_kill_queues(struct sock *sk) |
9552 | /* First the read buffer. */ |
9553 | __skb_queue_purge(&sk->sk_receive_queue); |
9554 | |
9555 | - /* Next, the error queue. */ |
9556 | - __skb_queue_purge(&sk->sk_error_queue); |
9557 | - |
9558 | /* Next, the write queue. */ |
9559 | WARN_ON(!skb_queue_empty(&sk->sk_write_queue)); |
9560 | |
9561 | diff --git a/net/core/sysctl_net_core.c b/net/core/sysctl_net_core.c |
9562 | index 669cbe1609d9e..48041f50ecfb4 100644 |
9563 | --- a/net/core/sysctl_net_core.c |
9564 | +++ b/net/core/sysctl_net_core.c |
9565 | @@ -424,7 +424,7 @@ static struct ctl_table net_core_table[] = { |
9566 | .mode = 0600, |
9567 | .proc_handler = proc_dolongvec_minmax_bpf_restricted, |
9568 | .extra1 = &long_one, |
9569 | - .extra2 = &long_max, |
9570 | + .extra2 = &bpf_jit_limit_max, |
9571 | }, |
9572 | #endif |
9573 | { |
9574 | diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c |
9575 | index 5c8d0fb498256..9f53d25e047e3 100644 |
9576 | --- a/net/ipv4/tcp.c |
9577 | +++ b/net/ipv4/tcp.c |
9578 | @@ -955,7 +955,7 @@ static int tcp_send_mss(struct sock *sk, int *size_goal, int flags) |
9579 | */ |
9580 | static void tcp_remove_empty_skb(struct sock *sk, struct sk_buff *skb) |
9581 | { |
9582 | - if (skb && !skb->len) { |
9583 | + if (skb && TCP_SKB_CB(skb)->seq == TCP_SKB_CB(skb)->end_seq) { |
9584 | tcp_unlink_write_queue(skb, sk); |
9585 | if (tcp_write_queue_empty(sk)) |
9586 | tcp_chrono_stop(sk, TCP_CHRONO_BUSY); |
9587 | diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c |
9588 | index 366c3792b8604..d1f29a3eb70be 100644 |
9589 | --- a/net/ipv6/addrconf.c |
9590 | +++ b/net/ipv6/addrconf.c |
9591 | @@ -3111,6 +3111,9 @@ static void sit_add_v4_addrs(struct inet6_dev *idev) |
9592 | memcpy(&addr.s6_addr32[3], idev->dev->dev_addr, 4); |
9593 | |
9594 | if (idev->dev->flags&IFF_POINTOPOINT) { |
9595 | + if (idev->cnf.addr_gen_mode == IN6_ADDR_GEN_MODE_NONE) |
9596 | + return; |
9597 | + |
9598 | addr.s6_addr32[0] = htonl(0xfe800000); |
9599 | scope = IFA_LINK; |
9600 | plen = 64; |
9601 | diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c |
9602 | index 0f57c682afdd8..818fc99756256 100644 |
9603 | --- a/net/ipv6/udp.c |
9604 | +++ b/net/ipv6/udp.c |
9605 | @@ -1363,7 +1363,6 @@ do_udp_sendmsg: |
9606 | if (!fl6.flowi6_oif) |
9607 | fl6.flowi6_oif = np->sticky_pktinfo.ipi6_ifindex; |
9608 | |
9609 | - fl6.flowi6_mark = ipc6.sockc.mark; |
9610 | fl6.flowi6_uid = sk->sk_uid; |
9611 | |
9612 | if (msg->msg_controllen) { |
9613 | @@ -1399,6 +1398,7 @@ do_udp_sendmsg: |
9614 | ipc6.opt = opt; |
9615 | |
9616 | fl6.flowi6_proto = sk->sk_protocol; |
9617 | + fl6.flowi6_mark = ipc6.sockc.mark; |
9618 | fl6.daddr = *daddr; |
9619 | if (ipv6_addr_any(&fl6.saddr) && !ipv6_addr_any(&np->saddr)) |
9620 | fl6.saddr = np->saddr; |
9621 | diff --git a/net/netfilter/nf_conntrack_proto_udp.c b/net/netfilter/nf_conntrack_proto_udp.c |
9622 | index 7365b43f8f980..e3a2d018f4ec5 100644 |
9623 | --- a/net/netfilter/nf_conntrack_proto_udp.c |
9624 | +++ b/net/netfilter/nf_conntrack_proto_udp.c |
9625 | @@ -105,15 +105,18 @@ int nf_conntrack_udp_packet(struct nf_conn *ct, |
9626 | */ |
9627 | if (test_bit(IPS_SEEN_REPLY_BIT, &ct->status)) { |
9628 | unsigned long extra = timeouts[UDP_CT_UNREPLIED]; |
9629 | + bool stream = false; |
9630 | |
9631 | /* Still active after two seconds? Extend timeout. */ |
9632 | - if (time_after(jiffies, ct->proto.udp.stream_ts)) |
9633 | + if (time_after(jiffies, ct->proto.udp.stream_ts)) { |
9634 | extra = timeouts[UDP_CT_REPLIED]; |
9635 | + stream = true; |
9636 | + } |
9637 | |
9638 | nf_ct_refresh_acct(ct, ctinfo, skb, extra); |
9639 | |
9640 | /* Also, more likely to be important, and not a probe */ |
9641 | - if (!test_and_set_bit(IPS_ASSURED_BIT, &ct->status)) |
9642 | + if (stream && !test_and_set_bit(IPS_ASSURED_BIT, &ct->status)) |
9643 | nf_conntrack_event_cache(IPCT_ASSURED, ct); |
9644 | } else { |
9645 | nf_ct_refresh_acct(ct, ctinfo, skb, |
9646 | diff --git a/net/netfilter/nfnetlink_queue.c b/net/netfilter/nfnetlink_queue.c |
9647 | index 6f0a2bad8ad5e..a8cb562da3fea 100644 |
9648 | --- a/net/netfilter/nfnetlink_queue.c |
9649 | +++ b/net/netfilter/nfnetlink_queue.c |
9650 | @@ -562,7 +562,7 @@ nfqnl_build_packet_message(struct net *net, struct nfqnl_instance *queue, |
9651 | goto nla_put_failure; |
9652 | |
9653 | if (indev && entskb->dev && |
9654 | - entskb->mac_header != entskb->network_header) { |
9655 | + skb_mac_header_was_set(entskb)) { |
9656 | struct nfqnl_msg_packet_hw phw; |
9657 | int len; |
9658 | |
9659 | diff --git a/net/netfilter/nft_dynset.c b/net/netfilter/nft_dynset.c |
9660 | index 95415d2b81c93..6fdea0e57db8a 100644 |
9661 | --- a/net/netfilter/nft_dynset.c |
9662 | +++ b/net/netfilter/nft_dynset.c |
9663 | @@ -164,17 +164,8 @@ static int nft_dynset_init(const struct nft_ctx *ctx, |
9664 | return -EBUSY; |
9665 | |
9666 | priv->op = ntohl(nla_get_be32(tb[NFTA_DYNSET_OP])); |
9667 | - switch (priv->op) { |
9668 | - case NFT_DYNSET_OP_ADD: |
9669 | - case NFT_DYNSET_OP_DELETE: |
9670 | - break; |
9671 | - case NFT_DYNSET_OP_UPDATE: |
9672 | - if (!(set->flags & NFT_SET_TIMEOUT)) |
9673 | - return -EOPNOTSUPP; |
9674 | - break; |
9675 | - default: |
9676 | + if (priv->op > NFT_DYNSET_OP_DELETE) |
9677 | return -EOPNOTSUPP; |
9678 | - } |
9679 | |
9680 | timeout = 0; |
9681 | if (tb[NFTA_DYNSET_TIMEOUT] != NULL) { |
9682 | diff --git a/net/rxrpc/rtt.c b/net/rxrpc/rtt.c |
9683 | index 928d8b34a3eee..f3f87c9f0209d 100644 |
9684 | --- a/net/rxrpc/rtt.c |
9685 | +++ b/net/rxrpc/rtt.c |
9686 | @@ -23,7 +23,7 @@ static u32 rxrpc_rto_min_us(struct rxrpc_peer *peer) |
9687 | |
9688 | static u32 __rxrpc_set_rto(const struct rxrpc_peer *peer) |
9689 | { |
9690 | - return _usecs_to_jiffies((peer->srtt_us >> 3) + peer->rttvar_us); |
9691 | + return usecs_to_jiffies((peer->srtt_us >> 3) + peer->rttvar_us); |
9692 | } |
9693 | |
9694 | static u32 rxrpc_bound_rto(u32 rto) |
9695 | diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c |
9696 | index 9bc5cbe9809b8..d973f8a15e117 100644 |
9697 | --- a/net/sched/sch_generic.c |
9698 | +++ b/net/sched/sch_generic.c |
9699 | @@ -1313,6 +1313,15 @@ static int qdisc_change_tx_queue_len(struct net_device *dev, |
9700 | return 0; |
9701 | } |
9702 | |
9703 | +void dev_qdisc_change_real_num_tx(struct net_device *dev, |
9704 | + unsigned int new_real_tx) |
9705 | +{ |
9706 | + struct Qdisc *qdisc = dev->qdisc; |
9707 | + |
9708 | + if (qdisc->ops->change_real_num_tx) |
9709 | + qdisc->ops->change_real_num_tx(qdisc, new_real_tx); |
9710 | +} |
9711 | + |
9712 | int dev_qdisc_change_tx_queue_len(struct net_device *dev) |
9713 | { |
9714 | bool up = dev->flags & IFF_UP; |
9715 | diff --git a/net/sched/sch_mq.c b/net/sched/sch_mq.c |
9716 | index e79f1afe0cfd6..db18d8a860f9c 100644 |
9717 | --- a/net/sched/sch_mq.c |
9718 | +++ b/net/sched/sch_mq.c |
9719 | @@ -125,6 +125,29 @@ static void mq_attach(struct Qdisc *sch) |
9720 | priv->qdiscs = NULL; |
9721 | } |
9722 | |
9723 | +static void mq_change_real_num_tx(struct Qdisc *sch, unsigned int new_real_tx) |
9724 | +{ |
9725 | +#ifdef CONFIG_NET_SCHED |
9726 | + struct net_device *dev = qdisc_dev(sch); |
9727 | + struct Qdisc *qdisc; |
9728 | + unsigned int i; |
9729 | + |
9730 | + for (i = new_real_tx; i < dev->real_num_tx_queues; i++) { |
9731 | + qdisc = netdev_get_tx_queue(dev, i)->qdisc_sleeping; |
9732 | + /* Only update the default qdiscs we created, |
9733 | + * qdiscs with handles are always hashed. |
9734 | + */ |
9735 | + if (qdisc != &noop_qdisc && !qdisc->handle) |
9736 | + qdisc_hash_del(qdisc); |
9737 | + } |
9738 | + for (i = dev->real_num_tx_queues; i < new_real_tx; i++) { |
9739 | + qdisc = netdev_get_tx_queue(dev, i)->qdisc_sleeping; |
9740 | + if (qdisc != &noop_qdisc && !qdisc->handle) |
9741 | + qdisc_hash_add(qdisc, false); |
9742 | + } |
9743 | +#endif |
9744 | +} |
9745 | + |
9746 | static int mq_dump(struct Qdisc *sch, struct sk_buff *skb) |
9747 | { |
9748 | struct net_device *dev = qdisc_dev(sch); |
9749 | @@ -288,6 +311,7 @@ struct Qdisc_ops mq_qdisc_ops __read_mostly = { |
9750 | .init = mq_init, |
9751 | .destroy = mq_destroy, |
9752 | .attach = mq_attach, |
9753 | + .change_real_num_tx = mq_change_real_num_tx, |
9754 | .dump = mq_dump, |
9755 | .owner = THIS_MODULE, |
9756 | }; |
9757 | diff --git a/net/sched/sch_mqprio.c b/net/sched/sch_mqprio.c |
9758 | index 5eb3b1b7ae5e7..50e15add6068f 100644 |
9759 | --- a/net/sched/sch_mqprio.c |
9760 | +++ b/net/sched/sch_mqprio.c |
9761 | @@ -306,6 +306,28 @@ static void mqprio_attach(struct Qdisc *sch) |
9762 | priv->qdiscs = NULL; |
9763 | } |
9764 | |
9765 | +static void mqprio_change_real_num_tx(struct Qdisc *sch, |
9766 | + unsigned int new_real_tx) |
9767 | +{ |
9768 | + struct net_device *dev = qdisc_dev(sch); |
9769 | + struct Qdisc *qdisc; |
9770 | + unsigned int i; |
9771 | + |
9772 | + for (i = new_real_tx; i < dev->real_num_tx_queues; i++) { |
9773 | + qdisc = netdev_get_tx_queue(dev, i)->qdisc_sleeping; |
9774 | + /* Only update the default qdiscs we created, |
9775 | + * qdiscs with handles are always hashed. |
9776 | + */ |
9777 | + if (qdisc != &noop_qdisc && !qdisc->handle) |
9778 | + qdisc_hash_del(qdisc); |
9779 | + } |
9780 | + for (i = dev->real_num_tx_queues; i < new_real_tx; i++) { |
9781 | + qdisc = netdev_get_tx_queue(dev, i)->qdisc_sleeping; |
9782 | + if (qdisc != &noop_qdisc && !qdisc->handle) |
9783 | + qdisc_hash_add(qdisc, false); |
9784 | + } |
9785 | +} |
9786 | + |
9787 | static struct netdev_queue *mqprio_queue_get(struct Qdisc *sch, |
9788 | unsigned long cl) |
9789 | { |
9790 | @@ -629,6 +651,7 @@ static struct Qdisc_ops mqprio_qdisc_ops __read_mostly = { |
9791 | .init = mqprio_init, |
9792 | .destroy = mqprio_destroy, |
9793 | .attach = mqprio_attach, |
9794 | + .change_real_num_tx = mqprio_change_real_num_tx, |
9795 | .dump = mqprio_dump, |
9796 | .owner = THIS_MODULE, |
9797 | }; |
9798 | diff --git a/net/sched/sch_taprio.c b/net/sched/sch_taprio.c |
9799 | index e14a66ce4884d..b268e61304515 100644 |
9800 | --- a/net/sched/sch_taprio.c |
9801 | +++ b/net/sched/sch_taprio.c |
9802 | @@ -94,18 +94,22 @@ static ktime_t sched_base_time(const struct sched_gate_list *sched) |
9803 | return ns_to_ktime(sched->base_time); |
9804 | } |
9805 | |
9806 | -static ktime_t taprio_get_time(struct taprio_sched *q) |
9807 | +static ktime_t taprio_mono_to_any(const struct taprio_sched *q, ktime_t mono) |
9808 | { |
9809 | - ktime_t mono = ktime_get(); |
9810 | + /* This pairs with WRITE_ONCE() in taprio_parse_clockid() */ |
9811 | + enum tk_offsets tk_offset = READ_ONCE(q->tk_offset); |
9812 | |
9813 | - switch (q->tk_offset) { |
9814 | + switch (tk_offset) { |
9815 | case TK_OFFS_MAX: |
9816 | return mono; |
9817 | default: |
9818 | - return ktime_mono_to_any(mono, q->tk_offset); |
9819 | + return ktime_mono_to_any(mono, tk_offset); |
9820 | } |
9821 | +} |
9822 | |
9823 | - return KTIME_MAX; |
9824 | +static ktime_t taprio_get_time(const struct taprio_sched *q) |
9825 | +{ |
9826 | + return taprio_mono_to_any(q, ktime_get()); |
9827 | } |
9828 | |
9829 | static void taprio_free_sched_cb(struct rcu_head *head) |
9830 | @@ -321,7 +325,7 @@ static ktime_t get_tcp_tstamp(struct taprio_sched *q, struct sk_buff *skb) |
9831 | return 0; |
9832 | } |
9833 | |
9834 | - return ktime_mono_to_any(skb->skb_mstamp_ns, q->tk_offset); |
9835 | + return taprio_mono_to_any(q, skb->skb_mstamp_ns); |
9836 | } |
9837 | |
9838 | /* There are a few scenarios where we will have to modify the txtime from |
9839 | @@ -1342,6 +1346,7 @@ static int taprio_parse_clockid(struct Qdisc *sch, struct nlattr **tb, |
9840 | } |
9841 | } else if (tb[TCA_TAPRIO_ATTR_SCHED_CLOCKID]) { |
9842 | int clockid = nla_get_s32(tb[TCA_TAPRIO_ATTR_SCHED_CLOCKID]); |
9843 | + enum tk_offsets tk_offset; |
9844 | |
9845 | /* We only support static clockids and we don't allow |
9846 | * for it to be modified after the first init. |
9847 | @@ -1356,22 +1361,24 @@ static int taprio_parse_clockid(struct Qdisc *sch, struct nlattr **tb, |
9848 | |
9849 | switch (clockid) { |
9850 | case CLOCK_REALTIME: |
9851 | - q->tk_offset = TK_OFFS_REAL; |
9852 | + tk_offset = TK_OFFS_REAL; |
9853 | break; |
9854 | case CLOCK_MONOTONIC: |
9855 | - q->tk_offset = TK_OFFS_MAX; |
9856 | + tk_offset = TK_OFFS_MAX; |
9857 | break; |
9858 | case CLOCK_BOOTTIME: |
9859 | - q->tk_offset = TK_OFFS_BOOT; |
9860 | + tk_offset = TK_OFFS_BOOT; |
9861 | break; |
9862 | case CLOCK_TAI: |
9863 | - q->tk_offset = TK_OFFS_TAI; |
9864 | + tk_offset = TK_OFFS_TAI; |
9865 | break; |
9866 | default: |
9867 | NL_SET_ERR_MSG(extack, "Invalid 'clockid'"); |
9868 | err = -EINVAL; |
9869 | goto out; |
9870 | } |
9871 | + /* This pairs with READ_ONCE() in taprio_mono_to_any */ |
9872 | + WRITE_ONCE(q->tk_offset, tk_offset); |
9873 | |
9874 | q->clockid = clockid; |
9875 | } else { |
9876 | diff --git a/net/smc/af_smc.c b/net/smc/af_smc.c |
9877 | index 51986f7ead819..6b0f09c5b195f 100644 |
9878 | --- a/net/smc/af_smc.c |
9879 | +++ b/net/smc/af_smc.c |
9880 | @@ -139,14 +139,18 @@ static int __smc_release(struct smc_sock *smc) |
9881 | sock_set_flag(sk, SOCK_DEAD); |
9882 | sk->sk_shutdown |= SHUTDOWN_MASK; |
9883 | } else { |
9884 | - if (sk->sk_state != SMC_LISTEN && sk->sk_state != SMC_INIT) |
9885 | - sock_put(sk); /* passive closing */ |
9886 | - if (sk->sk_state == SMC_LISTEN) { |
9887 | - /* wake up clcsock accept */ |
9888 | - rc = kernel_sock_shutdown(smc->clcsock, SHUT_RDWR); |
9889 | + if (sk->sk_state != SMC_CLOSED) { |
9890 | + if (sk->sk_state != SMC_LISTEN && |
9891 | + sk->sk_state != SMC_INIT) |
9892 | + sock_put(sk); /* passive closing */ |
9893 | + if (sk->sk_state == SMC_LISTEN) { |
9894 | + /* wake up clcsock accept */ |
9895 | + rc = kernel_sock_shutdown(smc->clcsock, |
9896 | + SHUT_RDWR); |
9897 | + } |
9898 | + sk->sk_state = SMC_CLOSED; |
9899 | + sk->sk_state_change(sk); |
9900 | } |
9901 | - sk->sk_state = SMC_CLOSED; |
9902 | - sk->sk_state_change(sk); |
9903 | smc_restore_fallback_changes(smc); |
9904 | } |
9905 | |
9906 | @@ -783,7 +787,7 @@ static void smc_connect_work(struct work_struct *work) |
9907 | if (smc->clcsock->sk->sk_err) { |
9908 | smc->sk.sk_err = smc->clcsock->sk->sk_err; |
9909 | } else if ((1 << smc->clcsock->sk->sk_state) & |
9910 | - (TCPF_SYN_SENT | TCP_SYN_RECV)) { |
9911 | + (TCPF_SYN_SENT | TCPF_SYN_RECV)) { |
9912 | rc = sk_stream_wait_connect(smc->clcsock->sk, &timeo); |
9913 | if ((rc == -EPIPE) && |
9914 | ((1 << smc->clcsock->sk->sk_state) & |
9915 | diff --git a/net/strparser/strparser.c b/net/strparser/strparser.c |
9916 | index b3815c1e8f2ea..cd9954c4ad808 100644 |
9917 | --- a/net/strparser/strparser.c |
9918 | +++ b/net/strparser/strparser.c |
9919 | @@ -27,18 +27,10 @@ |
9920 | |
9921 | static struct workqueue_struct *strp_wq; |
9922 | |
9923 | -struct _strp_msg { |
9924 | - /* Internal cb structure. struct strp_msg must be first for passing |
9925 | - * to upper layer. |
9926 | - */ |
9927 | - struct strp_msg strp; |
9928 | - int accum_len; |
9929 | -}; |
9930 | - |
9931 | static inline struct _strp_msg *_strp_msg(struct sk_buff *skb) |
9932 | { |
9933 | return (struct _strp_msg *)((void *)skb->cb + |
9934 | - offsetof(struct qdisc_skb_cb, data)); |
9935 | + offsetof(struct sk_skb_cb, strp)); |
9936 | } |
9937 | |
9938 | /* Lower lock held */ |
9939 | diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c |
9940 | index 3653898f465ff..93b6afd28405e 100644 |
9941 | --- a/net/sunrpc/xprt.c |
9942 | +++ b/net/sunrpc/xprt.c |
9943 | @@ -1538,15 +1538,14 @@ xprt_transmit(struct rpc_task *task) |
9944 | { |
9945 | struct rpc_rqst *next, *req = task->tk_rqstp; |
9946 | struct rpc_xprt *xprt = req->rq_xprt; |
9947 | - int counter, status; |
9948 | + int status; |
9949 | |
9950 | spin_lock(&xprt->queue_lock); |
9951 | - counter = 0; |
9952 | - while (!list_empty(&xprt->xmit_queue)) { |
9953 | - if (++counter == 20) |
9954 | + for (;;) { |
9955 | + next = list_first_entry_or_null(&xprt->xmit_queue, |
9956 | + struct rpc_rqst, rq_xmit); |
9957 | + if (!next) |
9958 | break; |
9959 | - next = list_first_entry(&xprt->xmit_queue, |
9960 | - struct rpc_rqst, rq_xmit); |
9961 | xprt_pin_rqst(next); |
9962 | spin_unlock(&xprt->queue_lock); |
9963 | status = xprt_request_transmit(next, task); |
9964 | @@ -1554,13 +1553,16 @@ xprt_transmit(struct rpc_task *task) |
9965 | status = 0; |
9966 | spin_lock(&xprt->queue_lock); |
9967 | xprt_unpin_rqst(next); |
9968 | - if (status == 0) { |
9969 | - if (!xprt_request_data_received(task) || |
9970 | - test_bit(RPC_TASK_NEED_XMIT, &task->tk_runstate)) |
9971 | - continue; |
9972 | - } else if (test_bit(RPC_TASK_NEED_XMIT, &task->tk_runstate)) |
9973 | - task->tk_status = status; |
9974 | - break; |
9975 | + if (status < 0) { |
9976 | + if (test_bit(RPC_TASK_NEED_XMIT, &task->tk_runstate)) |
9977 | + task->tk_status = status; |
9978 | + break; |
9979 | + } |
9980 | + /* Was @task transmitted, and has it received a reply? */ |
9981 | + if (xprt_request_data_received(task) && |
9982 | + !test_bit(RPC_TASK_NEED_XMIT, &task->tk_runstate)) |
9983 | + break; |
9984 | + cond_resched_lock(&xprt->queue_lock); |
9985 | } |
9986 | spin_unlock(&xprt->queue_lock); |
9987 | } |
9988 | diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c |
9989 | index d4104144bab1b..bc8055f4571bc 100644 |
9990 | --- a/net/vmw_vsock/af_vsock.c |
9991 | +++ b/net/vmw_vsock/af_vsock.c |
9992 | @@ -1151,6 +1151,8 @@ static int vsock_stream_connect(struct socket *sock, struct sockaddr *addr, |
9993 | * non-blocking call. |
9994 | */ |
9995 | err = -EALREADY; |
9996 | + if (flags & O_NONBLOCK) |
9997 | + goto out; |
9998 | break; |
9999 | default: |
10000 | if ((sk->sk_state == TCP_LISTEN) || |
10001 | diff --git a/samples/kprobes/kretprobe_example.c b/samples/kprobes/kretprobe_example.c |
10002 | index 186315ca88b3f..2701549ee7b3a 100644 |
10003 | --- a/samples/kprobes/kretprobe_example.c |
10004 | +++ b/samples/kprobes/kretprobe_example.c |
10005 | @@ -84,7 +84,7 @@ static int __init kretprobe_init(void) |
10006 | ret = register_kretprobe(&my_kretprobe); |
10007 | if (ret < 0) { |
10008 | pr_err("register_kretprobe failed, returned %d\n", ret); |
10009 | - return -1; |
10010 | + return ret; |
10011 | } |
10012 | pr_info("Planted return probe at %s: %p\n", |
10013 | my_kretprobe.kp.symbol_name, my_kretprobe.kp.addr); |
10014 | diff --git a/scripts/leaking_addresses.pl b/scripts/leaking_addresses.pl |
10015 | index b2d8b8aa2d99e..8f636a23bc3f2 100755 |
10016 | --- a/scripts/leaking_addresses.pl |
10017 | +++ b/scripts/leaking_addresses.pl |
10018 | @@ -455,8 +455,9 @@ sub parse_file |
10019 | |
10020 | open my $fh, "<", $file or return; |
10021 | while ( <$fh> ) { |
10022 | + chomp; |
10023 | if (may_leak_address($_)) { |
10024 | - print $file . ': ' . $_; |
10025 | + printf("$file: $_\n"); |
10026 | } |
10027 | } |
10028 | close $fh; |
10029 | diff --git a/security/apparmor/label.c b/security/apparmor/label.c |
10030 | index 5f324d63ceaa3..747a734a08246 100644 |
10031 | --- a/security/apparmor/label.c |
10032 | +++ b/security/apparmor/label.c |
10033 | @@ -1459,7 +1459,7 @@ bool aa_update_label_name(struct aa_ns *ns, struct aa_label *label, gfp_t gfp) |
10034 | if (label->hname || labels_ns(label) != ns) |
10035 | return res; |
10036 | |
10037 | - if (aa_label_acntsxprint(&name, ns, label, FLAGS_NONE, gfp) == -1) |
10038 | + if (aa_label_acntsxprint(&name, ns, label, FLAGS_NONE, gfp) < 0) |
10039 | return res; |
10040 | |
10041 | ls = labels_set(label); |
10042 | @@ -1709,7 +1709,7 @@ int aa_label_asxprint(char **strp, struct aa_ns *ns, struct aa_label *label, |
10043 | |
10044 | /** |
10045 | * aa_label_acntsxprint - allocate a __counted string buffer and print label |
10046 | - * @strp: buffer to write to. (MAY BE NULL if @size == 0) |
10047 | + * @strp: buffer to write to. |
10048 | * @ns: namespace profile is being viewed from |
10049 | * @label: label to view (NOT NULL) |
10050 | * @flags: flags controlling what label info is printed |
10051 | diff --git a/security/integrity/evm/evm_main.c b/security/integrity/evm/evm_main.c |
10052 | index 81e3245aec86c..b82291d10e730 100644 |
10053 | --- a/security/integrity/evm/evm_main.c |
10054 | +++ b/security/integrity/evm/evm_main.c |
10055 | @@ -56,7 +56,7 @@ static struct xattr_list evm_config_default_xattrnames[] = { |
10056 | |
10057 | LIST_HEAD(evm_config_xattrnames); |
10058 | |
10059 | -static int evm_fixmode; |
10060 | +static int evm_fixmode __ro_after_init; |
10061 | static int __init evm_set_fixmode(char *str) |
10062 | { |
10063 | if (strncmp(str, "fix", 3) == 0) |
10064 | diff --git a/security/security.c b/security/security.c |
10065 | index 1bc000f834e2d..c34ec4c7d98cc 100644 |
10066 | --- a/security/security.c |
10067 | +++ b/security/security.c |
10068 | @@ -670,25 +670,25 @@ static void __init lsm_early_task(struct task_struct *task) |
10069 | |
10070 | /* Security operations */ |
10071 | |
10072 | -int security_binder_set_context_mgr(struct task_struct *mgr) |
10073 | +int security_binder_set_context_mgr(const struct cred *mgr) |
10074 | { |
10075 | return call_int_hook(binder_set_context_mgr, 0, mgr); |
10076 | } |
10077 | |
10078 | -int security_binder_transaction(struct task_struct *from, |
10079 | - struct task_struct *to) |
10080 | +int security_binder_transaction(const struct cred *from, |
10081 | + const struct cred *to) |
10082 | { |
10083 | return call_int_hook(binder_transaction, 0, from, to); |
10084 | } |
10085 | |
10086 | -int security_binder_transfer_binder(struct task_struct *from, |
10087 | - struct task_struct *to) |
10088 | +int security_binder_transfer_binder(const struct cred *from, |
10089 | + const struct cred *to) |
10090 | { |
10091 | return call_int_hook(binder_transfer_binder, 0, from, to); |
10092 | } |
10093 | |
10094 | -int security_binder_transfer_file(struct task_struct *from, |
10095 | - struct task_struct *to, struct file *file) |
10096 | +int security_binder_transfer_file(const struct cred *from, |
10097 | + const struct cred *to, struct file *file) |
10098 | { |
10099 | return call_int_hook(binder_transfer_file, 0, from, to, file); |
10100 | } |
10101 | diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c |
10102 | index 717a398ef4d05..8b9cbe1e8ee22 100644 |
10103 | --- a/security/selinux/hooks.c |
10104 | +++ b/security/selinux/hooks.c |
10105 | @@ -2050,22 +2050,19 @@ static inline u32 open_file_to_av(struct file *file) |
10106 | |
10107 | /* Hook functions begin here. */ |
10108 | |
10109 | -static int selinux_binder_set_context_mgr(struct task_struct *mgr) |
10110 | +static int selinux_binder_set_context_mgr(const struct cred *mgr) |
10111 | { |
10112 | - u32 mysid = current_sid(); |
10113 | - u32 mgrsid = task_sid(mgr); |
10114 | - |
10115 | return avc_has_perm(&selinux_state, |
10116 | - mysid, mgrsid, SECCLASS_BINDER, |
10117 | + current_sid(), cred_sid(mgr), SECCLASS_BINDER, |
10118 | BINDER__SET_CONTEXT_MGR, NULL); |
10119 | } |
10120 | |
10121 | -static int selinux_binder_transaction(struct task_struct *from, |
10122 | - struct task_struct *to) |
10123 | +static int selinux_binder_transaction(const struct cred *from, |
10124 | + const struct cred *to) |
10125 | { |
10126 | u32 mysid = current_sid(); |
10127 | - u32 fromsid = task_sid(from); |
10128 | - u32 tosid = task_sid(to); |
10129 | + u32 fromsid = cred_sid(from); |
10130 | + u32 tosid = cred_sid(to); |
10131 | int rc; |
10132 | |
10133 | if (mysid != fromsid) { |
10134 | @@ -2076,27 +2073,24 @@ static int selinux_binder_transaction(struct task_struct *from, |
10135 | return rc; |
10136 | } |
10137 | |
10138 | - return avc_has_perm(&selinux_state, |
10139 | - fromsid, tosid, SECCLASS_BINDER, BINDER__CALL, |
10140 | - NULL); |
10141 | + return avc_has_perm(&selinux_state, fromsid, tosid, |
10142 | + SECCLASS_BINDER, BINDER__CALL, NULL); |
10143 | } |
10144 | |
10145 | -static int selinux_binder_transfer_binder(struct task_struct *from, |
10146 | - struct task_struct *to) |
10147 | +static int selinux_binder_transfer_binder(const struct cred *from, |
10148 | + const struct cred *to) |
10149 | { |
10150 | - u32 fromsid = task_sid(from); |
10151 | - u32 tosid = task_sid(to); |
10152 | - |
10153 | return avc_has_perm(&selinux_state, |
10154 | - fromsid, tosid, SECCLASS_BINDER, BINDER__TRANSFER, |
10155 | + cred_sid(from), cred_sid(to), |
10156 | + SECCLASS_BINDER, BINDER__TRANSFER, |
10157 | NULL); |
10158 | } |
10159 | |
10160 | -static int selinux_binder_transfer_file(struct task_struct *from, |
10161 | - struct task_struct *to, |
10162 | +static int selinux_binder_transfer_file(const struct cred *from, |
10163 | + const struct cred *to, |
10164 | struct file *file) |
10165 | { |
10166 | - u32 sid = task_sid(to); |
10167 | + u32 sid = cred_sid(to); |
10168 | struct file_security_struct *fsec = selinux_file(file); |
10169 | struct dentry *dentry = file->f_path.dentry; |
10170 | struct inode_security_struct *isec; |
10171 | diff --git a/security/smack/smackfs.c b/security/smack/smackfs.c |
10172 | index 3823ab2c4e4be..6b6fec04c412b 100644 |
10173 | --- a/security/smack/smackfs.c |
10174 | +++ b/security/smack/smackfs.c |
10175 | @@ -693,9 +693,7 @@ static void smk_cipso_doi(void) |
10176 | printk(KERN_WARNING "%s:%d remove rc = %d\n", |
10177 | __func__, __LINE__, rc); |
10178 | |
10179 | - doip = kmalloc(sizeof(struct cipso_v4_doi), GFP_KERNEL); |
10180 | - if (doip == NULL) |
10181 | - panic("smack: Failed to initialize cipso DOI.\n"); |
10182 | + doip = kmalloc(sizeof(struct cipso_v4_doi), GFP_KERNEL | __GFP_NOFAIL); |
10183 | doip->map.std = NULL; |
10184 | doip->doi = smk_cipso_doi_value; |
10185 | doip->type = CIPSO_V4_MAP_PASS; |
10186 | @@ -714,7 +712,7 @@ static void smk_cipso_doi(void) |
10187 | if (rc != 0) { |
10188 | printk(KERN_WARNING "%s:%d map add rc = %d\n", |
10189 | __func__, __LINE__, rc); |
10190 | - kfree(doip); |
10191 | + netlbl_cfg_cipsov4_del(doip->doi, &nai); |
10192 | return; |
10193 | } |
10194 | } |
10195 | @@ -831,6 +829,7 @@ static int smk_open_cipso(struct inode *inode, struct file *file) |
10196 | static ssize_t smk_set_cipso(struct file *file, const char __user *buf, |
10197 | size_t count, loff_t *ppos, int format) |
10198 | { |
10199 | + struct netlbl_lsm_catmap *old_cat; |
10200 | struct smack_known *skp; |
10201 | struct netlbl_lsm_secattr ncats; |
10202 | char mapcatset[SMK_CIPSOLEN]; |
10203 | @@ -920,9 +919,11 @@ static ssize_t smk_set_cipso(struct file *file, const char __user *buf, |
10204 | |
10205 | rc = smk_netlbl_mls(maplevel, mapcatset, &ncats, SMK_CIPSOLEN); |
10206 | if (rc >= 0) { |
10207 | - netlbl_catmap_free(skp->smk_netlabel.attr.mls.cat); |
10208 | + old_cat = skp->smk_netlabel.attr.mls.cat; |
10209 | skp->smk_netlabel.attr.mls.cat = ncats.attr.mls.cat; |
10210 | skp->smk_netlabel.attr.mls.lvl = ncats.attr.mls.lvl; |
10211 | + synchronize_rcu(); |
10212 | + netlbl_catmap_free(old_cat); |
10213 | rc = count; |
10214 | } |
10215 | |
10216 | diff --git a/sound/core/oss/mixer_oss.c b/sound/core/oss/mixer_oss.c |
10217 | index 7eb54df5556df..50ec8b8ff68c9 100644 |
10218 | --- a/sound/core/oss/mixer_oss.c |
10219 | +++ b/sound/core/oss/mixer_oss.c |
10220 | @@ -130,11 +130,13 @@ static int snd_mixer_oss_devmask(struct snd_mixer_oss_file *fmixer) |
10221 | |
10222 | if (mixer == NULL) |
10223 | return -EIO; |
10224 | + mutex_lock(&mixer->reg_mutex); |
10225 | for (chn = 0; chn < 31; chn++) { |
10226 | pslot = &mixer->slots[chn]; |
10227 | if (pslot->put_volume || pslot->put_recsrc) |
10228 | result |= 1 << chn; |
10229 | } |
10230 | + mutex_unlock(&mixer->reg_mutex); |
10231 | return result; |
10232 | } |
10233 | |
10234 | @@ -146,11 +148,13 @@ static int snd_mixer_oss_stereodevs(struct snd_mixer_oss_file *fmixer) |
10235 | |
10236 | if (mixer == NULL) |
10237 | return -EIO; |
10238 | + mutex_lock(&mixer->reg_mutex); |
10239 | for (chn = 0; chn < 31; chn++) { |
10240 | pslot = &mixer->slots[chn]; |
10241 | if (pslot->put_volume && pslot->stereo) |
10242 | result |= 1 << chn; |
10243 | } |
10244 | + mutex_unlock(&mixer->reg_mutex); |
10245 | return result; |
10246 | } |
10247 | |
10248 | @@ -161,6 +165,7 @@ static int snd_mixer_oss_recmask(struct snd_mixer_oss_file *fmixer) |
10249 | |
10250 | if (mixer == NULL) |
10251 | return -EIO; |
10252 | + mutex_lock(&mixer->reg_mutex); |
10253 | if (mixer->put_recsrc && mixer->get_recsrc) { /* exclusive */ |
10254 | result = mixer->mask_recsrc; |
10255 | } else { |
10256 | @@ -172,6 +177,7 @@ static int snd_mixer_oss_recmask(struct snd_mixer_oss_file *fmixer) |
10257 | result |= 1 << chn; |
10258 | } |
10259 | } |
10260 | + mutex_unlock(&mixer->reg_mutex); |
10261 | return result; |
10262 | } |
10263 | |
10264 | @@ -182,11 +188,12 @@ static int snd_mixer_oss_get_recsrc(struct snd_mixer_oss_file *fmixer) |
10265 | |
10266 | if (mixer == NULL) |
10267 | return -EIO; |
10268 | + mutex_lock(&mixer->reg_mutex); |
10269 | if (mixer->put_recsrc && mixer->get_recsrc) { /* exclusive */ |
10270 | - int err; |
10271 | unsigned int index; |
10272 | - if ((err = mixer->get_recsrc(fmixer, &index)) < 0) |
10273 | - return err; |
10274 | + result = mixer->get_recsrc(fmixer, &index); |
10275 | + if (result < 0) |
10276 | + goto unlock; |
10277 | result = 1 << index; |
10278 | } else { |
10279 | struct snd_mixer_oss_slot *pslot; |
10280 | @@ -201,7 +208,10 @@ static int snd_mixer_oss_get_recsrc(struct snd_mixer_oss_file *fmixer) |
10281 | } |
10282 | } |
10283 | } |
10284 | - return mixer->oss_recsrc = result; |
10285 | + mixer->oss_recsrc = result; |
10286 | + unlock: |
10287 | + mutex_unlock(&mixer->reg_mutex); |
10288 | + return result; |
10289 | } |
10290 | |
10291 | static int snd_mixer_oss_set_recsrc(struct snd_mixer_oss_file *fmixer, int recsrc) |
10292 | @@ -214,6 +224,7 @@ static int snd_mixer_oss_set_recsrc(struct snd_mixer_oss_file *fmixer, int recsr |
10293 | |
10294 | if (mixer == NULL) |
10295 | return -EIO; |
10296 | + mutex_lock(&mixer->reg_mutex); |
10297 | if (mixer->get_recsrc && mixer->put_recsrc) { /* exclusive input */ |
10298 | if (recsrc & ~mixer->oss_recsrc) |
10299 | recsrc &= ~mixer->oss_recsrc; |
10300 | @@ -239,6 +250,7 @@ static int snd_mixer_oss_set_recsrc(struct snd_mixer_oss_file *fmixer, int recsr |
10301 | } |
10302 | } |
10303 | } |
10304 | + mutex_unlock(&mixer->reg_mutex); |
10305 | return result; |
10306 | } |
10307 | |
10308 | @@ -250,6 +262,7 @@ static int snd_mixer_oss_get_volume(struct snd_mixer_oss_file *fmixer, int slot) |
10309 | |
10310 | if (mixer == NULL || slot > 30) |
10311 | return -EIO; |
10312 | + mutex_lock(&mixer->reg_mutex); |
10313 | pslot = &mixer->slots[slot]; |
10314 | left = pslot->volume[0]; |
10315 | right = pslot->volume[1]; |
10316 | @@ -257,15 +270,21 @@ static int snd_mixer_oss_get_volume(struct snd_mixer_oss_file *fmixer, int slot) |
10317 | result = pslot->get_volume(fmixer, pslot, &left, &right); |
10318 | if (!pslot->stereo) |
10319 | right = left; |
10320 | - if (snd_BUG_ON(left < 0 || left > 100)) |
10321 | - return -EIO; |
10322 | - if (snd_BUG_ON(right < 0 || right > 100)) |
10323 | - return -EIO; |
10324 | + if (snd_BUG_ON(left < 0 || left > 100)) { |
10325 | + result = -EIO; |
10326 | + goto unlock; |
10327 | + } |
10328 | + if (snd_BUG_ON(right < 0 || right > 100)) { |
10329 | + result = -EIO; |
10330 | + goto unlock; |
10331 | + } |
10332 | if (result >= 0) { |
10333 | pslot->volume[0] = left; |
10334 | pslot->volume[1] = right; |
10335 | result = (left & 0xff) | ((right & 0xff) << 8); |
10336 | } |
10337 | + unlock: |
10338 | + mutex_unlock(&mixer->reg_mutex); |
10339 | return result; |
10340 | } |
10341 | |
10342 | @@ -278,6 +297,7 @@ static int snd_mixer_oss_set_volume(struct snd_mixer_oss_file *fmixer, |
10343 | |
10344 | if (mixer == NULL || slot > 30) |
10345 | return -EIO; |
10346 | + mutex_lock(&mixer->reg_mutex); |
10347 | pslot = &mixer->slots[slot]; |
10348 | if (left > 100) |
10349 | left = 100; |
10350 | @@ -288,10 +308,13 @@ static int snd_mixer_oss_set_volume(struct snd_mixer_oss_file *fmixer, |
10351 | if (pslot->put_volume) |
10352 | result = pslot->put_volume(fmixer, pslot, left, right); |
10353 | if (result < 0) |
10354 | - return result; |
10355 | + goto unlock; |
10356 | pslot->volume[0] = left; |
10357 | pslot->volume[1] = right; |
10358 | - return (left & 0xff) | ((right & 0xff) << 8); |
10359 | + result = (left & 0xff) | ((right & 0xff) << 8); |
10360 | + unlock: |
10361 | + mutex_unlock(&mixer->reg_mutex); |
10362 | + return result; |
10363 | } |
10364 | |
10365 | static int snd_mixer_oss_ioctl1(struct snd_mixer_oss_file *fmixer, unsigned int cmd, unsigned long arg) |
10366 | diff --git a/sound/core/timer.c b/sound/core/timer.c |
10367 | index b5a0ba79bf746..d684aa4150aad 100644 |
10368 | --- a/sound/core/timer.c |
10369 | +++ b/sound/core/timer.c |
10370 | @@ -595,13 +595,13 @@ static int snd_timer_stop1(struct snd_timer_instance *timeri, bool stop) |
10371 | if (!timer) |
10372 | return -EINVAL; |
10373 | spin_lock_irqsave(&timer->lock, flags); |
10374 | + list_del_init(&timeri->ack_list); |
10375 | + list_del_init(&timeri->active_list); |
10376 | if (!(timeri->flags & (SNDRV_TIMER_IFLG_RUNNING | |
10377 | SNDRV_TIMER_IFLG_START))) { |
10378 | result = -EBUSY; |
10379 | goto unlock; |
10380 | } |
10381 | - list_del_init(&timeri->ack_list); |
10382 | - list_del_init(&timeri->active_list); |
10383 | if (timer->card && timer->card->shutdown) |
10384 | goto unlock; |
10385 | if (stop) { |
10386 | @@ -636,23 +636,22 @@ static int snd_timer_stop1(struct snd_timer_instance *timeri, bool stop) |
10387 | static int snd_timer_stop_slave(struct snd_timer_instance *timeri, bool stop) |
10388 | { |
10389 | unsigned long flags; |
10390 | + bool running; |
10391 | |
10392 | spin_lock_irqsave(&slave_active_lock, flags); |
10393 | - if (!(timeri->flags & SNDRV_TIMER_IFLG_RUNNING)) { |
10394 | - spin_unlock_irqrestore(&slave_active_lock, flags); |
10395 | - return -EBUSY; |
10396 | - } |
10397 | + running = timeri->flags & SNDRV_TIMER_IFLG_RUNNING; |
10398 | timeri->flags &= ~SNDRV_TIMER_IFLG_RUNNING; |
10399 | if (timeri->timer) { |
10400 | spin_lock(&timeri->timer->lock); |
10401 | list_del_init(&timeri->ack_list); |
10402 | list_del_init(&timeri->active_list); |
10403 | - snd_timer_notify1(timeri, stop ? SNDRV_TIMER_EVENT_STOP : |
10404 | - SNDRV_TIMER_EVENT_PAUSE); |
10405 | + if (running) |
10406 | + snd_timer_notify1(timeri, stop ? SNDRV_TIMER_EVENT_STOP : |
10407 | + SNDRV_TIMER_EVENT_PAUSE); |
10408 | spin_unlock(&timeri->timer->lock); |
10409 | } |
10410 | spin_unlock_irqrestore(&slave_active_lock, flags); |
10411 | - return 0; |
10412 | + return running ? 0 : -EBUSY; |
10413 | } |
10414 | |
10415 | /* |
10416 | diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c |
10417 | index ebb1ee69dd0c3..95d472d433e70 100644 |
10418 | --- a/sound/pci/hda/hda_intel.c |
10419 | +++ b/sound/pci/hda/hda_intel.c |
10420 | @@ -671,13 +671,17 @@ static int azx_position_check(struct azx *chip, struct azx_dev *azx_dev) |
10421 | * the update-IRQ timing. The IRQ is issued before actually the |
10422 | * data is processed. So, we need to process it afterwords in a |
10423 | * workqueue. |
10424 | + * |
10425 | + * Returns 1 if OK to proceed, 0 for delay handling, -1 for skipping update |
10426 | */ |
10427 | static int azx_position_ok(struct azx *chip, struct azx_dev *azx_dev) |
10428 | { |
10429 | struct snd_pcm_substream *substream = azx_dev->core.substream; |
10430 | + struct snd_pcm_runtime *runtime = substream->runtime; |
10431 | int stream = substream->stream; |
10432 | u32 wallclk; |
10433 | unsigned int pos; |
10434 | + snd_pcm_uframes_t hwptr, target; |
10435 | |
10436 | wallclk = azx_readl(chip, WALLCLK) - azx_dev->core.start_wallclk; |
10437 | if (wallclk < (azx_dev->core.period_wallclk * 2) / 3) |
10438 | @@ -714,6 +718,24 @@ static int azx_position_ok(struct azx *chip, struct azx_dev *azx_dev) |
10439 | /* NG - it's below the first next period boundary */ |
10440 | return chip->bdl_pos_adj ? 0 : -1; |
10441 | azx_dev->core.start_wallclk += wallclk; |
10442 | + |
10443 | + if (azx_dev->core.no_period_wakeup) |
10444 | + return 1; /* OK, no need to check period boundary */ |
10445 | + |
10446 | + if (runtime->hw_ptr_base != runtime->hw_ptr_interrupt) |
10447 | + return 1; /* OK, already in hwptr updating process */ |
10448 | + |
10449 | + /* check whether the period gets really elapsed */ |
10450 | + pos = bytes_to_frames(runtime, pos); |
10451 | + hwptr = runtime->hw_ptr_base + pos; |
10452 | + if (hwptr < runtime->status->hw_ptr) |
10453 | + hwptr += runtime->buffer_size; |
10454 | + target = runtime->hw_ptr_interrupt + runtime->period_size; |
10455 | + if (hwptr < target) { |
10456 | + /* too early wakeup, process it later */ |
10457 | + return chip->bdl_pos_adj ? 0 : -1; |
10458 | + } |
10459 | + |
10460 | return 1; /* OK, it's fine */ |
10461 | } |
10462 | |
10463 | @@ -907,11 +929,7 @@ static unsigned int azx_get_pos_skl(struct azx *chip, struct azx_dev *azx_dev) |
10464 | if (azx_dev->core.substream->stream == SNDRV_PCM_STREAM_PLAYBACK) |
10465 | return azx_skl_get_dpib_pos(chip, azx_dev); |
10466 | |
10467 | - /* For capture, we need to read posbuf, but it requires a delay |
10468 | - * for the possible boundary overlap; the read of DPIB fetches the |
10469 | - * actual posbuf |
10470 | - */ |
10471 | - udelay(20); |
10472 | + /* read of DPIB fetches the actual posbuf */ |
10473 | azx_skl_get_dpib_pos(chip, azx_dev); |
10474 | return azx_get_pos_posbuf(chip, azx_dev); |
10475 | } |
10476 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c |
10477 | index 49aefb7875e72..94fc17b28e9c7 100644 |
10478 | --- a/sound/pci/hda/patch_realtek.c |
10479 | +++ b/sound/pci/hda/patch_realtek.c |
10480 | @@ -2541,6 +2541,7 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = { |
10481 | SND_PCI_QUIRK(0x1558, 0x67d1, "Clevo PB71[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS), |
10482 | SND_PCI_QUIRK(0x1558, 0x67e1, "Clevo PB71[DE][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS), |
10483 | SND_PCI_QUIRK(0x1558, 0x67e5, "Clevo PC70D[PRS](?:-D|-G)?", ALC1220_FIXUP_CLEVO_PB51ED_PINS), |
10484 | + SND_PCI_QUIRK(0x1558, 0x67f1, "Clevo PC70H[PRS]", ALC1220_FIXUP_CLEVO_PB51ED_PINS), |
10485 | SND_PCI_QUIRK(0x1558, 0x70d1, "Clevo PC70[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS), |
10486 | SND_PCI_QUIRK(0x1558, 0x7714, "Clevo X170SM", ALC1220_FIXUP_CLEVO_PB51ED_PINS), |
10487 | SND_PCI_QUIRK(0x1558, 0x7715, "Clevo X170KM-G", ALC1220_FIXUP_CLEVO_PB51ED), |
10488 | @@ -7976,6 +7977,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { |
10489 | SND_PCI_QUIRK(0x1025, 0x1308, "Acer Aspire Z24-890", ALC286_FIXUP_ACER_AIO_HEADSET_MIC), |
10490 | SND_PCI_QUIRK(0x1025, 0x132a, "Acer TravelMate B114-21", ALC233_FIXUP_ACER_HEADSET_MIC), |
10491 | SND_PCI_QUIRK(0x1025, 0x1330, "Acer TravelMate X514-51T", ALC255_FIXUP_ACER_HEADSET_MIC), |
10492 | + SND_PCI_QUIRK(0x1025, 0x141f, "Acer Spin SP513-54N", ALC255_FIXUP_ACER_MIC_NO_PRESENCE), |
10493 | SND_PCI_QUIRK(0x1025, 0x142b, "Acer Swift SF314-42", ALC255_FIXUP_ACER_MIC_NO_PRESENCE), |
10494 | SND_PCI_QUIRK(0x1025, 0x1430, "Acer TravelMate B311R-31", ALC256_FIXUP_ACER_MIC_NO_PRESENCE), |
10495 | SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z), |
10496 | @@ -8102,6 +8104,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { |
10497 | SND_PCI_QUIRK(0x103c, 0x861f, "HP Elite Dragonfly G1", ALC285_FIXUP_HP_GPIO_AMP_INIT), |
10498 | SND_PCI_QUIRK(0x103c, 0x869d, "HP", ALC236_FIXUP_HP_MUTE_LED), |
10499 | SND_PCI_QUIRK(0x103c, 0x8724, "HP EliteBook 850 G7", ALC285_FIXUP_HP_GPIO_LED), |
10500 | + SND_PCI_QUIRK(0x103c, 0x8728, "HP EliteBook 840 G7", ALC285_FIXUP_HP_GPIO_LED), |
10501 | SND_PCI_QUIRK(0x103c, 0x8729, "HP", ALC285_FIXUP_HP_GPIO_LED), |
10502 | SND_PCI_QUIRK(0x103c, 0x8736, "HP", ALC285_FIXUP_HP_GPIO_AMP_INIT), |
10503 | SND_PCI_QUIRK(0x103c, 0x8760, "HP", ALC285_FIXUP_HP_MUTE_LED), |
10504 | @@ -8132,6 +8135,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { |
10505 | SND_PCI_QUIRK(0x1043, 0x18b1, "Asus MJ401TA", ALC256_FIXUP_ASUS_HEADSET_MIC), |
10506 | SND_PCI_QUIRK(0x1043, 0x18f1, "Asus FX505DT", ALC256_FIXUP_ASUS_HEADSET_MIC), |
10507 | SND_PCI_QUIRK(0x1043, 0x194e, "ASUS UX563FD", ALC294_FIXUP_ASUS_HPE), |
10508 | + SND_PCI_QUIRK(0x1043, 0x1970, "ASUS UX550VE", ALC289_FIXUP_ASUS_GA401), |
10509 | SND_PCI_QUIRK(0x1043, 0x1982, "ASUS B1400CEPE", ALC256_FIXUP_ASUS_HPE), |
10510 | SND_PCI_QUIRK(0x1043, 0x19ce, "ASUS B9450FA", ALC294_FIXUP_ASUS_HPE), |
10511 | SND_PCI_QUIRK(0x1043, 0x19e1, "ASUS UX581LV", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE), |
10512 | diff --git a/sound/soc/codecs/cs42l42.c b/sound/soc/codecs/cs42l42.c |
10513 | index 6825e874785f2..ebee58eca4d51 100644 |
10514 | --- a/sound/soc/codecs/cs42l42.c |
10515 | +++ b/sound/soc/codecs/cs42l42.c |
10516 | @@ -91,7 +91,7 @@ static const struct reg_default cs42l42_reg_defaults[] = { |
10517 | { CS42L42_ASP_RX_INT_MASK, 0x1F }, |
10518 | { CS42L42_ASP_TX_INT_MASK, 0x0F }, |
10519 | { CS42L42_CODEC_INT_MASK, 0x03 }, |
10520 | - { CS42L42_SRCPL_INT_MASK, 0xFF }, |
10521 | + { CS42L42_SRCPL_INT_MASK, 0x7F }, |
10522 | { CS42L42_VPMON_INT_MASK, 0x01 }, |
10523 | { CS42L42_PLL_LOCK_INT_MASK, 0x01 }, |
10524 | { CS42L42_TSRS_PLUG_INT_MASK, 0x0F }, |
10525 | @@ -128,7 +128,7 @@ static const struct reg_default cs42l42_reg_defaults[] = { |
10526 | { CS42L42_MIXER_CHA_VOL, 0x3F }, |
10527 | { CS42L42_MIXER_ADC_VOL, 0x3F }, |
10528 | { CS42L42_MIXER_CHB_VOL, 0x3F }, |
10529 | - { CS42L42_EQ_COEF_IN0, 0x22 }, |
10530 | + { CS42L42_EQ_COEF_IN0, 0x00 }, |
10531 | { CS42L42_EQ_COEF_IN1, 0x00 }, |
10532 | { CS42L42_EQ_COEF_IN2, 0x00 }, |
10533 | { CS42L42_EQ_COEF_IN3, 0x00 }, |
10534 | @@ -1798,8 +1798,9 @@ static int cs42l42_i2c_probe(struct i2c_client *i2c_client, |
10535 | NULL, cs42l42_irq_thread, |
10536 | IRQF_ONESHOT | IRQF_TRIGGER_LOW, |
10537 | "cs42l42", cs42l42); |
10538 | - |
10539 | - if (ret != 0) |
10540 | + if (ret == -EPROBE_DEFER) |
10541 | + goto err_disable; |
10542 | + else if (ret != 0) |
10543 | dev_err(&i2c_client->dev, |
10544 | "Failed to request IRQ: %d\n", ret); |
10545 | |
10546 | diff --git a/sound/synth/emux/emux.c b/sound/synth/emux/emux.c |
10547 | index f65e6c7b139f5..6695530bba9b3 100644 |
10548 | --- a/sound/synth/emux/emux.c |
10549 | +++ b/sound/synth/emux/emux.c |
10550 | @@ -88,7 +88,7 @@ int snd_emux_register(struct snd_emux *emu, struct snd_card *card, int index, ch |
10551 | emu->name = kstrdup(name, GFP_KERNEL); |
10552 | emu->voices = kcalloc(emu->max_voices, sizeof(struct snd_emux_voice), |
10553 | GFP_KERNEL); |
10554 | - if (emu->voices == NULL) |
10555 | + if (emu->name == NULL || emu->voices == NULL) |
10556 | return -ENOMEM; |
10557 | |
10558 | /* create soundfont list */ |
10559 | diff --git a/sound/usb/6fire/comm.c b/sound/usb/6fire/comm.c |
10560 | index 43a2a62d66f7e..49629d4bb327a 100644 |
10561 | --- a/sound/usb/6fire/comm.c |
10562 | +++ b/sound/usb/6fire/comm.c |
10563 | @@ -95,7 +95,7 @@ static int usb6fire_comm_send_buffer(u8 *buffer, struct usb_device *dev) |
10564 | int actual_len; |
10565 | |
10566 | ret = usb_interrupt_msg(dev, usb_sndintpipe(dev, COMM_EP), |
10567 | - buffer, buffer[1] + 2, &actual_len, HZ); |
10568 | + buffer, buffer[1] + 2, &actual_len, 1000); |
10569 | if (ret < 0) |
10570 | return ret; |
10571 | else if (actual_len != buffer[1] + 2) |
10572 | diff --git a/sound/usb/6fire/firmware.c b/sound/usb/6fire/firmware.c |
10573 | index 69137c14d0dcf..2333e8ff3411a 100644 |
10574 | --- a/sound/usb/6fire/firmware.c |
10575 | +++ b/sound/usb/6fire/firmware.c |
10576 | @@ -162,7 +162,7 @@ static int usb6fire_fw_ezusb_write(struct usb_device *device, |
10577 | |
10578 | ret = usb_control_msg(device, usb_sndctrlpipe(device, 0), type, |
10579 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
10580 | - value, 0, data, len, HZ); |
10581 | + value, 0, data, len, 1000); |
10582 | if (ret < 0) |
10583 | return ret; |
10584 | else if (ret != len) |
10585 | @@ -175,7 +175,7 @@ static int usb6fire_fw_ezusb_read(struct usb_device *device, |
10586 | { |
10587 | int ret = usb_control_msg(device, usb_rcvctrlpipe(device, 0), type, |
10588 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, value, |
10589 | - 0, data, len, HZ); |
10590 | + 0, data, len, 1000); |
10591 | if (ret < 0) |
10592 | return ret; |
10593 | else if (ret != len) |
10594 | @@ -190,7 +190,7 @@ static int usb6fire_fw_fpga_write(struct usb_device *device, |
10595 | int ret; |
10596 | |
10597 | ret = usb_bulk_msg(device, usb_sndbulkpipe(device, FPGA_EP), data, len, |
10598 | - &actual_len, HZ); |
10599 | + &actual_len, 1000); |
10600 | if (ret < 0) |
10601 | return ret; |
10602 | else if (actual_len != len) |
10603 | diff --git a/sound/usb/line6/driver.c b/sound/usb/line6/driver.c |
10604 | index 1e38cdda2af69..8ca56ba600cf4 100644 |
10605 | --- a/sound/usb/line6/driver.c |
10606 | +++ b/sound/usb/line6/driver.c |
10607 | @@ -113,12 +113,12 @@ static int line6_send_raw_message(struct usb_line6 *line6, const char *buffer, |
10608 | retval = usb_interrupt_msg(line6->usbdev, |
10609 | usb_sndintpipe(line6->usbdev, properties->ep_ctrl_w), |
10610 | (char *)frag_buf, frag_size, |
10611 | - &partial, LINE6_TIMEOUT * HZ); |
10612 | + &partial, LINE6_TIMEOUT); |
10613 | } else { |
10614 | retval = usb_bulk_msg(line6->usbdev, |
10615 | usb_sndbulkpipe(line6->usbdev, properties->ep_ctrl_w), |
10616 | (char *)frag_buf, frag_size, |
10617 | - &partial, LINE6_TIMEOUT * HZ); |
10618 | + &partial, LINE6_TIMEOUT); |
10619 | } |
10620 | |
10621 | if (retval) { |
10622 | @@ -350,7 +350,7 @@ int line6_read_data(struct usb_line6 *line6, unsigned address, void *data, |
10623 | ret = usb_control_msg(usbdev, usb_sndctrlpipe(usbdev, 0), 0x67, |
10624 | USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT, |
10625 | (datalen << 8) | 0x21, address, |
10626 | - NULL, 0, LINE6_TIMEOUT * HZ); |
10627 | + NULL, 0, LINE6_TIMEOUT); |
10628 | |
10629 | if (ret < 0) { |
10630 | dev_err(line6->ifcdev, "read request failed (error %d)\n", ret); |
10631 | @@ -365,7 +365,7 @@ int line6_read_data(struct usb_line6 *line6, unsigned address, void *data, |
10632 | USB_TYPE_VENDOR | USB_RECIP_DEVICE | |
10633 | USB_DIR_IN, |
10634 | 0x0012, 0x0000, len, 1, |
10635 | - LINE6_TIMEOUT * HZ); |
10636 | + LINE6_TIMEOUT); |
10637 | if (ret < 0) { |
10638 | dev_err(line6->ifcdev, |
10639 | "receive length failed (error %d)\n", ret); |
10640 | @@ -393,7 +393,7 @@ int line6_read_data(struct usb_line6 *line6, unsigned address, void *data, |
10641 | ret = usb_control_msg(usbdev, usb_rcvctrlpipe(usbdev, 0), 0x67, |
10642 | USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN, |
10643 | 0x0013, 0x0000, data, datalen, |
10644 | - LINE6_TIMEOUT * HZ); |
10645 | + LINE6_TIMEOUT); |
10646 | |
10647 | if (ret < 0) |
10648 | dev_err(line6->ifcdev, "read failed (error %d)\n", ret); |
10649 | @@ -425,7 +425,7 @@ int line6_write_data(struct usb_line6 *line6, unsigned address, void *data, |
10650 | ret = usb_control_msg(usbdev, usb_sndctrlpipe(usbdev, 0), 0x67, |
10651 | USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT, |
10652 | 0x0022, address, data, datalen, |
10653 | - LINE6_TIMEOUT * HZ); |
10654 | + LINE6_TIMEOUT); |
10655 | |
10656 | if (ret < 0) { |
10657 | dev_err(line6->ifcdev, |
10658 | @@ -441,7 +441,7 @@ int line6_write_data(struct usb_line6 *line6, unsigned address, void *data, |
10659 | USB_TYPE_VENDOR | USB_RECIP_DEVICE | |
10660 | USB_DIR_IN, |
10661 | 0x0012, 0x0000, |
10662 | - status, 1, LINE6_TIMEOUT * HZ); |
10663 | + status, 1, LINE6_TIMEOUT); |
10664 | |
10665 | if (ret < 0) { |
10666 | dev_err(line6->ifcdev, |
10667 | diff --git a/sound/usb/line6/driver.h b/sound/usb/line6/driver.h |
10668 | index e5e572ed5f304..890c239e3fc01 100644 |
10669 | --- a/sound/usb/line6/driver.h |
10670 | +++ b/sound/usb/line6/driver.h |
10671 | @@ -27,7 +27,7 @@ |
10672 | #define LINE6_FALLBACK_INTERVAL 10 |
10673 | #define LINE6_FALLBACK_MAXPACKETSIZE 16 |
10674 | |
10675 | -#define LINE6_TIMEOUT 1 |
10676 | +#define LINE6_TIMEOUT 1000 |
10677 | #define LINE6_BUFSIZE_LISTEN 64 |
10678 | #define LINE6_MIDI_MESSAGE_MAXLEN 256 |
10679 | |
10680 | diff --git a/sound/usb/line6/podhd.c b/sound/usb/line6/podhd.c |
10681 | index 5d9954a2d05e6..8b1610bdb8d5c 100644 |
10682 | --- a/sound/usb/line6/podhd.c |
10683 | +++ b/sound/usb/line6/podhd.c |
10684 | @@ -190,7 +190,7 @@ static int podhd_dev_start(struct usb_line6_podhd *pod) |
10685 | ret = usb_control_msg(usbdev, usb_sndctrlpipe(usbdev, 0), |
10686 | 0x67, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT, |
10687 | 0x11, 0, |
10688 | - NULL, 0, LINE6_TIMEOUT * HZ); |
10689 | + NULL, 0, LINE6_TIMEOUT); |
10690 | if (ret < 0) { |
10691 | dev_err(pod->line6.ifcdev, "read request failed (error %d)\n", ret); |
10692 | goto exit; |
10693 | @@ -200,7 +200,7 @@ static int podhd_dev_start(struct usb_line6_podhd *pod) |
10694 | ret = usb_control_msg(usbdev, usb_rcvctrlpipe(usbdev, 0), 0x67, |
10695 | USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN, |
10696 | 0x11, 0x0, |
10697 | - init_bytes, 3, LINE6_TIMEOUT * HZ); |
10698 | + init_bytes, 3, LINE6_TIMEOUT); |
10699 | if (ret < 0) { |
10700 | dev_err(pod->line6.ifcdev, |
10701 | "receive length failed (error %d)\n", ret); |
10702 | @@ -220,7 +220,7 @@ static int podhd_dev_start(struct usb_line6_podhd *pod) |
10703 | USB_REQ_SET_FEATURE, |
10704 | USB_TYPE_STANDARD | USB_RECIP_DEVICE | USB_DIR_OUT, |
10705 | 1, 0, |
10706 | - NULL, 0, LINE6_TIMEOUT * HZ); |
10707 | + NULL, 0, LINE6_TIMEOUT); |
10708 | exit: |
10709 | kfree(init_bytes); |
10710 | return ret; |
10711 | diff --git a/sound/usb/line6/toneport.c b/sound/usb/line6/toneport.c |
10712 | index d0a555dbe324f..21f86c71dad7f 100644 |
10713 | --- a/sound/usb/line6/toneport.c |
10714 | +++ b/sound/usb/line6/toneport.c |
10715 | @@ -128,7 +128,7 @@ static int toneport_send_cmd(struct usb_device *usbdev, int cmd1, int cmd2) |
10716 | |
10717 | ret = usb_control_msg(usbdev, usb_sndctrlpipe(usbdev, 0), 0x67, |
10718 | USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT, |
10719 | - cmd1, cmd2, NULL, 0, LINE6_TIMEOUT * HZ); |
10720 | + cmd1, cmd2, NULL, 0, LINE6_TIMEOUT); |
10721 | |
10722 | if (ret < 0) { |
10723 | dev_err(&usbdev->dev, "send failed (error %d)\n", ret); |
10724 | diff --git a/sound/usb/misc/ua101.c b/sound/usb/misc/ua101.c |
10725 | index 307b72d5fffa9..77304a29a61d2 100644 |
10726 | --- a/sound/usb/misc/ua101.c |
10727 | +++ b/sound/usb/misc/ua101.c |
10728 | @@ -1020,7 +1020,7 @@ static int detect_usb_format(struct ua101 *ua) |
10729 | fmt_playback->bSubframeSize * ua->playback.channels; |
10730 | |
10731 | epd = &ua->intf[INTF_CAPTURE]->altsetting[1].endpoint[0].desc; |
10732 | - if (!usb_endpoint_is_isoc_in(epd)) { |
10733 | + if (!usb_endpoint_is_isoc_in(epd) || usb_endpoint_maxp(epd) == 0) { |
10734 | dev_err(&ua->dev->dev, "invalid capture endpoint\n"); |
10735 | return -ENXIO; |
10736 | } |
10737 | @@ -1028,7 +1028,7 @@ static int detect_usb_format(struct ua101 *ua) |
10738 | ua->capture.max_packet_bytes = usb_endpoint_maxp(epd); |
10739 | |
10740 | epd = &ua->intf[INTF_PLAYBACK]->altsetting[1].endpoint[0].desc; |
10741 | - if (!usb_endpoint_is_isoc_out(epd)) { |
10742 | + if (!usb_endpoint_is_isoc_out(epd) || usb_endpoint_maxp(epd) == 0) { |
10743 | dev_err(&ua->dev->dev, "invalid playback endpoint\n"); |
10744 | return -ENXIO; |
10745 | } |
10746 | diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c |
10747 | index d5d828817c5e8..72223545abfd8 100644 |
10748 | --- a/sound/usb/quirks.c |
10749 | +++ b/sound/usb/quirks.c |
10750 | @@ -1842,6 +1842,7 @@ static const struct registration_quirk registration_quirks[] = { |
10751 | REG_QUIRK_ENTRY(0x0951, 0x16ea, 2), /* Kingston HyperX Cloud Flight S */ |
10752 | REG_QUIRK_ENTRY(0x0ecb, 0x1f46, 2), /* JBL Quantum 600 */ |
10753 | REG_QUIRK_ENTRY(0x0ecb, 0x1f47, 2), /* JBL Quantum 800 */ |
10754 | + REG_QUIRK_ENTRY(0x0ecb, 0x1f4c, 2), /* JBL Quantum 400 */ |
10755 | REG_QUIRK_ENTRY(0x0ecb, 0x2039, 2), /* JBL Quantum 400 */ |
10756 | REG_QUIRK_ENTRY(0x0ecb, 0x203c, 2), /* JBL Quantum 600 */ |
10757 | REG_QUIRK_ENTRY(0x0ecb, 0x203e, 2), /* JBL Quantum 800 */ |
10758 | diff --git a/tools/lib/bpf/btf.c b/tools/lib/bpf/btf.c |
10759 | index d606a358480da..41daf0fa95b9f 100644 |
10760 | --- a/tools/lib/bpf/btf.c |
10761 | +++ b/tools/lib/bpf/btf.c |
10762 | @@ -100,22 +100,18 @@ static int btf_parse_hdr(struct btf *btf) |
10763 | return -EINVAL; |
10764 | } |
10765 | |
10766 | - if (meta_left < hdr->type_off) { |
10767 | - pr_debug("Invalid BTF type section offset:%u\n", hdr->type_off); |
10768 | + if (meta_left < hdr->str_off + hdr->str_len) { |
10769 | + pr_debug("Invalid BTF total size:%u\n", btf->data_size); |
10770 | return -EINVAL; |
10771 | } |
10772 | |
10773 | - if (meta_left < hdr->str_off) { |
10774 | - pr_debug("Invalid BTF string section offset:%u\n", hdr->str_off); |
10775 | + if (hdr->type_off + hdr->type_len > hdr->str_off) { |
10776 | + pr_debug("Invalid BTF data sections layout: type data at %u + %u, strings data at %u + %u\n", |
10777 | + hdr->type_off, hdr->type_len, hdr->str_off, hdr->str_len); |
10778 | return -EINVAL; |
10779 | } |
10780 | |
10781 | - if (hdr->type_off >= hdr->str_off) { |
10782 | - pr_debug("BTF type section offset >= string section offset. No type?\n"); |
10783 | - return -EINVAL; |
10784 | - } |
10785 | - |
10786 | - if (hdr->type_off & 0x02) { |
10787 | + if (hdr->type_off % 4) { |
10788 | pr_debug("BTF type section is not aligned to 4 bytes\n"); |
10789 | return -EINVAL; |
10790 | } |
10791 | diff --git a/tools/perf/util/bpf-event.c b/tools/perf/util/bpf-event.c |
10792 | index f7ed5d122e229..c766813d56be0 100644 |
10793 | --- a/tools/perf/util/bpf-event.c |
10794 | +++ b/tools/perf/util/bpf-event.c |
10795 | @@ -467,7 +467,7 @@ void bpf_event__print_bpf_prog_info(struct bpf_prog_info *info, |
10796 | synthesize_bpf_prog_name(name, KSYM_NAME_LEN, info, btf, 0); |
10797 | fprintf(fp, "# bpf_prog_info %u: %s addr 0x%llx size %u\n", |
10798 | info->id, name, prog_addrs[0], prog_lens[0]); |
10799 | - return; |
10800 | + goto out; |
10801 | } |
10802 | |
10803 | fprintf(fp, "# bpf_prog_info %u:\n", info->id); |
10804 | @@ -477,4 +477,6 @@ void bpf_event__print_bpf_prog_info(struct bpf_prog_info *info, |
10805 | fprintf(fp, "# \tsub_prog %u: %s addr 0x%llx size %u\n", |
10806 | i, name, prog_addrs[i], prog_lens[i]); |
10807 | } |
10808 | +out: |
10809 | + btf__free(btf); |
10810 | } |
10811 | diff --git a/tools/testing/selftests/bpf/progs/strobemeta.h b/tools/testing/selftests/bpf/progs/strobemeta.h |
10812 | index 067eb625d01c5..5ba8d39c4d544 100644 |
10813 | --- a/tools/testing/selftests/bpf/progs/strobemeta.h |
10814 | +++ b/tools/testing/selftests/bpf/progs/strobemeta.h |
10815 | @@ -349,7 +349,7 @@ static __always_inline uint64_t read_str_var(struct strobemeta_cfg *cfg, |
10816 | void *payload) |
10817 | { |
10818 | void *location; |
10819 | - uint32_t len; |
10820 | + uint64_t len; |
10821 | |
10822 | data->str_lens[idx] = 0; |
10823 | location = calc_location(&cfg->str_locs[idx], tls_base); |
10824 | @@ -381,7 +381,7 @@ static __always_inline void *read_map_var(struct strobemeta_cfg *cfg, |
10825 | struct strobe_map_descr* descr = &data->map_descrs[idx]; |
10826 | struct strobe_map_raw map; |
10827 | void *location; |
10828 | - uint32_t len; |
10829 | + uint64_t len; |
10830 | int i; |
10831 | |
10832 | descr->tag_len = 0; /* presume no tag is set */ |
10833 | diff --git a/tools/testing/selftests/bpf/test_progs.c b/tools/testing/selftests/bpf/test_progs.c |
10834 | index 48bbe8e0ce48d..4369bc46bf9c2 100644 |
10835 | --- a/tools/testing/selftests/bpf/test_progs.c |
10836 | +++ b/tools/testing/selftests/bpf/test_progs.c |
10837 | @@ -289,7 +289,7 @@ int extract_build_id(char *build_id, size_t size) |
10838 | |
10839 | if (getline(&line, &len, fp) == -1) |
10840 | goto err; |
10841 | - fclose(fp); |
10842 | + pclose(fp); |
10843 | |
10844 | if (len > size) |
10845 | len = size; |
10846 | @@ -298,7 +298,7 @@ int extract_build_id(char *build_id, size_t size) |
10847 | free(line); |
10848 | return 0; |
10849 | err: |
10850 | - fclose(fp); |
10851 | + pclose(fp); |
10852 | return -1; |
10853 | } |
10854 | |
10855 | diff --git a/tools/testing/selftests/kvm/x86_64/mmio_warning_test.c b/tools/testing/selftests/kvm/x86_64/mmio_warning_test.c |
10856 | index 2cbc09aad7f64..92419b66b0578 100644 |
10857 | --- a/tools/testing/selftests/kvm/x86_64/mmio_warning_test.c |
10858 | +++ b/tools/testing/selftests/kvm/x86_64/mmio_warning_test.c |
10859 | @@ -84,7 +84,7 @@ int get_warnings_count(void) |
10860 | f = popen("dmesg | grep \"WARNING:\" | wc -l", "r"); |
10861 | if (fscanf(f, "%d", &warnings) < 1) |
10862 | warnings = 0; |
10863 | - fclose(f); |
10864 | + pclose(f); |
10865 | |
10866 | return warnings; |
10867 | } |
10868 | diff --git a/tools/testing/selftests/net/udpgso_bench_rx.c b/tools/testing/selftests/net/udpgso_bench_rx.c |
10869 | index 76a24052f4b47..6a193425c367f 100644 |
10870 | --- a/tools/testing/selftests/net/udpgso_bench_rx.c |
10871 | +++ b/tools/testing/selftests/net/udpgso_bench_rx.c |
10872 | @@ -293,19 +293,17 @@ static void usage(const char *filepath) |
10873 | |
10874 | static void parse_opts(int argc, char **argv) |
10875 | { |
10876 | + const char *bind_addr = NULL; |
10877 | int c; |
10878 | |
10879 | - /* bind to any by default */ |
10880 | - setup_sockaddr(PF_INET6, "::", &cfg_bind_addr); |
10881 | while ((c = getopt(argc, argv, "4b:C:Gl:n:p:rR:S:tv")) != -1) { |
10882 | switch (c) { |
10883 | case '4': |
10884 | cfg_family = PF_INET; |
10885 | cfg_alen = sizeof(struct sockaddr_in); |
10886 | - setup_sockaddr(PF_INET, "0.0.0.0", &cfg_bind_addr); |
10887 | break; |
10888 | case 'b': |
10889 | - setup_sockaddr(cfg_family, optarg, &cfg_bind_addr); |
10890 | + bind_addr = optarg; |
10891 | break; |
10892 | case 'C': |
10893 | cfg_connect_timeout_ms = strtoul(optarg, NULL, 0); |
10894 | @@ -341,6 +339,11 @@ static void parse_opts(int argc, char **argv) |
10895 | } |
10896 | } |
10897 | |
10898 | + if (!bind_addr) |
10899 | + bind_addr = cfg_family == PF_INET6 ? "::" : "0.0.0.0"; |
10900 | + |
10901 | + setup_sockaddr(cfg_family, bind_addr, &cfg_bind_addr); |
10902 | + |
10903 | if (optind != argc) |
10904 | usage(argv[0]); |
10905 |