Annotation of /trunk/kernel-alx/patches-5.4/0239-5.4.140-all-fixes.patch
Parent Directory
|
Revision Log
Revision 3637 -
(hide annotations)
(download)
Mon Oct 24 12:40:44 2022 UTC (20 months ago) by niro
File size: 94325 byte(s)
Mon Oct 24 12:40:44 2022 UTC (20 months ago) by niro
File size: 94325 byte(s)
-add missing
1 | niro | 3637 | diff --git a/Makefile b/Makefile |
2 | index 1174536034b38..1cb8f72d4dcea 100644 | ||
3 | --- a/Makefile | ||
4 | +++ b/Makefile | ||
5 | @@ -1,7 +1,7 @@ | ||
6 | # SPDX-License-Identifier: GPL-2.0 | ||
7 | VERSION = 5 | ||
8 | PATCHLEVEL = 4 | ||
9 | -SUBLEVEL = 139 | ||
10 | +SUBLEVEL = 140 | ||
11 | EXTRAVERSION = | ||
12 | NAME = Kleptomaniac Octopus | ||
13 | |||
14 | diff --git a/arch/alpha/kernel/smp.c b/arch/alpha/kernel/smp.c | ||
15 | index 5f90df30be20a..06fd42417aa96 100644 | ||
16 | --- a/arch/alpha/kernel/smp.c | ||
17 | +++ b/arch/alpha/kernel/smp.c | ||
18 | @@ -585,7 +585,7 @@ void | ||
19 | smp_send_stop(void) | ||
20 | { | ||
21 | cpumask_t to_whom; | ||
22 | - cpumask_copy(&to_whom, cpu_possible_mask); | ||
23 | + cpumask_copy(&to_whom, cpu_online_mask); | ||
24 | cpumask_clear_cpu(smp_processor_id(), &to_whom); | ||
25 | #ifdef DEBUG_IPI_MSG | ||
26 | if (hard_smp_processor_id() != boot_cpu_id) | ||
27 | diff --git a/arch/arm/boot/dts/am437x-l4.dtsi b/arch/arm/boot/dts/am437x-l4.dtsi | ||
28 | index 6c2949991e297..64fdd5079d49b 100644 | ||
29 | --- a/arch/arm/boot/dts/am437x-l4.dtsi | ||
30 | +++ b/arch/arm/boot/dts/am437x-l4.dtsi | ||
31 | @@ -1611,7 +1611,7 @@ | ||
32 | compatible = "ti,am4372-d_can", "ti,am3352-d_can"; | ||
33 | reg = <0x0 0x2000>; | ||
34 | clocks = <&dcan1_fck>; | ||
35 | - clock-name = "fck"; | ||
36 | + clock-names = "fck"; | ||
37 | syscon-raminit = <&scm_conf 0x644 1>; | ||
38 | interrupts = <GIC_SPI 49 IRQ_TYPE_LEVEL_HIGH>; | ||
39 | status = "disabled"; | ||
40 | diff --git a/arch/arm/boot/dts/imx53-m53menlo.dts b/arch/arm/boot/dts/imx53-m53menlo.dts | ||
41 | index 719ed5ca454af..64faf5b46d92f 100644 | ||
42 | --- a/arch/arm/boot/dts/imx53-m53menlo.dts | ||
43 | +++ b/arch/arm/boot/dts/imx53-m53menlo.dts | ||
44 | @@ -388,13 +388,13 @@ | ||
45 | |||
46 | pinctrl_power_button: powerbutgrp { | ||
47 | fsl,pins = < | ||
48 | - MX53_PAD_SD2_DATA2__GPIO1_13 0x1e4 | ||
49 | + MX53_PAD_SD2_DATA0__GPIO1_15 0x1e4 | ||
50 | >; | ||
51 | }; | ||
52 | |||
53 | pinctrl_power_out: poweroutgrp { | ||
54 | fsl,pins = < | ||
55 | - MX53_PAD_SD2_DATA0__GPIO1_15 0x1e4 | ||
56 | + MX53_PAD_SD2_DATA2__GPIO1_13 0x1e4 | ||
57 | >; | ||
58 | }; | ||
59 | |||
60 | diff --git a/arch/arm/boot/dts/imx6qdl-sr-som.dtsi b/arch/arm/boot/dts/imx6qdl-sr-som.dtsi | ||
61 | index 6d7f6b9035bc1..f2649241167ec 100644 | ||
62 | --- a/arch/arm/boot/dts/imx6qdl-sr-som.dtsi | ||
63 | +++ b/arch/arm/boot/dts/imx6qdl-sr-som.dtsi | ||
64 | @@ -54,7 +54,13 @@ | ||
65 | pinctrl-names = "default"; | ||
66 | pinctrl-0 = <&pinctrl_microsom_enet_ar8035>; | ||
67 | phy-mode = "rgmii-id"; | ||
68 | - phy-reset-duration = <2>; | ||
69 | + | ||
70 | + /* | ||
71 | + * The PHY seems to require a long-enough reset duration to avoid | ||
72 | + * some rare issues where the PHY gets stuck in an inconsistent and | ||
73 | + * non-functional state at boot-up. 10ms proved to be fine . | ||
74 | + */ | ||
75 | + phy-reset-duration = <10>; | ||
76 | phy-reset-gpios = <&gpio4 15 GPIO_ACTIVE_LOW>; | ||
77 | status = "okay"; | ||
78 | }; | ||
79 | diff --git a/arch/arm/boot/dts/imx6ull-colibri-wifi.dtsi b/arch/arm/boot/dts/imx6ull-colibri-wifi.dtsi | ||
80 | index 038d8c90f6dfe..621396884c318 100644 | ||
81 | --- a/arch/arm/boot/dts/imx6ull-colibri-wifi.dtsi | ||
82 | +++ b/arch/arm/boot/dts/imx6ull-colibri-wifi.dtsi | ||
83 | @@ -43,6 +43,7 @@ | ||
84 | assigned-clock-rates = <0>, <198000000>; | ||
85 | cap-power-off-card; | ||
86 | keep-power-in-suspend; | ||
87 | + max-frequency = <25000000>; | ||
88 | mmc-pwrseq = <&wifi_pwrseq>; | ||
89 | no-1-8-v; | ||
90 | non-removable; | ||
91 | diff --git a/arch/arm/boot/dts/omap5-board-common.dtsi b/arch/arm/boot/dts/omap5-board-common.dtsi | ||
92 | index 68ac04641bdb1..c7bf68c90ea8f 100644 | ||
93 | --- a/arch/arm/boot/dts/omap5-board-common.dtsi | ||
94 | +++ b/arch/arm/boot/dts/omap5-board-common.dtsi | ||
95 | @@ -30,14 +30,6 @@ | ||
96 | regulator-max-microvolt = <5000000>; | ||
97 | }; | ||
98 | |||
99 | - vdds_1v8_main: fixedregulator-vdds_1v8_main { | ||
100 | - compatible = "regulator-fixed"; | ||
101 | - regulator-name = "vdds_1v8_main"; | ||
102 | - vin-supply = <&smps7_reg>; | ||
103 | - regulator-min-microvolt = <1800000>; | ||
104 | - regulator-max-microvolt = <1800000>; | ||
105 | - }; | ||
106 | - | ||
107 | vmmcsd_fixed: fixedregulator-mmcsd { | ||
108 | compatible = "regulator-fixed"; | ||
109 | regulator-name = "vmmcsd_fixed"; | ||
110 | @@ -487,6 +479,7 @@ | ||
111 | regulator-boot-on; | ||
112 | }; | ||
113 | |||
114 | + vdds_1v8_main: | ||
115 | smps7_reg: smps7 { | ||
116 | /* VDDS_1v8_OMAP over VDDS_1v8_MAIN */ | ||
117 | regulator-name = "smps7"; | ||
118 | diff --git a/arch/arm/mach-imx/mmdc.c b/arch/arm/mach-imx/mmdc.c | ||
119 | index 0dfd0ae7a63dd..af12668d0bf51 100644 | ||
120 | --- a/arch/arm/mach-imx/mmdc.c | ||
121 | +++ b/arch/arm/mach-imx/mmdc.c | ||
122 | @@ -103,6 +103,7 @@ struct mmdc_pmu { | ||
123 | struct perf_event *mmdc_events[MMDC_NUM_COUNTERS]; | ||
124 | struct hlist_node node; | ||
125 | struct fsl_mmdc_devtype_data *devtype_data; | ||
126 | + struct clk *mmdc_ipg_clk; | ||
127 | }; | ||
128 | |||
129 | /* | ||
130 | @@ -462,11 +463,14 @@ static int imx_mmdc_remove(struct platform_device *pdev) | ||
131 | |||
132 | cpuhp_state_remove_instance_nocalls(cpuhp_mmdc_state, &pmu_mmdc->node); | ||
133 | perf_pmu_unregister(&pmu_mmdc->pmu); | ||
134 | + iounmap(pmu_mmdc->mmdc_base); | ||
135 | + clk_disable_unprepare(pmu_mmdc->mmdc_ipg_clk); | ||
136 | kfree(pmu_mmdc); | ||
137 | return 0; | ||
138 | } | ||
139 | |||
140 | -static int imx_mmdc_perf_init(struct platform_device *pdev, void __iomem *mmdc_base) | ||
141 | +static int imx_mmdc_perf_init(struct platform_device *pdev, void __iomem *mmdc_base, | ||
142 | + struct clk *mmdc_ipg_clk) | ||
143 | { | ||
144 | struct mmdc_pmu *pmu_mmdc; | ||
145 | char *name; | ||
146 | @@ -494,6 +498,7 @@ static int imx_mmdc_perf_init(struct platform_device *pdev, void __iomem *mmdc_b | ||
147 | } | ||
148 | |||
149 | mmdc_num = mmdc_pmu_init(pmu_mmdc, mmdc_base, &pdev->dev); | ||
150 | + pmu_mmdc->mmdc_ipg_clk = mmdc_ipg_clk; | ||
151 | if (mmdc_num == 0) | ||
152 | name = "mmdc"; | ||
153 | else | ||
154 | @@ -529,7 +534,7 @@ pmu_free: | ||
155 | |||
156 | #else | ||
157 | #define imx_mmdc_remove NULL | ||
158 | -#define imx_mmdc_perf_init(pdev, mmdc_base) 0 | ||
159 | +#define imx_mmdc_perf_init(pdev, mmdc_base, mmdc_ipg_clk) 0 | ||
160 | #endif | ||
161 | |||
162 | static int imx_mmdc_probe(struct platform_device *pdev) | ||
163 | @@ -567,7 +572,13 @@ static int imx_mmdc_probe(struct platform_device *pdev) | ||
164 | val &= ~(1 << BP_MMDC_MAPSR_PSD); | ||
165 | writel_relaxed(val, reg); | ||
166 | |||
167 | - return imx_mmdc_perf_init(pdev, mmdc_base); | ||
168 | + err = imx_mmdc_perf_init(pdev, mmdc_base, mmdc_ipg_clk); | ||
169 | + if (err) { | ||
170 | + iounmap(mmdc_base); | ||
171 | + clk_disable_unprepare(mmdc_ipg_clk); | ||
172 | + } | ||
173 | + | ||
174 | + return err; | ||
175 | } | ||
176 | |||
177 | int imx_mmdc_get_ddr_type(void) | ||
178 | diff --git a/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi b/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi | ||
179 | index 5a2a188debd1d..5716ac20bddd1 100644 | ||
180 | --- a/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi | ||
181 | +++ b/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi | ||
182 | @@ -65,7 +65,7 @@ | ||
183 | }; | ||
184 | }; | ||
185 | |||
186 | - sysclk: clock-sysclk { | ||
187 | + sysclk: sysclk { | ||
188 | compatible = "fixed-clock"; | ||
189 | #clock-cells = <0>; | ||
190 | clock-frequency = <100000000>; | ||
191 | diff --git a/arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts b/arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts | ||
192 | index 874bc3954c8e6..025e02d23da9b 100644 | ||
193 | --- a/arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts | ||
194 | +++ b/arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts | ||
195 | @@ -118,6 +118,7 @@ | ||
196 | pinctrl-names = "default"; | ||
197 | pinctrl-0 = <&i2c1_pins>; | ||
198 | clock-frequency = <100000>; | ||
199 | + /delete-property/ mrvl,i2c-fast-mode; | ||
200 | status = "okay"; | ||
201 | |||
202 | rtc@6f { | ||
203 | diff --git a/arch/arm64/include/asm/arch_timer.h b/arch/arm64/include/asm/arch_timer.h | ||
204 | index 9f0ec21d6327f..88d20f04c64a5 100644 | ||
205 | --- a/arch/arm64/include/asm/arch_timer.h | ||
206 | +++ b/arch/arm64/include/asm/arch_timer.h | ||
207 | @@ -165,25 +165,6 @@ static inline void arch_timer_set_cntkctl(u32 cntkctl) | ||
208 | isb(); | ||
209 | } | ||
210 | |||
211 | -/* | ||
212 | - * Ensure that reads of the counter are treated the same as memory reads | ||
213 | - * for the purposes of ordering by subsequent memory barriers. | ||
214 | - * | ||
215 | - * This insanity brought to you by speculative system register reads, | ||
216 | - * out-of-order memory accesses, sequence locks and Thomas Gleixner. | ||
217 | - * | ||
218 | - * http://lists.infradead.org/pipermail/linux-arm-kernel/2019-February/631195.html | ||
219 | - */ | ||
220 | -#define arch_counter_enforce_ordering(val) do { \ | ||
221 | - u64 tmp, _val = (val); \ | ||
222 | - \ | ||
223 | - asm volatile( \ | ||
224 | - " eor %0, %1, %1\n" \ | ||
225 | - " add %0, sp, %0\n" \ | ||
226 | - " ldr xzr, [%0]" \ | ||
227 | - : "=r" (tmp) : "r" (_val)); \ | ||
228 | -} while (0) | ||
229 | - | ||
230 | static __always_inline u64 __arch_counter_get_cntpct_stable(void) | ||
231 | { | ||
232 | u64 cnt; | ||
233 | @@ -224,8 +205,6 @@ static __always_inline u64 __arch_counter_get_cntvct(void) | ||
234 | return cnt; | ||
235 | } | ||
236 | |||
237 | -#undef arch_counter_enforce_ordering | ||
238 | - | ||
239 | static inline int arch_timer_arch_init(void) | ||
240 | { | ||
241 | return 0; | ||
242 | diff --git a/arch/arm64/include/asm/barrier.h b/arch/arm64/include/asm/barrier.h | ||
243 | index e0e2b1946f42b..0fcd854fc95f3 100644 | ||
244 | --- a/arch/arm64/include/asm/barrier.h | ||
245 | +++ b/arch/arm64/include/asm/barrier.h | ||
246 | @@ -57,6 +57,25 @@ static inline unsigned long array_index_mask_nospec(unsigned long idx, | ||
247 | return mask; | ||
248 | } | ||
249 | |||
250 | +/* | ||
251 | + * Ensure that reads of the counter are treated the same as memory reads | ||
252 | + * for the purposes of ordering by subsequent memory barriers. | ||
253 | + * | ||
254 | + * This insanity brought to you by speculative system register reads, | ||
255 | + * out-of-order memory accesses, sequence locks and Thomas Gleixner. | ||
256 | + * | ||
257 | + * http://lists.infradead.org/pipermail/linux-arm-kernel/2019-February/631195.html | ||
258 | + */ | ||
259 | +#define arch_counter_enforce_ordering(val) do { \ | ||
260 | + u64 tmp, _val = (val); \ | ||
261 | + \ | ||
262 | + asm volatile( \ | ||
263 | + " eor %0, %1, %1\n" \ | ||
264 | + " add %0, sp, %0\n" \ | ||
265 | + " ldr xzr, [%0]" \ | ||
266 | + : "=r" (tmp) : "r" (_val)); \ | ||
267 | +} while (0) | ||
268 | + | ||
269 | #define __smp_mb() dmb(ish) | ||
270 | #define __smp_rmb() dmb(ishld) | ||
271 | #define __smp_wmb() dmb(ishst) | ||
272 | diff --git a/arch/arm64/include/asm/ptrace.h b/arch/arm64/include/asm/ptrace.h | ||
273 | index bf57308fcd635..92b2575b01918 100644 | ||
274 | --- a/arch/arm64/include/asm/ptrace.h | ||
275 | +++ b/arch/arm64/include/asm/ptrace.h | ||
276 | @@ -299,7 +299,17 @@ static inline unsigned long kernel_stack_pointer(struct pt_regs *regs) | ||
277 | |||
278 | static inline unsigned long regs_return_value(struct pt_regs *regs) | ||
279 | { | ||
280 | - return regs->regs[0]; | ||
281 | + unsigned long val = regs->regs[0]; | ||
282 | + | ||
283 | + /* | ||
284 | + * Audit currently uses regs_return_value() instead of | ||
285 | + * syscall_get_return_value(). Apply the same sign-extension here until | ||
286 | + * audit is updated to use syscall_get_return_value(). | ||
287 | + */ | ||
288 | + if (compat_user_mode(regs)) | ||
289 | + val = sign_extend64(val, 31); | ||
290 | + | ||
291 | + return val; | ||
292 | } | ||
293 | |||
294 | static inline void regs_set_return_value(struct pt_regs *regs, unsigned long rc) | ||
295 | diff --git a/arch/arm64/include/asm/syscall.h b/arch/arm64/include/asm/syscall.h | ||
296 | index cfc0672013f67..03e20895453a7 100644 | ||
297 | --- a/arch/arm64/include/asm/syscall.h | ||
298 | +++ b/arch/arm64/include/asm/syscall.h | ||
299 | @@ -29,22 +29,23 @@ static inline void syscall_rollback(struct task_struct *task, | ||
300 | regs->regs[0] = regs->orig_x0; | ||
301 | } | ||
302 | |||
303 | - | ||
304 | -static inline long syscall_get_error(struct task_struct *task, | ||
305 | - struct pt_regs *regs) | ||
306 | +static inline long syscall_get_return_value(struct task_struct *task, | ||
307 | + struct pt_regs *regs) | ||
308 | { | ||
309 | - unsigned long error = regs->regs[0]; | ||
310 | + unsigned long val = regs->regs[0]; | ||
311 | |||
312 | if (is_compat_thread(task_thread_info(task))) | ||
313 | - error = sign_extend64(error, 31); | ||
314 | + val = sign_extend64(val, 31); | ||
315 | |||
316 | - return IS_ERR_VALUE(error) ? error : 0; | ||
317 | + return val; | ||
318 | } | ||
319 | |||
320 | -static inline long syscall_get_return_value(struct task_struct *task, | ||
321 | - struct pt_regs *regs) | ||
322 | +static inline long syscall_get_error(struct task_struct *task, | ||
323 | + struct pt_regs *regs) | ||
324 | { | ||
325 | - return regs->regs[0]; | ||
326 | + unsigned long error = syscall_get_return_value(task, regs); | ||
327 | + | ||
328 | + return IS_ERR_VALUE(error) ? error : 0; | ||
329 | } | ||
330 | |||
331 | static inline void syscall_set_return_value(struct task_struct *task, | ||
332 | diff --git a/arch/arm64/include/asm/vdso/gettimeofday.h b/arch/arm64/include/asm/vdso/gettimeofday.h | ||
333 | index ff83b8b574fc7..d7361faa42dea 100644 | ||
334 | --- a/arch/arm64/include/asm/vdso/gettimeofday.h | ||
335 | +++ b/arch/arm64/include/asm/vdso/gettimeofday.h | ||
336 | @@ -85,11 +85,7 @@ static __always_inline u64 __arch_get_hw_counter(s32 clock_mode) | ||
337 | */ | ||
338 | isb(); | ||
339 | asm volatile("mrs %0, cntvct_el0" : "=r" (res) :: "memory"); | ||
340 | - /* | ||
341 | - * This isb() is required to prevent that the seq lock is | ||
342 | - * speculated.# | ||
343 | - */ | ||
344 | - isb(); | ||
345 | + arch_counter_enforce_ordering(res); | ||
346 | |||
347 | return res; | ||
348 | } | ||
349 | diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c | ||
350 | index 0cfd685774891..8a95a013dfd3c 100644 | ||
351 | --- a/arch/arm64/kernel/ptrace.c | ||
352 | +++ b/arch/arm64/kernel/ptrace.c | ||
353 | @@ -1868,7 +1868,7 @@ void syscall_trace_exit(struct pt_regs *regs) | ||
354 | audit_syscall_exit(regs); | ||
355 | |||
356 | if (flags & _TIF_SYSCALL_TRACEPOINT) | ||
357 | - trace_sys_exit(regs, regs_return_value(regs)); | ||
358 | + trace_sys_exit(regs, syscall_get_return_value(current, regs)); | ||
359 | |||
360 | if (flags & (_TIF_SYSCALL_TRACE | _TIF_SINGLESTEP)) | ||
361 | tracehook_report_syscall(regs, PTRACE_SYSCALL_EXIT); | ||
362 | diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c | ||
363 | index ddb757b2c3e5b..f6d3278c1a4e0 100644 | ||
364 | --- a/arch/arm64/kernel/signal.c | ||
365 | +++ b/arch/arm64/kernel/signal.c | ||
366 | @@ -29,6 +29,7 @@ | ||
367 | #include <asm/unistd.h> | ||
368 | #include <asm/fpsimd.h> | ||
369 | #include <asm/ptrace.h> | ||
370 | +#include <asm/syscall.h> | ||
371 | #include <asm/signal32.h> | ||
372 | #include <asm/traps.h> | ||
373 | #include <asm/vdso.h> | ||
374 | @@ -868,7 +869,7 @@ static void do_signal(struct pt_regs *regs) | ||
375 | retval == -ERESTART_RESTARTBLOCK || | ||
376 | (retval == -ERESTARTSYS && | ||
377 | !(ksig.ka.sa.sa_flags & SA_RESTART)))) { | ||
378 | - regs->regs[0] = -EINTR; | ||
379 | + syscall_set_return_value(current, regs, -EINTR, 0); | ||
380 | regs->pc = continue_addr; | ||
381 | } | ||
382 | |||
383 | diff --git a/arch/arm64/kernel/syscall.c b/arch/arm64/kernel/syscall.c | ||
384 | index f2d2dbbbfca20..091c11521108a 100644 | ||
385 | --- a/arch/arm64/kernel/syscall.c | ||
386 | +++ b/arch/arm64/kernel/syscall.c | ||
387 | @@ -50,10 +50,7 @@ static void invoke_syscall(struct pt_regs *regs, unsigned int scno, | ||
388 | ret = do_ni_syscall(regs, scno); | ||
389 | } | ||
390 | |||
391 | - if (is_compat_task()) | ||
392 | - ret = lower_32_bits(ret); | ||
393 | - | ||
394 | - regs->regs[0] = ret; | ||
395 | + syscall_set_return_value(current, regs, 0, ret); | ||
396 | } | ||
397 | |||
398 | static inline bool has_syscall_work(unsigned long flags) | ||
399 | @@ -108,7 +105,7 @@ static void el0_svc_common(struct pt_regs *regs, int scno, int sc_nr, | ||
400 | if (has_syscall_work(flags)) { | ||
401 | /* set default errno for user-issued syscall(-1) */ | ||
402 | if (scno == NO_SYSCALL) | ||
403 | - regs->regs[0] = -ENOSYS; | ||
404 | + syscall_set_return_value(current, regs, -ENOSYS, 0); | ||
405 | scno = syscall_trace_enter(regs); | ||
406 | if (scno == NO_SYSCALL) | ||
407 | goto trace_exit; | ||
408 | diff --git a/arch/mips/Makefile b/arch/mips/Makefile | ||
409 | index 5403a91ce098d..9ff2c70763a0c 100644 | ||
410 | --- a/arch/mips/Makefile | ||
411 | +++ b/arch/mips/Makefile | ||
412 | @@ -320,7 +320,7 @@ KBUILD_LDFLAGS += -m $(ld-emul) | ||
413 | |||
414 | ifdef CONFIG_MIPS | ||
415 | CHECKFLAGS += $(shell $(CC) $(KBUILD_CFLAGS) -dM -E -x c /dev/null | \ | ||
416 | - egrep -vw '__GNUC_(|MINOR_|PATCHLEVEL_)_' | \ | ||
417 | + egrep -vw '__GNUC_(MINOR_|PATCHLEVEL_)?_' | \ | ||
418 | sed -e "s/^\#define /-D'/" -e "s/ /'='/" -e "s/$$/'/" -e 's/\$$/&&/g') | ||
419 | endif | ||
420 | |||
421 | diff --git a/arch/mips/mti-malta/malta-platform.c b/arch/mips/mti-malta/malta-platform.c | ||
422 | index 11e9527c6e441..62ffac500eb52 100644 | ||
423 | --- a/arch/mips/mti-malta/malta-platform.c | ||
424 | +++ b/arch/mips/mti-malta/malta-platform.c | ||
425 | @@ -47,7 +47,8 @@ static struct plat_serial8250_port uart8250_data[] = { | ||
426 | .mapbase = 0x1f000900, /* The CBUS UART */ | ||
427 | .irq = MIPS_CPU_IRQ_BASE + MIPSCPU_INT_MB2, | ||
428 | .uartclk = 3686400, /* Twice the usual clk! */ | ||
429 | - .iotype = UPIO_MEM32, | ||
430 | + .iotype = IS_ENABLED(CONFIG_CPU_BIG_ENDIAN) ? | ||
431 | + UPIO_MEM32BE : UPIO_MEM32, | ||
432 | .flags = CBUS_UART_FLAGS, | ||
433 | .regshift = 3, | ||
434 | }, | ||
435 | diff --git a/arch/x86/events/perf_event.h b/arch/x86/events/perf_event.h | ||
436 | index 0ed910237c4d8..834e53e538d44 100644 | ||
437 | --- a/arch/x86/events/perf_event.h | ||
438 | +++ b/arch/x86/events/perf_event.h | ||
439 | @@ -852,9 +852,10 @@ void x86_pmu_stop(struct perf_event *event, int flags); | ||
440 | |||
441 | static inline void x86_pmu_disable_event(struct perf_event *event) | ||
442 | { | ||
443 | + u64 disable_mask = __this_cpu_read(cpu_hw_events.perf_ctr_virt_mask); | ||
444 | struct hw_perf_event *hwc = &event->hw; | ||
445 | |||
446 | - wrmsrl(hwc->config_base, hwc->config); | ||
447 | + wrmsrl(hwc->config_base, hwc->config & ~disable_mask); | ||
448 | } | ||
449 | |||
450 | void x86_pmu_enable_event(struct perf_event *event); | ||
451 | diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c | ||
452 | index b9400087141df..260c64c205b8c 100644 | ||
453 | --- a/arch/x86/kvm/mmu.c | ||
454 | +++ b/arch/x86/kvm/mmu.c | ||
455 | @@ -2143,7 +2143,7 @@ static int is_empty_shadow_page(u64 *spt) | ||
456 | * aggregate version in order to make the slab shrinker | ||
457 | * faster | ||
458 | */ | ||
459 | -static inline void kvm_mod_used_mmu_pages(struct kvm *kvm, unsigned long nr) | ||
460 | +static inline void kvm_mod_used_mmu_pages(struct kvm *kvm, long nr) | ||
461 | { | ||
462 | kvm->arch.n_used_mmu_pages += nr; | ||
463 | percpu_counter_add(&kvm_total_used_mmu_pages, nr); | ||
464 | diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c | ||
465 | index 5d35b9656b67d..364e96e508d90 100644 | ||
466 | --- a/arch/x86/kvm/x86.c | ||
467 | +++ b/arch/x86/kvm/x86.c | ||
468 | @@ -3638,8 +3638,17 @@ static int kvm_cpu_accept_dm_intr(struct kvm_vcpu *vcpu) | ||
469 | |||
470 | static int kvm_vcpu_ready_for_interrupt_injection(struct kvm_vcpu *vcpu) | ||
471 | { | ||
472 | - return kvm_arch_interrupt_allowed(vcpu) && | ||
473 | - kvm_cpu_accept_dm_intr(vcpu); | ||
474 | + /* | ||
475 | + * Do not cause an interrupt window exit if an exception | ||
476 | + * is pending or an event needs reinjection; userspace | ||
477 | + * might want to inject the interrupt manually using KVM_SET_REGS | ||
478 | + * or KVM_SET_SREGS. For that to work, we must be at an | ||
479 | + * instruction boundary and with no events half-injected. | ||
480 | + */ | ||
481 | + return (kvm_arch_interrupt_allowed(vcpu) && | ||
482 | + kvm_cpu_accept_dm_intr(vcpu) && | ||
483 | + !kvm_event_needs_reinjection(vcpu) && | ||
484 | + !vcpu->arch.exception.pending); | ||
485 | } | ||
486 | |||
487 | static int kvm_vcpu_ioctl_interrupt(struct kvm_vcpu *vcpu, | ||
488 | diff --git a/block/blk-iolatency.c b/block/blk-iolatency.c | ||
489 | index c128d50cb4107..71a82528d4bfe 100644 | ||
490 | --- a/block/blk-iolatency.c | ||
491 | +++ b/block/blk-iolatency.c | ||
492 | @@ -832,7 +832,11 @@ static ssize_t iolatency_set_limit(struct kernfs_open_file *of, char *buf, | ||
493 | |||
494 | enable = iolatency_set_min_lat_nsec(blkg, lat_val); | ||
495 | if (enable) { | ||
496 | - WARN_ON_ONCE(!blk_get_queue(blkg->q)); | ||
497 | + if (!blk_get_queue(blkg->q)) { | ||
498 | + ret = -ENODEV; | ||
499 | + goto out; | ||
500 | + } | ||
501 | + | ||
502 | blkg_get(blkg); | ||
503 | } | ||
504 | |||
505 | diff --git a/drivers/acpi/acpica/nsrepair2.c b/drivers/acpi/acpica/nsrepair2.c | ||
506 | index b7c408ce340c9..663d85e0adba9 100644 | ||
507 | --- a/drivers/acpi/acpica/nsrepair2.c | ||
508 | +++ b/drivers/acpi/acpica/nsrepair2.c | ||
509 | @@ -375,13 +375,6 @@ acpi_ns_repair_CID(struct acpi_evaluate_info *info, | ||
510 | |||
511 | (*element_ptr)->common.reference_count = | ||
512 | original_ref_count; | ||
513 | - | ||
514 | - /* | ||
515 | - * The original_element holds a reference from the package object | ||
516 | - * that represents _HID. Since a new element was created by _HID, | ||
517 | - * remove the reference from the _CID package. | ||
518 | - */ | ||
519 | - acpi_ut_remove_reference(original_element); | ||
520 | } | ||
521 | |||
522 | element_ptr++; | ||
523 | diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c | ||
524 | index 038db94216a91..454f9d7d42fe1 100644 | ||
525 | --- a/drivers/ata/libata-sff.c | ||
526 | +++ b/drivers/ata/libata-sff.c | ||
527 | @@ -641,6 +641,20 @@ unsigned int ata_sff_data_xfer32(struct ata_queued_cmd *qc, unsigned char *buf, | ||
528 | } | ||
529 | EXPORT_SYMBOL_GPL(ata_sff_data_xfer32); | ||
530 | |||
531 | +static void ata_pio_xfer(struct ata_queued_cmd *qc, struct page *page, | ||
532 | + unsigned int offset, size_t xfer_size) | ||
533 | +{ | ||
534 | + bool do_write = (qc->tf.flags & ATA_TFLAG_WRITE); | ||
535 | + unsigned char *buf; | ||
536 | + | ||
537 | + buf = kmap_atomic(page); | ||
538 | + qc->ap->ops->sff_data_xfer(qc, buf + offset, xfer_size, do_write); | ||
539 | + kunmap_atomic(buf); | ||
540 | + | ||
541 | + if (!do_write && !PageSlab(page)) | ||
542 | + flush_dcache_page(page); | ||
543 | +} | ||
544 | + | ||
545 | /** | ||
546 | * ata_pio_sector - Transfer a sector of data. | ||
547 | * @qc: Command on going | ||
548 | @@ -652,11 +666,9 @@ EXPORT_SYMBOL_GPL(ata_sff_data_xfer32); | ||
549 | */ | ||
550 | static void ata_pio_sector(struct ata_queued_cmd *qc) | ||
551 | { | ||
552 | - int do_write = (qc->tf.flags & ATA_TFLAG_WRITE); | ||
553 | struct ata_port *ap = qc->ap; | ||
554 | struct page *page; | ||
555 | unsigned int offset; | ||
556 | - unsigned char *buf; | ||
557 | |||
558 | if (!qc->cursg) { | ||
559 | qc->curbytes = qc->nbytes; | ||
560 | @@ -674,13 +686,20 @@ static void ata_pio_sector(struct ata_queued_cmd *qc) | ||
561 | |||
562 | DPRINTK("data %s\n", qc->tf.flags & ATA_TFLAG_WRITE ? "write" : "read"); | ||
563 | |||
564 | - /* do the actual data transfer */ | ||
565 | - buf = kmap_atomic(page); | ||
566 | - ap->ops->sff_data_xfer(qc, buf + offset, qc->sect_size, do_write); | ||
567 | - kunmap_atomic(buf); | ||
568 | + /* | ||
569 | + * Split the transfer when it splits a page boundary. Note that the | ||
570 | + * split still has to be dword aligned like all ATA data transfers. | ||
571 | + */ | ||
572 | + WARN_ON_ONCE(offset % 4); | ||
573 | + if (offset + qc->sect_size > PAGE_SIZE) { | ||
574 | + unsigned int split_len = PAGE_SIZE - offset; | ||
575 | |||
576 | - if (!do_write && !PageSlab(page)) | ||
577 | - flush_dcache_page(page); | ||
578 | + ata_pio_xfer(qc, page, offset, split_len); | ||
579 | + ata_pio_xfer(qc, nth_page(page, 1), 0, | ||
580 | + qc->sect_size - split_len); | ||
581 | + } else { | ||
582 | + ata_pio_xfer(qc, page, offset, qc->sect_size); | ||
583 | + } | ||
584 | |||
585 | qc->curbytes += qc->sect_size; | ||
586 | qc->cursg_ofs += qc->sect_size; | ||
587 | diff --git a/drivers/base/firmware_loader/fallback.c b/drivers/base/firmware_loader/fallback.c | ||
588 | index 70efbb22dfc30..5f3e5d8372590 100644 | ||
589 | --- a/drivers/base/firmware_loader/fallback.c | ||
590 | +++ b/drivers/base/firmware_loader/fallback.c | ||
591 | @@ -86,12 +86,11 @@ static void __fw_load_abort(struct fw_priv *fw_priv) | ||
592 | { | ||
593 | /* | ||
594 | * There is a small window in which user can write to 'loading' | ||
595 | - * between loading done and disappearance of 'loading' | ||
596 | + * between loading done/aborted and disappearance of 'loading' | ||
597 | */ | ||
598 | - if (fw_sysfs_done(fw_priv)) | ||
599 | + if (fw_state_is_aborted(fw_priv) || fw_sysfs_done(fw_priv)) | ||
600 | return; | ||
601 | |||
602 | - list_del_init(&fw_priv->pending_list); | ||
603 | fw_state_aborted(fw_priv); | ||
604 | } | ||
605 | |||
606 | @@ -277,7 +276,6 @@ static ssize_t firmware_loading_store(struct device *dev, | ||
607 | * Same logic as fw_load_abort, only the DONE bit | ||
608 | * is ignored and we set ABORT only on failure. | ||
609 | */ | ||
610 | - list_del_init(&fw_priv->pending_list); | ||
611 | if (rc) { | ||
612 | fw_state_aborted(fw_priv); | ||
613 | written = rc; | ||
614 | @@ -512,6 +510,11 @@ static int fw_load_sysfs_fallback(struct fw_sysfs *fw_sysfs, | ||
615 | } | ||
616 | |||
617 | mutex_lock(&fw_lock); | ||
618 | + if (fw_state_is_aborted(fw_priv)) { | ||
619 | + mutex_unlock(&fw_lock); | ||
620 | + retval = -EINTR; | ||
621 | + goto out; | ||
622 | + } | ||
623 | list_add(&fw_priv->pending_list, &pending_fw_head); | ||
624 | mutex_unlock(&fw_lock); | ||
625 | |||
626 | @@ -534,11 +537,10 @@ static int fw_load_sysfs_fallback(struct fw_sysfs *fw_sysfs, | ||
627 | if (fw_state_is_aborted(fw_priv)) { | ||
628 | if (retval == -ERESTARTSYS) | ||
629 | retval = -EINTR; | ||
630 | - else | ||
631 | - retval = -EAGAIN; | ||
632 | } else if (fw_priv->is_paged_buf && !fw_priv->data) | ||
633 | retval = -ENOMEM; | ||
634 | |||
635 | +out: | ||
636 | device_del(f_dev); | ||
637 | err_put_dev: | ||
638 | put_device(f_dev); | ||
639 | diff --git a/drivers/base/firmware_loader/firmware.h b/drivers/base/firmware_loader/firmware.h | ||
640 | index 9bef6c35f344a..ffb2a2724cc5a 100644 | ||
641 | --- a/drivers/base/firmware_loader/firmware.h | ||
642 | +++ b/drivers/base/firmware_loader/firmware.h | ||
643 | @@ -108,8 +108,16 @@ static inline void __fw_state_set(struct fw_priv *fw_priv, | ||
644 | |||
645 | WRITE_ONCE(fw_st->status, status); | ||
646 | |||
647 | - if (status == FW_STATUS_DONE || status == FW_STATUS_ABORTED) | ||
648 | + if (status == FW_STATUS_DONE || status == FW_STATUS_ABORTED) { | ||
649 | +#ifdef CONFIG_FW_LOADER_USER_HELPER | ||
650 | + /* | ||
651 | + * Doing this here ensures that the fw_priv is deleted from | ||
652 | + * the pending list in all abort/done paths. | ||
653 | + */ | ||
654 | + list_del_init(&fw_priv->pending_list); | ||
655 | +#endif | ||
656 | complete_all(&fw_st->completion); | ||
657 | + } | ||
658 | } | ||
659 | |||
660 | static inline void fw_state_aborted(struct fw_priv *fw_priv) | ||
661 | diff --git a/drivers/base/firmware_loader/main.c b/drivers/base/firmware_loader/main.c | ||
662 | index 95d21b4af9045..249349f64bfe9 100644 | ||
663 | --- a/drivers/base/firmware_loader/main.c | ||
664 | +++ b/drivers/base/firmware_loader/main.c | ||
665 | @@ -747,8 +747,10 @@ static void fw_abort_batch_reqs(struct firmware *fw) | ||
666 | return; | ||
667 | |||
668 | fw_priv = fw->priv; | ||
669 | + mutex_lock(&fw_lock); | ||
670 | if (!fw_state_is_aborted(fw_priv)) | ||
671 | fw_state_aborted(fw_priv); | ||
672 | + mutex_unlock(&fw_lock); | ||
673 | } | ||
674 | |||
675 | /* called from request_firmware() and request_firmware_work_func() */ | ||
676 | diff --git a/drivers/char/tpm/tpm_ftpm_tee.c b/drivers/char/tpm/tpm_ftpm_tee.c | ||
677 | index 22bf553ccf9df..69937be2032b1 100644 | ||
678 | --- a/drivers/char/tpm/tpm_ftpm_tee.c | ||
679 | +++ b/drivers/char/tpm/tpm_ftpm_tee.c | ||
680 | @@ -255,11 +255,11 @@ static int ftpm_tee_probe(struct platform_device *pdev) | ||
681 | pvt_data->session = sess_arg.session; | ||
682 | |||
683 | /* Allocate dynamic shared memory with fTPM TA */ | ||
684 | - pvt_data->shm = tee_shm_alloc(pvt_data->ctx, | ||
685 | - MAX_COMMAND_SIZE + MAX_RESPONSE_SIZE, | ||
686 | - TEE_SHM_MAPPED | TEE_SHM_DMA_BUF); | ||
687 | + pvt_data->shm = tee_shm_alloc_kernel_buf(pvt_data->ctx, | ||
688 | + MAX_COMMAND_SIZE + | ||
689 | + MAX_RESPONSE_SIZE); | ||
690 | if (IS_ERR(pvt_data->shm)) { | ||
691 | - dev_err(dev, "%s: tee_shm_alloc failed\n", __func__); | ||
692 | + dev_err(dev, "%s: tee_shm_alloc_kernel_buf failed\n", __func__); | ||
693 | rc = -ENOMEM; | ||
694 | goto out_shm_alloc; | ||
695 | } | ||
696 | diff --git a/drivers/clk/clk-devres.c b/drivers/clk/clk-devres.c | ||
697 | index be160764911bf..f9d5b73343417 100644 | ||
698 | --- a/drivers/clk/clk-devres.c | ||
699 | +++ b/drivers/clk/clk-devres.c | ||
700 | @@ -92,13 +92,20 @@ int __must_check devm_clk_bulk_get_optional(struct device *dev, int num_clks, | ||
701 | } | ||
702 | EXPORT_SYMBOL_GPL(devm_clk_bulk_get_optional); | ||
703 | |||
704 | +static void devm_clk_bulk_release_all(struct device *dev, void *res) | ||
705 | +{ | ||
706 | + struct clk_bulk_devres *devres = res; | ||
707 | + | ||
708 | + clk_bulk_put_all(devres->num_clks, devres->clks); | ||
709 | +} | ||
710 | + | ||
711 | int __must_check devm_clk_bulk_get_all(struct device *dev, | ||
712 | struct clk_bulk_data **clks) | ||
713 | { | ||
714 | struct clk_bulk_devres *devres; | ||
715 | int ret; | ||
716 | |||
717 | - devres = devres_alloc(devm_clk_bulk_release, | ||
718 | + devres = devres_alloc(devm_clk_bulk_release_all, | ||
719 | sizeof(*devres), GFP_KERNEL); | ||
720 | if (!devres) | ||
721 | return -ENOMEM; | ||
722 | diff --git a/drivers/clk/clk-stm32f4.c b/drivers/clk/clk-stm32f4.c | ||
723 | index 18117ce5ff85f..5c75e3d906c20 100644 | ||
724 | --- a/drivers/clk/clk-stm32f4.c | ||
725 | +++ b/drivers/clk/clk-stm32f4.c | ||
726 | @@ -526,7 +526,7 @@ struct stm32f4_pll { | ||
727 | |||
728 | struct stm32f4_pll_post_div_data { | ||
729 | int idx; | ||
730 | - u8 pll_num; | ||
731 | + int pll_idx; | ||
732 | const char *name; | ||
733 | const char *parent; | ||
734 | u8 flag; | ||
735 | @@ -557,13 +557,13 @@ static const struct clk_div_table post_divr_table[] = { | ||
736 | |||
737 | #define MAX_POST_DIV 3 | ||
738 | static const struct stm32f4_pll_post_div_data post_div_data[MAX_POST_DIV] = { | ||
739 | - { CLK_I2SQ_PDIV, PLL_I2S, "plli2s-q-div", "plli2s-q", | ||
740 | + { CLK_I2SQ_PDIV, PLL_VCO_I2S, "plli2s-q-div", "plli2s-q", | ||
741 | CLK_SET_RATE_PARENT, STM32F4_RCC_DCKCFGR, 0, 5, 0, NULL}, | ||
742 | |||
743 | - { CLK_SAIQ_PDIV, PLL_SAI, "pllsai-q-div", "pllsai-q", | ||
744 | + { CLK_SAIQ_PDIV, PLL_VCO_SAI, "pllsai-q-div", "pllsai-q", | ||
745 | CLK_SET_RATE_PARENT, STM32F4_RCC_DCKCFGR, 8, 5, 0, NULL }, | ||
746 | |||
747 | - { NO_IDX, PLL_SAI, "pllsai-r-div", "pllsai-r", CLK_SET_RATE_PARENT, | ||
748 | + { NO_IDX, PLL_VCO_SAI, "pllsai-r-div", "pllsai-r", CLK_SET_RATE_PARENT, | ||
749 | STM32F4_RCC_DCKCFGR, 16, 2, 0, post_divr_table }, | ||
750 | }; | ||
751 | |||
752 | @@ -1774,7 +1774,7 @@ static void __init stm32f4_rcc_init(struct device_node *np) | ||
753 | post_div->width, | ||
754 | post_div->flag_div, | ||
755 | post_div->div_table, | ||
756 | - clks[post_div->pll_num], | ||
757 | + clks[post_div->pll_idx], | ||
758 | &stm32f4_clk_lock); | ||
759 | |||
760 | if (post_div->idx != NO_IDX) | ||
761 | diff --git a/drivers/dma/imx-dma.c b/drivers/dma/imx-dma.c | ||
762 | index 5c0fb3134825f..5265182674eb7 100644 | ||
763 | --- a/drivers/dma/imx-dma.c | ||
764 | +++ b/drivers/dma/imx-dma.c | ||
765 | @@ -832,6 +832,8 @@ static struct dma_async_tx_descriptor *imxdma_prep_slave_sg( | ||
766 | dma_length += sg_dma_len(sg); | ||
767 | } | ||
768 | |||
769 | + imxdma_config_write(chan, &imxdmac->config, direction); | ||
770 | + | ||
771 | switch (imxdmac->word_size) { | ||
772 | case DMA_SLAVE_BUSWIDTH_4_BYTES: | ||
773 | if (sg_dma_len(sgl) & 3 || sgl->dma_address & 3) | ||
774 | diff --git a/drivers/gpio/gpio-tqmx86.c b/drivers/gpio/gpio-tqmx86.c | ||
775 | index a3109bcaa0ac2..09ca493b36176 100644 | ||
776 | --- a/drivers/gpio/gpio-tqmx86.c | ||
777 | +++ b/drivers/gpio/gpio-tqmx86.c | ||
778 | @@ -235,8 +235,8 @@ static int tqmx86_gpio_probe(struct platform_device *pdev) | ||
779 | struct resource *res; | ||
780 | int ret, irq; | ||
781 | |||
782 | - irq = platform_get_irq(pdev, 0); | ||
783 | - if (irq < 0) | ||
784 | + irq = platform_get_irq_optional(pdev, 0); | ||
785 | + if (irq < 0 && irq != -ENXIO) | ||
786 | return irq; | ||
787 | |||
788 | res = platform_get_resource(pdev, IORESOURCE_IO, 0); | ||
789 | @@ -275,7 +275,7 @@ static int tqmx86_gpio_probe(struct platform_device *pdev) | ||
790 | |||
791 | pm_runtime_enable(&pdev->dev); | ||
792 | |||
793 | - if (irq) { | ||
794 | + if (irq > 0) { | ||
795 | struct irq_chip *irq_chip = &gpio->irq_chip; | ||
796 | u8 irq_status; | ||
797 | |||
798 | diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c | ||
799 | index a715cb88052c2..e87184645c540 100644 | ||
800 | --- a/drivers/md/raid1.c | ||
801 | +++ b/drivers/md/raid1.c | ||
802 | @@ -452,8 +452,6 @@ static void raid1_end_write_request(struct bio *bio) | ||
803 | /* | ||
804 | * When the device is faulty, it is not necessary to | ||
805 | * handle write error. | ||
806 | - * For failfast, this is the only remaining device, | ||
807 | - * We need to retry the write without FailFast. | ||
808 | */ | ||
809 | if (!test_bit(Faulty, &rdev->flags)) | ||
810 | set_bit(R1BIO_WriteError, &r1_bio->state); | ||
811 | diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c | ||
812 | index a195a85cc366a..deddabfb07d79 100644 | ||
813 | --- a/drivers/md/raid10.c | ||
814 | +++ b/drivers/md/raid10.c | ||
815 | @@ -470,12 +470,12 @@ static void raid10_end_write_request(struct bio *bio) | ||
816 | /* | ||
817 | * When the device is faulty, it is not necessary to | ||
818 | * handle write error. | ||
819 | - * For failfast, this is the only remaining device, | ||
820 | - * We need to retry the write without FailFast. | ||
821 | */ | ||
822 | if (!test_bit(Faulty, &rdev->flags)) | ||
823 | set_bit(R10BIO_WriteError, &r10_bio->state); | ||
824 | else { | ||
825 | + /* Fail the request */ | ||
826 | + set_bit(R10BIO_Degraded, &r10_bio->state); | ||
827 | r10_bio->devs[slot].bio = NULL; | ||
828 | to_put = bio; | ||
829 | dec_rdev = 1; | ||
830 | diff --git a/drivers/media/common/videobuf2/videobuf2-core.c b/drivers/media/common/videobuf2/videobuf2-core.c | ||
831 | index 4489744fbbd95..13602939906fc 100644 | ||
832 | --- a/drivers/media/common/videobuf2/videobuf2-core.c | ||
833 | +++ b/drivers/media/common/videobuf2/videobuf2-core.c | ||
834 | @@ -1512,6 +1512,7 @@ int vb2_core_qbuf(struct vb2_queue *q, unsigned int index, void *pb, | ||
835 | struct media_request *req) | ||
836 | { | ||
837 | struct vb2_buffer *vb; | ||
838 | + enum vb2_buffer_state orig_state; | ||
839 | int ret; | ||
840 | |||
841 | if (q->error) { | ||
842 | @@ -1611,6 +1612,7 @@ int vb2_core_qbuf(struct vb2_queue *q, unsigned int index, void *pb, | ||
843 | * Add to the queued buffers list, a buffer will stay on it until | ||
844 | * dequeued in dqbuf. | ||
845 | */ | ||
846 | + orig_state = vb->state; | ||
847 | list_add_tail(&vb->queued_entry, &q->queued_list); | ||
848 | q->queued_count++; | ||
849 | q->waiting_for_buffers = false; | ||
850 | @@ -1641,8 +1643,17 @@ int vb2_core_qbuf(struct vb2_queue *q, unsigned int index, void *pb, | ||
851 | if (q->streaming && !q->start_streaming_called && | ||
852 | q->queued_count >= q->min_buffers_needed) { | ||
853 | ret = vb2_start_streaming(q); | ||
854 | - if (ret) | ||
855 | + if (ret) { | ||
856 | + /* | ||
857 | + * Since vb2_core_qbuf will return with an error, | ||
858 | + * we should return it to state DEQUEUED since | ||
859 | + * the error indicates that the buffer wasn't queued. | ||
860 | + */ | ||
861 | + list_del(&vb->queued_entry); | ||
862 | + q->queued_count--; | ||
863 | + vb->state = orig_state; | ||
864 | return ret; | ||
865 | + } | ||
866 | } | ||
867 | |||
868 | dprintk(2, "qbuf of buffer %d succeeded\n", vb->index); | ||
869 | diff --git a/drivers/media/usb/dvb-usb-v2/rtl28xxu.c b/drivers/media/usb/dvb-usb-v2/rtl28xxu.c | ||
870 | index 1a36bda285421..0fe71437601e7 100644 | ||
871 | --- a/drivers/media/usb/dvb-usb-v2/rtl28xxu.c | ||
872 | +++ b/drivers/media/usb/dvb-usb-v2/rtl28xxu.c | ||
873 | @@ -37,7 +37,16 @@ static int rtl28xxu_ctrl_msg(struct dvb_usb_device *d, struct rtl28xxu_req *req) | ||
874 | } else { | ||
875 | /* read */ | ||
876 | requesttype = (USB_TYPE_VENDOR | USB_DIR_IN); | ||
877 | - pipe = usb_rcvctrlpipe(d->udev, 0); | ||
878 | + | ||
879 | + /* | ||
880 | + * Zero-length transfers must use usb_sndctrlpipe() and | ||
881 | + * rtl28xxu_identify_state() uses a zero-length i2c read | ||
882 | + * command to determine the chip type. | ||
883 | + */ | ||
884 | + if (req->size) | ||
885 | + pipe = usb_rcvctrlpipe(d->udev, 0); | ||
886 | + else | ||
887 | + pipe = usb_sndctrlpipe(d->udev, 0); | ||
888 | } | ||
889 | |||
890 | ret = usb_control_msg(d->udev, pipe, 0, requesttype, req->value, | ||
891 | diff --git a/drivers/net/dsa/sja1105/sja1105_main.c b/drivers/net/dsa/sja1105/sja1105_main.c | ||
892 | index 034f1b50ab287..a07d8051ec3e8 100644 | ||
893 | --- a/drivers/net/dsa/sja1105/sja1105_main.c | ||
894 | +++ b/drivers/net/dsa/sja1105/sja1105_main.c | ||
895 | @@ -992,10 +992,11 @@ static int sja1105et_is_fdb_entry_in_bin(struct sja1105_private *priv, int bin, | ||
896 | int sja1105et_fdb_add(struct dsa_switch *ds, int port, | ||
897 | const unsigned char *addr, u16 vid) | ||
898 | { | ||
899 | - struct sja1105_l2_lookup_entry l2_lookup = {0}; | ||
900 | + struct sja1105_l2_lookup_entry l2_lookup = {0}, tmp; | ||
901 | struct sja1105_private *priv = ds->priv; | ||
902 | struct device *dev = ds->dev; | ||
903 | int last_unused = -1; | ||
904 | + int start, end, i; | ||
905 | int bin, way, rc; | ||
906 | |||
907 | bin = sja1105et_fdb_hash(priv, addr, vid); | ||
908 | @@ -1007,7 +1008,7 @@ int sja1105et_fdb_add(struct dsa_switch *ds, int port, | ||
909 | * mask? If yes, we need to do nothing. If not, we need | ||
910 | * to rewrite the entry by adding this port to it. | ||
911 | */ | ||
912 | - if (l2_lookup.destports & BIT(port)) | ||
913 | + if ((l2_lookup.destports & BIT(port)) && l2_lookup.lockeds) | ||
914 | return 0; | ||
915 | l2_lookup.destports |= BIT(port); | ||
916 | } else { | ||
917 | @@ -1038,6 +1039,7 @@ int sja1105et_fdb_add(struct dsa_switch *ds, int port, | ||
918 | index, NULL, false); | ||
919 | } | ||
920 | } | ||
921 | + l2_lookup.lockeds = true; | ||
922 | l2_lookup.index = sja1105et_fdb_index(bin, way); | ||
923 | |||
924 | rc = sja1105_dynamic_config_write(priv, BLK_IDX_L2_LOOKUP, | ||
925 | @@ -1046,6 +1048,29 @@ int sja1105et_fdb_add(struct dsa_switch *ds, int port, | ||
926 | if (rc < 0) | ||
927 | return rc; | ||
928 | |||
929 | + /* Invalidate a dynamically learned entry if that exists */ | ||
930 | + start = sja1105et_fdb_index(bin, 0); | ||
931 | + end = sja1105et_fdb_index(bin, way); | ||
932 | + | ||
933 | + for (i = start; i < end; i++) { | ||
934 | + rc = sja1105_dynamic_config_read(priv, BLK_IDX_L2_LOOKUP, | ||
935 | + i, &tmp); | ||
936 | + if (rc == -ENOENT) | ||
937 | + continue; | ||
938 | + if (rc) | ||
939 | + return rc; | ||
940 | + | ||
941 | + if (tmp.macaddr != ether_addr_to_u64(addr) || tmp.vlanid != vid) | ||
942 | + continue; | ||
943 | + | ||
944 | + rc = sja1105_dynamic_config_write(priv, BLK_IDX_L2_LOOKUP, | ||
945 | + i, NULL, false); | ||
946 | + if (rc) | ||
947 | + return rc; | ||
948 | + | ||
949 | + break; | ||
950 | + } | ||
951 | + | ||
952 | return sja1105_static_fdb_change(priv, port, &l2_lookup, true); | ||
953 | } | ||
954 | |||
955 | @@ -1087,7 +1112,7 @@ int sja1105et_fdb_del(struct dsa_switch *ds, int port, | ||
956 | int sja1105pqrs_fdb_add(struct dsa_switch *ds, int port, | ||
957 | const unsigned char *addr, u16 vid) | ||
958 | { | ||
959 | - struct sja1105_l2_lookup_entry l2_lookup = {0}; | ||
960 | + struct sja1105_l2_lookup_entry l2_lookup = {0}, tmp; | ||
961 | struct sja1105_private *priv = ds->priv; | ||
962 | int rc, i; | ||
963 | |||
964 | @@ -1108,10 +1133,10 @@ int sja1105pqrs_fdb_add(struct dsa_switch *ds, int port, | ||
965 | rc = sja1105_dynamic_config_read(priv, BLK_IDX_L2_LOOKUP, | ||
966 | SJA1105_SEARCH, &l2_lookup); | ||
967 | if (rc == 0) { | ||
968 | - /* Found and this port is already in the entry's | ||
969 | + /* Found a static entry and this port is already in the entry's | ||
970 | * port mask => job done | ||
971 | */ | ||
972 | - if (l2_lookup.destports & BIT(port)) | ||
973 | + if ((l2_lookup.destports & BIT(port)) && l2_lookup.lockeds) | ||
974 | return 0; | ||
975 | /* l2_lookup.index is populated by the switch in case it | ||
976 | * found something. | ||
977 | @@ -1134,16 +1159,46 @@ int sja1105pqrs_fdb_add(struct dsa_switch *ds, int port, | ||
978 | dev_err(ds->dev, "FDB is full, cannot add entry.\n"); | ||
979 | return -EINVAL; | ||
980 | } | ||
981 | - l2_lookup.lockeds = true; | ||
982 | l2_lookup.index = i; | ||
983 | |||
984 | skip_finding_an_index: | ||
985 | + l2_lookup.lockeds = true; | ||
986 | + | ||
987 | rc = sja1105_dynamic_config_write(priv, BLK_IDX_L2_LOOKUP, | ||
988 | l2_lookup.index, &l2_lookup, | ||
989 | true); | ||
990 | if (rc < 0) | ||
991 | return rc; | ||
992 | |||
993 | + /* The switch learns dynamic entries and looks up the FDB left to | ||
994 | + * right. It is possible that our addition was concurrent with the | ||
995 | + * dynamic learning of the same address, so now that the static entry | ||
996 | + * has been installed, we are certain that address learning for this | ||
997 | + * particular address has been turned off, so the dynamic entry either | ||
998 | + * is in the FDB at an index smaller than the static one, or isn't (it | ||
999 | + * can also be at a larger index, but in that case it is inactive | ||
1000 | + * because the static FDB entry will match first, and the dynamic one | ||
1001 | + * will eventually age out). Search for a dynamically learned address | ||
1002 | + * prior to our static one and invalidate it. | ||
1003 | + */ | ||
1004 | + tmp = l2_lookup; | ||
1005 | + | ||
1006 | + rc = sja1105_dynamic_config_read(priv, BLK_IDX_L2_LOOKUP, | ||
1007 | + SJA1105_SEARCH, &tmp); | ||
1008 | + if (rc < 0) { | ||
1009 | + dev_err(ds->dev, | ||
1010 | + "port %d failed to read back entry for %pM vid %d: %pe\n", | ||
1011 | + port, addr, vid, ERR_PTR(rc)); | ||
1012 | + return rc; | ||
1013 | + } | ||
1014 | + | ||
1015 | + if (tmp.index < l2_lookup.index) { | ||
1016 | + rc = sja1105_dynamic_config_write(priv, BLK_IDX_L2_LOOKUP, | ||
1017 | + tmp.index, NULL, false); | ||
1018 | + if (rc < 0) | ||
1019 | + return rc; | ||
1020 | + } | ||
1021 | + | ||
1022 | return sja1105_static_fdb_change(priv, port, &l2_lookup, true); | ||
1023 | } | ||
1024 | |||
1025 | diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | ||
1026 | index d10b421ed1f19..9af8afd7ae89d 100644 | ||
1027 | --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | ||
1028 | +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | ||
1029 | @@ -2666,7 +2666,8 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode) | ||
1030 | } | ||
1031 | |||
1032 | /* Allocated memory for FW statistics */ | ||
1033 | - if (bnx2x_alloc_fw_stats_mem(bp)) | ||
1034 | + rc = bnx2x_alloc_fw_stats_mem(bp); | ||
1035 | + if (rc) | ||
1036 | LOAD_ERROR_EXIT(bp, load_error0); | ||
1037 | |||
1038 | /* request pf to initialize status blocks */ | ||
1039 | diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c | ||
1040 | index b1856552ab813..a53c2d637a971 100644 | ||
1041 | --- a/drivers/net/ethernet/freescale/fec_main.c | ||
1042 | +++ b/drivers/net/ethernet/freescale/fec_main.c | ||
1043 | @@ -3781,13 +3781,13 @@ fec_drv_remove(struct platform_device *pdev) | ||
1044 | if (of_phy_is_fixed_link(np)) | ||
1045 | of_phy_deregister_fixed_link(np); | ||
1046 | of_node_put(fep->phy_node); | ||
1047 | - free_netdev(ndev); | ||
1048 | |||
1049 | clk_disable_unprepare(fep->clk_ahb); | ||
1050 | clk_disable_unprepare(fep->clk_ipg); | ||
1051 | pm_runtime_put_noidle(&pdev->dev); | ||
1052 | pm_runtime_disable(&pdev->dev); | ||
1053 | |||
1054 | + free_netdev(ndev); | ||
1055 | return 0; | ||
1056 | } | ||
1057 | |||
1058 | diff --git a/drivers/net/ethernet/natsemi/natsemi.c b/drivers/net/ethernet/natsemi/natsemi.c | ||
1059 | index 1a2634cbbb691..a653502c5d6f9 100644 | ||
1060 | --- a/drivers/net/ethernet/natsemi/natsemi.c | ||
1061 | +++ b/drivers/net/ethernet/natsemi/natsemi.c | ||
1062 | @@ -819,7 +819,7 @@ static int natsemi_probe1(struct pci_dev *pdev, const struct pci_device_id *ent) | ||
1063 | printk(version); | ||
1064 | #endif | ||
1065 | |||
1066 | - i = pci_enable_device(pdev); | ||
1067 | + i = pcim_enable_device(pdev); | ||
1068 | if (i) return i; | ||
1069 | |||
1070 | /* natsemi has a non-standard PM control register | ||
1071 | @@ -852,7 +852,7 @@ static int natsemi_probe1(struct pci_dev *pdev, const struct pci_device_id *ent) | ||
1072 | ioaddr = ioremap(iostart, iosize); | ||
1073 | if (!ioaddr) { | ||
1074 | i = -ENOMEM; | ||
1075 | - goto err_ioremap; | ||
1076 | + goto err_pci_request_regions; | ||
1077 | } | ||
1078 | |||
1079 | /* Work around the dropped serial bit. */ | ||
1080 | @@ -974,9 +974,6 @@ static int natsemi_probe1(struct pci_dev *pdev, const struct pci_device_id *ent) | ||
1081 | err_register_netdev: | ||
1082 | iounmap(ioaddr); | ||
1083 | |||
1084 | - err_ioremap: | ||
1085 | - pci_release_regions(pdev); | ||
1086 | - | ||
1087 | err_pci_request_regions: | ||
1088 | free_netdev(dev); | ||
1089 | return i; | ||
1090 | @@ -3242,7 +3239,6 @@ static void natsemi_remove1(struct pci_dev *pdev) | ||
1091 | |||
1092 | NATSEMI_REMOVE_FILE(pdev, dspcfg_workaround); | ||
1093 | unregister_netdev (dev); | ||
1094 | - pci_release_regions (pdev); | ||
1095 | iounmap(ioaddr); | ||
1096 | free_netdev (dev); | ||
1097 | } | ||
1098 | diff --git a/drivers/net/ethernet/neterion/vxge/vxge-main.c b/drivers/net/ethernet/neterion/vxge/vxge-main.c | ||
1099 | index 1d334f2e0a568..607e2ff272dc0 100644 | ||
1100 | --- a/drivers/net/ethernet/neterion/vxge/vxge-main.c | ||
1101 | +++ b/drivers/net/ethernet/neterion/vxge/vxge-main.c | ||
1102 | @@ -3524,13 +3524,13 @@ static void vxge_device_unregister(struct __vxge_hw_device *hldev) | ||
1103 | |||
1104 | kfree(vdev->vpaths); | ||
1105 | |||
1106 | - /* we are safe to free it now */ | ||
1107 | - free_netdev(dev); | ||
1108 | - | ||
1109 | vxge_debug_init(vdev->level_trace, "%s: ethernet device unregistered", | ||
1110 | buf); | ||
1111 | vxge_debug_entryexit(vdev->level_trace, "%s: %s:%d Exiting...", buf, | ||
1112 | __func__, __LINE__); | ||
1113 | + | ||
1114 | + /* we are safe to free it now */ | ||
1115 | + free_netdev(dev); | ||
1116 | } | ||
1117 | |||
1118 | /* | ||
1119 | diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c b/drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c | ||
1120 | index 17b91ed39369c..2354dec994184 100644 | ||
1121 | --- a/drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c | ||
1122 | +++ b/drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c | ||
1123 | @@ -266,6 +266,8 @@ nfp_net_get_link_ksettings(struct net_device *netdev, | ||
1124 | |||
1125 | /* Init to unknowns */ | ||
1126 | ethtool_link_ksettings_add_link_mode(cmd, supported, FIBRE); | ||
1127 | + ethtool_link_ksettings_add_link_mode(cmd, supported, Pause); | ||
1128 | + ethtool_link_ksettings_add_link_mode(cmd, advertising, Pause); | ||
1129 | cmd->base.port = PORT_OTHER; | ||
1130 | cmd->base.speed = SPEED_UNKNOWN; | ||
1131 | cmd->base.duplex = DUPLEX_UNKNOWN; | ||
1132 | diff --git a/drivers/net/ethernet/qlogic/qla3xxx.c b/drivers/net/ethernet/qlogic/qla3xxx.c | ||
1133 | index 5dc36c51636c4..6ca2216e40585 100644 | ||
1134 | --- a/drivers/net/ethernet/qlogic/qla3xxx.c | ||
1135 | +++ b/drivers/net/ethernet/qlogic/qla3xxx.c | ||
1136 | @@ -155,7 +155,7 @@ static int ql_wait_for_drvr_lock(struct ql3_adapter *qdev) | ||
1137 | "driver lock acquired\n"); | ||
1138 | return 1; | ||
1139 | } | ||
1140 | - ssleep(1); | ||
1141 | + mdelay(1000); | ||
1142 | } while (++i < 10); | ||
1143 | |||
1144 | netdev_err(qdev->ndev, "Timed out waiting for driver lock...\n"); | ||
1145 | @@ -3291,7 +3291,7 @@ static int ql_adapter_reset(struct ql3_adapter *qdev) | ||
1146 | if ((value & ISP_CONTROL_SR) == 0) | ||
1147 | break; | ||
1148 | |||
1149 | - ssleep(1); | ||
1150 | + mdelay(1000); | ||
1151 | } while ((--max_wait_time)); | ||
1152 | |||
1153 | /* | ||
1154 | @@ -3327,7 +3327,7 @@ static int ql_adapter_reset(struct ql3_adapter *qdev) | ||
1155 | ispControlStatus); | ||
1156 | if ((value & ISP_CONTROL_FSR) == 0) | ||
1157 | break; | ||
1158 | - ssleep(1); | ||
1159 | + mdelay(1000); | ||
1160 | } while ((--max_wait_time)); | ||
1161 | } | ||
1162 | if (max_wait_time == 0) | ||
1163 | diff --git a/drivers/net/phy/micrel.c b/drivers/net/phy/micrel.c | ||
1164 | index 663c68ed6ef96..910ab2182158d 100644 | ||
1165 | --- a/drivers/net/phy/micrel.c | ||
1166 | +++ b/drivers/net/phy/micrel.c | ||
1167 | @@ -343,11 +343,11 @@ static int ksz8041_config_aneg(struct phy_device *phydev) | ||
1168 | } | ||
1169 | |||
1170 | static int ksz8051_ksz8795_match_phy_device(struct phy_device *phydev, | ||
1171 | - const u32 ksz_phy_id) | ||
1172 | + const bool ksz_8051) | ||
1173 | { | ||
1174 | int ret; | ||
1175 | |||
1176 | - if ((phydev->phy_id & MICREL_PHY_ID_MASK) != ksz_phy_id) | ||
1177 | + if ((phydev->phy_id & MICREL_PHY_ID_MASK) != PHY_ID_KSZ8051) | ||
1178 | return 0; | ||
1179 | |||
1180 | ret = phy_read(phydev, MII_BMSR); | ||
1181 | @@ -360,7 +360,7 @@ static int ksz8051_ksz8795_match_phy_device(struct phy_device *phydev, | ||
1182 | * the switch does not. | ||
1183 | */ | ||
1184 | ret &= BMSR_ERCAP; | ||
1185 | - if (ksz_phy_id == PHY_ID_KSZ8051) | ||
1186 | + if (ksz_8051) | ||
1187 | return ret; | ||
1188 | else | ||
1189 | return !ret; | ||
1190 | @@ -368,7 +368,7 @@ static int ksz8051_ksz8795_match_phy_device(struct phy_device *phydev, | ||
1191 | |||
1192 | static int ksz8051_match_phy_device(struct phy_device *phydev) | ||
1193 | { | ||
1194 | - return ksz8051_ksz8795_match_phy_device(phydev, PHY_ID_KSZ8051); | ||
1195 | + return ksz8051_ksz8795_match_phy_device(phydev, true); | ||
1196 | } | ||
1197 | |||
1198 | static int ksz8081_config_init(struct phy_device *phydev) | ||
1199 | @@ -396,7 +396,7 @@ static int ksz8061_config_init(struct phy_device *phydev) | ||
1200 | |||
1201 | static int ksz8795_match_phy_device(struct phy_device *phydev) | ||
1202 | { | ||
1203 | - return ksz8051_ksz8795_match_phy_device(phydev, PHY_ID_KSZ87XX); | ||
1204 | + return ksz8051_ksz8795_match_phy_device(phydev, false); | ||
1205 | } | ||
1206 | |||
1207 | static int ksz9021_load_values_from_of(struct phy_device *phydev, | ||
1208 | diff --git a/drivers/net/usb/pegasus.c b/drivers/net/usb/pegasus.c | ||
1209 | index f7d117d80cfbb..b744c09346a7c 100644 | ||
1210 | --- a/drivers/net/usb/pegasus.c | ||
1211 | +++ b/drivers/net/usb/pegasus.c | ||
1212 | @@ -747,12 +747,16 @@ static inline void disable_net_traffic(pegasus_t *pegasus) | ||
1213 | set_registers(pegasus, EthCtrl0, sizeof(tmp), &tmp); | ||
1214 | } | ||
1215 | |||
1216 | -static inline void get_interrupt_interval(pegasus_t *pegasus) | ||
1217 | +static inline int get_interrupt_interval(pegasus_t *pegasus) | ||
1218 | { | ||
1219 | u16 data; | ||
1220 | u8 interval; | ||
1221 | + int ret; | ||
1222 | + | ||
1223 | + ret = read_eprom_word(pegasus, 4, &data); | ||
1224 | + if (ret < 0) | ||
1225 | + return ret; | ||
1226 | |||
1227 | - read_eprom_word(pegasus, 4, &data); | ||
1228 | interval = data >> 8; | ||
1229 | if (pegasus->usb->speed != USB_SPEED_HIGH) { | ||
1230 | if (interval < 0x80) { | ||
1231 | @@ -767,6 +771,8 @@ static inline void get_interrupt_interval(pegasus_t *pegasus) | ||
1232 | } | ||
1233 | } | ||
1234 | pegasus->intr_interval = interval; | ||
1235 | + | ||
1236 | + return 0; | ||
1237 | } | ||
1238 | |||
1239 | static void set_carrier(struct net_device *net) | ||
1240 | @@ -1186,7 +1192,9 @@ static int pegasus_probe(struct usb_interface *intf, | ||
1241 | | NETIF_MSG_PROBE | NETIF_MSG_LINK); | ||
1242 | |||
1243 | pegasus->features = usb_dev_id[dev_index].private; | ||
1244 | - get_interrupt_interval(pegasus); | ||
1245 | + res = get_interrupt_interval(pegasus); | ||
1246 | + if (res) | ||
1247 | + goto out2; | ||
1248 | if (reset_mac(pegasus)) { | ||
1249 | dev_err(&intf->dev, "can't reset MAC\n"); | ||
1250 | res = -EIO; | ||
1251 | diff --git a/drivers/net/wireless/virt_wifi.c b/drivers/net/wireless/virt_wifi.c | ||
1252 | index 9d04ca53229b5..4e906910f110b 100644 | ||
1253 | --- a/drivers/net/wireless/virt_wifi.c | ||
1254 | +++ b/drivers/net/wireless/virt_wifi.c | ||
1255 | @@ -136,6 +136,29 @@ static struct ieee80211_supported_band band_5ghz = { | ||
1256 | /* Assigned at module init. Guaranteed locally-administered and unicast. */ | ||
1257 | static u8 fake_router_bssid[ETH_ALEN] __ro_after_init = {}; | ||
1258 | |||
1259 | +static void virt_wifi_inform_bss(struct wiphy *wiphy) | ||
1260 | +{ | ||
1261 | + u64 tsf = div_u64(ktime_get_boottime_ns(), 1000); | ||
1262 | + struct cfg80211_bss *informed_bss; | ||
1263 | + static const struct { | ||
1264 | + u8 tag; | ||
1265 | + u8 len; | ||
1266 | + u8 ssid[8]; | ||
1267 | + } __packed ssid = { | ||
1268 | + .tag = WLAN_EID_SSID, | ||
1269 | + .len = 8, | ||
1270 | + .ssid = "VirtWifi", | ||
1271 | + }; | ||
1272 | + | ||
1273 | + informed_bss = cfg80211_inform_bss(wiphy, &channel_5ghz, | ||
1274 | + CFG80211_BSS_FTYPE_PRESP, | ||
1275 | + fake_router_bssid, tsf, | ||
1276 | + WLAN_CAPABILITY_ESS, 0, | ||
1277 | + (void *)&ssid, sizeof(ssid), | ||
1278 | + DBM_TO_MBM(-50), GFP_KERNEL); | ||
1279 | + cfg80211_put_bss(wiphy, informed_bss); | ||
1280 | +} | ||
1281 | + | ||
1282 | /* Called with the rtnl lock held. */ | ||
1283 | static int virt_wifi_scan(struct wiphy *wiphy, | ||
1284 | struct cfg80211_scan_request *request) | ||
1285 | @@ -156,28 +179,13 @@ static int virt_wifi_scan(struct wiphy *wiphy, | ||
1286 | /* Acquires and releases the rdev BSS lock. */ | ||
1287 | static void virt_wifi_scan_result(struct work_struct *work) | ||
1288 | { | ||
1289 | - struct { | ||
1290 | - u8 tag; | ||
1291 | - u8 len; | ||
1292 | - u8 ssid[8]; | ||
1293 | - } __packed ssid = { | ||
1294 | - .tag = WLAN_EID_SSID, .len = 8, .ssid = "VirtWifi", | ||
1295 | - }; | ||
1296 | - struct cfg80211_bss *informed_bss; | ||
1297 | struct virt_wifi_wiphy_priv *priv = | ||
1298 | container_of(work, struct virt_wifi_wiphy_priv, | ||
1299 | scan_result.work); | ||
1300 | struct wiphy *wiphy = priv_to_wiphy(priv); | ||
1301 | struct cfg80211_scan_info scan_info = { .aborted = false }; | ||
1302 | - u64 tsf = div_u64(ktime_get_boottime_ns(), 1000); | ||
1303 | |||
1304 | - informed_bss = cfg80211_inform_bss(wiphy, &channel_5ghz, | ||
1305 | - CFG80211_BSS_FTYPE_PRESP, | ||
1306 | - fake_router_bssid, tsf, | ||
1307 | - WLAN_CAPABILITY_ESS, 0, | ||
1308 | - (void *)&ssid, sizeof(ssid), | ||
1309 | - DBM_TO_MBM(-50), GFP_KERNEL); | ||
1310 | - cfg80211_put_bss(wiphy, informed_bss); | ||
1311 | + virt_wifi_inform_bss(wiphy); | ||
1312 | |||
1313 | /* Schedules work which acquires and releases the rtnl lock. */ | ||
1314 | cfg80211_scan_done(priv->scan_request, &scan_info); | ||
1315 | @@ -225,10 +233,12 @@ static int virt_wifi_connect(struct wiphy *wiphy, struct net_device *netdev, | ||
1316 | if (!could_schedule) | ||
1317 | return -EBUSY; | ||
1318 | |||
1319 | - if (sme->bssid) | ||
1320 | + if (sme->bssid) { | ||
1321 | ether_addr_copy(priv->connect_requested_bss, sme->bssid); | ||
1322 | - else | ||
1323 | + } else { | ||
1324 | + virt_wifi_inform_bss(wiphy); | ||
1325 | eth_zero_addr(priv->connect_requested_bss); | ||
1326 | + } | ||
1327 | |||
1328 | wiphy_debug(wiphy, "connect\n"); | ||
1329 | |||
1330 | @@ -241,11 +251,13 @@ static void virt_wifi_connect_complete(struct work_struct *work) | ||
1331 | struct virt_wifi_netdev_priv *priv = | ||
1332 | container_of(work, struct virt_wifi_netdev_priv, connect.work); | ||
1333 | u8 *requested_bss = priv->connect_requested_bss; | ||
1334 | - bool has_addr = !is_zero_ether_addr(requested_bss); | ||
1335 | bool right_addr = ether_addr_equal(requested_bss, fake_router_bssid); | ||
1336 | u16 status = WLAN_STATUS_SUCCESS; | ||
1337 | |||
1338 | - if (!priv->is_up || (has_addr && !right_addr)) | ||
1339 | + if (is_zero_ether_addr(requested_bss)) | ||
1340 | + requested_bss = NULL; | ||
1341 | + | ||
1342 | + if (!priv->is_up || (requested_bss && !right_addr)) | ||
1343 | status = WLAN_STATUS_UNSPECIFIED_FAILURE; | ||
1344 | else | ||
1345 | priv->is_connected = true; | ||
1346 | diff --git a/drivers/pcmcia/i82092.c b/drivers/pcmcia/i82092.c | ||
1347 | index 245d60189375a..7a43d4ca79292 100644 | ||
1348 | --- a/drivers/pcmcia/i82092.c | ||
1349 | +++ b/drivers/pcmcia/i82092.c | ||
1350 | @@ -106,6 +106,7 @@ static int i82092aa_pci_probe(struct pci_dev *dev, const struct pci_device_id *i | ||
1351 | for (i = 0;i<socket_count;i++) { | ||
1352 | sockets[i].card_state = 1; /* 1 = present but empty */ | ||
1353 | sockets[i].io_base = pci_resource_start(dev, 0); | ||
1354 | + sockets[i].dev = dev; | ||
1355 | sockets[i].socket.features |= SS_CAP_PCCARD; | ||
1356 | sockets[i].socket.map_size = 0x1000; | ||
1357 | sockets[i].socket.irq_mask = 0; | ||
1358 | diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c | ||
1359 | index 2332b245b182d..279dea628620d 100644 | ||
1360 | --- a/drivers/scsi/sr.c | ||
1361 | +++ b/drivers/scsi/sr.c | ||
1362 | @@ -219,7 +219,7 @@ static unsigned int sr_get_events(struct scsi_device *sdev) | ||
1363 | else if (med->media_event_code == 2) | ||
1364 | return DISK_EVENT_MEDIA_CHANGE; | ||
1365 | else if (med->media_event_code == 3) | ||
1366 | - return DISK_EVENT_EJECT_REQUEST; | ||
1367 | + return DISK_EVENT_MEDIA_CHANGE; | ||
1368 | return 0; | ||
1369 | } | ||
1370 | |||
1371 | diff --git a/drivers/soc/ixp4xx/ixp4xx-npe.c b/drivers/soc/ixp4xx/ixp4xx-npe.c | ||
1372 | index ec90b44fa0cd3..6065aaab67403 100644 | ||
1373 | --- a/drivers/soc/ixp4xx/ixp4xx-npe.c | ||
1374 | +++ b/drivers/soc/ixp4xx/ixp4xx-npe.c | ||
1375 | @@ -690,8 +690,8 @@ static int ixp4xx_npe_probe(struct platform_device *pdev) | ||
1376 | |||
1377 | if (!(ixp4xx_read_feature_bits() & | ||
1378 | (IXP4XX_FEATURE_RESET_NPEA << i))) { | ||
1379 | - dev_info(dev, "NPE%d at 0x%08x-0x%08x not available\n", | ||
1380 | - i, res->start, res->end); | ||
1381 | + dev_info(dev, "NPE%d at %pR not available\n", | ||
1382 | + i, res); | ||
1383 | continue; /* NPE already disabled or not present */ | ||
1384 | } | ||
1385 | npe->regs = devm_ioremap_resource(dev, res); | ||
1386 | @@ -699,13 +699,12 @@ static int ixp4xx_npe_probe(struct platform_device *pdev) | ||
1387 | return PTR_ERR(npe->regs); | ||
1388 | |||
1389 | if (npe_reset(npe)) { | ||
1390 | - dev_info(dev, "NPE%d at 0x%08x-0x%08x does not reset\n", | ||
1391 | - i, res->start, res->end); | ||
1392 | + dev_info(dev, "NPE%d at %pR does not reset\n", | ||
1393 | + i, res); | ||
1394 | continue; | ||
1395 | } | ||
1396 | npe->valid = 1; | ||
1397 | - dev_info(dev, "NPE%d at 0x%08x-0x%08x registered\n", | ||
1398 | - i, res->start, res->end); | ||
1399 | + dev_info(dev, "NPE%d at %pR registered\n", i, res); | ||
1400 | found++; | ||
1401 | } | ||
1402 | |||
1403 | diff --git a/drivers/soc/ixp4xx/ixp4xx-qmgr.c b/drivers/soc/ixp4xx/ixp4xx-qmgr.c | ||
1404 | index 8c968382cea76..065a800717bd5 100644 | ||
1405 | --- a/drivers/soc/ixp4xx/ixp4xx-qmgr.c | ||
1406 | +++ b/drivers/soc/ixp4xx/ixp4xx-qmgr.c | ||
1407 | @@ -145,12 +145,12 @@ static irqreturn_t qmgr_irq1_a0(int irq, void *pdev) | ||
1408 | /* ACK - it may clear any bits so don't rely on it */ | ||
1409 | __raw_writel(0xFFFFFFFF, &qmgr_regs->irqstat[0]); | ||
1410 | |||
1411 | - en_bitmap = qmgr_regs->irqen[0]; | ||
1412 | + en_bitmap = __raw_readl(&qmgr_regs->irqen[0]); | ||
1413 | while (en_bitmap) { | ||
1414 | i = __fls(en_bitmap); /* number of the last "low" queue */ | ||
1415 | en_bitmap &= ~BIT(i); | ||
1416 | - src = qmgr_regs->irqsrc[i >> 3]; | ||
1417 | - stat = qmgr_regs->stat1[i >> 3]; | ||
1418 | + src = __raw_readl(&qmgr_regs->irqsrc[i >> 3]); | ||
1419 | + stat = __raw_readl(&qmgr_regs->stat1[i >> 3]); | ||
1420 | if (src & 4) /* the IRQ condition is inverted */ | ||
1421 | stat = ~stat; | ||
1422 | if (stat & BIT(src & 3)) { | ||
1423 | @@ -170,7 +170,8 @@ static irqreturn_t qmgr_irq2_a0(int irq, void *pdev) | ||
1424 | /* ACK - it may clear any bits so don't rely on it */ | ||
1425 | __raw_writel(0xFFFFFFFF, &qmgr_regs->irqstat[1]); | ||
1426 | |||
1427 | - req_bitmap = qmgr_regs->irqen[1] & qmgr_regs->statne_h; | ||
1428 | + req_bitmap = __raw_readl(&qmgr_regs->irqen[1]) & | ||
1429 | + __raw_readl(&qmgr_regs->statne_h); | ||
1430 | while (req_bitmap) { | ||
1431 | i = __fls(req_bitmap); /* number of the last "high" queue */ | ||
1432 | req_bitmap &= ~BIT(i); | ||
1433 | diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c | ||
1434 | index e237481dbbbbf..474d5a7fa95e3 100644 | ||
1435 | --- a/drivers/spi/spi-imx.c | ||
1436 | +++ b/drivers/spi/spi-imx.c | ||
1437 | @@ -497,8 +497,10 @@ static int mx51_ecspi_prepare_message(struct spi_imx_data *spi_imx, | ||
1438 | struct spi_message *msg) | ||
1439 | { | ||
1440 | struct spi_device *spi = msg->spi; | ||
1441 | + struct spi_transfer *xfer; | ||
1442 | u32 ctrl = MX51_ECSPI_CTRL_ENABLE; | ||
1443 | - u32 testreg; | ||
1444 | + u32 min_speed_hz = ~0U; | ||
1445 | + u32 testreg, delay; | ||
1446 | u32 cfg = readl(spi_imx->base + MX51_ECSPI_CONFIG); | ||
1447 | |||
1448 | /* set Master or Slave mode */ | ||
1449 | @@ -559,6 +561,35 @@ static int mx51_ecspi_prepare_message(struct spi_imx_data *spi_imx, | ||
1450 | |||
1451 | writel(cfg, spi_imx->base + MX51_ECSPI_CONFIG); | ||
1452 | |||
1453 | + /* | ||
1454 | + * Wait until the changes in the configuration register CONFIGREG | ||
1455 | + * propagate into the hardware. It takes exactly one tick of the | ||
1456 | + * SCLK clock, but we will wait two SCLK clock just to be sure. The | ||
1457 | + * effect of the delay it takes for the hardware to apply changes | ||
1458 | + * is noticable if the SCLK clock run very slow. In such a case, if | ||
1459 | + * the polarity of SCLK should be inverted, the GPIO ChipSelect might | ||
1460 | + * be asserted before the SCLK polarity changes, which would disrupt | ||
1461 | + * the SPI communication as the device on the other end would consider | ||
1462 | + * the change of SCLK polarity as a clock tick already. | ||
1463 | + * | ||
1464 | + * Because spi_imx->spi_bus_clk is only set in bitbang prepare_message | ||
1465 | + * callback, iterate over all the transfers in spi_message, find the | ||
1466 | + * one with lowest bus frequency, and use that bus frequency for the | ||
1467 | + * delay calculation. In case all transfers have speed_hz == 0, then | ||
1468 | + * min_speed_hz is ~0 and the resulting delay is zero. | ||
1469 | + */ | ||
1470 | + list_for_each_entry(xfer, &msg->transfers, transfer_list) { | ||
1471 | + if (!xfer->speed_hz) | ||
1472 | + continue; | ||
1473 | + min_speed_hz = min(xfer->speed_hz, min_speed_hz); | ||
1474 | + } | ||
1475 | + | ||
1476 | + delay = (2 * 1000000) / min_speed_hz; | ||
1477 | + if (likely(delay < 10)) /* SCLK is faster than 100 kHz */ | ||
1478 | + udelay(delay); | ||
1479 | + else /* SCLK is _very_ slow */ | ||
1480 | + usleep_range(delay, delay + 10); | ||
1481 | + | ||
1482 | return 0; | ||
1483 | } | ||
1484 | |||
1485 | @@ -566,7 +597,7 @@ static int mx51_ecspi_prepare_transfer(struct spi_imx_data *spi_imx, | ||
1486 | struct spi_device *spi) | ||
1487 | { | ||
1488 | u32 ctrl = readl(spi_imx->base + MX51_ECSPI_CTRL); | ||
1489 | - u32 clk, delay; | ||
1490 | + u32 clk; | ||
1491 | |||
1492 | /* Clear BL field and set the right value */ | ||
1493 | ctrl &= ~MX51_ECSPI_CTRL_BL_MASK; | ||
1494 | @@ -588,23 +619,6 @@ static int mx51_ecspi_prepare_transfer(struct spi_imx_data *spi_imx, | ||
1495 | |||
1496 | writel(ctrl, spi_imx->base + MX51_ECSPI_CTRL); | ||
1497 | |||
1498 | - /* | ||
1499 | - * Wait until the changes in the configuration register CONFIGREG | ||
1500 | - * propagate into the hardware. It takes exactly one tick of the | ||
1501 | - * SCLK clock, but we will wait two SCLK clock just to be sure. The | ||
1502 | - * effect of the delay it takes for the hardware to apply changes | ||
1503 | - * is noticable if the SCLK clock run very slow. In such a case, if | ||
1504 | - * the polarity of SCLK should be inverted, the GPIO ChipSelect might | ||
1505 | - * be asserted before the SCLK polarity changes, which would disrupt | ||
1506 | - * the SPI communication as the device on the other end would consider | ||
1507 | - * the change of SCLK polarity as a clock tick already. | ||
1508 | - */ | ||
1509 | - delay = (2 * 1000000) / clk; | ||
1510 | - if (likely(delay < 10)) /* SCLK is faster than 100 kHz */ | ||
1511 | - udelay(delay); | ||
1512 | - else /* SCLK is _very_ slow */ | ||
1513 | - usleep_range(delay, delay + 10); | ||
1514 | - | ||
1515 | return 0; | ||
1516 | } | ||
1517 | |||
1518 | diff --git a/drivers/spi/spi-meson-spicc.c b/drivers/spi/spi-meson-spicc.c | ||
1519 | index f3f10443f9e26..3c841ae0a3e91 100644 | ||
1520 | --- a/drivers/spi/spi-meson-spicc.c | ||
1521 | +++ b/drivers/spi/spi-meson-spicc.c | ||
1522 | @@ -597,6 +597,8 @@ static int meson_spicc_remove(struct platform_device *pdev) | ||
1523 | |||
1524 | clk_disable_unprepare(spicc->core); | ||
1525 | |||
1526 | + spi_master_put(spicc->master); | ||
1527 | + | ||
1528 | return 0; | ||
1529 | } | ||
1530 | |||
1531 | diff --git a/drivers/staging/rtl8712/rtl8712_led.c b/drivers/staging/rtl8712/rtl8712_led.c | ||
1532 | index db99129d31695..4305178243891 100644 | ||
1533 | --- a/drivers/staging/rtl8712/rtl8712_led.c | ||
1534 | +++ b/drivers/staging/rtl8712/rtl8712_led.c | ||
1535 | @@ -1820,3 +1820,11 @@ void LedControl871x(struct _adapter *padapter, enum LED_CTL_MODE LedAction) | ||
1536 | break; | ||
1537 | } | ||
1538 | } | ||
1539 | + | ||
1540 | +void r8712_flush_led_works(struct _adapter *padapter) | ||
1541 | +{ | ||
1542 | + struct led_priv *pledpriv = &padapter->ledpriv; | ||
1543 | + | ||
1544 | + flush_work(&pledpriv->SwLed0.BlinkWorkItem); | ||
1545 | + flush_work(&pledpriv->SwLed1.BlinkWorkItem); | ||
1546 | +} | ||
1547 | diff --git a/drivers/staging/rtl8712/rtl871x_led.h b/drivers/staging/rtl8712/rtl871x_led.h | ||
1548 | index ee19c873cf010..2f0768132ad8f 100644 | ||
1549 | --- a/drivers/staging/rtl8712/rtl871x_led.h | ||
1550 | +++ b/drivers/staging/rtl8712/rtl871x_led.h | ||
1551 | @@ -112,6 +112,7 @@ struct led_priv { | ||
1552 | void r8712_InitSwLeds(struct _adapter *padapter); | ||
1553 | void r8712_DeInitSwLeds(struct _adapter *padapter); | ||
1554 | void LedControl871x(struct _adapter *padapter, enum LED_CTL_MODE LedAction); | ||
1555 | +void r8712_flush_led_works(struct _adapter *padapter); | ||
1556 | |||
1557 | #endif | ||
1558 | |||
1559 | diff --git a/drivers/staging/rtl8712/rtl871x_pwrctrl.c b/drivers/staging/rtl8712/rtl871x_pwrctrl.c | ||
1560 | index 23cff43437e21..cd6d9ff0bebca 100644 | ||
1561 | --- a/drivers/staging/rtl8712/rtl871x_pwrctrl.c | ||
1562 | +++ b/drivers/staging/rtl8712/rtl871x_pwrctrl.c | ||
1563 | @@ -224,3 +224,11 @@ void r8712_unregister_cmd_alive(struct _adapter *padapter) | ||
1564 | } | ||
1565 | mutex_unlock(&pwrctrl->mutex_lock); | ||
1566 | } | ||
1567 | + | ||
1568 | +void r8712_flush_rwctrl_works(struct _adapter *padapter) | ||
1569 | +{ | ||
1570 | + struct pwrctrl_priv *pwrctrl = &padapter->pwrctrlpriv; | ||
1571 | + | ||
1572 | + flush_work(&pwrctrl->SetPSModeWorkItem); | ||
1573 | + flush_work(&pwrctrl->rpwm_workitem); | ||
1574 | +} | ||
1575 | diff --git a/drivers/staging/rtl8712/rtl871x_pwrctrl.h b/drivers/staging/rtl8712/rtl871x_pwrctrl.h | ||
1576 | index dd5a79f90b1a6..6eee6f1bdba4d 100644 | ||
1577 | --- a/drivers/staging/rtl8712/rtl871x_pwrctrl.h | ||
1578 | +++ b/drivers/staging/rtl8712/rtl871x_pwrctrl.h | ||
1579 | @@ -111,5 +111,6 @@ void r8712_cpwm_int_hdl(struct _adapter *padapter, | ||
1580 | void r8712_set_ps_mode(struct _adapter *padapter, uint ps_mode, | ||
1581 | uint smart_ps); | ||
1582 | void r8712_set_rpwm(struct _adapter *padapter, u8 val8); | ||
1583 | +void r8712_flush_rwctrl_works(struct _adapter *padapter); | ||
1584 | |||
1585 | #endif /* __RTL871X_PWRCTRL_H_ */ | ||
1586 | diff --git a/drivers/staging/rtl8712/usb_intf.c b/drivers/staging/rtl8712/usb_intf.c | ||
1587 | index bc421925e84c2..49188ab046123 100644 | ||
1588 | --- a/drivers/staging/rtl8712/usb_intf.c | ||
1589 | +++ b/drivers/staging/rtl8712/usb_intf.c | ||
1590 | @@ -604,7 +604,8 @@ static void r871xu_dev_remove(struct usb_interface *pusb_intf) | ||
1591 | padapter->surprise_removed = true; | ||
1592 | if (pnetdev->reg_state != NETREG_UNINITIALIZED) | ||
1593 | unregister_netdev(pnetdev); /* will call netdev_close() */ | ||
1594 | - flush_scheduled_work(); | ||
1595 | + r8712_flush_rwctrl_works(padapter); | ||
1596 | + r8712_flush_led_works(padapter); | ||
1597 | udelay(1); | ||
1598 | /* Stop driver mlme relation timer */ | ||
1599 | r8712_stop_drv_timers(padapter); | ||
1600 | diff --git a/drivers/staging/rtl8723bs/hal/sdio_ops.c b/drivers/staging/rtl8723bs/hal/sdio_ops.c | ||
1601 | index 301d327d06244..e6ca03aa6830d 100644 | ||
1602 | --- a/drivers/staging/rtl8723bs/hal/sdio_ops.c | ||
1603 | +++ b/drivers/staging/rtl8723bs/hal/sdio_ops.c | ||
1604 | @@ -1033,6 +1033,8 @@ void sd_int_dpc(struct adapter *adapter) | ||
1605 | } else { | ||
1606 | rtw_c2h_wk_cmd(adapter, (u8 *)c2h_evt); | ||
1607 | } | ||
1608 | + } else { | ||
1609 | + kfree(c2h_evt); | ||
1610 | } | ||
1611 | } else { | ||
1612 | /* Error handling for malloc fail */ | ||
1613 | diff --git a/drivers/tee/optee/call.c b/drivers/tee/optee/call.c | ||
1614 | index ea79482ebda46..4b5069f88d786 100644 | ||
1615 | --- a/drivers/tee/optee/call.c | ||
1616 | +++ b/drivers/tee/optee/call.c | ||
1617 | @@ -407,11 +407,13 @@ void optee_enable_shm_cache(struct optee *optee) | ||
1618 | } | ||
1619 | |||
1620 | /** | ||
1621 | - * optee_disable_shm_cache() - Disables caching of some shared memory allocation | ||
1622 | - * in OP-TEE | ||
1623 | + * __optee_disable_shm_cache() - Disables caching of some shared memory | ||
1624 | + * allocation in OP-TEE | ||
1625 | * @optee: main service struct | ||
1626 | + * @is_mapped: true if the cached shared memory addresses were mapped by this | ||
1627 | + * kernel, are safe to dereference, and should be freed | ||
1628 | */ | ||
1629 | -void optee_disable_shm_cache(struct optee *optee) | ||
1630 | +static void __optee_disable_shm_cache(struct optee *optee, bool is_mapped) | ||
1631 | { | ||
1632 | struct optee_call_waiter w; | ||
1633 | |||
1634 | @@ -430,6 +432,13 @@ void optee_disable_shm_cache(struct optee *optee) | ||
1635 | if (res.result.status == OPTEE_SMC_RETURN_OK) { | ||
1636 | struct tee_shm *shm; | ||
1637 | |||
1638 | + /* | ||
1639 | + * Shared memory references that were not mapped by | ||
1640 | + * this kernel must be ignored to prevent a crash. | ||
1641 | + */ | ||
1642 | + if (!is_mapped) | ||
1643 | + continue; | ||
1644 | + | ||
1645 | shm = reg_pair_to_ptr(res.result.shm_upper32, | ||
1646 | res.result.shm_lower32); | ||
1647 | tee_shm_free(shm); | ||
1648 | @@ -440,6 +449,27 @@ void optee_disable_shm_cache(struct optee *optee) | ||
1649 | optee_cq_wait_final(&optee->call_queue, &w); | ||
1650 | } | ||
1651 | |||
1652 | +/** | ||
1653 | + * optee_disable_shm_cache() - Disables caching of mapped shared memory | ||
1654 | + * allocations in OP-TEE | ||
1655 | + * @optee: main service struct | ||
1656 | + */ | ||
1657 | +void optee_disable_shm_cache(struct optee *optee) | ||
1658 | +{ | ||
1659 | + return __optee_disable_shm_cache(optee, true); | ||
1660 | +} | ||
1661 | + | ||
1662 | +/** | ||
1663 | + * optee_disable_unmapped_shm_cache() - Disables caching of shared memory | ||
1664 | + * allocations in OP-TEE which are not | ||
1665 | + * currently mapped | ||
1666 | + * @optee: main service struct | ||
1667 | + */ | ||
1668 | +void optee_disable_unmapped_shm_cache(struct optee *optee) | ||
1669 | +{ | ||
1670 | + return __optee_disable_shm_cache(optee, false); | ||
1671 | +} | ||
1672 | + | ||
1673 | #define PAGELIST_ENTRIES_PER_PAGE \ | ||
1674 | ((OPTEE_MSG_NONCONTIG_PAGE_SIZE / sizeof(u64)) - 1) | ||
1675 | |||
1676 | diff --git a/drivers/tee/optee/core.c b/drivers/tee/optee/core.c | ||
1677 | index ba6cfba589a69..432dd38921dd9 100644 | ||
1678 | --- a/drivers/tee/optee/core.c | ||
1679 | +++ b/drivers/tee/optee/core.c | ||
1680 | @@ -628,6 +628,15 @@ static struct optee *optee_probe(struct device_node *np) | ||
1681 | optee->memremaped_shm = memremaped_shm; | ||
1682 | optee->pool = pool; | ||
1683 | |||
1684 | + /* | ||
1685 | + * Ensure that there are no pre-existing shm objects before enabling | ||
1686 | + * the shm cache so that there's no chance of receiving an invalid | ||
1687 | + * address during shutdown. This could occur, for example, if we're | ||
1688 | + * kexec booting from an older kernel that did not properly cleanup the | ||
1689 | + * shm cache. | ||
1690 | + */ | ||
1691 | + optee_disable_unmapped_shm_cache(optee); | ||
1692 | + | ||
1693 | optee_enable_shm_cache(optee); | ||
1694 | |||
1695 | if (optee->sec_caps & OPTEE_SMC_SEC_CAP_DYNAMIC_SHM) | ||
1696 | diff --git a/drivers/tee/optee/optee_private.h b/drivers/tee/optee/optee_private.h | ||
1697 | index d9c5037b4e03e..3eeaad2a28686 100644 | ||
1698 | --- a/drivers/tee/optee/optee_private.h | ||
1699 | +++ b/drivers/tee/optee/optee_private.h | ||
1700 | @@ -152,6 +152,7 @@ int optee_cancel_req(struct tee_context *ctx, u32 cancel_id, u32 session); | ||
1701 | |||
1702 | void optee_enable_shm_cache(struct optee *optee); | ||
1703 | void optee_disable_shm_cache(struct optee *optee); | ||
1704 | +void optee_disable_unmapped_shm_cache(struct optee *optee); | ||
1705 | |||
1706 | int optee_shm_register(struct tee_context *ctx, struct tee_shm *shm, | ||
1707 | struct page **pages, size_t num_pages, | ||
1708 | diff --git a/drivers/tee/optee/shm_pool.c b/drivers/tee/optee/shm_pool.c | ||
1709 | index d767eebf30bdd..da06ce9b9313e 100644 | ||
1710 | --- a/drivers/tee/optee/shm_pool.c | ||
1711 | +++ b/drivers/tee/optee/shm_pool.c | ||
1712 | @@ -32,8 +32,10 @@ static int pool_op_alloc(struct tee_shm_pool_mgr *poolm, | ||
1713 | struct page **pages; | ||
1714 | |||
1715 | pages = kcalloc(nr_pages, sizeof(pages), GFP_KERNEL); | ||
1716 | - if (!pages) | ||
1717 | - return -ENOMEM; | ||
1718 | + if (!pages) { | ||
1719 | + rc = -ENOMEM; | ||
1720 | + goto err; | ||
1721 | + } | ||
1722 | |||
1723 | for (i = 0; i < nr_pages; i++) { | ||
1724 | pages[i] = page; | ||
1725 | @@ -44,8 +46,14 @@ static int pool_op_alloc(struct tee_shm_pool_mgr *poolm, | ||
1726 | rc = optee_shm_register(shm->ctx, shm, pages, nr_pages, | ||
1727 | (unsigned long)shm->kaddr); | ||
1728 | kfree(pages); | ||
1729 | + if (rc) | ||
1730 | + goto err; | ||
1731 | } | ||
1732 | |||
1733 | + return 0; | ||
1734 | + | ||
1735 | +err: | ||
1736 | + __free_pages(page, order); | ||
1737 | return rc; | ||
1738 | } | ||
1739 | |||
1740 | diff --git a/drivers/tee/tee_shm.c b/drivers/tee/tee_shm.c | ||
1741 | index 09ddcd06c7152..1b4b4a1ba91d9 100644 | ||
1742 | --- a/drivers/tee/tee_shm.c | ||
1743 | +++ b/drivers/tee/tee_shm.c | ||
1744 | @@ -219,6 +219,24 @@ struct tee_shm *tee_shm_priv_alloc(struct tee_device *teedev, size_t size) | ||
1745 | } | ||
1746 | EXPORT_SYMBOL_GPL(tee_shm_priv_alloc); | ||
1747 | |||
1748 | +/** | ||
1749 | + * tee_shm_alloc_kernel_buf() - Allocate shared memory for kernel buffer | ||
1750 | + * @ctx: Context that allocates the shared memory | ||
1751 | + * @size: Requested size of shared memory | ||
1752 | + * | ||
1753 | + * The returned memory registered in secure world and is suitable to be | ||
1754 | + * passed as a memory buffer in parameter argument to | ||
1755 | + * tee_client_invoke_func(). The memory allocated is later freed with a | ||
1756 | + * call to tee_shm_free(). | ||
1757 | + * | ||
1758 | + * @returns a pointer to 'struct tee_shm' | ||
1759 | + */ | ||
1760 | +struct tee_shm *tee_shm_alloc_kernel_buf(struct tee_context *ctx, size_t size) | ||
1761 | +{ | ||
1762 | + return tee_shm_alloc(ctx, size, TEE_SHM_MAPPED | TEE_SHM_DMA_BUF); | ||
1763 | +} | ||
1764 | +EXPORT_SYMBOL_GPL(tee_shm_alloc_kernel_buf); | ||
1765 | + | ||
1766 | struct tee_shm *tee_shm_register(struct tee_context *ctx, unsigned long addr, | ||
1767 | size_t length, u32 flags) | ||
1768 | { | ||
1769 | diff --git a/drivers/tty/serial/8250/8250_mtk.c b/drivers/tty/serial/8250/8250_mtk.c | ||
1770 | index e9eb454c24728..98e68f25a5f34 100644 | ||
1771 | --- a/drivers/tty/serial/8250/8250_mtk.c | ||
1772 | +++ b/drivers/tty/serial/8250/8250_mtk.c | ||
1773 | @@ -92,10 +92,13 @@ static void mtk8250_dma_rx_complete(void *param) | ||
1774 | struct dma_tx_state state; | ||
1775 | int copied, total, cnt; | ||
1776 | unsigned char *ptr; | ||
1777 | + unsigned long flags; | ||
1778 | |||
1779 | if (data->rx_status == DMA_RX_SHUTDOWN) | ||
1780 | return; | ||
1781 | |||
1782 | + spin_lock_irqsave(&up->port.lock, flags); | ||
1783 | + | ||
1784 | dmaengine_tx_status(dma->rxchan, dma->rx_cookie, &state); | ||
1785 | total = dma->rx_size - state.residue; | ||
1786 | cnt = total; | ||
1787 | @@ -119,6 +122,8 @@ static void mtk8250_dma_rx_complete(void *param) | ||
1788 | tty_flip_buffer_push(tty_port); | ||
1789 | |||
1790 | mtk8250_rx_dma(up); | ||
1791 | + | ||
1792 | + spin_unlock_irqrestore(&up->port.lock, flags); | ||
1793 | } | ||
1794 | |||
1795 | static void mtk8250_rx_dma(struct uart_8250_port *up) | ||
1796 | diff --git a/drivers/tty/serial/8250/8250_pci.c b/drivers/tty/serial/8250/8250_pci.c | ||
1797 | index 51346ca91c45c..43fc5b6a25d35 100644 | ||
1798 | --- a/drivers/tty/serial/8250/8250_pci.c | ||
1799 | +++ b/drivers/tty/serial/8250/8250_pci.c | ||
1800 | @@ -3763,6 +3763,12 @@ static const struct pci_device_id blacklist[] = { | ||
1801 | { PCI_VDEVICE(INTEL, 0x0f0c), }, | ||
1802 | { PCI_VDEVICE(INTEL, 0x228a), }, | ||
1803 | { PCI_VDEVICE(INTEL, 0x228c), }, | ||
1804 | + { PCI_VDEVICE(INTEL, 0x4b96), }, | ||
1805 | + { PCI_VDEVICE(INTEL, 0x4b97), }, | ||
1806 | + { PCI_VDEVICE(INTEL, 0x4b98), }, | ||
1807 | + { PCI_VDEVICE(INTEL, 0x4b99), }, | ||
1808 | + { PCI_VDEVICE(INTEL, 0x4b9a), }, | ||
1809 | + { PCI_VDEVICE(INTEL, 0x4b9b), }, | ||
1810 | { PCI_VDEVICE(INTEL, 0x9ce3), }, | ||
1811 | { PCI_VDEVICE(INTEL, 0x9ce4), }, | ||
1812 | |||
1813 | @@ -3923,6 +3929,7 @@ pciserial_init_ports(struct pci_dev *dev, const struct pciserial_board *board) | ||
1814 | if (pci_match_id(pci_use_msi, dev)) { | ||
1815 | dev_dbg(&dev->dev, "Using MSI(-X) interrupts\n"); | ||
1816 | pci_set_master(dev); | ||
1817 | + uart.port.flags &= ~UPF_SHARE_IRQ; | ||
1818 | rc = pci_alloc_irq_vectors(dev, 1, 1, PCI_IRQ_ALL_TYPES); | ||
1819 | } else { | ||
1820 | dev_dbg(&dev->dev, "Using legacy interrupts\n"); | ||
1821 | diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c | ||
1822 | index 6e93aa3623d9b..8a7c6d65f10ef 100644 | ||
1823 | --- a/drivers/tty/serial/8250/8250_port.c | ||
1824 | +++ b/drivers/tty/serial/8250/8250_port.c | ||
1825 | @@ -314,7 +314,11 @@ static const struct serial8250_config uart_config[] = { | ||
1826 | /* Uart divisor latch read */ | ||
1827 | static int default_serial_dl_read(struct uart_8250_port *up) | ||
1828 | { | ||
1829 | - return serial_in(up, UART_DLL) | serial_in(up, UART_DLM) << 8; | ||
1830 | + /* Assign these in pieces to truncate any bits above 7. */ | ||
1831 | + unsigned char dll = serial_in(up, UART_DLL); | ||
1832 | + unsigned char dlm = serial_in(up, UART_DLM); | ||
1833 | + | ||
1834 | + return dll | dlm << 8; | ||
1835 | } | ||
1836 | |||
1837 | /* Uart divisor latch write */ | ||
1838 | @@ -1258,9 +1262,11 @@ static void autoconfig(struct uart_8250_port *up) | ||
1839 | serial_out(up, UART_LCR, 0); | ||
1840 | |||
1841 | serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO); | ||
1842 | - scratch = serial_in(up, UART_IIR) >> 6; | ||
1843 | |||
1844 | - switch (scratch) { | ||
1845 | + /* Assign this as it is to truncate any bits above 7. */ | ||
1846 | + scratch = serial_in(up, UART_IIR); | ||
1847 | + | ||
1848 | + switch (scratch >> 6) { | ||
1849 | case 0: | ||
1850 | autoconfig_8250(up); | ||
1851 | break; | ||
1852 | diff --git a/drivers/tty/serial/serial-tegra.c b/drivers/tty/serial/serial-tegra.c | ||
1853 | index 2007a40feef9d..64f18bf1e694a 100644 | ||
1854 | --- a/drivers/tty/serial/serial-tegra.c | ||
1855 | +++ b/drivers/tty/serial/serial-tegra.c | ||
1856 | @@ -1028,9 +1028,11 @@ static int tegra_uart_hw_init(struct tegra_uart_port *tup) | ||
1857 | |||
1858 | if (tup->cdata->fifo_mode_enable_status) { | ||
1859 | ret = tegra_uart_wait_fifo_mode_enabled(tup); | ||
1860 | - dev_err(tup->uport.dev, "FIFO mode not enabled\n"); | ||
1861 | - if (ret < 0) | ||
1862 | + if (ret < 0) { | ||
1863 | + dev_err(tup->uport.dev, | ||
1864 | + "Failed to enable FIFO mode: %d\n", ret); | ||
1865 | return ret; | ||
1866 | + } | ||
1867 | } else { | ||
1868 | /* | ||
1869 | * For all tegra devices (up to t210), there is a hardware | ||
1870 | diff --git a/drivers/usb/cdns3/ep0.c b/drivers/usb/cdns3/ep0.c | ||
1871 | index 666cebd9c5f29..390779e2294d9 100644 | ||
1872 | --- a/drivers/usb/cdns3/ep0.c | ||
1873 | +++ b/drivers/usb/cdns3/ep0.c | ||
1874 | @@ -736,6 +736,7 @@ static int cdns3_gadget_ep0_queue(struct usb_ep *ep, | ||
1875 | request->actual = 0; | ||
1876 | priv_dev->status_completion_no_call = true; | ||
1877 | priv_dev->pending_status_request = request; | ||
1878 | + usb_gadget_set_state(&priv_dev->gadget, USB_STATE_CONFIGURED); | ||
1879 | spin_unlock_irqrestore(&priv_dev->lock, flags); | ||
1880 | |||
1881 | /* | ||
1882 | diff --git a/drivers/usb/class/usbtmc.c b/drivers/usb/class/usbtmc.c | ||
1883 | index dcd7066ffba22..3922a6f8c50a6 100644 | ||
1884 | --- a/drivers/usb/class/usbtmc.c | ||
1885 | +++ b/drivers/usb/class/usbtmc.c | ||
1886 | @@ -2285,17 +2285,10 @@ static void usbtmc_interrupt(struct urb *urb) | ||
1887 | dev_err(dev, "overflow with length %d, actual length is %d\n", | ||
1888 | data->iin_wMaxPacketSize, urb->actual_length); | ||
1889 | /* fall through */ | ||
1890 | - case -ECONNRESET: | ||
1891 | - case -ENOENT: | ||
1892 | - case -ESHUTDOWN: | ||
1893 | - case -EILSEQ: | ||
1894 | - case -ETIME: | ||
1895 | - case -EPIPE: | ||
1896 | + default: | ||
1897 | /* urb terminated, clean up */ | ||
1898 | dev_dbg(dev, "urb terminated, status: %d\n", status); | ||
1899 | return; | ||
1900 | - default: | ||
1901 | - dev_err(dev, "unknown status received: %d\n", status); | ||
1902 | } | ||
1903 | exit: | ||
1904 | rv = usb_submit_urb(urb, GFP_ATOMIC); | ||
1905 | diff --git a/drivers/usb/common/usb-otg-fsm.c b/drivers/usb/common/usb-otg-fsm.c | ||
1906 | index 3740cf95560e9..0697fde51d00f 100644 | ||
1907 | --- a/drivers/usb/common/usb-otg-fsm.c | ||
1908 | +++ b/drivers/usb/common/usb-otg-fsm.c | ||
1909 | @@ -193,7 +193,11 @@ static void otg_start_hnp_polling(struct otg_fsm *fsm) | ||
1910 | if (!fsm->host_req_flag) | ||
1911 | return; | ||
1912 | |||
1913 | - INIT_DELAYED_WORK(&fsm->hnp_polling_work, otg_hnp_polling_work); | ||
1914 | + if (!fsm->hnp_work_inited) { | ||
1915 | + INIT_DELAYED_WORK(&fsm->hnp_polling_work, otg_hnp_polling_work); | ||
1916 | + fsm->hnp_work_inited = true; | ||
1917 | + } | ||
1918 | + | ||
1919 | schedule_delayed_work(&fsm->hnp_polling_work, | ||
1920 | msecs_to_jiffies(T_HOST_REQ_POLL)); | ||
1921 | } | ||
1922 | diff --git a/drivers/usb/gadget/function/f_hid.c b/drivers/usb/gadget/function/f_hid.c | ||
1923 | index 3d540b0d93687..e4d71410a4b1c 100644 | ||
1924 | --- a/drivers/usb/gadget/function/f_hid.c | ||
1925 | +++ b/drivers/usb/gadget/function/f_hid.c | ||
1926 | @@ -41,6 +41,7 @@ struct f_hidg { | ||
1927 | unsigned char bInterfaceSubClass; | ||
1928 | unsigned char bInterfaceProtocol; | ||
1929 | unsigned char protocol; | ||
1930 | + unsigned char idle; | ||
1931 | unsigned short report_desc_length; | ||
1932 | char *report_desc; | ||
1933 | unsigned short report_length; | ||
1934 | @@ -344,6 +345,11 @@ static ssize_t f_hidg_write(struct file *file, const char __user *buffer, | ||
1935 | |||
1936 | spin_lock_irqsave(&hidg->write_spinlock, flags); | ||
1937 | |||
1938 | + if (!hidg->req) { | ||
1939 | + spin_unlock_irqrestore(&hidg->write_spinlock, flags); | ||
1940 | + return -ESHUTDOWN; | ||
1941 | + } | ||
1942 | + | ||
1943 | #define WRITE_COND (!hidg->write_pending) | ||
1944 | try_again: | ||
1945 | /* write queue */ | ||
1946 | @@ -364,8 +370,14 @@ try_again: | ||
1947 | count = min_t(unsigned, count, hidg->report_length); | ||
1948 | |||
1949 | spin_unlock_irqrestore(&hidg->write_spinlock, flags); | ||
1950 | - status = copy_from_user(req->buf, buffer, count); | ||
1951 | |||
1952 | + if (!req) { | ||
1953 | + ERROR(hidg->func.config->cdev, "hidg->req is NULL\n"); | ||
1954 | + status = -ESHUTDOWN; | ||
1955 | + goto release_write_pending; | ||
1956 | + } | ||
1957 | + | ||
1958 | + status = copy_from_user(req->buf, buffer, count); | ||
1959 | if (status != 0) { | ||
1960 | ERROR(hidg->func.config->cdev, | ||
1961 | "copy_from_user error\n"); | ||
1962 | @@ -393,14 +405,17 @@ try_again: | ||
1963 | |||
1964 | spin_unlock_irqrestore(&hidg->write_spinlock, flags); | ||
1965 | |||
1966 | + if (!hidg->in_ep->enabled) { | ||
1967 | + ERROR(hidg->func.config->cdev, "in_ep is disabled\n"); | ||
1968 | + status = -ESHUTDOWN; | ||
1969 | + goto release_write_pending; | ||
1970 | + } | ||
1971 | + | ||
1972 | status = usb_ep_queue(hidg->in_ep, req, GFP_ATOMIC); | ||
1973 | - if (status < 0) { | ||
1974 | - ERROR(hidg->func.config->cdev, | ||
1975 | - "usb_ep_queue error on int endpoint %zd\n", status); | ||
1976 | + if (status < 0) | ||
1977 | goto release_write_pending; | ||
1978 | - } else { | ||
1979 | + else | ||
1980 | status = count; | ||
1981 | - } | ||
1982 | |||
1983 | return status; | ||
1984 | release_write_pending: | ||
1985 | @@ -529,6 +544,14 @@ static int hidg_setup(struct usb_function *f, | ||
1986 | goto respond; | ||
1987 | break; | ||
1988 | |||
1989 | + case ((USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8 | ||
1990 | + | HID_REQ_GET_IDLE): | ||
1991 | + VDBG(cdev, "get_idle\n"); | ||
1992 | + length = min_t(unsigned int, length, 1); | ||
1993 | + ((u8 *) req->buf)[0] = hidg->idle; | ||
1994 | + goto respond; | ||
1995 | + break; | ||
1996 | + | ||
1997 | case ((USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8 | ||
1998 | | HID_REQ_SET_REPORT): | ||
1999 | VDBG(cdev, "set_report | wLength=%d\n", ctrl->wLength); | ||
2000 | @@ -552,6 +575,14 @@ static int hidg_setup(struct usb_function *f, | ||
2001 | goto stall; | ||
2002 | break; | ||
2003 | |||
2004 | + case ((USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8 | ||
2005 | + | HID_REQ_SET_IDLE): | ||
2006 | + VDBG(cdev, "set_idle\n"); | ||
2007 | + length = 0; | ||
2008 | + hidg->idle = value >> 8; | ||
2009 | + goto respond; | ||
2010 | + break; | ||
2011 | + | ||
2012 | case ((USB_DIR_IN | USB_TYPE_STANDARD | USB_RECIP_INTERFACE) << 8 | ||
2013 | | USB_REQ_GET_DESCRIPTOR): | ||
2014 | switch (value >> 8) { | ||
2015 | @@ -779,6 +810,7 @@ static int hidg_bind(struct usb_configuration *c, struct usb_function *f) | ||
2016 | hidg_interface_desc.bInterfaceSubClass = hidg->bInterfaceSubClass; | ||
2017 | hidg_interface_desc.bInterfaceProtocol = hidg->bInterfaceProtocol; | ||
2018 | hidg->protocol = HID_REPORT_PROTOCOL; | ||
2019 | + hidg->idle = 1; | ||
2020 | hidg_ss_in_ep_desc.wMaxPacketSize = cpu_to_le16(hidg->report_length); | ||
2021 | hidg_ss_in_comp_desc.wBytesPerInterval = | ||
2022 | cpu_to_le16(hidg->report_length); | ||
2023 | diff --git a/drivers/usb/serial/ch341.c b/drivers/usb/serial/ch341.c | ||
2024 | index a82ba9cc0c724..e9c39a41faae9 100644 | ||
2025 | --- a/drivers/usb/serial/ch341.c | ||
2026 | +++ b/drivers/usb/serial/ch341.c | ||
2027 | @@ -678,6 +678,7 @@ static struct usb_serial_driver ch341_device = { | ||
2028 | .owner = THIS_MODULE, | ||
2029 | .name = "ch341-uart", | ||
2030 | }, | ||
2031 | + .bulk_in_size = 512, | ||
2032 | .id_table = id_table, | ||
2033 | .num_ports = 1, | ||
2034 | .open = ch341_open, | ||
2035 | diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c | ||
2036 | index 6bd1a2f6cbd0a..1ec623e46214b 100644 | ||
2037 | --- a/drivers/usb/serial/ftdi_sio.c | ||
2038 | +++ b/drivers/usb/serial/ftdi_sio.c | ||
2039 | @@ -219,6 +219,7 @@ static const struct usb_device_id id_table_combined[] = { | ||
2040 | { USB_DEVICE(FTDI_VID, FTDI_MTXORB_6_PID) }, | ||
2041 | { USB_DEVICE(FTDI_VID, FTDI_R2000KU_TRUE_RNG) }, | ||
2042 | { USB_DEVICE(FTDI_VID, FTDI_VARDAAN_PID) }, | ||
2043 | + { USB_DEVICE(FTDI_VID, FTDI_AUTO_M3_OP_COM_V2_PID) }, | ||
2044 | { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0100_PID) }, | ||
2045 | { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0101_PID) }, | ||
2046 | { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0102_PID) }, | ||
2047 | diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h | ||
2048 | index add602bebd820..755858ca20bac 100644 | ||
2049 | --- a/drivers/usb/serial/ftdi_sio_ids.h | ||
2050 | +++ b/drivers/usb/serial/ftdi_sio_ids.h | ||
2051 | @@ -159,6 +159,9 @@ | ||
2052 | /* Vardaan Enterprises Serial Interface VEUSB422R3 */ | ||
2053 | #define FTDI_VARDAAN_PID 0xF070 | ||
2054 | |||
2055 | +/* Auto-M3 Ltd. - OP-COM USB V2 - OBD interface Adapter */ | ||
2056 | +#define FTDI_AUTO_M3_OP_COM_V2_PID 0x4f50 | ||
2057 | + | ||
2058 | /* | ||
2059 | * Xsens Technologies BV products (http://www.xsens.com). | ||
2060 | */ | ||
2061 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c | ||
2062 | index d6d10ba1e1e80..793530f241ceb 100644 | ||
2063 | --- a/drivers/usb/serial/option.c | ||
2064 | +++ b/drivers/usb/serial/option.c | ||
2065 | @@ -1203,6 +1203,8 @@ static const struct usb_device_id option_ids[] = { | ||
2066 | .driver_info = NCTRL(2) | RSVD(3) }, | ||
2067 | { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1055, 0xff), /* Telit FN980 (PCIe) */ | ||
2068 | .driver_info = NCTRL(0) | RSVD(1) }, | ||
2069 | + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1056, 0xff), /* Telit FD980 */ | ||
2070 | + .driver_info = NCTRL(2) | RSVD(3) }, | ||
2071 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910), | ||
2072 | .driver_info = NCTRL(0) | RSVD(1) | RSVD(3) }, | ||
2073 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910_DUAL_MODEM), | ||
2074 | diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c | ||
2075 | index 4c37abe768512..9905720df9248 100644 | ||
2076 | --- a/fs/ext4/namei.c | ||
2077 | +++ b/fs/ext4/namei.c | ||
2078 | @@ -2407,7 +2407,7 @@ again: | ||
2079 | goto journal_error; | ||
2080 | err = ext4_handle_dirty_dx_node(handle, dir, | ||
2081 | frame->bh); | ||
2082 | - if (err) | ||
2083 | + if (restart || err) | ||
2084 | goto journal_error; | ||
2085 | } else { | ||
2086 | struct dx_root *dxroot; | ||
2087 | diff --git a/fs/pipe.c b/fs/pipe.c | ||
2088 | index 8a2ab2f974bd4..30a43b1956742 100644 | ||
2089 | --- a/fs/pipe.c | ||
2090 | +++ b/fs/pipe.c | ||
2091 | @@ -30,6 +30,21 @@ | ||
2092 | |||
2093 | #include "internal.h" | ||
2094 | |||
2095 | +/* | ||
2096 | + * New pipe buffers will be restricted to this size while the user is exceeding | ||
2097 | + * their pipe buffer quota. The general pipe use case needs at least two | ||
2098 | + * buffers: one for data yet to be read, and one for new data. If this is less | ||
2099 | + * than two, then a write to a non-empty pipe may block even if the pipe is not | ||
2100 | + * full. This can occur with GNU make jobserver or similar uses of pipes as | ||
2101 | + * semaphores: multiple processes may be waiting to write tokens back to the | ||
2102 | + * pipe before reading tokens: https://lore.kernel.org/lkml/1628086770.5rn8p04n6j.none@localhost/. | ||
2103 | + * | ||
2104 | + * Users can reduce their pipe buffers with F_SETPIPE_SZ below this at their | ||
2105 | + * own risk, namely: pipe writes to non-full pipes may block until the pipe is | ||
2106 | + * emptied. | ||
2107 | + */ | ||
2108 | +#define PIPE_MIN_DEF_BUFFERS 2 | ||
2109 | + | ||
2110 | /* | ||
2111 | * The max size that a non-root user is allowed to grow the pipe. Can | ||
2112 | * be set by root in /proc/sys/fs/pipe-max-size | ||
2113 | @@ -666,8 +681,8 @@ struct pipe_inode_info *alloc_pipe_info(void) | ||
2114 | user_bufs = account_pipe_buffers(user, 0, pipe_bufs); | ||
2115 | |||
2116 | if (too_many_pipe_buffers_soft(user_bufs) && is_unprivileged_user()) { | ||
2117 | - user_bufs = account_pipe_buffers(user, pipe_bufs, 1); | ||
2118 | - pipe_bufs = 1; | ||
2119 | + user_bufs = account_pipe_buffers(user, pipe_bufs, PIPE_MIN_DEF_BUFFERS); | ||
2120 | + pipe_bufs = PIPE_MIN_DEF_BUFFERS; | ||
2121 | } | ||
2122 | |||
2123 | if (too_many_pipe_buffers_hard(user_bufs) && is_unprivileged_user()) | ||
2124 | diff --git a/fs/reiserfs/stree.c b/fs/reiserfs/stree.c | ||
2125 | index 9e64e23014e8e..07d787145cc36 100644 | ||
2126 | --- a/fs/reiserfs/stree.c | ||
2127 | +++ b/fs/reiserfs/stree.c | ||
2128 | @@ -387,6 +387,24 @@ void pathrelse(struct treepath *search_path) | ||
2129 | search_path->path_length = ILLEGAL_PATH_ELEMENT_OFFSET; | ||
2130 | } | ||
2131 | |||
2132 | +static int has_valid_deh_location(struct buffer_head *bh, struct item_head *ih) | ||
2133 | +{ | ||
2134 | + struct reiserfs_de_head *deh; | ||
2135 | + int i; | ||
2136 | + | ||
2137 | + deh = B_I_DEH(bh, ih); | ||
2138 | + for (i = 0; i < ih_entry_count(ih); i++) { | ||
2139 | + if (deh_location(&deh[i]) > ih_item_len(ih)) { | ||
2140 | + reiserfs_warning(NULL, "reiserfs-5094", | ||
2141 | + "directory entry location seems wrong %h", | ||
2142 | + &deh[i]); | ||
2143 | + return 0; | ||
2144 | + } | ||
2145 | + } | ||
2146 | + | ||
2147 | + return 1; | ||
2148 | +} | ||
2149 | + | ||
2150 | static int is_leaf(char *buf, int blocksize, struct buffer_head *bh) | ||
2151 | { | ||
2152 | struct block_head *blkh; | ||
2153 | @@ -454,11 +472,14 @@ static int is_leaf(char *buf, int blocksize, struct buffer_head *bh) | ||
2154 | "(second one): %h", ih); | ||
2155 | return 0; | ||
2156 | } | ||
2157 | - if (is_direntry_le_ih(ih) && (ih_item_len(ih) < (ih_entry_count(ih) * IH_SIZE))) { | ||
2158 | - reiserfs_warning(NULL, "reiserfs-5093", | ||
2159 | - "item entry count seems wrong %h", | ||
2160 | - ih); | ||
2161 | - return 0; | ||
2162 | + if (is_direntry_le_ih(ih)) { | ||
2163 | + if (ih_item_len(ih) < (ih_entry_count(ih) * IH_SIZE)) { | ||
2164 | + reiserfs_warning(NULL, "reiserfs-5093", | ||
2165 | + "item entry count seems wrong %h", | ||
2166 | + ih); | ||
2167 | + return 0; | ||
2168 | + } | ||
2169 | + return has_valid_deh_location(bh, ih); | ||
2170 | } | ||
2171 | prev_location = ih_location(ih); | ||
2172 | } | ||
2173 | diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c | ||
2174 | index 1b9c7a387dc71..913f5af9bf248 100644 | ||
2175 | --- a/fs/reiserfs/super.c | ||
2176 | +++ b/fs/reiserfs/super.c | ||
2177 | @@ -2082,6 +2082,14 @@ static int reiserfs_fill_super(struct super_block *s, void *data, int silent) | ||
2178 | unlock_new_inode(root_inode); | ||
2179 | } | ||
2180 | |||
2181 | + if (!S_ISDIR(root_inode->i_mode) || !inode_get_bytes(root_inode) || | ||
2182 | + !root_inode->i_size) { | ||
2183 | + SWARN(silent, s, "", "corrupt root inode, run fsck"); | ||
2184 | + iput(root_inode); | ||
2185 | + errval = -EUCLEAN; | ||
2186 | + goto error; | ||
2187 | + } | ||
2188 | + | ||
2189 | s->s_root = d_make_root(root_inode); | ||
2190 | if (!s->s_root) | ||
2191 | goto error; | ||
2192 | diff --git a/include/linux/tee_drv.h b/include/linux/tee_drv.h | ||
2193 | index 7a03f68fb982d..91677f2fa2e8b 100644 | ||
2194 | --- a/include/linux/tee_drv.h | ||
2195 | +++ b/include/linux/tee_drv.h | ||
2196 | @@ -317,6 +317,7 @@ void *tee_get_drvdata(struct tee_device *teedev); | ||
2197 | * @returns a pointer to 'struct tee_shm' | ||
2198 | */ | ||
2199 | struct tee_shm *tee_shm_alloc(struct tee_context *ctx, size_t size, u32 flags); | ||
2200 | +struct tee_shm *tee_shm_alloc_kernel_buf(struct tee_context *ctx, size_t size); | ||
2201 | |||
2202 | /** | ||
2203 | * tee_shm_priv_alloc() - Allocate shared memory privately | ||
2204 | diff --git a/include/linux/usb/otg-fsm.h b/include/linux/usb/otg-fsm.h | ||
2205 | index e78eb577d0fa1..8ef7d148c1493 100644 | ||
2206 | --- a/include/linux/usb/otg-fsm.h | ||
2207 | +++ b/include/linux/usb/otg-fsm.h | ||
2208 | @@ -196,6 +196,7 @@ struct otg_fsm { | ||
2209 | struct mutex lock; | ||
2210 | u8 *host_req_flag; | ||
2211 | struct delayed_work hnp_polling_work; | ||
2212 | + bool hnp_work_inited; | ||
2213 | bool state_changed; | ||
2214 | }; | ||
2215 | |||
2216 | diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h | ||
2217 | index 325e8efb5b368..14d00cc10e22e 100644 | ||
2218 | --- a/include/net/bluetooth/hci_core.h | ||
2219 | +++ b/include/net/bluetooth/hci_core.h | ||
2220 | @@ -1056,6 +1056,7 @@ struct hci_dev *hci_alloc_dev(void); | ||
2221 | void hci_free_dev(struct hci_dev *hdev); | ||
2222 | int hci_register_dev(struct hci_dev *hdev); | ||
2223 | void hci_unregister_dev(struct hci_dev *hdev); | ||
2224 | +void hci_cleanup_dev(struct hci_dev *hdev); | ||
2225 | int hci_suspend_dev(struct hci_dev *hdev); | ||
2226 | int hci_resume_dev(struct hci_dev *hdev); | ||
2227 | int hci_reset_dev(struct hci_dev *hdev); | ||
2228 | diff --git a/include/net/ip6_route.h b/include/net/ip6_route.h | ||
2229 | index feeecbc80e727..2c739fc752e1a 100644 | ||
2230 | --- a/include/net/ip6_route.h | ||
2231 | +++ b/include/net/ip6_route.h | ||
2232 | @@ -263,7 +263,7 @@ int ip6_fragment(struct net *net, struct sock *sk, struct sk_buff *skb, | ||
2233 | |||
2234 | static inline unsigned int ip6_skb_dst_mtu(struct sk_buff *skb) | ||
2235 | { | ||
2236 | - int mtu; | ||
2237 | + unsigned int mtu; | ||
2238 | |||
2239 | struct ipv6_pinfo *np = skb->sk && !dev_recursion_level() ? | ||
2240 | inet6_sk(skb->sk) : NULL; | ||
2241 | diff --git a/kernel/time/timer.c b/kernel/time/timer.c | ||
2242 | index 87fa73cdb90f6..16a2b62f5f74c 100644 | ||
2243 | --- a/kernel/time/timer.c | ||
2244 | +++ b/kernel/time/timer.c | ||
2245 | @@ -1269,8 +1269,10 @@ static inline void timer_base_unlock_expiry(struct timer_base *base) | ||
2246 | static void timer_sync_wait_running(struct timer_base *base) | ||
2247 | { | ||
2248 | if (atomic_read(&base->timer_waiters)) { | ||
2249 | + raw_spin_unlock_irq(&base->lock); | ||
2250 | spin_unlock(&base->expiry_lock); | ||
2251 | spin_lock(&base->expiry_lock); | ||
2252 | + raw_spin_lock_irq(&base->lock); | ||
2253 | } | ||
2254 | } | ||
2255 | |||
2256 | @@ -1454,14 +1456,14 @@ static void expire_timers(struct timer_base *base, struct hlist_head *head) | ||
2257 | if (timer->flags & TIMER_IRQSAFE) { | ||
2258 | raw_spin_unlock(&base->lock); | ||
2259 | call_timer_fn(timer, fn, baseclk); | ||
2260 | - base->running_timer = NULL; | ||
2261 | raw_spin_lock(&base->lock); | ||
2262 | + base->running_timer = NULL; | ||
2263 | } else { | ||
2264 | raw_spin_unlock_irq(&base->lock); | ||
2265 | call_timer_fn(timer, fn, baseclk); | ||
2266 | + raw_spin_lock_irq(&base->lock); | ||
2267 | base->running_timer = NULL; | ||
2268 | timer_sync_wait_running(base); | ||
2269 | - raw_spin_lock_irq(&base->lock); | ||
2270 | } | ||
2271 | } | ||
2272 | } | ||
2273 | diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c | ||
2274 | index 553add1eb457f..db2b10c718ba2 100644 | ||
2275 | --- a/kernel/trace/trace_events_hist.c | ||
2276 | +++ b/kernel/trace/trace_events_hist.c | ||
2277 | @@ -3169,6 +3169,10 @@ static struct hist_field *parse_expr(struct hist_trigger_data *hist_data, | ||
2278 | |||
2279 | expr->operands[0] = operand1; | ||
2280 | expr->operands[1] = operand2; | ||
2281 | + | ||
2282 | + /* The operand sizes should be the same, so just pick one */ | ||
2283 | + expr->size = operand1->size; | ||
2284 | + | ||
2285 | expr->operator = field_op; | ||
2286 | expr->name = expr_str(expr, 0); | ||
2287 | expr->type = kstrdup(operand1->type, GFP_KERNEL); | ||
2288 | diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c | ||
2289 | index 21a7ea9b70c8a..83a07fca9000f 100644 | ||
2290 | --- a/net/bluetooth/hci_core.c | ||
2291 | +++ b/net/bluetooth/hci_core.c | ||
2292 | @@ -3393,14 +3393,10 @@ EXPORT_SYMBOL(hci_register_dev); | ||
2293 | /* Unregister HCI device */ | ||
2294 | void hci_unregister_dev(struct hci_dev *hdev) | ||
2295 | { | ||
2296 | - int id; | ||
2297 | - | ||
2298 | BT_DBG("%p name %s bus %d", hdev, hdev->name, hdev->bus); | ||
2299 | |||
2300 | hci_dev_set_flag(hdev, HCI_UNREGISTER); | ||
2301 | |||
2302 | - id = hdev->id; | ||
2303 | - | ||
2304 | write_lock(&hci_dev_list_lock); | ||
2305 | list_del(&hdev->list); | ||
2306 | write_unlock(&hci_dev_list_lock); | ||
2307 | @@ -3429,7 +3425,14 @@ void hci_unregister_dev(struct hci_dev *hdev) | ||
2308 | } | ||
2309 | |||
2310 | device_del(&hdev->dev); | ||
2311 | + /* Actual cleanup is deferred until hci_cleanup_dev(). */ | ||
2312 | + hci_dev_put(hdev); | ||
2313 | +} | ||
2314 | +EXPORT_SYMBOL(hci_unregister_dev); | ||
2315 | |||
2316 | +/* Cleanup HCI device */ | ||
2317 | +void hci_cleanup_dev(struct hci_dev *hdev) | ||
2318 | +{ | ||
2319 | debugfs_remove_recursive(hdev->debugfs); | ||
2320 | kfree_const(hdev->hw_info); | ||
2321 | kfree_const(hdev->fw_info); | ||
2322 | @@ -3452,11 +3455,8 @@ void hci_unregister_dev(struct hci_dev *hdev) | ||
2323 | hci_discovery_filter_clear(hdev); | ||
2324 | hci_dev_unlock(hdev); | ||
2325 | |||
2326 | - hci_dev_put(hdev); | ||
2327 | - | ||
2328 | - ida_simple_remove(&hci_index_ida, id); | ||
2329 | + ida_simple_remove(&hci_index_ida, hdev->id); | ||
2330 | } | ||
2331 | -EXPORT_SYMBOL(hci_unregister_dev); | ||
2332 | |||
2333 | /* Suspend HCI device */ | ||
2334 | int hci_suspend_dev(struct hci_dev *hdev) | ||
2335 | diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c | ||
2336 | index 8d2c26c4b6d3d..befab857a39be 100644 | ||
2337 | --- a/net/bluetooth/hci_sock.c | ||
2338 | +++ b/net/bluetooth/hci_sock.c | ||
2339 | @@ -59,6 +59,17 @@ struct hci_pinfo { | ||
2340 | char comm[TASK_COMM_LEN]; | ||
2341 | }; | ||
2342 | |||
2343 | +static struct hci_dev *hci_hdev_from_sock(struct sock *sk) | ||
2344 | +{ | ||
2345 | + struct hci_dev *hdev = hci_pi(sk)->hdev; | ||
2346 | + | ||
2347 | + if (!hdev) | ||
2348 | + return ERR_PTR(-EBADFD); | ||
2349 | + if (hci_dev_test_flag(hdev, HCI_UNREGISTER)) | ||
2350 | + return ERR_PTR(-EPIPE); | ||
2351 | + return hdev; | ||
2352 | +} | ||
2353 | + | ||
2354 | void hci_sock_set_flag(struct sock *sk, int nr) | ||
2355 | { | ||
2356 | set_bit(nr, &hci_pi(sk)->flags); | ||
2357 | @@ -752,19 +763,13 @@ void hci_sock_dev_event(struct hci_dev *hdev, int event) | ||
2358 | if (event == HCI_DEV_UNREG) { | ||
2359 | struct sock *sk; | ||
2360 | |||
2361 | - /* Detach sockets from device */ | ||
2362 | + /* Wake up sockets using this dead device */ | ||
2363 | read_lock(&hci_sk_list.lock); | ||
2364 | sk_for_each(sk, &hci_sk_list.head) { | ||
2365 | - lock_sock(sk); | ||
2366 | if (hci_pi(sk)->hdev == hdev) { | ||
2367 | - hci_pi(sk)->hdev = NULL; | ||
2368 | sk->sk_err = EPIPE; | ||
2369 | - sk->sk_state = BT_OPEN; | ||
2370 | sk->sk_state_change(sk); | ||
2371 | - | ||
2372 | - hci_dev_put(hdev); | ||
2373 | } | ||
2374 | - release_sock(sk); | ||
2375 | } | ||
2376 | read_unlock(&hci_sk_list.lock); | ||
2377 | } | ||
2378 | @@ -923,10 +928,10 @@ static int hci_sock_blacklist_del(struct hci_dev *hdev, void __user *arg) | ||
2379 | static int hci_sock_bound_ioctl(struct sock *sk, unsigned int cmd, | ||
2380 | unsigned long arg) | ||
2381 | { | ||
2382 | - struct hci_dev *hdev = hci_pi(sk)->hdev; | ||
2383 | + struct hci_dev *hdev = hci_hdev_from_sock(sk); | ||
2384 | |||
2385 | - if (!hdev) | ||
2386 | - return -EBADFD; | ||
2387 | + if (IS_ERR(hdev)) | ||
2388 | + return PTR_ERR(hdev); | ||
2389 | |||
2390 | if (hci_dev_test_flag(hdev, HCI_USER_CHANNEL)) | ||
2391 | return -EBUSY; | ||
2392 | @@ -1080,6 +1085,18 @@ static int hci_sock_bind(struct socket *sock, struct sockaddr *addr, | ||
2393 | |||
2394 | lock_sock(sk); | ||
2395 | |||
2396 | + /* Allow detaching from dead device and attaching to alive device, if | ||
2397 | + * the caller wants to re-bind (instead of close) this socket in | ||
2398 | + * response to hci_sock_dev_event(HCI_DEV_UNREG) notification. | ||
2399 | + */ | ||
2400 | + hdev = hci_pi(sk)->hdev; | ||
2401 | + if (hdev && hci_dev_test_flag(hdev, HCI_UNREGISTER)) { | ||
2402 | + hci_pi(sk)->hdev = NULL; | ||
2403 | + sk->sk_state = BT_OPEN; | ||
2404 | + hci_dev_put(hdev); | ||
2405 | + } | ||
2406 | + hdev = NULL; | ||
2407 | + | ||
2408 | if (sk->sk_state == BT_BOUND) { | ||
2409 | err = -EALREADY; | ||
2410 | goto done; | ||
2411 | @@ -1356,9 +1373,9 @@ static int hci_sock_getname(struct socket *sock, struct sockaddr *addr, | ||
2412 | |||
2413 | lock_sock(sk); | ||
2414 | |||
2415 | - hdev = hci_pi(sk)->hdev; | ||
2416 | - if (!hdev) { | ||
2417 | - err = -EBADFD; | ||
2418 | + hdev = hci_hdev_from_sock(sk); | ||
2419 | + if (IS_ERR(hdev)) { | ||
2420 | + err = PTR_ERR(hdev); | ||
2421 | goto done; | ||
2422 | } | ||
2423 | |||
2424 | @@ -1718,9 +1735,9 @@ static int hci_sock_sendmsg(struct socket *sock, struct msghdr *msg, | ||
2425 | goto done; | ||
2426 | } | ||
2427 | |||
2428 | - hdev = hci_pi(sk)->hdev; | ||
2429 | - if (!hdev) { | ||
2430 | - err = -EBADFD; | ||
2431 | + hdev = hci_hdev_from_sock(sk); | ||
2432 | + if (IS_ERR(hdev)) { | ||
2433 | + err = PTR_ERR(hdev); | ||
2434 | goto done; | ||
2435 | } | ||
2436 | |||
2437 | diff --git a/net/bluetooth/hci_sysfs.c b/net/bluetooth/hci_sysfs.c | ||
2438 | index 9874844a95a98..b69d88b88d2e4 100644 | ||
2439 | --- a/net/bluetooth/hci_sysfs.c | ||
2440 | +++ b/net/bluetooth/hci_sysfs.c | ||
2441 | @@ -83,6 +83,9 @@ void hci_conn_del_sysfs(struct hci_conn *conn) | ||
2442 | static void bt_host_release(struct device *dev) | ||
2443 | { | ||
2444 | struct hci_dev *hdev = to_hci_dev(dev); | ||
2445 | + | ||
2446 | + if (hci_dev_test_flag(hdev, HCI_UNREGISTER)) | ||
2447 | + hci_cleanup_dev(hdev); | ||
2448 | kfree(hdev); | ||
2449 | module_put(THIS_MODULE); | ||
2450 | } | ||
2451 | diff --git a/net/ipv4/tcp_offload.c b/net/ipv4/tcp_offload.c | ||
2452 | index e09147ac9a990..fc61cd3fea652 100644 | ||
2453 | --- a/net/ipv4/tcp_offload.c | ||
2454 | +++ b/net/ipv4/tcp_offload.c | ||
2455 | @@ -298,6 +298,9 @@ int tcp_gro_complete(struct sk_buff *skb) | ||
2456 | if (th->cwr) | ||
2457 | skb_shinfo(skb)->gso_type |= SKB_GSO_TCP_ECN; | ||
2458 | |||
2459 | + if (skb->encapsulation) | ||
2460 | + skb->inner_transport_header = skb->transport_header; | ||
2461 | + | ||
2462 | return 0; | ||
2463 | } | ||
2464 | EXPORT_SYMBOL(tcp_gro_complete); | ||
2465 | diff --git a/net/ipv4/udp_offload.c b/net/ipv4/udp_offload.c | ||
2466 | index c463eebdc8fe2..487a92d75c703 100644 | ||
2467 | --- a/net/ipv4/udp_offload.c | ||
2468 | +++ b/net/ipv4/udp_offload.c | ||
2469 | @@ -501,6 +501,10 @@ static int udp_gro_complete_segment(struct sk_buff *skb) | ||
2470 | |||
2471 | skb_shinfo(skb)->gso_segs = NAPI_GRO_CB(skb)->count; | ||
2472 | skb_shinfo(skb)->gso_type |= SKB_GSO_UDP_L4; | ||
2473 | + | ||
2474 | + if (skb->encapsulation) | ||
2475 | + skb->inner_transport_header = skb->transport_header; | ||
2476 | + | ||
2477 | return 0; | ||
2478 | } | ||
2479 | |||
2480 | diff --git a/net/sctp/auth.c b/net/sctp/auth.c | ||
2481 | index 7eced1e523a5e..3b2d0bd616dd4 100644 | ||
2482 | --- a/net/sctp/auth.c | ||
2483 | +++ b/net/sctp/auth.c | ||
2484 | @@ -863,14 +863,18 @@ int sctp_auth_set_key(struct sctp_endpoint *ep, | ||
2485 | memcpy(key->data, &auth_key->sca_key[0], auth_key->sca_keylength); | ||
2486 | cur_key->key = key; | ||
2487 | |||
2488 | - if (replace) { | ||
2489 | - list_del_init(&shkey->key_list); | ||
2490 | - sctp_auth_shkey_release(shkey); | ||
2491 | - if (asoc && asoc->active_key_id == auth_key->sca_keynumber) | ||
2492 | - sctp_auth_asoc_init_active_key(asoc, GFP_KERNEL); | ||
2493 | + if (!replace) { | ||
2494 | + list_add(&cur_key->key_list, sh_keys); | ||
2495 | + return 0; | ||
2496 | } | ||
2497 | + | ||
2498 | + list_del_init(&shkey->key_list); | ||
2499 | + sctp_auth_shkey_release(shkey); | ||
2500 | list_add(&cur_key->key_list, sh_keys); | ||
2501 | |||
2502 | + if (asoc && asoc->active_key_id == auth_key->sca_keynumber) | ||
2503 | + sctp_auth_asoc_init_active_key(asoc, GFP_KERNEL); | ||
2504 | + | ||
2505 | return 0; | ||
2506 | } | ||
2507 | |||
2508 | diff --git a/scripts/tracing/draw_functrace.py b/scripts/tracing/draw_functrace.py | ||
2509 | index 74f8aadfd4cbc..7011fbe003ff2 100755 | ||
2510 | --- a/scripts/tracing/draw_functrace.py | ||
2511 | +++ b/scripts/tracing/draw_functrace.py | ||
2512 | @@ -17,7 +17,7 @@ Usage: | ||
2513 | $ cat /sys/kernel/debug/tracing/trace_pipe > ~/raw_trace_func | ||
2514 | Wait some times but not too much, the script is a bit slow. | ||
2515 | Break the pipe (Ctrl + Z) | ||
2516 | - $ scripts/draw_functrace.py < raw_trace_func > draw_functrace | ||
2517 | + $ scripts/tracing/draw_functrace.py < ~/raw_trace_func > draw_functrace | ||
2518 | Then you have your drawn trace in draw_functrace | ||
2519 | """ | ||
2520 | |||
2521 | @@ -103,10 +103,10 @@ def parseLine(line): | ||
2522 | line = line.strip() | ||
2523 | if line.startswith("#"): | ||
2524 | raise CommentLineException | ||
2525 | - m = re.match("[^]]+?\\] +([0-9.]+): (\\w+) <-(\\w+)", line) | ||
2526 | + m = re.match("[^]]+?\\] +([a-z.]+) +([0-9.]+): (\\w+) <-(\\w+)", line) | ||
2527 | if m is None: | ||
2528 | raise BrokenLineException | ||
2529 | - return (m.group(1), m.group(2), m.group(3)) | ||
2530 | + return (m.group(2), m.group(3), m.group(4)) | ||
2531 | |||
2532 | |||
2533 | def main(): | ||
2534 | diff --git a/sound/core/seq/seq_ports.c b/sound/core/seq/seq_ports.c | ||
2535 | index 83be6b982a87c..97e8eb38b0961 100644 | ||
2536 | --- a/sound/core/seq/seq_ports.c | ||
2537 | +++ b/sound/core/seq/seq_ports.c | ||
2538 | @@ -514,10 +514,11 @@ static int check_and_subscribe_port(struct snd_seq_client *client, | ||
2539 | return err; | ||
2540 | } | ||
2541 | |||
2542 | -static void delete_and_unsubscribe_port(struct snd_seq_client *client, | ||
2543 | - struct snd_seq_client_port *port, | ||
2544 | - struct snd_seq_subscribers *subs, | ||
2545 | - bool is_src, bool ack) | ||
2546 | +/* called with grp->list_mutex held */ | ||
2547 | +static void __delete_and_unsubscribe_port(struct snd_seq_client *client, | ||
2548 | + struct snd_seq_client_port *port, | ||
2549 | + struct snd_seq_subscribers *subs, | ||
2550 | + bool is_src, bool ack) | ||
2551 | { | ||
2552 | struct snd_seq_port_subs_info *grp; | ||
2553 | struct list_head *list; | ||
2554 | @@ -525,7 +526,6 @@ static void delete_and_unsubscribe_port(struct snd_seq_client *client, | ||
2555 | |||
2556 | grp = is_src ? &port->c_src : &port->c_dest; | ||
2557 | list = is_src ? &subs->src_list : &subs->dest_list; | ||
2558 | - down_write(&grp->list_mutex); | ||
2559 | write_lock_irq(&grp->list_lock); | ||
2560 | empty = list_empty(list); | ||
2561 | if (!empty) | ||
2562 | @@ -535,6 +535,18 @@ static void delete_and_unsubscribe_port(struct snd_seq_client *client, | ||
2563 | |||
2564 | if (!empty) | ||
2565 | unsubscribe_port(client, port, grp, &subs->info, ack); | ||
2566 | +} | ||
2567 | + | ||
2568 | +static void delete_and_unsubscribe_port(struct snd_seq_client *client, | ||
2569 | + struct snd_seq_client_port *port, | ||
2570 | + struct snd_seq_subscribers *subs, | ||
2571 | + bool is_src, bool ack) | ||
2572 | +{ | ||
2573 | + struct snd_seq_port_subs_info *grp; | ||
2574 | + | ||
2575 | + grp = is_src ? &port->c_src : &port->c_dest; | ||
2576 | + down_write(&grp->list_mutex); | ||
2577 | + __delete_and_unsubscribe_port(client, port, subs, is_src, ack); | ||
2578 | up_write(&grp->list_mutex); | ||
2579 | } | ||
2580 | |||
2581 | @@ -590,27 +602,30 @@ int snd_seq_port_disconnect(struct snd_seq_client *connector, | ||
2582 | struct snd_seq_client_port *dest_port, | ||
2583 | struct snd_seq_port_subscribe *info) | ||
2584 | { | ||
2585 | - struct snd_seq_port_subs_info *src = &src_port->c_src; | ||
2586 | + struct snd_seq_port_subs_info *dest = &dest_port->c_dest; | ||
2587 | struct snd_seq_subscribers *subs; | ||
2588 | int err = -ENOENT; | ||
2589 | |||
2590 | - down_write(&src->list_mutex); | ||
2591 | + /* always start from deleting the dest port for avoiding concurrent | ||
2592 | + * deletions | ||
2593 | + */ | ||
2594 | + down_write(&dest->list_mutex); | ||
2595 | /* look for the connection */ | ||
2596 | - list_for_each_entry(subs, &src->list_head, src_list) { | ||
2597 | + list_for_each_entry(subs, &dest->list_head, dest_list) { | ||
2598 | if (match_subs_info(info, &subs->info)) { | ||
2599 | - atomic_dec(&subs->ref_count); /* mark as not ready */ | ||
2600 | + __delete_and_unsubscribe_port(dest_client, dest_port, | ||
2601 | + subs, false, | ||
2602 | + connector->number != dest_client->number); | ||
2603 | err = 0; | ||
2604 | break; | ||
2605 | } | ||
2606 | } | ||
2607 | - up_write(&src->list_mutex); | ||
2608 | + up_write(&dest->list_mutex); | ||
2609 | if (err < 0) | ||
2610 | return err; | ||
2611 | |||
2612 | delete_and_unsubscribe_port(src_client, src_port, subs, true, | ||
2613 | connector->number != src_client->number); | ||
2614 | - delete_and_unsubscribe_port(dest_client, dest_port, subs, false, | ||
2615 | - connector->number != dest_client->number); | ||
2616 | kfree(subs); | ||
2617 | return 0; | ||
2618 | } | ||
2619 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c | ||
2620 | index f5606036b6a29..a0d1561eeb532 100644 | ||
2621 | --- a/sound/pci/hda/patch_realtek.c | ||
2622 | +++ b/sound/pci/hda/patch_realtek.c | ||
2623 | @@ -7971,6 +7971,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | ||
2624 | SND_PCI_QUIRK(0x1025, 0x1308, "Acer Aspire Z24-890", ALC286_FIXUP_ACER_AIO_HEADSET_MIC), | ||
2625 | SND_PCI_QUIRK(0x1025, 0x132a, "Acer TravelMate B114-21", ALC233_FIXUP_ACER_HEADSET_MIC), | ||
2626 | SND_PCI_QUIRK(0x1025, 0x1330, "Acer TravelMate X514-51T", ALC255_FIXUP_ACER_HEADSET_MIC), | ||
2627 | + SND_PCI_QUIRK(0x1025, 0x142b, "Acer Swift SF314-42", ALC255_FIXUP_ACER_MIC_NO_PRESENCE), | ||
2628 | SND_PCI_QUIRK(0x1025, 0x1430, "Acer TravelMate B311R-31", ALC256_FIXUP_ACER_MIC_NO_PRESENCE), | ||
2629 | SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z), | ||
2630 | SND_PCI_QUIRK(0x1028, 0x054b, "Dell XPS one 2710", ALC275_FIXUP_DELL_XPS), | ||
2631 | diff --git a/sound/usb/clock.c b/sound/usb/clock.c | ||
2632 | index 6a51b9d20eebf..3d1c0ec117536 100644 | ||
2633 | --- a/sound/usb/clock.c | ||
2634 | +++ b/sound/usb/clock.c | ||
2635 | @@ -319,6 +319,12 @@ static int __uac_clock_find_source(struct snd_usb_audio *chip, | ||
2636 | selector->baCSourceID[ret - 1], | ||
2637 | visited, validate); | ||
2638 | if (ret > 0) { | ||
2639 | + /* | ||
2640 | + * For Samsung USBC Headset (AKG), setting clock selector again | ||
2641 | + * will result in incorrect default clock setting problems | ||
2642 | + */ | ||
2643 | + if (chip->usb_id == USB_ID(0x04e8, 0xa051)) | ||
2644 | + return ret; | ||
2645 | err = uac_clock_selector_set_val(chip, entity_id, cur); | ||
2646 | if (err < 0) | ||
2647 | return err; | ||
2648 | diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c | ||
2649 | index 5b17a5c5785c0..4d20f3f45f7e2 100644 | ||
2650 | --- a/sound/usb/quirks.c | ||
2651 | +++ b/sound/usb/quirks.c | ||
2652 | @@ -1842,6 +1842,7 @@ static const struct registration_quirk registration_quirks[] = { | ||
2653 | REG_QUIRK_ENTRY(0x0951, 0x16ea, 2), /* Kingston HyperX Cloud Flight S */ | ||
2654 | REG_QUIRK_ENTRY(0x0ecb, 0x1f46, 2), /* JBL Quantum 600 */ | ||
2655 | REG_QUIRK_ENTRY(0x0ecb, 0x2039, 2), /* JBL Quantum 400 */ | ||
2656 | + REG_QUIRK_ENTRY(0x0ecb, 0x203c, 2), /* JBL Quantum 600 */ | ||
2657 | REG_QUIRK_ENTRY(0x0ecb, 0x203e, 2), /* JBL Quantum 800 */ | ||
2658 | { 0 } /* terminator */ | ||
2659 | }; | ||
2660 | diff --git a/tools/testing/selftests/bpf/verifier/stack_ptr.c b/tools/testing/selftests/bpf/verifier/stack_ptr.c | ||
2661 | index 7276620ef242a..53d2a5a5ec582 100644 | ||
2662 | --- a/tools/testing/selftests/bpf/verifier/stack_ptr.c | ||
2663 | +++ b/tools/testing/selftests/bpf/verifier/stack_ptr.c | ||
2664 | @@ -291,8 +291,6 @@ | ||
2665 | BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), | ||
2666 | BPF_EXIT_INSN(), | ||
2667 | }, | ||
2668 | - .result_unpriv = REJECT, | ||
2669 | - .errstr_unpriv = "invalid stack off=0 size=1", | ||
2670 | .result = ACCEPT, | ||
2671 | .retval = 42, | ||
2672 | }, | ||
2673 | diff --git a/tools/testing/selftests/bpf/verifier/value_ptr_arith.c b/tools/testing/selftests/bpf/verifier/value_ptr_arith.c | ||
2674 | index a8dab0f58462e..188ac92c56d1b 100644 | ||
2675 | --- a/tools/testing/selftests/bpf/verifier/value_ptr_arith.c | ||
2676 | +++ b/tools/testing/selftests/bpf/verifier/value_ptr_arith.c | ||
2677 | @@ -301,8 +301,6 @@ | ||
2678 | }, | ||
2679 | .fixup_map_array_48b = { 3 }, | ||
2680 | .result = ACCEPT, | ||
2681 | - .result_unpriv = REJECT, | ||
2682 | - .errstr_unpriv = "R0 pointer arithmetic of map value goes out of range", | ||
2683 | .retval = 1, | ||
2684 | }, | ||
2685 | { | ||
2686 | @@ -372,8 +370,6 @@ | ||
2687 | }, | ||
2688 | .fixup_map_array_48b = { 3 }, | ||
2689 | .result = ACCEPT, | ||
2690 | - .result_unpriv = REJECT, | ||
2691 | - .errstr_unpriv = "R0 pointer arithmetic of map value goes out of range", | ||
2692 | .retval = 1, | ||
2693 | }, | ||
2694 | { | ||
2695 | @@ -473,8 +469,6 @@ | ||
2696 | }, | ||
2697 | .fixup_map_array_48b = { 3 }, | ||
2698 | .result = ACCEPT, | ||
2699 | - .result_unpriv = REJECT, | ||
2700 | - .errstr_unpriv = "R0 pointer arithmetic of map value goes out of range", | ||
2701 | .retval = 1, | ||
2702 | }, | ||
2703 | { | ||
2704 | @@ -767,8 +761,6 @@ | ||
2705 | }, | ||
2706 | .fixup_map_array_48b = { 3 }, | ||
2707 | .result = ACCEPT, | ||
2708 | - .result_unpriv = REJECT, | ||
2709 | - .errstr_unpriv = "R0 pointer arithmetic of map value goes out of range", | ||
2710 | .retval = 1, | ||
2711 | }, | ||
2712 | { | ||
2713 | diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c | ||
2714 | index 862c0708f58df..fc48298649c6c 100644 | ||
2715 | --- a/virt/kvm/kvm_main.c | ||
2716 | +++ b/virt/kvm/kvm_main.c | ||
2717 | @@ -635,6 +635,8 @@ static void kvm_destroy_vm_debugfs(struct kvm *kvm) | ||
2718 | |||
2719 | static int kvm_create_vm_debugfs(struct kvm *kvm, int fd) | ||
2720 | { | ||
2721 | + static DEFINE_MUTEX(kvm_debugfs_lock); | ||
2722 | + struct dentry *dent; | ||
2723 | char dir_name[ITOA_MAX_LEN * 2]; | ||
2724 | struct kvm_stat_data *stat_data; | ||
2725 | struct kvm_stats_debugfs_item *p; | ||
2726 | @@ -643,8 +645,20 @@ static int kvm_create_vm_debugfs(struct kvm *kvm, int fd) | ||
2727 | return 0; | ||
2728 | |||
2729 | snprintf(dir_name, sizeof(dir_name), "%d-%d", task_pid_nr(current), fd); | ||
2730 | - kvm->debugfs_dentry = debugfs_create_dir(dir_name, kvm_debugfs_dir); | ||
2731 | + mutex_lock(&kvm_debugfs_lock); | ||
2732 | + dent = debugfs_lookup(dir_name, kvm_debugfs_dir); | ||
2733 | + if (dent) { | ||
2734 | + pr_warn_ratelimited("KVM: debugfs: duplicate directory %s\n", dir_name); | ||
2735 | + dput(dent); | ||
2736 | + mutex_unlock(&kvm_debugfs_lock); | ||
2737 | + return 0; | ||
2738 | + } | ||
2739 | + dent = debugfs_create_dir(dir_name, kvm_debugfs_dir); | ||
2740 | + mutex_unlock(&kvm_debugfs_lock); | ||
2741 | + if (IS_ERR(dent)) | ||
2742 | + return 0; | ||
2743 | |||
2744 | + kvm->debugfs_dentry = dent; | ||
2745 | kvm->debugfs_stat_data = kcalloc(kvm_debugfs_num_entries, | ||
2746 | sizeof(*kvm->debugfs_stat_data), | ||
2747 | GFP_KERNEL_ACCOUNT); | ||
2748 | @@ -4367,7 +4381,7 @@ static void kvm_uevent_notify_change(unsigned int type, struct kvm *kvm) | ||
2749 | } | ||
2750 | add_uevent_var(env, "PID=%d", kvm->userspace_pid); | ||
2751 | |||
2752 | - if (!IS_ERR_OR_NULL(kvm->debugfs_dentry)) { | ||
2753 | + if (kvm->debugfs_dentry) { | ||
2754 | char *tmp, *p = kmalloc(PATH_MAX, GFP_KERNEL_ACCOUNT); | ||
2755 | |||
2756 | if (p) { |