Annotation of /trunk/kernel-alx/patches-5.4/0148-5.4.49-all-fixes.patch
Parent Directory | Revision Log
Revision 3529 -
(hide annotations)
(download)
Thu Jun 25 11:15:00 2020 UTC (3 years, 10 months ago) by niro
File size: 389391 byte(s)
Thu Jun 25 11:15:00 2020 UTC (3 years, 10 months ago) by niro
File size: 389391 byte(s)
-linux-5.4.49
1 | niro | 3529 | diff --git a/Makefile b/Makefile |
2 | index fee4101b5d22..72230ad23299 100644 | ||
3 | --- a/Makefile | ||
4 | +++ b/Makefile | ||
5 | @@ -1,7 +1,7 @@ | ||
6 | # SPDX-License-Identifier: GPL-2.0 | ||
7 | VERSION = 5 | ||
8 | PATCHLEVEL = 4 | ||
9 | -SUBLEVEL = 48 | ||
10 | +SUBLEVEL = 49 | ||
11 | EXTRAVERSION = | ||
12 | NAME = Kleptomaniac Octopus | ||
13 | |||
14 | diff --git a/arch/arm/boot/dts/r8a7743.dtsi b/arch/arm/boot/dts/r8a7743.dtsi | ||
15 | index de981d629bdd..fdd267819319 100644 | ||
16 | --- a/arch/arm/boot/dts/r8a7743.dtsi | ||
17 | +++ b/arch/arm/boot/dts/r8a7743.dtsi | ||
18 | @@ -338,7 +338,7 @@ | ||
19 | #thermal-sensor-cells = <0>; | ||
20 | }; | ||
21 | |||
22 | - ipmmu_sy0: mmu@e6280000 { | ||
23 | + ipmmu_sy0: iommu@e6280000 { | ||
24 | compatible = "renesas,ipmmu-r8a7743", | ||
25 | "renesas,ipmmu-vmsa"; | ||
26 | reg = <0 0xe6280000 0 0x1000>; | ||
27 | @@ -348,7 +348,7 @@ | ||
28 | status = "disabled"; | ||
29 | }; | ||
30 | |||
31 | - ipmmu_sy1: mmu@e6290000 { | ||
32 | + ipmmu_sy1: iommu@e6290000 { | ||
33 | compatible = "renesas,ipmmu-r8a7743", | ||
34 | "renesas,ipmmu-vmsa"; | ||
35 | reg = <0 0xe6290000 0 0x1000>; | ||
36 | @@ -357,7 +357,7 @@ | ||
37 | status = "disabled"; | ||
38 | }; | ||
39 | |||
40 | - ipmmu_ds: mmu@e6740000 { | ||
41 | + ipmmu_ds: iommu@e6740000 { | ||
42 | compatible = "renesas,ipmmu-r8a7743", | ||
43 | "renesas,ipmmu-vmsa"; | ||
44 | reg = <0 0xe6740000 0 0x1000>; | ||
45 | @@ -367,7 +367,7 @@ | ||
46 | status = "disabled"; | ||
47 | }; | ||
48 | |||
49 | - ipmmu_mp: mmu@ec680000 { | ||
50 | + ipmmu_mp: iommu@ec680000 { | ||
51 | compatible = "renesas,ipmmu-r8a7743", | ||
52 | "renesas,ipmmu-vmsa"; | ||
53 | reg = <0 0xec680000 0 0x1000>; | ||
54 | @@ -376,7 +376,7 @@ | ||
55 | status = "disabled"; | ||
56 | }; | ||
57 | |||
58 | - ipmmu_mx: mmu@fe951000 { | ||
59 | + ipmmu_mx: iommu@fe951000 { | ||
60 | compatible = "renesas,ipmmu-r8a7743", | ||
61 | "renesas,ipmmu-vmsa"; | ||
62 | reg = <0 0xfe951000 0 0x1000>; | ||
63 | @@ -386,7 +386,7 @@ | ||
64 | status = "disabled"; | ||
65 | }; | ||
66 | |||
67 | - ipmmu_gp: mmu@e62a0000 { | ||
68 | + ipmmu_gp: iommu@e62a0000 { | ||
69 | compatible = "renesas,ipmmu-r8a7743", | ||
70 | "renesas,ipmmu-vmsa"; | ||
71 | reg = <0 0xe62a0000 0 0x1000>; | ||
72 | diff --git a/arch/arm/boot/dts/r8a7744.dtsi b/arch/arm/boot/dts/r8a7744.dtsi | ||
73 | index fa74a262107b..8264481bf876 100644 | ||
74 | --- a/arch/arm/boot/dts/r8a7744.dtsi | ||
75 | +++ b/arch/arm/boot/dts/r8a7744.dtsi | ||
76 | @@ -338,7 +338,7 @@ | ||
77 | #thermal-sensor-cells = <0>; | ||
78 | }; | ||
79 | |||
80 | - ipmmu_sy0: mmu@e6280000 { | ||
81 | + ipmmu_sy0: iommu@e6280000 { | ||
82 | compatible = "renesas,ipmmu-r8a7744", | ||
83 | "renesas,ipmmu-vmsa"; | ||
84 | reg = <0 0xe6280000 0 0x1000>; | ||
85 | @@ -348,7 +348,7 @@ | ||
86 | status = "disabled"; | ||
87 | }; | ||
88 | |||
89 | - ipmmu_sy1: mmu@e6290000 { | ||
90 | + ipmmu_sy1: iommu@e6290000 { | ||
91 | compatible = "renesas,ipmmu-r8a7744", | ||
92 | "renesas,ipmmu-vmsa"; | ||
93 | reg = <0 0xe6290000 0 0x1000>; | ||
94 | @@ -357,7 +357,7 @@ | ||
95 | status = "disabled"; | ||
96 | }; | ||
97 | |||
98 | - ipmmu_ds: mmu@e6740000 { | ||
99 | + ipmmu_ds: iommu@e6740000 { | ||
100 | compatible = "renesas,ipmmu-r8a7744", | ||
101 | "renesas,ipmmu-vmsa"; | ||
102 | reg = <0 0xe6740000 0 0x1000>; | ||
103 | @@ -367,7 +367,7 @@ | ||
104 | status = "disabled"; | ||
105 | }; | ||
106 | |||
107 | - ipmmu_mp: mmu@ec680000 { | ||
108 | + ipmmu_mp: iommu@ec680000 { | ||
109 | compatible = "renesas,ipmmu-r8a7744", | ||
110 | "renesas,ipmmu-vmsa"; | ||
111 | reg = <0 0xec680000 0 0x1000>; | ||
112 | @@ -376,7 +376,7 @@ | ||
113 | status = "disabled"; | ||
114 | }; | ||
115 | |||
116 | - ipmmu_mx: mmu@fe951000 { | ||
117 | + ipmmu_mx: iommu@fe951000 { | ||
118 | compatible = "renesas,ipmmu-r8a7744", | ||
119 | "renesas,ipmmu-vmsa"; | ||
120 | reg = <0 0xfe951000 0 0x1000>; | ||
121 | @@ -386,7 +386,7 @@ | ||
122 | status = "disabled"; | ||
123 | }; | ||
124 | |||
125 | - ipmmu_gp: mmu@e62a0000 { | ||
126 | + ipmmu_gp: iommu@e62a0000 { | ||
127 | compatible = "renesas,ipmmu-r8a7744", | ||
128 | "renesas,ipmmu-vmsa"; | ||
129 | reg = <0 0xe62a0000 0 0x1000>; | ||
130 | diff --git a/arch/arm/boot/dts/r8a7745.dtsi b/arch/arm/boot/dts/r8a7745.dtsi | ||
131 | index c53f7ff20695..c306713f2ab7 100644 | ||
132 | --- a/arch/arm/boot/dts/r8a7745.dtsi | ||
133 | +++ b/arch/arm/boot/dts/r8a7745.dtsi | ||
134 | @@ -302,7 +302,7 @@ | ||
135 | resets = <&cpg 407>; | ||
136 | }; | ||
137 | |||
138 | - ipmmu_sy0: mmu@e6280000 { | ||
139 | + ipmmu_sy0: iommu@e6280000 { | ||
140 | compatible = "renesas,ipmmu-r8a7745", | ||
141 | "renesas,ipmmu-vmsa"; | ||
142 | reg = <0 0xe6280000 0 0x1000>; | ||
143 | @@ -312,7 +312,7 @@ | ||
144 | status = "disabled"; | ||
145 | }; | ||
146 | |||
147 | - ipmmu_sy1: mmu@e6290000 { | ||
148 | + ipmmu_sy1: iommu@e6290000 { | ||
149 | compatible = "renesas,ipmmu-r8a7745", | ||
150 | "renesas,ipmmu-vmsa"; | ||
151 | reg = <0 0xe6290000 0 0x1000>; | ||
152 | @@ -321,7 +321,7 @@ | ||
153 | status = "disabled"; | ||
154 | }; | ||
155 | |||
156 | - ipmmu_ds: mmu@e6740000 { | ||
157 | + ipmmu_ds: iommu@e6740000 { | ||
158 | compatible = "renesas,ipmmu-r8a7745", | ||
159 | "renesas,ipmmu-vmsa"; | ||
160 | reg = <0 0xe6740000 0 0x1000>; | ||
161 | @@ -331,7 +331,7 @@ | ||
162 | status = "disabled"; | ||
163 | }; | ||
164 | |||
165 | - ipmmu_mp: mmu@ec680000 { | ||
166 | + ipmmu_mp: iommu@ec680000 { | ||
167 | compatible = "renesas,ipmmu-r8a7745", | ||
168 | "renesas,ipmmu-vmsa"; | ||
169 | reg = <0 0xec680000 0 0x1000>; | ||
170 | @@ -340,7 +340,7 @@ | ||
171 | status = "disabled"; | ||
172 | }; | ||
173 | |||
174 | - ipmmu_mx: mmu@fe951000 { | ||
175 | + ipmmu_mx: iommu@fe951000 { | ||
176 | compatible = "renesas,ipmmu-r8a7745", | ||
177 | "renesas,ipmmu-vmsa"; | ||
178 | reg = <0 0xfe951000 0 0x1000>; | ||
179 | @@ -350,7 +350,7 @@ | ||
180 | status = "disabled"; | ||
181 | }; | ||
182 | |||
183 | - ipmmu_gp: mmu@e62a0000 { | ||
184 | + ipmmu_gp: iommu@e62a0000 { | ||
185 | compatible = "renesas,ipmmu-r8a7745", | ||
186 | "renesas,ipmmu-vmsa"; | ||
187 | reg = <0 0xe62a0000 0 0x1000>; | ||
188 | diff --git a/arch/arm/boot/dts/r8a7790.dtsi b/arch/arm/boot/dts/r8a7790.dtsi | ||
189 | index 5a2747758f67..e3ba00a22eeb 100644 | ||
190 | --- a/arch/arm/boot/dts/r8a7790.dtsi | ||
191 | +++ b/arch/arm/boot/dts/r8a7790.dtsi | ||
192 | @@ -427,7 +427,7 @@ | ||
193 | #thermal-sensor-cells = <0>; | ||
194 | }; | ||
195 | |||
196 | - ipmmu_sy0: mmu@e6280000 { | ||
197 | + ipmmu_sy0: iommu@e6280000 { | ||
198 | compatible = "renesas,ipmmu-r8a7790", | ||
199 | "renesas,ipmmu-vmsa"; | ||
200 | reg = <0 0xe6280000 0 0x1000>; | ||
201 | @@ -437,7 +437,7 @@ | ||
202 | status = "disabled"; | ||
203 | }; | ||
204 | |||
205 | - ipmmu_sy1: mmu@e6290000 { | ||
206 | + ipmmu_sy1: iommu@e6290000 { | ||
207 | compatible = "renesas,ipmmu-r8a7790", | ||
208 | "renesas,ipmmu-vmsa"; | ||
209 | reg = <0 0xe6290000 0 0x1000>; | ||
210 | @@ -446,7 +446,7 @@ | ||
211 | status = "disabled"; | ||
212 | }; | ||
213 | |||
214 | - ipmmu_ds: mmu@e6740000 { | ||
215 | + ipmmu_ds: iommu@e6740000 { | ||
216 | compatible = "renesas,ipmmu-r8a7790", | ||
217 | "renesas,ipmmu-vmsa"; | ||
218 | reg = <0 0xe6740000 0 0x1000>; | ||
219 | @@ -456,7 +456,7 @@ | ||
220 | status = "disabled"; | ||
221 | }; | ||
222 | |||
223 | - ipmmu_mp: mmu@ec680000 { | ||
224 | + ipmmu_mp: iommu@ec680000 { | ||
225 | compatible = "renesas,ipmmu-r8a7790", | ||
226 | "renesas,ipmmu-vmsa"; | ||
227 | reg = <0 0xec680000 0 0x1000>; | ||
228 | @@ -465,7 +465,7 @@ | ||
229 | status = "disabled"; | ||
230 | }; | ||
231 | |||
232 | - ipmmu_mx: mmu@fe951000 { | ||
233 | + ipmmu_mx: iommu@fe951000 { | ||
234 | compatible = "renesas,ipmmu-r8a7790", | ||
235 | "renesas,ipmmu-vmsa"; | ||
236 | reg = <0 0xfe951000 0 0x1000>; | ||
237 | @@ -475,7 +475,7 @@ | ||
238 | status = "disabled"; | ||
239 | }; | ||
240 | |||
241 | - ipmmu_rt: mmu@ffc80000 { | ||
242 | + ipmmu_rt: iommu@ffc80000 { | ||
243 | compatible = "renesas,ipmmu-r8a7790", | ||
244 | "renesas,ipmmu-vmsa"; | ||
245 | reg = <0 0xffc80000 0 0x1000>; | ||
246 | diff --git a/arch/arm/boot/dts/r8a7791.dtsi b/arch/arm/boot/dts/r8a7791.dtsi | ||
247 | index 6f875502453c..a26f86ccc579 100644 | ||
248 | --- a/arch/arm/boot/dts/r8a7791.dtsi | ||
249 | +++ b/arch/arm/boot/dts/r8a7791.dtsi | ||
250 | @@ -350,7 +350,7 @@ | ||
251 | #thermal-sensor-cells = <0>; | ||
252 | }; | ||
253 | |||
254 | - ipmmu_sy0: mmu@e6280000 { | ||
255 | + ipmmu_sy0: iommu@e6280000 { | ||
256 | compatible = "renesas,ipmmu-r8a7791", | ||
257 | "renesas,ipmmu-vmsa"; | ||
258 | reg = <0 0xe6280000 0 0x1000>; | ||
259 | @@ -360,7 +360,7 @@ | ||
260 | status = "disabled"; | ||
261 | }; | ||
262 | |||
263 | - ipmmu_sy1: mmu@e6290000 { | ||
264 | + ipmmu_sy1: iommu@e6290000 { | ||
265 | compatible = "renesas,ipmmu-r8a7791", | ||
266 | "renesas,ipmmu-vmsa"; | ||
267 | reg = <0 0xe6290000 0 0x1000>; | ||
268 | @@ -369,7 +369,7 @@ | ||
269 | status = "disabled"; | ||
270 | }; | ||
271 | |||
272 | - ipmmu_ds: mmu@e6740000 { | ||
273 | + ipmmu_ds: iommu@e6740000 { | ||
274 | compatible = "renesas,ipmmu-r8a7791", | ||
275 | "renesas,ipmmu-vmsa"; | ||
276 | reg = <0 0xe6740000 0 0x1000>; | ||
277 | @@ -379,7 +379,7 @@ | ||
278 | status = "disabled"; | ||
279 | }; | ||
280 | |||
281 | - ipmmu_mp: mmu@ec680000 { | ||
282 | + ipmmu_mp: iommu@ec680000 { | ||
283 | compatible = "renesas,ipmmu-r8a7791", | ||
284 | "renesas,ipmmu-vmsa"; | ||
285 | reg = <0 0xec680000 0 0x1000>; | ||
286 | @@ -388,7 +388,7 @@ | ||
287 | status = "disabled"; | ||
288 | }; | ||
289 | |||
290 | - ipmmu_mx: mmu@fe951000 { | ||
291 | + ipmmu_mx: iommu@fe951000 { | ||
292 | compatible = "renesas,ipmmu-r8a7791", | ||
293 | "renesas,ipmmu-vmsa"; | ||
294 | reg = <0 0xfe951000 0 0x1000>; | ||
295 | @@ -398,7 +398,7 @@ | ||
296 | status = "disabled"; | ||
297 | }; | ||
298 | |||
299 | - ipmmu_rt: mmu@ffc80000 { | ||
300 | + ipmmu_rt: iommu@ffc80000 { | ||
301 | compatible = "renesas,ipmmu-r8a7791", | ||
302 | "renesas,ipmmu-vmsa"; | ||
303 | reg = <0 0xffc80000 0 0x1000>; | ||
304 | @@ -407,7 +407,7 @@ | ||
305 | status = "disabled"; | ||
306 | }; | ||
307 | |||
308 | - ipmmu_gp: mmu@e62a0000 { | ||
309 | + ipmmu_gp: iommu@e62a0000 { | ||
310 | compatible = "renesas,ipmmu-r8a7791", | ||
311 | "renesas,ipmmu-vmsa"; | ||
312 | reg = <0 0xe62a0000 0 0x1000>; | ||
313 | diff --git a/arch/arm/boot/dts/r8a7793.dtsi b/arch/arm/boot/dts/r8a7793.dtsi | ||
314 | index bf05110fac4e..fa3839795018 100644 | ||
315 | --- a/arch/arm/boot/dts/r8a7793.dtsi | ||
316 | +++ b/arch/arm/boot/dts/r8a7793.dtsi | ||
317 | @@ -336,7 +336,7 @@ | ||
318 | #thermal-sensor-cells = <0>; | ||
319 | }; | ||
320 | |||
321 | - ipmmu_sy0: mmu@e6280000 { | ||
322 | + ipmmu_sy0: iommu@e6280000 { | ||
323 | compatible = "renesas,ipmmu-r8a7793", | ||
324 | "renesas,ipmmu-vmsa"; | ||
325 | reg = <0 0xe6280000 0 0x1000>; | ||
326 | @@ -346,7 +346,7 @@ | ||
327 | status = "disabled"; | ||
328 | }; | ||
329 | |||
330 | - ipmmu_sy1: mmu@e6290000 { | ||
331 | + ipmmu_sy1: iommu@e6290000 { | ||
332 | compatible = "renesas,ipmmu-r8a7793", | ||
333 | "renesas,ipmmu-vmsa"; | ||
334 | reg = <0 0xe6290000 0 0x1000>; | ||
335 | @@ -355,7 +355,7 @@ | ||
336 | status = "disabled"; | ||
337 | }; | ||
338 | |||
339 | - ipmmu_ds: mmu@e6740000 { | ||
340 | + ipmmu_ds: iommu@e6740000 { | ||
341 | compatible = "renesas,ipmmu-r8a7793", | ||
342 | "renesas,ipmmu-vmsa"; | ||
343 | reg = <0 0xe6740000 0 0x1000>; | ||
344 | @@ -365,7 +365,7 @@ | ||
345 | status = "disabled"; | ||
346 | }; | ||
347 | |||
348 | - ipmmu_mp: mmu@ec680000 { | ||
349 | + ipmmu_mp: iommu@ec680000 { | ||
350 | compatible = "renesas,ipmmu-r8a7793", | ||
351 | "renesas,ipmmu-vmsa"; | ||
352 | reg = <0 0xec680000 0 0x1000>; | ||
353 | @@ -374,7 +374,7 @@ | ||
354 | status = "disabled"; | ||
355 | }; | ||
356 | |||
357 | - ipmmu_mx: mmu@fe951000 { | ||
358 | + ipmmu_mx: iommu@fe951000 { | ||
359 | compatible = "renesas,ipmmu-r8a7793", | ||
360 | "renesas,ipmmu-vmsa"; | ||
361 | reg = <0 0xfe951000 0 0x1000>; | ||
362 | @@ -384,7 +384,7 @@ | ||
363 | status = "disabled"; | ||
364 | }; | ||
365 | |||
366 | - ipmmu_rt: mmu@ffc80000 { | ||
367 | + ipmmu_rt: iommu@ffc80000 { | ||
368 | compatible = "renesas,ipmmu-r8a7793", | ||
369 | "renesas,ipmmu-vmsa"; | ||
370 | reg = <0 0xffc80000 0 0x1000>; | ||
371 | @@ -393,7 +393,7 @@ | ||
372 | status = "disabled"; | ||
373 | }; | ||
374 | |||
375 | - ipmmu_gp: mmu@e62a0000 { | ||
376 | + ipmmu_gp: iommu@e62a0000 { | ||
377 | compatible = "renesas,ipmmu-r8a7793", | ||
378 | "renesas,ipmmu-vmsa"; | ||
379 | reg = <0 0xe62a0000 0 0x1000>; | ||
380 | diff --git a/arch/arm/boot/dts/r8a7794.dtsi b/arch/arm/boot/dts/r8a7794.dtsi | ||
381 | index 8d797d34816e..9dd952479e68 100644 | ||
382 | --- a/arch/arm/boot/dts/r8a7794.dtsi | ||
383 | +++ b/arch/arm/boot/dts/r8a7794.dtsi | ||
384 | @@ -290,7 +290,7 @@ | ||
385 | resets = <&cpg 407>; | ||
386 | }; | ||
387 | |||
388 | - ipmmu_sy0: mmu@e6280000 { | ||
389 | + ipmmu_sy0: iommu@e6280000 { | ||
390 | compatible = "renesas,ipmmu-r8a7794", | ||
391 | "renesas,ipmmu-vmsa"; | ||
392 | reg = <0 0xe6280000 0 0x1000>; | ||
393 | @@ -300,7 +300,7 @@ | ||
394 | status = "disabled"; | ||
395 | }; | ||
396 | |||
397 | - ipmmu_sy1: mmu@e6290000 { | ||
398 | + ipmmu_sy1: iommu@e6290000 { | ||
399 | compatible = "renesas,ipmmu-r8a7794", | ||
400 | "renesas,ipmmu-vmsa"; | ||
401 | reg = <0 0xe6290000 0 0x1000>; | ||
402 | @@ -309,7 +309,7 @@ | ||
403 | status = "disabled"; | ||
404 | }; | ||
405 | |||
406 | - ipmmu_ds: mmu@e6740000 { | ||
407 | + ipmmu_ds: iommu@e6740000 { | ||
408 | compatible = "renesas,ipmmu-r8a7794", | ||
409 | "renesas,ipmmu-vmsa"; | ||
410 | reg = <0 0xe6740000 0 0x1000>; | ||
411 | @@ -319,7 +319,7 @@ | ||
412 | status = "disabled"; | ||
413 | }; | ||
414 | |||
415 | - ipmmu_mp: mmu@ec680000 { | ||
416 | + ipmmu_mp: iommu@ec680000 { | ||
417 | compatible = "renesas,ipmmu-r8a7794", | ||
418 | "renesas,ipmmu-vmsa"; | ||
419 | reg = <0 0xec680000 0 0x1000>; | ||
420 | @@ -328,7 +328,7 @@ | ||
421 | status = "disabled"; | ||
422 | }; | ||
423 | |||
424 | - ipmmu_mx: mmu@fe951000 { | ||
425 | + ipmmu_mx: iommu@fe951000 { | ||
426 | compatible = "renesas,ipmmu-r8a7794", | ||
427 | "renesas,ipmmu-vmsa"; | ||
428 | reg = <0 0xfe951000 0 0x1000>; | ||
429 | @@ -338,7 +338,7 @@ | ||
430 | status = "disabled"; | ||
431 | }; | ||
432 | |||
433 | - ipmmu_gp: mmu@e62a0000 { | ||
434 | + ipmmu_gp: iommu@e62a0000 { | ||
435 | compatible = "renesas,ipmmu-r8a7794", | ||
436 | "renesas,ipmmu-vmsa"; | ||
437 | reg = <0 0xe62a0000 0 0x1000>; | ||
438 | diff --git a/arch/arm/boot/dts/stm32mp157a-avenger96.dts b/arch/arm/boot/dts/stm32mp157a-avenger96.dts | ||
439 | index 2e4742c53d04..7b8c3f25861c 100644 | ||
440 | --- a/arch/arm/boot/dts/stm32mp157a-avenger96.dts | ||
441 | +++ b/arch/arm/boot/dts/stm32mp157a-avenger96.dts | ||
442 | @@ -91,6 +91,9 @@ | ||
443 | #address-cells = <1>; | ||
444 | #size-cells = <0>; | ||
445 | compatible = "snps,dwmac-mdio"; | ||
446 | + reset-gpios = <&gpioz 2 GPIO_ACTIVE_LOW>; | ||
447 | + reset-delay-us = <1000>; | ||
448 | + | ||
449 | phy0: ethernet-phy@7 { | ||
450 | reg = <7>; | ||
451 | }; | ||
452 | diff --git a/arch/arm/boot/dts/sun8i-h2-plus-bananapi-m2-zero.dts b/arch/arm/boot/dts/sun8i-h2-plus-bananapi-m2-zero.dts | ||
453 | index d277d043031b..4c6704e4c57e 100644 | ||
454 | --- a/arch/arm/boot/dts/sun8i-h2-plus-bananapi-m2-zero.dts | ||
455 | +++ b/arch/arm/boot/dts/sun8i-h2-plus-bananapi-m2-zero.dts | ||
456 | @@ -31,7 +31,7 @@ | ||
457 | |||
458 | pwr_led { | ||
459 | label = "bananapi-m2-zero:red:pwr"; | ||
460 | - gpios = <&r_pio 0 10 GPIO_ACTIVE_HIGH>; /* PL10 */ | ||
461 | + gpios = <&r_pio 0 10 GPIO_ACTIVE_LOW>; /* PL10 */ | ||
462 | default-state = "on"; | ||
463 | }; | ||
464 | }; | ||
465 | diff --git a/arch/arm/boot/dts/vexpress-v2m-rs1.dtsi b/arch/arm/boot/dts/vexpress-v2m-rs1.dtsi | ||
466 | index dfae90adbb7c..ce64bfb22f22 100644 | ||
467 | --- a/arch/arm/boot/dts/vexpress-v2m-rs1.dtsi | ||
468 | +++ b/arch/arm/boot/dts/vexpress-v2m-rs1.dtsi | ||
469 | @@ -31,7 +31,7 @@ | ||
470 | #interrupt-cells = <1>; | ||
471 | ranges; | ||
472 | |||
473 | - nor_flash: flash@0,00000000 { | ||
474 | + nor_flash: flash@0 { | ||
475 | compatible = "arm,vexpress-flash", "cfi-flash"; | ||
476 | reg = <0 0x00000000 0x04000000>, | ||
477 | <4 0x00000000 0x04000000>; | ||
478 | @@ -41,13 +41,13 @@ | ||
479 | }; | ||
480 | }; | ||
481 | |||
482 | - psram@1,00000000 { | ||
483 | + psram@100000000 { | ||
484 | compatible = "arm,vexpress-psram", "mtd-ram"; | ||
485 | reg = <1 0x00000000 0x02000000>; | ||
486 | bank-width = <4>; | ||
487 | }; | ||
488 | |||
489 | - ethernet@2,02000000 { | ||
490 | + ethernet@202000000 { | ||
491 | compatible = "smsc,lan9118", "smsc,lan9115"; | ||
492 | reg = <2 0x02000000 0x10000>; | ||
493 | interrupts = <15>; | ||
494 | @@ -59,14 +59,14 @@ | ||
495 | vddvario-supply = <&v2m_fixed_3v3>; | ||
496 | }; | ||
497 | |||
498 | - usb@2,03000000 { | ||
499 | + usb@203000000 { | ||
500 | compatible = "nxp,usb-isp1761"; | ||
501 | reg = <2 0x03000000 0x20000>; | ||
502 | interrupts = <16>; | ||
503 | port1-otg; | ||
504 | }; | ||
505 | |||
506 | - iofpga@3,00000000 { | ||
507 | + iofpga@300000000 { | ||
508 | compatible = "simple-bus"; | ||
509 | #address-cells = <1>; | ||
510 | #size-cells = <1>; | ||
511 | diff --git a/arch/arm/mach-integrator/Kconfig b/arch/arm/mach-integrator/Kconfig | ||
512 | index 982eabc36163..2406cab73835 100644 | ||
513 | --- a/arch/arm/mach-integrator/Kconfig | ||
514 | +++ b/arch/arm/mach-integrator/Kconfig | ||
515 | @@ -4,6 +4,8 @@ menuconfig ARCH_INTEGRATOR | ||
516 | depends on ARCH_MULTI_V4T || ARCH_MULTI_V5 || ARCH_MULTI_V6 | ||
517 | select ARM_AMBA | ||
518 | select COMMON_CLK_VERSATILE | ||
519 | + select CMA | ||
520 | + select DMA_CMA | ||
521 | select HAVE_TCM | ||
522 | select ICST | ||
523 | select MFD_SYSCON | ||
524 | @@ -35,14 +37,13 @@ config INTEGRATOR_IMPD1 | ||
525 | select ARM_VIC | ||
526 | select GPIO_PL061 | ||
527 | select GPIOLIB | ||
528 | + select REGULATOR | ||
529 | + select REGULATOR_FIXED_VOLTAGE | ||
530 | help | ||
531 | The IM-PD1 is an add-on logic module for the Integrator which | ||
532 | allows ARM(R) Ltd PrimeCells to be developed and evaluated. | ||
533 | The IM-PD1 can be found on the Integrator/PP2 platform. | ||
534 | |||
535 | - To compile this driver as a module, choose M here: the | ||
536 | - module will be called impd1. | ||
537 | - | ||
538 | config INTEGRATOR_CM7TDMI | ||
539 | bool "Integrator/CM7TDMI core module" | ||
540 | depends on ARCH_INTEGRATOR_AP | ||
541 | diff --git a/arch/arm64/boot/dts/amlogic/meson-axg.dtsi b/arch/arm64/boot/dts/amlogic/meson-axg.dtsi | ||
542 | index bb4a2acb9970..502c4ac45c29 100644 | ||
543 | --- a/arch/arm64/boot/dts/amlogic/meson-axg.dtsi | ||
544 | +++ b/arch/arm64/boot/dts/amlogic/meson-axg.dtsi | ||
545 | @@ -1728,18 +1728,18 @@ | ||
546 | }; | ||
547 | |||
548 | sram: sram@fffc0000 { | ||
549 | - compatible = "amlogic,meson-axg-sram", "mmio-sram"; | ||
550 | + compatible = "mmio-sram"; | ||
551 | reg = <0x0 0xfffc0000 0x0 0x20000>; | ||
552 | #address-cells = <1>; | ||
553 | #size-cells = <1>; | ||
554 | ranges = <0 0x0 0xfffc0000 0x20000>; | ||
555 | |||
556 | - cpu_scp_lpri: scp-shmem@13000 { | ||
557 | + cpu_scp_lpri: scp-sram@13000 { | ||
558 | compatible = "amlogic,meson-axg-scp-shmem"; | ||
559 | reg = <0x13000 0x400>; | ||
560 | }; | ||
561 | |||
562 | - cpu_scp_hpri: scp-shmem@13400 { | ||
563 | + cpu_scp_hpri: scp-sram@13400 { | ||
564 | compatible = "amlogic,meson-axg-scp-shmem"; | ||
565 | reg = <0x13400 0x400>; | ||
566 | }; | ||
567 | diff --git a/arch/arm64/boot/dts/amlogic/meson-gx.dtsi b/arch/arm64/boot/dts/amlogic/meson-gx.dtsi | ||
568 | index 6733050d735f..ce230d6ac35c 100644 | ||
569 | --- a/arch/arm64/boot/dts/amlogic/meson-gx.dtsi | ||
570 | +++ b/arch/arm64/boot/dts/amlogic/meson-gx.dtsi | ||
571 | @@ -345,20 +345,20 @@ | ||
572 | }; | ||
573 | |||
574 | sram: sram@c8000000 { | ||
575 | - compatible = "amlogic,meson-gx-sram", "amlogic,meson-gxbb-sram", "mmio-sram"; | ||
576 | + compatible = "mmio-sram"; | ||
577 | reg = <0x0 0xc8000000 0x0 0x14000>; | ||
578 | |||
579 | #address-cells = <1>; | ||
580 | #size-cells = <1>; | ||
581 | ranges = <0 0x0 0xc8000000 0x14000>; | ||
582 | |||
583 | - cpu_scp_lpri: scp-shmem@0 { | ||
584 | - compatible = "amlogic,meson-gx-scp-shmem", "amlogic,meson-gxbb-scp-shmem"; | ||
585 | + cpu_scp_lpri: scp-sram@0 { | ||
586 | + compatible = "amlogic,meson-gxbb-scp-shmem"; | ||
587 | reg = <0x13000 0x400>; | ||
588 | }; | ||
589 | |||
590 | - cpu_scp_hpri: scp-shmem@200 { | ||
591 | - compatible = "amlogic,meson-gx-scp-shmem", "amlogic,meson-gxbb-scp-shmem"; | ||
592 | + cpu_scp_hpri: scp-sram@200 { | ||
593 | + compatible = "amlogic,meson-gxbb-scp-shmem"; | ||
594 | reg = <0x13400 0x400>; | ||
595 | }; | ||
596 | }; | ||
597 | diff --git a/arch/arm64/boot/dts/arm/foundation-v8-gicv2.dtsi b/arch/arm64/boot/dts/arm/foundation-v8-gicv2.dtsi | ||
598 | index 15fe81738e94..dfb23dfc0b0f 100644 | ||
599 | --- a/arch/arm64/boot/dts/arm/foundation-v8-gicv2.dtsi | ||
600 | +++ b/arch/arm64/boot/dts/arm/foundation-v8-gicv2.dtsi | ||
601 | @@ -8,7 +8,7 @@ | ||
602 | gic: interrupt-controller@2c001000 { | ||
603 | compatible = "arm,cortex-a15-gic", "arm,cortex-a9-gic"; | ||
604 | #interrupt-cells = <3>; | ||
605 | - #address-cells = <2>; | ||
606 | + #address-cells = <1>; | ||
607 | interrupt-controller; | ||
608 | reg = <0x0 0x2c001000 0 0x1000>, | ||
609 | <0x0 0x2c002000 0 0x2000>, | ||
610 | diff --git a/arch/arm64/boot/dts/arm/foundation-v8-gicv3.dtsi b/arch/arm64/boot/dts/arm/foundation-v8-gicv3.dtsi | ||
611 | index f2c75c756039..906f51935b36 100644 | ||
612 | --- a/arch/arm64/boot/dts/arm/foundation-v8-gicv3.dtsi | ||
613 | +++ b/arch/arm64/boot/dts/arm/foundation-v8-gicv3.dtsi | ||
614 | @@ -8,9 +8,9 @@ | ||
615 | gic: interrupt-controller@2f000000 { | ||
616 | compatible = "arm,gic-v3"; | ||
617 | #interrupt-cells = <3>; | ||
618 | - #address-cells = <2>; | ||
619 | - #size-cells = <2>; | ||
620 | - ranges; | ||
621 | + #address-cells = <1>; | ||
622 | + #size-cells = <1>; | ||
623 | + ranges = <0x0 0x0 0x2f000000 0x100000>; | ||
624 | interrupt-controller; | ||
625 | reg = <0x0 0x2f000000 0x0 0x10000>, | ||
626 | <0x0 0x2f100000 0x0 0x200000>, | ||
627 | @@ -22,7 +22,7 @@ | ||
628 | its: its@2f020000 { | ||
629 | compatible = "arm,gic-v3-its"; | ||
630 | msi-controller; | ||
631 | - reg = <0x0 0x2f020000 0x0 0x20000>; | ||
632 | + reg = <0x20000 0x20000>; | ||
633 | }; | ||
634 | }; | ||
635 | }; | ||
636 | diff --git a/arch/arm64/boot/dts/arm/foundation-v8.dtsi b/arch/arm64/boot/dts/arm/foundation-v8.dtsi | ||
637 | index 3f78373f708a..05d1657170b4 100644 | ||
638 | --- a/arch/arm64/boot/dts/arm/foundation-v8.dtsi | ||
639 | +++ b/arch/arm64/boot/dts/arm/foundation-v8.dtsi | ||
640 | @@ -107,51 +107,51 @@ | ||
641 | |||
642 | #interrupt-cells = <1>; | ||
643 | interrupt-map-mask = <0 0 63>; | ||
644 | - interrupt-map = <0 0 0 &gic 0 0 GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>, | ||
645 | - <0 0 1 &gic 0 0 GIC_SPI 1 IRQ_TYPE_LEVEL_HIGH>, | ||
646 | - <0 0 2 &gic 0 0 GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>, | ||
647 | - <0 0 3 &gic 0 0 GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>, | ||
648 | - <0 0 4 &gic 0 0 GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>, | ||
649 | - <0 0 5 &gic 0 0 GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>, | ||
650 | - <0 0 6 &gic 0 0 GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>, | ||
651 | - <0 0 7 &gic 0 0 GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>, | ||
652 | - <0 0 8 &gic 0 0 GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>, | ||
653 | - <0 0 9 &gic 0 0 GIC_SPI 9 IRQ_TYPE_LEVEL_HIGH>, | ||
654 | - <0 0 10 &gic 0 0 GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>, | ||
655 | - <0 0 11 &gic 0 0 GIC_SPI 11 IRQ_TYPE_LEVEL_HIGH>, | ||
656 | - <0 0 12 &gic 0 0 GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>, | ||
657 | - <0 0 13 &gic 0 0 GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>, | ||
658 | - <0 0 14 &gic 0 0 GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>, | ||
659 | - <0 0 15 &gic 0 0 GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>, | ||
660 | - <0 0 16 &gic 0 0 GIC_SPI 16 IRQ_TYPE_LEVEL_HIGH>, | ||
661 | - <0 0 17 &gic 0 0 GIC_SPI 17 IRQ_TYPE_LEVEL_HIGH>, | ||
662 | - <0 0 18 &gic 0 0 GIC_SPI 18 IRQ_TYPE_LEVEL_HIGH>, | ||
663 | - <0 0 19 &gic 0 0 GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH>, | ||
664 | - <0 0 20 &gic 0 0 GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>, | ||
665 | - <0 0 21 &gic 0 0 GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>, | ||
666 | - <0 0 22 &gic 0 0 GIC_SPI 22 IRQ_TYPE_LEVEL_HIGH>, | ||
667 | - <0 0 23 &gic 0 0 GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>, | ||
668 | - <0 0 24 &gic 0 0 GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>, | ||
669 | - <0 0 25 &gic 0 0 GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>, | ||
670 | - <0 0 26 &gic 0 0 GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>, | ||
671 | - <0 0 27 &gic 0 0 GIC_SPI 27 IRQ_TYPE_LEVEL_HIGH>, | ||
672 | - <0 0 28 &gic 0 0 GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>, | ||
673 | - <0 0 29 &gic 0 0 GIC_SPI 29 IRQ_TYPE_LEVEL_HIGH>, | ||
674 | - <0 0 30 &gic 0 0 GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>, | ||
675 | - <0 0 31 &gic 0 0 GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>, | ||
676 | - <0 0 32 &gic 0 0 GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>, | ||
677 | - <0 0 33 &gic 0 0 GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>, | ||
678 | - <0 0 34 &gic 0 0 GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>, | ||
679 | - <0 0 35 &gic 0 0 GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>, | ||
680 | - <0 0 36 &gic 0 0 GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>, | ||
681 | - <0 0 37 &gic 0 0 GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>, | ||
682 | - <0 0 38 &gic 0 0 GIC_SPI 38 IRQ_TYPE_LEVEL_HIGH>, | ||
683 | - <0 0 39 &gic 0 0 GIC_SPI 39 IRQ_TYPE_LEVEL_HIGH>, | ||
684 | - <0 0 40 &gic 0 0 GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>, | ||
685 | - <0 0 41 &gic 0 0 GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>, | ||
686 | - <0 0 42 &gic 0 0 GIC_SPI 42 IRQ_TYPE_LEVEL_HIGH>; | ||
687 | - | ||
688 | - ethernet@2,02000000 { | ||
689 | + interrupt-map = <0 0 0 &gic 0 GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>, | ||
690 | + <0 0 1 &gic 0 GIC_SPI 1 IRQ_TYPE_LEVEL_HIGH>, | ||
691 | + <0 0 2 &gic 0 GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>, | ||
692 | + <0 0 3 &gic 0 GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>, | ||
693 | + <0 0 4 &gic 0 GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>, | ||
694 | + <0 0 5 &gic 0 GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>, | ||
695 | + <0 0 6 &gic 0 GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>, | ||
696 | + <0 0 7 &gic 0 GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>, | ||
697 | + <0 0 8 &gic 0 GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>, | ||
698 | + <0 0 9 &gic 0 GIC_SPI 9 IRQ_TYPE_LEVEL_HIGH>, | ||
699 | + <0 0 10 &gic 0 GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>, | ||
700 | + <0 0 11 &gic 0 GIC_SPI 11 IRQ_TYPE_LEVEL_HIGH>, | ||
701 | + <0 0 12 &gic 0 GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>, | ||
702 | + <0 0 13 &gic 0 GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>, | ||
703 | + <0 0 14 &gic 0 GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>, | ||
704 | + <0 0 15 &gic 0 GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>, | ||
705 | + <0 0 16 &gic 0 GIC_SPI 16 IRQ_TYPE_LEVEL_HIGH>, | ||
706 | + <0 0 17 &gic 0 GIC_SPI 17 IRQ_TYPE_LEVEL_HIGH>, | ||
707 | + <0 0 18 &gic 0 GIC_SPI 18 IRQ_TYPE_LEVEL_HIGH>, | ||
708 | + <0 0 19 &gic 0 GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH>, | ||
709 | + <0 0 20 &gic 0 GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>, | ||
710 | + <0 0 21 &gic 0 GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>, | ||
711 | + <0 0 22 &gic 0 GIC_SPI 22 IRQ_TYPE_LEVEL_HIGH>, | ||
712 | + <0 0 23 &gic 0 GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>, | ||
713 | + <0 0 24 &gic 0 GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>, | ||
714 | + <0 0 25 &gic 0 GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>, | ||
715 | + <0 0 26 &gic 0 GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>, | ||
716 | + <0 0 27 &gic 0 GIC_SPI 27 IRQ_TYPE_LEVEL_HIGH>, | ||
717 | + <0 0 28 &gic 0 GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>, | ||
718 | + <0 0 29 &gic 0 GIC_SPI 29 IRQ_TYPE_LEVEL_HIGH>, | ||
719 | + <0 0 30 &gic 0 GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>, | ||
720 | + <0 0 31 &gic 0 GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>, | ||
721 | + <0 0 32 &gic 0 GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>, | ||
722 | + <0 0 33 &gic 0 GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>, | ||
723 | + <0 0 34 &gic 0 GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>, | ||
724 | + <0 0 35 &gic 0 GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>, | ||
725 | + <0 0 36 &gic 0 GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>, | ||
726 | + <0 0 37 &gic 0 GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>, | ||
727 | + <0 0 38 &gic 0 GIC_SPI 38 IRQ_TYPE_LEVEL_HIGH>, | ||
728 | + <0 0 39 &gic 0 GIC_SPI 39 IRQ_TYPE_LEVEL_HIGH>, | ||
729 | + <0 0 40 &gic 0 GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>, | ||
730 | + <0 0 41 &gic 0 GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>, | ||
731 | + <0 0 42 &gic 0 GIC_SPI 42 IRQ_TYPE_LEVEL_HIGH>; | ||
732 | + | ||
733 | + ethernet@202000000 { | ||
734 | compatible = "smsc,lan91c111"; | ||
735 | reg = <2 0x02000000 0x10000>; | ||
736 | interrupts = <15>; | ||
737 | @@ -178,7 +178,7 @@ | ||
738 | clock-output-names = "v2m:refclk32khz"; | ||
739 | }; | ||
740 | |||
741 | - iofpga@3,00000000 { | ||
742 | + iofpga@300000000 { | ||
743 | compatible = "simple-bus"; | ||
744 | #address-cells = <1>; | ||
745 | #size-cells = <1>; | ||
746 | diff --git a/arch/arm64/boot/dts/arm/juno-base.dtsi b/arch/arm64/boot/dts/arm/juno-base.dtsi | ||
747 | index 8c11660bbe40..c47f76b01c4b 100644 | ||
748 | --- a/arch/arm64/boot/dts/arm/juno-base.dtsi | ||
749 | +++ b/arch/arm64/boot/dts/arm/juno-base.dtsi | ||
750 | @@ -62,35 +62,35 @@ | ||
751 | <0x0 0x2c02f000 0 0x2000>, | ||
752 | <0x0 0x2c04f000 0 0x2000>, | ||
753 | <0x0 0x2c06f000 0 0x2000>; | ||
754 | - #address-cells = <2>; | ||
755 | + #address-cells = <1>; | ||
756 | #interrupt-cells = <3>; | ||
757 | - #size-cells = <2>; | ||
758 | + #size-cells = <1>; | ||
759 | interrupt-controller; | ||
760 | interrupts = <GIC_PPI 9 (GIC_CPU_MASK_SIMPLE(6) | IRQ_TYPE_LEVEL_HIGH)>; | ||
761 | - ranges = <0 0 0 0x2c1c0000 0 0x40000>; | ||
762 | + ranges = <0 0 0x2c1c0000 0x40000>; | ||
763 | |||
764 | v2m_0: v2m@0 { | ||
765 | compatible = "arm,gic-v2m-frame"; | ||
766 | msi-controller; | ||
767 | - reg = <0 0 0 0x10000>; | ||
768 | + reg = <0 0x10000>; | ||
769 | }; | ||
770 | |||
771 | v2m@10000 { | ||
772 | compatible = "arm,gic-v2m-frame"; | ||
773 | msi-controller; | ||
774 | - reg = <0 0x10000 0 0x10000>; | ||
775 | + reg = <0x10000 0x10000>; | ||
776 | }; | ||
777 | |||
778 | v2m@20000 { | ||
779 | compatible = "arm,gic-v2m-frame"; | ||
780 | msi-controller; | ||
781 | - reg = <0 0x20000 0 0x10000>; | ||
782 | + reg = <0x20000 0x10000>; | ||
783 | }; | ||
784 | |||
785 | v2m@30000 { | ||
786 | compatible = "arm,gic-v2m-frame"; | ||
787 | msi-controller; | ||
788 | - reg = <0 0x30000 0 0x10000>; | ||
789 | + reg = <0x30000 0x10000>; | ||
790 | }; | ||
791 | }; | ||
792 | |||
793 | @@ -519,10 +519,10 @@ | ||
794 | <0x42000000 0x40 0x00000000 0x40 0x00000000 0x1 0x00000000>; | ||
795 | #interrupt-cells = <1>; | ||
796 | interrupt-map-mask = <0 0 0 7>; | ||
797 | - interrupt-map = <0 0 0 1 &gic 0 0 GIC_SPI 136 IRQ_TYPE_LEVEL_HIGH>, | ||
798 | - <0 0 0 2 &gic 0 0 GIC_SPI 137 IRQ_TYPE_LEVEL_HIGH>, | ||
799 | - <0 0 0 3 &gic 0 0 GIC_SPI 138 IRQ_TYPE_LEVEL_HIGH>, | ||
800 | - <0 0 0 4 &gic 0 0 GIC_SPI 139 IRQ_TYPE_LEVEL_HIGH>; | ||
801 | + interrupt-map = <0 0 0 1 &gic 0 GIC_SPI 136 IRQ_TYPE_LEVEL_HIGH>, | ||
802 | + <0 0 0 2 &gic 0 GIC_SPI 137 IRQ_TYPE_LEVEL_HIGH>, | ||
803 | + <0 0 0 3 &gic 0 GIC_SPI 138 IRQ_TYPE_LEVEL_HIGH>, | ||
804 | + <0 0 0 4 &gic 0 GIC_SPI 139 IRQ_TYPE_LEVEL_HIGH>; | ||
805 | msi-parent = <&v2m_0>; | ||
806 | status = "disabled"; | ||
807 | iommu-map-mask = <0x0>; /* RC has no means to output PCI RID */ | ||
808 | @@ -786,19 +786,19 @@ | ||
809 | |||
810 | #interrupt-cells = <1>; | ||
811 | interrupt-map-mask = <0 0 15>; | ||
812 | - interrupt-map = <0 0 0 &gic 0 0 GIC_SPI 68 IRQ_TYPE_LEVEL_HIGH>, | ||
813 | - <0 0 1 &gic 0 0 GIC_SPI 69 IRQ_TYPE_LEVEL_HIGH>, | ||
814 | - <0 0 2 &gic 0 0 GIC_SPI 70 IRQ_TYPE_LEVEL_HIGH>, | ||
815 | - <0 0 3 &gic 0 0 GIC_SPI 160 IRQ_TYPE_LEVEL_HIGH>, | ||
816 | - <0 0 4 &gic 0 0 GIC_SPI 161 IRQ_TYPE_LEVEL_HIGH>, | ||
817 | - <0 0 5 &gic 0 0 GIC_SPI 162 IRQ_TYPE_LEVEL_HIGH>, | ||
818 | - <0 0 6 &gic 0 0 GIC_SPI 163 IRQ_TYPE_LEVEL_HIGH>, | ||
819 | - <0 0 7 &gic 0 0 GIC_SPI 164 IRQ_TYPE_LEVEL_HIGH>, | ||
820 | - <0 0 8 &gic 0 0 GIC_SPI 165 IRQ_TYPE_LEVEL_HIGH>, | ||
821 | - <0 0 9 &gic 0 0 GIC_SPI 166 IRQ_TYPE_LEVEL_HIGH>, | ||
822 | - <0 0 10 &gic 0 0 GIC_SPI 167 IRQ_TYPE_LEVEL_HIGH>, | ||
823 | - <0 0 11 &gic 0 0 GIC_SPI 168 IRQ_TYPE_LEVEL_HIGH>, | ||
824 | - <0 0 12 &gic 0 0 GIC_SPI 169 IRQ_TYPE_LEVEL_HIGH>; | ||
825 | + interrupt-map = <0 0 0 &gic 0 GIC_SPI 68 IRQ_TYPE_LEVEL_HIGH>, | ||
826 | + <0 0 1 &gic 0 GIC_SPI 69 IRQ_TYPE_LEVEL_HIGH>, | ||
827 | + <0 0 2 &gic 0 GIC_SPI 70 IRQ_TYPE_LEVEL_HIGH>, | ||
828 | + <0 0 3 &gic 0 GIC_SPI 160 IRQ_TYPE_LEVEL_HIGH>, | ||
829 | + <0 0 4 &gic 0 GIC_SPI 161 IRQ_TYPE_LEVEL_HIGH>, | ||
830 | + <0 0 5 &gic 0 GIC_SPI 162 IRQ_TYPE_LEVEL_HIGH>, | ||
831 | + <0 0 6 &gic 0 GIC_SPI 163 IRQ_TYPE_LEVEL_HIGH>, | ||
832 | + <0 0 7 &gic 0 GIC_SPI 164 IRQ_TYPE_LEVEL_HIGH>, | ||
833 | + <0 0 8 &gic 0 GIC_SPI 165 IRQ_TYPE_LEVEL_HIGH>, | ||
834 | + <0 0 9 &gic 0 GIC_SPI 166 IRQ_TYPE_LEVEL_HIGH>, | ||
835 | + <0 0 10 &gic 0 GIC_SPI 167 IRQ_TYPE_LEVEL_HIGH>, | ||
836 | + <0 0 11 &gic 0 GIC_SPI 168 IRQ_TYPE_LEVEL_HIGH>, | ||
837 | + <0 0 12 &gic 0 GIC_SPI 169 IRQ_TYPE_LEVEL_HIGH>; | ||
838 | }; | ||
839 | |||
840 | site2: tlx@60000000 { | ||
841 | @@ -808,6 +808,6 @@ | ||
842 | ranges = <0 0 0x60000000 0x10000000>; | ||
843 | #interrupt-cells = <1>; | ||
844 | interrupt-map-mask = <0 0>; | ||
845 | - interrupt-map = <0 0 &gic 0 0 GIC_SPI 168 IRQ_TYPE_LEVEL_HIGH>; | ||
846 | + interrupt-map = <0 0 &gic 0 GIC_SPI 168 IRQ_TYPE_LEVEL_HIGH>; | ||
847 | }; | ||
848 | }; | ||
849 | diff --git a/arch/arm64/boot/dts/arm/juno-motherboard.dtsi b/arch/arm64/boot/dts/arm/juno-motherboard.dtsi | ||
850 | index 9f60dacb4f80..1234a8cfc0a9 100644 | ||
851 | --- a/arch/arm64/boot/dts/arm/juno-motherboard.dtsi | ||
852 | +++ b/arch/arm64/boot/dts/arm/juno-motherboard.dtsi | ||
853 | @@ -103,7 +103,7 @@ | ||
854 | }; | ||
855 | }; | ||
856 | |||
857 | - flash@0,00000000 { | ||
858 | + flash@0 { | ||
859 | /* 2 * 32MiB NOR Flash memory mounted on CS0 */ | ||
860 | compatible = "arm,vexpress-flash", "cfi-flash"; | ||
861 | reg = <0 0x00000000 0x04000000>; | ||
862 | @@ -120,7 +120,7 @@ | ||
863 | }; | ||
864 | }; | ||
865 | |||
866 | - ethernet@2,00000000 { | ||
867 | + ethernet@200000000 { | ||
868 | compatible = "smsc,lan9118", "smsc,lan9115"; | ||
869 | reg = <2 0x00000000 0x10000>; | ||
870 | interrupts = <3>; | ||
871 | @@ -133,7 +133,7 @@ | ||
872 | vddvario-supply = <&mb_fixed_3v3>; | ||
873 | }; | ||
874 | |||
875 | - iofpga@3,00000000 { | ||
876 | + iofpga@300000000 { | ||
877 | compatible = "simple-bus"; | ||
878 | #address-cells = <1>; | ||
879 | #size-cells = <1>; | ||
880 | diff --git a/arch/arm64/boot/dts/arm/rtsm_ve-motherboard-rs2.dtsi b/arch/arm64/boot/dts/arm/rtsm_ve-motherboard-rs2.dtsi | ||
881 | index 57b0b9d7f3fa..29e6962c70bd 100644 | ||
882 | --- a/arch/arm64/boot/dts/arm/rtsm_ve-motherboard-rs2.dtsi | ||
883 | +++ b/arch/arm64/boot/dts/arm/rtsm_ve-motherboard-rs2.dtsi | ||
884 | @@ -9,7 +9,7 @@ | ||
885 | motherboard { | ||
886 | arm,v2m-memory-map = "rs2"; | ||
887 | |||
888 | - iofpga@3,00000000 { | ||
889 | + iofpga@300000000 { | ||
890 | virtio-p9@140000 { | ||
891 | compatible = "virtio,mmio"; | ||
892 | reg = <0x140000 0x200>; | ||
893 | diff --git a/arch/arm64/boot/dts/arm/rtsm_ve-motherboard.dtsi b/arch/arm64/boot/dts/arm/rtsm_ve-motherboard.dtsi | ||
894 | index 03a7bf079c8f..ad20076357f5 100644 | ||
895 | --- a/arch/arm64/boot/dts/arm/rtsm_ve-motherboard.dtsi | ||
896 | +++ b/arch/arm64/boot/dts/arm/rtsm_ve-motherboard.dtsi | ||
897 | @@ -17,14 +17,14 @@ | ||
898 | #interrupt-cells = <1>; | ||
899 | ranges; | ||
900 | |||
901 | - flash@0,00000000 { | ||
902 | + flash@0 { | ||
903 | compatible = "arm,vexpress-flash", "cfi-flash"; | ||
904 | reg = <0 0x00000000 0x04000000>, | ||
905 | <4 0x00000000 0x04000000>; | ||
906 | bank-width = <4>; | ||
907 | }; | ||
908 | |||
909 | - ethernet@2,02000000 { | ||
910 | + ethernet@202000000 { | ||
911 | compatible = "smsc,lan91c111"; | ||
912 | reg = <2 0x02000000 0x10000>; | ||
913 | interrupts = <15>; | ||
914 | @@ -51,7 +51,7 @@ | ||
915 | clock-output-names = "v2m:refclk32khz"; | ||
916 | }; | ||
917 | |||
918 | - iofpga@3,00000000 { | ||
919 | + iofpga@300000000 { | ||
920 | compatible = "simple-bus"; | ||
921 | #address-cells = <1>; | ||
922 | #size-cells = <1>; | ||
923 | diff --git a/arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts b/arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts | ||
924 | index 5f350cc71a2f..c3668187b844 100644 | ||
925 | --- a/arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts | ||
926 | +++ b/arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts | ||
927 | @@ -95,7 +95,7 @@ | ||
928 | }; | ||
929 | |||
930 | sfp: sfp { | ||
931 | - compatible = "sff,sfp+"; | ||
932 | + compatible = "sff,sfp"; | ||
933 | i2c-bus = <&i2c0>; | ||
934 | los-gpio = <&moxtet_sfp 0 GPIO_ACTIVE_HIGH>; | ||
935 | tx-fault-gpio = <&moxtet_sfp 1 GPIO_ACTIVE_HIGH>; | ||
936 | @@ -171,6 +171,8 @@ | ||
937 | marvell,pad-type = "sd"; | ||
938 | vqmmc-supply = <&vsdio_reg>; | ||
939 | mmc-pwrseq = <&sdhci1_pwrseq>; | ||
940 | + /* forbid SDR104 for FCC purposes */ | ||
941 | + sdhci-caps-mask = <0x2 0x0>; | ||
942 | status = "okay"; | ||
943 | }; | ||
944 | |||
945 | diff --git a/arch/arm64/boot/dts/mediatek/mt8173.dtsi b/arch/arm64/boot/dts/mediatek/mt8173.dtsi | ||
946 | index 5891b7151432..dec5e4113ce4 100644 | ||
947 | --- a/arch/arm64/boot/dts/mediatek/mt8173.dtsi | ||
948 | +++ b/arch/arm64/boot/dts/mediatek/mt8173.dtsi | ||
949 | @@ -238,21 +238,21 @@ | ||
950 | cpu_on = <0x84000003>; | ||
951 | }; | ||
952 | |||
953 | - clk26m: oscillator@0 { | ||
954 | + clk26m: oscillator0 { | ||
955 | compatible = "fixed-clock"; | ||
956 | #clock-cells = <0>; | ||
957 | clock-frequency = <26000000>; | ||
958 | clock-output-names = "clk26m"; | ||
959 | }; | ||
960 | |||
961 | - clk32k: oscillator@1 { | ||
962 | + clk32k: oscillator1 { | ||
963 | compatible = "fixed-clock"; | ||
964 | #clock-cells = <0>; | ||
965 | clock-frequency = <32000>; | ||
966 | clock-output-names = "clk32k"; | ||
967 | }; | ||
968 | |||
969 | - cpum_ck: oscillator@2 { | ||
970 | + cpum_ck: oscillator2 { | ||
971 | compatible = "fixed-clock"; | ||
972 | #clock-cells = <0>; | ||
973 | clock-frequency = <0>; | ||
974 | @@ -268,19 +268,19 @@ | ||
975 | sustainable-power = <1500>; /* milliwatts */ | ||
976 | |||
977 | trips { | ||
978 | - threshold: trip-point@0 { | ||
979 | + threshold: trip-point0 { | ||
980 | temperature = <68000>; | ||
981 | hysteresis = <2000>; | ||
982 | type = "passive"; | ||
983 | }; | ||
984 | |||
985 | - target: trip-point@1 { | ||
986 | + target: trip-point1 { | ||
987 | temperature = <85000>; | ||
988 | hysteresis = <2000>; | ||
989 | type = "passive"; | ||
990 | }; | ||
991 | |||
992 | - cpu_crit: cpu_crit@0 { | ||
993 | + cpu_crit: cpu_crit0 { | ||
994 | temperature = <115000>; | ||
995 | hysteresis = <2000>; | ||
996 | type = "critical"; | ||
997 | @@ -288,13 +288,13 @@ | ||
998 | }; | ||
999 | |||
1000 | cooling-maps { | ||
1001 | - map@0 { | ||
1002 | + map0 { | ||
1003 | trip = <&target>; | ||
1004 | cooling-device = <&cpu0 0 0>, | ||
1005 | <&cpu1 0 0>; | ||
1006 | contribution = <3072>; | ||
1007 | }; | ||
1008 | - map@1 { | ||
1009 | + map1 { | ||
1010 | trip = <&target>; | ||
1011 | cooling-device = <&cpu2 0 0>, | ||
1012 | <&cpu3 0 0>; | ||
1013 | @@ -308,7 +308,7 @@ | ||
1014 | #address-cells = <2>; | ||
1015 | #size-cells = <2>; | ||
1016 | ranges; | ||
1017 | - vpu_dma_reserved: vpu_dma_mem_region { | ||
1018 | + vpu_dma_reserved: vpu_dma_mem_region@b7000000 { | ||
1019 | compatible = "shared-dma-pool"; | ||
1020 | reg = <0 0xb7000000 0 0x500000>; | ||
1021 | alignment = <0x1000>; | ||
1022 | @@ -360,7 +360,7 @@ | ||
1023 | reg = <0 0x10005000 0 0x1000>; | ||
1024 | }; | ||
1025 | |||
1026 | - pio: pinctrl@10005000 { | ||
1027 | + pio: pinctrl@1000b000 { | ||
1028 | compatible = "mediatek,mt8173-pinctrl"; | ||
1029 | reg = <0 0x1000b000 0 0x1000>; | ||
1030 | mediatek,pctl-regmap = <&syscfg_pctl_a>; | ||
1031 | @@ -567,7 +567,7 @@ | ||
1032 | status = "disabled"; | ||
1033 | }; | ||
1034 | |||
1035 | - gic: interrupt-controller@10220000 { | ||
1036 | + gic: interrupt-controller@10221000 { | ||
1037 | compatible = "arm,gic-400"; | ||
1038 | #interrupt-cells = <3>; | ||
1039 | interrupt-parent = <&gic>; | ||
1040 | diff --git a/arch/arm64/boot/dts/nvidia/tegra194-p2888.dtsi b/arch/arm64/boot/dts/nvidia/tegra194-p2888.dtsi | ||
1041 | index 02909a48dfcd..7899759a12f8 100644 | ||
1042 | --- a/arch/arm64/boot/dts/nvidia/tegra194-p2888.dtsi | ||
1043 | +++ b/arch/arm64/boot/dts/nvidia/tegra194-p2888.dtsi | ||
1044 | @@ -32,7 +32,7 @@ | ||
1045 | |||
1046 | phy-reset-gpios = <&gpio TEGRA194_MAIN_GPIO(G, 5) GPIO_ACTIVE_LOW>; | ||
1047 | phy-handle = <&phy>; | ||
1048 | - phy-mode = "rgmii"; | ||
1049 | + phy-mode = "rgmii-id"; | ||
1050 | |||
1051 | mdio { | ||
1052 | #address-cells = <1>; | ||
1053 | diff --git a/arch/arm64/boot/dts/nvidia/tegra194.dtsi b/arch/arm64/boot/dts/nvidia/tegra194.dtsi | ||
1054 | index 457b815d57f4..2f3926719434 100644 | ||
1055 | --- a/arch/arm64/boot/dts/nvidia/tegra194.dtsi | ||
1056 | +++ b/arch/arm64/boot/dts/nvidia/tegra194.dtsi | ||
1057 | @@ -1192,7 +1192,7 @@ | ||
1058 | |||
1059 | bus-range = <0x0 0xff>; | ||
1060 | ranges = <0x81000000 0x0 0x30100000 0x0 0x30100000 0x0 0x00100000 /* downstream I/O (1MB) */ | ||
1061 | - 0xc2000000 0x12 0x00000000 0x12 0x00000000 0x0 0x30000000 /* prefetchable memory (768MB) */ | ||
1062 | + 0xc3000000 0x12 0x00000000 0x12 0x00000000 0x0 0x30000000 /* prefetchable memory (768MB) */ | ||
1063 | 0x82000000 0x0 0x40000000 0x12 0x30000000 0x0 0x10000000>; /* non-prefetchable memory (256MB) */ | ||
1064 | }; | ||
1065 | |||
1066 | @@ -1238,7 +1238,7 @@ | ||
1067 | |||
1068 | bus-range = <0x0 0xff>; | ||
1069 | ranges = <0x81000000 0x0 0x32100000 0x0 0x32100000 0x0 0x00100000 /* downstream I/O (1MB) */ | ||
1070 | - 0xc2000000 0x12 0x40000000 0x12 0x40000000 0x0 0x30000000 /* prefetchable memory (768MB) */ | ||
1071 | + 0xc3000000 0x12 0x40000000 0x12 0x40000000 0x0 0x30000000 /* prefetchable memory (768MB) */ | ||
1072 | 0x82000000 0x0 0x40000000 0x12 0x70000000 0x0 0x10000000>; /* non-prefetchable memory (256MB) */ | ||
1073 | }; | ||
1074 | |||
1075 | @@ -1284,7 +1284,7 @@ | ||
1076 | |||
1077 | bus-range = <0x0 0xff>; | ||
1078 | ranges = <0x81000000 0x0 0x34100000 0x0 0x34100000 0x0 0x00100000 /* downstream I/O (1MB) */ | ||
1079 | - 0xc2000000 0x12 0x80000000 0x12 0x80000000 0x0 0x30000000 /* prefetchable memory (768MB) */ | ||
1080 | + 0xc3000000 0x12 0x80000000 0x12 0x80000000 0x0 0x30000000 /* prefetchable memory (768MB) */ | ||
1081 | 0x82000000 0x0 0x40000000 0x12 0xb0000000 0x0 0x10000000>; /* non-prefetchable memory (256MB) */ | ||
1082 | }; | ||
1083 | |||
1084 | @@ -1330,7 +1330,7 @@ | ||
1085 | |||
1086 | bus-range = <0x0 0xff>; | ||
1087 | ranges = <0x81000000 0x0 0x36100000 0x0 0x36100000 0x0 0x00100000 /* downstream I/O (1MB) */ | ||
1088 | - 0xc2000000 0x14 0x00000000 0x14 0x00000000 0x3 0x40000000 /* prefetchable memory (13GB) */ | ||
1089 | + 0xc3000000 0x14 0x00000000 0x14 0x00000000 0x3 0x40000000 /* prefetchable memory (13GB) */ | ||
1090 | 0x82000000 0x0 0x40000000 0x17 0x40000000 0x0 0xc0000000>; /* non-prefetchable memory (3GB) */ | ||
1091 | }; | ||
1092 | |||
1093 | @@ -1376,7 +1376,7 @@ | ||
1094 | |||
1095 | bus-range = <0x0 0xff>; | ||
1096 | ranges = <0x81000000 0x0 0x38100000 0x0 0x38100000 0x0 0x00100000 /* downstream I/O (1MB) */ | ||
1097 | - 0xc2000000 0x18 0x00000000 0x18 0x00000000 0x3 0x40000000 /* prefetchable memory (13GB) */ | ||
1098 | + 0xc3000000 0x18 0x00000000 0x18 0x00000000 0x3 0x40000000 /* prefetchable memory (13GB) */ | ||
1099 | 0x82000000 0x0 0x40000000 0x1b 0x40000000 0x0 0xc0000000>; /* non-prefetchable memory (3GB) */ | ||
1100 | }; | ||
1101 | |||
1102 | @@ -1426,7 +1426,7 @@ | ||
1103 | |||
1104 | bus-range = <0x0 0xff>; | ||
1105 | ranges = <0x81000000 0x0 0x3a100000 0x0 0x3a100000 0x0 0x00100000 /* downstream I/O (1MB) */ | ||
1106 | - 0xc2000000 0x1c 0x00000000 0x1c 0x00000000 0x3 0x40000000 /* prefetchable memory (13GB) */ | ||
1107 | + 0xc3000000 0x1c 0x00000000 0x1c 0x00000000 0x3 0x40000000 /* prefetchable memory (13GB) */ | ||
1108 | 0x82000000 0x0 0x40000000 0x1f 0x40000000 0x0 0xc0000000>; /* non-prefetchable memory (3GB) */ | ||
1109 | }; | ||
1110 | |||
1111 | diff --git a/arch/arm64/boot/dts/qcom/msm8916.dtsi b/arch/arm64/boot/dts/qcom/msm8916.dtsi | ||
1112 | index 5ea9fb8f2f87..340da154d4e3 100644 | ||
1113 | --- a/arch/arm64/boot/dts/qcom/msm8916.dtsi | ||
1114 | +++ b/arch/arm64/boot/dts/qcom/msm8916.dtsi | ||
1115 | @@ -212,7 +212,7 @@ | ||
1116 | thermal-sensors = <&tsens 3>; | ||
1117 | |||
1118 | trips { | ||
1119 | - cpu2_3_alert0: trip-point@0 { | ||
1120 | + cpu2_3_alert0: trip-point0 { | ||
1121 | temperature = <75000>; | ||
1122 | hysteresis = <2000>; | ||
1123 | type = "passive"; | ||
1124 | @@ -242,7 +242,7 @@ | ||
1125 | thermal-sensors = <&tsens 2>; | ||
1126 | |||
1127 | trips { | ||
1128 | - gpu_alert0: trip-point@0 { | ||
1129 | + gpu_alert0: trip-point0 { | ||
1130 | temperature = <75000>; | ||
1131 | hysteresis = <2000>; | ||
1132 | type = "passive"; | ||
1133 | @@ -262,7 +262,7 @@ | ||
1134 | thermal-sensors = <&tsens 1>; | ||
1135 | |||
1136 | trips { | ||
1137 | - cam_alert0: trip-point@0 { | ||
1138 | + cam_alert0: trip-point0 { | ||
1139 | temperature = <75000>; | ||
1140 | hysteresis = <2000>; | ||
1141 | type = "hot"; | ||
1142 | @@ -277,7 +277,7 @@ | ||
1143 | thermal-sensors = <&tsens 0>; | ||
1144 | |||
1145 | trips { | ||
1146 | - modem_alert0: trip-point@0 { | ||
1147 | + modem_alert0: trip-point0 { | ||
1148 | temperature = <85000>; | ||
1149 | hysteresis = <2000>; | ||
1150 | type = "hot"; | ||
1151 | diff --git a/arch/arm64/boot/dts/qcom/msm8996.dtsi b/arch/arm64/boot/dts/qcom/msm8996.dtsi | ||
1152 | index fbb8ce78f95b..d303df3887d9 100644 | ||
1153 | --- a/arch/arm64/boot/dts/qcom/msm8996.dtsi | ||
1154 | +++ b/arch/arm64/boot/dts/qcom/msm8996.dtsi | ||
1155 | @@ -1681,16 +1681,16 @@ | ||
1156 | "csi_clk_mux", | ||
1157 | "vfe0", | ||
1158 | "vfe1"; | ||
1159 | - interrupts = <GIC_SPI 78 0>, | ||
1160 | - <GIC_SPI 79 0>, | ||
1161 | - <GIC_SPI 80 0>, | ||
1162 | - <GIC_SPI 296 0>, | ||
1163 | - <GIC_SPI 297 0>, | ||
1164 | - <GIC_SPI 298 0>, | ||
1165 | - <GIC_SPI 299 0>, | ||
1166 | - <GIC_SPI 309 0>, | ||
1167 | - <GIC_SPI 314 0>, | ||
1168 | - <GIC_SPI 315 0>; | ||
1169 | + interrupts = <GIC_SPI 78 IRQ_TYPE_EDGE_RISING>, | ||
1170 | + <GIC_SPI 79 IRQ_TYPE_EDGE_RISING>, | ||
1171 | + <GIC_SPI 80 IRQ_TYPE_EDGE_RISING>, | ||
1172 | + <GIC_SPI 296 IRQ_TYPE_EDGE_RISING>, | ||
1173 | + <GIC_SPI 297 IRQ_TYPE_EDGE_RISING>, | ||
1174 | + <GIC_SPI 298 IRQ_TYPE_EDGE_RISING>, | ||
1175 | + <GIC_SPI 299 IRQ_TYPE_EDGE_RISING>, | ||
1176 | + <GIC_SPI 309 IRQ_TYPE_EDGE_RISING>, | ||
1177 | + <GIC_SPI 314 IRQ_TYPE_EDGE_RISING>, | ||
1178 | + <GIC_SPI 315 IRQ_TYPE_EDGE_RISING>; | ||
1179 | interrupt-names = "csiphy0", | ||
1180 | "csiphy1", | ||
1181 | "csiphy2", | ||
1182 | diff --git a/arch/arm64/boot/dts/qcom/pm8150.dtsi b/arch/arm64/boot/dts/qcom/pm8150.dtsi | ||
1183 | index b6e304748a57..c0b197458665 100644 | ||
1184 | --- a/arch/arm64/boot/dts/qcom/pm8150.dtsi | ||
1185 | +++ b/arch/arm64/boot/dts/qcom/pm8150.dtsi | ||
1186 | @@ -73,18 +73,8 @@ | ||
1187 | reg = <0xc000>; | ||
1188 | gpio-controller; | ||
1189 | #gpio-cells = <2>; | ||
1190 | - interrupts = <0x0 0xc0 0x0 IRQ_TYPE_NONE>, | ||
1191 | - <0x0 0xc1 0x0 IRQ_TYPE_NONE>, | ||
1192 | - <0x0 0xc2 0x0 IRQ_TYPE_NONE>, | ||
1193 | - <0x0 0xc3 0x0 IRQ_TYPE_NONE>, | ||
1194 | - <0x0 0xc4 0x0 IRQ_TYPE_NONE>, | ||
1195 | - <0x0 0xc5 0x0 IRQ_TYPE_NONE>, | ||
1196 | - <0x0 0xc6 0x0 IRQ_TYPE_NONE>, | ||
1197 | - <0x0 0xc7 0x0 IRQ_TYPE_NONE>, | ||
1198 | - <0x0 0xc8 0x0 IRQ_TYPE_NONE>, | ||
1199 | - <0x0 0xc9 0x0 IRQ_TYPE_NONE>, | ||
1200 | - <0x0 0xca 0x0 IRQ_TYPE_NONE>, | ||
1201 | - <0x0 0xcb 0x0 IRQ_TYPE_NONE>; | ||
1202 | + interrupt-controller; | ||
1203 | + #interrupt-cells = <2>; | ||
1204 | }; | ||
1205 | }; | ||
1206 | |||
1207 | diff --git a/arch/arm64/boot/dts/qcom/pm8150b.dtsi b/arch/arm64/boot/dts/qcom/pm8150b.dtsi | ||
1208 | index 322379d5c31f..40b5d75a4a1d 100644 | ||
1209 | --- a/arch/arm64/boot/dts/qcom/pm8150b.dtsi | ||
1210 | +++ b/arch/arm64/boot/dts/qcom/pm8150b.dtsi | ||
1211 | @@ -62,18 +62,8 @@ | ||
1212 | reg = <0xc000>; | ||
1213 | gpio-controller; | ||
1214 | #gpio-cells = <2>; | ||
1215 | - interrupts = <0x2 0xc0 0x0 IRQ_TYPE_NONE>, | ||
1216 | - <0x2 0xc1 0x0 IRQ_TYPE_NONE>, | ||
1217 | - <0x2 0xc2 0x0 IRQ_TYPE_NONE>, | ||
1218 | - <0x2 0xc3 0x0 IRQ_TYPE_NONE>, | ||
1219 | - <0x2 0xc4 0x0 IRQ_TYPE_NONE>, | ||
1220 | - <0x2 0xc5 0x0 IRQ_TYPE_NONE>, | ||
1221 | - <0x2 0xc6 0x0 IRQ_TYPE_NONE>, | ||
1222 | - <0x2 0xc7 0x0 IRQ_TYPE_NONE>, | ||
1223 | - <0x2 0xc8 0x0 IRQ_TYPE_NONE>, | ||
1224 | - <0x2 0xc9 0x0 IRQ_TYPE_NONE>, | ||
1225 | - <0x2 0xca 0x0 IRQ_TYPE_NONE>, | ||
1226 | - <0x2 0xcb 0x0 IRQ_TYPE_NONE>; | ||
1227 | + interrupt-controller; | ||
1228 | + #interrupt-cells = <2>; | ||
1229 | }; | ||
1230 | }; | ||
1231 | |||
1232 | diff --git a/arch/arm64/boot/dts/qcom/pm8150l.dtsi b/arch/arm64/boot/dts/qcom/pm8150l.dtsi | ||
1233 | index eb0e9a090e42..cf05e0685d10 100644 | ||
1234 | --- a/arch/arm64/boot/dts/qcom/pm8150l.dtsi | ||
1235 | +++ b/arch/arm64/boot/dts/qcom/pm8150l.dtsi | ||
1236 | @@ -56,18 +56,8 @@ | ||
1237 | reg = <0xc000>; | ||
1238 | gpio-controller; | ||
1239 | #gpio-cells = <2>; | ||
1240 | - interrupts = <0x4 0xc0 0x0 IRQ_TYPE_NONE>, | ||
1241 | - <0x4 0xc1 0x0 IRQ_TYPE_NONE>, | ||
1242 | - <0x4 0xc2 0x0 IRQ_TYPE_NONE>, | ||
1243 | - <0x4 0xc3 0x0 IRQ_TYPE_NONE>, | ||
1244 | - <0x4 0xc4 0x0 IRQ_TYPE_NONE>, | ||
1245 | - <0x4 0xc5 0x0 IRQ_TYPE_NONE>, | ||
1246 | - <0x4 0xc6 0x0 IRQ_TYPE_NONE>, | ||
1247 | - <0x4 0xc7 0x0 IRQ_TYPE_NONE>, | ||
1248 | - <0x4 0xc8 0x0 IRQ_TYPE_NONE>, | ||
1249 | - <0x4 0xc9 0x0 IRQ_TYPE_NONE>, | ||
1250 | - <0x4 0xca 0x0 IRQ_TYPE_NONE>, | ||
1251 | - <0x4 0xcb 0x0 IRQ_TYPE_NONE>; | ||
1252 | + interrupt-controller; | ||
1253 | + #interrupt-cells = <2>; | ||
1254 | }; | ||
1255 | }; | ||
1256 | |||
1257 | diff --git a/arch/arm64/kernel/hw_breakpoint.c b/arch/arm64/kernel/hw_breakpoint.c | ||
1258 | index 38ee1514cd9c..b4a160795824 100644 | ||
1259 | --- a/arch/arm64/kernel/hw_breakpoint.c | ||
1260 | +++ b/arch/arm64/kernel/hw_breakpoint.c | ||
1261 | @@ -730,6 +730,27 @@ static u64 get_distance_from_watchpoint(unsigned long addr, u64 val, | ||
1262 | return 0; | ||
1263 | } | ||
1264 | |||
1265 | +static int watchpoint_report(struct perf_event *wp, unsigned long addr, | ||
1266 | + struct pt_regs *regs) | ||
1267 | +{ | ||
1268 | + int step = is_default_overflow_handler(wp); | ||
1269 | + struct arch_hw_breakpoint *info = counter_arch_bp(wp); | ||
1270 | + | ||
1271 | + info->trigger = addr; | ||
1272 | + | ||
1273 | + /* | ||
1274 | + * If we triggered a user watchpoint from a uaccess routine, then | ||
1275 | + * handle the stepping ourselves since userspace really can't help | ||
1276 | + * us with this. | ||
1277 | + */ | ||
1278 | + if (!user_mode(regs) && info->ctrl.privilege == AARCH64_BREAKPOINT_EL0) | ||
1279 | + step = 1; | ||
1280 | + else | ||
1281 | + perf_bp_event(wp, regs); | ||
1282 | + | ||
1283 | + return step; | ||
1284 | +} | ||
1285 | + | ||
1286 | static int watchpoint_handler(unsigned long addr, unsigned int esr, | ||
1287 | struct pt_regs *regs) | ||
1288 | { | ||
1289 | @@ -739,7 +760,6 @@ static int watchpoint_handler(unsigned long addr, unsigned int esr, | ||
1290 | u64 val; | ||
1291 | struct perf_event *wp, **slots; | ||
1292 | struct debug_info *debug_info; | ||
1293 | - struct arch_hw_breakpoint *info; | ||
1294 | struct arch_hw_breakpoint_ctrl ctrl; | ||
1295 | |||
1296 | slots = this_cpu_ptr(wp_on_reg); | ||
1297 | @@ -777,25 +797,13 @@ static int watchpoint_handler(unsigned long addr, unsigned int esr, | ||
1298 | if (dist != 0) | ||
1299 | continue; | ||
1300 | |||
1301 | - info = counter_arch_bp(wp); | ||
1302 | - info->trigger = addr; | ||
1303 | - perf_bp_event(wp, regs); | ||
1304 | - | ||
1305 | - /* Do we need to handle the stepping? */ | ||
1306 | - if (is_default_overflow_handler(wp)) | ||
1307 | - step = 1; | ||
1308 | + step = watchpoint_report(wp, addr, regs); | ||
1309 | } | ||
1310 | - if (min_dist > 0 && min_dist != -1) { | ||
1311 | - /* No exact match found. */ | ||
1312 | - wp = slots[closest_match]; | ||
1313 | - info = counter_arch_bp(wp); | ||
1314 | - info->trigger = addr; | ||
1315 | - perf_bp_event(wp, regs); | ||
1316 | |||
1317 | - /* Do we need to handle the stepping? */ | ||
1318 | - if (is_default_overflow_handler(wp)) | ||
1319 | - step = 1; | ||
1320 | - } | ||
1321 | + /* No exact match found? */ | ||
1322 | + if (min_dist > 0 && min_dist != -1) | ||
1323 | + step = watchpoint_report(slots[closest_match], addr, regs); | ||
1324 | + | ||
1325 | rcu_read_unlock(); | ||
1326 | |||
1327 | if (!step) | ||
1328 | diff --git a/arch/m68k/coldfire/pci.c b/arch/m68k/coldfire/pci.c | ||
1329 | index 62b0eb6cf69a..84eab0f5e00a 100644 | ||
1330 | --- a/arch/m68k/coldfire/pci.c | ||
1331 | +++ b/arch/m68k/coldfire/pci.c | ||
1332 | @@ -216,8 +216,10 @@ static int __init mcf_pci_init(void) | ||
1333 | |||
1334 | /* Keep a virtual mapping to IO/config space active */ | ||
1335 | iospace = (unsigned long) ioremap(PCI_IO_PA, PCI_IO_SIZE); | ||
1336 | - if (iospace == 0) | ||
1337 | + if (iospace == 0) { | ||
1338 | + pci_free_host_bridge(bridge); | ||
1339 | return -ENODEV; | ||
1340 | + } | ||
1341 | pr_info("Coldfire: PCI IO/config window mapped to 0x%x\n", | ||
1342 | (u32) iospace); | ||
1343 | |||
1344 | diff --git a/arch/openrisc/kernel/entry.S b/arch/openrisc/kernel/entry.S | ||
1345 | index e4a78571f883..c6481cfc5220 100644 | ||
1346 | --- a/arch/openrisc/kernel/entry.S | ||
1347 | +++ b/arch/openrisc/kernel/entry.S | ||
1348 | @@ -1166,13 +1166,13 @@ ENTRY(__sys_clone) | ||
1349 | l.movhi r29,hi(sys_clone) | ||
1350 | l.ori r29,r29,lo(sys_clone) | ||
1351 | l.j _fork_save_extra_regs_and_call | ||
1352 | - l.addi r7,r1,0 | ||
1353 | + l.nop | ||
1354 | |||
1355 | ENTRY(__sys_fork) | ||
1356 | l.movhi r29,hi(sys_fork) | ||
1357 | l.ori r29,r29,lo(sys_fork) | ||
1358 | l.j _fork_save_extra_regs_and_call | ||
1359 | - l.addi r3,r1,0 | ||
1360 | + l.nop | ||
1361 | |||
1362 | ENTRY(sys_rt_sigreturn) | ||
1363 | l.jal _sys_rt_sigreturn | ||
1364 | diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig | ||
1365 | index 44431dc06982..ad620637cbd1 100644 | ||
1366 | --- a/arch/powerpc/Kconfig | ||
1367 | +++ b/arch/powerpc/Kconfig | ||
1368 | @@ -747,6 +747,7 @@ config THREAD_SHIFT | ||
1369 | range 13 15 | ||
1370 | default "15" if PPC_256K_PAGES | ||
1371 | default "14" if PPC64 | ||
1372 | + default "14" if KASAN | ||
1373 | default "13" | ||
1374 | help | ||
1375 | Used to define the stack size. The default is almost always what you | ||
1376 | diff --git a/arch/powerpc/include/asm/book3s/64/pgtable.h b/arch/powerpc/include/asm/book3s/64/pgtable.h | ||
1377 | index a143d394ff46..e1eb8aa9cfbb 100644 | ||
1378 | --- a/arch/powerpc/include/asm/book3s/64/pgtable.h | ||
1379 | +++ b/arch/powerpc/include/asm/book3s/64/pgtable.h | ||
1380 | @@ -998,10 +998,25 @@ extern struct page *pgd_page(pgd_t pgd); | ||
1381 | #define pud_page_vaddr(pud) __va(pud_val(pud) & ~PUD_MASKED_BITS) | ||
1382 | #define pgd_page_vaddr(pgd) __va(pgd_val(pgd) & ~PGD_MASKED_BITS) | ||
1383 | |||
1384 | -#define pgd_index(address) (((address) >> (PGDIR_SHIFT)) & (PTRS_PER_PGD - 1)) | ||
1385 | -#define pud_index(address) (((address) >> (PUD_SHIFT)) & (PTRS_PER_PUD - 1)) | ||
1386 | -#define pmd_index(address) (((address) >> (PMD_SHIFT)) & (PTRS_PER_PMD - 1)) | ||
1387 | -#define pte_index(address) (((address) >> (PAGE_SHIFT)) & (PTRS_PER_PTE - 1)) | ||
1388 | +static inline unsigned long pgd_index(unsigned long address) | ||
1389 | +{ | ||
1390 | + return (address >> PGDIR_SHIFT) & (PTRS_PER_PGD - 1); | ||
1391 | +} | ||
1392 | + | ||
1393 | +static inline unsigned long pud_index(unsigned long address) | ||
1394 | +{ | ||
1395 | + return (address >> PUD_SHIFT) & (PTRS_PER_PUD - 1); | ||
1396 | +} | ||
1397 | + | ||
1398 | +static inline unsigned long pmd_index(unsigned long address) | ||
1399 | +{ | ||
1400 | + return (address >> PMD_SHIFT) & (PTRS_PER_PMD - 1); | ||
1401 | +} | ||
1402 | + | ||
1403 | +static inline unsigned long pte_index(unsigned long address) | ||
1404 | +{ | ||
1405 | + return (address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1); | ||
1406 | +} | ||
1407 | |||
1408 | /* | ||
1409 | * Find an entry in a page-table-directory. We combine the address region | ||
1410 | diff --git a/arch/powerpc/include/asm/processor.h b/arch/powerpc/include/asm/processor.h | ||
1411 | index a9993e7a443b..64b998db9d3e 100644 | ||
1412 | --- a/arch/powerpc/include/asm/processor.h | ||
1413 | +++ b/arch/powerpc/include/asm/processor.h | ||
1414 | @@ -291,7 +291,6 @@ struct thread_struct { | ||
1415 | #else | ||
1416 | #define INIT_THREAD { \ | ||
1417 | .ksp = INIT_SP, \ | ||
1418 | - .regs = (struct pt_regs *)INIT_SP - 1, /* XXX bogus, I think */ \ | ||
1419 | .addr_limit = KERNEL_DS, \ | ||
1420 | .fpexc_mode = 0, \ | ||
1421 | .fscr = FSCR_TAR | FSCR_EBB \ | ||
1422 | diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S | ||
1423 | index d0018dd17e0a..70ac8a6ba0c1 100644 | ||
1424 | --- a/arch/powerpc/kernel/exceptions-64s.S | ||
1425 | +++ b/arch/powerpc/kernel/exceptions-64s.S | ||
1426 | @@ -1090,17 +1090,19 @@ EXC_COMMON_BEGIN(machine_check_idle_common) | ||
1427 | bl machine_check_queue_event | ||
1428 | |||
1429 | /* | ||
1430 | - * We have not used any non-volatile GPRs here, and as a rule | ||
1431 | - * most exception code including machine check does not. | ||
1432 | - * Therefore PACA_NAPSTATELOST does not need to be set. Idle | ||
1433 | - * wakeup will restore volatile registers. | ||
1434 | + * GPR-loss wakeups are relatively straightforward, because the | ||
1435 | + * idle sleep code has saved all non-volatile registers on its | ||
1436 | + * own stack, and r1 in PACAR1. | ||
1437 | * | ||
1438 | - * Load the original SRR1 into r3 for pnv_powersave_wakeup_mce. | ||
1439 | + * For no-loss wakeups the r1 and lr registers used by the | ||
1440 | + * early machine check handler have to be restored first. r2 is | ||
1441 | + * the kernel TOC, so no need to restore it. | ||
1442 | * | ||
1443 | * Then decrement MCE nesting after finishing with the stack. | ||
1444 | */ | ||
1445 | ld r3,_MSR(r1) | ||
1446 | ld r4,_LINK(r1) | ||
1447 | + ld r1,GPR1(r1) | ||
1448 | |||
1449 | lhz r11,PACA_IN_MCE(r13) | ||
1450 | subi r11,r11,1 | ||
1451 | @@ -1109,7 +1111,7 @@ EXC_COMMON_BEGIN(machine_check_idle_common) | ||
1452 | mtlr r4 | ||
1453 | rlwinm r10,r3,47-31,30,31 | ||
1454 | cmpwi cr1,r10,2 | ||
1455 | - bltlr cr1 /* no state loss, return to idle caller */ | ||
1456 | + bltlr cr1 /* no state loss, return to idle caller with r3=SRR1 */ | ||
1457 | b idle_return_gpr_loss | ||
1458 | #endif | ||
1459 | |||
1460 | diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S | ||
1461 | index ad79fddb974d..780f527eabd2 100644 | ||
1462 | --- a/arch/powerpc/kernel/head_64.S | ||
1463 | +++ b/arch/powerpc/kernel/head_64.S | ||
1464 | @@ -945,15 +945,8 @@ start_here_multiplatform: | ||
1465 | std r0,0(r4) | ||
1466 | #endif | ||
1467 | |||
1468 | - /* The following gets the stack set up with the regs */ | ||
1469 | - /* pointing to the real addr of the kernel stack. This is */ | ||
1470 | - /* all done to support the C function call below which sets */ | ||
1471 | - /* up the htab. This is done because we have relocated the */ | ||
1472 | - /* kernel but are still running in real mode. */ | ||
1473 | - | ||
1474 | - LOAD_REG_ADDR(r3,init_thread_union) | ||
1475 | - | ||
1476 | /* set up a stack pointer */ | ||
1477 | + LOAD_REG_ADDR(r3,init_thread_union) | ||
1478 | LOAD_REG_IMMEDIATE(r1,THREAD_SIZE) | ||
1479 | add r1,r3,r1 | ||
1480 | li r0,0 | ||
1481 | diff --git a/arch/powerpc/kernel/machine_kexec.c b/arch/powerpc/kernel/machine_kexec.c | ||
1482 | index c4ed328a7b96..7a1c11a7cba5 100644 | ||
1483 | --- a/arch/powerpc/kernel/machine_kexec.c | ||
1484 | +++ b/arch/powerpc/kernel/machine_kexec.c | ||
1485 | @@ -114,11 +114,12 @@ void machine_kexec(struct kimage *image) | ||
1486 | |||
1487 | void __init reserve_crashkernel(void) | ||
1488 | { | ||
1489 | - unsigned long long crash_size, crash_base; | ||
1490 | + unsigned long long crash_size, crash_base, total_mem_sz; | ||
1491 | int ret; | ||
1492 | |||
1493 | + total_mem_sz = memory_limit ? memory_limit : memblock_phys_mem_size(); | ||
1494 | /* use common parsing */ | ||
1495 | - ret = parse_crashkernel(boot_command_line, memblock_phys_mem_size(), | ||
1496 | + ret = parse_crashkernel(boot_command_line, total_mem_sz, | ||
1497 | &crash_size, &crash_base); | ||
1498 | if (ret == 0 && crash_size > 0) { | ||
1499 | crashk_res.start = crash_base; | ||
1500 | @@ -177,6 +178,7 @@ void __init reserve_crashkernel(void) | ||
1501 | /* Crash kernel trumps memory limit */ | ||
1502 | if (memory_limit && memory_limit <= crashk_res.end) { | ||
1503 | memory_limit = crashk_res.end + 1; | ||
1504 | + total_mem_sz = memory_limit; | ||
1505 | printk("Adjusted memory limit for crashkernel, now 0x%llx\n", | ||
1506 | memory_limit); | ||
1507 | } | ||
1508 | @@ -185,7 +187,7 @@ void __init reserve_crashkernel(void) | ||
1509 | "for crashkernel (System RAM: %ldMB)\n", | ||
1510 | (unsigned long)(crash_size >> 20), | ||
1511 | (unsigned long)(crashk_res.start >> 20), | ||
1512 | - (unsigned long)(memblock_phys_mem_size() >> 20)); | ||
1513 | + (unsigned long)(total_mem_sz >> 20)); | ||
1514 | |||
1515 | if (!memblock_is_region_memory(crashk_res.start, crash_size) || | ||
1516 | memblock_reserve(crashk_res.start, crash_size)) { | ||
1517 | diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c | ||
1518 | index 639ceae7da9d..bd0c258a1d5d 100644 | ||
1519 | --- a/arch/powerpc/kernel/process.c | ||
1520 | +++ b/arch/powerpc/kernel/process.c | ||
1521 | @@ -1218,29 +1218,31 @@ struct task_struct *__switch_to(struct task_struct *prev, | ||
1522 | static void show_instructions(struct pt_regs *regs) | ||
1523 | { | ||
1524 | int i; | ||
1525 | + unsigned long nip = regs->nip; | ||
1526 | unsigned long pc = regs->nip - (NR_INSN_TO_PRINT * 3 / 4 * sizeof(int)); | ||
1527 | |||
1528 | printk("Instruction dump:"); | ||
1529 | |||
1530 | + /* | ||
1531 | + * If we were executing with the MMU off for instructions, adjust pc | ||
1532 | + * rather than printing XXXXXXXX. | ||
1533 | + */ | ||
1534 | + if (!IS_ENABLED(CONFIG_BOOKE) && !(regs->msr & MSR_IR)) { | ||
1535 | + pc = (unsigned long)phys_to_virt(pc); | ||
1536 | + nip = (unsigned long)phys_to_virt(regs->nip); | ||
1537 | + } | ||
1538 | + | ||
1539 | for (i = 0; i < NR_INSN_TO_PRINT; i++) { | ||
1540 | int instr; | ||
1541 | |||
1542 | if (!(i % 8)) | ||
1543 | pr_cont("\n"); | ||
1544 | |||
1545 | -#if !defined(CONFIG_BOOKE) | ||
1546 | - /* If executing with the IMMU off, adjust pc rather | ||
1547 | - * than print XXXXXXXX. | ||
1548 | - */ | ||
1549 | - if (!(regs->msr & MSR_IR)) | ||
1550 | - pc = (unsigned long)phys_to_virt(pc); | ||
1551 | -#endif | ||
1552 | - | ||
1553 | if (!__kernel_text_address(pc) || | ||
1554 | probe_kernel_address((const void *)pc, instr)) { | ||
1555 | pr_cont("XXXXXXXX "); | ||
1556 | } else { | ||
1557 | - if (regs->nip == pc) | ||
1558 | + if (nip == pc) | ||
1559 | pr_cont("<%08x> ", instr); | ||
1560 | else | ||
1561 | pr_cont("%08x ", instr); | ||
1562 | diff --git a/arch/powerpc/kvm/book3s_64_mmu_radix.c b/arch/powerpc/kvm/book3s_64_mmu_radix.c | ||
1563 | index 2d415c36a61d..43b56f8f6beb 100644 | ||
1564 | --- a/arch/powerpc/kvm/book3s_64_mmu_radix.c | ||
1565 | +++ b/arch/powerpc/kvm/book3s_64_mmu_radix.c | ||
1566 | @@ -353,7 +353,13 @@ static struct kmem_cache *kvm_pmd_cache; | ||
1567 | |||
1568 | static pte_t *kvmppc_pte_alloc(void) | ||
1569 | { | ||
1570 | - return kmem_cache_alloc(kvm_pte_cache, GFP_KERNEL); | ||
1571 | + pte_t *pte; | ||
1572 | + | ||
1573 | + pte = kmem_cache_alloc(kvm_pte_cache, GFP_KERNEL); | ||
1574 | + /* pmd_populate() will only reference _pa(pte). */ | ||
1575 | + kmemleak_ignore(pte); | ||
1576 | + | ||
1577 | + return pte; | ||
1578 | } | ||
1579 | |||
1580 | static void kvmppc_pte_free(pte_t *ptep) | ||
1581 | @@ -363,7 +369,13 @@ static void kvmppc_pte_free(pte_t *ptep) | ||
1582 | |||
1583 | static pmd_t *kvmppc_pmd_alloc(void) | ||
1584 | { | ||
1585 | - return kmem_cache_alloc(kvm_pmd_cache, GFP_KERNEL); | ||
1586 | + pmd_t *pmd; | ||
1587 | + | ||
1588 | + pmd = kmem_cache_alloc(kvm_pmd_cache, GFP_KERNEL); | ||
1589 | + /* pud_populate() will only reference _pa(pmd). */ | ||
1590 | + kmemleak_ignore(pmd); | ||
1591 | + | ||
1592 | + return pmd; | ||
1593 | } | ||
1594 | |||
1595 | static void kvmppc_pmd_free(pmd_t *pmdp) | ||
1596 | diff --git a/arch/powerpc/kvm/book3s_64_vio.c b/arch/powerpc/kvm/book3s_64_vio.c | ||
1597 | index 5834db0a54c6..03b947429e4d 100644 | ||
1598 | --- a/arch/powerpc/kvm/book3s_64_vio.c | ||
1599 | +++ b/arch/powerpc/kvm/book3s_64_vio.c | ||
1600 | @@ -74,6 +74,7 @@ extern void kvm_spapr_tce_release_iommu_group(struct kvm *kvm, | ||
1601 | struct kvmppc_spapr_tce_iommu_table *stit, *tmp; | ||
1602 | struct iommu_table_group *table_group = NULL; | ||
1603 | |||
1604 | + rcu_read_lock(); | ||
1605 | list_for_each_entry_rcu(stt, &kvm->arch.spapr_tce_tables, list) { | ||
1606 | |||
1607 | table_group = iommu_group_get_iommudata(grp); | ||
1608 | @@ -88,7 +89,9 @@ extern void kvm_spapr_tce_release_iommu_group(struct kvm *kvm, | ||
1609 | kref_put(&stit->kref, kvm_spapr_tce_liobn_put); | ||
1610 | } | ||
1611 | } | ||
1612 | + cond_resched_rcu(); | ||
1613 | } | ||
1614 | + rcu_read_unlock(); | ||
1615 | } | ||
1616 | |||
1617 | extern long kvm_spapr_tce_attach_iommu_group(struct kvm *kvm, int tablefd, | ||
1618 | @@ -106,12 +109,14 @@ extern long kvm_spapr_tce_attach_iommu_group(struct kvm *kvm, int tablefd, | ||
1619 | if (!f.file) | ||
1620 | return -EBADF; | ||
1621 | |||
1622 | + rcu_read_lock(); | ||
1623 | list_for_each_entry_rcu(stt, &kvm->arch.spapr_tce_tables, list) { | ||
1624 | if (stt == f.file->private_data) { | ||
1625 | found = true; | ||
1626 | break; | ||
1627 | } | ||
1628 | } | ||
1629 | + rcu_read_unlock(); | ||
1630 | |||
1631 | fdput(f); | ||
1632 | |||
1633 | @@ -144,6 +149,7 @@ extern long kvm_spapr_tce_attach_iommu_group(struct kvm *kvm, int tablefd, | ||
1634 | if (!tbl) | ||
1635 | return -EINVAL; | ||
1636 | |||
1637 | + rcu_read_lock(); | ||
1638 | list_for_each_entry_rcu(stit, &stt->iommu_tables, next) { | ||
1639 | if (tbl != stit->tbl) | ||
1640 | continue; | ||
1641 | @@ -151,14 +157,17 @@ extern long kvm_spapr_tce_attach_iommu_group(struct kvm *kvm, int tablefd, | ||
1642 | if (!kref_get_unless_zero(&stit->kref)) { | ||
1643 | /* stit is being destroyed */ | ||
1644 | iommu_tce_table_put(tbl); | ||
1645 | + rcu_read_unlock(); | ||
1646 | return -ENOTTY; | ||
1647 | } | ||
1648 | /* | ||
1649 | * The table is already known to this KVM, we just increased | ||
1650 | * its KVM reference counter and can return. | ||
1651 | */ | ||
1652 | + rcu_read_unlock(); | ||
1653 | return 0; | ||
1654 | } | ||
1655 | + rcu_read_unlock(); | ||
1656 | |||
1657 | stit = kzalloc(sizeof(*stit), GFP_KERNEL); | ||
1658 | if (!stit) { | ||
1659 | @@ -364,18 +373,19 @@ static long kvmppc_tce_validate(struct kvmppc_spapr_tce_table *stt, | ||
1660 | if (kvmppc_tce_to_ua(stt->kvm, tce, &ua)) | ||
1661 | return H_TOO_HARD; | ||
1662 | |||
1663 | + rcu_read_lock(); | ||
1664 | list_for_each_entry_rcu(stit, &stt->iommu_tables, next) { | ||
1665 | unsigned long hpa = 0; | ||
1666 | struct mm_iommu_table_group_mem_t *mem; | ||
1667 | long shift = stit->tbl->it_page_shift; | ||
1668 | |||
1669 | mem = mm_iommu_lookup(stt->kvm->mm, ua, 1ULL << shift); | ||
1670 | - if (!mem) | ||
1671 | - return H_TOO_HARD; | ||
1672 | - | ||
1673 | - if (mm_iommu_ua_to_hpa(mem, ua, shift, &hpa)) | ||
1674 | + if (!mem || mm_iommu_ua_to_hpa(mem, ua, shift, &hpa)) { | ||
1675 | + rcu_read_unlock(); | ||
1676 | return H_TOO_HARD; | ||
1677 | + } | ||
1678 | } | ||
1679 | + rcu_read_unlock(); | ||
1680 | |||
1681 | return H_SUCCESS; | ||
1682 | } | ||
1683 | diff --git a/arch/powerpc/mm/book3s32/mmu.c b/arch/powerpc/mm/book3s32/mmu.c | ||
1684 | index 84d5fab94f8f..1424a120710e 100644 | ||
1685 | --- a/arch/powerpc/mm/book3s32/mmu.c | ||
1686 | +++ b/arch/powerpc/mm/book3s32/mmu.c | ||
1687 | @@ -187,6 +187,7 @@ void mmu_mark_initmem_nx(void) | ||
1688 | int i; | ||
1689 | unsigned long base = (unsigned long)_stext - PAGE_OFFSET; | ||
1690 | unsigned long top = (unsigned long)_etext - PAGE_OFFSET; | ||
1691 | + unsigned long border = (unsigned long)__init_begin - PAGE_OFFSET; | ||
1692 | unsigned long size; | ||
1693 | |||
1694 | if (IS_ENABLED(CONFIG_PPC_BOOK3S_601)) | ||
1695 | @@ -201,9 +202,10 @@ void mmu_mark_initmem_nx(void) | ||
1696 | size = block_size(base, top); | ||
1697 | size = max(size, 128UL << 10); | ||
1698 | if ((top - base) > size) { | ||
1699 | - if (strict_kernel_rwx_enabled()) | ||
1700 | - pr_warn("Kernel _etext not properly aligned\n"); | ||
1701 | size <<= 1; | ||
1702 | + if (strict_kernel_rwx_enabled() && base + size > border) | ||
1703 | + pr_warn("Some RW data is getting mapped X. " | ||
1704 | + "Adjust CONFIG_DATA_SHIFT to avoid that.\n"); | ||
1705 | } | ||
1706 | setibat(i++, PAGE_OFFSET + base, base, size, PAGE_KERNEL_TEXT); | ||
1707 | base += size; | ||
1708 | diff --git a/arch/powerpc/mm/ptdump/shared.c b/arch/powerpc/mm/ptdump/shared.c | ||
1709 | index f7ed2f187cb0..784f8df17f73 100644 | ||
1710 | --- a/arch/powerpc/mm/ptdump/shared.c | ||
1711 | +++ b/arch/powerpc/mm/ptdump/shared.c | ||
1712 | @@ -30,6 +30,11 @@ static const struct flag_info flag_array[] = { | ||
1713 | .val = _PAGE_PRESENT, | ||
1714 | .set = "present", | ||
1715 | .clear = " ", | ||
1716 | + }, { | ||
1717 | + .mask = _PAGE_COHERENT, | ||
1718 | + .val = _PAGE_COHERENT, | ||
1719 | + .set = "coherent", | ||
1720 | + .clear = " ", | ||
1721 | }, { | ||
1722 | .mask = _PAGE_GUARDED, | ||
1723 | .val = _PAGE_GUARDED, | ||
1724 | diff --git a/arch/powerpc/perf/hv-24x7.c b/arch/powerpc/perf/hv-24x7.c | ||
1725 | index 573e0b309c0c..48e8f4b17b91 100644 | ||
1726 | --- a/arch/powerpc/perf/hv-24x7.c | ||
1727 | +++ b/arch/powerpc/perf/hv-24x7.c | ||
1728 | @@ -1400,16 +1400,6 @@ static void h_24x7_event_read(struct perf_event *event) | ||
1729 | h24x7hw = &get_cpu_var(hv_24x7_hw); | ||
1730 | h24x7hw->events[i] = event; | ||
1731 | put_cpu_var(h24x7hw); | ||
1732 | - /* | ||
1733 | - * Clear the event count so we can compute the _change_ | ||
1734 | - * in the 24x7 raw counter value at the end of the txn. | ||
1735 | - * | ||
1736 | - * Note that we could alternatively read the 24x7 value | ||
1737 | - * now and save its value in event->hw.prev_count. But | ||
1738 | - * that would require issuing a hcall, which would then | ||
1739 | - * defeat the purpose of using the txn interface. | ||
1740 | - */ | ||
1741 | - local64_set(&event->count, 0); | ||
1742 | } | ||
1743 | |||
1744 | put_cpu_var(hv_24x7_reqb); | ||
1745 | diff --git a/arch/powerpc/platforms/4xx/pci.c b/arch/powerpc/platforms/4xx/pci.c | ||
1746 | index e6e2adcc7b64..c13d64c3b019 100644 | ||
1747 | --- a/arch/powerpc/platforms/4xx/pci.c | ||
1748 | +++ b/arch/powerpc/platforms/4xx/pci.c | ||
1749 | @@ -1242,7 +1242,7 @@ static void __init ppc460sx_pciex_check_link(struct ppc4xx_pciex_port *port) | ||
1750 | if (mbase == NULL) { | ||
1751 | printk(KERN_ERR "%pOF: Can't map internal config space !", | ||
1752 | port->node); | ||
1753 | - goto done; | ||
1754 | + return; | ||
1755 | } | ||
1756 | |||
1757 | while (attempt && (0 == (in_le32(mbase + PECFG_460SX_DLLSTA) | ||
1758 | @@ -1252,9 +1252,7 @@ static void __init ppc460sx_pciex_check_link(struct ppc4xx_pciex_port *port) | ||
1759 | } | ||
1760 | if (attempt) | ||
1761 | port->link = 1; | ||
1762 | -done: | ||
1763 | iounmap(mbase); | ||
1764 | - | ||
1765 | } | ||
1766 | |||
1767 | static struct ppc4xx_pciex_hwops ppc460sx_pcie_hwops __initdata = { | ||
1768 | diff --git a/arch/powerpc/platforms/ps3/mm.c b/arch/powerpc/platforms/ps3/mm.c | ||
1769 | index 423be34f0f5f..f42fe4e86ce5 100644 | ||
1770 | --- a/arch/powerpc/platforms/ps3/mm.c | ||
1771 | +++ b/arch/powerpc/platforms/ps3/mm.c | ||
1772 | @@ -200,13 +200,14 @@ void ps3_mm_vas_destroy(void) | ||
1773 | { | ||
1774 | int result; | ||
1775 | |||
1776 | - DBG("%s:%d: map.vas_id = %llu\n", __func__, __LINE__, map.vas_id); | ||
1777 | - | ||
1778 | if (map.vas_id) { | ||
1779 | result = lv1_select_virtual_address_space(0); | ||
1780 | - BUG_ON(result); | ||
1781 | - result = lv1_destruct_virtual_address_space(map.vas_id); | ||
1782 | - BUG_ON(result); | ||
1783 | + result += lv1_destruct_virtual_address_space(map.vas_id); | ||
1784 | + | ||
1785 | + if (result) { | ||
1786 | + lv1_panic(0); | ||
1787 | + } | ||
1788 | + | ||
1789 | map.vas_id = 0; | ||
1790 | } | ||
1791 | } | ||
1792 | @@ -304,19 +305,20 @@ static void ps3_mm_region_destroy(struct mem_region *r) | ||
1793 | int result; | ||
1794 | |||
1795 | if (!r->destroy) { | ||
1796 | - pr_info("%s:%d: Not destroying high region: %llxh %llxh\n", | ||
1797 | - __func__, __LINE__, r->base, r->size); | ||
1798 | return; | ||
1799 | } | ||
1800 | |||
1801 | - DBG("%s:%d: r->base = %llxh\n", __func__, __LINE__, r->base); | ||
1802 | - | ||
1803 | if (r->base) { | ||
1804 | result = lv1_release_memory(r->base); | ||
1805 | - BUG_ON(result); | ||
1806 | + | ||
1807 | + if (result) { | ||
1808 | + lv1_panic(0); | ||
1809 | + } | ||
1810 | + | ||
1811 | r->size = r->base = r->offset = 0; | ||
1812 | map.total = map.rm.size; | ||
1813 | } | ||
1814 | + | ||
1815 | ps3_mm_set_repository_highmem(NULL); | ||
1816 | } | ||
1817 | |||
1818 | diff --git a/arch/powerpc/platforms/pseries/ras.c b/arch/powerpc/platforms/pseries/ras.c | ||
1819 | index 753adeb624f2..13ef77fd648f 100644 | ||
1820 | --- a/arch/powerpc/platforms/pseries/ras.c | ||
1821 | +++ b/arch/powerpc/platforms/pseries/ras.c | ||
1822 | @@ -395,10 +395,11 @@ static irqreturn_t ras_error_interrupt(int irq, void *dev_id) | ||
1823 | /* | ||
1824 | * Some versions of FWNMI place the buffer inside the 4kB page starting at | ||
1825 | * 0x7000. Other versions place it inside the rtas buffer. We check both. | ||
1826 | + * Minimum size of the buffer is 16 bytes. | ||
1827 | */ | ||
1828 | #define VALID_FWNMI_BUFFER(A) \ | ||
1829 | - ((((A) >= 0x7000) && ((A) < 0x7ff0)) || \ | ||
1830 | - (((A) >= rtas.base) && ((A) < (rtas.base + rtas.size - 16)))) | ||
1831 | + ((((A) >= 0x7000) && ((A) <= 0x8000 - 16)) || \ | ||
1832 | + (((A) >= rtas.base) && ((A) <= (rtas.base + rtas.size - 16)))) | ||
1833 | |||
1834 | static inline struct rtas_error_log *fwnmi_get_errlog(void) | ||
1835 | { | ||
1836 | diff --git a/arch/s390/include/asm/syscall.h b/arch/s390/include/asm/syscall.h | ||
1837 | index f073292e9fdb..d9d5de0f67ff 100644 | ||
1838 | --- a/arch/s390/include/asm/syscall.h | ||
1839 | +++ b/arch/s390/include/asm/syscall.h | ||
1840 | @@ -33,7 +33,17 @@ static inline void syscall_rollback(struct task_struct *task, | ||
1841 | static inline long syscall_get_error(struct task_struct *task, | ||
1842 | struct pt_regs *regs) | ||
1843 | { | ||
1844 | - return IS_ERR_VALUE(regs->gprs[2]) ? regs->gprs[2] : 0; | ||
1845 | + unsigned long error = regs->gprs[2]; | ||
1846 | +#ifdef CONFIG_COMPAT | ||
1847 | + if (test_tsk_thread_flag(task, TIF_31BIT)) { | ||
1848 | + /* | ||
1849 | + * Sign-extend the value so (int)-EFOO becomes (long)-EFOO | ||
1850 | + * and will match correctly in comparisons. | ||
1851 | + */ | ||
1852 | + error = (long)(int)error; | ||
1853 | + } | ||
1854 | +#endif | ||
1855 | + return IS_ERR_VALUE(error) ? error : 0; | ||
1856 | } | ||
1857 | |||
1858 | static inline long syscall_get_return_value(struct task_struct *task, | ||
1859 | diff --git a/arch/sparc/mm/srmmu.c b/arch/sparc/mm/srmmu.c | ||
1860 | index cc3ad64479ac..9e256d4d1f4c 100644 | ||
1861 | --- a/arch/sparc/mm/srmmu.c | ||
1862 | +++ b/arch/sparc/mm/srmmu.c | ||
1863 | @@ -379,7 +379,6 @@ pgtable_t pte_alloc_one(struct mm_struct *mm) | ||
1864 | return NULL; | ||
1865 | page = pfn_to_page(__nocache_pa(pte) >> PAGE_SHIFT); | ||
1866 | if (!pgtable_pte_page_ctor(page)) { | ||
1867 | - __free_page(page); | ||
1868 | return NULL; | ||
1869 | } | ||
1870 | return page; | ||
1871 | diff --git a/arch/x86/boot/Makefile b/arch/x86/boot/Makefile | ||
1872 | index e2839b5c246c..6539c50fb9aa 100644 | ||
1873 | --- a/arch/x86/boot/Makefile | ||
1874 | +++ b/arch/x86/boot/Makefile | ||
1875 | @@ -87,7 +87,7 @@ $(obj)/vmlinux.bin: $(obj)/compressed/vmlinux FORCE | ||
1876 | |||
1877 | SETUP_OBJS = $(addprefix $(obj)/,$(setup-y)) | ||
1878 | |||
1879 | -sed-zoffset := -e 's/^\([0-9a-fA-F]*\) [ABCDGRSTVW] \(startup_32\|startup_64\|efi32_stub_entry\|efi64_stub_entry\|efi_pe_entry\|input_data\|_end\|_ehead\|_text\|z_.*\)$$/\#define ZO_\2 0x\1/p' | ||
1880 | +sed-zoffset := -e 's/^\([0-9a-fA-F]*\) [a-zA-Z] \(startup_32\|startup_64\|efi32_stub_entry\|efi64_stub_entry\|efi_pe_entry\|input_data\|_end\|_ehead\|_text\|z_.*\)$$/\#define ZO_\2 0x\1/p' | ||
1881 | |||
1882 | quiet_cmd_zoffset = ZOFFSET $@ | ||
1883 | cmd_zoffset = $(NM) $< | sed -n $(sed-zoffset) > $@ | ||
1884 | diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c | ||
1885 | index 25b8c45467fc..fce94c799f01 100644 | ||
1886 | --- a/arch/x86/kernel/apic/apic.c | ||
1887 | +++ b/arch/x86/kernel/apic/apic.c | ||
1888 | @@ -2099,7 +2099,7 @@ void __init init_apic_mappings(void) | ||
1889 | unsigned int new_apicid; | ||
1890 | |||
1891 | if (apic_validate_deadline_timer()) | ||
1892 | - pr_debug("TSC deadline timer available\n"); | ||
1893 | + pr_info("TSC deadline timer available\n"); | ||
1894 | |||
1895 | if (x2apic_mode) { | ||
1896 | boot_cpu_physical_apicid = read_apic_id(); | ||
1897 | diff --git a/arch/x86/kernel/idt.c b/arch/x86/kernel/idt.c | ||
1898 | index 87ef69a72c52..7bb4c3cbf4dc 100644 | ||
1899 | --- a/arch/x86/kernel/idt.c | ||
1900 | +++ b/arch/x86/kernel/idt.c | ||
1901 | @@ -318,7 +318,11 @@ void __init idt_setup_apic_and_irq_gates(void) | ||
1902 | |||
1903 | #ifdef CONFIG_X86_LOCAL_APIC | ||
1904 | for_each_clear_bit_from(i, system_vectors, NR_VECTORS) { | ||
1905 | - set_bit(i, system_vectors); | ||
1906 | + /* | ||
1907 | + * Don't set the non assigned system vectors in the | ||
1908 | + * system_vectors bitmap. Otherwise they show up in | ||
1909 | + * /proc/interrupts. | ||
1910 | + */ | ||
1911 | entry = spurious_entries_start + 8 * (i - FIRST_SYSTEM_VECTOR); | ||
1912 | set_intr_gate(i, entry); | ||
1913 | } | ||
1914 | diff --git a/arch/x86/kernel/kprobes/core.c b/arch/x86/kernel/kprobes/core.c | ||
1915 | index 43fc13c831af..62c39baea39e 100644 | ||
1916 | --- a/arch/x86/kernel/kprobes/core.c | ||
1917 | +++ b/arch/x86/kernel/kprobes/core.c | ||
1918 | @@ -746,16 +746,11 @@ asm( | ||
1919 | NOKPROBE_SYMBOL(kretprobe_trampoline); | ||
1920 | STACK_FRAME_NON_STANDARD(kretprobe_trampoline); | ||
1921 | |||
1922 | -static struct kprobe kretprobe_kprobe = { | ||
1923 | - .addr = (void *)kretprobe_trampoline, | ||
1924 | -}; | ||
1925 | - | ||
1926 | /* | ||
1927 | * Called from kretprobe_trampoline | ||
1928 | */ | ||
1929 | __used __visible void *trampoline_handler(struct pt_regs *regs) | ||
1930 | { | ||
1931 | - struct kprobe_ctlblk *kcb; | ||
1932 | struct kretprobe_instance *ri = NULL; | ||
1933 | struct hlist_head *head, empty_rp; | ||
1934 | struct hlist_node *tmp; | ||
1935 | @@ -765,16 +760,12 @@ __used __visible void *trampoline_handler(struct pt_regs *regs) | ||
1936 | void *frame_pointer; | ||
1937 | bool skipped = false; | ||
1938 | |||
1939 | - preempt_disable(); | ||
1940 | - | ||
1941 | /* | ||
1942 | * Set a dummy kprobe for avoiding kretprobe recursion. | ||
1943 | * Since kretprobe never run in kprobe handler, kprobe must not | ||
1944 | * be running at this point. | ||
1945 | */ | ||
1946 | - kcb = get_kprobe_ctlblk(); | ||
1947 | - __this_cpu_write(current_kprobe, &kretprobe_kprobe); | ||
1948 | - kcb->kprobe_status = KPROBE_HIT_ACTIVE; | ||
1949 | + kprobe_busy_begin(); | ||
1950 | |||
1951 | INIT_HLIST_HEAD(&empty_rp); | ||
1952 | kretprobe_hash_lock(current, &head, &flags); | ||
1953 | @@ -850,7 +841,7 @@ __used __visible void *trampoline_handler(struct pt_regs *regs) | ||
1954 | __this_cpu_write(current_kprobe, &ri->rp->kp); | ||
1955 | ri->ret_addr = correct_ret_addr; | ||
1956 | ri->rp->handler(ri, regs); | ||
1957 | - __this_cpu_write(current_kprobe, &kretprobe_kprobe); | ||
1958 | + __this_cpu_write(current_kprobe, &kprobe_busy); | ||
1959 | } | ||
1960 | |||
1961 | recycle_rp_inst(ri, &empty_rp); | ||
1962 | @@ -866,8 +857,7 @@ __used __visible void *trampoline_handler(struct pt_regs *regs) | ||
1963 | |||
1964 | kretprobe_hash_unlock(current, &flags); | ||
1965 | |||
1966 | - __this_cpu_write(current_kprobe, NULL); | ||
1967 | - preempt_enable(); | ||
1968 | + kprobe_busy_end(); | ||
1969 | |||
1970 | hlist_for_each_entry_safe(ri, tmp, &empty_rp, hlist) { | ||
1971 | hlist_del(&ri->hlist); | ||
1972 | diff --git a/arch/x86/purgatory/Makefile b/arch/x86/purgatory/Makefile | ||
1973 | index fb4ee5444379..9733d1cc791d 100644 | ||
1974 | --- a/arch/x86/purgatory/Makefile | ||
1975 | +++ b/arch/x86/purgatory/Makefile | ||
1976 | @@ -17,7 +17,10 @@ CFLAGS_sha256.o := -D__DISABLE_EXPORTS | ||
1977 | LDFLAGS_purgatory.ro := -e purgatory_start -r --no-undefined -nostdlib -z nodefaultlib | ||
1978 | targets += purgatory.ro | ||
1979 | |||
1980 | +# Sanitizer, etc. runtimes are unavailable and cannot be linked here. | ||
1981 | +GCOV_PROFILE := n | ||
1982 | KASAN_SANITIZE := n | ||
1983 | +UBSAN_SANITIZE := n | ||
1984 | KCOV_INSTRUMENT := n | ||
1985 | |||
1986 | # These are adjustments to the compiler flags used for objects that | ||
1987 | @@ -25,7 +28,7 @@ KCOV_INSTRUMENT := n | ||
1988 | |||
1989 | PURGATORY_CFLAGS_REMOVE := -mcmodel=kernel | ||
1990 | PURGATORY_CFLAGS := -mcmodel=large -ffreestanding -fno-zero-initialized-in-bss | ||
1991 | -PURGATORY_CFLAGS += $(DISABLE_STACKLEAK_PLUGIN) | ||
1992 | +PURGATORY_CFLAGS += $(DISABLE_STACKLEAK_PLUGIN) -DDISABLE_BRANCH_PROFILING | ||
1993 | |||
1994 | # Default KBUILD_CFLAGS can have -pg option set when FTRACE is enabled. That | ||
1995 | # in turn leaves some undefined symbols like __fentry__ in purgatory and not | ||
1996 | diff --git a/crypto/algboss.c b/crypto/algboss.c | ||
1997 | index a62149d6c839..2d41e67532c0 100644 | ||
1998 | --- a/crypto/algboss.c | ||
1999 | +++ b/crypto/algboss.c | ||
2000 | @@ -188,8 +188,6 @@ static int cryptomgr_schedule_probe(struct crypto_larval *larval) | ||
2001 | if (IS_ERR(thread)) | ||
2002 | goto err_put_larval; | ||
2003 | |||
2004 | - wait_for_completion_interruptible(&larval->completion); | ||
2005 | - | ||
2006 | return NOTIFY_STOP; | ||
2007 | |||
2008 | err_put_larval: | ||
2009 | diff --git a/crypto/algif_skcipher.c b/crypto/algif_skcipher.c | ||
2010 | index e2c8ab408bed..4c3bdffe0c3a 100644 | ||
2011 | --- a/crypto/algif_skcipher.c | ||
2012 | +++ b/crypto/algif_skcipher.c | ||
2013 | @@ -74,14 +74,10 @@ static int _skcipher_recvmsg(struct socket *sock, struct msghdr *msg, | ||
2014 | return PTR_ERR(areq); | ||
2015 | |||
2016 | /* convert iovecs of output buffers into RX SGL */ | ||
2017 | - err = af_alg_get_rsgl(sk, msg, flags, areq, -1, &len); | ||
2018 | + err = af_alg_get_rsgl(sk, msg, flags, areq, ctx->used, &len); | ||
2019 | if (err) | ||
2020 | goto free; | ||
2021 | |||
2022 | - /* Process only as much RX buffers for which we have TX data */ | ||
2023 | - if (len > ctx->used) | ||
2024 | - len = ctx->used; | ||
2025 | - | ||
2026 | /* | ||
2027 | * If more buffers are to be expected to be processed, process only | ||
2028 | * full block size buffers. | ||
2029 | diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c | ||
2030 | index 581595b35573..35f75c691d7c 100644 | ||
2031 | --- a/drivers/ata/libata-core.c | ||
2032 | +++ b/drivers/ata/libata-core.c | ||
2033 | @@ -41,7 +41,6 @@ | ||
2034 | #include <linux/workqueue.h> | ||
2035 | #include <linux/scatterlist.h> | ||
2036 | #include <linux/io.h> | ||
2037 | -#include <linux/async.h> | ||
2038 | #include <linux/log2.h> | ||
2039 | #include <linux/slab.h> | ||
2040 | #include <linux/glob.h> | ||
2041 | @@ -6592,7 +6591,7 @@ int ata_host_register(struct ata_host *host, struct scsi_host_template *sht) | ||
2042 | /* perform each probe asynchronously */ | ||
2043 | for (i = 0; i < host->n_ports; i++) { | ||
2044 | struct ata_port *ap = host->ports[i]; | ||
2045 | - async_schedule(async_port_probe, ap); | ||
2046 | + ap->cookie = async_schedule(async_port_probe, ap); | ||
2047 | } | ||
2048 | |||
2049 | return 0; | ||
2050 | @@ -6732,11 +6731,11 @@ void ata_host_detach(struct ata_host *host) | ||
2051 | { | ||
2052 | int i; | ||
2053 | |||
2054 | - /* Ensure ata_port probe has completed */ | ||
2055 | - async_synchronize_full(); | ||
2056 | - | ||
2057 | - for (i = 0; i < host->n_ports; i++) | ||
2058 | + for (i = 0; i < host->n_ports; i++) { | ||
2059 | + /* Ensure ata_port probe has completed */ | ||
2060 | + async_synchronize_cookie(host->ports[i]->cookie + 1); | ||
2061 | ata_port_detach(host->ports[i]); | ||
2062 | + } | ||
2063 | |||
2064 | /* the host is dead now, dissociate ACPI */ | ||
2065 | ata_acpi_dissociate(host); | ||
2066 | diff --git a/drivers/base/platform.c b/drivers/base/platform.c | ||
2067 | index 604a461848c9..0b67d41bab8f 100644 | ||
2068 | --- a/drivers/base/platform.c | ||
2069 | +++ b/drivers/base/platform.c | ||
2070 | @@ -802,6 +802,8 @@ int __init_or_module __platform_driver_probe(struct platform_driver *drv, | ||
2071 | /* temporary section violation during probe() */ | ||
2072 | drv->probe = probe; | ||
2073 | retval = code = __platform_driver_register(drv, module); | ||
2074 | + if (retval) | ||
2075 | + return retval; | ||
2076 | |||
2077 | /* | ||
2078 | * Fixup that section violation, being paranoid about code scanning | ||
2079 | diff --git a/drivers/block/ps3disk.c b/drivers/block/ps3disk.c | ||
2080 | index c5c6487a19d5..7b55811c2a81 100644 | ||
2081 | --- a/drivers/block/ps3disk.c | ||
2082 | +++ b/drivers/block/ps3disk.c | ||
2083 | @@ -454,7 +454,6 @@ static int ps3disk_probe(struct ps3_system_bus_device *_dev) | ||
2084 | queue->queuedata = dev; | ||
2085 | |||
2086 | blk_queue_max_hw_sectors(queue, dev->bounce_size >> 9); | ||
2087 | - blk_queue_segment_boundary(queue, -1UL); | ||
2088 | blk_queue_dma_alignment(queue, dev->blk_size-1); | ||
2089 | blk_queue_logical_block_size(queue, dev->blk_size); | ||
2090 | |||
2091 | diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c | ||
2092 | index 90f5292e2051..ac656a6d5daf 100644 | ||
2093 | --- a/drivers/char/ipmi/ipmi_msghandler.c | ||
2094 | +++ b/drivers/char/ipmi/ipmi_msghandler.c | ||
2095 | @@ -33,6 +33,7 @@ | ||
2096 | #include <linux/workqueue.h> | ||
2097 | #include <linux/uuid.h> | ||
2098 | #include <linux/nospec.h> | ||
2099 | +#include <linux/vmalloc.h> | ||
2100 | |||
2101 | #define IPMI_DRIVER_VERSION "39.2" | ||
2102 | |||
2103 | @@ -1170,7 +1171,7 @@ static void free_user_work(struct work_struct *work) | ||
2104 | remove_work); | ||
2105 | |||
2106 | cleanup_srcu_struct(&user->release_barrier); | ||
2107 | - kfree(user); | ||
2108 | + vfree(user); | ||
2109 | } | ||
2110 | |||
2111 | int ipmi_create_user(unsigned int if_num, | ||
2112 | @@ -1202,7 +1203,7 @@ int ipmi_create_user(unsigned int if_num, | ||
2113 | if (rv) | ||
2114 | return rv; | ||
2115 | |||
2116 | - new_user = kmalloc(sizeof(*new_user), GFP_KERNEL); | ||
2117 | + new_user = vzalloc(sizeof(*new_user)); | ||
2118 | if (!new_user) | ||
2119 | return -ENOMEM; | ||
2120 | |||
2121 | @@ -1249,7 +1250,7 @@ int ipmi_create_user(unsigned int if_num, | ||
2122 | |||
2123 | out_kfree: | ||
2124 | srcu_read_unlock(&ipmi_interfaces_srcu, index); | ||
2125 | - kfree(new_user); | ||
2126 | + vfree(new_user); | ||
2127 | return rv; | ||
2128 | } | ||
2129 | EXPORT_SYMBOL(ipmi_create_user); | ||
2130 | diff --git a/drivers/char/mem.c b/drivers/char/mem.c | ||
2131 | index 43dd0891ca1e..31cae88a730b 100644 | ||
2132 | --- a/drivers/char/mem.c | ||
2133 | +++ b/drivers/char/mem.c | ||
2134 | @@ -31,11 +31,15 @@ | ||
2135 | #include <linux/uio.h> | ||
2136 | #include <linux/uaccess.h> | ||
2137 | #include <linux/security.h> | ||
2138 | +#include <linux/pseudo_fs.h> | ||
2139 | +#include <uapi/linux/magic.h> | ||
2140 | +#include <linux/mount.h> | ||
2141 | |||
2142 | #ifdef CONFIG_IA64 | ||
2143 | # include <linux/efi.h> | ||
2144 | #endif | ||
2145 | |||
2146 | +#define DEVMEM_MINOR 1 | ||
2147 | #define DEVPORT_MINOR 4 | ||
2148 | |||
2149 | static inline unsigned long size_inside_page(unsigned long start, | ||
2150 | @@ -805,12 +809,64 @@ static loff_t memory_lseek(struct file *file, loff_t offset, int orig) | ||
2151 | return ret; | ||
2152 | } | ||
2153 | |||
2154 | +static struct inode *devmem_inode; | ||
2155 | + | ||
2156 | +#ifdef CONFIG_IO_STRICT_DEVMEM | ||
2157 | +void revoke_devmem(struct resource *res) | ||
2158 | +{ | ||
2159 | + struct inode *inode = READ_ONCE(devmem_inode); | ||
2160 | + | ||
2161 | + /* | ||
2162 | + * Check that the initialization has completed. Losing the race | ||
2163 | + * is ok because it means drivers are claiming resources before | ||
2164 | + * the fs_initcall level of init and prevent /dev/mem from | ||
2165 | + * establishing mappings. | ||
2166 | + */ | ||
2167 | + if (!inode) | ||
2168 | + return; | ||
2169 | + | ||
2170 | + /* | ||
2171 | + * The expectation is that the driver has successfully marked | ||
2172 | + * the resource busy by this point, so devmem_is_allowed() | ||
2173 | + * should start returning false, however for performance this | ||
2174 | + * does not iterate the entire resource range. | ||
2175 | + */ | ||
2176 | + if (devmem_is_allowed(PHYS_PFN(res->start)) && | ||
2177 | + devmem_is_allowed(PHYS_PFN(res->end))) { | ||
2178 | + /* | ||
2179 | + * *cringe* iomem=relaxed says "go ahead, what's the | ||
2180 | + * worst that can happen?" | ||
2181 | + */ | ||
2182 | + return; | ||
2183 | + } | ||
2184 | + | ||
2185 | + unmap_mapping_range(inode->i_mapping, res->start, resource_size(res), 1); | ||
2186 | +} | ||
2187 | +#endif | ||
2188 | + | ||
2189 | static int open_port(struct inode *inode, struct file *filp) | ||
2190 | { | ||
2191 | + int rc; | ||
2192 | + | ||
2193 | if (!capable(CAP_SYS_RAWIO)) | ||
2194 | return -EPERM; | ||
2195 | |||
2196 | - return security_locked_down(LOCKDOWN_DEV_MEM); | ||
2197 | + rc = security_locked_down(LOCKDOWN_DEV_MEM); | ||
2198 | + if (rc) | ||
2199 | + return rc; | ||
2200 | + | ||
2201 | + if (iminor(inode) != DEVMEM_MINOR) | ||
2202 | + return 0; | ||
2203 | + | ||
2204 | + /* | ||
2205 | + * Use a unified address space to have a single point to manage | ||
2206 | + * revocations when drivers want to take over a /dev/mem mapped | ||
2207 | + * range. | ||
2208 | + */ | ||
2209 | + inode->i_mapping = devmem_inode->i_mapping; | ||
2210 | + filp->f_mapping = inode->i_mapping; | ||
2211 | + | ||
2212 | + return 0; | ||
2213 | } | ||
2214 | |||
2215 | #define zero_lseek null_lseek | ||
2216 | @@ -885,7 +941,7 @@ static const struct memdev { | ||
2217 | fmode_t fmode; | ||
2218 | } devlist[] = { | ||
2219 | #ifdef CONFIG_DEVMEM | ||
2220 | - [1] = { "mem", 0, &mem_fops, FMODE_UNSIGNED_OFFSET }, | ||
2221 | + [DEVMEM_MINOR] = { "mem", 0, &mem_fops, FMODE_UNSIGNED_OFFSET }, | ||
2222 | #endif | ||
2223 | #ifdef CONFIG_DEVKMEM | ||
2224 | [2] = { "kmem", 0, &kmem_fops, FMODE_UNSIGNED_OFFSET }, | ||
2225 | @@ -939,6 +995,45 @@ static char *mem_devnode(struct device *dev, umode_t *mode) | ||
2226 | |||
2227 | static struct class *mem_class; | ||
2228 | |||
2229 | +static int devmem_fs_init_fs_context(struct fs_context *fc) | ||
2230 | +{ | ||
2231 | + return init_pseudo(fc, DEVMEM_MAGIC) ? 0 : -ENOMEM; | ||
2232 | +} | ||
2233 | + | ||
2234 | +static struct file_system_type devmem_fs_type = { | ||
2235 | + .name = "devmem", | ||
2236 | + .owner = THIS_MODULE, | ||
2237 | + .init_fs_context = devmem_fs_init_fs_context, | ||
2238 | + .kill_sb = kill_anon_super, | ||
2239 | +}; | ||
2240 | + | ||
2241 | +static int devmem_init_inode(void) | ||
2242 | +{ | ||
2243 | + static struct vfsmount *devmem_vfs_mount; | ||
2244 | + static int devmem_fs_cnt; | ||
2245 | + struct inode *inode; | ||
2246 | + int rc; | ||
2247 | + | ||
2248 | + rc = simple_pin_fs(&devmem_fs_type, &devmem_vfs_mount, &devmem_fs_cnt); | ||
2249 | + if (rc < 0) { | ||
2250 | + pr_err("Cannot mount /dev/mem pseudo filesystem: %d\n", rc); | ||
2251 | + return rc; | ||
2252 | + } | ||
2253 | + | ||
2254 | + inode = alloc_anon_inode(devmem_vfs_mount->mnt_sb); | ||
2255 | + if (IS_ERR(inode)) { | ||
2256 | + rc = PTR_ERR(inode); | ||
2257 | + pr_err("Cannot allocate inode for /dev/mem: %d\n", rc); | ||
2258 | + simple_release_fs(&devmem_vfs_mount, &devmem_fs_cnt); | ||
2259 | + return rc; | ||
2260 | + } | ||
2261 | + | ||
2262 | + /* publish /dev/mem initialized */ | ||
2263 | + WRITE_ONCE(devmem_inode, inode); | ||
2264 | + | ||
2265 | + return 0; | ||
2266 | +} | ||
2267 | + | ||
2268 | static int __init chr_dev_init(void) | ||
2269 | { | ||
2270 | int minor; | ||
2271 | @@ -960,6 +1055,8 @@ static int __init chr_dev_init(void) | ||
2272 | */ | ||
2273 | if ((minor == DEVPORT_MINOR) && !arch_has_dev_port()) | ||
2274 | continue; | ||
2275 | + if ((minor == DEVMEM_MINOR) && devmem_init_inode() != 0) | ||
2276 | + continue; | ||
2277 | |||
2278 | device_create(mem_class, NULL, MKDEV(MEM_MAJOR, minor), | ||
2279 | NULL, devlist[minor].name); | ||
2280 | diff --git a/drivers/clk/bcm/clk-bcm2835.c b/drivers/clk/bcm/clk-bcm2835.c | ||
2281 | index 802e488fd3c3..6e5d635f030f 100644 | ||
2282 | --- a/drivers/clk/bcm/clk-bcm2835.c | ||
2283 | +++ b/drivers/clk/bcm/clk-bcm2835.c | ||
2284 | @@ -1448,13 +1448,13 @@ static struct clk_hw *bcm2835_register_clock(struct bcm2835_cprman *cprman, | ||
2285 | return &clock->hw; | ||
2286 | } | ||
2287 | |||
2288 | -static struct clk *bcm2835_register_gate(struct bcm2835_cprman *cprman, | ||
2289 | +static struct clk_hw *bcm2835_register_gate(struct bcm2835_cprman *cprman, | ||
2290 | const struct bcm2835_gate_data *data) | ||
2291 | { | ||
2292 | - return clk_register_gate(cprman->dev, data->name, data->parent, | ||
2293 | - CLK_IGNORE_UNUSED | CLK_SET_RATE_GATE, | ||
2294 | - cprman->regs + data->ctl_reg, | ||
2295 | - CM_GATE_BIT, 0, &cprman->regs_lock); | ||
2296 | + return clk_hw_register_gate(cprman->dev, data->name, data->parent, | ||
2297 | + CLK_IGNORE_UNUSED | CLK_SET_RATE_GATE, | ||
2298 | + cprman->regs + data->ctl_reg, | ||
2299 | + CM_GATE_BIT, 0, &cprman->regs_lock); | ||
2300 | } | ||
2301 | |||
2302 | typedef struct clk_hw *(*bcm2835_clk_register)(struct bcm2835_cprman *cprman, | ||
2303 | diff --git a/drivers/clk/clk-ast2600.c b/drivers/clk/clk-ast2600.c | ||
2304 | index b1318e6b655b..675cab6fa781 100644 | ||
2305 | --- a/drivers/clk/clk-ast2600.c | ||
2306 | +++ b/drivers/clk/clk-ast2600.c | ||
2307 | @@ -599,14 +599,22 @@ static const u32 ast2600_a0_axi_ahb_div_table[] = { | ||
2308 | 2, 2, 3, 5, | ||
2309 | }; | ||
2310 | |||
2311 | -static const u32 ast2600_a1_axi_ahb_div_table[] = { | ||
2312 | - 4, 6, 2, 4, | ||
2313 | +static const u32 ast2600_a1_axi_ahb_div0_tbl[] = { | ||
2314 | + 3, 2, 3, 4, | ||
2315 | +}; | ||
2316 | + | ||
2317 | +static const u32 ast2600_a1_axi_ahb_div1_tbl[] = { | ||
2318 | + 3, 4, 6, 8, | ||
2319 | +}; | ||
2320 | + | ||
2321 | +static const u32 ast2600_a1_axi_ahb200_tbl[] = { | ||
2322 | + 3, 4, 3, 4, 2, 2, 2, 2, | ||
2323 | }; | ||
2324 | |||
2325 | static void __init aspeed_g6_cc(struct regmap *map) | ||
2326 | { | ||
2327 | struct clk_hw *hw; | ||
2328 | - u32 val, div, chip_id, axi_div, ahb_div; | ||
2329 | + u32 val, div, divbits, chip_id, axi_div, ahb_div; | ||
2330 | |||
2331 | clk_hw_register_fixed_rate(NULL, "clkin", NULL, 0, 25000000); | ||
2332 | |||
2333 | @@ -636,11 +644,22 @@ static void __init aspeed_g6_cc(struct regmap *map) | ||
2334 | else | ||
2335 | axi_div = 2; | ||
2336 | |||
2337 | + divbits = (val >> 11) & 0x3; | ||
2338 | regmap_read(map, ASPEED_G6_SILICON_REV, &chip_id); | ||
2339 | - if (chip_id & BIT(16)) | ||
2340 | - ahb_div = ast2600_a1_axi_ahb_div_table[(val >> 11) & 0x3]; | ||
2341 | - else | ||
2342 | + if (chip_id & BIT(16)) { | ||
2343 | + if (!divbits) { | ||
2344 | + ahb_div = ast2600_a1_axi_ahb200_tbl[(val >> 8) & 0x3]; | ||
2345 | + if (val & BIT(16)) | ||
2346 | + ahb_div *= 2; | ||
2347 | + } else { | ||
2348 | + if (val & BIT(16)) | ||
2349 | + ahb_div = ast2600_a1_axi_ahb_div1_tbl[divbits]; | ||
2350 | + else | ||
2351 | + ahb_div = ast2600_a1_axi_ahb_div0_tbl[divbits]; | ||
2352 | + } | ||
2353 | + } else { | ||
2354 | ahb_div = ast2600_a0_axi_ahb_div_table[(val >> 11) & 0x3]; | ||
2355 | + } | ||
2356 | |||
2357 | hw = clk_hw_register_fixed_factor(NULL, "ahb", "hpll", 0, 1, axi_div * ahb_div); | ||
2358 | aspeed_g6_clk_data->hws[ASPEED_CLK_AHB] = hw; | ||
2359 | diff --git a/drivers/clk/meson/meson8b.c b/drivers/clk/meson/meson8b.c | ||
2360 | index 8856ce476ccf..082178a0f41a 100644 | ||
2361 | --- a/drivers/clk/meson/meson8b.c | ||
2362 | +++ b/drivers/clk/meson/meson8b.c | ||
2363 | @@ -1071,7 +1071,7 @@ static struct clk_regmap meson8b_vid_pll_in_sel = { | ||
2364 | * Meson8m2: vid2_pll | ||
2365 | */ | ||
2366 | .parent_hws = (const struct clk_hw *[]) { | ||
2367 | - &meson8b_hdmi_pll_dco.hw | ||
2368 | + &meson8b_hdmi_pll_lvds_out.hw | ||
2369 | }, | ||
2370 | .num_parents = 1, | ||
2371 | .flags = CLK_SET_RATE_PARENT, | ||
2372 | @@ -1207,7 +1207,7 @@ static struct clk_regmap meson8b_vclk_in_en = { | ||
2373 | |||
2374 | static struct clk_regmap meson8b_vclk_div1_gate = { | ||
2375 | .data = &(struct clk_regmap_gate_data){ | ||
2376 | - .offset = HHI_VID_CLK_DIV, | ||
2377 | + .offset = HHI_VID_CLK_CNTL, | ||
2378 | .bit_idx = 0, | ||
2379 | }, | ||
2380 | .hw.init = &(struct clk_init_data){ | ||
2381 | @@ -1237,7 +1237,7 @@ static struct clk_fixed_factor meson8b_vclk_div2_div = { | ||
2382 | |||
2383 | static struct clk_regmap meson8b_vclk_div2_div_gate = { | ||
2384 | .data = &(struct clk_regmap_gate_data){ | ||
2385 | - .offset = HHI_VID_CLK_DIV, | ||
2386 | + .offset = HHI_VID_CLK_CNTL, | ||
2387 | .bit_idx = 1, | ||
2388 | }, | ||
2389 | .hw.init = &(struct clk_init_data){ | ||
2390 | @@ -1267,7 +1267,7 @@ static struct clk_fixed_factor meson8b_vclk_div4_div = { | ||
2391 | |||
2392 | static struct clk_regmap meson8b_vclk_div4_div_gate = { | ||
2393 | .data = &(struct clk_regmap_gate_data){ | ||
2394 | - .offset = HHI_VID_CLK_DIV, | ||
2395 | + .offset = HHI_VID_CLK_CNTL, | ||
2396 | .bit_idx = 2, | ||
2397 | }, | ||
2398 | .hw.init = &(struct clk_init_data){ | ||
2399 | @@ -1297,7 +1297,7 @@ static struct clk_fixed_factor meson8b_vclk_div6_div = { | ||
2400 | |||
2401 | static struct clk_regmap meson8b_vclk_div6_div_gate = { | ||
2402 | .data = &(struct clk_regmap_gate_data){ | ||
2403 | - .offset = HHI_VID_CLK_DIV, | ||
2404 | + .offset = HHI_VID_CLK_CNTL, | ||
2405 | .bit_idx = 3, | ||
2406 | }, | ||
2407 | .hw.init = &(struct clk_init_data){ | ||
2408 | @@ -1327,7 +1327,7 @@ static struct clk_fixed_factor meson8b_vclk_div12_div = { | ||
2409 | |||
2410 | static struct clk_regmap meson8b_vclk_div12_div_gate = { | ||
2411 | .data = &(struct clk_regmap_gate_data){ | ||
2412 | - .offset = HHI_VID_CLK_DIV, | ||
2413 | + .offset = HHI_VID_CLK_CNTL, | ||
2414 | .bit_idx = 4, | ||
2415 | }, | ||
2416 | .hw.init = &(struct clk_init_data){ | ||
2417 | @@ -1910,6 +1910,13 @@ static struct clk_regmap meson8b_mali = { | ||
2418 | }, | ||
2419 | }; | ||
2420 | |||
2421 | +static const struct reg_sequence meson8m2_gp_pll_init_regs[] = { | ||
2422 | + { .reg = HHI_GP_PLL_CNTL2, .def = 0x59c88000 }, | ||
2423 | + { .reg = HHI_GP_PLL_CNTL3, .def = 0xca463823 }, | ||
2424 | + { .reg = HHI_GP_PLL_CNTL4, .def = 0x0286a027 }, | ||
2425 | + { .reg = HHI_GP_PLL_CNTL5, .def = 0x00003000 }, | ||
2426 | +}; | ||
2427 | + | ||
2428 | static const struct pll_params_table meson8m2_gp_pll_params_table[] = { | ||
2429 | PLL_PARAMS(182, 3), | ||
2430 | { /* sentinel */ }, | ||
2431 | @@ -1943,6 +1950,8 @@ static struct clk_regmap meson8m2_gp_pll_dco = { | ||
2432 | .width = 1, | ||
2433 | }, | ||
2434 | .table = meson8m2_gp_pll_params_table, | ||
2435 | + .init_regs = meson8m2_gp_pll_init_regs, | ||
2436 | + .init_count = ARRAY_SIZE(meson8m2_gp_pll_init_regs), | ||
2437 | }, | ||
2438 | .hw.init = &(struct clk_init_data){ | ||
2439 | .name = "gp_pll_dco", | ||
2440 | @@ -3491,54 +3500,87 @@ static struct clk_regmap *const meson8b_clk_regmaps[] = { | ||
2441 | static const struct meson8b_clk_reset_line { | ||
2442 | u32 reg; | ||
2443 | u8 bit_idx; | ||
2444 | + bool active_low; | ||
2445 | } meson8b_clk_reset_bits[] = { | ||
2446 | [CLKC_RESET_L2_CACHE_SOFT_RESET] = { | ||
2447 | - .reg = HHI_SYS_CPU_CLK_CNTL0, .bit_idx = 30 | ||
2448 | + .reg = HHI_SYS_CPU_CLK_CNTL0, | ||
2449 | + .bit_idx = 30, | ||
2450 | + .active_low = false, | ||
2451 | }, | ||
2452 | [CLKC_RESET_AXI_64_TO_128_BRIDGE_A5_SOFT_RESET] = { | ||
2453 | - .reg = HHI_SYS_CPU_CLK_CNTL0, .bit_idx = 29 | ||
2454 | + .reg = HHI_SYS_CPU_CLK_CNTL0, | ||
2455 | + .bit_idx = 29, | ||
2456 | + .active_low = false, | ||
2457 | }, | ||
2458 | [CLKC_RESET_SCU_SOFT_RESET] = { | ||
2459 | - .reg = HHI_SYS_CPU_CLK_CNTL0, .bit_idx = 28 | ||
2460 | + .reg = HHI_SYS_CPU_CLK_CNTL0, | ||
2461 | + .bit_idx = 28, | ||
2462 | + .active_low = false, | ||
2463 | }, | ||
2464 | [CLKC_RESET_CPU3_SOFT_RESET] = { | ||
2465 | - .reg = HHI_SYS_CPU_CLK_CNTL0, .bit_idx = 27 | ||
2466 | + .reg = HHI_SYS_CPU_CLK_CNTL0, | ||
2467 | + .bit_idx = 27, | ||
2468 | + .active_low = false, | ||
2469 | }, | ||
2470 | [CLKC_RESET_CPU2_SOFT_RESET] = { | ||
2471 | - .reg = HHI_SYS_CPU_CLK_CNTL0, .bit_idx = 26 | ||
2472 | + .reg = HHI_SYS_CPU_CLK_CNTL0, | ||
2473 | + .bit_idx = 26, | ||
2474 | + .active_low = false, | ||
2475 | }, | ||
2476 | [CLKC_RESET_CPU1_SOFT_RESET] = { | ||
2477 | - .reg = HHI_SYS_CPU_CLK_CNTL0, .bit_idx = 25 | ||
2478 | + .reg = HHI_SYS_CPU_CLK_CNTL0, | ||
2479 | + .bit_idx = 25, | ||
2480 | + .active_low = false, | ||
2481 | }, | ||
2482 | [CLKC_RESET_CPU0_SOFT_RESET] = { | ||
2483 | - .reg = HHI_SYS_CPU_CLK_CNTL0, .bit_idx = 24 | ||
2484 | + .reg = HHI_SYS_CPU_CLK_CNTL0, | ||
2485 | + .bit_idx = 24, | ||
2486 | + .active_low = false, | ||
2487 | }, | ||
2488 | [CLKC_RESET_A5_GLOBAL_RESET] = { | ||
2489 | - .reg = HHI_SYS_CPU_CLK_CNTL0, .bit_idx = 18 | ||
2490 | + .reg = HHI_SYS_CPU_CLK_CNTL0, | ||
2491 | + .bit_idx = 18, | ||
2492 | + .active_low = false, | ||
2493 | }, | ||
2494 | [CLKC_RESET_A5_AXI_SOFT_RESET] = { | ||
2495 | - .reg = HHI_SYS_CPU_CLK_CNTL0, .bit_idx = 17 | ||
2496 | + .reg = HHI_SYS_CPU_CLK_CNTL0, | ||
2497 | + .bit_idx = 17, | ||
2498 | + .active_low = false, | ||
2499 | }, | ||
2500 | [CLKC_RESET_A5_ABP_SOFT_RESET] = { | ||
2501 | - .reg = HHI_SYS_CPU_CLK_CNTL0, .bit_idx = 16 | ||
2502 | + .reg = HHI_SYS_CPU_CLK_CNTL0, | ||
2503 | + .bit_idx = 16, | ||
2504 | + .active_low = false, | ||
2505 | }, | ||
2506 | [CLKC_RESET_AXI_64_TO_128_BRIDGE_MMC_SOFT_RESET] = { | ||
2507 | - .reg = HHI_SYS_CPU_CLK_CNTL1, .bit_idx = 30 | ||
2508 | + .reg = HHI_SYS_CPU_CLK_CNTL1, | ||
2509 | + .bit_idx = 30, | ||
2510 | + .active_low = false, | ||
2511 | }, | ||
2512 | [CLKC_RESET_VID_CLK_CNTL_SOFT_RESET] = { | ||
2513 | - .reg = HHI_VID_CLK_CNTL, .bit_idx = 15 | ||
2514 | + .reg = HHI_VID_CLK_CNTL, | ||
2515 | + .bit_idx = 15, | ||
2516 | + .active_low = false, | ||
2517 | }, | ||
2518 | [CLKC_RESET_VID_DIVIDER_CNTL_SOFT_RESET_POST] = { | ||
2519 | - .reg = HHI_VID_DIVIDER_CNTL, .bit_idx = 7 | ||
2520 | + .reg = HHI_VID_DIVIDER_CNTL, | ||
2521 | + .bit_idx = 7, | ||
2522 | + .active_low = false, | ||
2523 | }, | ||
2524 | [CLKC_RESET_VID_DIVIDER_CNTL_SOFT_RESET_PRE] = { | ||
2525 | - .reg = HHI_VID_DIVIDER_CNTL, .bit_idx = 3 | ||
2526 | + .reg = HHI_VID_DIVIDER_CNTL, | ||
2527 | + .bit_idx = 3, | ||
2528 | + .active_low = false, | ||
2529 | }, | ||
2530 | [CLKC_RESET_VID_DIVIDER_CNTL_RESET_N_POST] = { | ||
2531 | - .reg = HHI_VID_DIVIDER_CNTL, .bit_idx = 1 | ||
2532 | + .reg = HHI_VID_DIVIDER_CNTL, | ||
2533 | + .bit_idx = 1, | ||
2534 | + .active_low = true, | ||
2535 | }, | ||
2536 | [CLKC_RESET_VID_DIVIDER_CNTL_RESET_N_PRE] = { | ||
2537 | - .reg = HHI_VID_DIVIDER_CNTL, .bit_idx = 0 | ||
2538 | + .reg = HHI_VID_DIVIDER_CNTL, | ||
2539 | + .bit_idx = 0, | ||
2540 | + .active_low = true, | ||
2541 | }, | ||
2542 | }; | ||
2543 | |||
2544 | @@ -3547,22 +3589,22 @@ static int meson8b_clk_reset_update(struct reset_controller_dev *rcdev, | ||
2545 | { | ||
2546 | struct meson8b_clk_reset *meson8b_clk_reset = | ||
2547 | container_of(rcdev, struct meson8b_clk_reset, reset); | ||
2548 | - unsigned long flags; | ||
2549 | const struct meson8b_clk_reset_line *reset; | ||
2550 | + unsigned int value = 0; | ||
2551 | + unsigned long flags; | ||
2552 | |||
2553 | if (id >= ARRAY_SIZE(meson8b_clk_reset_bits)) | ||
2554 | return -EINVAL; | ||
2555 | |||
2556 | reset = &meson8b_clk_reset_bits[id]; | ||
2557 | |||
2558 | + if (assert != reset->active_low) | ||
2559 | + value = BIT(reset->bit_idx); | ||
2560 | + | ||
2561 | spin_lock_irqsave(&meson_clk_lock, flags); | ||
2562 | |||
2563 | - if (assert) | ||
2564 | - regmap_update_bits(meson8b_clk_reset->regmap, reset->reg, | ||
2565 | - BIT(reset->bit_idx), BIT(reset->bit_idx)); | ||
2566 | - else | ||
2567 | - regmap_update_bits(meson8b_clk_reset->regmap, reset->reg, | ||
2568 | - BIT(reset->bit_idx), 0); | ||
2569 | + regmap_update_bits(meson8b_clk_reset->regmap, reset->reg, | ||
2570 | + BIT(reset->bit_idx), value); | ||
2571 | |||
2572 | spin_unlock_irqrestore(&meson_clk_lock, flags); | ||
2573 | |||
2574 | diff --git a/drivers/clk/meson/meson8b.h b/drivers/clk/meson/meson8b.h | ||
2575 | index c889fbeec30f..c91fb07fcb65 100644 | ||
2576 | --- a/drivers/clk/meson/meson8b.h | ||
2577 | +++ b/drivers/clk/meson/meson8b.h | ||
2578 | @@ -20,6 +20,10 @@ | ||
2579 | * [0] http://dn.odroid.com/S805/Datasheet/S805_Datasheet%20V0.8%2020150126.pdf | ||
2580 | */ | ||
2581 | #define HHI_GP_PLL_CNTL 0x40 /* 0x10 offset in data sheet */ | ||
2582 | +#define HHI_GP_PLL_CNTL2 0x44 /* 0x11 offset in data sheet */ | ||
2583 | +#define HHI_GP_PLL_CNTL3 0x48 /* 0x12 offset in data sheet */ | ||
2584 | +#define HHI_GP_PLL_CNTL4 0x4C /* 0x13 offset in data sheet */ | ||
2585 | +#define HHI_GP_PLL_CNTL5 0x50 /* 0x14 offset in data sheet */ | ||
2586 | #define HHI_VIID_CLK_DIV 0x128 /* 0x4a offset in data sheet */ | ||
2587 | #define HHI_VIID_CLK_CNTL 0x12c /* 0x4b offset in data sheet */ | ||
2588 | #define HHI_GCLK_MPEG0 0x140 /* 0x50 offset in data sheet */ | ||
2589 | diff --git a/drivers/clk/qcom/gcc-msm8916.c b/drivers/clk/qcom/gcc-msm8916.c | ||
2590 | index 4e329a7baf2b..17e4a5a2a9fd 100644 | ||
2591 | --- a/drivers/clk/qcom/gcc-msm8916.c | ||
2592 | +++ b/drivers/clk/qcom/gcc-msm8916.c | ||
2593 | @@ -260,7 +260,7 @@ static struct clk_pll gpll0 = { | ||
2594 | .l_reg = 0x21004, | ||
2595 | .m_reg = 0x21008, | ||
2596 | .n_reg = 0x2100c, | ||
2597 | - .config_reg = 0x21014, | ||
2598 | + .config_reg = 0x21010, | ||
2599 | .mode_reg = 0x21000, | ||
2600 | .status_reg = 0x2101c, | ||
2601 | .status_bit = 17, | ||
2602 | @@ -287,7 +287,7 @@ static struct clk_pll gpll1 = { | ||
2603 | .l_reg = 0x20004, | ||
2604 | .m_reg = 0x20008, | ||
2605 | .n_reg = 0x2000c, | ||
2606 | - .config_reg = 0x20014, | ||
2607 | + .config_reg = 0x20010, | ||
2608 | .mode_reg = 0x20000, | ||
2609 | .status_reg = 0x2001c, | ||
2610 | .status_bit = 17, | ||
2611 | @@ -314,7 +314,7 @@ static struct clk_pll gpll2 = { | ||
2612 | .l_reg = 0x4a004, | ||
2613 | .m_reg = 0x4a008, | ||
2614 | .n_reg = 0x4a00c, | ||
2615 | - .config_reg = 0x4a014, | ||
2616 | + .config_reg = 0x4a010, | ||
2617 | .mode_reg = 0x4a000, | ||
2618 | .status_reg = 0x4a01c, | ||
2619 | .status_bit = 17, | ||
2620 | @@ -341,7 +341,7 @@ static struct clk_pll bimc_pll = { | ||
2621 | .l_reg = 0x23004, | ||
2622 | .m_reg = 0x23008, | ||
2623 | .n_reg = 0x2300c, | ||
2624 | - .config_reg = 0x23014, | ||
2625 | + .config_reg = 0x23010, | ||
2626 | .mode_reg = 0x23000, | ||
2627 | .status_reg = 0x2301c, | ||
2628 | .status_bit = 17, | ||
2629 | diff --git a/drivers/clk/renesas/renesas-cpg-mssr.c b/drivers/clk/renesas/renesas-cpg-mssr.c | ||
2630 | index 132cc96895e3..6f9612c169af 100644 | ||
2631 | --- a/drivers/clk/renesas/renesas-cpg-mssr.c | ||
2632 | +++ b/drivers/clk/renesas/renesas-cpg-mssr.c | ||
2633 | @@ -800,7 +800,8 @@ static int cpg_mssr_suspend_noirq(struct device *dev) | ||
2634 | /* Save module registers with bits under our control */ | ||
2635 | for (reg = 0; reg < ARRAY_SIZE(priv->smstpcr_saved); reg++) { | ||
2636 | if (priv->smstpcr_saved[reg].mask) | ||
2637 | - priv->smstpcr_saved[reg].val = | ||
2638 | + priv->smstpcr_saved[reg].val = priv->stbyctrl ? | ||
2639 | + readb(priv->base + STBCR(reg)) : | ||
2640 | readl(priv->base + SMSTPCR(reg)); | ||
2641 | } | ||
2642 | |||
2643 | @@ -860,8 +861,9 @@ static int cpg_mssr_resume_noirq(struct device *dev) | ||
2644 | } | ||
2645 | |||
2646 | if (!i) | ||
2647 | - dev_warn(dev, "Failed to enable SMSTP %p[0x%x]\n", | ||
2648 | - priv->base + SMSTPCR(reg), oldval & mask); | ||
2649 | + dev_warn(dev, "Failed to enable %s%u[0x%x]\n", | ||
2650 | + priv->stbyctrl ? "STB" : "SMSTP", reg, | ||
2651 | + oldval & mask); | ||
2652 | } | ||
2653 | |||
2654 | return 0; | ||
2655 | diff --git a/drivers/clk/samsung/clk-exynos5420.c b/drivers/clk/samsung/clk-exynos5420.c | ||
2656 | index 27fd274e92f8..dfef5f0833db 100644 | ||
2657 | --- a/drivers/clk/samsung/clk-exynos5420.c | ||
2658 | +++ b/drivers/clk/samsung/clk-exynos5420.c | ||
2659 | @@ -540,7 +540,7 @@ static const struct samsung_div_clock exynos5800_div_clks[] __initconst = { | ||
2660 | |||
2661 | static const struct samsung_gate_clock exynos5800_gate_clks[] __initconst = { | ||
2662 | GATE(CLK_ACLK550_CAM, "aclk550_cam", "mout_user_aclk550_cam", | ||
2663 | - GATE_BUS_TOP, 24, 0, 0), | ||
2664 | + GATE_BUS_TOP, 24, CLK_IS_CRITICAL, 0), | ||
2665 | GATE(CLK_ACLK432_SCALER, "aclk432_scaler", "mout_user_aclk432_scaler", | ||
2666 | GATE_BUS_TOP, 27, CLK_IS_CRITICAL, 0), | ||
2667 | }; | ||
2668 | @@ -940,25 +940,25 @@ static const struct samsung_gate_clock exynos5x_gate_clks[] __initconst = { | ||
2669 | GATE(0, "aclk300_jpeg", "mout_user_aclk300_jpeg", | ||
2670 | GATE_BUS_TOP, 4, CLK_IGNORE_UNUSED, 0), | ||
2671 | GATE(0, "aclk333_432_isp0", "mout_user_aclk333_432_isp0", | ||
2672 | - GATE_BUS_TOP, 5, 0, 0), | ||
2673 | + GATE_BUS_TOP, 5, CLK_IS_CRITICAL, 0), | ||
2674 | GATE(0, "aclk300_gscl", "mout_user_aclk300_gscl", | ||
2675 | GATE_BUS_TOP, 6, CLK_IS_CRITICAL, 0), | ||
2676 | GATE(0, "aclk333_432_gscl", "mout_user_aclk333_432_gscl", | ||
2677 | GATE_BUS_TOP, 7, CLK_IGNORE_UNUSED, 0), | ||
2678 | GATE(0, "aclk333_432_isp", "mout_user_aclk333_432_isp", | ||
2679 | - GATE_BUS_TOP, 8, 0, 0), | ||
2680 | + GATE_BUS_TOP, 8, CLK_IS_CRITICAL, 0), | ||
2681 | GATE(CLK_PCLK66_GPIO, "pclk66_gpio", "mout_user_pclk66_gpio", | ||
2682 | GATE_BUS_TOP, 9, CLK_IGNORE_UNUSED, 0), | ||
2683 | GATE(0, "aclk66_psgen", "mout_user_aclk66_psgen", | ||
2684 | GATE_BUS_TOP, 10, CLK_IGNORE_UNUSED, 0), | ||
2685 | GATE(0, "aclk266_isp", "mout_user_aclk266_isp", | ||
2686 | - GATE_BUS_TOP, 13, 0, 0), | ||
2687 | + GATE_BUS_TOP, 13, CLK_IS_CRITICAL, 0), | ||
2688 | GATE(0, "aclk166", "mout_user_aclk166", | ||
2689 | GATE_BUS_TOP, 14, CLK_IGNORE_UNUSED, 0), | ||
2690 | GATE(CLK_ACLK333, "aclk333", "mout_user_aclk333", | ||
2691 | GATE_BUS_TOP, 15, CLK_IS_CRITICAL, 0), | ||
2692 | GATE(0, "aclk400_isp", "mout_user_aclk400_isp", | ||
2693 | - GATE_BUS_TOP, 16, 0, 0), | ||
2694 | + GATE_BUS_TOP, 16, CLK_IS_CRITICAL, 0), | ||
2695 | GATE(0, "aclk400_mscl", "mout_user_aclk400_mscl", | ||
2696 | GATE_BUS_TOP, 17, CLK_IS_CRITICAL, 0), | ||
2697 | GATE(0, "aclk200_disp1", "mout_user_aclk200_disp1", | ||
2698 | @@ -1158,8 +1158,10 @@ static const struct samsung_gate_clock exynos5x_gate_clks[] __initconst = { | ||
2699 | GATE_IP_GSCL1, 3, 0, 0), | ||
2700 | GATE(CLK_SMMU_FIMCL1, "smmu_fimcl1", "dout_gscl_blk_333", | ||
2701 | GATE_IP_GSCL1, 4, 0, 0), | ||
2702 | - GATE(CLK_GSCL_WA, "gscl_wa", "sclk_gscl_wa", GATE_IP_GSCL1, 12, 0, 0), | ||
2703 | - GATE(CLK_GSCL_WB, "gscl_wb", "sclk_gscl_wb", GATE_IP_GSCL1, 13, 0, 0), | ||
2704 | + GATE(CLK_GSCL_WA, "gscl_wa", "sclk_gscl_wa", GATE_IP_GSCL1, 12, | ||
2705 | + CLK_IS_CRITICAL, 0), | ||
2706 | + GATE(CLK_GSCL_WB, "gscl_wb", "sclk_gscl_wb", GATE_IP_GSCL1, 13, | ||
2707 | + CLK_IS_CRITICAL, 0), | ||
2708 | GATE(CLK_SMMU_FIMCL3, "smmu_fimcl3,", "dout_gscl_blk_333", | ||
2709 | GATE_IP_GSCL1, 16, 0, 0), | ||
2710 | GATE(CLK_FIMC_LITE3, "fimc_lite3", "aclk333_432_gscl", | ||
2711 | diff --git a/drivers/clk/samsung/clk-exynos5433.c b/drivers/clk/samsung/clk-exynos5433.c | ||
2712 | index 4b1aa9382ad2..6f29ecd0442e 100644 | ||
2713 | --- a/drivers/clk/samsung/clk-exynos5433.c | ||
2714 | +++ b/drivers/clk/samsung/clk-exynos5433.c | ||
2715 | @@ -1706,7 +1706,8 @@ static const struct samsung_gate_clock peric_gate_clks[] __initconst = { | ||
2716 | GATE(CLK_SCLK_PCM1, "sclk_pcm1", "sclk_pcm1_peric", | ||
2717 | ENABLE_SCLK_PERIC, 7, CLK_SET_RATE_PARENT, 0), | ||
2718 | GATE(CLK_SCLK_I2S1, "sclk_i2s1", "sclk_i2s1_peric", | ||
2719 | - ENABLE_SCLK_PERIC, 6, CLK_SET_RATE_PARENT, 0), | ||
2720 | + ENABLE_SCLK_PERIC, 6, | ||
2721 | + CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0), | ||
2722 | GATE(CLK_SCLK_SPI2, "sclk_spi2", "sclk_spi2_peric", ENABLE_SCLK_PERIC, | ||
2723 | 5, CLK_SET_RATE_PARENT, 0), | ||
2724 | GATE(CLK_SCLK_SPI1, "sclk_spi1", "sclk_spi1_peric", ENABLE_SCLK_PERIC, | ||
2725 | diff --git a/drivers/clk/sprd/pll.c b/drivers/clk/sprd/pll.c | ||
2726 | index 640270f51aa5..eb8862752c2b 100644 | ||
2727 | --- a/drivers/clk/sprd/pll.c | ||
2728 | +++ b/drivers/clk/sprd/pll.c | ||
2729 | @@ -105,7 +105,7 @@ static unsigned long _sprd_pll_recalc_rate(const struct sprd_pll *pll, | ||
2730 | |||
2731 | cfg = kcalloc(regs_num, sizeof(*cfg), GFP_KERNEL); | ||
2732 | if (!cfg) | ||
2733 | - return -ENOMEM; | ||
2734 | + return parent_rate; | ||
2735 | |||
2736 | for (i = 0; i < regs_num; i++) | ||
2737 | cfg[i] = sprd_pll_read(pll, i); | ||
2738 | diff --git a/drivers/clk/st/clk-flexgen.c b/drivers/clk/st/clk-flexgen.c | ||
2739 | index 4413b6e04a8e..55873d4b7603 100644 | ||
2740 | --- a/drivers/clk/st/clk-flexgen.c | ||
2741 | +++ b/drivers/clk/st/clk-flexgen.c | ||
2742 | @@ -375,6 +375,7 @@ static void __init st_of_flexgen_setup(struct device_node *np) | ||
2743 | break; | ||
2744 | } | ||
2745 | |||
2746 | + flex_flags &= ~CLK_IS_CRITICAL; | ||
2747 | of_clk_detect_critical(np, i, &flex_flags); | ||
2748 | |||
2749 | /* | ||
2750 | diff --git a/drivers/clk/sunxi/clk-sunxi.c b/drivers/clk/sunxi/clk-sunxi.c | ||
2751 | index 27201fd26e44..e1aa1fbac48a 100644 | ||
2752 | --- a/drivers/clk/sunxi/clk-sunxi.c | ||
2753 | +++ b/drivers/clk/sunxi/clk-sunxi.c | ||
2754 | @@ -90,7 +90,7 @@ static void sun6i_a31_get_pll1_factors(struct factors_request *req) | ||
2755 | * Round down the frequency to the closest multiple of either | ||
2756 | * 6 or 16 | ||
2757 | */ | ||
2758 | - u32 round_freq_6 = round_down(freq_mhz, 6); | ||
2759 | + u32 round_freq_6 = rounddown(freq_mhz, 6); | ||
2760 | u32 round_freq_16 = round_down(freq_mhz, 16); | ||
2761 | |||
2762 | if (round_freq_6 > round_freq_16) | ||
2763 | diff --git a/drivers/clk/ti/composite.c b/drivers/clk/ti/composite.c | ||
2764 | index 6a89936ba03a..eaa43575cfa5 100644 | ||
2765 | --- a/drivers/clk/ti/composite.c | ||
2766 | +++ b/drivers/clk/ti/composite.c | ||
2767 | @@ -196,6 +196,7 @@ cleanup: | ||
2768 | if (!cclk->comp_clks[i]) | ||
2769 | continue; | ||
2770 | list_del(&cclk->comp_clks[i]->link); | ||
2771 | + kfree(cclk->comp_clks[i]->parent_names); | ||
2772 | kfree(cclk->comp_clks[i]); | ||
2773 | } | ||
2774 | |||
2775 | diff --git a/drivers/clk/zynqmp/clkc.c b/drivers/clk/zynqmp/clkc.c | ||
2776 | index a11f93ecbf34..6f057ab9df03 100644 | ||
2777 | --- a/drivers/clk/zynqmp/clkc.c | ||
2778 | +++ b/drivers/clk/zynqmp/clkc.c | ||
2779 | @@ -558,7 +558,7 @@ static struct clk_hw *zynqmp_register_clk_topology(int clk_id, char *clk_name, | ||
2780 | { | ||
2781 | int j; | ||
2782 | u32 num_nodes, clk_dev_id; | ||
2783 | - char *clk_out = NULL; | ||
2784 | + char *clk_out[MAX_NODES]; | ||
2785 | struct clock_topology *nodes; | ||
2786 | struct clk_hw *hw = NULL; | ||
2787 | |||
2788 | @@ -572,16 +572,16 @@ static struct clk_hw *zynqmp_register_clk_topology(int clk_id, char *clk_name, | ||
2789 | * Intermediate clock names are postfixed with type of clock. | ||
2790 | */ | ||
2791 | if (j != (num_nodes - 1)) { | ||
2792 | - clk_out = kasprintf(GFP_KERNEL, "%s%s", clk_name, | ||
2793 | + clk_out[j] = kasprintf(GFP_KERNEL, "%s%s", clk_name, | ||
2794 | clk_type_postfix[nodes[j].type]); | ||
2795 | } else { | ||
2796 | - clk_out = kasprintf(GFP_KERNEL, "%s", clk_name); | ||
2797 | + clk_out[j] = kasprintf(GFP_KERNEL, "%s", clk_name); | ||
2798 | } | ||
2799 | |||
2800 | if (!clk_topology[nodes[j].type]) | ||
2801 | continue; | ||
2802 | |||
2803 | - hw = (*clk_topology[nodes[j].type])(clk_out, clk_dev_id, | ||
2804 | + hw = (*clk_topology[nodes[j].type])(clk_out[j], clk_dev_id, | ||
2805 | parent_names, | ||
2806 | num_parents, | ||
2807 | &nodes[j]); | ||
2808 | @@ -590,9 +590,12 @@ static struct clk_hw *zynqmp_register_clk_topology(int clk_id, char *clk_name, | ||
2809 | __func__, clk_dev_id, clk_name, | ||
2810 | PTR_ERR(hw)); | ||
2811 | |||
2812 | - parent_names[0] = clk_out; | ||
2813 | + parent_names[0] = clk_out[j]; | ||
2814 | } | ||
2815 | - kfree(clk_out); | ||
2816 | + | ||
2817 | + for (j = 0; j < num_nodes; j++) | ||
2818 | + kfree(clk_out[j]); | ||
2819 | + | ||
2820 | return hw; | ||
2821 | } | ||
2822 | |||
2823 | diff --git a/drivers/crypto/omap-sham.c b/drivers/crypto/omap-sham.c | ||
2824 | index ac80bc6af093..aba5db3c0588 100644 | ||
2825 | --- a/drivers/crypto/omap-sham.c | ||
2826 | +++ b/drivers/crypto/omap-sham.c | ||
2827 | @@ -165,8 +165,6 @@ struct omap_sham_hmac_ctx { | ||
2828 | }; | ||
2829 | |||
2830 | struct omap_sham_ctx { | ||
2831 | - struct omap_sham_dev *dd; | ||
2832 | - | ||
2833 | unsigned long flags; | ||
2834 | |||
2835 | /* fallback stuff */ | ||
2836 | @@ -918,27 +916,35 @@ static int omap_sham_update_dma_stop(struct omap_sham_dev *dd) | ||
2837 | return 0; | ||
2838 | } | ||
2839 | |||
2840 | +struct omap_sham_dev *omap_sham_find_dev(struct omap_sham_reqctx *ctx) | ||
2841 | +{ | ||
2842 | + struct omap_sham_dev *dd; | ||
2843 | + | ||
2844 | + if (ctx->dd) | ||
2845 | + return ctx->dd; | ||
2846 | + | ||
2847 | + spin_lock_bh(&sham.lock); | ||
2848 | + dd = list_first_entry(&sham.dev_list, struct omap_sham_dev, list); | ||
2849 | + list_move_tail(&dd->list, &sham.dev_list); | ||
2850 | + ctx->dd = dd; | ||
2851 | + spin_unlock_bh(&sham.lock); | ||
2852 | + | ||
2853 | + return dd; | ||
2854 | +} | ||
2855 | + | ||
2856 | static int omap_sham_init(struct ahash_request *req) | ||
2857 | { | ||
2858 | struct crypto_ahash *tfm = crypto_ahash_reqtfm(req); | ||
2859 | struct omap_sham_ctx *tctx = crypto_ahash_ctx(tfm); | ||
2860 | struct omap_sham_reqctx *ctx = ahash_request_ctx(req); | ||
2861 | - struct omap_sham_dev *dd = NULL, *tmp; | ||
2862 | + struct omap_sham_dev *dd; | ||
2863 | int bs = 0; | ||
2864 | |||
2865 | - spin_lock_bh(&sham.lock); | ||
2866 | - if (!tctx->dd) { | ||
2867 | - list_for_each_entry(tmp, &sham.dev_list, list) { | ||
2868 | - dd = tmp; | ||
2869 | - break; | ||
2870 | - } | ||
2871 | - tctx->dd = dd; | ||
2872 | - } else { | ||
2873 | - dd = tctx->dd; | ||
2874 | - } | ||
2875 | - spin_unlock_bh(&sham.lock); | ||
2876 | + ctx->dd = NULL; | ||
2877 | |||
2878 | - ctx->dd = dd; | ||
2879 | + dd = omap_sham_find_dev(ctx); | ||
2880 | + if (!dd) | ||
2881 | + return -ENODEV; | ||
2882 | |||
2883 | ctx->flags = 0; | ||
2884 | |||
2885 | @@ -1187,8 +1193,7 @@ err1: | ||
2886 | static int omap_sham_enqueue(struct ahash_request *req, unsigned int op) | ||
2887 | { | ||
2888 | struct omap_sham_reqctx *ctx = ahash_request_ctx(req); | ||
2889 | - struct omap_sham_ctx *tctx = crypto_tfm_ctx(req->base.tfm); | ||
2890 | - struct omap_sham_dev *dd = tctx->dd; | ||
2891 | + struct omap_sham_dev *dd = ctx->dd; | ||
2892 | |||
2893 | ctx->op = op; | ||
2894 | |||
2895 | @@ -1198,7 +1203,7 @@ static int omap_sham_enqueue(struct ahash_request *req, unsigned int op) | ||
2896 | static int omap_sham_update(struct ahash_request *req) | ||
2897 | { | ||
2898 | struct omap_sham_reqctx *ctx = ahash_request_ctx(req); | ||
2899 | - struct omap_sham_dev *dd = ctx->dd; | ||
2900 | + struct omap_sham_dev *dd = omap_sham_find_dev(ctx); | ||
2901 | |||
2902 | if (!req->nbytes) | ||
2903 | return 0; | ||
2904 | @@ -1302,21 +1307,8 @@ static int omap_sham_setkey(struct crypto_ahash *tfm, const u8 *key, | ||
2905 | struct omap_sham_hmac_ctx *bctx = tctx->base; | ||
2906 | int bs = crypto_shash_blocksize(bctx->shash); | ||
2907 | int ds = crypto_shash_digestsize(bctx->shash); | ||
2908 | - struct omap_sham_dev *dd = NULL, *tmp; | ||
2909 | int err, i; | ||
2910 | |||
2911 | - spin_lock_bh(&sham.lock); | ||
2912 | - if (!tctx->dd) { | ||
2913 | - list_for_each_entry(tmp, &sham.dev_list, list) { | ||
2914 | - dd = tmp; | ||
2915 | - break; | ||
2916 | - } | ||
2917 | - tctx->dd = dd; | ||
2918 | - } else { | ||
2919 | - dd = tctx->dd; | ||
2920 | - } | ||
2921 | - spin_unlock_bh(&sham.lock); | ||
2922 | - | ||
2923 | err = crypto_shash_setkey(tctx->fallback, key, keylen); | ||
2924 | if (err) | ||
2925 | return err; | ||
2926 | @@ -1334,7 +1326,7 @@ static int omap_sham_setkey(struct crypto_ahash *tfm, const u8 *key, | ||
2927 | |||
2928 | memset(bctx->ipad + keylen, 0, bs - keylen); | ||
2929 | |||
2930 | - if (!test_bit(FLAGS_AUTO_XOR, &dd->flags)) { | ||
2931 | + if (!test_bit(FLAGS_AUTO_XOR, &sham.flags)) { | ||
2932 | memcpy(bctx->opad, bctx->ipad, bs); | ||
2933 | |||
2934 | for (i = 0; i < bs; i++) { | ||
2935 | @@ -2136,6 +2128,7 @@ static int omap_sham_probe(struct platform_device *pdev) | ||
2936 | } | ||
2937 | |||
2938 | dd->flags |= dd->pdata->flags; | ||
2939 | + sham.flags |= dd->pdata->flags; | ||
2940 | |||
2941 | pm_runtime_use_autosuspend(dev); | ||
2942 | pm_runtime_set_autosuspend_delay(dev, DEFAULT_AUTOSUSPEND_DELAY); | ||
2943 | @@ -2163,6 +2156,9 @@ static int omap_sham_probe(struct platform_device *pdev) | ||
2944 | spin_unlock(&sham.lock); | ||
2945 | |||
2946 | for (i = 0; i < dd->pdata->algs_info_size; i++) { | ||
2947 | + if (dd->pdata->algs_info[i].registered) | ||
2948 | + break; | ||
2949 | + | ||
2950 | for (j = 0; j < dd->pdata->algs_info[i].size; j++) { | ||
2951 | struct ahash_alg *alg; | ||
2952 | |||
2953 | @@ -2214,9 +2210,11 @@ static int omap_sham_remove(struct platform_device *pdev) | ||
2954 | list_del(&dd->list); | ||
2955 | spin_unlock(&sham.lock); | ||
2956 | for (i = dd->pdata->algs_info_size - 1; i >= 0; i--) | ||
2957 | - for (j = dd->pdata->algs_info[i].registered - 1; j >= 0; j--) | ||
2958 | + for (j = dd->pdata->algs_info[i].registered - 1; j >= 0; j--) { | ||
2959 | crypto_unregister_ahash( | ||
2960 | &dd->pdata->algs_info[i].algs_list[j]); | ||
2961 | + dd->pdata->algs_info[i].registered--; | ||
2962 | + } | ||
2963 | tasklet_kill(&dd->done_task); | ||
2964 | pm_runtime_disable(&pdev->dev); | ||
2965 | |||
2966 | diff --git a/drivers/extcon/extcon-adc-jack.c b/drivers/extcon/extcon-adc-jack.c | ||
2967 | index ad02dc6747a4..0317b614b680 100644 | ||
2968 | --- a/drivers/extcon/extcon-adc-jack.c | ||
2969 | +++ b/drivers/extcon/extcon-adc-jack.c | ||
2970 | @@ -124,7 +124,7 @@ static int adc_jack_probe(struct platform_device *pdev) | ||
2971 | for (i = 0; data->adc_conditions[i].id != EXTCON_NONE; i++); | ||
2972 | data->num_conditions = i; | ||
2973 | |||
2974 | - data->chan = iio_channel_get(&pdev->dev, pdata->consumer_channel); | ||
2975 | + data->chan = devm_iio_channel_get(&pdev->dev, pdata->consumer_channel); | ||
2976 | if (IS_ERR(data->chan)) | ||
2977 | return PTR_ERR(data->chan); | ||
2978 | |||
2979 | @@ -164,7 +164,6 @@ static int adc_jack_remove(struct platform_device *pdev) | ||
2980 | |||
2981 | free_irq(data->irq, data); | ||
2982 | cancel_work_sync(&data->handler.work); | ||
2983 | - iio_channel_release(data->chan); | ||
2984 | |||
2985 | return 0; | ||
2986 | } | ||
2987 | diff --git a/drivers/firmware/imx/imx-scu.c b/drivers/firmware/imx/imx-scu.c | ||
2988 | index e48d971ffb61..a3b11bc71dcb 100644 | ||
2989 | --- a/drivers/firmware/imx/imx-scu.c | ||
2990 | +++ b/drivers/firmware/imx/imx-scu.c | ||
2991 | @@ -300,6 +300,7 @@ static int imx_scu_probe(struct platform_device *pdev) | ||
2992 | if (ret != -EPROBE_DEFER) | ||
2993 | dev_err(dev, "Failed to request mbox chan %s ret %d\n", | ||
2994 | chan_name, ret); | ||
2995 | + kfree(chan_name); | ||
2996 | return ret; | ||
2997 | } | ||
2998 | |||
2999 | diff --git a/drivers/firmware/qcom_scm.c b/drivers/firmware/qcom_scm.c | ||
3000 | index 4802ab170fe5..b9fdc20b4eb9 100644 | ||
3001 | --- a/drivers/firmware/qcom_scm.c | ||
3002 | +++ b/drivers/firmware/qcom_scm.c | ||
3003 | @@ -9,7 +9,6 @@ | ||
3004 | #include <linux/init.h> | ||
3005 | #include <linux/cpumask.h> | ||
3006 | #include <linux/export.h> | ||
3007 | -#include <linux/dma-direct.h> | ||
3008 | #include <linux/dma-mapping.h> | ||
3009 | #include <linux/module.h> | ||
3010 | #include <linux/types.h> | ||
3011 | @@ -441,8 +440,7 @@ int qcom_scm_assign_mem(phys_addr_t mem_addr, size_t mem_sz, | ||
3012 | struct qcom_scm_mem_map_info *mem_to_map; | ||
3013 | phys_addr_t mem_to_map_phys; | ||
3014 | phys_addr_t dest_phys; | ||
3015 | - phys_addr_t ptr_phys; | ||
3016 | - dma_addr_t ptr_dma; | ||
3017 | + dma_addr_t ptr_phys; | ||
3018 | size_t mem_to_map_sz; | ||
3019 | size_t dest_sz; | ||
3020 | size_t src_sz; | ||
3021 | @@ -459,10 +457,9 @@ int qcom_scm_assign_mem(phys_addr_t mem_addr, size_t mem_sz, | ||
3022 | ptr_sz = ALIGN(src_sz, SZ_64) + ALIGN(mem_to_map_sz, SZ_64) + | ||
3023 | ALIGN(dest_sz, SZ_64); | ||
3024 | |||
3025 | - ptr = dma_alloc_coherent(__scm->dev, ptr_sz, &ptr_dma, GFP_KERNEL); | ||
3026 | + ptr = dma_alloc_coherent(__scm->dev, ptr_sz, &ptr_phys, GFP_KERNEL); | ||
3027 | if (!ptr) | ||
3028 | return -ENOMEM; | ||
3029 | - ptr_phys = dma_to_phys(__scm->dev, ptr_dma); | ||
3030 | |||
3031 | /* Fill source vmid detail */ | ||
3032 | src = ptr; | ||
3033 | @@ -490,7 +487,7 @@ int qcom_scm_assign_mem(phys_addr_t mem_addr, size_t mem_sz, | ||
3034 | |||
3035 | ret = __qcom_scm_assign_mem(__scm->dev, mem_to_map_phys, mem_to_map_sz, | ||
3036 | ptr_phys, src_sz, dest_phys, dest_sz); | ||
3037 | - dma_free_coherent(__scm->dev, ptr_sz, ptr, ptr_dma); | ||
3038 | + dma_free_coherent(__scm->dev, ptr_sz, ptr, ptr_phys); | ||
3039 | if (ret) { | ||
3040 | dev_err(__scm->dev, | ||
3041 | "Assign memory protection call failed %d\n", ret); | ||
3042 | diff --git a/drivers/fpga/dfl-afu-dma-region.c b/drivers/fpga/dfl-afu-dma-region.c | ||
3043 | index 62f924489db5..5942343a5d6e 100644 | ||
3044 | --- a/drivers/fpga/dfl-afu-dma-region.c | ||
3045 | +++ b/drivers/fpga/dfl-afu-dma-region.c | ||
3046 | @@ -61,10 +61,10 @@ static int afu_dma_pin_pages(struct dfl_feature_platform_data *pdata, | ||
3047 | region->pages); | ||
3048 | if (pinned < 0) { | ||
3049 | ret = pinned; | ||
3050 | - goto put_pages; | ||
3051 | + goto free_pages; | ||
3052 | } else if (pinned != npages) { | ||
3053 | ret = -EFAULT; | ||
3054 | - goto free_pages; | ||
3055 | + goto put_pages; | ||
3056 | } | ||
3057 | |||
3058 | dev_dbg(dev, "%d pages pinned\n", pinned); | ||
3059 | diff --git a/drivers/gpio/gpio-dwapb.c b/drivers/gpio/gpio-dwapb.c | ||
3060 | index 92e127e74813..ed6061b5cca1 100644 | ||
3061 | --- a/drivers/gpio/gpio-dwapb.c | ||
3062 | +++ b/drivers/gpio/gpio-dwapb.c | ||
3063 | @@ -49,7 +49,9 @@ | ||
3064 | #define GPIO_EXT_PORTC 0x58 | ||
3065 | #define GPIO_EXT_PORTD 0x5c | ||
3066 | |||
3067 | +#define DWAPB_DRIVER_NAME "gpio-dwapb" | ||
3068 | #define DWAPB_MAX_PORTS 4 | ||
3069 | + | ||
3070 | #define GPIO_EXT_PORT_STRIDE 0x04 /* register stride 32 bits */ | ||
3071 | #define GPIO_SWPORT_DR_STRIDE 0x0c /* register stride 3*32 bits */ | ||
3072 | #define GPIO_SWPORT_DDR_STRIDE 0x0c /* register stride 3*32 bits */ | ||
3073 | @@ -398,7 +400,7 @@ static void dwapb_configure_irqs(struct dwapb_gpio *gpio, | ||
3074 | return; | ||
3075 | |||
3076 | err = irq_alloc_domain_generic_chips(gpio->domain, ngpio, 2, | ||
3077 | - "gpio-dwapb", handle_level_irq, | ||
3078 | + DWAPB_DRIVER_NAME, handle_level_irq, | ||
3079 | IRQ_NOREQUEST, 0, | ||
3080 | IRQ_GC_INIT_NESTED_LOCK); | ||
3081 | if (err) { | ||
3082 | @@ -455,7 +457,7 @@ static void dwapb_configure_irqs(struct dwapb_gpio *gpio, | ||
3083 | */ | ||
3084 | err = devm_request_irq(gpio->dev, pp->irq[0], | ||
3085 | dwapb_irq_handler_mfd, | ||
3086 | - IRQF_SHARED, "gpio-dwapb-mfd", gpio); | ||
3087 | + IRQF_SHARED, DWAPB_DRIVER_NAME, gpio); | ||
3088 | if (err) { | ||
3089 | dev_err(gpio->dev, "error requesting IRQ\n"); | ||
3090 | irq_domain_remove(gpio->domain); | ||
3091 | @@ -533,26 +535,33 @@ static int dwapb_gpio_add_port(struct dwapb_gpio *gpio, | ||
3092 | dwapb_configure_irqs(gpio, port, pp); | ||
3093 | |||
3094 | err = gpiochip_add_data(&port->gc, port); | ||
3095 | - if (err) | ||
3096 | + if (err) { | ||
3097 | dev_err(gpio->dev, "failed to register gpiochip for port%d\n", | ||
3098 | port->idx); | ||
3099 | - else | ||
3100 | - port->is_registered = true; | ||
3101 | + return err; | ||
3102 | + } | ||
3103 | |||
3104 | /* Add GPIO-signaled ACPI event support */ | ||
3105 | - if (pp->has_irq) | ||
3106 | - acpi_gpiochip_request_interrupts(&port->gc); | ||
3107 | + acpi_gpiochip_request_interrupts(&port->gc); | ||
3108 | |||
3109 | - return err; | ||
3110 | + port->is_registered = true; | ||
3111 | + | ||
3112 | + return 0; | ||
3113 | } | ||
3114 | |||
3115 | static void dwapb_gpio_unregister(struct dwapb_gpio *gpio) | ||
3116 | { | ||
3117 | unsigned int m; | ||
3118 | |||
3119 | - for (m = 0; m < gpio->nr_ports; ++m) | ||
3120 | - if (gpio->ports[m].is_registered) | ||
3121 | - gpiochip_remove(&gpio->ports[m].gc); | ||
3122 | + for (m = 0; m < gpio->nr_ports; ++m) { | ||
3123 | + struct dwapb_gpio_port *port = &gpio->ports[m]; | ||
3124 | + | ||
3125 | + if (!port->is_registered) | ||
3126 | + continue; | ||
3127 | + | ||
3128 | + acpi_gpiochip_free_interrupts(&port->gc); | ||
3129 | + gpiochip_remove(&port->gc); | ||
3130 | + } | ||
3131 | } | ||
3132 | |||
3133 | static struct dwapb_platform_data * | ||
3134 | @@ -836,7 +845,7 @@ static SIMPLE_DEV_PM_OPS(dwapb_gpio_pm_ops, dwapb_gpio_suspend, | ||
3135 | |||
3136 | static struct platform_driver dwapb_gpio_driver = { | ||
3137 | .driver = { | ||
3138 | - .name = "gpio-dwapb", | ||
3139 | + .name = DWAPB_DRIVER_NAME, | ||
3140 | .pm = &dwapb_gpio_pm_ops, | ||
3141 | .of_match_table = of_match_ptr(dwapb_of_match), | ||
3142 | .acpi_match_table = ACPI_PTR(dwapb_acpi_match), | ||
3143 | @@ -850,3 +859,4 @@ module_platform_driver(dwapb_gpio_driver); | ||
3144 | MODULE_LICENSE("GPL"); | ||
3145 | MODULE_AUTHOR("Jamie Iles"); | ||
3146 | MODULE_DESCRIPTION("Synopsys DesignWare APB GPIO driver"); | ||
3147 | +MODULE_ALIAS("platform:" DWAPB_DRIVER_NAME); | ||
3148 | diff --git a/drivers/gpio/gpio-pca953x.c b/drivers/gpio/gpio-pca953x.c | ||
3149 | index 3edc1762803a..29ba26742c8f 100644 | ||
3150 | --- a/drivers/gpio/gpio-pca953x.c | ||
3151 | +++ b/drivers/gpio/gpio-pca953x.c | ||
3152 | @@ -306,8 +306,22 @@ static const struct regmap_config pca953x_i2c_regmap = { | ||
3153 | .volatile_reg = pca953x_volatile_register, | ||
3154 | |||
3155 | .cache_type = REGCACHE_RBTREE, | ||
3156 | - /* REVISIT: should be 0x7f but some 24 bit chips use REG_ADDR_AI */ | ||
3157 | - .max_register = 0xff, | ||
3158 | + .max_register = 0x7f, | ||
3159 | +}; | ||
3160 | + | ||
3161 | +static const struct regmap_config pca953x_ai_i2c_regmap = { | ||
3162 | + .reg_bits = 8, | ||
3163 | + .val_bits = 8, | ||
3164 | + | ||
3165 | + .read_flag_mask = REG_ADDR_AI, | ||
3166 | + .write_flag_mask = REG_ADDR_AI, | ||
3167 | + | ||
3168 | + .readable_reg = pca953x_readable_register, | ||
3169 | + .writeable_reg = pca953x_writeable_register, | ||
3170 | + .volatile_reg = pca953x_volatile_register, | ||
3171 | + | ||
3172 | + .cache_type = REGCACHE_RBTREE, | ||
3173 | + .max_register = 0x7f, | ||
3174 | }; | ||
3175 | |||
3176 | static u8 pca953x_recalc_addr(struct pca953x_chip *chip, int reg, int off, | ||
3177 | @@ -318,18 +332,6 @@ static u8 pca953x_recalc_addr(struct pca953x_chip *chip, int reg, int off, | ||
3178 | int pinctrl = (reg & PCAL_PINCTRL_MASK) << 1; | ||
3179 | u8 regaddr = pinctrl | addr | (off / BANK_SZ); | ||
3180 | |||
3181 | - /* Single byte read doesn't need AI bit set. */ | ||
3182 | - if (!addrinc) | ||
3183 | - return regaddr; | ||
3184 | - | ||
3185 | - /* Chips with 24 and more GPIOs always support Auto Increment */ | ||
3186 | - if (write && NBANK(chip) > 2) | ||
3187 | - regaddr |= REG_ADDR_AI; | ||
3188 | - | ||
3189 | - /* PCA9575 needs address-increment on multi-byte writes */ | ||
3190 | - if (PCA_CHIP_TYPE(chip->driver_data) == PCA957X_TYPE) | ||
3191 | - regaddr |= REG_ADDR_AI; | ||
3192 | - | ||
3193 | return regaddr; | ||
3194 | } | ||
3195 | |||
3196 | @@ -897,6 +899,7 @@ static int pca953x_probe(struct i2c_client *client, | ||
3197 | int ret; | ||
3198 | u32 invert = 0; | ||
3199 | struct regulator *reg; | ||
3200 | + const struct regmap_config *regmap_config; | ||
3201 | |||
3202 | chip = devm_kzalloc(&client->dev, | ||
3203 | sizeof(struct pca953x_chip), GFP_KERNEL); | ||
3204 | @@ -960,7 +963,17 @@ static int pca953x_probe(struct i2c_client *client, | ||
3205 | |||
3206 | i2c_set_clientdata(client, chip); | ||
3207 | |||
3208 | - chip->regmap = devm_regmap_init_i2c(client, &pca953x_i2c_regmap); | ||
3209 | + pca953x_setup_gpio(chip, chip->driver_data & PCA_GPIO_MASK); | ||
3210 | + | ||
3211 | + if (NBANK(chip) > 2 || PCA_CHIP_TYPE(chip->driver_data) == PCA957X_TYPE) { | ||
3212 | + dev_info(&client->dev, "using AI\n"); | ||
3213 | + regmap_config = &pca953x_ai_i2c_regmap; | ||
3214 | + } else { | ||
3215 | + dev_info(&client->dev, "using no AI\n"); | ||
3216 | + regmap_config = &pca953x_i2c_regmap; | ||
3217 | + } | ||
3218 | + | ||
3219 | + chip->regmap = devm_regmap_init_i2c(client, regmap_config); | ||
3220 | if (IS_ERR(chip->regmap)) { | ||
3221 | ret = PTR_ERR(chip->regmap); | ||
3222 | goto err_exit; | ||
3223 | @@ -991,7 +1004,6 @@ static int pca953x_probe(struct i2c_client *client, | ||
3224 | /* initialize cached registers from their original values. | ||
3225 | * we can't share this chip with another i2c master. | ||
3226 | */ | ||
3227 | - pca953x_setup_gpio(chip, chip->driver_data & PCA_GPIO_MASK); | ||
3228 | |||
3229 | if (PCA_CHIP_TYPE(chip->driver_data) == PCA953X_TYPE) { | ||
3230 | chip->regs = &pca953x_regs; | ||
3231 | diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | ||
3232 | index 9fd12e108a70..4fad0b603b3a 100644 | ||
3233 | --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | ||
3234 | +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | ||
3235 | @@ -929,7 +929,7 @@ static int dm_late_init(void *handle) | ||
3236 | unsigned int linear_lut[16]; | ||
3237 | int i; | ||
3238 | struct dmcu *dmcu = adev->dm.dc->res_pool->dmcu; | ||
3239 | - bool ret = false; | ||
3240 | + bool ret; | ||
3241 | |||
3242 | for (i = 0; i < 16; i++) | ||
3243 | linear_lut[i] = 0xFFFF * i / 15; | ||
3244 | @@ -945,13 +945,10 @@ static int dm_late_init(void *handle) | ||
3245 | */ | ||
3246 | params.min_abm_backlight = 0x28F; | ||
3247 | |||
3248 | - /* todo will enable for navi10 */ | ||
3249 | - if (adev->asic_type <= CHIP_RAVEN) { | ||
3250 | - ret = dmcu_load_iram(dmcu, params); | ||
3251 | + ret = dmcu_load_iram(dmcu, params); | ||
3252 | |||
3253 | - if (!ret) | ||
3254 | - return -EINVAL; | ||
3255 | - } | ||
3256 | + if (!ret) | ||
3257 | + return -EINVAL; | ||
3258 | |||
3259 | return detect_mst_link_for_all_connectors(adev->ddev); | ||
3260 | } | ||
3261 | diff --git a/drivers/gpu/drm/amd/display/dc/bios/bios_parser.c b/drivers/gpu/drm/amd/display/dc/bios/bios_parser.c | ||
3262 | index 221e0f56389f..823843cd2613 100644 | ||
3263 | --- a/drivers/gpu/drm/amd/display/dc/bios/bios_parser.c | ||
3264 | +++ b/drivers/gpu/drm/amd/display/dc/bios/bios_parser.c | ||
3265 | @@ -2543,7 +2543,6 @@ static enum bp_result construct_integrated_info( | ||
3266 | |||
3267 | /* Sort voltage table from low to high*/ | ||
3268 | if (result == BP_RESULT_OK) { | ||
3269 | - struct clock_voltage_caps temp = {0, 0}; | ||
3270 | uint32_t i; | ||
3271 | uint32_t j; | ||
3272 | |||
3273 | @@ -2553,10 +2552,8 @@ static enum bp_result construct_integrated_info( | ||
3274 | info->disp_clk_voltage[j].max_supported_clk < | ||
3275 | info->disp_clk_voltage[j-1].max_supported_clk) { | ||
3276 | /* swap j and j - 1*/ | ||
3277 | - temp = info->disp_clk_voltage[j-1]; | ||
3278 | - info->disp_clk_voltage[j-1] = | ||
3279 | - info->disp_clk_voltage[j]; | ||
3280 | - info->disp_clk_voltage[j] = temp; | ||
3281 | + swap(info->disp_clk_voltage[j - 1], | ||
3282 | + info->disp_clk_voltage[j]); | ||
3283 | } | ||
3284 | } | ||
3285 | } | ||
3286 | diff --git a/drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c b/drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c | ||
3287 | index dff65c0fe82f..7873abea4112 100644 | ||
3288 | --- a/drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c | ||
3289 | +++ b/drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c | ||
3290 | @@ -1613,8 +1613,6 @@ static enum bp_result construct_integrated_info( | ||
3291 | |||
3292 | struct atom_common_table_header *header; | ||
3293 | struct atom_data_revision revision; | ||
3294 | - | ||
3295 | - struct clock_voltage_caps temp = {0, 0}; | ||
3296 | uint32_t i; | ||
3297 | uint32_t j; | ||
3298 | |||
3299 | @@ -1644,10 +1642,8 @@ static enum bp_result construct_integrated_info( | ||
3300 | info->disp_clk_voltage[j-1].max_supported_clk | ||
3301 | ) { | ||
3302 | /* swap j and j - 1*/ | ||
3303 | - temp = info->disp_clk_voltage[j-1]; | ||
3304 | - info->disp_clk_voltage[j-1] = | ||
3305 | - info->disp_clk_voltage[j]; | ||
3306 | - info->disp_clk_voltage[j] = temp; | ||
3307 | + swap(info->disp_clk_voltage[j - 1], | ||
3308 | + info->disp_clk_voltage[j]); | ||
3309 | } | ||
3310 | } | ||
3311 | } | ||
3312 | diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c | ||
3313 | index 2028dc017f7a..47e7d11ca0c9 100644 | ||
3314 | --- a/drivers/gpu/drm/amd/display/dc/core/dc.c | ||
3315 | +++ b/drivers/gpu/drm/amd/display/dc/core/dc.c | ||
3316 | @@ -907,15 +907,11 @@ static void program_timing_sync( | ||
3317 | |||
3318 | /* set first pipe with plane as master */ | ||
3319 | for (j = 0; j < group_size; j++) { | ||
3320 | - struct pipe_ctx *temp; | ||
3321 | - | ||
3322 | if (pipe_set[j]->plane_state) { | ||
3323 | if (j == 0) | ||
3324 | break; | ||
3325 | |||
3326 | - temp = pipe_set[0]; | ||
3327 | - pipe_set[0] = pipe_set[j]; | ||
3328 | - pipe_set[j] = temp; | ||
3329 | + swap(pipe_set[0], pipe_set[j]); | ||
3330 | break; | ||
3331 | } | ||
3332 | } | ||
3333 | @@ -2230,6 +2226,12 @@ void dc_commit_updates_for_stream(struct dc *dc, | ||
3334 | |||
3335 | copy_stream_update_to_stream(dc, context, stream, stream_update); | ||
3336 | |||
3337 | + if (!dc->res_pool->funcs->validate_bandwidth(dc, context, false)) { | ||
3338 | + DC_ERROR("Mode validation failed for stream update!\n"); | ||
3339 | + dc_release_state(context); | ||
3340 | + return; | ||
3341 | + } | ||
3342 | + | ||
3343 | commit_planes_for_stream( | ||
3344 | dc, | ||
3345 | srf_updates, | ||
3346 | diff --git a/drivers/gpu/drm/amd/display/modules/color/color_gamma.c b/drivers/gpu/drm/amd/display/modules/color/color_gamma.c | ||
3347 | index 2d8f14b69117..207435fa4f2c 100644 | ||
3348 | --- a/drivers/gpu/drm/amd/display/modules/color/color_gamma.c | ||
3349 | +++ b/drivers/gpu/drm/amd/display/modules/color/color_gamma.c | ||
3350 | @@ -799,7 +799,7 @@ static bool build_regamma(struct pwl_float_data_ex *rgb_regamma, | ||
3351 | pow_buffer_ptr = -1; // reset back to no optimize | ||
3352 | ret = true; | ||
3353 | release: | ||
3354 | - kfree(coeff); | ||
3355 | + kvfree(coeff); | ||
3356 | return ret; | ||
3357 | } | ||
3358 | |||
3359 | diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/ci_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/ci_smumgr.c | ||
3360 | index 15590fd86ef4..2e71ca3e19f5 100644 | ||
3361 | --- a/drivers/gpu/drm/amd/powerplay/smumgr/ci_smumgr.c | ||
3362 | +++ b/drivers/gpu/drm/amd/powerplay/smumgr/ci_smumgr.c | ||
3363 | @@ -239,7 +239,7 @@ static void ci_initialize_power_tune_defaults(struct pp_hwmgr *hwmgr) | ||
3364 | |||
3365 | switch (dev_id) { | ||
3366 | case 0x67BA: | ||
3367 | - case 0x66B1: | ||
3368 | + case 0x67B1: | ||
3369 | smu_data->power_tune_defaults = &defaults_hawaii_pro; | ||
3370 | break; | ||
3371 | case 0x67B8: | ||
3372 | diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c | ||
3373 | index 4c766624b20d..2337b3827e6a 100644 | ||
3374 | --- a/drivers/gpu/drm/drm_connector.c | ||
3375 | +++ b/drivers/gpu/drm/drm_connector.c | ||
3376 | @@ -27,6 +27,7 @@ | ||
3377 | #include <drm/drm_print.h> | ||
3378 | #include <drm/drm_drv.h> | ||
3379 | #include <drm/drm_file.h> | ||
3380 | +#include <drm/drm_sysfs.h> | ||
3381 | |||
3382 | #include <linux/uaccess.h> | ||
3383 | |||
3384 | @@ -511,6 +512,10 @@ int drm_connector_register(struct drm_connector *connector) | ||
3385 | drm_mode_object_register(connector->dev, &connector->base); | ||
3386 | |||
3387 | connector->registration_state = DRM_CONNECTOR_REGISTERED; | ||
3388 | + | ||
3389 | + /* Let userspace know we have a new connector */ | ||
3390 | + drm_sysfs_hotplug_event(connector->dev); | ||
3391 | + | ||
3392 | goto unlock; | ||
3393 | |||
3394 | err_debugfs: | ||
3395 | diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c | ||
3396 | index 4b7aaad07423..006d6087700f 100644 | ||
3397 | --- a/drivers/gpu/drm/drm_dp_mst_topology.c | ||
3398 | +++ b/drivers/gpu/drm/drm_dp_mst_topology.c | ||
3399 | @@ -27,6 +27,7 @@ | ||
3400 | #include <linux/kernel.h> | ||
3401 | #include <linux/sched.h> | ||
3402 | #include <linux/seq_file.h> | ||
3403 | +#include <linux/iopoll.h> | ||
3404 | |||
3405 | #include <drm/drm_atomic.h> | ||
3406 | #include <drm/drm_atomic_helper.h> | ||
3407 | @@ -3498,6 +3499,17 @@ fail: | ||
3408 | return ret; | ||
3409 | } | ||
3410 | |||
3411 | +static int do_get_act_status(struct drm_dp_aux *aux) | ||
3412 | +{ | ||
3413 | + int ret; | ||
3414 | + u8 status; | ||
3415 | + | ||
3416 | + ret = drm_dp_dpcd_readb(aux, DP_PAYLOAD_TABLE_UPDATE_STATUS, &status); | ||
3417 | + if (ret < 0) | ||
3418 | + return ret; | ||
3419 | + | ||
3420 | + return status; | ||
3421 | +} | ||
3422 | |||
3423 | /** | ||
3424 | * drm_dp_check_act_status() - Check ACT handled status. | ||
3425 | @@ -3507,33 +3519,29 @@ fail: | ||
3426 | */ | ||
3427 | int drm_dp_check_act_status(struct drm_dp_mst_topology_mgr *mgr) | ||
3428 | { | ||
3429 | - u8 status; | ||
3430 | - int ret; | ||
3431 | - int count = 0; | ||
3432 | - | ||
3433 | - do { | ||
3434 | - ret = drm_dp_dpcd_readb(mgr->aux, DP_PAYLOAD_TABLE_UPDATE_STATUS, &status); | ||
3435 | - | ||
3436 | - if (ret < 0) { | ||
3437 | - DRM_DEBUG_KMS("failed to read payload table status %d\n", ret); | ||
3438 | - goto fail; | ||
3439 | - } | ||
3440 | - | ||
3441 | - if (status & DP_PAYLOAD_ACT_HANDLED) | ||
3442 | - break; | ||
3443 | - count++; | ||
3444 | - udelay(100); | ||
3445 | - | ||
3446 | - } while (count < 30); | ||
3447 | - | ||
3448 | - if (!(status & DP_PAYLOAD_ACT_HANDLED)) { | ||
3449 | - DRM_DEBUG_KMS("failed to get ACT bit %d after %d retries\n", status, count); | ||
3450 | - ret = -EINVAL; | ||
3451 | - goto fail; | ||
3452 | + /* | ||
3453 | + * There doesn't seem to be any recommended retry count or timeout in | ||
3454 | + * the MST specification. Since some hubs have been observed to take | ||
3455 | + * over 1 second to update their payload allocations under certain | ||
3456 | + * conditions, we use a rather large timeout value. | ||
3457 | + */ | ||
3458 | + const int timeout_ms = 3000; | ||
3459 | + int ret, status; | ||
3460 | + | ||
3461 | + ret = readx_poll_timeout(do_get_act_status, mgr->aux, status, | ||
3462 | + status & DP_PAYLOAD_ACT_HANDLED || status < 0, | ||
3463 | + 200, timeout_ms * USEC_PER_MSEC); | ||
3464 | + if (ret < 0 && status >= 0) { | ||
3465 | + DRM_DEBUG_KMS("Failed to get ACT after %dms, last status: %02x\n", | ||
3466 | + timeout_ms, status); | ||
3467 | + return -EINVAL; | ||
3468 | + } else if (status < 0) { | ||
3469 | + DRM_DEBUG_KMS("Failed to read payload table status: %d\n", | ||
3470 | + status); | ||
3471 | + return status; | ||
3472 | } | ||
3473 | + | ||
3474 | return 0; | ||
3475 | -fail: | ||
3476 | - return ret; | ||
3477 | } | ||
3478 | EXPORT_SYMBOL(drm_dp_check_act_status); | ||
3479 | |||
3480 | diff --git a/drivers/gpu/drm/drm_encoder_slave.c b/drivers/gpu/drm/drm_encoder_slave.c | ||
3481 | index cf804389f5ec..d50a7884e69e 100644 | ||
3482 | --- a/drivers/gpu/drm/drm_encoder_slave.c | ||
3483 | +++ b/drivers/gpu/drm/drm_encoder_slave.c | ||
3484 | @@ -84,7 +84,7 @@ int drm_i2c_encoder_init(struct drm_device *dev, | ||
3485 | |||
3486 | err = encoder_drv->encoder_init(client, dev, encoder); | ||
3487 | if (err) | ||
3488 | - goto fail_unregister; | ||
3489 | + goto fail_module_put; | ||
3490 | |||
3491 | if (info->platform_data) | ||
3492 | encoder->slave_funcs->set_config(&encoder->base, | ||
3493 | @@ -92,9 +92,10 @@ int drm_i2c_encoder_init(struct drm_device *dev, | ||
3494 | |||
3495 | return 0; | ||
3496 | |||
3497 | +fail_module_put: | ||
3498 | + module_put(module); | ||
3499 | fail_unregister: | ||
3500 | i2c_unregister_device(client); | ||
3501 | - module_put(module); | ||
3502 | fail: | ||
3503 | return err; | ||
3504 | } | ||
3505 | diff --git a/drivers/gpu/drm/drm_sysfs.c b/drivers/gpu/drm/drm_sysfs.c | ||
3506 | index dd2bc85f43cc..4fd2f6cd03c1 100644 | ||
3507 | --- a/drivers/gpu/drm/drm_sysfs.c | ||
3508 | +++ b/drivers/gpu/drm/drm_sysfs.c | ||
3509 | @@ -293,9 +293,6 @@ int drm_sysfs_connector_add(struct drm_connector *connector) | ||
3510 | return PTR_ERR(connector->kdev); | ||
3511 | } | ||
3512 | |||
3513 | - /* Let userspace know we have a new connector */ | ||
3514 | - drm_sysfs_hotplug_event(dev); | ||
3515 | - | ||
3516 | if (connector->ddc) | ||
3517 | return sysfs_create_link(&connector->kdev->kobj, | ||
3518 | &connector->ddc->dev.kobj, "ddc"); | ||
3519 | diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c | ||
3520 | index 4ab6531a4a74..2efc317c90df 100644 | ||
3521 | --- a/drivers/gpu/drm/i915/display/intel_dp.c | ||
3522 | +++ b/drivers/gpu/drm/i915/display/intel_dp.c | ||
3523 | @@ -1292,8 +1292,7 @@ intel_dp_aux_xfer(struct intel_dp *intel_dp, | ||
3524 | bool is_tc_port = intel_phy_is_tc(i915, phy); | ||
3525 | i915_reg_t ch_ctl, ch_data[5]; | ||
3526 | u32 aux_clock_divider; | ||
3527 | - enum intel_display_power_domain aux_domain = | ||
3528 | - intel_aux_power_domain(intel_dig_port); | ||
3529 | + enum intel_display_power_domain aux_domain; | ||
3530 | intel_wakeref_t aux_wakeref; | ||
3531 | intel_wakeref_t pps_wakeref; | ||
3532 | int i, ret, recv_bytes; | ||
3533 | @@ -1308,6 +1307,8 @@ intel_dp_aux_xfer(struct intel_dp *intel_dp, | ||
3534 | if (is_tc_port) | ||
3535 | intel_tc_port_lock(intel_dig_port); | ||
3536 | |||
3537 | + aux_domain = intel_aux_power_domain(intel_dig_port); | ||
3538 | + | ||
3539 | aux_wakeref = intel_display_power_get(i915, aux_domain); | ||
3540 | pps_wakeref = pps_lock(intel_dp); | ||
3541 | |||
3542 | diff --git a/drivers/gpu/drm/i915/gem/i915_gem_shmem.c b/drivers/gpu/drm/i915/gem/i915_gem_shmem.c | ||
3543 | index 4c4954e8ce0a..3f875aebbd23 100644 | ||
3544 | --- a/drivers/gpu/drm/i915/gem/i915_gem_shmem.c | ||
3545 | +++ b/drivers/gpu/drm/i915/gem/i915_gem_shmem.c | ||
3546 | @@ -36,7 +36,6 @@ static int shmem_get_pages(struct drm_i915_gem_object *obj) | ||
3547 | unsigned long last_pfn = 0; /* suppress gcc warning */ | ||
3548 | unsigned int max_segment = i915_sg_segment_size(); | ||
3549 | unsigned int sg_page_sizes; | ||
3550 | - struct pagevec pvec; | ||
3551 | gfp_t noreclaim; | ||
3552 | int ret; | ||
3553 | |||
3554 | @@ -188,13 +187,17 @@ err_sg: | ||
3555 | sg_mark_end(sg); | ||
3556 | err_pages: | ||
3557 | mapping_clear_unevictable(mapping); | ||
3558 | - pagevec_init(&pvec); | ||
3559 | - for_each_sgt_page(page, sgt_iter, st) { | ||
3560 | - if (!pagevec_add(&pvec, page)) | ||
3561 | + if (sg != st->sgl) { | ||
3562 | + struct pagevec pvec; | ||
3563 | + | ||
3564 | + pagevec_init(&pvec); | ||
3565 | + for_each_sgt_page(page, sgt_iter, st) { | ||
3566 | + if (!pagevec_add(&pvec, page)) | ||
3567 | + check_release_pagevec(&pvec); | ||
3568 | + } | ||
3569 | + if (pagevec_count(&pvec)) | ||
3570 | check_release_pagevec(&pvec); | ||
3571 | } | ||
3572 | - if (pagevec_count(&pvec)) | ||
3573 | - check_release_pagevec(&pvec); | ||
3574 | sg_free_table(st); | ||
3575 | kfree(st); | ||
3576 | |||
3577 | diff --git a/drivers/gpu/drm/i915/i915_cmd_parser.c b/drivers/gpu/drm/i915/i915_cmd_parser.c | ||
3578 | index f24096e27bef..21417ac8e878 100644 | ||
3579 | --- a/drivers/gpu/drm/i915/i915_cmd_parser.c | ||
3580 | +++ b/drivers/gpu/drm/i915/i915_cmd_parser.c | ||
3581 | @@ -572,6 +572,9 @@ struct drm_i915_reg_descriptor { | ||
3582 | #define REG32(_reg, ...) \ | ||
3583 | { .addr = (_reg), __VA_ARGS__ } | ||
3584 | |||
3585 | +#define REG32_IDX(_reg, idx) \ | ||
3586 | + { .addr = _reg(idx) } | ||
3587 | + | ||
3588 | /* | ||
3589 | * Convenience macro for adding 64-bit registers. | ||
3590 | * | ||
3591 | @@ -669,6 +672,7 @@ static const struct drm_i915_reg_descriptor gen9_blt_regs[] = { | ||
3592 | REG64_IDX(RING_TIMESTAMP, BSD_RING_BASE), | ||
3593 | REG32(BCS_SWCTRL), | ||
3594 | REG64_IDX(RING_TIMESTAMP, BLT_RING_BASE), | ||
3595 | + REG32_IDX(RING_CTX_TIMESTAMP, BLT_RING_BASE), | ||
3596 | REG64_IDX(BCS_GPR, 0), | ||
3597 | REG64_IDX(BCS_GPR, 1), | ||
3598 | REG64_IDX(BCS_GPR, 2), | ||
3599 | diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c | ||
3600 | index 37e3dd3c1a9d..4193a9970251 100644 | ||
3601 | --- a/drivers/gpu/drm/i915/i915_irq.c | ||
3602 | +++ b/drivers/gpu/drm/i915/i915_irq.c | ||
3603 | @@ -3500,6 +3500,7 @@ static void gen11_hpd_irq_setup(struct drm_i915_private *dev_priv) | ||
3604 | |||
3605 | val = I915_READ(GEN11_DE_HPD_IMR); | ||
3606 | val &= ~hotplug_irqs; | ||
3607 | + val |= ~enabled_irqs & hotplug_irqs; | ||
3608 | I915_WRITE(GEN11_DE_HPD_IMR, val); | ||
3609 | POSTING_READ(GEN11_DE_HPD_IMR); | ||
3610 | |||
3611 | diff --git a/drivers/gpu/drm/msm/adreno/a5xx_gpu.c b/drivers/gpu/drm/msm/adreno/a5xx_gpu.c | ||
3612 | index 99cd6e62a971..7829247de60e 100644 | ||
3613 | --- a/drivers/gpu/drm/msm/adreno/a5xx_gpu.c | ||
3614 | +++ b/drivers/gpu/drm/msm/adreno/a5xx_gpu.c | ||
3615 | @@ -1359,6 +1359,10 @@ static unsigned long a5xx_gpu_busy(struct msm_gpu *gpu) | ||
3616 | { | ||
3617 | u64 busy_cycles, busy_time; | ||
3618 | |||
3619 | + /* Only read the gpu busy if the hardware is already active */ | ||
3620 | + if (pm_runtime_get_if_in_use(&gpu->pdev->dev) == 0) | ||
3621 | + return 0; | ||
3622 | + | ||
3623 | busy_cycles = gpu_read64(gpu, REG_A5XX_RBBM_PERFCTR_RBBM_0_LO, | ||
3624 | REG_A5XX_RBBM_PERFCTR_RBBM_0_HI); | ||
3625 | |||
3626 | @@ -1367,6 +1371,8 @@ static unsigned long a5xx_gpu_busy(struct msm_gpu *gpu) | ||
3627 | |||
3628 | gpu->devfreq.busy_cycles = busy_cycles; | ||
3629 | |||
3630 | + pm_runtime_put(&gpu->pdev->dev); | ||
3631 | + | ||
3632 | if (WARN_ON(busy_time > ~0LU)) | ||
3633 | return ~0LU; | ||
3634 | |||
3635 | diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c | ||
3636 | index 85f14feafdec..e62b286947a7 100644 | ||
3637 | --- a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c | ||
3638 | +++ b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c | ||
3639 | @@ -107,6 +107,13 @@ static void __a6xx_gmu_set_freq(struct a6xx_gmu *gmu, int index) | ||
3640 | struct msm_gpu *gpu = &adreno_gpu->base; | ||
3641 | int ret; | ||
3642 | |||
3643 | + /* | ||
3644 | + * This can get called from devfreq while the hardware is idle. Don't | ||
3645 | + * bring up the power if it isn't already active | ||
3646 | + */ | ||
3647 | + if (pm_runtime_get_if_in_use(gmu->dev) == 0) | ||
3648 | + return; | ||
3649 | + | ||
3650 | gmu_write(gmu, REG_A6XX_GMU_DCVS_ACK_OPTION, 0); | ||
3651 | |||
3652 | gmu_write(gmu, REG_A6XX_GMU_DCVS_PERF_SETTING, | ||
3653 | @@ -133,6 +140,7 @@ static void __a6xx_gmu_set_freq(struct a6xx_gmu *gmu, int index) | ||
3654 | * for now leave it at max so that the performance is nominal. | ||
3655 | */ | ||
3656 | icc_set_bw(gpu->icc_path, 0, MBps_to_icc(7216)); | ||
3657 | + pm_runtime_put(gmu->dev); | ||
3658 | } | ||
3659 | |||
3660 | void a6xx_gmu_set_freq(struct msm_gpu *gpu, unsigned long freq) | ||
3661 | diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c | ||
3662 | index 686c34d706b0..be68d4e6551c 100644 | ||
3663 | --- a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c | ||
3664 | +++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c | ||
3665 | @@ -803,6 +803,11 @@ static unsigned long a6xx_gpu_busy(struct msm_gpu *gpu) | ||
3666 | struct a6xx_gpu *a6xx_gpu = to_a6xx_gpu(adreno_gpu); | ||
3667 | u64 busy_cycles, busy_time; | ||
3668 | |||
3669 | + | ||
3670 | + /* Only read the gpu busy if the hardware is already active */ | ||
3671 | + if (pm_runtime_get_if_in_use(a6xx_gpu->gmu.dev) == 0) | ||
3672 | + return 0; | ||
3673 | + | ||
3674 | busy_cycles = gmu_read64(&a6xx_gpu->gmu, | ||
3675 | REG_A6XX_GMU_CX_GMU_POWER_COUNTER_XOCLK_0_L, | ||
3676 | REG_A6XX_GMU_CX_GMU_POWER_COUNTER_XOCLK_0_H); | ||
3677 | @@ -812,6 +817,8 @@ static unsigned long a6xx_gpu_busy(struct msm_gpu *gpu) | ||
3678 | |||
3679 | gpu->devfreq.busy_cycles = busy_cycles; | ||
3680 | |||
3681 | + pm_runtime_put(a6xx_gpu->gmu.dev); | ||
3682 | + | ||
3683 | if (WARN_ON(busy_time > ~0LU)) | ||
3684 | return ~0LU; | ||
3685 | |||
3686 | diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c | ||
3687 | index 91cd76a2bab1..77823ccdd0f8 100644 | ||
3688 | --- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c | ||
3689 | +++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c | ||
3690 | @@ -1037,7 +1037,8 @@ static int mdp5_init(struct platform_device *pdev, struct drm_device *dev) | ||
3691 | |||
3692 | return 0; | ||
3693 | fail: | ||
3694 | - mdp5_destroy(pdev); | ||
3695 | + if (mdp5_kms) | ||
3696 | + mdp5_destroy(pdev); | ||
3697 | return ret; | ||
3698 | } | ||
3699 | |||
3700 | diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdmigm200.c b/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdmigm200.c | ||
3701 | index 9b16a08eb4d9..bf6d41fb0c9f 100644 | ||
3702 | --- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdmigm200.c | ||
3703 | +++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdmigm200.c | ||
3704 | @@ -27,10 +27,10 @@ void | ||
3705 | gm200_hdmi_scdc(struct nvkm_ior *ior, int head, u8 scdc) | ||
3706 | { | ||
3707 | struct nvkm_device *device = ior->disp->engine.subdev.device; | ||
3708 | - const u32 hoff = head * 0x800; | ||
3709 | + const u32 soff = nv50_ior_base(ior); | ||
3710 | const u32 ctrl = scdc & 0x3; | ||
3711 | |||
3712 | - nvkm_mask(device, 0x61c5bc + hoff, 0x00000003, ctrl); | ||
3713 | + nvkm_mask(device, 0x61c5bc + soff, 0x00000003, ctrl); | ||
3714 | |||
3715 | ior->tmds.high_speed = !!(scdc & 0x2); | ||
3716 | } | ||
3717 | diff --git a/drivers/gpu/drm/qxl/qxl_kms.c b/drivers/gpu/drm/qxl/qxl_kms.c | ||
3718 | index bfc1631093e9..9bdbe0db8795 100644 | ||
3719 | --- a/drivers/gpu/drm/qxl/qxl_kms.c | ||
3720 | +++ b/drivers/gpu/drm/qxl/qxl_kms.c | ||
3721 | @@ -218,7 +218,7 @@ int qxl_device_init(struct qxl_device *qdev, | ||
3722 | &(qdev->ram_header->cursor_ring_hdr), | ||
3723 | sizeof(struct qxl_command), | ||
3724 | QXL_CURSOR_RING_SIZE, | ||
3725 | - qdev->io_base + QXL_IO_NOTIFY_CMD, | ||
3726 | + qdev->io_base + QXL_IO_NOTIFY_CURSOR, | ||
3727 | false, | ||
3728 | &qdev->cursor_event); | ||
3729 | |||
3730 | diff --git a/drivers/gpu/drm/sun4i/sun4i_hdmi.h b/drivers/gpu/drm/sun4i/sun4i_hdmi.h | ||
3731 | index 7ad3f06c127e..00ca35f07ba5 100644 | ||
3732 | --- a/drivers/gpu/drm/sun4i/sun4i_hdmi.h | ||
3733 | +++ b/drivers/gpu/drm/sun4i/sun4i_hdmi.h | ||
3734 | @@ -148,7 +148,7 @@ | ||
3735 | #define SUN4I_HDMI_DDC_CMD_IMPLICIT_WRITE 3 | ||
3736 | |||
3737 | #define SUN4I_HDMI_DDC_CLK_REG 0x528 | ||
3738 | -#define SUN4I_HDMI_DDC_CLK_M(m) (((m) & 0x7) << 3) | ||
3739 | +#define SUN4I_HDMI_DDC_CLK_M(m) (((m) & 0xf) << 3) | ||
3740 | #define SUN4I_HDMI_DDC_CLK_N(n) ((n) & 0x7) | ||
3741 | |||
3742 | #define SUN4I_HDMI_DDC_LINE_CTRL_REG 0x540 | ||
3743 | diff --git a/drivers/gpu/drm/sun4i/sun4i_hdmi_ddc_clk.c b/drivers/gpu/drm/sun4i/sun4i_hdmi_ddc_clk.c | ||
3744 | index 2ff780114106..12430b9d4e93 100644 | ||
3745 | --- a/drivers/gpu/drm/sun4i/sun4i_hdmi_ddc_clk.c | ||
3746 | +++ b/drivers/gpu/drm/sun4i/sun4i_hdmi_ddc_clk.c | ||
3747 | @@ -33,7 +33,7 @@ static unsigned long sun4i_ddc_calc_divider(unsigned long rate, | ||
3748 | unsigned long best_rate = 0; | ||
3749 | u8 best_m = 0, best_n = 0, _m, _n; | ||
3750 | |||
3751 | - for (_m = 0; _m < 8; _m++) { | ||
3752 | + for (_m = 0; _m < 16; _m++) { | ||
3753 | for (_n = 0; _n < 8; _n++) { | ||
3754 | unsigned long tmp_rate; | ||
3755 | |||
3756 | diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h | ||
3757 | index 13b7222ef2c9..c552a6bc627e 100644 | ||
3758 | --- a/drivers/hid/hid-ids.h | ||
3759 | +++ b/drivers/hid/hid-ids.h | ||
3760 | @@ -1147,6 +1147,9 @@ | ||
3761 | #define USB_DEVICE_ID_TPV_OPTICAL_TOUCHSCREEN_8882 0x8882 | ||
3762 | #define USB_DEVICE_ID_TPV_OPTICAL_TOUCHSCREEN_8883 0x8883 | ||
3763 | |||
3764 | +#define USB_VENDOR_ID_TRUST 0x145f | ||
3765 | +#define USB_DEVICE_ID_TRUST_PANORA_TABLET 0x0212 | ||
3766 | + | ||
3767 | #define USB_VENDOR_ID_TURBOX 0x062a | ||
3768 | #define USB_DEVICE_ID_TURBOX_KEYBOARD 0x0201 | ||
3769 | #define USB_DEVICE_ID_ASUS_MD_5110 0x5110 | ||
3770 | diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c | ||
3771 | index 90ec2390ef68..168fdaa1999f 100644 | ||
3772 | --- a/drivers/hid/hid-quirks.c | ||
3773 | +++ b/drivers/hid/hid-quirks.c | ||
3774 | @@ -168,6 +168,7 @@ static const struct hid_device_id hid_quirks[] = { | ||
3775 | { HID_USB_DEVICE(USB_VENDOR_ID_TOUCHPACK, USB_DEVICE_ID_TOUCHPACK_RTS), HID_QUIRK_MULTI_INPUT }, | ||
3776 | { HID_USB_DEVICE(USB_VENDOR_ID_TPV, USB_DEVICE_ID_TPV_OPTICAL_TOUCHSCREEN_8882), HID_QUIRK_NOGET }, | ||
3777 | { HID_USB_DEVICE(USB_VENDOR_ID_TPV, USB_DEVICE_ID_TPV_OPTICAL_TOUCHSCREEN_8883), HID_QUIRK_NOGET }, | ||
3778 | + { HID_USB_DEVICE(USB_VENDOR_ID_TRUST, USB_DEVICE_ID_TRUST_PANORA_TABLET), HID_QUIRK_MULTI_INPUT | HID_QUIRK_HIDINPUT_FORCE }, | ||
3779 | { HID_USB_DEVICE(USB_VENDOR_ID_TURBOX, USB_DEVICE_ID_TURBOX_KEYBOARD), HID_QUIRK_NOGET }, | ||
3780 | { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_KNA5), HID_QUIRK_MULTI_INPUT }, | ||
3781 | { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_TWA60), HID_QUIRK_MULTI_INPUT }, | ||
3782 | diff --git a/drivers/hid/intel-ish-hid/ishtp-fw-loader.c b/drivers/hid/intel-ish-hid/ishtp-fw-loader.c | ||
3783 | index aa2dbed30fc3..6cf59fd26ad7 100644 | ||
3784 | --- a/drivers/hid/intel-ish-hid/ishtp-fw-loader.c | ||
3785 | +++ b/drivers/hid/intel-ish-hid/ishtp-fw-loader.c | ||
3786 | @@ -480,6 +480,7 @@ static int ish_query_loader_prop(struct ishtp_cl_data *client_data, | ||
3787 | sizeof(ldr_xfer_query_resp)); | ||
3788 | if (rv < 0) { | ||
3789 | client_data->flag_retry = true; | ||
3790 | + *fw_info = (struct shim_fw_info){}; | ||
3791 | return rv; | ||
3792 | } | ||
3793 | |||
3794 | @@ -489,6 +490,7 @@ static int ish_query_loader_prop(struct ishtp_cl_data *client_data, | ||
3795 | "data size %d is not equal to size of loader_xfer_query_response %zu\n", | ||
3796 | rv, sizeof(struct loader_xfer_query_response)); | ||
3797 | client_data->flag_retry = true; | ||
3798 | + *fw_info = (struct shim_fw_info){}; | ||
3799 | return -EMSGSIZE; | ||
3800 | } | ||
3801 | |||
3802 | diff --git a/drivers/hwtracing/coresight/coresight-tmc-etf.c b/drivers/hwtracing/coresight/coresight-tmc-etf.c | ||
3803 | index d0cc3985b72a..36cce2bfb744 100644 | ||
3804 | --- a/drivers/hwtracing/coresight/coresight-tmc-etf.c | ||
3805 | +++ b/drivers/hwtracing/coresight/coresight-tmc-etf.c | ||
3806 | @@ -596,13 +596,6 @@ int tmc_read_prepare_etb(struct tmc_drvdata *drvdata) | ||
3807 | goto out; | ||
3808 | } | ||
3809 | |||
3810 | - /* There is no point in reading a TMC in HW FIFO mode */ | ||
3811 | - mode = readl_relaxed(drvdata->base + TMC_MODE); | ||
3812 | - if (mode != TMC_MODE_CIRCULAR_BUFFER) { | ||
3813 | - ret = -EINVAL; | ||
3814 | - goto out; | ||
3815 | - } | ||
3816 | - | ||
3817 | /* Don't interfere if operated from Perf */ | ||
3818 | if (drvdata->mode == CS_MODE_PERF) { | ||
3819 | ret = -EINVAL; | ||
3820 | @@ -616,8 +609,15 @@ int tmc_read_prepare_etb(struct tmc_drvdata *drvdata) | ||
3821 | } | ||
3822 | |||
3823 | /* Disable the TMC if need be */ | ||
3824 | - if (drvdata->mode == CS_MODE_SYSFS) | ||
3825 | + if (drvdata->mode == CS_MODE_SYSFS) { | ||
3826 | + /* There is no point in reading a TMC in HW FIFO mode */ | ||
3827 | + mode = readl_relaxed(drvdata->base + TMC_MODE); | ||
3828 | + if (mode != TMC_MODE_CIRCULAR_BUFFER) { | ||
3829 | + ret = -EINVAL; | ||
3830 | + goto out; | ||
3831 | + } | ||
3832 | __tmc_etb_disable_hw(drvdata); | ||
3833 | + } | ||
3834 | |||
3835 | drvdata->reading = true; | ||
3836 | out: | ||
3837 | diff --git a/drivers/i2c/busses/i2c-icy.c b/drivers/i2c/busses/i2c-icy.c | ||
3838 | index 8382eb64b424..d6c17506dba4 100644 | ||
3839 | --- a/drivers/i2c/busses/i2c-icy.c | ||
3840 | +++ b/drivers/i2c/busses/i2c-icy.c | ||
3841 | @@ -43,6 +43,7 @@ | ||
3842 | #include <linux/i2c.h> | ||
3843 | #include <linux/i2c-algo-pcf.h> | ||
3844 | |||
3845 | +#include <asm/amigahw.h> | ||
3846 | #include <asm/amigaints.h> | ||
3847 | #include <linux/zorro.h> | ||
3848 | |||
3849 | diff --git a/drivers/i2c/busses/i2c-piix4.c b/drivers/i2c/busses/i2c-piix4.c | ||
3850 | index 30ded6422e7b..69740a4ff1db 100644 | ||
3851 | --- a/drivers/i2c/busses/i2c-piix4.c | ||
3852 | +++ b/drivers/i2c/busses/i2c-piix4.c | ||
3853 | @@ -977,7 +977,8 @@ static int piix4_probe(struct pci_dev *dev, const struct pci_device_id *id) | ||
3854 | } | ||
3855 | |||
3856 | if (dev->vendor == PCI_VENDOR_ID_AMD && | ||
3857 | - dev->device == PCI_DEVICE_ID_AMD_HUDSON2_SMBUS) { | ||
3858 | + (dev->device == PCI_DEVICE_ID_AMD_HUDSON2_SMBUS || | ||
3859 | + dev->device == PCI_DEVICE_ID_AMD_KERNCZ_SMBUS)) { | ||
3860 | retval = piix4_setup_sb800(dev, id, 1); | ||
3861 | } | ||
3862 | |||
3863 | diff --git a/drivers/i2c/busses/i2c-pxa.c b/drivers/i2c/busses/i2c-pxa.c | ||
3864 | index 2c3c3d6935c0..d0c557c8d80f 100644 | ||
3865 | --- a/drivers/i2c/busses/i2c-pxa.c | ||
3866 | +++ b/drivers/i2c/busses/i2c-pxa.c | ||
3867 | @@ -312,11 +312,10 @@ static void i2c_pxa_scream_blue_murder(struct pxa_i2c *i2c, const char *why) | ||
3868 | dev_err(dev, "IBMR: %08x IDBR: %08x ICR: %08x ISR: %08x\n", | ||
3869 | readl(_IBMR(i2c)), readl(_IDBR(i2c)), readl(_ICR(i2c)), | ||
3870 | readl(_ISR(i2c))); | ||
3871 | - dev_dbg(dev, "log: "); | ||
3872 | + dev_err(dev, "log:"); | ||
3873 | for (i = 0; i < i2c->irqlogidx; i++) | ||
3874 | - pr_debug("[%08x:%08x] ", i2c->isrlog[i], i2c->icrlog[i]); | ||
3875 | - | ||
3876 | - pr_debug("\n"); | ||
3877 | + pr_cont(" [%03x:%05x]", i2c->isrlog[i], i2c->icrlog[i]); | ||
3878 | + pr_cont("\n"); | ||
3879 | } | ||
3880 | |||
3881 | #else /* ifdef DEBUG */ | ||
3882 | @@ -706,11 +705,9 @@ static inline void i2c_pxa_stop_message(struct pxa_i2c *i2c) | ||
3883 | { | ||
3884 | u32 icr; | ||
3885 | |||
3886 | - /* | ||
3887 | - * Clear the STOP and ACK flags | ||
3888 | - */ | ||
3889 | + /* Clear the START, STOP, ACK, TB and MA flags */ | ||
3890 | icr = readl(_ICR(i2c)); | ||
3891 | - icr &= ~(ICR_STOP | ICR_ACKNAK); | ||
3892 | + icr &= ~(ICR_START | ICR_STOP | ICR_ACKNAK | ICR_TB | ICR_MA); | ||
3893 | writel(icr, _ICR(i2c)); | ||
3894 | } | ||
3895 | |||
3896 | diff --git a/drivers/iio/pressure/bmp280-core.c b/drivers/iio/pressure/bmp280-core.c | ||
3897 | index 8d0f15f27dc5..0a95afaa48fe 100644 | ||
3898 | --- a/drivers/iio/pressure/bmp280-core.c | ||
3899 | +++ b/drivers/iio/pressure/bmp280-core.c | ||
3900 | @@ -264,6 +264,8 @@ static u32 bmp280_compensate_humidity(struct bmp280_data *data, | ||
3901 | + (s32)2097152) * calib->H2 + 8192) >> 14); | ||
3902 | var -= ((((var >> 15) * (var >> 15)) >> 7) * (s32)calib->H1) >> 4; | ||
3903 | |||
3904 | + var = clamp_val(var, 0, 419430400); | ||
3905 | + | ||
3906 | return var >> 12; | ||
3907 | }; | ||
3908 | |||
3909 | @@ -706,7 +708,7 @@ static int bmp180_measure(struct bmp280_data *data, u8 ctrl_meas) | ||
3910 | unsigned int ctrl; | ||
3911 | |||
3912 | if (data->use_eoc) | ||
3913 | - init_completion(&data->done); | ||
3914 | + reinit_completion(&data->done); | ||
3915 | |||
3916 | ret = regmap_write(data->regmap, BMP280_REG_CTRL_MEAS, ctrl_meas); | ||
3917 | if (ret) | ||
3918 | @@ -962,6 +964,9 @@ static int bmp085_fetch_eoc_irq(struct device *dev, | ||
3919 | "trying to enforce it\n"); | ||
3920 | irq_trig = IRQF_TRIGGER_RISING; | ||
3921 | } | ||
3922 | + | ||
3923 | + init_completion(&data->done); | ||
3924 | + | ||
3925 | ret = devm_request_threaded_irq(dev, | ||
3926 | irq, | ||
3927 | bmp085_eoc_irq, | ||
3928 | diff --git a/drivers/infiniband/core/cma_configfs.c b/drivers/infiniband/core/cma_configfs.c | ||
3929 | index 8b0b5ae22e4c..726e70b68249 100644 | ||
3930 | --- a/drivers/infiniband/core/cma_configfs.c | ||
3931 | +++ b/drivers/infiniband/core/cma_configfs.c | ||
3932 | @@ -322,8 +322,21 @@ fail: | ||
3933 | return ERR_PTR(err); | ||
3934 | } | ||
3935 | |||
3936 | +static void drop_cma_dev(struct config_group *cgroup, struct config_item *item) | ||
3937 | +{ | ||
3938 | + struct config_group *group = | ||
3939 | + container_of(item, struct config_group, cg_item); | ||
3940 | + struct cma_dev_group *cma_dev_group = | ||
3941 | + container_of(group, struct cma_dev_group, device_group); | ||
3942 | + | ||
3943 | + configfs_remove_default_groups(&cma_dev_group->ports_group); | ||
3944 | + configfs_remove_default_groups(&cma_dev_group->device_group); | ||
3945 | + config_item_put(item); | ||
3946 | +} | ||
3947 | + | ||
3948 | static struct configfs_group_operations cma_subsys_group_ops = { | ||
3949 | .make_group = make_cma_dev, | ||
3950 | + .drop_item = drop_cma_dev, | ||
3951 | }; | ||
3952 | |||
3953 | static const struct config_item_type cma_subsys_type = { | ||
3954 | diff --git a/drivers/infiniband/core/sysfs.c b/drivers/infiniband/core/sysfs.c | ||
3955 | index 7a50cedcef1f..091cca9d88ed 100644 | ||
3956 | --- a/drivers/infiniband/core/sysfs.c | ||
3957 | +++ b/drivers/infiniband/core/sysfs.c | ||
3958 | @@ -1060,8 +1060,7 @@ static int add_port(struct ib_core_device *coredev, int port_num) | ||
3959 | coredev->ports_kobj, | ||
3960 | "%d", port_num); | ||
3961 | if (ret) { | ||
3962 | - kfree(p); | ||
3963 | - return ret; | ||
3964 | + goto err_put; | ||
3965 | } | ||
3966 | |||
3967 | p->gid_attr_group = kzalloc(sizeof(*p->gid_attr_group), GFP_KERNEL); | ||
3968 | @@ -1074,8 +1073,7 @@ static int add_port(struct ib_core_device *coredev, int port_num) | ||
3969 | ret = kobject_init_and_add(&p->gid_attr_group->kobj, &gid_attr_type, | ||
3970 | &p->kobj, "gid_attrs"); | ||
3971 | if (ret) { | ||
3972 | - kfree(p->gid_attr_group); | ||
3973 | - goto err_put; | ||
3974 | + goto err_put_gid_attrs; | ||
3975 | } | ||
3976 | |||
3977 | if (device->ops.process_mad && is_full_dev) { | ||
3978 | @@ -1406,8 +1404,10 @@ int ib_port_register_module_stat(struct ib_device *device, u8 port_num, | ||
3979 | |||
3980 | ret = kobject_init_and_add(kobj, ktype, &port->kobj, "%s", | ||
3981 | name); | ||
3982 | - if (ret) | ||
3983 | + if (ret) { | ||
3984 | + kobject_put(kobj); | ||
3985 | return ret; | ||
3986 | + } | ||
3987 | } | ||
3988 | |||
3989 | return 0; | ||
3990 | diff --git a/drivers/infiniband/hw/cxgb4/device.c b/drivers/infiniband/hw/cxgb4/device.c | ||
3991 | index 599340c1f0b8..541dbcf22d0e 100644 | ||
3992 | --- a/drivers/infiniband/hw/cxgb4/device.c | ||
3993 | +++ b/drivers/infiniband/hw/cxgb4/device.c | ||
3994 | @@ -953,6 +953,7 @@ void c4iw_dealloc(struct uld_ctx *ctx) | ||
3995 | static void c4iw_remove(struct uld_ctx *ctx) | ||
3996 | { | ||
3997 | pr_debug("c4iw_dev %p\n", ctx->dev); | ||
3998 | + debugfs_remove_recursive(ctx->dev->debugfs_root); | ||
3999 | c4iw_unregister_device(ctx->dev); | ||
4000 | c4iw_dealloc(ctx); | ||
4001 | } | ||
4002 | diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c | ||
4003 | index 4540b00ccee9..0502c90c83ed 100644 | ||
4004 | --- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c | ||
4005 | +++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c | ||
4006 | @@ -1349,34 +1349,26 @@ static int hns_roce_query_pf_resource(struct hns_roce_dev *hr_dev) | ||
4007 | static int hns_roce_query_pf_timer_resource(struct hns_roce_dev *hr_dev) | ||
4008 | { | ||
4009 | struct hns_roce_pf_timer_res_a *req_a; | ||
4010 | - struct hns_roce_cmq_desc desc[2]; | ||
4011 | - int ret, i; | ||
4012 | + struct hns_roce_cmq_desc desc; | ||
4013 | + int ret; | ||
4014 | |||
4015 | - for (i = 0; i < 2; i++) { | ||
4016 | - hns_roce_cmq_setup_basic_desc(&desc[i], | ||
4017 | - HNS_ROCE_OPC_QUERY_PF_TIMER_RES, | ||
4018 | - true); | ||
4019 | + hns_roce_cmq_setup_basic_desc(&desc, HNS_ROCE_OPC_QUERY_PF_TIMER_RES, | ||
4020 | + true); | ||
4021 | |||
4022 | - if (i == 0) | ||
4023 | - desc[i].flag |= cpu_to_le16(HNS_ROCE_CMD_FLAG_NEXT); | ||
4024 | - else | ||
4025 | - desc[i].flag &= ~cpu_to_le16(HNS_ROCE_CMD_FLAG_NEXT); | ||
4026 | - } | ||
4027 | - | ||
4028 | - ret = hns_roce_cmq_send(hr_dev, desc, 2); | ||
4029 | + ret = hns_roce_cmq_send(hr_dev, &desc, 1); | ||
4030 | if (ret) | ||
4031 | return ret; | ||
4032 | |||
4033 | - req_a = (struct hns_roce_pf_timer_res_a *)desc[0].data; | ||
4034 | + req_a = (struct hns_roce_pf_timer_res_a *)desc.data; | ||
4035 | |||
4036 | hr_dev->caps.qpc_timer_bt_num = | ||
4037 | - roce_get_field(req_a->qpc_timer_bt_idx_num, | ||
4038 | - PF_RES_DATA_1_PF_QPC_TIMER_BT_NUM_M, | ||
4039 | - PF_RES_DATA_1_PF_QPC_TIMER_BT_NUM_S); | ||
4040 | + roce_get_field(req_a->qpc_timer_bt_idx_num, | ||
4041 | + PF_RES_DATA_1_PF_QPC_TIMER_BT_NUM_M, | ||
4042 | + PF_RES_DATA_1_PF_QPC_TIMER_BT_NUM_S); | ||
4043 | hr_dev->caps.cqc_timer_bt_num = | ||
4044 | - roce_get_field(req_a->cqc_timer_bt_idx_num, | ||
4045 | - PF_RES_DATA_2_PF_CQC_TIMER_BT_NUM_M, | ||
4046 | - PF_RES_DATA_2_PF_CQC_TIMER_BT_NUM_S); | ||
4047 | + roce_get_field(req_a->cqc_timer_bt_idx_num, | ||
4048 | + PF_RES_DATA_2_PF_CQC_TIMER_BT_NUM_M, | ||
4049 | + PF_RES_DATA_2_PF_CQC_TIMER_BT_NUM_S); | ||
4050 | |||
4051 | return 0; | ||
4052 | } | ||
4053 | @@ -4564,7 +4556,7 @@ static int hns_roce_v2_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *qp_attr, | ||
4054 | qp_attr->path_mig_state = IB_MIG_ARMED; | ||
4055 | qp_attr->ah_attr.type = RDMA_AH_ATTR_TYPE_ROCE; | ||
4056 | if (hr_qp->ibqp.qp_type == IB_QPT_UD) | ||
4057 | - qp_attr->qkey = V2_QKEY_VAL; | ||
4058 | + qp_attr->qkey = le32_to_cpu(context.qkey_xrcd); | ||
4059 | |||
4060 | qp_attr->rq_psn = roce_get_field(context.byte_108_rx_reqepsn, | ||
4061 | V2_QPC_BYTE_108_RX_REQ_EPSN_M, | ||
4062 | diff --git a/drivers/infiniband/hw/mlx5/devx.c b/drivers/infiniband/hw/mlx5/devx.c | ||
4063 | index d609f4659afb..fd75a9043bf1 100644 | ||
4064 | --- a/drivers/infiniband/hw/mlx5/devx.c | ||
4065 | +++ b/drivers/infiniband/hw/mlx5/devx.c | ||
4066 | @@ -489,6 +489,10 @@ static u64 devx_get_obj_id(const void *in) | ||
4067 | obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_QP, | ||
4068 | MLX5_GET(rst2init_qp_in, in, qpn)); | ||
4069 | break; | ||
4070 | + case MLX5_CMD_OP_INIT2INIT_QP: | ||
4071 | + obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_QP, | ||
4072 | + MLX5_GET(init2init_qp_in, in, qpn)); | ||
4073 | + break; | ||
4074 | case MLX5_CMD_OP_INIT2RTR_QP: | ||
4075 | obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_QP, | ||
4076 | MLX5_GET(init2rtr_qp_in, in, qpn)); | ||
4077 | @@ -814,6 +818,7 @@ static bool devx_is_obj_modify_cmd(const void *in) | ||
4078 | case MLX5_CMD_OP_SET_L2_TABLE_ENTRY: | ||
4079 | case MLX5_CMD_OP_RST2INIT_QP: | ||
4080 | case MLX5_CMD_OP_INIT2RTR_QP: | ||
4081 | + case MLX5_CMD_OP_INIT2INIT_QP: | ||
4082 | case MLX5_CMD_OP_RTR2RTS_QP: | ||
4083 | case MLX5_CMD_OP_RTS2RTS_QP: | ||
4084 | case MLX5_CMD_OP_SQERR2RTS_QP: | ||
4085 | diff --git a/drivers/infiniband/hw/mlx5/srq.c b/drivers/infiniband/hw/mlx5/srq.c | ||
4086 | index 4e7fde86c96b..c29c1f7da4a1 100644 | ||
4087 | --- a/drivers/infiniband/hw/mlx5/srq.c | ||
4088 | +++ b/drivers/infiniband/hw/mlx5/srq.c | ||
4089 | @@ -310,12 +310,18 @@ int mlx5_ib_create_srq(struct ib_srq *ib_srq, | ||
4090 | srq->msrq.event = mlx5_ib_srq_event; | ||
4091 | srq->ibsrq.ext.xrc.srq_num = srq->msrq.srqn; | ||
4092 | |||
4093 | - if (udata) | ||
4094 | - if (ib_copy_to_udata(udata, &srq->msrq.srqn, sizeof(__u32))) { | ||
4095 | + if (udata) { | ||
4096 | + struct mlx5_ib_create_srq_resp resp = { | ||
4097 | + .srqn = srq->msrq.srqn, | ||
4098 | + }; | ||
4099 | + | ||
4100 | + if (ib_copy_to_udata(udata, &resp, min(udata->outlen, | ||
4101 | + sizeof(resp)))) { | ||
4102 | mlx5_ib_dbg(dev, "copy to user failed\n"); | ||
4103 | err = -EFAULT; | ||
4104 | goto err_core; | ||
4105 | } | ||
4106 | + } | ||
4107 | |||
4108 | init_attr->attr.max_wr = srq->msrq.max - 1; | ||
4109 | |||
4110 | diff --git a/drivers/input/serio/i8042-ppcio.h b/drivers/input/serio/i8042-ppcio.h | ||
4111 | deleted file mode 100644 | ||
4112 | index 391f94d9e47d..000000000000 | ||
4113 | --- a/drivers/input/serio/i8042-ppcio.h | ||
4114 | +++ /dev/null | ||
4115 | @@ -1,57 +0,0 @@ | ||
4116 | -/* SPDX-License-Identifier: GPL-2.0-only */ | ||
4117 | -#ifndef _I8042_PPCIO_H | ||
4118 | -#define _I8042_PPCIO_H | ||
4119 | - | ||
4120 | - | ||
4121 | -#if defined(CONFIG_WALNUT) | ||
4122 | - | ||
4123 | -#define I8042_KBD_IRQ 25 | ||
4124 | -#define I8042_AUX_IRQ 26 | ||
4125 | - | ||
4126 | -#define I8042_KBD_PHYS_DESC "walnutps2/serio0" | ||
4127 | -#define I8042_AUX_PHYS_DESC "walnutps2/serio1" | ||
4128 | -#define I8042_MUX_PHYS_DESC "walnutps2/serio%d" | ||
4129 | - | ||
4130 | -extern void *kb_cs; | ||
4131 | -extern void *kb_data; | ||
4132 | - | ||
4133 | -#define I8042_COMMAND_REG (*(int *)kb_cs) | ||
4134 | -#define I8042_DATA_REG (*(int *)kb_data) | ||
4135 | - | ||
4136 | -static inline int i8042_read_data(void) | ||
4137 | -{ | ||
4138 | - return readb(kb_data); | ||
4139 | -} | ||
4140 | - | ||
4141 | -static inline int i8042_read_status(void) | ||
4142 | -{ | ||
4143 | - return readb(kb_cs); | ||
4144 | -} | ||
4145 | - | ||
4146 | -static inline void i8042_write_data(int val) | ||
4147 | -{ | ||
4148 | - writeb(val, kb_data); | ||
4149 | -} | ||
4150 | - | ||
4151 | -static inline void i8042_write_command(int val) | ||
4152 | -{ | ||
4153 | - writeb(val, kb_cs); | ||
4154 | -} | ||
4155 | - | ||
4156 | -static inline int i8042_platform_init(void) | ||
4157 | -{ | ||
4158 | - i8042_reset = I8042_RESET_ALWAYS; | ||
4159 | - return 0; | ||
4160 | -} | ||
4161 | - | ||
4162 | -static inline void i8042_platform_exit(void) | ||
4163 | -{ | ||
4164 | -} | ||
4165 | - | ||
4166 | -#else | ||
4167 | - | ||
4168 | -#include "i8042-io.h" | ||
4169 | - | ||
4170 | -#endif | ||
4171 | - | ||
4172 | -#endif /* _I8042_PPCIO_H */ | ||
4173 | diff --git a/drivers/input/serio/i8042.h b/drivers/input/serio/i8042.h | ||
4174 | index 38dc27ad3c18..eb376700dfff 100644 | ||
4175 | --- a/drivers/input/serio/i8042.h | ||
4176 | +++ b/drivers/input/serio/i8042.h | ||
4177 | @@ -17,8 +17,6 @@ | ||
4178 | #include "i8042-ip22io.h" | ||
4179 | #elif defined(CONFIG_SNI_RM) | ||
4180 | #include "i8042-snirm.h" | ||
4181 | -#elif defined(CONFIG_PPC) | ||
4182 | -#include "i8042-ppcio.h" | ||
4183 | #elif defined(CONFIG_SPARC) | ||
4184 | #include "i8042-sparcio.h" | ||
4185 | #elif defined(CONFIG_X86) || defined(CONFIG_IA64) | ||
4186 | diff --git a/drivers/input/touchscreen/edt-ft5x06.c b/drivers/input/touchscreen/edt-ft5x06.c | ||
4187 | index 240e8de24cd2..b41b97c962ed 100644 | ||
4188 | --- a/drivers/input/touchscreen/edt-ft5x06.c | ||
4189 | +++ b/drivers/input/touchscreen/edt-ft5x06.c | ||
4190 | @@ -935,19 +935,25 @@ static void edt_ft5x06_ts_get_defaults(struct device *dev, | ||
4191 | |||
4192 | error = device_property_read_u32(dev, "offset", &val); | ||
4193 | if (!error) { | ||
4194 | - edt_ft5x06_register_write(tsdata, reg_addr->reg_offset, val); | ||
4195 | + if (reg_addr->reg_offset != NO_REGISTER) | ||
4196 | + edt_ft5x06_register_write(tsdata, | ||
4197 | + reg_addr->reg_offset, val); | ||
4198 | tsdata->offset = val; | ||
4199 | } | ||
4200 | |||
4201 | error = device_property_read_u32(dev, "offset-x", &val); | ||
4202 | if (!error) { | ||
4203 | - edt_ft5x06_register_write(tsdata, reg_addr->reg_offset_x, val); | ||
4204 | + if (reg_addr->reg_offset_x != NO_REGISTER) | ||
4205 | + edt_ft5x06_register_write(tsdata, | ||
4206 | + reg_addr->reg_offset_x, val); | ||
4207 | tsdata->offset_x = val; | ||
4208 | } | ||
4209 | |||
4210 | error = device_property_read_u32(dev, "offset-y", &val); | ||
4211 | if (!error) { | ||
4212 | - edt_ft5x06_register_write(tsdata, reg_addr->reg_offset_y, val); | ||
4213 | + if (reg_addr->reg_offset_y != NO_REGISTER) | ||
4214 | + edt_ft5x06_register_write(tsdata, | ||
4215 | + reg_addr->reg_offset_y, val); | ||
4216 | tsdata->offset_y = val; | ||
4217 | } | ||
4218 | } | ||
4219 | diff --git a/drivers/mailbox/zynqmp-ipi-mailbox.c b/drivers/mailbox/zynqmp-ipi-mailbox.c | ||
4220 | index 86887c9a349a..f9cc674ba9b7 100644 | ||
4221 | --- a/drivers/mailbox/zynqmp-ipi-mailbox.c | ||
4222 | +++ b/drivers/mailbox/zynqmp-ipi-mailbox.c | ||
4223 | @@ -504,10 +504,9 @@ static int zynqmp_ipi_mbox_probe(struct zynqmp_ipi_mbox *ipi_mbox, | ||
4224 | mchan->req_buf_size = resource_size(&res); | ||
4225 | mchan->req_buf = devm_ioremap(mdev, res.start, | ||
4226 | mchan->req_buf_size); | ||
4227 | - if (IS_ERR(mchan->req_buf)) { | ||
4228 | + if (!mchan->req_buf) { | ||
4229 | dev_err(mdev, "Unable to map IPI buffer I/O memory\n"); | ||
4230 | - ret = PTR_ERR(mchan->req_buf); | ||
4231 | - return ret; | ||
4232 | + return -ENOMEM; | ||
4233 | } | ||
4234 | } else if (ret != -ENODEV) { | ||
4235 | dev_err(mdev, "Unmatched resource %s, %d.\n", name, ret); | ||
4236 | @@ -520,10 +519,9 @@ static int zynqmp_ipi_mbox_probe(struct zynqmp_ipi_mbox *ipi_mbox, | ||
4237 | mchan->resp_buf_size = resource_size(&res); | ||
4238 | mchan->resp_buf = devm_ioremap(mdev, res.start, | ||
4239 | mchan->resp_buf_size); | ||
4240 | - if (IS_ERR(mchan->resp_buf)) { | ||
4241 | + if (!mchan->resp_buf) { | ||
4242 | dev_err(mdev, "Unable to map IPI buffer I/O memory\n"); | ||
4243 | - ret = PTR_ERR(mchan->resp_buf); | ||
4244 | - return ret; | ||
4245 | + return -ENOMEM; | ||
4246 | } | ||
4247 | } else if (ret != -ENODEV) { | ||
4248 | dev_err(mdev, "Unmatched resource %s.\n", name); | ||
4249 | @@ -543,10 +541,9 @@ static int zynqmp_ipi_mbox_probe(struct zynqmp_ipi_mbox *ipi_mbox, | ||
4250 | mchan->req_buf_size = resource_size(&res); | ||
4251 | mchan->req_buf = devm_ioremap(mdev, res.start, | ||
4252 | mchan->req_buf_size); | ||
4253 | - if (IS_ERR(mchan->req_buf)) { | ||
4254 | + if (!mchan->req_buf) { | ||
4255 | dev_err(mdev, "Unable to map IPI buffer I/O memory\n"); | ||
4256 | - ret = PTR_ERR(mchan->req_buf); | ||
4257 | - return ret; | ||
4258 | + return -ENOMEM; | ||
4259 | } | ||
4260 | } else if (ret != -ENODEV) { | ||
4261 | dev_err(mdev, "Unmatched resource %s.\n", name); | ||
4262 | @@ -559,10 +556,9 @@ static int zynqmp_ipi_mbox_probe(struct zynqmp_ipi_mbox *ipi_mbox, | ||
4263 | mchan->resp_buf_size = resource_size(&res); | ||
4264 | mchan->resp_buf = devm_ioremap(mdev, res.start, | ||
4265 | mchan->resp_buf_size); | ||
4266 | - if (IS_ERR(mchan->resp_buf)) { | ||
4267 | + if (!mchan->resp_buf) { | ||
4268 | dev_err(mdev, "Unable to map IPI buffer I/O memory\n"); | ||
4269 | - ret = PTR_ERR(mchan->resp_buf); | ||
4270 | - return ret; | ||
4271 | + return -ENOMEM; | ||
4272 | } | ||
4273 | } else if (ret != -ENODEV) { | ||
4274 | dev_err(mdev, "Unmatched resource %s.\n", name); | ||
4275 | diff --git a/drivers/md/bcache/btree.c b/drivers/md/bcache/btree.c | ||
4276 | index 46a8b5a91c38..3c1109fceb2f 100644 | ||
4277 | --- a/drivers/md/bcache/btree.c | ||
4278 | +++ b/drivers/md/bcache/btree.c | ||
4279 | @@ -1442,7 +1442,7 @@ static int btree_gc_coalesce(struct btree *b, struct btree_op *op, | ||
4280 | if (__set_blocks(n1, n1->keys + n2->keys, | ||
4281 | block_bytes(b->c)) > | ||
4282 | btree_blocks(new_nodes[i])) | ||
4283 | - goto out_nocoalesce; | ||
4284 | + goto out_unlock_nocoalesce; | ||
4285 | |||
4286 | keys = n2->keys; | ||
4287 | /* Take the key of the node we're getting rid of */ | ||
4288 | @@ -1471,7 +1471,7 @@ static int btree_gc_coalesce(struct btree *b, struct btree_op *op, | ||
4289 | |||
4290 | if (__bch_keylist_realloc(&keylist, | ||
4291 | bkey_u64s(&new_nodes[i]->key))) | ||
4292 | - goto out_nocoalesce; | ||
4293 | + goto out_unlock_nocoalesce; | ||
4294 | |||
4295 | bch_btree_node_write(new_nodes[i], &cl); | ||
4296 | bch_keylist_add(&keylist, &new_nodes[i]->key); | ||
4297 | @@ -1517,6 +1517,10 @@ static int btree_gc_coalesce(struct btree *b, struct btree_op *op, | ||
4298 | /* Invalidated our iterator */ | ||
4299 | return -EINTR; | ||
4300 | |||
4301 | +out_unlock_nocoalesce: | ||
4302 | + for (i = 0; i < nodes; i++) | ||
4303 | + mutex_unlock(&new_nodes[i]->write_lock); | ||
4304 | + | ||
4305 | out_nocoalesce: | ||
4306 | closure_sync(&cl); | ||
4307 | |||
4308 | diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c | ||
4309 | index 456d790c918c..f2de4c73cc8f 100644 | ||
4310 | --- a/drivers/md/dm-mpath.c | ||
4311 | +++ b/drivers/md/dm-mpath.c | ||
4312 | @@ -1856,7 +1856,7 @@ static int multipath_prepare_ioctl(struct dm_target *ti, | ||
4313 | int r; | ||
4314 | |||
4315 | current_pgpath = READ_ONCE(m->current_pgpath); | ||
4316 | - if (!current_pgpath) | ||
4317 | + if (!current_pgpath || !test_bit(MPATHF_QUEUE_IO, &m->flags)) | ||
4318 | current_pgpath = choose_pgpath(m, 0); | ||
4319 | |||
4320 | if (current_pgpath) { | ||
4321 | diff --git a/drivers/md/dm-zoned-metadata.c b/drivers/md/dm-zoned-metadata.c | ||
4322 | index e0a6cf9239f1..e6b0039d07aa 100644 | ||
4323 | --- a/drivers/md/dm-zoned-metadata.c | ||
4324 | +++ b/drivers/md/dm-zoned-metadata.c | ||
4325 | @@ -1589,7 +1589,7 @@ static struct dm_zone *dmz_get_rnd_zone_for_reclaim(struct dmz_metadata *zmd) | ||
4326 | return dzone; | ||
4327 | } | ||
4328 | |||
4329 | - return ERR_PTR(-EBUSY); | ||
4330 | + return NULL; | ||
4331 | } | ||
4332 | |||
4333 | /* | ||
4334 | @@ -1609,7 +1609,7 @@ static struct dm_zone *dmz_get_seq_zone_for_reclaim(struct dmz_metadata *zmd) | ||
4335 | return zone; | ||
4336 | } | ||
4337 | |||
4338 | - return ERR_PTR(-EBUSY); | ||
4339 | + return NULL; | ||
4340 | } | ||
4341 | |||
4342 | /* | ||
4343 | diff --git a/drivers/md/dm-zoned-reclaim.c b/drivers/md/dm-zoned-reclaim.c | ||
4344 | index e7ace908a9b7..d50817320e8e 100644 | ||
4345 | --- a/drivers/md/dm-zoned-reclaim.c | ||
4346 | +++ b/drivers/md/dm-zoned-reclaim.c | ||
4347 | @@ -349,8 +349,8 @@ static int dmz_do_reclaim(struct dmz_reclaim *zrc) | ||
4348 | |||
4349 | /* Get a data zone */ | ||
4350 | dzone = dmz_get_zone_for_reclaim(zmd); | ||
4351 | - if (IS_ERR(dzone)) | ||
4352 | - return PTR_ERR(dzone); | ||
4353 | + if (!dzone) | ||
4354 | + return -EBUSY; | ||
4355 | |||
4356 | start = jiffies; | ||
4357 | |||
4358 | diff --git a/drivers/mfd/stmfx.c b/drivers/mfd/stmfx.c | ||
4359 | index 857991cb3cbb..711979afd90a 100644 | ||
4360 | --- a/drivers/mfd/stmfx.c | ||
4361 | +++ b/drivers/mfd/stmfx.c | ||
4362 | @@ -287,14 +287,21 @@ static int stmfx_irq_init(struct i2c_client *client) | ||
4363 | |||
4364 | ret = regmap_write(stmfx->map, STMFX_REG_IRQ_OUT_PIN, irqoutpin); | ||
4365 | if (ret) | ||
4366 | - return ret; | ||
4367 | + goto irq_exit; | ||
4368 | |||
4369 | ret = devm_request_threaded_irq(stmfx->dev, client->irq, | ||
4370 | NULL, stmfx_irq_handler, | ||
4371 | irqtrigger | IRQF_ONESHOT, | ||
4372 | "stmfx", stmfx); | ||
4373 | if (ret) | ||
4374 | - stmfx_irq_exit(client); | ||
4375 | + goto irq_exit; | ||
4376 | + | ||
4377 | + stmfx->irq = client->irq; | ||
4378 | + | ||
4379 | + return 0; | ||
4380 | + | ||
4381 | +irq_exit: | ||
4382 | + stmfx_irq_exit(client); | ||
4383 | |||
4384 | return ret; | ||
4385 | } | ||
4386 | @@ -481,6 +488,8 @@ static int stmfx_suspend(struct device *dev) | ||
4387 | if (ret) | ||
4388 | return ret; | ||
4389 | |||
4390 | + disable_irq(stmfx->irq); | ||
4391 | + | ||
4392 | if (stmfx->vdd) | ||
4393 | return regulator_disable(stmfx->vdd); | ||
4394 | |||
4395 | @@ -501,6 +510,13 @@ static int stmfx_resume(struct device *dev) | ||
4396 | } | ||
4397 | } | ||
4398 | |||
4399 | + /* Reset STMFX - supply has been stopped during suspend */ | ||
4400 | + ret = stmfx_chip_reset(stmfx); | ||
4401 | + if (ret) { | ||
4402 | + dev_err(stmfx->dev, "Failed to reset chip: %d\n", ret); | ||
4403 | + return ret; | ||
4404 | + } | ||
4405 | + | ||
4406 | ret = regmap_raw_write(stmfx->map, STMFX_REG_SYS_CTRL, | ||
4407 | &stmfx->bkp_sysctrl, sizeof(stmfx->bkp_sysctrl)); | ||
4408 | if (ret) | ||
4409 | @@ -517,6 +533,8 @@ static int stmfx_resume(struct device *dev) | ||
4410 | if (ret) | ||
4411 | return ret; | ||
4412 | |||
4413 | + enable_irq(stmfx->irq); | ||
4414 | + | ||
4415 | return 0; | ||
4416 | } | ||
4417 | #endif | ||
4418 | diff --git a/drivers/mfd/wm8994-core.c b/drivers/mfd/wm8994-core.c | ||
4419 | index 1e9fe7d92597..737dede4a95c 100644 | ||
4420 | --- a/drivers/mfd/wm8994-core.c | ||
4421 | +++ b/drivers/mfd/wm8994-core.c | ||
4422 | @@ -690,3 +690,4 @@ module_i2c_driver(wm8994_i2c_driver); | ||
4423 | MODULE_DESCRIPTION("Core support for the WM8994 audio CODEC"); | ||
4424 | MODULE_LICENSE("GPL"); | ||
4425 | MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>"); | ||
4426 | +MODULE_SOFTDEP("pre: wm8994_regulator"); | ||
4427 | diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c | ||
4428 | index 842f2210dc7e..3a5d2890fe2a 100644 | ||
4429 | --- a/drivers/misc/fastrpc.c | ||
4430 | +++ b/drivers/misc/fastrpc.c | ||
4431 | @@ -886,6 +886,7 @@ static int fastrpc_invoke_send(struct fastrpc_session_ctx *sctx, | ||
4432 | struct fastrpc_channel_ctx *cctx; | ||
4433 | struct fastrpc_user *fl = ctx->fl; | ||
4434 | struct fastrpc_msg *msg = &ctx->msg; | ||
4435 | + int ret; | ||
4436 | |||
4437 | cctx = fl->cctx; | ||
4438 | msg->pid = fl->tgid; | ||
4439 | @@ -901,7 +902,13 @@ static int fastrpc_invoke_send(struct fastrpc_session_ctx *sctx, | ||
4440 | msg->size = roundup(ctx->msg_sz, PAGE_SIZE); | ||
4441 | fastrpc_context_get(ctx); | ||
4442 | |||
4443 | - return rpmsg_send(cctx->rpdev->ept, (void *)msg, sizeof(*msg)); | ||
4444 | + ret = rpmsg_send(cctx->rpdev->ept, (void *)msg, sizeof(*msg)); | ||
4445 | + | ||
4446 | + if (ret) | ||
4447 | + fastrpc_context_put(ctx); | ||
4448 | + | ||
4449 | + return ret; | ||
4450 | + | ||
4451 | } | ||
4452 | |||
4453 | static int fastrpc_internal_invoke(struct fastrpc_user *fl, u32 kernel, | ||
4454 | @@ -1434,8 +1441,10 @@ static int fastrpc_rpmsg_probe(struct rpmsg_device *rpdev) | ||
4455 | domains[domain_id]); | ||
4456 | data->miscdev.fops = &fastrpc_fops; | ||
4457 | err = misc_register(&data->miscdev); | ||
4458 | - if (err) | ||
4459 | + if (err) { | ||
4460 | + kfree(data); | ||
4461 | return err; | ||
4462 | + } | ||
4463 | |||
4464 | kref_init(&data->refcount); | ||
4465 | |||
4466 | diff --git a/drivers/misc/habanalabs/habanalabs.h b/drivers/misc/habanalabs/habanalabs.h | ||
4467 | index 75862be53c60..30addffd76f5 100644 | ||
4468 | --- a/drivers/misc/habanalabs/habanalabs.h | ||
4469 | +++ b/drivers/misc/habanalabs/habanalabs.h | ||
4470 | @@ -23,7 +23,7 @@ | ||
4471 | |||
4472 | #define HL_MMAP_CB_MASK (0x8000000000000000ull >> PAGE_SHIFT) | ||
4473 | |||
4474 | -#define HL_PENDING_RESET_PER_SEC 5 | ||
4475 | +#define HL_PENDING_RESET_PER_SEC 30 | ||
4476 | |||
4477 | #define HL_DEVICE_TIMEOUT_USEC 1000000 /* 1 s */ | ||
4478 | |||
4479 | diff --git a/drivers/misc/xilinx_sdfec.c b/drivers/misc/xilinx_sdfec.c | ||
4480 | index 48ba7e02bed7..d4c14b617201 100644 | ||
4481 | --- a/drivers/misc/xilinx_sdfec.c | ||
4482 | +++ b/drivers/misc/xilinx_sdfec.c | ||
4483 | @@ -602,10 +602,10 @@ static int xsdfec_table_write(struct xsdfec_dev *xsdfec, u32 offset, | ||
4484 | const u32 depth) | ||
4485 | { | ||
4486 | u32 reg = 0; | ||
4487 | - u32 res; | ||
4488 | - u32 n, i; | ||
4489 | + int res, i, nr_pages; | ||
4490 | + u32 n; | ||
4491 | u32 *addr = NULL; | ||
4492 | - struct page *page[MAX_NUM_PAGES]; | ||
4493 | + struct page *pages[MAX_NUM_PAGES]; | ||
4494 | |||
4495 | /* | ||
4496 | * Writes that go beyond the length of | ||
4497 | @@ -622,15 +622,22 @@ static int xsdfec_table_write(struct xsdfec_dev *xsdfec, u32 offset, | ||
4498 | if ((len * XSDFEC_REG_WIDTH_JUMP) % PAGE_SIZE) | ||
4499 | n += 1; | ||
4500 | |||
4501 | - res = get_user_pages_fast((unsigned long)src_ptr, n, 0, page); | ||
4502 | - if (res < n) { | ||
4503 | - for (i = 0; i < res; i++) | ||
4504 | - put_page(page[i]); | ||
4505 | + if (WARN_ON_ONCE(n > INT_MAX)) | ||
4506 | + return -EINVAL; | ||
4507 | + | ||
4508 | + nr_pages = n; | ||
4509 | + | ||
4510 | + res = get_user_pages_fast((unsigned long)src_ptr, nr_pages, 0, pages); | ||
4511 | + if (res < nr_pages) { | ||
4512 | + if (res > 0) { | ||
4513 | + for (i = 0; i < res; i++) | ||
4514 | + put_page(pages[i]); | ||
4515 | + } | ||
4516 | return -EINVAL; | ||
4517 | } | ||
4518 | |||
4519 | - for (i = 0; i < n; i++) { | ||
4520 | - addr = kmap(page[i]); | ||
4521 | + for (i = 0; i < nr_pages; i++) { | ||
4522 | + addr = kmap(pages[i]); | ||
4523 | do { | ||
4524 | xsdfec_regwrite(xsdfec, | ||
4525 | base_addr + ((offset + reg) * | ||
4526 | @@ -639,7 +646,7 @@ static int xsdfec_table_write(struct xsdfec_dev *xsdfec, u32 offset, | ||
4527 | reg++; | ||
4528 | } while ((reg < len) && | ||
4529 | ((reg * XSDFEC_REG_WIDTH_JUMP) % PAGE_SIZE)); | ||
4530 | - put_page(page[i]); | ||
4531 | + put_page(pages[i]); | ||
4532 | } | ||
4533 | return reg; | ||
4534 | } | ||
4535 | diff --git a/drivers/net/dsa/lantiq_gswip.c b/drivers/net/dsa/lantiq_gswip.c | ||
4536 | index a69c9b9878b7..636966e93517 100644 | ||
4537 | --- a/drivers/net/dsa/lantiq_gswip.c | ||
4538 | +++ b/drivers/net/dsa/lantiq_gswip.c | ||
4539 | @@ -1451,7 +1451,8 @@ static void gswip_phylink_validate(struct dsa_switch *ds, int port, | ||
4540 | |||
4541 | unsupported: | ||
4542 | bitmap_zero(supported, __ETHTOOL_LINK_MODE_MASK_NBITS); | ||
4543 | - dev_err(ds->dev, "Unsupported interface: %d\n", state->interface); | ||
4544 | + dev_err(ds->dev, "Unsupported interface '%s' for port %d\n", | ||
4545 | + phy_modes(state->interface), port); | ||
4546 | return; | ||
4547 | } | ||
4548 | |||
4549 | diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c | ||
4550 | index 63ee0c49be7c..b5147bd6cba6 100644 | ||
4551 | --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c | ||
4552 | +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c | ||
4553 | @@ -9992,7 +9992,7 @@ static void bnxt_timer(struct timer_list *t) | ||
4554 | struct bnxt *bp = from_timer(bp, t, timer); | ||
4555 | struct net_device *dev = bp->dev; | ||
4556 | |||
4557 | - if (!netif_running(dev)) | ||
4558 | + if (!netif_running(dev) || !test_bit(BNXT_STATE_OPEN, &bp->state)) | ||
4559 | return; | ||
4560 | |||
4561 | if (atomic_read(&bp->intr_sem) != 0) | ||
4562 | diff --git a/drivers/net/ethernet/cavium/octeon/octeon_mgmt.c b/drivers/net/ethernet/cavium/octeon/octeon_mgmt.c | ||
4563 | index cdd7e5da4a74..d375e438d805 100644 | ||
4564 | --- a/drivers/net/ethernet/cavium/octeon/octeon_mgmt.c | ||
4565 | +++ b/drivers/net/ethernet/cavium/octeon/octeon_mgmt.c | ||
4566 | @@ -235,6 +235,11 @@ static void octeon_mgmt_rx_fill_ring(struct net_device *netdev) | ||
4567 | |||
4568 | /* Put it in the ring. */ | ||
4569 | p->rx_ring[p->rx_next_fill] = re.d64; | ||
4570 | + /* Make sure there is no reorder of filling the ring and ringing | ||
4571 | + * the bell | ||
4572 | + */ | ||
4573 | + wmb(); | ||
4574 | + | ||
4575 | dma_sync_single_for_device(p->dev, p->rx_ring_handle, | ||
4576 | ring_size_to_bytes(OCTEON_MGMT_RX_RING_SIZE), | ||
4577 | DMA_BIDIRECTIONAL); | ||
4578 | diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c | ||
4579 | index 108297a099ed..1ec33c614474 100644 | ||
4580 | --- a/drivers/net/ethernet/intel/e1000e/netdev.c | ||
4581 | +++ b/drivers/net/ethernet/intel/e1000e/netdev.c | ||
4582 | @@ -6345,11 +6345,17 @@ static int __e1000_shutdown(struct pci_dev *pdev, bool runtime) | ||
4583 | struct net_device *netdev = pci_get_drvdata(pdev); | ||
4584 | struct e1000_adapter *adapter = netdev_priv(netdev); | ||
4585 | struct e1000_hw *hw = &adapter->hw; | ||
4586 | - u32 ctrl, ctrl_ext, rctl, status; | ||
4587 | - /* Runtime suspend should only enable wakeup for link changes */ | ||
4588 | - u32 wufc = runtime ? E1000_WUFC_LNKC : adapter->wol; | ||
4589 | + u32 ctrl, ctrl_ext, rctl, status, wufc; | ||
4590 | int retval = 0; | ||
4591 | |||
4592 | + /* Runtime suspend should only enable wakeup for link changes */ | ||
4593 | + if (runtime) | ||
4594 | + wufc = E1000_WUFC_LNKC; | ||
4595 | + else if (device_may_wakeup(&pdev->dev)) | ||
4596 | + wufc = adapter->wol; | ||
4597 | + else | ||
4598 | + wufc = 0; | ||
4599 | + | ||
4600 | status = er32(STATUS); | ||
4601 | if (status & E1000_STATUS_LU) | ||
4602 | wufc &= ~E1000_WUFC_LNKC; | ||
4603 | @@ -6406,7 +6412,7 @@ static int __e1000_shutdown(struct pci_dev *pdev, bool runtime) | ||
4604 | if (adapter->hw.phy.type == e1000_phy_igp_3) { | ||
4605 | e1000e_igp3_phy_powerdown_workaround_ich8lan(&adapter->hw); | ||
4606 | } else if (hw->mac.type >= e1000_pch_lpt) { | ||
4607 | - if (!(wufc & (E1000_WUFC_EX | E1000_WUFC_MC | E1000_WUFC_BC))) | ||
4608 | + if (wufc && !(wufc & (E1000_WUFC_EX | E1000_WUFC_MC | E1000_WUFC_BC))) | ||
4609 | /* ULP does not support wake from unicast, multicast | ||
4610 | * or broadcast. | ||
4611 | */ | ||
4612 | diff --git a/drivers/net/ethernet/intel/iavf/iavf.h b/drivers/net/ethernet/intel/iavf/iavf.h | ||
4613 | index bd1b1ed323f4..6b9117a350fa 100644 | ||
4614 | --- a/drivers/net/ethernet/intel/iavf/iavf.h | ||
4615 | +++ b/drivers/net/ethernet/intel/iavf/iavf.h | ||
4616 | @@ -87,6 +87,10 @@ struct iavf_vsi { | ||
4617 | #define IAVF_HLUT_ARRAY_SIZE ((IAVF_VFQF_HLUT_MAX_INDEX + 1) * 4) | ||
4618 | #define IAVF_MBPS_DIVISOR 125000 /* divisor to convert to Mbps */ | ||
4619 | |||
4620 | +#define IAVF_VIRTCHNL_VF_RESOURCE_SIZE (sizeof(struct virtchnl_vf_resource) + \ | ||
4621 | + (IAVF_MAX_VF_VSI * \ | ||
4622 | + sizeof(struct virtchnl_vsi_resource))) | ||
4623 | + | ||
4624 | /* MAX_MSIX_Q_VECTORS of these are allocated, | ||
4625 | * but we only use one per queue-specific vector. | ||
4626 | */ | ||
4627 | @@ -306,6 +310,14 @@ struct iavf_adapter { | ||
4628 | bool netdev_registered; | ||
4629 | bool link_up; | ||
4630 | enum virtchnl_link_speed link_speed; | ||
4631 | + /* This is only populated if the VIRTCHNL_VF_CAP_ADV_LINK_SPEED is set | ||
4632 | + * in vf_res->vf_cap_flags. Use ADV_LINK_SUPPORT macro to determine if | ||
4633 | + * this field is valid. This field should be used going forward and the | ||
4634 | + * enum virtchnl_link_speed above should be considered the legacy way of | ||
4635 | + * storing/communicating link speeds. | ||
4636 | + */ | ||
4637 | + u32 link_speed_mbps; | ||
4638 | + | ||
4639 | enum virtchnl_ops current_op; | ||
4640 | #define CLIENT_ALLOWED(_a) ((_a)->vf_res ? \ | ||
4641 | (_a)->vf_res->vf_cap_flags & \ | ||
4642 | @@ -322,6 +334,8 @@ struct iavf_adapter { | ||
4643 | VIRTCHNL_VF_OFFLOAD_RSS_PF))) | ||
4644 | #define VLAN_ALLOWED(_a) ((_a)->vf_res->vf_cap_flags & \ | ||
4645 | VIRTCHNL_VF_OFFLOAD_VLAN) | ||
4646 | +#define ADV_LINK_SUPPORT(_a) ((_a)->vf_res->vf_cap_flags & \ | ||
4647 | + VIRTCHNL_VF_CAP_ADV_LINK_SPEED) | ||
4648 | struct virtchnl_vf_resource *vf_res; /* incl. all VSIs */ | ||
4649 | struct virtchnl_vsi_resource *vsi_res; /* our LAN VSI */ | ||
4650 | struct virtchnl_version_info pf_version; | ||
4651 | diff --git a/drivers/net/ethernet/intel/iavf/iavf_ethtool.c b/drivers/net/ethernet/intel/iavf/iavf_ethtool.c | ||
4652 | index dad3eec8ccd8..758bef02a2a8 100644 | ||
4653 | --- a/drivers/net/ethernet/intel/iavf/iavf_ethtool.c | ||
4654 | +++ b/drivers/net/ethernet/intel/iavf/iavf_ethtool.c | ||
4655 | @@ -278,7 +278,18 @@ static int iavf_get_link_ksettings(struct net_device *netdev, | ||
4656 | ethtool_link_ksettings_zero_link_mode(cmd, supported); | ||
4657 | cmd->base.autoneg = AUTONEG_DISABLE; | ||
4658 | cmd->base.port = PORT_NONE; | ||
4659 | - /* Set speed and duplex */ | ||
4660 | + cmd->base.duplex = DUPLEX_FULL; | ||
4661 | + | ||
4662 | + if (ADV_LINK_SUPPORT(adapter)) { | ||
4663 | + if (adapter->link_speed_mbps && | ||
4664 | + adapter->link_speed_mbps < U32_MAX) | ||
4665 | + cmd->base.speed = adapter->link_speed_mbps; | ||
4666 | + else | ||
4667 | + cmd->base.speed = SPEED_UNKNOWN; | ||
4668 | + | ||
4669 | + return 0; | ||
4670 | + } | ||
4671 | + | ||
4672 | switch (adapter->link_speed) { | ||
4673 | case IAVF_LINK_SPEED_40GB: | ||
4674 | cmd->base.speed = SPEED_40000; | ||
4675 | @@ -306,7 +317,6 @@ static int iavf_get_link_ksettings(struct net_device *netdev, | ||
4676 | default: | ||
4677 | break; | ||
4678 | } | ||
4679 | - cmd->base.duplex = DUPLEX_FULL; | ||
4680 | |||
4681 | return 0; | ||
4682 | } | ||
4683 | diff --git a/drivers/net/ethernet/intel/iavf/iavf_main.c b/drivers/net/ethernet/intel/iavf/iavf_main.c | ||
4684 | index 8e16be960e96..bacc5fb7eba2 100644 | ||
4685 | --- a/drivers/net/ethernet/intel/iavf/iavf_main.c | ||
4686 | +++ b/drivers/net/ethernet/intel/iavf/iavf_main.c | ||
4687 | @@ -1756,17 +1756,17 @@ static int iavf_init_get_resources(struct iavf_adapter *adapter) | ||
4688 | struct net_device *netdev = adapter->netdev; | ||
4689 | struct pci_dev *pdev = adapter->pdev; | ||
4690 | struct iavf_hw *hw = &adapter->hw; | ||
4691 | - int err = 0, bufsz; | ||
4692 | + int err; | ||
4693 | |||
4694 | WARN_ON(adapter->state != __IAVF_INIT_GET_RESOURCES); | ||
4695 | /* aq msg sent, awaiting reply */ | ||
4696 | if (!adapter->vf_res) { | ||
4697 | - bufsz = sizeof(struct virtchnl_vf_resource) + | ||
4698 | - (IAVF_MAX_VF_VSI * | ||
4699 | - sizeof(struct virtchnl_vsi_resource)); | ||
4700 | - adapter->vf_res = kzalloc(bufsz, GFP_KERNEL); | ||
4701 | - if (!adapter->vf_res) | ||
4702 | + adapter->vf_res = kzalloc(IAVF_VIRTCHNL_VF_RESOURCE_SIZE, | ||
4703 | + GFP_KERNEL); | ||
4704 | + if (!adapter->vf_res) { | ||
4705 | + err = -ENOMEM; | ||
4706 | goto err; | ||
4707 | + } | ||
4708 | } | ||
4709 | err = iavf_get_vf_config(adapter); | ||
4710 | if (err == IAVF_ERR_ADMIN_QUEUE_NO_WORK) { | ||
4711 | @@ -2036,7 +2036,7 @@ static void iavf_disable_vf(struct iavf_adapter *adapter) | ||
4712 | iavf_reset_interrupt_capability(adapter); | ||
4713 | iavf_free_queues(adapter); | ||
4714 | iavf_free_q_vectors(adapter); | ||
4715 | - kfree(adapter->vf_res); | ||
4716 | + memset(adapter->vf_res, 0, IAVF_VIRTCHNL_VF_RESOURCE_SIZE); | ||
4717 | iavf_shutdown_adminq(&adapter->hw); | ||
4718 | adapter->netdev->flags &= ~IFF_UP; | ||
4719 | clear_bit(__IAVF_IN_CRITICAL_TASK, &adapter->crit_section); | ||
4720 | @@ -2487,6 +2487,16 @@ static int iavf_validate_tx_bandwidth(struct iavf_adapter *adapter, | ||
4721 | { | ||
4722 | int speed = 0, ret = 0; | ||
4723 | |||
4724 | + if (ADV_LINK_SUPPORT(adapter)) { | ||
4725 | + if (adapter->link_speed_mbps < U32_MAX) { | ||
4726 | + speed = adapter->link_speed_mbps; | ||
4727 | + goto validate_bw; | ||
4728 | + } else { | ||
4729 | + dev_err(&adapter->pdev->dev, "Unknown link speed\n"); | ||
4730 | + return -EINVAL; | ||
4731 | + } | ||
4732 | + } | ||
4733 | + | ||
4734 | switch (adapter->link_speed) { | ||
4735 | case IAVF_LINK_SPEED_40GB: | ||
4736 | speed = 40000; | ||
4737 | @@ -2510,6 +2520,7 @@ static int iavf_validate_tx_bandwidth(struct iavf_adapter *adapter, | ||
4738 | break; | ||
4739 | } | ||
4740 | |||
4741 | +validate_bw: | ||
4742 | if (max_tx_rate > speed) { | ||
4743 | dev_err(&adapter->pdev->dev, | ||
4744 | "Invalid tx rate specified\n"); | ||
4745 | diff --git a/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c b/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c | ||
4746 | index 1ab9cb339acb..9655318803b7 100644 | ||
4747 | --- a/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c | ||
4748 | +++ b/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c | ||
4749 | @@ -139,7 +139,8 @@ int iavf_send_vf_config_msg(struct iavf_adapter *adapter) | ||
4750 | VIRTCHNL_VF_OFFLOAD_ENCAP | | ||
4751 | VIRTCHNL_VF_OFFLOAD_ENCAP_CSUM | | ||
4752 | VIRTCHNL_VF_OFFLOAD_REQ_QUEUES | | ||
4753 | - VIRTCHNL_VF_OFFLOAD_ADQ; | ||
4754 | + VIRTCHNL_VF_OFFLOAD_ADQ | | ||
4755 | + VIRTCHNL_VF_CAP_ADV_LINK_SPEED; | ||
4756 | |||
4757 | adapter->current_op = VIRTCHNL_OP_GET_VF_RESOURCES; | ||
4758 | adapter->aq_required &= ~IAVF_FLAG_AQ_GET_CONFIG; | ||
4759 | @@ -918,6 +919,8 @@ void iavf_disable_vlan_stripping(struct iavf_adapter *adapter) | ||
4760 | iavf_send_pf_msg(adapter, VIRTCHNL_OP_DISABLE_VLAN_STRIPPING, NULL, 0); | ||
4761 | } | ||
4762 | |||
4763 | +#define IAVF_MAX_SPEED_STRLEN 13 | ||
4764 | + | ||
4765 | /** | ||
4766 | * iavf_print_link_message - print link up or down | ||
4767 | * @adapter: adapter structure | ||
4768 | @@ -927,37 +930,99 @@ void iavf_disable_vlan_stripping(struct iavf_adapter *adapter) | ||
4769 | static void iavf_print_link_message(struct iavf_adapter *adapter) | ||
4770 | { | ||
4771 | struct net_device *netdev = adapter->netdev; | ||
4772 | - char *speed = "Unknown "; | ||
4773 | + int link_speed_mbps; | ||
4774 | + char *speed; | ||
4775 | |||
4776 | if (!adapter->link_up) { | ||
4777 | netdev_info(netdev, "NIC Link is Down\n"); | ||
4778 | return; | ||
4779 | } | ||
4780 | |||
4781 | + speed = kcalloc(1, IAVF_MAX_SPEED_STRLEN, GFP_KERNEL); | ||
4782 | + if (!speed) | ||
4783 | + return; | ||
4784 | + | ||
4785 | + if (ADV_LINK_SUPPORT(adapter)) { | ||
4786 | + link_speed_mbps = adapter->link_speed_mbps; | ||
4787 | + goto print_link_msg; | ||
4788 | + } | ||
4789 | + | ||
4790 | switch (adapter->link_speed) { | ||
4791 | case IAVF_LINK_SPEED_40GB: | ||
4792 | - speed = "40 G"; | ||
4793 | + link_speed_mbps = SPEED_40000; | ||
4794 | break; | ||
4795 | case IAVF_LINK_SPEED_25GB: | ||
4796 | - speed = "25 G"; | ||
4797 | + link_speed_mbps = SPEED_25000; | ||
4798 | break; | ||
4799 | case IAVF_LINK_SPEED_20GB: | ||
4800 | - speed = "20 G"; | ||
4801 | + link_speed_mbps = SPEED_20000; | ||
4802 | break; | ||
4803 | case IAVF_LINK_SPEED_10GB: | ||
4804 | - speed = "10 G"; | ||
4805 | + link_speed_mbps = SPEED_10000; | ||
4806 | break; | ||
4807 | case IAVF_LINK_SPEED_1GB: | ||
4808 | - speed = "1000 M"; | ||
4809 | + link_speed_mbps = SPEED_1000; | ||
4810 | break; | ||
4811 | case IAVF_LINK_SPEED_100MB: | ||
4812 | - speed = "100 M"; | ||
4813 | + link_speed_mbps = SPEED_100; | ||
4814 | break; | ||
4815 | default: | ||
4816 | + link_speed_mbps = SPEED_UNKNOWN; | ||
4817 | break; | ||
4818 | } | ||
4819 | |||
4820 | - netdev_info(netdev, "NIC Link is Up %sbps Full Duplex\n", speed); | ||
4821 | +print_link_msg: | ||
4822 | + if (link_speed_mbps > SPEED_1000) { | ||
4823 | + if (link_speed_mbps == SPEED_2500) | ||
4824 | + snprintf(speed, IAVF_MAX_SPEED_STRLEN, "2.5 Gbps"); | ||
4825 | + else | ||
4826 | + /* convert to Gbps inline */ | ||
4827 | + snprintf(speed, IAVF_MAX_SPEED_STRLEN, "%d %s", | ||
4828 | + link_speed_mbps / 1000, "Gbps"); | ||
4829 | + } else if (link_speed_mbps == SPEED_UNKNOWN) { | ||
4830 | + snprintf(speed, IAVF_MAX_SPEED_STRLEN, "%s", "Unknown Mbps"); | ||
4831 | + } else { | ||
4832 | + snprintf(speed, IAVF_MAX_SPEED_STRLEN, "%u %s", | ||
4833 | + link_speed_mbps, "Mbps"); | ||
4834 | + } | ||
4835 | + | ||
4836 | + netdev_info(netdev, "NIC Link is Up Speed is %s Full Duplex\n", speed); | ||
4837 | + kfree(speed); | ||
4838 | +} | ||
4839 | + | ||
4840 | +/** | ||
4841 | + * iavf_get_vpe_link_status | ||
4842 | + * @adapter: adapter structure | ||
4843 | + * @vpe: virtchnl_pf_event structure | ||
4844 | + * | ||
4845 | + * Helper function for determining the link status | ||
4846 | + **/ | ||
4847 | +static bool | ||
4848 | +iavf_get_vpe_link_status(struct iavf_adapter *adapter, | ||
4849 | + struct virtchnl_pf_event *vpe) | ||
4850 | +{ | ||
4851 | + if (ADV_LINK_SUPPORT(adapter)) | ||
4852 | + return vpe->event_data.link_event_adv.link_status; | ||
4853 | + else | ||
4854 | + return vpe->event_data.link_event.link_status; | ||
4855 | +} | ||
4856 | + | ||
4857 | +/** | ||
4858 | + * iavf_set_adapter_link_speed_from_vpe | ||
4859 | + * @adapter: adapter structure for which we are setting the link speed | ||
4860 | + * @vpe: virtchnl_pf_event structure that contains the link speed we are setting | ||
4861 | + * | ||
4862 | + * Helper function for setting iavf_adapter link speed | ||
4863 | + **/ | ||
4864 | +static void | ||
4865 | +iavf_set_adapter_link_speed_from_vpe(struct iavf_adapter *adapter, | ||
4866 | + struct virtchnl_pf_event *vpe) | ||
4867 | +{ | ||
4868 | + if (ADV_LINK_SUPPORT(adapter)) | ||
4869 | + adapter->link_speed_mbps = | ||
4870 | + vpe->event_data.link_event_adv.link_speed; | ||
4871 | + else | ||
4872 | + adapter->link_speed = vpe->event_data.link_event.link_speed; | ||
4873 | } | ||
4874 | |||
4875 | /** | ||
4876 | @@ -1187,12 +1252,11 @@ void iavf_virtchnl_completion(struct iavf_adapter *adapter, | ||
4877 | if (v_opcode == VIRTCHNL_OP_EVENT) { | ||
4878 | struct virtchnl_pf_event *vpe = | ||
4879 | (struct virtchnl_pf_event *)msg; | ||
4880 | - bool link_up = vpe->event_data.link_event.link_status; | ||
4881 | + bool link_up = iavf_get_vpe_link_status(adapter, vpe); | ||
4882 | |||
4883 | switch (vpe->event) { | ||
4884 | case VIRTCHNL_EVENT_LINK_CHANGE: | ||
4885 | - adapter->link_speed = | ||
4886 | - vpe->event_data.link_event.link_speed; | ||
4887 | + iavf_set_adapter_link_speed_from_vpe(adapter, vpe); | ||
4888 | |||
4889 | /* we've already got the right link status, bail */ | ||
4890 | if (adapter->link_up == link_up) | ||
4891 | diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c | ||
4892 | index 373b8c832850..cf5d447af7db 100644 | ||
4893 | --- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c | ||
4894 | +++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c | ||
4895 | @@ -5925,8 +5925,8 @@ static int mvpp2_remove(struct platform_device *pdev) | ||
4896 | { | ||
4897 | struct mvpp2 *priv = platform_get_drvdata(pdev); | ||
4898 | struct fwnode_handle *fwnode = pdev->dev.fwnode; | ||
4899 | + int i = 0, poolnum = MVPP2_BM_POOLS_NUM; | ||
4900 | struct fwnode_handle *port_fwnode; | ||
4901 | - int i = 0; | ||
4902 | |||
4903 | mvpp2_dbgfs_cleanup(priv); | ||
4904 | |||
4905 | @@ -5940,7 +5940,10 @@ static int mvpp2_remove(struct platform_device *pdev) | ||
4906 | |||
4907 | destroy_workqueue(priv->stats_queue); | ||
4908 | |||
4909 | - for (i = 0; i < MVPP2_BM_POOLS_NUM; i++) { | ||
4910 | + if (priv->percpu_pools) | ||
4911 | + poolnum = mvpp2_get_nrxqs(priv) * 2; | ||
4912 | + | ||
4913 | + for (i = 0; i < poolnum; i++) { | ||
4914 | struct mvpp2_bm_pool *bm_pool = &priv->bm_pools[i]; | ||
4915 | |||
4916 | mvpp2_bm_pool_destroy(&pdev->dev, priv, bm_pool); | ||
4917 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_send.c b/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_send.c | ||
4918 | index 7c77378accf0..f012aac83b10 100644 | ||
4919 | --- a/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_send.c | ||
4920 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_send.c | ||
4921 | @@ -181,7 +181,7 @@ static struct mlx5dr_qp *dr_create_rc_qp(struct mlx5_core_dev *mdev, | ||
4922 | in, pas)); | ||
4923 | |||
4924 | err = mlx5_core_create_qp(mdev, &dr_qp->mqp, in, inlen); | ||
4925 | - kfree(in); | ||
4926 | + kvfree(in); | ||
4927 | |||
4928 | if (err) { | ||
4929 | mlx5_core_warn(mdev, " Can't create QP\n"); | ||
4930 | diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c | ||
4931 | index aa101f72d405..cac75c7d1d01 100644 | ||
4932 | --- a/drivers/net/geneve.c | ||
4933 | +++ b/drivers/net/geneve.c | ||
4934 | @@ -987,9 +987,10 @@ static netdev_tx_t geneve_xmit(struct sk_buff *skb, struct net_device *dev) | ||
4935 | if (geneve->collect_md) { | ||
4936 | info = skb_tunnel_info(skb); | ||
4937 | if (unlikely(!info || !(info->mode & IP_TUNNEL_INFO_TX))) { | ||
4938 | - err = -EINVAL; | ||
4939 | netdev_dbg(dev, "no tunnel metadata\n"); | ||
4940 | - goto tx_error; | ||
4941 | + dev_kfree_skb(skb); | ||
4942 | + dev->stats.tx_dropped++; | ||
4943 | + return NETDEV_TX_OK; | ||
4944 | } | ||
4945 | } else { | ||
4946 | info = &geneve->info; | ||
4947 | @@ -1006,7 +1007,7 @@ static netdev_tx_t geneve_xmit(struct sk_buff *skb, struct net_device *dev) | ||
4948 | |||
4949 | if (likely(!err)) | ||
4950 | return NETDEV_TX_OK; | ||
4951 | -tx_error: | ||
4952 | + | ||
4953 | dev_kfree_skb(skb); | ||
4954 | |||
4955 | if (err == -ELOOP) | ||
4956 | diff --git a/drivers/net/hamradio/yam.c b/drivers/net/hamradio/yam.c | ||
4957 | index 71cdef9fb56b..5ab53e9942f3 100644 | ||
4958 | --- a/drivers/net/hamradio/yam.c | ||
4959 | +++ b/drivers/net/hamradio/yam.c | ||
4960 | @@ -1133,6 +1133,7 @@ static int __init yam_init_driver(void) | ||
4961 | err = register_netdev(dev); | ||
4962 | if (err) { | ||
4963 | printk(KERN_WARNING "yam: cannot register net device %s\n", dev->name); | ||
4964 | + free_netdev(dev); | ||
4965 | goto error; | ||
4966 | } | ||
4967 | yam_devs[i] = dev; | ||
4968 | diff --git a/drivers/net/phy/marvell.c b/drivers/net/phy/marvell.c | ||
4969 | index a7796134e3be..91cf1d167263 100644 | ||
4970 | --- a/drivers/net/phy/marvell.c | ||
4971 | +++ b/drivers/net/phy/marvell.c | ||
4972 | @@ -358,7 +358,7 @@ static int m88e1101_config_aneg(struct phy_device *phydev) | ||
4973 | return marvell_config_aneg(phydev); | ||
4974 | } | ||
4975 | |||
4976 | -#ifdef CONFIG_OF_MDIO | ||
4977 | +#if IS_ENABLED(CONFIG_OF_MDIO) | ||
4978 | /* Set and/or override some configuration registers based on the | ||
4979 | * marvell,reg-init property stored in the of_node for the phydev. | ||
4980 | * | ||
4981 | diff --git a/drivers/ntb/core.c b/drivers/ntb/core.c | ||
4982 | index 2581ab724c34..f8f75a504a58 100644 | ||
4983 | --- a/drivers/ntb/core.c | ||
4984 | +++ b/drivers/ntb/core.c | ||
4985 | @@ -214,10 +214,8 @@ int ntb_default_port_number(struct ntb_dev *ntb) | ||
4986 | case NTB_TOPO_B2B_DSD: | ||
4987 | return NTB_PORT_SEC_DSD; | ||
4988 | default: | ||
4989 | - break; | ||
4990 | + return 0; | ||
4991 | } | ||
4992 | - | ||
4993 | - return -EINVAL; | ||
4994 | } | ||
4995 | EXPORT_SYMBOL(ntb_default_port_number); | ||
4996 | |||
4997 | @@ -240,10 +238,8 @@ int ntb_default_peer_port_number(struct ntb_dev *ntb, int pidx) | ||
4998 | case NTB_TOPO_B2B_DSD: | ||
4999 | return NTB_PORT_PRI_USD; | ||
5000 | default: | ||
5001 | - break; | ||
5002 | + return 0; | ||
5003 | } | ||
5004 | - | ||
5005 | - return -EINVAL; | ||
5006 | } | ||
5007 | EXPORT_SYMBOL(ntb_default_peer_port_number); | ||
5008 | |||
5009 | @@ -315,4 +311,3 @@ static void __exit ntb_driver_exit(void) | ||
5010 | bus_unregister(&ntb_bus); | ||
5011 | } | ||
5012 | module_exit(ntb_driver_exit); | ||
5013 | - | ||
5014 | diff --git a/drivers/ntb/test/ntb_perf.c b/drivers/ntb/test/ntb_perf.c | ||
5015 | index e9b7c2dfc730..5ce4766a6c9e 100644 | ||
5016 | --- a/drivers/ntb/test/ntb_perf.c | ||
5017 | +++ b/drivers/ntb/test/ntb_perf.c | ||
5018 | @@ -158,6 +158,8 @@ struct perf_peer { | ||
5019 | /* NTB connection setup service */ | ||
5020 | struct work_struct service; | ||
5021 | unsigned long sts; | ||
5022 | + | ||
5023 | + struct completion init_comp; | ||
5024 | }; | ||
5025 | #define to_peer_service(__work) \ | ||
5026 | container_of(__work, struct perf_peer, service) | ||
5027 | @@ -546,6 +548,7 @@ static int perf_setup_outbuf(struct perf_peer *peer) | ||
5028 | |||
5029 | /* Initialization is finally done */ | ||
5030 | set_bit(PERF_STS_DONE, &peer->sts); | ||
5031 | + complete_all(&peer->init_comp); | ||
5032 | |||
5033 | return 0; | ||
5034 | } | ||
5035 | @@ -556,7 +559,7 @@ static void perf_free_inbuf(struct perf_peer *peer) | ||
5036 | return; | ||
5037 | |||
5038 | (void)ntb_mw_clear_trans(peer->perf->ntb, peer->pidx, peer->gidx); | ||
5039 | - dma_free_coherent(&peer->perf->ntb->dev, peer->inbuf_size, | ||
5040 | + dma_free_coherent(&peer->perf->ntb->pdev->dev, peer->inbuf_size, | ||
5041 | peer->inbuf, peer->inbuf_xlat); | ||
5042 | peer->inbuf = NULL; | ||
5043 | } | ||
5044 | @@ -585,8 +588,9 @@ static int perf_setup_inbuf(struct perf_peer *peer) | ||
5045 | |||
5046 | perf_free_inbuf(peer); | ||
5047 | |||
5048 | - peer->inbuf = dma_alloc_coherent(&perf->ntb->dev, peer->inbuf_size, | ||
5049 | - &peer->inbuf_xlat, GFP_KERNEL); | ||
5050 | + peer->inbuf = dma_alloc_coherent(&perf->ntb->pdev->dev, | ||
5051 | + peer->inbuf_size, &peer->inbuf_xlat, | ||
5052 | + GFP_KERNEL); | ||
5053 | if (!peer->inbuf) { | ||
5054 | dev_err(&perf->ntb->dev, "Failed to alloc inbuf of %pa\n", | ||
5055 | &peer->inbuf_size); | ||
5056 | @@ -636,6 +640,7 @@ static void perf_service_work(struct work_struct *work) | ||
5057 | perf_setup_outbuf(peer); | ||
5058 | |||
5059 | if (test_and_clear_bit(PERF_CMD_CLEAR, &peer->sts)) { | ||
5060 | + init_completion(&peer->init_comp); | ||
5061 | clear_bit(PERF_STS_DONE, &peer->sts); | ||
5062 | if (test_bit(0, &peer->perf->busy_flag) && | ||
5063 | peer == peer->perf->test_peer) { | ||
5064 | @@ -652,7 +657,7 @@ static int perf_init_service(struct perf_ctx *perf) | ||
5065 | { | ||
5066 | u64 mask; | ||
5067 | |||
5068 | - if (ntb_peer_mw_count(perf->ntb) < perf->pcnt + 1) { | ||
5069 | + if (ntb_peer_mw_count(perf->ntb) < perf->pcnt) { | ||
5070 | dev_err(&perf->ntb->dev, "Not enough memory windows\n"); | ||
5071 | return -EINVAL; | ||
5072 | } | ||
5073 | @@ -1051,8 +1056,9 @@ static int perf_submit_test(struct perf_peer *peer) | ||
5074 | struct perf_thread *pthr; | ||
5075 | int tidx, ret; | ||
5076 | |||
5077 | - if (!test_bit(PERF_STS_DONE, &peer->sts)) | ||
5078 | - return -ENOLINK; | ||
5079 | + ret = wait_for_completion_interruptible(&peer->init_comp); | ||
5080 | + if (ret < 0) | ||
5081 | + return ret; | ||
5082 | |||
5083 | if (test_and_set_bit_lock(0, &perf->busy_flag)) | ||
5084 | return -EBUSY; | ||
5085 | @@ -1418,10 +1424,21 @@ static int perf_init_peers(struct perf_ctx *perf) | ||
5086 | peer->gidx = pidx; | ||
5087 | } | ||
5088 | INIT_WORK(&peer->service, perf_service_work); | ||
5089 | + init_completion(&peer->init_comp); | ||
5090 | } | ||
5091 | if (perf->gidx == -1) | ||
5092 | perf->gidx = pidx; | ||
5093 | |||
5094 | + /* | ||
5095 | + * Hardware with only two ports may not have unique port | ||
5096 | + * numbers. In this case, the gidxs should all be zero. | ||
5097 | + */ | ||
5098 | + if (perf->pcnt == 1 && ntb_port_number(perf->ntb) == 0 && | ||
5099 | + ntb_peer_port_number(perf->ntb, 0) == 0) { | ||
5100 | + perf->gidx = 0; | ||
5101 | + perf->peers[0].gidx = 0; | ||
5102 | + } | ||
5103 | + | ||
5104 | for (pidx = 0; pidx < perf->pcnt; pidx++) { | ||
5105 | ret = perf_setup_peer_mw(&perf->peers[pidx]); | ||
5106 | if (ret) | ||
5107 | @@ -1517,4 +1534,3 @@ static void __exit perf_exit(void) | ||
5108 | destroy_workqueue(perf_wq); | ||
5109 | } | ||
5110 | module_exit(perf_exit); | ||
5111 | - | ||
5112 | diff --git a/drivers/ntb/test/ntb_pingpong.c b/drivers/ntb/test/ntb_pingpong.c | ||
5113 | index 65865e460ab8..18d00eec7b02 100644 | ||
5114 | --- a/drivers/ntb/test/ntb_pingpong.c | ||
5115 | +++ b/drivers/ntb/test/ntb_pingpong.c | ||
5116 | @@ -121,15 +121,14 @@ static int pp_find_next_peer(struct pp_ctx *pp) | ||
5117 | link = ntb_link_is_up(pp->ntb, NULL, NULL); | ||
5118 | |||
5119 | /* Find next available peer */ | ||
5120 | - if (link & pp->nmask) { | ||
5121 | + if (link & pp->nmask) | ||
5122 | pidx = __ffs64(link & pp->nmask); | ||
5123 | - out_db = BIT_ULL(pidx + 1); | ||
5124 | - } else if (link & pp->pmask) { | ||
5125 | + else if (link & pp->pmask) | ||
5126 | pidx = __ffs64(link & pp->pmask); | ||
5127 | - out_db = BIT_ULL(pidx); | ||
5128 | - } else { | ||
5129 | + else | ||
5130 | return -ENODEV; | ||
5131 | - } | ||
5132 | + | ||
5133 | + out_db = BIT_ULL(ntb_peer_port_number(pp->ntb, pidx)); | ||
5134 | |||
5135 | spin_lock(&pp->lock); | ||
5136 | pp->out_pidx = pidx; | ||
5137 | @@ -303,7 +302,7 @@ static void pp_init_flds(struct pp_ctx *pp) | ||
5138 | break; | ||
5139 | } | ||
5140 | |||
5141 | - pp->in_db = BIT_ULL(pidx); | ||
5142 | + pp->in_db = BIT_ULL(lport); | ||
5143 | pp->pmask = GENMASK_ULL(pidx, 0) >> 1; | ||
5144 | pp->nmask = GENMASK_ULL(pcnt - 1, pidx); | ||
5145 | |||
5146 | @@ -435,4 +434,3 @@ static void __exit pp_exit(void) | ||
5147 | debugfs_remove_recursive(pp_dbgfs_topdir); | ||
5148 | } | ||
5149 | module_exit(pp_exit); | ||
5150 | - | ||
5151 | diff --git a/drivers/ntb/test/ntb_tool.c b/drivers/ntb/test/ntb_tool.c | ||
5152 | index d592c0ffbd19..311d6ab8d016 100644 | ||
5153 | --- a/drivers/ntb/test/ntb_tool.c | ||
5154 | +++ b/drivers/ntb/test/ntb_tool.c | ||
5155 | @@ -504,7 +504,7 @@ static ssize_t tool_peer_link_read(struct file *filep, char __user *ubuf, | ||
5156 | buf[1] = '\n'; | ||
5157 | buf[2] = '\0'; | ||
5158 | |||
5159 | - return simple_read_from_buffer(ubuf, size, offp, buf, 3); | ||
5160 | + return simple_read_from_buffer(ubuf, size, offp, buf, 2); | ||
5161 | } | ||
5162 | |||
5163 | static TOOL_FOPS_RDWR(tool_peer_link_fops, | ||
5164 | @@ -590,7 +590,7 @@ static int tool_setup_mw(struct tool_ctx *tc, int pidx, int widx, | ||
5165 | inmw->size = min_t(resource_size_t, req_size, size); | ||
5166 | inmw->size = round_up(inmw->size, addr_align); | ||
5167 | inmw->size = round_up(inmw->size, size_align); | ||
5168 | - inmw->mm_base = dma_alloc_coherent(&tc->ntb->dev, inmw->size, | ||
5169 | + inmw->mm_base = dma_alloc_coherent(&tc->ntb->pdev->dev, inmw->size, | ||
5170 | &inmw->dma_base, GFP_KERNEL); | ||
5171 | if (!inmw->mm_base) | ||
5172 | return -ENOMEM; | ||
5173 | @@ -612,7 +612,7 @@ static int tool_setup_mw(struct tool_ctx *tc, int pidx, int widx, | ||
5174 | return 0; | ||
5175 | |||
5176 | err_free_dma: | ||
5177 | - dma_free_coherent(&tc->ntb->dev, inmw->size, inmw->mm_base, | ||
5178 | + dma_free_coherent(&tc->ntb->pdev->dev, inmw->size, inmw->mm_base, | ||
5179 | inmw->dma_base); | ||
5180 | inmw->mm_base = NULL; | ||
5181 | inmw->dma_base = 0; | ||
5182 | @@ -629,7 +629,7 @@ static void tool_free_mw(struct tool_ctx *tc, int pidx, int widx) | ||
5183 | |||
5184 | if (inmw->mm_base != NULL) { | ||
5185 | ntb_mw_clear_trans(tc->ntb, pidx, widx); | ||
5186 | - dma_free_coherent(&tc->ntb->dev, inmw->size, | ||
5187 | + dma_free_coherent(&tc->ntb->pdev->dev, inmw->size, | ||
5188 | inmw->mm_base, inmw->dma_base); | ||
5189 | } | ||
5190 | |||
5191 | @@ -1690,4 +1690,3 @@ static void __exit tool_exit(void) | ||
5192 | debugfs_remove_recursive(tool_dbgfs_topdir); | ||
5193 | } | ||
5194 | module_exit(tool_exit); | ||
5195 | - | ||
5196 | diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c | ||
5197 | index 1c2129493508..a13cae190196 100644 | ||
5198 | --- a/drivers/nvme/host/pci.c | ||
5199 | +++ b/drivers/nvme/host/pci.c | ||
5200 | @@ -2971,9 +2971,15 @@ static int nvme_suspend(struct device *dev) | ||
5201 | * the PCI bus layer to put it into D3 in order to take the PCIe link | ||
5202 | * down, so as to allow the platform to achieve its minimum low-power | ||
5203 | * state (which may not be possible if the link is up). | ||
5204 | + * | ||
5205 | + * If a host memory buffer is enabled, shut down the device as the NVMe | ||
5206 | + * specification allows the device to access the host memory buffer in | ||
5207 | + * host DRAM from all power states, but hosts will fail access to DRAM | ||
5208 | + * during S3. | ||
5209 | */ | ||
5210 | if (pm_suspend_via_firmware() || !ctrl->npss || | ||
5211 | !pcie_aspm_enabled(pdev) || | ||
5212 | + ndev->nr_host_mem_descs || | ||
5213 | (ndev->ctrl.quirks & NVME_QUIRK_SIMPLE_SUSPEND)) | ||
5214 | return nvme_disable_prepare_reset(ndev, true); | ||
5215 | |||
5216 | diff --git a/drivers/of/kobj.c b/drivers/of/kobj.c | ||
5217 | index c72eef988041..a32e60b024b8 100644 | ||
5218 | --- a/drivers/of/kobj.c | ||
5219 | +++ b/drivers/of/kobj.c | ||
5220 | @@ -134,8 +134,6 @@ int __of_attach_node_sysfs(struct device_node *np) | ||
5221 | if (!name) | ||
5222 | return -ENOMEM; | ||
5223 | |||
5224 | - of_node_get(np); | ||
5225 | - | ||
5226 | rc = kobject_add(&np->kobj, parent, "%s", name); | ||
5227 | kfree(name); | ||
5228 | if (rc) | ||
5229 | @@ -144,6 +142,7 @@ int __of_attach_node_sysfs(struct device_node *np) | ||
5230 | for_each_property_of_node(np, pp) | ||
5231 | __of_add_property_sysfs(np, pp); | ||
5232 | |||
5233 | + of_node_get(np); | ||
5234 | return 0; | ||
5235 | } | ||
5236 | |||
5237 | diff --git a/drivers/pci/controller/dwc/pci-meson.c b/drivers/pci/controller/dwc/pci-meson.c | ||
5238 | index b927a92e3463..8c9f88704874 100644 | ||
5239 | --- a/drivers/pci/controller/dwc/pci-meson.c | ||
5240 | +++ b/drivers/pci/controller/dwc/pci-meson.c | ||
5241 | @@ -301,11 +301,11 @@ static void meson_pcie_init_dw(struct meson_pcie *mp) | ||
5242 | meson_cfg_writel(mp, val, PCIE_CFG0); | ||
5243 | |||
5244 | val = meson_elb_readl(mp, PCIE_PORT_LINK_CTRL_OFF); | ||
5245 | - val &= ~LINK_CAPABLE_MASK; | ||
5246 | + val &= ~(LINK_CAPABLE_MASK | FAST_LINK_MODE); | ||
5247 | meson_elb_writel(mp, val, PCIE_PORT_LINK_CTRL_OFF); | ||
5248 | |||
5249 | val = meson_elb_readl(mp, PCIE_PORT_LINK_CTRL_OFF); | ||
5250 | - val |= LINK_CAPABLE_X1 | FAST_LINK_MODE; | ||
5251 | + val |= LINK_CAPABLE_X1; | ||
5252 | meson_elb_writel(mp, val, PCIE_PORT_LINK_CTRL_OFF); | ||
5253 | |||
5254 | val = meson_elb_readl(mp, PCIE_GEN2_CTRL_OFF); | ||
5255 | diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c | ||
5256 | index 8615f1548882..fbcb211cceb4 100644 | ||
5257 | --- a/drivers/pci/controller/dwc/pcie-designware-host.c | ||
5258 | +++ b/drivers/pci/controller/dwc/pcie-designware-host.c | ||
5259 | @@ -263,6 +263,8 @@ int dw_pcie_allocate_domains(struct pcie_port *pp) | ||
5260 | return -ENOMEM; | ||
5261 | } | ||
5262 | |||
5263 | + irq_domain_update_bus_token(pp->irq_domain, DOMAIN_BUS_NEXUS); | ||
5264 | + | ||
5265 | pp->msi_domain = pci_msi_create_irq_domain(fwnode, | ||
5266 | &dw_pcie_msi_domain_info, | ||
5267 | pp->irq_domain); | ||
5268 | diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c | ||
5269 | index 97245e076548..f2481e80e272 100644 | ||
5270 | --- a/drivers/pci/controller/pci-aardvark.c | ||
5271 | +++ b/drivers/pci/controller/pci-aardvark.c | ||
5272 | @@ -344,10 +344,6 @@ static void advk_pcie_setup_hw(struct advk_pcie *pcie) | ||
5273 | |||
5274 | advk_pcie_wait_for_link(pcie); | ||
5275 | |||
5276 | - reg = PCIE_CORE_LINK_L0S_ENTRY | | ||
5277 | - (1 << PCIE_CORE_LINK_WIDTH_SHIFT); | ||
5278 | - advk_writel(pcie, reg, PCIE_CORE_LINK_CTRL_STAT_REG); | ||
5279 | - | ||
5280 | reg = advk_readl(pcie, PCIE_CORE_CMD_STATUS_REG); | ||
5281 | reg |= PCIE_CORE_CMD_MEM_ACCESS_EN | | ||
5282 | PCIE_CORE_CMD_IO_ACCESS_EN | | ||
5283 | diff --git a/drivers/pci/controller/pci-v3-semi.c b/drivers/pci/controller/pci-v3-semi.c | ||
5284 | index d219404bad92..9a86bb7448ac 100644 | ||
5285 | --- a/drivers/pci/controller/pci-v3-semi.c | ||
5286 | +++ b/drivers/pci/controller/pci-v3-semi.c | ||
5287 | @@ -743,7 +743,7 @@ static int v3_pci_probe(struct platform_device *pdev) | ||
5288 | int ret; | ||
5289 | LIST_HEAD(res); | ||
5290 | |||
5291 | - host = pci_alloc_host_bridge(sizeof(*v3)); | ||
5292 | + host = devm_pci_alloc_host_bridge(dev, sizeof(*v3)); | ||
5293 | if (!host) | ||
5294 | return -ENOMEM; | ||
5295 | |||
5296 | diff --git a/drivers/pci/controller/pcie-rcar.c b/drivers/pci/controller/pcie-rcar.c | ||
5297 | index 1ad0b56f11b4..04114352d0e7 100644 | ||
5298 | --- a/drivers/pci/controller/pcie-rcar.c | ||
5299 | +++ b/drivers/pci/controller/pcie-rcar.c | ||
5300 | @@ -335,11 +335,12 @@ static struct pci_ops rcar_pcie_ops = { | ||
5301 | }; | ||
5302 | |||
5303 | static void rcar_pcie_setup_window(int win, struct rcar_pcie *pcie, | ||
5304 | - struct resource *res) | ||
5305 | + struct resource_entry *window) | ||
5306 | { | ||
5307 | /* Setup PCIe address space mappings for each resource */ | ||
5308 | resource_size_t size; | ||
5309 | resource_size_t res_start; | ||
5310 | + struct resource *res = window->res; | ||
5311 | u32 mask; | ||
5312 | |||
5313 | rcar_pci_write_reg(pcie, 0x00000000, PCIEPTCTLR(win)); | ||
5314 | @@ -353,9 +354,9 @@ static void rcar_pcie_setup_window(int win, struct rcar_pcie *pcie, | ||
5315 | rcar_pci_write_reg(pcie, mask << 7, PCIEPAMR(win)); | ||
5316 | |||
5317 | if (res->flags & IORESOURCE_IO) | ||
5318 | - res_start = pci_pio_to_address(res->start); | ||
5319 | + res_start = pci_pio_to_address(res->start) - window->offset; | ||
5320 | else | ||
5321 | - res_start = res->start; | ||
5322 | + res_start = res->start - window->offset; | ||
5323 | |||
5324 | rcar_pci_write_reg(pcie, upper_32_bits(res_start), PCIEPAUR(win)); | ||
5325 | rcar_pci_write_reg(pcie, lower_32_bits(res_start) & ~0x7F, | ||
5326 | @@ -384,7 +385,7 @@ static int rcar_pcie_setup(struct list_head *resource, struct rcar_pcie *pci) | ||
5327 | switch (resource_type(res)) { | ||
5328 | case IORESOURCE_IO: | ||
5329 | case IORESOURCE_MEM: | ||
5330 | - rcar_pcie_setup_window(i, pci, res); | ||
5331 | + rcar_pcie_setup_window(i, pci, win); | ||
5332 | i++; | ||
5333 | break; | ||
5334 | case IORESOURCE_BUS: | ||
5335 | diff --git a/drivers/pci/controller/vmd.c b/drivers/pci/controller/vmd.c | ||
5336 | index afc1a3d240b5..87348ecfe3fc 100644 | ||
5337 | --- a/drivers/pci/controller/vmd.c | ||
5338 | +++ b/drivers/pci/controller/vmd.c | ||
5339 | @@ -593,9 +593,11 @@ static int vmd_enable_domain(struct vmd_dev *vmd, unsigned long features) | ||
5340 | if (!membar2) | ||
5341 | return -ENOMEM; | ||
5342 | offset[0] = vmd->dev->resource[VMD_MEMBAR1].start - | ||
5343 | - readq(membar2 + MB2_SHADOW_OFFSET); | ||
5344 | + (readq(membar2 + MB2_SHADOW_OFFSET) & | ||
5345 | + PCI_BASE_ADDRESS_MEM_MASK); | ||
5346 | offset[1] = vmd->dev->resource[VMD_MEMBAR2].start - | ||
5347 | - readq(membar2 + MB2_SHADOW_OFFSET + 8); | ||
5348 | + (readq(membar2 + MB2_SHADOW_OFFSET + 8) & | ||
5349 | + PCI_BASE_ADDRESS_MEM_MASK); | ||
5350 | pci_iounmap(vmd->dev, membar2); | ||
5351 | } | ||
5352 | } | ||
5353 | diff --git a/drivers/pci/pci-bridge-emul.c b/drivers/pci/pci-bridge-emul.c | ||
5354 | index 5fd90105510d..d3b6b9a05618 100644 | ||
5355 | --- a/drivers/pci/pci-bridge-emul.c | ||
5356 | +++ b/drivers/pci/pci-bridge-emul.c | ||
5357 | @@ -195,8 +195,8 @@ static const struct pci_bridge_reg_behavior pcie_cap_regs_behavior[] = { | ||
5358 | * RO, the rest is reserved | ||
5359 | */ | ||
5360 | .w1c = GENMASK(19, 16), | ||
5361 | - .ro = GENMASK(20, 19), | ||
5362 | - .rsvd = GENMASK(31, 21), | ||
5363 | + .ro = GENMASK(21, 20), | ||
5364 | + .rsvd = GENMASK(31, 22), | ||
5365 | }, | ||
5366 | |||
5367 | [PCI_EXP_LNKCAP / 4] = { | ||
5368 | @@ -236,7 +236,7 @@ static const struct pci_bridge_reg_behavior pcie_cap_regs_behavior[] = { | ||
5369 | PCI_EXP_SLTSTA_CC | PCI_EXP_SLTSTA_DLLSC) << 16, | ||
5370 | .ro = (PCI_EXP_SLTSTA_MRLSS | PCI_EXP_SLTSTA_PDS | | ||
5371 | PCI_EXP_SLTSTA_EIS) << 16, | ||
5372 | - .rsvd = GENMASK(15, 12) | (GENMASK(15, 9) << 16), | ||
5373 | + .rsvd = GENMASK(15, 13) | (GENMASK(15, 9) << 16), | ||
5374 | }, | ||
5375 | |||
5376 | [PCI_EXP_RTCTL / 4] = { | ||
5377 | diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c | ||
5378 | index c73e8095a849..689f0280c038 100644 | ||
5379 | --- a/drivers/pci/pci.c | ||
5380 | +++ b/drivers/pci/pci.c | ||
5381 | @@ -4608,7 +4608,8 @@ static int pci_pm_reset(struct pci_dev *dev, int probe) | ||
5382 | * pcie_wait_for_link_delay - Wait until link is active or inactive | ||
5383 | * @pdev: Bridge device | ||
5384 | * @active: waiting for active or inactive? | ||
5385 | - * @delay: Delay to wait after link has become active (in ms) | ||
5386 | + * @delay: Delay to wait after link has become active (in ms). Specify %0 | ||
5387 | + * for no delay. | ||
5388 | * | ||
5389 | * Use this to wait till link becomes active or inactive. | ||
5390 | */ | ||
5391 | @@ -4649,7 +4650,7 @@ static bool pcie_wait_for_link_delay(struct pci_dev *pdev, bool active, | ||
5392 | msleep(10); | ||
5393 | timeout -= 10; | ||
5394 | } | ||
5395 | - if (active && ret) | ||
5396 | + if (active && ret && delay) | ||
5397 | msleep(delay); | ||
5398 | else if (ret != active) | ||
5399 | pci_info(pdev, "Data Link Layer Link Active not %s in 1000 msec\n", | ||
5400 | @@ -4770,17 +4771,28 @@ void pci_bridge_wait_for_secondary_bus(struct pci_dev *dev) | ||
5401 | if (!pcie_downstream_port(dev)) | ||
5402 | return; | ||
5403 | |||
5404 | - if (pcie_get_speed_cap(dev) <= PCIE_SPEED_5_0GT) { | ||
5405 | - pci_dbg(dev, "waiting %d ms for downstream link\n", delay); | ||
5406 | - msleep(delay); | ||
5407 | - } else { | ||
5408 | - pci_dbg(dev, "waiting %d ms for downstream link, after activation\n", | ||
5409 | - delay); | ||
5410 | - if (!pcie_wait_for_link_delay(dev, true, delay)) { | ||
5411 | + /* | ||
5412 | + * Per PCIe r5.0, sec 6.6.1, for downstream ports that support | ||
5413 | + * speeds > 5 GT/s, we must wait for link training to complete | ||
5414 | + * before the mandatory delay. | ||
5415 | + * | ||
5416 | + * We can only tell when link training completes via DLL Link | ||
5417 | + * Active, which is required for downstream ports that support | ||
5418 | + * speeds > 5 GT/s (sec 7.5.3.6). Unfortunately some common | ||
5419 | + * devices do not implement Link Active reporting even when it's | ||
5420 | + * required, so we'll check for that directly instead of checking | ||
5421 | + * the supported link speed. We assume devices without Link Active | ||
5422 | + * reporting can train in 100 ms regardless of speed. | ||
5423 | + */ | ||
5424 | + if (dev->link_active_reporting) { | ||
5425 | + pci_dbg(dev, "waiting for link to train\n"); | ||
5426 | + if (!pcie_wait_for_link_delay(dev, true, 0)) { | ||
5427 | /* Did not train, no need to wait any further */ | ||
5428 | return; | ||
5429 | } | ||
5430 | } | ||
5431 | + pci_dbg(child, "waiting %d ms to become accessible\n", delay); | ||
5432 | + msleep(delay); | ||
5433 | |||
5434 | if (!pci_device_is_present(child)) { | ||
5435 | pci_dbg(child, "waiting additional %d ms to become accessible\n", delay); | ||
5436 | diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c | ||
5437 | index 5a1bbf2cb7e9..4a0ec34062d6 100644 | ||
5438 | --- a/drivers/pci/pcie/aspm.c | ||
5439 | +++ b/drivers/pci/pcie/aspm.c | ||
5440 | @@ -628,16 +628,6 @@ static void pcie_aspm_cap_init(struct pcie_link_state *link, int blacklist) | ||
5441 | |||
5442 | /* Setup initial capable state. Will be updated later */ | ||
5443 | link->aspm_capable = link->aspm_support; | ||
5444 | - /* | ||
5445 | - * If the downstream component has pci bridge function, don't | ||
5446 | - * do ASPM for now. | ||
5447 | - */ | ||
5448 | - list_for_each_entry(child, &linkbus->devices, bus_list) { | ||
5449 | - if (pci_pcie_type(child) == PCI_EXP_TYPE_PCI_BRIDGE) { | ||
5450 | - link->aspm_disable = ASPM_STATE_ALL; | ||
5451 | - break; | ||
5452 | - } | ||
5453 | - } | ||
5454 | |||
5455 | /* Get and check endpoint acceptable latencies */ | ||
5456 | list_for_each_entry(child, &linkbus->devices, bus_list) { | ||
5457 | diff --git a/drivers/pci/pcie/ptm.c b/drivers/pci/pcie/ptm.c | ||
5458 | index 9361f3aa26ab..357a454cafa0 100644 | ||
5459 | --- a/drivers/pci/pcie/ptm.c | ||
5460 | +++ b/drivers/pci/pcie/ptm.c | ||
5461 | @@ -39,10 +39,6 @@ void pci_ptm_init(struct pci_dev *dev) | ||
5462 | if (!pci_is_pcie(dev)) | ||
5463 | return; | ||
5464 | |||
5465 | - pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_PTM); | ||
5466 | - if (!pos) | ||
5467 | - return; | ||
5468 | - | ||
5469 | /* | ||
5470 | * Enable PTM only on interior devices (root ports, switch ports, | ||
5471 | * etc.) on the assumption that it causes no link traffic until an | ||
5472 | @@ -52,6 +48,23 @@ void pci_ptm_init(struct pci_dev *dev) | ||
5473 | pci_pcie_type(dev) == PCI_EXP_TYPE_RC_END)) | ||
5474 | return; | ||
5475 | |||
5476 | + /* | ||
5477 | + * Switch Downstream Ports are not permitted to have a PTM | ||
5478 | + * capability; their PTM behavior is controlled by the Upstream | ||
5479 | + * Port (PCIe r5.0, sec 7.9.16). | ||
5480 | + */ | ||
5481 | + ups = pci_upstream_bridge(dev); | ||
5482 | + if (pci_pcie_type(dev) == PCI_EXP_TYPE_DOWNSTREAM && | ||
5483 | + ups && ups->ptm_enabled) { | ||
5484 | + dev->ptm_granularity = ups->ptm_granularity; | ||
5485 | + dev->ptm_enabled = 1; | ||
5486 | + return; | ||
5487 | + } | ||
5488 | + | ||
5489 | + pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_PTM); | ||
5490 | + if (!pos) | ||
5491 | + return; | ||
5492 | + | ||
5493 | pci_read_config_dword(dev, pos + PCI_PTM_CAP, &cap); | ||
5494 | local_clock = (cap & PCI_PTM_GRANULARITY_MASK) >> 8; | ||
5495 | |||
5496 | @@ -61,7 +74,6 @@ void pci_ptm_init(struct pci_dev *dev) | ||
5497 | * the spec recommendation (PCIe r3.1, sec 7.32.3), select the | ||
5498 | * furthest upstream Time Source as the PTM Root. | ||
5499 | */ | ||
5500 | - ups = pci_upstream_bridge(dev); | ||
5501 | if (ups && ups->ptm_enabled) { | ||
5502 | ctrl = PCI_PTM_CTRL_ENABLE; | ||
5503 | if (ups->ptm_granularity == 0) | ||
5504 | diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c | ||
5505 | index 83d909abc61d..8fa13486f2f1 100644 | ||
5506 | --- a/drivers/pci/probe.c | ||
5507 | +++ b/drivers/pci/probe.c | ||
5508 | @@ -867,9 +867,10 @@ static int pci_register_host_bridge(struct pci_host_bridge *bridge) | ||
5509 | goto free; | ||
5510 | |||
5511 | err = device_register(&bridge->dev); | ||
5512 | - if (err) | ||
5513 | + if (err) { | ||
5514 | put_device(&bridge->dev); | ||
5515 | - | ||
5516 | + goto free; | ||
5517 | + } | ||
5518 | bus->bridge = get_device(&bridge->dev); | ||
5519 | device_enable_async_suspend(bus->bridge); | ||
5520 | pci_set_bus_of_node(bus); | ||
5521 | diff --git a/drivers/pci/setup-res.c b/drivers/pci/setup-res.c | ||
5522 | index d8ca40a97693..d21fa04fa44d 100644 | ||
5523 | --- a/drivers/pci/setup-res.c | ||
5524 | +++ b/drivers/pci/setup-res.c | ||
5525 | @@ -439,10 +439,11 @@ int pci_resize_resource(struct pci_dev *dev, int resno, int size) | ||
5526 | res->end = res->start + pci_rebar_size_to_bytes(size) - 1; | ||
5527 | |||
5528 | /* Check if the new config works by trying to assign everything. */ | ||
5529 | - ret = pci_reassign_bridge_resources(dev->bus->self, res->flags); | ||
5530 | - if (ret) | ||
5531 | - goto error_resize; | ||
5532 | - | ||
5533 | + if (dev->bus->self) { | ||
5534 | + ret = pci_reassign_bridge_resources(dev->bus->self, res->flags); | ||
5535 | + if (ret) | ||
5536 | + goto error_resize; | ||
5537 | + } | ||
5538 | return 0; | ||
5539 | |||
5540 | error_resize: | ||
5541 | diff --git a/drivers/perf/hisilicon/hisi_uncore_l3c_pmu.c b/drivers/perf/hisilicon/hisi_uncore_l3c_pmu.c | ||
5542 | index 078b8dc57250..c5b0950c2a7a 100644 | ||
5543 | --- a/drivers/perf/hisilicon/hisi_uncore_l3c_pmu.c | ||
5544 | +++ b/drivers/perf/hisilicon/hisi_uncore_l3c_pmu.c | ||
5545 | @@ -35,7 +35,7 @@ | ||
5546 | /* L3C has 8-counters */ | ||
5547 | #define L3C_NR_COUNTERS 0x8 | ||
5548 | |||
5549 | -#define L3C_PERF_CTRL_EN 0x20000 | ||
5550 | +#define L3C_PERF_CTRL_EN 0x10000 | ||
5551 | #define L3C_EVTYPE_NONE 0xff | ||
5552 | |||
5553 | /* | ||
5554 | diff --git a/drivers/phy/broadcom/phy-bcm-sr-usb.c b/drivers/phy/broadcom/phy-bcm-sr-usb.c | ||
5555 | index fe6c58910e4c..7c7862b4f41f 100644 | ||
5556 | --- a/drivers/phy/broadcom/phy-bcm-sr-usb.c | ||
5557 | +++ b/drivers/phy/broadcom/phy-bcm-sr-usb.c | ||
5558 | @@ -16,8 +16,6 @@ enum bcm_usb_phy_version { | ||
5559 | }; | ||
5560 | |||
5561 | enum bcm_usb_phy_reg { | ||
5562 | - PLL_NDIV_FRAC, | ||
5563 | - PLL_NDIV_INT, | ||
5564 | PLL_CTRL, | ||
5565 | PHY_CTRL, | ||
5566 | PHY_PLL_CTRL, | ||
5567 | @@ -31,18 +29,11 @@ static const u8 bcm_usb_combo_phy_ss[] = { | ||
5568 | }; | ||
5569 | |||
5570 | static const u8 bcm_usb_combo_phy_hs[] = { | ||
5571 | - [PLL_NDIV_FRAC] = 0x04, | ||
5572 | - [PLL_NDIV_INT] = 0x08, | ||
5573 | [PLL_CTRL] = 0x0c, | ||
5574 | [PHY_CTRL] = 0x10, | ||
5575 | }; | ||
5576 | |||
5577 | -#define HSPLL_NDIV_INT_VAL 0x13 | ||
5578 | -#define HSPLL_NDIV_FRAC_VAL 0x1005 | ||
5579 | - | ||
5580 | static const u8 bcm_usb_hs_phy[] = { | ||
5581 | - [PLL_NDIV_FRAC] = 0x0, | ||
5582 | - [PLL_NDIV_INT] = 0x4, | ||
5583 | [PLL_CTRL] = 0x8, | ||
5584 | [PHY_CTRL] = 0xc, | ||
5585 | }; | ||
5586 | @@ -52,7 +43,6 @@ enum pll_ctrl_bits { | ||
5587 | SSPLL_SUSPEND_EN, | ||
5588 | PLL_SEQ_START, | ||
5589 | PLL_LOCK, | ||
5590 | - PLL_PDIV, | ||
5591 | }; | ||
5592 | |||
5593 | static const u8 u3pll_ctrl[] = { | ||
5594 | @@ -66,29 +56,17 @@ static const u8 u3pll_ctrl[] = { | ||
5595 | #define HSPLL_PDIV_VAL 0x1 | ||
5596 | |||
5597 | static const u8 u2pll_ctrl[] = { | ||
5598 | - [PLL_PDIV] = 1, | ||
5599 | [PLL_RESETB] = 5, | ||
5600 | [PLL_LOCK] = 6, | ||
5601 | }; | ||
5602 | |||
5603 | enum bcm_usb_phy_ctrl_bits { | ||
5604 | CORERDY, | ||
5605 | - AFE_LDO_PWRDWNB, | ||
5606 | - AFE_PLL_PWRDWNB, | ||
5607 | - AFE_BG_PWRDWNB, | ||
5608 | - PHY_ISO, | ||
5609 | PHY_RESETB, | ||
5610 | PHY_PCTL, | ||
5611 | }; | ||
5612 | |||
5613 | #define PHY_PCTL_MASK 0xffff | ||
5614 | -/* | ||
5615 | - * 0x0806 of PCTL_VAL has below bits set | ||
5616 | - * BIT-8 : refclk divider 1 | ||
5617 | - * BIT-3:2: device mode; mode is not effect | ||
5618 | - * BIT-1: soft reset active low | ||
5619 | - */ | ||
5620 | -#define HSPHY_PCTL_VAL 0x0806 | ||
5621 | #define SSPHY_PCTL_VAL 0x0006 | ||
5622 | |||
5623 | static const u8 u3phy_ctrl[] = { | ||
5624 | @@ -98,10 +76,6 @@ static const u8 u3phy_ctrl[] = { | ||
5625 | |||
5626 | static const u8 u2phy_ctrl[] = { | ||
5627 | [CORERDY] = 0, | ||
5628 | - [AFE_LDO_PWRDWNB] = 1, | ||
5629 | - [AFE_PLL_PWRDWNB] = 2, | ||
5630 | - [AFE_BG_PWRDWNB] = 3, | ||
5631 | - [PHY_ISO] = 4, | ||
5632 | [PHY_RESETB] = 5, | ||
5633 | [PHY_PCTL] = 6, | ||
5634 | }; | ||
5635 | @@ -186,38 +160,13 @@ static int bcm_usb_hs_phy_init(struct bcm_usb_phy_cfg *phy_cfg) | ||
5636 | int ret = 0; | ||
5637 | void __iomem *regs = phy_cfg->regs; | ||
5638 | const u8 *offset; | ||
5639 | - u32 rd_data; | ||
5640 | |||
5641 | offset = phy_cfg->offset; | ||
5642 | |||
5643 | - writel(HSPLL_NDIV_INT_VAL, regs + offset[PLL_NDIV_INT]); | ||
5644 | - writel(HSPLL_NDIV_FRAC_VAL, regs + offset[PLL_NDIV_FRAC]); | ||
5645 | - | ||
5646 | - rd_data = readl(regs + offset[PLL_CTRL]); | ||
5647 | - rd_data &= ~(HSPLL_PDIV_MASK << u2pll_ctrl[PLL_PDIV]); | ||
5648 | - rd_data |= (HSPLL_PDIV_VAL << u2pll_ctrl[PLL_PDIV]); | ||
5649 | - writel(rd_data, regs + offset[PLL_CTRL]); | ||
5650 | - | ||
5651 | - /* Set Core Ready high */ | ||
5652 | - bcm_usb_reg32_setbits(regs + offset[PHY_CTRL], | ||
5653 | - BIT(u2phy_ctrl[CORERDY])); | ||
5654 | - | ||
5655 | - /* Maximum timeout for Core Ready done */ | ||
5656 | - msleep(30); | ||
5657 | - | ||
5658 | + bcm_usb_reg32_clrbits(regs + offset[PLL_CTRL], | ||
5659 | + BIT(u2pll_ctrl[PLL_RESETB])); | ||
5660 | bcm_usb_reg32_setbits(regs + offset[PLL_CTRL], | ||
5661 | BIT(u2pll_ctrl[PLL_RESETB])); | ||
5662 | - bcm_usb_reg32_setbits(regs + offset[PHY_CTRL], | ||
5663 | - BIT(u2phy_ctrl[PHY_RESETB])); | ||
5664 | - | ||
5665 | - | ||
5666 | - rd_data = readl(regs + offset[PHY_CTRL]); | ||
5667 | - rd_data &= ~(PHY_PCTL_MASK << u2phy_ctrl[PHY_PCTL]); | ||
5668 | - rd_data |= (HSPHY_PCTL_VAL << u2phy_ctrl[PHY_PCTL]); | ||
5669 | - writel(rd_data, regs + offset[PHY_CTRL]); | ||
5670 | - | ||
5671 | - /* Maximum timeout for PLL reset done */ | ||
5672 | - msleep(30); | ||
5673 | |||
5674 | ret = bcm_usb_pll_lock_check(regs + offset[PLL_CTRL], | ||
5675 | BIT(u2pll_ctrl[PLL_LOCK])); | ||
5676 | diff --git a/drivers/pinctrl/freescale/pinctrl-imx.c b/drivers/pinctrl/freescale/pinctrl-imx.c | ||
5677 | index 9f42036c5fbb..1f81569c7ae3 100644 | ||
5678 | --- a/drivers/pinctrl/freescale/pinctrl-imx.c | ||
5679 | +++ b/drivers/pinctrl/freescale/pinctrl-imx.c | ||
5680 | @@ -774,16 +774,6 @@ static int imx_pinctrl_probe_dt(struct platform_device *pdev, | ||
5681 | return 0; | ||
5682 | } | ||
5683 | |||
5684 | -/* | ||
5685 | - * imx_free_resources() - free memory used by this driver | ||
5686 | - * @info: info driver instance | ||
5687 | - */ | ||
5688 | -static void imx_free_resources(struct imx_pinctrl *ipctl) | ||
5689 | -{ | ||
5690 | - if (ipctl->pctl) | ||
5691 | - pinctrl_unregister(ipctl->pctl); | ||
5692 | -} | ||
5693 | - | ||
5694 | int imx_pinctrl_probe(struct platform_device *pdev, | ||
5695 | const struct imx_pinctrl_soc_info *info) | ||
5696 | { | ||
5697 | @@ -874,23 +864,18 @@ int imx_pinctrl_probe(struct platform_device *pdev, | ||
5698 | &ipctl->pctl); | ||
5699 | if (ret) { | ||
5700 | dev_err(&pdev->dev, "could not register IMX pinctrl driver\n"); | ||
5701 | - goto free; | ||
5702 | + return ret; | ||
5703 | } | ||
5704 | |||
5705 | ret = imx_pinctrl_probe_dt(pdev, ipctl); | ||
5706 | if (ret) { | ||
5707 | dev_err(&pdev->dev, "fail to probe dt properties\n"); | ||
5708 | - goto free; | ||
5709 | + return ret; | ||
5710 | } | ||
5711 | |||
5712 | dev_info(&pdev->dev, "initialized IMX pinctrl driver\n"); | ||
5713 | |||
5714 | return pinctrl_enable(ipctl->pctl); | ||
5715 | - | ||
5716 | -free: | ||
5717 | - imx_free_resources(ipctl); | ||
5718 | - | ||
5719 | - return ret; | ||
5720 | } | ||
5721 | |||
5722 | static int __maybe_unused imx_pinctrl_suspend(struct device *dev) | ||
5723 | diff --git a/drivers/pinctrl/freescale/pinctrl-imx1-core.c b/drivers/pinctrl/freescale/pinctrl-imx1-core.c | ||
5724 | index 7e29e3fecdb2..5bb183c0ce31 100644 | ||
5725 | --- a/drivers/pinctrl/freescale/pinctrl-imx1-core.c | ||
5726 | +++ b/drivers/pinctrl/freescale/pinctrl-imx1-core.c | ||
5727 | @@ -638,7 +638,6 @@ int imx1_pinctrl_core_probe(struct platform_device *pdev, | ||
5728 | |||
5729 | ret = of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev); | ||
5730 | if (ret) { | ||
5731 | - pinctrl_unregister(ipctl->pctl); | ||
5732 | dev_err(&pdev->dev, "Failed to populate subdevices\n"); | ||
5733 | return ret; | ||
5734 | } | ||
5735 | diff --git a/drivers/pinctrl/pinctrl-ocelot.c b/drivers/pinctrl/pinctrl-ocelot.c | ||
5736 | index fb76fb2e9ea5..0a951a75c82b 100644 | ||
5737 | --- a/drivers/pinctrl/pinctrl-ocelot.c | ||
5738 | +++ b/drivers/pinctrl/pinctrl-ocelot.c | ||
5739 | @@ -711,11 +711,12 @@ static void ocelot_irq_handler(struct irq_desc *desc) | ||
5740 | struct irq_chip *parent_chip = irq_desc_get_chip(desc); | ||
5741 | struct gpio_chip *chip = irq_desc_get_handler_data(desc); | ||
5742 | struct ocelot_pinctrl *info = gpiochip_get_data(chip); | ||
5743 | + unsigned int id_reg = OCELOT_GPIO_INTR_IDENT * info->stride; | ||
5744 | unsigned int reg = 0, irq, i; | ||
5745 | unsigned long irqs; | ||
5746 | |||
5747 | for (i = 0; i < info->stride; i++) { | ||
5748 | - regmap_read(info->map, OCELOT_GPIO_INTR_IDENT + 4 * i, ®); | ||
5749 | + regmap_read(info->map, id_reg + 4 * i, ®); | ||
5750 | if (!reg) | ||
5751 | continue; | ||
5752 | |||
5753 | diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c | ||
5754 | index dc0bbf198cbc..1bd8840e11a6 100644 | ||
5755 | --- a/drivers/pinctrl/pinctrl-rockchip.c | ||
5756 | +++ b/drivers/pinctrl/pinctrl-rockchip.c | ||
5757 | @@ -506,8 +506,8 @@ static int rockchip_dt_node_to_map(struct pinctrl_dev *pctldev, | ||
5758 | } | ||
5759 | |||
5760 | map_num += grp->npins; | ||
5761 | - new_map = devm_kcalloc(pctldev->dev, map_num, sizeof(*new_map), | ||
5762 | - GFP_KERNEL); | ||
5763 | + | ||
5764 | + new_map = kcalloc(map_num, sizeof(*new_map), GFP_KERNEL); | ||
5765 | if (!new_map) | ||
5766 | return -ENOMEM; | ||
5767 | |||
5768 | @@ -517,7 +517,7 @@ static int rockchip_dt_node_to_map(struct pinctrl_dev *pctldev, | ||
5769 | /* create mux map */ | ||
5770 | parent = of_get_parent(np); | ||
5771 | if (!parent) { | ||
5772 | - devm_kfree(pctldev->dev, new_map); | ||
5773 | + kfree(new_map); | ||
5774 | return -EINVAL; | ||
5775 | } | ||
5776 | new_map[0].type = PIN_MAP_TYPE_MUX_GROUP; | ||
5777 | @@ -544,6 +544,7 @@ static int rockchip_dt_node_to_map(struct pinctrl_dev *pctldev, | ||
5778 | static void rockchip_dt_free_map(struct pinctrl_dev *pctldev, | ||
5779 | struct pinctrl_map *map, unsigned num_maps) | ||
5780 | { | ||
5781 | + kfree(map); | ||
5782 | } | ||
5783 | |||
5784 | static const struct pinctrl_ops rockchip_pctrl_ops = { | ||
5785 | diff --git a/drivers/pinctrl/pinctrl-rza1.c b/drivers/pinctrl/pinctrl-rza1.c | ||
5786 | index 017fc6b3e27e..ca9da61cfc4e 100644 | ||
5787 | --- a/drivers/pinctrl/pinctrl-rza1.c | ||
5788 | +++ b/drivers/pinctrl/pinctrl-rza1.c | ||
5789 | @@ -418,7 +418,7 @@ static const struct rza1_bidir_entry rza1l_bidir_entries[RZA1_NPORTS] = { | ||
5790 | }; | ||
5791 | |||
5792 | static const struct rza1_swio_entry rza1l_swio_entries[] = { | ||
5793 | - [0] = { ARRAY_SIZE(rza1h_swio_pins), rza1h_swio_pins }, | ||
5794 | + [0] = { ARRAY_SIZE(rza1l_swio_pins), rza1l_swio_pins }, | ||
5795 | }; | ||
5796 | |||
5797 | /* RZ/A1L (r7s72102x) pinmux flags table */ | ||
5798 | diff --git a/drivers/power/supply/Kconfig b/drivers/power/supply/Kconfig | ||
5799 | index c84a7b1caeb6..d6fdc10c29f0 100644 | ||
5800 | --- a/drivers/power/supply/Kconfig | ||
5801 | +++ b/drivers/power/supply/Kconfig | ||
5802 | @@ -577,7 +577,7 @@ config CHARGER_BQ24257 | ||
5803 | tristate "TI BQ24250/24251/24257 battery charger driver" | ||
5804 | depends on I2C | ||
5805 | depends on GPIOLIB || COMPILE_TEST | ||
5806 | - depends on REGMAP_I2C | ||
5807 | + select REGMAP_I2C | ||
5808 | help | ||
5809 | Say Y to enable support for the TI BQ24250, BQ24251, and BQ24257 battery | ||
5810 | chargers. | ||
5811 | diff --git a/drivers/power/supply/lp8788-charger.c b/drivers/power/supply/lp8788-charger.c | ||
5812 | index 84a206f42a8e..e7931ffb7151 100644 | ||
5813 | --- a/drivers/power/supply/lp8788-charger.c | ||
5814 | +++ b/drivers/power/supply/lp8788-charger.c | ||
5815 | @@ -572,27 +572,14 @@ static void lp8788_setup_adc_channel(struct device *dev, | ||
5816 | return; | ||
5817 | |||
5818 | /* ADC channel for battery voltage */ | ||
5819 | - chan = iio_channel_get(dev, pdata->adc_vbatt); | ||
5820 | + chan = devm_iio_channel_get(dev, pdata->adc_vbatt); | ||
5821 | pchg->chan[LP8788_VBATT] = IS_ERR(chan) ? NULL : chan; | ||
5822 | |||
5823 | /* ADC channel for battery temperature */ | ||
5824 | - chan = iio_channel_get(dev, pdata->adc_batt_temp); | ||
5825 | + chan = devm_iio_channel_get(dev, pdata->adc_batt_temp); | ||
5826 | pchg->chan[LP8788_BATT_TEMP] = IS_ERR(chan) ? NULL : chan; | ||
5827 | } | ||
5828 | |||
5829 | -static void lp8788_release_adc_channel(struct lp8788_charger *pchg) | ||
5830 | -{ | ||
5831 | - int i; | ||
5832 | - | ||
5833 | - for (i = 0; i < LP8788_NUM_CHG_ADC; i++) { | ||
5834 | - if (!pchg->chan[i]) | ||
5835 | - continue; | ||
5836 | - | ||
5837 | - iio_channel_release(pchg->chan[i]); | ||
5838 | - pchg->chan[i] = NULL; | ||
5839 | - } | ||
5840 | -} | ||
5841 | - | ||
5842 | static ssize_t lp8788_show_charger_status(struct device *dev, | ||
5843 | struct device_attribute *attr, char *buf) | ||
5844 | { | ||
5845 | @@ -735,7 +722,6 @@ static int lp8788_charger_remove(struct platform_device *pdev) | ||
5846 | flush_work(&pchg->charger_work); | ||
5847 | lp8788_irq_unregister(pdev, pchg); | ||
5848 | lp8788_psy_unregister(pchg); | ||
5849 | - lp8788_release_adc_channel(pchg); | ||
5850 | |||
5851 | return 0; | ||
5852 | } | ||
5853 | diff --git a/drivers/power/supply/smb347-charger.c b/drivers/power/supply/smb347-charger.c | ||
5854 | index c1d124b8be0c..d102921b3ab2 100644 | ||
5855 | --- a/drivers/power/supply/smb347-charger.c | ||
5856 | +++ b/drivers/power/supply/smb347-charger.c | ||
5857 | @@ -1138,6 +1138,7 @@ static bool smb347_volatile_reg(struct device *dev, unsigned int reg) | ||
5858 | switch (reg) { | ||
5859 | case IRQSTAT_A: | ||
5860 | case IRQSTAT_C: | ||
5861 | + case IRQSTAT_D: | ||
5862 | case IRQSTAT_E: | ||
5863 | case IRQSTAT_F: | ||
5864 | case STAT_A: | ||
5865 | diff --git a/drivers/pwm/pwm-img.c b/drivers/pwm/pwm-img.c | ||
5866 | index c9e57bd109fb..599a0f66a384 100644 | ||
5867 | --- a/drivers/pwm/pwm-img.c | ||
5868 | +++ b/drivers/pwm/pwm-img.c | ||
5869 | @@ -129,8 +129,10 @@ static int img_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm, | ||
5870 | duty = DIV_ROUND_UP(timebase * duty_ns, period_ns); | ||
5871 | |||
5872 | ret = pm_runtime_get_sync(chip->dev); | ||
5873 | - if (ret < 0) | ||
5874 | + if (ret < 0) { | ||
5875 | + pm_runtime_put_autosuspend(chip->dev); | ||
5876 | return ret; | ||
5877 | + } | ||
5878 | |||
5879 | val = img_pwm_readl(pwm_chip, PWM_CTRL_CFG); | ||
5880 | val &= ~(PWM_CTRL_CFG_DIV_MASK << PWM_CTRL_CFG_DIV_SHIFT(pwm->hwpwm)); | ||
5881 | @@ -331,8 +333,10 @@ static int img_pwm_remove(struct platform_device *pdev) | ||
5882 | int ret; | ||
5883 | |||
5884 | ret = pm_runtime_get_sync(&pdev->dev); | ||
5885 | - if (ret < 0) | ||
5886 | + if (ret < 0) { | ||
5887 | + pm_runtime_put(&pdev->dev); | ||
5888 | return ret; | ||
5889 | + } | ||
5890 | |||
5891 | for (i = 0; i < pwm_chip->chip.npwm; i++) { | ||
5892 | val = img_pwm_readl(pwm_chip, PWM_CTRL_CFG); | ||
5893 | diff --git a/drivers/pwm/pwm-jz4740.c b/drivers/pwm/pwm-jz4740.c | ||
5894 | index 9d78cc21cb12..d0f5c69930d0 100644 | ||
5895 | --- a/drivers/pwm/pwm-jz4740.c | ||
5896 | +++ b/drivers/pwm/pwm-jz4740.c | ||
5897 | @@ -108,8 +108,8 @@ static int jz4740_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, | ||
5898 | if (prescaler == 6) | ||
5899 | return -EINVAL; | ||
5900 | |||
5901 | - tmp = (unsigned long long)period * state->duty_cycle; | ||
5902 | - do_div(tmp, state->period); | ||
5903 | + tmp = (unsigned long long)rate * state->duty_cycle; | ||
5904 | + do_div(tmp, NSEC_PER_SEC); | ||
5905 | duty = period - tmp; | ||
5906 | |||
5907 | if (duty >= period) | ||
5908 | diff --git a/drivers/remoteproc/qcom_q6v5_mss.c b/drivers/remoteproc/qcom_q6v5_mss.c | ||
5909 | index 6ba065d5c4d9..d84e9f306086 100644 | ||
5910 | --- a/drivers/remoteproc/qcom_q6v5_mss.c | ||
5911 | +++ b/drivers/remoteproc/qcom_q6v5_mss.c | ||
5912 | @@ -1005,7 +1005,13 @@ static int q6v5_mpss_load(struct q6v5 *qproc) | ||
5913 | goto release_firmware; | ||
5914 | } | ||
5915 | |||
5916 | - ptr = qproc->mpss_region + offset; | ||
5917 | + ptr = ioremap_wc(qproc->mpss_phys + offset, phdr->p_memsz); | ||
5918 | + if (!ptr) { | ||
5919 | + dev_err(qproc->dev, | ||
5920 | + "unable to map memory region: %pa+%zx-%x\n", | ||
5921 | + &qproc->mpss_phys, offset, phdr->p_memsz); | ||
5922 | + goto release_firmware; | ||
5923 | + } | ||
5924 | |||
5925 | if (phdr->p_filesz && phdr->p_offset < fw->size) { | ||
5926 | /* Firmware is large enough to be non-split */ | ||
5927 | @@ -1014,6 +1020,7 @@ static int q6v5_mpss_load(struct q6v5 *qproc) | ||
5928 | "failed to load segment %d from truncated file %s\n", | ||
5929 | i, fw_name); | ||
5930 | ret = -EINVAL; | ||
5931 | + iounmap(ptr); | ||
5932 | goto release_firmware; | ||
5933 | } | ||
5934 | |||
5935 | @@ -1024,6 +1031,7 @@ static int q6v5_mpss_load(struct q6v5 *qproc) | ||
5936 | ret = request_firmware(&seg_fw, fw_name, qproc->dev); | ||
5937 | if (ret) { | ||
5938 | dev_err(qproc->dev, "failed to load %s\n", fw_name); | ||
5939 | + iounmap(ptr); | ||
5940 | goto release_firmware; | ||
5941 | } | ||
5942 | |||
5943 | @@ -1036,6 +1044,7 @@ static int q6v5_mpss_load(struct q6v5 *qproc) | ||
5944 | memset(ptr + phdr->p_filesz, 0, | ||
5945 | phdr->p_memsz - phdr->p_filesz); | ||
5946 | } | ||
5947 | + iounmap(ptr); | ||
5948 | size += phdr->p_memsz; | ||
5949 | } | ||
5950 | |||
5951 | @@ -1075,7 +1084,8 @@ static void qcom_q6v5_dump_segment(struct rproc *rproc, | ||
5952 | int ret = 0; | ||
5953 | struct q6v5 *qproc = rproc->priv; | ||
5954 | unsigned long mask = BIT((unsigned long)segment->priv); | ||
5955 | - void *ptr = rproc_da_to_va(rproc, segment->da, segment->size); | ||
5956 | + int offset = segment->da - qproc->mpss_reloc; | ||
5957 | + void *ptr = NULL; | ||
5958 | |||
5959 | /* Unlock mba before copying segments */ | ||
5960 | if (!qproc->dump_mba_loaded) { | ||
5961 | @@ -1089,10 +1099,15 @@ static void qcom_q6v5_dump_segment(struct rproc *rproc, | ||
5962 | } | ||
5963 | } | ||
5964 | |||
5965 | - if (!ptr || ret) | ||
5966 | - memset(dest, 0xff, segment->size); | ||
5967 | - else | ||
5968 | + if (!ret) | ||
5969 | + ptr = ioremap_wc(qproc->mpss_phys + offset, segment->size); | ||
5970 | + | ||
5971 | + if (ptr) { | ||
5972 | memcpy(dest, ptr, segment->size); | ||
5973 | + iounmap(ptr); | ||
5974 | + } else { | ||
5975 | + memset(dest, 0xff, segment->size); | ||
5976 | + } | ||
5977 | |||
5978 | qproc->dump_segment_mask |= mask; | ||
5979 | |||
5980 | @@ -1393,12 +1408,6 @@ static int q6v5_alloc_memory_region(struct q6v5 *qproc) | ||
5981 | |||
5982 | qproc->mpss_phys = qproc->mpss_reloc = r.start; | ||
5983 | qproc->mpss_size = resource_size(&r); | ||
5984 | - qproc->mpss_region = devm_ioremap_wc(qproc->dev, qproc->mpss_phys, qproc->mpss_size); | ||
5985 | - if (!qproc->mpss_region) { | ||
5986 | - dev_err(qproc->dev, "unable to map memory region: %pa+%zx\n", | ||
5987 | - &r.start, qproc->mpss_size); | ||
5988 | - return -EBUSY; | ||
5989 | - } | ||
5990 | |||
5991 | return 0; | ||
5992 | } | ||
5993 | diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c | ||
5994 | index 0896b3614eb1..ce92ae227aa1 100644 | ||
5995 | --- a/drivers/remoteproc/remoteproc_core.c | ||
5996 | +++ b/drivers/remoteproc/remoteproc_core.c | ||
5997 | @@ -2036,6 +2036,7 @@ struct rproc *rproc_alloc(struct device *dev, const char *name, | ||
5998 | rproc->dev.type = &rproc_type; | ||
5999 | rproc->dev.class = &rproc_class; | ||
6000 | rproc->dev.driver_data = rproc; | ||
6001 | + idr_init(&rproc->notifyids); | ||
6002 | |||
6003 | /* Assign a unique device index and name */ | ||
6004 | rproc->index = ida_simple_get(&rproc_dev_index, 0, 0, GFP_KERNEL); | ||
6005 | @@ -2060,8 +2061,6 @@ struct rproc *rproc_alloc(struct device *dev, const char *name, | ||
6006 | |||
6007 | mutex_init(&rproc->lock); | ||
6008 | |||
6009 | - idr_init(&rproc->notifyids); | ||
6010 | - | ||
6011 | INIT_LIST_HEAD(&rproc->carveouts); | ||
6012 | INIT_LIST_HEAD(&rproc->mappings); | ||
6013 | INIT_LIST_HEAD(&rproc->traces); | ||
6014 | diff --git a/drivers/rtc/rtc-mc13xxx.c b/drivers/rtc/rtc-mc13xxx.c | ||
6015 | index afce2c0b4bd6..d6802e6191cb 100644 | ||
6016 | --- a/drivers/rtc/rtc-mc13xxx.c | ||
6017 | +++ b/drivers/rtc/rtc-mc13xxx.c | ||
6018 | @@ -308,8 +308,10 @@ static int __init mc13xxx_rtc_probe(struct platform_device *pdev) | ||
6019 | mc13xxx_unlock(mc13xxx); | ||
6020 | |||
6021 | ret = rtc_register_device(priv->rtc); | ||
6022 | - if (ret) | ||
6023 | + if (ret) { | ||
6024 | + mc13xxx_lock(mc13xxx); | ||
6025 | goto err_irq_request; | ||
6026 | + } | ||
6027 | |||
6028 | return 0; | ||
6029 | |||
6030 | diff --git a/drivers/rtc/rtc-rv3028.c b/drivers/rtc/rtc-rv3028.c | ||
6031 | index 2b316661a578..bbdfebd70644 100644 | ||
6032 | --- a/drivers/rtc/rtc-rv3028.c | ||
6033 | +++ b/drivers/rtc/rtc-rv3028.c | ||
6034 | @@ -625,6 +625,8 @@ static int rv3028_probe(struct i2c_client *client) | ||
6035 | return -ENOMEM; | ||
6036 | |||
6037 | rv3028->regmap = devm_regmap_init_i2c(client, ®map_config); | ||
6038 | + if (IS_ERR(rv3028->regmap)) | ||
6039 | + return PTR_ERR(rv3028->regmap); | ||
6040 | |||
6041 | i2c_set_clientdata(client, rv3028); | ||
6042 | |||
6043 | diff --git a/drivers/s390/cio/qdio.h b/drivers/s390/cio/qdio.h | ||
6044 | index a58b45df95d7..3b0a4483a252 100644 | ||
6045 | --- a/drivers/s390/cio/qdio.h | ||
6046 | +++ b/drivers/s390/cio/qdio.h | ||
6047 | @@ -372,7 +372,6 @@ static inline int multicast_outbound(struct qdio_q *q) | ||
6048 | extern u64 last_ai_time; | ||
6049 | |||
6050 | /* prototypes for thin interrupt */ | ||
6051 | -void qdio_setup_thinint(struct qdio_irq *irq_ptr); | ||
6052 | int qdio_establish_thinint(struct qdio_irq *irq_ptr); | ||
6053 | void qdio_shutdown_thinint(struct qdio_irq *irq_ptr); | ||
6054 | void tiqdio_add_input_queues(struct qdio_irq *irq_ptr); | ||
6055 | diff --git a/drivers/s390/cio/qdio_setup.c b/drivers/s390/cio/qdio_setup.c | ||
6056 | index ee0b3c586211..9dc56aa3ae55 100644 | ||
6057 | --- a/drivers/s390/cio/qdio_setup.c | ||
6058 | +++ b/drivers/s390/cio/qdio_setup.c | ||
6059 | @@ -479,7 +479,6 @@ int qdio_setup_irq(struct qdio_initialize *init_data) | ||
6060 | setup_queues(irq_ptr, init_data); | ||
6061 | |||
6062 | setup_qib(irq_ptr, init_data); | ||
6063 | - qdio_setup_thinint(irq_ptr); | ||
6064 | set_impl_params(irq_ptr, init_data->qib_param_field_format, | ||
6065 | init_data->qib_param_field, | ||
6066 | init_data->input_slib_elements, | ||
6067 | diff --git a/drivers/s390/cio/qdio_thinint.c b/drivers/s390/cio/qdio_thinint.c | ||
6068 | index 93ee067c10ca..ddf780b12d40 100644 | ||
6069 | --- a/drivers/s390/cio/qdio_thinint.c | ||
6070 | +++ b/drivers/s390/cio/qdio_thinint.c | ||
6071 | @@ -268,17 +268,19 @@ int __init tiqdio_register_thinints(void) | ||
6072 | |||
6073 | int qdio_establish_thinint(struct qdio_irq *irq_ptr) | ||
6074 | { | ||
6075 | + int rc; | ||
6076 | + | ||
6077 | if (!is_thinint_irq(irq_ptr)) | ||
6078 | return 0; | ||
6079 | - return set_subchannel_ind(irq_ptr, 0); | ||
6080 | -} | ||
6081 | |||
6082 | -void qdio_setup_thinint(struct qdio_irq *irq_ptr) | ||
6083 | -{ | ||
6084 | - if (!is_thinint_irq(irq_ptr)) | ||
6085 | - return; | ||
6086 | irq_ptr->dsci = get_indicator(); | ||
6087 | DBF_HEX(&irq_ptr->dsci, sizeof(void *)); | ||
6088 | + | ||
6089 | + rc = set_subchannel_ind(irq_ptr, 0); | ||
6090 | + if (rc) | ||
6091 | + put_indicator(irq_ptr->dsci); | ||
6092 | + | ||
6093 | + return rc; | ||
6094 | } | ||
6095 | |||
6096 | void qdio_shutdown_thinint(struct qdio_irq *irq_ptr) | ||
6097 | diff --git a/drivers/scsi/arm/acornscsi.c b/drivers/scsi/arm/acornscsi.c | ||
6098 | index d12dd89538df..deab66598910 100644 | ||
6099 | --- a/drivers/scsi/arm/acornscsi.c | ||
6100 | +++ b/drivers/scsi/arm/acornscsi.c | ||
6101 | @@ -2911,8 +2911,10 @@ static int acornscsi_probe(struct expansion_card *ec, const struct ecard_id *id) | ||
6102 | |||
6103 | ashost->base = ecardm_iomap(ec, ECARD_RES_MEMC, 0, 0); | ||
6104 | ashost->fast = ecardm_iomap(ec, ECARD_RES_IOCFAST, 0, 0); | ||
6105 | - if (!ashost->base || !ashost->fast) | ||
6106 | + if (!ashost->base || !ashost->fast) { | ||
6107 | + ret = -ENOMEM; | ||
6108 | goto out_put; | ||
6109 | + } | ||
6110 | |||
6111 | host->irq = ec->irq; | ||
6112 | ashost->host = host; | ||
6113 | diff --git a/drivers/scsi/cxgbi/cxgb3i/cxgb3i.c b/drivers/scsi/cxgbi/cxgb3i/cxgb3i.c | ||
6114 | index 524cdbcd29aa..ec7d01f6e2d5 100644 | ||
6115 | --- a/drivers/scsi/cxgbi/cxgb3i/cxgb3i.c | ||
6116 | +++ b/drivers/scsi/cxgbi/cxgb3i/cxgb3i.c | ||
6117 | @@ -959,6 +959,7 @@ static int init_act_open(struct cxgbi_sock *csk) | ||
6118 | struct net_device *ndev = cdev->ports[csk->port_id]; | ||
6119 | struct cxgbi_hba *chba = cdev->hbas[csk->port_id]; | ||
6120 | struct sk_buff *skb = NULL; | ||
6121 | + int ret; | ||
6122 | |||
6123 | log_debug(1 << CXGBI_DBG_TOE | 1 << CXGBI_DBG_SOCK, | ||
6124 | "csk 0x%p,%u,0x%lx.\n", csk, csk->state, csk->flags); | ||
6125 | @@ -979,16 +980,16 @@ static int init_act_open(struct cxgbi_sock *csk) | ||
6126 | csk->atid = cxgb3_alloc_atid(t3dev, &t3_client, csk); | ||
6127 | if (csk->atid < 0) { | ||
6128 | pr_err("NO atid available.\n"); | ||
6129 | - return -EINVAL; | ||
6130 | + ret = -EINVAL; | ||
6131 | + goto put_sock; | ||
6132 | } | ||
6133 | cxgbi_sock_set_flag(csk, CTPF_HAS_ATID); | ||
6134 | cxgbi_sock_get(csk); | ||
6135 | |||
6136 | skb = alloc_wr(sizeof(struct cpl_act_open_req), 0, GFP_KERNEL); | ||
6137 | if (!skb) { | ||
6138 | - cxgb3_free_atid(t3dev, csk->atid); | ||
6139 | - cxgbi_sock_put(csk); | ||
6140 | - return -ENOMEM; | ||
6141 | + ret = -ENOMEM; | ||
6142 | + goto free_atid; | ||
6143 | } | ||
6144 | skb->sk = (struct sock *)csk; | ||
6145 | set_arp_failure_handler(skb, act_open_arp_failure); | ||
6146 | @@ -1010,6 +1011,15 @@ static int init_act_open(struct cxgbi_sock *csk) | ||
6147 | cxgbi_sock_set_state(csk, CTP_ACTIVE_OPEN); | ||
6148 | send_act_open_req(csk, skb, csk->l2t); | ||
6149 | return 0; | ||
6150 | + | ||
6151 | +free_atid: | ||
6152 | + cxgb3_free_atid(t3dev, csk->atid); | ||
6153 | +put_sock: | ||
6154 | + cxgbi_sock_put(csk); | ||
6155 | + l2t_release(t3dev, csk->l2t); | ||
6156 | + csk->l2t = NULL; | ||
6157 | + | ||
6158 | + return ret; | ||
6159 | } | ||
6160 | |||
6161 | cxgb3_cpl_handler_func cxgb3i_cpl_handlers[NUM_CPL_CMDS] = { | ||
6162 | diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/hisi_sas_main.c | ||
6163 | index 6f4692f0d714..031aa4043c5e 100644 | ||
6164 | --- a/drivers/scsi/hisi_sas/hisi_sas_main.c | ||
6165 | +++ b/drivers/scsi/hisi_sas/hisi_sas_main.c | ||
6166 | @@ -904,8 +904,11 @@ void hisi_sas_phy_oob_ready(struct hisi_hba *hisi_hba, int phy_no) | ||
6167 | struct hisi_sas_phy *phy = &hisi_hba->phy[phy_no]; | ||
6168 | struct device *dev = hisi_hba->dev; | ||
6169 | |||
6170 | + dev_dbg(dev, "phy%d OOB ready\n", phy_no); | ||
6171 | + if (phy->phy_attached) | ||
6172 | + return; | ||
6173 | + | ||
6174 | if (!timer_pending(&phy->timer)) { | ||
6175 | - dev_dbg(dev, "phy%d OOB ready\n", phy_no); | ||
6176 | phy->timer.expires = jiffies + HISI_SAS_WAIT_PHYUP_TIMEOUT * HZ; | ||
6177 | add_timer(&phy->timer); | ||
6178 | } | ||
6179 | diff --git a/drivers/scsi/ibmvscsi/ibmvscsi.c b/drivers/scsi/ibmvscsi/ibmvscsi.c | ||
6180 | index 59f0f1030c54..c5711c659b51 100644 | ||
6181 | --- a/drivers/scsi/ibmvscsi/ibmvscsi.c | ||
6182 | +++ b/drivers/scsi/ibmvscsi/ibmvscsi.c | ||
6183 | @@ -415,6 +415,8 @@ static int ibmvscsi_reenable_crq_queue(struct crq_queue *queue, | ||
6184 | int rc = 0; | ||
6185 | struct vio_dev *vdev = to_vio_dev(hostdata->dev); | ||
6186 | |||
6187 | + set_adapter_info(hostdata); | ||
6188 | + | ||
6189 | /* Re-enable the CRQ */ | ||
6190 | do { | ||
6191 | if (rc) | ||
6192 | diff --git a/drivers/scsi/iscsi_boot_sysfs.c b/drivers/scsi/iscsi_boot_sysfs.c | ||
6193 | index e4857b728033..a64abe38db2d 100644 | ||
6194 | --- a/drivers/scsi/iscsi_boot_sysfs.c | ||
6195 | +++ b/drivers/scsi/iscsi_boot_sysfs.c | ||
6196 | @@ -352,7 +352,7 @@ iscsi_boot_create_kobj(struct iscsi_boot_kset *boot_kset, | ||
6197 | boot_kobj->kobj.kset = boot_kset->kset; | ||
6198 | if (kobject_init_and_add(&boot_kobj->kobj, &iscsi_boot_ktype, | ||
6199 | NULL, name, index)) { | ||
6200 | - kfree(boot_kobj); | ||
6201 | + kobject_put(&boot_kobj->kobj); | ||
6202 | return NULL; | ||
6203 | } | ||
6204 | boot_kobj->data = data; | ||
6205 | diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c | ||
6206 | index 66f8867dd837..94d8f2834100 100644 | ||
6207 | --- a/drivers/scsi/lpfc/lpfc_els.c | ||
6208 | +++ b/drivers/scsi/lpfc/lpfc_els.c | ||
6209 | @@ -8394,6 +8394,8 @@ lpfc_els_unsol_buffer(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, | ||
6210 | spin_lock_irq(shost->host_lock); | ||
6211 | if (ndlp->nlp_flag & NLP_IN_DEV_LOSS) { | ||
6212 | spin_unlock_irq(shost->host_lock); | ||
6213 | + if (newnode) | ||
6214 | + lpfc_nlp_put(ndlp); | ||
6215 | goto dropit; | ||
6216 | } | ||
6217 | spin_unlock_irq(shost->host_lock); | ||
6218 | diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.c b/drivers/scsi/mpt3sas/mpt3sas_base.c | ||
6219 | index 752b71cfbe12..7fd1d731555f 100644 | ||
6220 | --- a/drivers/scsi/mpt3sas/mpt3sas_base.c | ||
6221 | +++ b/drivers/scsi/mpt3sas/mpt3sas_base.c | ||
6222 | @@ -4777,7 +4777,9 @@ _base_release_memory_pools(struct MPT3SAS_ADAPTER *ioc) | ||
6223 | } | ||
6224 | |||
6225 | kfree(ioc->hpr_lookup); | ||
6226 | + ioc->hpr_lookup = NULL; | ||
6227 | kfree(ioc->internal_lookup); | ||
6228 | + ioc->internal_lookup = NULL; | ||
6229 | if (ioc->chain_lookup) { | ||
6230 | for (i = 0; i < ioc->scsiio_depth; i++) { | ||
6231 | for (j = ioc->chains_per_prp_buffer; | ||
6232 | diff --git a/drivers/scsi/qedf/qedf.h b/drivers/scsi/qedf/qedf.h | ||
6233 | index f3f399fe10c8..0da4e16fb23a 100644 | ||
6234 | --- a/drivers/scsi/qedf/qedf.h | ||
6235 | +++ b/drivers/scsi/qedf/qedf.h | ||
6236 | @@ -355,6 +355,7 @@ struct qedf_ctx { | ||
6237 | #define QEDF_GRCDUMP_CAPTURE 4 | ||
6238 | #define QEDF_IN_RECOVERY 5 | ||
6239 | #define QEDF_DBG_STOP_IO 6 | ||
6240 | +#define QEDF_PROBING 8 | ||
6241 | unsigned long flags; /* Miscellaneous state flags */ | ||
6242 | int fipvlan_retries; | ||
6243 | u8 num_queues; | ||
6244 | diff --git a/drivers/scsi/qedf/qedf_main.c b/drivers/scsi/qedf/qedf_main.c | ||
6245 | index 59ca98f12afd..3d0e345947c1 100644 | ||
6246 | --- a/drivers/scsi/qedf/qedf_main.c | ||
6247 | +++ b/drivers/scsi/qedf/qedf_main.c | ||
6248 | @@ -3153,7 +3153,7 @@ static int __qedf_probe(struct pci_dev *pdev, int mode) | ||
6249 | { | ||
6250 | int rc = -EINVAL; | ||
6251 | struct fc_lport *lport; | ||
6252 | - struct qedf_ctx *qedf; | ||
6253 | + struct qedf_ctx *qedf = NULL; | ||
6254 | struct Scsi_Host *host; | ||
6255 | bool is_vf = false; | ||
6256 | struct qed_ll2_params params; | ||
6257 | @@ -3183,6 +3183,7 @@ static int __qedf_probe(struct pci_dev *pdev, int mode) | ||
6258 | |||
6259 | /* Initialize qedf_ctx */ | ||
6260 | qedf = lport_priv(lport); | ||
6261 | + set_bit(QEDF_PROBING, &qedf->flags); | ||
6262 | qedf->lport = lport; | ||
6263 | qedf->ctlr.lp = lport; | ||
6264 | qedf->pdev = pdev; | ||
6265 | @@ -3206,9 +3207,12 @@ static int __qedf_probe(struct pci_dev *pdev, int mode) | ||
6266 | } else { | ||
6267 | /* Init pointers during recovery */ | ||
6268 | qedf = pci_get_drvdata(pdev); | ||
6269 | + set_bit(QEDF_PROBING, &qedf->flags); | ||
6270 | lport = qedf->lport; | ||
6271 | } | ||
6272 | |||
6273 | + QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_DISC, "Probe started.\n"); | ||
6274 | + | ||
6275 | host = lport->host; | ||
6276 | |||
6277 | /* Allocate mempool for qedf_io_work structs */ | ||
6278 | @@ -3513,6 +3517,10 @@ static int __qedf_probe(struct pci_dev *pdev, int mode) | ||
6279 | else | ||
6280 | fc_fabric_login(lport); | ||
6281 | |||
6282 | + QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_DISC, "Probe done.\n"); | ||
6283 | + | ||
6284 | + clear_bit(QEDF_PROBING, &qedf->flags); | ||
6285 | + | ||
6286 | /* All good */ | ||
6287 | return 0; | ||
6288 | |||
6289 | @@ -3538,6 +3546,11 @@ err2: | ||
6290 | err1: | ||
6291 | scsi_host_put(lport->host); | ||
6292 | err0: | ||
6293 | + if (qedf) { | ||
6294 | + QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_DISC, "Probe done.\n"); | ||
6295 | + | ||
6296 | + clear_bit(QEDF_PROBING, &qedf->flags); | ||
6297 | + } | ||
6298 | return rc; | ||
6299 | } | ||
6300 | |||
6301 | @@ -3687,11 +3700,25 @@ void qedf_get_protocol_tlv_data(void *dev, void *data) | ||
6302 | { | ||
6303 | struct qedf_ctx *qedf = dev; | ||
6304 | struct qed_mfw_tlv_fcoe *fcoe = data; | ||
6305 | - struct fc_lport *lport = qedf->lport; | ||
6306 | - struct Scsi_Host *host = lport->host; | ||
6307 | - struct fc_host_attrs *fc_host = shost_to_fc_host(host); | ||
6308 | + struct fc_lport *lport; | ||
6309 | + struct Scsi_Host *host; | ||
6310 | + struct fc_host_attrs *fc_host; | ||
6311 | struct fc_host_statistics *hst; | ||
6312 | |||
6313 | + if (!qedf) { | ||
6314 | + QEDF_ERR(NULL, "qedf is null.\n"); | ||
6315 | + return; | ||
6316 | + } | ||
6317 | + | ||
6318 | + if (test_bit(QEDF_PROBING, &qedf->flags)) { | ||
6319 | + QEDF_ERR(&qedf->dbg_ctx, "Function is still probing.\n"); | ||
6320 | + return; | ||
6321 | + } | ||
6322 | + | ||
6323 | + lport = qedf->lport; | ||
6324 | + host = lport->host; | ||
6325 | + fc_host = shost_to_fc_host(host); | ||
6326 | + | ||
6327 | /* Force a refresh of the fc_host stats including offload stats */ | ||
6328 | hst = qedf_fc_get_host_stats(host); | ||
6329 | |||
6330 | diff --git a/drivers/scsi/qedi/qedi_iscsi.c b/drivers/scsi/qedi/qedi_iscsi.c | ||
6331 | index 8829880a54c3..0f57c8073406 100644 | ||
6332 | --- a/drivers/scsi/qedi/qedi_iscsi.c | ||
6333 | +++ b/drivers/scsi/qedi/qedi_iscsi.c | ||
6334 | @@ -997,7 +997,8 @@ static void qedi_ep_disconnect(struct iscsi_endpoint *ep) | ||
6335 | if (qedi_ep->state == EP_STATE_OFLDCONN_START) | ||
6336 | goto ep_exit_recover; | ||
6337 | |||
6338 | - flush_work(&qedi_ep->offload_work); | ||
6339 | + if (qedi_ep->state != EP_STATE_OFLDCONN_NONE) | ||
6340 | + flush_work(&qedi_ep->offload_work); | ||
6341 | |||
6342 | if (qedi_ep->conn) { | ||
6343 | qedi_conn = qedi_ep->conn; | ||
6344 | @@ -1214,6 +1215,10 @@ static int qedi_set_path(struct Scsi_Host *shost, struct iscsi_path *path_data) | ||
6345 | } | ||
6346 | |||
6347 | iscsi_cid = (u32)path_data->handle; | ||
6348 | + if (iscsi_cid >= qedi->max_active_conns) { | ||
6349 | + ret = -EINVAL; | ||
6350 | + goto set_path_exit; | ||
6351 | + } | ||
6352 | qedi_ep = qedi->ep_tbl[iscsi_cid]; | ||
6353 | QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO, | ||
6354 | "iscsi_cid=0x%x, qedi_ep=%p\n", iscsi_cid, qedi_ep); | ||
6355 | diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c | ||
6356 | index 03d272a09e26..d7ec4083a091 100644 | ||
6357 | --- a/drivers/scsi/qla2xxx/qla_os.c | ||
6358 | +++ b/drivers/scsi/qla2xxx/qla_os.c | ||
6359 | @@ -6295,6 +6295,7 @@ qla2x00_do_dpc(void *data) | ||
6360 | |||
6361 | if (do_reset && !(test_and_set_bit(ABORT_ISP_ACTIVE, | ||
6362 | &base_vha->dpc_flags))) { | ||
6363 | + base_vha->flags.online = 1; | ||
6364 | ql_dbg(ql_dbg_dpc, base_vha, 0x4007, | ||
6365 | "ISP abort scheduled.\n"); | ||
6366 | if (ha->isp_ops->abort_isp(base_vha)) { | ||
6367 | diff --git a/drivers/scsi/qla2xxx/tcm_qla2xxx.c b/drivers/scsi/qla2xxx/tcm_qla2xxx.c | ||
6368 | index abe7f79bb789..744cd93189da 100644 | ||
6369 | --- a/drivers/scsi/qla2xxx/tcm_qla2xxx.c | ||
6370 | +++ b/drivers/scsi/qla2xxx/tcm_qla2xxx.c | ||
6371 | @@ -926,6 +926,7 @@ static ssize_t tcm_qla2xxx_tpg_enable_store(struct config_item *item, | ||
6372 | |||
6373 | atomic_set(&tpg->lport_tpg_enabled, 0); | ||
6374 | qlt_stop_phase1(vha->vha_tgt.qla_tgt); | ||
6375 | + qlt_stop_phase2(vha->vha_tgt.qla_tgt); | ||
6376 | } | ||
6377 | |||
6378 | return count; | ||
6379 | @@ -1088,6 +1089,7 @@ static ssize_t tcm_qla2xxx_npiv_tpg_enable_store(struct config_item *item, | ||
6380 | |||
6381 | atomic_set(&tpg->lport_tpg_enabled, 0); | ||
6382 | qlt_stop_phase1(vha->vha_tgt.qla_tgt); | ||
6383 | + qlt_stop_phase2(vha->vha_tgt.qla_tgt); | ||
6384 | } | ||
6385 | |||
6386 | return count; | ||
6387 | diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c | ||
6388 | index 91c007d26c1e..206c9f53e9e7 100644 | ||
6389 | --- a/drivers/scsi/scsi_lib.c | ||
6390 | +++ b/drivers/scsi/scsi_lib.c | ||
6391 | @@ -551,7 +551,7 @@ static void scsi_uninit_cmd(struct scsi_cmnd *cmd) | ||
6392 | } | ||
6393 | } | ||
6394 | |||
6395 | -static void scsi_mq_free_sgtables(struct scsi_cmnd *cmd) | ||
6396 | +static void scsi_free_sgtables(struct scsi_cmnd *cmd) | ||
6397 | { | ||
6398 | if (cmd->sdb.table.nents) | ||
6399 | sg_free_table_chained(&cmd->sdb.table, | ||
6400 | @@ -563,7 +563,7 @@ static void scsi_mq_free_sgtables(struct scsi_cmnd *cmd) | ||
6401 | |||
6402 | static void scsi_mq_uninit_cmd(struct scsi_cmnd *cmd) | ||
6403 | { | ||
6404 | - scsi_mq_free_sgtables(cmd); | ||
6405 | + scsi_free_sgtables(cmd); | ||
6406 | scsi_uninit_cmd(cmd); | ||
6407 | scsi_del_cmd_from_list(cmd); | ||
6408 | } | ||
6409 | @@ -1063,7 +1063,7 @@ blk_status_t scsi_init_io(struct scsi_cmnd *cmd) | ||
6410 | |||
6411 | return BLK_STS_OK; | ||
6412 | out_free_sgtables: | ||
6413 | - scsi_mq_free_sgtables(cmd); | ||
6414 | + scsi_free_sgtables(cmd); | ||
6415 | return ret; | ||
6416 | } | ||
6417 | EXPORT_SYMBOL(scsi_init_io); | ||
6418 | @@ -1214,6 +1214,7 @@ static blk_status_t scsi_setup_cmnd(struct scsi_device *sdev, | ||
6419 | struct request *req) | ||
6420 | { | ||
6421 | struct scsi_cmnd *cmd = blk_mq_rq_to_pdu(req); | ||
6422 | + blk_status_t ret; | ||
6423 | |||
6424 | if (!blk_rq_bytes(req)) | ||
6425 | cmd->sc_data_direction = DMA_NONE; | ||
6426 | @@ -1223,9 +1224,14 @@ static blk_status_t scsi_setup_cmnd(struct scsi_device *sdev, | ||
6427 | cmd->sc_data_direction = DMA_FROM_DEVICE; | ||
6428 | |||
6429 | if (blk_rq_is_scsi(req)) | ||
6430 | - return scsi_setup_scsi_cmnd(sdev, req); | ||
6431 | + ret = scsi_setup_scsi_cmnd(sdev, req); | ||
6432 | else | ||
6433 | - return scsi_setup_fs_cmnd(sdev, req); | ||
6434 | + ret = scsi_setup_fs_cmnd(sdev, req); | ||
6435 | + | ||
6436 | + if (ret != BLK_STS_OK) | ||
6437 | + scsi_free_sgtables(cmd); | ||
6438 | + | ||
6439 | + return ret; | ||
6440 | } | ||
6441 | |||
6442 | static blk_status_t | ||
6443 | diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c | ||
6444 | index 4664fdf75c0f..70a28f6fb1d0 100644 | ||
6445 | --- a/drivers/scsi/sr.c | ||
6446 | +++ b/drivers/scsi/sr.c | ||
6447 | @@ -750,7 +750,7 @@ static int sr_probe(struct device *dev) | ||
6448 | cd->cdi.disk = disk; | ||
6449 | |||
6450 | if (register_cdrom(&cd->cdi)) | ||
6451 | - goto fail_put; | ||
6452 | + goto fail_minor; | ||
6453 | |||
6454 | /* | ||
6455 | * Initialize block layer runtime PM stuffs before the | ||
6456 | @@ -768,6 +768,10 @@ static int sr_probe(struct device *dev) | ||
6457 | |||
6458 | return 0; | ||
6459 | |||
6460 | +fail_minor: | ||
6461 | + spin_lock(&sr_index_lock); | ||
6462 | + clear_bit(minor, sr_index_bits); | ||
6463 | + spin_unlock(&sr_index_lock); | ||
6464 | fail_put: | ||
6465 | put_disk(disk); | ||
6466 | fail_free: | ||
6467 | diff --git a/drivers/scsi/ufs/ufs-qcom.c b/drivers/scsi/ufs/ufs-qcom.c | ||
6468 | index 411ef60b2c14..c49e9f6c46f8 100644 | ||
6469 | --- a/drivers/scsi/ufs/ufs-qcom.c | ||
6470 | +++ b/drivers/scsi/ufs/ufs-qcom.c | ||
6471 | @@ -1546,11 +1546,11 @@ static void ufs_qcom_dump_dbg_regs(struct ufs_hba *hba) | ||
6472 | |||
6473 | /* sleep a bit intermittently as we are dumping too much data */ | ||
6474 | ufs_qcom_print_hw_debug_reg_all(hba, NULL, ufs_qcom_dump_regs_wrapper); | ||
6475 | - usleep_range(1000, 1100); | ||
6476 | + udelay(1000); | ||
6477 | ufs_qcom_testbus_read(hba); | ||
6478 | - usleep_range(1000, 1100); | ||
6479 | + udelay(1000); | ||
6480 | ufs_qcom_print_unipro_testbus(hba); | ||
6481 | - usleep_range(1000, 1100); | ||
6482 | + udelay(1000); | ||
6483 | } | ||
6484 | |||
6485 | /** | ||
6486 | diff --git a/drivers/scsi/ufs/ufs_bsg.c b/drivers/scsi/ufs/ufs_bsg.c | ||
6487 | index d2197a31abe5..bad366e49159 100644 | ||
6488 | --- a/drivers/scsi/ufs/ufs_bsg.c | ||
6489 | +++ b/drivers/scsi/ufs/ufs_bsg.c | ||
6490 | @@ -106,8 +106,10 @@ static int ufs_bsg_request(struct bsg_job *job) | ||
6491 | desc_op = bsg_request->upiu_req.qr.opcode; | ||
6492 | ret = ufs_bsg_alloc_desc_buffer(hba, job, &desc_buff, | ||
6493 | &desc_len, desc_op); | ||
6494 | - if (ret) | ||
6495 | + if (ret) { | ||
6496 | + pm_runtime_put_sync(hba->dev); | ||
6497 | goto out; | ||
6498 | + } | ||
6499 | |||
6500 | /* fall through */ | ||
6501 | case UPIU_TRANSACTION_NOP_OUT: | ||
6502 | diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c | ||
6503 | index bc73181b0405..2b6853c7375c 100644 | ||
6504 | --- a/drivers/scsi/ufs/ufshcd.c | ||
6505 | +++ b/drivers/scsi/ufs/ufshcd.c | ||
6506 | @@ -5101,7 +5101,6 @@ static int ufshcd_bkops_ctrl(struct ufs_hba *hba, | ||
6507 | err = ufshcd_enable_auto_bkops(hba); | ||
6508 | else | ||
6509 | err = ufshcd_disable_auto_bkops(hba); | ||
6510 | - hba->urgent_bkops_lvl = curr_status; | ||
6511 | out: | ||
6512 | return err; | ||
6513 | } | ||
6514 | diff --git a/drivers/slimbus/qcom-ngd-ctrl.c b/drivers/slimbus/qcom-ngd-ctrl.c | ||
6515 | index 29fbab55c3b3..01a17d84b606 100644 | ||
6516 | --- a/drivers/slimbus/qcom-ngd-ctrl.c | ||
6517 | +++ b/drivers/slimbus/qcom-ngd-ctrl.c | ||
6518 | @@ -1354,7 +1354,6 @@ static int of_qcom_slim_ngd_register(struct device *parent, | ||
6519 | ngd->pdev->driver_override = QCOM_SLIM_NGD_DRV_NAME; | ||
6520 | ngd->pdev->dev.of_node = node; | ||
6521 | ctrl->ngd = ngd; | ||
6522 | - platform_set_drvdata(ngd->pdev, ctrl); | ||
6523 | |||
6524 | platform_device_add(ngd->pdev); | ||
6525 | ngd->base = ctrl->base + ngd->id * data->offset + | ||
6526 | @@ -1369,12 +1368,13 @@ static int of_qcom_slim_ngd_register(struct device *parent, | ||
6527 | |||
6528 | static int qcom_slim_ngd_probe(struct platform_device *pdev) | ||
6529 | { | ||
6530 | - struct qcom_slim_ngd_ctrl *ctrl = platform_get_drvdata(pdev); | ||
6531 | struct device *dev = &pdev->dev; | ||
6532 | + struct qcom_slim_ngd_ctrl *ctrl = dev_get_drvdata(dev->parent); | ||
6533 | int ret; | ||
6534 | |||
6535 | ctrl->ctrl.dev = dev; | ||
6536 | |||
6537 | + platform_set_drvdata(pdev, ctrl); | ||
6538 | pm_runtime_use_autosuspend(dev); | ||
6539 | pm_runtime_set_autosuspend_delay(dev, QCOM_SLIM_NGD_AUTOSUSPEND); | ||
6540 | pm_runtime_set_suspended(dev); | ||
6541 | diff --git a/drivers/soundwire/slave.c b/drivers/soundwire/slave.c | ||
6542 | index 6473fa602f82..611f4f5bc36a 100644 | ||
6543 | --- a/drivers/soundwire/slave.c | ||
6544 | +++ b/drivers/soundwire/slave.c | ||
6545 | @@ -57,6 +57,8 @@ static int sdw_slave_add(struct sdw_bus *bus, | ||
6546 | list_del(&slave->node); | ||
6547 | mutex_unlock(&bus->bus_lock); | ||
6548 | put_device(&slave->dev); | ||
6549 | + | ||
6550 | + return ret; | ||
6551 | } | ||
6552 | sdw_slave_debugfs_init(slave); | ||
6553 | |||
6554 | diff --git a/drivers/staging/gasket/gasket_sysfs.c b/drivers/staging/gasket/gasket_sysfs.c | ||
6555 | index 5f0e089573a2..af26bc9f184a 100644 | ||
6556 | --- a/drivers/staging/gasket/gasket_sysfs.c | ||
6557 | +++ b/drivers/staging/gasket/gasket_sysfs.c | ||
6558 | @@ -339,6 +339,7 @@ void gasket_sysfs_put_attr(struct device *device, | ||
6559 | |||
6560 | dev_err(device, "Unable to put unknown attribute: %s\n", | ||
6561 | attr->attr.attr.name); | ||
6562 | + put_mapping(mapping); | ||
6563 | } | ||
6564 | EXPORT_SYMBOL(gasket_sysfs_put_attr); | ||
6565 | |||
6566 | @@ -372,6 +373,7 @@ ssize_t gasket_sysfs_register_store(struct device *device, | ||
6567 | gasket_dev = mapping->gasket_dev; | ||
6568 | if (!gasket_dev) { | ||
6569 | dev_err(device, "Device driver may have been removed\n"); | ||
6570 | + put_mapping(mapping); | ||
6571 | return 0; | ||
6572 | } | ||
6573 | |||
6574 | diff --git a/drivers/staging/greybus/light.c b/drivers/staging/greybus/light.c | ||
6575 | index d6ba25f21d80..d2672b65c3f4 100644 | ||
6576 | --- a/drivers/staging/greybus/light.c | ||
6577 | +++ b/drivers/staging/greybus/light.c | ||
6578 | @@ -1026,7 +1026,8 @@ static int gb_lights_light_config(struct gb_lights *glights, u8 id) | ||
6579 | |||
6580 | light->channels_count = conf.channel_count; | ||
6581 | light->name = kstrndup(conf.name, NAMES_MAX, GFP_KERNEL); | ||
6582 | - | ||
6583 | + if (!light->name) | ||
6584 | + return -ENOMEM; | ||
6585 | light->channels = kcalloc(light->channels_count, | ||
6586 | sizeof(struct gb_channel), GFP_KERNEL); | ||
6587 | if (!light->channels) | ||
6588 | diff --git a/drivers/staging/sm750fb/sm750.c b/drivers/staging/sm750fb/sm750.c | ||
6589 | index 59568d18ce23..5b72aa81d94c 100644 | ||
6590 | --- a/drivers/staging/sm750fb/sm750.c | ||
6591 | +++ b/drivers/staging/sm750fb/sm750.c | ||
6592 | @@ -898,6 +898,7 @@ static int lynxfb_set_fbinfo(struct fb_info *info, int index) | ||
6593 | fix->visual = FB_VISUAL_PSEUDOCOLOR; | ||
6594 | break; | ||
6595 | case 16: | ||
6596 | + case 24: | ||
6597 | case 32: | ||
6598 | fix->visual = FB_VISUAL_TRUECOLOR; | ||
6599 | break; | ||
6600 | diff --git a/drivers/staging/wilc1000/wilc_hif.c b/drivers/staging/wilc1000/wilc_hif.c | ||
6601 | index 77d0732f451b..221e3d93db14 100644 | ||
6602 | --- a/drivers/staging/wilc1000/wilc_hif.c | ||
6603 | +++ b/drivers/staging/wilc1000/wilc_hif.c | ||
6604 | @@ -12,6 +12,8 @@ | ||
6605 | #define WILC_FALSE_FRMWR_CHANNEL 100 | ||
6606 | #define WILC_MAX_RATES_SUPPORTED 12 | ||
6607 | |||
6608 | +#define WILC_SCAN_WID_LIST_SIZE 6 | ||
6609 | + | ||
6610 | struct wilc_rcvd_mac_info { | ||
6611 | u8 status; | ||
6612 | }; | ||
6613 | @@ -233,7 +235,7 @@ int wilc_scan(struct wilc_vif *vif, u8 scan_source, u8 scan_type, | ||
6614 | void *user_arg, struct cfg80211_scan_request *request) | ||
6615 | { | ||
6616 | int result = 0; | ||
6617 | - struct wid wid_list[5]; | ||
6618 | + struct wid wid_list[WILC_SCAN_WID_LIST_SIZE]; | ||
6619 | u32 index = 0; | ||
6620 | u32 i, scan_timeout; | ||
6621 | u8 *buffer; | ||
6622 | diff --git a/drivers/target/loopback/tcm_loop.c b/drivers/target/loopback/tcm_loop.c | ||
6623 | index 3305b47fdf53..16d5a4e117a2 100644 | ||
6624 | --- a/drivers/target/loopback/tcm_loop.c | ||
6625 | +++ b/drivers/target/loopback/tcm_loop.c | ||
6626 | @@ -545,32 +545,15 @@ static int tcm_loop_write_pending(struct se_cmd *se_cmd) | ||
6627 | return 0; | ||
6628 | } | ||
6629 | |||
6630 | -static int tcm_loop_queue_data_in(struct se_cmd *se_cmd) | ||
6631 | +static int tcm_loop_queue_data_or_status(const char *func, | ||
6632 | + struct se_cmd *se_cmd, u8 scsi_status) | ||
6633 | { | ||
6634 | struct tcm_loop_cmd *tl_cmd = container_of(se_cmd, | ||
6635 | struct tcm_loop_cmd, tl_se_cmd); | ||
6636 | struct scsi_cmnd *sc = tl_cmd->sc; | ||
6637 | |||
6638 | pr_debug("%s() called for scsi_cmnd: %p cdb: 0x%02x\n", | ||
6639 | - __func__, sc, sc->cmnd[0]); | ||
6640 | - | ||
6641 | - sc->result = SAM_STAT_GOOD; | ||
6642 | - set_host_byte(sc, DID_OK); | ||
6643 | - if ((se_cmd->se_cmd_flags & SCF_OVERFLOW_BIT) || | ||
6644 | - (se_cmd->se_cmd_flags & SCF_UNDERFLOW_BIT)) | ||
6645 | - scsi_set_resid(sc, se_cmd->residual_count); | ||
6646 | - sc->scsi_done(sc); | ||
6647 | - return 0; | ||
6648 | -} | ||
6649 | - | ||
6650 | -static int tcm_loop_queue_status(struct se_cmd *se_cmd) | ||
6651 | -{ | ||
6652 | - struct tcm_loop_cmd *tl_cmd = container_of(se_cmd, | ||
6653 | - struct tcm_loop_cmd, tl_se_cmd); | ||
6654 | - struct scsi_cmnd *sc = tl_cmd->sc; | ||
6655 | - | ||
6656 | - pr_debug("%s() called for scsi_cmnd: %p cdb: 0x%02x\n", | ||
6657 | - __func__, sc, sc->cmnd[0]); | ||
6658 | + func, sc, sc->cmnd[0]); | ||
6659 | |||
6660 | if (se_cmd->sense_buffer && | ||
6661 | ((se_cmd->se_cmd_flags & SCF_TRANSPORT_TASK_SENSE) || | ||
6662 | @@ -581,7 +564,7 @@ static int tcm_loop_queue_status(struct se_cmd *se_cmd) | ||
6663 | sc->result = SAM_STAT_CHECK_CONDITION; | ||
6664 | set_driver_byte(sc, DRIVER_SENSE); | ||
6665 | } else | ||
6666 | - sc->result = se_cmd->scsi_status; | ||
6667 | + sc->result = scsi_status; | ||
6668 | |||
6669 | set_host_byte(sc, DID_OK); | ||
6670 | if ((se_cmd->se_cmd_flags & SCF_OVERFLOW_BIT) || | ||
6671 | @@ -591,6 +574,17 @@ static int tcm_loop_queue_status(struct se_cmd *se_cmd) | ||
6672 | return 0; | ||
6673 | } | ||
6674 | |||
6675 | +static int tcm_loop_queue_data_in(struct se_cmd *se_cmd) | ||
6676 | +{ | ||
6677 | + return tcm_loop_queue_data_or_status(__func__, se_cmd, SAM_STAT_GOOD); | ||
6678 | +} | ||
6679 | + | ||
6680 | +static int tcm_loop_queue_status(struct se_cmd *se_cmd) | ||
6681 | +{ | ||
6682 | + return tcm_loop_queue_data_or_status(__func__, | ||
6683 | + se_cmd, se_cmd->scsi_status); | ||
6684 | +} | ||
6685 | + | ||
6686 | static void tcm_loop_queue_tm_rsp(struct se_cmd *se_cmd) | ||
6687 | { | ||
6688 | struct tcm_loop_cmd *tl_cmd = container_of(se_cmd, | ||
6689 | diff --git a/drivers/target/target_core_user.c b/drivers/target/target_core_user.c | ||
6690 | index 9425354aef99..a497e7c1f4fc 100644 | ||
6691 | --- a/drivers/target/target_core_user.c | ||
6692 | +++ b/drivers/target/target_core_user.c | ||
6693 | @@ -882,41 +882,24 @@ static inline size_t tcmu_cmd_get_cmd_size(struct tcmu_cmd *tcmu_cmd, | ||
6694 | return command_size; | ||
6695 | } | ||
6696 | |||
6697 | -static int tcmu_setup_cmd_timer(struct tcmu_cmd *tcmu_cmd, unsigned int tmo, | ||
6698 | - struct timer_list *timer) | ||
6699 | +static void tcmu_setup_cmd_timer(struct tcmu_cmd *tcmu_cmd, unsigned int tmo, | ||
6700 | + struct timer_list *timer) | ||
6701 | { | ||
6702 | - struct tcmu_dev *udev = tcmu_cmd->tcmu_dev; | ||
6703 | - int cmd_id; | ||
6704 | - | ||
6705 | - if (tcmu_cmd->cmd_id) | ||
6706 | - goto setup_timer; | ||
6707 | - | ||
6708 | - cmd_id = idr_alloc(&udev->commands, tcmu_cmd, 1, USHRT_MAX, GFP_NOWAIT); | ||
6709 | - if (cmd_id < 0) { | ||
6710 | - pr_err("tcmu: Could not allocate cmd id.\n"); | ||
6711 | - return cmd_id; | ||
6712 | - } | ||
6713 | - tcmu_cmd->cmd_id = cmd_id; | ||
6714 | - | ||
6715 | - pr_debug("allocated cmd %u for dev %s tmo %lu\n", tcmu_cmd->cmd_id, | ||
6716 | - udev->name, tmo / MSEC_PER_SEC); | ||
6717 | - | ||
6718 | -setup_timer: | ||
6719 | if (!tmo) | ||
6720 | - return 0; | ||
6721 | + return; | ||
6722 | |||
6723 | tcmu_cmd->deadline = round_jiffies_up(jiffies + msecs_to_jiffies(tmo)); | ||
6724 | if (!timer_pending(timer)) | ||
6725 | mod_timer(timer, tcmu_cmd->deadline); | ||
6726 | |||
6727 | - return 0; | ||
6728 | + pr_debug("Timeout set up for cmd %p, dev = %s, tmo = %lu\n", tcmu_cmd, | ||
6729 | + tcmu_cmd->tcmu_dev->name, tmo / MSEC_PER_SEC); | ||
6730 | } | ||
6731 | |||
6732 | static int add_to_qfull_queue(struct tcmu_cmd *tcmu_cmd) | ||
6733 | { | ||
6734 | struct tcmu_dev *udev = tcmu_cmd->tcmu_dev; | ||
6735 | unsigned int tmo; | ||
6736 | - int ret; | ||
6737 | |||
6738 | /* | ||
6739 | * For backwards compat if qfull_time_out is not set use | ||
6740 | @@ -931,13 +914,11 @@ static int add_to_qfull_queue(struct tcmu_cmd *tcmu_cmd) | ||
6741 | else | ||
6742 | tmo = TCMU_TIME_OUT; | ||
6743 | |||
6744 | - ret = tcmu_setup_cmd_timer(tcmu_cmd, tmo, &udev->qfull_timer); | ||
6745 | - if (ret) | ||
6746 | - return ret; | ||
6747 | + tcmu_setup_cmd_timer(tcmu_cmd, tmo, &udev->qfull_timer); | ||
6748 | |||
6749 | list_add_tail(&tcmu_cmd->queue_entry, &udev->qfull_queue); | ||
6750 | - pr_debug("adding cmd %u on dev %s to ring space wait queue\n", | ||
6751 | - tcmu_cmd->cmd_id, udev->name); | ||
6752 | + pr_debug("adding cmd %p on dev %s to ring space wait queue\n", | ||
6753 | + tcmu_cmd, udev->name); | ||
6754 | return 0; | ||
6755 | } | ||
6756 | |||
6757 | @@ -959,7 +940,7 @@ static int queue_cmd_ring(struct tcmu_cmd *tcmu_cmd, sense_reason_t *scsi_err) | ||
6758 | struct tcmu_mailbox *mb; | ||
6759 | struct tcmu_cmd_entry *entry; | ||
6760 | struct iovec *iov; | ||
6761 | - int iov_cnt, ret; | ||
6762 | + int iov_cnt, cmd_id; | ||
6763 | uint32_t cmd_head; | ||
6764 | uint64_t cdb_off; | ||
6765 | bool copy_to_data_area; | ||
6766 | @@ -1060,14 +1041,21 @@ static int queue_cmd_ring(struct tcmu_cmd *tcmu_cmd, sense_reason_t *scsi_err) | ||
6767 | } | ||
6768 | entry->req.iov_bidi_cnt = iov_cnt; | ||
6769 | |||
6770 | - ret = tcmu_setup_cmd_timer(tcmu_cmd, udev->cmd_time_out, | ||
6771 | - &udev->cmd_timer); | ||
6772 | - if (ret) { | ||
6773 | - tcmu_cmd_free_data(tcmu_cmd, tcmu_cmd->dbi_cnt); | ||
6774 | + cmd_id = idr_alloc(&udev->commands, tcmu_cmd, 1, USHRT_MAX, GFP_NOWAIT); | ||
6775 | + if (cmd_id < 0) { | ||
6776 | + pr_err("tcmu: Could not allocate cmd id.\n"); | ||
6777 | |||
6778 | + tcmu_cmd_free_data(tcmu_cmd, tcmu_cmd->dbi_cnt); | ||
6779 | *scsi_err = TCM_OUT_OF_RESOURCES; | ||
6780 | return -1; | ||
6781 | } | ||
6782 | + tcmu_cmd->cmd_id = cmd_id; | ||
6783 | + | ||
6784 | + pr_debug("allocated cmd id %u for cmd %p dev %s\n", tcmu_cmd->cmd_id, | ||
6785 | + tcmu_cmd, udev->name); | ||
6786 | + | ||
6787 | + tcmu_setup_cmd_timer(tcmu_cmd, udev->cmd_time_out, &udev->cmd_timer); | ||
6788 | + | ||
6789 | entry->hdr.cmd_id = tcmu_cmd->cmd_id; | ||
6790 | |||
6791 | /* | ||
6792 | @@ -1279,50 +1267,39 @@ static unsigned int tcmu_handle_completions(struct tcmu_dev *udev) | ||
6793 | return handled; | ||
6794 | } | ||
6795 | |||
6796 | -static int tcmu_check_expired_cmd(int id, void *p, void *data) | ||
6797 | +static void tcmu_check_expired_ring_cmd(struct tcmu_cmd *cmd) | ||
6798 | { | ||
6799 | - struct tcmu_cmd *cmd = p; | ||
6800 | - struct tcmu_dev *udev = cmd->tcmu_dev; | ||
6801 | - u8 scsi_status; | ||
6802 | struct se_cmd *se_cmd; | ||
6803 | - bool is_running; | ||
6804 | - | ||
6805 | - if (test_bit(TCMU_CMD_BIT_EXPIRED, &cmd->flags)) | ||
6806 | - return 0; | ||
6807 | |||
6808 | if (!time_after(jiffies, cmd->deadline)) | ||
6809 | - return 0; | ||
6810 | + return; | ||
6811 | |||
6812 | - is_running = test_bit(TCMU_CMD_BIT_INFLIGHT, &cmd->flags); | ||
6813 | + set_bit(TCMU_CMD_BIT_EXPIRED, &cmd->flags); | ||
6814 | + list_del_init(&cmd->queue_entry); | ||
6815 | se_cmd = cmd->se_cmd; | ||
6816 | + cmd->se_cmd = NULL; | ||
6817 | |||
6818 | - if (is_running) { | ||
6819 | - /* | ||
6820 | - * If cmd_time_out is disabled but qfull is set deadline | ||
6821 | - * will only reflect the qfull timeout. Ignore it. | ||
6822 | - */ | ||
6823 | - if (!udev->cmd_time_out) | ||
6824 | - return 0; | ||
6825 | + pr_debug("Timing out inflight cmd %u on dev %s.\n", | ||
6826 | + cmd->cmd_id, cmd->tcmu_dev->name); | ||
6827 | |||
6828 | - set_bit(TCMU_CMD_BIT_EXPIRED, &cmd->flags); | ||
6829 | - /* | ||
6830 | - * target_complete_cmd will translate this to LUN COMM FAILURE | ||
6831 | - */ | ||
6832 | - scsi_status = SAM_STAT_CHECK_CONDITION; | ||
6833 | - list_del_init(&cmd->queue_entry); | ||
6834 | - cmd->se_cmd = NULL; | ||
6835 | - } else { | ||
6836 | - list_del_init(&cmd->queue_entry); | ||
6837 | - idr_remove(&udev->commands, id); | ||
6838 | - tcmu_free_cmd(cmd); | ||
6839 | - scsi_status = SAM_STAT_TASK_SET_FULL; | ||
6840 | - } | ||
6841 | + target_complete_cmd(se_cmd, SAM_STAT_CHECK_CONDITION); | ||
6842 | +} | ||
6843 | |||
6844 | - pr_debug("Timing out cmd %u on dev %s that is %s.\n", | ||
6845 | - id, udev->name, is_running ? "inflight" : "queued"); | ||
6846 | +static void tcmu_check_expired_queue_cmd(struct tcmu_cmd *cmd) | ||
6847 | +{ | ||
6848 | + struct se_cmd *se_cmd; | ||
6849 | |||
6850 | - target_complete_cmd(se_cmd, scsi_status); | ||
6851 | - return 0; | ||
6852 | + if (!time_after(jiffies, cmd->deadline)) | ||
6853 | + return; | ||
6854 | + | ||
6855 | + pr_debug("Timing out queued cmd %p on dev %s.\n", | ||
6856 | + cmd, cmd->tcmu_dev->name); | ||
6857 | + | ||
6858 | + list_del_init(&cmd->queue_entry); | ||
6859 | + se_cmd = cmd->se_cmd; | ||
6860 | + tcmu_free_cmd(cmd); | ||
6861 | + | ||
6862 | + target_complete_cmd(se_cmd, SAM_STAT_TASK_SET_FULL); | ||
6863 | } | ||
6864 | |||
6865 | static void tcmu_device_timedout(struct tcmu_dev *udev) | ||
6866 | @@ -1407,16 +1384,15 @@ static struct se_device *tcmu_alloc_device(struct se_hba *hba, const char *name) | ||
6867 | return &udev->se_dev; | ||
6868 | } | ||
6869 | |||
6870 | -static bool run_qfull_queue(struct tcmu_dev *udev, bool fail) | ||
6871 | +static void run_qfull_queue(struct tcmu_dev *udev, bool fail) | ||
6872 | { | ||
6873 | struct tcmu_cmd *tcmu_cmd, *tmp_cmd; | ||
6874 | LIST_HEAD(cmds); | ||
6875 | - bool drained = true; | ||
6876 | sense_reason_t scsi_ret; | ||
6877 | int ret; | ||
6878 | |||
6879 | if (list_empty(&udev->qfull_queue)) | ||
6880 | - return true; | ||
6881 | + return; | ||
6882 | |||
6883 | pr_debug("running %s's cmdr queue forcefail %d\n", udev->name, fail); | ||
6884 | |||
6885 | @@ -1425,11 +1401,10 @@ static bool run_qfull_queue(struct tcmu_dev *udev, bool fail) | ||
6886 | list_for_each_entry_safe(tcmu_cmd, tmp_cmd, &cmds, queue_entry) { | ||
6887 | list_del_init(&tcmu_cmd->queue_entry); | ||
6888 | |||
6889 | - pr_debug("removing cmd %u on dev %s from queue\n", | ||
6890 | - tcmu_cmd->cmd_id, udev->name); | ||
6891 | + pr_debug("removing cmd %p on dev %s from queue\n", | ||
6892 | + tcmu_cmd, udev->name); | ||
6893 | |||
6894 | if (fail) { | ||
6895 | - idr_remove(&udev->commands, tcmu_cmd->cmd_id); | ||
6896 | /* | ||
6897 | * We were not able to even start the command, so | ||
6898 | * fail with busy to allow a retry in case runner | ||
6899 | @@ -1444,10 +1419,8 @@ static bool run_qfull_queue(struct tcmu_dev *udev, bool fail) | ||
6900 | |||
6901 | ret = queue_cmd_ring(tcmu_cmd, &scsi_ret); | ||
6902 | if (ret < 0) { | ||
6903 | - pr_debug("cmd %u on dev %s failed with %u\n", | ||
6904 | - tcmu_cmd->cmd_id, udev->name, scsi_ret); | ||
6905 | - | ||
6906 | - idr_remove(&udev->commands, tcmu_cmd->cmd_id); | ||
6907 | + pr_debug("cmd %p on dev %s failed with %u\n", | ||
6908 | + tcmu_cmd, udev->name, scsi_ret); | ||
6909 | /* | ||
6910 | * Ignore scsi_ret for now. target_complete_cmd | ||
6911 | * drops it. | ||
6912 | @@ -1462,13 +1435,11 @@ static bool run_qfull_queue(struct tcmu_dev *udev, bool fail) | ||
6913 | * the queue | ||
6914 | */ | ||
6915 | list_splice_tail(&cmds, &udev->qfull_queue); | ||
6916 | - drained = false; | ||
6917 | break; | ||
6918 | } | ||
6919 | } | ||
6920 | |||
6921 | tcmu_set_next_deadline(&udev->qfull_queue, &udev->qfull_timer); | ||
6922 | - return drained; | ||
6923 | } | ||
6924 | |||
6925 | static int tcmu_irqcontrol(struct uio_info *info, s32 irq_on) | ||
6926 | @@ -1652,6 +1623,8 @@ static void tcmu_dev_kref_release(struct kref *kref) | ||
6927 | if (tcmu_check_and_free_pending_cmd(cmd) != 0) | ||
6928 | all_expired = false; | ||
6929 | } | ||
6930 | + if (!list_empty(&udev->qfull_queue)) | ||
6931 | + all_expired = false; | ||
6932 | idr_destroy(&udev->commands); | ||
6933 | WARN_ON(!all_expired); | ||
6934 | |||
6935 | @@ -2037,9 +2010,6 @@ static void tcmu_reset_ring(struct tcmu_dev *udev, u8 err_level) | ||
6936 | mutex_lock(&udev->cmdr_lock); | ||
6937 | |||
6938 | idr_for_each_entry(&udev->commands, cmd, i) { | ||
6939 | - if (!test_bit(TCMU_CMD_BIT_INFLIGHT, &cmd->flags)) | ||
6940 | - continue; | ||
6941 | - | ||
6942 | pr_debug("removing cmd %u on dev %s from ring (is expired %d)\n", | ||
6943 | cmd->cmd_id, udev->name, | ||
6944 | test_bit(TCMU_CMD_BIT_EXPIRED, &cmd->flags)); | ||
6945 | @@ -2077,6 +2047,8 @@ static void tcmu_reset_ring(struct tcmu_dev *udev, u8 err_level) | ||
6946 | |||
6947 | del_timer(&udev->cmd_timer); | ||
6948 | |||
6949 | + run_qfull_queue(udev, false); | ||
6950 | + | ||
6951 | mutex_unlock(&udev->cmdr_lock); | ||
6952 | } | ||
6953 | |||
6954 | @@ -2698,6 +2670,7 @@ static void find_free_blocks(void) | ||
6955 | static void check_timedout_devices(void) | ||
6956 | { | ||
6957 | struct tcmu_dev *udev, *tmp_dev; | ||
6958 | + struct tcmu_cmd *cmd, *tmp_cmd; | ||
6959 | LIST_HEAD(devs); | ||
6960 | |||
6961 | spin_lock_bh(&timed_out_udevs_lock); | ||
6962 | @@ -2708,9 +2681,24 @@ static void check_timedout_devices(void) | ||
6963 | spin_unlock_bh(&timed_out_udevs_lock); | ||
6964 | |||
6965 | mutex_lock(&udev->cmdr_lock); | ||
6966 | - idr_for_each(&udev->commands, tcmu_check_expired_cmd, NULL); | ||
6967 | |||
6968 | - tcmu_set_next_deadline(&udev->inflight_queue, &udev->cmd_timer); | ||
6969 | + /* | ||
6970 | + * If cmd_time_out is disabled but qfull is set deadline | ||
6971 | + * will only reflect the qfull timeout. Ignore it. | ||
6972 | + */ | ||
6973 | + if (udev->cmd_time_out) { | ||
6974 | + list_for_each_entry_safe(cmd, tmp_cmd, | ||
6975 | + &udev->inflight_queue, | ||
6976 | + queue_entry) { | ||
6977 | + tcmu_check_expired_ring_cmd(cmd); | ||
6978 | + } | ||
6979 | + tcmu_set_next_deadline(&udev->inflight_queue, | ||
6980 | + &udev->cmd_timer); | ||
6981 | + } | ||
6982 | + list_for_each_entry_safe(cmd, tmp_cmd, &udev->qfull_queue, | ||
6983 | + queue_entry) { | ||
6984 | + tcmu_check_expired_queue_cmd(cmd); | ||
6985 | + } | ||
6986 | tcmu_set_next_deadline(&udev->qfull_queue, &udev->qfull_timer); | ||
6987 | |||
6988 | mutex_unlock(&udev->cmdr_lock); | ||
6989 | diff --git a/drivers/thermal/ti-soc-thermal/ti-thermal-common.c b/drivers/thermal/ti-soc-thermal/ti-thermal-common.c | ||
6990 | index d3e959d01606..85776db4bf34 100644 | ||
6991 | --- a/drivers/thermal/ti-soc-thermal/ti-thermal-common.c | ||
6992 | +++ b/drivers/thermal/ti-soc-thermal/ti-thermal-common.c | ||
6993 | @@ -169,7 +169,7 @@ int ti_thermal_expose_sensor(struct ti_bandgap *bgp, int id, | ||
6994 | |||
6995 | data = ti_bandgap_get_sensor_data(bgp, id); | ||
6996 | |||
6997 | - if (!data || IS_ERR(data)) | ||
6998 | + if (!IS_ERR_OR_NULL(data)) | ||
6999 | data = ti_thermal_build_data(bgp, id); | ||
7000 | |||
7001 | if (!data) | ||
7002 | @@ -196,7 +196,7 @@ int ti_thermal_remove_sensor(struct ti_bandgap *bgp, int id) | ||
7003 | |||
7004 | data = ti_bandgap_get_sensor_data(bgp, id); | ||
7005 | |||
7006 | - if (data && data->ti_thermal) { | ||
7007 | + if (!IS_ERR_OR_NULL(data) && data->ti_thermal) { | ||
7008 | if (data->our_zone) | ||
7009 | thermal_zone_device_unregister(data->ti_thermal); | ||
7010 | } | ||
7011 | @@ -262,7 +262,7 @@ int ti_thermal_unregister_cpu_cooling(struct ti_bandgap *bgp, int id) | ||
7012 | |||
7013 | data = ti_bandgap_get_sensor_data(bgp, id); | ||
7014 | |||
7015 | - if (data) { | ||
7016 | + if (!IS_ERR_OR_NULL(data)) { | ||
7017 | cpufreq_cooling_unregister(data->cool_dev); | ||
7018 | if (data->policy) | ||
7019 | cpufreq_cpu_put(data->policy); | ||
7020 | diff --git a/drivers/tty/hvc/hvc_console.c b/drivers/tty/hvc/hvc_console.c | ||
7021 | index cdcc64ea2554..f8e43a6faea9 100644 | ||
7022 | --- a/drivers/tty/hvc/hvc_console.c | ||
7023 | +++ b/drivers/tty/hvc/hvc_console.c | ||
7024 | @@ -75,6 +75,8 @@ static LIST_HEAD(hvc_structs); | ||
7025 | */ | ||
7026 | static DEFINE_MUTEX(hvc_structs_mutex); | ||
7027 | |||
7028 | +/* Mutex to serialize hvc_open */ | ||
7029 | +static DEFINE_MUTEX(hvc_open_mutex); | ||
7030 | /* | ||
7031 | * This value is used to assign a tty->index value to a hvc_struct based | ||
7032 | * upon order of exposure via hvc_probe(), when we can not match it to | ||
7033 | @@ -346,16 +348,24 @@ static int hvc_install(struct tty_driver *driver, struct tty_struct *tty) | ||
7034 | */ | ||
7035 | static int hvc_open(struct tty_struct *tty, struct file * filp) | ||
7036 | { | ||
7037 | - struct hvc_struct *hp = tty->driver_data; | ||
7038 | + struct hvc_struct *hp; | ||
7039 | unsigned long flags; | ||
7040 | int rc = 0; | ||
7041 | |||
7042 | + mutex_lock(&hvc_open_mutex); | ||
7043 | + | ||
7044 | + hp = tty->driver_data; | ||
7045 | + if (!hp) { | ||
7046 | + rc = -EIO; | ||
7047 | + goto out; | ||
7048 | + } | ||
7049 | + | ||
7050 | spin_lock_irqsave(&hp->port.lock, flags); | ||
7051 | /* Check and then increment for fast path open. */ | ||
7052 | if (hp->port.count++ > 0) { | ||
7053 | spin_unlock_irqrestore(&hp->port.lock, flags); | ||
7054 | hvc_kick(); | ||
7055 | - return 0; | ||
7056 | + goto out; | ||
7057 | } /* else count == 0 */ | ||
7058 | spin_unlock_irqrestore(&hp->port.lock, flags); | ||
7059 | |||
7060 | @@ -383,6 +393,8 @@ static int hvc_open(struct tty_struct *tty, struct file * filp) | ||
7061 | /* Force wakeup of the polling thread */ | ||
7062 | hvc_kick(); | ||
7063 | |||
7064 | +out: | ||
7065 | + mutex_unlock(&hvc_open_mutex); | ||
7066 | return rc; | ||
7067 | } | ||
7068 | |||
7069 | diff --git a/drivers/tty/n_gsm.c b/drivers/tty/n_gsm.c | ||
7070 | index 36a3eb4ad4c5..75408b9f232d 100644 | ||
7071 | --- a/drivers/tty/n_gsm.c | ||
7072 | +++ b/drivers/tty/n_gsm.c | ||
7073 | @@ -665,11 +665,10 @@ static struct gsm_msg *gsm_data_alloc(struct gsm_mux *gsm, u8 addr, int len, | ||
7074 | * FIXME: lock against link layer control transmissions | ||
7075 | */ | ||
7076 | |||
7077 | -static void gsm_data_kick(struct gsm_mux *gsm) | ||
7078 | +static void gsm_data_kick(struct gsm_mux *gsm, struct gsm_dlci *dlci) | ||
7079 | { | ||
7080 | struct gsm_msg *msg, *nmsg; | ||
7081 | int len; | ||
7082 | - int skip_sof = 0; | ||
7083 | |||
7084 | list_for_each_entry_safe(msg, nmsg, &gsm->tx_list, list) { | ||
7085 | if (gsm->constipated && msg->addr) | ||
7086 | @@ -691,18 +690,23 @@ static void gsm_data_kick(struct gsm_mux *gsm) | ||
7087 | print_hex_dump_bytes("gsm_data_kick: ", | ||
7088 | DUMP_PREFIX_OFFSET, | ||
7089 | gsm->txframe, len); | ||
7090 | - | ||
7091 | - if (gsm->output(gsm, gsm->txframe + skip_sof, | ||
7092 | - len - skip_sof) < 0) | ||
7093 | + if (gsm->output(gsm, gsm->txframe, len) < 0) | ||
7094 | break; | ||
7095 | /* FIXME: Can eliminate one SOF in many more cases */ | ||
7096 | gsm->tx_bytes -= msg->len; | ||
7097 | - /* For a burst of frames skip the extra SOF within the | ||
7098 | - burst */ | ||
7099 | - skip_sof = 1; | ||
7100 | |||
7101 | list_del(&msg->list); | ||
7102 | kfree(msg); | ||
7103 | + | ||
7104 | + if (dlci) { | ||
7105 | + tty_port_tty_wakeup(&dlci->port); | ||
7106 | + } else { | ||
7107 | + int i = 0; | ||
7108 | + | ||
7109 | + for (i = 0; i < NUM_DLCI; i++) | ||
7110 | + if (gsm->dlci[i]) | ||
7111 | + tty_port_tty_wakeup(&gsm->dlci[i]->port); | ||
7112 | + } | ||
7113 | } | ||
7114 | } | ||
7115 | |||
7116 | @@ -754,7 +758,7 @@ static void __gsm_data_queue(struct gsm_dlci *dlci, struct gsm_msg *msg) | ||
7117 | /* Add to the actual output queue */ | ||
7118 | list_add_tail(&msg->list, &gsm->tx_list); | ||
7119 | gsm->tx_bytes += msg->len; | ||
7120 | - gsm_data_kick(gsm); | ||
7121 | + gsm_data_kick(gsm, dlci); | ||
7122 | } | ||
7123 | |||
7124 | /** | ||
7125 | @@ -1215,7 +1219,7 @@ static void gsm_control_message(struct gsm_mux *gsm, unsigned int command, | ||
7126 | gsm_control_reply(gsm, CMD_FCON, NULL, 0); | ||
7127 | /* Kick the link in case it is idling */ | ||
7128 | spin_lock_irqsave(&gsm->tx_lock, flags); | ||
7129 | - gsm_data_kick(gsm); | ||
7130 | + gsm_data_kick(gsm, NULL); | ||
7131 | spin_unlock_irqrestore(&gsm->tx_lock, flags); | ||
7132 | break; | ||
7133 | case CMD_FCOFF: | ||
7134 | @@ -2525,7 +2529,7 @@ static void gsmld_write_wakeup(struct tty_struct *tty) | ||
7135 | /* Queue poll */ | ||
7136 | clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags); | ||
7137 | spin_lock_irqsave(&gsm->tx_lock, flags); | ||
7138 | - gsm_data_kick(gsm); | ||
7139 | + gsm_data_kick(gsm, NULL); | ||
7140 | if (gsm->tx_bytes < TX_THRESH_LO) { | ||
7141 | gsm_dlci_data_sweep(gsm); | ||
7142 | } | ||
7143 | diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c | ||
7144 | index 2c65c775bf5a..dbb27303a6b4 100644 | ||
7145 | --- a/drivers/tty/serial/8250/8250_port.c | ||
7146 | +++ b/drivers/tty/serial/8250/8250_port.c | ||
7147 | @@ -2539,6 +2539,8 @@ static unsigned int serial8250_get_baud_rate(struct uart_port *port, | ||
7148 | struct ktermios *termios, | ||
7149 | struct ktermios *old) | ||
7150 | { | ||
7151 | + unsigned int tolerance = port->uartclk / 100; | ||
7152 | + | ||
7153 | /* | ||
7154 | * Ask the core to calculate the divisor for us. | ||
7155 | * Allow 1% tolerance at the upper limit so uart clks marginally | ||
7156 | @@ -2547,7 +2549,7 @@ static unsigned int serial8250_get_baud_rate(struct uart_port *port, | ||
7157 | */ | ||
7158 | return uart_get_baud_rate(port, termios, old, | ||
7159 | port->uartclk / 16 / UART_DIV_MAX, | ||
7160 | - port->uartclk); | ||
7161 | + (port->uartclk + tolerance) / 16); | ||
7162 | } | ||
7163 | |||
7164 | void | ||
7165 | diff --git a/drivers/tty/serial/amba-pl011.c b/drivers/tty/serial/amba-pl011.c | ||
7166 | index b0b689546395..de3e8c24c03e 100644 | ||
7167 | --- a/drivers/tty/serial/amba-pl011.c | ||
7168 | +++ b/drivers/tty/serial/amba-pl011.c | ||
7169 | @@ -2585,6 +2585,7 @@ static int pl011_setup_port(struct device *dev, struct uart_amba_port *uap, | ||
7170 | uap->port.fifosize = uap->fifosize; | ||
7171 | uap->port.flags = UPF_BOOT_AUTOCONF; | ||
7172 | uap->port.line = index; | ||
7173 | + spin_lock_init(&uap->port.lock); | ||
7174 | |||
7175 | amba_ports[index] = uap; | ||
7176 | |||
7177 | diff --git a/drivers/usb/class/usblp.c b/drivers/usb/class/usblp.c | ||
7178 | index 0d8e3f3804a3..084c48c5848f 100644 | ||
7179 | --- a/drivers/usb/class/usblp.c | ||
7180 | +++ b/drivers/usb/class/usblp.c | ||
7181 | @@ -468,7 +468,8 @@ static int usblp_release(struct inode *inode, struct file *file) | ||
7182 | usb_autopm_put_interface(usblp->intf); | ||
7183 | |||
7184 | if (!usblp->present) /* finish cleanup from disconnect */ | ||
7185 | - usblp_cleanup(usblp); | ||
7186 | + usblp_cleanup(usblp); /* any URBs must be dead */ | ||
7187 | + | ||
7188 | mutex_unlock(&usblp_mutex); | ||
7189 | return 0; | ||
7190 | } | ||
7191 | @@ -1375,9 +1376,11 @@ static void usblp_disconnect(struct usb_interface *intf) | ||
7192 | |||
7193 | usblp_unlink_urbs(usblp); | ||
7194 | mutex_unlock(&usblp->mut); | ||
7195 | + usb_poison_anchored_urbs(&usblp->urbs); | ||
7196 | |||
7197 | if (!usblp->used) | ||
7198 | usblp_cleanup(usblp); | ||
7199 | + | ||
7200 | mutex_unlock(&usblp_mutex); | ||
7201 | } | ||
7202 | |||
7203 | diff --git a/drivers/usb/dwc2/core_intr.c b/drivers/usb/dwc2/core_intr.c | ||
7204 | index 6af6add3d4c0..6272b4ae4740 100644 | ||
7205 | --- a/drivers/usb/dwc2/core_intr.c | ||
7206 | +++ b/drivers/usb/dwc2/core_intr.c | ||
7207 | @@ -421,10 +421,13 @@ static void dwc2_handle_wakeup_detected_intr(struct dwc2_hsotg *hsotg) | ||
7208 | if (ret && (ret != -ENOTSUPP)) | ||
7209 | dev_err(hsotg->dev, "exit power_down failed\n"); | ||
7210 | |||
7211 | + /* Change to L0 state */ | ||
7212 | + hsotg->lx_state = DWC2_L0; | ||
7213 | call_gadget(hsotg, resume); | ||
7214 | + } else { | ||
7215 | + /* Change to L0 state */ | ||
7216 | + hsotg->lx_state = DWC2_L0; | ||
7217 | } | ||
7218 | - /* Change to L0 state */ | ||
7219 | - hsotg->lx_state = DWC2_L0; | ||
7220 | } else { | ||
7221 | if (hsotg->params.power_down) | ||
7222 | return; | ||
7223 | diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c | ||
7224 | index c30c5b1c478c..17340864a540 100644 | ||
7225 | --- a/drivers/usb/dwc3/gadget.c | ||
7226 | +++ b/drivers/usb/dwc3/gadget.c | ||
7227 | @@ -1217,6 +1217,8 @@ static void dwc3_prepare_trbs(struct dwc3_ep *dep) | ||
7228 | } | ||
7229 | } | ||
7230 | |||
7231 | +static void dwc3_gadget_ep_cleanup_cancelled_requests(struct dwc3_ep *dep); | ||
7232 | + | ||
7233 | static int __dwc3_gadget_kick_transfer(struct dwc3_ep *dep) | ||
7234 | { | ||
7235 | struct dwc3_gadget_ep_cmd_params params; | ||
7236 | @@ -1256,14 +1258,20 @@ static int __dwc3_gadget_kick_transfer(struct dwc3_ep *dep) | ||
7237 | |||
7238 | ret = dwc3_send_gadget_ep_cmd(dep, cmd, ¶ms); | ||
7239 | if (ret < 0) { | ||
7240 | - /* | ||
7241 | - * FIXME we need to iterate over the list of requests | ||
7242 | - * here and stop, unmap, free and del each of the linked | ||
7243 | - * requests instead of what we do now. | ||
7244 | - */ | ||
7245 | - if (req->trb) | ||
7246 | - memset(req->trb, 0, sizeof(struct dwc3_trb)); | ||
7247 | - dwc3_gadget_del_and_unmap_request(dep, req, ret); | ||
7248 | + struct dwc3_request *tmp; | ||
7249 | + | ||
7250 | + if (ret == -EAGAIN) | ||
7251 | + return ret; | ||
7252 | + | ||
7253 | + dwc3_stop_active_transfer(dep, true, true); | ||
7254 | + | ||
7255 | + list_for_each_entry_safe(req, tmp, &dep->started_list, list) | ||
7256 | + dwc3_gadget_move_cancelled_request(req); | ||
7257 | + | ||
7258 | + /* If ep isn't started, then there's no end transfer pending */ | ||
7259 | + if (!(dep->flags & DWC3_EP_END_TRANSFER_PENDING)) | ||
7260 | + dwc3_gadget_ep_cleanup_cancelled_requests(dep); | ||
7261 | + | ||
7262 | return ret; | ||
7263 | } | ||
7264 | |||
7265 | @@ -1505,6 +1513,10 @@ static void dwc3_gadget_ep_skip_trbs(struct dwc3_ep *dep, struct dwc3_request *r | ||
7266 | { | ||
7267 | int i; | ||
7268 | |||
7269 | + /* If req->trb is not set, then the request has not started */ | ||
7270 | + if (!req->trb) | ||
7271 | + return; | ||
7272 | + | ||
7273 | /* | ||
7274 | * If request was already started, this means we had to | ||
7275 | * stop the transfer. With that we also need to ignore | ||
7276 | @@ -1595,6 +1607,8 @@ int __dwc3_gadget_ep_set_halt(struct dwc3_ep *dep, int value, int protocol) | ||
7277 | { | ||
7278 | struct dwc3_gadget_ep_cmd_params params; | ||
7279 | struct dwc3 *dwc = dep->dwc; | ||
7280 | + struct dwc3_request *req; | ||
7281 | + struct dwc3_request *tmp; | ||
7282 | int ret; | ||
7283 | |||
7284 | if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) { | ||
7285 | @@ -1631,13 +1645,37 @@ int __dwc3_gadget_ep_set_halt(struct dwc3_ep *dep, int value, int protocol) | ||
7286 | else | ||
7287 | dep->flags |= DWC3_EP_STALL; | ||
7288 | } else { | ||
7289 | + /* | ||
7290 | + * Don't issue CLEAR_STALL command to control endpoints. The | ||
7291 | + * controller automatically clears the STALL when it receives | ||
7292 | + * the SETUP token. | ||
7293 | + */ | ||
7294 | + if (dep->number <= 1) { | ||
7295 | + dep->flags &= ~(DWC3_EP_STALL | DWC3_EP_WEDGE); | ||
7296 | + return 0; | ||
7297 | + } | ||
7298 | |||
7299 | ret = dwc3_send_clear_stall_ep_cmd(dep); | ||
7300 | - if (ret) | ||
7301 | + if (ret) { | ||
7302 | dev_err(dwc->dev, "failed to clear STALL on %s\n", | ||
7303 | dep->name); | ||
7304 | - else | ||
7305 | - dep->flags &= ~(DWC3_EP_STALL | DWC3_EP_WEDGE); | ||
7306 | + return ret; | ||
7307 | + } | ||
7308 | + | ||
7309 | + dep->flags &= ~(DWC3_EP_STALL | DWC3_EP_WEDGE); | ||
7310 | + | ||
7311 | + dwc3_stop_active_transfer(dep, true, true); | ||
7312 | + | ||
7313 | + list_for_each_entry_safe(req, tmp, &dep->started_list, list) | ||
7314 | + dwc3_gadget_move_cancelled_request(req); | ||
7315 | + | ||
7316 | + list_for_each_entry_safe(req, tmp, &dep->pending_list, list) | ||
7317 | + dwc3_gadget_move_cancelled_request(req); | ||
7318 | + | ||
7319 | + if (!(dep->flags & DWC3_EP_END_TRANSFER_PENDING)) { | ||
7320 | + dep->flags &= ~DWC3_EP_DELAY_START; | ||
7321 | + dwc3_gadget_ep_cleanup_cancelled_requests(dep); | ||
7322 | + } | ||
7323 | } | ||
7324 | |||
7325 | return ret; | ||
7326 | diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c | ||
7327 | index d98ca1566e95..f75ff1a75dc4 100644 | ||
7328 | --- a/drivers/usb/gadget/composite.c | ||
7329 | +++ b/drivers/usb/gadget/composite.c | ||
7330 | @@ -96,40 +96,43 @@ function_descriptors(struct usb_function *f, | ||
7331 | } | ||
7332 | |||
7333 | /** | ||
7334 | - * next_ep_desc() - advance to the next EP descriptor | ||
7335 | + * next_desc() - advance to the next desc_type descriptor | ||
7336 | * @t: currect pointer within descriptor array | ||
7337 | + * @desc_type: descriptor type | ||
7338 | * | ||
7339 | - * Return: next EP descriptor or NULL | ||
7340 | + * Return: next desc_type descriptor or NULL | ||
7341 | * | ||
7342 | - * Iterate over @t until either EP descriptor found or | ||
7343 | + * Iterate over @t until either desc_type descriptor found or | ||
7344 | * NULL (that indicates end of list) encountered | ||
7345 | */ | ||
7346 | static struct usb_descriptor_header** | ||
7347 | -next_ep_desc(struct usb_descriptor_header **t) | ||
7348 | +next_desc(struct usb_descriptor_header **t, u8 desc_type) | ||
7349 | { | ||
7350 | for (; *t; t++) { | ||
7351 | - if ((*t)->bDescriptorType == USB_DT_ENDPOINT) | ||
7352 | + if ((*t)->bDescriptorType == desc_type) | ||
7353 | return t; | ||
7354 | } | ||
7355 | return NULL; | ||
7356 | } | ||
7357 | |||
7358 | /* | ||
7359 | - * for_each_ep_desc()- iterate over endpoint descriptors in the | ||
7360 | - * descriptors list | ||
7361 | - * @start: pointer within descriptor array. | ||
7362 | - * @ep_desc: endpoint descriptor to use as the loop cursor | ||
7363 | + * for_each_desc() - iterate over desc_type descriptors in the | ||
7364 | + * descriptors list | ||
7365 | + * @start: pointer within descriptor array. | ||
7366 | + * @iter_desc: desc_type descriptor to use as the loop cursor | ||
7367 | + * @desc_type: wanted descriptr type | ||
7368 | */ | ||
7369 | -#define for_each_ep_desc(start, ep_desc) \ | ||
7370 | - for (ep_desc = next_ep_desc(start); \ | ||
7371 | - ep_desc; ep_desc = next_ep_desc(ep_desc+1)) | ||
7372 | +#define for_each_desc(start, iter_desc, desc_type) \ | ||
7373 | + for (iter_desc = next_desc(start, desc_type); \ | ||
7374 | + iter_desc; iter_desc = next_desc(iter_desc + 1, desc_type)) | ||
7375 | |||
7376 | /** | ||
7377 | - * config_ep_by_speed() - configures the given endpoint | ||
7378 | + * config_ep_by_speed_and_alt() - configures the given endpoint | ||
7379 | * according to gadget speed. | ||
7380 | * @g: pointer to the gadget | ||
7381 | * @f: usb function | ||
7382 | * @_ep: the endpoint to configure | ||
7383 | + * @alt: alternate setting number | ||
7384 | * | ||
7385 | * Return: error code, 0 on success | ||
7386 | * | ||
7387 | @@ -142,11 +145,13 @@ next_ep_desc(struct usb_descriptor_header **t) | ||
7388 | * Note: the supplied function should hold all the descriptors | ||
7389 | * for supported speeds | ||
7390 | */ | ||
7391 | -int config_ep_by_speed(struct usb_gadget *g, | ||
7392 | - struct usb_function *f, | ||
7393 | - struct usb_ep *_ep) | ||
7394 | +int config_ep_by_speed_and_alt(struct usb_gadget *g, | ||
7395 | + struct usb_function *f, | ||
7396 | + struct usb_ep *_ep, | ||
7397 | + u8 alt) | ||
7398 | { | ||
7399 | struct usb_endpoint_descriptor *chosen_desc = NULL; | ||
7400 | + struct usb_interface_descriptor *int_desc = NULL; | ||
7401 | struct usb_descriptor_header **speed_desc = NULL; | ||
7402 | |||
7403 | struct usb_ss_ep_comp_descriptor *comp_desc = NULL; | ||
7404 | @@ -182,8 +187,21 @@ int config_ep_by_speed(struct usb_gadget *g, | ||
7405 | default: | ||
7406 | speed_desc = f->fs_descriptors; | ||
7407 | } | ||
7408 | + | ||
7409 | + /* find correct alternate setting descriptor */ | ||
7410 | + for_each_desc(speed_desc, d_spd, USB_DT_INTERFACE) { | ||
7411 | + int_desc = (struct usb_interface_descriptor *)*d_spd; | ||
7412 | + | ||
7413 | + if (int_desc->bAlternateSetting == alt) { | ||
7414 | + speed_desc = d_spd; | ||
7415 | + goto intf_found; | ||
7416 | + } | ||
7417 | + } | ||
7418 | + return -EIO; | ||
7419 | + | ||
7420 | +intf_found: | ||
7421 | /* find descriptors */ | ||
7422 | - for_each_ep_desc(speed_desc, d_spd) { | ||
7423 | + for_each_desc(speed_desc, d_spd, USB_DT_ENDPOINT) { | ||
7424 | chosen_desc = (struct usb_endpoint_descriptor *)*d_spd; | ||
7425 | if (chosen_desc->bEndpointAddress == _ep->address) | ||
7426 | goto ep_found; | ||
7427 | @@ -237,6 +255,32 @@ ep_found: | ||
7428 | } | ||
7429 | return 0; | ||
7430 | } | ||
7431 | +EXPORT_SYMBOL_GPL(config_ep_by_speed_and_alt); | ||
7432 | + | ||
7433 | +/** | ||
7434 | + * config_ep_by_speed() - configures the given endpoint | ||
7435 | + * according to gadget speed. | ||
7436 | + * @g: pointer to the gadget | ||
7437 | + * @f: usb function | ||
7438 | + * @_ep: the endpoint to configure | ||
7439 | + * | ||
7440 | + * Return: error code, 0 on success | ||
7441 | + * | ||
7442 | + * This function chooses the right descriptors for a given | ||
7443 | + * endpoint according to gadget speed and saves it in the | ||
7444 | + * endpoint desc field. If the endpoint already has a descriptor | ||
7445 | + * assigned to it - overwrites it with currently corresponding | ||
7446 | + * descriptor. The endpoint maxpacket field is updated according | ||
7447 | + * to the chosen descriptor. | ||
7448 | + * Note: the supplied function should hold all the descriptors | ||
7449 | + * for supported speeds | ||
7450 | + */ | ||
7451 | +int config_ep_by_speed(struct usb_gadget *g, | ||
7452 | + struct usb_function *f, | ||
7453 | + struct usb_ep *_ep) | ||
7454 | +{ | ||
7455 | + return config_ep_by_speed_and_alt(g, f, _ep, 0); | ||
7456 | +} | ||
7457 | EXPORT_SYMBOL_GPL(config_ep_by_speed); | ||
7458 | |||
7459 | /** | ||
7460 | diff --git a/drivers/usb/gadget/udc/core.c b/drivers/usb/gadget/udc/core.c | ||
7461 | index 51fa614b4079..0e7820158aaa 100644 | ||
7462 | --- a/drivers/usb/gadget/udc/core.c | ||
7463 | +++ b/drivers/usb/gadget/udc/core.c | ||
7464 | @@ -1297,6 +1297,8 @@ static void usb_gadget_remove_driver(struct usb_udc *udc) | ||
7465 | kobject_uevent(&udc->dev.kobj, KOBJ_CHANGE); | ||
7466 | |||
7467 | usb_gadget_disconnect(udc->gadget); | ||
7468 | + if (udc->gadget->irq) | ||
7469 | + synchronize_irq(udc->gadget->irq); | ||
7470 | udc->driver->unbind(udc->gadget); | ||
7471 | usb_gadget_udc_stop(udc); | ||
7472 | |||
7473 | diff --git a/drivers/usb/gadget/udc/lpc32xx_udc.c b/drivers/usb/gadget/udc/lpc32xx_udc.c | ||
7474 | index bf6c81e2f8cc..6d2f1f98f13d 100644 | ||
7475 | --- a/drivers/usb/gadget/udc/lpc32xx_udc.c | ||
7476 | +++ b/drivers/usb/gadget/udc/lpc32xx_udc.c | ||
7477 | @@ -1614,17 +1614,17 @@ static int lpc32xx_ep_enable(struct usb_ep *_ep, | ||
7478 | const struct usb_endpoint_descriptor *desc) | ||
7479 | { | ||
7480 | struct lpc32xx_ep *ep = container_of(_ep, struct lpc32xx_ep, ep); | ||
7481 | - struct lpc32xx_udc *udc = ep->udc; | ||
7482 | + struct lpc32xx_udc *udc; | ||
7483 | u16 maxpacket; | ||
7484 | u32 tmp; | ||
7485 | unsigned long flags; | ||
7486 | |||
7487 | /* Verify EP data */ | ||
7488 | if ((!_ep) || (!ep) || (!desc) || | ||
7489 | - (desc->bDescriptorType != USB_DT_ENDPOINT)) { | ||
7490 | - dev_dbg(udc->dev, "bad ep or descriptor\n"); | ||
7491 | + (desc->bDescriptorType != USB_DT_ENDPOINT)) | ||
7492 | return -EINVAL; | ||
7493 | - } | ||
7494 | + | ||
7495 | + udc = ep->udc; | ||
7496 | maxpacket = usb_endpoint_maxp(desc); | ||
7497 | if ((maxpacket == 0) || (maxpacket > ep->maxpacket)) { | ||
7498 | dev_dbg(udc->dev, "bad ep descriptor's packet size\n"); | ||
7499 | @@ -1872,7 +1872,7 @@ static int lpc32xx_ep_dequeue(struct usb_ep *_ep, struct usb_request *_req) | ||
7500 | static int lpc32xx_ep_set_halt(struct usb_ep *_ep, int value) | ||
7501 | { | ||
7502 | struct lpc32xx_ep *ep = container_of(_ep, struct lpc32xx_ep, ep); | ||
7503 | - struct lpc32xx_udc *udc = ep->udc; | ||
7504 | + struct lpc32xx_udc *udc; | ||
7505 | unsigned long flags; | ||
7506 | |||
7507 | if ((!ep) || (ep->hwep_num <= 1)) | ||
7508 | @@ -1882,6 +1882,7 @@ static int lpc32xx_ep_set_halt(struct usb_ep *_ep, int value) | ||
7509 | if (ep->is_in) | ||
7510 | return -EAGAIN; | ||
7511 | |||
7512 | + udc = ep->udc; | ||
7513 | spin_lock_irqsave(&udc->lock, flags); | ||
7514 | |||
7515 | if (value == 1) { | ||
7516 | diff --git a/drivers/usb/gadget/udc/m66592-udc.c b/drivers/usb/gadget/udc/m66592-udc.c | ||
7517 | index a8288df6aadf..ea59b56e5402 100644 | ||
7518 | --- a/drivers/usb/gadget/udc/m66592-udc.c | ||
7519 | +++ b/drivers/usb/gadget/udc/m66592-udc.c | ||
7520 | @@ -1667,7 +1667,7 @@ static int m66592_probe(struct platform_device *pdev) | ||
7521 | |||
7522 | err_add_udc: | ||
7523 | m66592_free_request(&m66592->ep[0].ep, m66592->ep0_req); | ||
7524 | - | ||
7525 | + m66592->ep0_req = NULL; | ||
7526 | clean_up3: | ||
7527 | if (m66592->pdata->on_chip) { | ||
7528 | clk_disable(m66592->clk); | ||
7529 | diff --git a/drivers/usb/gadget/udc/s3c2410_udc.c b/drivers/usb/gadget/udc/s3c2410_udc.c | ||
7530 | index f82208fbc249..5dcc0692b95c 100644 | ||
7531 | --- a/drivers/usb/gadget/udc/s3c2410_udc.c | ||
7532 | +++ b/drivers/usb/gadget/udc/s3c2410_udc.c | ||
7533 | @@ -251,10 +251,6 @@ static void s3c2410_udc_done(struct s3c2410_ep *ep, | ||
7534 | static void s3c2410_udc_nuke(struct s3c2410_udc *udc, | ||
7535 | struct s3c2410_ep *ep, int status) | ||
7536 | { | ||
7537 | - /* Sanity check */ | ||
7538 | - if (&ep->queue == NULL) | ||
7539 | - return; | ||
7540 | - | ||
7541 | while (!list_empty(&ep->queue)) { | ||
7542 | struct s3c2410_request *req; | ||
7543 | req = list_entry(ep->queue.next, struct s3c2410_request, | ||
7544 | diff --git a/drivers/usb/host/ehci-mxc.c b/drivers/usb/host/ehci-mxc.c | ||
7545 | index c9f91e6c72b6..7f65c86047dd 100644 | ||
7546 | --- a/drivers/usb/host/ehci-mxc.c | ||
7547 | +++ b/drivers/usb/host/ehci-mxc.c | ||
7548 | @@ -50,6 +50,8 @@ static int ehci_mxc_drv_probe(struct platform_device *pdev) | ||
7549 | } | ||
7550 | |||
7551 | irq = platform_get_irq(pdev, 0); | ||
7552 | + if (irq < 0) | ||
7553 | + return irq; | ||
7554 | |||
7555 | hcd = usb_create_hcd(&ehci_mxc_hc_driver, dev, dev_name(dev)); | ||
7556 | if (!hcd) | ||
7557 | diff --git a/drivers/usb/host/ehci-platform.c b/drivers/usb/host/ehci-platform.c | ||
7558 | index 769749ca5961..e9a49007cce4 100644 | ||
7559 | --- a/drivers/usb/host/ehci-platform.c | ||
7560 | +++ b/drivers/usb/host/ehci-platform.c | ||
7561 | @@ -29,6 +29,8 @@ | ||
7562 | #include <linux/of.h> | ||
7563 | #include <linux/platform_device.h> | ||
7564 | #include <linux/reset.h> | ||
7565 | +#include <linux/sys_soc.h> | ||
7566 | +#include <linux/timer.h> | ||
7567 | #include <linux/usb.h> | ||
7568 | #include <linux/usb/hcd.h> | ||
7569 | #include <linux/usb/ehci_pdriver.h> | ||
7570 | @@ -44,6 +46,9 @@ struct ehci_platform_priv { | ||
7571 | struct clk *clks[EHCI_MAX_CLKS]; | ||
7572 | struct reset_control *rsts; | ||
7573 | bool reset_on_resume; | ||
7574 | + bool quirk_poll; | ||
7575 | + struct timer_list poll_timer; | ||
7576 | + struct delayed_work poll_work; | ||
7577 | }; | ||
7578 | |||
7579 | static const char hcd_name[] = "ehci-platform"; | ||
7580 | @@ -118,6 +123,111 @@ static struct usb_ehci_pdata ehci_platform_defaults = { | ||
7581 | .power_off = ehci_platform_power_off, | ||
7582 | }; | ||
7583 | |||
7584 | +/** | ||
7585 | + * quirk_poll_check_port_status - Poll port_status if the device sticks | ||
7586 | + * @ehci: the ehci hcd pointer | ||
7587 | + * | ||
7588 | + * Since EHCI/OHCI controllers on R-Car Gen3 SoCs are possible to be getting | ||
7589 | + * stuck very rarely after a full/low usb device was disconnected. To | ||
7590 | + * detect such a situation, the controllers require a special way which poll | ||
7591 | + * the EHCI PORTSC register. | ||
7592 | + * | ||
7593 | + * Return: true if the controller's port_status indicated getting stuck | ||
7594 | + */ | ||
7595 | +static bool quirk_poll_check_port_status(struct ehci_hcd *ehci) | ||
7596 | +{ | ||
7597 | + u32 port_status = ehci_readl(ehci, &ehci->regs->port_status[0]); | ||
7598 | + | ||
7599 | + if (!(port_status & PORT_OWNER) && | ||
7600 | + (port_status & PORT_POWER) && | ||
7601 | + !(port_status & PORT_CONNECT) && | ||
7602 | + (port_status & PORT_LS_MASK)) | ||
7603 | + return true; | ||
7604 | + | ||
7605 | + return false; | ||
7606 | +} | ||
7607 | + | ||
7608 | +/** | ||
7609 | + * quirk_poll_rebind_companion - rebind comanion device to recover | ||
7610 | + * @ehci: the ehci hcd pointer | ||
7611 | + * | ||
7612 | + * Since EHCI/OHCI controllers on R-Car Gen3 SoCs are possible to be getting | ||
7613 | + * stuck very rarely after a full/low usb device was disconnected. To | ||
7614 | + * recover from such a situation, the controllers require changing the OHCI | ||
7615 | + * functional state. | ||
7616 | + */ | ||
7617 | +static void quirk_poll_rebind_companion(struct ehci_hcd *ehci) | ||
7618 | +{ | ||
7619 | + struct device *companion_dev; | ||
7620 | + struct usb_hcd *hcd = ehci_to_hcd(ehci); | ||
7621 | + | ||
7622 | + companion_dev = usb_of_get_companion_dev(hcd->self.controller); | ||
7623 | + if (!companion_dev) | ||
7624 | + return; | ||
7625 | + | ||
7626 | + device_release_driver(companion_dev); | ||
7627 | + if (device_attach(companion_dev) < 0) | ||
7628 | + ehci_err(ehci, "%s: failed\n", __func__); | ||
7629 | + | ||
7630 | + put_device(companion_dev); | ||
7631 | +} | ||
7632 | + | ||
7633 | +static void quirk_poll_work(struct work_struct *work) | ||
7634 | +{ | ||
7635 | + struct ehci_platform_priv *priv = | ||
7636 | + container_of(to_delayed_work(work), struct ehci_platform_priv, | ||
7637 | + poll_work); | ||
7638 | + struct ehci_hcd *ehci = container_of((void *)priv, struct ehci_hcd, | ||
7639 | + priv); | ||
7640 | + | ||
7641 | + /* check the status twice to reduce misdetection rate */ | ||
7642 | + if (!quirk_poll_check_port_status(ehci)) | ||
7643 | + return; | ||
7644 | + udelay(10); | ||
7645 | + if (!quirk_poll_check_port_status(ehci)) | ||
7646 | + return; | ||
7647 | + | ||
7648 | + ehci_dbg(ehci, "%s: detected getting stuck. rebind now!\n", __func__); | ||
7649 | + quirk_poll_rebind_companion(ehci); | ||
7650 | +} | ||
7651 | + | ||
7652 | +static void quirk_poll_timer(struct timer_list *t) | ||
7653 | +{ | ||
7654 | + struct ehci_platform_priv *priv = from_timer(priv, t, poll_timer); | ||
7655 | + struct ehci_hcd *ehci = container_of((void *)priv, struct ehci_hcd, | ||
7656 | + priv); | ||
7657 | + | ||
7658 | + if (quirk_poll_check_port_status(ehci)) { | ||
7659 | + /* | ||
7660 | + * Now scheduling the work for testing the port more. Note that | ||
7661 | + * updating the status is possible to be delayed when | ||
7662 | + * reconnection. So, this uses delayed work with 5 ms delay | ||
7663 | + * to avoid misdetection. | ||
7664 | + */ | ||
7665 | + schedule_delayed_work(&priv->poll_work, msecs_to_jiffies(5)); | ||
7666 | + } | ||
7667 | + | ||
7668 | + mod_timer(&priv->poll_timer, jiffies + HZ); | ||
7669 | +} | ||
7670 | + | ||
7671 | +static void quirk_poll_init(struct ehci_platform_priv *priv) | ||
7672 | +{ | ||
7673 | + INIT_DELAYED_WORK(&priv->poll_work, quirk_poll_work); | ||
7674 | + timer_setup(&priv->poll_timer, quirk_poll_timer, 0); | ||
7675 | + mod_timer(&priv->poll_timer, jiffies + HZ); | ||
7676 | +} | ||
7677 | + | ||
7678 | +static void quirk_poll_end(struct ehci_platform_priv *priv) | ||
7679 | +{ | ||
7680 | + del_timer_sync(&priv->poll_timer); | ||
7681 | + cancel_delayed_work(&priv->poll_work); | ||
7682 | +} | ||
7683 | + | ||
7684 | +static const struct soc_device_attribute quirk_poll_match[] = { | ||
7685 | + { .family = "R-Car Gen3" }, | ||
7686 | + { /* sentinel*/ } | ||
7687 | +}; | ||
7688 | + | ||
7689 | static int ehci_platform_probe(struct platform_device *dev) | ||
7690 | { | ||
7691 | struct usb_hcd *hcd; | ||
7692 | @@ -176,6 +286,9 @@ static int ehci_platform_probe(struct platform_device *dev) | ||
7693 | "has-transaction-translator")) | ||
7694 | hcd->has_tt = 1; | ||
7695 | |||
7696 | + if (soc_device_match(quirk_poll_match)) | ||
7697 | + priv->quirk_poll = true; | ||
7698 | + | ||
7699 | for (clk = 0; clk < EHCI_MAX_CLKS; clk++) { | ||
7700 | priv->clks[clk] = of_clk_get(dev->dev.of_node, clk); | ||
7701 | if (IS_ERR(priv->clks[clk])) { | ||
7702 | @@ -247,6 +360,9 @@ static int ehci_platform_probe(struct platform_device *dev) | ||
7703 | device_enable_async_suspend(hcd->self.controller); | ||
7704 | platform_set_drvdata(dev, hcd); | ||
7705 | |||
7706 | + if (priv->quirk_poll) | ||
7707 | + quirk_poll_init(priv); | ||
7708 | + | ||
7709 | return err; | ||
7710 | |||
7711 | err_power: | ||
7712 | @@ -273,6 +389,9 @@ static int ehci_platform_remove(struct platform_device *dev) | ||
7713 | struct ehci_platform_priv *priv = hcd_to_ehci_priv(hcd); | ||
7714 | int clk; | ||
7715 | |||
7716 | + if (priv->quirk_poll) | ||
7717 | + quirk_poll_end(priv); | ||
7718 | + | ||
7719 | usb_remove_hcd(hcd); | ||
7720 | |||
7721 | if (pdata->power_off) | ||
7722 | @@ -297,9 +416,13 @@ static int ehci_platform_suspend(struct device *dev) | ||
7723 | struct usb_hcd *hcd = dev_get_drvdata(dev); | ||
7724 | struct usb_ehci_pdata *pdata = dev_get_platdata(dev); | ||
7725 | struct platform_device *pdev = to_platform_device(dev); | ||
7726 | + struct ehci_platform_priv *priv = hcd_to_ehci_priv(hcd); | ||
7727 | bool do_wakeup = device_may_wakeup(dev); | ||
7728 | int ret; | ||
7729 | |||
7730 | + if (priv->quirk_poll) | ||
7731 | + quirk_poll_end(priv); | ||
7732 | + | ||
7733 | ret = ehci_suspend(hcd, do_wakeup); | ||
7734 | if (ret) | ||
7735 | return ret; | ||
7736 | @@ -331,6 +454,14 @@ static int ehci_platform_resume(struct device *dev) | ||
7737 | } | ||
7738 | |||
7739 | ehci_resume(hcd, priv->reset_on_resume); | ||
7740 | + | ||
7741 | + pm_runtime_disable(dev); | ||
7742 | + pm_runtime_set_active(dev); | ||
7743 | + pm_runtime_enable(dev); | ||
7744 | + | ||
7745 | + if (priv->quirk_poll) | ||
7746 | + quirk_poll_init(priv); | ||
7747 | + | ||
7748 | return 0; | ||
7749 | } | ||
7750 | #endif /* CONFIG_PM_SLEEP */ | ||
7751 | diff --git a/drivers/usb/host/ohci-platform.c b/drivers/usb/host/ohci-platform.c | ||
7752 | index 7addfc2cbadc..4a8456f12a73 100644 | ||
7753 | --- a/drivers/usb/host/ohci-platform.c | ||
7754 | +++ b/drivers/usb/host/ohci-platform.c | ||
7755 | @@ -299,6 +299,11 @@ static int ohci_platform_resume(struct device *dev) | ||
7756 | } | ||
7757 | |||
7758 | ohci_resume(hcd, false); | ||
7759 | + | ||
7760 | + pm_runtime_disable(dev); | ||
7761 | + pm_runtime_set_active(dev); | ||
7762 | + pm_runtime_enable(dev); | ||
7763 | + | ||
7764 | return 0; | ||
7765 | } | ||
7766 | #endif /* CONFIG_PM_SLEEP */ | ||
7767 | diff --git a/drivers/usb/host/ohci-sm501.c b/drivers/usb/host/ohci-sm501.c | ||
7768 | index c158cda9e4b9..cff965240327 100644 | ||
7769 | --- a/drivers/usb/host/ohci-sm501.c | ||
7770 | +++ b/drivers/usb/host/ohci-sm501.c | ||
7771 | @@ -157,9 +157,10 @@ static int ohci_hcd_sm501_drv_probe(struct platform_device *pdev) | ||
7772 | * the call to usb_hcd_setup_local_mem() below does just that. | ||
7773 | */ | ||
7774 | |||
7775 | - if (usb_hcd_setup_local_mem(hcd, mem->start, | ||
7776 | - mem->start - mem->parent->start, | ||
7777 | - resource_size(mem)) < 0) | ||
7778 | + retval = usb_hcd_setup_local_mem(hcd, mem->start, | ||
7779 | + mem->start - mem->parent->start, | ||
7780 | + resource_size(mem)); | ||
7781 | + if (retval < 0) | ||
7782 | goto err5; | ||
7783 | retval = usb_add_hcd(hcd, irq, IRQF_SHARED); | ||
7784 | if (retval) | ||
7785 | diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c | ||
7786 | index 52c625c02341..60d06e9b600f 100644 | ||
7787 | --- a/drivers/usb/host/xhci-plat.c | ||
7788 | +++ b/drivers/usb/host/xhci-plat.c | ||
7789 | @@ -410,7 +410,15 @@ static int __maybe_unused xhci_plat_resume(struct device *dev) | ||
7790 | if (ret) | ||
7791 | return ret; | ||
7792 | |||
7793 | - return xhci_resume(xhci, 0); | ||
7794 | + ret = xhci_resume(xhci, 0); | ||
7795 | + if (ret) | ||
7796 | + return ret; | ||
7797 | + | ||
7798 | + pm_runtime_disable(dev); | ||
7799 | + pm_runtime_set_active(dev); | ||
7800 | + pm_runtime_enable(dev); | ||
7801 | + | ||
7802 | + return 0; | ||
7803 | } | ||
7804 | |||
7805 | static int __maybe_unused xhci_plat_runtime_suspend(struct device *dev) | ||
7806 | diff --git a/drivers/vfio/mdev/mdev_sysfs.c b/drivers/vfio/mdev/mdev_sysfs.c | ||
7807 | index 7570c7602ab4..f32c582611eb 100644 | ||
7808 | --- a/drivers/vfio/mdev/mdev_sysfs.c | ||
7809 | +++ b/drivers/vfio/mdev/mdev_sysfs.c | ||
7810 | @@ -110,7 +110,7 @@ static struct mdev_type *add_mdev_supported_type(struct mdev_parent *parent, | ||
7811 | "%s-%s", dev_driver_string(parent->dev), | ||
7812 | group->name); | ||
7813 | if (ret) { | ||
7814 | - kfree(type); | ||
7815 | + kobject_put(&type->kobj); | ||
7816 | return ERR_PTR(ret); | ||
7817 | } | ||
7818 | |||
7819 | diff --git a/drivers/vfio/pci/vfio_pci_config.c b/drivers/vfio/pci/vfio_pci_config.c | ||
7820 | index f0891bd8444c..d6359c37c9e5 100644 | ||
7821 | --- a/drivers/vfio/pci/vfio_pci_config.c | ||
7822 | +++ b/drivers/vfio/pci/vfio_pci_config.c | ||
7823 | @@ -1460,7 +1460,12 @@ static int vfio_cap_init(struct vfio_pci_device *vdev) | ||
7824 | if (ret) | ||
7825 | return ret; | ||
7826 | |||
7827 | - if (cap <= PCI_CAP_ID_MAX) { | ||
7828 | + /* | ||
7829 | + * ID 0 is a NULL capability, conflicting with our fake | ||
7830 | + * PCI_CAP_ID_BASIC. As it has no content, consider it | ||
7831 | + * hidden for now. | ||
7832 | + */ | ||
7833 | + if (cap && cap <= PCI_CAP_ID_MAX) { | ||
7834 | len = pci_cap_length[cap]; | ||
7835 | if (len == 0xFF) { /* Variable length */ | ||
7836 | len = vfio_cap_len(vdev, cap, pos); | ||
7837 | @@ -1726,8 +1731,11 @@ void vfio_config_free(struct vfio_pci_device *vdev) | ||
7838 | vdev->vconfig = NULL; | ||
7839 | kfree(vdev->pci_config_map); | ||
7840 | vdev->pci_config_map = NULL; | ||
7841 | - kfree(vdev->msi_perm); | ||
7842 | - vdev->msi_perm = NULL; | ||
7843 | + if (vdev->msi_perm) { | ||
7844 | + free_perm_bits(vdev->msi_perm); | ||
7845 | + kfree(vdev->msi_perm); | ||
7846 | + vdev->msi_perm = NULL; | ||
7847 | + } | ||
7848 | } | ||
7849 | |||
7850 | /* | ||
7851 | diff --git a/drivers/vhost/scsi.c b/drivers/vhost/scsi.c | ||
7852 | index a9caf1bc3c3e..88ce114790d7 100644 | ||
7853 | --- a/drivers/vhost/scsi.c | ||
7854 | +++ b/drivers/vhost/scsi.c | ||
7855 | @@ -2290,6 +2290,7 @@ static struct configfs_attribute *vhost_scsi_wwn_attrs[] = { | ||
7856 | static const struct target_core_fabric_ops vhost_scsi_ops = { | ||
7857 | .module = THIS_MODULE, | ||
7858 | .fabric_name = "vhost", | ||
7859 | + .max_data_sg_nents = VHOST_SCSI_PREALLOC_SGLS, | ||
7860 | .tpg_get_wwn = vhost_scsi_get_fabric_wwn, | ||
7861 | .tpg_get_tag = vhost_scsi_get_tpgt, | ||
7862 | .tpg_check_demo_mode = vhost_scsi_check_true, | ||
7863 | diff --git a/drivers/video/backlight/lp855x_bl.c b/drivers/video/backlight/lp855x_bl.c | ||
7864 | index f68920131a4a..e94932c69f54 100644 | ||
7865 | --- a/drivers/video/backlight/lp855x_bl.c | ||
7866 | +++ b/drivers/video/backlight/lp855x_bl.c | ||
7867 | @@ -456,7 +456,7 @@ static int lp855x_probe(struct i2c_client *cl, const struct i2c_device_id *id) | ||
7868 | ret = regulator_enable(lp->enable); | ||
7869 | if (ret < 0) { | ||
7870 | dev_err(lp->dev, "failed to enable vddio: %d\n", ret); | ||
7871 | - return ret; | ||
7872 | + goto disable_supply; | ||
7873 | } | ||
7874 | |||
7875 | /* | ||
7876 | @@ -471,24 +471,34 @@ static int lp855x_probe(struct i2c_client *cl, const struct i2c_device_id *id) | ||
7877 | ret = lp855x_configure(lp); | ||
7878 | if (ret) { | ||
7879 | dev_err(lp->dev, "device config err: %d", ret); | ||
7880 | - return ret; | ||
7881 | + goto disable_vddio; | ||
7882 | } | ||
7883 | |||
7884 | ret = lp855x_backlight_register(lp); | ||
7885 | if (ret) { | ||
7886 | dev_err(lp->dev, | ||
7887 | "failed to register backlight. err: %d\n", ret); | ||
7888 | - return ret; | ||
7889 | + goto disable_vddio; | ||
7890 | } | ||
7891 | |||
7892 | ret = sysfs_create_group(&lp->dev->kobj, &lp855x_attr_group); | ||
7893 | if (ret) { | ||
7894 | dev_err(lp->dev, "failed to register sysfs. err: %d\n", ret); | ||
7895 | - return ret; | ||
7896 | + goto disable_vddio; | ||
7897 | } | ||
7898 | |||
7899 | backlight_update_status(lp->bl); | ||
7900 | + | ||
7901 | return 0; | ||
7902 | + | ||
7903 | +disable_vddio: | ||
7904 | + if (lp->enable) | ||
7905 | + regulator_disable(lp->enable); | ||
7906 | +disable_supply: | ||
7907 | + if (lp->supply) | ||
7908 | + regulator_disable(lp->supply); | ||
7909 | + | ||
7910 | + return ret; | ||
7911 | } | ||
7912 | |||
7913 | static int lp855x_remove(struct i2c_client *cl) | ||
7914 | @@ -497,6 +507,8 @@ static int lp855x_remove(struct i2c_client *cl) | ||
7915 | |||
7916 | lp->bl->props.brightness = 0; | ||
7917 | backlight_update_status(lp->bl); | ||
7918 | + if (lp->enable) | ||
7919 | + regulator_disable(lp->enable); | ||
7920 | if (lp->supply) | ||
7921 | regulator_disable(lp->supply); | ||
7922 | sysfs_remove_group(&lp->dev->kobj, &lp855x_attr_group); | ||
7923 | diff --git a/drivers/watchdog/da9062_wdt.c b/drivers/watchdog/da9062_wdt.c | ||
7924 | index e92f38fcb7a4..1b9bcfed39e9 100644 | ||
7925 | --- a/drivers/watchdog/da9062_wdt.c | ||
7926 | +++ b/drivers/watchdog/da9062_wdt.c | ||
7927 | @@ -55,11 +55,6 @@ static int da9062_wdt_update_timeout_register(struct da9062_watchdog *wdt, | ||
7928 | unsigned int regval) | ||
7929 | { | ||
7930 | struct da9062 *chip = wdt->hw; | ||
7931 | - int ret; | ||
7932 | - | ||
7933 | - ret = da9062_reset_watchdog_timer(wdt); | ||
7934 | - if (ret) | ||
7935 | - return ret; | ||
7936 | |||
7937 | regmap_update_bits(chip->regmap, | ||
7938 | DA9062AA_CONTROL_D, | ||
7939 | diff --git a/fs/afs/dir.c b/fs/afs/dir.c | ||
7940 | index d1e1caa23c8b..3c486340b220 100644 | ||
7941 | --- a/fs/afs/dir.c | ||
7942 | +++ b/fs/afs/dir.c | ||
7943 | @@ -658,7 +658,8 @@ static struct inode *afs_do_lookup(struct inode *dir, struct dentry *dentry, | ||
7944 | |||
7945 | cookie->ctx.actor = afs_lookup_filldir; | ||
7946 | cookie->name = dentry->d_name; | ||
7947 | - cookie->nr_fids = 1; /* slot 0 is saved for the fid we actually want */ | ||
7948 | + cookie->nr_fids = 2; /* slot 0 is saved for the fid we actually want | ||
7949 | + * and slot 1 for the directory */ | ||
7950 | |||
7951 | read_seqlock_excl(&dvnode->cb_lock); | ||
7952 | dcbi = rcu_dereference_protected(dvnode->cb_interest, | ||
7953 | @@ -709,7 +710,11 @@ static struct inode *afs_do_lookup(struct inode *dir, struct dentry *dentry, | ||
7954 | if (!cookie->inodes) | ||
7955 | goto out_s; | ||
7956 | |||
7957 | - for (i = 1; i < cookie->nr_fids; i++) { | ||
7958 | + cookie->fids[1] = dvnode->fid; | ||
7959 | + cookie->statuses[1].cb_break = afs_calc_vnode_cb_break(dvnode); | ||
7960 | + cookie->inodes[1] = igrab(&dvnode->vfs_inode); | ||
7961 | + | ||
7962 | + for (i = 2; i < cookie->nr_fids; i++) { | ||
7963 | scb = &cookie->statuses[i]; | ||
7964 | |||
7965 | /* Find any inodes that already exist and get their | ||
7966 | diff --git a/fs/afs/fsclient.c b/fs/afs/fsclient.c | ||
7967 | index 0a4fed9e706b..5c2729fc07e5 100644 | ||
7968 | --- a/fs/afs/fsclient.c | ||
7969 | +++ b/fs/afs/fsclient.c | ||
7970 | @@ -56,16 +56,15 @@ static void xdr_dump_bad(const __be32 *bp) | ||
7971 | /* | ||
7972 | * decode an AFSFetchStatus block | ||
7973 | */ | ||
7974 | -static int xdr_decode_AFSFetchStatus(const __be32 **_bp, | ||
7975 | - struct afs_call *call, | ||
7976 | - struct afs_status_cb *scb) | ||
7977 | +static void xdr_decode_AFSFetchStatus(const __be32 **_bp, | ||
7978 | + struct afs_call *call, | ||
7979 | + struct afs_status_cb *scb) | ||
7980 | { | ||
7981 | const struct afs_xdr_AFSFetchStatus *xdr = (const void *)*_bp; | ||
7982 | struct afs_file_status *status = &scb->status; | ||
7983 | bool inline_error = (call->operation_ID == afs_FS_InlineBulkStatus); | ||
7984 | u64 data_version, size; | ||
7985 | u32 type, abort_code; | ||
7986 | - int ret; | ||
7987 | |||
7988 | abort_code = ntohl(xdr->abort_code); | ||
7989 | |||
7990 | @@ -79,7 +78,7 @@ static int xdr_decode_AFSFetchStatus(const __be32 **_bp, | ||
7991 | */ | ||
7992 | status->abort_code = abort_code; | ||
7993 | scb->have_error = true; | ||
7994 | - goto good; | ||
7995 | + goto advance; | ||
7996 | } | ||
7997 | |||
7998 | pr_warn("Unknown AFSFetchStatus version %u\n", ntohl(xdr->if_version)); | ||
7999 | @@ -89,7 +88,7 @@ static int xdr_decode_AFSFetchStatus(const __be32 **_bp, | ||
8000 | if (abort_code != 0 && inline_error) { | ||
8001 | status->abort_code = abort_code; | ||
8002 | scb->have_error = true; | ||
8003 | - goto good; | ||
8004 | + goto advance; | ||
8005 | } | ||
8006 | |||
8007 | type = ntohl(xdr->type); | ||
8008 | @@ -125,15 +124,13 @@ static int xdr_decode_AFSFetchStatus(const __be32 **_bp, | ||
8009 | data_version |= (u64)ntohl(xdr->data_version_hi) << 32; | ||
8010 | status->data_version = data_version; | ||
8011 | scb->have_status = true; | ||
8012 | -good: | ||
8013 | - ret = 0; | ||
8014 | advance: | ||
8015 | *_bp = (const void *)*_bp + sizeof(*xdr); | ||
8016 | - return ret; | ||
8017 | + return; | ||
8018 | |||
8019 | bad: | ||
8020 | xdr_dump_bad(*_bp); | ||
8021 | - ret = afs_protocol_error(call, -EBADMSG, afs_eproto_bad_status); | ||
8022 | + afs_protocol_error(call, -EBADMSG, afs_eproto_bad_status); | ||
8023 | goto advance; | ||
8024 | } | ||
8025 | |||
8026 | @@ -254,9 +251,7 @@ static int afs_deliver_fs_fetch_status_vnode(struct afs_call *call) | ||
8027 | |||
8028 | /* unmarshall the reply once we've received all of it */ | ||
8029 | bp = call->buffer; | ||
8030 | - ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_scb); | ||
8031 | - if (ret < 0) | ||
8032 | - return ret; | ||
8033 | + xdr_decode_AFSFetchStatus(&bp, call, call->out_scb); | ||
8034 | xdr_decode_AFSCallBack(&bp, call, call->out_scb); | ||
8035 | xdr_decode_AFSVolSync(&bp, call->out_volsync); | ||
8036 | |||
8037 | @@ -419,9 +414,7 @@ static int afs_deliver_fs_fetch_data(struct afs_call *call) | ||
8038 | return ret; | ||
8039 | |||
8040 | bp = call->buffer; | ||
8041 | - ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_scb); | ||
8042 | - if (ret < 0) | ||
8043 | - return ret; | ||
8044 | + xdr_decode_AFSFetchStatus(&bp, call, call->out_scb); | ||
8045 | xdr_decode_AFSCallBack(&bp, call, call->out_scb); | ||
8046 | xdr_decode_AFSVolSync(&bp, call->out_volsync); | ||
8047 | |||
8048 | @@ -579,12 +572,8 @@ static int afs_deliver_fs_create_vnode(struct afs_call *call) | ||
8049 | /* unmarshall the reply once we've received all of it */ | ||
8050 | bp = call->buffer; | ||
8051 | xdr_decode_AFSFid(&bp, call->out_fid); | ||
8052 | - ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_scb); | ||
8053 | - if (ret < 0) | ||
8054 | - return ret; | ||
8055 | - ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_dir_scb); | ||
8056 | - if (ret < 0) | ||
8057 | - return ret; | ||
8058 | + xdr_decode_AFSFetchStatus(&bp, call, call->out_scb); | ||
8059 | + xdr_decode_AFSFetchStatus(&bp, call, call->out_dir_scb); | ||
8060 | xdr_decode_AFSCallBack(&bp, call, call->out_scb); | ||
8061 | xdr_decode_AFSVolSync(&bp, call->out_volsync); | ||
8062 | |||
8063 | @@ -693,9 +682,7 @@ static int afs_deliver_fs_dir_status_and_vol(struct afs_call *call) | ||
8064 | |||
8065 | /* unmarshall the reply once we've received all of it */ | ||
8066 | bp = call->buffer; | ||
8067 | - ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_dir_scb); | ||
8068 | - if (ret < 0) | ||
8069 | - return ret; | ||
8070 | + xdr_decode_AFSFetchStatus(&bp, call, call->out_dir_scb); | ||
8071 | xdr_decode_AFSVolSync(&bp, call->out_volsync); | ||
8072 | |||
8073 | _leave(" = 0 [done]"); | ||
8074 | @@ -786,12 +773,8 @@ static int afs_deliver_fs_link(struct afs_call *call) | ||
8075 | |||
8076 | /* unmarshall the reply once we've received all of it */ | ||
8077 | bp = call->buffer; | ||
8078 | - ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_scb); | ||
8079 | - if (ret < 0) | ||
8080 | - return ret; | ||
8081 | - ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_dir_scb); | ||
8082 | - if (ret < 0) | ||
8083 | - return ret; | ||
8084 | + xdr_decode_AFSFetchStatus(&bp, call, call->out_scb); | ||
8085 | + xdr_decode_AFSFetchStatus(&bp, call, call->out_dir_scb); | ||
8086 | xdr_decode_AFSVolSync(&bp, call->out_volsync); | ||
8087 | |||
8088 | _leave(" = 0 [done]"); | ||
8089 | @@ -880,12 +863,8 @@ static int afs_deliver_fs_symlink(struct afs_call *call) | ||
8090 | /* unmarshall the reply once we've received all of it */ | ||
8091 | bp = call->buffer; | ||
8092 | xdr_decode_AFSFid(&bp, call->out_fid); | ||
8093 | - ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_scb); | ||
8094 | - if (ret < 0) | ||
8095 | - return ret; | ||
8096 | - ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_dir_scb); | ||
8097 | - if (ret < 0) | ||
8098 | - return ret; | ||
8099 | + xdr_decode_AFSFetchStatus(&bp, call, call->out_scb); | ||
8100 | + xdr_decode_AFSFetchStatus(&bp, call, call->out_dir_scb); | ||
8101 | xdr_decode_AFSVolSync(&bp, call->out_volsync); | ||
8102 | |||
8103 | _leave(" = 0 [done]"); | ||
8104 | @@ -988,16 +967,12 @@ static int afs_deliver_fs_rename(struct afs_call *call) | ||
8105 | if (ret < 0) | ||
8106 | return ret; | ||
8107 | |||
8108 | + bp = call->buffer; | ||
8109 | /* If the two dirs are the same, we have two copies of the same status | ||
8110 | * report, so we just decode it twice. | ||
8111 | */ | ||
8112 | - bp = call->buffer; | ||
8113 | - ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_dir_scb); | ||
8114 | - if (ret < 0) | ||
8115 | - return ret; | ||
8116 | - ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_scb); | ||
8117 | - if (ret < 0) | ||
8118 | - return ret; | ||
8119 | + xdr_decode_AFSFetchStatus(&bp, call, call->out_dir_scb); | ||
8120 | + xdr_decode_AFSFetchStatus(&bp, call, call->out_scb); | ||
8121 | xdr_decode_AFSVolSync(&bp, call->out_volsync); | ||
8122 | |||
8123 | _leave(" = 0 [done]"); | ||
8124 | @@ -1105,9 +1080,7 @@ static int afs_deliver_fs_store_data(struct afs_call *call) | ||
8125 | |||
8126 | /* unmarshall the reply once we've received all of it */ | ||
8127 | bp = call->buffer; | ||
8128 | - ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_scb); | ||
8129 | - if (ret < 0) | ||
8130 | - return ret; | ||
8131 | + xdr_decode_AFSFetchStatus(&bp, call, call->out_scb); | ||
8132 | xdr_decode_AFSVolSync(&bp, call->out_volsync); | ||
8133 | |||
8134 | _leave(" = 0 [done]"); | ||
8135 | @@ -1285,9 +1258,7 @@ static int afs_deliver_fs_store_status(struct afs_call *call) | ||
8136 | |||
8137 | /* unmarshall the reply once we've received all of it */ | ||
8138 | bp = call->buffer; | ||
8139 | - ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_scb); | ||
8140 | - if (ret < 0) | ||
8141 | - return ret; | ||
8142 | + xdr_decode_AFSFetchStatus(&bp, call, call->out_scb); | ||
8143 | xdr_decode_AFSVolSync(&bp, call->out_volsync); | ||
8144 | |||
8145 | _leave(" = 0 [done]"); | ||
8146 | @@ -1956,9 +1927,7 @@ static int afs_deliver_fs_fetch_status(struct afs_call *call) | ||
8147 | |||
8148 | /* unmarshall the reply once we've received all of it */ | ||
8149 | bp = call->buffer; | ||
8150 | - ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_scb); | ||
8151 | - if (ret < 0) | ||
8152 | - return ret; | ||
8153 | + xdr_decode_AFSFetchStatus(&bp, call, call->out_scb); | ||
8154 | xdr_decode_AFSCallBack(&bp, call, call->out_scb); | ||
8155 | xdr_decode_AFSVolSync(&bp, call->out_volsync); | ||
8156 | |||
8157 | @@ -2064,10 +2033,7 @@ static int afs_deliver_fs_inline_bulk_status(struct afs_call *call) | ||
8158 | |||
8159 | bp = call->buffer; | ||
8160 | scb = &call->out_scb[call->count]; | ||
8161 | - ret = xdr_decode_AFSFetchStatus(&bp, call, scb); | ||
8162 | - if (ret < 0) | ||
8163 | - return ret; | ||
8164 | - | ||
8165 | + xdr_decode_AFSFetchStatus(&bp, call, scb); | ||
8166 | call->count++; | ||
8167 | if (call->count < call->count2) | ||
8168 | goto more_counts; | ||
8169 | @@ -2245,9 +2211,7 @@ static int afs_deliver_fs_fetch_acl(struct afs_call *call) | ||
8170 | return ret; | ||
8171 | |||
8172 | bp = call->buffer; | ||
8173 | - ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_scb); | ||
8174 | - if (ret < 0) | ||
8175 | - return ret; | ||
8176 | + xdr_decode_AFSFetchStatus(&bp, call, call->out_scb); | ||
8177 | xdr_decode_AFSVolSync(&bp, call->out_volsync); | ||
8178 | |||
8179 | call->unmarshall++; | ||
8180 | @@ -2328,9 +2292,7 @@ static int afs_deliver_fs_file_status_and_vol(struct afs_call *call) | ||
8181 | return ret; | ||
8182 | |||
8183 | bp = call->buffer; | ||
8184 | - ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_scb); | ||
8185 | - if (ret < 0) | ||
8186 | - return ret; | ||
8187 | + xdr_decode_AFSFetchStatus(&bp, call, call->out_scb); | ||
8188 | xdr_decode_AFSVolSync(&bp, call->out_volsync); | ||
8189 | |||
8190 | _leave(" = 0 [done]"); | ||
8191 | diff --git a/fs/afs/inode.c b/fs/afs/inode.c | ||
8192 | index 46d2d7cb461d..a74e8e209454 100644 | ||
8193 | --- a/fs/afs/inode.c | ||
8194 | +++ b/fs/afs/inode.c | ||
8195 | @@ -171,6 +171,7 @@ static void afs_apply_status(struct afs_fs_cursor *fc, | ||
8196 | struct timespec64 t; | ||
8197 | umode_t mode; | ||
8198 | bool data_changed = false; | ||
8199 | + bool change_size = false; | ||
8200 | |||
8201 | BUG_ON(test_bit(AFS_VNODE_UNSET, &vnode->flags)); | ||
8202 | |||
8203 | @@ -226,6 +227,7 @@ static void afs_apply_status(struct afs_fs_cursor *fc, | ||
8204 | } else { | ||
8205 | set_bit(AFS_VNODE_ZAP_DATA, &vnode->flags); | ||
8206 | } | ||
8207 | + change_size = true; | ||
8208 | } else if (vnode->status.type == AFS_FTYPE_DIR) { | ||
8209 | /* Expected directory change is handled elsewhere so | ||
8210 | * that we can locally edit the directory and save on a | ||
8211 | @@ -233,11 +235,19 @@ static void afs_apply_status(struct afs_fs_cursor *fc, | ||
8212 | */ | ||
8213 | if (test_bit(AFS_VNODE_DIR_VALID, &vnode->flags)) | ||
8214 | data_changed = false; | ||
8215 | + change_size = true; | ||
8216 | } | ||
8217 | |||
8218 | if (data_changed) { | ||
8219 | inode_set_iversion_raw(&vnode->vfs_inode, status->data_version); | ||
8220 | - afs_set_i_size(vnode, status->size); | ||
8221 | + | ||
8222 | + /* Only update the size if the data version jumped. If the | ||
8223 | + * file is being modified locally, then we might have our own | ||
8224 | + * idea of what the size should be that's not the same as | ||
8225 | + * what's on the server. | ||
8226 | + */ | ||
8227 | + if (change_size) | ||
8228 | + afs_set_i_size(vnode, status->size); | ||
8229 | } | ||
8230 | } | ||
8231 | |||
8232 | diff --git a/fs/afs/internal.h b/fs/afs/internal.h | ||
8233 | index 485cc3b2aaa8..555ad7c9afcb 100644 | ||
8234 | --- a/fs/afs/internal.h | ||
8235 | +++ b/fs/afs/internal.h | ||
8236 | @@ -161,6 +161,7 @@ struct afs_call { | ||
8237 | bool upgrade; /* T to request service upgrade */ | ||
8238 | bool have_reply_time; /* T if have got reply_time */ | ||
8239 | bool intr; /* T if interruptible */ | ||
8240 | + bool unmarshalling_error; /* T if an unmarshalling error occurred */ | ||
8241 | u16 service_id; /* Actual service ID (after upgrade) */ | ||
8242 | unsigned int debug_id; /* Trace ID */ | ||
8243 | u32 operation_ID; /* operation ID for an incoming call */ | ||
8244 | diff --git a/fs/afs/misc.c b/fs/afs/misc.c | ||
8245 | index 52b19e9c1535..5334f1bd2bca 100644 | ||
8246 | --- a/fs/afs/misc.c | ||
8247 | +++ b/fs/afs/misc.c | ||
8248 | @@ -83,6 +83,7 @@ int afs_abort_to_error(u32 abort_code) | ||
8249 | case UAENOLCK: return -ENOLCK; | ||
8250 | case UAENOTEMPTY: return -ENOTEMPTY; | ||
8251 | case UAELOOP: return -ELOOP; | ||
8252 | + case UAEOVERFLOW: return -EOVERFLOW; | ||
8253 | case UAENOMEDIUM: return -ENOMEDIUM; | ||
8254 | case UAEDQUOT: return -EDQUOT; | ||
8255 | |||
8256 | diff --git a/fs/afs/proc.c b/fs/afs/proc.c | ||
8257 | index fba2ec3a3a9c..106b27011f6d 100644 | ||
8258 | --- a/fs/afs/proc.c | ||
8259 | +++ b/fs/afs/proc.c | ||
8260 | @@ -562,6 +562,7 @@ void afs_put_sysnames(struct afs_sysnames *sysnames) | ||
8261 | if (sysnames->subs[i] != afs_init_sysname && | ||
8262 | sysnames->subs[i] != sysnames->blank) | ||
8263 | kfree(sysnames->subs[i]); | ||
8264 | + kfree(sysnames); | ||
8265 | } | ||
8266 | } | ||
8267 | |||
8268 | diff --git a/fs/afs/rxrpc.c b/fs/afs/rxrpc.c | ||
8269 | index 52aa90fb4fbd..6adab30a8399 100644 | ||
8270 | --- a/fs/afs/rxrpc.c | ||
8271 | +++ b/fs/afs/rxrpc.c | ||
8272 | @@ -540,6 +540,8 @@ static void afs_deliver_to_call(struct afs_call *call) | ||
8273 | |||
8274 | ret = call->type->deliver(call); | ||
8275 | state = READ_ONCE(call->state); | ||
8276 | + if (ret == 0 && call->unmarshalling_error) | ||
8277 | + ret = -EBADMSG; | ||
8278 | switch (ret) { | ||
8279 | case 0: | ||
8280 | afs_queue_call_work(call); | ||
8281 | @@ -963,5 +965,7 @@ noinline int afs_protocol_error(struct afs_call *call, int error, | ||
8282 | enum afs_eproto_cause cause) | ||
8283 | { | ||
8284 | trace_afs_protocol_error(call, error, cause); | ||
8285 | + if (call) | ||
8286 | + call->unmarshalling_error = true; | ||
8287 | return error; | ||
8288 | } | ||
8289 | diff --git a/fs/afs/write.c b/fs/afs/write.c | ||
8290 | index cb76566763db..96b042af6248 100644 | ||
8291 | --- a/fs/afs/write.c | ||
8292 | +++ b/fs/afs/write.c | ||
8293 | @@ -194,11 +194,11 @@ int afs_write_end(struct file *file, struct address_space *mapping, | ||
8294 | |||
8295 | i_size = i_size_read(&vnode->vfs_inode); | ||
8296 | if (maybe_i_size > i_size) { | ||
8297 | - spin_lock(&vnode->wb_lock); | ||
8298 | + write_seqlock(&vnode->cb_lock); | ||
8299 | i_size = i_size_read(&vnode->vfs_inode); | ||
8300 | if (maybe_i_size > i_size) | ||
8301 | i_size_write(&vnode->vfs_inode, maybe_i_size); | ||
8302 | - spin_unlock(&vnode->wb_lock); | ||
8303 | + write_sequnlock(&vnode->cb_lock); | ||
8304 | } | ||
8305 | |||
8306 | if (!PageUptodate(page)) { | ||
8307 | @@ -811,6 +811,7 @@ vm_fault_t afs_page_mkwrite(struct vm_fault *vmf) | ||
8308 | vmf->page->index, priv); | ||
8309 | SetPagePrivate(vmf->page); | ||
8310 | set_page_private(vmf->page, priv); | ||
8311 | + file_update_time(file); | ||
8312 | |||
8313 | sb_end_pagefault(inode->i_sb); | ||
8314 | return VM_FAULT_LOCKED; | ||
8315 | diff --git a/fs/afs/yfsclient.c b/fs/afs/yfsclient.c | ||
8316 | index 8af7f093305d..d21cf61d86b9 100644 | ||
8317 | --- a/fs/afs/yfsclient.c | ||
8318 | +++ b/fs/afs/yfsclient.c | ||
8319 | @@ -179,21 +179,20 @@ static void xdr_dump_bad(const __be32 *bp) | ||
8320 | /* | ||
8321 | * Decode a YFSFetchStatus block | ||
8322 | */ | ||
8323 | -static int xdr_decode_YFSFetchStatus(const __be32 **_bp, | ||
8324 | - struct afs_call *call, | ||
8325 | - struct afs_status_cb *scb) | ||
8326 | +static void xdr_decode_YFSFetchStatus(const __be32 **_bp, | ||
8327 | + struct afs_call *call, | ||
8328 | + struct afs_status_cb *scb) | ||
8329 | { | ||
8330 | const struct yfs_xdr_YFSFetchStatus *xdr = (const void *)*_bp; | ||
8331 | struct afs_file_status *status = &scb->status; | ||
8332 | u32 type; | ||
8333 | - int ret; | ||
8334 | |||
8335 | status->abort_code = ntohl(xdr->abort_code); | ||
8336 | if (status->abort_code != 0) { | ||
8337 | if (status->abort_code == VNOVNODE) | ||
8338 | status->nlink = 0; | ||
8339 | scb->have_error = true; | ||
8340 | - goto good; | ||
8341 | + goto advance; | ||
8342 | } | ||
8343 | |||
8344 | type = ntohl(xdr->type); | ||
8345 | @@ -221,15 +220,13 @@ static int xdr_decode_YFSFetchStatus(const __be32 **_bp, | ||
8346 | status->size = xdr_to_u64(xdr->size); | ||
8347 | status->data_version = xdr_to_u64(xdr->data_version); | ||
8348 | scb->have_status = true; | ||
8349 | -good: | ||
8350 | - ret = 0; | ||
8351 | advance: | ||
8352 | *_bp += xdr_size(xdr); | ||
8353 | - return ret; | ||
8354 | + return; | ||
8355 | |||
8356 | bad: | ||
8357 | xdr_dump_bad(*_bp); | ||
8358 | - ret = afs_protocol_error(call, -EBADMSG, afs_eproto_bad_status); | ||
8359 | + afs_protocol_error(call, -EBADMSG, afs_eproto_bad_status); | ||
8360 | goto advance; | ||
8361 | } | ||
8362 | |||
8363 | @@ -348,9 +345,7 @@ static int yfs_deliver_fs_status_cb_and_volsync(struct afs_call *call) | ||
8364 | |||
8365 | /* unmarshall the reply once we've received all of it */ | ||
8366 | bp = call->buffer; | ||
8367 | - ret = xdr_decode_YFSFetchStatus(&bp, call, call->out_scb); | ||
8368 | - if (ret < 0) | ||
8369 | - return ret; | ||
8370 | + xdr_decode_YFSFetchStatus(&bp, call, call->out_scb); | ||
8371 | xdr_decode_YFSCallBack(&bp, call, call->out_scb); | ||
8372 | xdr_decode_YFSVolSync(&bp, call->out_volsync); | ||
8373 | |||
8374 | @@ -372,9 +367,7 @@ static int yfs_deliver_status_and_volsync(struct afs_call *call) | ||
8375 | return ret; | ||
8376 | |||
8377 | bp = call->buffer; | ||
8378 | - ret = xdr_decode_YFSFetchStatus(&bp, call, call->out_scb); | ||
8379 | - if (ret < 0) | ||
8380 | - return ret; | ||
8381 | + xdr_decode_YFSFetchStatus(&bp, call, call->out_scb); | ||
8382 | xdr_decode_YFSVolSync(&bp, call->out_volsync); | ||
8383 | |||
8384 | _leave(" = 0 [done]"); | ||
8385 | @@ -534,9 +527,7 @@ static int yfs_deliver_fs_fetch_data64(struct afs_call *call) | ||
8386 | return ret; | ||
8387 | |||
8388 | bp = call->buffer; | ||
8389 | - ret = xdr_decode_YFSFetchStatus(&bp, call, call->out_scb); | ||
8390 | - if (ret < 0) | ||
8391 | - return ret; | ||
8392 | + xdr_decode_YFSFetchStatus(&bp, call, call->out_scb); | ||
8393 | xdr_decode_YFSCallBack(&bp, call, call->out_scb); | ||
8394 | xdr_decode_YFSVolSync(&bp, call->out_volsync); | ||
8395 | |||
8396 | @@ -645,12 +636,8 @@ static int yfs_deliver_fs_create_vnode(struct afs_call *call) | ||
8397 | /* unmarshall the reply once we've received all of it */ | ||
8398 | bp = call->buffer; | ||
8399 | xdr_decode_YFSFid(&bp, call->out_fid); | ||
8400 | - ret = xdr_decode_YFSFetchStatus(&bp, call, call->out_scb); | ||
8401 | - if (ret < 0) | ||
8402 | - return ret; | ||
8403 | - ret = xdr_decode_YFSFetchStatus(&bp, call, call->out_dir_scb); | ||
8404 | - if (ret < 0) | ||
8405 | - return ret; | ||
8406 | + xdr_decode_YFSFetchStatus(&bp, call, call->out_scb); | ||
8407 | + xdr_decode_YFSFetchStatus(&bp, call, call->out_dir_scb); | ||
8408 | xdr_decode_YFSCallBack(&bp, call, call->out_scb); | ||
8409 | xdr_decode_YFSVolSync(&bp, call->out_volsync); | ||
8410 | |||
8411 | @@ -803,14 +790,9 @@ static int yfs_deliver_fs_remove_file2(struct afs_call *call) | ||
8412 | return ret; | ||
8413 | |||
8414 | bp = call->buffer; | ||
8415 | - ret = xdr_decode_YFSFetchStatus(&bp, call, call->out_dir_scb); | ||
8416 | - if (ret < 0) | ||
8417 | - return ret; | ||
8418 | - | ||
8419 | + xdr_decode_YFSFetchStatus(&bp, call, call->out_dir_scb); | ||
8420 | xdr_decode_YFSFid(&bp, &fid); | ||
8421 | - ret = xdr_decode_YFSFetchStatus(&bp, call, call->out_scb); | ||
8422 | - if (ret < 0) | ||
8423 | - return ret; | ||
8424 | + xdr_decode_YFSFetchStatus(&bp, call, call->out_scb); | ||
8425 | /* Was deleted if vnode->status.abort_code == VNOVNODE. */ | ||
8426 | |||
8427 | xdr_decode_YFSVolSync(&bp, call->out_volsync); | ||
8428 | @@ -890,10 +872,7 @@ static int yfs_deliver_fs_remove(struct afs_call *call) | ||
8429 | return ret; | ||
8430 | |||
8431 | bp = call->buffer; | ||
8432 | - ret = xdr_decode_YFSFetchStatus(&bp, call, call->out_dir_scb); | ||
8433 | - if (ret < 0) | ||
8434 | - return ret; | ||
8435 | - | ||
8436 | + xdr_decode_YFSFetchStatus(&bp, call, call->out_dir_scb); | ||
8437 | xdr_decode_YFSVolSync(&bp, call->out_volsync); | ||
8438 | return 0; | ||
8439 | } | ||
8440 | @@ -975,12 +954,8 @@ static int yfs_deliver_fs_link(struct afs_call *call) | ||
8441 | return ret; | ||
8442 | |||
8443 | bp = call->buffer; | ||
8444 | - ret = xdr_decode_YFSFetchStatus(&bp, call, call->out_scb); | ||
8445 | - if (ret < 0) | ||
8446 | - return ret; | ||
8447 | - ret = xdr_decode_YFSFetchStatus(&bp, call, call->out_dir_scb); | ||
8448 | - if (ret < 0) | ||
8449 | - return ret; | ||
8450 | + xdr_decode_YFSFetchStatus(&bp, call, call->out_scb); | ||
8451 | + xdr_decode_YFSFetchStatus(&bp, call, call->out_dir_scb); | ||
8452 | xdr_decode_YFSVolSync(&bp, call->out_volsync); | ||
8453 | _leave(" = 0 [done]"); | ||
8454 | return 0; | ||
8455 | @@ -1062,12 +1037,8 @@ static int yfs_deliver_fs_symlink(struct afs_call *call) | ||
8456 | /* unmarshall the reply once we've received all of it */ | ||
8457 | bp = call->buffer; | ||
8458 | xdr_decode_YFSFid(&bp, call->out_fid); | ||
8459 | - ret = xdr_decode_YFSFetchStatus(&bp, call, call->out_scb); | ||
8460 | - if (ret < 0) | ||
8461 | - return ret; | ||
8462 | - ret = xdr_decode_YFSFetchStatus(&bp, call, call->out_dir_scb); | ||
8463 | - if (ret < 0) | ||
8464 | - return ret; | ||
8465 | + xdr_decode_YFSFetchStatus(&bp, call, call->out_scb); | ||
8466 | + xdr_decode_YFSFetchStatus(&bp, call, call->out_dir_scb); | ||
8467 | xdr_decode_YFSVolSync(&bp, call->out_volsync); | ||
8468 | |||
8469 | _leave(" = 0 [done]"); | ||
8470 | @@ -1155,13 +1126,11 @@ static int yfs_deliver_fs_rename(struct afs_call *call) | ||
8471 | return ret; | ||
8472 | |||
8473 | bp = call->buffer; | ||
8474 | - ret = xdr_decode_YFSFetchStatus(&bp, call, call->out_dir_scb); | ||
8475 | - if (ret < 0) | ||
8476 | - return ret; | ||
8477 | - ret = xdr_decode_YFSFetchStatus(&bp, call, call->out_scb); | ||
8478 | - if (ret < 0) | ||
8479 | - return ret; | ||
8480 | - | ||
8481 | + /* If the two dirs are the same, we have two copies of the same status | ||
8482 | + * report, so we just decode it twice. | ||
8483 | + */ | ||
8484 | + xdr_decode_YFSFetchStatus(&bp, call, call->out_dir_scb); | ||
8485 | + xdr_decode_YFSFetchStatus(&bp, call, call->out_scb); | ||
8486 | xdr_decode_YFSVolSync(&bp, call->out_volsync); | ||
8487 | _leave(" = 0 [done]"); | ||
8488 | return 0; | ||
8489 | @@ -1846,9 +1815,7 @@ static int yfs_deliver_fs_inline_bulk_status(struct afs_call *call) | ||
8490 | |||
8491 | bp = call->buffer; | ||
8492 | scb = &call->out_scb[call->count]; | ||
8493 | - ret = xdr_decode_YFSFetchStatus(&bp, call, scb); | ||
8494 | - if (ret < 0) | ||
8495 | - return ret; | ||
8496 | + xdr_decode_YFSFetchStatus(&bp, call, scb); | ||
8497 | |||
8498 | call->count++; | ||
8499 | if (call->count < call->count2) | ||
8500 | @@ -2068,9 +2035,7 @@ static int yfs_deliver_fs_fetch_opaque_acl(struct afs_call *call) | ||
8501 | bp = call->buffer; | ||
8502 | yacl->inherit_flag = ntohl(*bp++); | ||
8503 | yacl->num_cleaned = ntohl(*bp++); | ||
8504 | - ret = xdr_decode_YFSFetchStatus(&bp, call, call->out_scb); | ||
8505 | - if (ret < 0) | ||
8506 | - return ret; | ||
8507 | + xdr_decode_YFSFetchStatus(&bp, call, call->out_scb); | ||
8508 | xdr_decode_YFSVolSync(&bp, call->out_volsync); | ||
8509 | |||
8510 | call->unmarshall++; | ||
8511 | diff --git a/fs/block_dev.c b/fs/block_dev.c | ||
8512 | index 34644ce4b502..2dc9c73a4cb2 100644 | ||
8513 | --- a/fs/block_dev.c | ||
8514 | +++ b/fs/block_dev.c | ||
8515 | @@ -1546,10 +1546,8 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part) | ||
8516 | */ | ||
8517 | if (!for_part) { | ||
8518 | ret = devcgroup_inode_permission(bdev->bd_inode, perm); | ||
8519 | - if (ret != 0) { | ||
8520 | - bdput(bdev); | ||
8521 | + if (ret != 0) | ||
8522 | return ret; | ||
8523 | - } | ||
8524 | } | ||
8525 | |||
8526 | restart: | ||
8527 | @@ -1618,8 +1616,10 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part) | ||
8528 | goto out_clear; | ||
8529 | BUG_ON(for_part); | ||
8530 | ret = __blkdev_get(whole, mode, 1); | ||
8531 | - if (ret) | ||
8532 | + if (ret) { | ||
8533 | + bdput(whole); | ||
8534 | goto out_clear; | ||
8535 | + } | ||
8536 | bdev->bd_contains = whole; | ||
8537 | bdev->bd_part = disk_get_part(disk, partno); | ||
8538 | if (!(disk->flags & GENHD_FL_UP) || | ||
8539 | @@ -1669,7 +1669,6 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part) | ||
8540 | disk_unblock_events(disk); | ||
8541 | put_disk_and_module(disk); | ||
8542 | out: | ||
8543 | - bdput(bdev); | ||
8544 | |||
8545 | return ret; | ||
8546 | } | ||
8547 | @@ -1736,6 +1735,9 @@ int blkdev_get(struct block_device *bdev, fmode_t mode, void *holder) | ||
8548 | bdput(whole); | ||
8549 | } | ||
8550 | |||
8551 | + if (res) | ||
8552 | + bdput(bdev); | ||
8553 | + | ||
8554 | return res; | ||
8555 | } | ||
8556 | EXPORT_SYMBOL(blkdev_get); | ||
8557 | diff --git a/fs/ceph/export.c b/fs/ceph/export.c | ||
8558 | index 79dc06881e78..e088843a7734 100644 | ||
8559 | --- a/fs/ceph/export.c | ||
8560 | +++ b/fs/ceph/export.c | ||
8561 | @@ -172,9 +172,16 @@ struct inode *ceph_lookup_inode(struct super_block *sb, u64 ino) | ||
8562 | static struct dentry *__fh_to_dentry(struct super_block *sb, u64 ino) | ||
8563 | { | ||
8564 | struct inode *inode = __lookup_inode(sb, ino); | ||
8565 | + int err; | ||
8566 | + | ||
8567 | if (IS_ERR(inode)) | ||
8568 | return ERR_CAST(inode); | ||
8569 | - if (inode->i_nlink == 0) { | ||
8570 | + /* We need LINK caps to reliably check i_nlink */ | ||
8571 | + err = ceph_do_getattr(inode, CEPH_CAP_LINK_SHARED, false); | ||
8572 | + if (err) | ||
8573 | + return ERR_PTR(err); | ||
8574 | + /* -ESTALE if inode as been unlinked and no file is open */ | ||
8575 | + if ((inode->i_nlink == 0) && (atomic_read(&inode->i_count) == 1)) { | ||
8576 | iput(inode); | ||
8577 | return ERR_PTR(-ESTALE); | ||
8578 | } | ||
8579 | diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c | ||
8580 | index 721b2560caa7..947c4aad5d6a 100644 | ||
8581 | --- a/fs/cifs/connect.c | ||
8582 | +++ b/fs/cifs/connect.c | ||
8583 | @@ -614,26 +614,26 @@ cifs_reconnect(struct TCP_Server_Info *server) | ||
8584 | try_to_freeze(); | ||
8585 | |||
8586 | mutex_lock(&server->srv_mutex); | ||
8587 | +#ifdef CONFIG_CIFS_DFS_UPCALL | ||
8588 | /* | ||
8589 | * Set up next DFS target server (if any) for reconnect. If DFS | ||
8590 | * feature is disabled, then we will retry last server we | ||
8591 | * connected to before. | ||
8592 | */ | ||
8593 | + reconn_inval_dfs_target(server, cifs_sb, &tgt_list, &tgt_it); | ||
8594 | +#endif | ||
8595 | + rc = reconn_set_ipaddr(server); | ||
8596 | + if (rc) { | ||
8597 | + cifs_dbg(FYI, "%s: failed to resolve hostname: %d\n", | ||
8598 | + __func__, rc); | ||
8599 | + } | ||
8600 | + | ||
8601 | if (cifs_rdma_enabled(server)) | ||
8602 | rc = smbd_reconnect(server); | ||
8603 | else | ||
8604 | rc = generic_ip_connect(server); | ||
8605 | if (rc) { | ||
8606 | cifs_dbg(FYI, "reconnect error %d\n", rc); | ||
8607 | -#ifdef CONFIG_CIFS_DFS_UPCALL | ||
8608 | - reconn_inval_dfs_target(server, cifs_sb, &tgt_list, | ||
8609 | - &tgt_it); | ||
8610 | -#endif | ||
8611 | - rc = reconn_set_ipaddr(server); | ||
8612 | - if (rc) { | ||
8613 | - cifs_dbg(FYI, "%s: failed to resolve hostname: %d\n", | ||
8614 | - __func__, rc); | ||
8615 | - } | ||
8616 | mutex_unlock(&server->srv_mutex); | ||
8617 | msleep(3000); | ||
8618 | } else { | ||
8619 | diff --git a/fs/dlm/dlm_internal.h b/fs/dlm/dlm_internal.h | ||
8620 | index 416d9de35679..4311d01b02a8 100644 | ||
8621 | --- a/fs/dlm/dlm_internal.h | ||
8622 | +++ b/fs/dlm/dlm_internal.h | ||
8623 | @@ -97,7 +97,6 @@ do { \ | ||
8624 | __LINE__, __FILE__, #x, jiffies); \ | ||
8625 | {do} \ | ||
8626 | printk("\n"); \ | ||
8627 | - BUG(); \ | ||
8628 | panic("DLM: Record message above and reboot.\n"); \ | ||
8629 | } \ | ||
8630 | } | ||
8631 | diff --git a/fs/ext4/dir.c b/fs/ext4/dir.c | ||
8632 | index 2743c6f8a457..0589e914663f 100644 | ||
8633 | --- a/fs/ext4/dir.c | ||
8634 | +++ b/fs/ext4/dir.c | ||
8635 | @@ -677,6 +677,7 @@ static int ext4_d_compare(const struct dentry *dentry, unsigned int len, | ||
8636 | struct qstr qstr = {.name = str, .len = len }; | ||
8637 | const struct dentry *parent = READ_ONCE(dentry->d_parent); | ||
8638 | const struct inode *inode = READ_ONCE(parent->d_inode); | ||
8639 | + char strbuf[DNAME_INLINE_LEN]; | ||
8640 | |||
8641 | if (!inode || !IS_CASEFOLDED(inode) || | ||
8642 | !EXT4_SB(inode->i_sb)->s_encoding) { | ||
8643 | @@ -685,6 +686,21 @@ static int ext4_d_compare(const struct dentry *dentry, unsigned int len, | ||
8644 | return memcmp(str, name->name, len); | ||
8645 | } | ||
8646 | |||
8647 | + /* | ||
8648 | + * If the dentry name is stored in-line, then it may be concurrently | ||
8649 | + * modified by a rename. If this happens, the VFS will eventually retry | ||
8650 | + * the lookup, so it doesn't matter what ->d_compare() returns. | ||
8651 | + * However, it's unsafe to call utf8_strncasecmp() with an unstable | ||
8652 | + * string. Therefore, we have to copy the name into a temporary buffer. | ||
8653 | + */ | ||
8654 | + if (len <= DNAME_INLINE_LEN - 1) { | ||
8655 | + memcpy(strbuf, str, len); | ||
8656 | + strbuf[len] = 0; | ||
8657 | + qstr.name = strbuf; | ||
8658 | + /* prevent compiler from optimizing out the temporary buffer */ | ||
8659 | + barrier(); | ||
8660 | + } | ||
8661 | + | ||
8662 | return ext4_ci_compare(inode, name, &qstr, false); | ||
8663 | } | ||
8664 | |||
8665 | diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c | ||
8666 | index 9bd44588eb77..3193f0b4a02d 100644 | ||
8667 | --- a/fs/ext4/extents.c | ||
8668 | +++ b/fs/ext4/extents.c | ||
8669 | @@ -3010,7 +3010,7 @@ again: | ||
8670 | * in use to avoid freeing it when removing blocks. | ||
8671 | */ | ||
8672 | if (sbi->s_cluster_ratio > 1) { | ||
8673 | - pblk = ext4_ext_pblock(ex) + end - ee_block + 2; | ||
8674 | + pblk = ext4_ext_pblock(ex) + end - ee_block + 1; | ||
8675 | partial.pclu = EXT4_B2C(sbi, pblk); | ||
8676 | partial.state = nofree; | ||
8677 | } | ||
8678 | diff --git a/fs/ext4/super.c b/fs/ext4/super.c | ||
8679 | index d3500eaf900e..f7c20bb20da3 100644 | ||
8680 | --- a/fs/ext4/super.c | ||
8681 | +++ b/fs/ext4/super.c | ||
8682 | @@ -2034,6 +2034,16 @@ static int handle_mount_opt(struct super_block *sb, char *opt, int token, | ||
8683 | #endif | ||
8684 | } else if (token == Opt_dax) { | ||
8685 | #ifdef CONFIG_FS_DAX | ||
8686 | + if (is_remount && test_opt(sb, DAX)) { | ||
8687 | + ext4_msg(sb, KERN_ERR, "can't mount with " | ||
8688 | + "both data=journal and dax"); | ||
8689 | + return -1; | ||
8690 | + } | ||
8691 | + if (is_remount && !(sbi->s_mount_opt & EXT4_MOUNT_DAX)) { | ||
8692 | + ext4_msg(sb, KERN_ERR, "can't change " | ||
8693 | + "dax mount option while remounting"); | ||
8694 | + return -1; | ||
8695 | + } | ||
8696 | ext4_msg(sb, KERN_WARNING, | ||
8697 | "DAX enabled. Warning: EXPERIMENTAL, use at your own risk"); | ||
8698 | sbi->s_mount_opt |= m->mount_opt; | ||
8699 | @@ -2294,6 +2304,7 @@ static int ext4_setup_super(struct super_block *sb, struct ext4_super_block *es, | ||
8700 | ext4_msg(sb, KERN_ERR, "revision level too high, " | ||
8701 | "forcing read-only mode"); | ||
8702 | err = -EROFS; | ||
8703 | + goto done; | ||
8704 | } | ||
8705 | if (read_only) | ||
8706 | goto done; | ||
8707 | @@ -5366,12 +5377,6 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data) | ||
8708 | err = -EINVAL; | ||
8709 | goto restore_opts; | ||
8710 | } | ||
8711 | - if (test_opt(sb, DAX)) { | ||
8712 | - ext4_msg(sb, KERN_ERR, "can't mount with " | ||
8713 | - "both data=journal and dax"); | ||
8714 | - err = -EINVAL; | ||
8715 | - goto restore_opts; | ||
8716 | - } | ||
8717 | } else if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_ORDERED_DATA) { | ||
8718 | if (test_opt(sb, JOURNAL_ASYNC_COMMIT)) { | ||
8719 | ext4_msg(sb, KERN_ERR, "can't mount with " | ||
8720 | @@ -5387,12 +5392,6 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data) | ||
8721 | goto restore_opts; | ||
8722 | } | ||
8723 | |||
8724 | - if ((sbi->s_mount_opt ^ old_opts.s_mount_opt) & EXT4_MOUNT_DAX) { | ||
8725 | - ext4_msg(sb, KERN_WARNING, "warning: refusing change of " | ||
8726 | - "dax flag with busy inodes while remounting"); | ||
8727 | - sbi->s_mount_opt ^= EXT4_MOUNT_DAX; | ||
8728 | - } | ||
8729 | - | ||
8730 | if (sbi->s_mount_flags & EXT4_MF_FS_ABORTED) | ||
8731 | ext4_abort(sb, "Abort forced by user"); | ||
8732 | |||
8733 | diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c | ||
8734 | index a28ffecc0f95..bbd07fe8a492 100644 | ||
8735 | --- a/fs/f2fs/checkpoint.c | ||
8736 | +++ b/fs/f2fs/checkpoint.c | ||
8737 | @@ -892,8 +892,8 @@ int f2fs_get_valid_checkpoint(struct f2fs_sb_info *sbi) | ||
8738 | int i; | ||
8739 | int err; | ||
8740 | |||
8741 | - sbi->ckpt = f2fs_kzalloc(sbi, array_size(blk_size, cp_blks), | ||
8742 | - GFP_KERNEL); | ||
8743 | + sbi->ckpt = f2fs_kvzalloc(sbi, array_size(blk_size, cp_blks), | ||
8744 | + GFP_KERNEL); | ||
8745 | if (!sbi->ckpt) | ||
8746 | return -ENOMEM; | ||
8747 | /* | ||
8748 | diff --git a/fs/f2fs/dir.c b/fs/f2fs/dir.c | ||
8749 | index 84280ad3786c..e9af46dc06f7 100644 | ||
8750 | --- a/fs/f2fs/dir.c | ||
8751 | +++ b/fs/f2fs/dir.c | ||
8752 | @@ -107,36 +107,28 @@ static struct f2fs_dir_entry *find_in_block(struct inode *dir, | ||
8753 | /* | ||
8754 | * Test whether a case-insensitive directory entry matches the filename | ||
8755 | * being searched for. | ||
8756 | - * | ||
8757 | - * Returns: 0 if the directory entry matches, more than 0 if it | ||
8758 | - * doesn't match or less than zero on error. | ||
8759 | */ | ||
8760 | -int f2fs_ci_compare(const struct inode *parent, const struct qstr *name, | ||
8761 | - const struct qstr *entry, bool quick) | ||
8762 | +static bool f2fs_match_ci_name(const struct inode *dir, const struct qstr *name, | ||
8763 | + const struct qstr *entry, bool quick) | ||
8764 | { | ||
8765 | - const struct f2fs_sb_info *sbi = F2FS_SB(parent->i_sb); | ||
8766 | + const struct f2fs_sb_info *sbi = F2FS_SB(dir->i_sb); | ||
8767 | const struct unicode_map *um = sbi->s_encoding; | ||
8768 | - int ret; | ||
8769 | + int res; | ||
8770 | |||
8771 | if (quick) | ||
8772 | - ret = utf8_strncasecmp_folded(um, name, entry); | ||
8773 | + res = utf8_strncasecmp_folded(um, name, entry); | ||
8774 | else | ||
8775 | - ret = utf8_strncasecmp(um, name, entry); | ||
8776 | - | ||
8777 | - if (ret < 0) { | ||
8778 | - /* Handle invalid character sequence as either an error | ||
8779 | - * or as an opaque byte sequence. | ||
8780 | + res = utf8_strncasecmp(um, name, entry); | ||
8781 | + if (res < 0) { | ||
8782 | + /* | ||
8783 | + * In strict mode, ignore invalid names. In non-strict mode, | ||
8784 | + * fall back to treating them as opaque byte sequences. | ||
8785 | */ | ||
8786 | - if (f2fs_has_strict_mode(sbi)) | ||
8787 | - return -EINVAL; | ||
8788 | - | ||
8789 | - if (name->len != entry->len) | ||
8790 | - return 1; | ||
8791 | - | ||
8792 | - return !!memcmp(name->name, entry->name, name->len); | ||
8793 | + if (f2fs_has_strict_mode(sbi) || name->len != entry->len) | ||
8794 | + return false; | ||
8795 | + return !memcmp(name->name, entry->name, name->len); | ||
8796 | } | ||
8797 | - | ||
8798 | - return ret; | ||
8799 | + return res == 0; | ||
8800 | } | ||
8801 | |||
8802 | static void f2fs_fname_setup_ci_filename(struct inode *dir, | ||
8803 | @@ -188,10 +180,10 @@ static inline bool f2fs_match_name(struct f2fs_dentry_ptr *d, | ||
8804 | if (cf_str->name) { | ||
8805 | struct qstr cf = {.name = cf_str->name, | ||
8806 | .len = cf_str->len}; | ||
8807 | - return !f2fs_ci_compare(parent, &cf, &entry, true); | ||
8808 | + return f2fs_match_ci_name(parent, &cf, &entry, true); | ||
8809 | } | ||
8810 | - return !f2fs_ci_compare(parent, fname->usr_fname, &entry, | ||
8811 | - false); | ||
8812 | + return f2fs_match_ci_name(parent, fname->usr_fname, &entry, | ||
8813 | + false); | ||
8814 | } | ||
8815 | #endif | ||
8816 | if (fscrypt_match_name(fname, d->filename[bit_pos], | ||
8817 | @@ -1067,17 +1059,41 @@ const struct file_operations f2fs_dir_operations = { | ||
8818 | static int f2fs_d_compare(const struct dentry *dentry, unsigned int len, | ||
8819 | const char *str, const struct qstr *name) | ||
8820 | { | ||
8821 | - struct qstr qstr = {.name = str, .len = len }; | ||
8822 | const struct dentry *parent = READ_ONCE(dentry->d_parent); | ||
8823 | - const struct inode *inode = READ_ONCE(parent->d_inode); | ||
8824 | + const struct inode *dir = READ_ONCE(parent->d_inode); | ||
8825 | + const struct f2fs_sb_info *sbi = F2FS_SB(dentry->d_sb); | ||
8826 | + struct qstr entry = QSTR_INIT(str, len); | ||
8827 | + char strbuf[DNAME_INLINE_LEN]; | ||
8828 | + int res; | ||
8829 | + | ||
8830 | + if (!dir || !IS_CASEFOLDED(dir)) | ||
8831 | + goto fallback; | ||
8832 | |||
8833 | - if (!inode || !IS_CASEFOLDED(inode)) { | ||
8834 | - if (len != name->len) | ||
8835 | - return -1; | ||
8836 | - return memcmp(str, name->name, len); | ||
8837 | + /* | ||
8838 | + * If the dentry name is stored in-line, then it may be concurrently | ||
8839 | + * modified by a rename. If this happens, the VFS will eventually retry | ||
8840 | + * the lookup, so it doesn't matter what ->d_compare() returns. | ||
8841 | + * However, it's unsafe to call utf8_strncasecmp() with an unstable | ||
8842 | + * string. Therefore, we have to copy the name into a temporary buffer. | ||
8843 | + */ | ||
8844 | + if (len <= DNAME_INLINE_LEN - 1) { | ||
8845 | + memcpy(strbuf, str, len); | ||
8846 | + strbuf[len] = 0; | ||
8847 | + entry.name = strbuf; | ||
8848 | + /* prevent compiler from optimizing out the temporary buffer */ | ||
8849 | + barrier(); | ||
8850 | } | ||
8851 | |||
8852 | - return f2fs_ci_compare(inode, name, &qstr, false); | ||
8853 | + res = utf8_strncasecmp(sbi->s_encoding, name, &entry); | ||
8854 | + if (res >= 0) | ||
8855 | + return res; | ||
8856 | + | ||
8857 | + if (f2fs_has_strict_mode(sbi)) | ||
8858 | + return -EINVAL; | ||
8859 | +fallback: | ||
8860 | + if (len != name->len) | ||
8861 | + return 1; | ||
8862 | + return !!memcmp(str, name->name, len); | ||
8863 | } | ||
8864 | |||
8865 | static int f2fs_d_hash(const struct dentry *dentry, struct qstr *str) | ||
8866 | diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h | ||
8867 | index a26ea1e6ba88..03693d6b1c10 100644 | ||
8868 | --- a/fs/f2fs/f2fs.h | ||
8869 | +++ b/fs/f2fs/f2fs.h | ||
8870 | @@ -2790,18 +2790,12 @@ static inline bool f2fs_may_extent_tree(struct inode *inode) | ||
8871 | static inline void *f2fs_kmalloc(struct f2fs_sb_info *sbi, | ||
8872 | size_t size, gfp_t flags) | ||
8873 | { | ||
8874 | - void *ret; | ||
8875 | - | ||
8876 | if (time_to_inject(sbi, FAULT_KMALLOC)) { | ||
8877 | f2fs_show_injection_info(FAULT_KMALLOC); | ||
8878 | return NULL; | ||
8879 | } | ||
8880 | |||
8881 | - ret = kmalloc(size, flags); | ||
8882 | - if (ret) | ||
8883 | - return ret; | ||
8884 | - | ||
8885 | - return kvmalloc(size, flags); | ||
8886 | + return kmalloc(size, flags); | ||
8887 | } | ||
8888 | |||
8889 | static inline void *f2fs_kzalloc(struct f2fs_sb_info *sbi, | ||
8890 | @@ -2960,11 +2954,6 @@ int f2fs_update_extension_list(struct f2fs_sb_info *sbi, const char *name, | ||
8891 | bool hot, bool set); | ||
8892 | struct dentry *f2fs_get_parent(struct dentry *child); | ||
8893 | |||
8894 | -extern int f2fs_ci_compare(const struct inode *parent, | ||
8895 | - const struct qstr *name, | ||
8896 | - const struct qstr *entry, | ||
8897 | - bool quick); | ||
8898 | - | ||
8899 | /* | ||
8900 | * dir.c | ||
8901 | */ | ||
8902 | diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c | ||
8903 | index c3a9da79ac99..5d94abe467a4 100644 | ||
8904 | --- a/fs/f2fs/file.c | ||
8905 | +++ b/fs/f2fs/file.c | ||
8906 | @@ -2056,8 +2056,15 @@ static int f2fs_ioc_shutdown(struct file *filp, unsigned long arg) | ||
8907 | |||
8908 | if (in != F2FS_GOING_DOWN_FULLSYNC) { | ||
8909 | ret = mnt_want_write_file(filp); | ||
8910 | - if (ret) | ||
8911 | + if (ret) { | ||
8912 | + if (ret == -EROFS) { | ||
8913 | + ret = 0; | ||
8914 | + f2fs_stop_checkpoint(sbi, false); | ||
8915 | + set_sbi_flag(sbi, SBI_IS_SHUTDOWN); | ||
8916 | + trace_f2fs_shutdown(sbi, in, ret); | ||
8917 | + } | ||
8918 | return ret; | ||
8919 | + } | ||
8920 | } | ||
8921 | |||
8922 | switch (in) { | ||
8923 | diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c | ||
8924 | index f14401a77d60..90a20bd12961 100644 | ||
8925 | --- a/fs/f2fs/node.c | ||
8926 | +++ b/fs/f2fs/node.c | ||
8927 | @@ -2933,7 +2933,7 @@ static int __get_nat_bitmaps(struct f2fs_sb_info *sbi) | ||
8928 | return 0; | ||
8929 | |||
8930 | nm_i->nat_bits_blocks = F2FS_BLK_ALIGN((nat_bits_bytes << 1) + 8); | ||
8931 | - nm_i->nat_bits = f2fs_kzalloc(sbi, | ||
8932 | + nm_i->nat_bits = f2fs_kvzalloc(sbi, | ||
8933 | nm_i->nat_bits_blocks << F2FS_BLKSIZE_BITS, GFP_KERNEL); | ||
8934 | if (!nm_i->nat_bits) | ||
8935 | return -ENOMEM; | ||
8936 | @@ -3066,9 +3066,9 @@ static int init_free_nid_cache(struct f2fs_sb_info *sbi) | ||
8937 | int i; | ||
8938 | |||
8939 | nm_i->free_nid_bitmap = | ||
8940 | - f2fs_kzalloc(sbi, array_size(sizeof(unsigned char *), | ||
8941 | - nm_i->nat_blocks), | ||
8942 | - GFP_KERNEL); | ||
8943 | + f2fs_kvzalloc(sbi, array_size(sizeof(unsigned char *), | ||
8944 | + nm_i->nat_blocks), | ||
8945 | + GFP_KERNEL); | ||
8946 | if (!nm_i->free_nid_bitmap) | ||
8947 | return -ENOMEM; | ||
8948 | |||
8949 | diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c | ||
8950 | index e36543c9f2b7..f4b882ee48dd 100644 | ||
8951 | --- a/fs/f2fs/super.c | ||
8952 | +++ b/fs/f2fs/super.c | ||
8953 | @@ -1230,7 +1230,8 @@ static int f2fs_statfs_project(struct super_block *sb, | ||
8954 | limit >>= sb->s_blocksize_bits; | ||
8955 | |||
8956 | if (limit && buf->f_blocks > limit) { | ||
8957 | - curblock = dquot->dq_dqb.dqb_curspace >> sb->s_blocksize_bits; | ||
8958 | + curblock = (dquot->dq_dqb.dqb_curspace + | ||
8959 | + dquot->dq_dqb.dqb_rsvspace) >> sb->s_blocksize_bits; | ||
8960 | buf->f_blocks = limit; | ||
8961 | buf->f_bfree = buf->f_bavail = | ||
8962 | (buf->f_blocks > curblock) ? | ||
8963 | @@ -2900,7 +2901,7 @@ static int init_blkz_info(struct f2fs_sb_info *sbi, int devi) | ||
8964 | if (nr_sectors & (bdev_zone_sectors(bdev) - 1)) | ||
8965 | FDEV(devi).nr_blkz++; | ||
8966 | |||
8967 | - FDEV(devi).blkz_seq = f2fs_kzalloc(sbi, | ||
8968 | + FDEV(devi).blkz_seq = f2fs_kvzalloc(sbi, | ||
8969 | BITS_TO_LONGS(FDEV(devi).nr_blkz) | ||
8970 | * sizeof(unsigned long), | ||
8971 | GFP_KERNEL); | ||
8972 | diff --git a/fs/fuse/file.c b/fs/fuse/file.c | ||
8973 | index 3dd37a998ea9..66214707a945 100644 | ||
8974 | --- a/fs/fuse/file.c | ||
8975 | +++ b/fs/fuse/file.c | ||
8976 | @@ -712,6 +712,7 @@ static ssize_t fuse_async_req_send(struct fuse_conn *fc, | ||
8977 | spin_unlock(&io->lock); | ||
8978 | |||
8979 | ia->ap.args.end = fuse_aio_complete_req; | ||
8980 | + ia->ap.args.may_block = io->should_dirty; | ||
8981 | err = fuse_simple_background(fc, &ia->ap.args, GFP_KERNEL); | ||
8982 | if (err) | ||
8983 | fuse_aio_complete_req(fc, &ia->ap.args, err); | ||
8984 | @@ -3279,13 +3280,11 @@ static ssize_t __fuse_copy_file_range(struct file *file_in, loff_t pos_in, | ||
8985 | if (file_inode(file_in)->i_sb != file_inode(file_out)->i_sb) | ||
8986 | return -EXDEV; | ||
8987 | |||
8988 | - if (fc->writeback_cache) { | ||
8989 | - inode_lock(inode_in); | ||
8990 | - err = fuse_writeback_range(inode_in, pos_in, pos_in + len); | ||
8991 | - inode_unlock(inode_in); | ||
8992 | - if (err) | ||
8993 | - return err; | ||
8994 | - } | ||
8995 | + inode_lock(inode_in); | ||
8996 | + err = fuse_writeback_range(inode_in, pos_in, pos_in + len - 1); | ||
8997 | + inode_unlock(inode_in); | ||
8998 | + if (err) | ||
8999 | + return err; | ||
9000 | |||
9001 | inode_lock(inode_out); | ||
9002 | |||
9003 | @@ -3293,11 +3292,27 @@ static ssize_t __fuse_copy_file_range(struct file *file_in, loff_t pos_in, | ||
9004 | if (err) | ||
9005 | goto out; | ||
9006 | |||
9007 | - if (fc->writeback_cache) { | ||
9008 | - err = fuse_writeback_range(inode_out, pos_out, pos_out + len); | ||
9009 | - if (err) | ||
9010 | - goto out; | ||
9011 | - } | ||
9012 | + /* | ||
9013 | + * Write out dirty pages in the destination file before sending the COPY | ||
9014 | + * request to userspace. After the request is completed, truncate off | ||
9015 | + * pages (including partial ones) from the cache that have been copied, | ||
9016 | + * since these contain stale data at that point. | ||
9017 | + * | ||
9018 | + * This should be mostly correct, but if the COPY writes to partial | ||
9019 | + * pages (at the start or end) and the parts not covered by the COPY are | ||
9020 | + * written through a memory map after calling fuse_writeback_range(), | ||
9021 | + * then these partial page modifications will be lost on truncation. | ||
9022 | + * | ||
9023 | + * It is unlikely that someone would rely on such mixed style | ||
9024 | + * modifications. Yet this does give less guarantees than if the | ||
9025 | + * copying was performed with write(2). | ||
9026 | + * | ||
9027 | + * To fix this a i_mmap_sem style lock could be used to prevent new | ||
9028 | + * faults while the copy is ongoing. | ||
9029 | + */ | ||
9030 | + err = fuse_writeback_range(inode_out, pos_out, pos_out + len - 1); | ||
9031 | + if (err) | ||
9032 | + goto out; | ||
9033 | |||
9034 | if (is_unstable) | ||
9035 | set_bit(FUSE_I_SIZE_UNSTABLE, &fi_out->state); | ||
9036 | @@ -3318,6 +3333,10 @@ static ssize_t __fuse_copy_file_range(struct file *file_in, loff_t pos_in, | ||
9037 | if (err) | ||
9038 | goto out; | ||
9039 | |||
9040 | + truncate_inode_pages_range(inode_out->i_mapping, | ||
9041 | + ALIGN_DOWN(pos_out, PAGE_SIZE), | ||
9042 | + ALIGN(pos_out + outarg.size, PAGE_SIZE) - 1); | ||
9043 | + | ||
9044 | if (fc->writeback_cache) { | ||
9045 | fuse_write_update_size(inode_out, pos_out + outarg.size); | ||
9046 | file_update_time(file_out); | ||
9047 | diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h | ||
9048 | index ca344bf71404..d7cde216fc87 100644 | ||
9049 | --- a/fs/fuse/fuse_i.h | ||
9050 | +++ b/fs/fuse/fuse_i.h | ||
9051 | @@ -249,6 +249,7 @@ struct fuse_args { | ||
9052 | bool out_argvar:1; | ||
9053 | bool page_zeroing:1; | ||
9054 | bool page_replace:1; | ||
9055 | + bool may_block:1; | ||
9056 | struct fuse_in_arg in_args[3]; | ||
9057 | struct fuse_arg out_args[2]; | ||
9058 | void (*end)(struct fuse_conn *fc, struct fuse_args *args, int error); | ||
9059 | diff --git a/fs/fuse/virtio_fs.c b/fs/fuse/virtio_fs.c | ||
9060 | index a5c86048b96e..7505f8102762 100644 | ||
9061 | --- a/fs/fuse/virtio_fs.c | ||
9062 | +++ b/fs/fuse/virtio_fs.c | ||
9063 | @@ -55,6 +55,12 @@ struct virtio_fs_forget { | ||
9064 | struct list_head list; | ||
9065 | }; | ||
9066 | |||
9067 | +struct virtio_fs_req_work { | ||
9068 | + struct fuse_req *req; | ||
9069 | + struct virtio_fs_vq *fsvq; | ||
9070 | + struct work_struct done_work; | ||
9071 | +}; | ||
9072 | + | ||
9073 | static int virtio_fs_enqueue_req(struct virtio_fs_vq *fsvq, | ||
9074 | struct fuse_req *req, bool in_flight); | ||
9075 | |||
9076 | @@ -443,19 +449,67 @@ static void copy_args_from_argbuf(struct fuse_args *args, struct fuse_req *req) | ||
9077 | } | ||
9078 | |||
9079 | /* Work function for request completion */ | ||
9080 | +static void virtio_fs_request_complete(struct fuse_req *req, | ||
9081 | + struct virtio_fs_vq *fsvq) | ||
9082 | +{ | ||
9083 | + struct fuse_pqueue *fpq = &fsvq->fud->pq; | ||
9084 | + struct fuse_conn *fc = fsvq->fud->fc; | ||
9085 | + struct fuse_args *args; | ||
9086 | + struct fuse_args_pages *ap; | ||
9087 | + unsigned int len, i, thislen; | ||
9088 | + struct page *page; | ||
9089 | + | ||
9090 | + /* | ||
9091 | + * TODO verify that server properly follows FUSE protocol | ||
9092 | + * (oh.uniq, oh.len) | ||
9093 | + */ | ||
9094 | + args = req->args; | ||
9095 | + copy_args_from_argbuf(args, req); | ||
9096 | + | ||
9097 | + if (args->out_pages && args->page_zeroing) { | ||
9098 | + len = args->out_args[args->out_numargs - 1].size; | ||
9099 | + ap = container_of(args, typeof(*ap), args); | ||
9100 | + for (i = 0; i < ap->num_pages; i++) { | ||
9101 | + thislen = ap->descs[i].length; | ||
9102 | + if (len < thislen) { | ||
9103 | + WARN_ON(ap->descs[i].offset); | ||
9104 | + page = ap->pages[i]; | ||
9105 | + zero_user_segment(page, len, thislen); | ||
9106 | + len = 0; | ||
9107 | + } else { | ||
9108 | + len -= thislen; | ||
9109 | + } | ||
9110 | + } | ||
9111 | + } | ||
9112 | + | ||
9113 | + spin_lock(&fpq->lock); | ||
9114 | + clear_bit(FR_SENT, &req->flags); | ||
9115 | + spin_unlock(&fpq->lock); | ||
9116 | + | ||
9117 | + fuse_request_end(fc, req); | ||
9118 | + spin_lock(&fsvq->lock); | ||
9119 | + dec_in_flight_req(fsvq); | ||
9120 | + spin_unlock(&fsvq->lock); | ||
9121 | +} | ||
9122 | + | ||
9123 | +static void virtio_fs_complete_req_work(struct work_struct *work) | ||
9124 | +{ | ||
9125 | + struct virtio_fs_req_work *w = | ||
9126 | + container_of(work, typeof(*w), done_work); | ||
9127 | + | ||
9128 | + virtio_fs_request_complete(w->req, w->fsvq); | ||
9129 | + kfree(w); | ||
9130 | +} | ||
9131 | + | ||
9132 | static void virtio_fs_requests_done_work(struct work_struct *work) | ||
9133 | { | ||
9134 | struct virtio_fs_vq *fsvq = container_of(work, struct virtio_fs_vq, | ||
9135 | done_work); | ||
9136 | struct fuse_pqueue *fpq = &fsvq->fud->pq; | ||
9137 | - struct fuse_conn *fc = fsvq->fud->fc; | ||
9138 | struct virtqueue *vq = fsvq->vq; | ||
9139 | struct fuse_req *req; | ||
9140 | - struct fuse_args_pages *ap; | ||
9141 | struct fuse_req *next; | ||
9142 | - struct fuse_args *args; | ||
9143 | - unsigned int len, i, thislen; | ||
9144 | - struct page *page; | ||
9145 | + unsigned int len; | ||
9146 | LIST_HEAD(reqs); | ||
9147 | |||
9148 | /* Collect completed requests off the virtqueue */ | ||
9149 | @@ -473,38 +527,20 @@ static void virtio_fs_requests_done_work(struct work_struct *work) | ||
9150 | |||
9151 | /* End requests */ | ||
9152 | list_for_each_entry_safe(req, next, &reqs, list) { | ||
9153 | - /* | ||
9154 | - * TODO verify that server properly follows FUSE protocol | ||
9155 | - * (oh.uniq, oh.len) | ||
9156 | - */ | ||
9157 | - args = req->args; | ||
9158 | - copy_args_from_argbuf(args, req); | ||
9159 | - | ||
9160 | - if (args->out_pages && args->page_zeroing) { | ||
9161 | - len = args->out_args[args->out_numargs - 1].size; | ||
9162 | - ap = container_of(args, typeof(*ap), args); | ||
9163 | - for (i = 0; i < ap->num_pages; i++) { | ||
9164 | - thislen = ap->descs[i].length; | ||
9165 | - if (len < thislen) { | ||
9166 | - WARN_ON(ap->descs[i].offset); | ||
9167 | - page = ap->pages[i]; | ||
9168 | - zero_user_segment(page, len, thislen); | ||
9169 | - len = 0; | ||
9170 | - } else { | ||
9171 | - len -= thislen; | ||
9172 | - } | ||
9173 | - } | ||
9174 | - } | ||
9175 | - | ||
9176 | - spin_lock(&fpq->lock); | ||
9177 | - clear_bit(FR_SENT, &req->flags); | ||
9178 | list_del_init(&req->list); | ||
9179 | - spin_unlock(&fpq->lock); | ||
9180 | |||
9181 | - fuse_request_end(fc, req); | ||
9182 | - spin_lock(&fsvq->lock); | ||
9183 | - dec_in_flight_req(fsvq); | ||
9184 | - spin_unlock(&fsvq->lock); | ||
9185 | + /* blocking async request completes in a worker context */ | ||
9186 | + if (req->args->may_block) { | ||
9187 | + struct virtio_fs_req_work *w; | ||
9188 | + | ||
9189 | + w = kzalloc(sizeof(*w), GFP_NOFS | __GFP_NOFAIL); | ||
9190 | + INIT_WORK(&w->done_work, virtio_fs_complete_req_work); | ||
9191 | + w->fsvq = fsvq; | ||
9192 | + w->req = req; | ||
9193 | + schedule_work(&w->done_work); | ||
9194 | + } else { | ||
9195 | + virtio_fs_request_complete(req, fsvq); | ||
9196 | + } | ||
9197 | } | ||
9198 | } | ||
9199 | |||
9200 | diff --git a/fs/gfs2/log.c b/fs/gfs2/log.c | ||
9201 | index 110e5c4db819..a4b6a49462a4 100644 | ||
9202 | --- a/fs/gfs2/log.c | ||
9203 | +++ b/fs/gfs2/log.c | ||
9204 | @@ -881,8 +881,10 @@ void gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl, u32 flags) | ||
9205 | * @new: New transaction to be merged | ||
9206 | */ | ||
9207 | |||
9208 | -static void gfs2_merge_trans(struct gfs2_trans *old, struct gfs2_trans *new) | ||
9209 | +static void gfs2_merge_trans(struct gfs2_sbd *sdp, struct gfs2_trans *new) | ||
9210 | { | ||
9211 | + struct gfs2_trans *old = sdp->sd_log_tr; | ||
9212 | + | ||
9213 | WARN_ON_ONCE(!test_bit(TR_ATTACHED, &old->tr_flags)); | ||
9214 | |||
9215 | old->tr_num_buf_new += new->tr_num_buf_new; | ||
9216 | @@ -893,6 +895,11 @@ static void gfs2_merge_trans(struct gfs2_trans *old, struct gfs2_trans *new) | ||
9217 | |||
9218 | list_splice_tail_init(&new->tr_databuf, &old->tr_databuf); | ||
9219 | list_splice_tail_init(&new->tr_buf, &old->tr_buf); | ||
9220 | + | ||
9221 | + spin_lock(&sdp->sd_ail_lock); | ||
9222 | + list_splice_tail_init(&new->tr_ail1_list, &old->tr_ail1_list); | ||
9223 | + list_splice_tail_init(&new->tr_ail2_list, &old->tr_ail2_list); | ||
9224 | + spin_unlock(&sdp->sd_ail_lock); | ||
9225 | } | ||
9226 | |||
9227 | static void log_refund(struct gfs2_sbd *sdp, struct gfs2_trans *tr) | ||
9228 | @@ -904,7 +911,7 @@ static void log_refund(struct gfs2_sbd *sdp, struct gfs2_trans *tr) | ||
9229 | gfs2_log_lock(sdp); | ||
9230 | |||
9231 | if (sdp->sd_log_tr) { | ||
9232 | - gfs2_merge_trans(sdp->sd_log_tr, tr); | ||
9233 | + gfs2_merge_trans(sdp, tr); | ||
9234 | } else if (tr->tr_num_buf_new || tr->tr_num_databuf_new) { | ||
9235 | gfs2_assert_withdraw(sdp, test_bit(TR_ALLOCED, &tr->tr_flags)); | ||
9236 | sdp->sd_log_tr = tr; | ||
9237 | diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c | ||
9238 | index 18daf494abab..c26c864590cc 100644 | ||
9239 | --- a/fs/gfs2/ops_fstype.c | ||
9240 | +++ b/fs/gfs2/ops_fstype.c | ||
9241 | @@ -911,7 +911,7 @@ fail: | ||
9242 | } | ||
9243 | |||
9244 | static const match_table_t nolock_tokens = { | ||
9245 | - { Opt_jid, "jid=%d\n", }, | ||
9246 | + { Opt_jid, "jid=%d", }, | ||
9247 | { Opt_err, NULL }, | ||
9248 | }; | ||
9249 | |||
9250 | diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c | ||
9251 | index c1ce2805c563..fa58835668a6 100644 | ||
9252 | --- a/fs/jbd2/journal.c | ||
9253 | +++ b/fs/jbd2/journal.c | ||
9254 | @@ -96,7 +96,6 @@ EXPORT_SYMBOL(jbd2_journal_release_jbd_inode); | ||
9255 | EXPORT_SYMBOL(jbd2_journal_begin_ordered_truncate); | ||
9256 | EXPORT_SYMBOL(jbd2_inode_cache); | ||
9257 | |||
9258 | -static void __journal_abort_soft (journal_t *journal, int errno); | ||
9259 | static int jbd2_journal_create_slab(size_t slab_size); | ||
9260 | |||
9261 | #ifdef CONFIG_JBD2_DEBUG | ||
9262 | @@ -805,7 +804,7 @@ int jbd2_journal_bmap(journal_t *journal, unsigned long blocknr, | ||
9263 | "at offset %lu on %s\n", | ||
9264 | __func__, blocknr, journal->j_devname); | ||
9265 | err = -EIO; | ||
9266 | - __journal_abort_soft(journal, err); | ||
9267 | + jbd2_journal_abort(journal, err); | ||
9268 | } | ||
9269 | } else { | ||
9270 | *retp = blocknr; /* +journal->j_blk_offset */ | ||
9271 | @@ -2070,64 +2069,6 @@ int jbd2_journal_wipe(journal_t *journal, int write) | ||
9272 | return err; | ||
9273 | } | ||
9274 | |||
9275 | -/* | ||
9276 | - * Journal abort has very specific semantics, which we describe | ||
9277 | - * for journal abort. | ||
9278 | - * | ||
9279 | - * Two internal functions, which provide abort to the jbd layer | ||
9280 | - * itself are here. | ||
9281 | - */ | ||
9282 | - | ||
9283 | -/* | ||
9284 | - * Quick version for internal journal use (doesn't lock the journal). | ||
9285 | - * Aborts hard --- we mark the abort as occurred, but do _nothing_ else, | ||
9286 | - * and don't attempt to make any other journal updates. | ||
9287 | - */ | ||
9288 | -void __jbd2_journal_abort_hard(journal_t *journal) | ||
9289 | -{ | ||
9290 | - transaction_t *transaction; | ||
9291 | - | ||
9292 | - if (journal->j_flags & JBD2_ABORT) | ||
9293 | - return; | ||
9294 | - | ||
9295 | - printk(KERN_ERR "Aborting journal on device %s.\n", | ||
9296 | - journal->j_devname); | ||
9297 | - | ||
9298 | - write_lock(&journal->j_state_lock); | ||
9299 | - journal->j_flags |= JBD2_ABORT; | ||
9300 | - transaction = journal->j_running_transaction; | ||
9301 | - if (transaction) | ||
9302 | - __jbd2_log_start_commit(journal, transaction->t_tid); | ||
9303 | - write_unlock(&journal->j_state_lock); | ||
9304 | -} | ||
9305 | - | ||
9306 | -/* Soft abort: record the abort error status in the journal superblock, | ||
9307 | - * but don't do any other IO. */ | ||
9308 | -static void __journal_abort_soft (journal_t *journal, int errno) | ||
9309 | -{ | ||
9310 | - int old_errno; | ||
9311 | - | ||
9312 | - write_lock(&journal->j_state_lock); | ||
9313 | - old_errno = journal->j_errno; | ||
9314 | - if (!journal->j_errno || errno == -ESHUTDOWN) | ||
9315 | - journal->j_errno = errno; | ||
9316 | - | ||
9317 | - if (journal->j_flags & JBD2_ABORT) { | ||
9318 | - write_unlock(&journal->j_state_lock); | ||
9319 | - if (old_errno != -ESHUTDOWN && errno == -ESHUTDOWN) | ||
9320 | - jbd2_journal_update_sb_errno(journal); | ||
9321 | - return; | ||
9322 | - } | ||
9323 | - write_unlock(&journal->j_state_lock); | ||
9324 | - | ||
9325 | - __jbd2_journal_abort_hard(journal); | ||
9326 | - | ||
9327 | - jbd2_journal_update_sb_errno(journal); | ||
9328 | - write_lock(&journal->j_state_lock); | ||
9329 | - journal->j_flags |= JBD2_REC_ERR; | ||
9330 | - write_unlock(&journal->j_state_lock); | ||
9331 | -} | ||
9332 | - | ||
9333 | /** | ||
9334 | * void jbd2_journal_abort () - Shutdown the journal immediately. | ||
9335 | * @journal: the journal to shutdown. | ||
9336 | @@ -2171,7 +2112,47 @@ static void __journal_abort_soft (journal_t *journal, int errno) | ||
9337 | |||
9338 | void jbd2_journal_abort(journal_t *journal, int errno) | ||
9339 | { | ||
9340 | - __journal_abort_soft(journal, errno); | ||
9341 | + transaction_t *transaction; | ||
9342 | + | ||
9343 | + /* | ||
9344 | + * ESHUTDOWN always takes precedence because a file system check | ||
9345 | + * caused by any other journal abort error is not required after | ||
9346 | + * a shutdown triggered. | ||
9347 | + */ | ||
9348 | + write_lock(&journal->j_state_lock); | ||
9349 | + if (journal->j_flags & JBD2_ABORT) { | ||
9350 | + int old_errno = journal->j_errno; | ||
9351 | + | ||
9352 | + write_unlock(&journal->j_state_lock); | ||
9353 | + if (old_errno != -ESHUTDOWN && errno == -ESHUTDOWN) { | ||
9354 | + journal->j_errno = errno; | ||
9355 | + jbd2_journal_update_sb_errno(journal); | ||
9356 | + } | ||
9357 | + return; | ||
9358 | + } | ||
9359 | + | ||
9360 | + /* | ||
9361 | + * Mark the abort as occurred and start current running transaction | ||
9362 | + * to release all journaled buffer. | ||
9363 | + */ | ||
9364 | + pr_err("Aborting journal on device %s.\n", journal->j_devname); | ||
9365 | + | ||
9366 | + journal->j_flags |= JBD2_ABORT; | ||
9367 | + journal->j_errno = errno; | ||
9368 | + transaction = journal->j_running_transaction; | ||
9369 | + if (transaction) | ||
9370 | + __jbd2_log_start_commit(journal, transaction->t_tid); | ||
9371 | + write_unlock(&journal->j_state_lock); | ||
9372 | + | ||
9373 | + /* | ||
9374 | + * Record errno to the journal super block, so that fsck and jbd2 | ||
9375 | + * layer could realise that a filesystem check is needed. | ||
9376 | + */ | ||
9377 | + jbd2_journal_update_sb_errno(journal); | ||
9378 | + | ||
9379 | + write_lock(&journal->j_state_lock); | ||
9380 | + journal->j_flags |= JBD2_REC_ERR; | ||
9381 | + write_unlock(&journal->j_state_lock); | ||
9382 | } | ||
9383 | |||
9384 | /** | ||
9385 | diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c | ||
9386 | index 3802c88e8372..6de41f741280 100644 | ||
9387 | --- a/fs/nfs/inode.c | ||
9388 | +++ b/fs/nfs/inode.c | ||
9389 | @@ -826,6 +826,8 @@ int nfs_getattr(const struct path *path, struct kstat *stat, | ||
9390 | do_update |= cache_validity & NFS_INO_INVALID_ATIME; | ||
9391 | if (request_mask & (STATX_CTIME|STATX_MTIME)) | ||
9392 | do_update |= cache_validity & NFS_INO_REVAL_PAGECACHE; | ||
9393 | + if (request_mask & STATX_BLOCKS) | ||
9394 | + do_update |= cache_validity & NFS_INO_INVALID_BLOCKS; | ||
9395 | if (do_update) { | ||
9396 | /* Update the attribute cache */ | ||
9397 | if (!(server->flags & NFS_MOUNT_NOAC)) | ||
9398 | @@ -1750,7 +1752,8 @@ out_noforce: | ||
9399 | status = nfs_post_op_update_inode_locked(inode, fattr, | ||
9400 | NFS_INO_INVALID_CHANGE | ||
9401 | | NFS_INO_INVALID_CTIME | ||
9402 | - | NFS_INO_INVALID_MTIME); | ||
9403 | + | NFS_INO_INVALID_MTIME | ||
9404 | + | NFS_INO_INVALID_BLOCKS); | ||
9405 | return status; | ||
9406 | } | ||
9407 | |||
9408 | @@ -1857,7 +1860,8 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr) | ||
9409 | nfsi->cache_validity &= ~(NFS_INO_INVALID_ATTR | ||
9410 | | NFS_INO_INVALID_ATIME | ||
9411 | | NFS_INO_REVAL_FORCED | ||
9412 | - | NFS_INO_REVAL_PAGECACHE); | ||
9413 | + | NFS_INO_REVAL_PAGECACHE | ||
9414 | + | NFS_INO_INVALID_BLOCKS); | ||
9415 | |||
9416 | /* Do atomic weak cache consistency updates */ | ||
9417 | nfs_wcc_update_inode(inode, fattr); | ||
9418 | @@ -2019,8 +2023,12 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr) | ||
9419 | inode->i_blocks = nfs_calc_block_size(fattr->du.nfs3.used); | ||
9420 | } else if (fattr->valid & NFS_ATTR_FATTR_BLOCKS_USED) | ||
9421 | inode->i_blocks = fattr->du.nfs2.blocks; | ||
9422 | - else | ||
9423 | + else { | ||
9424 | + nfsi->cache_validity |= save_cache_validity & | ||
9425 | + (NFS_INO_INVALID_BLOCKS | ||
9426 | + | NFS_INO_REVAL_FORCED); | ||
9427 | cache_revalidated = false; | ||
9428 | + } | ||
9429 | |||
9430 | /* Update attrtimeo value if we're out of the unstable period */ | ||
9431 | if (attr_changed) { | ||
9432 | diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c | ||
9433 | index e257653f25ab..33c17c69aeaa 100644 | ||
9434 | --- a/fs/nfs/nfs4proc.c | ||
9435 | +++ b/fs/nfs/nfs4proc.c | ||
9436 | @@ -7870,7 +7870,7 @@ nfs4_bind_one_conn_to_session_done(struct rpc_task *task, void *calldata) | ||
9437 | } | ||
9438 | |||
9439 | static const struct rpc_call_ops nfs4_bind_one_conn_to_session_ops = { | ||
9440 | - .rpc_call_done = &nfs4_bind_one_conn_to_session_done, | ||
9441 | + .rpc_call_done = nfs4_bind_one_conn_to_session_done, | ||
9442 | }; | ||
9443 | |||
9444 | /* | ||
9445 | diff --git a/fs/nfsd/cache.h b/fs/nfsd/cache.h | ||
9446 | index 10ec5ecdf117..65c331f75e9c 100644 | ||
9447 | --- a/fs/nfsd/cache.h | ||
9448 | +++ b/fs/nfsd/cache.h | ||
9449 | @@ -78,6 +78,8 @@ enum { | ||
9450 | /* Checksum this amount of the request */ | ||
9451 | #define RC_CSUMLEN (256U) | ||
9452 | |||
9453 | +int nfsd_drc_slab_create(void); | ||
9454 | +void nfsd_drc_slab_free(void); | ||
9455 | int nfsd_reply_cache_init(struct nfsd_net *); | ||
9456 | void nfsd_reply_cache_shutdown(struct nfsd_net *); | ||
9457 | int nfsd_cache_lookup(struct svc_rqst *); | ||
9458 | diff --git a/fs/nfsd/netns.h b/fs/nfsd/netns.h | ||
9459 | index 9a4ef815fb8c..ed53e206a299 100644 | ||
9460 | --- a/fs/nfsd/netns.h | ||
9461 | +++ b/fs/nfsd/netns.h | ||
9462 | @@ -139,7 +139,6 @@ struct nfsd_net { | ||
9463 | * Duplicate reply cache | ||
9464 | */ | ||
9465 | struct nfsd_drc_bucket *drc_hashtbl; | ||
9466 | - struct kmem_cache *drc_slab; | ||
9467 | |||
9468 | /* max number of entries allowed in the cache */ | ||
9469 | unsigned int max_drc_entries; | ||
9470 | diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c | ||
9471 | index afca3287184b..efe55d101b0e 100644 | ||
9472 | --- a/fs/nfsd/nfs4callback.c | ||
9473 | +++ b/fs/nfsd/nfs4callback.c | ||
9474 | @@ -1230,6 +1230,8 @@ static void nfsd4_process_cb_update(struct nfsd4_callback *cb) | ||
9475 | err = setup_callback_client(clp, &conn, ses); | ||
9476 | if (err) { | ||
9477 | nfsd4_mark_cb_down(clp, err); | ||
9478 | + if (c) | ||
9479 | + svc_xprt_put(c->cn_xprt); | ||
9480 | return; | ||
9481 | } | ||
9482 | } | ||
9483 | diff --git a/fs/nfsd/nfscache.c b/fs/nfsd/nfscache.c | ||
9484 | index 96352ab7bd81..4a258065188e 100644 | ||
9485 | --- a/fs/nfsd/nfscache.c | ||
9486 | +++ b/fs/nfsd/nfscache.c | ||
9487 | @@ -36,6 +36,8 @@ struct nfsd_drc_bucket { | ||
9488 | spinlock_t cache_lock; | ||
9489 | }; | ||
9490 | |||
9491 | +static struct kmem_cache *drc_slab; | ||
9492 | + | ||
9493 | static int nfsd_cache_append(struct svc_rqst *rqstp, struct kvec *vec); | ||
9494 | static unsigned long nfsd_reply_cache_count(struct shrinker *shrink, | ||
9495 | struct shrink_control *sc); | ||
9496 | @@ -95,7 +97,7 @@ nfsd_reply_cache_alloc(struct svc_rqst *rqstp, __wsum csum, | ||
9497 | { | ||
9498 | struct svc_cacherep *rp; | ||
9499 | |||
9500 | - rp = kmem_cache_alloc(nn->drc_slab, GFP_KERNEL); | ||
9501 | + rp = kmem_cache_alloc(drc_slab, GFP_KERNEL); | ||
9502 | if (rp) { | ||
9503 | rp->c_state = RC_UNUSED; | ||
9504 | rp->c_type = RC_NOCACHE; | ||
9505 | @@ -129,7 +131,7 @@ nfsd_reply_cache_free_locked(struct nfsd_drc_bucket *b, struct svc_cacherep *rp, | ||
9506 | atomic_dec(&nn->num_drc_entries); | ||
9507 | nn->drc_mem_usage -= sizeof(*rp); | ||
9508 | } | ||
9509 | - kmem_cache_free(nn->drc_slab, rp); | ||
9510 | + kmem_cache_free(drc_slab, rp); | ||
9511 | } | ||
9512 | |||
9513 | static void | ||
9514 | @@ -141,6 +143,18 @@ nfsd_reply_cache_free(struct nfsd_drc_bucket *b, struct svc_cacherep *rp, | ||
9515 | spin_unlock(&b->cache_lock); | ||
9516 | } | ||
9517 | |||
9518 | +int nfsd_drc_slab_create(void) | ||
9519 | +{ | ||
9520 | + drc_slab = kmem_cache_create("nfsd_drc", | ||
9521 | + sizeof(struct svc_cacherep), 0, 0, NULL); | ||
9522 | + return drc_slab ? 0: -ENOMEM; | ||
9523 | +} | ||
9524 | + | ||
9525 | +void nfsd_drc_slab_free(void) | ||
9526 | +{ | ||
9527 | + kmem_cache_destroy(drc_slab); | ||
9528 | +} | ||
9529 | + | ||
9530 | int nfsd_reply_cache_init(struct nfsd_net *nn) | ||
9531 | { | ||
9532 | unsigned int hashsize; | ||
9533 | @@ -159,18 +173,13 @@ int nfsd_reply_cache_init(struct nfsd_net *nn) | ||
9534 | if (status) | ||
9535 | goto out_nomem; | ||
9536 | |||
9537 | - nn->drc_slab = kmem_cache_create("nfsd_drc", | ||
9538 | - sizeof(struct svc_cacherep), 0, 0, NULL); | ||
9539 | - if (!nn->drc_slab) | ||
9540 | - goto out_shrinker; | ||
9541 | - | ||
9542 | nn->drc_hashtbl = kcalloc(hashsize, | ||
9543 | sizeof(*nn->drc_hashtbl), GFP_KERNEL); | ||
9544 | if (!nn->drc_hashtbl) { | ||
9545 | nn->drc_hashtbl = vzalloc(array_size(hashsize, | ||
9546 | sizeof(*nn->drc_hashtbl))); | ||
9547 | if (!nn->drc_hashtbl) | ||
9548 | - goto out_slab; | ||
9549 | + goto out_shrinker; | ||
9550 | } | ||
9551 | |||
9552 | for (i = 0; i < hashsize; i++) { | ||
9553 | @@ -180,8 +189,6 @@ int nfsd_reply_cache_init(struct nfsd_net *nn) | ||
9554 | nn->drc_hashsize = hashsize; | ||
9555 | |||
9556 | return 0; | ||
9557 | -out_slab: | ||
9558 | - kmem_cache_destroy(nn->drc_slab); | ||
9559 | out_shrinker: | ||
9560 | unregister_shrinker(&nn->nfsd_reply_cache_shrinker); | ||
9561 | out_nomem: | ||
9562 | @@ -209,8 +216,6 @@ void nfsd_reply_cache_shutdown(struct nfsd_net *nn) | ||
9563 | nn->drc_hashtbl = NULL; | ||
9564 | nn->drc_hashsize = 0; | ||
9565 | |||
9566 | - kmem_cache_destroy(nn->drc_slab); | ||
9567 | - nn->drc_slab = NULL; | ||
9568 | } | ||
9569 | |||
9570 | /* | ||
9571 | @@ -464,8 +469,7 @@ found_entry: | ||
9572 | rtn = RC_REPLY; | ||
9573 | break; | ||
9574 | default: | ||
9575 | - printk(KERN_WARNING "nfsd: bad repcache type %d\n", rp->c_type); | ||
9576 | - nfsd_reply_cache_free_locked(b, rp, nn); | ||
9577 | + WARN_ONCE(1, "nfsd: bad repcache type %d\n", rp->c_type); | ||
9578 | } | ||
9579 | |||
9580 | goto out; | ||
9581 | diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c | ||
9582 | index d77c5261c03c..159feae6af8b 100644 | ||
9583 | --- a/fs/nfsd/nfsctl.c | ||
9584 | +++ b/fs/nfsd/nfsctl.c | ||
9585 | @@ -1534,6 +1534,9 @@ static int __init init_nfsd(void) | ||
9586 | goto out_free_slabs; | ||
9587 | nfsd_fault_inject_init(); /* nfsd fault injection controls */ | ||
9588 | nfsd_stat_init(); /* Statistics */ | ||
9589 | + retval = nfsd_drc_slab_create(); | ||
9590 | + if (retval) | ||
9591 | + goto out_free_stat; | ||
9592 | nfsd_lockd_init(); /* lockd->nfsd callbacks */ | ||
9593 | retval = create_proc_exports_entry(); | ||
9594 | if (retval) | ||
9595 | @@ -1547,6 +1550,8 @@ out_free_all: | ||
9596 | remove_proc_entry("fs/nfs", NULL); | ||
9597 | out_free_lockd: | ||
9598 | nfsd_lockd_shutdown(); | ||
9599 | + nfsd_drc_slab_free(); | ||
9600 | +out_free_stat: | ||
9601 | nfsd_stat_shutdown(); | ||
9602 | nfsd_fault_inject_cleanup(); | ||
9603 | nfsd4_exit_pnfs(); | ||
9604 | @@ -1561,6 +1566,7 @@ out_unregister_pernet: | ||
9605 | |||
9606 | static void __exit exit_nfsd(void) | ||
9607 | { | ||
9608 | + nfsd_drc_slab_free(); | ||
9609 | remove_proc_entry("fs/nfs/exports", NULL); | ||
9610 | remove_proc_entry("fs/nfs", NULL); | ||
9611 | nfsd_stat_shutdown(); | ||
9612 | diff --git a/include/linux/bitops.h b/include/linux/bitops.h | ||
9613 | index c94a9ff9f082..4f0e62cbf2ff 100644 | ||
9614 | --- a/include/linux/bitops.h | ||
9615 | +++ b/include/linux/bitops.h | ||
9616 | @@ -57,7 +57,7 @@ static inline int get_bitmask_order(unsigned int count) | ||
9617 | |||
9618 | static __always_inline unsigned long hweight_long(unsigned long w) | ||
9619 | { | ||
9620 | - return sizeof(w) == 4 ? hweight32(w) : hweight64(w); | ||
9621 | + return sizeof(w) == 4 ? hweight32(w) : hweight64((__u64)w); | ||
9622 | } | ||
9623 | |||
9624 | /** | ||
9625 | diff --git a/include/linux/genhd.h b/include/linux/genhd.h | ||
9626 | index 8b5330dd5ac0..62a2ec9f17df 100644 | ||
9627 | --- a/include/linux/genhd.h | ||
9628 | +++ b/include/linux/genhd.h | ||
9629 | @@ -750,9 +750,11 @@ static inline sector_t part_nr_sects_read(struct hd_struct *part) | ||
9630 | static inline void part_nr_sects_write(struct hd_struct *part, sector_t size) | ||
9631 | { | ||
9632 | #if BITS_PER_LONG==32 && defined(CONFIG_SMP) | ||
9633 | + preempt_disable(); | ||
9634 | write_seqcount_begin(&part->nr_sects_seq); | ||
9635 | part->nr_sects = size; | ||
9636 | write_seqcount_end(&part->nr_sects_seq); | ||
9637 | + preempt_enable(); | ||
9638 | #elif BITS_PER_LONG==32 && defined(CONFIG_PREEMPT) | ||
9639 | preempt_disable(); | ||
9640 | part->nr_sects = size; | ||
9641 | diff --git a/include/linux/ioport.h b/include/linux/ioport.h | ||
9642 | index 7bddddfc76d6..fdc201d61460 100644 | ||
9643 | --- a/include/linux/ioport.h | ||
9644 | +++ b/include/linux/ioport.h | ||
9645 | @@ -300,5 +300,11 @@ struct resource *devm_request_free_mem_region(struct device *dev, | ||
9646 | struct resource *request_free_mem_region(struct resource *base, | ||
9647 | unsigned long size, const char *name); | ||
9648 | |||
9649 | +#ifdef CONFIG_IO_STRICT_DEVMEM | ||
9650 | +void revoke_devmem(struct resource *res); | ||
9651 | +#else | ||
9652 | +static inline void revoke_devmem(struct resource *res) { }; | ||
9653 | +#endif | ||
9654 | + | ||
9655 | #endif /* __ASSEMBLY__ */ | ||
9656 | #endif /* _LINUX_IOPORT_H */ | ||
9657 | diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h | ||
9658 | index 10e6049c0ba9..b0e97e5de8ca 100644 | ||
9659 | --- a/include/linux/jbd2.h | ||
9660 | +++ b/include/linux/jbd2.h | ||
9661 | @@ -1402,7 +1402,6 @@ extern int jbd2_journal_skip_recovery (journal_t *); | ||
9662 | extern void jbd2_journal_update_sb_errno(journal_t *); | ||
9663 | extern int jbd2_journal_update_sb_log_tail (journal_t *, tid_t, | ||
9664 | unsigned long, int); | ||
9665 | -extern void __jbd2_journal_abort_hard (journal_t *); | ||
9666 | extern void jbd2_journal_abort (journal_t *, int); | ||
9667 | extern int jbd2_journal_errno (journal_t *); | ||
9668 | extern void jbd2_journal_ack_err (journal_t *); | ||
9669 | diff --git a/include/linux/kprobes.h b/include/linux/kprobes.h | ||
9670 | index 04bdaf01112c..645fd401c856 100644 | ||
9671 | --- a/include/linux/kprobes.h | ||
9672 | +++ b/include/linux/kprobes.h | ||
9673 | @@ -350,6 +350,10 @@ static inline struct kprobe_ctlblk *get_kprobe_ctlblk(void) | ||
9674 | return this_cpu_ptr(&kprobe_ctlblk); | ||
9675 | } | ||
9676 | |||
9677 | +extern struct kprobe kprobe_busy; | ||
9678 | +void kprobe_busy_begin(void); | ||
9679 | +void kprobe_busy_end(void); | ||
9680 | + | ||
9681 | kprobe_opcode_t *kprobe_lookup_name(const char *name, unsigned int offset); | ||
9682 | int register_kprobe(struct kprobe *p); | ||
9683 | void unregister_kprobe(struct kprobe *p); | ||
9684 | diff --git a/include/linux/libata.h b/include/linux/libata.h | ||
9685 | index c44e4cfbcb16..b9970f5bab67 100644 | ||
9686 | --- a/include/linux/libata.h | ||
9687 | +++ b/include/linux/libata.h | ||
9688 | @@ -22,6 +22,7 @@ | ||
9689 | #include <linux/acpi.h> | ||
9690 | #include <linux/cdrom.h> | ||
9691 | #include <linux/sched.h> | ||
9692 | +#include <linux/async.h> | ||
9693 | |||
9694 | /* | ||
9695 | * Define if arch has non-standard setup. This is a _PCI_ standard | ||
9696 | @@ -870,6 +871,8 @@ struct ata_port { | ||
9697 | struct timer_list fastdrain_timer; | ||
9698 | unsigned long fastdrain_cnt; | ||
9699 | |||
9700 | + async_cookie_t cookie; | ||
9701 | + | ||
9702 | int em_message_type; | ||
9703 | void *private_data; | ||
9704 | |||
9705 | diff --git a/include/linux/mfd/stmfx.h b/include/linux/mfd/stmfx.h | ||
9706 | index 3c67983678ec..744dce63946e 100644 | ||
9707 | --- a/include/linux/mfd/stmfx.h | ||
9708 | +++ b/include/linux/mfd/stmfx.h | ||
9709 | @@ -109,6 +109,7 @@ struct stmfx { | ||
9710 | struct device *dev; | ||
9711 | struct regmap *map; | ||
9712 | struct regulator *vdd; | ||
9713 | + int irq; | ||
9714 | struct irq_domain *irq_domain; | ||
9715 | struct mutex lock; /* IRQ bus lock */ | ||
9716 | u8 irq_src; | ||
9717 | diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h | ||
9718 | index 570a60c2f4f4..ad09c0cc5464 100644 | ||
9719 | --- a/include/linux/nfs_fs.h | ||
9720 | +++ b/include/linux/nfs_fs.h | ||
9721 | @@ -225,6 +225,7 @@ struct nfs4_copy_state { | ||
9722 | #define NFS_INO_INVALID_OTHER BIT(12) /* other attrs are invalid */ | ||
9723 | #define NFS_INO_DATA_INVAL_DEFER \ | ||
9724 | BIT(13) /* Deferred cache invalidation */ | ||
9725 | +#define NFS_INO_INVALID_BLOCKS BIT(14) /* cached blocks are invalid */ | ||
9726 | |||
9727 | #define NFS_INO_INVALID_ATTR (NFS_INO_INVALID_CHANGE \ | ||
9728 | | NFS_INO_INVALID_CTIME \ | ||
9729 | diff --git a/include/linux/usb/composite.h b/include/linux/usb/composite.h | ||
9730 | index 8675e145ea8b..2040696d75b6 100644 | ||
9731 | --- a/include/linux/usb/composite.h | ||
9732 | +++ b/include/linux/usb/composite.h | ||
9733 | @@ -249,6 +249,9 @@ int usb_function_activate(struct usb_function *); | ||
9734 | |||
9735 | int usb_interface_id(struct usb_configuration *, struct usb_function *); | ||
9736 | |||
9737 | +int config_ep_by_speed_and_alt(struct usb_gadget *g, struct usb_function *f, | ||
9738 | + struct usb_ep *_ep, u8 alt); | ||
9739 | + | ||
9740 | int config_ep_by_speed(struct usb_gadget *g, struct usb_function *f, | ||
9741 | struct usb_ep *_ep); | ||
9742 | |||
9743 | diff --git a/include/linux/usb/ehci_def.h b/include/linux/usb/ehci_def.h | ||
9744 | index a15ce99dfc2d..78e006355557 100644 | ||
9745 | --- a/include/linux/usb/ehci_def.h | ||
9746 | +++ b/include/linux/usb/ehci_def.h | ||
9747 | @@ -151,7 +151,7 @@ struct ehci_regs { | ||
9748 | #define PORT_OWNER (1<<13) /* true: companion hc owns this port */ | ||
9749 | #define PORT_POWER (1<<12) /* true: has power (see PPC) */ | ||
9750 | #define PORT_USB11(x) (((x)&(3<<10)) == (1<<10)) /* USB 1.1 device */ | ||
9751 | -/* 11:10 for detecting lowspeed devices (reset vs release ownership) */ | ||
9752 | +#define PORT_LS_MASK (3<<10) /* Link status (SE0, K or J */ | ||
9753 | /* 9 reserved */ | ||
9754 | #define PORT_LPM (1<<9) /* LPM transaction */ | ||
9755 | #define PORT_RESET (1<<8) /* reset port */ | ||
9756 | diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h | ||
9757 | index 124462d65eac..67f5adc9b875 100644 | ||
9758 | --- a/include/linux/usb/gadget.h | ||
9759 | +++ b/include/linux/usb/gadget.h | ||
9760 | @@ -373,6 +373,7 @@ struct usb_gadget_ops { | ||
9761 | * @connected: True if gadget is connected. | ||
9762 | * @lpm_capable: If the gadget max_speed is FULL or HIGH, this flag | ||
9763 | * indicates that it supports LPM as per the LPM ECN & errata. | ||
9764 | + * @irq: the interrupt number for device controller. | ||
9765 | * | ||
9766 | * Gadgets have a mostly-portable "gadget driver" implementing device | ||
9767 | * functions, handling all usb configurations and interfaces. Gadget | ||
9768 | @@ -427,6 +428,7 @@ struct usb_gadget { | ||
9769 | unsigned deactivated:1; | ||
9770 | unsigned connected:1; | ||
9771 | unsigned lpm_capable:1; | ||
9772 | + int irq; | ||
9773 | }; | ||
9774 | #define work_to_gadget(w) (container_of((w), struct usb_gadget, work)) | ||
9775 | |||
9776 | diff --git a/include/uapi/linux/magic.h b/include/uapi/linux/magic.h | ||
9777 | index 903cc2d2750b..84ae605c0643 100644 | ||
9778 | --- a/include/uapi/linux/magic.h | ||
9779 | +++ b/include/uapi/linux/magic.h | ||
9780 | @@ -93,6 +93,7 @@ | ||
9781 | #define BALLOON_KVM_MAGIC 0x13661366 | ||
9782 | #define ZSMALLOC_MAGIC 0x58295829 | ||
9783 | #define DMA_BUF_MAGIC 0x444d4142 /* "DMAB" */ | ||
9784 | +#define DEVMEM_MAGIC 0x454d444d /* "DMEM" */ | ||
9785 | #define Z3FOLD_MAGIC 0x33 | ||
9786 | |||
9787 | #endif /* __LINUX_MAGIC_H__ */ | ||
9788 | diff --git a/kernel/kprobes.c b/kernel/kprobes.c | ||
9789 | index 2625c241ac00..195ecb955fcc 100644 | ||
9790 | --- a/kernel/kprobes.c | ||
9791 | +++ b/kernel/kprobes.c | ||
9792 | @@ -586,11 +586,12 @@ static void kprobe_optimizer(struct work_struct *work) | ||
9793 | mutex_unlock(&module_mutex); | ||
9794 | mutex_unlock(&text_mutex); | ||
9795 | cpus_read_unlock(); | ||
9796 | - mutex_unlock(&kprobe_mutex); | ||
9797 | |||
9798 | /* Step 5: Kick optimizer again if needed */ | ||
9799 | if (!list_empty(&optimizing_list) || !list_empty(&unoptimizing_list)) | ||
9800 | kick_kprobe_optimizer(); | ||
9801 | + | ||
9802 | + mutex_unlock(&kprobe_mutex); | ||
9803 | } | ||
9804 | |||
9805 | /* Wait for completing optimization and unoptimization */ | ||
9806 | @@ -1236,6 +1237,26 @@ __releases(hlist_lock) | ||
9807 | } | ||
9808 | NOKPROBE_SYMBOL(kretprobe_table_unlock); | ||
9809 | |||
9810 | +struct kprobe kprobe_busy = { | ||
9811 | + .addr = (void *) get_kprobe, | ||
9812 | +}; | ||
9813 | + | ||
9814 | +void kprobe_busy_begin(void) | ||
9815 | +{ | ||
9816 | + struct kprobe_ctlblk *kcb; | ||
9817 | + | ||
9818 | + preempt_disable(); | ||
9819 | + __this_cpu_write(current_kprobe, &kprobe_busy); | ||
9820 | + kcb = get_kprobe_ctlblk(); | ||
9821 | + kcb->kprobe_status = KPROBE_HIT_ACTIVE; | ||
9822 | +} | ||
9823 | + | ||
9824 | +void kprobe_busy_end(void) | ||
9825 | +{ | ||
9826 | + __this_cpu_write(current_kprobe, NULL); | ||
9827 | + preempt_enable(); | ||
9828 | +} | ||
9829 | + | ||
9830 | /* | ||
9831 | * This function is called from finish_task_switch when task tk becomes dead, | ||
9832 | * so that we can recycle any function-return probe instances associated | ||
9833 | @@ -1253,6 +1274,8 @@ void kprobe_flush_task(struct task_struct *tk) | ||
9834 | /* Early boot. kretprobe_table_locks not yet initialized. */ | ||
9835 | return; | ||
9836 | |||
9837 | + kprobe_busy_begin(); | ||
9838 | + | ||
9839 | INIT_HLIST_HEAD(&empty_rp); | ||
9840 | hash = hash_ptr(tk, KPROBE_HASH_BITS); | ||
9841 | head = &kretprobe_inst_table[hash]; | ||
9842 | @@ -1266,6 +1289,8 @@ void kprobe_flush_task(struct task_struct *tk) | ||
9843 | hlist_del(&ri->hlist); | ||
9844 | kfree(ri); | ||
9845 | } | ||
9846 | + | ||
9847 | + kprobe_busy_end(); | ||
9848 | } | ||
9849 | NOKPROBE_SYMBOL(kprobe_flush_task); | ||
9850 | |||
9851 | diff --git a/kernel/resource.c b/kernel/resource.c | ||
9852 | index 76036a41143b..841737bbda9e 100644 | ||
9853 | --- a/kernel/resource.c | ||
9854 | +++ b/kernel/resource.c | ||
9855 | @@ -1126,6 +1126,7 @@ struct resource * __request_region(struct resource *parent, | ||
9856 | { | ||
9857 | DECLARE_WAITQUEUE(wait, current); | ||
9858 | struct resource *res = alloc_resource(GFP_KERNEL); | ||
9859 | + struct resource *orig_parent = parent; | ||
9860 | |||
9861 | if (!res) | ||
9862 | return NULL; | ||
9863 | @@ -1176,6 +1177,10 @@ struct resource * __request_region(struct resource *parent, | ||
9864 | break; | ||
9865 | } | ||
9866 | write_unlock(&resource_lock); | ||
9867 | + | ||
9868 | + if (res && orig_parent == &iomem_resource) | ||
9869 | + revoke_devmem(res); | ||
9870 | + | ||
9871 | return res; | ||
9872 | } | ||
9873 | EXPORT_SYMBOL(__request_region); | ||
9874 | diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c | ||
9875 | index e7e483cdbea6..a677aa84ccb6 100644 | ||
9876 | --- a/kernel/trace/blktrace.c | ||
9877 | +++ b/kernel/trace/blktrace.c | ||
9878 | @@ -999,8 +999,10 @@ static void blk_add_trace_split(void *ignore, | ||
9879 | |||
9880 | __blk_add_trace(bt, bio->bi_iter.bi_sector, | ||
9881 | bio->bi_iter.bi_size, bio_op(bio), bio->bi_opf, | ||
9882 | - BLK_TA_SPLIT, bio->bi_status, sizeof(rpdu), | ||
9883 | - &rpdu, blk_trace_bio_get_cgid(q, bio)); | ||
9884 | + BLK_TA_SPLIT, | ||
9885 | + blk_status_to_errno(bio->bi_status), | ||
9886 | + sizeof(rpdu), &rpdu, | ||
9887 | + blk_trace_bio_get_cgid(q, bio)); | ||
9888 | } | ||
9889 | rcu_read_unlock(); | ||
9890 | } | ||
9891 | @@ -1037,7 +1039,8 @@ static void blk_add_trace_bio_remap(void *ignore, | ||
9892 | r.sector_from = cpu_to_be64(from); | ||
9893 | |||
9894 | __blk_add_trace(bt, bio->bi_iter.bi_sector, bio->bi_iter.bi_size, | ||
9895 | - bio_op(bio), bio->bi_opf, BLK_TA_REMAP, bio->bi_status, | ||
9896 | + bio_op(bio), bio->bi_opf, BLK_TA_REMAP, | ||
9897 | + blk_status_to_errno(bio->bi_status), | ||
9898 | sizeof(r), &r, blk_trace_bio_get_cgid(q, bio)); | ||
9899 | rcu_read_unlock(); | ||
9900 | } | ||
9901 | @@ -1259,21 +1262,10 @@ static inline __u16 t_error(const struct trace_entry *ent) | ||
9902 | |||
9903 | static __u64 get_pdu_int(const struct trace_entry *ent, bool has_cg) | ||
9904 | { | ||
9905 | - const __u64 *val = pdu_start(ent, has_cg); | ||
9906 | + const __be64 *val = pdu_start(ent, has_cg); | ||
9907 | return be64_to_cpu(*val); | ||
9908 | } | ||
9909 | |||
9910 | -static void get_pdu_remap(const struct trace_entry *ent, | ||
9911 | - struct blk_io_trace_remap *r, bool has_cg) | ||
9912 | -{ | ||
9913 | - const struct blk_io_trace_remap *__r = pdu_start(ent, has_cg); | ||
9914 | - __u64 sector_from = __r->sector_from; | ||
9915 | - | ||
9916 | - r->device_from = be32_to_cpu(__r->device_from); | ||
9917 | - r->device_to = be32_to_cpu(__r->device_to); | ||
9918 | - r->sector_from = be64_to_cpu(sector_from); | ||
9919 | -} | ||
9920 | - | ||
9921 | typedef void (blk_log_action_t) (struct trace_iterator *iter, const char *act, | ||
9922 | bool has_cg); | ||
9923 | |||
9924 | @@ -1399,13 +1391,13 @@ static void blk_log_with_error(struct trace_seq *s, | ||
9925 | |||
9926 | static void blk_log_remap(struct trace_seq *s, const struct trace_entry *ent, bool has_cg) | ||
9927 | { | ||
9928 | - struct blk_io_trace_remap r = { .device_from = 0, }; | ||
9929 | + const struct blk_io_trace_remap *__r = pdu_start(ent, has_cg); | ||
9930 | |||
9931 | - get_pdu_remap(ent, &r, has_cg); | ||
9932 | trace_seq_printf(s, "%llu + %u <- (%d,%d) %llu\n", | ||
9933 | t_sector(ent), t_sec(ent), | ||
9934 | - MAJOR(r.device_from), MINOR(r.device_from), | ||
9935 | - (unsigned long long)r.sector_from); | ||
9936 | + MAJOR(be32_to_cpu(__r->device_from)), | ||
9937 | + MINOR(be32_to_cpu(__r->device_from)), | ||
9938 | + be64_to_cpu(__r->sector_from)); | ||
9939 | } | ||
9940 | |||
9941 | static void blk_log_plug(struct trace_seq *s, const struct trace_entry *ent, bool has_cg) | ||
9942 | diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c | ||
9943 | index fba4b48451f6..26de9c654956 100644 | ||
9944 | --- a/kernel/trace/trace_kprobe.c | ||
9945 | +++ b/kernel/trace/trace_kprobe.c | ||
9946 | @@ -1464,7 +1464,7 @@ int bpf_get_kprobe_info(const struct perf_event *event, u32 *fd_type, | ||
9947 | if (perf_type_tracepoint) | ||
9948 | tk = find_trace_kprobe(pevent, group); | ||
9949 | else | ||
9950 | - tk = event->tp_event->data; | ||
9951 | + tk = trace_kprobe_primary_from_call(event->tp_event); | ||
9952 | if (!tk) | ||
9953 | return -EINVAL; | ||
9954 | |||
9955 | diff --git a/kernel/trace/trace_probe.c b/kernel/trace/trace_probe.c | ||
9956 | index ab8b6436d53f..f98d6d94cbbf 100644 | ||
9957 | --- a/kernel/trace/trace_probe.c | ||
9958 | +++ b/kernel/trace/trace_probe.c | ||
9959 | @@ -639,8 +639,8 @@ static int traceprobe_parse_probe_arg_body(char *arg, ssize_t *size, | ||
9960 | ret = -EINVAL; | ||
9961 | goto fail; | ||
9962 | } | ||
9963 | - if ((code->op == FETCH_OP_IMM || code->op == FETCH_OP_COMM) || | ||
9964 | - parg->count) { | ||
9965 | + if ((code->op == FETCH_OP_IMM || code->op == FETCH_OP_COMM || | ||
9966 | + code->op == FETCH_OP_DATA) || parg->count) { | ||
9967 | /* | ||
9968 | * IMM, DATA and COMM is pointing actual address, those | ||
9969 | * must be kept, and if parg->count != 0, this is an | ||
9970 | diff --git a/kernel/trace/trace_uprobe.c b/kernel/trace/trace_uprobe.c | ||
9971 | index 2619bc5ed520..5294843de6ef 100644 | ||
9972 | --- a/kernel/trace/trace_uprobe.c | ||
9973 | +++ b/kernel/trace/trace_uprobe.c | ||
9974 | @@ -1405,7 +1405,7 @@ int bpf_get_uprobe_info(const struct perf_event *event, u32 *fd_type, | ||
9975 | if (perf_type_tracepoint) | ||
9976 | tu = find_probe_event(pevent, group); | ||
9977 | else | ||
9978 | - tu = event->tp_event->data; | ||
9979 | + tu = trace_uprobe_primary_from_call(event->tp_event); | ||
9980 | if (!tu) | ||
9981 | return -EINVAL; | ||
9982 | |||
9983 | diff --git a/lib/zlib_inflate/inffast.c b/lib/zlib_inflate/inffast.c | ||
9984 | index 2c13ecc5bb2c..ed1f3df27260 100644 | ||
9985 | --- a/lib/zlib_inflate/inffast.c | ||
9986 | +++ b/lib/zlib_inflate/inffast.c | ||
9987 | @@ -10,17 +10,6 @@ | ||
9988 | |||
9989 | #ifndef ASMINF | ||
9990 | |||
9991 | -/* Allow machine dependent optimization for post-increment or pre-increment. | ||
9992 | - Based on testing to date, | ||
9993 | - Pre-increment preferred for: | ||
9994 | - - PowerPC G3 (Adler) | ||
9995 | - - MIPS R5000 (Randers-Pehrson) | ||
9996 | - Post-increment preferred for: | ||
9997 | - - none | ||
9998 | - No measurable difference: | ||
9999 | - - Pentium III (Anderson) | ||
10000 | - - M68060 (Nikl) | ||
10001 | - */ | ||
10002 | union uu { | ||
10003 | unsigned short us; | ||
10004 | unsigned char b[2]; | ||
10005 | @@ -38,16 +27,6 @@ get_unaligned16(const unsigned short *p) | ||
10006 | return mm.us; | ||
10007 | } | ||
10008 | |||
10009 | -#ifdef POSTINC | ||
10010 | -# define OFF 0 | ||
10011 | -# define PUP(a) *(a)++ | ||
10012 | -# define UP_UNALIGNED(a) get_unaligned16((a)++) | ||
10013 | -#else | ||
10014 | -# define OFF 1 | ||
10015 | -# define PUP(a) *++(a) | ||
10016 | -# define UP_UNALIGNED(a) get_unaligned16(++(a)) | ||
10017 | -#endif | ||
10018 | - | ||
10019 | /* | ||
10020 | Decode literal, length, and distance codes and write out the resulting | ||
10021 | literal and match bytes until either not enough input or output is | ||
10022 | @@ -115,9 +94,9 @@ void inflate_fast(z_streamp strm, unsigned start) | ||
10023 | |||
10024 | /* copy state to local variables */ | ||
10025 | state = (struct inflate_state *)strm->state; | ||
10026 | - in = strm->next_in - OFF; | ||
10027 | + in = strm->next_in; | ||
10028 | last = in + (strm->avail_in - 5); | ||
10029 | - out = strm->next_out - OFF; | ||
10030 | + out = strm->next_out; | ||
10031 | beg = out - (start - strm->avail_out); | ||
10032 | end = out + (strm->avail_out - 257); | ||
10033 | #ifdef INFLATE_STRICT | ||
10034 | @@ -138,9 +117,9 @@ void inflate_fast(z_streamp strm, unsigned start) | ||
10035 | input data or output space */ | ||
10036 | do { | ||
10037 | if (bits < 15) { | ||
10038 | - hold += (unsigned long)(PUP(in)) << bits; | ||
10039 | + hold += (unsigned long)(*in++) << bits; | ||
10040 | bits += 8; | ||
10041 | - hold += (unsigned long)(PUP(in)) << bits; | ||
10042 | + hold += (unsigned long)(*in++) << bits; | ||
10043 | bits += 8; | ||
10044 | } | ||
10045 | this = lcode[hold & lmask]; | ||
10046 | @@ -150,14 +129,14 @@ void inflate_fast(z_streamp strm, unsigned start) | ||
10047 | bits -= op; | ||
10048 | op = (unsigned)(this.op); | ||
10049 | if (op == 0) { /* literal */ | ||
10050 | - PUP(out) = (unsigned char)(this.val); | ||
10051 | + *out++ = (unsigned char)(this.val); | ||
10052 | } | ||
10053 | else if (op & 16) { /* length base */ | ||
10054 | len = (unsigned)(this.val); | ||
10055 | op &= 15; /* number of extra bits */ | ||
10056 | if (op) { | ||
10057 | if (bits < op) { | ||
10058 | - hold += (unsigned long)(PUP(in)) << bits; | ||
10059 | + hold += (unsigned long)(*in++) << bits; | ||
10060 | bits += 8; | ||
10061 | } | ||
10062 | len += (unsigned)hold & ((1U << op) - 1); | ||
10063 | @@ -165,9 +144,9 @@ void inflate_fast(z_streamp strm, unsigned start) | ||
10064 | bits -= op; | ||
10065 | } | ||
10066 | if (bits < 15) { | ||
10067 | - hold += (unsigned long)(PUP(in)) << bits; | ||
10068 | + hold += (unsigned long)(*in++) << bits; | ||
10069 | bits += 8; | ||
10070 | - hold += (unsigned long)(PUP(in)) << bits; | ||
10071 | + hold += (unsigned long)(*in++) << bits; | ||
10072 | bits += 8; | ||
10073 | } | ||
10074 | this = dcode[hold & dmask]; | ||
10075 | @@ -180,10 +159,10 @@ void inflate_fast(z_streamp strm, unsigned start) | ||
10076 | dist = (unsigned)(this.val); | ||
10077 | op &= 15; /* number of extra bits */ | ||
10078 | if (bits < op) { | ||
10079 | - hold += (unsigned long)(PUP(in)) << bits; | ||
10080 | + hold += (unsigned long)(*in++) << bits; | ||
10081 | bits += 8; | ||
10082 | if (bits < op) { | ||
10083 | - hold += (unsigned long)(PUP(in)) << bits; | ||
10084 | + hold += (unsigned long)(*in++) << bits; | ||
10085 | bits += 8; | ||
10086 | } | ||
10087 | } | ||
10088 | @@ -205,13 +184,13 @@ void inflate_fast(z_streamp strm, unsigned start) | ||
10089 | state->mode = BAD; | ||
10090 | break; | ||
10091 | } | ||
10092 | - from = window - OFF; | ||
10093 | + from = window; | ||
10094 | if (write == 0) { /* very common case */ | ||
10095 | from += wsize - op; | ||
10096 | if (op < len) { /* some from window */ | ||
10097 | len -= op; | ||
10098 | do { | ||
10099 | - PUP(out) = PUP(from); | ||
10100 | + *out++ = *from++; | ||
10101 | } while (--op); | ||
10102 | from = out - dist; /* rest from output */ | ||
10103 | } | ||
10104 | @@ -222,14 +201,14 @@ void inflate_fast(z_streamp strm, unsigned start) | ||
10105 | if (op < len) { /* some from end of window */ | ||
10106 | len -= op; | ||
10107 | do { | ||
10108 | - PUP(out) = PUP(from); | ||
10109 | + *out++ = *from++; | ||
10110 | } while (--op); | ||
10111 | - from = window - OFF; | ||
10112 | + from = window; | ||
10113 | if (write < len) { /* some from start of window */ | ||
10114 | op = write; | ||
10115 | len -= op; | ||
10116 | do { | ||
10117 | - PUP(out) = PUP(from); | ||
10118 | + *out++ = *from++; | ||
10119 | } while (--op); | ||
10120 | from = out - dist; /* rest from output */ | ||
10121 | } | ||
10122 | @@ -240,21 +219,21 @@ void inflate_fast(z_streamp strm, unsigned start) | ||
10123 | if (op < len) { /* some from window */ | ||
10124 | len -= op; | ||
10125 | do { | ||
10126 | - PUP(out) = PUP(from); | ||
10127 | + *out++ = *from++; | ||
10128 | } while (--op); | ||
10129 | from = out - dist; /* rest from output */ | ||
10130 | } | ||
10131 | } | ||
10132 | while (len > 2) { | ||
10133 | - PUP(out) = PUP(from); | ||
10134 | - PUP(out) = PUP(from); | ||
10135 | - PUP(out) = PUP(from); | ||
10136 | + *out++ = *from++; | ||
10137 | + *out++ = *from++; | ||
10138 | + *out++ = *from++; | ||
10139 | len -= 3; | ||
10140 | } | ||
10141 | if (len) { | ||
10142 | - PUP(out) = PUP(from); | ||
10143 | + *out++ = *from++; | ||
10144 | if (len > 1) | ||
10145 | - PUP(out) = PUP(from); | ||
10146 | + *out++ = *from++; | ||
10147 | } | ||
10148 | } | ||
10149 | else { | ||
10150 | @@ -264,29 +243,29 @@ void inflate_fast(z_streamp strm, unsigned start) | ||
10151 | from = out - dist; /* copy direct from output */ | ||
10152 | /* minimum length is three */ | ||
10153 | /* Align out addr */ | ||
10154 | - if (!((long)(out - 1 + OFF) & 1)) { | ||
10155 | - PUP(out) = PUP(from); | ||
10156 | + if (!((long)(out - 1) & 1)) { | ||
10157 | + *out++ = *from++; | ||
10158 | len--; | ||
10159 | } | ||
10160 | - sout = (unsigned short *)(out - OFF); | ||
10161 | + sout = (unsigned short *)(out); | ||
10162 | if (dist > 2) { | ||
10163 | unsigned short *sfrom; | ||
10164 | |||
10165 | - sfrom = (unsigned short *)(from - OFF); | ||
10166 | + sfrom = (unsigned short *)(from); | ||
10167 | loops = len >> 1; | ||
10168 | do | ||
10169 | #ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS | ||
10170 | - PUP(sout) = PUP(sfrom); | ||
10171 | + *sout++ = *sfrom++; | ||
10172 | #else | ||
10173 | - PUP(sout) = UP_UNALIGNED(sfrom); | ||
10174 | + *sout++ = get_unaligned16(sfrom++); | ||
10175 | #endif | ||
10176 | while (--loops); | ||
10177 | - out = (unsigned char *)sout + OFF; | ||
10178 | - from = (unsigned char *)sfrom + OFF; | ||
10179 | + out = (unsigned char *)sout; | ||
10180 | + from = (unsigned char *)sfrom; | ||
10181 | } else { /* dist == 1 or dist == 2 */ | ||
10182 | unsigned short pat16; | ||
10183 | |||
10184 | - pat16 = *(sout-1+OFF); | ||
10185 | + pat16 = *(sout-1); | ||
10186 | if (dist == 1) { | ||
10187 | union uu mm; | ||
10188 | /* copy one char pattern to both bytes */ | ||
10189 | @@ -296,12 +275,12 @@ void inflate_fast(z_streamp strm, unsigned start) | ||
10190 | } | ||
10191 | loops = len >> 1; | ||
10192 | do | ||
10193 | - PUP(sout) = pat16; | ||
10194 | + *sout++ = pat16; | ||
10195 | while (--loops); | ||
10196 | - out = (unsigned char *)sout + OFF; | ||
10197 | + out = (unsigned char *)sout; | ||
10198 | } | ||
10199 | if (len & 1) | ||
10200 | - PUP(out) = PUP(from); | ||
10201 | + *out++ = *from++; | ||
10202 | } | ||
10203 | } | ||
10204 | else if ((op & 64) == 0) { /* 2nd level distance code */ | ||
10205 | @@ -336,8 +315,8 @@ void inflate_fast(z_streamp strm, unsigned start) | ||
10206 | hold &= (1U << bits) - 1; | ||
10207 | |||
10208 | /* update state and return */ | ||
10209 | - strm->next_in = in + OFF; | ||
10210 | - strm->next_out = out + OFF; | ||
10211 | + strm->next_in = in; | ||
10212 | + strm->next_out = out; | ||
10213 | strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); | ||
10214 | strm->avail_out = (unsigned)(out < end ? | ||
10215 | 257 + (end - out) : 257 - (out - end)); | ||
10216 | diff --git a/net/core/dev.c b/net/core/dev.c | ||
10217 | index 8552874e5aac..204d87e7c9b1 100644 | ||
10218 | --- a/net/core/dev.c | ||
10219 | +++ b/net/core/dev.c | ||
10220 | @@ -79,6 +79,7 @@ | ||
10221 | #include <linux/sched.h> | ||
10222 | #include <linux/sched/mm.h> | ||
10223 | #include <linux/mutex.h> | ||
10224 | +#include <linux/rwsem.h> | ||
10225 | #include <linux/string.h> | ||
10226 | #include <linux/mm.h> | ||
10227 | #include <linux/socket.h> | ||
10228 | @@ -194,7 +195,7 @@ static DEFINE_SPINLOCK(napi_hash_lock); | ||
10229 | static unsigned int napi_gen_id = NR_CPUS; | ||
10230 | static DEFINE_READ_MOSTLY_HASHTABLE(napi_hash, 8); | ||
10231 | |||
10232 | -static seqcount_t devnet_rename_seq; | ||
10233 | +static DECLARE_RWSEM(devnet_rename_sem); | ||
10234 | |||
10235 | static inline void dev_base_seq_inc(struct net *net) | ||
10236 | { | ||
10237 | @@ -816,33 +817,28 @@ EXPORT_SYMBOL(dev_get_by_napi_id); | ||
10238 | * @net: network namespace | ||
10239 | * @name: a pointer to the buffer where the name will be stored. | ||
10240 | * @ifindex: the ifindex of the interface to get the name from. | ||
10241 | - * | ||
10242 | - * The use of raw_seqcount_begin() and cond_resched() before | ||
10243 | - * retrying is required as we want to give the writers a chance | ||
10244 | - * to complete when CONFIG_PREEMPT is not set. | ||
10245 | */ | ||
10246 | int netdev_get_name(struct net *net, char *name, int ifindex) | ||
10247 | { | ||
10248 | struct net_device *dev; | ||
10249 | - unsigned int seq; | ||
10250 | + int ret; | ||
10251 | |||
10252 | -retry: | ||
10253 | - seq = raw_seqcount_begin(&devnet_rename_seq); | ||
10254 | + down_read(&devnet_rename_sem); | ||
10255 | rcu_read_lock(); | ||
10256 | + | ||
10257 | dev = dev_get_by_index_rcu(net, ifindex); | ||
10258 | if (!dev) { | ||
10259 | - rcu_read_unlock(); | ||
10260 | - return -ENODEV; | ||
10261 | + ret = -ENODEV; | ||
10262 | + goto out; | ||
10263 | } | ||
10264 | |||
10265 | strcpy(name, dev->name); | ||
10266 | - rcu_read_unlock(); | ||
10267 | - if (read_seqcount_retry(&devnet_rename_seq, seq)) { | ||
10268 | - cond_resched(); | ||
10269 | - goto retry; | ||
10270 | - } | ||
10271 | |||
10272 | - return 0; | ||
10273 | + ret = 0; | ||
10274 | +out: | ||
10275 | + rcu_read_unlock(); | ||
10276 | + up_read(&devnet_rename_sem); | ||
10277 | + return ret; | ||
10278 | } | ||
10279 | |||
10280 | /** | ||
10281 | @@ -1115,10 +1111,10 @@ int dev_change_name(struct net_device *dev, const char *newname) | ||
10282 | likely(!(dev->priv_flags & IFF_LIVE_RENAME_OK))) | ||
10283 | return -EBUSY; | ||
10284 | |||
10285 | - write_seqcount_begin(&devnet_rename_seq); | ||
10286 | + down_write(&devnet_rename_sem); | ||
10287 | |||
10288 | if (strncmp(newname, dev->name, IFNAMSIZ) == 0) { | ||
10289 | - write_seqcount_end(&devnet_rename_seq); | ||
10290 | + up_write(&devnet_rename_sem); | ||
10291 | return 0; | ||
10292 | } | ||
10293 | |||
10294 | @@ -1126,7 +1122,7 @@ int dev_change_name(struct net_device *dev, const char *newname) | ||
10295 | |||
10296 | err = dev_get_valid_name(net, dev, newname); | ||
10297 | if (err < 0) { | ||
10298 | - write_seqcount_end(&devnet_rename_seq); | ||
10299 | + up_write(&devnet_rename_sem); | ||
10300 | return err; | ||
10301 | } | ||
10302 | |||
10303 | @@ -1141,11 +1137,11 @@ rollback: | ||
10304 | if (ret) { | ||
10305 | memcpy(dev->name, oldname, IFNAMSIZ); | ||
10306 | dev->name_assign_type = old_assign_type; | ||
10307 | - write_seqcount_end(&devnet_rename_seq); | ||
10308 | + up_write(&devnet_rename_sem); | ||
10309 | return ret; | ||
10310 | } | ||
10311 | |||
10312 | - write_seqcount_end(&devnet_rename_seq); | ||
10313 | + up_write(&devnet_rename_sem); | ||
10314 | |||
10315 | netdev_adjacent_rename_links(dev, oldname); | ||
10316 | |||
10317 | @@ -1166,7 +1162,7 @@ rollback: | ||
10318 | /* err >= 0 after dev_alloc_name() or stores the first errno */ | ||
10319 | if (err >= 0) { | ||
10320 | err = ret; | ||
10321 | - write_seqcount_begin(&devnet_rename_seq); | ||
10322 | + down_write(&devnet_rename_sem); | ||
10323 | memcpy(dev->name, oldname, IFNAMSIZ); | ||
10324 | memcpy(oldname, newname, IFNAMSIZ); | ||
10325 | dev->name_assign_type = old_assign_type; | ||
10326 | diff --git a/net/core/filter.c b/net/core/filter.c | ||
10327 | index f1f2304822e3..a0a492f7cf9c 100644 | ||
10328 | --- a/net/core/filter.c | ||
10329 | +++ b/net/core/filter.c | ||
10330 | @@ -1766,25 +1766,27 @@ BPF_CALL_5(bpf_skb_load_bytes_relative, const struct sk_buff *, skb, | ||
10331 | u32, offset, void *, to, u32, len, u32, start_header) | ||
10332 | { | ||
10333 | u8 *end = skb_tail_pointer(skb); | ||
10334 | - u8 *net = skb_network_header(skb); | ||
10335 | - u8 *mac = skb_mac_header(skb); | ||
10336 | - u8 *ptr; | ||
10337 | + u8 *start, *ptr; | ||
10338 | |||
10339 | - if (unlikely(offset > 0xffff || len > (end - mac))) | ||
10340 | + if (unlikely(offset > 0xffff)) | ||
10341 | goto err_clear; | ||
10342 | |||
10343 | switch (start_header) { | ||
10344 | case BPF_HDR_START_MAC: | ||
10345 | - ptr = mac + offset; | ||
10346 | + if (unlikely(!skb_mac_header_was_set(skb))) | ||
10347 | + goto err_clear; | ||
10348 | + start = skb_mac_header(skb); | ||
10349 | break; | ||
10350 | case BPF_HDR_START_NET: | ||
10351 | - ptr = net + offset; | ||
10352 | + start = skb_network_header(skb); | ||
10353 | break; | ||
10354 | default: | ||
10355 | goto err_clear; | ||
10356 | } | ||
10357 | |||
10358 | - if (likely(ptr >= mac && ptr + len <= end)) { | ||
10359 | + ptr = start + offset; | ||
10360 | + | ||
10361 | + if (likely(ptr + len <= end)) { | ||
10362 | memcpy(to, ptr, len); | ||
10363 | return 0; | ||
10364 | } | ||
10365 | diff --git a/net/core/sock_map.c b/net/core/sock_map.c | ||
10366 | index 8291568b707f..6bbc118bf00e 100644 | ||
10367 | --- a/net/core/sock_map.c | ||
10368 | +++ b/net/core/sock_map.c | ||
10369 | @@ -837,11 +837,15 @@ static struct bpf_map *sock_hash_alloc(union bpf_attr *attr) | ||
10370 | err = -EINVAL; | ||
10371 | goto free_htab; | ||
10372 | } | ||
10373 | + err = bpf_map_charge_init(&htab->map.memory, cost); | ||
10374 | + if (err) | ||
10375 | + goto free_htab; | ||
10376 | |||
10377 | htab->buckets = bpf_map_area_alloc(htab->buckets_num * | ||
10378 | sizeof(struct bpf_htab_bucket), | ||
10379 | htab->map.numa_node); | ||
10380 | if (!htab->buckets) { | ||
10381 | + bpf_map_charge_finish(&htab->map.memory); | ||
10382 | err = -ENOMEM; | ||
10383 | goto free_htab; | ||
10384 | } | ||
10385 | @@ -861,6 +865,7 @@ static void sock_hash_free(struct bpf_map *map) | ||
10386 | { | ||
10387 | struct bpf_htab *htab = container_of(map, struct bpf_htab, map); | ||
10388 | struct bpf_htab_bucket *bucket; | ||
10389 | + struct hlist_head unlink_list; | ||
10390 | struct bpf_htab_elem *elem; | ||
10391 | struct hlist_node *node; | ||
10392 | int i; | ||
10393 | @@ -872,13 +877,32 @@ static void sock_hash_free(struct bpf_map *map) | ||
10394 | synchronize_rcu(); | ||
10395 | for (i = 0; i < htab->buckets_num; i++) { | ||
10396 | bucket = sock_hash_select_bucket(htab, i); | ||
10397 | - hlist_for_each_entry_safe(elem, node, &bucket->head, node) { | ||
10398 | - hlist_del_rcu(&elem->node); | ||
10399 | + | ||
10400 | + /* We are racing with sock_hash_delete_from_link to | ||
10401 | + * enter the spin-lock critical section. Every socket on | ||
10402 | + * the list is still linked to sockhash. Since link | ||
10403 | + * exists, psock exists and holds a ref to socket. That | ||
10404 | + * lets us to grab a socket ref too. | ||
10405 | + */ | ||
10406 | + raw_spin_lock_bh(&bucket->lock); | ||
10407 | + hlist_for_each_entry(elem, &bucket->head, node) | ||
10408 | + sock_hold(elem->sk); | ||
10409 | + hlist_move_list(&bucket->head, &unlink_list); | ||
10410 | + raw_spin_unlock_bh(&bucket->lock); | ||
10411 | + | ||
10412 | + /* Process removed entries out of atomic context to | ||
10413 | + * block for socket lock before deleting the psock's | ||
10414 | + * link to sockhash. | ||
10415 | + */ | ||
10416 | + hlist_for_each_entry_safe(elem, node, &unlink_list, node) { | ||
10417 | + hlist_del(&elem->node); | ||
10418 | lock_sock(elem->sk); | ||
10419 | rcu_read_lock(); | ||
10420 | sock_map_unref(elem->sk, elem); | ||
10421 | rcu_read_unlock(); | ||
10422 | release_sock(elem->sk); | ||
10423 | + sock_put(elem->sk); | ||
10424 | + sock_hash_free_elem(htab, elem); | ||
10425 | } | ||
10426 | } | ||
10427 | |||
10428 | diff --git a/net/ipv4/tcp_bpf.c b/net/ipv4/tcp_bpf.c | ||
10429 | index 69b025408390..ad9f38202731 100644 | ||
10430 | --- a/net/ipv4/tcp_bpf.c | ||
10431 | +++ b/net/ipv4/tcp_bpf.c | ||
10432 | @@ -96,6 +96,9 @@ int __tcp_bpf_recvmsg(struct sock *sk, struct sk_psock *psock, | ||
10433 | } while (i != msg_rx->sg.end); | ||
10434 | |||
10435 | if (unlikely(peek)) { | ||
10436 | + if (msg_rx == list_last_entry(&psock->ingress_msg, | ||
10437 | + struct sk_msg, list)) | ||
10438 | + break; | ||
10439 | msg_rx = list_next_entry(msg_rx, list); | ||
10440 | continue; | ||
10441 | } | ||
10442 | diff --git a/net/rxrpc/proc.c b/net/rxrpc/proc.c | ||
10443 | index 8b179e3c802a..543afd9bd664 100644 | ||
10444 | --- a/net/rxrpc/proc.c | ||
10445 | +++ b/net/rxrpc/proc.c | ||
10446 | @@ -68,7 +68,7 @@ static int rxrpc_call_seq_show(struct seq_file *seq, void *v) | ||
10447 | "Proto Local " | ||
10448 | " Remote " | ||
10449 | " SvID ConnID CallID End Use State Abort " | ||
10450 | - " UserID TxSeq TW RxSeq RW RxSerial RxTimo\n"); | ||
10451 | + " DebugId TxSeq TW RxSeq RW RxSerial RxTimo\n"); | ||
10452 | return 0; | ||
10453 | } | ||
10454 | |||
10455 | @@ -100,7 +100,7 @@ static int rxrpc_call_seq_show(struct seq_file *seq, void *v) | ||
10456 | rx_hard_ack = READ_ONCE(call->rx_hard_ack); | ||
10457 | seq_printf(seq, | ||
10458 | "UDP %-47.47s %-47.47s %4x %08x %08x %s %3u" | ||
10459 | - " %-8.8s %08x %lx %08x %02x %08x %02x %08x %06lx\n", | ||
10460 | + " %-8.8s %08x %08x %08x %02x %08x %02x %08x %06lx\n", | ||
10461 | lbuff, | ||
10462 | rbuff, | ||
10463 | call->service_id, | ||
10464 | @@ -110,7 +110,7 @@ static int rxrpc_call_seq_show(struct seq_file *seq, void *v) | ||
10465 | atomic_read(&call->usage), | ||
10466 | rxrpc_call_states[call->state], | ||
10467 | call->abort_code, | ||
10468 | - call->user_call_ID, | ||
10469 | + call->debug_id, | ||
10470 | tx_hard_ack, READ_ONCE(call->tx_top) - tx_hard_ack, | ||
10471 | rx_hard_ack, READ_ONCE(call->rx_top) - rx_hard_ack, | ||
10472 | call->rx_serial, | ||
10473 | diff --git a/net/sunrpc/addr.c b/net/sunrpc/addr.c | ||
10474 | index d024af4be85e..105d17af4abc 100644 | ||
10475 | --- a/net/sunrpc/addr.c | ||
10476 | +++ b/net/sunrpc/addr.c | ||
10477 | @@ -82,11 +82,11 @@ static size_t rpc_ntop6(const struct sockaddr *sap, | ||
10478 | |||
10479 | rc = snprintf(scopebuf, sizeof(scopebuf), "%c%u", | ||
10480 | IPV6_SCOPE_DELIMITER, sin6->sin6_scope_id); | ||
10481 | - if (unlikely((size_t)rc > sizeof(scopebuf))) | ||
10482 | + if (unlikely((size_t)rc >= sizeof(scopebuf))) | ||
10483 | return 0; | ||
10484 | |||
10485 | len += rc; | ||
10486 | - if (unlikely(len > buflen)) | ||
10487 | + if (unlikely(len >= buflen)) | ||
10488 | return 0; | ||
10489 | |||
10490 | strcat(buf, scopebuf); | ||
10491 | diff --git a/net/xdp/xsk.c b/net/xdp/xsk.c | ||
10492 | index 7181a30666b4..f9eb5efb237c 100644 | ||
10493 | --- a/net/xdp/xsk.c | ||
10494 | +++ b/net/xdp/xsk.c | ||
10495 | @@ -362,10 +362,8 @@ static int xsk_generic_xmit(struct sock *sk) | ||
10496 | |||
10497 | len = desc.len; | ||
10498 | skb = sock_alloc_send_skb(sk, len, 1, &err); | ||
10499 | - if (unlikely(!skb)) { | ||
10500 | - err = -EAGAIN; | ||
10501 | + if (unlikely(!skb)) | ||
10502 | goto out; | ||
10503 | - } | ||
10504 | |||
10505 | skb_put(skb, len); | ||
10506 | addr = desc.addr; | ||
10507 | diff --git a/scripts/headers_install.sh b/scripts/headers_install.sh | ||
10508 | index a07668a5c36b..94a833597a88 100755 | ||
10509 | --- a/scripts/headers_install.sh | ||
10510 | +++ b/scripts/headers_install.sh | ||
10511 | @@ -64,7 +64,7 @@ configs=$(sed -e ' | ||
10512 | d | ||
10513 | ' $OUTFILE) | ||
10514 | |||
10515 | -# The entries in the following list are not warned. | ||
10516 | +# The entries in the following list do not result in an error. | ||
10517 | # Please do not add a new entry. This list is only for existing ones. | ||
10518 | # The list will be reduced gradually, and deleted eventually. (hopefully) | ||
10519 | # | ||
10520 | @@ -98,18 +98,19 @@ include/uapi/linux/raw.h:CONFIG_MAX_RAW_DEVS | ||
10521 | |||
10522 | for c in $configs | ||
10523 | do | ||
10524 | - warn=1 | ||
10525 | + leak_error=1 | ||
10526 | |||
10527 | for ignore in $config_leak_ignores | ||
10528 | do | ||
10529 | if echo "$INFILE:$c" | grep -q "$ignore$"; then | ||
10530 | - warn= | ||
10531 | + leak_error= | ||
10532 | break | ||
10533 | fi | ||
10534 | done | ||
10535 | |||
10536 | - if [ "$warn" = 1 ]; then | ||
10537 | - echo "warning: $INFILE: leak $c to user-space" >&2 | ||
10538 | + if [ "$leak_error" = 1 ]; then | ||
10539 | + echo "error: $INFILE: leak $c to user-space" >&2 | ||
10540 | + exit 1 | ||
10541 | fi | ||
10542 | done | ||
10543 | |||
10544 | diff --git a/scripts/mksysmap b/scripts/mksysmap | ||
10545 | index a35acc0d0b82..9aa23d15862a 100755 | ||
10546 | --- a/scripts/mksysmap | ||
10547 | +++ b/scripts/mksysmap | ||
10548 | @@ -41,4 +41,4 @@ | ||
10549 | # so we just ignore them to let readprofile continue to work. | ||
10550 | # (At least sparc64 has __crc_ in the middle). | ||
10551 | |||
10552 | -$NM -n $1 | grep -v '\( [aNUw] \)\|\(__crc_\)\|\( \$[adt]\)\|\( .L\)' > $2 | ||
10553 | +$NM -n $1 | grep -v '\( [aNUw] \)\|\(__crc_\)\|\( \$[adt]\)\|\( \.L\)' > $2 | ||
10554 | diff --git a/security/apparmor/domain.c b/security/apparmor/domain.c | ||
10555 | index 5dedc0173b02..1a33f490e667 100644 | ||
10556 | --- a/security/apparmor/domain.c | ||
10557 | +++ b/security/apparmor/domain.c | ||
10558 | @@ -935,7 +935,8 @@ int apparmor_bprm_set_creds(struct linux_binprm *bprm) | ||
10559 | * aways results in a further reduction of permissions. | ||
10560 | */ | ||
10561 | if ((bprm->unsafe & LSM_UNSAFE_NO_NEW_PRIVS) && | ||
10562 | - !unconfined(label) && !aa_label_is_subset(new, ctx->nnp)) { | ||
10563 | + !unconfined(label) && | ||
10564 | + !aa_label_is_unconfined_subset(new, ctx->nnp)) { | ||
10565 | error = -EPERM; | ||
10566 | info = "no new privs"; | ||
10567 | goto audit; | ||
10568 | @@ -1213,7 +1214,7 @@ int aa_change_hat(const char *hats[], int count, u64 token, int flags) | ||
10569 | * reduce restrictions. | ||
10570 | */ | ||
10571 | if (task_no_new_privs(current) && !unconfined(label) && | ||
10572 | - !aa_label_is_subset(new, ctx->nnp)) { | ||
10573 | + !aa_label_is_unconfined_subset(new, ctx->nnp)) { | ||
10574 | /* not an apparmor denial per se, so don't log it */ | ||
10575 | AA_DEBUG("no_new_privs - change_hat denied"); | ||
10576 | error = -EPERM; | ||
10577 | @@ -1234,7 +1235,7 @@ int aa_change_hat(const char *hats[], int count, u64 token, int flags) | ||
10578 | * reduce restrictions. | ||
10579 | */ | ||
10580 | if (task_no_new_privs(current) && !unconfined(label) && | ||
10581 | - !aa_label_is_subset(previous, ctx->nnp)) { | ||
10582 | + !aa_label_is_unconfined_subset(previous, ctx->nnp)) { | ||
10583 | /* not an apparmor denial per se, so don't log it */ | ||
10584 | AA_DEBUG("no_new_privs - change_hat denied"); | ||
10585 | error = -EPERM; | ||
10586 | @@ -1429,7 +1430,7 @@ check: | ||
10587 | * reduce restrictions. | ||
10588 | */ | ||
10589 | if (task_no_new_privs(current) && !unconfined(label) && | ||
10590 | - !aa_label_is_subset(new, ctx->nnp)) { | ||
10591 | + !aa_label_is_unconfined_subset(new, ctx->nnp)) { | ||
10592 | /* not an apparmor denial per se, so don't log it */ | ||
10593 | AA_DEBUG("no_new_privs - change_hat denied"); | ||
10594 | error = -EPERM; | ||
10595 | diff --git a/security/apparmor/include/label.h b/security/apparmor/include/label.h | ||
10596 | index 47942c4ba7ca..255764ab06e2 100644 | ||
10597 | --- a/security/apparmor/include/label.h | ||
10598 | +++ b/security/apparmor/include/label.h | ||
10599 | @@ -281,6 +281,7 @@ bool aa_label_init(struct aa_label *label, int size, gfp_t gfp); | ||
10600 | struct aa_label *aa_label_alloc(int size, struct aa_proxy *proxy, gfp_t gfp); | ||
10601 | |||
10602 | bool aa_label_is_subset(struct aa_label *set, struct aa_label *sub); | ||
10603 | +bool aa_label_is_unconfined_subset(struct aa_label *set, struct aa_label *sub); | ||
10604 | struct aa_profile *__aa_label_next_not_in_set(struct label_it *I, | ||
10605 | struct aa_label *set, | ||
10606 | struct aa_label *sub); | ||
10607 | diff --git a/security/apparmor/label.c b/security/apparmor/label.c | ||
10608 | index 470693239e64..5f324d63ceaa 100644 | ||
10609 | --- a/security/apparmor/label.c | ||
10610 | +++ b/security/apparmor/label.c | ||
10611 | @@ -550,6 +550,39 @@ bool aa_label_is_subset(struct aa_label *set, struct aa_label *sub) | ||
10612 | return __aa_label_next_not_in_set(&i, set, sub) == NULL; | ||
10613 | } | ||
10614 | |||
10615 | +/** | ||
10616 | + * aa_label_is_unconfined_subset - test if @sub is a subset of @set | ||
10617 | + * @set: label to test against | ||
10618 | + * @sub: label to test if is subset of @set | ||
10619 | + * | ||
10620 | + * This checks for subset but taking into account unconfined. IF | ||
10621 | + * @sub contains an unconfined profile that does not have a matching | ||
10622 | + * unconfined in @set then this will not cause the test to fail. | ||
10623 | + * Conversely we don't care about an unconfined in @set that is not in | ||
10624 | + * @sub | ||
10625 | + * | ||
10626 | + * Returns: true if @sub is special_subset of @set | ||
10627 | + * else false | ||
10628 | + */ | ||
10629 | +bool aa_label_is_unconfined_subset(struct aa_label *set, struct aa_label *sub) | ||
10630 | +{ | ||
10631 | + struct label_it i = { }; | ||
10632 | + struct aa_profile *p; | ||
10633 | + | ||
10634 | + AA_BUG(!set); | ||
10635 | + AA_BUG(!sub); | ||
10636 | + | ||
10637 | + if (sub == set) | ||
10638 | + return true; | ||
10639 | + | ||
10640 | + do { | ||
10641 | + p = __aa_label_next_not_in_set(&i, set, sub); | ||
10642 | + if (p && !profile_unconfined(p)) | ||
10643 | + break; | ||
10644 | + } while (p); | ||
10645 | + | ||
10646 | + return p == NULL; | ||
10647 | +} | ||
10648 | |||
10649 | |||
10650 | /** | ||
10651 | @@ -1531,13 +1564,13 @@ static const char *label_modename(struct aa_ns *ns, struct aa_label *label, | ||
10652 | |||
10653 | label_for_each(i, label, profile) { | ||
10654 | if (aa_ns_visible(ns, profile->ns, flags & FLAG_VIEW_SUBNS)) { | ||
10655 | - if (profile->mode == APPARMOR_UNCONFINED) | ||
10656 | + count++; | ||
10657 | + if (profile == profile->ns->unconfined) | ||
10658 | /* special case unconfined so stacks with | ||
10659 | * unconfined don't report as mixed. ie. | ||
10660 | * profile_foo//&:ns1:unconfined (mixed) | ||
10661 | */ | ||
10662 | continue; | ||
10663 | - count++; | ||
10664 | if (mode == -1) | ||
10665 | mode = profile->mode; | ||
10666 | else if (mode != profile->mode) | ||
10667 | diff --git a/security/apparmor/lsm.c b/security/apparmor/lsm.c | ||
10668 | index ec3a928af829..e31965dc6dd1 100644 | ||
10669 | --- a/security/apparmor/lsm.c | ||
10670 | +++ b/security/apparmor/lsm.c | ||
10671 | @@ -791,7 +791,12 @@ static void apparmor_sk_clone_security(const struct sock *sk, | ||
10672 | struct aa_sk_ctx *ctx = SK_CTX(sk); | ||
10673 | struct aa_sk_ctx *new = SK_CTX(newsk); | ||
10674 | |||
10675 | + if (new->label) | ||
10676 | + aa_put_label(new->label); | ||
10677 | new->label = aa_get_label(ctx->label); | ||
10678 | + | ||
10679 | + if (new->peer) | ||
10680 | + aa_put_label(new->peer); | ||
10681 | new->peer = aa_get_label(ctx->peer); | ||
10682 | } | ||
10683 | |||
10684 | diff --git a/security/selinux/ss/services.c b/security/selinux/ss/services.c | ||
10685 | index a5813c7629c1..f62adf3cfce8 100644 | ||
10686 | --- a/security/selinux/ss/services.c | ||
10687 | +++ b/security/selinux/ss/services.c | ||
10688 | @@ -2844,8 +2844,12 @@ err: | ||
10689 | if (*names) { | ||
10690 | for (i = 0; i < *len; i++) | ||
10691 | kfree((*names)[i]); | ||
10692 | + kfree(*names); | ||
10693 | } | ||
10694 | kfree(*values); | ||
10695 | + *len = 0; | ||
10696 | + *names = NULL; | ||
10697 | + *values = NULL; | ||
10698 | goto out; | ||
10699 | } | ||
10700 | |||
10701 | diff --git a/sound/firewire/amdtp-am824.c b/sound/firewire/amdtp-am824.c | ||
10702 | index 67d735e9a6a4..fea92e148790 100644 | ||
10703 | --- a/sound/firewire/amdtp-am824.c | ||
10704 | +++ b/sound/firewire/amdtp-am824.c | ||
10705 | @@ -82,7 +82,8 @@ int amdtp_am824_set_parameters(struct amdtp_stream *s, unsigned int rate, | ||
10706 | if (err < 0) | ||
10707 | return err; | ||
10708 | |||
10709 | - s->ctx_data.rx.fdf = AMDTP_FDF_AM824 | s->sfc; | ||
10710 | + if (s->direction == AMDTP_OUT_STREAM) | ||
10711 | + s->ctx_data.rx.fdf = AMDTP_FDF_AM824 | s->sfc; | ||
10712 | |||
10713 | p->pcm_channels = pcm_channels; | ||
10714 | p->midi_ports = midi_ports; | ||
10715 | diff --git a/sound/isa/wavefront/wavefront_synth.c b/sound/isa/wavefront/wavefront_synth.c | ||
10716 | index c5b1d5900eed..d6420d224d09 100644 | ||
10717 | --- a/sound/isa/wavefront/wavefront_synth.c | ||
10718 | +++ b/sound/isa/wavefront/wavefront_synth.c | ||
10719 | @@ -1171,7 +1171,10 @@ wavefront_send_alias (snd_wavefront_t *dev, wavefront_patch_info *header) | ||
10720 | "alias for %d\n", | ||
10721 | header->number, | ||
10722 | header->hdr.a.OriginalSample); | ||
10723 | - | ||
10724 | + | ||
10725 | + if (header->number >= WF_MAX_SAMPLE) | ||
10726 | + return -EINVAL; | ||
10727 | + | ||
10728 | munge_int32 (header->number, &alias_hdr[0], 2); | ||
10729 | munge_int32 (header->hdr.a.OriginalSample, &alias_hdr[2], 2); | ||
10730 | munge_int32 (*((unsigned int *)&header->hdr.a.sampleStartOffset), | ||
10731 | @@ -1202,6 +1205,9 @@ wavefront_send_multisample (snd_wavefront_t *dev, wavefront_patch_info *header) | ||
10732 | int num_samples; | ||
10733 | unsigned char *msample_hdr; | ||
10734 | |||
10735 | + if (header->number >= WF_MAX_SAMPLE) | ||
10736 | + return -EINVAL; | ||
10737 | + | ||
10738 | msample_hdr = kmalloc(WF_MSAMPLE_BYTES, GFP_KERNEL); | ||
10739 | if (! msample_hdr) | ||
10740 | return -ENOMEM; | ||
10741 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c | ||
10742 | index df5afac0b600..459a7d61326e 100644 | ||
10743 | --- a/sound/pci/hda/patch_realtek.c | ||
10744 | +++ b/sound/pci/hda/patch_realtek.c | ||
10745 | @@ -81,6 +81,7 @@ struct alc_spec { | ||
10746 | |||
10747 | /* mute LED for HP laptops, see alc269_fixup_mic_mute_hook() */ | ||
10748 | int mute_led_polarity; | ||
10749 | + int micmute_led_polarity; | ||
10750 | hda_nid_t mute_led_nid; | ||
10751 | hda_nid_t cap_mute_led_nid; | ||
10752 | |||
10753 | @@ -4080,11 +4081,9 @@ static void alc269_fixup_hp_mute_led_mic3(struct hda_codec *codec, | ||
10754 | |||
10755 | /* update LED status via GPIO */ | ||
10756 | static void alc_update_gpio_led(struct hda_codec *codec, unsigned int mask, | ||
10757 | - bool enabled) | ||
10758 | + int polarity, bool enabled) | ||
10759 | { | ||
10760 | - struct alc_spec *spec = codec->spec; | ||
10761 | - | ||
10762 | - if (spec->mute_led_polarity) | ||
10763 | + if (polarity) | ||
10764 | enabled = !enabled; | ||
10765 | alc_update_gpio_data(codec, mask, !enabled); /* muted -> LED on */ | ||
10766 | } | ||
10767 | @@ -4095,7 +4094,8 @@ static void alc_fixup_gpio_mute_hook(void *private_data, int enabled) | ||
10768 | struct hda_codec *codec = private_data; | ||
10769 | struct alc_spec *spec = codec->spec; | ||
10770 | |||
10771 | - alc_update_gpio_led(codec, spec->gpio_mute_led_mask, enabled); | ||
10772 | + alc_update_gpio_led(codec, spec->gpio_mute_led_mask, | ||
10773 | + spec->mute_led_polarity, enabled); | ||
10774 | } | ||
10775 | |||
10776 | /* turn on/off mic-mute LED via GPIO per capture hook */ | ||
10777 | @@ -4104,6 +4104,7 @@ static void alc_gpio_micmute_update(struct hda_codec *codec) | ||
10778 | struct alc_spec *spec = codec->spec; | ||
10779 | |||
10780 | alc_update_gpio_led(codec, spec->gpio_mic_led_mask, | ||
10781 | + spec->micmute_led_polarity, | ||
10782 | spec->gen.micmute_led.led_value); | ||
10783 | } | ||
10784 | |||
10785 | @@ -5808,7 +5809,8 @@ static void alc280_hp_gpio4_automute_hook(struct hda_codec *codec, | ||
10786 | |||
10787 | snd_hda_gen_hp_automute(codec, jack); | ||
10788 | /* mute_led_polarity is set to 0, so we pass inverted value here */ | ||
10789 | - alc_update_gpio_led(codec, 0x10, !spec->gen.hp_jack_present); | ||
10790 | + alc_update_gpio_led(codec, 0x10, spec->mute_led_polarity, | ||
10791 | + !spec->gen.hp_jack_present); | ||
10792 | } | ||
10793 | |||
10794 | /* Manage GPIOs for HP EliteBook Folio 9480m. | ||
10795 | diff --git a/sound/soc/codecs/max98373.c b/sound/soc/codecs/max98373.c | ||
10796 | index cae1def8902d..96718e3a1ad0 100644 | ||
10797 | --- a/sound/soc/codecs/max98373.c | ||
10798 | +++ b/sound/soc/codecs/max98373.c | ||
10799 | @@ -850,8 +850,8 @@ static int max98373_resume(struct device *dev) | ||
10800 | { | ||
10801 | struct max98373_priv *max98373 = dev_get_drvdata(dev); | ||
10802 | |||
10803 | - max98373_reset(max98373, dev); | ||
10804 | regcache_cache_only(max98373->regmap, false); | ||
10805 | + max98373_reset(max98373, dev); | ||
10806 | regcache_sync(max98373->regmap); | ||
10807 | return 0; | ||
10808 | } | ||
10809 | diff --git a/sound/soc/codecs/rt5645.c b/sound/soc/codecs/rt5645.c | ||
10810 | index 19662ee330d6..c83f7f5da96b 100644 | ||
10811 | --- a/sound/soc/codecs/rt5645.c | ||
10812 | +++ b/sound/soc/codecs/rt5645.c | ||
10813 | @@ -3625,6 +3625,12 @@ static const struct rt5645_platform_data asus_t100ha_platform_data = { | ||
10814 | .inv_jd1_1 = true, | ||
10815 | }; | ||
10816 | |||
10817 | +static const struct rt5645_platform_data asus_t101ha_platform_data = { | ||
10818 | + .dmic1_data_pin = RT5645_DMIC_DATA_IN2N, | ||
10819 | + .dmic2_data_pin = RT5645_DMIC2_DISABLE, | ||
10820 | + .jd_mode = 3, | ||
10821 | +}; | ||
10822 | + | ||
10823 | static const struct rt5645_platform_data lenovo_ideapad_miix_310_pdata = { | ||
10824 | .jd_mode = 3, | ||
10825 | .in2_diff = true, | ||
10826 | @@ -3702,6 +3708,14 @@ static const struct dmi_system_id dmi_platform_data[] = { | ||
10827 | }, | ||
10828 | .driver_data = (void *)&asus_t100ha_platform_data, | ||
10829 | }, | ||
10830 | + { | ||
10831 | + .ident = "ASUS T101HA", | ||
10832 | + .matches = { | ||
10833 | + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), | ||
10834 | + DMI_MATCH(DMI_PRODUCT_NAME, "T101HA"), | ||
10835 | + }, | ||
10836 | + .driver_data = (void *)&asus_t101ha_platform_data, | ||
10837 | + }, | ||
10838 | { | ||
10839 | .ident = "MINIX Z83-4", | ||
10840 | .matches = { | ||
10841 | diff --git a/sound/soc/fsl/fsl_asrc_dma.c b/sound/soc/fsl/fsl_asrc_dma.c | ||
10842 | index 01052a0808b0..5aee6b8366d2 100644 | ||
10843 | --- a/sound/soc/fsl/fsl_asrc_dma.c | ||
10844 | +++ b/sound/soc/fsl/fsl_asrc_dma.c | ||
10845 | @@ -241,6 +241,7 @@ static int fsl_asrc_dma_hw_params(struct snd_pcm_substream *substream, | ||
10846 | ret = dmaengine_slave_config(pair->dma_chan[dir], &config_be); | ||
10847 | if (ret) { | ||
10848 | dev_err(dev, "failed to config DMA channel for Back-End\n"); | ||
10849 | + dma_release_channel(pair->dma_chan[dir]); | ||
10850 | return ret; | ||
10851 | } | ||
10852 | |||
10853 | diff --git a/sound/soc/fsl/fsl_esai.c b/sound/soc/fsl/fsl_esai.c | ||
10854 | index c7a49d03463a..84290be778f0 100644 | ||
10855 | --- a/sound/soc/fsl/fsl_esai.c | ||
10856 | +++ b/sound/soc/fsl/fsl_esai.c | ||
10857 | @@ -87,6 +87,10 @@ static irqreturn_t esai_isr(int irq, void *devid) | ||
10858 | if ((saisr & (ESAI_SAISR_TUE | ESAI_SAISR_ROE)) && | ||
10859 | esai_priv->reset_at_xrun) { | ||
10860 | dev_dbg(&pdev->dev, "reset module for xrun\n"); | ||
10861 | + regmap_update_bits(esai_priv->regmap, REG_ESAI_TCR, | ||
10862 | + ESAI_xCR_xEIE_MASK, 0); | ||
10863 | + regmap_update_bits(esai_priv->regmap, REG_ESAI_RCR, | ||
10864 | + ESAI_xCR_xEIE_MASK, 0); | ||
10865 | tasklet_schedule(&esai_priv->task); | ||
10866 | } | ||
10867 | |||
10868 | diff --git a/sound/soc/img/img-i2s-in.c b/sound/soc/img/img-i2s-in.c | ||
10869 | index fdd2c73fd2fa..869fe0068cbd 100644 | ||
10870 | --- a/sound/soc/img/img-i2s-in.c | ||
10871 | +++ b/sound/soc/img/img-i2s-in.c | ||
10872 | @@ -482,6 +482,7 @@ static int img_i2s_in_probe(struct platform_device *pdev) | ||
10873 | if (IS_ERR(rst)) { | ||
10874 | if (PTR_ERR(rst) == -EPROBE_DEFER) { | ||
10875 | ret = -EPROBE_DEFER; | ||
10876 | + pm_runtime_put(&pdev->dev); | ||
10877 | goto err_suspend; | ||
10878 | } | ||
10879 | |||
10880 | diff --git a/sound/soc/intel/boards/bytcr_rt5640.c b/sound/soc/intel/boards/bytcr_rt5640.c | ||
10881 | index e62e1d7815aa..f7964d1ec486 100644 | ||
10882 | --- a/sound/soc/intel/boards/bytcr_rt5640.c | ||
10883 | +++ b/sound/soc/intel/boards/bytcr_rt5640.c | ||
10884 | @@ -742,6 +742,30 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = { | ||
10885 | BYT_RT5640_SSP0_AIF1 | | ||
10886 | BYT_RT5640_MCLK_EN), | ||
10887 | }, | ||
10888 | + { /* Toshiba Encore WT8-A */ | ||
10889 | + .matches = { | ||
10890 | + DMI_EXACT_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), | ||
10891 | + DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "TOSHIBA WT8-A"), | ||
10892 | + }, | ||
10893 | + .driver_data = (void *)(BYT_RT5640_DMIC1_MAP | | ||
10894 | + BYT_RT5640_JD_SRC_JD2_IN4N | | ||
10895 | + BYT_RT5640_OVCD_TH_2000UA | | ||
10896 | + BYT_RT5640_OVCD_SF_0P75 | | ||
10897 | + BYT_RT5640_JD_NOT_INV | | ||
10898 | + BYT_RT5640_MCLK_EN), | ||
10899 | + }, | ||
10900 | + { /* Toshiba Encore WT10-A */ | ||
10901 | + .matches = { | ||
10902 | + DMI_EXACT_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), | ||
10903 | + DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "TOSHIBA WT10-A-103"), | ||
10904 | + }, | ||
10905 | + .driver_data = (void *)(BYT_RT5640_DMIC1_MAP | | ||
10906 | + BYT_RT5640_JD_SRC_JD1_IN4P | | ||
10907 | + BYT_RT5640_OVCD_TH_2000UA | | ||
10908 | + BYT_RT5640_OVCD_SF_0P75 | | ||
10909 | + BYT_RT5640_SSP0_AIF2 | | ||
10910 | + BYT_RT5640_MCLK_EN), | ||
10911 | + }, | ||
10912 | { /* Catch-all for generic Insyde tablets, must be last */ | ||
10913 | .matches = { | ||
10914 | DMI_MATCH(DMI_SYS_VENDOR, "Insyde"), | ||
10915 | diff --git a/sound/soc/meson/axg-fifo.c b/sound/soc/meson/axg-fifo.c | ||
10916 | index d286dff3171d..898ef1d5608f 100644 | ||
10917 | --- a/sound/soc/meson/axg-fifo.c | ||
10918 | +++ b/sound/soc/meson/axg-fifo.c | ||
10919 | @@ -244,7 +244,7 @@ static int axg_fifo_pcm_open(struct snd_pcm_substream *ss) | ||
10920 | /* Enable pclk to access registers and clock the fifo ip */ | ||
10921 | ret = clk_prepare_enable(fifo->pclk); | ||
10922 | if (ret) | ||
10923 | - return ret; | ||
10924 | + goto free_irq; | ||
10925 | |||
10926 | /* Setup status2 so it reports the memory pointer */ | ||
10927 | regmap_update_bits(fifo->map, FIFO_CTRL1, | ||
10928 | @@ -264,8 +264,14 @@ static int axg_fifo_pcm_open(struct snd_pcm_substream *ss) | ||
10929 | /* Take memory arbitror out of reset */ | ||
10930 | ret = reset_control_deassert(fifo->arb); | ||
10931 | if (ret) | ||
10932 | - clk_disable_unprepare(fifo->pclk); | ||
10933 | + goto free_clk; | ||
10934 | + | ||
10935 | + return 0; | ||
10936 | |||
10937 | +free_clk: | ||
10938 | + clk_disable_unprepare(fifo->pclk); | ||
10939 | +free_irq: | ||
10940 | + free_irq(fifo->irq, ss); | ||
10941 | return ret; | ||
10942 | } | ||
10943 | |||
10944 | diff --git a/sound/soc/qcom/qdsp6/q6asm-dai.c b/sound/soc/qcom/qdsp6/q6asm-dai.c | ||
10945 | index 548eb4fa2da6..9f0ffdcef637 100644 | ||
10946 | --- a/sound/soc/qcom/qdsp6/q6asm-dai.c | ||
10947 | +++ b/sound/soc/qcom/qdsp6/q6asm-dai.c | ||
10948 | @@ -171,7 +171,7 @@ static const struct snd_compr_codec_caps q6asm_compr_caps = { | ||
10949 | }; | ||
10950 | |||
10951 | static void event_handler(uint32_t opcode, uint32_t token, | ||
10952 | - uint32_t *payload, void *priv) | ||
10953 | + void *payload, void *priv) | ||
10954 | { | ||
10955 | struct q6asm_dai_rtd *prtd = priv; | ||
10956 | struct snd_pcm_substream *substream = prtd->substream; | ||
10957 | @@ -494,7 +494,7 @@ static struct snd_pcm_ops q6asm_dai_ops = { | ||
10958 | }; | ||
10959 | |||
10960 | static void compress_event_handler(uint32_t opcode, uint32_t token, | ||
10961 | - uint32_t *payload, void *priv) | ||
10962 | + void *payload, void *priv) | ||
10963 | { | ||
10964 | struct q6asm_dai_rtd *prtd = priv; | ||
10965 | struct snd_compr_stream *substream = prtd->cstream; | ||
10966 | diff --git a/sound/soc/sh/rcar/gen.c b/sound/soc/sh/rcar/gen.c | ||
10967 | index af19010b9d88..8bd49c8a9517 100644 | ||
10968 | --- a/sound/soc/sh/rcar/gen.c | ||
10969 | +++ b/sound/soc/sh/rcar/gen.c | ||
10970 | @@ -224,6 +224,14 @@ static int rsnd_gen2_probe(struct rsnd_priv *priv) | ||
10971 | RSND_GEN_S_REG(SSI_SYS_STATUS5, 0x884), | ||
10972 | RSND_GEN_S_REG(SSI_SYS_STATUS6, 0x888), | ||
10973 | RSND_GEN_S_REG(SSI_SYS_STATUS7, 0x88c), | ||
10974 | + RSND_GEN_S_REG(SSI_SYS_INT_ENABLE0, 0x850), | ||
10975 | + RSND_GEN_S_REG(SSI_SYS_INT_ENABLE1, 0x854), | ||
10976 | + RSND_GEN_S_REG(SSI_SYS_INT_ENABLE2, 0x858), | ||
10977 | + RSND_GEN_S_REG(SSI_SYS_INT_ENABLE3, 0x85c), | ||
10978 | + RSND_GEN_S_REG(SSI_SYS_INT_ENABLE4, 0x890), | ||
10979 | + RSND_GEN_S_REG(SSI_SYS_INT_ENABLE5, 0x894), | ||
10980 | + RSND_GEN_S_REG(SSI_SYS_INT_ENABLE6, 0x898), | ||
10981 | + RSND_GEN_S_REG(SSI_SYS_INT_ENABLE7, 0x89c), | ||
10982 | RSND_GEN_S_REG(HDMI0_SEL, 0x9e0), | ||
10983 | RSND_GEN_S_REG(HDMI1_SEL, 0x9e4), | ||
10984 | |||
10985 | diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h | ||
10986 | index ea6cbaa9743e..d47608ff5fac 100644 | ||
10987 | --- a/sound/soc/sh/rcar/rsnd.h | ||
10988 | +++ b/sound/soc/sh/rcar/rsnd.h | ||
10989 | @@ -189,6 +189,14 @@ enum rsnd_reg { | ||
10990 | SSI_SYS_STATUS5, | ||
10991 | SSI_SYS_STATUS6, | ||
10992 | SSI_SYS_STATUS7, | ||
10993 | + SSI_SYS_INT_ENABLE0, | ||
10994 | + SSI_SYS_INT_ENABLE1, | ||
10995 | + SSI_SYS_INT_ENABLE2, | ||
10996 | + SSI_SYS_INT_ENABLE3, | ||
10997 | + SSI_SYS_INT_ENABLE4, | ||
10998 | + SSI_SYS_INT_ENABLE5, | ||
10999 | + SSI_SYS_INT_ENABLE6, | ||
11000 | + SSI_SYS_INT_ENABLE7, | ||
11001 | HDMI0_SEL, | ||
11002 | HDMI1_SEL, | ||
11003 | SSI9_BUSIF0_MODE, | ||
11004 | @@ -237,6 +245,7 @@ enum rsnd_reg { | ||
11005 | #define SSI9_BUSIF_ADINR(i) (SSI9_BUSIF0_ADINR + (i)) | ||
11006 | #define SSI9_BUSIF_DALIGN(i) (SSI9_BUSIF0_DALIGN + (i)) | ||
11007 | #define SSI_SYS_STATUS(i) (SSI_SYS_STATUS0 + (i)) | ||
11008 | +#define SSI_SYS_INT_ENABLE(i) (SSI_SYS_INT_ENABLE0 + (i)) | ||
11009 | |||
11010 | |||
11011 | struct rsnd_priv; | ||
11012 | diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c | ||
11013 | index 4a7d3413917f..47d5ddb526f2 100644 | ||
11014 | --- a/sound/soc/sh/rcar/ssi.c | ||
11015 | +++ b/sound/soc/sh/rcar/ssi.c | ||
11016 | @@ -372,6 +372,9 @@ static void rsnd_ssi_config_init(struct rsnd_mod *mod, | ||
11017 | u32 wsr = ssi->wsr; | ||
11018 | int width; | ||
11019 | int is_tdm, is_tdm_split; | ||
11020 | + int id = rsnd_mod_id(mod); | ||
11021 | + int i; | ||
11022 | + u32 sys_int_enable = 0; | ||
11023 | |||
11024 | is_tdm = rsnd_runtime_is_tdm(io); | ||
11025 | is_tdm_split = rsnd_runtime_is_tdm_split(io); | ||
11026 | @@ -447,6 +450,38 @@ static void rsnd_ssi_config_init(struct rsnd_mod *mod, | ||
11027 | cr_mode = DIEN; /* PIO : enable Data interrupt */ | ||
11028 | } | ||
11029 | |||
11030 | + /* enable busif buffer over/under run interrupt. */ | ||
11031 | + if (is_tdm || is_tdm_split) { | ||
11032 | + switch (id) { | ||
11033 | + case 0: | ||
11034 | + case 1: | ||
11035 | + case 2: | ||
11036 | + case 3: | ||
11037 | + case 4: | ||
11038 | + for (i = 0; i < 4; i++) { | ||
11039 | + sys_int_enable = rsnd_mod_read(mod, | ||
11040 | + SSI_SYS_INT_ENABLE(i * 2)); | ||
11041 | + sys_int_enable |= 0xf << (id * 4); | ||
11042 | + rsnd_mod_write(mod, | ||
11043 | + SSI_SYS_INT_ENABLE(i * 2), | ||
11044 | + sys_int_enable); | ||
11045 | + } | ||
11046 | + | ||
11047 | + break; | ||
11048 | + case 9: | ||
11049 | + for (i = 0; i < 4; i++) { | ||
11050 | + sys_int_enable = rsnd_mod_read(mod, | ||
11051 | + SSI_SYS_INT_ENABLE((i * 2) + 1)); | ||
11052 | + sys_int_enable |= 0xf << 4; | ||
11053 | + rsnd_mod_write(mod, | ||
11054 | + SSI_SYS_INT_ENABLE((i * 2) + 1), | ||
11055 | + sys_int_enable); | ||
11056 | + } | ||
11057 | + | ||
11058 | + break; | ||
11059 | + } | ||
11060 | + } | ||
11061 | + | ||
11062 | init_end: | ||
11063 | ssi->cr_own = cr_own; | ||
11064 | ssi->cr_mode = cr_mode; | ||
11065 | @@ -496,6 +531,13 @@ static int rsnd_ssi_quit(struct rsnd_mod *mod, | ||
11066 | { | ||
11067 | struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); | ||
11068 | struct device *dev = rsnd_priv_to_dev(priv); | ||
11069 | + int is_tdm, is_tdm_split; | ||
11070 | + int id = rsnd_mod_id(mod); | ||
11071 | + int i; | ||
11072 | + u32 sys_int_enable = 0; | ||
11073 | + | ||
11074 | + is_tdm = rsnd_runtime_is_tdm(io); | ||
11075 | + is_tdm_split = rsnd_runtime_is_tdm_split(io); | ||
11076 | |||
11077 | if (!rsnd_ssi_is_run_mods(mod, io)) | ||
11078 | return 0; | ||
11079 | @@ -517,6 +559,38 @@ static int rsnd_ssi_quit(struct rsnd_mod *mod, | ||
11080 | ssi->wsr = 0; | ||
11081 | } | ||
11082 | |||
11083 | + /* disable busif buffer over/under run interrupt. */ | ||
11084 | + if (is_tdm || is_tdm_split) { | ||
11085 | + switch (id) { | ||
11086 | + case 0: | ||
11087 | + case 1: | ||
11088 | + case 2: | ||
11089 | + case 3: | ||
11090 | + case 4: | ||
11091 | + for (i = 0; i < 4; i++) { | ||
11092 | + sys_int_enable = rsnd_mod_read(mod, | ||
11093 | + SSI_SYS_INT_ENABLE(i * 2)); | ||
11094 | + sys_int_enable &= ~(0xf << (id * 4)); | ||
11095 | + rsnd_mod_write(mod, | ||
11096 | + SSI_SYS_INT_ENABLE(i * 2), | ||
11097 | + sys_int_enable); | ||
11098 | + } | ||
11099 | + | ||
11100 | + break; | ||
11101 | + case 9: | ||
11102 | + for (i = 0; i < 4; i++) { | ||
11103 | + sys_int_enable = rsnd_mod_read(mod, | ||
11104 | + SSI_SYS_INT_ENABLE((i * 2) + 1)); | ||
11105 | + sys_int_enable &= ~(0xf << 4); | ||
11106 | + rsnd_mod_write(mod, | ||
11107 | + SSI_SYS_INT_ENABLE((i * 2) + 1), | ||
11108 | + sys_int_enable); | ||
11109 | + } | ||
11110 | + | ||
11111 | + break; | ||
11112 | + } | ||
11113 | + } | ||
11114 | + | ||
11115 | return 0; | ||
11116 | } | ||
11117 | |||
11118 | @@ -622,6 +696,11 @@ static int rsnd_ssi_irq(struct rsnd_mod *mod, | ||
11119 | int enable) | ||
11120 | { | ||
11121 | u32 val = 0; | ||
11122 | + int is_tdm, is_tdm_split; | ||
11123 | + int id = rsnd_mod_id(mod); | ||
11124 | + | ||
11125 | + is_tdm = rsnd_runtime_is_tdm(io); | ||
11126 | + is_tdm_split = rsnd_runtime_is_tdm_split(io); | ||
11127 | |||
11128 | if (rsnd_is_gen1(priv)) | ||
11129 | return 0; | ||
11130 | @@ -635,6 +714,19 @@ static int rsnd_ssi_irq(struct rsnd_mod *mod, | ||
11131 | if (enable) | ||
11132 | val = rsnd_ssi_is_dma_mode(mod) ? 0x0e000000 : 0x0f000000; | ||
11133 | |||
11134 | + if (is_tdm || is_tdm_split) { | ||
11135 | + switch (id) { | ||
11136 | + case 0: | ||
11137 | + case 1: | ||
11138 | + case 2: | ||
11139 | + case 3: | ||
11140 | + case 4: | ||
11141 | + case 9: | ||
11142 | + val |= 0x0000ff00; | ||
11143 | + break; | ||
11144 | + } | ||
11145 | + } | ||
11146 | + | ||
11147 | rsnd_mod_write(mod, SSI_INT_ENABLE, val); | ||
11148 | |||
11149 | return 0; | ||
11150 | @@ -651,6 +743,12 @@ static void __rsnd_ssi_interrupt(struct rsnd_mod *mod, | ||
11151 | u32 status; | ||
11152 | bool elapsed = false; | ||
11153 | bool stop = false; | ||
11154 | + int id = rsnd_mod_id(mod); | ||
11155 | + int i; | ||
11156 | + int is_tdm, is_tdm_split; | ||
11157 | + | ||
11158 | + is_tdm = rsnd_runtime_is_tdm(io); | ||
11159 | + is_tdm_split = rsnd_runtime_is_tdm_split(io); | ||
11160 | |||
11161 | spin_lock(&priv->lock); | ||
11162 | |||
11163 | @@ -672,6 +770,53 @@ static void __rsnd_ssi_interrupt(struct rsnd_mod *mod, | ||
11164 | stop = true; | ||
11165 | } | ||
11166 | |||
11167 | + status = 0; | ||
11168 | + | ||
11169 | + if (is_tdm || is_tdm_split) { | ||
11170 | + switch (id) { | ||
11171 | + case 0: | ||
11172 | + case 1: | ||
11173 | + case 2: | ||
11174 | + case 3: | ||
11175 | + case 4: | ||
11176 | + for (i = 0; i < 4; i++) { | ||
11177 | + status = rsnd_mod_read(mod, | ||
11178 | + SSI_SYS_STATUS(i * 2)); | ||
11179 | + status &= 0xf << (id * 4); | ||
11180 | + | ||
11181 | + if (status) { | ||
11182 | + rsnd_dbg_irq_status(dev, | ||
11183 | + "%s err status : 0x%08x\n", | ||
11184 | + rsnd_mod_name(mod), status); | ||
11185 | + rsnd_mod_write(mod, | ||
11186 | + SSI_SYS_STATUS(i * 2), | ||
11187 | + 0xf << (id * 4)); | ||
11188 | + stop = true; | ||
11189 | + break; | ||
11190 | + } | ||
11191 | + } | ||
11192 | + break; | ||
11193 | + case 9: | ||
11194 | + for (i = 0; i < 4; i++) { | ||
11195 | + status = rsnd_mod_read(mod, | ||
11196 | + SSI_SYS_STATUS((i * 2) + 1)); | ||
11197 | + status &= 0xf << 4; | ||
11198 | + | ||
11199 | + if (status) { | ||
11200 | + rsnd_dbg_irq_status(dev, | ||
11201 | + "%s err status : 0x%08x\n", | ||
11202 | + rsnd_mod_name(mod), status); | ||
11203 | + rsnd_mod_write(mod, | ||
11204 | + SSI_SYS_STATUS((i * 2) + 1), | ||
11205 | + 0xf << 4); | ||
11206 | + stop = true; | ||
11207 | + break; | ||
11208 | + } | ||
11209 | + } | ||
11210 | + break; | ||
11211 | + } | ||
11212 | + } | ||
11213 | + | ||
11214 | rsnd_ssi_status_clear(mod); | ||
11215 | rsnd_ssi_interrupt_out: | ||
11216 | spin_unlock(&priv->lock); | ||
11217 | diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c | ||
11218 | index 0215e2c94bf0..9df20768a8f2 100644 | ||
11219 | --- a/sound/soc/soc-core.c | ||
11220 | +++ b/sound/soc/soc-core.c | ||
11221 | @@ -1895,9 +1895,25 @@ match: | ||
11222 | dai_link->platforms->name = component->name; | ||
11223 | |||
11224 | /* convert non BE into BE */ | ||
11225 | - dai_link->no_pcm = 1; | ||
11226 | - dai_link->dpcm_playback = 1; | ||
11227 | - dai_link->dpcm_capture = 1; | ||
11228 | + if (!dai_link->no_pcm) { | ||
11229 | + dai_link->no_pcm = 1; | ||
11230 | + | ||
11231 | + if (dai_link->dpcm_playback) | ||
11232 | + dev_warn(card->dev, | ||
11233 | + "invalid configuration, dailink %s has flags no_pcm=0 and dpcm_playback=1\n", | ||
11234 | + dai_link->name); | ||
11235 | + if (dai_link->dpcm_capture) | ||
11236 | + dev_warn(card->dev, | ||
11237 | + "invalid configuration, dailink %s has flags no_pcm=0 and dpcm_capture=1\n", | ||
11238 | + dai_link->name); | ||
11239 | + | ||
11240 | + /* convert normal link into DPCM one */ | ||
11241 | + if (!(dai_link->dpcm_playback || | ||
11242 | + dai_link->dpcm_capture)) { | ||
11243 | + dai_link->dpcm_playback = !dai_link->capture_only; | ||
11244 | + dai_link->dpcm_capture = !dai_link->playback_only; | ||
11245 | + } | ||
11246 | + } | ||
11247 | |||
11248 | /* override any BE fixups */ | ||
11249 | dai_link->be_hw_params_fixup = | ||
11250 | diff --git a/sound/soc/sof/core.c b/sound/soc/sof/core.c | ||
11251 | index 12aec140819a..2a6b84d2781e 100644 | ||
11252 | --- a/sound/soc/sof/core.c | ||
11253 | +++ b/sound/soc/sof/core.c | ||
11254 | @@ -372,6 +372,7 @@ static int sof_probe_continue(struct snd_sof_dev *sdev) | ||
11255 | /* init the IPC */ | ||
11256 | sdev->ipc = snd_sof_ipc_init(sdev); | ||
11257 | if (!sdev->ipc) { | ||
11258 | + ret = -ENOMEM; | ||
11259 | dev_err(sdev->dev, "error: failed to init DSP IPC %d\n", ret); | ||
11260 | goto ipc_err; | ||
11261 | } | ||
11262 | diff --git a/sound/soc/sof/imx/Kconfig b/sound/soc/sof/imx/Kconfig | ||
11263 | index 71f318bc2c74..b4f0426685c4 100644 | ||
11264 | --- a/sound/soc/sof/imx/Kconfig | ||
11265 | +++ b/sound/soc/sof/imx/Kconfig | ||
11266 | @@ -14,7 +14,7 @@ if SND_SOC_SOF_IMX_TOPLEVEL | ||
11267 | config SND_SOC_SOF_IMX8_SUPPORT | ||
11268 | bool "SOF support for i.MX8" | ||
11269 | depends on IMX_SCU | ||
11270 | - depends on IMX_DSP | ||
11271 | + select IMX_DSP | ||
11272 | help | ||
11273 | This adds support for Sound Open Firmware for NXP i.MX8 platforms | ||
11274 | Say Y if you have such a device. | ||
11275 | diff --git a/sound/soc/sof/nocodec.c b/sound/soc/sof/nocodec.c | ||
11276 | index 3d128e5a132c..ea0fe9a09f3f 100644 | ||
11277 | --- a/sound/soc/sof/nocodec.c | ||
11278 | +++ b/sound/soc/sof/nocodec.c | ||
11279 | @@ -52,8 +52,10 @@ static int sof_nocodec_bes_setup(struct device *dev, | ||
11280 | links[i].platforms->name = dev_name(dev); | ||
11281 | links[i].codecs->dai_name = "snd-soc-dummy-dai"; | ||
11282 | links[i].codecs->name = "snd-soc-dummy"; | ||
11283 | - links[i].dpcm_playback = 1; | ||
11284 | - links[i].dpcm_capture = 1; | ||
11285 | + if (ops->drv[i].playback.channels_min) | ||
11286 | + links[i].dpcm_playback = 1; | ||
11287 | + if (ops->drv[i].capture.channels_min) | ||
11288 | + links[i].dpcm_capture = 1; | ||
11289 | } | ||
11290 | |||
11291 | card->dai_link = links; | ||
11292 | diff --git a/sound/soc/sof/pm.c b/sound/soc/sof/pm.c | ||
11293 | index 195af259e78e..128680b09c20 100644 | ||
11294 | --- a/sound/soc/sof/pm.c | ||
11295 | +++ b/sound/soc/sof/pm.c | ||
11296 | @@ -266,7 +266,10 @@ static int sof_resume(struct device *dev, bool runtime_resume) | ||
11297 | int ret; | ||
11298 | |||
11299 | /* do nothing if dsp resume callbacks are not set */ | ||
11300 | - if (!sof_ops(sdev)->resume || !sof_ops(sdev)->runtime_resume) | ||
11301 | + if (!runtime_resume && !sof_ops(sdev)->resume) | ||
11302 | + return 0; | ||
11303 | + | ||
11304 | + if (runtime_resume && !sof_ops(sdev)->runtime_resume) | ||
11305 | return 0; | ||
11306 | |||
11307 | /* DSP was never successfully started, nothing to resume */ | ||
11308 | @@ -346,7 +349,10 @@ static int sof_suspend(struct device *dev, bool runtime_suspend) | ||
11309 | int ret; | ||
11310 | |||
11311 | /* do nothing if dsp suspend callback is not set */ | ||
11312 | - if (!sof_ops(sdev)->suspend) | ||
11313 | + if (!runtime_suspend && !sof_ops(sdev)->suspend) | ||
11314 | + return 0; | ||
11315 | + | ||
11316 | + if (runtime_suspend && !sof_ops(sdev)->runtime_suspend) | ||
11317 | return 0; | ||
11318 | |||
11319 | if (sdev->fw_state != SOF_FW_BOOT_COMPLETE) | ||
11320 | diff --git a/sound/soc/tegra/tegra_wm8903.c b/sound/soc/tegra/tegra_wm8903.c | ||
11321 | index 6211dfda2195..0fa01cacfec9 100644 | ||
11322 | --- a/sound/soc/tegra/tegra_wm8903.c | ||
11323 | +++ b/sound/soc/tegra/tegra_wm8903.c | ||
11324 | @@ -159,6 +159,7 @@ static int tegra_wm8903_init(struct snd_soc_pcm_runtime *rtd) | ||
11325 | struct snd_soc_component *component = codec_dai->component; | ||
11326 | struct snd_soc_card *card = rtd->card; | ||
11327 | struct tegra_wm8903 *machine = snd_soc_card_get_drvdata(card); | ||
11328 | + int shrt = 0; | ||
11329 | |||
11330 | if (gpio_is_valid(machine->gpio_hp_det)) { | ||
11331 | tegra_wm8903_hp_jack_gpio.gpio = machine->gpio_hp_det; | ||
11332 | @@ -171,12 +172,15 @@ static int tegra_wm8903_init(struct snd_soc_pcm_runtime *rtd) | ||
11333 | &tegra_wm8903_hp_jack_gpio); | ||
11334 | } | ||
11335 | |||
11336 | + if (of_property_read_bool(card->dev->of_node, "nvidia,headset")) | ||
11337 | + shrt = SND_JACK_MICROPHONE; | ||
11338 | + | ||
11339 | snd_soc_card_jack_new(rtd->card, "Mic Jack", SND_JACK_MICROPHONE, | ||
11340 | &tegra_wm8903_mic_jack, | ||
11341 | tegra_wm8903_mic_jack_pins, | ||
11342 | ARRAY_SIZE(tegra_wm8903_mic_jack_pins)); | ||
11343 | wm8903_mic_detect(component, &tegra_wm8903_mic_jack, SND_JACK_MICROPHONE, | ||
11344 | - 0); | ||
11345 | + shrt); | ||
11346 | |||
11347 | snd_soc_dapm_force_enable_pin(&card->dapm, "MICBIAS"); | ||
11348 | |||
11349 | diff --git a/sound/soc/ti/davinci-mcasp.c b/sound/soc/ti/davinci-mcasp.c | ||
11350 | index 7aa3c32e4a49..0541071f454b 100644 | ||
11351 | --- a/sound/soc/ti/davinci-mcasp.c | ||
11352 | +++ b/sound/soc/ti/davinci-mcasp.c | ||
11353 | @@ -1875,8 +1875,10 @@ static int davinci_mcasp_get_dma_type(struct davinci_mcasp *mcasp) | ||
11354 | PTR_ERR(chan)); | ||
11355 | return PTR_ERR(chan); | ||
11356 | } | ||
11357 | - if (WARN_ON(!chan->device || !chan->device->dev)) | ||
11358 | + if (WARN_ON(!chan->device || !chan->device->dev)) { | ||
11359 | + dma_release_channel(chan); | ||
11360 | return -EINVAL; | ||
11361 | + } | ||
11362 | |||
11363 | if (chan->device->dev->of_node) | ||
11364 | ret = of_property_read_string(chan->device->dev->of_node, | ||
11365 | diff --git a/sound/soc/ti/omap-mcbsp.c b/sound/soc/ti/omap-mcbsp.c | ||
11366 | index 26b503bbdb5f..3273b317fa3b 100644 | ||
11367 | --- a/sound/soc/ti/omap-mcbsp.c | ||
11368 | +++ b/sound/soc/ti/omap-mcbsp.c | ||
11369 | @@ -686,7 +686,7 @@ static int omap_mcbsp_init(struct platform_device *pdev) | ||
11370 | mcbsp->dma_data[1].addr = omap_mcbsp_dma_reg_params(mcbsp, | ||
11371 | SNDRV_PCM_STREAM_CAPTURE); | ||
11372 | |||
11373 | - mcbsp->fclk = clk_get(&pdev->dev, "fck"); | ||
11374 | + mcbsp->fclk = devm_clk_get(&pdev->dev, "fck"); | ||
11375 | if (IS_ERR(mcbsp->fclk)) { | ||
11376 | ret = PTR_ERR(mcbsp->fclk); | ||
11377 | dev_err(mcbsp->dev, "unable to get fck: %d\n", ret); | ||
11378 | @@ -711,7 +711,7 @@ static int omap_mcbsp_init(struct platform_device *pdev) | ||
11379 | if (ret) { | ||
11380 | dev_err(mcbsp->dev, | ||
11381 | "Unable to create additional controls\n"); | ||
11382 | - goto err_thres; | ||
11383 | + return ret; | ||
11384 | } | ||
11385 | } | ||
11386 | |||
11387 | @@ -724,8 +724,6 @@ static int omap_mcbsp_init(struct platform_device *pdev) | ||
11388 | err_st: | ||
11389 | if (mcbsp->pdata->buffer_size) | ||
11390 | sysfs_remove_group(&mcbsp->dev->kobj, &additional_attr_group); | ||
11391 | -err_thres: | ||
11392 | - clk_put(mcbsp->fclk); | ||
11393 | return ret; | ||
11394 | } | ||
11395 | |||
11396 | @@ -1442,8 +1440,6 @@ static int asoc_mcbsp_remove(struct platform_device *pdev) | ||
11397 | |||
11398 | omap_mcbsp_st_cleanup(pdev); | ||
11399 | |||
11400 | - clk_put(mcbsp->fclk); | ||
11401 | - | ||
11402 | return 0; | ||
11403 | } | ||
11404 | |||
11405 | diff --git a/sound/soc/ux500/mop500.c b/sound/soc/ux500/mop500.c | ||
11406 | index 2873e8e6f02b..cdae1190b930 100644 | ||
11407 | --- a/sound/soc/ux500/mop500.c | ||
11408 | +++ b/sound/soc/ux500/mop500.c | ||
11409 | @@ -63,10 +63,11 @@ static void mop500_of_node_put(void) | ||
11410 | { | ||
11411 | int i; | ||
11412 | |||
11413 | - for (i = 0; i < 2; i++) { | ||
11414 | + for (i = 0; i < 2; i++) | ||
11415 | of_node_put(mop500_dai_links[i].cpus->of_node); | ||
11416 | - of_node_put(mop500_dai_links[i].codecs->of_node); | ||
11417 | - } | ||
11418 | + | ||
11419 | + /* Both links use the same codec, which is refcounted only once */ | ||
11420 | + of_node_put(mop500_dai_links[0].codecs->of_node); | ||
11421 | } | ||
11422 | |||
11423 | static int mop500_of_probe(struct platform_device *pdev, | ||
11424 | @@ -81,7 +82,9 @@ static int mop500_of_probe(struct platform_device *pdev, | ||
11425 | |||
11426 | if (!(msp_np[0] && msp_np[1] && codec_np)) { | ||
11427 | dev_err(&pdev->dev, "Phandle missing or invalid\n"); | ||
11428 | - mop500_of_node_put(); | ||
11429 | + for (i = 0; i < 2; i++) | ||
11430 | + of_node_put(msp_np[i]); | ||
11431 | + of_node_put(codec_np); | ||
11432 | return -EINVAL; | ||
11433 | } | ||
11434 | |||
11435 | diff --git a/sound/usb/card.h b/sound/usb/card.h | ||
11436 | index 395403a2d33f..d6219fba9699 100644 | ||
11437 | --- a/sound/usb/card.h | ||
11438 | +++ b/sound/usb/card.h | ||
11439 | @@ -84,6 +84,10 @@ struct snd_usb_endpoint { | ||
11440 | dma_addr_t sync_dma; /* DMA address of syncbuf */ | ||
11441 | |||
11442 | unsigned int pipe; /* the data i/o pipe */ | ||
11443 | + unsigned int framesize[2]; /* small/large frame sizes in samples */ | ||
11444 | + unsigned int sample_rem; /* remainder from division fs/fps */ | ||
11445 | + unsigned int sample_accum; /* sample accumulator */ | ||
11446 | + unsigned int fps; /* frames per second */ | ||
11447 | unsigned int freqn; /* nominal sampling rate in fs/fps in Q16.16 format */ | ||
11448 | unsigned int freqm; /* momentary sampling rate in fs/fps in Q16.16 format */ | ||
11449 | int freqshift; /* how much to shift the feedback value to get Q16.16 */ | ||
11450 | @@ -104,6 +108,7 @@ struct snd_usb_endpoint { | ||
11451 | int iface, altsetting; | ||
11452 | int skip_packets; /* quirks for devices to ignore the first n packets | ||
11453 | in a stream */ | ||
11454 | + bool is_implicit_feedback; /* This endpoint is used as implicit feedback */ | ||
11455 | |||
11456 | spinlock_t lock; | ||
11457 | struct list_head list; | ||
11458 | diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c | ||
11459 | index 4a9a2f6ef5a4..9bea7d3f99f8 100644 | ||
11460 | --- a/sound/usb/endpoint.c | ||
11461 | +++ b/sound/usb/endpoint.c | ||
11462 | @@ -124,12 +124,12 @@ int snd_usb_endpoint_implicit_feedback_sink(struct snd_usb_endpoint *ep) | ||
11463 | |||
11464 | /* | ||
11465 | * For streaming based on information derived from sync endpoints, | ||
11466 | - * prepare_outbound_urb_sizes() will call next_packet_size() to | ||
11467 | + * prepare_outbound_urb_sizes() will call slave_next_packet_size() to | ||
11468 | * determine the number of samples to be sent in the next packet. | ||
11469 | * | ||
11470 | - * For implicit feedback, next_packet_size() is unused. | ||
11471 | + * For implicit feedback, slave_next_packet_size() is unused. | ||
11472 | */ | ||
11473 | -int snd_usb_endpoint_next_packet_size(struct snd_usb_endpoint *ep) | ||
11474 | +int snd_usb_endpoint_slave_next_packet_size(struct snd_usb_endpoint *ep) | ||
11475 | { | ||
11476 | unsigned long flags; | ||
11477 | int ret; | ||
11478 | @@ -146,6 +146,29 @@ int snd_usb_endpoint_next_packet_size(struct snd_usb_endpoint *ep) | ||
11479 | return ret; | ||
11480 | } | ||
11481 | |||
11482 | +/* | ||
11483 | + * For adaptive and synchronous endpoints, prepare_outbound_urb_sizes() | ||
11484 | + * will call next_packet_size() to determine the number of samples to be | ||
11485 | + * sent in the next packet. | ||
11486 | + */ | ||
11487 | +int snd_usb_endpoint_next_packet_size(struct snd_usb_endpoint *ep) | ||
11488 | +{ | ||
11489 | + int ret; | ||
11490 | + | ||
11491 | + if (ep->fill_max) | ||
11492 | + return ep->maxframesize; | ||
11493 | + | ||
11494 | + ep->sample_accum += ep->sample_rem; | ||
11495 | + if (ep->sample_accum >= ep->fps) { | ||
11496 | + ep->sample_accum -= ep->fps; | ||
11497 | + ret = ep->framesize[1]; | ||
11498 | + } else { | ||
11499 | + ret = ep->framesize[0]; | ||
11500 | + } | ||
11501 | + | ||
11502 | + return ret; | ||
11503 | +} | ||
11504 | + | ||
11505 | static void retire_outbound_urb(struct snd_usb_endpoint *ep, | ||
11506 | struct snd_urb_ctx *urb_ctx) | ||
11507 | { | ||
11508 | @@ -190,6 +213,8 @@ static void prepare_silent_urb(struct snd_usb_endpoint *ep, | ||
11509 | |||
11510 | if (ctx->packet_size[i]) | ||
11511 | counts = ctx->packet_size[i]; | ||
11512 | + else if (ep->sync_master) | ||
11513 | + counts = snd_usb_endpoint_slave_next_packet_size(ep); | ||
11514 | else | ||
11515 | counts = snd_usb_endpoint_next_packet_size(ep); | ||
11516 | |||
11517 | @@ -321,17 +346,17 @@ static void queue_pending_output_urbs(struct snd_usb_endpoint *ep) | ||
11518 | ep->next_packet_read_pos %= MAX_URBS; | ||
11519 | |||
11520 | /* take URB out of FIFO */ | ||
11521 | - if (!list_empty(&ep->ready_playback_urbs)) | ||
11522 | + if (!list_empty(&ep->ready_playback_urbs)) { | ||
11523 | ctx = list_first_entry(&ep->ready_playback_urbs, | ||
11524 | struct snd_urb_ctx, ready_list); | ||
11525 | + list_del_init(&ctx->ready_list); | ||
11526 | + } | ||
11527 | } | ||
11528 | spin_unlock_irqrestore(&ep->lock, flags); | ||
11529 | |||
11530 | if (ctx == NULL) | ||
11531 | return; | ||
11532 | |||
11533 | - list_del_init(&ctx->ready_list); | ||
11534 | - | ||
11535 | /* copy over the length information */ | ||
11536 | for (i = 0; i < packet->packets; i++) | ||
11537 | ctx->packet_size[i] = packet->packet_size[i]; | ||
11538 | @@ -497,6 +522,8 @@ struct snd_usb_endpoint *snd_usb_add_endpoint(struct snd_usb_audio *chip, | ||
11539 | |||
11540 | list_add_tail(&ep->list, &chip->ep_list); | ||
11541 | |||
11542 | + ep->is_implicit_feedback = 0; | ||
11543 | + | ||
11544 | __exit_unlock: | ||
11545 | mutex_unlock(&chip->mutex); | ||
11546 | |||
11547 | @@ -596,6 +623,178 @@ static void release_urbs(struct snd_usb_endpoint *ep, int force) | ||
11548 | ep->nurbs = 0; | ||
11549 | } | ||
11550 | |||
11551 | +/* | ||
11552 | + * Check data endpoint for format differences | ||
11553 | + */ | ||
11554 | +static bool check_ep_params(struct snd_usb_endpoint *ep, | ||
11555 | + snd_pcm_format_t pcm_format, | ||
11556 | + unsigned int channels, | ||
11557 | + unsigned int period_bytes, | ||
11558 | + unsigned int frames_per_period, | ||
11559 | + unsigned int periods_per_buffer, | ||
11560 | + struct audioformat *fmt, | ||
11561 | + struct snd_usb_endpoint *sync_ep) | ||
11562 | +{ | ||
11563 | + unsigned int maxsize, minsize, packs_per_ms, max_packs_per_urb; | ||
11564 | + unsigned int max_packs_per_period, urbs_per_period, urb_packs; | ||
11565 | + unsigned int max_urbs; | ||
11566 | + int frame_bits = snd_pcm_format_physical_width(pcm_format) * channels; | ||
11567 | + int tx_length_quirk = (ep->chip->tx_length_quirk && | ||
11568 | + usb_pipeout(ep->pipe)); | ||
11569 | + bool ret = 1; | ||
11570 | + | ||
11571 | + if (pcm_format == SNDRV_PCM_FORMAT_DSD_U16_LE && fmt->dsd_dop) { | ||
11572 | + /* | ||
11573 | + * When operating in DSD DOP mode, the size of a sample frame | ||
11574 | + * in hardware differs from the actual physical format width | ||
11575 | + * because we need to make room for the DOP markers. | ||
11576 | + */ | ||
11577 | + frame_bits += channels << 3; | ||
11578 | + } | ||
11579 | + | ||
11580 | + ret = ret && (ep->datainterval == fmt->datainterval); | ||
11581 | + ret = ret && (ep->stride == frame_bits >> 3); | ||
11582 | + | ||
11583 | + switch (pcm_format) { | ||
11584 | + case SNDRV_PCM_FORMAT_U8: | ||
11585 | + ret = ret && (ep->silence_value == 0x80); | ||
11586 | + break; | ||
11587 | + case SNDRV_PCM_FORMAT_DSD_U8: | ||
11588 | + case SNDRV_PCM_FORMAT_DSD_U16_LE: | ||
11589 | + case SNDRV_PCM_FORMAT_DSD_U32_LE: | ||
11590 | + case SNDRV_PCM_FORMAT_DSD_U16_BE: | ||
11591 | + case SNDRV_PCM_FORMAT_DSD_U32_BE: | ||
11592 | + ret = ret && (ep->silence_value == 0x69); | ||
11593 | + break; | ||
11594 | + default: | ||
11595 | + ret = ret && (ep->silence_value == 0); | ||
11596 | + } | ||
11597 | + | ||
11598 | + /* assume max. frequency is 50% higher than nominal */ | ||
11599 | + ret = ret && (ep->freqmax == ep->freqn + (ep->freqn >> 1)); | ||
11600 | + /* Round up freqmax to nearest integer in order to calculate maximum | ||
11601 | + * packet size, which must represent a whole number of frames. | ||
11602 | + * This is accomplished by adding 0x0.ffff before converting the | ||
11603 | + * Q16.16 format into integer. | ||
11604 | + * In order to accurately calculate the maximum packet size when | ||
11605 | + * the data interval is more than 1 (i.e. ep->datainterval > 0), | ||
11606 | + * multiply by the data interval prior to rounding. For instance, | ||
11607 | + * a freqmax of 41 kHz will result in a max packet size of 6 (5.125) | ||
11608 | + * frames with a data interval of 1, but 11 (10.25) frames with a | ||
11609 | + * data interval of 2. | ||
11610 | + * (ep->freqmax << ep->datainterval overflows at 8.192 MHz for the | ||
11611 | + * maximum datainterval value of 3, at USB full speed, higher for | ||
11612 | + * USB high speed, noting that ep->freqmax is in units of | ||
11613 | + * frames per packet in Q16.16 format.) | ||
11614 | + */ | ||
11615 | + maxsize = (((ep->freqmax << ep->datainterval) + 0xffff) >> 16) * | ||
11616 | + (frame_bits >> 3); | ||
11617 | + if (tx_length_quirk) | ||
11618 | + maxsize += sizeof(__le32); /* Space for length descriptor */ | ||
11619 | + /* but wMaxPacketSize might reduce this */ | ||
11620 | + if (ep->maxpacksize && ep->maxpacksize < maxsize) { | ||
11621 | + /* whatever fits into a max. size packet */ | ||
11622 | + unsigned int data_maxsize = maxsize = ep->maxpacksize; | ||
11623 | + | ||
11624 | + if (tx_length_quirk) | ||
11625 | + /* Need to remove the length descriptor to calc freq */ | ||
11626 | + data_maxsize -= sizeof(__le32); | ||
11627 | + ret = ret && (ep->freqmax == (data_maxsize / (frame_bits >> 3)) | ||
11628 | + << (16 - ep->datainterval)); | ||
11629 | + } | ||
11630 | + | ||
11631 | + if (ep->fill_max) | ||
11632 | + ret = ret && (ep->curpacksize == ep->maxpacksize); | ||
11633 | + else | ||
11634 | + ret = ret && (ep->curpacksize == maxsize); | ||
11635 | + | ||
11636 | + if (snd_usb_get_speed(ep->chip->dev) != USB_SPEED_FULL) { | ||
11637 | + packs_per_ms = 8 >> ep->datainterval; | ||
11638 | + max_packs_per_urb = MAX_PACKS_HS; | ||
11639 | + } else { | ||
11640 | + packs_per_ms = 1; | ||
11641 | + max_packs_per_urb = MAX_PACKS; | ||
11642 | + } | ||
11643 | + if (sync_ep && !snd_usb_endpoint_implicit_feedback_sink(ep)) | ||
11644 | + max_packs_per_urb = min(max_packs_per_urb, | ||
11645 | + 1U << sync_ep->syncinterval); | ||
11646 | + max_packs_per_urb = max(1u, max_packs_per_urb >> ep->datainterval); | ||
11647 | + | ||
11648 | + /* | ||
11649 | + * Capture endpoints need to use small URBs because there's no way | ||
11650 | + * to tell in advance where the next period will end, and we don't | ||
11651 | + * want the next URB to complete much after the period ends. | ||
11652 | + * | ||
11653 | + * Playback endpoints with implicit sync much use the same parameters | ||
11654 | + * as their corresponding capture endpoint. | ||
11655 | + */ | ||
11656 | + if (usb_pipein(ep->pipe) || | ||
11657 | + snd_usb_endpoint_implicit_feedback_sink(ep)) { | ||
11658 | + | ||
11659 | + urb_packs = packs_per_ms; | ||
11660 | + /* | ||
11661 | + * Wireless devices can poll at a max rate of once per 4ms. | ||
11662 | + * For dataintervals less than 5, increase the packet count to | ||
11663 | + * allow the host controller to use bursting to fill in the | ||
11664 | + * gaps. | ||
11665 | + */ | ||
11666 | + if (snd_usb_get_speed(ep->chip->dev) == USB_SPEED_WIRELESS) { | ||
11667 | + int interval = ep->datainterval; | ||
11668 | + | ||
11669 | + while (interval < 5) { | ||
11670 | + urb_packs <<= 1; | ||
11671 | + ++interval; | ||
11672 | + } | ||
11673 | + } | ||
11674 | + /* make capture URBs <= 1 ms and smaller than a period */ | ||
11675 | + urb_packs = min(max_packs_per_urb, urb_packs); | ||
11676 | + while (urb_packs > 1 && urb_packs * maxsize >= period_bytes) | ||
11677 | + urb_packs >>= 1; | ||
11678 | + ret = ret && (ep->nurbs == MAX_URBS); | ||
11679 | + | ||
11680 | + /* | ||
11681 | + * Playback endpoints without implicit sync are adjusted so that | ||
11682 | + * a period fits as evenly as possible in the smallest number of | ||
11683 | + * URBs. The total number of URBs is adjusted to the size of the | ||
11684 | + * ALSA buffer, subject to the MAX_URBS and MAX_QUEUE limits. | ||
11685 | + */ | ||
11686 | + } else { | ||
11687 | + /* determine how small a packet can be */ | ||
11688 | + minsize = (ep->freqn >> (16 - ep->datainterval)) * | ||
11689 | + (frame_bits >> 3); | ||
11690 | + /* with sync from device, assume it can be 12% lower */ | ||
11691 | + if (sync_ep) | ||
11692 | + minsize -= minsize >> 3; | ||
11693 | + minsize = max(minsize, 1u); | ||
11694 | + | ||
11695 | + /* how many packets will contain an entire ALSA period? */ | ||
11696 | + max_packs_per_period = DIV_ROUND_UP(period_bytes, minsize); | ||
11697 | + | ||
11698 | + /* how many URBs will contain a period? */ | ||
11699 | + urbs_per_period = DIV_ROUND_UP(max_packs_per_period, | ||
11700 | + max_packs_per_urb); | ||
11701 | + /* how many packets are needed in each URB? */ | ||
11702 | + urb_packs = DIV_ROUND_UP(max_packs_per_period, urbs_per_period); | ||
11703 | + | ||
11704 | + /* limit the number of frames in a single URB */ | ||
11705 | + ret = ret && (ep->max_urb_frames == | ||
11706 | + DIV_ROUND_UP(frames_per_period, urbs_per_period)); | ||
11707 | + | ||
11708 | + /* try to use enough URBs to contain an entire ALSA buffer */ | ||
11709 | + max_urbs = min((unsigned) MAX_URBS, | ||
11710 | + MAX_QUEUE * packs_per_ms / urb_packs); | ||
11711 | + ret = ret && (ep->nurbs == min(max_urbs, | ||
11712 | + urbs_per_period * periods_per_buffer)); | ||
11713 | + } | ||
11714 | + | ||
11715 | + ret = ret && (ep->datainterval == fmt->datainterval); | ||
11716 | + ret = ret && (ep->maxpacksize == fmt->maxpacksize); | ||
11717 | + ret = ret && | ||
11718 | + (ep->fill_max == !!(fmt->attributes & UAC_EP_CS_ATTR_FILL_MAX)); | ||
11719 | + | ||
11720 | + return ret; | ||
11721 | +} | ||
11722 | + | ||
11723 | /* | ||
11724 | * configure a data endpoint | ||
11725 | */ | ||
11726 | @@ -861,10 +1060,23 @@ int snd_usb_endpoint_set_params(struct snd_usb_endpoint *ep, | ||
11727 | int err; | ||
11728 | |||
11729 | if (ep->use_count != 0) { | ||
11730 | - usb_audio_warn(ep->chip, | ||
11731 | - "Unable to change format on ep #%x: already in use\n", | ||
11732 | - ep->ep_num); | ||
11733 | - return -EBUSY; | ||
11734 | + bool check = ep->is_implicit_feedback && | ||
11735 | + check_ep_params(ep, pcm_format, | ||
11736 | + channels, period_bytes, | ||
11737 | + period_frames, buffer_periods, | ||
11738 | + fmt, sync_ep); | ||
11739 | + | ||
11740 | + if (!check) { | ||
11741 | + usb_audio_warn(ep->chip, | ||
11742 | + "Unable to change format on ep #%x: already in use\n", | ||
11743 | + ep->ep_num); | ||
11744 | + return -EBUSY; | ||
11745 | + } | ||
11746 | + | ||
11747 | + usb_audio_dbg(ep->chip, | ||
11748 | + "Ep #%x already in use as implicit feedback but format not changed\n", | ||
11749 | + ep->ep_num); | ||
11750 | + return 0; | ||
11751 | } | ||
11752 | |||
11753 | /* release old buffers, if any */ | ||
11754 | @@ -874,10 +1086,17 @@ int snd_usb_endpoint_set_params(struct snd_usb_endpoint *ep, | ||
11755 | ep->maxpacksize = fmt->maxpacksize; | ||
11756 | ep->fill_max = !!(fmt->attributes & UAC_EP_CS_ATTR_FILL_MAX); | ||
11757 | |||
11758 | - if (snd_usb_get_speed(ep->chip->dev) == USB_SPEED_FULL) | ||
11759 | + if (snd_usb_get_speed(ep->chip->dev) == USB_SPEED_FULL) { | ||
11760 | ep->freqn = get_usb_full_speed_rate(rate); | ||
11761 | - else | ||
11762 | + ep->fps = 1000; | ||
11763 | + } else { | ||
11764 | ep->freqn = get_usb_high_speed_rate(rate); | ||
11765 | + ep->fps = 8000; | ||
11766 | + } | ||
11767 | + | ||
11768 | + ep->sample_rem = rate % ep->fps; | ||
11769 | + ep->framesize[0] = rate / ep->fps; | ||
11770 | + ep->framesize[1] = (rate + (ep->fps - 1)) / ep->fps; | ||
11771 | |||
11772 | /* calculate the frequency in 16.16 format */ | ||
11773 | ep->freqm = ep->freqn; | ||
11774 | @@ -936,6 +1155,7 @@ int snd_usb_endpoint_start(struct snd_usb_endpoint *ep) | ||
11775 | ep->active_mask = 0; | ||
11776 | ep->unlink_mask = 0; | ||
11777 | ep->phase = 0; | ||
11778 | + ep->sample_accum = 0; | ||
11779 | |||
11780 | snd_usb_endpoint_start_quirk(ep); | ||
11781 | |||
11782 | diff --git a/sound/usb/endpoint.h b/sound/usb/endpoint.h | ||
11783 | index 63a39d4fa8d8..d23fa0a8c11b 100644 | ||
11784 | --- a/sound/usb/endpoint.h | ||
11785 | +++ b/sound/usb/endpoint.h | ||
11786 | @@ -28,6 +28,7 @@ void snd_usb_endpoint_release(struct snd_usb_endpoint *ep); | ||
11787 | void snd_usb_endpoint_free(struct snd_usb_endpoint *ep); | ||
11788 | |||
11789 | int snd_usb_endpoint_implicit_feedback_sink(struct snd_usb_endpoint *ep); | ||
11790 | +int snd_usb_endpoint_slave_next_packet_size(struct snd_usb_endpoint *ep); | ||
11791 | int snd_usb_endpoint_next_packet_size(struct snd_usb_endpoint *ep); | ||
11792 | |||
11793 | void snd_usb_handle_sync_urb(struct snd_usb_endpoint *ep, | ||
11794 | diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c | ||
11795 | index ad8f38380aa3..6c391e5fad2a 100644 | ||
11796 | --- a/sound/usb/pcm.c | ||
11797 | +++ b/sound/usb/pcm.c | ||
11798 | @@ -386,6 +386,8 @@ add_sync_ep: | ||
11799 | if (!subs->sync_endpoint) | ||
11800 | return -EINVAL; | ||
11801 | |||
11802 | + subs->sync_endpoint->is_implicit_feedback = 1; | ||
11803 | + | ||
11804 | subs->data_endpoint->sync_master = subs->sync_endpoint; | ||
11805 | |||
11806 | return 1; | ||
11807 | @@ -484,12 +486,15 @@ static int set_sync_endpoint(struct snd_usb_substream *subs, | ||
11808 | implicit_fb ? | ||
11809 | SND_USB_ENDPOINT_TYPE_DATA : | ||
11810 | SND_USB_ENDPOINT_TYPE_SYNC); | ||
11811 | + | ||
11812 | if (!subs->sync_endpoint) { | ||
11813 | if (is_playback && attr == USB_ENDPOINT_SYNC_NONE) | ||
11814 | return 0; | ||
11815 | return -EINVAL; | ||
11816 | } | ||
11817 | |||
11818 | + subs->sync_endpoint->is_implicit_feedback = implicit_fb; | ||
11819 | + | ||
11820 | subs->data_endpoint->sync_master = subs->sync_endpoint; | ||
11821 | |||
11822 | return 0; | ||
11823 | @@ -1575,6 +1580,8 @@ static void prepare_playback_urb(struct snd_usb_substream *subs, | ||
11824 | for (i = 0; i < ctx->packets; i++) { | ||
11825 | if (ctx->packet_size[i]) | ||
11826 | counts = ctx->packet_size[i]; | ||
11827 | + else if (ep->sync_master) | ||
11828 | + counts = snd_usb_endpoint_slave_next_packet_size(ep); | ||
11829 | else | ||
11830 | counts = snd_usb_endpoint_next_packet_size(ep); | ||
11831 | |||
11832 | diff --git a/tools/lib/bpf/btf_dump.c b/tools/lib/bpf/btf_dump.c | ||
11833 | index 87f27e2664c5..d9e386b8f47e 100644 | ||
11834 | --- a/tools/lib/bpf/btf_dump.c | ||
11835 | +++ b/tools/lib/bpf/btf_dump.c | ||
11836 | @@ -1141,6 +1141,20 @@ static void btf_dump_emit_mods(struct btf_dump *d, struct id_stack *decl_stack) | ||
11837 | } | ||
11838 | } | ||
11839 | |||
11840 | +static void btf_dump_drop_mods(struct btf_dump *d, struct id_stack *decl_stack) | ||
11841 | +{ | ||
11842 | + const struct btf_type *t; | ||
11843 | + __u32 id; | ||
11844 | + | ||
11845 | + while (decl_stack->cnt) { | ||
11846 | + id = decl_stack->ids[decl_stack->cnt - 1]; | ||
11847 | + t = btf__type_by_id(d->btf, id); | ||
11848 | + if (!btf_is_mod(t)) | ||
11849 | + return; | ||
11850 | + decl_stack->cnt--; | ||
11851 | + } | ||
11852 | +} | ||
11853 | + | ||
11854 | static void btf_dump_emit_name(const struct btf_dump *d, | ||
11855 | const char *name, bool last_was_ptr) | ||
11856 | { | ||
11857 | @@ -1239,14 +1253,7 @@ static void btf_dump_emit_type_chain(struct btf_dump *d, | ||
11858 | * a const/volatile modifier for array, so we are | ||
11859 | * going to silently skip them here. | ||
11860 | */ | ||
11861 | - while (decls->cnt) { | ||
11862 | - next_id = decls->ids[decls->cnt - 1]; | ||
11863 | - next_t = btf__type_by_id(d->btf, next_id); | ||
11864 | - if (btf_is_mod(next_t)) | ||
11865 | - decls->cnt--; | ||
11866 | - else | ||
11867 | - break; | ||
11868 | - } | ||
11869 | + btf_dump_drop_mods(d, decls); | ||
11870 | |||
11871 | if (decls->cnt == 0) { | ||
11872 | btf_dump_emit_name(d, fname, last_was_ptr); | ||
11873 | @@ -1274,7 +1281,15 @@ static void btf_dump_emit_type_chain(struct btf_dump *d, | ||
11874 | __u16 vlen = btf_vlen(t); | ||
11875 | int i; | ||
11876 | |||
11877 | - btf_dump_emit_mods(d, decls); | ||
11878 | + /* | ||
11879 | + * GCC emits extra volatile qualifier for | ||
11880 | + * __attribute__((noreturn)) function pointers. Clang | ||
11881 | + * doesn't do it. It's a GCC quirk for backwards | ||
11882 | + * compatibility with code written for GCC <2.5. So, | ||
11883 | + * similarly to extra qualifiers for array, just drop | ||
11884 | + * them, instead of handling them. | ||
11885 | + */ | ||
11886 | + btf_dump_drop_mods(d, decls); | ||
11887 | if (decls->cnt) { | ||
11888 | btf_dump_printf(d, " ("); | ||
11889 | btf_dump_emit_type_chain(d, decls, fname, lvl); | ||
11890 | diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c | ||
11891 | index 4d8db41b949a..d3c0b04e2e22 100644 | ||
11892 | --- a/tools/perf/builtin-report.c | ||
11893 | +++ b/tools/perf/builtin-report.c | ||
11894 | @@ -462,8 +462,7 @@ static size_t hists__fprintf_nr_sample_events(struct hists *hists, struct report | ||
11895 | if (rep->time_str) | ||
11896 | ret += fprintf(fp, " (time slices: %s)", rep->time_str); | ||
11897 | |||
11898 | - if (symbol_conf.show_ref_callgraph && | ||
11899 | - strstr(evname, "call-graph=no")) { | ||
11900 | + if (symbol_conf.show_ref_callgraph && evname && strstr(evname, "call-graph=no")) { | ||
11901 | ret += fprintf(fp, ", show reference callgraph"); | ||
11902 | } | ||
11903 | |||
11904 | diff --git a/tools/perf/util/stat-display.c b/tools/perf/util/stat-display.c | ||
11905 | index ed3b0ac2f785..373e399e57d2 100644 | ||
11906 | --- a/tools/perf/util/stat-display.c | ||
11907 | +++ b/tools/perf/util/stat-display.c | ||
11908 | @@ -661,7 +661,7 @@ static void print_aggr(struct perf_stat_config *config, | ||
11909 | int s; | ||
11910 | bool first; | ||
11911 | |||
11912 | - if (!(config->aggr_map || config->aggr_get_id)) | ||
11913 | + if (!config->aggr_map || !config->aggr_get_id) | ||
11914 | return; | ||
11915 | |||
11916 | aggr_update_shadow(config, evlist); | ||
11917 | @@ -1140,7 +1140,7 @@ static void print_percore(struct perf_stat_config *config, | ||
11918 | int s; | ||
11919 | bool first = true; | ||
11920 | |||
11921 | - if (!(config->aggr_map || config->aggr_get_id)) | ||
11922 | + if (!config->aggr_map || !config->aggr_get_id) | ||
11923 | return; | ||
11924 | |||
11925 | for (s = 0; s < config->aggr_map->nr; s++) { | ||
11926 | diff --git a/tools/testing/selftests/networking/timestamping/timestamping.c b/tools/testing/selftests/networking/timestamping/timestamping.c | ||
11927 | index aca3491174a1..f4bb4fef0f39 100644 | ||
11928 | --- a/tools/testing/selftests/networking/timestamping/timestamping.c | ||
11929 | +++ b/tools/testing/selftests/networking/timestamping/timestamping.c | ||
11930 | @@ -313,10 +313,16 @@ int main(int argc, char **argv) | ||
11931 | int val; | ||
11932 | socklen_t len; | ||
11933 | struct timeval next; | ||
11934 | + size_t if_len; | ||
11935 | |||
11936 | if (argc < 2) | ||
11937 | usage(0); | ||
11938 | interface = argv[1]; | ||
11939 | + if_len = strlen(interface); | ||
11940 | + if (if_len >= IFNAMSIZ) { | ||
11941 | + printf("interface name exceeds IFNAMSIZ\n"); | ||
11942 | + exit(1); | ||
11943 | + } | ||
11944 | |||
11945 | for (i = 2; i < argc; i++) { | ||
11946 | if (!strcasecmp(argv[i], "SO_TIMESTAMP")) | ||
11947 | @@ -350,12 +356,12 @@ int main(int argc, char **argv) | ||
11948 | bail("socket"); | ||
11949 | |||
11950 | memset(&device, 0, sizeof(device)); | ||
11951 | - strncpy(device.ifr_name, interface, sizeof(device.ifr_name)); | ||
11952 | + memcpy(device.ifr_name, interface, if_len + 1); | ||
11953 | if (ioctl(sock, SIOCGIFADDR, &device) < 0) | ||
11954 | bail("getting interface IP address"); | ||
11955 | |||
11956 | memset(&hwtstamp, 0, sizeof(hwtstamp)); | ||
11957 | - strncpy(hwtstamp.ifr_name, interface, sizeof(hwtstamp.ifr_name)); | ||
11958 | + memcpy(hwtstamp.ifr_name, interface, if_len + 1); | ||
11959 | hwtstamp.ifr_data = (void *)&hwconfig; | ||
11960 | memset(&hwconfig, 0, sizeof(hwconfig)); | ||
11961 | hwconfig.tx_type = | ||
11962 | diff --git a/tools/testing/selftests/ntb/ntb_test.sh b/tools/testing/selftests/ntb/ntb_test.sh | ||
11963 | index 9c60337317c6..020137b61407 100755 | ||
11964 | --- a/tools/testing/selftests/ntb/ntb_test.sh | ||
11965 | +++ b/tools/testing/selftests/ntb/ntb_test.sh | ||
11966 | @@ -241,7 +241,7 @@ function get_files_count() | ||
11967 | split_remote $LOC | ||
11968 | |||
11969 | if [[ "$REMOTE" == "" ]]; then | ||
11970 | - echo $(ls -1 "$LOC"/${NAME}* 2>/dev/null | wc -l) | ||
11971 | + echo $(ls -1 "$VPATH"/${NAME}* 2>/dev/null | wc -l) | ||
11972 | else | ||
11973 | echo $(ssh "$REMOTE" "ls -1 \"$VPATH\"/${NAME}* | \ | ||
11974 | wc -l" 2> /dev/null) | ||
11975 | diff --git a/tools/testing/selftests/x86/protection_keys.c b/tools/testing/selftests/x86/protection_keys.c | ||
11976 | index 480995bceefa..47191af46617 100644 | ||
11977 | --- a/tools/testing/selftests/x86/protection_keys.c | ||
11978 | +++ b/tools/testing/selftests/x86/protection_keys.c | ||
11979 | @@ -24,6 +24,7 @@ | ||
11980 | #define _GNU_SOURCE | ||
11981 | #include <errno.h> | ||
11982 | #include <linux/futex.h> | ||
11983 | +#include <time.h> | ||
11984 | #include <sys/time.h> | ||
11985 | #include <sys/syscall.h> | ||
11986 | #include <string.h> | ||
11987 | @@ -612,10 +613,10 @@ int alloc_random_pkey(void) | ||
11988 | int nr_alloced = 0; | ||
11989 | int random_index; | ||
11990 | memset(alloced_pkeys, 0, sizeof(alloced_pkeys)); | ||
11991 | + srand((unsigned int)time(NULL)); | ||
11992 | |||
11993 | /* allocate every possible key and make a note of which ones we got */ | ||
11994 | max_nr_pkey_allocs = NR_PKEYS; | ||
11995 | - max_nr_pkey_allocs = 1; | ||
11996 | for (i = 0; i < max_nr_pkey_allocs; i++) { | ||
11997 | int new_pkey = alloc_pkey(); | ||
11998 | if (new_pkey < 0) |