Contents of /trunk/kernel-alx/patches-4.19/0140-4.19.41-all-fixes.patch
Parent Directory | Revision Log
Revision 3419 -
(show annotations)
(download)
Fri Aug 2 11:47:49 2019 UTC (5 years, 1 month ago) by niro
File size: 119836 byte(s)
Fri Aug 2 11:47:49 2019 UTC (5 years, 1 month ago) by niro
File size: 119836 byte(s)
-linux-4.19.41
1 | diff --git a/Documentation/driver-api/usb/power-management.rst b/Documentation/driver-api/usb/power-management.rst |
2 | index 79beb807996b..4a74cf6f2797 100644 |
3 | --- a/Documentation/driver-api/usb/power-management.rst |
4 | +++ b/Documentation/driver-api/usb/power-management.rst |
5 | @@ -370,11 +370,15 @@ autosuspend the interface's device. When the usage counter is = 0 |
6 | then the interface is considered to be idle, and the kernel may |
7 | autosuspend the device. |
8 | |
9 | -Drivers need not be concerned about balancing changes to the usage |
10 | -counter; the USB core will undo any remaining "get"s when a driver |
11 | -is unbound from its interface. As a corollary, drivers must not call |
12 | -any of the ``usb_autopm_*`` functions after their ``disconnect`` |
13 | -routine has returned. |
14 | +Drivers must be careful to balance their overall changes to the usage |
15 | +counter. Unbalanced "get"s will remain in effect when a driver is |
16 | +unbound from its interface, preventing the device from going into |
17 | +runtime suspend should the interface be bound to a driver again. On |
18 | +the other hand, drivers are allowed to achieve this balance by calling |
19 | +the ``usb_autopm_*`` functions even after their ``disconnect`` routine |
20 | +has returned -- say from within a work-queue routine -- provided they |
21 | +retain an active reference to the interface (via ``usb_get_intf`` and |
22 | +``usb_put_intf``). |
23 | |
24 | Drivers using the async routines are responsible for their own |
25 | synchronization and mutual exclusion. |
26 | diff --git a/Makefile b/Makefile |
27 | index 3822720a8a1c..ba3b8504b689 100644 |
28 | --- a/Makefile |
29 | +++ b/Makefile |
30 | @@ -1,7 +1,7 @@ |
31 | # SPDX-License-Identifier: GPL-2.0 |
32 | VERSION = 4 |
33 | PATCHLEVEL = 19 |
34 | -SUBLEVEL = 40 |
35 | +SUBLEVEL = 41 |
36 | EXTRAVERSION = |
37 | NAME = "People's Front" |
38 | |
39 | diff --git a/arch/arm/boot/dts/rk3288.dtsi b/arch/arm/boot/dts/rk3288.dtsi |
40 | index e6a36a792bae..c706adf4aed2 100644 |
41 | --- a/arch/arm/boot/dts/rk3288.dtsi |
42 | +++ b/arch/arm/boot/dts/rk3288.dtsi |
43 | @@ -1261,27 +1261,27 @@ |
44 | gpu_opp_table: gpu-opp-table { |
45 | compatible = "operating-points-v2"; |
46 | |
47 | - opp@100000000 { |
48 | + opp-100000000 { |
49 | opp-hz = /bits/ 64 <100000000>; |
50 | opp-microvolt = <950000>; |
51 | }; |
52 | - opp@200000000 { |
53 | + opp-200000000 { |
54 | opp-hz = /bits/ 64 <200000000>; |
55 | opp-microvolt = <950000>; |
56 | }; |
57 | - opp@300000000 { |
58 | + opp-300000000 { |
59 | opp-hz = /bits/ 64 <300000000>; |
60 | opp-microvolt = <1000000>; |
61 | }; |
62 | - opp@400000000 { |
63 | + opp-400000000 { |
64 | opp-hz = /bits/ 64 <400000000>; |
65 | opp-microvolt = <1100000>; |
66 | }; |
67 | - opp@500000000 { |
68 | + opp-500000000 { |
69 | opp-hz = /bits/ 64 <500000000>; |
70 | opp-microvolt = <1200000>; |
71 | }; |
72 | - opp@600000000 { |
73 | + opp-600000000 { |
74 | opp-hz = /bits/ 64 <600000000>; |
75 | opp-microvolt = <1250000>; |
76 | }; |
77 | diff --git a/arch/arm/mach-at91/pm.c b/arch/arm/mach-at91/pm.c |
78 | index 32fae4dbd63b..0921e2c10edf 100644 |
79 | --- a/arch/arm/mach-at91/pm.c |
80 | +++ b/arch/arm/mach-at91/pm.c |
81 | @@ -594,13 +594,13 @@ static int __init at91_pm_backup_init(void) |
82 | |
83 | np = of_find_compatible_node(NULL, NULL, "atmel,sama5d2-securam"); |
84 | if (!np) |
85 | - goto securam_fail; |
86 | + goto securam_fail_no_ref_dev; |
87 | |
88 | pdev = of_find_device_by_node(np); |
89 | of_node_put(np); |
90 | if (!pdev) { |
91 | pr_warn("%s: failed to find securam device!\n", __func__); |
92 | - goto securam_fail; |
93 | + goto securam_fail_no_ref_dev; |
94 | } |
95 | |
96 | sram_pool = gen_pool_get(&pdev->dev, NULL); |
97 | @@ -623,6 +623,8 @@ static int __init at91_pm_backup_init(void) |
98 | return 0; |
99 | |
100 | securam_fail: |
101 | + put_device(&pdev->dev); |
102 | +securam_fail_no_ref_dev: |
103 | iounmap(pm_data.sfrbu); |
104 | pm_data.sfrbu = NULL; |
105 | return ret; |
106 | diff --git a/arch/arm/mach-iop13xx/setup.c b/arch/arm/mach-iop13xx/setup.c |
107 | index 53c316f7301e..fe4932fda01d 100644 |
108 | --- a/arch/arm/mach-iop13xx/setup.c |
109 | +++ b/arch/arm/mach-iop13xx/setup.c |
110 | @@ -300,7 +300,7 @@ static struct resource iop13xx_adma_2_resources[] = { |
111 | } |
112 | }; |
113 | |
114 | -static u64 iop13xx_adma_dmamask = DMA_BIT_MASK(64); |
115 | +static u64 iop13xx_adma_dmamask = DMA_BIT_MASK(32); |
116 | static struct iop_adma_platform_data iop13xx_adma_0_data = { |
117 | .hw_id = 0, |
118 | .pool_size = PAGE_SIZE, |
119 | @@ -324,7 +324,7 @@ static struct platform_device iop13xx_adma_0_channel = { |
120 | .resource = iop13xx_adma_0_resources, |
121 | .dev = { |
122 | .dma_mask = &iop13xx_adma_dmamask, |
123 | - .coherent_dma_mask = DMA_BIT_MASK(64), |
124 | + .coherent_dma_mask = DMA_BIT_MASK(32), |
125 | .platform_data = (void *) &iop13xx_adma_0_data, |
126 | }, |
127 | }; |
128 | @@ -336,7 +336,7 @@ static struct platform_device iop13xx_adma_1_channel = { |
129 | .resource = iop13xx_adma_1_resources, |
130 | .dev = { |
131 | .dma_mask = &iop13xx_adma_dmamask, |
132 | - .coherent_dma_mask = DMA_BIT_MASK(64), |
133 | + .coherent_dma_mask = DMA_BIT_MASK(32), |
134 | .platform_data = (void *) &iop13xx_adma_1_data, |
135 | }, |
136 | }; |
137 | @@ -348,7 +348,7 @@ static struct platform_device iop13xx_adma_2_channel = { |
138 | .resource = iop13xx_adma_2_resources, |
139 | .dev = { |
140 | .dma_mask = &iop13xx_adma_dmamask, |
141 | - .coherent_dma_mask = DMA_BIT_MASK(64), |
142 | + .coherent_dma_mask = DMA_BIT_MASK(32), |
143 | .platform_data = (void *) &iop13xx_adma_2_data, |
144 | }, |
145 | }; |
146 | diff --git a/arch/arm/mach-iop13xx/tpmi.c b/arch/arm/mach-iop13xx/tpmi.c |
147 | index db511ec2b1df..116feb6b261e 100644 |
148 | --- a/arch/arm/mach-iop13xx/tpmi.c |
149 | +++ b/arch/arm/mach-iop13xx/tpmi.c |
150 | @@ -152,7 +152,7 @@ static struct resource iop13xx_tpmi_3_resources[] = { |
151 | } |
152 | }; |
153 | |
154 | -u64 iop13xx_tpmi_mask = DMA_BIT_MASK(64); |
155 | +u64 iop13xx_tpmi_mask = DMA_BIT_MASK(32); |
156 | static struct platform_device iop13xx_tpmi_0_device = { |
157 | .name = "iop-tpmi", |
158 | .id = 0, |
159 | @@ -160,7 +160,7 @@ static struct platform_device iop13xx_tpmi_0_device = { |
160 | .resource = iop13xx_tpmi_0_resources, |
161 | .dev = { |
162 | .dma_mask = &iop13xx_tpmi_mask, |
163 | - .coherent_dma_mask = DMA_BIT_MASK(64), |
164 | + .coherent_dma_mask = DMA_BIT_MASK(32), |
165 | }, |
166 | }; |
167 | |
168 | @@ -171,7 +171,7 @@ static struct platform_device iop13xx_tpmi_1_device = { |
169 | .resource = iop13xx_tpmi_1_resources, |
170 | .dev = { |
171 | .dma_mask = &iop13xx_tpmi_mask, |
172 | - .coherent_dma_mask = DMA_BIT_MASK(64), |
173 | + .coherent_dma_mask = DMA_BIT_MASK(32), |
174 | }, |
175 | }; |
176 | |
177 | @@ -182,7 +182,7 @@ static struct platform_device iop13xx_tpmi_2_device = { |
178 | .resource = iop13xx_tpmi_2_resources, |
179 | .dev = { |
180 | .dma_mask = &iop13xx_tpmi_mask, |
181 | - .coherent_dma_mask = DMA_BIT_MASK(64), |
182 | + .coherent_dma_mask = DMA_BIT_MASK(32), |
183 | }, |
184 | }; |
185 | |
186 | @@ -193,7 +193,7 @@ static struct platform_device iop13xx_tpmi_3_device = { |
187 | .resource = iop13xx_tpmi_3_resources, |
188 | .dev = { |
189 | .dma_mask = &iop13xx_tpmi_mask, |
190 | - .coherent_dma_mask = DMA_BIT_MASK(64), |
191 | + .coherent_dma_mask = DMA_BIT_MASK(32), |
192 | }, |
193 | }; |
194 | |
195 | diff --git a/arch/arm/plat-iop/adma.c b/arch/arm/plat-iop/adma.c |
196 | index a4d1f8de3b5b..d9612221e484 100644 |
197 | --- a/arch/arm/plat-iop/adma.c |
198 | +++ b/arch/arm/plat-iop/adma.c |
199 | @@ -143,7 +143,7 @@ struct platform_device iop3xx_dma_0_channel = { |
200 | .resource = iop3xx_dma_0_resources, |
201 | .dev = { |
202 | .dma_mask = &iop3xx_adma_dmamask, |
203 | - .coherent_dma_mask = DMA_BIT_MASK(64), |
204 | + .coherent_dma_mask = DMA_BIT_MASK(32), |
205 | .platform_data = (void *) &iop3xx_dma_0_data, |
206 | }, |
207 | }; |
208 | @@ -155,7 +155,7 @@ struct platform_device iop3xx_dma_1_channel = { |
209 | .resource = iop3xx_dma_1_resources, |
210 | .dev = { |
211 | .dma_mask = &iop3xx_adma_dmamask, |
212 | - .coherent_dma_mask = DMA_BIT_MASK(64), |
213 | + .coherent_dma_mask = DMA_BIT_MASK(32), |
214 | .platform_data = (void *) &iop3xx_dma_1_data, |
215 | }, |
216 | }; |
217 | @@ -167,7 +167,7 @@ struct platform_device iop3xx_aau_channel = { |
218 | .resource = iop3xx_aau_resources, |
219 | .dev = { |
220 | .dma_mask = &iop3xx_adma_dmamask, |
221 | - .coherent_dma_mask = DMA_BIT_MASK(64), |
222 | + .coherent_dma_mask = DMA_BIT_MASK(32), |
223 | .platform_data = (void *) &iop3xx_aau_data, |
224 | }, |
225 | }; |
226 | diff --git a/arch/arm/plat-orion/common.c b/arch/arm/plat-orion/common.c |
227 | index a2399fd66e97..1e970873439c 100644 |
228 | --- a/arch/arm/plat-orion/common.c |
229 | +++ b/arch/arm/plat-orion/common.c |
230 | @@ -622,7 +622,7 @@ static struct platform_device orion_xor0_shared = { |
231 | .resource = orion_xor0_shared_resources, |
232 | .dev = { |
233 | .dma_mask = &orion_xor_dmamask, |
234 | - .coherent_dma_mask = DMA_BIT_MASK(64), |
235 | + .coherent_dma_mask = DMA_BIT_MASK(32), |
236 | .platform_data = &orion_xor0_pdata, |
237 | }, |
238 | }; |
239 | @@ -683,7 +683,7 @@ static struct platform_device orion_xor1_shared = { |
240 | .resource = orion_xor1_shared_resources, |
241 | .dev = { |
242 | .dma_mask = &orion_xor_dmamask, |
243 | - .coherent_dma_mask = DMA_BIT_MASK(64), |
244 | + .coherent_dma_mask = DMA_BIT_MASK(32), |
245 | .platform_data = &orion_xor1_pdata, |
246 | }, |
247 | }; |
248 | diff --git a/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts b/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts |
249 | index 246c317f6a68..91061d9cf78b 100644 |
250 | --- a/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts |
251 | +++ b/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts |
252 | @@ -94,8 +94,8 @@ |
253 | snps,reset-gpio = <&gpio1 RK_PC2 GPIO_ACTIVE_LOW>; |
254 | snps,reset-active-low; |
255 | snps,reset-delays-us = <0 10000 50000>; |
256 | - tx_delay = <0x25>; |
257 | - rx_delay = <0x11>; |
258 | + tx_delay = <0x24>; |
259 | + rx_delay = <0x18>; |
260 | status = "okay"; |
261 | }; |
262 | |
263 | diff --git a/arch/arm64/kernel/sdei.c b/arch/arm64/kernel/sdei.c |
264 | index 5ba4465e44f0..ea94cf8f9dc6 100644 |
265 | --- a/arch/arm64/kernel/sdei.c |
266 | +++ b/arch/arm64/kernel/sdei.c |
267 | @@ -94,6 +94,9 @@ static bool on_sdei_normal_stack(unsigned long sp, struct stack_info *info) |
268 | unsigned long low = (unsigned long)raw_cpu_read(sdei_stack_normal_ptr); |
269 | unsigned long high = low + SDEI_STACK_SIZE; |
270 | |
271 | + if (!low) |
272 | + return false; |
273 | + |
274 | if (sp < low || sp >= high) |
275 | return false; |
276 | |
277 | @@ -111,6 +114,9 @@ static bool on_sdei_critical_stack(unsigned long sp, struct stack_info *info) |
278 | unsigned long low = (unsigned long)raw_cpu_read(sdei_stack_critical_ptr); |
279 | unsigned long high = low + SDEI_STACK_SIZE; |
280 | |
281 | + if (!low) |
282 | + return false; |
283 | + |
284 | if (sp < low || sp >= high) |
285 | return false; |
286 | |
287 | diff --git a/arch/powerpc/kernel/kvm.c b/arch/powerpc/kernel/kvm.c |
288 | index 683b5b3805bd..cd381e2291df 100644 |
289 | --- a/arch/powerpc/kernel/kvm.c |
290 | +++ b/arch/powerpc/kernel/kvm.c |
291 | @@ -22,6 +22,7 @@ |
292 | #include <linux/kvm_host.h> |
293 | #include <linux/init.h> |
294 | #include <linux/export.h> |
295 | +#include <linux/kmemleak.h> |
296 | #include <linux/kvm_para.h> |
297 | #include <linux/slab.h> |
298 | #include <linux/of.h> |
299 | @@ -712,6 +713,12 @@ static void kvm_use_magic_page(void) |
300 | |
301 | static __init void kvm_free_tmp(void) |
302 | { |
303 | + /* |
304 | + * Inform kmemleak about the hole in the .bss section since the |
305 | + * corresponding pages will be unmapped with DEBUG_PAGEALLOC=y. |
306 | + */ |
307 | + kmemleak_free_part(&kvm_tmp[kvm_tmp_index], |
308 | + ARRAY_SIZE(kvm_tmp) - kvm_tmp_index); |
309 | free_reserved_area(&kvm_tmp[kvm_tmp_index], |
310 | &kvm_tmp[ARRAY_SIZE(kvm_tmp)], -1, NULL); |
311 | } |
312 | diff --git a/arch/powerpc/mm/slice.c b/arch/powerpc/mm/slice.c |
313 | index 4f213ba33491..53e9b58e83c2 100644 |
314 | --- a/arch/powerpc/mm/slice.c |
315 | +++ b/arch/powerpc/mm/slice.c |
316 | @@ -31,6 +31,7 @@ |
317 | #include <linux/spinlock.h> |
318 | #include <linux/export.h> |
319 | #include <linux/hugetlb.h> |
320 | +#include <linux/security.h> |
321 | #include <asm/mman.h> |
322 | #include <asm/mmu.h> |
323 | #include <asm/copro.h> |
324 | @@ -376,6 +377,7 @@ static unsigned long slice_find_area_topdown(struct mm_struct *mm, |
325 | int pshift = max_t(int, mmu_psize_defs[psize].shift, PAGE_SHIFT); |
326 | unsigned long addr, found, prev; |
327 | struct vm_unmapped_area_info info; |
328 | + unsigned long min_addr = max(PAGE_SIZE, mmap_min_addr); |
329 | |
330 | info.flags = VM_UNMAPPED_AREA_TOPDOWN; |
331 | info.length = len; |
332 | @@ -392,7 +394,7 @@ static unsigned long slice_find_area_topdown(struct mm_struct *mm, |
333 | if (high_limit > DEFAULT_MAP_WINDOW) |
334 | addr += mm->context.slb_addr_limit - DEFAULT_MAP_WINDOW; |
335 | |
336 | - while (addr > PAGE_SIZE) { |
337 | + while (addr > min_addr) { |
338 | info.high_limit = addr; |
339 | if (!slice_scan_available(addr - 1, available, 0, &addr)) |
340 | continue; |
341 | @@ -404,8 +406,8 @@ static unsigned long slice_find_area_topdown(struct mm_struct *mm, |
342 | * Check if we need to reduce the range, or if we can |
343 | * extend it to cover the previous available slice. |
344 | */ |
345 | - if (addr < PAGE_SIZE) |
346 | - addr = PAGE_SIZE; |
347 | + if (addr < min_addr) |
348 | + addr = min_addr; |
349 | else if (slice_scan_available(addr - 1, available, 0, &prev)) { |
350 | addr = prev; |
351 | goto prev_slice; |
352 | @@ -527,7 +529,7 @@ unsigned long slice_get_unmapped_area(unsigned long addr, unsigned long len, |
353 | addr = _ALIGN_UP(addr, page_size); |
354 | slice_dbg(" aligned addr=%lx\n", addr); |
355 | /* Ignore hint if it's too large or overlaps a VMA */ |
356 | - if (addr > high_limit - len || |
357 | + if (addr > high_limit - len || addr < mmap_min_addr || |
358 | !slice_area_is_free(mm, addr, len)) |
359 | addr = 0; |
360 | } |
361 | diff --git a/arch/riscv/include/asm/uaccess.h b/arch/riscv/include/asm/uaccess.h |
362 | index 8c3e3e3c8be1..f0ea3156192d 100644 |
363 | --- a/arch/riscv/include/asm/uaccess.h |
364 | +++ b/arch/riscv/include/asm/uaccess.h |
365 | @@ -307,7 +307,7 @@ do { \ |
366 | " .balign 4\n" \ |
367 | "4:\n" \ |
368 | " li %0, %6\n" \ |
369 | - " jump 2b, %1\n" \ |
370 | + " jump 3b, %1\n" \ |
371 | " .previous\n" \ |
372 | " .section __ex_table,\"a\"\n" \ |
373 | " .balign " RISCV_SZPTR "\n" \ |
374 | diff --git a/arch/sh/boards/of-generic.c b/arch/sh/boards/of-generic.c |
375 | index 26789ad28193..cb99df514a1c 100644 |
376 | --- a/arch/sh/boards/of-generic.c |
377 | +++ b/arch/sh/boards/of-generic.c |
378 | @@ -175,10 +175,10 @@ static struct sh_machine_vector __initmv sh_of_generic_mv = { |
379 | |
380 | struct sh_clk_ops; |
381 | |
382 | -void __init arch_init_clk_ops(struct sh_clk_ops **ops, int idx) |
383 | +void __init __weak arch_init_clk_ops(struct sh_clk_ops **ops, int idx) |
384 | { |
385 | } |
386 | |
387 | -void __init plat_irq_setup(void) |
388 | +void __init __weak plat_irq_setup(void) |
389 | { |
390 | } |
391 | diff --git a/arch/x86/events/amd/core.c b/arch/x86/events/amd/core.c |
392 | index 263af6312329..27ade3cb6482 100644 |
393 | --- a/arch/x86/events/amd/core.c |
394 | +++ b/arch/x86/events/amd/core.c |
395 | @@ -116,6 +116,110 @@ static __initconst const u64 amd_hw_cache_event_ids |
396 | }, |
397 | }; |
398 | |
399 | +static __initconst const u64 amd_hw_cache_event_ids_f17h |
400 | + [PERF_COUNT_HW_CACHE_MAX] |
401 | + [PERF_COUNT_HW_CACHE_OP_MAX] |
402 | + [PERF_COUNT_HW_CACHE_RESULT_MAX] = { |
403 | +[C(L1D)] = { |
404 | + [C(OP_READ)] = { |
405 | + [C(RESULT_ACCESS)] = 0x0040, /* Data Cache Accesses */ |
406 | + [C(RESULT_MISS)] = 0xc860, /* L2$ access from DC Miss */ |
407 | + }, |
408 | + [C(OP_WRITE)] = { |
409 | + [C(RESULT_ACCESS)] = 0, |
410 | + [C(RESULT_MISS)] = 0, |
411 | + }, |
412 | + [C(OP_PREFETCH)] = { |
413 | + [C(RESULT_ACCESS)] = 0xff5a, /* h/w prefetch DC Fills */ |
414 | + [C(RESULT_MISS)] = 0, |
415 | + }, |
416 | +}, |
417 | +[C(L1I)] = { |
418 | + [C(OP_READ)] = { |
419 | + [C(RESULT_ACCESS)] = 0x0080, /* Instruction cache fetches */ |
420 | + [C(RESULT_MISS)] = 0x0081, /* Instruction cache misses */ |
421 | + }, |
422 | + [C(OP_WRITE)] = { |
423 | + [C(RESULT_ACCESS)] = -1, |
424 | + [C(RESULT_MISS)] = -1, |
425 | + }, |
426 | + [C(OP_PREFETCH)] = { |
427 | + [C(RESULT_ACCESS)] = 0, |
428 | + [C(RESULT_MISS)] = 0, |
429 | + }, |
430 | +}, |
431 | +[C(LL)] = { |
432 | + [C(OP_READ)] = { |
433 | + [C(RESULT_ACCESS)] = 0, |
434 | + [C(RESULT_MISS)] = 0, |
435 | + }, |
436 | + [C(OP_WRITE)] = { |
437 | + [C(RESULT_ACCESS)] = 0, |
438 | + [C(RESULT_MISS)] = 0, |
439 | + }, |
440 | + [C(OP_PREFETCH)] = { |
441 | + [C(RESULT_ACCESS)] = 0, |
442 | + [C(RESULT_MISS)] = 0, |
443 | + }, |
444 | +}, |
445 | +[C(DTLB)] = { |
446 | + [C(OP_READ)] = { |
447 | + [C(RESULT_ACCESS)] = 0xff45, /* All L2 DTLB accesses */ |
448 | + [C(RESULT_MISS)] = 0xf045, /* L2 DTLB misses (PT walks) */ |
449 | + }, |
450 | + [C(OP_WRITE)] = { |
451 | + [C(RESULT_ACCESS)] = 0, |
452 | + [C(RESULT_MISS)] = 0, |
453 | + }, |
454 | + [C(OP_PREFETCH)] = { |
455 | + [C(RESULT_ACCESS)] = 0, |
456 | + [C(RESULT_MISS)] = 0, |
457 | + }, |
458 | +}, |
459 | +[C(ITLB)] = { |
460 | + [C(OP_READ)] = { |
461 | + [C(RESULT_ACCESS)] = 0x0084, /* L1 ITLB misses, L2 ITLB hits */ |
462 | + [C(RESULT_MISS)] = 0xff85, /* L1 ITLB misses, L2 misses */ |
463 | + }, |
464 | + [C(OP_WRITE)] = { |
465 | + [C(RESULT_ACCESS)] = -1, |
466 | + [C(RESULT_MISS)] = -1, |
467 | + }, |
468 | + [C(OP_PREFETCH)] = { |
469 | + [C(RESULT_ACCESS)] = -1, |
470 | + [C(RESULT_MISS)] = -1, |
471 | + }, |
472 | +}, |
473 | +[C(BPU)] = { |
474 | + [C(OP_READ)] = { |
475 | + [C(RESULT_ACCESS)] = 0x00c2, /* Retired Branch Instr. */ |
476 | + [C(RESULT_MISS)] = 0x00c3, /* Retired Mispredicted BI */ |
477 | + }, |
478 | + [C(OP_WRITE)] = { |
479 | + [C(RESULT_ACCESS)] = -1, |
480 | + [C(RESULT_MISS)] = -1, |
481 | + }, |
482 | + [C(OP_PREFETCH)] = { |
483 | + [C(RESULT_ACCESS)] = -1, |
484 | + [C(RESULT_MISS)] = -1, |
485 | + }, |
486 | +}, |
487 | +[C(NODE)] = { |
488 | + [C(OP_READ)] = { |
489 | + [C(RESULT_ACCESS)] = 0, |
490 | + [C(RESULT_MISS)] = 0, |
491 | + }, |
492 | + [C(OP_WRITE)] = { |
493 | + [C(RESULT_ACCESS)] = -1, |
494 | + [C(RESULT_MISS)] = -1, |
495 | + }, |
496 | + [C(OP_PREFETCH)] = { |
497 | + [C(RESULT_ACCESS)] = -1, |
498 | + [C(RESULT_MISS)] = -1, |
499 | + }, |
500 | +}, |
501 | +}; |
502 | + |
503 | /* |
504 | * AMD Performance Monitor K7 and later, up to and including Family 16h: |
505 | */ |
506 | @@ -861,9 +965,10 @@ __init int amd_pmu_init(void) |
507 | x86_pmu.amd_nb_constraints = 0; |
508 | } |
509 | |
510 | - /* Events are common for all AMDs */ |
511 | - memcpy(hw_cache_event_ids, amd_hw_cache_event_ids, |
512 | - sizeof(hw_cache_event_ids)); |
513 | + if (boot_cpu_data.x86 >= 0x17) |
514 | + memcpy(hw_cache_event_ids, amd_hw_cache_event_ids_f17h, sizeof(hw_cache_event_ids)); |
515 | + else |
516 | + memcpy(hw_cache_event_ids, amd_hw_cache_event_ids, sizeof(hw_cache_event_ids)); |
517 | |
518 | return 0; |
519 | } |
520 | diff --git a/arch/x86/kernel/cpu/mcheck/mce-severity.c b/arch/x86/kernel/cpu/mcheck/mce-severity.c |
521 | index f34d89c01edc..06f7c04a44e2 100644 |
522 | --- a/arch/x86/kernel/cpu/mcheck/mce-severity.c |
523 | +++ b/arch/x86/kernel/cpu/mcheck/mce-severity.c |
524 | @@ -165,6 +165,11 @@ static struct severity { |
525 | SER, MASK(MCI_STATUS_OVER|MCI_UC_SAR|MCI_ADDR|MCACOD, MCI_UC_SAR|MCI_ADDR|MCACOD_DATA), |
526 | KERNEL |
527 | ), |
528 | + MCESEV( |
529 | + PANIC, "Instruction fetch error in kernel", |
530 | + SER, MASK(MCI_STATUS_OVER|MCI_UC_SAR|MCI_ADDR|MCACOD, MCI_UC_SAR|MCI_ADDR|MCACOD_INSTR), |
531 | + KERNEL |
532 | + ), |
533 | #endif |
534 | MCESEV( |
535 | PANIC, "Action required: unknown MCACOD", |
536 | diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c |
537 | index 813cb60eb401..8dd9208ae4de 100644 |
538 | --- a/arch/x86/kvm/svm.c |
539 | +++ b/arch/x86/kvm/svm.c |
540 | @@ -6789,7 +6789,8 @@ static int sev_dbg_crypt(struct kvm *kvm, struct kvm_sev_cmd *argp, bool dec) |
541 | struct page **src_p, **dst_p; |
542 | struct kvm_sev_dbg debug; |
543 | unsigned long n; |
544 | - int ret, size; |
545 | + unsigned int size; |
546 | + int ret; |
547 | |
548 | if (!sev_guest(kvm)) |
549 | return -ENOTTY; |
550 | @@ -6797,6 +6798,11 @@ static int sev_dbg_crypt(struct kvm *kvm, struct kvm_sev_cmd *argp, bool dec) |
551 | if (copy_from_user(&debug, (void __user *)(uintptr_t)argp->data, sizeof(debug))) |
552 | return -EFAULT; |
553 | |
554 | + if (!debug.len || debug.src_uaddr + debug.len < debug.src_uaddr) |
555 | + return -EINVAL; |
556 | + if (!debug.dst_uaddr) |
557 | + return -EINVAL; |
558 | + |
559 | vaddr = debug.src_uaddr; |
560 | size = debug.len; |
561 | vaddr_end = vaddr + size; |
562 | @@ -6847,8 +6853,8 @@ static int sev_dbg_crypt(struct kvm *kvm, struct kvm_sev_cmd *argp, bool dec) |
563 | dst_vaddr, |
564 | len, &argp->error); |
565 | |
566 | - sev_unpin_memory(kvm, src_p, 1); |
567 | - sev_unpin_memory(kvm, dst_p, 1); |
568 | + sev_unpin_memory(kvm, src_p, n); |
569 | + sev_unpin_memory(kvm, dst_p, n); |
570 | |
571 | if (ret) |
572 | goto err; |
573 | diff --git a/arch/x86/mm/init.c b/arch/x86/mm/init.c |
574 | index d883869437b5..fb5f29c60019 100644 |
575 | --- a/arch/x86/mm/init.c |
576 | +++ b/arch/x86/mm/init.c |
577 | @@ -6,6 +6,7 @@ |
578 | #include <linux/bootmem.h> /* for max_low_pfn */ |
579 | #include <linux/swapfile.h> |
580 | #include <linux/swapops.h> |
581 | +#include <linux/kmemleak.h> |
582 | |
583 | #include <asm/set_memory.h> |
584 | #include <asm/e820/api.h> |
585 | @@ -767,6 +768,11 @@ void free_init_pages(char *what, unsigned long begin, unsigned long end) |
586 | if (debug_pagealloc_enabled()) { |
587 | pr_info("debug: unmapping init [mem %#010lx-%#010lx]\n", |
588 | begin, end - 1); |
589 | + /* |
590 | + * Inform kmemleak about the hole in the memory since the |
591 | + * corresponding pages will be unmapped. |
592 | + */ |
593 | + kmemleak_free_part((void *)begin, end - begin); |
594 | set_memory_np(begin, (end - begin) >> PAGE_SHIFT); |
595 | } else { |
596 | /* |
597 | diff --git a/arch/x86/mm/kaslr.c b/arch/x86/mm/kaslr.c |
598 | index 61db77b0eda9..0988971069c9 100644 |
599 | --- a/arch/x86/mm/kaslr.c |
600 | +++ b/arch/x86/mm/kaslr.c |
601 | @@ -93,7 +93,7 @@ void __init kernel_randomize_memory(void) |
602 | if (!kaslr_memory_enabled()) |
603 | return; |
604 | |
605 | - kaslr_regions[0].size_tb = 1 << (__PHYSICAL_MASK_SHIFT - TB_SHIFT); |
606 | + kaslr_regions[0].size_tb = 1 << (MAX_PHYSMEM_BITS - TB_SHIFT); |
607 | kaslr_regions[1].size_tb = VMALLOC_SIZE_TB; |
608 | |
609 | /* |
610 | diff --git a/arch/x86/mm/tlb.c b/arch/x86/mm/tlb.c |
611 | index a6d1b0241aea..a6836ab0fcc7 100644 |
612 | --- a/arch/x86/mm/tlb.c |
613 | +++ b/arch/x86/mm/tlb.c |
614 | @@ -694,7 +694,7 @@ void flush_tlb_mm_range(struct mm_struct *mm, unsigned long start, |
615 | { |
616 | int cpu; |
617 | |
618 | - struct flush_tlb_info info __aligned(SMP_CACHE_BYTES) = { |
619 | + struct flush_tlb_info info = { |
620 | .mm = mm, |
621 | }; |
622 | |
623 | diff --git a/block/blk-core.c b/block/blk-core.c |
624 | index eb8b52241453..33488b1426b7 100644 |
625 | --- a/block/blk-core.c |
626 | +++ b/block/blk-core.c |
627 | @@ -980,6 +980,10 @@ static void blk_rq_timed_out_timer(struct timer_list *t) |
628 | kblockd_schedule_work(&q->timeout_work); |
629 | } |
630 | |
631 | +static void blk_timeout_work_dummy(struct work_struct *work) |
632 | +{ |
633 | +} |
634 | + |
635 | /** |
636 | * blk_alloc_queue_node - allocate a request queue |
637 | * @gfp_mask: memory allocation flags |
638 | @@ -1034,7 +1038,7 @@ struct request_queue *blk_alloc_queue_node(gfp_t gfp_mask, int node_id, |
639 | timer_setup(&q->backing_dev_info->laptop_mode_wb_timer, |
640 | laptop_mode_timer_fn, 0); |
641 | timer_setup(&q->timeout, blk_rq_timed_out_timer, 0); |
642 | - INIT_WORK(&q->timeout_work, NULL); |
643 | + INIT_WORK(&q->timeout_work, blk_timeout_work_dummy); |
644 | INIT_LIST_HEAD(&q->timeout_list); |
645 | INIT_LIST_HEAD(&q->icq_list); |
646 | #ifdef CONFIG_BLK_CGROUP |
647 | diff --git a/block/blk-mq.c b/block/blk-mq.c |
648 | index 7d53f2314d7c..414656796ecf 100644 |
649 | --- a/block/blk-mq.c |
650 | +++ b/block/blk-mq.c |
651 | @@ -2236,7 +2236,7 @@ static int blk_mq_init_hctx(struct request_queue *q, |
652 | return 0; |
653 | |
654 | free_fq: |
655 | - kfree(hctx->fq); |
656 | + blk_free_flush_queue(hctx->fq); |
657 | exit_hctx: |
658 | if (set->ops->exit_hctx) |
659 | set->ops->exit_hctx(hctx, hctx_idx); |
660 | diff --git a/drivers/block/xsysace.c b/drivers/block/xsysace.c |
661 | index c24589414c75..0f36db0cf74a 100644 |
662 | --- a/drivers/block/xsysace.c |
663 | +++ b/drivers/block/xsysace.c |
664 | @@ -1063,6 +1063,8 @@ static int ace_setup(struct ace_device *ace) |
665 | return 0; |
666 | |
667 | err_read: |
668 | + /* prevent double queue cleanup */ |
669 | + ace->gd->queue = NULL; |
670 | put_disk(ace->gd); |
671 | err_alloc_disk: |
672 | blk_cleanup_queue(ace->queue); |
673 | diff --git a/drivers/bluetooth/btmtkuart.c b/drivers/bluetooth/btmtkuart.c |
674 | index 4593baff2bc9..19eecf198321 100644 |
675 | --- a/drivers/bluetooth/btmtkuart.c |
676 | +++ b/drivers/bluetooth/btmtkuart.c |
677 | @@ -115,11 +115,13 @@ static int mtk_hci_wmt_sync(struct hci_dev *hdev, u8 op, u8 flag, u16 plen, |
678 | TASK_INTERRUPTIBLE, HCI_INIT_TIMEOUT); |
679 | if (err == -EINTR) { |
680 | bt_dev_err(hdev, "Execution of wmt command interrupted"); |
681 | + clear_bit(BTMTKUART_TX_WAIT_VND_EVT, &bdev->tx_state); |
682 | return err; |
683 | } |
684 | |
685 | if (err) { |
686 | bt_dev_err(hdev, "Execution of wmt command timed out"); |
687 | + clear_bit(BTMTKUART_TX_WAIT_VND_EVT, &bdev->tx_state); |
688 | return -ETIMEDOUT; |
689 | } |
690 | |
691 | diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c |
692 | index 77b67a5f21ee..40a4f95f6178 100644 |
693 | --- a/drivers/bluetooth/btusb.c |
694 | +++ b/drivers/bluetooth/btusb.c |
695 | @@ -2888,6 +2888,7 @@ static int btusb_config_oob_wake(struct hci_dev *hdev) |
696 | return 0; |
697 | } |
698 | |
699 | + irq_set_status_flags(irq, IRQ_NOAUTOEN); |
700 | ret = devm_request_irq(&hdev->dev, irq, btusb_oob_wake_handler, |
701 | 0, "OOB Wake-on-BT", data); |
702 | if (ret) { |
703 | @@ -2902,7 +2903,6 @@ static int btusb_config_oob_wake(struct hci_dev *hdev) |
704 | } |
705 | |
706 | data->oob_wake_irq = irq; |
707 | - disable_irq(irq); |
708 | bt_dev_info(hdev, "OOB Wake-on-BT configured at IRQ %u", irq); |
709 | return 0; |
710 | } |
711 | diff --git a/drivers/clk/qcom/gcc-msm8998.c b/drivers/clk/qcom/gcc-msm8998.c |
712 | index 9f0ae403d5f5..cd937ce6aaaf 100644 |
713 | --- a/drivers/clk/qcom/gcc-msm8998.c |
714 | +++ b/drivers/clk/qcom/gcc-msm8998.c |
715 | @@ -1101,6 +1101,7 @@ static struct clk_rcg2 ufs_axi_clk_src = { |
716 | |
717 | static const struct freq_tbl ftbl_usb30_master_clk_src[] = { |
718 | F(19200000, P_XO, 1, 0, 0), |
719 | + F(60000000, P_GPLL0_OUT_MAIN, 10, 0, 0), |
720 | F(120000000, P_GPLL0_OUT_MAIN, 5, 0, 0), |
721 | F(150000000, P_GPLL0_OUT_MAIN, 4, 0, 0), |
722 | { } |
723 | diff --git a/drivers/clk/x86/clk-pmc-atom.c b/drivers/clk/x86/clk-pmc-atom.c |
724 | index d977193842df..19174835693b 100644 |
725 | --- a/drivers/clk/x86/clk-pmc-atom.c |
726 | +++ b/drivers/clk/x86/clk-pmc-atom.c |
727 | @@ -165,7 +165,7 @@ static const struct clk_ops plt_clk_ops = { |
728 | }; |
729 | |
730 | static struct clk_plt *plt_clk_register(struct platform_device *pdev, int id, |
731 | - void __iomem *base, |
732 | + const struct pmc_clk_data *pmc_data, |
733 | const char **parent_names, |
734 | int num_parents) |
735 | { |
736 | @@ -184,9 +184,17 @@ static struct clk_plt *plt_clk_register(struct platform_device *pdev, int id, |
737 | init.num_parents = num_parents; |
738 | |
739 | pclk->hw.init = &init; |
740 | - pclk->reg = base + PMC_CLK_CTL_OFFSET + id * PMC_CLK_CTL_SIZE; |
741 | + pclk->reg = pmc_data->base + PMC_CLK_CTL_OFFSET + id * PMC_CLK_CTL_SIZE; |
742 | spin_lock_init(&pclk->lock); |
743 | |
744 | + /* |
745 | + * On some systems, the pmc_plt_clocks already enabled by the |
746 | + * firmware are being marked as critical to avoid them being |
747 | + * gated by the clock framework. |
748 | + */ |
749 | + if (pmc_data->critical && plt_clk_is_enabled(&pclk->hw)) |
750 | + init.flags |= CLK_IS_CRITICAL; |
751 | + |
752 | ret = devm_clk_hw_register(&pdev->dev, &pclk->hw); |
753 | if (ret) { |
754 | pclk = ERR_PTR(ret); |
755 | @@ -332,7 +340,7 @@ static int plt_clk_probe(struct platform_device *pdev) |
756 | return PTR_ERR(parent_names); |
757 | |
758 | for (i = 0; i < PMC_CLK_NUM; i++) { |
759 | - data->clks[i] = plt_clk_register(pdev, i, pmc_data->base, |
760 | + data->clks[i] = plt_clk_register(pdev, i, pmc_data, |
761 | parent_names, data->nparents); |
762 | if (IS_ERR(data->clks[i])) { |
763 | err = PTR_ERR(data->clks[i]); |
764 | diff --git a/drivers/firmware/efi/runtime-wrappers.c b/drivers/firmware/efi/runtime-wrappers.c |
765 | index b0aeffd4e269..1606abead22c 100644 |
766 | --- a/drivers/firmware/efi/runtime-wrappers.c |
767 | +++ b/drivers/firmware/efi/runtime-wrappers.c |
768 | @@ -95,7 +95,7 @@ struct efi_runtime_work { |
769 | efi_rts_work.status = EFI_ABORTED; \ |
770 | \ |
771 | init_completion(&efi_rts_work.efi_rts_comp); \ |
772 | - INIT_WORK_ONSTACK(&efi_rts_work.work, efi_call_rts); \ |
773 | + INIT_WORK(&efi_rts_work.work, efi_call_rts); \ |
774 | efi_rts_work.arg1 = _arg1; \ |
775 | efi_rts_work.arg2 = _arg2; \ |
776 | efi_rts_work.arg3 = _arg3; \ |
777 | diff --git a/drivers/gpio/gpio-mxc.c b/drivers/gpio/gpio-mxc.c |
778 | index 2d1dfa1e0745..e86e61dda4b7 100644 |
779 | --- a/drivers/gpio/gpio-mxc.c |
780 | +++ b/drivers/gpio/gpio-mxc.c |
781 | @@ -438,8 +438,11 @@ static int mxc_gpio_probe(struct platform_device *pdev) |
782 | |
783 | /* the controller clock is optional */ |
784 | port->clk = devm_clk_get(&pdev->dev, NULL); |
785 | - if (IS_ERR(port->clk)) |
786 | + if (IS_ERR(port->clk)) { |
787 | + if (PTR_ERR(port->clk) == -EPROBE_DEFER) |
788 | + return -EPROBE_DEFER; |
789 | port->clk = NULL; |
790 | + } |
791 | |
792 | err = clk_prepare_enable(port->clk); |
793 | if (err) { |
794 | diff --git a/drivers/hid/hid-debug.c b/drivers/hid/hid-debug.c |
795 | index ebc9ffde41e9..a353a011fbdf 100644 |
796 | --- a/drivers/hid/hid-debug.c |
797 | +++ b/drivers/hid/hid-debug.c |
798 | @@ -1060,10 +1060,15 @@ static int hid_debug_rdesc_show(struct seq_file *f, void *p) |
799 | seq_printf(f, "\n\n"); |
800 | |
801 | /* dump parsed data and input mappings */ |
802 | + if (down_interruptible(&hdev->driver_input_lock)) |
803 | + return 0; |
804 | + |
805 | hid_dump_device(hdev, f); |
806 | seq_printf(f, "\n"); |
807 | hid_dump_input_mapping(hdev, f); |
808 | |
809 | + up(&hdev->driver_input_lock); |
810 | + |
811 | return 0; |
812 | } |
813 | |
814 | diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c |
815 | index a3916e58dbf5..e649940e065d 100644 |
816 | --- a/drivers/hid/hid-input.c |
817 | +++ b/drivers/hid/hid-input.c |
818 | @@ -982,6 +982,7 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel |
819 | case 0x1b8: map_key_clear(KEY_VIDEO); break; |
820 | case 0x1bc: map_key_clear(KEY_MESSENGER); break; |
821 | case 0x1bd: map_key_clear(KEY_INFO); break; |
822 | + case 0x1cb: map_key_clear(KEY_ASSISTANT); break; |
823 | case 0x201: map_key_clear(KEY_NEW); break; |
824 | case 0x202: map_key_clear(KEY_OPEN); break; |
825 | case 0x203: map_key_clear(KEY_CLOSE); break; |
826 | diff --git a/drivers/hid/hid-logitech-hidpp.c b/drivers/hid/hid-logitech-hidpp.c |
827 | index 19cc980eebce..8425d3548a41 100644 |
828 | --- a/drivers/hid/hid-logitech-hidpp.c |
829 | +++ b/drivers/hid/hid-logitech-hidpp.c |
830 | @@ -1907,6 +1907,13 @@ static int hidpp_ff_init(struct hidpp_device *hidpp, u8 feature_index) |
831 | kfree(data); |
832 | return -ENOMEM; |
833 | } |
834 | + data->wq = create_singlethread_workqueue("hidpp-ff-sendqueue"); |
835 | + if (!data->wq) { |
836 | + kfree(data->effect_ids); |
837 | + kfree(data); |
838 | + return -ENOMEM; |
839 | + } |
840 | + |
841 | data->hidpp = hidpp; |
842 | data->feature_index = feature_index; |
843 | data->version = version; |
844 | @@ -1951,7 +1958,6 @@ static int hidpp_ff_init(struct hidpp_device *hidpp, u8 feature_index) |
845 | /* ignore boost value at response.fap.params[2] */ |
846 | |
847 | /* init the hardware command queue */ |
848 | - data->wq = create_singlethread_workqueue("hidpp-ff-sendqueue"); |
849 | atomic_set(&data->workqueue_size, 0); |
850 | |
851 | /* initialize with zero autocenter to get wheel in usable state */ |
852 | diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c |
853 | index 94088c0ed68a..e24790c988c0 100644 |
854 | --- a/drivers/hid/hid-quirks.c |
855 | +++ b/drivers/hid/hid-quirks.c |
856 | @@ -744,7 +744,6 @@ static const struct hid_device_id hid_ignore_list[] = { |
857 | { HID_USB_DEVICE(USB_VENDOR_ID_DEALEXTREAME, USB_DEVICE_ID_DEALEXTREAME_RADIO_SI4701) }, |
858 | { HID_USB_DEVICE(USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EARTHMATE) }, |
859 | { HID_USB_DEVICE(USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EM_LT20) }, |
860 | - { HID_I2C_DEVICE(USB_VENDOR_ID_ELAN, 0x0400) }, |
861 | { HID_USB_DEVICE(USB_VENDOR_ID_ESSENTIAL_REALITY, USB_DEVICE_ID_ESSENTIAL_REALITY_P5) }, |
862 | { HID_USB_DEVICE(USB_VENDOR_ID_ETT, USB_DEVICE_ID_TC5UH) }, |
863 | { HID_USB_DEVICE(USB_VENDOR_ID_ETT, USB_DEVICE_ID_TC4UM) }, |
864 | @@ -1025,6 +1024,10 @@ bool hid_ignore(struct hid_device *hdev) |
865 | if (hdev->product == 0x0401 && |
866 | strncmp(hdev->name, "ELAN0800", 8) != 0) |
867 | return true; |
868 | + /* Same with product id 0x0400 */ |
869 | + if (hdev->product == 0x0400 && |
870 | + strncmp(hdev->name, "QTEC0001", 8) != 0) |
871 | + return true; |
872 | break; |
873 | } |
874 | |
875 | diff --git a/drivers/i2c/busses/i2c-imx.c b/drivers/i2c/busses/i2c-imx.c |
876 | index c406700789e1..7bd409eaf0ac 100644 |
877 | --- a/drivers/i2c/busses/i2c-imx.c |
878 | +++ b/drivers/i2c/busses/i2c-imx.c |
879 | @@ -510,9 +510,9 @@ static int i2c_imx_clk_notifier_call(struct notifier_block *nb, |
880 | unsigned long action, void *data) |
881 | { |
882 | struct clk_notifier_data *ndata = data; |
883 | - struct imx_i2c_struct *i2c_imx = container_of(&ndata->clk, |
884 | + struct imx_i2c_struct *i2c_imx = container_of(nb, |
885 | struct imx_i2c_struct, |
886 | - clk); |
887 | + clk_change_nb); |
888 | |
889 | if (action & POST_RATE_CHANGE) |
890 | i2c_imx_set_clk(i2c_imx, ndata->new_rate); |
891 | diff --git a/drivers/i2c/busses/i2c-stm32f7.c b/drivers/i2c/busses/i2c-stm32f7.c |
892 | index 62d023e737d9..a492da9fd0d3 100644 |
893 | --- a/drivers/i2c/busses/i2c-stm32f7.c |
894 | +++ b/drivers/i2c/busses/i2c-stm32f7.c |
895 | @@ -424,7 +424,7 @@ static int stm32f7_i2c_compute_timing(struct stm32f7_i2c_dev *i2c_dev, |
896 | STM32F7_I2C_ANALOG_FILTER_DELAY_MAX : 0); |
897 | dnf_delay = setup->dnf * i2cclk; |
898 | |
899 | - sdadel_min = setup->fall_time - i2c_specs[setup->speed].hddat_min - |
900 | + sdadel_min = i2c_specs[setup->speed].hddat_min + setup->fall_time - |
901 | af_delay_min - (setup->dnf + 3) * i2cclk; |
902 | |
903 | sdadel_max = i2c_specs[setup->speed].vddat_max - setup->rise_time - |
904 | diff --git a/drivers/i2c/busses/i2c-synquacer.c b/drivers/i2c/busses/i2c-synquacer.c |
905 | index 915f5edbab33..e6c554e6ba58 100644 |
906 | --- a/drivers/i2c/busses/i2c-synquacer.c |
907 | +++ b/drivers/i2c/busses/i2c-synquacer.c |
908 | @@ -602,6 +602,8 @@ static int synquacer_i2c_probe(struct platform_device *pdev) |
909 | i2c->adapter = synquacer_i2c_ops; |
910 | i2c_set_adapdata(&i2c->adapter, i2c); |
911 | i2c->adapter.dev.parent = &pdev->dev; |
912 | + i2c->adapter.dev.of_node = pdev->dev.of_node; |
913 | + ACPI_COMPANION_SET(&i2c->adapter.dev, ACPI_COMPANION(&pdev->dev)); |
914 | i2c->adapter.nr = pdev->id; |
915 | init_completion(&i2c->completion); |
916 | |
917 | diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c |
918 | index 9200e349f29e..5b0e1d9e5adc 100644 |
919 | --- a/drivers/i2c/i2c-core-base.c |
920 | +++ b/drivers/i2c/i2c-core-base.c |
921 | @@ -306,10 +306,7 @@ static int i2c_smbus_host_notify_to_irq(const struct i2c_client *client) |
922 | if (client->flags & I2C_CLIENT_TEN) |
923 | return -EINVAL; |
924 | |
925 | - irq = irq_find_mapping(adap->host_notify_domain, client->addr); |
926 | - if (!irq) |
927 | - irq = irq_create_mapping(adap->host_notify_domain, |
928 | - client->addr); |
929 | + irq = irq_create_mapping(adap->host_notify_domain, client->addr); |
930 | |
931 | return irq > 0 ? irq : -ENXIO; |
932 | } |
933 | @@ -330,6 +327,8 @@ static int i2c_device_probe(struct device *dev) |
934 | |
935 | if (client->flags & I2C_CLIENT_HOST_NOTIFY) { |
936 | dev_dbg(dev, "Using Host Notify IRQ\n"); |
937 | + /* Keep adapter active when Host Notify is required */ |
938 | + pm_runtime_get_sync(&client->adapter->dev); |
939 | irq = i2c_smbus_host_notify_to_irq(client); |
940 | } else if (dev->of_node) { |
941 | irq = of_irq_get_byname(dev->of_node, "irq"); |
942 | @@ -433,6 +432,10 @@ static int i2c_device_remove(struct device *dev) |
943 | dev_pm_clear_wake_irq(&client->dev); |
944 | device_init_wakeup(&client->dev, false); |
945 | |
946 | + client->irq = client->init_irq; |
947 | + if (client->flags & I2C_CLIENT_HOST_NOTIFY) |
948 | + pm_runtime_put(&client->adapter->dev); |
949 | + |
950 | return status; |
951 | } |
952 | |
953 | @@ -742,10 +745,11 @@ i2c_new_device(struct i2c_adapter *adap, struct i2c_board_info const *info) |
954 | client->flags = info->flags; |
955 | client->addr = info->addr; |
956 | |
957 | - client->irq = info->irq; |
958 | - if (!client->irq) |
959 | - client->irq = i2c_dev_irq_from_resources(info->resources, |
960 | + client->init_irq = info->irq; |
961 | + if (!client->init_irq) |
962 | + client->init_irq = i2c_dev_irq_from_resources(info->resources, |
963 | info->num_resources); |
964 | + client->irq = client->init_irq; |
965 | |
966 | strlcpy(client->name, info->type, sizeof(client->name)); |
967 | |
968 | diff --git a/drivers/infiniband/core/security.c b/drivers/infiniband/core/security.c |
969 | index 9b0bea8303e0..b79b61bd6ee4 100644 |
970 | --- a/drivers/infiniband/core/security.c |
971 | +++ b/drivers/infiniband/core/security.c |
972 | @@ -711,16 +711,20 @@ int ib_mad_agent_security_setup(struct ib_mad_agent *agent, |
973 | agent->device->name, |
974 | agent->port_num); |
975 | if (ret) |
976 | - return ret; |
977 | + goto free_security; |
978 | |
979 | agent->lsm_nb.notifier_call = ib_mad_agent_security_change; |
980 | ret = register_lsm_notifier(&agent->lsm_nb); |
981 | if (ret) |
982 | - return ret; |
983 | + goto free_security; |
984 | |
985 | agent->smp_allowed = true; |
986 | agent->lsm_nb_reg = true; |
987 | return 0; |
988 | + |
989 | +free_security: |
990 | + security_ib_free_security(agent->security); |
991 | + return ret; |
992 | } |
993 | |
994 | void ib_mad_agent_security_cleanup(struct ib_mad_agent *agent) |
995 | @@ -728,9 +732,10 @@ void ib_mad_agent_security_cleanup(struct ib_mad_agent *agent) |
996 | if (!rdma_protocol_ib(agent->device, agent->port_num)) |
997 | return; |
998 | |
999 | - security_ib_free_security(agent->security); |
1000 | if (agent->lsm_nb_reg) |
1001 | unregister_lsm_notifier(&agent->lsm_nb); |
1002 | + |
1003 | + security_ib_free_security(agent->security); |
1004 | } |
1005 | |
1006 | int ib_mad_enforce_security(struct ib_mad_agent_private *map, u16 pkey_index) |
1007 | diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verbs.c |
1008 | index 6ee03d6089eb..82f309fb3ce5 100644 |
1009 | --- a/drivers/infiniband/core/verbs.c |
1010 | +++ b/drivers/infiniband/core/verbs.c |
1011 | @@ -1087,8 +1087,8 @@ struct ib_qp *ib_open_qp(struct ib_xrcd *xrcd, |
1012 | } |
1013 | EXPORT_SYMBOL(ib_open_qp); |
1014 | |
1015 | -static struct ib_qp *ib_create_xrc_qp(struct ib_qp *qp, |
1016 | - struct ib_qp_init_attr *qp_init_attr) |
1017 | +static struct ib_qp *create_xrc_qp(struct ib_qp *qp, |
1018 | + struct ib_qp_init_attr *qp_init_attr) |
1019 | { |
1020 | struct ib_qp *real_qp = qp; |
1021 | |
1022 | @@ -1103,10 +1103,10 @@ static struct ib_qp *ib_create_xrc_qp(struct ib_qp *qp, |
1023 | |
1024 | qp = __ib_open_qp(real_qp, qp_init_attr->event_handler, |
1025 | qp_init_attr->qp_context); |
1026 | - if (!IS_ERR(qp)) |
1027 | - __ib_insert_xrcd_qp(qp_init_attr->xrcd, real_qp); |
1028 | - else |
1029 | - real_qp->device->destroy_qp(real_qp); |
1030 | + if (IS_ERR(qp)) |
1031 | + return qp; |
1032 | + |
1033 | + __ib_insert_xrcd_qp(qp_init_attr->xrcd, real_qp); |
1034 | return qp; |
1035 | } |
1036 | |
1037 | @@ -1137,10 +1137,8 @@ struct ib_qp *ib_create_qp(struct ib_pd *pd, |
1038 | return qp; |
1039 | |
1040 | ret = ib_create_qp_security(qp, device); |
1041 | - if (ret) { |
1042 | - ib_destroy_qp(qp); |
1043 | - return ERR_PTR(ret); |
1044 | - } |
1045 | + if (ret) |
1046 | + goto err; |
1047 | |
1048 | qp->real_qp = qp; |
1049 | qp->qp_type = qp_init_attr->qp_type; |
1050 | @@ -1153,8 +1151,15 @@ struct ib_qp *ib_create_qp(struct ib_pd *pd, |
1051 | INIT_LIST_HEAD(&qp->sig_mrs); |
1052 | qp->port = 0; |
1053 | |
1054 | - if (qp_init_attr->qp_type == IB_QPT_XRC_TGT) |
1055 | - return ib_create_xrc_qp(qp, qp_init_attr); |
1056 | + if (qp_init_attr->qp_type == IB_QPT_XRC_TGT) { |
1057 | + struct ib_qp *xrc_qp = create_xrc_qp(qp, qp_init_attr); |
1058 | + |
1059 | + if (IS_ERR(xrc_qp)) { |
1060 | + ret = PTR_ERR(xrc_qp); |
1061 | + goto err; |
1062 | + } |
1063 | + return xrc_qp; |
1064 | + } |
1065 | |
1066 | qp->event_handler = qp_init_attr->event_handler; |
1067 | qp->qp_context = qp_init_attr->qp_context; |
1068 | @@ -1181,11 +1186,8 @@ struct ib_qp *ib_create_qp(struct ib_pd *pd, |
1069 | |
1070 | if (qp_init_attr->cap.max_rdma_ctxs) { |
1071 | ret = rdma_rw_init_mrs(qp, qp_init_attr); |
1072 | - if (ret) { |
1073 | - pr_err("failed to init MR pool ret= %d\n", ret); |
1074 | - ib_destroy_qp(qp); |
1075 | - return ERR_PTR(ret); |
1076 | - } |
1077 | + if (ret) |
1078 | + goto err; |
1079 | } |
1080 | |
1081 | /* |
1082 | @@ -1198,6 +1200,11 @@ struct ib_qp *ib_create_qp(struct ib_pd *pd, |
1083 | device->attrs.max_sge_rd); |
1084 | |
1085 | return qp; |
1086 | + |
1087 | +err: |
1088 | + ib_destroy_qp(qp); |
1089 | + return ERR_PTR(ret); |
1090 | + |
1091 | } |
1092 | EXPORT_SYMBOL(ib_create_qp); |
1093 | |
1094 | diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.c b/drivers/infiniband/ulp/srpt/ib_srpt.c |
1095 | index f4bce5aa0ff8..ea4afdeb06a4 100644 |
1096 | --- a/drivers/infiniband/ulp/srpt/ib_srpt.c |
1097 | +++ b/drivers/infiniband/ulp/srpt/ib_srpt.c |
1098 | @@ -2793,8 +2793,19 @@ static void srpt_queue_tm_rsp(struct se_cmd *cmd) |
1099 | srpt_queue_response(cmd); |
1100 | } |
1101 | |
1102 | +/* |
1103 | + * This function is called for aborted commands if no response is sent to the |
1104 | + * initiator. Make sure that the credits freed by aborting a command are |
1105 | + * returned to the initiator the next time a response is sent by incrementing |
1106 | + * ch->req_lim_delta. |
1107 | + */ |
1108 | static void srpt_aborted_task(struct se_cmd *cmd) |
1109 | { |
1110 | + struct srpt_send_ioctx *ioctx = container_of(cmd, |
1111 | + struct srpt_send_ioctx, cmd); |
1112 | + struct srpt_rdma_ch *ch = ioctx->ch; |
1113 | + |
1114 | + atomic_inc(&ch->req_lim_delta); |
1115 | } |
1116 | |
1117 | static int srpt_queue_status(struct se_cmd *cmd) |
1118 | diff --git a/drivers/input/keyboard/snvs_pwrkey.c b/drivers/input/keyboard/snvs_pwrkey.c |
1119 | index effb63205d3d..4c67cf30a5d9 100644 |
1120 | --- a/drivers/input/keyboard/snvs_pwrkey.c |
1121 | +++ b/drivers/input/keyboard/snvs_pwrkey.c |
1122 | @@ -148,6 +148,9 @@ static int imx_snvs_pwrkey_probe(struct platform_device *pdev) |
1123 | return error; |
1124 | } |
1125 | |
1126 | + pdata->input = input; |
1127 | + platform_set_drvdata(pdev, pdata); |
1128 | + |
1129 | error = devm_request_irq(&pdev->dev, pdata->irq, |
1130 | imx_snvs_pwrkey_interrupt, |
1131 | 0, pdev->name, pdev); |
1132 | @@ -163,9 +166,6 @@ static int imx_snvs_pwrkey_probe(struct platform_device *pdev) |
1133 | return error; |
1134 | } |
1135 | |
1136 | - pdata->input = input; |
1137 | - platform_set_drvdata(pdev, pdata); |
1138 | - |
1139 | device_init_wakeup(&pdev->dev, pdata->wakeup); |
1140 | |
1141 | return 0; |
1142 | diff --git a/drivers/input/touchscreen/stmfts.c b/drivers/input/touchscreen/stmfts.c |
1143 | index 704e99046916..b6f95f20f924 100644 |
1144 | --- a/drivers/input/touchscreen/stmfts.c |
1145 | +++ b/drivers/input/touchscreen/stmfts.c |
1146 | @@ -106,27 +106,29 @@ struct stmfts_data { |
1147 | bool running; |
1148 | }; |
1149 | |
1150 | -static void stmfts_brightness_set(struct led_classdev *led_cdev, |
1151 | +static int stmfts_brightness_set(struct led_classdev *led_cdev, |
1152 | enum led_brightness value) |
1153 | { |
1154 | struct stmfts_data *sdata = container_of(led_cdev, |
1155 | struct stmfts_data, led_cdev); |
1156 | int err; |
1157 | |
1158 | - if (value == sdata->led_status || !sdata->ledvdd) |
1159 | - return; |
1160 | - |
1161 | - if (!value) { |
1162 | - regulator_disable(sdata->ledvdd); |
1163 | - } else { |
1164 | - err = regulator_enable(sdata->ledvdd); |
1165 | - if (err) |
1166 | - dev_warn(&sdata->client->dev, |
1167 | - "failed to disable ledvdd regulator: %d\n", |
1168 | - err); |
1169 | + if (value != sdata->led_status && sdata->ledvdd) { |
1170 | + if (!value) { |
1171 | + regulator_disable(sdata->ledvdd); |
1172 | + } else { |
1173 | + err = regulator_enable(sdata->ledvdd); |
1174 | + if (err) { |
1175 | + dev_warn(&sdata->client->dev, |
1176 | + "failed to disable ledvdd regulator: %d\n", |
1177 | + err); |
1178 | + return err; |
1179 | + } |
1180 | + } |
1181 | + sdata->led_status = value; |
1182 | } |
1183 | |
1184 | - sdata->led_status = value; |
1185 | + return 0; |
1186 | } |
1187 | |
1188 | static enum led_brightness stmfts_brightness_get(struct led_classdev *led_cdev) |
1189 | @@ -608,7 +610,7 @@ static int stmfts_enable_led(struct stmfts_data *sdata) |
1190 | sdata->led_cdev.name = STMFTS_DEV_NAME; |
1191 | sdata->led_cdev.max_brightness = LED_ON; |
1192 | sdata->led_cdev.brightness = LED_OFF; |
1193 | - sdata->led_cdev.brightness_set = stmfts_brightness_set; |
1194 | + sdata->led_cdev.brightness_set_blocking = stmfts_brightness_set; |
1195 | sdata->led_cdev.brightness_get = stmfts_brightness_get; |
1196 | |
1197 | err = devm_led_classdev_register(&sdata->client->dev, &sdata->led_cdev); |
1198 | diff --git a/drivers/media/i2c/ov7670.c b/drivers/media/i2c/ov7670.c |
1199 | index 64d1402882c8..1f71c14c8aab 100644 |
1200 | --- a/drivers/media/i2c/ov7670.c |
1201 | +++ b/drivers/media/i2c/ov7670.c |
1202 | @@ -159,10 +159,10 @@ MODULE_PARM_DESC(debug, "Debug level (0-1)"); |
1203 | #define REG_GFIX 0x69 /* Fix gain control */ |
1204 | |
1205 | #define REG_DBLV 0x6b /* PLL control an debugging */ |
1206 | -#define DBLV_BYPASS 0x00 /* Bypass PLL */ |
1207 | -#define DBLV_X4 0x01 /* clock x4 */ |
1208 | -#define DBLV_X6 0x10 /* clock x6 */ |
1209 | -#define DBLV_X8 0x11 /* clock x8 */ |
1210 | +#define DBLV_BYPASS 0x0a /* Bypass PLL */ |
1211 | +#define DBLV_X4 0x4a /* clock x4 */ |
1212 | +#define DBLV_X6 0x8a /* clock x6 */ |
1213 | +#define DBLV_X8 0xca /* clock x8 */ |
1214 | |
1215 | #define REG_SCALING_XSC 0x70 /* Test pattern and horizontal scale factor */ |
1216 | #define TEST_PATTTERN_0 0x80 |
1217 | @@ -862,7 +862,7 @@ static int ov7675_set_framerate(struct v4l2_subdev *sd, |
1218 | if (ret < 0) |
1219 | return ret; |
1220 | |
1221 | - return ov7670_write(sd, REG_DBLV, DBLV_X4); |
1222 | + return 0; |
1223 | } |
1224 | |
1225 | static void ov7670_get_framerate_legacy(struct v4l2_subdev *sd, |
1226 | @@ -1797,11 +1797,7 @@ static int ov7670_probe(struct i2c_client *client, |
1227 | if (config->clock_speed) |
1228 | info->clock_speed = config->clock_speed; |
1229 | |
1230 | - /* |
1231 | - * It should be allowed for ov7670 too when it is migrated to |
1232 | - * the new frame rate formula. |
1233 | - */ |
1234 | - if (config->pll_bypass && id->driver_data != MODEL_OV7670) |
1235 | + if (config->pll_bypass) |
1236 | info->pll_bypass = true; |
1237 | |
1238 | if (config->pclk_hb_disable) |
1239 | diff --git a/drivers/mfd/twl-core.c b/drivers/mfd/twl-core.c |
1240 | index 299016bc46d9..104477b512a2 100644 |
1241 | --- a/drivers/mfd/twl-core.c |
1242 | +++ b/drivers/mfd/twl-core.c |
1243 | @@ -1245,6 +1245,28 @@ free: |
1244 | return status; |
1245 | } |
1246 | |
1247 | +static int __maybe_unused twl_suspend(struct device *dev) |
1248 | +{ |
1249 | + struct i2c_client *client = to_i2c_client(dev); |
1250 | + |
1251 | + if (client->irq) |
1252 | + disable_irq(client->irq); |
1253 | + |
1254 | + return 0; |
1255 | +} |
1256 | + |
1257 | +static int __maybe_unused twl_resume(struct device *dev) |
1258 | +{ |
1259 | + struct i2c_client *client = to_i2c_client(dev); |
1260 | + |
1261 | + if (client->irq) |
1262 | + enable_irq(client->irq); |
1263 | + |
1264 | + return 0; |
1265 | +} |
1266 | + |
1267 | +static SIMPLE_DEV_PM_OPS(twl_dev_pm_ops, twl_suspend, twl_resume); |
1268 | + |
1269 | static const struct i2c_device_id twl_ids[] = { |
1270 | { "twl4030", TWL4030_VAUX2 }, /* "Triton 2" */ |
1271 | { "twl5030", 0 }, /* T2 updated */ |
1272 | @@ -1262,6 +1284,7 @@ static const struct i2c_device_id twl_ids[] = { |
1273 | /* One Client Driver , 4 Clients */ |
1274 | static struct i2c_driver twl_driver = { |
1275 | .driver.name = DRIVER_NAME, |
1276 | + .driver.pm = &twl_dev_pm_ops, |
1277 | .id_table = twl_ids, |
1278 | .probe = twl_probe, |
1279 | .remove = twl_remove, |
1280 | diff --git a/drivers/net/bonding/bond_sysfs_slave.c b/drivers/net/bonding/bond_sysfs_slave.c |
1281 | index 2f120b2ffef0..4985268e2273 100644 |
1282 | --- a/drivers/net/bonding/bond_sysfs_slave.c |
1283 | +++ b/drivers/net/bonding/bond_sysfs_slave.c |
1284 | @@ -55,7 +55,9 @@ static SLAVE_ATTR_RO(link_failure_count); |
1285 | |
1286 | static ssize_t perm_hwaddr_show(struct slave *slave, char *buf) |
1287 | { |
1288 | - return sprintf(buf, "%pM\n", slave->perm_hwaddr); |
1289 | + return sprintf(buf, "%*phC\n", |
1290 | + slave->dev->addr_len, |
1291 | + slave->perm_hwaddr); |
1292 | } |
1293 | static SLAVE_ATTR_RO(perm_hwaddr); |
1294 | |
1295 | diff --git a/drivers/net/ethernet/chelsio/libcxgb/libcxgb_ppm.c b/drivers/net/ethernet/chelsio/libcxgb/libcxgb_ppm.c |
1296 | index 74849be5f004..e2919005ead3 100644 |
1297 | --- a/drivers/net/ethernet/chelsio/libcxgb/libcxgb_ppm.c |
1298 | +++ b/drivers/net/ethernet/chelsio/libcxgb/libcxgb_ppm.c |
1299 | @@ -354,7 +354,10 @@ static struct cxgbi_ppm_pool *ppm_alloc_cpu_pool(unsigned int *total, |
1300 | ppmax = max; |
1301 | |
1302 | /* pool size must be multiple of unsigned long */ |
1303 | - bmap = BITS_TO_LONGS(ppmax); |
1304 | + bmap = ppmax / BITS_PER_TYPE(unsigned long); |
1305 | + if (!bmap) |
1306 | + return NULL; |
1307 | + |
1308 | ppmax = (bmap * sizeof(unsigned long)) << 3; |
1309 | |
1310 | alloc_sz = sizeof(*pools) + sizeof(unsigned long) * bmap; |
1311 | @@ -402,6 +405,10 @@ int cxgbi_ppm_init(void **ppm_pp, struct net_device *ndev, |
1312 | if (reserve_factor) { |
1313 | ppmax_pool = ppmax / reserve_factor; |
1314 | pool = ppm_alloc_cpu_pool(&ppmax_pool, &pool_index_max); |
1315 | + if (!pool) { |
1316 | + ppmax_pool = 0; |
1317 | + reserve_factor = 0; |
1318 | + } |
1319 | |
1320 | pr_debug("%s: ppmax %u, cpu total %u, per cpu %u.\n", |
1321 | ndev->name, ppmax, ppmax_pool, pool_index_max); |
1322 | diff --git a/drivers/net/ethernet/hisilicon/hns/hnae.c b/drivers/net/ethernet/hisilicon/hns/hnae.c |
1323 | index 79d03f8ee7b1..c7fa97a7e1f4 100644 |
1324 | --- a/drivers/net/ethernet/hisilicon/hns/hnae.c |
1325 | +++ b/drivers/net/ethernet/hisilicon/hns/hnae.c |
1326 | @@ -150,7 +150,6 @@ out_buffer_fail: |
1327 | /* free desc along with its attached buffer */ |
1328 | static void hnae_free_desc(struct hnae_ring *ring) |
1329 | { |
1330 | - hnae_free_buffers(ring); |
1331 | dma_unmap_single(ring_to_dev(ring), ring->desc_dma_addr, |
1332 | ring->desc_num * sizeof(ring->desc[0]), |
1333 | ring_to_dma_dir(ring)); |
1334 | @@ -183,6 +182,9 @@ static int hnae_alloc_desc(struct hnae_ring *ring) |
1335 | /* fini ring, also free the buffer for the ring */ |
1336 | static void hnae_fini_ring(struct hnae_ring *ring) |
1337 | { |
1338 | + if (is_rx_ring(ring)) |
1339 | + hnae_free_buffers(ring); |
1340 | + |
1341 | hnae_free_desc(ring); |
1342 | kfree(ring->desc_cb); |
1343 | ring->desc_cb = NULL; |
1344 | diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c |
1345 | index b8155f5e71b4..fdff5526d2e8 100644 |
1346 | --- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c |
1347 | +++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c |
1348 | @@ -2750,6 +2750,17 @@ int hns_dsaf_get_regs_count(void) |
1349 | return DSAF_DUMP_REGS_NUM; |
1350 | } |
1351 | |
1352 | +static int hns_dsaf_get_port_id(u8 port) |
1353 | +{ |
1354 | + if (port < DSAF_SERVICE_NW_NUM) |
1355 | + return port; |
1356 | + |
1357 | + if (port >= DSAF_BASE_INNER_PORT_NUM) |
1358 | + return port - DSAF_BASE_INNER_PORT_NUM + DSAF_SERVICE_NW_NUM; |
1359 | + |
1360 | + return -EINVAL; |
1361 | +} |
1362 | + |
1363 | static void set_promisc_tcam_enable(struct dsaf_device *dsaf_dev, u32 port) |
1364 | { |
1365 | struct dsaf_tbl_tcam_ucast_cfg tbl_tcam_ucast = {0, 1, 0, 0, 0x80}; |
1366 | @@ -2815,23 +2826,33 @@ static void set_promisc_tcam_enable(struct dsaf_device *dsaf_dev, u32 port) |
1367 | memset(&temp_key, 0x0, sizeof(temp_key)); |
1368 | mask_entry.addr[0] = 0x01; |
1369 | hns_dsaf_set_mac_key(dsaf_dev, &mask_key, mask_entry.in_vlan_id, |
1370 | - port, mask_entry.addr); |
1371 | + 0xf, mask_entry.addr); |
1372 | tbl_tcam_mcast.tbl_mcast_item_vld = 1; |
1373 | tbl_tcam_mcast.tbl_mcast_old_en = 0; |
1374 | |
1375 | - if (port < DSAF_SERVICE_NW_NUM) { |
1376 | - mskid = port; |
1377 | - } else if (port >= DSAF_BASE_INNER_PORT_NUM) { |
1378 | - mskid = port - DSAF_BASE_INNER_PORT_NUM + DSAF_SERVICE_NW_NUM; |
1379 | - } else { |
1380 | + /* set MAC port to handle multicast */ |
1381 | + mskid = hns_dsaf_get_port_id(port); |
1382 | + if (mskid == -EINVAL) { |
1383 | dev_err(dsaf_dev->dev, "%s,pnum(%d)error,key(%#x:%#x)\n", |
1384 | dsaf_dev->ae_dev.name, port, |
1385 | mask_key.high.val, mask_key.low.val); |
1386 | return; |
1387 | } |
1388 | + dsaf_set_bit(tbl_tcam_mcast.tbl_mcast_port_msk[mskid / 32], |
1389 | + mskid % 32, 1); |
1390 | |
1391 | + /* set pool bit map to handle multicast */ |
1392 | + mskid = hns_dsaf_get_port_id(port_num); |
1393 | + if (mskid == -EINVAL) { |
1394 | + dev_err(dsaf_dev->dev, |
1395 | + "%s, pool bit map pnum(%d)error,key(%#x:%#x)\n", |
1396 | + dsaf_dev->ae_dev.name, port_num, |
1397 | + mask_key.high.val, mask_key.low.val); |
1398 | + return; |
1399 | + } |
1400 | dsaf_set_bit(tbl_tcam_mcast.tbl_mcast_port_msk[mskid / 32], |
1401 | mskid % 32, 1); |
1402 | + |
1403 | memcpy(&temp_key, &mask_key, sizeof(mask_key)); |
1404 | hns_dsaf_tcam_mc_cfg_vague(dsaf_dev, entry_index, &tbl_tcam_data_mc, |
1405 | (struct dsaf_tbl_tcam_data *)(&mask_key), |
1406 | diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_xgmac.c b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_xgmac.c |
1407 | index ba4316910dea..a60f207768fc 100644 |
1408 | --- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_xgmac.c |
1409 | +++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_xgmac.c |
1410 | @@ -129,7 +129,7 @@ static void hns_xgmac_lf_rf_control_init(struct mac_driver *mac_drv) |
1411 | dsaf_set_bit(val, XGMAC_UNIDIR_EN_B, 0); |
1412 | dsaf_set_bit(val, XGMAC_RF_TX_EN_B, 1); |
1413 | dsaf_set_field(val, XGMAC_LF_RF_INSERT_M, XGMAC_LF_RF_INSERT_S, 0); |
1414 | - dsaf_write_reg(mac_drv, XGMAC_MAC_TX_LF_RF_CONTROL_REG, val); |
1415 | + dsaf_write_dev(mac_drv, XGMAC_MAC_TX_LF_RF_CONTROL_REG, val); |
1416 | } |
1417 | |
1418 | /** |
1419 | diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c b/drivers/net/ethernet/hisilicon/hns/hns_enet.c |
1420 | index cc84133c184d..1c70f9aa0aa7 100644 |
1421 | --- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c |
1422 | +++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c |
1423 | @@ -29,9 +29,6 @@ |
1424 | |
1425 | #define SERVICE_TIMER_HZ (1 * HZ) |
1426 | |
1427 | -#define NIC_TX_CLEAN_MAX_NUM 256 |
1428 | -#define NIC_RX_CLEAN_MAX_NUM 64 |
1429 | - |
1430 | #define RCB_IRQ_NOT_INITED 0 |
1431 | #define RCB_IRQ_INITED 1 |
1432 | #define HNS_BUFFER_SIZE_2048 2048 |
1433 | @@ -376,8 +373,6 @@ netdev_tx_t hns_nic_net_xmit_hw(struct net_device *ndev, |
1434 | wmb(); /* commit all data before submit */ |
1435 | assert(skb->queue_mapping < priv->ae_handle->q_num); |
1436 | hnae_queue_xmit(priv->ae_handle->qs[skb->queue_mapping], buf_num); |
1437 | - ring->stats.tx_pkts++; |
1438 | - ring->stats.tx_bytes += skb->len; |
1439 | |
1440 | return NETDEV_TX_OK; |
1441 | |
1442 | @@ -999,6 +994,9 @@ static int hns_nic_tx_poll_one(struct hns_nic_ring_data *ring_data, |
1443 | /* issue prefetch for next Tx descriptor */ |
1444 | prefetch(&ring->desc_cb[ring->next_to_clean]); |
1445 | } |
1446 | + /* update tx ring statistics. */ |
1447 | + ring->stats.tx_pkts += pkts; |
1448 | + ring->stats.tx_bytes += bytes; |
1449 | |
1450 | NETIF_TX_UNLOCK(ring); |
1451 | |
1452 | @@ -2150,7 +2148,7 @@ static int hns_nic_init_ring_data(struct hns_nic_priv *priv) |
1453 | hns_nic_tx_fini_pro_v2; |
1454 | |
1455 | netif_napi_add(priv->netdev, &rd->napi, |
1456 | - hns_nic_common_poll, NIC_TX_CLEAN_MAX_NUM); |
1457 | + hns_nic_common_poll, NAPI_POLL_WEIGHT); |
1458 | rd->ring->irq_init_flag = RCB_IRQ_NOT_INITED; |
1459 | } |
1460 | for (i = h->q_num; i < h->q_num * 2; i++) { |
1461 | @@ -2163,7 +2161,7 @@ static int hns_nic_init_ring_data(struct hns_nic_priv *priv) |
1462 | hns_nic_rx_fini_pro_v2; |
1463 | |
1464 | netif_napi_add(priv->netdev, &rd->napi, |
1465 | - hns_nic_common_poll, NIC_RX_CLEAN_MAX_NUM); |
1466 | + hns_nic_common_poll, NAPI_POLL_WEIGHT); |
1467 | rd->ring->irq_init_flag = RCB_IRQ_NOT_INITED; |
1468 | } |
1469 | |
1470 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/Makefile b/drivers/net/ethernet/hisilicon/hns3/hns3pf/Makefile |
1471 | index cb8ddd043476..d278fc7ea3ed 100644 |
1472 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/Makefile |
1473 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/Makefile |
1474 | @@ -3,7 +3,7 @@ |
1475 | # Makefile for the HISILICON network device drivers. |
1476 | # |
1477 | |
1478 | -ccflags-y := -Idrivers/net/ethernet/hisilicon/hns3 |
1479 | +ccflags-y := -I $(srctree)/drivers/net/ethernet/hisilicon/hns3 |
1480 | |
1481 | obj-$(CONFIG_HNS3_HCLGE) += hclge.o |
1482 | hclge-objs = hclge_main.o hclge_cmd.o hclge_mdio.o hclge_tm.o hclge_mbx.o |
1483 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/Makefile b/drivers/net/ethernet/hisilicon/hns3/hns3vf/Makefile |
1484 | index fb93bbd35845..6193f8fa7cf3 100644 |
1485 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/Makefile |
1486 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/Makefile |
1487 | @@ -3,7 +3,7 @@ |
1488 | # Makefile for the HISILICON network device drivers. |
1489 | # |
1490 | |
1491 | -ccflags-y := -Idrivers/net/ethernet/hisilicon/hns3 |
1492 | +ccflags-y := -I $(srctree)/drivers/net/ethernet/hisilicon/hns3 |
1493 | |
1494 | obj-$(CONFIG_HNS3_HCLGEVF) += hclgevf.o |
1495 | hclgevf-objs = hclgevf_main.o hclgevf_cmd.o hclgevf_mbx.o |
1496 | \ No newline at end of file |
1497 | diff --git a/drivers/net/ethernet/intel/igb/e1000_defines.h b/drivers/net/ethernet/intel/igb/e1000_defines.h |
1498 | index 8a28f3388f69..dca671591ef6 100644 |
1499 | --- a/drivers/net/ethernet/intel/igb/e1000_defines.h |
1500 | +++ b/drivers/net/ethernet/intel/igb/e1000_defines.h |
1501 | @@ -194,6 +194,8 @@ |
1502 | /* enable link status from external LINK_0 and LINK_1 pins */ |
1503 | #define E1000_CTRL_SWDPIN0 0x00040000 /* SWDPIN 0 value */ |
1504 | #define E1000_CTRL_SWDPIN1 0x00080000 /* SWDPIN 1 value */ |
1505 | +#define E1000_CTRL_ADVD3WUC 0x00100000 /* D3 WUC */ |
1506 | +#define E1000_CTRL_EN_PHY_PWR_MGMT 0x00200000 /* PHY PM enable */ |
1507 | #define E1000_CTRL_SDP0_DIR 0x00400000 /* SDP0 Data direction */ |
1508 | #define E1000_CTRL_SDP1_DIR 0x00800000 /* SDP1 Data direction */ |
1509 | #define E1000_CTRL_RST 0x04000000 /* Global reset */ |
1510 | diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c |
1511 | index ffaa6e031632..aa39a068858e 100644 |
1512 | --- a/drivers/net/ethernet/intel/igb/igb_main.c |
1513 | +++ b/drivers/net/ethernet/intel/igb/igb_main.c |
1514 | @@ -8754,9 +8754,7 @@ static int __igb_shutdown(struct pci_dev *pdev, bool *enable_wake, |
1515 | struct e1000_hw *hw = &adapter->hw; |
1516 | u32 ctrl, rctl, status; |
1517 | u32 wufc = runtime ? E1000_WUFC_LNKC : adapter->wol; |
1518 | -#ifdef CONFIG_PM |
1519 | - int retval = 0; |
1520 | -#endif |
1521 | + bool wake; |
1522 | |
1523 | rtnl_lock(); |
1524 | netif_device_detach(netdev); |
1525 | @@ -8769,14 +8767,6 @@ static int __igb_shutdown(struct pci_dev *pdev, bool *enable_wake, |
1526 | igb_clear_interrupt_scheme(adapter); |
1527 | rtnl_unlock(); |
1528 | |
1529 | -#ifdef CONFIG_PM |
1530 | - if (!runtime) { |
1531 | - retval = pci_save_state(pdev); |
1532 | - if (retval) |
1533 | - return retval; |
1534 | - } |
1535 | -#endif |
1536 | - |
1537 | status = rd32(E1000_STATUS); |
1538 | if (status & E1000_STATUS_LU) |
1539 | wufc &= ~E1000_WUFC_LNKC; |
1540 | @@ -8793,10 +8783,6 @@ static int __igb_shutdown(struct pci_dev *pdev, bool *enable_wake, |
1541 | } |
1542 | |
1543 | ctrl = rd32(E1000_CTRL); |
1544 | - /* advertise wake from D3Cold */ |
1545 | - #define E1000_CTRL_ADVD3WUC 0x00100000 |
1546 | - /* phy power management enable */ |
1547 | - #define E1000_CTRL_EN_PHY_PWR_MGMT 0x00200000 |
1548 | ctrl |= E1000_CTRL_ADVD3WUC; |
1549 | wr32(E1000_CTRL, ctrl); |
1550 | |
1551 | @@ -8810,12 +8796,15 @@ static int __igb_shutdown(struct pci_dev *pdev, bool *enable_wake, |
1552 | wr32(E1000_WUFC, 0); |
1553 | } |
1554 | |
1555 | - *enable_wake = wufc || adapter->en_mng_pt; |
1556 | - if (!*enable_wake) |
1557 | + wake = wufc || adapter->en_mng_pt; |
1558 | + if (!wake) |
1559 | igb_power_down_link(adapter); |
1560 | else |
1561 | igb_power_up_link(adapter); |
1562 | |
1563 | + if (enable_wake) |
1564 | + *enable_wake = wake; |
1565 | + |
1566 | /* Release control of h/w to f/w. If f/w is AMT enabled, this |
1567 | * would have already happened in close and is redundant. |
1568 | */ |
1569 | @@ -8858,22 +8847,7 @@ static void igb_deliver_wake_packet(struct net_device *netdev) |
1570 | |
1571 | static int __maybe_unused igb_suspend(struct device *dev) |
1572 | { |
1573 | - int retval; |
1574 | - bool wake; |
1575 | - struct pci_dev *pdev = to_pci_dev(dev); |
1576 | - |
1577 | - retval = __igb_shutdown(pdev, &wake, 0); |
1578 | - if (retval) |
1579 | - return retval; |
1580 | - |
1581 | - if (wake) { |
1582 | - pci_prepare_to_sleep(pdev); |
1583 | - } else { |
1584 | - pci_wake_from_d3(pdev, false); |
1585 | - pci_set_power_state(pdev, PCI_D3hot); |
1586 | - } |
1587 | - |
1588 | - return 0; |
1589 | + return __igb_shutdown(to_pci_dev(dev), NULL, 0); |
1590 | } |
1591 | |
1592 | static int __maybe_unused igb_resume(struct device *dev) |
1593 | @@ -8944,22 +8918,7 @@ static int __maybe_unused igb_runtime_idle(struct device *dev) |
1594 | |
1595 | static int __maybe_unused igb_runtime_suspend(struct device *dev) |
1596 | { |
1597 | - struct pci_dev *pdev = to_pci_dev(dev); |
1598 | - int retval; |
1599 | - bool wake; |
1600 | - |
1601 | - retval = __igb_shutdown(pdev, &wake, 1); |
1602 | - if (retval) |
1603 | - return retval; |
1604 | - |
1605 | - if (wake) { |
1606 | - pci_prepare_to_sleep(pdev); |
1607 | - } else { |
1608 | - pci_wake_from_d3(pdev, false); |
1609 | - pci_set_power_state(pdev, PCI_D3hot); |
1610 | - } |
1611 | - |
1612 | - return 0; |
1613 | + return __igb_shutdown(to_pci_dev(dev), NULL, 1); |
1614 | } |
1615 | |
1616 | static int __maybe_unused igb_runtime_resume(struct device *dev) |
1617 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c |
1618 | index 26c9f9421901..55ccd90beeb0 100644 |
1619 | --- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c |
1620 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c |
1621 | @@ -80,8 +80,7 @@ static int arm_vport_context_events_cmd(struct mlx5_core_dev *dev, u16 vport, |
1622 | opcode, MLX5_CMD_OP_MODIFY_NIC_VPORT_CONTEXT); |
1623 | MLX5_SET(modify_nic_vport_context_in, in, field_select.change_event, 1); |
1624 | MLX5_SET(modify_nic_vport_context_in, in, vport_number, vport); |
1625 | - if (vport) |
1626 | - MLX5_SET(modify_nic_vport_context_in, in, other_vport, 1); |
1627 | + MLX5_SET(modify_nic_vport_context_in, in, other_vport, 1); |
1628 | nic_vport_ctx = MLX5_ADDR_OF(modify_nic_vport_context_in, |
1629 | in, nic_vport_context); |
1630 | |
1631 | @@ -109,8 +108,7 @@ static int modify_esw_vport_context_cmd(struct mlx5_core_dev *dev, u16 vport, |
1632 | MLX5_SET(modify_esw_vport_context_in, in, opcode, |
1633 | MLX5_CMD_OP_MODIFY_ESW_VPORT_CONTEXT); |
1634 | MLX5_SET(modify_esw_vport_context_in, in, vport_number, vport); |
1635 | - if (vport) |
1636 | - MLX5_SET(modify_esw_vport_context_in, in, other_vport, 1); |
1637 | + MLX5_SET(modify_esw_vport_context_in, in, other_vport, 1); |
1638 | return mlx5_cmd_exec(dev, in, inlen, out, sizeof(out)); |
1639 | } |
1640 | |
1641 | diff --git a/drivers/net/ethernet/stmicro/stmmac/descs_com.h b/drivers/net/ethernet/stmicro/stmmac/descs_com.h |
1642 | index 40d6356a7e73..3dfb07a78952 100644 |
1643 | --- a/drivers/net/ethernet/stmicro/stmmac/descs_com.h |
1644 | +++ b/drivers/net/ethernet/stmicro/stmmac/descs_com.h |
1645 | @@ -29,11 +29,13 @@ |
1646 | /* Specific functions used for Ring mode */ |
1647 | |
1648 | /* Enhanced descriptors */ |
1649 | -static inline void ehn_desc_rx_set_on_ring(struct dma_desc *p, int end) |
1650 | +static inline void ehn_desc_rx_set_on_ring(struct dma_desc *p, int end, |
1651 | + int bfsize) |
1652 | { |
1653 | - p->des1 |= cpu_to_le32((BUF_SIZE_8KiB |
1654 | - << ERDES1_BUFFER2_SIZE_SHIFT) |
1655 | - & ERDES1_BUFFER2_SIZE_MASK); |
1656 | + if (bfsize == BUF_SIZE_16KiB) |
1657 | + p->des1 |= cpu_to_le32((BUF_SIZE_8KiB |
1658 | + << ERDES1_BUFFER2_SIZE_SHIFT) |
1659 | + & ERDES1_BUFFER2_SIZE_MASK); |
1660 | |
1661 | if (end) |
1662 | p->des1 |= cpu_to_le32(ERDES1_END_RING); |
1663 | @@ -59,11 +61,15 @@ static inline void enh_set_tx_desc_len_on_ring(struct dma_desc *p, int len) |
1664 | } |
1665 | |
1666 | /* Normal descriptors */ |
1667 | -static inline void ndesc_rx_set_on_ring(struct dma_desc *p, int end) |
1668 | +static inline void ndesc_rx_set_on_ring(struct dma_desc *p, int end, int bfsize) |
1669 | { |
1670 | - p->des1 |= cpu_to_le32(((BUF_SIZE_2KiB - 1) |
1671 | - << RDES1_BUFFER2_SIZE_SHIFT) |
1672 | - & RDES1_BUFFER2_SIZE_MASK); |
1673 | + if (bfsize >= BUF_SIZE_2KiB) { |
1674 | + int bfsize2; |
1675 | + |
1676 | + bfsize2 = min(bfsize - BUF_SIZE_2KiB + 1, BUF_SIZE_2KiB - 1); |
1677 | + p->des1 |= cpu_to_le32((bfsize2 << RDES1_BUFFER2_SIZE_SHIFT) |
1678 | + & RDES1_BUFFER2_SIZE_MASK); |
1679 | + } |
1680 | |
1681 | if (end) |
1682 | p->des1 |= cpu_to_le32(RDES1_END_RING); |
1683 | diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac4_descs.c b/drivers/net/ethernet/stmicro/stmmac/dwmac4_descs.c |
1684 | index 736e29635b77..313a58b68fee 100644 |
1685 | --- a/drivers/net/ethernet/stmicro/stmmac/dwmac4_descs.c |
1686 | +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac4_descs.c |
1687 | @@ -296,7 +296,7 @@ exit: |
1688 | } |
1689 | |
1690 | static void dwmac4_rd_init_rx_desc(struct dma_desc *p, int disable_rx_ic, |
1691 | - int mode, int end) |
1692 | + int mode, int end, int bfsize) |
1693 | { |
1694 | dwmac4_set_rx_owner(p, disable_rx_ic); |
1695 | } |
1696 | diff --git a/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_descs.c b/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_descs.c |
1697 | index 1d858fdec997..98fa471da7c0 100644 |
1698 | --- a/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_descs.c |
1699 | +++ b/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_descs.c |
1700 | @@ -123,7 +123,7 @@ static int dwxgmac2_get_rx_timestamp_status(void *desc, void *next_desc, |
1701 | } |
1702 | |
1703 | static void dwxgmac2_init_rx_desc(struct dma_desc *p, int disable_rx_ic, |
1704 | - int mode, int end) |
1705 | + int mode, int end, int bfsize) |
1706 | { |
1707 | dwxgmac2_set_rx_owner(p, disable_rx_ic); |
1708 | } |
1709 | diff --git a/drivers/net/ethernet/stmicro/stmmac/enh_desc.c b/drivers/net/ethernet/stmicro/stmmac/enh_desc.c |
1710 | index 5ef91a790f9d..5202d6ad7919 100644 |
1711 | --- a/drivers/net/ethernet/stmicro/stmmac/enh_desc.c |
1712 | +++ b/drivers/net/ethernet/stmicro/stmmac/enh_desc.c |
1713 | @@ -201,6 +201,11 @@ static int enh_desc_get_rx_status(void *data, struct stmmac_extra_stats *x, |
1714 | if (unlikely(rdes0 & RDES0_OWN)) |
1715 | return dma_own; |
1716 | |
1717 | + if (unlikely(!(rdes0 & RDES0_LAST_DESCRIPTOR))) { |
1718 | + stats->rx_length_errors++; |
1719 | + return discard_frame; |
1720 | + } |
1721 | + |
1722 | if (unlikely(rdes0 & RDES0_ERROR_SUMMARY)) { |
1723 | if (unlikely(rdes0 & RDES0_DESCRIPTOR_ERROR)) { |
1724 | x->rx_desc++; |
1725 | @@ -231,9 +236,10 @@ static int enh_desc_get_rx_status(void *data, struct stmmac_extra_stats *x, |
1726 | * It doesn't match with the information reported into the databook. |
1727 | * At any rate, we need to understand if the CSUM hw computation is ok |
1728 | * and report this info to the upper layers. */ |
1729 | - ret = enh_desc_coe_rdes0(!!(rdes0 & RDES0_IPC_CSUM_ERROR), |
1730 | - !!(rdes0 & RDES0_FRAME_TYPE), |
1731 | - !!(rdes0 & ERDES0_RX_MAC_ADDR)); |
1732 | + if (likely(ret == good_frame)) |
1733 | + ret = enh_desc_coe_rdes0(!!(rdes0 & RDES0_IPC_CSUM_ERROR), |
1734 | + !!(rdes0 & RDES0_FRAME_TYPE), |
1735 | + !!(rdes0 & ERDES0_RX_MAC_ADDR)); |
1736 | |
1737 | if (unlikely(rdes0 & RDES0_DRIBBLING)) |
1738 | x->dribbling_bit++; |
1739 | @@ -259,15 +265,19 @@ static int enh_desc_get_rx_status(void *data, struct stmmac_extra_stats *x, |
1740 | } |
1741 | |
1742 | static void enh_desc_init_rx_desc(struct dma_desc *p, int disable_rx_ic, |
1743 | - int mode, int end) |
1744 | + int mode, int end, int bfsize) |
1745 | { |
1746 | + int bfsize1; |
1747 | + |
1748 | p->des0 |= cpu_to_le32(RDES0_OWN); |
1749 | - p->des1 |= cpu_to_le32(BUF_SIZE_8KiB & ERDES1_BUFFER1_SIZE_MASK); |
1750 | + |
1751 | + bfsize1 = min(bfsize, BUF_SIZE_8KiB); |
1752 | + p->des1 |= cpu_to_le32(bfsize1 & ERDES1_BUFFER1_SIZE_MASK); |
1753 | |
1754 | if (mode == STMMAC_CHAIN_MODE) |
1755 | ehn_desc_rx_set_on_chain(p); |
1756 | else |
1757 | - ehn_desc_rx_set_on_ring(p, end); |
1758 | + ehn_desc_rx_set_on_ring(p, end, bfsize); |
1759 | |
1760 | if (disable_rx_ic) |
1761 | p->des1 |= cpu_to_le32(ERDES1_DISABLE_IC); |
1762 | diff --git a/drivers/net/ethernet/stmicro/stmmac/hwif.h b/drivers/net/ethernet/stmicro/stmmac/hwif.h |
1763 | index 92b8944f26e3..5bb00234d961 100644 |
1764 | --- a/drivers/net/ethernet/stmicro/stmmac/hwif.h |
1765 | +++ b/drivers/net/ethernet/stmicro/stmmac/hwif.h |
1766 | @@ -33,7 +33,7 @@ struct dma_extended_desc; |
1767 | struct stmmac_desc_ops { |
1768 | /* DMA RX descriptor ring initialization */ |
1769 | void (*init_rx_desc)(struct dma_desc *p, int disable_rx_ic, int mode, |
1770 | - int end); |
1771 | + int end, int bfsize); |
1772 | /* DMA TX descriptor ring initialization */ |
1773 | void (*init_tx_desc)(struct dma_desc *p, int mode, int end); |
1774 | /* Invoked by the xmit function to prepare the tx descriptor */ |
1775 | diff --git a/drivers/net/ethernet/stmicro/stmmac/norm_desc.c b/drivers/net/ethernet/stmicro/stmmac/norm_desc.c |
1776 | index de65bb29feba..b7dd4e3c760d 100644 |
1777 | --- a/drivers/net/ethernet/stmicro/stmmac/norm_desc.c |
1778 | +++ b/drivers/net/ethernet/stmicro/stmmac/norm_desc.c |
1779 | @@ -91,8 +91,6 @@ static int ndesc_get_rx_status(void *data, struct stmmac_extra_stats *x, |
1780 | return dma_own; |
1781 | |
1782 | if (unlikely(!(rdes0 & RDES0_LAST_DESCRIPTOR))) { |
1783 | - pr_warn("%s: Oversized frame spanned multiple buffers\n", |
1784 | - __func__); |
1785 | stats->rx_length_errors++; |
1786 | return discard_frame; |
1787 | } |
1788 | @@ -135,15 +133,19 @@ static int ndesc_get_rx_status(void *data, struct stmmac_extra_stats *x, |
1789 | } |
1790 | |
1791 | static void ndesc_init_rx_desc(struct dma_desc *p, int disable_rx_ic, int mode, |
1792 | - int end) |
1793 | + int end, int bfsize) |
1794 | { |
1795 | + int bfsize1; |
1796 | + |
1797 | p->des0 |= cpu_to_le32(RDES0_OWN); |
1798 | - p->des1 |= cpu_to_le32((BUF_SIZE_2KiB - 1) & RDES1_BUFFER1_SIZE_MASK); |
1799 | + |
1800 | + bfsize1 = min(bfsize, BUF_SIZE_2KiB - 1); |
1801 | + p->des1 |= cpu_to_le32(bfsize & RDES1_BUFFER1_SIZE_MASK); |
1802 | |
1803 | if (mode == STMMAC_CHAIN_MODE) |
1804 | ndesc_rx_set_on_chain(p, end); |
1805 | else |
1806 | - ndesc_rx_set_on_ring(p, end); |
1807 | + ndesc_rx_set_on_ring(p, end, bfsize); |
1808 | |
1809 | if (disable_rx_ic) |
1810 | p->des1 |= cpu_to_le32(RDES1_DISABLE_IC); |
1811 | diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c |
1812 | index 39c105092214..5debe93ea4eb 100644 |
1813 | --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c |
1814 | +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c |
1815 | @@ -1111,11 +1111,13 @@ static void stmmac_clear_rx_descriptors(struct stmmac_priv *priv, u32 queue) |
1816 | if (priv->extend_desc) |
1817 | stmmac_init_rx_desc(priv, &rx_q->dma_erx[i].basic, |
1818 | priv->use_riwt, priv->mode, |
1819 | - (i == DMA_RX_SIZE - 1)); |
1820 | + (i == DMA_RX_SIZE - 1), |
1821 | + priv->dma_buf_sz); |
1822 | else |
1823 | stmmac_init_rx_desc(priv, &rx_q->dma_rx[i], |
1824 | priv->use_riwt, priv->mode, |
1825 | - (i == DMA_RX_SIZE - 1)); |
1826 | + (i == DMA_RX_SIZE - 1), |
1827 | + priv->dma_buf_sz); |
1828 | } |
1829 | |
1830 | /** |
1831 | @@ -3331,9 +3333,8 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit, u32 queue) |
1832 | { |
1833 | struct stmmac_rx_queue *rx_q = &priv->rx_queue[queue]; |
1834 | struct stmmac_channel *ch = &priv->channel[queue]; |
1835 | - unsigned int entry = rx_q->cur_rx; |
1836 | + unsigned int next_entry = rx_q->cur_rx; |
1837 | int coe = priv->hw->rx_csum; |
1838 | - unsigned int next_entry; |
1839 | unsigned int count = 0; |
1840 | bool xmac; |
1841 | |
1842 | @@ -3351,10 +3352,12 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit, u32 queue) |
1843 | stmmac_display_ring(priv, rx_head, DMA_RX_SIZE, true); |
1844 | } |
1845 | while (count < limit) { |
1846 | - int status; |
1847 | + int entry, status; |
1848 | struct dma_desc *p; |
1849 | struct dma_desc *np; |
1850 | |
1851 | + entry = next_entry; |
1852 | + |
1853 | if (priv->extend_desc) |
1854 | p = (struct dma_desc *)(rx_q->dma_erx + entry); |
1855 | else |
1856 | @@ -3410,11 +3413,12 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit, u32 queue) |
1857 | * ignored |
1858 | */ |
1859 | if (frame_len > priv->dma_buf_sz) { |
1860 | - netdev_err(priv->dev, |
1861 | - "len %d larger than size (%d)\n", |
1862 | - frame_len, priv->dma_buf_sz); |
1863 | + if (net_ratelimit()) |
1864 | + netdev_err(priv->dev, |
1865 | + "len %d larger than size (%d)\n", |
1866 | + frame_len, priv->dma_buf_sz); |
1867 | priv->dev->stats.rx_length_errors++; |
1868 | - break; |
1869 | + continue; |
1870 | } |
1871 | |
1872 | /* ACS is set; GMAC core strips PAD/FCS for IEEE 802.3 |
1873 | @@ -3449,7 +3453,7 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit, u32 queue) |
1874 | dev_warn(priv->device, |
1875 | "packet dropped\n"); |
1876 | priv->dev->stats.rx_dropped++; |
1877 | - break; |
1878 | + continue; |
1879 | } |
1880 | |
1881 | dma_sync_single_for_cpu(priv->device, |
1882 | @@ -3469,11 +3473,12 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit, u32 queue) |
1883 | } else { |
1884 | skb = rx_q->rx_skbuff[entry]; |
1885 | if (unlikely(!skb)) { |
1886 | - netdev_err(priv->dev, |
1887 | - "%s: Inconsistent Rx chain\n", |
1888 | - priv->dev->name); |
1889 | + if (net_ratelimit()) |
1890 | + netdev_err(priv->dev, |
1891 | + "%s: Inconsistent Rx chain\n", |
1892 | + priv->dev->name); |
1893 | priv->dev->stats.rx_dropped++; |
1894 | - break; |
1895 | + continue; |
1896 | } |
1897 | prefetch(skb->data - NET_IP_ALIGN); |
1898 | rx_q->rx_skbuff[entry] = NULL; |
1899 | @@ -3508,7 +3513,6 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit, u32 queue) |
1900 | priv->dev->stats.rx_packets++; |
1901 | priv->dev->stats.rx_bytes += frame_len; |
1902 | } |
1903 | - entry = next_entry; |
1904 | } |
1905 | |
1906 | stmmac_rx_refill(priv, queue); |
1907 | diff --git a/drivers/net/wireless/intel/iwlwifi/cfg/5000.c b/drivers/net/wireless/intel/iwlwifi/cfg/5000.c |
1908 | index 36151e61a26f..c04d934b23b4 100644 |
1909 | --- a/drivers/net/wireless/intel/iwlwifi/cfg/5000.c |
1910 | +++ b/drivers/net/wireless/intel/iwlwifi/cfg/5000.c |
1911 | @@ -1,7 +1,7 @@ |
1912 | /****************************************************************************** |
1913 | * |
1914 | * Copyright(c) 2007 - 2014 Intel Corporation. All rights reserved. |
1915 | - * Copyright(c) 2018 Intel Corporation |
1916 | + * Copyright(c) 2018 - 2019 Intel Corporation |
1917 | * |
1918 | * This program is free software; you can redistribute it and/or modify it |
1919 | * under the terms of version 2 of the GNU General Public License as |
1920 | @@ -140,6 +140,7 @@ const struct iwl_cfg iwl5350_agn_cfg = { |
1921 | .ht_params = &iwl5000_ht_params, |
1922 | .led_mode = IWL_LED_BLINK, |
1923 | .internal_wimax_coex = true, |
1924 | + .csr = &iwl_csr_v1, |
1925 | }; |
1926 | |
1927 | #define IWL_DEVICE_5150 \ |
1928 | diff --git a/drivers/net/wireless/marvell/mwifiex/sdio.c b/drivers/net/wireless/marvell/mwifiex/sdio.c |
1929 | index d49fbd58afa7..bfbe3aa058d9 100644 |
1930 | --- a/drivers/net/wireless/marvell/mwifiex/sdio.c |
1931 | +++ b/drivers/net/wireless/marvell/mwifiex/sdio.c |
1932 | @@ -181,7 +181,7 @@ static int mwifiex_sdio_resume(struct device *dev) |
1933 | |
1934 | adapter = card->adapter; |
1935 | |
1936 | - if (test_bit(MWIFIEX_IS_SUSPENDED, &adapter->work_flags)) { |
1937 | + if (!test_bit(MWIFIEX_IS_SUSPENDED, &adapter->work_flags)) { |
1938 | mwifiex_dbg(adapter, WARN, |
1939 | "device already resumed\n"); |
1940 | return 0; |
1941 | diff --git a/drivers/nvme/target/core.c b/drivers/nvme/target/core.c |
1942 | index b5ec96abd048..776b7e9e23b9 100644 |
1943 | --- a/drivers/nvme/target/core.c |
1944 | +++ b/drivers/nvme/target/core.c |
1945 | @@ -921,6 +921,15 @@ bool nvmet_host_allowed(struct nvmet_req *req, struct nvmet_subsys *subsys, |
1946 | return __nvmet_host_allowed(subsys, hostnqn); |
1947 | } |
1948 | |
1949 | +static void nvmet_fatal_error_handler(struct work_struct *work) |
1950 | +{ |
1951 | + struct nvmet_ctrl *ctrl = |
1952 | + container_of(work, struct nvmet_ctrl, fatal_err_work); |
1953 | + |
1954 | + pr_err("ctrl %d fatal error occurred!\n", ctrl->cntlid); |
1955 | + ctrl->ops->delete_ctrl(ctrl); |
1956 | +} |
1957 | + |
1958 | u16 nvmet_alloc_ctrl(const char *subsysnqn, const char *hostnqn, |
1959 | struct nvmet_req *req, u32 kato, struct nvmet_ctrl **ctrlp) |
1960 | { |
1961 | @@ -962,6 +971,7 @@ u16 nvmet_alloc_ctrl(const char *subsysnqn, const char *hostnqn, |
1962 | |
1963 | INIT_WORK(&ctrl->async_event_work, nvmet_async_event_work); |
1964 | INIT_LIST_HEAD(&ctrl->async_events); |
1965 | + INIT_WORK(&ctrl->fatal_err_work, nvmet_fatal_error_handler); |
1966 | |
1967 | memcpy(ctrl->subsysnqn, subsysnqn, NVMF_NQN_SIZE); |
1968 | memcpy(ctrl->hostnqn, hostnqn, NVMF_NQN_SIZE); |
1969 | @@ -1076,21 +1086,11 @@ void nvmet_ctrl_put(struct nvmet_ctrl *ctrl) |
1970 | kref_put(&ctrl->ref, nvmet_ctrl_free); |
1971 | } |
1972 | |
1973 | -static void nvmet_fatal_error_handler(struct work_struct *work) |
1974 | -{ |
1975 | - struct nvmet_ctrl *ctrl = |
1976 | - container_of(work, struct nvmet_ctrl, fatal_err_work); |
1977 | - |
1978 | - pr_err("ctrl %d fatal error occurred!\n", ctrl->cntlid); |
1979 | - ctrl->ops->delete_ctrl(ctrl); |
1980 | -} |
1981 | - |
1982 | void nvmet_ctrl_fatal_error(struct nvmet_ctrl *ctrl) |
1983 | { |
1984 | mutex_lock(&ctrl->lock); |
1985 | if (!(ctrl->csts & NVME_CSTS_CFS)) { |
1986 | ctrl->csts |= NVME_CSTS_CFS; |
1987 | - INIT_WORK(&ctrl->fatal_err_work, nvmet_fatal_error_handler); |
1988 | schedule_work(&ctrl->fatal_err_work); |
1989 | } |
1990 | mutex_unlock(&ctrl->lock); |
1991 | diff --git a/drivers/platform/x86/intel_pmc_core.c b/drivers/platform/x86/intel_pmc_core.c |
1992 | index e0dcdb3cc070..088d1c2047e6 100644 |
1993 | --- a/drivers/platform/x86/intel_pmc_core.c |
1994 | +++ b/drivers/platform/x86/intel_pmc_core.c |
1995 | @@ -185,7 +185,7 @@ static const struct pmc_bit_map cnp_pfear_map[] = { |
1996 | {"CNVI", BIT(3)}, |
1997 | {"UFS0", BIT(4)}, |
1998 | {"EMMC", BIT(5)}, |
1999 | - {"Res_6", BIT(6)}, |
2000 | + {"SPF", BIT(6)}, |
2001 | {"SBR6", BIT(7)}, |
2002 | |
2003 | {"SBR7", BIT(0)}, |
2004 | @@ -682,7 +682,7 @@ static int __init pmc_core_probe(void) |
2005 | * Sunrisepoint PCH regmap can't be used. Use Cannonlake PCH regmap |
2006 | * in this case. |
2007 | */ |
2008 | - if (!pci_dev_present(pmc_pci_ids)) |
2009 | + if (pmcdev->map == &spt_reg_map && !pci_dev_present(pmc_pci_ids)) |
2010 | pmcdev->map = &cnp_reg_map; |
2011 | |
2012 | if (lpit_read_residency_count_address(&slp_s0_addr)) |
2013 | diff --git a/drivers/platform/x86/pmc_atom.c b/drivers/platform/x86/pmc_atom.c |
2014 | index 8f018b3f3cd4..eaec2d306481 100644 |
2015 | --- a/drivers/platform/x86/pmc_atom.c |
2016 | +++ b/drivers/platform/x86/pmc_atom.c |
2017 | @@ -17,6 +17,7 @@ |
2018 | |
2019 | #include <linux/debugfs.h> |
2020 | #include <linux/device.h> |
2021 | +#include <linux/dmi.h> |
2022 | #include <linux/init.h> |
2023 | #include <linux/io.h> |
2024 | #include <linux/platform_data/x86/clk-pmc-atom.h> |
2025 | @@ -391,11 +392,27 @@ static int pmc_dbgfs_register(struct pmc_dev *pmc) |
2026 | } |
2027 | #endif /* CONFIG_DEBUG_FS */ |
2028 | |
2029 | +/* |
2030 | + * Some systems need one or more of their pmc_plt_clks to be |
2031 | + * marked as critical. |
2032 | + */ |
2033 | +static const struct dmi_system_id critclk_systems[] __initconst = { |
2034 | + { |
2035 | + .ident = "MPL CEC1x", |
2036 | + .matches = { |
2037 | + DMI_MATCH(DMI_SYS_VENDOR, "MPL AG"), |
2038 | + DMI_MATCH(DMI_PRODUCT_NAME, "CEC10 Family"), |
2039 | + }, |
2040 | + }, |
2041 | + { /*sentinel*/ } |
2042 | +}; |
2043 | + |
2044 | static int pmc_setup_clks(struct pci_dev *pdev, void __iomem *pmc_regmap, |
2045 | const struct pmc_data *pmc_data) |
2046 | { |
2047 | struct platform_device *clkdev; |
2048 | struct pmc_clk_data *clk_data; |
2049 | + const struct dmi_system_id *d = dmi_first_match(critclk_systems); |
2050 | |
2051 | clk_data = kzalloc(sizeof(*clk_data), GFP_KERNEL); |
2052 | if (!clk_data) |
2053 | @@ -403,6 +420,10 @@ static int pmc_setup_clks(struct pci_dev *pdev, void __iomem *pmc_regmap, |
2054 | |
2055 | clk_data->base = pmc_regmap; /* offset is added by client */ |
2056 | clk_data->clks = pmc_data->clks; |
2057 | + if (d) { |
2058 | + clk_data->critical = true; |
2059 | + pr_info("%s critclks quirk enabled\n", d->ident); |
2060 | + } |
2061 | |
2062 | clkdev = platform_device_register_data(&pdev->dev, "clk-pmc-atom", |
2063 | PLATFORM_DEVID_NONE, |
2064 | diff --git a/drivers/reset/reset-meson-audio-arb.c b/drivers/reset/reset-meson-audio-arb.c |
2065 | index 91751617b37a..c53a2185a039 100644 |
2066 | --- a/drivers/reset/reset-meson-audio-arb.c |
2067 | +++ b/drivers/reset/reset-meson-audio-arb.c |
2068 | @@ -130,6 +130,7 @@ static int meson_audio_arb_probe(struct platform_device *pdev) |
2069 | arb->rstc.nr_resets = ARRAY_SIZE(axg_audio_arb_reset_bits); |
2070 | arb->rstc.ops = &meson_audio_arb_rstc_ops; |
2071 | arb->rstc.of_node = dev->of_node; |
2072 | + arb->rstc.owner = THIS_MODULE; |
2073 | |
2074 | /* |
2075 | * Enable general : |
2076 | diff --git a/drivers/rtc/rtc-cros-ec.c b/drivers/rtc/rtc-cros-ec.c |
2077 | index e5444296075e..4d6bf9304ceb 100644 |
2078 | --- a/drivers/rtc/rtc-cros-ec.c |
2079 | +++ b/drivers/rtc/rtc-cros-ec.c |
2080 | @@ -298,7 +298,7 @@ static int cros_ec_rtc_suspend(struct device *dev) |
2081 | struct cros_ec_rtc *cros_ec_rtc = dev_get_drvdata(&pdev->dev); |
2082 | |
2083 | if (device_may_wakeup(dev)) |
2084 | - enable_irq_wake(cros_ec_rtc->cros_ec->irq); |
2085 | + return enable_irq_wake(cros_ec_rtc->cros_ec->irq); |
2086 | |
2087 | return 0; |
2088 | } |
2089 | @@ -309,7 +309,7 @@ static int cros_ec_rtc_resume(struct device *dev) |
2090 | struct cros_ec_rtc *cros_ec_rtc = dev_get_drvdata(&pdev->dev); |
2091 | |
2092 | if (device_may_wakeup(dev)) |
2093 | - disable_irq_wake(cros_ec_rtc->cros_ec->irq); |
2094 | + return disable_irq_wake(cros_ec_rtc->cros_ec->irq); |
2095 | |
2096 | return 0; |
2097 | } |
2098 | diff --git a/drivers/rtc/rtc-da9063.c b/drivers/rtc/rtc-da9063.c |
2099 | index b4e054c64bad..69b54e5556c0 100644 |
2100 | --- a/drivers/rtc/rtc-da9063.c |
2101 | +++ b/drivers/rtc/rtc-da9063.c |
2102 | @@ -480,6 +480,13 @@ static int da9063_rtc_probe(struct platform_device *pdev) |
2103 | da9063_data_to_tm(data, &rtc->alarm_time, rtc); |
2104 | rtc->rtc_sync = false; |
2105 | |
2106 | + /* |
2107 | + * TODO: some models have alarms on a minute boundary but still support |
2108 | + * real hardware interrupts. Add this once the core supports it. |
2109 | + */ |
2110 | + if (config->rtc_data_start != RTC_SEC) |
2111 | + rtc->rtc_dev->uie_unsupported = 1; |
2112 | + |
2113 | irq_alarm = platform_get_irq_byname(pdev, "ALARM"); |
2114 | ret = devm_request_threaded_irq(&pdev->dev, irq_alarm, NULL, |
2115 | da9063_alarm_event, |
2116 | diff --git a/drivers/rtc/rtc-sh.c b/drivers/rtc/rtc-sh.c |
2117 | index 51ba414798a8..3d7414e5ed35 100644 |
2118 | --- a/drivers/rtc/rtc-sh.c |
2119 | +++ b/drivers/rtc/rtc-sh.c |
2120 | @@ -377,7 +377,7 @@ static int sh_rtc_set_time(struct device *dev, struct rtc_time *tm) |
2121 | static inline int sh_rtc_read_alarm_value(struct sh_rtc *rtc, int reg_off) |
2122 | { |
2123 | unsigned int byte; |
2124 | - int value = 0xff; /* return 0xff for ignored values */ |
2125 | + int value = -1; /* return -1 for ignored values */ |
2126 | |
2127 | byte = readb(rtc->regbase + reg_off); |
2128 | if (byte & AR_ENB) { |
2129 | diff --git a/drivers/scsi/scsi_devinfo.c b/drivers/scsi/scsi_devinfo.c |
2130 | index c4cbfd07b916..a08ff3bd6310 100644 |
2131 | --- a/drivers/scsi/scsi_devinfo.c |
2132 | +++ b/drivers/scsi/scsi_devinfo.c |
2133 | @@ -238,6 +238,7 @@ static struct { |
2134 | {"NETAPP", "Universal Xport", "*", BLIST_NO_ULD_ATTACH}, |
2135 | {"LSI", "Universal Xport", "*", BLIST_NO_ULD_ATTACH}, |
2136 | {"ENGENIO", "Universal Xport", "*", BLIST_NO_ULD_ATTACH}, |
2137 | + {"LENOVO", "Universal Xport", "*", BLIST_NO_ULD_ATTACH}, |
2138 | {"SMSC", "USB 2 HS-CF", NULL, BLIST_SPARSELUN | BLIST_INQUIRY_36}, |
2139 | {"SONY", "CD-ROM CDU-8001", NULL, BLIST_BORKEN}, |
2140 | {"SONY", "TSL", NULL, BLIST_FORCELUN}, /* DDS3 & DDS4 autoloaders */ |
2141 | diff --git a/drivers/scsi/scsi_dh.c b/drivers/scsi/scsi_dh.c |
2142 | index 5a58cbf3a75d..c14006ac98f9 100644 |
2143 | --- a/drivers/scsi/scsi_dh.c |
2144 | +++ b/drivers/scsi/scsi_dh.c |
2145 | @@ -75,6 +75,7 @@ static const struct scsi_dh_blist scsi_dh_blist[] = { |
2146 | {"NETAPP", "INF-01-00", "rdac", }, |
2147 | {"LSI", "INF-01-00", "rdac", }, |
2148 | {"ENGENIO", "INF-01-00", "rdac", }, |
2149 | + {"LENOVO", "DE_Series", "rdac", }, |
2150 | {NULL, NULL, NULL }, |
2151 | }; |
2152 | |
2153 | diff --git a/drivers/scsi/storvsc_drv.c b/drivers/scsi/storvsc_drv.c |
2154 | index f03dc03a42c3..0c2ba075bc71 100644 |
2155 | --- a/drivers/scsi/storvsc_drv.c |
2156 | +++ b/drivers/scsi/storvsc_drv.c |
2157 | @@ -664,13 +664,22 @@ static void handle_sc_creation(struct vmbus_channel *new_sc) |
2158 | static void handle_multichannel_storage(struct hv_device *device, int max_chns) |
2159 | { |
2160 | struct storvsc_device *stor_device; |
2161 | - int num_cpus = num_online_cpus(); |
2162 | int num_sc; |
2163 | struct storvsc_cmd_request *request; |
2164 | struct vstor_packet *vstor_packet; |
2165 | int ret, t; |
2166 | |
2167 | - num_sc = ((max_chns > num_cpus) ? num_cpus : max_chns); |
2168 | + /* |
2169 | + * If the number of CPUs is artificially restricted, such as |
2170 | + * with maxcpus=1 on the kernel boot line, Hyper-V could offer |
2171 | + * sub-channels >= the number of CPUs. These sub-channels |
2172 | + * should not be created. The primary channel is already created |
2173 | + * and assigned to one CPU, so check against # CPUs - 1. |
2174 | + */ |
2175 | + num_sc = min((int)(num_online_cpus() - 1), max_chns); |
2176 | + if (!num_sc) |
2177 | + return; |
2178 | + |
2179 | stor_device = get_out_stor_device(device); |
2180 | if (!stor_device) |
2181 | return; |
2182 | diff --git a/drivers/staging/iio/addac/adt7316.c b/drivers/staging/iio/addac/adt7316.c |
2183 | index 3f22d1088713..68866f552290 100644 |
2184 | --- a/drivers/staging/iio/addac/adt7316.c |
2185 | +++ b/drivers/staging/iio/addac/adt7316.c |
2186 | @@ -47,6 +47,8 @@ |
2187 | #define ADT7516_MSB_AIN3 0xA |
2188 | #define ADT7516_MSB_AIN4 0xB |
2189 | #define ADT7316_DA_DATA_BASE 0x10 |
2190 | +#define ADT7316_DA_10_BIT_LSB_SHIFT 6 |
2191 | +#define ADT7316_DA_12_BIT_LSB_SHIFT 4 |
2192 | #define ADT7316_DA_MSB_DATA_REGS 4 |
2193 | #define ADT7316_LSB_DAC_A 0x10 |
2194 | #define ADT7316_MSB_DAC_A 0x11 |
2195 | @@ -1086,7 +1088,7 @@ static ssize_t adt7316_store_DAC_internal_Vref(struct device *dev, |
2196 | ldac_config = chip->ldac_config & (~ADT7516_DAC_IN_VREF_MASK); |
2197 | if (data & 0x1) |
2198 | ldac_config |= ADT7516_DAC_AB_IN_VREF; |
2199 | - else if (data & 0x2) |
2200 | + if (data & 0x2) |
2201 | ldac_config |= ADT7516_DAC_CD_IN_VREF; |
2202 | } else { |
2203 | ret = kstrtou8(buf, 16, &data); |
2204 | @@ -1408,7 +1410,7 @@ static IIO_DEVICE_ATTR(ex_analog_temp_offset, 0644, |
2205 | static ssize_t adt7316_show_DAC(struct adt7316_chip_info *chip, |
2206 | int channel, char *buf) |
2207 | { |
2208 | - u16 data; |
2209 | + u16 data = 0; |
2210 | u8 msb, lsb, offset; |
2211 | int ret; |
2212 | |
2213 | @@ -1433,7 +1435,11 @@ static ssize_t adt7316_show_DAC(struct adt7316_chip_info *chip, |
2214 | if (ret) |
2215 | return -EIO; |
2216 | |
2217 | - data = (msb << offset) + (lsb & ((1 << offset) - 1)); |
2218 | + if (chip->dac_bits == 12) |
2219 | + data = lsb >> ADT7316_DA_12_BIT_LSB_SHIFT; |
2220 | + else if (chip->dac_bits == 10) |
2221 | + data = lsb >> ADT7316_DA_10_BIT_LSB_SHIFT; |
2222 | + data |= msb << offset; |
2223 | |
2224 | return sprintf(buf, "%d\n", data); |
2225 | } |
2226 | @@ -1441,7 +1447,7 @@ static ssize_t adt7316_show_DAC(struct adt7316_chip_info *chip, |
2227 | static ssize_t adt7316_store_DAC(struct adt7316_chip_info *chip, |
2228 | int channel, const char *buf, size_t len) |
2229 | { |
2230 | - u8 msb, lsb, offset; |
2231 | + u8 msb, lsb, lsb_reg, offset; |
2232 | u16 data; |
2233 | int ret; |
2234 | |
2235 | @@ -1459,9 +1465,13 @@ static ssize_t adt7316_store_DAC(struct adt7316_chip_info *chip, |
2236 | return -EINVAL; |
2237 | |
2238 | if (chip->dac_bits > 8) { |
2239 | - lsb = data & (1 << offset); |
2240 | + lsb = data & ((1 << offset) - 1); |
2241 | + if (chip->dac_bits == 12) |
2242 | + lsb_reg = lsb << ADT7316_DA_12_BIT_LSB_SHIFT; |
2243 | + else |
2244 | + lsb_reg = lsb << ADT7316_DA_10_BIT_LSB_SHIFT; |
2245 | ret = chip->bus.write(chip->bus.client, |
2246 | - ADT7316_DA_DATA_BASE + channel * 2, lsb); |
2247 | + ADT7316_DA_DATA_BASE + channel * 2, lsb_reg); |
2248 | if (ret) |
2249 | return -EIO; |
2250 | } |
2251 | diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c |
2252 | index ef47c226e1d2..3255b2bb0fd5 100644 |
2253 | --- a/drivers/usb/core/driver.c |
2254 | +++ b/drivers/usb/core/driver.c |
2255 | @@ -473,11 +473,6 @@ static int usb_unbind_interface(struct device *dev) |
2256 | pm_runtime_disable(dev); |
2257 | pm_runtime_set_suspended(dev); |
2258 | |
2259 | - /* Undo any residual pm_autopm_get_interface_* calls */ |
2260 | - for (r = atomic_read(&intf->pm_usage_cnt); r > 0; --r) |
2261 | - usb_autopm_put_interface_no_suspend(intf); |
2262 | - atomic_set(&intf->pm_usage_cnt, 0); |
2263 | - |
2264 | if (!error) |
2265 | usb_autosuspend_device(udev); |
2266 | |
2267 | @@ -1636,7 +1631,6 @@ void usb_autopm_put_interface(struct usb_interface *intf) |
2268 | int status; |
2269 | |
2270 | usb_mark_last_busy(udev); |
2271 | - atomic_dec(&intf->pm_usage_cnt); |
2272 | status = pm_runtime_put_sync(&intf->dev); |
2273 | dev_vdbg(&intf->dev, "%s: cnt %d -> %d\n", |
2274 | __func__, atomic_read(&intf->dev.power.usage_count), |
2275 | @@ -1665,7 +1659,6 @@ void usb_autopm_put_interface_async(struct usb_interface *intf) |
2276 | int status; |
2277 | |
2278 | usb_mark_last_busy(udev); |
2279 | - atomic_dec(&intf->pm_usage_cnt); |
2280 | status = pm_runtime_put(&intf->dev); |
2281 | dev_vdbg(&intf->dev, "%s: cnt %d -> %d\n", |
2282 | __func__, atomic_read(&intf->dev.power.usage_count), |
2283 | @@ -1687,7 +1680,6 @@ void usb_autopm_put_interface_no_suspend(struct usb_interface *intf) |
2284 | struct usb_device *udev = interface_to_usbdev(intf); |
2285 | |
2286 | usb_mark_last_busy(udev); |
2287 | - atomic_dec(&intf->pm_usage_cnt); |
2288 | pm_runtime_put_noidle(&intf->dev); |
2289 | } |
2290 | EXPORT_SYMBOL_GPL(usb_autopm_put_interface_no_suspend); |
2291 | @@ -1718,8 +1710,6 @@ int usb_autopm_get_interface(struct usb_interface *intf) |
2292 | status = pm_runtime_get_sync(&intf->dev); |
2293 | if (status < 0) |
2294 | pm_runtime_put_sync(&intf->dev); |
2295 | - else |
2296 | - atomic_inc(&intf->pm_usage_cnt); |
2297 | dev_vdbg(&intf->dev, "%s: cnt %d -> %d\n", |
2298 | __func__, atomic_read(&intf->dev.power.usage_count), |
2299 | status); |
2300 | @@ -1753,8 +1743,6 @@ int usb_autopm_get_interface_async(struct usb_interface *intf) |
2301 | status = pm_runtime_get(&intf->dev); |
2302 | if (status < 0 && status != -EINPROGRESS) |
2303 | pm_runtime_put_noidle(&intf->dev); |
2304 | - else |
2305 | - atomic_inc(&intf->pm_usage_cnt); |
2306 | dev_vdbg(&intf->dev, "%s: cnt %d -> %d\n", |
2307 | __func__, atomic_read(&intf->dev.power.usage_count), |
2308 | status); |
2309 | @@ -1778,7 +1766,6 @@ void usb_autopm_get_interface_no_resume(struct usb_interface *intf) |
2310 | struct usb_device *udev = interface_to_usbdev(intf); |
2311 | |
2312 | usb_mark_last_busy(udev); |
2313 | - atomic_inc(&intf->pm_usage_cnt); |
2314 | pm_runtime_get_noresume(&intf->dev); |
2315 | } |
2316 | EXPORT_SYMBOL_GPL(usb_autopm_get_interface_no_resume); |
2317 | diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c |
2318 | index 4f33eb632a88..4020ce8db6ce 100644 |
2319 | --- a/drivers/usb/core/message.c |
2320 | +++ b/drivers/usb/core/message.c |
2321 | @@ -820,9 +820,11 @@ int usb_string(struct usb_device *dev, int index, char *buf, size_t size) |
2322 | |
2323 | if (dev->state == USB_STATE_SUSPENDED) |
2324 | return -EHOSTUNREACH; |
2325 | - if (size <= 0 || !buf || !index) |
2326 | + if (size <= 0 || !buf) |
2327 | return -EINVAL; |
2328 | buf[0] = 0; |
2329 | + if (index <= 0 || index >= 256) |
2330 | + return -EINVAL; |
2331 | tbuf = kmalloc(256, GFP_NOIO); |
2332 | if (!tbuf) |
2333 | return -ENOMEM; |
2334 | diff --git a/drivers/usb/gadget/udc/dummy_hcd.c b/drivers/usb/gadget/udc/dummy_hcd.c |
2335 | index baf72f95f0f1..213b52508621 100644 |
2336 | --- a/drivers/usb/gadget/udc/dummy_hcd.c |
2337 | +++ b/drivers/usb/gadget/udc/dummy_hcd.c |
2338 | @@ -979,8 +979,18 @@ static int dummy_udc_start(struct usb_gadget *g, |
2339 | struct dummy_hcd *dum_hcd = gadget_to_dummy_hcd(g); |
2340 | struct dummy *dum = dum_hcd->dum; |
2341 | |
2342 | - if (driver->max_speed == USB_SPEED_UNKNOWN) |
2343 | + switch (g->speed) { |
2344 | + /* All the speeds we support */ |
2345 | + case USB_SPEED_LOW: |
2346 | + case USB_SPEED_FULL: |
2347 | + case USB_SPEED_HIGH: |
2348 | + case USB_SPEED_SUPER: |
2349 | + break; |
2350 | + default: |
2351 | + dev_err(dummy_dev(dum_hcd), "Unsupported driver max speed %d\n", |
2352 | + driver->max_speed); |
2353 | return -EINVAL; |
2354 | + } |
2355 | |
2356 | /* |
2357 | * SLAVE side init ... the layer above hardware, which |
2358 | @@ -1784,9 +1794,10 @@ static void dummy_timer(struct timer_list *t) |
2359 | /* Bus speed is 500000 bytes/ms, so use a little less */ |
2360 | total = 490000; |
2361 | break; |
2362 | - default: |
2363 | + default: /* Can't happen */ |
2364 | dev_err(dummy_dev(dum_hcd), "bogus device speed\n"); |
2365 | - return; |
2366 | + total = 0; |
2367 | + break; |
2368 | } |
2369 | |
2370 | /* FIXME if HZ != 1000 this will probably misbehave ... */ |
2371 | @@ -1828,7 +1839,7 @@ restart: |
2372 | |
2373 | /* Used up this frame's bandwidth? */ |
2374 | if (total <= 0) |
2375 | - break; |
2376 | + continue; |
2377 | |
2378 | /* find the gadget's ep for this request (if configured) */ |
2379 | address = usb_pipeendpoint (urb->pipe); |
2380 | diff --git a/drivers/usb/misc/yurex.c b/drivers/usb/misc/yurex.c |
2381 | index 6d9fd5f64903..7b306aa22d25 100644 |
2382 | --- a/drivers/usb/misc/yurex.c |
2383 | +++ b/drivers/usb/misc/yurex.c |
2384 | @@ -314,6 +314,7 @@ static void yurex_disconnect(struct usb_interface *interface) |
2385 | usb_deregister_dev(interface, &yurex_class); |
2386 | |
2387 | /* prevent more I/O from starting */ |
2388 | + usb_poison_urb(dev->urb); |
2389 | mutex_lock(&dev->io_mutex); |
2390 | dev->interface = NULL; |
2391 | mutex_unlock(&dev->io_mutex); |
2392 | diff --git a/drivers/usb/storage/realtek_cr.c b/drivers/usb/storage/realtek_cr.c |
2393 | index 31b024441938..cc794e25a0b6 100644 |
2394 | --- a/drivers/usb/storage/realtek_cr.c |
2395 | +++ b/drivers/usb/storage/realtek_cr.c |
2396 | @@ -763,18 +763,16 @@ static void rts51x_suspend_timer_fn(struct timer_list *t) |
2397 | break; |
2398 | case RTS51X_STAT_IDLE: |
2399 | case RTS51X_STAT_SS: |
2400 | - usb_stor_dbg(us, "RTS51X_STAT_SS, intf->pm_usage_cnt:%d, power.usage:%d\n", |
2401 | - atomic_read(&us->pusb_intf->pm_usage_cnt), |
2402 | + usb_stor_dbg(us, "RTS51X_STAT_SS, power.usage:%d\n", |
2403 | atomic_read(&us->pusb_intf->dev.power.usage_count)); |
2404 | |
2405 | - if (atomic_read(&us->pusb_intf->pm_usage_cnt) > 0) { |
2406 | + if (atomic_read(&us->pusb_intf->dev.power.usage_count) > 0) { |
2407 | usb_stor_dbg(us, "Ready to enter SS state\n"); |
2408 | rts51x_set_stat(chip, RTS51X_STAT_SS); |
2409 | /* ignore mass storage interface's children */ |
2410 | pm_suspend_ignore_children(&us->pusb_intf->dev, true); |
2411 | usb_autopm_put_interface_async(us->pusb_intf); |
2412 | - usb_stor_dbg(us, "RTS51X_STAT_SS 01, intf->pm_usage_cnt:%d, power.usage:%d\n", |
2413 | - atomic_read(&us->pusb_intf->pm_usage_cnt), |
2414 | + usb_stor_dbg(us, "RTS51X_STAT_SS 01, power.usage:%d\n", |
2415 | atomic_read(&us->pusb_intf->dev.power.usage_count)); |
2416 | } |
2417 | break; |
2418 | @@ -807,11 +805,10 @@ static void rts51x_invoke_transport(struct scsi_cmnd *srb, struct us_data *us) |
2419 | int ret; |
2420 | |
2421 | if (working_scsi(srb)) { |
2422 | - usb_stor_dbg(us, "working scsi, intf->pm_usage_cnt:%d, power.usage:%d\n", |
2423 | - atomic_read(&us->pusb_intf->pm_usage_cnt), |
2424 | + usb_stor_dbg(us, "working scsi, power.usage:%d\n", |
2425 | atomic_read(&us->pusb_intf->dev.power.usage_count)); |
2426 | |
2427 | - if (atomic_read(&us->pusb_intf->pm_usage_cnt) <= 0) { |
2428 | + if (atomic_read(&us->pusb_intf->dev.power.usage_count) <= 0) { |
2429 | ret = usb_autopm_get_interface(us->pusb_intf); |
2430 | usb_stor_dbg(us, "working scsi, ret=%d\n", ret); |
2431 | } |
2432 | diff --git a/drivers/usb/usbip/stub_rx.c b/drivers/usb/usbip/stub_rx.c |
2433 | index 97b09a42a10c..dbfb2f24d71e 100644 |
2434 | --- a/drivers/usb/usbip/stub_rx.c |
2435 | +++ b/drivers/usb/usbip/stub_rx.c |
2436 | @@ -361,16 +361,10 @@ static int get_pipe(struct stub_device *sdev, struct usbip_header *pdu) |
2437 | } |
2438 | |
2439 | if (usb_endpoint_xfer_isoc(epd)) { |
2440 | - /* validate packet size and number of packets */ |
2441 | - unsigned int maxp, packets, bytes; |
2442 | - |
2443 | - maxp = usb_endpoint_maxp(epd); |
2444 | - maxp *= usb_endpoint_maxp_mult(epd); |
2445 | - bytes = pdu->u.cmd_submit.transfer_buffer_length; |
2446 | - packets = DIV_ROUND_UP(bytes, maxp); |
2447 | - |
2448 | + /* validate number of packets */ |
2449 | if (pdu->u.cmd_submit.number_of_packets < 0 || |
2450 | - pdu->u.cmd_submit.number_of_packets > packets) { |
2451 | + pdu->u.cmd_submit.number_of_packets > |
2452 | + USBIP_MAX_ISO_PACKETS) { |
2453 | dev_err(&sdev->udev->dev, |
2454 | "CMD_SUBMIT: isoc invalid num packets %d\n", |
2455 | pdu->u.cmd_submit.number_of_packets); |
2456 | diff --git a/drivers/usb/usbip/usbip_common.h b/drivers/usb/usbip/usbip_common.h |
2457 | index bf8afe9b5883..8be857a4fa13 100644 |
2458 | --- a/drivers/usb/usbip/usbip_common.h |
2459 | +++ b/drivers/usb/usbip/usbip_common.h |
2460 | @@ -121,6 +121,13 @@ extern struct device_attribute dev_attr_usbip_debug; |
2461 | #define USBIP_DIR_OUT 0x00 |
2462 | #define USBIP_DIR_IN 0x01 |
2463 | |
2464 | +/* |
2465 | + * Arbitrary limit for the maximum number of isochronous packets in an URB, |
2466 | + * compare for example the uhci_submit_isochronous function in |
2467 | + * drivers/usb/host/uhci-q.c |
2468 | + */ |
2469 | +#define USBIP_MAX_ISO_PACKETS 1024 |
2470 | + |
2471 | /** |
2472 | * struct usbip_header_basic - data pertinent to every request |
2473 | * @command: the usbip request type |
2474 | diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c |
2475 | index cddb453a1ba5..6cf00d9f512b 100644 |
2476 | --- a/drivers/vfio/pci/vfio_pci.c |
2477 | +++ b/drivers/vfio/pci/vfio_pci.c |
2478 | @@ -1443,11 +1443,11 @@ static void __init vfio_pci_fill_ids(void) |
2479 | rc = pci_add_dynid(&vfio_pci_driver, vendor, device, |
2480 | subvendor, subdevice, class, class_mask, 0); |
2481 | if (rc) |
2482 | - pr_warn("failed to add dynamic id [%04hx:%04hx[%04hx:%04hx]] class %#08x/%08x (%d)\n", |
2483 | + pr_warn("failed to add dynamic id [%04x:%04x[%04x:%04x]] class %#08x/%08x (%d)\n", |
2484 | vendor, device, subvendor, subdevice, |
2485 | class, class_mask, rc); |
2486 | else |
2487 | - pr_info("add [%04hx:%04hx[%04hx:%04hx]] class %#08x/%08x\n", |
2488 | + pr_info("add [%04x:%04x[%04x:%04x]] class %#08x/%08x\n", |
2489 | vendor, device, subvendor, subdevice, |
2490 | class, class_mask); |
2491 | } |
2492 | diff --git a/drivers/w1/masters/ds2490.c b/drivers/w1/masters/ds2490.c |
2493 | index 0f4ecfcdb549..a9fb77585272 100644 |
2494 | --- a/drivers/w1/masters/ds2490.c |
2495 | +++ b/drivers/w1/masters/ds2490.c |
2496 | @@ -1016,15 +1016,15 @@ static int ds_probe(struct usb_interface *intf, |
2497 | /* alternative 3, 1ms interrupt (greatly speeds search), 64 byte bulk */ |
2498 | alt = 3; |
2499 | err = usb_set_interface(dev->udev, |
2500 | - intf->altsetting[alt].desc.bInterfaceNumber, alt); |
2501 | + intf->cur_altsetting->desc.bInterfaceNumber, alt); |
2502 | if (err) { |
2503 | dev_err(&dev->udev->dev, "Failed to set alternative setting %d " |
2504 | "for %d interface: err=%d.\n", alt, |
2505 | - intf->altsetting[alt].desc.bInterfaceNumber, err); |
2506 | + intf->cur_altsetting->desc.bInterfaceNumber, err); |
2507 | goto err_out_clear; |
2508 | } |
2509 | |
2510 | - iface_desc = &intf->altsetting[alt]; |
2511 | + iface_desc = intf->cur_altsetting; |
2512 | if (iface_desc->desc.bNumEndpoints != NUM_EP-1) { |
2513 | pr_info("Num endpoints=%d. It is not DS9490R.\n", |
2514 | iface_desc->desc.bNumEndpoints); |
2515 | diff --git a/drivers/xen/xenbus/xenbus_dev_frontend.c b/drivers/xen/xenbus/xenbus_dev_frontend.c |
2516 | index c3e201025ef0..0782ff3c2273 100644 |
2517 | --- a/drivers/xen/xenbus/xenbus_dev_frontend.c |
2518 | +++ b/drivers/xen/xenbus/xenbus_dev_frontend.c |
2519 | @@ -622,9 +622,7 @@ static int xenbus_file_open(struct inode *inode, struct file *filp) |
2520 | if (xen_store_evtchn == 0) |
2521 | return -ENOENT; |
2522 | |
2523 | - nonseekable_open(inode, filp); |
2524 | - |
2525 | - filp->f_mode &= ~FMODE_ATOMIC_POS; /* cdev-style semantics */ |
2526 | + stream_open(inode, filp); |
2527 | |
2528 | u = kzalloc(sizeof(*u), GFP_KERNEL); |
2529 | if (u == NULL) |
2530 | diff --git a/fs/debugfs/inode.c b/fs/debugfs/inode.c |
2531 | index 41ef452c1fcf..e5126fad57c5 100644 |
2532 | --- a/fs/debugfs/inode.c |
2533 | +++ b/fs/debugfs/inode.c |
2534 | @@ -163,19 +163,24 @@ static int debugfs_show_options(struct seq_file *m, struct dentry *root) |
2535 | return 0; |
2536 | } |
2537 | |
2538 | -static void debugfs_evict_inode(struct inode *inode) |
2539 | +static void debugfs_i_callback(struct rcu_head *head) |
2540 | { |
2541 | - truncate_inode_pages_final(&inode->i_data); |
2542 | - clear_inode(inode); |
2543 | + struct inode *inode = container_of(head, struct inode, i_rcu); |
2544 | if (S_ISLNK(inode->i_mode)) |
2545 | kfree(inode->i_link); |
2546 | + free_inode_nonrcu(inode); |
2547 | +} |
2548 | + |
2549 | +static void debugfs_destroy_inode(struct inode *inode) |
2550 | +{ |
2551 | + call_rcu(&inode->i_rcu, debugfs_i_callback); |
2552 | } |
2553 | |
2554 | static const struct super_operations debugfs_super_operations = { |
2555 | .statfs = simple_statfs, |
2556 | .remount_fs = debugfs_remount, |
2557 | .show_options = debugfs_show_options, |
2558 | - .evict_inode = debugfs_evict_inode, |
2559 | + .destroy_inode = debugfs_destroy_inode, |
2560 | }; |
2561 | |
2562 | static void debugfs_release_dentry(struct dentry *dentry) |
2563 | diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c |
2564 | index a7fa037b876b..a3a3d256fb0e 100644 |
2565 | --- a/fs/hugetlbfs/inode.c |
2566 | +++ b/fs/hugetlbfs/inode.c |
2567 | @@ -741,11 +741,17 @@ static struct inode *hugetlbfs_get_inode(struct super_block *sb, |
2568 | umode_t mode, dev_t dev) |
2569 | { |
2570 | struct inode *inode; |
2571 | - struct resv_map *resv_map; |
2572 | + struct resv_map *resv_map = NULL; |
2573 | |
2574 | - resv_map = resv_map_alloc(); |
2575 | - if (!resv_map) |
2576 | - return NULL; |
2577 | + /* |
2578 | + * Reserve maps are only needed for inodes that can have associated |
2579 | + * page allocations. |
2580 | + */ |
2581 | + if (S_ISREG(mode) || S_ISLNK(mode)) { |
2582 | + resv_map = resv_map_alloc(); |
2583 | + if (!resv_map) |
2584 | + return NULL; |
2585 | + } |
2586 | |
2587 | inode = new_inode(sb); |
2588 | if (inode) { |
2589 | @@ -780,8 +786,10 @@ static struct inode *hugetlbfs_get_inode(struct super_block *sb, |
2590 | break; |
2591 | } |
2592 | lockdep_annotate_inode_mutex_key(inode); |
2593 | - } else |
2594 | - kref_put(&resv_map->refs, resv_map_release); |
2595 | + } else { |
2596 | + if (resv_map) |
2597 | + kref_put(&resv_map->refs, resv_map_release); |
2598 | + } |
2599 | |
2600 | return inode; |
2601 | } |
2602 | diff --git a/fs/jffs2/readinode.c b/fs/jffs2/readinode.c |
2603 | index 389ea53ea487..bccfc40b3a74 100644 |
2604 | --- a/fs/jffs2/readinode.c |
2605 | +++ b/fs/jffs2/readinode.c |
2606 | @@ -1414,11 +1414,6 @@ void jffs2_do_clear_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f) |
2607 | |
2608 | jffs2_kill_fragtree(&f->fragtree, deleted?c:NULL); |
2609 | |
2610 | - if (f->target) { |
2611 | - kfree(f->target); |
2612 | - f->target = NULL; |
2613 | - } |
2614 | - |
2615 | fds = f->dents; |
2616 | while(fds) { |
2617 | fd = fds; |
2618 | diff --git a/fs/jffs2/super.c b/fs/jffs2/super.c |
2619 | index bb6ae387469f..05d892c79339 100644 |
2620 | --- a/fs/jffs2/super.c |
2621 | +++ b/fs/jffs2/super.c |
2622 | @@ -47,7 +47,10 @@ static struct inode *jffs2_alloc_inode(struct super_block *sb) |
2623 | static void jffs2_i_callback(struct rcu_head *head) |
2624 | { |
2625 | struct inode *inode = container_of(head, struct inode, i_rcu); |
2626 | - kmem_cache_free(jffs2_inode_cachep, JFFS2_INODE_INFO(inode)); |
2627 | + struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode); |
2628 | + |
2629 | + kfree(f->target); |
2630 | + kmem_cache_free(jffs2_inode_cachep, f); |
2631 | } |
2632 | |
2633 | static void jffs2_destroy_inode(struct inode *inode) |
2634 | diff --git a/fs/open.c b/fs/open.c |
2635 | index f1c2f855fd43..a00350018a47 100644 |
2636 | --- a/fs/open.c |
2637 | +++ b/fs/open.c |
2638 | @@ -1215,3 +1215,21 @@ int nonseekable_open(struct inode *inode, struct file *filp) |
2639 | } |
2640 | |
2641 | EXPORT_SYMBOL(nonseekable_open); |
2642 | + |
2643 | +/* |
2644 | + * stream_open is used by subsystems that want stream-like file descriptors. |
2645 | + * Such file descriptors are not seekable and don't have notion of position |
2646 | + * (file.f_pos is always 0). Contrary to file descriptors of other regular |
2647 | + * files, .read() and .write() can run simultaneously. |
2648 | + * |
2649 | + * stream_open never fails and is marked to return int so that it could be |
2650 | + * directly used as file_operations.open . |
2651 | + */ |
2652 | +int stream_open(struct inode *inode, struct file *filp) |
2653 | +{ |
2654 | + filp->f_mode &= ~(FMODE_LSEEK | FMODE_PREAD | FMODE_PWRITE | FMODE_ATOMIC_POS); |
2655 | + filp->f_mode |= FMODE_STREAM; |
2656 | + return 0; |
2657 | +} |
2658 | + |
2659 | +EXPORT_SYMBOL(stream_open); |
2660 | diff --git a/fs/read_write.c b/fs/read_write.c |
2661 | index 562974a0616c..85fd7a8ee29e 100644 |
2662 | --- a/fs/read_write.c |
2663 | +++ b/fs/read_write.c |
2664 | @@ -560,12 +560,13 @@ ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_ |
2665 | |
2666 | static inline loff_t file_pos_read(struct file *file) |
2667 | { |
2668 | - return file->f_pos; |
2669 | + return file->f_mode & FMODE_STREAM ? 0 : file->f_pos; |
2670 | } |
2671 | |
2672 | static inline void file_pos_write(struct file *file, loff_t pos) |
2673 | { |
2674 | - file->f_pos = pos; |
2675 | + if ((file->f_mode & FMODE_STREAM) == 0) |
2676 | + file->f_pos = pos; |
2677 | } |
2678 | |
2679 | ssize_t ksys_read(unsigned int fd, char __user *buf, size_t count) |
2680 | diff --git a/include/linux/fs.h b/include/linux/fs.h |
2681 | index 111c94c4baa1..d4e1b43a53c3 100644 |
2682 | --- a/include/linux/fs.h |
2683 | +++ b/include/linux/fs.h |
2684 | @@ -153,6 +153,9 @@ typedef int (dio_iodone_t)(struct kiocb *iocb, loff_t offset, |
2685 | #define FMODE_OPENED ((__force fmode_t)0x80000) |
2686 | #define FMODE_CREATED ((__force fmode_t)0x100000) |
2687 | |
2688 | +/* File is stream-like */ |
2689 | +#define FMODE_STREAM ((__force fmode_t)0x200000) |
2690 | + |
2691 | /* File was opened by fanotify and shouldn't generate fanotify events */ |
2692 | #define FMODE_NONOTIFY ((__force fmode_t)0x4000000) |
2693 | |
2694 | @@ -3019,6 +3022,7 @@ extern loff_t no_seek_end_llseek_size(struct file *, loff_t, int, loff_t); |
2695 | extern loff_t no_seek_end_llseek(struct file *, loff_t, int); |
2696 | extern int generic_file_open(struct inode * inode, struct file * filp); |
2697 | extern int nonseekable_open(struct inode * inode, struct file * filp); |
2698 | +extern int stream_open(struct inode * inode, struct file * filp); |
2699 | |
2700 | #ifdef CONFIG_BLOCK |
2701 | typedef void (dio_submit_t)(struct bio *bio, struct inode *inode, |
2702 | diff --git a/include/linux/i2c.h b/include/linux/i2c.h |
2703 | index 65b4eaed1d96..7e748648c7d3 100644 |
2704 | --- a/include/linux/i2c.h |
2705 | +++ b/include/linux/i2c.h |
2706 | @@ -333,6 +333,7 @@ struct i2c_client { |
2707 | char name[I2C_NAME_SIZE]; |
2708 | struct i2c_adapter *adapter; /* the adapter we sit on */ |
2709 | struct device dev; /* the device structure */ |
2710 | + int init_irq; /* irq set at initialization */ |
2711 | int irq; /* irq issued by device */ |
2712 | struct list_head detected; |
2713 | #if IS_ENABLED(CONFIG_I2C_SLAVE) |
2714 | diff --git a/include/linux/platform_data/x86/clk-pmc-atom.h b/include/linux/platform_data/x86/clk-pmc-atom.h |
2715 | index 3ab892208343..7a37ac27d0fb 100644 |
2716 | --- a/include/linux/platform_data/x86/clk-pmc-atom.h |
2717 | +++ b/include/linux/platform_data/x86/clk-pmc-atom.h |
2718 | @@ -35,10 +35,13 @@ struct pmc_clk { |
2719 | * |
2720 | * @base: PMC clock register base offset |
2721 | * @clks: pointer to set of registered clocks, typically 0..5 |
2722 | + * @critical: flag to indicate if firmware enabled pmc_plt_clks |
2723 | + * should be marked as critial or not |
2724 | */ |
2725 | struct pmc_clk_data { |
2726 | void __iomem *base; |
2727 | const struct pmc_clk *clks; |
2728 | + bool critical; |
2729 | }; |
2730 | |
2731 | #endif /* __PLATFORM_DATA_X86_CLK_PMC_ATOM_H */ |
2732 | diff --git a/include/linux/usb.h b/include/linux/usb.h |
2733 | index 5e49e82c4368..ff010d1fd1c7 100644 |
2734 | --- a/include/linux/usb.h |
2735 | +++ b/include/linux/usb.h |
2736 | @@ -200,7 +200,6 @@ usb_find_last_int_out_endpoint(struct usb_host_interface *alt, |
2737 | * @dev: driver model's view of this device |
2738 | * @usb_dev: if an interface is bound to the USB major, this will point |
2739 | * to the sysfs representation for that device. |
2740 | - * @pm_usage_cnt: PM usage counter for this interface |
2741 | * @reset_ws: Used for scheduling resets from atomic context. |
2742 | * @resetting_device: USB core reset the device, so use alt setting 0 as |
2743 | * current; needs bandwidth alloc after reset. |
2744 | @@ -257,7 +256,6 @@ struct usb_interface { |
2745 | |
2746 | struct device dev; /* interface specific device info */ |
2747 | struct device *usb_dev; |
2748 | - atomic_t pm_usage_cnt; /* usage counter for autosuspend */ |
2749 | struct work_struct reset_ws; /* for resets in atomic context */ |
2750 | }; |
2751 | #define to_usb_interface(d) container_of(d, struct usb_interface, dev) |
2752 | diff --git a/mm/kmemleak.c b/mm/kmemleak.c |
2753 | index 17dd883198ae..72e3fb3bb037 100644 |
2754 | --- a/mm/kmemleak.c |
2755 | +++ b/mm/kmemleak.c |
2756 | @@ -1373,6 +1373,7 @@ static void scan_block(void *_start, void *_end, |
2757 | /* |
2758 | * Scan a large memory block in MAX_SCAN_SIZE chunks to reduce the latency. |
2759 | */ |
2760 | +#ifdef CONFIG_SMP |
2761 | static void scan_large_block(void *start, void *end) |
2762 | { |
2763 | void *next; |
2764 | @@ -1384,6 +1385,7 @@ static void scan_large_block(void *start, void *end) |
2765 | cond_resched(); |
2766 | } |
2767 | } |
2768 | +#endif |
2769 | |
2770 | /* |
2771 | * Scan a memory block corresponding to a kmemleak_object. A condition is |
2772 | @@ -1501,11 +1503,6 @@ static void kmemleak_scan(void) |
2773 | } |
2774 | rcu_read_unlock(); |
2775 | |
2776 | - /* data/bss scanning */ |
2777 | - scan_large_block(_sdata, _edata); |
2778 | - scan_large_block(__bss_start, __bss_stop); |
2779 | - scan_large_block(__start_ro_after_init, __end_ro_after_init); |
2780 | - |
2781 | #ifdef CONFIG_SMP |
2782 | /* per-cpu sections scanning */ |
2783 | for_each_possible_cpu(i) |
2784 | @@ -2036,6 +2033,17 @@ void __init kmemleak_init(void) |
2785 | } |
2786 | local_irq_restore(flags); |
2787 | |
2788 | + /* register the data/bss sections */ |
2789 | + create_object((unsigned long)_sdata, _edata - _sdata, |
2790 | + KMEMLEAK_GREY, GFP_ATOMIC); |
2791 | + create_object((unsigned long)__bss_start, __bss_stop - __bss_start, |
2792 | + KMEMLEAK_GREY, GFP_ATOMIC); |
2793 | + /* only register .data..ro_after_init if not within .data */ |
2794 | + if (__start_ro_after_init < _sdata || __end_ro_after_init > _edata) |
2795 | + create_object((unsigned long)__start_ro_after_init, |
2796 | + __end_ro_after_init - __start_ro_after_init, |
2797 | + KMEMLEAK_GREY, GFP_ATOMIC); |
2798 | + |
2799 | /* |
2800 | * This is the point where tracking allocations is safe. Automatic |
2801 | * scanning is started during the late initcall. Add the early logged |
2802 | diff --git a/net/batman-adv/bat_v_elp.c b/net/batman-adv/bat_v_elp.c |
2803 | index ef0dec20c7d8..5da183b2f4c9 100644 |
2804 | --- a/net/batman-adv/bat_v_elp.c |
2805 | +++ b/net/batman-adv/bat_v_elp.c |
2806 | @@ -104,8 +104,10 @@ static u32 batadv_v_elp_get_throughput(struct batadv_hardif_neigh_node *neigh) |
2807 | |
2808 | ret = cfg80211_get_station(real_netdev, neigh->addr, &sinfo); |
2809 | |
2810 | - /* free the TID stats immediately */ |
2811 | - cfg80211_sinfo_release_content(&sinfo); |
2812 | + if (!ret) { |
2813 | + /* free the TID stats immediately */ |
2814 | + cfg80211_sinfo_release_content(&sinfo); |
2815 | + } |
2816 | |
2817 | dev_put(real_netdev); |
2818 | if (ret == -ENOENT) { |
2819 | diff --git a/net/batman-adv/bridge_loop_avoidance.c b/net/batman-adv/bridge_loop_avoidance.c |
2820 | index 5f1aeeded0e3..85faf25c2912 100644 |
2821 | --- a/net/batman-adv/bridge_loop_avoidance.c |
2822 | +++ b/net/batman-adv/bridge_loop_avoidance.c |
2823 | @@ -803,6 +803,8 @@ static void batadv_bla_del_claim(struct batadv_priv *bat_priv, |
2824 | const u8 *mac, const unsigned short vid) |
2825 | { |
2826 | struct batadv_bla_claim search_claim, *claim; |
2827 | + struct batadv_bla_claim *claim_removed_entry; |
2828 | + struct hlist_node *claim_removed_node; |
2829 | |
2830 | ether_addr_copy(search_claim.addr, mac); |
2831 | search_claim.vid = vid; |
2832 | @@ -813,10 +815,18 @@ static void batadv_bla_del_claim(struct batadv_priv *bat_priv, |
2833 | batadv_dbg(BATADV_DBG_BLA, bat_priv, "%s(): %pM, vid %d\n", __func__, |
2834 | mac, batadv_print_vid(vid)); |
2835 | |
2836 | - batadv_hash_remove(bat_priv->bla.claim_hash, batadv_compare_claim, |
2837 | - batadv_choose_claim, claim); |
2838 | - batadv_claim_put(claim); /* reference from the hash is gone */ |
2839 | + claim_removed_node = batadv_hash_remove(bat_priv->bla.claim_hash, |
2840 | + batadv_compare_claim, |
2841 | + batadv_choose_claim, claim); |
2842 | + if (!claim_removed_node) |
2843 | + goto free_claim; |
2844 | |
2845 | + /* reference from the hash is gone */ |
2846 | + claim_removed_entry = hlist_entry(claim_removed_node, |
2847 | + struct batadv_bla_claim, hash_entry); |
2848 | + batadv_claim_put(claim_removed_entry); |
2849 | + |
2850 | +free_claim: |
2851 | /* don't need the reference from hash_find() anymore */ |
2852 | batadv_claim_put(claim); |
2853 | } |
2854 | diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c |
2855 | index d21624c44665..359ec1a6e822 100644 |
2856 | --- a/net/batman-adv/translation-table.c |
2857 | +++ b/net/batman-adv/translation-table.c |
2858 | @@ -616,14 +616,26 @@ static void batadv_tt_global_free(struct batadv_priv *bat_priv, |
2859 | struct batadv_tt_global_entry *tt_global, |
2860 | const char *message) |
2861 | { |
2862 | + struct batadv_tt_global_entry *tt_removed_entry; |
2863 | + struct hlist_node *tt_removed_node; |
2864 | + |
2865 | batadv_dbg(BATADV_DBG_TT, bat_priv, |
2866 | "Deleting global tt entry %pM (vid: %d): %s\n", |
2867 | tt_global->common.addr, |
2868 | batadv_print_vid(tt_global->common.vid), message); |
2869 | |
2870 | - batadv_hash_remove(bat_priv->tt.global_hash, batadv_compare_tt, |
2871 | - batadv_choose_tt, &tt_global->common); |
2872 | - batadv_tt_global_entry_put(tt_global); |
2873 | + tt_removed_node = batadv_hash_remove(bat_priv->tt.global_hash, |
2874 | + batadv_compare_tt, |
2875 | + batadv_choose_tt, |
2876 | + &tt_global->common); |
2877 | + if (!tt_removed_node) |
2878 | + return; |
2879 | + |
2880 | + /* drop reference of remove hash entry */ |
2881 | + tt_removed_entry = hlist_entry(tt_removed_node, |
2882 | + struct batadv_tt_global_entry, |
2883 | + common.hash_entry); |
2884 | + batadv_tt_global_entry_put(tt_removed_entry); |
2885 | } |
2886 | |
2887 | /** |
2888 | @@ -1332,9 +1344,10 @@ u16 batadv_tt_local_remove(struct batadv_priv *bat_priv, const u8 *addr, |
2889 | unsigned short vid, const char *message, |
2890 | bool roaming) |
2891 | { |
2892 | + struct batadv_tt_local_entry *tt_removed_entry; |
2893 | struct batadv_tt_local_entry *tt_local_entry; |
2894 | u16 flags, curr_flags = BATADV_NO_FLAGS; |
2895 | - void *tt_entry_exists; |
2896 | + struct hlist_node *tt_removed_node; |
2897 | |
2898 | tt_local_entry = batadv_tt_local_hash_find(bat_priv, addr, vid); |
2899 | if (!tt_local_entry) |
2900 | @@ -1363,15 +1376,18 @@ u16 batadv_tt_local_remove(struct batadv_priv *bat_priv, const u8 *addr, |
2901 | */ |
2902 | batadv_tt_local_event(bat_priv, tt_local_entry, BATADV_TT_CLIENT_DEL); |
2903 | |
2904 | - tt_entry_exists = batadv_hash_remove(bat_priv->tt.local_hash, |
2905 | + tt_removed_node = batadv_hash_remove(bat_priv->tt.local_hash, |
2906 | batadv_compare_tt, |
2907 | batadv_choose_tt, |
2908 | &tt_local_entry->common); |
2909 | - if (!tt_entry_exists) |
2910 | + if (!tt_removed_node) |
2911 | goto out; |
2912 | |
2913 | - /* extra call to free the local tt entry */ |
2914 | - batadv_tt_local_entry_put(tt_local_entry); |
2915 | + /* drop reference of remove hash entry */ |
2916 | + tt_removed_entry = hlist_entry(tt_removed_node, |
2917 | + struct batadv_tt_local_entry, |
2918 | + common.hash_entry); |
2919 | + batadv_tt_local_entry_put(tt_removed_entry); |
2920 | |
2921 | out: |
2922 | if (tt_local_entry) |
2923 | diff --git a/net/mac80211/debugfs_netdev.c b/net/mac80211/debugfs_netdev.c |
2924 | index c813207bb123..d37d4acafebf 100644 |
2925 | --- a/net/mac80211/debugfs_netdev.c |
2926 | +++ b/net/mac80211/debugfs_netdev.c |
2927 | @@ -838,7 +838,7 @@ void ieee80211_debugfs_rename_netdev(struct ieee80211_sub_if_data *sdata) |
2928 | |
2929 | dir = sdata->vif.debugfs_dir; |
2930 | |
2931 | - if (!dir) |
2932 | + if (IS_ERR_OR_NULL(dir)) |
2933 | return; |
2934 | |
2935 | sprintf(buf, "netdev:%s", sdata->name); |
2936 | diff --git a/net/mac80211/key.c b/net/mac80211/key.c |
2937 | index c054ac85793c..f20bb39f492d 100644 |
2938 | --- a/net/mac80211/key.c |
2939 | +++ b/net/mac80211/key.c |
2940 | @@ -167,8 +167,10 @@ static int ieee80211_key_enable_hw_accel(struct ieee80211_key *key) |
2941 | * The driver doesn't know anything about VLAN interfaces. |
2942 | * Hence, don't send GTKs for VLAN interfaces to the driver. |
2943 | */ |
2944 | - if (!(key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE)) |
2945 | + if (!(key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE)) { |
2946 | + ret = 1; |
2947 | goto out_unsupported; |
2948 | + } |
2949 | } |
2950 | |
2951 | ret = drv_set_key(key->local, SET_KEY, sdata, |
2952 | @@ -213,11 +215,8 @@ static int ieee80211_key_enable_hw_accel(struct ieee80211_key *key) |
2953 | /* all of these we can do in software - if driver can */ |
2954 | if (ret == 1) |
2955 | return 0; |
2956 | - if (ieee80211_hw_check(&key->local->hw, SW_CRYPTO_CONTROL)) { |
2957 | - if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) |
2958 | - return 0; |
2959 | + if (ieee80211_hw_check(&key->local->hw, SW_CRYPTO_CONTROL)) |
2960 | return -EINVAL; |
2961 | - } |
2962 | return 0; |
2963 | default: |
2964 | return -EINVAL; |
2965 | diff --git a/scripts/coccinelle/api/stream_open.cocci b/scripts/coccinelle/api/stream_open.cocci |
2966 | new file mode 100644 |
2967 | index 000000000000..350145da7669 |
2968 | --- /dev/null |
2969 | +++ b/scripts/coccinelle/api/stream_open.cocci |
2970 | @@ -0,0 +1,363 @@ |
2971 | +// SPDX-License-Identifier: GPL-2.0 |
2972 | +// Author: Kirill Smelkov (kirr@nexedi.com) |
2973 | +// |
2974 | +// Search for stream-like files that are using nonseekable_open and convert |
2975 | +// them to stream_open. A stream-like file is a file that does not use ppos in |
2976 | +// its read and write. Rationale for the conversion is to avoid deadlock in |
2977 | +// between read and write. |
2978 | + |
2979 | +virtual report |
2980 | +virtual patch |
2981 | +virtual explain // explain decisions in the patch (SPFLAGS="-D explain") |
2982 | + |
2983 | +// stream-like reader & writer - ones that do not depend on f_pos. |
2984 | +@ stream_reader @ |
2985 | +identifier readstream, ppos; |
2986 | +identifier f, buf, len; |
2987 | +type loff_t; |
2988 | +@@ |
2989 | + ssize_t readstream(struct file *f, char *buf, size_t len, loff_t *ppos) |
2990 | + { |
2991 | + ... when != ppos |
2992 | + } |
2993 | + |
2994 | +@ stream_writer @ |
2995 | +identifier writestream, ppos; |
2996 | +identifier f, buf, len; |
2997 | +type loff_t; |
2998 | +@@ |
2999 | + ssize_t writestream(struct file *f, const char *buf, size_t len, loff_t *ppos) |
3000 | + { |
3001 | + ... when != ppos |
3002 | + } |
3003 | + |
3004 | + |
3005 | +// a function that blocks |
3006 | +@ blocks @ |
3007 | +identifier block_f; |
3008 | +identifier wait_event =~ "^wait_event_.*"; |
3009 | +@@ |
3010 | + block_f(...) { |
3011 | + ... when exists |
3012 | + wait_event(...) |
3013 | + ... when exists |
3014 | + } |
3015 | + |
3016 | +// stream_reader that can block inside. |
3017 | +// |
3018 | +// XXX wait_* can be called not directly from current function (e.g. func -> f -> g -> wait()) |
3019 | +// XXX currently reader_blocks supports only direct and 1-level indirect cases. |
3020 | +@ reader_blocks_direct @ |
3021 | +identifier stream_reader.readstream; |
3022 | +identifier wait_event =~ "^wait_event_.*"; |
3023 | +@@ |
3024 | + readstream(...) |
3025 | + { |
3026 | + ... when exists |
3027 | + wait_event(...) |
3028 | + ... when exists |
3029 | + } |
3030 | + |
3031 | +@ reader_blocks_1 @ |
3032 | +identifier stream_reader.readstream; |
3033 | +identifier blocks.block_f; |
3034 | +@@ |
3035 | + readstream(...) |
3036 | + { |
3037 | + ... when exists |
3038 | + block_f(...) |
3039 | + ... when exists |
3040 | + } |
3041 | + |
3042 | +@ reader_blocks depends on reader_blocks_direct || reader_blocks_1 @ |
3043 | +identifier stream_reader.readstream; |
3044 | +@@ |
3045 | + readstream(...) { |
3046 | + ... |
3047 | + } |
3048 | + |
3049 | + |
3050 | +// file_operations + whether they have _any_ .read, .write, .llseek ... at all. |
3051 | +// |
3052 | +// XXX add support for file_operations xxx[N] = ... (sound/core/pcm_native.c) |
3053 | +@ fops0 @ |
3054 | +identifier fops; |
3055 | +@@ |
3056 | + struct file_operations fops = { |
3057 | + ... |
3058 | + }; |
3059 | + |
3060 | +@ has_read @ |
3061 | +identifier fops0.fops; |
3062 | +identifier read_f; |
3063 | +@@ |
3064 | + struct file_operations fops = { |
3065 | + .read = read_f, |
3066 | + }; |
3067 | + |
3068 | +@ has_read_iter @ |
3069 | +identifier fops0.fops; |
3070 | +identifier read_iter_f; |
3071 | +@@ |
3072 | + struct file_operations fops = { |
3073 | + .read_iter = read_iter_f, |
3074 | + }; |
3075 | + |
3076 | +@ has_write @ |
3077 | +identifier fops0.fops; |
3078 | +identifier write_f; |
3079 | +@@ |
3080 | + struct file_operations fops = { |
3081 | + .write = write_f, |
3082 | + }; |
3083 | + |
3084 | +@ has_write_iter @ |
3085 | +identifier fops0.fops; |
3086 | +identifier write_iter_f; |
3087 | +@@ |
3088 | + struct file_operations fops = { |
3089 | + .write_iter = write_iter_f, |
3090 | + }; |
3091 | + |
3092 | +@ has_llseek @ |
3093 | +identifier fops0.fops; |
3094 | +identifier llseek_f; |
3095 | +@@ |
3096 | + struct file_operations fops = { |
3097 | + .llseek = llseek_f, |
3098 | + }; |
3099 | + |
3100 | +@ has_no_llseek @ |
3101 | +identifier fops0.fops; |
3102 | +@@ |
3103 | + struct file_operations fops = { |
3104 | + .llseek = no_llseek, |
3105 | + }; |
3106 | + |
3107 | +@ has_mmap @ |
3108 | +identifier fops0.fops; |
3109 | +identifier mmap_f; |
3110 | +@@ |
3111 | + struct file_operations fops = { |
3112 | + .mmap = mmap_f, |
3113 | + }; |
3114 | + |
3115 | +@ has_copy_file_range @ |
3116 | +identifier fops0.fops; |
3117 | +identifier copy_file_range_f; |
3118 | +@@ |
3119 | + struct file_operations fops = { |
3120 | + .copy_file_range = copy_file_range_f, |
3121 | + }; |
3122 | + |
3123 | +@ has_remap_file_range @ |
3124 | +identifier fops0.fops; |
3125 | +identifier remap_file_range_f; |
3126 | +@@ |
3127 | + struct file_operations fops = { |
3128 | + .remap_file_range = remap_file_range_f, |
3129 | + }; |
3130 | + |
3131 | +@ has_splice_read @ |
3132 | +identifier fops0.fops; |
3133 | +identifier splice_read_f; |
3134 | +@@ |
3135 | + struct file_operations fops = { |
3136 | + .splice_read = splice_read_f, |
3137 | + }; |
3138 | + |
3139 | +@ has_splice_write @ |
3140 | +identifier fops0.fops; |
3141 | +identifier splice_write_f; |
3142 | +@@ |
3143 | + struct file_operations fops = { |
3144 | + .splice_write = splice_write_f, |
3145 | + }; |
3146 | + |
3147 | + |
3148 | +// file_operations that is candidate for stream_open conversion - it does not |
3149 | +// use mmap and other methods that assume @offset access to file. |
3150 | +// |
3151 | +// XXX for simplicity require no .{read/write}_iter and no .splice_{read/write} for now. |
3152 | +// XXX maybe_steam.fops cannot be used in other rules - it gives "bad rule maybe_stream or bad variable fops". |
3153 | +@ maybe_stream depends on (!has_llseek || has_no_llseek) && !has_mmap && !has_copy_file_range && !has_remap_file_range && !has_read_iter && !has_write_iter && !has_splice_read && !has_splice_write @ |
3154 | +identifier fops0.fops; |
3155 | +@@ |
3156 | + struct file_operations fops = { |
3157 | + }; |
3158 | + |
3159 | + |
3160 | +// ---- conversions ---- |
3161 | + |
3162 | +// XXX .open = nonseekable_open -> .open = stream_open |
3163 | +// XXX .open = func -> openfunc -> nonseekable_open |
3164 | + |
3165 | +// read & write |
3166 | +// |
3167 | +// if both are used in the same file_operations together with an opener - |
3168 | +// under that conditions we can use stream_open instead of nonseekable_open. |
3169 | +@ fops_rw depends on maybe_stream @ |
3170 | +identifier fops0.fops, openfunc; |
3171 | +identifier stream_reader.readstream; |
3172 | +identifier stream_writer.writestream; |
3173 | +@@ |
3174 | + struct file_operations fops = { |
3175 | + .open = openfunc, |
3176 | + .read = readstream, |
3177 | + .write = writestream, |
3178 | + }; |
3179 | + |
3180 | +@ report_rw depends on report @ |
3181 | +identifier fops_rw.openfunc; |
3182 | +position p1; |
3183 | +@@ |
3184 | + openfunc(...) { |
3185 | + <... |
3186 | + nonseekable_open@p1 |
3187 | + ...> |
3188 | + } |
3189 | + |
3190 | +@ script:python depends on report && reader_blocks @ |
3191 | +fops << fops0.fops; |
3192 | +p << report_rw.p1; |
3193 | +@@ |
3194 | +coccilib.report.print_report(p[0], |
3195 | + "ERROR: %s: .read() can deadlock .write(); change nonseekable_open -> stream_open to fix." % (fops,)) |
3196 | + |
3197 | +@ script:python depends on report && !reader_blocks @ |
3198 | +fops << fops0.fops; |
3199 | +p << report_rw.p1; |
3200 | +@@ |
3201 | +coccilib.report.print_report(p[0], |
3202 | + "WARNING: %s: .read() and .write() have stream semantic; safe to change nonseekable_open -> stream_open." % (fops,)) |
3203 | + |
3204 | + |
3205 | +@ explain_rw_deadlocked depends on explain && reader_blocks @ |
3206 | +identifier fops_rw.openfunc; |
3207 | +@@ |
3208 | + openfunc(...) { |
3209 | + <... |
3210 | +- nonseekable_open |
3211 | ++ nonseekable_open /* read & write (was deadlock) */ |
3212 | + ...> |
3213 | + } |
3214 | + |
3215 | + |
3216 | +@ explain_rw_nodeadlock depends on explain && !reader_blocks @ |
3217 | +identifier fops_rw.openfunc; |
3218 | +@@ |
3219 | + openfunc(...) { |
3220 | + <... |
3221 | +- nonseekable_open |
3222 | ++ nonseekable_open /* read & write (no direct deadlock) */ |
3223 | + ...> |
3224 | + } |
3225 | + |
3226 | +@ patch_rw depends on patch @ |
3227 | +identifier fops_rw.openfunc; |
3228 | +@@ |
3229 | + openfunc(...) { |
3230 | + <... |
3231 | +- nonseekable_open |
3232 | ++ stream_open |
3233 | + ...> |
3234 | + } |
3235 | + |
3236 | + |
3237 | +// read, but not write |
3238 | +@ fops_r depends on maybe_stream && !has_write @ |
3239 | +identifier fops0.fops, openfunc; |
3240 | +identifier stream_reader.readstream; |
3241 | +@@ |
3242 | + struct file_operations fops = { |
3243 | + .open = openfunc, |
3244 | + .read = readstream, |
3245 | + }; |
3246 | + |
3247 | +@ report_r depends on report @ |
3248 | +identifier fops_r.openfunc; |
3249 | +position p1; |
3250 | +@@ |
3251 | + openfunc(...) { |
3252 | + <... |
3253 | + nonseekable_open@p1 |
3254 | + ...> |
3255 | + } |
3256 | + |
3257 | +@ script:python depends on report @ |
3258 | +fops << fops0.fops; |
3259 | +p << report_r.p1; |
3260 | +@@ |
3261 | +coccilib.report.print_report(p[0], |
3262 | + "WARNING: %s: .read() has stream semantic; safe to change nonseekable_open -> stream_open." % (fops,)) |
3263 | + |
3264 | +@ explain_r depends on explain @ |
3265 | +identifier fops_r.openfunc; |
3266 | +@@ |
3267 | + openfunc(...) { |
3268 | + <... |
3269 | +- nonseekable_open |
3270 | ++ nonseekable_open /* read only */ |
3271 | + ...> |
3272 | + } |
3273 | + |
3274 | +@ patch_r depends on patch @ |
3275 | +identifier fops_r.openfunc; |
3276 | +@@ |
3277 | + openfunc(...) { |
3278 | + <... |
3279 | +- nonseekable_open |
3280 | ++ stream_open |
3281 | + ...> |
3282 | + } |
3283 | + |
3284 | + |
3285 | +// write, but not read |
3286 | +@ fops_w depends on maybe_stream && !has_read @ |
3287 | +identifier fops0.fops, openfunc; |
3288 | +identifier stream_writer.writestream; |
3289 | +@@ |
3290 | + struct file_operations fops = { |
3291 | + .open = openfunc, |
3292 | + .write = writestream, |
3293 | + }; |
3294 | + |
3295 | +@ report_w depends on report @ |
3296 | +identifier fops_w.openfunc; |
3297 | +position p1; |
3298 | +@@ |
3299 | + openfunc(...) { |
3300 | + <... |
3301 | + nonseekable_open@p1 |
3302 | + ...> |
3303 | + } |
3304 | + |
3305 | +@ script:python depends on report @ |
3306 | +fops << fops0.fops; |
3307 | +p << report_w.p1; |
3308 | +@@ |
3309 | +coccilib.report.print_report(p[0], |
3310 | + "WARNING: %s: .write() has stream semantic; safe to change nonseekable_open -> stream_open." % (fops,)) |
3311 | + |
3312 | +@ explain_w depends on explain @ |
3313 | +identifier fops_w.openfunc; |
3314 | +@@ |
3315 | + openfunc(...) { |
3316 | + <... |
3317 | +- nonseekable_open |
3318 | ++ nonseekable_open /* write only */ |
3319 | + ...> |
3320 | + } |
3321 | + |
3322 | +@ patch_w depends on patch @ |
3323 | +identifier fops_w.openfunc; |
3324 | +@@ |
3325 | + openfunc(...) { |
3326 | + <... |
3327 | +- nonseekable_open |
3328 | ++ stream_open |
3329 | + ...> |
3330 | + } |
3331 | + |
3332 | + |
3333 | +// no read, no write - don't change anything |
3334 | diff --git a/security/selinux/avc.c b/security/selinux/avc.c |
3335 | index 635e5c1e3e48..5de18a6d5c3f 100644 |
3336 | --- a/security/selinux/avc.c |
3337 | +++ b/security/selinux/avc.c |
3338 | @@ -838,6 +838,7 @@ out: |
3339 | * @ssid,@tsid,@tclass : identifier of an AVC entry |
3340 | * @seqno : sequence number when decision was made |
3341 | * @xpd: extended_perms_decision to be added to the node |
3342 | + * @flags: the AVC_* flags, e.g. AVC_NONBLOCKING, AVC_EXTENDED_PERMS, or 0. |
3343 | * |
3344 | * if a valid AVC entry doesn't exist,this function returns -ENOENT. |
3345 | * if kmalloc() called internal returns NULL, this function returns -ENOMEM. |
3346 | @@ -856,6 +857,23 @@ static int avc_update_node(struct selinux_avc *avc, |
3347 | struct hlist_head *head; |
3348 | spinlock_t *lock; |
3349 | |
3350 | + /* |
3351 | + * If we are in a non-blocking code path, e.g. VFS RCU walk, |
3352 | + * then we must not add permissions to a cache entry |
3353 | + * because we cannot safely audit the denial. Otherwise, |
3354 | + * during the subsequent blocking retry (e.g. VFS ref walk), we |
3355 | + * will find the permissions already granted in the cache entry |
3356 | + * and won't audit anything at all, leading to silent denials in |
3357 | + * permissive mode that only appear when in enforcing mode. |
3358 | + * |
3359 | + * See the corresponding handling in slow_avc_audit(), and the |
3360 | + * logic in selinux_inode_follow_link and selinux_inode_permission |
3361 | + * for the VFS MAY_NOT_BLOCK flag, which is transliterated into |
3362 | + * AVC_NONBLOCKING for avc_has_perm_noaudit(). |
3363 | + */ |
3364 | + if (flags & AVC_NONBLOCKING) |
3365 | + return 0; |
3366 | + |
3367 | node = avc_alloc_node(avc); |
3368 | if (!node) { |
3369 | rc = -ENOMEM; |
3370 | @@ -1115,7 +1133,7 @@ decision: |
3371 | * @tsid: target security identifier |
3372 | * @tclass: target security class |
3373 | * @requested: requested permissions, interpreted based on @tclass |
3374 | - * @flags: AVC_STRICT or 0 |
3375 | + * @flags: AVC_STRICT, AVC_NONBLOCKING, or 0 |
3376 | * @avd: access vector decisions |
3377 | * |
3378 | * Check the AVC to determine whether the @requested permissions are granted |
3379 | @@ -1199,7 +1217,8 @@ int avc_has_perm_flags(struct selinux_state *state, |
3380 | struct av_decision avd; |
3381 | int rc, rc2; |
3382 | |
3383 | - rc = avc_has_perm_noaudit(state, ssid, tsid, tclass, requested, 0, |
3384 | + rc = avc_has_perm_noaudit(state, ssid, tsid, tclass, requested, |
3385 | + (flags & MAY_NOT_BLOCK) ? AVC_NONBLOCKING : 0, |
3386 | &avd); |
3387 | |
3388 | rc2 = avc_audit(state, ssid, tsid, tclass, requested, &avd, rc, |
3389 | diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c |
3390 | index 4337b6d9369e..cba19b8c3e51 100644 |
3391 | --- a/security/selinux/hooks.c |
3392 | +++ b/security/selinux/hooks.c |
3393 | @@ -497,16 +497,10 @@ static int may_context_mount_inode_relabel(u32 sid, |
3394 | return rc; |
3395 | } |
3396 | |
3397 | -static int selinux_is_sblabel_mnt(struct super_block *sb) |
3398 | +static int selinux_is_genfs_special_handling(struct super_block *sb) |
3399 | { |
3400 | - struct superblock_security_struct *sbsec = sb->s_security; |
3401 | - |
3402 | - return sbsec->behavior == SECURITY_FS_USE_XATTR || |
3403 | - sbsec->behavior == SECURITY_FS_USE_TRANS || |
3404 | - sbsec->behavior == SECURITY_FS_USE_TASK || |
3405 | - sbsec->behavior == SECURITY_FS_USE_NATIVE || |
3406 | - /* Special handling. Genfs but also in-core setxattr handler */ |
3407 | - !strcmp(sb->s_type->name, "sysfs") || |
3408 | + /* Special handling. Genfs but also in-core setxattr handler */ |
3409 | + return !strcmp(sb->s_type->name, "sysfs") || |
3410 | !strcmp(sb->s_type->name, "pstore") || |
3411 | !strcmp(sb->s_type->name, "debugfs") || |
3412 | !strcmp(sb->s_type->name, "tracefs") || |
3413 | @@ -516,6 +510,34 @@ static int selinux_is_sblabel_mnt(struct super_block *sb) |
3414 | !strcmp(sb->s_type->name, "cgroup2"))); |
3415 | } |
3416 | |
3417 | +static int selinux_is_sblabel_mnt(struct super_block *sb) |
3418 | +{ |
3419 | + struct superblock_security_struct *sbsec = sb->s_security; |
3420 | + |
3421 | + /* |
3422 | + * IMPORTANT: Double-check logic in this function when adding a new |
3423 | + * SECURITY_FS_USE_* definition! |
3424 | + */ |
3425 | + BUILD_BUG_ON(SECURITY_FS_USE_MAX != 7); |
3426 | + |
3427 | + switch (sbsec->behavior) { |
3428 | + case SECURITY_FS_USE_XATTR: |
3429 | + case SECURITY_FS_USE_TRANS: |
3430 | + case SECURITY_FS_USE_TASK: |
3431 | + case SECURITY_FS_USE_NATIVE: |
3432 | + return 1; |
3433 | + |
3434 | + case SECURITY_FS_USE_GENFS: |
3435 | + return selinux_is_genfs_special_handling(sb); |
3436 | + |
3437 | + /* Never allow relabeling on context mounts */ |
3438 | + case SECURITY_FS_USE_MNTPOINT: |
3439 | + case SECURITY_FS_USE_NONE: |
3440 | + default: |
3441 | + return 0; |
3442 | + } |
3443 | +} |
3444 | + |
3445 | static int sb_finish_set_opts(struct super_block *sb) |
3446 | { |
3447 | struct superblock_security_struct *sbsec = sb->s_security; |
3448 | @@ -3199,7 +3221,9 @@ static int selinux_inode_permission(struct inode *inode, int mask) |
3449 | return PTR_ERR(isec); |
3450 | |
3451 | rc = avc_has_perm_noaudit(&selinux_state, |
3452 | - sid, isec->sid, isec->sclass, perms, 0, &avd); |
3453 | + sid, isec->sid, isec->sclass, perms, |
3454 | + (flags & MAY_NOT_BLOCK) ? AVC_NONBLOCKING : 0, |
3455 | + &avd); |
3456 | audited = avc_audit_required(perms, &avd, rc, |
3457 | from_access ? FILE__AUDIT_ACCESS : 0, |
3458 | &denied); |
3459 | diff --git a/security/selinux/include/avc.h b/security/selinux/include/avc.h |
3460 | index ef899bcfd2cb..74ea50977c20 100644 |
3461 | --- a/security/selinux/include/avc.h |
3462 | +++ b/security/selinux/include/avc.h |
3463 | @@ -142,6 +142,7 @@ static inline int avc_audit(struct selinux_state *state, |
3464 | |
3465 | #define AVC_STRICT 1 /* Ignore permissive mode. */ |
3466 | #define AVC_EXTENDED_PERMS 2 /* update extended permissions */ |
3467 | +#define AVC_NONBLOCKING 4 /* non blocking */ |
3468 | int avc_has_perm_noaudit(struct selinux_state *state, |
3469 | u32 ssid, u32 tsid, |
3470 | u16 tclass, u32 requested, |
3471 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c |
3472 | index 0a745d677b1c..75a0be2aa9c2 100644 |
3473 | --- a/sound/pci/hda/patch_realtek.c |
3474 | +++ b/sound/pci/hda/patch_realtek.c |
3475 | @@ -5448,6 +5448,8 @@ static void alc274_fixup_bind_dacs(struct hda_codec *codec, |
3476 | return; |
3477 | |
3478 | spec->gen.preferred_dacs = preferred_pairs; |
3479 | + spec->gen.auto_mute_via_amp = 1; |
3480 | + codec->power_save_node = 0; |
3481 | } |
3482 | |
3483 | /* The DAC of NID 0x3 will introduce click/pop noise on headphones, so invalidate it */ |
3484 | @@ -7172,6 +7174,10 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = { |
3485 | {0x21, 0x02211020}), |
3486 | SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, |
3487 | {0x21, 0x02211020}), |
3488 | + SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, |
3489 | + {0x12, 0x40000000}, |
3490 | + {0x14, 0x90170110}, |
3491 | + {0x21, 0x02211020}), |
3492 | SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL2_MIC_NO_PRESENCE, |
3493 | {0x14, 0x90170110}, |
3494 | {0x21, 0x02211020}), |
3495 | @@ -7445,6 +7451,13 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = { |
3496 | {0x12, 0x90a60130}, |
3497 | {0x17, 0x90170110}, |
3498 | {0x21, 0x04211020}), |
3499 | + SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK, |
3500 | + {0x12, 0x90a60130}, |
3501 | + {0x17, 0x90170110}, |
3502 | + {0x21, 0x03211020}), |
3503 | + SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, |
3504 | + {0x14, 0x90170110}, |
3505 | + {0x21, 0x04211020}), |
3506 | SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, |
3507 | ALC295_STANDARD_PINS, |
3508 | {0x17, 0x21014020}, |
3509 | diff --git a/sound/soc/codecs/wm_adsp.c b/sound/soc/codecs/wm_adsp.c |
3510 | index 4d3ec295679d..a651fed62a27 100644 |
3511 | --- a/sound/soc/codecs/wm_adsp.c |
3512 | +++ b/sound/soc/codecs/wm_adsp.c |
3513 | @@ -3441,8 +3441,6 @@ int wm_adsp_compr_trigger(struct snd_compr_stream *stream, int cmd) |
3514 | } |
3515 | } |
3516 | |
3517 | - wm_adsp_buffer_clear(compr->buf); |
3518 | - |
3519 | /* Trigger the IRQ at one fragment of data */ |
3520 | ret = wm_adsp_buffer_write(compr->buf, |
3521 | HOST_BUFFER_FIELD(high_water_mark), |
3522 | @@ -3454,6 +3452,8 @@ int wm_adsp_compr_trigger(struct snd_compr_stream *stream, int cmd) |
3523 | } |
3524 | break; |
3525 | case SNDRV_PCM_TRIGGER_STOP: |
3526 | + if (wm_adsp_compr_attached(compr)) |
3527 | + wm_adsp_buffer_clear(compr->buf); |
3528 | break; |
3529 | default: |
3530 | ret = -EINVAL; |
3531 | diff --git a/sound/soc/intel/boards/bytcr_rt5651.c b/sound/soc/intel/boards/bytcr_rt5651.c |
3532 | index f8a68bdb3885..b74bbee111c6 100644 |
3533 | --- a/sound/soc/intel/boards/bytcr_rt5651.c |
3534 | +++ b/sound/soc/intel/boards/bytcr_rt5651.c |
3535 | @@ -267,7 +267,7 @@ static const struct snd_soc_dapm_route byt_rt5651_audio_map[] = { |
3536 | static const struct snd_soc_dapm_route byt_rt5651_intmic_dmic_map[] = { |
3537 | {"DMIC L1", NULL, "Internal Mic"}, |
3538 | {"DMIC R1", NULL, "Internal Mic"}, |
3539 | - {"IN3P", NULL, "Headset Mic"}, |
3540 | + {"IN2P", NULL, "Headset Mic"}, |
3541 | }; |
3542 | |
3543 | static const struct snd_soc_dapm_route byt_rt5651_intmic_in1_map[] = { |
3544 | diff --git a/sound/soc/stm/stm32_sai_sub.c b/sound/soc/stm/stm32_sai_sub.c |
3545 | index 06fba9650ac4..85c4b6d8e89d 100644 |
3546 | --- a/sound/soc/stm/stm32_sai_sub.c |
3547 | +++ b/sound/soc/stm/stm32_sai_sub.c |
3548 | @@ -1194,7 +1194,6 @@ static int stm32_sai_sub_dais_init(struct platform_device *pdev, |
3549 | if (!sai->cpu_dai_drv) |
3550 | return -ENOMEM; |
3551 | |
3552 | - sai->cpu_dai_drv->name = dev_name(&pdev->dev); |
3553 | if (STM_SAI_IS_PLAYBACK(sai)) { |
3554 | memcpy(sai->cpu_dai_drv, &stm32_sai_playback_dai, |
3555 | sizeof(stm32_sai_playback_dai)); |
3556 | @@ -1204,6 +1203,7 @@ static int stm32_sai_sub_dais_init(struct platform_device *pdev, |
3557 | sizeof(stm32_sai_capture_dai)); |
3558 | sai->cpu_dai_drv->capture.stream_name = sai->cpu_dai_drv->name; |
3559 | } |
3560 | + sai->cpu_dai_drv->name = dev_name(&pdev->dev); |
3561 | |
3562 | return 0; |
3563 | } |