Contents of /trunk/kernel-alx/patches-5.4/0103-5.4.4-all-fixes.patch
Parent Directory | Revision Log
Revision 3484 -
(show annotations)
(download)
Mon May 11 14:35:59 2020 UTC (4 years, 1 month ago) by niro
File size: 216607 byte(s)
Mon May 11 14:35:59 2020 UTC (4 years, 1 month ago) by niro
File size: 216607 byte(s)
-linux-5.4.4
1 | diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt |
2 | index 9983ac73b66d..f5a551e4332d 100644 |
3 | --- a/Documentation/admin-guide/kernel-parameters.txt |
4 | +++ b/Documentation/admin-guide/kernel-parameters.txt |
5 | @@ -5101,13 +5101,13 @@ |
6 | Flags is a set of characters, each corresponding |
7 | to a common usb-storage quirk flag as follows: |
8 | a = SANE_SENSE (collect more than 18 bytes |
9 | - of sense data); |
10 | + of sense data, not on uas); |
11 | b = BAD_SENSE (don't collect more than 18 |
12 | - bytes of sense data); |
13 | + bytes of sense data, not on uas); |
14 | c = FIX_CAPACITY (decrease the reported |
15 | device capacity by one sector); |
16 | d = NO_READ_DISC_INFO (don't use |
17 | - READ_DISC_INFO command); |
18 | + READ_DISC_INFO command, not on uas); |
19 | e = NO_READ_CAPACITY_16 (don't use |
20 | READ_CAPACITY_16 command); |
21 | f = NO_REPORT_OPCODES (don't use report opcodes |
22 | @@ -5122,17 +5122,18 @@ |
23 | j = NO_REPORT_LUNS (don't use report luns |
24 | command, uas only); |
25 | l = NOT_LOCKABLE (don't try to lock and |
26 | - unlock ejectable media); |
27 | + unlock ejectable media, not on uas); |
28 | m = MAX_SECTORS_64 (don't transfer more |
29 | - than 64 sectors = 32 KB at a time); |
30 | + than 64 sectors = 32 KB at a time, |
31 | + not on uas); |
32 | n = INITIAL_READ10 (force a retry of the |
33 | - initial READ(10) command); |
34 | + initial READ(10) command, not on uas); |
35 | o = CAPACITY_OK (accept the capacity |
36 | - reported by the device); |
37 | + reported by the device, not on uas); |
38 | p = WRITE_CACHE (the device cache is ON |
39 | - by default); |
40 | + by default, not on uas); |
41 | r = IGNORE_RESIDUE (the device reports |
42 | - bogus residue values); |
43 | + bogus residue values, not on uas); |
44 | s = SINGLE_LUN (the device has only one |
45 | Logical Unit); |
46 | t = NO_ATA_1X (don't allow ATA(12) and ATA(16) |
47 | @@ -5141,7 +5142,8 @@ |
48 | w = NO_WP_DETECT (don't test whether the |
49 | medium is write-protected). |
50 | y = ALWAYS_SYNC (issue a SYNCHRONIZE_CACHE |
51 | - even if the device claims no cache) |
52 | + even if the device claims no cache, |
53 | + not on uas) |
54 | Example: quirks=0419:aaf5:rl,0421:0433:rc |
55 | |
56 | user_debug= [KNL,ARM] |
57 | diff --git a/Makefile b/Makefile |
58 | index 07998b60d56c..144daf02c78a 100644 |
59 | --- a/Makefile |
60 | +++ b/Makefile |
61 | @@ -1,7 +1,7 @@ |
62 | # SPDX-License-Identifier: GPL-2.0 |
63 | VERSION = 5 |
64 | PATCHLEVEL = 4 |
65 | -SUBLEVEL = 3 |
66 | +SUBLEVEL = 4 |
67 | EXTRAVERSION = |
68 | NAME = Kleptomaniac Octopus |
69 | |
70 | diff --git a/arch/arm/boot/dts/omap3-pandora-common.dtsi b/arch/arm/boot/dts/omap3-pandora-common.dtsi |
71 | index ec5891718ae6..150d5be42d27 100644 |
72 | --- a/arch/arm/boot/dts/omap3-pandora-common.dtsi |
73 | +++ b/arch/arm/boot/dts/omap3-pandora-common.dtsi |
74 | @@ -226,6 +226,17 @@ |
75 | gpio = <&gpio6 4 GPIO_ACTIVE_HIGH>; /* GPIO_164 */ |
76 | }; |
77 | |
78 | + /* wl1251 wifi+bt module */ |
79 | + wlan_en: fixed-regulator-wg7210_en { |
80 | + compatible = "regulator-fixed"; |
81 | + regulator-name = "vwlan"; |
82 | + regulator-min-microvolt = <1800000>; |
83 | + regulator-max-microvolt = <1800000>; |
84 | + startup-delay-us = <50000>; |
85 | + enable-active-high; |
86 | + gpio = <&gpio1 23 GPIO_ACTIVE_HIGH>; |
87 | + }; |
88 | + |
89 | /* wg7210 (wifi+bt module) 32k clock buffer */ |
90 | wg7210_32k: fixed-regulator-wg7210_32k { |
91 | compatible = "regulator-fixed"; |
92 | @@ -522,9 +533,30 @@ |
93 | /*wp-gpios = <&gpio4 31 GPIO_ACTIVE_HIGH>;*/ /* GPIO_127 */ |
94 | }; |
95 | |
96 | -/* mmc3 is probed using pdata-quirks to pass wl1251 card data */ |
97 | &mmc3 { |
98 | - status = "disabled"; |
99 | + vmmc-supply = <&wlan_en>; |
100 | + |
101 | + bus-width = <4>; |
102 | + non-removable; |
103 | + ti,non-removable; |
104 | + cap-power-off-card; |
105 | + |
106 | + pinctrl-names = "default"; |
107 | + pinctrl-0 = <&mmc3_pins>; |
108 | + |
109 | + #address-cells = <1>; |
110 | + #size-cells = <0>; |
111 | + |
112 | + wlan: wifi@1 { |
113 | + compatible = "ti,wl1251"; |
114 | + |
115 | + reg = <1>; |
116 | + |
117 | + interrupt-parent = <&gpio1>; |
118 | + interrupts = <21 IRQ_TYPE_LEVEL_HIGH>; /* GPIO_21 */ |
119 | + |
120 | + ti,wl1251-has-eeprom; |
121 | + }; |
122 | }; |
123 | |
124 | /* bluetooth*/ |
125 | diff --git a/arch/arm/boot/dts/omap3-tao3530.dtsi b/arch/arm/boot/dts/omap3-tao3530.dtsi |
126 | index a7a04d78deeb..f24e2326cfa7 100644 |
127 | --- a/arch/arm/boot/dts/omap3-tao3530.dtsi |
128 | +++ b/arch/arm/boot/dts/omap3-tao3530.dtsi |
129 | @@ -222,7 +222,7 @@ |
130 | pinctrl-0 = <&mmc1_pins>; |
131 | vmmc-supply = <&vmmc1>; |
132 | vqmmc-supply = <&vsim>; |
133 | - cd-gpios = <&twl_gpio 0 GPIO_ACTIVE_HIGH>; |
134 | + cd-gpios = <&twl_gpio 0 GPIO_ACTIVE_LOW>; |
135 | bus-width = <8>; |
136 | }; |
137 | |
138 | diff --git a/arch/arm/mach-omap2/pdata-quirks.c b/arch/arm/mach-omap2/pdata-quirks.c |
139 | index 2efd18e8824c..1b7cf81ff035 100644 |
140 | --- a/arch/arm/mach-omap2/pdata-quirks.c |
141 | +++ b/arch/arm/mach-omap2/pdata-quirks.c |
142 | @@ -7,7 +7,6 @@ |
143 | #include <linux/clk.h> |
144 | #include <linux/davinci_emac.h> |
145 | #include <linux/gpio.h> |
146 | -#include <linux/gpio/machine.h> |
147 | #include <linux/init.h> |
148 | #include <linux/kernel.h> |
149 | #include <linux/of_platform.h> |
150 | @@ -311,118 +310,15 @@ static void __init omap3_logicpd_torpedo_init(void) |
151 | } |
152 | |
153 | /* omap3pandora legacy devices */ |
154 | -#define PANDORA_WIFI_IRQ_GPIO 21 |
155 | -#define PANDORA_WIFI_NRESET_GPIO 23 |
156 | |
157 | static struct platform_device pandora_backlight = { |
158 | .name = "pandora-backlight", |
159 | .id = -1, |
160 | }; |
161 | |
162 | -static struct regulator_consumer_supply pandora_vmmc3_supply[] = { |
163 | - REGULATOR_SUPPLY("vmmc", "omap_hsmmc.2"), |
164 | -}; |
165 | - |
166 | -static struct regulator_init_data pandora_vmmc3 = { |
167 | - .constraints = { |
168 | - .valid_ops_mask = REGULATOR_CHANGE_STATUS, |
169 | - }, |
170 | - .num_consumer_supplies = ARRAY_SIZE(pandora_vmmc3_supply), |
171 | - .consumer_supplies = pandora_vmmc3_supply, |
172 | -}; |
173 | - |
174 | -static struct fixed_voltage_config pandora_vwlan = { |
175 | - .supply_name = "vwlan", |
176 | - .microvolts = 1800000, /* 1.8V */ |
177 | - .startup_delay = 50000, /* 50ms */ |
178 | - .init_data = &pandora_vmmc3, |
179 | -}; |
180 | - |
181 | -static struct platform_device pandora_vwlan_device = { |
182 | - .name = "reg-fixed-voltage", |
183 | - .id = 1, |
184 | - .dev = { |
185 | - .platform_data = &pandora_vwlan, |
186 | - }, |
187 | -}; |
188 | - |
189 | -static struct gpiod_lookup_table pandora_vwlan_gpiod_table = { |
190 | - .dev_id = "reg-fixed-voltage.1", |
191 | - .table = { |
192 | - /* |
193 | - * As this is a low GPIO number it should be at the first |
194 | - * GPIO bank. |
195 | - */ |
196 | - GPIO_LOOKUP("gpio-0-31", PANDORA_WIFI_NRESET_GPIO, |
197 | - NULL, GPIO_ACTIVE_HIGH), |
198 | - { }, |
199 | - }, |
200 | -}; |
201 | - |
202 | -static void pandora_wl1251_init_card(struct mmc_card *card) |
203 | -{ |
204 | - /* |
205 | - * We have TI wl1251 attached to MMC3. Pass this information to |
206 | - * SDIO core because it can't be probed by normal methods. |
207 | - */ |
208 | - if (card->type == MMC_TYPE_SDIO || card->type == MMC_TYPE_SD_COMBO) { |
209 | - card->quirks |= MMC_QUIRK_NONSTD_SDIO; |
210 | - card->cccr.wide_bus = 1; |
211 | - card->cis.vendor = 0x104c; |
212 | - card->cis.device = 0x9066; |
213 | - card->cis.blksize = 512; |
214 | - card->cis.max_dtr = 24000000; |
215 | - card->ocr = 0x80; |
216 | - } |
217 | -} |
218 | - |
219 | -static struct omap2_hsmmc_info pandora_mmc3[] = { |
220 | - { |
221 | - .mmc = 3, |
222 | - .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_POWER_OFF_CARD, |
223 | - .init_card = pandora_wl1251_init_card, |
224 | - }, |
225 | - {} /* Terminator */ |
226 | -}; |
227 | - |
228 | -static void __init pandora_wl1251_init(void) |
229 | -{ |
230 | - struct wl1251_platform_data pandora_wl1251_pdata; |
231 | - int ret; |
232 | - |
233 | - memset(&pandora_wl1251_pdata, 0, sizeof(pandora_wl1251_pdata)); |
234 | - |
235 | - pandora_wl1251_pdata.power_gpio = -1; |
236 | - |
237 | - ret = gpio_request_one(PANDORA_WIFI_IRQ_GPIO, GPIOF_IN, "wl1251 irq"); |
238 | - if (ret < 0) |
239 | - goto fail; |
240 | - |
241 | - pandora_wl1251_pdata.irq = gpio_to_irq(PANDORA_WIFI_IRQ_GPIO); |
242 | - if (pandora_wl1251_pdata.irq < 0) |
243 | - goto fail_irq; |
244 | - |
245 | - pandora_wl1251_pdata.use_eeprom = true; |
246 | - ret = wl1251_set_platform_data(&pandora_wl1251_pdata); |
247 | - if (ret < 0) |
248 | - goto fail_irq; |
249 | - |
250 | - return; |
251 | - |
252 | -fail_irq: |
253 | - gpio_free(PANDORA_WIFI_IRQ_GPIO); |
254 | -fail: |
255 | - pr_err("wl1251 board initialisation failed\n"); |
256 | -} |
257 | - |
258 | static void __init omap3_pandora_legacy_init(void) |
259 | { |
260 | platform_device_register(&pandora_backlight); |
261 | - gpiod_add_lookup_table(&pandora_vwlan_gpiod_table); |
262 | - platform_device_register(&pandora_vwlan_device); |
263 | - omap_hsmmc_init(pandora_mmc3); |
264 | - omap_hsmmc_late_init(pandora_mmc3); |
265 | - pandora_wl1251_init(); |
266 | } |
267 | #endif /* CONFIG_ARCH_OMAP3 */ |
268 | |
269 | diff --git a/arch/powerpc/include/asm/sections.h b/arch/powerpc/include/asm/sections.h |
270 | index 5a9b6eb651b6..d19871763ed4 100644 |
271 | --- a/arch/powerpc/include/asm/sections.h |
272 | +++ b/arch/powerpc/include/asm/sections.h |
273 | @@ -5,8 +5,22 @@ |
274 | |
275 | #include <linux/elf.h> |
276 | #include <linux/uaccess.h> |
277 | + |
278 | +#define arch_is_kernel_initmem_freed arch_is_kernel_initmem_freed |
279 | + |
280 | #include <asm-generic/sections.h> |
281 | |
282 | +extern bool init_mem_is_free; |
283 | + |
284 | +static inline int arch_is_kernel_initmem_freed(unsigned long addr) |
285 | +{ |
286 | + if (!init_mem_is_free) |
287 | + return 0; |
288 | + |
289 | + return addr >= (unsigned long)__init_begin && |
290 | + addr < (unsigned long)__init_end; |
291 | +} |
292 | + |
293 | extern char __head_end[]; |
294 | |
295 | #ifdef __powerpc64__ |
296 | diff --git a/arch/powerpc/include/asm/vdso_datapage.h b/arch/powerpc/include/asm/vdso_datapage.h |
297 | index c61d59ed3b45..2ccb938d8544 100644 |
298 | --- a/arch/powerpc/include/asm/vdso_datapage.h |
299 | +++ b/arch/powerpc/include/asm/vdso_datapage.h |
300 | @@ -82,6 +82,7 @@ struct vdso_data { |
301 | __s32 wtom_clock_nsec; /* Wall to monotonic clock nsec */ |
302 | __s64 wtom_clock_sec; /* Wall to monotonic clock sec */ |
303 | struct timespec stamp_xtime; /* xtime as at tb_orig_stamp */ |
304 | + __u32 hrtimer_res; /* hrtimer resolution */ |
305 | __u32 syscall_map_64[SYSCALL_MAP_SIZE]; /* map of syscalls */ |
306 | __u32 syscall_map_32[SYSCALL_MAP_SIZE]; /* map of syscalls */ |
307 | }; |
308 | @@ -103,6 +104,7 @@ struct vdso_data { |
309 | __s32 wtom_clock_nsec; |
310 | struct timespec stamp_xtime; /* xtime as at tb_orig_stamp */ |
311 | __u32 stamp_sec_fraction; /* fractional seconds of stamp_xtime */ |
312 | + __u32 hrtimer_res; /* hrtimer resolution */ |
313 | __u32 syscall_map_32[SYSCALL_MAP_SIZE]; /* map of syscalls */ |
314 | __u32 dcache_block_size; /* L1 d-cache block size */ |
315 | __u32 icache_block_size; /* L1 i-cache block size */ |
316 | diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile |
317 | index a7ca8fe62368..3c02445cf086 100644 |
318 | --- a/arch/powerpc/kernel/Makefile |
319 | +++ b/arch/powerpc/kernel/Makefile |
320 | @@ -5,8 +5,8 @@ |
321 | |
322 | CFLAGS_ptrace.o += -DUTS_MACHINE='"$(UTS_MACHINE)"' |
323 | |
324 | -# Disable clang warning for using setjmp without setjmp.h header |
325 | -CFLAGS_crash.o += $(call cc-disable-warning, builtin-requires-header) |
326 | +# Avoid clang warnings around longjmp/setjmp declarations |
327 | +CFLAGS_crash.o += -ffreestanding |
328 | |
329 | ifdef CONFIG_PPC64 |
330 | CFLAGS_prom_init.o += $(NO_MINIMAL_TOC) |
331 | diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c |
332 | index 484f54dab247..5c0a1e17219b 100644 |
333 | --- a/arch/powerpc/kernel/asm-offsets.c |
334 | +++ b/arch/powerpc/kernel/asm-offsets.c |
335 | @@ -387,6 +387,7 @@ int main(void) |
336 | OFFSET(WTOM_CLOCK_NSEC, vdso_data, wtom_clock_nsec); |
337 | OFFSET(STAMP_XTIME, vdso_data, stamp_xtime); |
338 | OFFSET(STAMP_SEC_FRAC, vdso_data, stamp_sec_fraction); |
339 | + OFFSET(CLOCK_HRTIMER_RES, vdso_data, hrtimer_res); |
340 | OFFSET(CFG_ICACHE_BLOCKSZ, vdso_data, icache_block_size); |
341 | OFFSET(CFG_DCACHE_BLOCKSZ, vdso_data, dcache_block_size); |
342 | OFFSET(CFG_ICACHE_LOGBLOCKSZ, vdso_data, icache_log_block_size); |
343 | @@ -417,7 +418,6 @@ int main(void) |
344 | DEFINE(CLOCK_REALTIME_COARSE, CLOCK_REALTIME_COARSE); |
345 | DEFINE(CLOCK_MONOTONIC_COARSE, CLOCK_MONOTONIC_COARSE); |
346 | DEFINE(NSEC_PER_SEC, NSEC_PER_SEC); |
347 | - DEFINE(CLOCK_REALTIME_RES, MONOTONIC_RES_NSEC); |
348 | |
349 | #ifdef CONFIG_BUG |
350 | DEFINE(BUG_ENTRY_SIZE, sizeof(struct bug_entry)); |
351 | diff --git a/arch/powerpc/kernel/misc_64.S b/arch/powerpc/kernel/misc_64.S |
352 | index b55a7b4cb543..9bc0aa9aeb65 100644 |
353 | --- a/arch/powerpc/kernel/misc_64.S |
354 | +++ b/arch/powerpc/kernel/misc_64.S |
355 | @@ -82,7 +82,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_COHERENT_ICACHE) |
356 | subf r8,r6,r4 /* compute length */ |
357 | add r8,r8,r5 /* ensure we get enough */ |
358 | lwz r9,DCACHEL1LOGBLOCKSIZE(r10) /* Get log-2 of cache block size */ |
359 | - srw. r8,r8,r9 /* compute line count */ |
360 | + srd. r8,r8,r9 /* compute line count */ |
361 | beqlr /* nothing to do? */ |
362 | mtctr r8 |
363 | 1: dcbst 0,r6 |
364 | @@ -98,7 +98,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_COHERENT_ICACHE) |
365 | subf r8,r6,r4 /* compute length */ |
366 | add r8,r8,r5 |
367 | lwz r9,ICACHEL1LOGBLOCKSIZE(r10) /* Get log-2 of Icache block size */ |
368 | - srw. r8,r8,r9 /* compute line count */ |
369 | + srd. r8,r8,r9 /* compute line count */ |
370 | beqlr /* nothing to do? */ |
371 | mtctr r8 |
372 | 2: icbi 0,r6 |
373 | diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c |
374 | index 694522308cd5..619447b1b797 100644 |
375 | --- a/arch/powerpc/kernel/time.c |
376 | +++ b/arch/powerpc/kernel/time.c |
377 | @@ -959,6 +959,7 @@ void update_vsyscall(struct timekeeper *tk) |
378 | vdso_data->wtom_clock_nsec = tk->wall_to_monotonic.tv_nsec; |
379 | vdso_data->stamp_xtime = xt; |
380 | vdso_data->stamp_sec_fraction = frac_sec; |
381 | + vdso_data->hrtimer_res = hrtimer_resolution; |
382 | smp_wmb(); |
383 | ++(vdso_data->tb_update_count); |
384 | } |
385 | diff --git a/arch/powerpc/kernel/vdso32/gettimeofday.S b/arch/powerpc/kernel/vdso32/gettimeofday.S |
386 | index becd9f8767ed..a967e795b96d 100644 |
387 | --- a/arch/powerpc/kernel/vdso32/gettimeofday.S |
388 | +++ b/arch/powerpc/kernel/vdso32/gettimeofday.S |
389 | @@ -156,12 +156,15 @@ V_FUNCTION_BEGIN(__kernel_clock_getres) |
390 | cror cr0*4+eq,cr0*4+eq,cr1*4+eq |
391 | bne cr0,99f |
392 | |
393 | + mflr r12 |
394 | + .cfi_register lr,r12 |
395 | + bl __get_datapage@local /* get data page */ |
396 | + lwz r5, CLOCK_HRTIMER_RES(r3) |
397 | + mtlr r12 |
398 | li r3,0 |
399 | cmpli cr0,r4,0 |
400 | crclr cr0*4+so |
401 | beqlr |
402 | - lis r5,CLOCK_REALTIME_RES@h |
403 | - ori r5,r5,CLOCK_REALTIME_RES@l |
404 | stw r3,TSPC32_TV_SEC(r4) |
405 | stw r5,TSPC32_TV_NSEC(r4) |
406 | blr |
407 | diff --git a/arch/powerpc/kernel/vdso64/cacheflush.S b/arch/powerpc/kernel/vdso64/cacheflush.S |
408 | index 3f92561a64c4..526f5ba2593e 100644 |
409 | --- a/arch/powerpc/kernel/vdso64/cacheflush.S |
410 | +++ b/arch/powerpc/kernel/vdso64/cacheflush.S |
411 | @@ -35,7 +35,7 @@ V_FUNCTION_BEGIN(__kernel_sync_dicache) |
412 | subf r8,r6,r4 /* compute length */ |
413 | add r8,r8,r5 /* ensure we get enough */ |
414 | lwz r9,CFG_DCACHE_LOGBLOCKSZ(r10) |
415 | - srw. r8,r8,r9 /* compute line count */ |
416 | + srd. r8,r8,r9 /* compute line count */ |
417 | crclr cr0*4+so |
418 | beqlr /* nothing to do? */ |
419 | mtctr r8 |
420 | @@ -52,7 +52,7 @@ V_FUNCTION_BEGIN(__kernel_sync_dicache) |
421 | subf r8,r6,r4 /* compute length */ |
422 | add r8,r8,r5 |
423 | lwz r9,CFG_ICACHE_LOGBLOCKSZ(r10) |
424 | - srw. r8,r8,r9 /* compute line count */ |
425 | + srd. r8,r8,r9 /* compute line count */ |
426 | crclr cr0*4+so |
427 | beqlr /* nothing to do? */ |
428 | mtctr r8 |
429 | diff --git a/arch/powerpc/kernel/vdso64/gettimeofday.S b/arch/powerpc/kernel/vdso64/gettimeofday.S |
430 | index 07bfe33fe874..81757f06bbd7 100644 |
431 | --- a/arch/powerpc/kernel/vdso64/gettimeofday.S |
432 | +++ b/arch/powerpc/kernel/vdso64/gettimeofday.S |
433 | @@ -186,12 +186,15 @@ V_FUNCTION_BEGIN(__kernel_clock_getres) |
434 | cror cr0*4+eq,cr0*4+eq,cr1*4+eq |
435 | bne cr0,99f |
436 | |
437 | + mflr r12 |
438 | + .cfi_register lr,r12 |
439 | + bl V_LOCAL_FUNC(__get_datapage) |
440 | + lwz r5, CLOCK_HRTIMER_RES(r3) |
441 | + mtlr r12 |
442 | li r3,0 |
443 | cmpldi cr0,r4,0 |
444 | crclr cr0*4+so |
445 | beqlr |
446 | - lis r5,CLOCK_REALTIME_RES@h |
447 | - ori r5,r5,CLOCK_REALTIME_RES@l |
448 | std r3,TSPC64_TV_SEC(r4) |
449 | std r5,TSPC64_TV_NSEC(r4) |
450 | blr |
451 | diff --git a/arch/powerpc/platforms/powernv/opal-imc.c b/arch/powerpc/platforms/powernv/opal-imc.c |
452 | index e04b20625cb9..7ccc5c85c74e 100644 |
453 | --- a/arch/powerpc/platforms/powernv/opal-imc.c |
454 | +++ b/arch/powerpc/platforms/powernv/opal-imc.c |
455 | @@ -285,7 +285,14 @@ static int opal_imc_counters_probe(struct platform_device *pdev) |
456 | domain = IMC_DOMAIN_THREAD; |
457 | break; |
458 | case IMC_TYPE_TRACE: |
459 | - domain = IMC_DOMAIN_TRACE; |
460 | + /* |
461 | + * FIXME. Using trace_imc events to monitor application |
462 | + * or KVM thread performance can cause a checkstop |
463 | + * (system crash). |
464 | + * Disable it for now. |
465 | + */ |
466 | + pr_info_once("IMC: disabling trace_imc PMU\n"); |
467 | + domain = -1; |
468 | break; |
469 | default: |
470 | pr_warn("IMC Unknown Device type \n"); |
471 | diff --git a/arch/powerpc/sysdev/xive/common.c b/arch/powerpc/sysdev/xive/common.c |
472 | index df832b09e3e9..f5fadbd2533a 100644 |
473 | --- a/arch/powerpc/sysdev/xive/common.c |
474 | +++ b/arch/powerpc/sysdev/xive/common.c |
475 | @@ -1035,6 +1035,15 @@ static int xive_irq_alloc_data(unsigned int virq, irq_hw_number_t hw) |
476 | xd->target = XIVE_INVALID_TARGET; |
477 | irq_set_handler_data(virq, xd); |
478 | |
479 | + /* |
480 | + * Turn OFF by default the interrupt being mapped. A side |
481 | + * effect of this check is the mapping the ESB page of the |
482 | + * interrupt in the Linux address space. This prevents page |
483 | + * fault issues in the crash handler which masks all |
484 | + * interrupts. |
485 | + */ |
486 | + xive_esb_read(xd, XIVE_ESB_SET_PQ_01); |
487 | + |
488 | return 0; |
489 | } |
490 | |
491 | diff --git a/arch/powerpc/sysdev/xive/spapr.c b/arch/powerpc/sysdev/xive/spapr.c |
492 | index 33c10749edec..55dc61cb4867 100644 |
493 | --- a/arch/powerpc/sysdev/xive/spapr.c |
494 | +++ b/arch/powerpc/sysdev/xive/spapr.c |
495 | @@ -392,20 +392,28 @@ static int xive_spapr_populate_irq_data(u32 hw_irq, struct xive_irq_data *data) |
496 | data->esb_shift = esb_shift; |
497 | data->trig_page = trig_page; |
498 | |
499 | + data->hw_irq = hw_irq; |
500 | + |
501 | /* |
502 | * No chip-id for the sPAPR backend. This has an impact how we |
503 | * pick a target. See xive_pick_irq_target(). |
504 | */ |
505 | data->src_chip = XIVE_INVALID_CHIP_ID; |
506 | |
507 | + /* |
508 | + * When the H_INT_ESB flag is set, the H_INT_ESB hcall should |
509 | + * be used for interrupt management. Skip the remapping of the |
510 | + * ESB pages which are not available. |
511 | + */ |
512 | + if (data->flags & XIVE_IRQ_FLAG_H_INT_ESB) |
513 | + return 0; |
514 | + |
515 | data->eoi_mmio = ioremap(data->eoi_page, 1u << data->esb_shift); |
516 | if (!data->eoi_mmio) { |
517 | pr_err("Failed to map EOI page for irq 0x%x\n", hw_irq); |
518 | return -ENOMEM; |
519 | } |
520 | |
521 | - data->hw_irq = hw_irq; |
522 | - |
523 | /* Full function page supports trigger */ |
524 | if (flags & XIVE_SRC_TRIGGER) { |
525 | data->trig_mmio = data->eoi_mmio; |
526 | diff --git a/arch/powerpc/xmon/Makefile b/arch/powerpc/xmon/Makefile |
527 | index f142570ad860..c3842dbeb1b7 100644 |
528 | --- a/arch/powerpc/xmon/Makefile |
529 | +++ b/arch/powerpc/xmon/Makefile |
530 | @@ -1,8 +1,8 @@ |
531 | # SPDX-License-Identifier: GPL-2.0 |
532 | # Makefile for xmon |
533 | |
534 | -# Disable clang warning for using setjmp without setjmp.h header |
535 | -subdir-ccflags-y := $(call cc-disable-warning, builtin-requires-header) |
536 | +# Avoid clang warnings around longjmp/setjmp declarations |
537 | +subdir-ccflags-y := -ffreestanding |
538 | |
539 | GCOV_PROFILE := n |
540 | KCOV_INSTRUMENT := n |
541 | diff --git a/arch/s390/boot/startup.c b/arch/s390/boot/startup.c |
542 | index 5367950510f6..fa0150285d38 100644 |
543 | --- a/arch/s390/boot/startup.c |
544 | +++ b/arch/s390/boot/startup.c |
545 | @@ -170,6 +170,11 @@ void startup_kernel(void) |
546 | handle_relocs(__kaslr_offset); |
547 | |
548 | if (__kaslr_offset) { |
549 | + /* |
550 | + * Save KASLR offset for early dumps, before vmcore_info is set. |
551 | + * Mark as uneven to distinguish from real vmcore_info pointer. |
552 | + */ |
553 | + S390_lowcore.vmcore_info = __kaslr_offset | 0x1UL; |
554 | /* Clear non-relocated kernel */ |
555 | if (IS_ENABLED(CONFIG_KERNEL_UNCOMPRESSED)) |
556 | memset(img, 0, vmlinux.image_size); |
557 | diff --git a/arch/s390/include/asm/pgtable.h b/arch/s390/include/asm/pgtable.h |
558 | index 5ff98d76a66c..a9e46b83c536 100644 |
559 | --- a/arch/s390/include/asm/pgtable.h |
560 | +++ b/arch/s390/include/asm/pgtable.h |
561 | @@ -1173,8 +1173,6 @@ void gmap_pmdp_idte_global(struct mm_struct *mm, unsigned long vmaddr); |
562 | static inline void set_pte_at(struct mm_struct *mm, unsigned long addr, |
563 | pte_t *ptep, pte_t entry) |
564 | { |
565 | - if (!MACHINE_HAS_NX) |
566 | - pte_val(entry) &= ~_PAGE_NOEXEC; |
567 | if (pte_present(entry)) |
568 | pte_val(entry) &= ~_PAGE_UNUSED; |
569 | if (mm_has_pgste(mm)) |
570 | @@ -1191,6 +1189,8 @@ static inline pte_t mk_pte_phys(unsigned long physpage, pgprot_t pgprot) |
571 | { |
572 | pte_t __pte; |
573 | pte_val(__pte) = physpage + pgprot_val(pgprot); |
574 | + if (!MACHINE_HAS_NX) |
575 | + pte_val(__pte) &= ~_PAGE_NOEXEC; |
576 | return pte_mkyoung(__pte); |
577 | } |
578 | |
579 | diff --git a/arch/s390/kernel/machine_kexec.c b/arch/s390/kernel/machine_kexec.c |
580 | index 444a19125a81..d402ced7f7c3 100644 |
581 | --- a/arch/s390/kernel/machine_kexec.c |
582 | +++ b/arch/s390/kernel/machine_kexec.c |
583 | @@ -254,10 +254,10 @@ void arch_crash_save_vmcoreinfo(void) |
584 | VMCOREINFO_SYMBOL(lowcore_ptr); |
585 | VMCOREINFO_SYMBOL(high_memory); |
586 | VMCOREINFO_LENGTH(lowcore_ptr, NR_CPUS); |
587 | - mem_assign_absolute(S390_lowcore.vmcore_info, paddr_vmcoreinfo_note()); |
588 | vmcoreinfo_append_str("SDMA=%lx\n", __sdma); |
589 | vmcoreinfo_append_str("EDMA=%lx\n", __edma); |
590 | vmcoreinfo_append_str("KERNELOFFSET=%lx\n", kaslr_offset()); |
591 | + mem_assign_absolute(S390_lowcore.vmcore_info, paddr_vmcoreinfo_note()); |
592 | } |
593 | |
594 | void machine_shutdown(void) |
595 | diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c |
596 | index 44974654cbd0..d95c85780e07 100644 |
597 | --- a/arch/s390/kernel/smp.c |
598 | +++ b/arch/s390/kernel/smp.c |
599 | @@ -262,10 +262,13 @@ static void pcpu_prepare_secondary(struct pcpu *pcpu, int cpu) |
600 | lc->spinlock_index = 0; |
601 | lc->percpu_offset = __per_cpu_offset[cpu]; |
602 | lc->kernel_asce = S390_lowcore.kernel_asce; |
603 | + lc->user_asce = S390_lowcore.kernel_asce; |
604 | lc->machine_flags = S390_lowcore.machine_flags; |
605 | lc->user_timer = lc->system_timer = |
606 | lc->steal_timer = lc->avg_steal_timer = 0; |
607 | __ctl_store(lc->cregs_save_area, 0, 15); |
608 | + lc->cregs_save_area[1] = lc->kernel_asce; |
609 | + lc->cregs_save_area[7] = lc->vdso_asce; |
610 | save_access_regs((unsigned int *) lc->access_regs_save_area); |
611 | memcpy(lc->stfle_fac_list, S390_lowcore.stfle_fac_list, |
612 | sizeof(lc->stfle_fac_list)); |
613 | @@ -816,6 +819,8 @@ static void smp_init_secondary(void) |
614 | |
615 | S390_lowcore.last_update_clock = get_tod_clock(); |
616 | restore_access_regs(S390_lowcore.access_regs_save_area); |
617 | + set_cpu_flag(CIF_ASCE_PRIMARY); |
618 | + set_cpu_flag(CIF_ASCE_SECONDARY); |
619 | cpu_init(); |
620 | preempt_disable(); |
621 | init_cpu_timer(); |
622 | diff --git a/block/blk-mq-sysfs.c b/block/blk-mq-sysfs.c |
623 | index a0d3ce30fa08..a09ab0c3d074 100644 |
624 | --- a/block/blk-mq-sysfs.c |
625 | +++ b/block/blk-mq-sysfs.c |
626 | @@ -166,20 +166,25 @@ static ssize_t blk_mq_hw_sysfs_nr_reserved_tags_show(struct blk_mq_hw_ctx *hctx, |
627 | |
628 | static ssize_t blk_mq_hw_sysfs_cpus_show(struct blk_mq_hw_ctx *hctx, char *page) |
629 | { |
630 | + const size_t size = PAGE_SIZE - 1; |
631 | unsigned int i, first = 1; |
632 | - ssize_t ret = 0; |
633 | + int ret = 0, pos = 0; |
634 | |
635 | for_each_cpu(i, hctx->cpumask) { |
636 | if (first) |
637 | - ret += sprintf(ret + page, "%u", i); |
638 | + ret = snprintf(pos + page, size - pos, "%u", i); |
639 | else |
640 | - ret += sprintf(ret + page, ", %u", i); |
641 | + ret = snprintf(pos + page, size - pos, ", %u", i); |
642 | + |
643 | + if (ret >= size - pos) |
644 | + break; |
645 | |
646 | first = 0; |
647 | + pos += ret; |
648 | } |
649 | |
650 | - ret += sprintf(ret + page, "\n"); |
651 | - return ret; |
652 | + ret = snprintf(pos + page, size + 1 - pos, "\n"); |
653 | + return pos + ret; |
654 | } |
655 | |
656 | static struct blk_mq_hw_ctx_sysfs_entry blk_mq_hw_sysfs_nr_tags = { |
657 | diff --git a/drivers/acpi/acpi_lpss.c b/drivers/acpi/acpi_lpss.c |
658 | index 60bbc5090abe..751ed38f2a10 100644 |
659 | --- a/drivers/acpi/acpi_lpss.c |
660 | +++ b/drivers/acpi/acpi_lpss.c |
661 | @@ -10,6 +10,7 @@ |
662 | #include <linux/acpi.h> |
663 | #include <linux/clkdev.h> |
664 | #include <linux/clk-provider.h> |
665 | +#include <linux/dmi.h> |
666 | #include <linux/err.h> |
667 | #include <linux/io.h> |
668 | #include <linux/mutex.h> |
669 | @@ -463,6 +464,18 @@ struct lpss_device_links { |
670 | const char *consumer_hid; |
671 | const char *consumer_uid; |
672 | u32 flags; |
673 | + const struct dmi_system_id *dep_missing_ids; |
674 | +}; |
675 | + |
676 | +/* Please keep this list sorted alphabetically by vendor and model */ |
677 | +static const struct dmi_system_id i2c1_dep_missing_dmi_ids[] = { |
678 | + { |
679 | + .matches = { |
680 | + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), |
681 | + DMI_MATCH(DMI_PRODUCT_NAME, "T200TA"), |
682 | + }, |
683 | + }, |
684 | + {} |
685 | }; |
686 | |
687 | /* |
688 | @@ -473,9 +486,17 @@ struct lpss_device_links { |
689 | * the supplier is not enumerated until after the consumer is probed. |
690 | */ |
691 | static const struct lpss_device_links lpss_device_links[] = { |
692 | + /* CHT External sdcard slot controller depends on PMIC I2C ctrl */ |
693 | {"808622C1", "7", "80860F14", "3", DL_FLAG_PM_RUNTIME}, |
694 | + /* CHT iGPU depends on PMIC I2C controller */ |
695 | {"808622C1", "7", "LNXVIDEO", NULL, DL_FLAG_PM_RUNTIME}, |
696 | + /* BYT iGPU depends on the Embedded Controller I2C controller (UID 1) */ |
697 | + {"80860F41", "1", "LNXVIDEO", NULL, DL_FLAG_PM_RUNTIME, |
698 | + i2c1_dep_missing_dmi_ids}, |
699 | + /* BYT CR iGPU depends on PMIC I2C controller (UID 5 on CR) */ |
700 | {"80860F41", "5", "LNXVIDEO", NULL, DL_FLAG_PM_RUNTIME}, |
701 | + /* BYT iGPU depends on PMIC I2C controller (UID 7 on non CR) */ |
702 | + {"80860F41", "7", "LNXVIDEO", NULL, DL_FLAG_PM_RUNTIME}, |
703 | }; |
704 | |
705 | static bool hid_uid_match(struct acpi_device *adev, |
706 | @@ -570,7 +591,8 @@ static void acpi_lpss_link_consumer(struct device *dev1, |
707 | if (!dev2) |
708 | return; |
709 | |
710 | - if (acpi_lpss_dep(ACPI_COMPANION(dev2), ACPI_HANDLE(dev1))) |
711 | + if ((link->dep_missing_ids && dmi_check_system(link->dep_missing_ids)) |
712 | + || acpi_lpss_dep(ACPI_COMPANION(dev2), ACPI_HANDLE(dev1))) |
713 | device_link_add(dev2, dev1, link->flags); |
714 | |
715 | put_device(dev2); |
716 | @@ -585,7 +607,8 @@ static void acpi_lpss_link_supplier(struct device *dev1, |
717 | if (!dev2) |
718 | return; |
719 | |
720 | - if (acpi_lpss_dep(ACPI_COMPANION(dev1), ACPI_HANDLE(dev2))) |
721 | + if ((link->dep_missing_ids && dmi_check_system(link->dep_missing_ids)) |
722 | + || acpi_lpss_dep(ACPI_COMPANION(dev1), ACPI_HANDLE(dev2))) |
723 | device_link_add(dev1, dev2, link->flags); |
724 | |
725 | put_device(dev2); |
726 | diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c |
727 | index 48bc96d45bab..54002670cb7a 100644 |
728 | --- a/drivers/acpi/bus.c |
729 | +++ b/drivers/acpi/bus.c |
730 | @@ -153,7 +153,7 @@ int acpi_bus_get_private_data(acpi_handle handle, void **data) |
731 | { |
732 | acpi_status status; |
733 | |
734 | - if (!*data) |
735 | + if (!data) |
736 | return -EINVAL; |
737 | |
738 | status = acpi_get_data(handle, acpi_bus_private_data_handler, data); |
739 | diff --git a/drivers/acpi/device_pm.c b/drivers/acpi/device_pm.c |
740 | index 08bb9f2f2d23..5e4a8860a9c0 100644 |
741 | --- a/drivers/acpi/device_pm.c |
742 | +++ b/drivers/acpi/device_pm.c |
743 | @@ -1314,9 +1314,19 @@ static void acpi_dev_pm_detach(struct device *dev, bool power_off) |
744 | */ |
745 | int acpi_dev_pm_attach(struct device *dev, bool power_on) |
746 | { |
747 | + /* |
748 | + * Skip devices whose ACPI companions match the device IDs below, |
749 | + * because they require special power management handling incompatible |
750 | + * with the generic ACPI PM domain. |
751 | + */ |
752 | + static const struct acpi_device_id special_pm_ids[] = { |
753 | + {"PNP0C0B", }, /* Generic ACPI fan */ |
754 | + {"INT3404", }, /* Fan */ |
755 | + {} |
756 | + }; |
757 | struct acpi_device *adev = ACPI_COMPANION(dev); |
758 | |
759 | - if (!adev) |
760 | + if (!adev || !acpi_match_device_ids(adev, special_pm_ids)) |
761 | return 0; |
762 | |
763 | /* |
764 | diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c |
765 | index da1e5c5ce150..bd75caff8322 100644 |
766 | --- a/drivers/acpi/ec.c |
767 | +++ b/drivers/acpi/ec.c |
768 | @@ -525,26 +525,10 @@ static void acpi_ec_enable_event(struct acpi_ec *ec) |
769 | } |
770 | |
771 | #ifdef CONFIG_PM_SLEEP |
772 | -static bool acpi_ec_query_flushed(struct acpi_ec *ec) |
773 | +static void __acpi_ec_flush_work(void) |
774 | { |
775 | - bool flushed; |
776 | - unsigned long flags; |
777 | - |
778 | - spin_lock_irqsave(&ec->lock, flags); |
779 | - flushed = !ec->nr_pending_queries; |
780 | - spin_unlock_irqrestore(&ec->lock, flags); |
781 | - return flushed; |
782 | -} |
783 | - |
784 | -static void __acpi_ec_flush_event(struct acpi_ec *ec) |
785 | -{ |
786 | - /* |
787 | - * When ec_freeze_events is true, we need to flush events in |
788 | - * the proper position before entering the noirq stage. |
789 | - */ |
790 | - wait_event(ec->wait, acpi_ec_query_flushed(ec)); |
791 | - if (ec_query_wq) |
792 | - flush_workqueue(ec_query_wq); |
793 | + flush_scheduled_work(); /* flush ec->work */ |
794 | + flush_workqueue(ec_query_wq); /* flush queries */ |
795 | } |
796 | |
797 | static void acpi_ec_disable_event(struct acpi_ec *ec) |
798 | @@ -554,15 +538,21 @@ static void acpi_ec_disable_event(struct acpi_ec *ec) |
799 | spin_lock_irqsave(&ec->lock, flags); |
800 | __acpi_ec_disable_event(ec); |
801 | spin_unlock_irqrestore(&ec->lock, flags); |
802 | - __acpi_ec_flush_event(ec); |
803 | + |
804 | + /* |
805 | + * When ec_freeze_events is true, we need to flush events in |
806 | + * the proper position before entering the noirq stage. |
807 | + */ |
808 | + __acpi_ec_flush_work(); |
809 | } |
810 | |
811 | void acpi_ec_flush_work(void) |
812 | { |
813 | - if (first_ec) |
814 | - __acpi_ec_flush_event(first_ec); |
815 | + /* Without ec_query_wq there is nothing to flush. */ |
816 | + if (!ec_query_wq) |
817 | + return; |
818 | |
819 | - flush_scheduled_work(); |
820 | + __acpi_ec_flush_work(); |
821 | } |
822 | #endif /* CONFIG_PM_SLEEP */ |
823 | |
824 | diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c |
825 | index a2e844a8e9ed..41168c027a5a 100644 |
826 | --- a/drivers/acpi/osl.c |
827 | +++ b/drivers/acpi/osl.c |
828 | @@ -374,19 +374,21 @@ void *__ref acpi_os_map_memory(acpi_physical_address phys, acpi_size size) |
829 | } |
830 | EXPORT_SYMBOL_GPL(acpi_os_map_memory); |
831 | |
832 | -static void acpi_os_drop_map_ref(struct acpi_ioremap *map) |
833 | +/* Must be called with mutex_lock(&acpi_ioremap_lock) */ |
834 | +static unsigned long acpi_os_drop_map_ref(struct acpi_ioremap *map) |
835 | { |
836 | - if (!--map->refcount) |
837 | + unsigned long refcount = --map->refcount; |
838 | + |
839 | + if (!refcount) |
840 | list_del_rcu(&map->list); |
841 | + return refcount; |
842 | } |
843 | |
844 | static void acpi_os_map_cleanup(struct acpi_ioremap *map) |
845 | { |
846 | - if (!map->refcount) { |
847 | - synchronize_rcu_expedited(); |
848 | - acpi_unmap(map->phys, map->virt); |
849 | - kfree(map); |
850 | - } |
851 | + synchronize_rcu_expedited(); |
852 | + acpi_unmap(map->phys, map->virt); |
853 | + kfree(map); |
854 | } |
855 | |
856 | /** |
857 | @@ -406,6 +408,7 @@ static void acpi_os_map_cleanup(struct acpi_ioremap *map) |
858 | void __ref acpi_os_unmap_iomem(void __iomem *virt, acpi_size size) |
859 | { |
860 | struct acpi_ioremap *map; |
861 | + unsigned long refcount; |
862 | |
863 | if (!acpi_permanent_mmap) { |
864 | __acpi_unmap_table(virt, size); |
865 | @@ -419,10 +422,11 @@ void __ref acpi_os_unmap_iomem(void __iomem *virt, acpi_size size) |
866 | WARN(true, PREFIX "%s: bad address %p\n", __func__, virt); |
867 | return; |
868 | } |
869 | - acpi_os_drop_map_ref(map); |
870 | + refcount = acpi_os_drop_map_ref(map); |
871 | mutex_unlock(&acpi_ioremap_lock); |
872 | |
873 | - acpi_os_map_cleanup(map); |
874 | + if (!refcount) |
875 | + acpi_os_map_cleanup(map); |
876 | } |
877 | EXPORT_SYMBOL_GPL(acpi_os_unmap_iomem); |
878 | |
879 | @@ -457,6 +461,7 @@ void acpi_os_unmap_generic_address(struct acpi_generic_address *gas) |
880 | { |
881 | u64 addr; |
882 | struct acpi_ioremap *map; |
883 | + unsigned long refcount; |
884 | |
885 | if (gas->space_id != ACPI_ADR_SPACE_SYSTEM_MEMORY) |
886 | return; |
887 | @@ -472,10 +477,11 @@ void acpi_os_unmap_generic_address(struct acpi_generic_address *gas) |
888 | mutex_unlock(&acpi_ioremap_lock); |
889 | return; |
890 | } |
891 | - acpi_os_drop_map_ref(map); |
892 | + refcount = acpi_os_drop_map_ref(map); |
893 | mutex_unlock(&acpi_ioremap_lock); |
894 | |
895 | - acpi_os_map_cleanup(map); |
896 | + if (!refcount) |
897 | + acpi_os_map_cleanup(map); |
898 | } |
899 | EXPORT_SYMBOL(acpi_os_unmap_generic_address); |
900 | |
901 | diff --git a/drivers/android/binder.c b/drivers/android/binder.c |
902 | index 265d9dd46a5e..976a69420c16 100644 |
903 | --- a/drivers/android/binder.c |
904 | +++ b/drivers/android/binder.c |
905 | @@ -3314,7 +3314,7 @@ static void binder_transaction(struct binder_proc *proc, |
906 | binder_size_t parent_offset; |
907 | struct binder_fd_array_object *fda = |
908 | to_binder_fd_array_object(hdr); |
909 | - size_t num_valid = (buffer_offset - off_start_offset) * |
910 | + size_t num_valid = (buffer_offset - off_start_offset) / |
911 | sizeof(binder_size_t); |
912 | struct binder_buffer_object *parent = |
913 | binder_validate_ptr(target_proc, t->buffer, |
914 | @@ -3388,7 +3388,7 @@ static void binder_transaction(struct binder_proc *proc, |
915 | t->buffer->user_data + sg_buf_offset; |
916 | sg_buf_offset += ALIGN(bp->length, sizeof(u64)); |
917 | |
918 | - num_valid = (buffer_offset - off_start_offset) * |
919 | + num_valid = (buffer_offset - off_start_offset) / |
920 | sizeof(binder_size_t); |
921 | ret = binder_fixup_parent(t, thread, bp, |
922 | off_start_offset, |
923 | diff --git a/drivers/char/hw_random/omap-rng.c b/drivers/char/hw_random/omap-rng.c |
924 | index b27f39688b5e..e329f82c0467 100644 |
925 | --- a/drivers/char/hw_random/omap-rng.c |
926 | +++ b/drivers/char/hw_random/omap-rng.c |
927 | @@ -66,6 +66,13 @@ |
928 | #define OMAP4_RNG_OUTPUT_SIZE 0x8 |
929 | #define EIP76_RNG_OUTPUT_SIZE 0x10 |
930 | |
931 | +/* |
932 | + * EIP76 RNG takes approx. 700us to produce 16 bytes of output data |
933 | + * as per testing results. And to account for the lack of udelay()'s |
934 | + * reliability, we keep the timeout as 1000us. |
935 | + */ |
936 | +#define RNG_DATA_FILL_TIMEOUT 100 |
937 | + |
938 | enum { |
939 | RNG_OUTPUT_0_REG = 0, |
940 | RNG_OUTPUT_1_REG, |
941 | @@ -176,7 +183,7 @@ static int omap_rng_do_read(struct hwrng *rng, void *data, size_t max, |
942 | if (max < priv->pdata->data_size) |
943 | return 0; |
944 | |
945 | - for (i = 0; i < 20; i++) { |
946 | + for (i = 0; i < RNG_DATA_FILL_TIMEOUT; i++) { |
947 | present = priv->pdata->data_present(priv); |
948 | if (present || !wait) |
949 | break; |
950 | diff --git a/drivers/char/ppdev.c b/drivers/char/ppdev.c |
951 | index c86f18aa8985..34bb88fe0b0a 100644 |
952 | --- a/drivers/char/ppdev.c |
953 | +++ b/drivers/char/ppdev.c |
954 | @@ -619,20 +619,27 @@ static int pp_do_ioctl(struct file *file, unsigned int cmd, unsigned long arg) |
955 | if (copy_from_user(time32, argp, sizeof(time32))) |
956 | return -EFAULT; |
957 | |
958 | + if ((time32[0] < 0) || (time32[1] < 0)) |
959 | + return -EINVAL; |
960 | + |
961 | return pp_set_timeout(pp->pdev, time32[0], time32[1]); |
962 | |
963 | case PPSETTIME64: |
964 | if (copy_from_user(time64, argp, sizeof(time64))) |
965 | return -EFAULT; |
966 | |
967 | + if ((time64[0] < 0) || (time64[1] < 0)) |
968 | + return -EINVAL; |
969 | + |
970 | + if (IS_ENABLED(CONFIG_SPARC64) && !in_compat_syscall()) |
971 | + time64[1] >>= 32; |
972 | + |
973 | return pp_set_timeout(pp->pdev, time64[0], time64[1]); |
974 | |
975 | case PPGETTIME32: |
976 | jiffies_to_timespec64(pp->pdev->timeout, &ts); |
977 | time32[0] = ts.tv_sec; |
978 | time32[1] = ts.tv_nsec / NSEC_PER_USEC; |
979 | - if ((time32[0] < 0) || (time32[1] < 0)) |
980 | - return -EINVAL; |
981 | |
982 | if (copy_to_user(argp, time32, sizeof(time32))) |
983 | return -EFAULT; |
984 | @@ -643,8 +650,9 @@ static int pp_do_ioctl(struct file *file, unsigned int cmd, unsigned long arg) |
985 | jiffies_to_timespec64(pp->pdev->timeout, &ts); |
986 | time64[0] = ts.tv_sec; |
987 | time64[1] = ts.tv_nsec / NSEC_PER_USEC; |
988 | - if ((time64[0] < 0) || (time64[1] < 0)) |
989 | - return -EINVAL; |
990 | + |
991 | + if (IS_ENABLED(CONFIG_SPARC64) && !in_compat_syscall()) |
992 | + time64[1] <<= 32; |
993 | |
994 | if (copy_to_user(argp, time64, sizeof(time64))) |
995 | return -EFAULT; |
996 | diff --git a/drivers/char/tpm/tpm2-cmd.c b/drivers/char/tpm/tpm2-cmd.c |
997 | index ba9acae83bff..5817dfe5c5d2 100644 |
998 | --- a/drivers/char/tpm/tpm2-cmd.c |
999 | +++ b/drivers/char/tpm/tpm2-cmd.c |
1000 | @@ -939,6 +939,10 @@ static int tpm2_get_cc_attrs_tbl(struct tpm_chip *chip) |
1001 | |
1002 | chip->cc_attrs_tbl = devm_kcalloc(&chip->dev, 4, nr_commands, |
1003 | GFP_KERNEL); |
1004 | + if (!chip->cc_attrs_tbl) { |
1005 | + rc = -ENOMEM; |
1006 | + goto out; |
1007 | + } |
1008 | |
1009 | rc = tpm_buf_init(&buf, TPM2_ST_NO_SESSIONS, TPM2_CC_GET_CAPABILITY); |
1010 | if (rc) |
1011 | diff --git a/drivers/char/tpm/tpm_tis.c b/drivers/char/tpm/tpm_tis.c |
1012 | index e4fdde93ed4c..e7df342a317d 100644 |
1013 | --- a/drivers/char/tpm/tpm_tis.c |
1014 | +++ b/drivers/char/tpm/tpm_tis.c |
1015 | @@ -286,7 +286,7 @@ static int tpm_tis_plat_probe(struct platform_device *pdev) |
1016 | } |
1017 | tpm_info.res = *res; |
1018 | |
1019 | - tpm_info.irq = platform_get_irq(pdev, 0); |
1020 | + tpm_info.irq = platform_get_irq_optional(pdev, 0); |
1021 | if (tpm_info.irq <= 0) { |
1022 | if (pdev != force_pdev) |
1023 | tpm_info.irq = -1; |
1024 | diff --git a/drivers/cpufreq/powernv-cpufreq.c b/drivers/cpufreq/powernv-cpufreq.c |
1025 | index 6061850e59c9..56f4bc0d209e 100644 |
1026 | --- a/drivers/cpufreq/powernv-cpufreq.c |
1027 | +++ b/drivers/cpufreq/powernv-cpufreq.c |
1028 | @@ -1041,9 +1041,14 @@ static struct cpufreq_driver powernv_cpufreq_driver = { |
1029 | |
1030 | static int init_chip_info(void) |
1031 | { |
1032 | - unsigned int chip[256]; |
1033 | + unsigned int *chip; |
1034 | unsigned int cpu, i; |
1035 | unsigned int prev_chip_id = UINT_MAX; |
1036 | + int ret = 0; |
1037 | + |
1038 | + chip = kcalloc(num_possible_cpus(), sizeof(*chip), GFP_KERNEL); |
1039 | + if (!chip) |
1040 | + return -ENOMEM; |
1041 | |
1042 | for_each_possible_cpu(cpu) { |
1043 | unsigned int id = cpu_to_chip_id(cpu); |
1044 | @@ -1055,8 +1060,10 @@ static int init_chip_info(void) |
1045 | } |
1046 | |
1047 | chips = kcalloc(nr_chips, sizeof(struct chip), GFP_KERNEL); |
1048 | - if (!chips) |
1049 | - return -ENOMEM; |
1050 | + if (!chips) { |
1051 | + ret = -ENOMEM; |
1052 | + goto free_and_return; |
1053 | + } |
1054 | |
1055 | for (i = 0; i < nr_chips; i++) { |
1056 | chips[i].id = chip[i]; |
1057 | @@ -1066,7 +1073,9 @@ static int init_chip_info(void) |
1058 | per_cpu(chip_info, cpu) = &chips[i]; |
1059 | } |
1060 | |
1061 | - return 0; |
1062 | +free_and_return: |
1063 | + kfree(chip); |
1064 | + return ret; |
1065 | } |
1066 | |
1067 | static inline void clean_chip_info(void) |
1068 | diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c |
1069 | index 0895b988fa92..29d2d7a21bd7 100644 |
1070 | --- a/drivers/cpuidle/cpuidle.c |
1071 | +++ b/drivers/cpuidle/cpuidle.c |
1072 | @@ -384,6 +384,7 @@ u64 cpuidle_poll_time(struct cpuidle_driver *drv, |
1073 | continue; |
1074 | |
1075 | limit_ns = (u64)drv->states[i].target_residency * NSEC_PER_USEC; |
1076 | + break; |
1077 | } |
1078 | |
1079 | dev->poll_limit_ns = limit_ns; |
1080 | diff --git a/drivers/cpuidle/driver.c b/drivers/cpuidle/driver.c |
1081 | index 80c1a830d991..9db154224999 100644 |
1082 | --- a/drivers/cpuidle/driver.c |
1083 | +++ b/drivers/cpuidle/driver.c |
1084 | @@ -62,24 +62,23 @@ static inline void __cpuidle_unset_driver(struct cpuidle_driver *drv) |
1085 | * __cpuidle_set_driver - set per CPU driver variables for the given driver. |
1086 | * @drv: a valid pointer to a struct cpuidle_driver |
1087 | * |
1088 | - * For each CPU in the driver's cpumask, unset the registered driver per CPU |
1089 | - * to @drv. |
1090 | - * |
1091 | - * Returns 0 on success, -EBUSY if the CPUs have driver(s) already. |
1092 | + * Returns 0 on success, -EBUSY if any CPU in the cpumask have a driver |
1093 | + * different from drv already. |
1094 | */ |
1095 | static inline int __cpuidle_set_driver(struct cpuidle_driver *drv) |
1096 | { |
1097 | int cpu; |
1098 | |
1099 | for_each_cpu(cpu, drv->cpumask) { |
1100 | + struct cpuidle_driver *old_drv; |
1101 | |
1102 | - if (__cpuidle_get_cpu_driver(cpu)) { |
1103 | - __cpuidle_unset_driver(drv); |
1104 | + old_drv = __cpuidle_get_cpu_driver(cpu); |
1105 | + if (old_drv && old_drv != drv) |
1106 | return -EBUSY; |
1107 | - } |
1108 | + } |
1109 | |
1110 | + for_each_cpu(cpu, drv->cpumask) |
1111 | per_cpu(cpuidle_drivers, cpu) = drv; |
1112 | - } |
1113 | |
1114 | return 0; |
1115 | } |
1116 | diff --git a/drivers/cpuidle/governors/teo.c b/drivers/cpuidle/governors/teo.c |
1117 | index b5a0e498f798..b9b9156618e6 100644 |
1118 | --- a/drivers/cpuidle/governors/teo.c |
1119 | +++ b/drivers/cpuidle/governors/teo.c |
1120 | @@ -233,7 +233,7 @@ static int teo_select(struct cpuidle_driver *drv, struct cpuidle_device *dev, |
1121 | { |
1122 | struct teo_cpu *cpu_data = per_cpu_ptr(&teo_cpus, dev->cpu); |
1123 | int latency_req = cpuidle_governor_latency_req(dev->cpu); |
1124 | - unsigned int duration_us, count; |
1125 | + unsigned int duration_us, hits, misses, early_hits; |
1126 | int max_early_idx, constraint_idx, idx, i; |
1127 | ktime_t delta_tick; |
1128 | |
1129 | @@ -247,7 +247,9 @@ static int teo_select(struct cpuidle_driver *drv, struct cpuidle_device *dev, |
1130 | cpu_data->sleep_length_ns = tick_nohz_get_sleep_length(&delta_tick); |
1131 | duration_us = ktime_to_us(cpu_data->sleep_length_ns); |
1132 | |
1133 | - count = 0; |
1134 | + hits = 0; |
1135 | + misses = 0; |
1136 | + early_hits = 0; |
1137 | max_early_idx = -1; |
1138 | constraint_idx = drv->state_count; |
1139 | idx = -1; |
1140 | @@ -258,23 +260,61 @@ static int teo_select(struct cpuidle_driver *drv, struct cpuidle_device *dev, |
1141 | |
1142 | if (s->disabled || su->disable) { |
1143 | /* |
1144 | - * If the "early hits" metric of a disabled state is |
1145 | - * greater than the current maximum, it should be taken |
1146 | - * into account, because it would be a mistake to select |
1147 | - * a deeper state with lower "early hits" metric. The |
1148 | - * index cannot be changed to point to it, however, so |
1149 | - * just increase the max count alone and let the index |
1150 | - * still point to a shallower idle state. |
1151 | + * Ignore disabled states with target residencies beyond |
1152 | + * the anticipated idle duration. |
1153 | */ |
1154 | - if (max_early_idx >= 0 && |
1155 | - count < cpu_data->states[i].early_hits) |
1156 | - count = cpu_data->states[i].early_hits; |
1157 | + if (s->target_residency > duration_us) |
1158 | + continue; |
1159 | + |
1160 | + /* |
1161 | + * This state is disabled, so the range of idle duration |
1162 | + * values corresponding to it is covered by the current |
1163 | + * candidate state, but still the "hits" and "misses" |
1164 | + * metrics of the disabled state need to be used to |
1165 | + * decide whether or not the state covering the range in |
1166 | + * question is good enough. |
1167 | + */ |
1168 | + hits = cpu_data->states[i].hits; |
1169 | + misses = cpu_data->states[i].misses; |
1170 | + |
1171 | + if (early_hits >= cpu_data->states[i].early_hits || |
1172 | + idx < 0) |
1173 | + continue; |
1174 | + |
1175 | + /* |
1176 | + * If the current candidate state has been the one with |
1177 | + * the maximum "early hits" metric so far, the "early |
1178 | + * hits" metric of the disabled state replaces the |
1179 | + * current "early hits" count to avoid selecting a |
1180 | + * deeper state with lower "early hits" metric. |
1181 | + */ |
1182 | + if (max_early_idx == idx) { |
1183 | + early_hits = cpu_data->states[i].early_hits; |
1184 | + continue; |
1185 | + } |
1186 | + |
1187 | + /* |
1188 | + * The current candidate state is closer to the disabled |
1189 | + * one than the current maximum "early hits" state, so |
1190 | + * replace the latter with it, but in case the maximum |
1191 | + * "early hits" state index has not been set so far, |
1192 | + * check if the current candidate state is not too |
1193 | + * shallow for that role. |
1194 | + */ |
1195 | + if (!(tick_nohz_tick_stopped() && |
1196 | + drv->states[idx].target_residency < TICK_USEC)) { |
1197 | + early_hits = cpu_data->states[i].early_hits; |
1198 | + max_early_idx = idx; |
1199 | + } |
1200 | |
1201 | continue; |
1202 | } |
1203 | |
1204 | - if (idx < 0) |
1205 | + if (idx < 0) { |
1206 | idx = i; /* first enabled state */ |
1207 | + hits = cpu_data->states[i].hits; |
1208 | + misses = cpu_data->states[i].misses; |
1209 | + } |
1210 | |
1211 | if (s->target_residency > duration_us) |
1212 | break; |
1213 | @@ -283,11 +323,13 @@ static int teo_select(struct cpuidle_driver *drv, struct cpuidle_device *dev, |
1214 | constraint_idx = i; |
1215 | |
1216 | idx = i; |
1217 | + hits = cpu_data->states[i].hits; |
1218 | + misses = cpu_data->states[i].misses; |
1219 | |
1220 | - if (count < cpu_data->states[i].early_hits && |
1221 | + if (early_hits < cpu_data->states[i].early_hits && |
1222 | !(tick_nohz_tick_stopped() && |
1223 | drv->states[i].target_residency < TICK_USEC)) { |
1224 | - count = cpu_data->states[i].early_hits; |
1225 | + early_hits = cpu_data->states[i].early_hits; |
1226 | max_early_idx = i; |
1227 | } |
1228 | } |
1229 | @@ -300,8 +342,7 @@ static int teo_select(struct cpuidle_driver *drv, struct cpuidle_device *dev, |
1230 | * "early hits" metric, but if that cannot be determined, just use the |
1231 | * state selected so far. |
1232 | */ |
1233 | - if (cpu_data->states[idx].hits <= cpu_data->states[idx].misses && |
1234 | - max_early_idx >= 0) { |
1235 | + if (hits <= misses && max_early_idx >= 0) { |
1236 | idx = max_early_idx; |
1237 | duration_us = drv->states[idx].target_residency; |
1238 | } |
1239 | @@ -316,10 +357,9 @@ static int teo_select(struct cpuidle_driver *drv, struct cpuidle_device *dev, |
1240 | if (idx < 0) { |
1241 | idx = 0; /* No states enabled. Must use 0. */ |
1242 | } else if (idx > 0) { |
1243 | + unsigned int count = 0; |
1244 | u64 sum = 0; |
1245 | |
1246 | - count = 0; |
1247 | - |
1248 | /* |
1249 | * Count and sum the most recent idle duration values less than |
1250 | * the current expected idle duration value. |
1251 | diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c |
1252 | index 446490c9d635..3a1484e7a3ae 100644 |
1253 | --- a/drivers/devfreq/devfreq.c |
1254 | +++ b/drivers/devfreq/devfreq.c |
1255 | @@ -160,6 +160,7 @@ int devfreq_update_status(struct devfreq *devfreq, unsigned long freq) |
1256 | int lev, prev_lev, ret = 0; |
1257 | unsigned long cur_time; |
1258 | |
1259 | + lockdep_assert_held(&devfreq->lock); |
1260 | cur_time = jiffies; |
1261 | |
1262 | /* Immediately exit if previous_freq is not initialized yet. */ |
1263 | @@ -1397,12 +1398,17 @@ static ssize_t trans_stat_show(struct device *dev, |
1264 | int i, j; |
1265 | unsigned int max_state = devfreq->profile->max_state; |
1266 | |
1267 | - if (!devfreq->stop_polling && |
1268 | - devfreq_update_status(devfreq, devfreq->previous_freq)) |
1269 | - return 0; |
1270 | if (max_state == 0) |
1271 | return sprintf(buf, "Not Supported.\n"); |
1272 | |
1273 | + mutex_lock(&devfreq->lock); |
1274 | + if (!devfreq->stop_polling && |
1275 | + devfreq_update_status(devfreq, devfreq->previous_freq)) { |
1276 | + mutex_unlock(&devfreq->lock); |
1277 | + return 0; |
1278 | + } |
1279 | + mutex_unlock(&devfreq->lock); |
1280 | + |
1281 | len = sprintf(buf, " From : To\n"); |
1282 | len += sprintf(buf + len, " :"); |
1283 | for (i = 0; i < max_state; i++) |
1284 | diff --git a/drivers/edac/altera_edac.c b/drivers/edac/altera_edac.c |
1285 | index fbda4b876afd..0be3d1b17f03 100644 |
1286 | --- a/drivers/edac/altera_edac.c |
1287 | +++ b/drivers/edac/altera_edac.c |
1288 | @@ -560,6 +560,7 @@ static const struct regmap_config s10_sdram_regmap_cfg = { |
1289 | .reg_write = s10_protected_reg_write, |
1290 | .use_single_read = true, |
1291 | .use_single_write = true, |
1292 | + .fast_io = true, |
1293 | }; |
1294 | |
1295 | /************** </Stratix10 EDAC Memory Controller Functions> ***********/ |
1296 | diff --git a/drivers/edac/ghes_edac.c b/drivers/edac/ghes_edac.c |
1297 | index f6f6a688c009..296e714bf553 100644 |
1298 | --- a/drivers/edac/ghes_edac.c |
1299 | +++ b/drivers/edac/ghes_edac.c |
1300 | @@ -566,8 +566,8 @@ int ghes_edac_register(struct ghes *ghes, struct device *dev) |
1301 | ghes_pvt = pvt; |
1302 | spin_unlock_irqrestore(&ghes_lock, flags); |
1303 | |
1304 | - /* only increment on success */ |
1305 | - refcount_inc(&ghes_refcount); |
1306 | + /* only set on success */ |
1307 | + refcount_set(&ghes_refcount, 1); |
1308 | |
1309 | unlock: |
1310 | mutex_unlock(&ghes_reg_mutex); |
1311 | diff --git a/drivers/firmware/qcom_scm-64.c b/drivers/firmware/qcom_scm-64.c |
1312 | index 91d5ad7cf58b..25e0f60c759a 100644 |
1313 | --- a/drivers/firmware/qcom_scm-64.c |
1314 | +++ b/drivers/firmware/qcom_scm-64.c |
1315 | @@ -150,7 +150,7 @@ static int qcom_scm_call(struct device *dev, u32 svc_id, u32 cmd_id, |
1316 | kfree(args_virt); |
1317 | } |
1318 | |
1319 | - if (res->a0 < 0) |
1320 | + if ((long)res->a0 < 0) |
1321 | return qcom_scm_remap_error(res->a0); |
1322 | |
1323 | return 0; |
1324 | diff --git a/drivers/gpu/drm/panfrost/panfrost_drv.c b/drivers/gpu/drm/panfrost/panfrost_drv.c |
1325 | index f21bc8a7ee3a..bdf91b75328e 100644 |
1326 | --- a/drivers/gpu/drm/panfrost/panfrost_drv.c |
1327 | +++ b/drivers/gpu/drm/panfrost/panfrost_drv.c |
1328 | @@ -443,7 +443,7 @@ panfrost_postclose(struct drm_device *dev, struct drm_file *file) |
1329 | { |
1330 | struct panfrost_file_priv *panfrost_priv = file->driver_priv; |
1331 | |
1332 | - panfrost_perfcnt_close(panfrost_priv); |
1333 | + panfrost_perfcnt_close(file); |
1334 | panfrost_job_close(panfrost_priv); |
1335 | |
1336 | panfrost_mmu_pgtable_free(panfrost_priv); |
1337 | diff --git a/drivers/gpu/drm/panfrost/panfrost_gem.c b/drivers/gpu/drm/panfrost/panfrost_gem.c |
1338 | index acb07fe06580..bc3ff22e5e85 100644 |
1339 | --- a/drivers/gpu/drm/panfrost/panfrost_gem.c |
1340 | +++ b/drivers/gpu/drm/panfrost/panfrost_gem.c |
1341 | @@ -41,7 +41,7 @@ static void panfrost_gem_free_object(struct drm_gem_object *obj) |
1342 | drm_gem_shmem_free_object(obj); |
1343 | } |
1344 | |
1345 | -static int panfrost_gem_open(struct drm_gem_object *obj, struct drm_file *file_priv) |
1346 | +int panfrost_gem_open(struct drm_gem_object *obj, struct drm_file *file_priv) |
1347 | { |
1348 | int ret; |
1349 | size_t size = obj->size; |
1350 | @@ -80,7 +80,7 @@ static int panfrost_gem_open(struct drm_gem_object *obj, struct drm_file *file_p |
1351 | return ret; |
1352 | } |
1353 | |
1354 | -static void panfrost_gem_close(struct drm_gem_object *obj, struct drm_file *file_priv) |
1355 | +void panfrost_gem_close(struct drm_gem_object *obj, struct drm_file *file_priv) |
1356 | { |
1357 | struct panfrost_gem_object *bo = to_panfrost_bo(obj); |
1358 | struct panfrost_file_priv *priv = file_priv->driver_priv; |
1359 | diff --git a/drivers/gpu/drm/panfrost/panfrost_gem.h b/drivers/gpu/drm/panfrost/panfrost_gem.h |
1360 | index 50920819cc16..4b17e7308764 100644 |
1361 | --- a/drivers/gpu/drm/panfrost/panfrost_gem.h |
1362 | +++ b/drivers/gpu/drm/panfrost/panfrost_gem.h |
1363 | @@ -45,6 +45,10 @@ panfrost_gem_create_with_handle(struct drm_file *file_priv, |
1364 | u32 flags, |
1365 | uint32_t *handle); |
1366 | |
1367 | +int panfrost_gem_open(struct drm_gem_object *obj, struct drm_file *file_priv); |
1368 | +void panfrost_gem_close(struct drm_gem_object *obj, |
1369 | + struct drm_file *file_priv); |
1370 | + |
1371 | void panfrost_gem_shrinker_init(struct drm_device *dev); |
1372 | void panfrost_gem_shrinker_cleanup(struct drm_device *dev); |
1373 | |
1374 | diff --git a/drivers/gpu/drm/panfrost/panfrost_perfcnt.c b/drivers/gpu/drm/panfrost/panfrost_perfcnt.c |
1375 | index 2dba192bf198..2c04e858c50a 100644 |
1376 | --- a/drivers/gpu/drm/panfrost/panfrost_perfcnt.c |
1377 | +++ b/drivers/gpu/drm/panfrost/panfrost_perfcnt.c |
1378 | @@ -67,9 +67,10 @@ static int panfrost_perfcnt_dump_locked(struct panfrost_device *pfdev) |
1379 | } |
1380 | |
1381 | static int panfrost_perfcnt_enable_locked(struct panfrost_device *pfdev, |
1382 | - struct panfrost_file_priv *user, |
1383 | + struct drm_file *file_priv, |
1384 | unsigned int counterset) |
1385 | { |
1386 | + struct panfrost_file_priv *user = file_priv->driver_priv; |
1387 | struct panfrost_perfcnt *perfcnt = pfdev->perfcnt; |
1388 | struct drm_gem_shmem_object *bo; |
1389 | u32 cfg; |
1390 | @@ -91,14 +92,14 @@ static int panfrost_perfcnt_enable_locked(struct panfrost_device *pfdev, |
1391 | perfcnt->bo = to_panfrost_bo(&bo->base); |
1392 | |
1393 | /* Map the perfcnt buf in the address space attached to file_priv. */ |
1394 | - ret = panfrost_mmu_map(perfcnt->bo); |
1395 | + ret = panfrost_gem_open(&perfcnt->bo->base.base, file_priv); |
1396 | if (ret) |
1397 | goto err_put_bo; |
1398 | |
1399 | perfcnt->buf = drm_gem_shmem_vmap(&bo->base); |
1400 | if (IS_ERR(perfcnt->buf)) { |
1401 | ret = PTR_ERR(perfcnt->buf); |
1402 | - goto err_put_bo; |
1403 | + goto err_close_bo; |
1404 | } |
1405 | |
1406 | /* |
1407 | @@ -157,14 +158,17 @@ static int panfrost_perfcnt_enable_locked(struct panfrost_device *pfdev, |
1408 | |
1409 | err_vunmap: |
1410 | drm_gem_shmem_vunmap(&perfcnt->bo->base.base, perfcnt->buf); |
1411 | +err_close_bo: |
1412 | + panfrost_gem_close(&perfcnt->bo->base.base, file_priv); |
1413 | err_put_bo: |
1414 | drm_gem_object_put_unlocked(&bo->base); |
1415 | return ret; |
1416 | } |
1417 | |
1418 | static int panfrost_perfcnt_disable_locked(struct panfrost_device *pfdev, |
1419 | - struct panfrost_file_priv *user) |
1420 | + struct drm_file *file_priv) |
1421 | { |
1422 | + struct panfrost_file_priv *user = file_priv->driver_priv; |
1423 | struct panfrost_perfcnt *perfcnt = pfdev->perfcnt; |
1424 | |
1425 | if (user != perfcnt->user) |
1426 | @@ -180,6 +184,7 @@ static int panfrost_perfcnt_disable_locked(struct panfrost_device *pfdev, |
1427 | perfcnt->user = NULL; |
1428 | drm_gem_shmem_vunmap(&perfcnt->bo->base.base, perfcnt->buf); |
1429 | perfcnt->buf = NULL; |
1430 | + panfrost_gem_close(&perfcnt->bo->base.base, file_priv); |
1431 | drm_gem_object_put_unlocked(&perfcnt->bo->base.base); |
1432 | perfcnt->bo = NULL; |
1433 | pm_runtime_mark_last_busy(pfdev->dev); |
1434 | @@ -191,7 +196,6 @@ static int panfrost_perfcnt_disable_locked(struct panfrost_device *pfdev, |
1435 | int panfrost_ioctl_perfcnt_enable(struct drm_device *dev, void *data, |
1436 | struct drm_file *file_priv) |
1437 | { |
1438 | - struct panfrost_file_priv *pfile = file_priv->driver_priv; |
1439 | struct panfrost_device *pfdev = dev->dev_private; |
1440 | struct panfrost_perfcnt *perfcnt = pfdev->perfcnt; |
1441 | struct drm_panfrost_perfcnt_enable *req = data; |
1442 | @@ -207,10 +211,10 @@ int panfrost_ioctl_perfcnt_enable(struct drm_device *dev, void *data, |
1443 | |
1444 | mutex_lock(&perfcnt->lock); |
1445 | if (req->enable) |
1446 | - ret = panfrost_perfcnt_enable_locked(pfdev, pfile, |
1447 | + ret = panfrost_perfcnt_enable_locked(pfdev, file_priv, |
1448 | req->counterset); |
1449 | else |
1450 | - ret = panfrost_perfcnt_disable_locked(pfdev, pfile); |
1451 | + ret = panfrost_perfcnt_disable_locked(pfdev, file_priv); |
1452 | mutex_unlock(&perfcnt->lock); |
1453 | |
1454 | return ret; |
1455 | @@ -248,15 +252,16 @@ out: |
1456 | return ret; |
1457 | } |
1458 | |
1459 | -void panfrost_perfcnt_close(struct panfrost_file_priv *pfile) |
1460 | +void panfrost_perfcnt_close(struct drm_file *file_priv) |
1461 | { |
1462 | + struct panfrost_file_priv *pfile = file_priv->driver_priv; |
1463 | struct panfrost_device *pfdev = pfile->pfdev; |
1464 | struct panfrost_perfcnt *perfcnt = pfdev->perfcnt; |
1465 | |
1466 | pm_runtime_get_sync(pfdev->dev); |
1467 | mutex_lock(&perfcnt->lock); |
1468 | if (perfcnt->user == pfile) |
1469 | - panfrost_perfcnt_disable_locked(pfdev, pfile); |
1470 | + panfrost_perfcnt_disable_locked(pfdev, file_priv); |
1471 | mutex_unlock(&perfcnt->lock); |
1472 | pm_runtime_mark_last_busy(pfdev->dev); |
1473 | pm_runtime_put_autosuspend(pfdev->dev); |
1474 | diff --git a/drivers/gpu/drm/panfrost/panfrost_perfcnt.h b/drivers/gpu/drm/panfrost/panfrost_perfcnt.h |
1475 | index 13b8fdaa1b43..8bbcf5f5fb33 100644 |
1476 | --- a/drivers/gpu/drm/panfrost/panfrost_perfcnt.h |
1477 | +++ b/drivers/gpu/drm/panfrost/panfrost_perfcnt.h |
1478 | @@ -9,7 +9,7 @@ void panfrost_perfcnt_sample_done(struct panfrost_device *pfdev); |
1479 | void panfrost_perfcnt_clean_cache_done(struct panfrost_device *pfdev); |
1480 | int panfrost_perfcnt_init(struct panfrost_device *pfdev); |
1481 | void panfrost_perfcnt_fini(struct panfrost_device *pfdev); |
1482 | -void panfrost_perfcnt_close(struct panfrost_file_priv *pfile); |
1483 | +void panfrost_perfcnt_close(struct drm_file *file_priv); |
1484 | int panfrost_ioctl_perfcnt_enable(struct drm_device *dev, void *data, |
1485 | struct drm_file *file_priv); |
1486 | int panfrost_ioctl_perfcnt_dump(struct drm_device *dev, void *data, |
1487 | diff --git a/drivers/hwtracing/coresight/coresight-funnel.c b/drivers/hwtracing/coresight/coresight-funnel.c |
1488 | index 05f7896c3a01..b605889b507a 100644 |
1489 | --- a/drivers/hwtracing/coresight/coresight-funnel.c |
1490 | +++ b/drivers/hwtracing/coresight/coresight-funnel.c |
1491 | @@ -38,12 +38,14 @@ DEFINE_CORESIGHT_DEVLIST(funnel_devs, "funnel"); |
1492 | * @atclk: optional clock for the core parts of the funnel. |
1493 | * @csdev: component vitals needed by the framework. |
1494 | * @priority: port selection order. |
1495 | + * @spinlock: serialize enable/disable operations. |
1496 | */ |
1497 | struct funnel_drvdata { |
1498 | void __iomem *base; |
1499 | struct clk *atclk; |
1500 | struct coresight_device *csdev; |
1501 | unsigned long priority; |
1502 | + spinlock_t spinlock; |
1503 | }; |
1504 | |
1505 | static int dynamic_funnel_enable_hw(struct funnel_drvdata *drvdata, int port) |
1506 | @@ -76,11 +78,21 @@ static int funnel_enable(struct coresight_device *csdev, int inport, |
1507 | { |
1508 | int rc = 0; |
1509 | struct funnel_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent); |
1510 | - |
1511 | - if (drvdata->base) |
1512 | - rc = dynamic_funnel_enable_hw(drvdata, inport); |
1513 | - |
1514 | + unsigned long flags; |
1515 | + bool first_enable = false; |
1516 | + |
1517 | + spin_lock_irqsave(&drvdata->spinlock, flags); |
1518 | + if (atomic_read(&csdev->refcnt[inport]) == 0) { |
1519 | + if (drvdata->base) |
1520 | + rc = dynamic_funnel_enable_hw(drvdata, inport); |
1521 | + if (!rc) |
1522 | + first_enable = true; |
1523 | + } |
1524 | if (!rc) |
1525 | + atomic_inc(&csdev->refcnt[inport]); |
1526 | + spin_unlock_irqrestore(&drvdata->spinlock, flags); |
1527 | + |
1528 | + if (first_enable) |
1529 | dev_dbg(&csdev->dev, "FUNNEL inport %d enabled\n", inport); |
1530 | return rc; |
1531 | } |
1532 | @@ -107,11 +119,19 @@ static void funnel_disable(struct coresight_device *csdev, int inport, |
1533 | int outport) |
1534 | { |
1535 | struct funnel_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent); |
1536 | + unsigned long flags; |
1537 | + bool last_disable = false; |
1538 | + |
1539 | + spin_lock_irqsave(&drvdata->spinlock, flags); |
1540 | + if (atomic_dec_return(&csdev->refcnt[inport]) == 0) { |
1541 | + if (drvdata->base) |
1542 | + dynamic_funnel_disable_hw(drvdata, inport); |
1543 | + last_disable = true; |
1544 | + } |
1545 | + spin_unlock_irqrestore(&drvdata->spinlock, flags); |
1546 | |
1547 | - if (drvdata->base) |
1548 | - dynamic_funnel_disable_hw(drvdata, inport); |
1549 | - |
1550 | - dev_dbg(&csdev->dev, "FUNNEL inport %d disabled\n", inport); |
1551 | + if (last_disable) |
1552 | + dev_dbg(&csdev->dev, "FUNNEL inport %d disabled\n", inport); |
1553 | } |
1554 | |
1555 | static const struct coresight_ops_link funnel_link_ops = { |
1556 | diff --git a/drivers/hwtracing/coresight/coresight-replicator.c b/drivers/hwtracing/coresight/coresight-replicator.c |
1557 | index b29ba640eb25..43304196a1a6 100644 |
1558 | --- a/drivers/hwtracing/coresight/coresight-replicator.c |
1559 | +++ b/drivers/hwtracing/coresight/coresight-replicator.c |
1560 | @@ -31,11 +31,13 @@ DEFINE_CORESIGHT_DEVLIST(replicator_devs, "replicator"); |
1561 | * whether this one is programmable or not. |
1562 | * @atclk: optional clock for the core parts of the replicator. |
1563 | * @csdev: component vitals needed by the framework |
1564 | + * @spinlock: serialize enable/disable operations. |
1565 | */ |
1566 | struct replicator_drvdata { |
1567 | void __iomem *base; |
1568 | struct clk *atclk; |
1569 | struct coresight_device *csdev; |
1570 | + spinlock_t spinlock; |
1571 | }; |
1572 | |
1573 | static void dynamic_replicator_reset(struct replicator_drvdata *drvdata) |
1574 | @@ -97,10 +99,22 @@ static int replicator_enable(struct coresight_device *csdev, int inport, |
1575 | { |
1576 | int rc = 0; |
1577 | struct replicator_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent); |
1578 | - |
1579 | - if (drvdata->base) |
1580 | - rc = dynamic_replicator_enable(drvdata, inport, outport); |
1581 | + unsigned long flags; |
1582 | + bool first_enable = false; |
1583 | + |
1584 | + spin_lock_irqsave(&drvdata->spinlock, flags); |
1585 | + if (atomic_read(&csdev->refcnt[outport]) == 0) { |
1586 | + if (drvdata->base) |
1587 | + rc = dynamic_replicator_enable(drvdata, inport, |
1588 | + outport); |
1589 | + if (!rc) |
1590 | + first_enable = true; |
1591 | + } |
1592 | if (!rc) |
1593 | + atomic_inc(&csdev->refcnt[outport]); |
1594 | + spin_unlock_irqrestore(&drvdata->spinlock, flags); |
1595 | + |
1596 | + if (first_enable) |
1597 | dev_dbg(&csdev->dev, "REPLICATOR enabled\n"); |
1598 | return rc; |
1599 | } |
1600 | @@ -137,10 +151,19 @@ static void replicator_disable(struct coresight_device *csdev, int inport, |
1601 | int outport) |
1602 | { |
1603 | struct replicator_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent); |
1604 | + unsigned long flags; |
1605 | + bool last_disable = false; |
1606 | + |
1607 | + spin_lock_irqsave(&drvdata->spinlock, flags); |
1608 | + if (atomic_dec_return(&csdev->refcnt[outport]) == 0) { |
1609 | + if (drvdata->base) |
1610 | + dynamic_replicator_disable(drvdata, inport, outport); |
1611 | + last_disable = true; |
1612 | + } |
1613 | + spin_unlock_irqrestore(&drvdata->spinlock, flags); |
1614 | |
1615 | - if (drvdata->base) |
1616 | - dynamic_replicator_disable(drvdata, inport, outport); |
1617 | - dev_dbg(&csdev->dev, "REPLICATOR disabled\n"); |
1618 | + if (last_disable) |
1619 | + dev_dbg(&csdev->dev, "REPLICATOR disabled\n"); |
1620 | } |
1621 | |
1622 | static const struct coresight_ops_link replicator_link_ops = { |
1623 | diff --git a/drivers/hwtracing/coresight/coresight-tmc-etf.c b/drivers/hwtracing/coresight/coresight-tmc-etf.c |
1624 | index 807416b75ecc..d0cc3985b72a 100644 |
1625 | --- a/drivers/hwtracing/coresight/coresight-tmc-etf.c |
1626 | +++ b/drivers/hwtracing/coresight/coresight-tmc-etf.c |
1627 | @@ -334,9 +334,10 @@ static int tmc_disable_etf_sink(struct coresight_device *csdev) |
1628 | static int tmc_enable_etf_link(struct coresight_device *csdev, |
1629 | int inport, int outport) |
1630 | { |
1631 | - int ret; |
1632 | + int ret = 0; |
1633 | unsigned long flags; |
1634 | struct tmc_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent); |
1635 | + bool first_enable = false; |
1636 | |
1637 | spin_lock_irqsave(&drvdata->spinlock, flags); |
1638 | if (drvdata->reading) { |
1639 | @@ -344,12 +345,18 @@ static int tmc_enable_etf_link(struct coresight_device *csdev, |
1640 | return -EBUSY; |
1641 | } |
1642 | |
1643 | - ret = tmc_etf_enable_hw(drvdata); |
1644 | + if (atomic_read(&csdev->refcnt[0]) == 0) { |
1645 | + ret = tmc_etf_enable_hw(drvdata); |
1646 | + if (!ret) { |
1647 | + drvdata->mode = CS_MODE_SYSFS; |
1648 | + first_enable = true; |
1649 | + } |
1650 | + } |
1651 | if (!ret) |
1652 | - drvdata->mode = CS_MODE_SYSFS; |
1653 | + atomic_inc(&csdev->refcnt[0]); |
1654 | spin_unlock_irqrestore(&drvdata->spinlock, flags); |
1655 | |
1656 | - if (!ret) |
1657 | + if (first_enable) |
1658 | dev_dbg(&csdev->dev, "TMC-ETF enabled\n"); |
1659 | return ret; |
1660 | } |
1661 | @@ -359,6 +366,7 @@ static void tmc_disable_etf_link(struct coresight_device *csdev, |
1662 | { |
1663 | unsigned long flags; |
1664 | struct tmc_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent); |
1665 | + bool last_disable = false; |
1666 | |
1667 | spin_lock_irqsave(&drvdata->spinlock, flags); |
1668 | if (drvdata->reading) { |
1669 | @@ -366,11 +374,15 @@ static void tmc_disable_etf_link(struct coresight_device *csdev, |
1670 | return; |
1671 | } |
1672 | |
1673 | - tmc_etf_disable_hw(drvdata); |
1674 | - drvdata->mode = CS_MODE_DISABLED; |
1675 | + if (atomic_dec_return(&csdev->refcnt[0]) == 0) { |
1676 | + tmc_etf_disable_hw(drvdata); |
1677 | + drvdata->mode = CS_MODE_DISABLED; |
1678 | + last_disable = true; |
1679 | + } |
1680 | spin_unlock_irqrestore(&drvdata->spinlock, flags); |
1681 | |
1682 | - dev_dbg(&csdev->dev, "TMC-ETF disabled\n"); |
1683 | + if (last_disable) |
1684 | + dev_dbg(&csdev->dev, "TMC-ETF disabled\n"); |
1685 | } |
1686 | |
1687 | static void *tmc_alloc_etf_buffer(struct coresight_device *csdev, |
1688 | diff --git a/drivers/hwtracing/coresight/coresight.c b/drivers/hwtracing/coresight/coresight.c |
1689 | index 6453c67a4d01..0bbce0d29158 100644 |
1690 | --- a/drivers/hwtracing/coresight/coresight.c |
1691 | +++ b/drivers/hwtracing/coresight/coresight.c |
1692 | @@ -253,9 +253,9 @@ static int coresight_enable_link(struct coresight_device *csdev, |
1693 | struct coresight_device *parent, |
1694 | struct coresight_device *child) |
1695 | { |
1696 | - int ret; |
1697 | + int ret = 0; |
1698 | int link_subtype; |
1699 | - int refport, inport, outport; |
1700 | + int inport, outport; |
1701 | |
1702 | if (!parent || !child) |
1703 | return -EINVAL; |
1704 | @@ -264,29 +264,17 @@ static int coresight_enable_link(struct coresight_device *csdev, |
1705 | outport = coresight_find_link_outport(csdev, child); |
1706 | link_subtype = csdev->subtype.link_subtype; |
1707 | |
1708 | - if (link_subtype == CORESIGHT_DEV_SUBTYPE_LINK_MERG) |
1709 | - refport = inport; |
1710 | - else if (link_subtype == CORESIGHT_DEV_SUBTYPE_LINK_SPLIT) |
1711 | - refport = outport; |
1712 | - else |
1713 | - refport = 0; |
1714 | - |
1715 | - if (refport < 0) |
1716 | - return refport; |
1717 | + if (link_subtype == CORESIGHT_DEV_SUBTYPE_LINK_MERG && inport < 0) |
1718 | + return inport; |
1719 | + if (link_subtype == CORESIGHT_DEV_SUBTYPE_LINK_SPLIT && outport < 0) |
1720 | + return outport; |
1721 | |
1722 | - if (atomic_inc_return(&csdev->refcnt[refport]) == 1) { |
1723 | - if (link_ops(csdev)->enable) { |
1724 | - ret = link_ops(csdev)->enable(csdev, inport, outport); |
1725 | - if (ret) { |
1726 | - atomic_dec(&csdev->refcnt[refport]); |
1727 | - return ret; |
1728 | - } |
1729 | - } |
1730 | - } |
1731 | - |
1732 | - csdev->enable = true; |
1733 | + if (link_ops(csdev)->enable) |
1734 | + ret = link_ops(csdev)->enable(csdev, inport, outport); |
1735 | + if (!ret) |
1736 | + csdev->enable = true; |
1737 | |
1738 | - return 0; |
1739 | + return ret; |
1740 | } |
1741 | |
1742 | static void coresight_disable_link(struct coresight_device *csdev, |
1743 | @@ -295,7 +283,7 @@ static void coresight_disable_link(struct coresight_device *csdev, |
1744 | { |
1745 | int i, nr_conns; |
1746 | int link_subtype; |
1747 | - int refport, inport, outport; |
1748 | + int inport, outport; |
1749 | |
1750 | if (!parent || !child) |
1751 | return; |
1752 | @@ -305,20 +293,15 @@ static void coresight_disable_link(struct coresight_device *csdev, |
1753 | link_subtype = csdev->subtype.link_subtype; |
1754 | |
1755 | if (link_subtype == CORESIGHT_DEV_SUBTYPE_LINK_MERG) { |
1756 | - refport = inport; |
1757 | nr_conns = csdev->pdata->nr_inport; |
1758 | } else if (link_subtype == CORESIGHT_DEV_SUBTYPE_LINK_SPLIT) { |
1759 | - refport = outport; |
1760 | nr_conns = csdev->pdata->nr_outport; |
1761 | } else { |
1762 | - refport = 0; |
1763 | nr_conns = 1; |
1764 | } |
1765 | |
1766 | - if (atomic_dec_return(&csdev->refcnt[refport]) == 0) { |
1767 | - if (link_ops(csdev)->disable) |
1768 | - link_ops(csdev)->disable(csdev, inport, outport); |
1769 | - } |
1770 | + if (link_ops(csdev)->disable) |
1771 | + link_ops(csdev)->disable(csdev, inport, outport); |
1772 | |
1773 | for (i = 0; i < nr_conns; i++) |
1774 | if (atomic_read(&csdev->refcnt[i]) != 0) |
1775 | diff --git a/drivers/hwtracing/intel_th/core.c b/drivers/hwtracing/intel_th/core.c |
1776 | index d5c1821b31c6..0dfd97bbde9e 100644 |
1777 | --- a/drivers/hwtracing/intel_th/core.c |
1778 | +++ b/drivers/hwtracing/intel_th/core.c |
1779 | @@ -649,10 +649,8 @@ intel_th_subdevice_alloc(struct intel_th *th, |
1780 | } |
1781 | |
1782 | err = intel_th_device_add_resources(thdev, res, subdev->nres); |
1783 | - if (err) { |
1784 | - put_device(&thdev->dev); |
1785 | + if (err) |
1786 | goto fail_put_device; |
1787 | - } |
1788 | |
1789 | if (subdev->type == INTEL_TH_OUTPUT) { |
1790 | if (subdev->mknode) |
1791 | @@ -667,10 +665,8 @@ intel_th_subdevice_alloc(struct intel_th *th, |
1792 | } |
1793 | |
1794 | err = device_add(&thdev->dev); |
1795 | - if (err) { |
1796 | - put_device(&thdev->dev); |
1797 | + if (err) |
1798 | goto fail_free_res; |
1799 | - } |
1800 | |
1801 | /* need switch driver to be loaded to enumerate the rest */ |
1802 | if (subdev->type == INTEL_TH_SWITCH && !req) { |
1803 | diff --git a/drivers/hwtracing/intel_th/pci.c b/drivers/hwtracing/intel_th/pci.c |
1804 | index 03ca5b1bef9f..ebf3e30e989a 100644 |
1805 | --- a/drivers/hwtracing/intel_th/pci.c |
1806 | +++ b/drivers/hwtracing/intel_th/pci.c |
1807 | @@ -209,6 +209,16 @@ static const struct pci_device_id intel_th_pci_id_table[] = { |
1808 | PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x45c5), |
1809 | .driver_data = (kernel_ulong_t)&intel_th_2x, |
1810 | }, |
1811 | + { |
1812 | + /* Ice Lake CPU */ |
1813 | + PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x8a29), |
1814 | + .driver_data = (kernel_ulong_t)&intel_th_2x, |
1815 | + }, |
1816 | + { |
1817 | + /* Tiger Lake CPU */ |
1818 | + PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x9a33), |
1819 | + .driver_data = (kernel_ulong_t)&intel_th_2x, |
1820 | + }, |
1821 | { |
1822 | /* Tiger Lake PCH */ |
1823 | PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa0a6), |
1824 | diff --git a/drivers/hwtracing/stm/policy.c b/drivers/hwtracing/stm/policy.c |
1825 | index 4b9e44b227d8..4f932a419752 100644 |
1826 | --- a/drivers/hwtracing/stm/policy.c |
1827 | +++ b/drivers/hwtracing/stm/policy.c |
1828 | @@ -345,7 +345,11 @@ void stp_policy_unbind(struct stp_policy *policy) |
1829 | stm->policy = NULL; |
1830 | policy->stm = NULL; |
1831 | |
1832 | + /* |
1833 | + * Drop the reference on the protocol driver and lose the link. |
1834 | + */ |
1835 | stm_put_protocol(stm->pdrv); |
1836 | + stm->pdrv = NULL; |
1837 | stm_put_device(stm); |
1838 | } |
1839 | |
1840 | diff --git a/drivers/iio/adc/ad7124.c b/drivers/iio/adc/ad7124.c |
1841 | index edc6f1cc90b2..3f03abf100b5 100644 |
1842 | --- a/drivers/iio/adc/ad7124.c |
1843 | +++ b/drivers/iio/adc/ad7124.c |
1844 | @@ -39,6 +39,8 @@ |
1845 | #define AD7124_STATUS_POR_FLAG_MSK BIT(4) |
1846 | |
1847 | /* AD7124_ADC_CONTROL */ |
1848 | +#define AD7124_ADC_CTRL_REF_EN_MSK BIT(8) |
1849 | +#define AD7124_ADC_CTRL_REF_EN(x) FIELD_PREP(AD7124_ADC_CTRL_REF_EN_MSK, x) |
1850 | #define AD7124_ADC_CTRL_PWR_MSK GENMASK(7, 6) |
1851 | #define AD7124_ADC_CTRL_PWR(x) FIELD_PREP(AD7124_ADC_CTRL_PWR_MSK, x) |
1852 | #define AD7124_ADC_CTRL_MODE_MSK GENMASK(5, 2) |
1853 | @@ -424,7 +426,10 @@ static int ad7124_init_channel_vref(struct ad7124_state *st, |
1854 | break; |
1855 | case AD7124_INT_REF: |
1856 | st->channel_config[channel_number].vref_mv = 2500; |
1857 | - break; |
1858 | + st->adc_control &= ~AD7124_ADC_CTRL_REF_EN_MSK; |
1859 | + st->adc_control |= AD7124_ADC_CTRL_REF_EN(1); |
1860 | + return ad_sd_write_reg(&st->sd, AD7124_ADC_CONTROL, |
1861 | + 2, st->adc_control); |
1862 | default: |
1863 | dev_err(&st->sd.spi->dev, "Invalid reference %d\n", refsel); |
1864 | return -EINVAL; |
1865 | diff --git a/drivers/iio/adc/ad7606.c b/drivers/iio/adc/ad7606.c |
1866 | index f5ba94c03a8d..e4683a68522a 100644 |
1867 | --- a/drivers/iio/adc/ad7606.c |
1868 | +++ b/drivers/iio/adc/ad7606.c |
1869 | @@ -85,7 +85,7 @@ err_unlock: |
1870 | |
1871 | static int ad7606_read_samples(struct ad7606_state *st) |
1872 | { |
1873 | - unsigned int num = st->chip_info->num_channels; |
1874 | + unsigned int num = st->chip_info->num_channels - 1; |
1875 | u16 *data = st->data; |
1876 | int ret; |
1877 | |
1878 | diff --git a/drivers/iio/adc/ad7949.c b/drivers/iio/adc/ad7949.c |
1879 | index ac0ffff6c5ae..6b51bfcad0d0 100644 |
1880 | --- a/drivers/iio/adc/ad7949.c |
1881 | +++ b/drivers/iio/adc/ad7949.c |
1882 | @@ -57,29 +57,11 @@ struct ad7949_adc_chip { |
1883 | u32 buffer ____cacheline_aligned; |
1884 | }; |
1885 | |
1886 | -static bool ad7949_spi_cfg_is_read_back(struct ad7949_adc_chip *ad7949_adc) |
1887 | -{ |
1888 | - if (!(ad7949_adc->cfg & AD7949_CFG_READ_BACK)) |
1889 | - return true; |
1890 | - |
1891 | - return false; |
1892 | -} |
1893 | - |
1894 | -static int ad7949_spi_bits_per_word(struct ad7949_adc_chip *ad7949_adc) |
1895 | -{ |
1896 | - int ret = ad7949_adc->resolution; |
1897 | - |
1898 | - if (ad7949_spi_cfg_is_read_back(ad7949_adc)) |
1899 | - ret += AD7949_CFG_REG_SIZE_BITS; |
1900 | - |
1901 | - return ret; |
1902 | -} |
1903 | - |
1904 | static int ad7949_spi_write_cfg(struct ad7949_adc_chip *ad7949_adc, u16 val, |
1905 | u16 mask) |
1906 | { |
1907 | int ret; |
1908 | - int bits_per_word = ad7949_spi_bits_per_word(ad7949_adc); |
1909 | + int bits_per_word = ad7949_adc->resolution; |
1910 | int shift = bits_per_word - AD7949_CFG_REG_SIZE_BITS; |
1911 | struct spi_message msg; |
1912 | struct spi_transfer tx[] = { |
1913 | @@ -107,7 +89,8 @@ static int ad7949_spi_read_channel(struct ad7949_adc_chip *ad7949_adc, int *val, |
1914 | unsigned int channel) |
1915 | { |
1916 | int ret; |
1917 | - int bits_per_word = ad7949_spi_bits_per_word(ad7949_adc); |
1918 | + int i; |
1919 | + int bits_per_word = ad7949_adc->resolution; |
1920 | int mask = GENMASK(ad7949_adc->resolution, 0); |
1921 | struct spi_message msg; |
1922 | struct spi_transfer tx[] = { |
1923 | @@ -118,12 +101,23 @@ static int ad7949_spi_read_channel(struct ad7949_adc_chip *ad7949_adc, int *val, |
1924 | }, |
1925 | }; |
1926 | |
1927 | - ret = ad7949_spi_write_cfg(ad7949_adc, |
1928 | - channel << AD7949_OFFSET_CHANNEL_SEL, |
1929 | - AD7949_MASK_CHANNEL_SEL); |
1930 | - if (ret) |
1931 | - return ret; |
1932 | + /* |
1933 | + * 1: write CFG for sample N and read old data (sample N-2) |
1934 | + * 2: if CFG was not changed since sample N-1 then we'll get good data |
1935 | + * at the next xfer, so we bail out now, otherwise we write something |
1936 | + * and we read garbage (sample N-1 configuration). |
1937 | + */ |
1938 | + for (i = 0; i < 2; i++) { |
1939 | + ret = ad7949_spi_write_cfg(ad7949_adc, |
1940 | + channel << AD7949_OFFSET_CHANNEL_SEL, |
1941 | + AD7949_MASK_CHANNEL_SEL); |
1942 | + if (ret) |
1943 | + return ret; |
1944 | + if (channel == ad7949_adc->current_channel) |
1945 | + break; |
1946 | + } |
1947 | |
1948 | + /* 3: write something and read actual data */ |
1949 | ad7949_adc->buffer = 0; |
1950 | spi_message_init_with_transfers(&msg, tx, 1); |
1951 | ret = spi_sync(ad7949_adc->spi, &msg); |
1952 | @@ -138,10 +132,7 @@ static int ad7949_spi_read_channel(struct ad7949_adc_chip *ad7949_adc, int *val, |
1953 | |
1954 | ad7949_adc->current_channel = channel; |
1955 | |
1956 | - if (ad7949_spi_cfg_is_read_back(ad7949_adc)) |
1957 | - *val = (ad7949_adc->buffer >> AD7949_CFG_REG_SIZE_BITS) & mask; |
1958 | - else |
1959 | - *val = ad7949_adc->buffer & mask; |
1960 | + *val = ad7949_adc->buffer & mask; |
1961 | |
1962 | return 0; |
1963 | } |
1964 | diff --git a/drivers/iio/humidity/hdc100x.c b/drivers/iio/humidity/hdc100x.c |
1965 | index bfe1cdb16846..dcf5a5bdfaa8 100644 |
1966 | --- a/drivers/iio/humidity/hdc100x.c |
1967 | +++ b/drivers/iio/humidity/hdc100x.c |
1968 | @@ -229,7 +229,7 @@ static int hdc100x_read_raw(struct iio_dev *indio_dev, |
1969 | *val2 = 65536; |
1970 | return IIO_VAL_FRACTIONAL; |
1971 | } else { |
1972 | - *val = 100; |
1973 | + *val = 100000; |
1974 | *val2 = 65536; |
1975 | return IIO_VAL_FRACTIONAL; |
1976 | } |
1977 | diff --git a/drivers/iio/imu/adis16480.c b/drivers/iio/imu/adis16480.c |
1978 | index 8743b2f376e2..7b966a41d623 100644 |
1979 | --- a/drivers/iio/imu/adis16480.c |
1980 | +++ b/drivers/iio/imu/adis16480.c |
1981 | @@ -623,9 +623,13 @@ static int adis16480_read_raw(struct iio_dev *indio_dev, |
1982 | *val2 = (st->chip_info->temp_scale % 1000) * 1000; |
1983 | return IIO_VAL_INT_PLUS_MICRO; |
1984 | case IIO_PRESSURE: |
1985 | - *val = 0; |
1986 | - *val2 = 4000; /* 40ubar = 0.004 kPa */ |
1987 | - return IIO_VAL_INT_PLUS_MICRO; |
1988 | + /* |
1989 | + * max scale is 1310 mbar |
1990 | + * max raw value is 32767 shifted for 32bits |
1991 | + */ |
1992 | + *val = 131; /* 1310mbar = 131 kPa */ |
1993 | + *val2 = 32767 << 16; |
1994 | + return IIO_VAL_FRACTIONAL; |
1995 | default: |
1996 | return -EINVAL; |
1997 | } |
1998 | @@ -786,13 +790,14 @@ static const struct adis16480_chip_info adis16480_chip_info[] = { |
1999 | .channels = adis16485_channels, |
2000 | .num_channels = ARRAY_SIZE(adis16485_channels), |
2001 | /* |
2002 | - * storing the value in rad/degree and the scale in degree |
2003 | - * gives us the result in rad and better precession than |
2004 | - * storing the scale directly in rad. |
2005 | + * Typically we do IIO_RAD_TO_DEGREE in the denominator, which |
2006 | + * is exactly the same as IIO_DEGREE_TO_RAD in numerator, since |
2007 | + * it gives better approximation. However, in this case we |
2008 | + * cannot do it since it would not fit in a 32bit variable. |
2009 | */ |
2010 | - .gyro_max_val = IIO_RAD_TO_DEGREE(22887), |
2011 | - .gyro_max_scale = 300, |
2012 | - .accel_max_val = IIO_M_S_2_TO_G(21973), |
2013 | + .gyro_max_val = 22887 << 16, |
2014 | + .gyro_max_scale = IIO_DEGREE_TO_RAD(300), |
2015 | + .accel_max_val = IIO_M_S_2_TO_G(21973 << 16), |
2016 | .accel_max_scale = 18, |
2017 | .temp_scale = 5650, /* 5.65 milli degree Celsius */ |
2018 | .int_clk = 2460000, |
2019 | @@ -802,9 +807,9 @@ static const struct adis16480_chip_info adis16480_chip_info[] = { |
2020 | [ADIS16480] = { |
2021 | .channels = adis16480_channels, |
2022 | .num_channels = ARRAY_SIZE(adis16480_channels), |
2023 | - .gyro_max_val = IIO_RAD_TO_DEGREE(22500), |
2024 | - .gyro_max_scale = 450, |
2025 | - .accel_max_val = IIO_M_S_2_TO_G(12500), |
2026 | + .gyro_max_val = 22500 << 16, |
2027 | + .gyro_max_scale = IIO_DEGREE_TO_RAD(450), |
2028 | + .accel_max_val = IIO_M_S_2_TO_G(12500 << 16), |
2029 | .accel_max_scale = 10, |
2030 | .temp_scale = 5650, /* 5.65 milli degree Celsius */ |
2031 | .int_clk = 2460000, |
2032 | @@ -814,9 +819,9 @@ static const struct adis16480_chip_info adis16480_chip_info[] = { |
2033 | [ADIS16485] = { |
2034 | .channels = adis16485_channels, |
2035 | .num_channels = ARRAY_SIZE(adis16485_channels), |
2036 | - .gyro_max_val = IIO_RAD_TO_DEGREE(22500), |
2037 | - .gyro_max_scale = 450, |
2038 | - .accel_max_val = IIO_M_S_2_TO_G(20000), |
2039 | + .gyro_max_val = 22500 << 16, |
2040 | + .gyro_max_scale = IIO_DEGREE_TO_RAD(450), |
2041 | + .accel_max_val = IIO_M_S_2_TO_G(20000 << 16), |
2042 | .accel_max_scale = 5, |
2043 | .temp_scale = 5650, /* 5.65 milli degree Celsius */ |
2044 | .int_clk = 2460000, |
2045 | @@ -826,9 +831,9 @@ static const struct adis16480_chip_info adis16480_chip_info[] = { |
2046 | [ADIS16488] = { |
2047 | .channels = adis16480_channels, |
2048 | .num_channels = ARRAY_SIZE(adis16480_channels), |
2049 | - .gyro_max_val = IIO_RAD_TO_DEGREE(22500), |
2050 | - .gyro_max_scale = 450, |
2051 | - .accel_max_val = IIO_M_S_2_TO_G(22500), |
2052 | + .gyro_max_val = 22500 << 16, |
2053 | + .gyro_max_scale = IIO_DEGREE_TO_RAD(450), |
2054 | + .accel_max_val = IIO_M_S_2_TO_G(22500 << 16), |
2055 | .accel_max_scale = 18, |
2056 | .temp_scale = 5650, /* 5.65 milli degree Celsius */ |
2057 | .int_clk = 2460000, |
2058 | @@ -838,9 +843,9 @@ static const struct adis16480_chip_info adis16480_chip_info[] = { |
2059 | [ADIS16495_1] = { |
2060 | .channels = adis16485_channels, |
2061 | .num_channels = ARRAY_SIZE(adis16485_channels), |
2062 | - .gyro_max_val = IIO_RAD_TO_DEGREE(20000), |
2063 | - .gyro_max_scale = 125, |
2064 | - .accel_max_val = IIO_M_S_2_TO_G(32000), |
2065 | + .gyro_max_val = 20000 << 16, |
2066 | + .gyro_max_scale = IIO_DEGREE_TO_RAD(125), |
2067 | + .accel_max_val = IIO_M_S_2_TO_G(32000 << 16), |
2068 | .accel_max_scale = 8, |
2069 | .temp_scale = 12500, /* 12.5 milli degree Celsius */ |
2070 | .int_clk = 4250000, |
2071 | @@ -851,9 +856,9 @@ static const struct adis16480_chip_info adis16480_chip_info[] = { |
2072 | [ADIS16495_2] = { |
2073 | .channels = adis16485_channels, |
2074 | .num_channels = ARRAY_SIZE(adis16485_channels), |
2075 | - .gyro_max_val = IIO_RAD_TO_DEGREE(18000), |
2076 | - .gyro_max_scale = 450, |
2077 | - .accel_max_val = IIO_M_S_2_TO_G(32000), |
2078 | + .gyro_max_val = 18000 << 16, |
2079 | + .gyro_max_scale = IIO_DEGREE_TO_RAD(450), |
2080 | + .accel_max_val = IIO_M_S_2_TO_G(32000 << 16), |
2081 | .accel_max_scale = 8, |
2082 | .temp_scale = 12500, /* 12.5 milli degree Celsius */ |
2083 | .int_clk = 4250000, |
2084 | @@ -864,9 +869,9 @@ static const struct adis16480_chip_info adis16480_chip_info[] = { |
2085 | [ADIS16495_3] = { |
2086 | .channels = adis16485_channels, |
2087 | .num_channels = ARRAY_SIZE(adis16485_channels), |
2088 | - .gyro_max_val = IIO_RAD_TO_DEGREE(20000), |
2089 | - .gyro_max_scale = 2000, |
2090 | - .accel_max_val = IIO_M_S_2_TO_G(32000), |
2091 | + .gyro_max_val = 20000 << 16, |
2092 | + .gyro_max_scale = IIO_DEGREE_TO_RAD(2000), |
2093 | + .accel_max_val = IIO_M_S_2_TO_G(32000 << 16), |
2094 | .accel_max_scale = 8, |
2095 | .temp_scale = 12500, /* 12.5 milli degree Celsius */ |
2096 | .int_clk = 4250000, |
2097 | @@ -877,9 +882,9 @@ static const struct adis16480_chip_info adis16480_chip_info[] = { |
2098 | [ADIS16497_1] = { |
2099 | .channels = adis16485_channels, |
2100 | .num_channels = ARRAY_SIZE(adis16485_channels), |
2101 | - .gyro_max_val = IIO_RAD_TO_DEGREE(20000), |
2102 | - .gyro_max_scale = 125, |
2103 | - .accel_max_val = IIO_M_S_2_TO_G(32000), |
2104 | + .gyro_max_val = 20000 << 16, |
2105 | + .gyro_max_scale = IIO_DEGREE_TO_RAD(125), |
2106 | + .accel_max_val = IIO_M_S_2_TO_G(32000 << 16), |
2107 | .accel_max_scale = 40, |
2108 | .temp_scale = 12500, /* 12.5 milli degree Celsius */ |
2109 | .int_clk = 4250000, |
2110 | @@ -890,9 +895,9 @@ static const struct adis16480_chip_info adis16480_chip_info[] = { |
2111 | [ADIS16497_2] = { |
2112 | .channels = adis16485_channels, |
2113 | .num_channels = ARRAY_SIZE(adis16485_channels), |
2114 | - .gyro_max_val = IIO_RAD_TO_DEGREE(18000), |
2115 | - .gyro_max_scale = 450, |
2116 | - .accel_max_val = IIO_M_S_2_TO_G(32000), |
2117 | + .gyro_max_val = 18000 << 16, |
2118 | + .gyro_max_scale = IIO_DEGREE_TO_RAD(450), |
2119 | + .accel_max_val = IIO_M_S_2_TO_G(32000 << 16), |
2120 | .accel_max_scale = 40, |
2121 | .temp_scale = 12500, /* 12.5 milli degree Celsius */ |
2122 | .int_clk = 4250000, |
2123 | @@ -903,9 +908,9 @@ static const struct adis16480_chip_info adis16480_chip_info[] = { |
2124 | [ADIS16497_3] = { |
2125 | .channels = adis16485_channels, |
2126 | .num_channels = ARRAY_SIZE(adis16485_channels), |
2127 | - .gyro_max_val = IIO_RAD_TO_DEGREE(20000), |
2128 | - .gyro_max_scale = 2000, |
2129 | - .accel_max_val = IIO_M_S_2_TO_G(32000), |
2130 | + .gyro_max_val = 20000 << 16, |
2131 | + .gyro_max_scale = IIO_DEGREE_TO_RAD(2000), |
2132 | + .accel_max_val = IIO_M_S_2_TO_G(32000 << 16), |
2133 | .accel_max_scale = 40, |
2134 | .temp_scale = 12500, /* 12.5 milli degree Celsius */ |
2135 | .int_clk = 4250000, |
2136 | @@ -919,6 +924,7 @@ static const struct iio_info adis16480_info = { |
2137 | .read_raw = &adis16480_read_raw, |
2138 | .write_raw = &adis16480_write_raw, |
2139 | .update_scan_mode = adis_update_scan_mode, |
2140 | + .debugfs_reg_access = adis_debugfs_reg_access, |
2141 | }; |
2142 | |
2143 | static int adis16480_stop_device(struct iio_dev *indio_dev) |
2144 | diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c |
2145 | index 868281b8adb0..2261c6c4ac65 100644 |
2146 | --- a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c |
2147 | +++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c |
2148 | @@ -115,6 +115,7 @@ static const struct inv_mpu6050_hw hw_info[] = { |
2149 | .reg = ®_set_6050, |
2150 | .config = &chip_config_6050, |
2151 | .fifo_size = 1024, |
2152 | + .temp = {INV_MPU6050_TEMP_OFFSET, INV_MPU6050_TEMP_SCALE}, |
2153 | }, |
2154 | { |
2155 | .whoami = INV_MPU6500_WHOAMI_VALUE, |
2156 | @@ -122,6 +123,7 @@ static const struct inv_mpu6050_hw hw_info[] = { |
2157 | .reg = ®_set_6500, |
2158 | .config = &chip_config_6050, |
2159 | .fifo_size = 512, |
2160 | + .temp = {INV_MPU6500_TEMP_OFFSET, INV_MPU6500_TEMP_SCALE}, |
2161 | }, |
2162 | { |
2163 | .whoami = INV_MPU6515_WHOAMI_VALUE, |
2164 | @@ -129,6 +131,7 @@ static const struct inv_mpu6050_hw hw_info[] = { |
2165 | .reg = ®_set_6500, |
2166 | .config = &chip_config_6050, |
2167 | .fifo_size = 512, |
2168 | + .temp = {INV_MPU6500_TEMP_OFFSET, INV_MPU6500_TEMP_SCALE}, |
2169 | }, |
2170 | { |
2171 | .whoami = INV_MPU6000_WHOAMI_VALUE, |
2172 | @@ -136,6 +139,7 @@ static const struct inv_mpu6050_hw hw_info[] = { |
2173 | .reg = ®_set_6050, |
2174 | .config = &chip_config_6050, |
2175 | .fifo_size = 1024, |
2176 | + .temp = {INV_MPU6050_TEMP_OFFSET, INV_MPU6050_TEMP_SCALE}, |
2177 | }, |
2178 | { |
2179 | .whoami = INV_MPU9150_WHOAMI_VALUE, |
2180 | @@ -143,6 +147,7 @@ static const struct inv_mpu6050_hw hw_info[] = { |
2181 | .reg = ®_set_6050, |
2182 | .config = &chip_config_6050, |
2183 | .fifo_size = 1024, |
2184 | + .temp = {INV_MPU6050_TEMP_OFFSET, INV_MPU6050_TEMP_SCALE}, |
2185 | }, |
2186 | { |
2187 | .whoami = INV_MPU9250_WHOAMI_VALUE, |
2188 | @@ -150,6 +155,7 @@ static const struct inv_mpu6050_hw hw_info[] = { |
2189 | .reg = ®_set_6500, |
2190 | .config = &chip_config_6050, |
2191 | .fifo_size = 512, |
2192 | + .temp = {INV_MPU6500_TEMP_OFFSET, INV_MPU6500_TEMP_SCALE}, |
2193 | }, |
2194 | { |
2195 | .whoami = INV_MPU9255_WHOAMI_VALUE, |
2196 | @@ -157,6 +163,7 @@ static const struct inv_mpu6050_hw hw_info[] = { |
2197 | .reg = ®_set_6500, |
2198 | .config = &chip_config_6050, |
2199 | .fifo_size = 512, |
2200 | + .temp = {INV_MPU6500_TEMP_OFFSET, INV_MPU6500_TEMP_SCALE}, |
2201 | }, |
2202 | { |
2203 | .whoami = INV_ICM20608_WHOAMI_VALUE, |
2204 | @@ -164,6 +171,7 @@ static const struct inv_mpu6050_hw hw_info[] = { |
2205 | .reg = ®_set_6500, |
2206 | .config = &chip_config_6050, |
2207 | .fifo_size = 512, |
2208 | + .temp = {INV_ICM20608_TEMP_OFFSET, INV_ICM20608_TEMP_SCALE}, |
2209 | }, |
2210 | { |
2211 | .whoami = INV_ICM20602_WHOAMI_VALUE, |
2212 | @@ -171,6 +179,7 @@ static const struct inv_mpu6050_hw hw_info[] = { |
2213 | .reg = ®_set_icm20602, |
2214 | .config = &chip_config_6050, |
2215 | .fifo_size = 1008, |
2216 | + .temp = {INV_ICM20608_TEMP_OFFSET, INV_ICM20608_TEMP_SCALE}, |
2217 | }, |
2218 | }; |
2219 | |
2220 | @@ -471,12 +480,8 @@ inv_mpu6050_read_raw(struct iio_dev *indio_dev, |
2221 | |
2222 | return IIO_VAL_INT_PLUS_MICRO; |
2223 | case IIO_TEMP: |
2224 | - *val = 0; |
2225 | - if (st->chip_type == INV_ICM20602) |
2226 | - *val2 = INV_ICM20602_TEMP_SCALE; |
2227 | - else |
2228 | - *val2 = INV_MPU6050_TEMP_SCALE; |
2229 | - |
2230 | + *val = st->hw->temp.scale / 1000000; |
2231 | + *val2 = st->hw->temp.scale % 1000000; |
2232 | return IIO_VAL_INT_PLUS_MICRO; |
2233 | default: |
2234 | return -EINVAL; |
2235 | @@ -484,11 +489,7 @@ inv_mpu6050_read_raw(struct iio_dev *indio_dev, |
2236 | case IIO_CHAN_INFO_OFFSET: |
2237 | switch (chan->type) { |
2238 | case IIO_TEMP: |
2239 | - if (st->chip_type == INV_ICM20602) |
2240 | - *val = INV_ICM20602_TEMP_OFFSET; |
2241 | - else |
2242 | - *val = INV_MPU6050_TEMP_OFFSET; |
2243 | - |
2244 | + *val = st->hw->temp.offset; |
2245 | return IIO_VAL_INT; |
2246 | default: |
2247 | return -EINVAL; |
2248 | diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h b/drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h |
2249 | index 51235677c534..c32bd0c012b5 100644 |
2250 | --- a/drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h |
2251 | +++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h |
2252 | @@ -101,6 +101,7 @@ struct inv_mpu6050_chip_config { |
2253 | * @reg: register map of the chip. |
2254 | * @config: configuration of the chip. |
2255 | * @fifo_size: size of the FIFO in bytes. |
2256 | + * @temp: offset and scale to apply to raw temperature. |
2257 | */ |
2258 | struct inv_mpu6050_hw { |
2259 | u8 whoami; |
2260 | @@ -108,6 +109,10 @@ struct inv_mpu6050_hw { |
2261 | const struct inv_mpu6050_reg_map *reg; |
2262 | const struct inv_mpu6050_chip_config *config; |
2263 | size_t fifo_size; |
2264 | + struct { |
2265 | + int offset; |
2266 | + int scale; |
2267 | + } temp; |
2268 | }; |
2269 | |
2270 | /* |
2271 | @@ -218,16 +223,19 @@ struct inv_mpu6050_state { |
2272 | #define INV_MPU6050_REG_UP_TIME_MIN 5000 |
2273 | #define INV_MPU6050_REG_UP_TIME_MAX 10000 |
2274 | |
2275 | -#define INV_MPU6050_TEMP_OFFSET 12421 |
2276 | -#define INV_MPU6050_TEMP_SCALE 2941 |
2277 | +#define INV_MPU6050_TEMP_OFFSET 12420 |
2278 | +#define INV_MPU6050_TEMP_SCALE 2941176 |
2279 | #define INV_MPU6050_MAX_GYRO_FS_PARAM 3 |
2280 | #define INV_MPU6050_MAX_ACCL_FS_PARAM 3 |
2281 | #define INV_MPU6050_THREE_AXIS 3 |
2282 | #define INV_MPU6050_GYRO_CONFIG_FSR_SHIFT 3 |
2283 | #define INV_MPU6050_ACCL_CONFIG_FSR_SHIFT 3 |
2284 | |
2285 | -#define INV_ICM20602_TEMP_OFFSET 8170 |
2286 | -#define INV_ICM20602_TEMP_SCALE 3060 |
2287 | +#define INV_MPU6500_TEMP_OFFSET 7011 |
2288 | +#define INV_MPU6500_TEMP_SCALE 2995178 |
2289 | + |
2290 | +#define INV_ICM20608_TEMP_OFFSET 8170 |
2291 | +#define INV_ICM20608_TEMP_SCALE 3059976 |
2292 | |
2293 | /* 6 + 6 round up and plus 8 */ |
2294 | #define INV_MPU6050_OUTPUT_DATA_SIZE 24 |
2295 | diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c |
2296 | index fd5ebe1e1594..28e011b35f21 100644 |
2297 | --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c |
2298 | +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c |
2299 | @@ -985,8 +985,7 @@ int st_lsm6dsx_check_odr(struct st_lsm6dsx_sensor *sensor, u16 odr, u8 *val) |
2300 | return -EINVAL; |
2301 | |
2302 | *val = odr_table->odr_avl[i].val; |
2303 | - |
2304 | - return 0; |
2305 | + return odr_table->odr_avl[i].hz; |
2306 | } |
2307 | |
2308 | static u16 st_lsm6dsx_check_odr_dependency(struct st_lsm6dsx_hw *hw, u16 odr, |
2309 | @@ -1149,8 +1148,10 @@ static int st_lsm6dsx_write_raw(struct iio_dev *iio_dev, |
2310 | case IIO_CHAN_INFO_SAMP_FREQ: { |
2311 | u8 data; |
2312 | |
2313 | - err = st_lsm6dsx_check_odr(sensor, val, &data); |
2314 | - if (!err) |
2315 | + val = st_lsm6dsx_check_odr(sensor, val, &data); |
2316 | + if (val < 0) |
2317 | + err = val; |
2318 | + else |
2319 | sensor->odr = val; |
2320 | break; |
2321 | } |
2322 | diff --git a/drivers/interconnect/qcom/qcs404.c b/drivers/interconnect/qcom/qcs404.c |
2323 | index b4966d8f3348..8e0735a87040 100644 |
2324 | --- a/drivers/interconnect/qcom/qcs404.c |
2325 | +++ b/drivers/interconnect/qcom/qcs404.c |
2326 | @@ -414,7 +414,7 @@ static int qnoc_probe(struct platform_device *pdev) |
2327 | struct icc_provider *provider; |
2328 | struct qcom_icc_node **qnodes; |
2329 | struct qcom_icc_provider *qp; |
2330 | - struct icc_node *node; |
2331 | + struct icc_node *node, *tmp; |
2332 | size_t num_nodes, i; |
2333 | int ret; |
2334 | |
2335 | @@ -494,7 +494,7 @@ static int qnoc_probe(struct platform_device *pdev) |
2336 | |
2337 | return 0; |
2338 | err: |
2339 | - list_for_each_entry(node, &provider->nodes, node_list) { |
2340 | + list_for_each_entry_safe(node, tmp, &provider->nodes, node_list) { |
2341 | icc_node_del(node); |
2342 | icc_node_destroy(node->id); |
2343 | } |
2344 | @@ -508,9 +508,9 @@ static int qnoc_remove(struct platform_device *pdev) |
2345 | { |
2346 | struct qcom_icc_provider *qp = platform_get_drvdata(pdev); |
2347 | struct icc_provider *provider = &qp->provider; |
2348 | - struct icc_node *n; |
2349 | + struct icc_node *n, *tmp; |
2350 | |
2351 | - list_for_each_entry(n, &provider->nodes, node_list) { |
2352 | + list_for_each_entry_safe(n, tmp, &provider->nodes, node_list) { |
2353 | icc_node_del(n); |
2354 | icc_node_destroy(n->id); |
2355 | } |
2356 | diff --git a/drivers/interconnect/qcom/sdm845.c b/drivers/interconnect/qcom/sdm845.c |
2357 | index 502a6c22b41e..387267ee9648 100644 |
2358 | --- a/drivers/interconnect/qcom/sdm845.c |
2359 | +++ b/drivers/interconnect/qcom/sdm845.c |
2360 | @@ -868,9 +868,9 @@ static int qnoc_remove(struct platform_device *pdev) |
2361 | { |
2362 | struct qcom_icc_provider *qp = platform_get_drvdata(pdev); |
2363 | struct icc_provider *provider = &qp->provider; |
2364 | - struct icc_node *n; |
2365 | + struct icc_node *n, *tmp; |
2366 | |
2367 | - list_for_each_entry(n, &provider->nodes, node_list) { |
2368 | + list_for_each_entry_safe(n, tmp, &provider->nodes, node_list) { |
2369 | icc_node_del(n); |
2370 | icc_node_destroy(n->id); |
2371 | } |
2372 | diff --git a/drivers/md/dm-writecache.c b/drivers/md/dm-writecache.c |
2373 | index d06b8aa41e26..43d1af1d8173 100644 |
2374 | --- a/drivers/md/dm-writecache.c |
2375 | +++ b/drivers/md/dm-writecache.c |
2376 | @@ -1218,7 +1218,8 @@ bio_copy: |
2377 | } |
2378 | } while (bio->bi_iter.bi_size); |
2379 | |
2380 | - if (unlikely(wc->uncommitted_blocks >= wc->autocommit_blocks)) |
2381 | + if (unlikely(bio->bi_opf & REQ_FUA || |
2382 | + wc->uncommitted_blocks >= wc->autocommit_blocks)) |
2383 | writecache_flush(wc); |
2384 | else |
2385 | writecache_schedule_autocommit(wc); |
2386 | diff --git a/drivers/md/dm-zoned-metadata.c b/drivers/md/dm-zoned-metadata.c |
2387 | index 595a73110e17..ac1179ca80d9 100644 |
2388 | --- a/drivers/md/dm-zoned-metadata.c |
2389 | +++ b/drivers/md/dm-zoned-metadata.c |
2390 | @@ -554,6 +554,7 @@ static struct dmz_mblock *dmz_get_mblock(struct dmz_metadata *zmd, |
2391 | TASK_UNINTERRUPTIBLE); |
2392 | if (test_bit(DMZ_META_ERROR, &mblk->state)) { |
2393 | dmz_release_mblock(zmd, mblk); |
2394 | + dmz_check_bdev(zmd->dev); |
2395 | return ERR_PTR(-EIO); |
2396 | } |
2397 | |
2398 | @@ -625,6 +626,8 @@ static int dmz_rdwr_block(struct dmz_metadata *zmd, int op, sector_t block, |
2399 | ret = submit_bio_wait(bio); |
2400 | bio_put(bio); |
2401 | |
2402 | + if (ret) |
2403 | + dmz_check_bdev(zmd->dev); |
2404 | return ret; |
2405 | } |
2406 | |
2407 | @@ -691,6 +694,7 @@ static int dmz_write_dirty_mblocks(struct dmz_metadata *zmd, |
2408 | TASK_UNINTERRUPTIBLE); |
2409 | if (test_bit(DMZ_META_ERROR, &mblk->state)) { |
2410 | clear_bit(DMZ_META_ERROR, &mblk->state); |
2411 | + dmz_check_bdev(zmd->dev); |
2412 | ret = -EIO; |
2413 | } |
2414 | nr_mblks_submitted--; |
2415 | @@ -768,7 +772,7 @@ int dmz_flush_metadata(struct dmz_metadata *zmd) |
2416 | /* If there are no dirty metadata blocks, just flush the device cache */ |
2417 | if (list_empty(&write_list)) { |
2418 | ret = blkdev_issue_flush(zmd->dev->bdev, GFP_NOIO, NULL); |
2419 | - goto out; |
2420 | + goto err; |
2421 | } |
2422 | |
2423 | /* |
2424 | @@ -778,7 +782,7 @@ int dmz_flush_metadata(struct dmz_metadata *zmd) |
2425 | */ |
2426 | ret = dmz_log_dirty_mblocks(zmd, &write_list); |
2427 | if (ret) |
2428 | - goto out; |
2429 | + goto err; |
2430 | |
2431 | /* |
2432 | * The log is on disk. It is now safe to update in place |
2433 | @@ -786,11 +790,11 @@ int dmz_flush_metadata(struct dmz_metadata *zmd) |
2434 | */ |
2435 | ret = dmz_write_dirty_mblocks(zmd, &write_list, zmd->mblk_primary); |
2436 | if (ret) |
2437 | - goto out; |
2438 | + goto err; |
2439 | |
2440 | ret = dmz_write_sb(zmd, zmd->mblk_primary); |
2441 | if (ret) |
2442 | - goto out; |
2443 | + goto err; |
2444 | |
2445 | while (!list_empty(&write_list)) { |
2446 | mblk = list_first_entry(&write_list, struct dmz_mblock, link); |
2447 | @@ -805,16 +809,20 @@ int dmz_flush_metadata(struct dmz_metadata *zmd) |
2448 | |
2449 | zmd->sb_gen++; |
2450 | out: |
2451 | - if (ret && !list_empty(&write_list)) { |
2452 | - spin_lock(&zmd->mblk_lock); |
2453 | - list_splice(&write_list, &zmd->mblk_dirty_list); |
2454 | - spin_unlock(&zmd->mblk_lock); |
2455 | - } |
2456 | - |
2457 | dmz_unlock_flush(zmd); |
2458 | up_write(&zmd->mblk_sem); |
2459 | |
2460 | return ret; |
2461 | + |
2462 | +err: |
2463 | + if (!list_empty(&write_list)) { |
2464 | + spin_lock(&zmd->mblk_lock); |
2465 | + list_splice(&write_list, &zmd->mblk_dirty_list); |
2466 | + spin_unlock(&zmd->mblk_lock); |
2467 | + } |
2468 | + if (!dmz_check_bdev(zmd->dev)) |
2469 | + ret = -EIO; |
2470 | + goto out; |
2471 | } |
2472 | |
2473 | /* |
2474 | @@ -1244,6 +1252,7 @@ static int dmz_update_zone(struct dmz_metadata *zmd, struct dm_zone *zone) |
2475 | if (ret) { |
2476 | dmz_dev_err(zmd->dev, "Get zone %u report failed", |
2477 | dmz_id(zmd, zone)); |
2478 | + dmz_check_bdev(zmd->dev); |
2479 | return ret; |
2480 | } |
2481 | |
2482 | diff --git a/drivers/md/dm-zoned-reclaim.c b/drivers/md/dm-zoned-reclaim.c |
2483 | index d240d7ca8a8a..e7ace908a9b7 100644 |
2484 | --- a/drivers/md/dm-zoned-reclaim.c |
2485 | +++ b/drivers/md/dm-zoned-reclaim.c |
2486 | @@ -82,6 +82,7 @@ static int dmz_reclaim_align_wp(struct dmz_reclaim *zrc, struct dm_zone *zone, |
2487 | "Align zone %u wp %llu to %llu (wp+%u) blocks failed %d", |
2488 | dmz_id(zmd, zone), (unsigned long long)wp_block, |
2489 | (unsigned long long)block, nr_blocks, ret); |
2490 | + dmz_check_bdev(zrc->dev); |
2491 | return ret; |
2492 | } |
2493 | |
2494 | @@ -489,12 +490,7 @@ static void dmz_reclaim_work(struct work_struct *work) |
2495 | ret = dmz_do_reclaim(zrc); |
2496 | if (ret) { |
2497 | dmz_dev_debug(zrc->dev, "Reclaim error %d\n", ret); |
2498 | - if (ret == -EIO) |
2499 | - /* |
2500 | - * LLD might be performing some error handling sequence |
2501 | - * at the underlying device. To not interfere, do not |
2502 | - * attempt to schedule the next reclaim run immediately. |
2503 | - */ |
2504 | + if (!dmz_check_bdev(zrc->dev)) |
2505 | return; |
2506 | } |
2507 | |
2508 | diff --git a/drivers/md/dm-zoned-target.c b/drivers/md/dm-zoned-target.c |
2509 | index d3bcc4197f5d..4574e0dedbd6 100644 |
2510 | --- a/drivers/md/dm-zoned-target.c |
2511 | +++ b/drivers/md/dm-zoned-target.c |
2512 | @@ -80,6 +80,8 @@ static inline void dmz_bio_endio(struct bio *bio, blk_status_t status) |
2513 | |
2514 | if (status != BLK_STS_OK && bio->bi_status == BLK_STS_OK) |
2515 | bio->bi_status = status; |
2516 | + if (bio->bi_status != BLK_STS_OK) |
2517 | + bioctx->target->dev->flags |= DMZ_CHECK_BDEV; |
2518 | |
2519 | if (refcount_dec_and_test(&bioctx->ref)) { |
2520 | struct dm_zone *zone = bioctx->zone; |
2521 | @@ -565,31 +567,51 @@ out: |
2522 | } |
2523 | |
2524 | /* |
2525 | - * Check the backing device availability. If it's on the way out, |
2526 | + * Check if the backing device is being removed. If it's on the way out, |
2527 | * start failing I/O. Reclaim and metadata components also call this |
2528 | * function to cleanly abort operation in the event of such failure. |
2529 | */ |
2530 | bool dmz_bdev_is_dying(struct dmz_dev *dmz_dev) |
2531 | { |
2532 | - struct gendisk *disk; |
2533 | + if (dmz_dev->flags & DMZ_BDEV_DYING) |
2534 | + return true; |
2535 | |
2536 | - if (!(dmz_dev->flags & DMZ_BDEV_DYING)) { |
2537 | - disk = dmz_dev->bdev->bd_disk; |
2538 | - if (blk_queue_dying(bdev_get_queue(dmz_dev->bdev))) { |
2539 | - dmz_dev_warn(dmz_dev, "Backing device queue dying"); |
2540 | - dmz_dev->flags |= DMZ_BDEV_DYING; |
2541 | - } else if (disk->fops->check_events) { |
2542 | - if (disk->fops->check_events(disk, 0) & |
2543 | - DISK_EVENT_MEDIA_CHANGE) { |
2544 | - dmz_dev_warn(dmz_dev, "Backing device offline"); |
2545 | - dmz_dev->flags |= DMZ_BDEV_DYING; |
2546 | - } |
2547 | - } |
2548 | + if (dmz_dev->flags & DMZ_CHECK_BDEV) |
2549 | + return !dmz_check_bdev(dmz_dev); |
2550 | + |
2551 | + if (blk_queue_dying(bdev_get_queue(dmz_dev->bdev))) { |
2552 | + dmz_dev_warn(dmz_dev, "Backing device queue dying"); |
2553 | + dmz_dev->flags |= DMZ_BDEV_DYING; |
2554 | } |
2555 | |
2556 | return dmz_dev->flags & DMZ_BDEV_DYING; |
2557 | } |
2558 | |
2559 | +/* |
2560 | + * Check the backing device availability. This detects such events as |
2561 | + * backing device going offline due to errors, media removals, etc. |
2562 | + * This check is less efficient than dmz_bdev_is_dying() and should |
2563 | + * only be performed as a part of error handling. |
2564 | + */ |
2565 | +bool dmz_check_bdev(struct dmz_dev *dmz_dev) |
2566 | +{ |
2567 | + struct gendisk *disk; |
2568 | + |
2569 | + dmz_dev->flags &= ~DMZ_CHECK_BDEV; |
2570 | + |
2571 | + if (dmz_bdev_is_dying(dmz_dev)) |
2572 | + return false; |
2573 | + |
2574 | + disk = dmz_dev->bdev->bd_disk; |
2575 | + if (disk->fops->check_events && |
2576 | + disk->fops->check_events(disk, 0) & DISK_EVENT_MEDIA_CHANGE) { |
2577 | + dmz_dev_warn(dmz_dev, "Backing device offline"); |
2578 | + dmz_dev->flags |= DMZ_BDEV_DYING; |
2579 | + } |
2580 | + |
2581 | + return !(dmz_dev->flags & DMZ_BDEV_DYING); |
2582 | +} |
2583 | + |
2584 | /* |
2585 | * Process a new BIO. |
2586 | */ |
2587 | @@ -902,8 +924,8 @@ static int dmz_prepare_ioctl(struct dm_target *ti, struct block_device **bdev) |
2588 | { |
2589 | struct dmz_target *dmz = ti->private; |
2590 | |
2591 | - if (dmz_bdev_is_dying(dmz->dev)) |
2592 | - return -ENODEV; |
2593 | + if (!dmz_check_bdev(dmz->dev)) |
2594 | + return -EIO; |
2595 | |
2596 | *bdev = dmz->dev->bdev; |
2597 | |
2598 | diff --git a/drivers/md/dm-zoned.h b/drivers/md/dm-zoned.h |
2599 | index d8e70b0ade35..5b5e493d479c 100644 |
2600 | --- a/drivers/md/dm-zoned.h |
2601 | +++ b/drivers/md/dm-zoned.h |
2602 | @@ -72,6 +72,7 @@ struct dmz_dev { |
2603 | |
2604 | /* Device flags. */ |
2605 | #define DMZ_BDEV_DYING (1 << 0) |
2606 | +#define DMZ_CHECK_BDEV (2 << 0) |
2607 | |
2608 | /* |
2609 | * Zone descriptor. |
2610 | @@ -255,5 +256,6 @@ void dmz_schedule_reclaim(struct dmz_reclaim *zrc); |
2611 | * Functions defined in dm-zoned-target.c |
2612 | */ |
2613 | bool dmz_bdev_is_dying(struct dmz_dev *dmz_dev); |
2614 | +bool dmz_check_bdev(struct dmz_dev *dmz_dev); |
2615 | |
2616 | #endif /* DM_ZONED_H */ |
2617 | diff --git a/drivers/md/md-linear.c b/drivers/md/md-linear.c |
2618 | index c766c559d36d..26c75c0199fa 100644 |
2619 | --- a/drivers/md/md-linear.c |
2620 | +++ b/drivers/md/md-linear.c |
2621 | @@ -244,10 +244,9 @@ static bool linear_make_request(struct mddev *mddev, struct bio *bio) |
2622 | sector_t start_sector, end_sector, data_offset; |
2623 | sector_t bio_sector = bio->bi_iter.bi_sector; |
2624 | |
2625 | - if (unlikely(bio->bi_opf & REQ_PREFLUSH)) { |
2626 | - md_flush_request(mddev, bio); |
2627 | + if (unlikely(bio->bi_opf & REQ_PREFLUSH) |
2628 | + && md_flush_request(mddev, bio)) |
2629 | return true; |
2630 | - } |
2631 | |
2632 | tmp_dev = which_dev(mddev, bio_sector); |
2633 | start_sector = tmp_dev->end_sector - tmp_dev->rdev->sectors; |
2634 | diff --git a/drivers/md/md-multipath.c b/drivers/md/md-multipath.c |
2635 | index 6780938d2991..152f9e65a226 100644 |
2636 | --- a/drivers/md/md-multipath.c |
2637 | +++ b/drivers/md/md-multipath.c |
2638 | @@ -104,10 +104,9 @@ static bool multipath_make_request(struct mddev *mddev, struct bio * bio) |
2639 | struct multipath_bh * mp_bh; |
2640 | struct multipath_info *multipath; |
2641 | |
2642 | - if (unlikely(bio->bi_opf & REQ_PREFLUSH)) { |
2643 | - md_flush_request(mddev, bio); |
2644 | + if (unlikely(bio->bi_opf & REQ_PREFLUSH) |
2645 | + && md_flush_request(mddev, bio)) |
2646 | return true; |
2647 | - } |
2648 | |
2649 | mp_bh = mempool_alloc(&conf->pool, GFP_NOIO); |
2650 | |
2651 | diff --git a/drivers/md/md.c b/drivers/md/md.c |
2652 | index 1be7abeb24fd..b8dd56b746da 100644 |
2653 | --- a/drivers/md/md.c |
2654 | +++ b/drivers/md/md.c |
2655 | @@ -550,7 +550,13 @@ static void md_submit_flush_data(struct work_struct *ws) |
2656 | } |
2657 | } |
2658 | |
2659 | -void md_flush_request(struct mddev *mddev, struct bio *bio) |
2660 | +/* |
2661 | + * Manages consolidation of flushes and submitting any flushes needed for |
2662 | + * a bio with REQ_PREFLUSH. Returns true if the bio is finished or is |
2663 | + * being finished in another context. Returns false if the flushing is |
2664 | + * complete but still needs the I/O portion of the bio to be processed. |
2665 | + */ |
2666 | +bool md_flush_request(struct mddev *mddev, struct bio *bio) |
2667 | { |
2668 | ktime_t start = ktime_get_boottime(); |
2669 | spin_lock_irq(&mddev->lock); |
2670 | @@ -575,9 +581,10 @@ void md_flush_request(struct mddev *mddev, struct bio *bio) |
2671 | bio_endio(bio); |
2672 | else { |
2673 | bio->bi_opf &= ~REQ_PREFLUSH; |
2674 | - mddev->pers->make_request(mddev, bio); |
2675 | + return false; |
2676 | } |
2677 | } |
2678 | + return true; |
2679 | } |
2680 | EXPORT_SYMBOL(md_flush_request); |
2681 | |
2682 | diff --git a/drivers/md/md.h b/drivers/md/md.h |
2683 | index c5e3ff398b59..5f86f8adb0a4 100644 |
2684 | --- a/drivers/md/md.h |
2685 | +++ b/drivers/md/md.h |
2686 | @@ -550,7 +550,7 @@ struct md_personality |
2687 | int level; |
2688 | struct list_head list; |
2689 | struct module *owner; |
2690 | - bool (*make_request)(struct mddev *mddev, struct bio *bio); |
2691 | + bool __must_check (*make_request)(struct mddev *mddev, struct bio *bio); |
2692 | /* |
2693 | * start up works that do NOT require md_thread. tasks that |
2694 | * requires md_thread should go into start() |
2695 | @@ -703,7 +703,7 @@ extern void md_error(struct mddev *mddev, struct md_rdev *rdev); |
2696 | extern void md_finish_reshape(struct mddev *mddev); |
2697 | |
2698 | extern int mddev_congested(struct mddev *mddev, int bits); |
2699 | -extern void md_flush_request(struct mddev *mddev, struct bio *bio); |
2700 | +extern bool __must_check md_flush_request(struct mddev *mddev, struct bio *bio); |
2701 | extern void md_super_write(struct mddev *mddev, struct md_rdev *rdev, |
2702 | sector_t sector, int size, struct page *page); |
2703 | extern int md_super_wait(struct mddev *mddev); |
2704 | diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c |
2705 | index aa88bdeb9978..b7c20979bd19 100644 |
2706 | --- a/drivers/md/raid0.c |
2707 | +++ b/drivers/md/raid0.c |
2708 | @@ -575,10 +575,9 @@ static bool raid0_make_request(struct mddev *mddev, struct bio *bio) |
2709 | unsigned chunk_sects; |
2710 | unsigned sectors; |
2711 | |
2712 | - if (unlikely(bio->bi_opf & REQ_PREFLUSH)) { |
2713 | - md_flush_request(mddev, bio); |
2714 | + if (unlikely(bio->bi_opf & REQ_PREFLUSH) |
2715 | + && md_flush_request(mddev, bio)) |
2716 | return true; |
2717 | - } |
2718 | |
2719 | if (unlikely((bio_op(bio) == REQ_OP_DISCARD))) { |
2720 | raid0_handle_discard(mddev, bio); |
2721 | diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c |
2722 | index 0466ee2453b4..bb29aeefcbd0 100644 |
2723 | --- a/drivers/md/raid1.c |
2724 | +++ b/drivers/md/raid1.c |
2725 | @@ -1567,10 +1567,9 @@ static bool raid1_make_request(struct mddev *mddev, struct bio *bio) |
2726 | { |
2727 | sector_t sectors; |
2728 | |
2729 | - if (unlikely(bio->bi_opf & REQ_PREFLUSH)) { |
2730 | - md_flush_request(mddev, bio); |
2731 | + if (unlikely(bio->bi_opf & REQ_PREFLUSH) |
2732 | + && md_flush_request(mddev, bio)) |
2733 | return true; |
2734 | - } |
2735 | |
2736 | /* |
2737 | * There is a limit to the maximum size, but |
2738 | diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c |
2739 | index 8a62c920bb65..ec136e44aef7 100644 |
2740 | --- a/drivers/md/raid10.c |
2741 | +++ b/drivers/md/raid10.c |
2742 | @@ -1525,10 +1525,9 @@ static bool raid10_make_request(struct mddev *mddev, struct bio *bio) |
2743 | int chunk_sects = chunk_mask + 1; |
2744 | int sectors = bio_sectors(bio); |
2745 | |
2746 | - if (unlikely(bio->bi_opf & REQ_PREFLUSH)) { |
2747 | - md_flush_request(mddev, bio); |
2748 | + if (unlikely(bio->bi_opf & REQ_PREFLUSH) |
2749 | + && md_flush_request(mddev, bio)) |
2750 | return true; |
2751 | - } |
2752 | |
2753 | if (!md_write_start(mddev, bio)) |
2754 | return false; |
2755 | diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c |
2756 | index 223e97ab27e6..12a8ce83786e 100644 |
2757 | --- a/drivers/md/raid5.c |
2758 | +++ b/drivers/md/raid5.c |
2759 | @@ -5592,8 +5592,8 @@ static bool raid5_make_request(struct mddev *mddev, struct bio * bi) |
2760 | if (ret == 0) |
2761 | return true; |
2762 | if (ret == -ENODEV) { |
2763 | - md_flush_request(mddev, bi); |
2764 | - return true; |
2765 | + if (md_flush_request(mddev, bi)) |
2766 | + return true; |
2767 | } |
2768 | /* ret == -EAGAIN, fallback */ |
2769 | /* |
2770 | diff --git a/drivers/media/platform/qcom/venus/vdec.c b/drivers/media/platform/qcom/venus/vdec.c |
2771 | index 7f4660555ddb..59ae7a1e63bc 100644 |
2772 | --- a/drivers/media/platform/qcom/venus/vdec.c |
2773 | +++ b/drivers/media/platform/qcom/venus/vdec.c |
2774 | @@ -1412,9 +1412,6 @@ static const struct v4l2_file_operations vdec_fops = { |
2775 | .unlocked_ioctl = video_ioctl2, |
2776 | .poll = v4l2_m2m_fop_poll, |
2777 | .mmap = v4l2_m2m_fop_mmap, |
2778 | -#ifdef CONFIG_COMPAT |
2779 | - .compat_ioctl32 = v4l2_compat_ioctl32, |
2780 | -#endif |
2781 | }; |
2782 | |
2783 | static int vdec_probe(struct platform_device *pdev) |
2784 | diff --git a/drivers/media/platform/qcom/venus/venc.c b/drivers/media/platform/qcom/venus/venc.c |
2785 | index 1b7fb2d5887c..30028ceb548b 100644 |
2786 | --- a/drivers/media/platform/qcom/venus/venc.c |
2787 | +++ b/drivers/media/platform/qcom/venus/venc.c |
2788 | @@ -1235,9 +1235,6 @@ static const struct v4l2_file_operations venc_fops = { |
2789 | .unlocked_ioctl = video_ioctl2, |
2790 | .poll = v4l2_m2m_fop_poll, |
2791 | .mmap = v4l2_m2m_fop_mmap, |
2792 | -#ifdef CONFIG_COMPAT |
2793 | - .compat_ioctl32 = v4l2_compat_ioctl32, |
2794 | -#endif |
2795 | }; |
2796 | |
2797 | static int venc_probe(struct platform_device *pdev) |
2798 | diff --git a/drivers/media/platform/sti/bdisp/bdisp-v4l2.c b/drivers/media/platform/sti/bdisp/bdisp-v4l2.c |
2799 | index e90f1ba30574..675b5f2b4c2e 100644 |
2800 | --- a/drivers/media/platform/sti/bdisp/bdisp-v4l2.c |
2801 | +++ b/drivers/media/platform/sti/bdisp/bdisp-v4l2.c |
2802 | @@ -651,8 +651,7 @@ static int bdisp_release(struct file *file) |
2803 | |
2804 | dev_dbg(bdisp->dev, "%s\n", __func__); |
2805 | |
2806 | - if (mutex_lock_interruptible(&bdisp->lock)) |
2807 | - return -ERESTARTSYS; |
2808 | + mutex_lock(&bdisp->lock); |
2809 | |
2810 | v4l2_m2m_ctx_release(ctx->fh.m2m_ctx); |
2811 | |
2812 | diff --git a/drivers/media/platform/vimc/vimc-sensor.c b/drivers/media/platform/vimc/vimc-sensor.c |
2813 | index 6c53b9fc1617..4a6a7e8e66c2 100644 |
2814 | --- a/drivers/media/platform/vimc/vimc-sensor.c |
2815 | +++ b/drivers/media/platform/vimc/vimc-sensor.c |
2816 | @@ -25,7 +25,6 @@ struct vimc_sen_device { |
2817 | struct v4l2_subdev sd; |
2818 | struct device *dev; |
2819 | struct tpg_data tpg; |
2820 | - struct task_struct *kthread_sen; |
2821 | u8 *frame; |
2822 | /* The active format */ |
2823 | struct v4l2_mbus_framefmt mbus_format; |
2824 | @@ -208,10 +207,6 @@ static int vimc_sen_s_stream(struct v4l2_subdev *sd, int enable) |
2825 | const struct vimc_pix_map *vpix; |
2826 | unsigned int frame_size; |
2827 | |
2828 | - if (vsen->kthread_sen) |
2829 | - /* tpg is already executing */ |
2830 | - return 0; |
2831 | - |
2832 | /* Calculate the frame size */ |
2833 | vpix = vimc_pix_map_by_code(vsen->mbus_format.code); |
2834 | frame_size = vsen->mbus_format.width * vpix->bpp * |
2835 | diff --git a/drivers/media/radio/radio-wl1273.c b/drivers/media/radio/radio-wl1273.c |
2836 | index 104ac41c6f96..112376873167 100644 |
2837 | --- a/drivers/media/radio/radio-wl1273.c |
2838 | +++ b/drivers/media/radio/radio-wl1273.c |
2839 | @@ -1148,8 +1148,7 @@ static int wl1273_fm_fops_release(struct file *file) |
2840 | if (radio->rds_users > 0) { |
2841 | radio->rds_users--; |
2842 | if (radio->rds_users == 0) { |
2843 | - if (mutex_lock_interruptible(&core->lock)) |
2844 | - return -EINTR; |
2845 | + mutex_lock(&core->lock); |
2846 | |
2847 | radio->irq_flags &= ~WL1273_RDS_EVENT; |
2848 | |
2849 | diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c |
2850 | index 952fa4063ff8..d0df054b0b47 100644 |
2851 | --- a/drivers/mmc/host/omap_hsmmc.c |
2852 | +++ b/drivers/mmc/host/omap_hsmmc.c |
2853 | @@ -1512,6 +1512,36 @@ static void omap_hsmmc_init_card(struct mmc_host *mmc, struct mmc_card *card) |
2854 | |
2855 | if (mmc_pdata(host)->init_card) |
2856 | mmc_pdata(host)->init_card(card); |
2857 | + else if (card->type == MMC_TYPE_SDIO || |
2858 | + card->type == MMC_TYPE_SD_COMBO) { |
2859 | + struct device_node *np = mmc_dev(mmc)->of_node; |
2860 | + |
2861 | + /* |
2862 | + * REVISIT: should be moved to sdio core and made more |
2863 | + * general e.g. by expanding the DT bindings of child nodes |
2864 | + * to provide a mechanism to provide this information: |
2865 | + * Documentation/devicetree/bindings/mmc/mmc-card.txt |
2866 | + */ |
2867 | + |
2868 | + np = of_get_compatible_child(np, "ti,wl1251"); |
2869 | + if (np) { |
2870 | + /* |
2871 | + * We have TI wl1251 attached to MMC3. Pass this |
2872 | + * information to the SDIO core because it can't be |
2873 | + * probed by normal methods. |
2874 | + */ |
2875 | + |
2876 | + dev_info(host->dev, "found wl1251\n"); |
2877 | + card->quirks |= MMC_QUIRK_NONSTD_SDIO; |
2878 | + card->cccr.wide_bus = 1; |
2879 | + card->cis.vendor = 0x104c; |
2880 | + card->cis.device = 0x9066; |
2881 | + card->cis.blksize = 512; |
2882 | + card->cis.max_dtr = 24000000; |
2883 | + card->ocr = 0x80; |
2884 | + of_node_put(np); |
2885 | + } |
2886 | + } |
2887 | } |
2888 | |
2889 | static void omap_hsmmc_enable_sdio_irq(struct mmc_host *mmc, int enable) |
2890 | diff --git a/drivers/mtd/devices/spear_smi.c b/drivers/mtd/devices/spear_smi.c |
2891 | index 986f81d2f93e..47ad0766affa 100644 |
2892 | --- a/drivers/mtd/devices/spear_smi.c |
2893 | +++ b/drivers/mtd/devices/spear_smi.c |
2894 | @@ -592,6 +592,26 @@ static int spear_mtd_read(struct mtd_info *mtd, loff_t from, size_t len, |
2895 | return 0; |
2896 | } |
2897 | |
2898 | +/* |
2899 | + * The purpose of this function is to ensure a memcpy_toio() with byte writes |
2900 | + * only. Its structure is inspired from the ARM implementation of _memcpy_toio() |
2901 | + * which also does single byte writes but cannot be used here as this is just an |
2902 | + * implementation detail and not part of the API. Not mentioning the comment |
2903 | + * stating that _memcpy_toio() should be optimized. |
2904 | + */ |
2905 | +static void spear_smi_memcpy_toio_b(volatile void __iomem *dest, |
2906 | + const void *src, size_t len) |
2907 | +{ |
2908 | + const unsigned char *from = src; |
2909 | + |
2910 | + while (len) { |
2911 | + len--; |
2912 | + writeb(*from, dest); |
2913 | + from++; |
2914 | + dest++; |
2915 | + } |
2916 | +} |
2917 | + |
2918 | static inline int spear_smi_cpy_toio(struct spear_smi *dev, u32 bank, |
2919 | void __iomem *dest, const void *src, size_t len) |
2920 | { |
2921 | @@ -614,7 +634,23 @@ static inline int spear_smi_cpy_toio(struct spear_smi *dev, u32 bank, |
2922 | ctrlreg1 = readl(dev->io_base + SMI_CR1); |
2923 | writel((ctrlreg1 | WB_MODE) & ~SW_MODE, dev->io_base + SMI_CR1); |
2924 | |
2925 | - memcpy_toio(dest, src, len); |
2926 | + /* |
2927 | + * In Write Burst mode (WB_MODE), the specs states that writes must be: |
2928 | + * - incremental |
2929 | + * - of the same size |
2930 | + * The ARM implementation of memcpy_toio() will optimize the number of |
2931 | + * I/O by using as much 4-byte writes as possible, surrounded by |
2932 | + * 2-byte/1-byte access if: |
2933 | + * - the destination is not 4-byte aligned |
2934 | + * - the length is not a multiple of 4-byte. |
2935 | + * Avoid this alternance of write access size by using our own 'byte |
2936 | + * access' helper if at least one of the two conditions above is true. |
2937 | + */ |
2938 | + if (IS_ALIGNED(len, sizeof(u32)) && |
2939 | + IS_ALIGNED((uintptr_t)dest, sizeof(u32))) |
2940 | + memcpy_toio(dest, src, len); |
2941 | + else |
2942 | + spear_smi_memcpy_toio_b(dest, src, len); |
2943 | |
2944 | writel(ctrlreg1, dev->io_base + SMI_CR1); |
2945 | |
2946 | diff --git a/drivers/mtd/nand/raw/nand_base.c b/drivers/mtd/nand/raw/nand_base.c |
2947 | index 5c2c30a7dffa..f64e3b6605c6 100644 |
2948 | --- a/drivers/mtd/nand/raw/nand_base.c |
2949 | +++ b/drivers/mtd/nand/raw/nand_base.c |
2950 | @@ -292,12 +292,16 @@ int nand_bbm_get_next_page(struct nand_chip *chip, int page) |
2951 | struct mtd_info *mtd = nand_to_mtd(chip); |
2952 | int last_page = ((mtd->erasesize - mtd->writesize) >> |
2953 | chip->page_shift) & chip->pagemask; |
2954 | + unsigned int bbm_flags = NAND_BBM_FIRSTPAGE | NAND_BBM_SECONDPAGE |
2955 | + | NAND_BBM_LASTPAGE; |
2956 | |
2957 | + if (page == 0 && !(chip->options & bbm_flags)) |
2958 | + return 0; |
2959 | if (page == 0 && chip->options & NAND_BBM_FIRSTPAGE) |
2960 | return 0; |
2961 | - else if (page <= 1 && chip->options & NAND_BBM_SECONDPAGE) |
2962 | + if (page <= 1 && chip->options & NAND_BBM_SECONDPAGE) |
2963 | return 1; |
2964 | - else if (page <= last_page && chip->options & NAND_BBM_LASTPAGE) |
2965 | + if (page <= last_page && chip->options & NAND_BBM_LASTPAGE) |
2966 | return last_page; |
2967 | |
2968 | return -EINVAL; |
2969 | diff --git a/drivers/mtd/nand/raw/nand_micron.c b/drivers/mtd/nand/raw/nand_micron.c |
2970 | index 8ca9fad6e6ad..56654030ec7f 100644 |
2971 | --- a/drivers/mtd/nand/raw/nand_micron.c |
2972 | +++ b/drivers/mtd/nand/raw/nand_micron.c |
2973 | @@ -446,8 +446,10 @@ static int micron_nand_init(struct nand_chip *chip) |
2974 | if (ret) |
2975 | goto err_free_manuf_data; |
2976 | |
2977 | + chip->options |= NAND_BBM_FIRSTPAGE; |
2978 | + |
2979 | if (mtd->writesize == 2048) |
2980 | - chip->options |= NAND_BBM_FIRSTPAGE | NAND_BBM_SECONDPAGE; |
2981 | + chip->options |= NAND_BBM_SECONDPAGE; |
2982 | |
2983 | ondie = micron_supports_on_die_ecc(chip); |
2984 | |
2985 | diff --git a/drivers/net/ethernet/realtek/r8169_main.c b/drivers/net/ethernet/realtek/r8169_main.c |
2986 | index 1d67eeeab79d..235d51ea4d39 100644 |
2987 | --- a/drivers/net/ethernet/realtek/r8169_main.c |
2988 | +++ b/drivers/net/ethernet/realtek/r8169_main.c |
2989 | @@ -4145,7 +4145,7 @@ static void rtl_hw_jumbo_disable(struct rtl8169_private *tp) |
2990 | case RTL_GIGA_MAC_VER_27 ... RTL_GIGA_MAC_VER_28: |
2991 | r8168dp_hw_jumbo_disable(tp); |
2992 | break; |
2993 | - case RTL_GIGA_MAC_VER_31 ... RTL_GIGA_MAC_VER_34: |
2994 | + case RTL_GIGA_MAC_VER_31 ... RTL_GIGA_MAC_VER_33: |
2995 | r8168e_hw_jumbo_disable(tp); |
2996 | break; |
2997 | default: |
2998 | diff --git a/drivers/net/wireless/ath/ar5523/ar5523.c b/drivers/net/wireless/ath/ar5523/ar5523.c |
2999 | index b94759daeacc..da2d179430ca 100644 |
3000 | --- a/drivers/net/wireless/ath/ar5523/ar5523.c |
3001 | +++ b/drivers/net/wireless/ath/ar5523/ar5523.c |
3002 | @@ -255,7 +255,8 @@ static int ar5523_cmd(struct ar5523 *ar, u32 code, const void *idata, |
3003 | |
3004 | if (flags & AR5523_CMD_FLAG_MAGIC) |
3005 | hdr->magic = cpu_to_be32(1 << 24); |
3006 | - memcpy(hdr + 1, idata, ilen); |
3007 | + if (ilen) |
3008 | + memcpy(hdr + 1, idata, ilen); |
3009 | |
3010 | cmd->odata = odata; |
3011 | cmd->olen = olen; |
3012 | diff --git a/drivers/net/wireless/ath/wil6210/wmi.c b/drivers/net/wireless/ath/wil6210/wmi.c |
3013 | index 153b84447e40..41389c1eb252 100644 |
3014 | --- a/drivers/net/wireless/ath/wil6210/wmi.c |
3015 | +++ b/drivers/net/wireless/ath/wil6210/wmi.c |
3016 | @@ -2505,7 +2505,8 @@ int wmi_set_ie(struct wil6210_vif *vif, u8 type, u16 ie_len, const void *ie) |
3017 | cmd->mgmt_frm_type = type; |
3018 | /* BUG: FW API define ieLen as u8. Will fix FW */ |
3019 | cmd->ie_len = cpu_to_le16(ie_len); |
3020 | - memcpy(cmd->ie_info, ie, ie_len); |
3021 | + if (ie_len) |
3022 | + memcpy(cmd->ie_info, ie, ie_len); |
3023 | rc = wmi_send(wil, WMI_SET_APPIE_CMDID, vif->mid, cmd, len); |
3024 | kfree(cmd); |
3025 | out: |
3026 | @@ -2541,7 +2542,8 @@ int wmi_update_ft_ies(struct wil6210_vif *vif, u16 ie_len, const void *ie) |
3027 | } |
3028 | |
3029 | cmd->ie_len = cpu_to_le16(ie_len); |
3030 | - memcpy(cmd->ie_info, ie, ie_len); |
3031 | + if (ie_len) |
3032 | + memcpy(cmd->ie_info, ie, ie_len); |
3033 | rc = wmi_send(wil, WMI_UPDATE_FT_IES_CMDID, vif->mid, cmd, len); |
3034 | kfree(cmd); |
3035 | |
3036 | diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c |
3037 | index 6c463475e90b..3be60aef5465 100644 |
3038 | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c |
3039 | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c |
3040 | @@ -1427,6 +1427,8 @@ static int brcmf_pcie_reset(struct device *dev) |
3041 | struct brcmf_fw_request *fwreq; |
3042 | int err; |
3043 | |
3044 | + brcmf_pcie_intr_disable(devinfo); |
3045 | + |
3046 | brcmf_pcie_bus_console_read(devinfo, true); |
3047 | |
3048 | brcmf_detach(dev); |
3049 | diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c b/drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c |
3050 | index d80f71f82a6d..97cb3a8d505c 100644 |
3051 | --- a/drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c |
3052 | +++ b/drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c |
3053 | @@ -468,6 +468,7 @@ iwl_tfh_tfd *iwl_pcie_gen2_build_tx(struct iwl_trans *trans, |
3054 | dma_addr_t tb_phys; |
3055 | int len, tb1_len, tb2_len; |
3056 | void *tb1_addr; |
3057 | + struct sk_buff *frag; |
3058 | |
3059 | tb_phys = iwl_pcie_get_first_tb_dma(txq, idx); |
3060 | |
3061 | @@ -516,6 +517,19 @@ iwl_tfh_tfd *iwl_pcie_gen2_build_tx(struct iwl_trans *trans, |
3062 | if (iwl_pcie_gen2_tx_add_frags(trans, skb, tfd, out_meta)) |
3063 | goto out_err; |
3064 | |
3065 | + skb_walk_frags(skb, frag) { |
3066 | + tb_phys = dma_map_single(trans->dev, frag->data, |
3067 | + skb_headlen(frag), DMA_TO_DEVICE); |
3068 | + if (unlikely(dma_mapping_error(trans->dev, tb_phys))) |
3069 | + goto out_err; |
3070 | + iwl_pcie_gen2_set_tb(trans, tfd, tb_phys, skb_headlen(frag)); |
3071 | + trace_iwlwifi_dev_tx_tb(trans->dev, skb, |
3072 | + frag->data, |
3073 | + skb_headlen(frag)); |
3074 | + if (iwl_pcie_gen2_tx_add_frags(trans, frag, tfd, out_meta)) |
3075 | + goto out_err; |
3076 | + } |
3077 | + |
3078 | return tfd; |
3079 | |
3080 | out_err: |
3081 | diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192de/hw.c b/drivers/net/wireless/realtek/rtlwifi/rtl8192de/hw.c |
3082 | index c7f29a9be50d..146fe144f5f5 100644 |
3083 | --- a/drivers/net/wireless/realtek/rtlwifi/rtl8192de/hw.c |
3084 | +++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192de/hw.c |
3085 | @@ -1176,6 +1176,7 @@ void rtl92de_enable_interrupt(struct ieee80211_hw *hw) |
3086 | |
3087 | rtl_write_dword(rtlpriv, REG_HIMR, rtlpci->irq_mask[0] & 0xFFFFFFFF); |
3088 | rtl_write_dword(rtlpriv, REG_HIMRE, rtlpci->irq_mask[1] & 0xFFFFFFFF); |
3089 | + rtlpci->irq_enabled = true; |
3090 | } |
3091 | |
3092 | void rtl92de_disable_interrupt(struct ieee80211_hw *hw) |
3093 | @@ -1185,7 +1186,7 @@ void rtl92de_disable_interrupt(struct ieee80211_hw *hw) |
3094 | |
3095 | rtl_write_dword(rtlpriv, REG_HIMR, IMR8190_DISABLED); |
3096 | rtl_write_dword(rtlpriv, REG_HIMRE, IMR8190_DISABLED); |
3097 | - synchronize_irq(rtlpci->pdev->irq); |
3098 | + rtlpci->irq_enabled = false; |
3099 | } |
3100 | |
3101 | static void _rtl92de_poweroff_adapter(struct ieee80211_hw *hw) |
3102 | @@ -1351,7 +1352,7 @@ void rtl92de_set_beacon_related_registers(struct ieee80211_hw *hw) |
3103 | |
3104 | bcn_interval = mac->beacon_interval; |
3105 | atim_window = 2; |
3106 | - /*rtl92de_disable_interrupt(hw); */ |
3107 | + rtl92de_disable_interrupt(hw); |
3108 | rtl_write_word(rtlpriv, REG_ATIMWND, atim_window); |
3109 | rtl_write_word(rtlpriv, REG_BCN_INTERVAL, bcn_interval); |
3110 | rtl_write_word(rtlpriv, REG_BCNTCFG, 0x660f); |
3111 | @@ -1371,9 +1372,9 @@ void rtl92de_set_beacon_interval(struct ieee80211_hw *hw) |
3112 | |
3113 | RT_TRACE(rtlpriv, COMP_BEACON, DBG_DMESG, |
3114 | "beacon_interval:%d\n", bcn_interval); |
3115 | - /* rtl92de_disable_interrupt(hw); */ |
3116 | + rtl92de_disable_interrupt(hw); |
3117 | rtl_write_word(rtlpriv, REG_BCN_INTERVAL, bcn_interval); |
3118 | - /* rtl92de_enable_interrupt(hw); */ |
3119 | + rtl92de_enable_interrupt(hw); |
3120 | } |
3121 | |
3122 | void rtl92de_update_interrupt_mask(struct ieee80211_hw *hw, |
3123 | diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192de/sw.c b/drivers/net/wireless/realtek/rtlwifi/rtl8192de/sw.c |
3124 | index 99e5cd9a5c86..1dbdddce0823 100644 |
3125 | --- a/drivers/net/wireless/realtek/rtlwifi/rtl8192de/sw.c |
3126 | +++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192de/sw.c |
3127 | @@ -216,6 +216,7 @@ static struct rtl_hal_ops rtl8192de_hal_ops = { |
3128 | .led_control = rtl92de_led_control, |
3129 | .set_desc = rtl92de_set_desc, |
3130 | .get_desc = rtl92de_get_desc, |
3131 | + .is_tx_desc_closed = rtl92de_is_tx_desc_closed, |
3132 | .tx_polling = rtl92de_tx_polling, |
3133 | .enable_hw_sec = rtl92de_enable_hw_security_config, |
3134 | .set_key = rtl92de_set_key, |
3135 | diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192de/trx.c b/drivers/net/wireless/realtek/rtlwifi/rtl8192de/trx.c |
3136 | index 2494e1f118f8..92c9fb45f800 100644 |
3137 | --- a/drivers/net/wireless/realtek/rtlwifi/rtl8192de/trx.c |
3138 | +++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192de/trx.c |
3139 | @@ -804,13 +804,15 @@ u64 rtl92de_get_desc(struct ieee80211_hw *hw, |
3140 | break; |
3141 | } |
3142 | } else { |
3143 | - struct rx_desc_92c *pdesc = (struct rx_desc_92c *)p_desc; |
3144 | switch (desc_name) { |
3145 | case HW_DESC_OWN: |
3146 | - ret = GET_RX_DESC_OWN(pdesc); |
3147 | + ret = GET_RX_DESC_OWN(p_desc); |
3148 | break; |
3149 | case HW_DESC_RXPKT_LEN: |
3150 | - ret = GET_RX_DESC_PKT_LEN(pdesc); |
3151 | + ret = GET_RX_DESC_PKT_LEN(p_desc); |
3152 | + break; |
3153 | + case HW_DESC_RXBUFF_ADDR: |
3154 | + ret = GET_RX_DESC_BUFF_ADDR(p_desc); |
3155 | break; |
3156 | default: |
3157 | WARN_ONCE(true, "rtl8192de: ERR rxdesc :%d not processed\n", |
3158 | @@ -821,6 +823,23 @@ u64 rtl92de_get_desc(struct ieee80211_hw *hw, |
3159 | return ret; |
3160 | } |
3161 | |
3162 | +bool rtl92de_is_tx_desc_closed(struct ieee80211_hw *hw, |
3163 | + u8 hw_queue, u16 index) |
3164 | +{ |
3165 | + struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); |
3166 | + struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[hw_queue]; |
3167 | + u8 *entry = (u8 *)(&ring->desc[ring->idx]); |
3168 | + u8 own = (u8)rtl92de_get_desc(hw, entry, true, HW_DESC_OWN); |
3169 | + |
3170 | + /* a beacon packet will only use the first |
3171 | + * descriptor by defaut, and the own bit may not |
3172 | + * be cleared by the hardware |
3173 | + */ |
3174 | + if (own) |
3175 | + return false; |
3176 | + return true; |
3177 | +} |
3178 | + |
3179 | void rtl92de_tx_polling(struct ieee80211_hw *hw, u8 hw_queue) |
3180 | { |
3181 | struct rtl_priv *rtlpriv = rtl_priv(hw); |
3182 | diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192de/trx.h b/drivers/net/wireless/realtek/rtlwifi/rtl8192de/trx.h |
3183 | index 36820070fd76..635989e15282 100644 |
3184 | --- a/drivers/net/wireless/realtek/rtlwifi/rtl8192de/trx.h |
3185 | +++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192de/trx.h |
3186 | @@ -715,6 +715,8 @@ void rtl92de_set_desc(struct ieee80211_hw *hw, u8 *pdesc, bool istx, |
3187 | u8 desc_name, u8 *val); |
3188 | u64 rtl92de_get_desc(struct ieee80211_hw *hw, |
3189 | u8 *p_desc, bool istx, u8 desc_name); |
3190 | +bool rtl92de_is_tx_desc_closed(struct ieee80211_hw *hw, |
3191 | + u8 hw_queue, u16 index); |
3192 | void rtl92de_tx_polling(struct ieee80211_hw *hw, u8 hw_queue); |
3193 | void rtl92de_tx_fill_cmddesc(struct ieee80211_hw *hw, u8 *pdesc, |
3194 | bool b_firstseg, bool b_lastseg, |
3195 | diff --git a/drivers/net/wireless/virt_wifi.c b/drivers/net/wireless/virt_wifi.c |
3196 | index 7997cc6de334..01305ba2d3aa 100644 |
3197 | --- a/drivers/net/wireless/virt_wifi.c |
3198 | +++ b/drivers/net/wireless/virt_wifi.c |
3199 | @@ -450,7 +450,6 @@ static void virt_wifi_net_device_destructor(struct net_device *dev) |
3200 | */ |
3201 | kfree(dev->ieee80211_ptr); |
3202 | dev->ieee80211_ptr = NULL; |
3203 | - free_netdev(dev); |
3204 | } |
3205 | |
3206 | /* No lock interaction. */ |
3207 | @@ -458,7 +457,7 @@ static void virt_wifi_setup(struct net_device *dev) |
3208 | { |
3209 | ether_setup(dev); |
3210 | dev->netdev_ops = &virt_wifi_ops; |
3211 | - dev->priv_destructor = virt_wifi_net_device_destructor; |
3212 | + dev->needs_free_netdev = true; |
3213 | } |
3214 | |
3215 | /* Called in a RCU read critical section from netif_receive_skb */ |
3216 | @@ -544,6 +543,7 @@ static int virt_wifi_newlink(struct net *src_net, struct net_device *dev, |
3217 | goto unregister_netdev; |
3218 | } |
3219 | |
3220 | + dev->priv_destructor = virt_wifi_net_device_destructor; |
3221 | priv->being_deleted = false; |
3222 | priv->is_connected = false; |
3223 | priv->is_up = false; |
3224 | diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c |
3225 | index fa7ba09dca77..af3212aec871 100644 |
3226 | --- a/drivers/nvme/host/core.c |
3227 | +++ b/drivers/nvme/host/core.c |
3228 | @@ -1727,6 +1727,8 @@ static int nvme_report_ns_ids(struct nvme_ctrl *ctrl, unsigned int nsid, |
3229 | if (ret) |
3230 | dev_warn(ctrl->device, |
3231 | "Identify Descriptors failed (%d)\n", ret); |
3232 | + if (ret > 0) |
3233 | + ret = 0; |
3234 | } |
3235 | return ret; |
3236 | } |
3237 | @@ -2404,16 +2406,6 @@ static const struct nvme_core_quirk_entry core_quirks[] = { |
3238 | .vid = 0x14a4, |
3239 | .fr = "22301111", |
3240 | .quirks = NVME_QUIRK_SIMPLE_SUSPEND, |
3241 | - }, |
3242 | - { |
3243 | - /* |
3244 | - * This Kingston E8FK11.T firmware version has no interrupt |
3245 | - * after resume with actions related to suspend to idle |
3246 | - * https://bugzilla.kernel.org/show_bug.cgi?id=204887 |
3247 | - */ |
3248 | - .vid = 0x2646, |
3249 | - .fr = "E8FK11.T", |
3250 | - .quirks = NVME_QUIRK_SIMPLE_SUSPEND, |
3251 | } |
3252 | }; |
3253 | |
3254 | diff --git a/drivers/pci/hotplug/acpiphp_glue.c b/drivers/pci/hotplug/acpiphp_glue.c |
3255 | index e4c46637f32f..b3869951c0eb 100644 |
3256 | --- a/drivers/pci/hotplug/acpiphp_glue.c |
3257 | +++ b/drivers/pci/hotplug/acpiphp_glue.c |
3258 | @@ -449,8 +449,15 @@ static void acpiphp_native_scan_bridge(struct pci_dev *bridge) |
3259 | |
3260 | /* Scan non-hotplug bridges that need to be reconfigured */ |
3261 | for_each_pci_bridge(dev, bus) { |
3262 | - if (!hotplug_is_native(dev)) |
3263 | - max = pci_scan_bridge(bus, dev, max, 1); |
3264 | + if (hotplug_is_native(dev)) |
3265 | + continue; |
3266 | + |
3267 | + max = pci_scan_bridge(bus, dev, max, 1); |
3268 | + if (dev->subordinate) { |
3269 | + pcibios_resource_survey_bus(dev->subordinate); |
3270 | + pci_bus_size_bridges(dev->subordinate); |
3271 | + pci_bus_assign_resources(dev->subordinate); |
3272 | + } |
3273 | } |
3274 | } |
3275 | |
3276 | @@ -480,7 +487,6 @@ static void enable_slot(struct acpiphp_slot *slot, bool bridge) |
3277 | if (PCI_SLOT(dev->devfn) == slot->device) |
3278 | acpiphp_native_scan_bridge(dev); |
3279 | } |
3280 | - pci_assign_unassigned_bridge_resources(bus->self); |
3281 | } else { |
3282 | LIST_HEAD(add_list); |
3283 | int max, pass; |
3284 | diff --git a/drivers/phy/renesas/phy-rcar-gen3-usb2.c b/drivers/phy/renesas/phy-rcar-gen3-usb2.c |
3285 | index b7f6b1324395..6fd1390fd06e 100644 |
3286 | --- a/drivers/phy/renesas/phy-rcar-gen3-usb2.c |
3287 | +++ b/drivers/phy/renesas/phy-rcar-gen3-usb2.c |
3288 | @@ -21,6 +21,7 @@ |
3289 | #include <linux/platform_device.h> |
3290 | #include <linux/pm_runtime.h> |
3291 | #include <linux/regulator/consumer.h> |
3292 | +#include <linux/string.h> |
3293 | #include <linux/usb/of.h> |
3294 | #include <linux/workqueue.h> |
3295 | |
3296 | @@ -320,9 +321,9 @@ static ssize_t role_store(struct device *dev, struct device_attribute *attr, |
3297 | if (!ch->is_otg_channel || !rcar_gen3_is_any_rphy_initialized(ch)) |
3298 | return -EIO; |
3299 | |
3300 | - if (!strncmp(buf, "host", strlen("host"))) |
3301 | + if (sysfs_streq(buf, "host")) |
3302 | new_mode = PHY_MODE_USB_HOST; |
3303 | - else if (!strncmp(buf, "peripheral", strlen("peripheral"))) |
3304 | + else if (sysfs_streq(buf, "peripheral")) |
3305 | new_mode = PHY_MODE_USB_DEVICE; |
3306 | else |
3307 | return -EINVAL; |
3308 | diff --git a/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c b/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c |
3309 | index f2f5fcd9a237..83e585c5a613 100644 |
3310 | --- a/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c |
3311 | +++ b/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c |
3312 | @@ -595,10 +595,10 @@ static int armada_37xx_irq_set_type(struct irq_data *d, unsigned int type) |
3313 | regmap_read(info->regmap, in_reg, &in_val); |
3314 | |
3315 | /* Set initial polarity based on current input level. */ |
3316 | - if (in_val & d->mask) |
3317 | - val |= d->mask; /* falling */ |
3318 | + if (in_val & BIT(d->hwirq % GPIO_PER_REG)) |
3319 | + val |= BIT(d->hwirq % GPIO_PER_REG); /* falling */ |
3320 | else |
3321 | - val &= ~d->mask; /* rising */ |
3322 | + val &= ~(BIT(d->hwirq % GPIO_PER_REG)); /* rising */ |
3323 | break; |
3324 | } |
3325 | default: |
3326 | diff --git a/drivers/pinctrl/pinctrl-rza2.c b/drivers/pinctrl/pinctrl-rza2.c |
3327 | index 3be1d833bf25..eda88cdf870d 100644 |
3328 | --- a/drivers/pinctrl/pinctrl-rza2.c |
3329 | +++ b/drivers/pinctrl/pinctrl-rza2.c |
3330 | @@ -213,8 +213,8 @@ static const char * const rza2_gpio_names[] = { |
3331 | "PC_0", "PC_1", "PC_2", "PC_3", "PC_4", "PC_5", "PC_6", "PC_7", |
3332 | "PD_0", "PD_1", "PD_2", "PD_3", "PD_4", "PD_5", "PD_6", "PD_7", |
3333 | "PE_0", "PE_1", "PE_2", "PE_3", "PE_4", "PE_5", "PE_6", "PE_7", |
3334 | - "PF_0", "PF_1", "PF_2", "PF_3", "P0_4", "PF_5", "PF_6", "PF_7", |
3335 | - "PG_0", "PG_1", "PG_2", "P0_3", "PG_4", "PG_5", "PG_6", "PG_7", |
3336 | + "PF_0", "PF_1", "PF_2", "PF_3", "PF_4", "PF_5", "PF_6", "PF_7", |
3337 | + "PG_0", "PG_1", "PG_2", "PG_3", "PG_4", "PG_5", "PG_6", "PG_7", |
3338 | "PH_0", "PH_1", "PH_2", "PH_3", "PH_4", "PH_5", "PH_6", "PH_7", |
3339 | /* port I does not exist */ |
3340 | "PJ_0", "PJ_1", "PJ_2", "PJ_3", "PJ_4", "PJ_5", "PJ_6", "PJ_7", |
3341 | diff --git a/drivers/pinctrl/samsung/pinctrl-exynos.c b/drivers/pinctrl/samsung/pinctrl-exynos.c |
3342 | index ebc27b06718c..0599f5127b01 100644 |
3343 | --- a/drivers/pinctrl/samsung/pinctrl-exynos.c |
3344 | +++ b/drivers/pinctrl/samsung/pinctrl-exynos.c |
3345 | @@ -486,8 +486,10 @@ int exynos_eint_wkup_init(struct samsung_pinctrl_drv_data *d) |
3346 | if (match) { |
3347 | irq_chip = kmemdup(match->data, |
3348 | sizeof(*irq_chip), GFP_KERNEL); |
3349 | - if (!irq_chip) |
3350 | + if (!irq_chip) { |
3351 | + of_node_put(np); |
3352 | return -ENOMEM; |
3353 | + } |
3354 | wkup_np = np; |
3355 | break; |
3356 | } |
3357 | @@ -504,6 +506,7 @@ int exynos_eint_wkup_init(struct samsung_pinctrl_drv_data *d) |
3358 | bank->nr_pins, &exynos_eint_irqd_ops, bank); |
3359 | if (!bank->irq_domain) { |
3360 | dev_err(dev, "wkup irq domain add failed\n"); |
3361 | + of_node_put(wkup_np); |
3362 | return -ENXIO; |
3363 | } |
3364 | |
3365 | @@ -518,8 +521,10 @@ int exynos_eint_wkup_init(struct samsung_pinctrl_drv_data *d) |
3366 | weint_data = devm_kcalloc(dev, |
3367 | bank->nr_pins, sizeof(*weint_data), |
3368 | GFP_KERNEL); |
3369 | - if (!weint_data) |
3370 | + if (!weint_data) { |
3371 | + of_node_put(wkup_np); |
3372 | return -ENOMEM; |
3373 | + } |
3374 | |
3375 | for (idx = 0; idx < bank->nr_pins; ++idx) { |
3376 | irq = irq_of_parse_and_map(bank->of_node, idx); |
3377 | @@ -536,10 +541,13 @@ int exynos_eint_wkup_init(struct samsung_pinctrl_drv_data *d) |
3378 | } |
3379 | } |
3380 | |
3381 | - if (!muxed_banks) |
3382 | + if (!muxed_banks) { |
3383 | + of_node_put(wkup_np); |
3384 | return 0; |
3385 | + } |
3386 | |
3387 | irq = irq_of_parse_and_map(wkup_np, 0); |
3388 | + of_node_put(wkup_np); |
3389 | if (!irq) { |
3390 | dev_err(dev, "irq number for muxed EINTs not found\n"); |
3391 | return 0; |
3392 | diff --git a/drivers/pinctrl/samsung/pinctrl-s3c24xx.c b/drivers/pinctrl/samsung/pinctrl-s3c24xx.c |
3393 | index 7e824e4d20f4..9bd0a3de101d 100644 |
3394 | --- a/drivers/pinctrl/samsung/pinctrl-s3c24xx.c |
3395 | +++ b/drivers/pinctrl/samsung/pinctrl-s3c24xx.c |
3396 | @@ -490,8 +490,10 @@ static int s3c24xx_eint_init(struct samsung_pinctrl_drv_data *d) |
3397 | return -ENODEV; |
3398 | |
3399 | eint_data = devm_kzalloc(dev, sizeof(*eint_data), GFP_KERNEL); |
3400 | - if (!eint_data) |
3401 | + if (!eint_data) { |
3402 | + of_node_put(eint_np); |
3403 | return -ENOMEM; |
3404 | + } |
3405 | |
3406 | eint_data->drvdata = d; |
3407 | |
3408 | @@ -503,12 +505,14 @@ static int s3c24xx_eint_init(struct samsung_pinctrl_drv_data *d) |
3409 | irq = irq_of_parse_and_map(eint_np, i); |
3410 | if (!irq) { |
3411 | dev_err(dev, "failed to get wakeup EINT IRQ %d\n", i); |
3412 | + of_node_put(eint_np); |
3413 | return -ENXIO; |
3414 | } |
3415 | |
3416 | eint_data->parents[i] = irq; |
3417 | irq_set_chained_handler_and_data(irq, handlers[i], eint_data); |
3418 | } |
3419 | + of_node_put(eint_np); |
3420 | |
3421 | bank = d->pin_banks; |
3422 | for (i = 0; i < d->nr_banks; ++i, ++bank) { |
3423 | diff --git a/drivers/pinctrl/samsung/pinctrl-s3c64xx.c b/drivers/pinctrl/samsung/pinctrl-s3c64xx.c |
3424 | index c399f0932af5..f97f8179f2b1 100644 |
3425 | --- a/drivers/pinctrl/samsung/pinctrl-s3c64xx.c |
3426 | +++ b/drivers/pinctrl/samsung/pinctrl-s3c64xx.c |
3427 | @@ -704,8 +704,10 @@ static int s3c64xx_eint_eint0_init(struct samsung_pinctrl_drv_data *d) |
3428 | return -ENODEV; |
3429 | |
3430 | data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); |
3431 | - if (!data) |
3432 | + if (!data) { |
3433 | + of_node_put(eint0_np); |
3434 | return -ENOMEM; |
3435 | + } |
3436 | data->drvdata = d; |
3437 | |
3438 | for (i = 0; i < NUM_EINT0_IRQ; ++i) { |
3439 | @@ -714,6 +716,7 @@ static int s3c64xx_eint_eint0_init(struct samsung_pinctrl_drv_data *d) |
3440 | irq = irq_of_parse_and_map(eint0_np, i); |
3441 | if (!irq) { |
3442 | dev_err(dev, "failed to get wakeup EINT IRQ %d\n", i); |
3443 | + of_node_put(eint0_np); |
3444 | return -ENXIO; |
3445 | } |
3446 | |
3447 | @@ -721,6 +724,7 @@ static int s3c64xx_eint_eint0_init(struct samsung_pinctrl_drv_data *d) |
3448 | s3c64xx_eint0_handlers[i], |
3449 | data); |
3450 | } |
3451 | + of_node_put(eint0_np); |
3452 | |
3453 | bank = d->pin_banks; |
3454 | for (i = 0; i < d->nr_banks; ++i, ++bank) { |
3455 | diff --git a/drivers/pinctrl/samsung/pinctrl-samsung.c b/drivers/pinctrl/samsung/pinctrl-samsung.c |
3456 | index de0477bb469d..f26574ef234a 100644 |
3457 | --- a/drivers/pinctrl/samsung/pinctrl-samsung.c |
3458 | +++ b/drivers/pinctrl/samsung/pinctrl-samsung.c |
3459 | @@ -272,6 +272,7 @@ static int samsung_dt_node_to_map(struct pinctrl_dev *pctldev, |
3460 | &reserved_maps, num_maps); |
3461 | if (ret < 0) { |
3462 | samsung_dt_free_map(pctldev, *map, *num_maps); |
3463 | + of_node_put(np); |
3464 | return ret; |
3465 | } |
3466 | } |
3467 | @@ -785,8 +786,10 @@ static struct samsung_pmx_func *samsung_pinctrl_create_functions( |
3468 | if (!of_get_child_count(cfg_np)) { |
3469 | ret = samsung_pinctrl_create_function(dev, drvdata, |
3470 | cfg_np, func); |
3471 | - if (ret < 0) |
3472 | + if (ret < 0) { |
3473 | + of_node_put(cfg_np); |
3474 | return ERR_PTR(ret); |
3475 | + } |
3476 | if (ret > 0) { |
3477 | ++func; |
3478 | ++func_cnt; |
3479 | @@ -797,8 +800,11 @@ static struct samsung_pmx_func *samsung_pinctrl_create_functions( |
3480 | for_each_child_of_node(cfg_np, func_np) { |
3481 | ret = samsung_pinctrl_create_function(dev, drvdata, |
3482 | func_np, func); |
3483 | - if (ret < 0) |
3484 | + if (ret < 0) { |
3485 | + of_node_put(func_np); |
3486 | + of_node_put(cfg_np); |
3487 | return ERR_PTR(ret); |
3488 | + } |
3489 | if (ret > 0) { |
3490 | ++func; |
3491 | ++func_cnt; |
3492 | diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c |
3493 | index c93ef33b01d3..5c1378d2fab3 100644 |
3494 | --- a/drivers/rtc/interface.c |
3495 | +++ b/drivers/rtc/interface.c |
3496 | @@ -125,7 +125,7 @@ EXPORT_SYMBOL_GPL(rtc_read_time); |
3497 | |
3498 | int rtc_set_time(struct rtc_device *rtc, struct rtc_time *tm) |
3499 | { |
3500 | - int err; |
3501 | + int err, uie; |
3502 | |
3503 | err = rtc_valid_tm(tm); |
3504 | if (err != 0) |
3505 | @@ -137,6 +137,17 @@ int rtc_set_time(struct rtc_device *rtc, struct rtc_time *tm) |
3506 | |
3507 | rtc_subtract_offset(rtc, tm); |
3508 | |
3509 | +#ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL |
3510 | + uie = rtc->uie_rtctimer.enabled || rtc->uie_irq_active; |
3511 | +#else |
3512 | + uie = rtc->uie_rtctimer.enabled; |
3513 | +#endif |
3514 | + if (uie) { |
3515 | + err = rtc_update_irq_enable(rtc, 0); |
3516 | + if (err) |
3517 | + return err; |
3518 | + } |
3519 | + |
3520 | err = mutex_lock_interruptible(&rtc->ops_lock); |
3521 | if (err) |
3522 | return err; |
3523 | @@ -153,6 +164,12 @@ int rtc_set_time(struct rtc_device *rtc, struct rtc_time *tm) |
3524 | /* A timer might have just expired */ |
3525 | schedule_work(&rtc->irqwork); |
3526 | |
3527 | + if (uie) { |
3528 | + err = rtc_update_irq_enable(rtc, 1); |
3529 | + if (err) |
3530 | + return err; |
3531 | + } |
3532 | + |
3533 | trace_rtc_set_time(rtc_tm_to_time64(tm), err); |
3534 | return err; |
3535 | } |
3536 | diff --git a/drivers/s390/scsi/zfcp_dbf.c b/drivers/s390/scsi/zfcp_dbf.c |
3537 | index dccdb41bed8c..1234294700c4 100644 |
3538 | --- a/drivers/s390/scsi/zfcp_dbf.c |
3539 | +++ b/drivers/s390/scsi/zfcp_dbf.c |
3540 | @@ -95,11 +95,9 @@ void zfcp_dbf_hba_fsf_res(char *tag, int level, struct zfcp_fsf_req *req) |
3541 | memcpy(rec->u.res.fsf_status_qual, &q_head->fsf_status_qual, |
3542 | FSF_STATUS_QUALIFIER_SIZE); |
3543 | |
3544 | - if (q_head->fsf_command != FSF_QTCB_FCP_CMND) { |
3545 | - rec->pl_len = q_head->log_length; |
3546 | - zfcp_dbf_pl_write(dbf, (char *)q_pref + q_head->log_start, |
3547 | - rec->pl_len, "fsf_res", req->req_id); |
3548 | - } |
3549 | + rec->pl_len = q_head->log_length; |
3550 | + zfcp_dbf_pl_write(dbf, (char *)q_pref + q_head->log_start, |
3551 | + rec->pl_len, "fsf_res", req->req_id); |
3552 | |
3553 | debug_event(dbf->hba, level, rec, sizeof(*rec)); |
3554 | spin_unlock_irqrestore(&dbf->hba_lock, flags); |
3555 | diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c |
3556 | index 6822cd9ff8f1..ad8ef67a1db3 100644 |
3557 | --- a/drivers/scsi/lpfc/lpfc_scsi.c |
3558 | +++ b/drivers/scsi/lpfc/lpfc_scsi.c |
3559 | @@ -526,7 +526,7 @@ lpfc_sli4_io_xri_aborted(struct lpfc_hba *phba, |
3560 | &qp->lpfc_abts_io_buf_list, list) { |
3561 | if (psb->cur_iocbq.sli4_xritag == xri) { |
3562 | list_del_init(&psb->list); |
3563 | - psb->exch_busy = 0; |
3564 | + psb->flags &= ~LPFC_SBUF_XBUSY; |
3565 | psb->status = IOSTAT_SUCCESS; |
3566 | if (psb->cur_iocbq.iocb_flag == LPFC_IO_NVME) { |
3567 | qp->abts_nvme_io_bufs--; |
3568 | @@ -566,7 +566,7 @@ lpfc_sli4_io_xri_aborted(struct lpfc_hba *phba, |
3569 | if (iocbq->sli4_xritag != xri) |
3570 | continue; |
3571 | psb = container_of(iocbq, struct lpfc_io_buf, cur_iocbq); |
3572 | - psb->exch_busy = 0; |
3573 | + psb->flags &= ~LPFC_SBUF_XBUSY; |
3574 | spin_unlock_irqrestore(&phba->hbalock, iflag); |
3575 | if (!list_empty(&pring->txq)) |
3576 | lpfc_worker_wake_up(phba); |
3577 | @@ -786,7 +786,7 @@ lpfc_release_scsi_buf_s4(struct lpfc_hba *phba, struct lpfc_io_buf *psb) |
3578 | psb->prot_seg_cnt = 0; |
3579 | |
3580 | qp = psb->hdwq; |
3581 | - if (psb->exch_busy) { |
3582 | + if (psb->flags & LPFC_SBUF_XBUSY) { |
3583 | spin_lock_irqsave(&qp->abts_io_buf_list_lock, iflag); |
3584 | psb->pCmd = NULL; |
3585 | list_add_tail(&psb->list, &qp->lpfc_abts_io_buf_list); |
3586 | @@ -3835,7 +3835,10 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn, |
3587 | lpfc_cmd->result = (pIocbOut->iocb.un.ulpWord[4] & IOERR_PARAM_MASK); |
3588 | lpfc_cmd->status = pIocbOut->iocb.ulpStatus; |
3589 | /* pick up SLI4 exhange busy status from HBA */ |
3590 | - lpfc_cmd->exch_busy = pIocbOut->iocb_flag & LPFC_EXCHANGE_BUSY; |
3591 | + if (pIocbOut->iocb_flag & LPFC_EXCHANGE_BUSY) |
3592 | + lpfc_cmd->flags |= LPFC_SBUF_XBUSY; |
3593 | + else |
3594 | + lpfc_cmd->flags &= ~LPFC_SBUF_XBUSY; |
3595 | |
3596 | #ifdef CONFIG_SCSI_LPFC_DEBUG_FS |
3597 | if (lpfc_cmd->prot_data_type) { |
3598 | diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c |
3599 | index 614f78dddafe..5ed4219675eb 100644 |
3600 | --- a/drivers/scsi/lpfc/lpfc_sli.c |
3601 | +++ b/drivers/scsi/lpfc/lpfc_sli.c |
3602 | @@ -11736,7 +11736,10 @@ lpfc_sli_wake_iocb_wait(struct lpfc_hba *phba, |
3603 | !(cmdiocbq->iocb_flag & LPFC_IO_LIBDFC)) { |
3604 | lpfc_cmd = container_of(cmdiocbq, struct lpfc_io_buf, |
3605 | cur_iocbq); |
3606 | - lpfc_cmd->exch_busy = rspiocbq->iocb_flag & LPFC_EXCHANGE_BUSY; |
3607 | + if (rspiocbq && (rspiocbq->iocb_flag & LPFC_EXCHANGE_BUSY)) |
3608 | + lpfc_cmd->flags |= LPFC_SBUF_XBUSY; |
3609 | + else |
3610 | + lpfc_cmd->flags &= ~LPFC_SBUF_XBUSY; |
3611 | } |
3612 | |
3613 | pdone_q = cmdiocbq->context_un.wait_queue; |
3614 | diff --git a/drivers/scsi/lpfc/lpfc_sli.h b/drivers/scsi/lpfc/lpfc_sli.h |
3615 | index 37fbcb46387e..7bcf922a8be2 100644 |
3616 | --- a/drivers/scsi/lpfc/lpfc_sli.h |
3617 | +++ b/drivers/scsi/lpfc/lpfc_sli.h |
3618 | @@ -384,14 +384,13 @@ struct lpfc_io_buf { |
3619 | |
3620 | struct lpfc_nodelist *ndlp; |
3621 | uint32_t timeout; |
3622 | - uint16_t flags; /* TBD convert exch_busy to flags */ |
3623 | + uint16_t flags; |
3624 | #define LPFC_SBUF_XBUSY 0x1 /* SLI4 hba reported XB on WCQE cmpl */ |
3625 | #define LPFC_SBUF_BUMP_QDEPTH 0x2 /* bumped queue depth counter */ |
3626 | /* External DIF device IO conversions */ |
3627 | #define LPFC_SBUF_NORMAL_DIF 0x4 /* normal mode to insert/strip */ |
3628 | #define LPFC_SBUF_PASS_DIF 0x8 /* insert/strip mode to passthru */ |
3629 | #define LPFC_SBUF_NOT_POSTED 0x10 /* SGL failed post to FW. */ |
3630 | - uint16_t exch_busy; /* SLI4 hba reported XB on complete WCQE */ |
3631 | uint16_t status; /* From IOCB Word 7- ulpStatus */ |
3632 | uint32_t result; /* From IOCB Word 4. */ |
3633 | |
3634 | diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h |
3635 | index 6ffa9877c28b..d5386edddaf6 100644 |
3636 | --- a/drivers/scsi/qla2xxx/qla_def.h |
3637 | +++ b/drivers/scsi/qla2xxx/qla_def.h |
3638 | @@ -591,19 +591,23 @@ typedef struct srb { |
3639 | */ |
3640 | uint8_t cmd_type; |
3641 | uint8_t pad[3]; |
3642 | - atomic_t ref_count; |
3643 | struct kref cmd_kref; /* need to migrate ref_count over to this */ |
3644 | void *priv; |
3645 | wait_queue_head_t nvme_ls_waitq; |
3646 | struct fc_port *fcport; |
3647 | struct scsi_qla_host *vha; |
3648 | unsigned int start_timer:1; |
3649 | + unsigned int abort:1; |
3650 | + unsigned int aborted:1; |
3651 | + unsigned int completed:1; |
3652 | + |
3653 | uint32_t handle; |
3654 | uint16_t flags; |
3655 | uint16_t type; |
3656 | const char *name; |
3657 | int iocbs; |
3658 | struct qla_qpair *qpair; |
3659 | + struct srb *cmd_sp; |
3660 | struct list_head elem; |
3661 | u32 gen1; /* scratch */ |
3662 | u32 gen2; /* scratch */ |
3663 | diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c |
3664 | index 5298ed10059f..84bb4a048016 100644 |
3665 | --- a/drivers/scsi/qla2xxx/qla_gs.c |
3666 | +++ b/drivers/scsi/qla2xxx/qla_gs.c |
3667 | @@ -3005,7 +3005,7 @@ static void qla24xx_async_gpsc_sp_done(srb_t *sp, int res) |
3668 | fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE); |
3669 | |
3670 | if (res == QLA_FUNCTION_TIMEOUT) |
3671 | - return; |
3672 | + goto done; |
3673 | |
3674 | if (res == (DID_ERROR << 16)) { |
3675 | /* entry status error */ |
3676 | diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c |
3677 | index 1d041313ec52..d400b51929a6 100644 |
3678 | --- a/drivers/scsi/qla2xxx/qla_init.c |
3679 | +++ b/drivers/scsi/qla2xxx/qla_init.c |
3680 | @@ -101,8 +101,22 @@ static void qla24xx_abort_iocb_timeout(void *data) |
3681 | u32 handle; |
3682 | unsigned long flags; |
3683 | |
3684 | + if (sp->cmd_sp) |
3685 | + ql_dbg(ql_dbg_async, sp->vha, 0x507c, |
3686 | + "Abort timeout - cmd hdl=%x, cmd type=%x hdl=%x, type=%x\n", |
3687 | + sp->cmd_sp->handle, sp->cmd_sp->type, |
3688 | + sp->handle, sp->type); |
3689 | + else |
3690 | + ql_dbg(ql_dbg_async, sp->vha, 0x507c, |
3691 | + "Abort timeout 2 - hdl=%x, type=%x\n", |
3692 | + sp->handle, sp->type); |
3693 | + |
3694 | spin_lock_irqsave(qpair->qp_lock_ptr, flags); |
3695 | for (handle = 1; handle < qpair->req->num_outstanding_cmds; handle++) { |
3696 | + if (sp->cmd_sp && (qpair->req->outstanding_cmds[handle] == |
3697 | + sp->cmd_sp)) |
3698 | + qpair->req->outstanding_cmds[handle] = NULL; |
3699 | + |
3700 | /* removing the abort */ |
3701 | if (qpair->req->outstanding_cmds[handle] == sp) { |
3702 | qpair->req->outstanding_cmds[handle] = NULL; |
3703 | @@ -111,6 +125,9 @@ static void qla24xx_abort_iocb_timeout(void *data) |
3704 | } |
3705 | spin_unlock_irqrestore(qpair->qp_lock_ptr, flags); |
3706 | |
3707 | + if (sp->cmd_sp) |
3708 | + sp->cmd_sp->done(sp->cmd_sp, QLA_OS_TIMER_EXPIRED); |
3709 | + |
3710 | abt->u.abt.comp_status = CS_TIMEOUT; |
3711 | sp->done(sp, QLA_OS_TIMER_EXPIRED); |
3712 | } |
3713 | @@ -142,6 +159,7 @@ static int qla24xx_async_abort_cmd(srb_t *cmd_sp, bool wait) |
3714 | sp->type = SRB_ABT_CMD; |
3715 | sp->name = "abort"; |
3716 | sp->qpair = cmd_sp->qpair; |
3717 | + sp->cmd_sp = cmd_sp; |
3718 | if (wait) |
3719 | sp->flags = SRB_WAKEUP_ON_COMP; |
3720 | |
3721 | @@ -1135,19 +1153,18 @@ static void qla24xx_async_gpdb_sp_done(srb_t *sp, int res) |
3722 | "Async done-%s res %x, WWPN %8phC mb[1]=%x mb[2]=%x \n", |
3723 | sp->name, res, fcport->port_name, mb[1], mb[2]); |
3724 | |
3725 | - if (res == QLA_FUNCTION_TIMEOUT) { |
3726 | - dma_pool_free(sp->vha->hw->s_dma_pool, sp->u.iocb_cmd.u.mbx.in, |
3727 | - sp->u.iocb_cmd.u.mbx.in_dma); |
3728 | - return; |
3729 | - } |
3730 | - |
3731 | fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE); |
3732 | + |
3733 | + if (res == QLA_FUNCTION_TIMEOUT) |
3734 | + goto done; |
3735 | + |
3736 | memset(&ea, 0, sizeof(ea)); |
3737 | ea.fcport = fcport; |
3738 | ea.sp = sp; |
3739 | |
3740 | qla24xx_handle_gpdb_event(vha, &ea); |
3741 | |
3742 | +done: |
3743 | dma_pool_free(ha->s_dma_pool, sp->u.iocb_cmd.u.mbx.in, |
3744 | sp->u.iocb_cmd.u.mbx.in_dma); |
3745 | |
3746 | @@ -9003,8 +9020,6 @@ int qla2xxx_delete_qpair(struct scsi_qla_host *vha, struct qla_qpair *qpair) |
3747 | struct qla_hw_data *ha = qpair->hw; |
3748 | |
3749 | qpair->delete_in_progress = 1; |
3750 | - while (atomic_read(&qpair->ref_count)) |
3751 | - msleep(500); |
3752 | |
3753 | ret = qla25xx_delete_req_que(vha, qpair->req); |
3754 | if (ret != QLA_SUCCESS) |
3755 | diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c |
3756 | index 009fd5a33fcd..9204e8467a4e 100644 |
3757 | --- a/drivers/scsi/qla2xxx/qla_isr.c |
3758 | +++ b/drivers/scsi/qla2xxx/qla_isr.c |
3759 | @@ -2466,6 +2466,11 @@ qla2x00_status_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, void *pkt) |
3760 | return; |
3761 | } |
3762 | |
3763 | + if (sp->abort) |
3764 | + sp->aborted = 1; |
3765 | + else |
3766 | + sp->completed = 1; |
3767 | + |
3768 | if (sp->cmd_type != TYPE_SRB) { |
3769 | req->outstanding_cmds[handle] = NULL; |
3770 | ql_dbg(ql_dbg_io, vha, 0x3015, |
3771 | diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c |
3772 | index 4a1f21c11758..4d90cf101f5f 100644 |
3773 | --- a/drivers/scsi/qla2xxx/qla_mbx.c |
3774 | +++ b/drivers/scsi/qla2xxx/qla_mbx.c |
3775 | @@ -6287,17 +6287,13 @@ int qla24xx_send_mb_cmd(struct scsi_qla_host *vha, mbx_cmd_t *mcp) |
3776 | case QLA_SUCCESS: |
3777 | ql_dbg(ql_dbg_mbx, vha, 0x119d, "%s: %s done.\n", |
3778 | __func__, sp->name); |
3779 | - sp->free(sp); |
3780 | break; |
3781 | default: |
3782 | ql_dbg(ql_dbg_mbx, vha, 0x119e, "%s: %s Failed. %x.\n", |
3783 | __func__, sp->name, rval); |
3784 | - sp->free(sp); |
3785 | break; |
3786 | } |
3787 | |
3788 | - return rval; |
3789 | - |
3790 | done_free_sp: |
3791 | sp->free(sp); |
3792 | done: |
3793 | diff --git a/drivers/scsi/qla2xxx/qla_mid.c b/drivers/scsi/qla2xxx/qla_mid.c |
3794 | index 238240984bc1..eabc5127174e 100644 |
3795 | --- a/drivers/scsi/qla2xxx/qla_mid.c |
3796 | +++ b/drivers/scsi/qla2xxx/qla_mid.c |
3797 | @@ -946,7 +946,7 @@ int qla24xx_control_vp(scsi_qla_host_t *vha, int cmd) |
3798 | |
3799 | sp = qla2x00_get_sp(base_vha, NULL, GFP_KERNEL); |
3800 | if (!sp) |
3801 | - goto done; |
3802 | + return rval; |
3803 | |
3804 | sp->type = SRB_CTRL_VP; |
3805 | sp->name = "ctrl_vp"; |
3806 | @@ -962,7 +962,7 @@ int qla24xx_control_vp(scsi_qla_host_t *vha, int cmd) |
3807 | ql_dbg(ql_dbg_async, vha, 0xffff, |
3808 | "%s: %s Failed submission. %x.\n", |
3809 | __func__, sp->name, rval); |
3810 | - goto done_free_sp; |
3811 | + goto done; |
3812 | } |
3813 | |
3814 | ql_dbg(ql_dbg_vport, vha, 0x113f, "%s hndl %x submitted\n", |
3815 | @@ -980,16 +980,13 @@ int qla24xx_control_vp(scsi_qla_host_t *vha, int cmd) |
3816 | case QLA_SUCCESS: |
3817 | ql_dbg(ql_dbg_vport, vha, 0xffff, "%s: %s done.\n", |
3818 | __func__, sp->name); |
3819 | - goto done_free_sp; |
3820 | + break; |
3821 | default: |
3822 | ql_dbg(ql_dbg_vport, vha, 0xffff, "%s: %s Failed. %x.\n", |
3823 | __func__, sp->name, rval); |
3824 | - goto done_free_sp; |
3825 | + break; |
3826 | } |
3827 | done: |
3828 | - return rval; |
3829 | - |
3830 | -done_free_sp: |
3831 | sp->free(sp); |
3832 | return rval; |
3833 | } |
3834 | diff --git a/drivers/scsi/qla2xxx/qla_nvme.c b/drivers/scsi/qla2xxx/qla_nvme.c |
3835 | index 6cc19e060afc..941aa53363f5 100644 |
3836 | --- a/drivers/scsi/qla2xxx/qla_nvme.c |
3837 | +++ b/drivers/scsi/qla2xxx/qla_nvme.c |
3838 | @@ -224,8 +224,8 @@ static void qla_nvme_abort_work(struct work_struct *work) |
3839 | |
3840 | if (ha->flags.host_shutting_down) { |
3841 | ql_log(ql_log_info, sp->fcport->vha, 0xffff, |
3842 | - "%s Calling done on sp: %p, type: 0x%x, sp->ref_count: 0x%x\n", |
3843 | - __func__, sp, sp->type, atomic_read(&sp->ref_count)); |
3844 | + "%s Calling done on sp: %p, type: 0x%x\n", |
3845 | + __func__, sp, sp->type); |
3846 | sp->done(sp, 0); |
3847 | goto out; |
3848 | } |
3849 | diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c |
3850 | index 726ad4cbf4a6..06037e3c7854 100644 |
3851 | --- a/drivers/scsi/qla2xxx/qla_os.c |
3852 | +++ b/drivers/scsi/qla2xxx/qla_os.c |
3853 | @@ -698,11 +698,6 @@ void qla2x00_sp_compl(srb_t *sp, int res) |
3854 | struct scsi_cmnd *cmd = GET_CMD_SP(sp); |
3855 | struct completion *comp = sp->comp; |
3856 | |
3857 | - if (WARN_ON_ONCE(atomic_read(&sp->ref_count) == 0)) |
3858 | - return; |
3859 | - |
3860 | - atomic_dec(&sp->ref_count); |
3861 | - |
3862 | sp->free(sp); |
3863 | cmd->result = res; |
3864 | CMD_SP(cmd) = NULL; |
3865 | @@ -794,11 +789,6 @@ void qla2xxx_qpair_sp_compl(srb_t *sp, int res) |
3866 | struct scsi_cmnd *cmd = GET_CMD_SP(sp); |
3867 | struct completion *comp = sp->comp; |
3868 | |
3869 | - if (WARN_ON_ONCE(atomic_read(&sp->ref_count) == 0)) |
3870 | - return; |
3871 | - |
3872 | - atomic_dec(&sp->ref_count); |
3873 | - |
3874 | sp->free(sp); |
3875 | cmd->result = res; |
3876 | CMD_SP(cmd) = NULL; |
3877 | @@ -903,7 +893,7 @@ qla2xxx_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd) |
3878 | |
3879 | sp->u.scmd.cmd = cmd; |
3880 | sp->type = SRB_SCSI_CMD; |
3881 | - atomic_set(&sp->ref_count, 1); |
3882 | + |
3883 | CMD_SP(cmd) = (void *)sp; |
3884 | sp->free = qla2x00_sp_free_dma; |
3885 | sp->done = qla2x00_sp_compl; |
3886 | @@ -985,18 +975,16 @@ qla2xxx_mqueuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd, |
3887 | |
3888 | sp->u.scmd.cmd = cmd; |
3889 | sp->type = SRB_SCSI_CMD; |
3890 | - atomic_set(&sp->ref_count, 1); |
3891 | CMD_SP(cmd) = (void *)sp; |
3892 | sp->free = qla2xxx_qpair_sp_free_dma; |
3893 | sp->done = qla2xxx_qpair_sp_compl; |
3894 | - sp->qpair = qpair; |
3895 | |
3896 | rval = ha->isp_ops->start_scsi_mq(sp); |
3897 | if (rval != QLA_SUCCESS) { |
3898 | ql_dbg(ql_dbg_io + ql_dbg_verbose, vha, 0x3078, |
3899 | "Start scsi failed rval=%d for cmd=%p.\n", rval, cmd); |
3900 | if (rval == QLA_INTERFACE_ERROR) |
3901 | - goto qc24_fail_command; |
3902 | + goto qc24_free_sp_fail_command; |
3903 | goto qc24_host_busy_free_sp; |
3904 | } |
3905 | |
3906 | @@ -1008,6 +996,11 @@ qc24_host_busy_free_sp: |
3907 | qc24_target_busy: |
3908 | return SCSI_MLQUEUE_TARGET_BUSY; |
3909 | |
3910 | +qc24_free_sp_fail_command: |
3911 | + sp->free(sp); |
3912 | + CMD_SP(cmd) = NULL; |
3913 | + qla2xxx_rel_qpair_sp(sp->qpair, sp); |
3914 | + |
3915 | qc24_fail_command: |
3916 | cmd->scsi_done(cmd); |
3917 | |
3918 | @@ -1184,16 +1177,6 @@ qla2x00_wait_for_chip_reset(scsi_qla_host_t *vha) |
3919 | return return_status; |
3920 | } |
3921 | |
3922 | -static int |
3923 | -sp_get(struct srb *sp) |
3924 | -{ |
3925 | - if (!refcount_inc_not_zero((refcount_t *)&sp->ref_count)) |
3926 | - /* kref get fail */ |
3927 | - return ENXIO; |
3928 | - else |
3929 | - return 0; |
3930 | -} |
3931 | - |
3932 | #define ISP_REG_DISCONNECT 0xffffffffU |
3933 | /************************************************************************** |
3934 | * qla2x00_isp_reg_stat |
3935 | @@ -1249,6 +1232,9 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd) |
3936 | uint64_t lun; |
3937 | int rval; |
3938 | struct qla_hw_data *ha = vha->hw; |
3939 | + uint32_t ratov_j; |
3940 | + struct qla_qpair *qpair; |
3941 | + unsigned long flags; |
3942 | |
3943 | if (qla2x00_isp_reg_stat(ha)) { |
3944 | ql_log(ql_log_info, vha, 0x8042, |
3945 | @@ -1261,13 +1247,26 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd) |
3946 | return ret; |
3947 | |
3948 | sp = scsi_cmd_priv(cmd); |
3949 | + qpair = sp->qpair; |
3950 | |
3951 | - if (sp->fcport && sp->fcport->deleted) |
3952 | + if ((sp->fcport && sp->fcport->deleted) || !qpair) |
3953 | return SUCCESS; |
3954 | |
3955 | - /* Return if the command has already finished. */ |
3956 | - if (sp_get(sp)) |
3957 | + spin_lock_irqsave(qpair->qp_lock_ptr, flags); |
3958 | + if (sp->completed) { |
3959 | + spin_unlock_irqrestore(qpair->qp_lock_ptr, flags); |
3960 | return SUCCESS; |
3961 | + } |
3962 | + |
3963 | + if (sp->abort || sp->aborted) { |
3964 | + spin_unlock_irqrestore(qpair->qp_lock_ptr, flags); |
3965 | + return FAILED; |
3966 | + } |
3967 | + |
3968 | + sp->abort = 1; |
3969 | + sp->comp = ∁ |
3970 | + spin_unlock_irqrestore(qpair->qp_lock_ptr, flags); |
3971 | + |
3972 | |
3973 | id = cmd->device->id; |
3974 | lun = cmd->device->lun; |
3975 | @@ -1276,47 +1275,37 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd) |
3976 | "Aborting from RISC nexus=%ld:%d:%llu sp=%p cmd=%p handle=%x\n", |
3977 | vha->host_no, id, lun, sp, cmd, sp->handle); |
3978 | |
3979 | + /* |
3980 | + * Abort will release the original Command/sp from FW. Let the |
3981 | + * original command call scsi_done. In return, he will wakeup |
3982 | + * this sleeping thread. |
3983 | + */ |
3984 | rval = ha->isp_ops->abort_command(sp); |
3985 | + |
3986 | ql_dbg(ql_dbg_taskm, vha, 0x8003, |
3987 | "Abort command mbx cmd=%p, rval=%x.\n", cmd, rval); |
3988 | |
3989 | + /* Wait for the command completion. */ |
3990 | + ratov_j = ha->r_a_tov/10 * 4 * 1000; |
3991 | + ratov_j = msecs_to_jiffies(ratov_j); |
3992 | switch (rval) { |
3993 | case QLA_SUCCESS: |
3994 | - /* |
3995 | - * The command has been aborted. That means that the firmware |
3996 | - * won't report a completion. |
3997 | - */ |
3998 | - sp->done(sp, DID_ABORT << 16); |
3999 | - ret = SUCCESS; |
4000 | - break; |
4001 | - case QLA_FUNCTION_PARAMETER_ERROR: { |
4002 | - /* Wait for the command completion. */ |
4003 | - uint32_t ratov = ha->r_a_tov/10; |
4004 | - uint32_t ratov_j = msecs_to_jiffies(4 * ratov * 1000); |
4005 | - |
4006 | - WARN_ON_ONCE(sp->comp); |
4007 | - sp->comp = ∁ |
4008 | if (!wait_for_completion_timeout(&comp, ratov_j)) { |
4009 | ql_dbg(ql_dbg_taskm, vha, 0xffff, |
4010 | "%s: Abort wait timer (4 * R_A_TOV[%d]) expired\n", |
4011 | - __func__, ha->r_a_tov); |
4012 | + __func__, ha->r_a_tov/10); |
4013 | ret = FAILED; |
4014 | } else { |
4015 | ret = SUCCESS; |
4016 | } |
4017 | break; |
4018 | - } |
4019 | default: |
4020 | - /* |
4021 | - * Either abort failed or abort and completion raced. Let |
4022 | - * the SCSI core retry the abort in the former case. |
4023 | - */ |
4024 | ret = FAILED; |
4025 | break; |
4026 | } |
4027 | |
4028 | sp->comp = NULL; |
4029 | - atomic_dec(&sp->ref_count); |
4030 | + |
4031 | ql_log(ql_log_info, vha, 0x801c, |
4032 | "Abort command issued nexus=%ld:%d:%llu -- %x.\n", |
4033 | vha->host_no, id, lun, ret); |
4034 | @@ -1708,32 +1697,53 @@ static void qla2x00_abort_srb(struct qla_qpair *qp, srb_t *sp, const int res, |
4035 | scsi_qla_host_t *vha = qp->vha; |
4036 | struct qla_hw_data *ha = vha->hw; |
4037 | int rval; |
4038 | + bool ret_cmd; |
4039 | + uint32_t ratov_j; |
4040 | |
4041 | - if (sp_get(sp)) |
4042 | + if (qla2x00_chip_is_down(vha)) { |
4043 | + sp->done(sp, res); |
4044 | return; |
4045 | + } |
4046 | |
4047 | if (sp->type == SRB_NVME_CMD || sp->type == SRB_NVME_LS || |
4048 | (sp->type == SRB_SCSI_CMD && !ha->flags.eeh_busy && |
4049 | !test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags) && |
4050 | !qla2x00_isp_reg_stat(ha))) { |
4051 | + if (sp->comp) { |
4052 | + sp->done(sp, res); |
4053 | + return; |
4054 | + } |
4055 | + |
4056 | sp->comp = ∁ |
4057 | + sp->abort = 1; |
4058 | spin_unlock_irqrestore(qp->qp_lock_ptr, *flags); |
4059 | - rval = ha->isp_ops->abort_command(sp); |
4060 | |
4061 | + rval = ha->isp_ops->abort_command(sp); |
4062 | + /* Wait for command completion. */ |
4063 | + ret_cmd = false; |
4064 | + ratov_j = ha->r_a_tov/10 * 4 * 1000; |
4065 | + ratov_j = msecs_to_jiffies(ratov_j); |
4066 | switch (rval) { |
4067 | case QLA_SUCCESS: |
4068 | - sp->done(sp, res); |
4069 | + if (wait_for_completion_timeout(&comp, ratov_j)) { |
4070 | + ql_dbg(ql_dbg_taskm, vha, 0xffff, |
4071 | + "%s: Abort wait timer (4 * R_A_TOV[%d]) expired\n", |
4072 | + __func__, ha->r_a_tov/10); |
4073 | + ret_cmd = true; |
4074 | + } |
4075 | + /* else FW return SP to driver */ |
4076 | break; |
4077 | - case QLA_FUNCTION_PARAMETER_ERROR: |
4078 | - wait_for_completion(&comp); |
4079 | + default: |
4080 | + ret_cmd = true; |
4081 | break; |
4082 | } |
4083 | |
4084 | spin_lock_irqsave(qp->qp_lock_ptr, *flags); |
4085 | - sp->comp = NULL; |
4086 | + if (ret_cmd && (!sp->completed || !sp->aborted)) |
4087 | + sp->done(sp, res); |
4088 | + } else { |
4089 | + sp->done(sp, res); |
4090 | } |
4091 | - |
4092 | - atomic_dec(&sp->ref_count); |
4093 | } |
4094 | |
4095 | static void |
4096 | @@ -1755,7 +1765,6 @@ __qla2x00_abort_all_cmds(struct qla_qpair *qp, int res) |
4097 | for (cnt = 1; cnt < req->num_outstanding_cmds; cnt++) { |
4098 | sp = req->outstanding_cmds[cnt]; |
4099 | if (sp) { |
4100 | - req->outstanding_cmds[cnt] = NULL; |
4101 | switch (sp->cmd_type) { |
4102 | case TYPE_SRB: |
4103 | qla2x00_abort_srb(qp, sp, res, &flags); |
4104 | @@ -1777,6 +1786,7 @@ __qla2x00_abort_all_cmds(struct qla_qpair *qp, int res) |
4105 | default: |
4106 | break; |
4107 | } |
4108 | + req->outstanding_cmds[cnt] = NULL; |
4109 | } |
4110 | } |
4111 | spin_unlock_irqrestore(qp->qp_lock_ptr, flags); |
4112 | @@ -4666,7 +4676,8 @@ qla2x00_mem_free(struct qla_hw_data *ha) |
4113 | ha->sfp_data = NULL; |
4114 | |
4115 | if (ha->flt) |
4116 | - dma_free_coherent(&ha->pdev->dev, SFP_DEV_SIZE, |
4117 | + dma_free_coherent(&ha->pdev->dev, |
4118 | + sizeof(struct qla_flt_header) + FLT_REGIONS_SIZE, |
4119 | ha->flt, ha->flt_dma); |
4120 | ha->flt = NULL; |
4121 | ha->flt_dma = 0; |
4122 | diff --git a/drivers/staging/exfat/exfat.h b/drivers/staging/exfat/exfat.h |
4123 | index 3abab33e932c..4973c9edc26e 100644 |
4124 | --- a/drivers/staging/exfat/exfat.h |
4125 | +++ b/drivers/staging/exfat/exfat.h |
4126 | @@ -943,8 +943,8 @@ s32 create_dir(struct inode *inode, struct chain_t *p_dir, |
4127 | s32 create_file(struct inode *inode, struct chain_t *p_dir, |
4128 | struct uni_name_t *p_uniname, u8 mode, struct file_id_t *fid); |
4129 | void remove_file(struct inode *inode, struct chain_t *p_dir, s32 entry); |
4130 | -s32 rename_file(struct inode *inode, struct chain_t *p_dir, s32 old_entry, |
4131 | - struct uni_name_t *p_uniname, struct file_id_t *fid); |
4132 | +s32 exfat_rename_file(struct inode *inode, struct chain_t *p_dir, s32 old_entry, |
4133 | + struct uni_name_t *p_uniname, struct file_id_t *fid); |
4134 | s32 move_file(struct inode *inode, struct chain_t *p_olddir, s32 oldentry, |
4135 | struct chain_t *p_newdir, struct uni_name_t *p_uniname, |
4136 | struct file_id_t *fid); |
4137 | diff --git a/drivers/staging/exfat/exfat_core.c b/drivers/staging/exfat/exfat_core.c |
4138 | index 79174e5c4145..f3774a1912d1 100644 |
4139 | --- a/drivers/staging/exfat/exfat_core.c |
4140 | +++ b/drivers/staging/exfat/exfat_core.c |
4141 | @@ -3381,8 +3381,8 @@ void remove_file(struct inode *inode, struct chain_t *p_dir, s32 entry) |
4142 | fs_func->delete_dir_entry(sb, p_dir, entry, 0, num_entries); |
4143 | } |
4144 | |
4145 | -s32 rename_file(struct inode *inode, struct chain_t *p_dir, s32 oldentry, |
4146 | - struct uni_name_t *p_uniname, struct file_id_t *fid) |
4147 | +s32 exfat_rename_file(struct inode *inode, struct chain_t *p_dir, s32 oldentry, |
4148 | + struct uni_name_t *p_uniname, struct file_id_t *fid) |
4149 | { |
4150 | s32 ret, newentry = -1, num_old_entries, num_new_entries; |
4151 | sector_t sector_old, sector_new; |
4152 | diff --git a/drivers/staging/exfat/exfat_super.c b/drivers/staging/exfat/exfat_super.c |
4153 | index 3b2b0ceb7297..58c7d66060f7 100644 |
4154 | --- a/drivers/staging/exfat/exfat_super.c |
4155 | +++ b/drivers/staging/exfat/exfat_super.c |
4156 | @@ -1308,8 +1308,8 @@ static int ffsMoveFile(struct inode *old_parent_inode, struct file_id_t *fid, |
4157 | fs_set_vol_flags(sb, VOL_DIRTY); |
4158 | |
4159 | if (olddir.dir == newdir.dir) |
4160 | - ret = rename_file(new_parent_inode, &olddir, dentry, &uni_name, |
4161 | - fid); |
4162 | + ret = exfat_rename_file(new_parent_inode, &olddir, dentry, |
4163 | + &uni_name, fid); |
4164 | else |
4165 | ret = move_file(new_parent_inode, &olddir, dentry, &newdir, |
4166 | &uni_name, fid); |
4167 | diff --git a/drivers/staging/isdn/gigaset/usb-gigaset.c b/drivers/staging/isdn/gigaset/usb-gigaset.c |
4168 | index 1b9b43659bdf..a20c0bfa68f3 100644 |
4169 | --- a/drivers/staging/isdn/gigaset/usb-gigaset.c |
4170 | +++ b/drivers/staging/isdn/gigaset/usb-gigaset.c |
4171 | @@ -571,8 +571,7 @@ static int gigaset_initcshw(struct cardstate *cs) |
4172 | { |
4173 | struct usb_cardstate *ucs; |
4174 | |
4175 | - cs->hw.usb = ucs = |
4176 | - kmalloc(sizeof(struct usb_cardstate), GFP_KERNEL); |
4177 | + cs->hw.usb = ucs = kzalloc(sizeof(struct usb_cardstate), GFP_KERNEL); |
4178 | if (!ucs) { |
4179 | pr_err("out of memory\n"); |
4180 | return -ENOMEM; |
4181 | @@ -584,9 +583,6 @@ static int gigaset_initcshw(struct cardstate *cs) |
4182 | ucs->bchars[3] = 0; |
4183 | ucs->bchars[4] = 0x11; |
4184 | ucs->bchars[5] = 0x13; |
4185 | - ucs->bulk_out_buffer = NULL; |
4186 | - ucs->bulk_out_urb = NULL; |
4187 | - ucs->read_urb = NULL; |
4188 | tasklet_init(&cs->write_tasklet, |
4189 | gigaset_modem_fill, (unsigned long) cs); |
4190 | |
4191 | @@ -685,6 +681,11 @@ static int gigaset_probe(struct usb_interface *interface, |
4192 | return -ENODEV; |
4193 | } |
4194 | |
4195 | + if (hostif->desc.bNumEndpoints < 2) { |
4196 | + dev_err(&interface->dev, "missing endpoints\n"); |
4197 | + return -ENODEV; |
4198 | + } |
4199 | + |
4200 | dev_info(&udev->dev, "%s: Device matched ... !\n", __func__); |
4201 | |
4202 | /* allocate memory for our device state and initialize it */ |
4203 | @@ -704,6 +705,12 @@ static int gigaset_probe(struct usb_interface *interface, |
4204 | |
4205 | endpoint = &hostif->endpoint[0].desc; |
4206 | |
4207 | + if (!usb_endpoint_is_bulk_out(endpoint)) { |
4208 | + dev_err(&interface->dev, "missing bulk-out endpoint\n"); |
4209 | + retval = -ENODEV; |
4210 | + goto error; |
4211 | + } |
4212 | + |
4213 | buffer_size = le16_to_cpu(endpoint->wMaxPacketSize); |
4214 | ucs->bulk_out_size = buffer_size; |
4215 | ucs->bulk_out_epnum = usb_endpoint_num(endpoint); |
4216 | @@ -723,6 +730,12 @@ static int gigaset_probe(struct usb_interface *interface, |
4217 | |
4218 | endpoint = &hostif->endpoint[1].desc; |
4219 | |
4220 | + if (!usb_endpoint_is_int_in(endpoint)) { |
4221 | + dev_err(&interface->dev, "missing int-in endpoint\n"); |
4222 | + retval = -ENODEV; |
4223 | + goto error; |
4224 | + } |
4225 | + |
4226 | ucs->busy = 0; |
4227 | |
4228 | ucs->read_urb = usb_alloc_urb(0, GFP_KERNEL); |
4229 | diff --git a/drivers/staging/media/hantro/hantro_g1_h264_dec.c b/drivers/staging/media/hantro/hantro_g1_h264_dec.c |
4230 | index 7ab534936843..636bf972adcf 100644 |
4231 | --- a/drivers/staging/media/hantro/hantro_g1_h264_dec.c |
4232 | +++ b/drivers/staging/media/hantro/hantro_g1_h264_dec.c |
4233 | @@ -34,9 +34,11 @@ static void set_params(struct hantro_ctx *ctx) |
4234 | reg = G1_REG_DEC_CTRL0_DEC_AXI_WR_ID(0x0); |
4235 | if (sps->flags & V4L2_H264_SPS_FLAG_MB_ADAPTIVE_FRAME_FIELD) |
4236 | reg |= G1_REG_DEC_CTRL0_SEQ_MBAFF_E; |
4237 | - reg |= G1_REG_DEC_CTRL0_PICORD_COUNT_E; |
4238 | - if (dec_param->nal_ref_idc) |
4239 | - reg |= G1_REG_DEC_CTRL0_WRITE_MVS_E; |
4240 | + if (sps->profile_idc > 66) { |
4241 | + reg |= G1_REG_DEC_CTRL0_PICORD_COUNT_E; |
4242 | + if (dec_param->nal_ref_idc) |
4243 | + reg |= G1_REG_DEC_CTRL0_WRITE_MVS_E; |
4244 | + } |
4245 | |
4246 | if (!(sps->flags & V4L2_H264_SPS_FLAG_FRAME_MBS_ONLY) && |
4247 | (sps->flags & V4L2_H264_SPS_FLAG_MB_ADAPTIVE_FRAME_FIELD || |
4248 | @@ -246,7 +248,7 @@ static void set_buffers(struct hantro_ctx *ctx) |
4249 | vdpu_write_relaxed(vpu, dst_dma, G1_REG_ADDR_DST); |
4250 | |
4251 | /* Higher profiles require DMV buffer appended to reference frames. */ |
4252 | - if (ctrls->sps->profile_idc > 66) { |
4253 | + if (ctrls->sps->profile_idc > 66 && ctrls->decode->nal_ref_idc) { |
4254 | size_t pic_size = ctx->h264_dec.pic_size; |
4255 | size_t mv_offset = round_up(pic_size, 8); |
4256 | |
4257 | diff --git a/drivers/staging/media/hantro/hantro_v4l2.c b/drivers/staging/media/hantro/hantro_v4l2.c |
4258 | index 3dae52abb96c..fcf95c1d39ca 100644 |
4259 | --- a/drivers/staging/media/hantro/hantro_v4l2.c |
4260 | +++ b/drivers/staging/media/hantro/hantro_v4l2.c |
4261 | @@ -367,19 +367,26 @@ vidioc_s_fmt_out_mplane(struct file *file, void *priv, struct v4l2_format *f) |
4262 | { |
4263 | struct v4l2_pix_format_mplane *pix_mp = &f->fmt.pix_mp; |
4264 | struct hantro_ctx *ctx = fh_to_ctx(priv); |
4265 | + struct vb2_queue *vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, f->type); |
4266 | const struct hantro_fmt *formats; |
4267 | unsigned int num_fmts; |
4268 | - struct vb2_queue *vq; |
4269 | int ret; |
4270 | |
4271 | - /* Change not allowed if queue is busy. */ |
4272 | - vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, f->type); |
4273 | - if (vb2_is_busy(vq)) |
4274 | - return -EBUSY; |
4275 | + ret = vidioc_try_fmt_out_mplane(file, priv, f); |
4276 | + if (ret) |
4277 | + return ret; |
4278 | |
4279 | if (!hantro_is_encoder_ctx(ctx)) { |
4280 | struct vb2_queue *peer_vq; |
4281 | |
4282 | + /* |
4283 | + * In order to support dynamic resolution change, |
4284 | + * the decoder admits a resolution change, as long |
4285 | + * as the pixelformat remains. Can't be done if streaming. |
4286 | + */ |
4287 | + if (vb2_is_streaming(vq) || (vb2_is_busy(vq) && |
4288 | + pix_mp->pixelformat != ctx->src_fmt.pixelformat)) |
4289 | + return -EBUSY; |
4290 | /* |
4291 | * Since format change on the OUTPUT queue will reset |
4292 | * the CAPTURE queue, we can't allow doing so |
4293 | @@ -389,12 +396,15 @@ vidioc_s_fmt_out_mplane(struct file *file, void *priv, struct v4l2_format *f) |
4294 | V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE); |
4295 | if (vb2_is_busy(peer_vq)) |
4296 | return -EBUSY; |
4297 | + } else { |
4298 | + /* |
4299 | + * The encoder doesn't admit a format change if |
4300 | + * there are OUTPUT buffers allocated. |
4301 | + */ |
4302 | + if (vb2_is_busy(vq)) |
4303 | + return -EBUSY; |
4304 | } |
4305 | |
4306 | - ret = vidioc_try_fmt_out_mplane(file, priv, f); |
4307 | - if (ret) |
4308 | - return ret; |
4309 | - |
4310 | formats = hantro_get_formats(ctx, &num_fmts); |
4311 | ctx->vpu_src_fmt = hantro_find_format(formats, num_fmts, |
4312 | pix_mp->pixelformat); |
4313 | diff --git a/drivers/staging/rtl8188eu/os_dep/usb_intf.c b/drivers/staging/rtl8188eu/os_dep/usb_intf.c |
4314 | index 4fac9dca798e..a7cac0719b8b 100644 |
4315 | --- a/drivers/staging/rtl8188eu/os_dep/usb_intf.c |
4316 | +++ b/drivers/staging/rtl8188eu/os_dep/usb_intf.c |
4317 | @@ -70,7 +70,7 @@ static struct dvobj_priv *usb_dvobj_init(struct usb_interface *usb_intf) |
4318 | phost_conf = pusbd->actconfig; |
4319 | pconf_desc = &phost_conf->desc; |
4320 | |
4321 | - phost_iface = &usb_intf->altsetting[0]; |
4322 | + phost_iface = usb_intf->cur_altsetting; |
4323 | piface_desc = &phost_iface->desc; |
4324 | |
4325 | pdvobjpriv->NumInterfaces = pconf_desc->bNumInterfaces; |
4326 | diff --git a/drivers/staging/rtl8712/usb_intf.c b/drivers/staging/rtl8712/usb_intf.c |
4327 | index ba1288297ee4..a87562f632a7 100644 |
4328 | --- a/drivers/staging/rtl8712/usb_intf.c |
4329 | +++ b/drivers/staging/rtl8712/usb_intf.c |
4330 | @@ -247,7 +247,7 @@ static uint r8712_usb_dvobj_init(struct _adapter *padapter) |
4331 | |
4332 | pdvobjpriv->padapter = padapter; |
4333 | padapter->eeprom_address_size = 6; |
4334 | - phost_iface = &pintf->altsetting[0]; |
4335 | + phost_iface = pintf->cur_altsetting; |
4336 | piface_desc = &phost_iface->desc; |
4337 | pdvobjpriv->nr_endpoint = piface_desc->bNumEndpoints; |
4338 | if (pusbd->speed == USB_SPEED_HIGH) { |
4339 | diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c |
4340 | index b1595b13dea8..af6bf0736b52 100644 |
4341 | --- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c |
4342 | +++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c |
4343 | @@ -3299,7 +3299,7 @@ static int __init vchiq_driver_init(void) |
4344 | return 0; |
4345 | |
4346 | region_unregister: |
4347 | - platform_driver_unregister(&vchiq_driver); |
4348 | + unregister_chrdev_region(vchiq_devid, 1); |
4349 | |
4350 | class_destroy: |
4351 | class_destroy(vchiq_class); |
4352 | diff --git a/drivers/usb/atm/ueagle-atm.c b/drivers/usb/atm/ueagle-atm.c |
4353 | index 8b0ea8c70d73..635cf0466b59 100644 |
4354 | --- a/drivers/usb/atm/ueagle-atm.c |
4355 | +++ b/drivers/usb/atm/ueagle-atm.c |
4356 | @@ -2124,10 +2124,11 @@ resubmit: |
4357 | /* |
4358 | * Start the modem : init the data and start kernel thread |
4359 | */ |
4360 | -static int uea_boot(struct uea_softc *sc) |
4361 | +static int uea_boot(struct uea_softc *sc, struct usb_interface *intf) |
4362 | { |
4363 | - int ret, size; |
4364 | struct intr_pkt *intr; |
4365 | + int ret = -ENOMEM; |
4366 | + int size; |
4367 | |
4368 | uea_enters(INS_TO_USBDEV(sc)); |
4369 | |
4370 | @@ -2152,6 +2153,11 @@ static int uea_boot(struct uea_softc *sc) |
4371 | if (UEA_CHIP_VERSION(sc) == ADI930) |
4372 | load_XILINX_firmware(sc); |
4373 | |
4374 | + if (intf->cur_altsetting->desc.bNumEndpoints < 1) { |
4375 | + ret = -ENODEV; |
4376 | + goto err0; |
4377 | + } |
4378 | + |
4379 | intr = kmalloc(size, GFP_KERNEL); |
4380 | if (!intr) |
4381 | goto err0; |
4382 | @@ -2163,8 +2169,7 @@ static int uea_boot(struct uea_softc *sc) |
4383 | usb_fill_int_urb(sc->urb_int, sc->usb_dev, |
4384 | usb_rcvintpipe(sc->usb_dev, UEA_INTR_PIPE), |
4385 | intr, size, uea_intr, sc, |
4386 | - sc->usb_dev->actconfig->interface[0]->altsetting[0]. |
4387 | - endpoint[0].desc.bInterval); |
4388 | + intf->cur_altsetting->endpoint[0].desc.bInterval); |
4389 | |
4390 | ret = usb_submit_urb(sc->urb_int, GFP_KERNEL); |
4391 | if (ret < 0) { |
4392 | @@ -2179,6 +2184,7 @@ static int uea_boot(struct uea_softc *sc) |
4393 | sc->kthread = kthread_create(uea_kthread, sc, "ueagle-atm"); |
4394 | if (IS_ERR(sc->kthread)) { |
4395 | uea_err(INS_TO_USBDEV(sc), "failed to create thread\n"); |
4396 | + ret = PTR_ERR(sc->kthread); |
4397 | goto err2; |
4398 | } |
4399 | |
4400 | @@ -2193,7 +2199,7 @@ err1: |
4401 | kfree(intr); |
4402 | err0: |
4403 | uea_leaves(INS_TO_USBDEV(sc)); |
4404 | - return -ENOMEM; |
4405 | + return ret; |
4406 | } |
4407 | |
4408 | /* |
4409 | @@ -2548,7 +2554,7 @@ static int uea_bind(struct usbatm_data *usbatm, struct usb_interface *intf, |
4410 | } |
4411 | } |
4412 | |
4413 | - ret = uea_boot(sc); |
4414 | + ret = uea_boot(sc, intf); |
4415 | if (ret < 0) |
4416 | goto error; |
4417 | |
4418 | diff --git a/drivers/usb/common/usb-conn-gpio.c b/drivers/usb/common/usb-conn-gpio.c |
4419 | index 87338f9eb5be..ed204cbb63ea 100644 |
4420 | --- a/drivers/usb/common/usb-conn-gpio.c |
4421 | +++ b/drivers/usb/common/usb-conn-gpio.c |
4422 | @@ -156,7 +156,8 @@ static int usb_conn_probe(struct platform_device *pdev) |
4423 | |
4424 | info->vbus = devm_regulator_get(dev, "vbus"); |
4425 | if (IS_ERR(info->vbus)) { |
4426 | - dev_err(dev, "failed to get vbus\n"); |
4427 | + if (PTR_ERR(info->vbus) != -EPROBE_DEFER) |
4428 | + dev_err(dev, "failed to get vbus\n"); |
4429 | return PTR_ERR(info->vbus); |
4430 | } |
4431 | |
4432 | diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c |
4433 | index 236313f41f4a..dfe9ac8d2375 100644 |
4434 | --- a/drivers/usb/core/hub.c |
4435 | +++ b/drivers/usb/core/hub.c |
4436 | @@ -5814,7 +5814,7 @@ re_enumerate_no_bos: |
4437 | |
4438 | /** |
4439 | * usb_reset_device - warn interface drivers and perform a USB port reset |
4440 | - * @udev: device to reset (not in SUSPENDED or NOTATTACHED state) |
4441 | + * @udev: device to reset (not in NOTATTACHED state) |
4442 | * |
4443 | * Warns all drivers bound to registered interfaces (using their pre_reset |
4444 | * method), performs the port reset, and then lets the drivers know that |
4445 | @@ -5842,8 +5842,7 @@ int usb_reset_device(struct usb_device *udev) |
4446 | struct usb_host_config *config = udev->actconfig; |
4447 | struct usb_hub *hub = usb_hub_to_struct_hub(udev->parent); |
4448 | |
4449 | - if (udev->state == USB_STATE_NOTATTACHED || |
4450 | - udev->state == USB_STATE_SUSPENDED) { |
4451 | + if (udev->state == USB_STATE_NOTATTACHED) { |
4452 | dev_dbg(&udev->dev, "device reset not allowed in state %d\n", |
4453 | udev->state); |
4454 | return -EINVAL; |
4455 | diff --git a/drivers/usb/core/urb.c b/drivers/usb/core/urb.c |
4456 | index 0eab79f82ce4..da923ec17612 100644 |
4457 | --- a/drivers/usb/core/urb.c |
4458 | +++ b/drivers/usb/core/urb.c |
4459 | @@ -45,6 +45,7 @@ void usb_init_urb(struct urb *urb) |
4460 | if (urb) { |
4461 | memset(urb, 0, sizeof(*urb)); |
4462 | kref_init(&urb->kref); |
4463 | + INIT_LIST_HEAD(&urb->urb_list); |
4464 | INIT_LIST_HEAD(&urb->anchor_list); |
4465 | } |
4466 | } |
4467 | diff --git a/drivers/usb/dwc3/dwc3-pci.c b/drivers/usb/dwc3/dwc3-pci.c |
4468 | index 023f0357efd7..294276f7deb9 100644 |
4469 | --- a/drivers/usb/dwc3/dwc3-pci.c |
4470 | +++ b/drivers/usb/dwc3/dwc3-pci.c |
4471 | @@ -29,7 +29,8 @@ |
4472 | #define PCI_DEVICE_ID_INTEL_BXT_M 0x1aaa |
4473 | #define PCI_DEVICE_ID_INTEL_APL 0x5aaa |
4474 | #define PCI_DEVICE_ID_INTEL_KBP 0xa2b0 |
4475 | -#define PCI_DEVICE_ID_INTEL_CMLH 0x02ee |
4476 | +#define PCI_DEVICE_ID_INTEL_CMLLP 0x02ee |
4477 | +#define PCI_DEVICE_ID_INTEL_CMLH 0x06ee |
4478 | #define PCI_DEVICE_ID_INTEL_GLK 0x31aa |
4479 | #define PCI_DEVICE_ID_INTEL_CNPLP 0x9dee |
4480 | #define PCI_DEVICE_ID_INTEL_CNPH 0xa36e |
4481 | @@ -308,6 +309,9 @@ static const struct pci_device_id dwc3_pci_id_table[] = { |
4482 | { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_MRFLD), |
4483 | (kernel_ulong_t) &dwc3_pci_mrfld_properties, }, |
4484 | |
4485 | + { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_CMLLP), |
4486 | + (kernel_ulong_t) &dwc3_pci_intel_properties, }, |
4487 | + |
4488 | { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_CMLH), |
4489 | (kernel_ulong_t) &dwc3_pci_intel_properties, }, |
4490 | |
4491 | diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c |
4492 | index 3996b9c4ff8d..fd1b100d2927 100644 |
4493 | --- a/drivers/usb/dwc3/ep0.c |
4494 | +++ b/drivers/usb/dwc3/ep0.c |
4495 | @@ -1117,6 +1117,9 @@ static void dwc3_ep0_xfernotready(struct dwc3 *dwc, |
4496 | void dwc3_ep0_interrupt(struct dwc3 *dwc, |
4497 | const struct dwc3_event_depevt *event) |
4498 | { |
4499 | + struct dwc3_ep *dep = dwc->eps[event->endpoint_number]; |
4500 | + u8 cmd; |
4501 | + |
4502 | switch (event->endpoint_event) { |
4503 | case DWC3_DEPEVT_XFERCOMPLETE: |
4504 | dwc3_ep0_xfer_complete(dwc, event); |
4505 | @@ -1129,7 +1132,12 @@ void dwc3_ep0_interrupt(struct dwc3 *dwc, |
4506 | case DWC3_DEPEVT_XFERINPROGRESS: |
4507 | case DWC3_DEPEVT_RXTXFIFOEVT: |
4508 | case DWC3_DEPEVT_STREAMEVT: |
4509 | + break; |
4510 | case DWC3_DEPEVT_EPCMDCMPLT: |
4511 | + cmd = DEPEVT_PARAMETER_CMD(event->parameters); |
4512 | + |
4513 | + if (cmd == DWC3_DEPCMD_ENDTRANSFER) |
4514 | + dep->flags &= ~DWC3_EP_TRANSFER_STARTED; |
4515 | break; |
4516 | } |
4517 | } |
4518 | diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c |
4519 | index a9aba716bf80..0c960a97ea02 100644 |
4520 | --- a/drivers/usb/dwc3/gadget.c |
4521 | +++ b/drivers/usb/dwc3/gadget.c |
4522 | @@ -2491,7 +2491,7 @@ static int dwc3_gadget_ep_cleanup_completed_request(struct dwc3_ep *dep, |
4523 | |
4524 | req->request.actual = req->request.length - req->remaining; |
4525 | |
4526 | - if (!dwc3_gadget_ep_request_completed(req) && |
4527 | + if (!dwc3_gadget_ep_request_completed(req) || |
4528 | req->num_pending_sgs) { |
4529 | __dwc3_gadget_kick_transfer(dep); |
4530 | goto out; |
4531 | @@ -2719,6 +2719,9 @@ static void dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force, |
4532 | WARN_ON_ONCE(ret); |
4533 | dep->resource_index = 0; |
4534 | |
4535 | + if (!interrupt) |
4536 | + dep->flags &= ~DWC3_EP_TRANSFER_STARTED; |
4537 | + |
4538 | if (dwc3_is_usb31(dwc) || dwc->revision < DWC3_REVISION_310A) |
4539 | udelay(100); |
4540 | } |
4541 | diff --git a/drivers/usb/gadget/configfs.c b/drivers/usb/gadget/configfs.c |
4542 | index 33852c2b29d1..ab9ac48a751a 100644 |
4543 | --- a/drivers/usb/gadget/configfs.c |
4544 | +++ b/drivers/usb/gadget/configfs.c |
4545 | @@ -1544,6 +1544,7 @@ static struct config_group *gadgets_make( |
4546 | gi->composite.resume = NULL; |
4547 | gi->composite.max_speed = USB_SPEED_SUPER; |
4548 | |
4549 | + spin_lock_init(&gi->spinlock); |
4550 | mutex_init(&gi->lock); |
4551 | INIT_LIST_HEAD(&gi->string_list); |
4552 | INIT_LIST_HEAD(&gi->available_func); |
4553 | diff --git a/drivers/usb/gadget/udc/dummy_hcd.c b/drivers/usb/gadget/udc/dummy_hcd.c |
4554 | index 3d499d93c083..a8f1e5707c14 100644 |
4555 | --- a/drivers/usb/gadget/udc/dummy_hcd.c |
4556 | +++ b/drivers/usb/gadget/udc/dummy_hcd.c |
4557 | @@ -2725,7 +2725,7 @@ static struct platform_driver dummy_hcd_driver = { |
4558 | }; |
4559 | |
4560 | /*-------------------------------------------------------------------------*/ |
4561 | -#define MAX_NUM_UDC 2 |
4562 | +#define MAX_NUM_UDC 32 |
4563 | static struct platform_device *the_udc_pdev[MAX_NUM_UDC]; |
4564 | static struct platform_device *the_hcd_pdev[MAX_NUM_UDC]; |
4565 | |
4566 | diff --git a/drivers/usb/gadget/udc/pch_udc.c b/drivers/usb/gadget/udc/pch_udc.c |
4567 | index 265dab2bbfac..3344fb8c4181 100644 |
4568 | --- a/drivers/usb/gadget/udc/pch_udc.c |
4569 | +++ b/drivers/usb/gadget/udc/pch_udc.c |
4570 | @@ -1519,7 +1519,6 @@ static void pch_udc_free_dma_chain(struct pch_udc_dev *dev, |
4571 | td = phys_to_virt(addr); |
4572 | addr2 = (dma_addr_t)td->next; |
4573 | dma_pool_free(dev->data_requests, td, addr); |
4574 | - td->next = 0x00; |
4575 | addr = addr2; |
4576 | } |
4577 | req->chain_len = 1; |
4578 | diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c |
4579 | index b7d23c438756..7a3a29e5e9d2 100644 |
4580 | --- a/drivers/usb/host/xhci-hub.c |
4581 | +++ b/drivers/usb/host/xhci-hub.c |
4582 | @@ -806,7 +806,7 @@ static void xhci_del_comp_mod_timer(struct xhci_hcd *xhci, u32 status, |
4583 | |
4584 | static int xhci_handle_usb2_port_link_resume(struct xhci_port *port, |
4585 | u32 *status, u32 portsc, |
4586 | - unsigned long flags) |
4587 | + unsigned long *flags) |
4588 | { |
4589 | struct xhci_bus_state *bus_state; |
4590 | struct xhci_hcd *xhci; |
4591 | @@ -860,11 +860,11 @@ static int xhci_handle_usb2_port_link_resume(struct xhci_port *port, |
4592 | xhci_test_and_clear_bit(xhci, port, PORT_PLC); |
4593 | xhci_set_link_state(xhci, port, XDEV_U0); |
4594 | |
4595 | - spin_unlock_irqrestore(&xhci->lock, flags); |
4596 | + spin_unlock_irqrestore(&xhci->lock, *flags); |
4597 | time_left = wait_for_completion_timeout( |
4598 | &bus_state->rexit_done[wIndex], |
4599 | msecs_to_jiffies(XHCI_MAX_REXIT_TIMEOUT_MS)); |
4600 | - spin_lock_irqsave(&xhci->lock, flags); |
4601 | + spin_lock_irqsave(&xhci->lock, *flags); |
4602 | |
4603 | if (time_left) { |
4604 | slot_id = xhci_find_slot_id_by_port(hcd, xhci, |
4605 | @@ -920,11 +920,13 @@ static void xhci_get_usb3_port_status(struct xhci_port *port, u32 *status, |
4606 | { |
4607 | struct xhci_bus_state *bus_state; |
4608 | struct xhci_hcd *xhci; |
4609 | + struct usb_hcd *hcd; |
4610 | u32 link_state; |
4611 | u32 portnum; |
4612 | |
4613 | bus_state = &port->rhub->bus_state; |
4614 | xhci = hcd_to_xhci(port->rhub->hcd); |
4615 | + hcd = port->rhub->hcd; |
4616 | link_state = portsc & PORT_PLS_MASK; |
4617 | portnum = port->hcd_portnum; |
4618 | |
4619 | @@ -952,12 +954,20 @@ static void xhci_get_usb3_port_status(struct xhci_port *port, u32 *status, |
4620 | bus_state->suspended_ports &= ~(1 << portnum); |
4621 | } |
4622 | |
4623 | + /* remote wake resume signaling complete */ |
4624 | + if (bus_state->port_remote_wakeup & (1 << portnum) && |
4625 | + link_state != XDEV_RESUME && |
4626 | + link_state != XDEV_RECOVERY) { |
4627 | + bus_state->port_remote_wakeup &= ~(1 << portnum); |
4628 | + usb_hcd_end_port_resume(&hcd->self, portnum); |
4629 | + } |
4630 | + |
4631 | xhci_hub_report_usb3_link_state(xhci, status, portsc); |
4632 | xhci_del_comp_mod_timer(xhci, portsc, portnum); |
4633 | } |
4634 | |
4635 | static void xhci_get_usb2_port_status(struct xhci_port *port, u32 *status, |
4636 | - u32 portsc, unsigned long flags) |
4637 | + u32 portsc, unsigned long *flags) |
4638 | { |
4639 | struct xhci_bus_state *bus_state; |
4640 | u32 link_state; |
4641 | @@ -1007,7 +1017,7 @@ static void xhci_get_usb2_port_status(struct xhci_port *port, u32 *status, |
4642 | static u32 xhci_get_port_status(struct usb_hcd *hcd, |
4643 | struct xhci_bus_state *bus_state, |
4644 | u16 wIndex, u32 raw_port_status, |
4645 | - unsigned long flags) |
4646 | + unsigned long *flags) |
4647 | __releases(&xhci->lock) |
4648 | __acquires(&xhci->lock) |
4649 | { |
4650 | @@ -1130,7 +1140,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, |
4651 | } |
4652 | trace_xhci_get_port_status(wIndex, temp); |
4653 | status = xhci_get_port_status(hcd, bus_state, wIndex, temp, |
4654 | - flags); |
4655 | + &flags); |
4656 | if (status == 0xffffffff) |
4657 | goto error; |
4658 | |
4659 | diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c |
4660 | index e16eda6e2b8b..3b1388fa2f36 100644 |
4661 | --- a/drivers/usb/host/xhci-mem.c |
4662 | +++ b/drivers/usb/host/xhci-mem.c |
4663 | @@ -1909,13 +1909,17 @@ no_bw: |
4664 | xhci->usb3_rhub.num_ports = 0; |
4665 | xhci->num_active_eps = 0; |
4666 | kfree(xhci->usb2_rhub.ports); |
4667 | + kfree(xhci->usb2_rhub.psi); |
4668 | kfree(xhci->usb3_rhub.ports); |
4669 | + kfree(xhci->usb3_rhub.psi); |
4670 | kfree(xhci->hw_ports); |
4671 | kfree(xhci->rh_bw); |
4672 | kfree(xhci->ext_caps); |
4673 | |
4674 | xhci->usb2_rhub.ports = NULL; |
4675 | + xhci->usb2_rhub.psi = NULL; |
4676 | xhci->usb3_rhub.ports = NULL; |
4677 | + xhci->usb3_rhub.psi = NULL; |
4678 | xhci->hw_ports = NULL; |
4679 | xhci->rh_bw = NULL; |
4680 | xhci->ext_caps = NULL; |
4681 | diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c |
4682 | index 1e0236e90687..1904ef56f61c 100644 |
4683 | --- a/drivers/usb/host/xhci-pci.c |
4684 | +++ b/drivers/usb/host/xhci-pci.c |
4685 | @@ -519,6 +519,18 @@ static int xhci_pci_resume(struct usb_hcd *hcd, bool hibernated) |
4686 | } |
4687 | #endif /* CONFIG_PM */ |
4688 | |
4689 | +static void xhci_pci_shutdown(struct usb_hcd *hcd) |
4690 | +{ |
4691 | + struct xhci_hcd *xhci = hcd_to_xhci(hcd); |
4692 | + struct pci_dev *pdev = to_pci_dev(hcd->self.controller); |
4693 | + |
4694 | + xhci_shutdown(hcd); |
4695 | + |
4696 | + /* Yet another workaround for spurious wakeups at shutdown with HSW */ |
4697 | + if (xhci->quirks & XHCI_SPURIOUS_WAKEUP) |
4698 | + pci_set_power_state(pdev, PCI_D3hot); |
4699 | +} |
4700 | + |
4701 | /*-------------------------------------------------------------------------*/ |
4702 | |
4703 | /* PCI driver selection metadata; PCI hotplugging uses this */ |
4704 | @@ -554,6 +566,7 @@ static int __init xhci_pci_init(void) |
4705 | #ifdef CONFIG_PM |
4706 | xhci_pci_hc_driver.pci_suspend = xhci_pci_suspend; |
4707 | xhci_pci_hc_driver.pci_resume = xhci_pci_resume; |
4708 | + xhci_pci_hc_driver.shutdown = xhci_pci_shutdown; |
4709 | #endif |
4710 | return pci_register_driver(&xhci_pci_driver); |
4711 | } |
4712 | diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c |
4713 | index e7aab31fd9a5..4a2fe56940bd 100644 |
4714 | --- a/drivers/usb/host/xhci-ring.c |
4715 | +++ b/drivers/usb/host/xhci-ring.c |
4716 | @@ -1624,7 +1624,6 @@ static void handle_port_status(struct xhci_hcd *xhci, |
4717 | slot_id = xhci_find_slot_id_by_port(hcd, xhci, hcd_portnum + 1); |
4718 | if (slot_id && xhci->devs[slot_id]) |
4719 | xhci->devs[slot_id]->flags |= VDEV_PORT_ERROR; |
4720 | - bus_state->port_remote_wakeup &= ~(1 << hcd_portnum); |
4721 | } |
4722 | |
4723 | if ((portsc & PORT_PLC) && (portsc & PORT_PLS_MASK) == XDEV_RESUME) { |
4724 | @@ -1644,6 +1643,7 @@ static void handle_port_status(struct xhci_hcd *xhci, |
4725 | */ |
4726 | bus_state->port_remote_wakeup |= 1 << hcd_portnum; |
4727 | xhci_test_and_clear_bit(xhci, port, PORT_PLC); |
4728 | + usb_hcd_start_port_resume(&hcd->self, hcd_portnum); |
4729 | xhci_set_link_state(xhci, port, XDEV_U0); |
4730 | /* Need to wait until the next link state change |
4731 | * indicates the device is actually in U0. |
4732 | @@ -1684,7 +1684,6 @@ static void handle_port_status(struct xhci_hcd *xhci, |
4733 | if (slot_id && xhci->devs[slot_id]) |
4734 | xhci_ring_device(xhci, slot_id); |
4735 | if (bus_state->port_remote_wakeup & (1 << hcd_portnum)) { |
4736 | - bus_state->port_remote_wakeup &= ~(1 << hcd_portnum); |
4737 | xhci_test_and_clear_bit(xhci, port, PORT_PLC); |
4738 | usb_wakeup_notification(hcd->self.root_hub, |
4739 | hcd_portnum + 1); |
4740 | @@ -2378,7 +2377,8 @@ static int handle_tx_event(struct xhci_hcd *xhci, |
4741 | case COMP_SUCCESS: |
4742 | if (EVENT_TRB_LEN(le32_to_cpu(event->transfer_len)) == 0) |
4743 | break; |
4744 | - if (xhci->quirks & XHCI_TRUST_TX_LENGTH) |
4745 | + if (xhci->quirks & XHCI_TRUST_TX_LENGTH || |
4746 | + ep_ring->last_td_was_short) |
4747 | trb_comp_code = COMP_SHORT_PACKET; |
4748 | else |
4749 | xhci_warn_ratelimited(xhci, |
4750 | diff --git a/drivers/usb/host/xhci-tegra.c b/drivers/usb/host/xhci-tegra.c |
4751 | index 2ff7c911fbd0..dc172513a4aa 100644 |
4752 | --- a/drivers/usb/host/xhci-tegra.c |
4753 | +++ b/drivers/usb/host/xhci-tegra.c |
4754 | @@ -755,7 +755,6 @@ static int tegra_xusb_runtime_suspend(struct device *dev) |
4755 | { |
4756 | struct tegra_xusb *tegra = dev_get_drvdata(dev); |
4757 | |
4758 | - tegra_xusb_phy_disable(tegra); |
4759 | regulator_bulk_disable(tegra->soc->num_supplies, tegra->supplies); |
4760 | tegra_xusb_clk_disable(tegra); |
4761 | |
4762 | @@ -779,16 +778,8 @@ static int tegra_xusb_runtime_resume(struct device *dev) |
4763 | goto disable_clk; |
4764 | } |
4765 | |
4766 | - err = tegra_xusb_phy_enable(tegra); |
4767 | - if (err < 0) { |
4768 | - dev_err(dev, "failed to enable PHYs: %d\n", err); |
4769 | - goto disable_regulator; |
4770 | - } |
4771 | - |
4772 | return 0; |
4773 | |
4774 | -disable_regulator: |
4775 | - regulator_bulk_disable(tegra->soc->num_supplies, tegra->supplies); |
4776 | disable_clk: |
4777 | tegra_xusb_clk_disable(tegra); |
4778 | return err; |
4779 | @@ -1181,6 +1172,12 @@ static int tegra_xusb_probe(struct platform_device *pdev) |
4780 | */ |
4781 | platform_set_drvdata(pdev, tegra); |
4782 | |
4783 | + err = tegra_xusb_phy_enable(tegra); |
4784 | + if (err < 0) { |
4785 | + dev_err(&pdev->dev, "failed to enable PHYs: %d\n", err); |
4786 | + goto put_hcd; |
4787 | + } |
4788 | + |
4789 | pm_runtime_enable(&pdev->dev); |
4790 | if (pm_runtime_enabled(&pdev->dev)) |
4791 | err = pm_runtime_get_sync(&pdev->dev); |
4792 | @@ -1189,7 +1186,7 @@ static int tegra_xusb_probe(struct platform_device *pdev) |
4793 | |
4794 | if (err < 0) { |
4795 | dev_err(&pdev->dev, "failed to enable device: %d\n", err); |
4796 | - goto disable_rpm; |
4797 | + goto disable_phy; |
4798 | } |
4799 | |
4800 | tegra_xusb_config(tegra, regs); |
4801 | @@ -1275,9 +1272,11 @@ remove_usb2: |
4802 | put_rpm: |
4803 | if (!pm_runtime_status_suspended(&pdev->dev)) |
4804 | tegra_xusb_runtime_suspend(&pdev->dev); |
4805 | -disable_rpm: |
4806 | - pm_runtime_disable(&pdev->dev); |
4807 | +put_hcd: |
4808 | usb_put_hcd(tegra->hcd); |
4809 | +disable_phy: |
4810 | + tegra_xusb_phy_disable(tegra); |
4811 | + pm_runtime_disable(&pdev->dev); |
4812 | put_powerdomains: |
4813 | if (!of_property_read_bool(pdev->dev.of_node, "power-domains")) { |
4814 | tegra_powergate_power_off(TEGRA_POWERGATE_XUSBC); |
4815 | @@ -1314,6 +1313,8 @@ static int tegra_xusb_remove(struct platform_device *pdev) |
4816 | tegra_xusb_powerdomain_remove(&pdev->dev, tegra); |
4817 | } |
4818 | |
4819 | + tegra_xusb_phy_disable(tegra); |
4820 | + |
4821 | tegra_xusb_padctl_put(tegra->padctl); |
4822 | |
4823 | return 0; |
4824 | diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c |
4825 | index 6c17e3fe181a..9b3b1b16eafb 100644 |
4826 | --- a/drivers/usb/host/xhci.c |
4827 | +++ b/drivers/usb/host/xhci.c |
4828 | @@ -770,7 +770,7 @@ static void xhci_stop(struct usb_hcd *hcd) |
4829 | * |
4830 | * This will only ever be called with the main usb_hcd (the USB3 roothub). |
4831 | */ |
4832 | -static void xhci_shutdown(struct usb_hcd *hcd) |
4833 | +void xhci_shutdown(struct usb_hcd *hcd) |
4834 | { |
4835 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); |
4836 | |
4837 | @@ -789,11 +789,8 @@ static void xhci_shutdown(struct usb_hcd *hcd) |
4838 | xhci_dbg_trace(xhci, trace_xhci_dbg_init, |
4839 | "xhci_shutdown completed - status = %x", |
4840 | readl(&xhci->op_regs->status)); |
4841 | - |
4842 | - /* Yet another workaround for spurious wakeups at shutdown with HSW */ |
4843 | - if (xhci->quirks & XHCI_SPURIOUS_WAKEUP) |
4844 | - pci_set_power_state(to_pci_dev(hcd->self.sysdev), PCI_D3hot); |
4845 | } |
4846 | +EXPORT_SYMBOL_GPL(xhci_shutdown); |
4847 | |
4848 | #ifdef CONFIG_PM |
4849 | static void xhci_save_registers(struct xhci_hcd *xhci) |
4850 | @@ -973,7 +970,7 @@ static bool xhci_pending_portevent(struct xhci_hcd *xhci) |
4851 | int xhci_suspend(struct xhci_hcd *xhci, bool do_wakeup) |
4852 | { |
4853 | int rc = 0; |
4854 | - unsigned int delay = XHCI_MAX_HALT_USEC; |
4855 | + unsigned int delay = XHCI_MAX_HALT_USEC * 2; |
4856 | struct usb_hcd *hcd = xhci_to_hcd(xhci); |
4857 | u32 command; |
4858 | u32 res; |
4859 | diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h |
4860 | index f9f88626a57a..973d665052a2 100644 |
4861 | --- a/drivers/usb/host/xhci.h |
4862 | +++ b/drivers/usb/host/xhci.h |
4863 | @@ -2050,6 +2050,7 @@ int xhci_start(struct xhci_hcd *xhci); |
4864 | int xhci_reset(struct xhci_hcd *xhci); |
4865 | int xhci_run(struct usb_hcd *hcd); |
4866 | int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quirks_t get_quirks); |
4867 | +void xhci_shutdown(struct usb_hcd *hcd); |
4868 | void xhci_init_driver(struct hc_driver *drv, |
4869 | const struct xhci_driver_overrides *over); |
4870 | int xhci_disable_slot(struct xhci_hcd *xhci, u32 slot_id); |
4871 | diff --git a/drivers/usb/misc/adutux.c b/drivers/usb/misc/adutux.c |
4872 | index 6f5edb9fc61e..d8d157c4c271 100644 |
4873 | --- a/drivers/usb/misc/adutux.c |
4874 | +++ b/drivers/usb/misc/adutux.c |
4875 | @@ -669,7 +669,7 @@ static int adu_probe(struct usb_interface *interface, |
4876 | init_waitqueue_head(&dev->read_wait); |
4877 | init_waitqueue_head(&dev->write_wait); |
4878 | |
4879 | - res = usb_find_common_endpoints_reverse(&interface->altsetting[0], |
4880 | + res = usb_find_common_endpoints_reverse(interface->cur_altsetting, |
4881 | NULL, NULL, |
4882 | &dev->interrupt_in_endpoint, |
4883 | &dev->interrupt_out_endpoint); |
4884 | diff --git a/drivers/usb/misc/idmouse.c b/drivers/usb/misc/idmouse.c |
4885 | index 20b0f91a5d9b..bb24527f3c70 100644 |
4886 | --- a/drivers/usb/misc/idmouse.c |
4887 | +++ b/drivers/usb/misc/idmouse.c |
4888 | @@ -337,7 +337,7 @@ static int idmouse_probe(struct usb_interface *interface, |
4889 | int result; |
4890 | |
4891 | /* check if we have gotten the data or the hid interface */ |
4892 | - iface_desc = &interface->altsetting[0]; |
4893 | + iface_desc = interface->cur_altsetting; |
4894 | if (iface_desc->desc.bInterfaceClass != 0x0A) |
4895 | return -ENODEV; |
4896 | |
4897 | diff --git a/drivers/usb/mon/mon_bin.c b/drivers/usb/mon/mon_bin.c |
4898 | index ac2b4fcc265f..f48a23adbc35 100644 |
4899 | --- a/drivers/usb/mon/mon_bin.c |
4900 | +++ b/drivers/usb/mon/mon_bin.c |
4901 | @@ -1039,12 +1039,18 @@ static long mon_bin_ioctl(struct file *file, unsigned int cmd, unsigned long arg |
4902 | |
4903 | mutex_lock(&rp->fetch_lock); |
4904 | spin_lock_irqsave(&rp->b_lock, flags); |
4905 | - mon_free_buff(rp->b_vec, rp->b_size/CHUNK_SIZE); |
4906 | - kfree(rp->b_vec); |
4907 | - rp->b_vec = vec; |
4908 | - rp->b_size = size; |
4909 | - rp->b_read = rp->b_in = rp->b_out = rp->b_cnt = 0; |
4910 | - rp->cnt_lost = 0; |
4911 | + if (rp->mmap_active) { |
4912 | + mon_free_buff(vec, size/CHUNK_SIZE); |
4913 | + kfree(vec); |
4914 | + ret = -EBUSY; |
4915 | + } else { |
4916 | + mon_free_buff(rp->b_vec, rp->b_size/CHUNK_SIZE); |
4917 | + kfree(rp->b_vec); |
4918 | + rp->b_vec = vec; |
4919 | + rp->b_size = size; |
4920 | + rp->b_read = rp->b_in = rp->b_out = rp->b_cnt = 0; |
4921 | + rp->cnt_lost = 0; |
4922 | + } |
4923 | spin_unlock_irqrestore(&rp->b_lock, flags); |
4924 | mutex_unlock(&rp->fetch_lock); |
4925 | } |
4926 | @@ -1216,13 +1222,21 @@ mon_bin_poll(struct file *file, struct poll_table_struct *wait) |
4927 | static void mon_bin_vma_open(struct vm_area_struct *vma) |
4928 | { |
4929 | struct mon_reader_bin *rp = vma->vm_private_data; |
4930 | + unsigned long flags; |
4931 | + |
4932 | + spin_lock_irqsave(&rp->b_lock, flags); |
4933 | rp->mmap_active++; |
4934 | + spin_unlock_irqrestore(&rp->b_lock, flags); |
4935 | } |
4936 | |
4937 | static void mon_bin_vma_close(struct vm_area_struct *vma) |
4938 | { |
4939 | + unsigned long flags; |
4940 | + |
4941 | struct mon_reader_bin *rp = vma->vm_private_data; |
4942 | + spin_lock_irqsave(&rp->b_lock, flags); |
4943 | rp->mmap_active--; |
4944 | + spin_unlock_irqrestore(&rp->b_lock, flags); |
4945 | } |
4946 | |
4947 | /* |
4948 | @@ -1234,16 +1248,12 @@ static vm_fault_t mon_bin_vma_fault(struct vm_fault *vmf) |
4949 | unsigned long offset, chunk_idx; |
4950 | struct page *pageptr; |
4951 | |
4952 | - mutex_lock(&rp->fetch_lock); |
4953 | offset = vmf->pgoff << PAGE_SHIFT; |
4954 | - if (offset >= rp->b_size) { |
4955 | - mutex_unlock(&rp->fetch_lock); |
4956 | + if (offset >= rp->b_size) |
4957 | return VM_FAULT_SIGBUS; |
4958 | - } |
4959 | chunk_idx = offset / CHUNK_SIZE; |
4960 | pageptr = rp->b_vec[chunk_idx].pg; |
4961 | get_page(pageptr); |
4962 | - mutex_unlock(&rp->fetch_lock); |
4963 | vmf->page = pageptr; |
4964 | return 0; |
4965 | } |
4966 | diff --git a/drivers/usb/roles/class.c b/drivers/usb/roles/class.c |
4967 | index 94b4e7db2b94..97e3d75b19a3 100644 |
4968 | --- a/drivers/usb/roles/class.c |
4969 | +++ b/drivers/usb/roles/class.c |
4970 | @@ -169,8 +169,8 @@ EXPORT_SYMBOL_GPL(fwnode_usb_role_switch_get); |
4971 | void usb_role_switch_put(struct usb_role_switch *sw) |
4972 | { |
4973 | if (!IS_ERR_OR_NULL(sw)) { |
4974 | - put_device(&sw->dev); |
4975 | module_put(sw->dev.parent->driver->owner); |
4976 | + put_device(&sw->dev); |
4977 | } |
4978 | } |
4979 | EXPORT_SYMBOL_GPL(usb_role_switch_put); |
4980 | diff --git a/drivers/usb/serial/io_edgeport.c b/drivers/usb/serial/io_edgeport.c |
4981 | index 48a439298a68..9690a5f4b9d6 100644 |
4982 | --- a/drivers/usb/serial/io_edgeport.c |
4983 | +++ b/drivers/usb/serial/io_edgeport.c |
4984 | @@ -2901,16 +2901,18 @@ static int edge_startup(struct usb_serial *serial) |
4985 | response = 0; |
4986 | |
4987 | if (edge_serial->is_epic) { |
4988 | + struct usb_host_interface *alt; |
4989 | + |
4990 | + alt = serial->interface->cur_altsetting; |
4991 | + |
4992 | /* EPIC thing, set up our interrupt polling now and our read |
4993 | * urb, so that the device knows it really is connected. */ |
4994 | interrupt_in_found = bulk_in_found = bulk_out_found = false; |
4995 | - for (i = 0; i < serial->interface->altsetting[0] |
4996 | - .desc.bNumEndpoints; ++i) { |
4997 | + for (i = 0; i < alt->desc.bNumEndpoints; ++i) { |
4998 | struct usb_endpoint_descriptor *endpoint; |
4999 | int buffer_size; |
5000 | |
5001 | - endpoint = &serial->interface->altsetting[0]. |
5002 | - endpoint[i].desc; |
5003 | + endpoint = &alt->endpoint[i].desc; |
5004 | buffer_size = usb_endpoint_maxp(endpoint); |
5005 | if (!interrupt_in_found && |
5006 | (usb_endpoint_is_int_in(endpoint))) { |
5007 | diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c |
5008 | index 34538253f12c..475b9c692827 100644 |
5009 | --- a/drivers/usb/storage/uas.c |
5010 | +++ b/drivers/usb/storage/uas.c |
5011 | @@ -825,6 +825,10 @@ static int uas_slave_configure(struct scsi_device *sdev) |
5012 | sdev->wce_default_on = 1; |
5013 | } |
5014 | |
5015 | + /* Some disks cannot handle READ_CAPACITY_16 */ |
5016 | + if (devinfo->flags & US_FL_NO_READ_CAPACITY_16) |
5017 | + sdev->no_read_capacity_16 = 1; |
5018 | + |
5019 | /* |
5020 | * Some disks return the total number of blocks in response |
5021 | * to READ CAPACITY rather than the highest block number. |
5022 | @@ -833,6 +837,12 @@ static int uas_slave_configure(struct scsi_device *sdev) |
5023 | if (devinfo->flags & US_FL_FIX_CAPACITY) |
5024 | sdev->fix_capacity = 1; |
5025 | |
5026 | + /* |
5027 | + * in some cases we have to guess |
5028 | + */ |
5029 | + if (devinfo->flags & US_FL_CAPACITY_HEURISTICS) |
5030 | + sdev->guess_capacity = 1; |
5031 | + |
5032 | /* |
5033 | * Some devices don't like MODE SENSE with page=0x3f, |
5034 | * which is the command used for checking if a device |
5035 | diff --git a/drivers/usb/typec/class.c b/drivers/usb/typec/class.c |
5036 | index 94a3eda62add..a400b65cf17b 100644 |
5037 | --- a/drivers/usb/typec/class.c |
5038 | +++ b/drivers/usb/typec/class.c |
5039 | @@ -1592,14 +1592,16 @@ struct typec_port *typec_register_port(struct device *parent, |
5040 | |
5041 | port->sw = typec_switch_get(&port->dev); |
5042 | if (IS_ERR(port->sw)) { |
5043 | + ret = PTR_ERR(port->sw); |
5044 | put_device(&port->dev); |
5045 | - return ERR_CAST(port->sw); |
5046 | + return ERR_PTR(ret); |
5047 | } |
5048 | |
5049 | port->mux = typec_mux_get(&port->dev, NULL); |
5050 | if (IS_ERR(port->mux)) { |
5051 | + ret = PTR_ERR(port->mux); |
5052 | put_device(&port->dev); |
5053 | - return ERR_CAST(port->mux); |
5054 | + return ERR_PTR(ret); |
5055 | } |
5056 | |
5057 | ret = device_add(&port->dev); |
5058 | diff --git a/drivers/video/hdmi.c b/drivers/video/hdmi.c |
5059 | index b939bc28d886..9c82e2a0a411 100644 |
5060 | --- a/drivers/video/hdmi.c |
5061 | +++ b/drivers/video/hdmi.c |
5062 | @@ -1576,12 +1576,12 @@ static int hdmi_avi_infoframe_unpack(struct hdmi_avi_infoframe *frame, |
5063 | if (ptr[0] & 0x10) |
5064 | frame->active_aspect = ptr[1] & 0xf; |
5065 | if (ptr[0] & 0x8) { |
5066 | - frame->top_bar = (ptr[5] << 8) + ptr[6]; |
5067 | - frame->bottom_bar = (ptr[7] << 8) + ptr[8]; |
5068 | + frame->top_bar = (ptr[6] << 8) | ptr[5]; |
5069 | + frame->bottom_bar = (ptr[8] << 8) | ptr[7]; |
5070 | } |
5071 | if (ptr[0] & 0x4) { |
5072 | - frame->left_bar = (ptr[9] << 8) + ptr[10]; |
5073 | - frame->right_bar = (ptr[11] << 8) + ptr[12]; |
5074 | + frame->left_bar = (ptr[10] << 8) | ptr[9]; |
5075 | + frame->right_bar = (ptr[12] << 8) | ptr[11]; |
5076 | } |
5077 | frame->scan_mode = ptr[0] & 0x3; |
5078 | |
5079 | diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c |
5080 | index e05679c478e2..9f4117766bb1 100644 |
5081 | --- a/drivers/virtio/virtio_balloon.c |
5082 | +++ b/drivers/virtio/virtio_balloon.c |
5083 | @@ -721,6 +721,17 @@ static int virtballoon_migratepage(struct balloon_dev_info *vb_dev_info, |
5084 | |
5085 | get_page(newpage); /* balloon reference */ |
5086 | |
5087 | + /* |
5088 | + * When we migrate a page to a different zone and adjusted the |
5089 | + * managed page count when inflating, we have to fixup the count of |
5090 | + * both involved zones. |
5091 | + */ |
5092 | + if (!virtio_has_feature(vb->vdev, VIRTIO_BALLOON_F_DEFLATE_ON_OOM) && |
5093 | + page_zone(page) != page_zone(newpage)) { |
5094 | + adjust_managed_page_count(page, 1); |
5095 | + adjust_managed_page_count(newpage, -1); |
5096 | + } |
5097 | + |
5098 | /* balloon's page migration 1st step -- inflate "newpage" */ |
5099 | spin_lock_irqsave(&vb_dev_info->pages_lock, flags); |
5100 | balloon_page_insert(vb_dev_info, newpage); |
5101 | diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c |
5102 | index 670700cb1110..0d2da2366869 100644 |
5103 | --- a/fs/btrfs/block-group.c |
5104 | +++ b/fs/btrfs/block-group.c |
5105 | @@ -2662,7 +2662,7 @@ int btrfs_update_block_group(struct btrfs_trans_handle *trans, |
5106 | * is because we need the unpinning stage to actually add the |
5107 | * space back to the block group, otherwise we will leak space. |
5108 | */ |
5109 | - if (!alloc && cache->cached == BTRFS_CACHE_NO) |
5110 | + if (!alloc && !btrfs_block_group_cache_done(cache)) |
5111 | btrfs_cache_block_group(cache, 1); |
5112 | |
5113 | byte_in_group = bytenr - cache->key.objectid; |
5114 | diff --git a/fs/btrfs/delayed-inode.c b/fs/btrfs/delayed-inode.c |
5115 | index 1f7f39b10bd0..57a9ad3e8c29 100644 |
5116 | --- a/fs/btrfs/delayed-inode.c |
5117 | +++ b/fs/btrfs/delayed-inode.c |
5118 | @@ -1949,12 +1949,19 @@ void btrfs_kill_all_delayed_nodes(struct btrfs_root *root) |
5119 | } |
5120 | |
5121 | inode_id = delayed_nodes[n - 1]->inode_id + 1; |
5122 | - |
5123 | - for (i = 0; i < n; i++) |
5124 | - refcount_inc(&delayed_nodes[i]->refs); |
5125 | + for (i = 0; i < n; i++) { |
5126 | + /* |
5127 | + * Don't increase refs in case the node is dead and |
5128 | + * about to be removed from the tree in the loop below |
5129 | + */ |
5130 | + if (!refcount_inc_not_zero(&delayed_nodes[i]->refs)) |
5131 | + delayed_nodes[i] = NULL; |
5132 | + } |
5133 | spin_unlock(&root->inode_lock); |
5134 | |
5135 | for (i = 0; i < n; i++) { |
5136 | + if (!delayed_nodes[i]) |
5137 | + continue; |
5138 | __btrfs_kill_delayed_node(delayed_nodes[i]); |
5139 | btrfs_release_delayed_node(delayed_nodes[i]); |
5140 | } |
5141 | diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c |
5142 | index cceaf05aada2..4905f48587df 100644 |
5143 | --- a/fs/btrfs/extent_io.c |
5144 | +++ b/fs/btrfs/extent_io.c |
5145 | @@ -4121,7 +4121,7 @@ retry: |
5146 | for (i = 0; i < nr_pages; i++) { |
5147 | struct page *page = pvec.pages[i]; |
5148 | |
5149 | - done_index = page->index; |
5150 | + done_index = page->index + 1; |
5151 | /* |
5152 | * At this point we hold neither the i_pages lock nor |
5153 | * the page lock: the page may be truncated or |
5154 | @@ -4156,16 +4156,6 @@ retry: |
5155 | |
5156 | ret = __extent_writepage(page, wbc, epd); |
5157 | if (ret < 0) { |
5158 | - /* |
5159 | - * done_index is set past this page, |
5160 | - * so media errors will not choke |
5161 | - * background writeout for the entire |
5162 | - * file. This has consequences for |
5163 | - * range_cyclic semantics (ie. it may |
5164 | - * not be suitable for data integrity |
5165 | - * writeout). |
5166 | - */ |
5167 | - done_index = page->index + 1; |
5168 | done = 1; |
5169 | break; |
5170 | } |
5171 | diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c |
5172 | index 435a502a3226..c332968f9056 100644 |
5173 | --- a/fs/btrfs/file.c |
5174 | +++ b/fs/btrfs/file.c |
5175 | @@ -1636,6 +1636,7 @@ static noinline ssize_t btrfs_buffered_write(struct kiocb *iocb, |
5176 | break; |
5177 | } |
5178 | |
5179 | + only_release_metadata = false; |
5180 | sector_offset = pos & (fs_info->sectorsize - 1); |
5181 | reserve_bytes = round_up(write_bytes + sector_offset, |
5182 | fs_info->sectorsize); |
5183 | @@ -1791,7 +1792,6 @@ again: |
5184 | set_extent_bit(&BTRFS_I(inode)->io_tree, lockstart, |
5185 | lockend, EXTENT_NORESERVE, NULL, |
5186 | NULL, GFP_NOFS); |
5187 | - only_release_metadata = false; |
5188 | } |
5189 | |
5190 | btrfs_drop_pages(pages, num_pages); |
5191 | diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c |
5192 | index d54dcd0ab230..d86ada9c3c54 100644 |
5193 | --- a/fs/btrfs/free-space-cache.c |
5194 | +++ b/fs/btrfs/free-space-cache.c |
5195 | @@ -385,6 +385,12 @@ static int io_ctl_prepare_pages(struct btrfs_io_ctl *io_ctl, struct inode *inode |
5196 | if (uptodate && !PageUptodate(page)) { |
5197 | btrfs_readpage(NULL, page); |
5198 | lock_page(page); |
5199 | + if (page->mapping != inode->i_mapping) { |
5200 | + btrfs_err(BTRFS_I(inode)->root->fs_info, |
5201 | + "free space cache page truncated"); |
5202 | + io_ctl_drop_pages(io_ctl); |
5203 | + return -EIO; |
5204 | + } |
5205 | if (!PageUptodate(page)) { |
5206 | btrfs_err(BTRFS_I(inode)->root->fs_info, |
5207 | "error reading free space cache"); |
5208 | diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c |
5209 | index 015910079e73..10a01dd0c4e6 100644 |
5210 | --- a/fs/btrfs/inode.c |
5211 | +++ b/fs/btrfs/inode.c |
5212 | @@ -2214,12 +2214,16 @@ again: |
5213 | mapping_set_error(page->mapping, ret); |
5214 | end_extent_writepage(page, ret, page_start, page_end); |
5215 | ClearPageChecked(page); |
5216 | - goto out; |
5217 | + goto out_reserved; |
5218 | } |
5219 | |
5220 | ClearPageChecked(page); |
5221 | set_page_dirty(page); |
5222 | +out_reserved: |
5223 | btrfs_delalloc_release_extents(BTRFS_I(inode), PAGE_SIZE); |
5224 | + if (ret) |
5225 | + btrfs_delalloc_release_space(inode, data_reserved, page_start, |
5226 | + PAGE_SIZE, true); |
5227 | out: |
5228 | unlock_extent_cached(&BTRFS_I(inode)->io_tree, page_start, page_end, |
5229 | &cached_state); |
5230 | @@ -9550,6 +9554,9 @@ static int btrfs_rename_exchange(struct inode *old_dir, |
5231 | goto out_notrans; |
5232 | } |
5233 | |
5234 | + if (dest != root) |
5235 | + btrfs_record_root_in_trans(trans, dest); |
5236 | + |
5237 | /* |
5238 | * We need to find a free sequence number both in the source and |
5239 | * in the destination directory for the exchange. |
5240 | diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c |
5241 | index 123ac54af071..518ec1265a0c 100644 |
5242 | --- a/fs/btrfs/send.c |
5243 | +++ b/fs/btrfs/send.c |
5244 | @@ -24,6 +24,14 @@ |
5245 | #include "transaction.h" |
5246 | #include "compression.h" |
5247 | |
5248 | +/* |
5249 | + * Maximum number of references an extent can have in order for us to attempt to |
5250 | + * issue clone operations instead of write operations. This currently exists to |
5251 | + * avoid hitting limitations of the backreference walking code (taking a lot of |
5252 | + * time and using too much memory for extents with large number of references). |
5253 | + */ |
5254 | +#define SEND_MAX_EXTENT_REFS 64 |
5255 | + |
5256 | /* |
5257 | * A fs_path is a helper to dynamically build path names with unknown size. |
5258 | * It reallocates the internal buffer on demand. |
5259 | @@ -1302,6 +1310,7 @@ static int find_extent_clone(struct send_ctx *sctx, |
5260 | struct clone_root *cur_clone_root; |
5261 | struct btrfs_key found_key; |
5262 | struct btrfs_path *tmp_path; |
5263 | + struct btrfs_extent_item *ei; |
5264 | int compressed; |
5265 | u32 i; |
5266 | |
5267 | @@ -1349,7 +1358,6 @@ static int find_extent_clone(struct send_ctx *sctx, |
5268 | ret = extent_from_logical(fs_info, disk_byte, tmp_path, |
5269 | &found_key, &flags); |
5270 | up_read(&fs_info->commit_root_sem); |
5271 | - btrfs_release_path(tmp_path); |
5272 | |
5273 | if (ret < 0) |
5274 | goto out; |
5275 | @@ -1358,6 +1366,21 @@ static int find_extent_clone(struct send_ctx *sctx, |
5276 | goto out; |
5277 | } |
5278 | |
5279 | + ei = btrfs_item_ptr(tmp_path->nodes[0], tmp_path->slots[0], |
5280 | + struct btrfs_extent_item); |
5281 | + /* |
5282 | + * Backreference walking (iterate_extent_inodes() below) is currently |
5283 | + * too expensive when an extent has a large number of references, both |
5284 | + * in time spent and used memory. So for now just fallback to write |
5285 | + * operations instead of clone operations when an extent has more than |
5286 | + * a certain amount of references. |
5287 | + */ |
5288 | + if (btrfs_extent_refs(tmp_path->nodes[0], ei) > SEND_MAX_EXTENT_REFS) { |
5289 | + ret = -ENOENT; |
5290 | + goto out; |
5291 | + } |
5292 | + btrfs_release_path(tmp_path); |
5293 | + |
5294 | /* |
5295 | * Setup the clone roots. |
5296 | */ |
5297 | diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h |
5298 | index a7da1f3e3627..5acf5c507ec2 100644 |
5299 | --- a/fs/btrfs/volumes.h |
5300 | +++ b/fs/btrfs/volumes.h |
5301 | @@ -330,7 +330,6 @@ struct btrfs_bio { |
5302 | u64 map_type; /* get from map_lookup->type */ |
5303 | bio_end_io_t *end_io; |
5304 | struct bio *orig_bio; |
5305 | - unsigned long flags; |
5306 | void *private; |
5307 | atomic_t error; |
5308 | int max_errors; |
5309 | diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c |
5310 | index d17a789fd856..2e4764fd1872 100644 |
5311 | --- a/fs/ceph/dir.c |
5312 | +++ b/fs/ceph/dir.c |
5313 | @@ -1809,6 +1809,7 @@ const struct file_operations ceph_dir_fops = { |
5314 | .open = ceph_open, |
5315 | .release = ceph_release, |
5316 | .unlocked_ioctl = ceph_ioctl, |
5317 | + .compat_ioctl = compat_ptr_ioctl, |
5318 | .fsync = ceph_fsync, |
5319 | .lock = ceph_lock, |
5320 | .flock = ceph_flock, |
5321 | diff --git a/fs/ceph/file.c b/fs/ceph/file.c |
5322 | index 8de633964dc3..11929d2bb594 100644 |
5323 | --- a/fs/ceph/file.c |
5324 | +++ b/fs/ceph/file.c |
5325 | @@ -2188,7 +2188,7 @@ const struct file_operations ceph_file_fops = { |
5326 | .splice_read = generic_file_splice_read, |
5327 | .splice_write = iter_file_splice_write, |
5328 | .unlocked_ioctl = ceph_ioctl, |
5329 | - .compat_ioctl = ceph_ioctl, |
5330 | + .compat_ioctl = compat_ptr_ioctl, |
5331 | .fallocate = ceph_fallocate, |
5332 | .copy_file_range = ceph_copy_file_range, |
5333 | }; |
5334 | diff --git a/fs/erofs/xattr.c b/fs/erofs/xattr.c |
5335 | index a13a78725c57..b766c3ee5fa8 100644 |
5336 | --- a/fs/erofs/xattr.c |
5337 | +++ b/fs/erofs/xattr.c |
5338 | @@ -649,6 +649,8 @@ ssize_t erofs_listxattr(struct dentry *dentry, |
5339 | struct listxattr_iter it; |
5340 | |
5341 | ret = init_inode_xattrs(d_inode(dentry)); |
5342 | + if (ret == -ENOATTR) |
5343 | + return 0; |
5344 | if (ret) |
5345 | return ret; |
5346 | |
5347 | diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c |
5348 | index 7004ce581a32..a16c53655e77 100644 |
5349 | --- a/fs/ext2/inode.c |
5350 | +++ b/fs/ext2/inode.c |
5351 | @@ -701,10 +701,13 @@ static int ext2_get_blocks(struct inode *inode, |
5352 | if (!partial) { |
5353 | count++; |
5354 | mutex_unlock(&ei->truncate_mutex); |
5355 | - if (err) |
5356 | - goto cleanup; |
5357 | goto got_it; |
5358 | } |
5359 | + |
5360 | + if (err) { |
5361 | + mutex_unlock(&ei->truncate_mutex); |
5362 | + goto cleanup; |
5363 | + } |
5364 | } |
5365 | |
5366 | /* |
5367 | diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c |
5368 | index 764ff4c56233..564e2ceb8417 100644 |
5369 | --- a/fs/ext4/ialloc.c |
5370 | +++ b/fs/ext4/ialloc.c |
5371 | @@ -265,13 +265,8 @@ void ext4_free_inode(handle_t *handle, struct inode *inode) |
5372 | ext4_debug("freeing inode %lu\n", ino); |
5373 | trace_ext4_free_inode(inode); |
5374 | |
5375 | - /* |
5376 | - * Note: we must free any quota before locking the superblock, |
5377 | - * as writing the quota to disk may need the lock as well. |
5378 | - */ |
5379 | dquot_initialize(inode); |
5380 | dquot_free_inode(inode); |
5381 | - dquot_drop(inode); |
5382 | |
5383 | is_directory = S_ISDIR(inode->i_mode); |
5384 | |
5385 | diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c |
5386 | index d691d1783ed6..91da21890360 100644 |
5387 | --- a/fs/ext4/inode.c |
5388 | +++ b/fs/ext4/inode.c |
5389 | @@ -196,7 +196,12 @@ void ext4_evict_inode(struct inode *inode) |
5390 | { |
5391 | handle_t *handle; |
5392 | int err; |
5393 | - int extra_credits = 3; |
5394 | + /* |
5395 | + * Credits for final inode cleanup and freeing: |
5396 | + * sb + inode (ext4_orphan_del()), block bitmap, group descriptor |
5397 | + * (xattr block freeing), bitmap, group descriptor (inode freeing) |
5398 | + */ |
5399 | + int extra_credits = 6; |
5400 | struct ext4_xattr_inode_array *ea_inode_array = NULL; |
5401 | |
5402 | trace_ext4_evict_inode(inode); |
5403 | @@ -252,8 +257,12 @@ void ext4_evict_inode(struct inode *inode) |
5404 | if (!IS_NOQUOTA(inode)) |
5405 | extra_credits += EXT4_MAXQUOTAS_DEL_BLOCKS(inode->i_sb); |
5406 | |
5407 | + /* |
5408 | + * Block bitmap, group descriptor, and inode are accounted in both |
5409 | + * ext4_blocks_for_truncate() and extra_credits. So subtract 3. |
5410 | + */ |
5411 | handle = ext4_journal_start(inode, EXT4_HT_TRUNCATE, |
5412 | - ext4_blocks_for_truncate(inode)+extra_credits); |
5413 | + ext4_blocks_for_truncate(inode) + extra_credits - 3); |
5414 | if (IS_ERR(handle)) { |
5415 | ext4_std_error(inode->i_sb, PTR_ERR(handle)); |
5416 | /* |
5417 | @@ -5450,11 +5459,15 @@ static void ext4_wait_for_tail_page_commit(struct inode *inode) |
5418 | |
5419 | offset = inode->i_size & (PAGE_SIZE - 1); |
5420 | /* |
5421 | - * All buffers in the last page remain valid? Then there's nothing to |
5422 | - * do. We do the check mainly to optimize the common PAGE_SIZE == |
5423 | - * blocksize case |
5424 | + * If the page is fully truncated, we don't need to wait for any commit |
5425 | + * (and we even should not as __ext4_journalled_invalidatepage() may |
5426 | + * strip all buffers from the page but keep the page dirty which can then |
5427 | + * confuse e.g. concurrent ext4_writepage() seeing dirty page without |
5428 | + * buffers). Also we don't need to wait for any commit if all buffers in |
5429 | + * the page remain valid. This is most beneficial for the common case of |
5430 | + * blocksize == PAGESIZE. |
5431 | */ |
5432 | - if (offset > PAGE_SIZE - i_blocksize(inode)) |
5433 | + if (!offset || offset > (PAGE_SIZE - i_blocksize(inode))) |
5434 | return; |
5435 | while (1) { |
5436 | page = find_lock_page(inode->i_mapping, |
5437 | diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c |
5438 | index a427d2031a8d..923476e3aefb 100644 |
5439 | --- a/fs/ext4/namei.c |
5440 | +++ b/fs/ext4/namei.c |
5441 | @@ -3182,18 +3182,17 @@ static int ext4_unlink(struct inode *dir, struct dentry *dentry) |
5442 | if (IS_DIRSYNC(dir)) |
5443 | ext4_handle_sync(handle); |
5444 | |
5445 | - if (inode->i_nlink == 0) { |
5446 | - ext4_warning_inode(inode, "Deleting file '%.*s' with no links", |
5447 | - dentry->d_name.len, dentry->d_name.name); |
5448 | - set_nlink(inode, 1); |
5449 | - } |
5450 | retval = ext4_delete_entry(handle, dir, de, bh); |
5451 | if (retval) |
5452 | goto end_unlink; |
5453 | dir->i_ctime = dir->i_mtime = current_time(dir); |
5454 | ext4_update_dx_flag(dir); |
5455 | ext4_mark_inode_dirty(handle, dir); |
5456 | - drop_nlink(inode); |
5457 | + if (inode->i_nlink == 0) |
5458 | + ext4_warning_inode(inode, "Deleting file '%.*s' with no links", |
5459 | + dentry->d_name.len, dentry->d_name.name); |
5460 | + else |
5461 | + drop_nlink(inode); |
5462 | if (!inode->i_nlink) |
5463 | ext4_orphan_add(handle, inode); |
5464 | inode->i_ctime = current_time(inode); |
5465 | diff --git a/fs/ext4/super.c b/fs/ext4/super.c |
5466 | index 73578359d451..98d37b8d0050 100644 |
5467 | --- a/fs/ext4/super.c |
5468 | +++ b/fs/ext4/super.c |
5469 | @@ -1172,9 +1172,9 @@ void ext4_clear_inode(struct inode *inode) |
5470 | { |
5471 | invalidate_inode_buffers(inode); |
5472 | clear_inode(inode); |
5473 | - dquot_drop(inode); |
5474 | ext4_discard_preallocations(inode); |
5475 | ext4_es_remove_extent(inode, 0, EXT_MAX_BLOCKS); |
5476 | + dquot_drop(inode); |
5477 | if (EXT4_I(inode)->jinode) { |
5478 | jbd2_journal_release_jbd_inode(EXT4_JOURNAL(inode), |
5479 | EXT4_I(inode)->jinode); |
5480 | diff --git a/fs/ioctl.c b/fs/ioctl.c |
5481 | index fef3a6bf7c78..3118da0de158 100644 |
5482 | --- a/fs/ioctl.c |
5483 | +++ b/fs/ioctl.c |
5484 | @@ -8,6 +8,7 @@ |
5485 | #include <linux/syscalls.h> |
5486 | #include <linux/mm.h> |
5487 | #include <linux/capability.h> |
5488 | +#include <linux/compat.h> |
5489 | #include <linux/file.h> |
5490 | #include <linux/fs.h> |
5491 | #include <linux/security.h> |
5492 | @@ -719,3 +720,37 @@ SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, unsigned long, arg) |
5493 | { |
5494 | return ksys_ioctl(fd, cmd, arg); |
5495 | } |
5496 | + |
5497 | +#ifdef CONFIG_COMPAT |
5498 | +/** |
5499 | + * compat_ptr_ioctl - generic implementation of .compat_ioctl file operation |
5500 | + * |
5501 | + * This is not normally called as a function, but instead set in struct |
5502 | + * file_operations as |
5503 | + * |
5504 | + * .compat_ioctl = compat_ptr_ioctl, |
5505 | + * |
5506 | + * On most architectures, the compat_ptr_ioctl() just passes all arguments |
5507 | + * to the corresponding ->ioctl handler. The exception is arch/s390, where |
5508 | + * compat_ptr() clears the top bit of a 32-bit pointer value, so user space |
5509 | + * pointers to the second 2GB alias the first 2GB, as is the case for |
5510 | + * native 32-bit s390 user space. |
5511 | + * |
5512 | + * The compat_ptr_ioctl() function must therefore be used only with ioctl |
5513 | + * functions that either ignore the argument or pass a pointer to a |
5514 | + * compatible data type. |
5515 | + * |
5516 | + * If any ioctl command handled by fops->unlocked_ioctl passes a plain |
5517 | + * integer instead of a pointer, or any of the passed data types |
5518 | + * is incompatible between 32-bit and 64-bit architectures, a proper |
5519 | + * handler is required instead of compat_ptr_ioctl. |
5520 | + */ |
5521 | +long compat_ptr_ioctl(struct file *file, unsigned int cmd, unsigned long arg) |
5522 | +{ |
5523 | + if (!file->f_op->unlocked_ioctl) |
5524 | + return -ENOIOCTLCMD; |
5525 | + |
5526 | + return file->f_op->unlocked_ioctl(file, cmd, (unsigned long)compat_ptr(arg)); |
5527 | +} |
5528 | +EXPORT_SYMBOL(compat_ptr_ioctl); |
5529 | +#endif |
5530 | diff --git a/fs/ocfs2/quota_global.c b/fs/ocfs2/quota_global.c |
5531 | index 7a922190a8c7..eda83487c9ec 100644 |
5532 | --- a/fs/ocfs2/quota_global.c |
5533 | +++ b/fs/ocfs2/quota_global.c |
5534 | @@ -728,7 +728,7 @@ static int ocfs2_release_dquot(struct dquot *dquot) |
5535 | |
5536 | mutex_lock(&dquot->dq_lock); |
5537 | /* Check whether we are not racing with some other dqget() */ |
5538 | - if (atomic_read(&dquot->dq_count) > 1) |
5539 | + if (dquot_is_busy(dquot)) |
5540 | goto out; |
5541 | /* Running from downconvert thread? Postpone quota processing to wq */ |
5542 | if (current == osb->dc_task) { |
5543 | diff --git a/fs/overlayfs/dir.c b/fs/overlayfs/dir.c |
5544 | index 702aa63f6774..29abdb1d3b5c 100644 |
5545 | --- a/fs/overlayfs/dir.c |
5546 | +++ b/fs/overlayfs/dir.c |
5547 | @@ -1170,7 +1170,7 @@ static int ovl_rename(struct inode *olddir, struct dentry *old, |
5548 | if (newdentry == trap) |
5549 | goto out_dput; |
5550 | |
5551 | - if (WARN_ON(olddentry->d_inode == newdentry->d_inode)) |
5552 | + if (olddentry->d_inode == newdentry->d_inode) |
5553 | goto out_dput; |
5554 | |
5555 | err = 0; |
5556 | diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c |
5557 | index bc14781886bf..b045cf1826fc 100644 |
5558 | --- a/fs/overlayfs/inode.c |
5559 | +++ b/fs/overlayfs/inode.c |
5560 | @@ -200,8 +200,14 @@ int ovl_getattr(const struct path *path, struct kstat *stat, |
5561 | if (ovl_test_flag(OVL_INDEX, d_inode(dentry)) || |
5562 | (!ovl_verify_lower(dentry->d_sb) && |
5563 | (is_dir || lowerstat.nlink == 1))) { |
5564 | - stat->ino = lowerstat.ino; |
5565 | lower_layer = ovl_layer_lower(dentry); |
5566 | + /* |
5567 | + * Cannot use origin st_dev;st_ino because |
5568 | + * origin inode content may differ from overlay |
5569 | + * inode content. |
5570 | + */ |
5571 | + if (samefs || lower_layer->fsid) |
5572 | + stat->ino = lowerstat.ino; |
5573 | } |
5574 | |
5575 | /* |
5576 | diff --git a/fs/overlayfs/namei.c b/fs/overlayfs/namei.c |
5577 | index e9717c2f7d45..f47c591402d7 100644 |
5578 | --- a/fs/overlayfs/namei.c |
5579 | +++ b/fs/overlayfs/namei.c |
5580 | @@ -325,6 +325,14 @@ int ovl_check_origin_fh(struct ovl_fs *ofs, struct ovl_fh *fh, bool connected, |
5581 | int i; |
5582 | |
5583 | for (i = 0; i < ofs->numlower; i++) { |
5584 | + /* |
5585 | + * If lower fs uuid is not unique among lower fs we cannot match |
5586 | + * fh->uuid to layer. |
5587 | + */ |
5588 | + if (ofs->lower_layers[i].fsid && |
5589 | + ofs->lower_layers[i].fs->bad_uuid) |
5590 | + continue; |
5591 | + |
5592 | origin = ovl_decode_real_fh(fh, ofs->lower_layers[i].mnt, |
5593 | connected); |
5594 | if (origin) |
5595 | diff --git a/fs/overlayfs/ovl_entry.h b/fs/overlayfs/ovl_entry.h |
5596 | index a8279280e88d..28348c44ea5b 100644 |
5597 | --- a/fs/overlayfs/ovl_entry.h |
5598 | +++ b/fs/overlayfs/ovl_entry.h |
5599 | @@ -22,6 +22,8 @@ struct ovl_config { |
5600 | struct ovl_sb { |
5601 | struct super_block *sb; |
5602 | dev_t pseudo_dev; |
5603 | + /* Unusable (conflicting) uuid */ |
5604 | + bool bad_uuid; |
5605 | }; |
5606 | |
5607 | struct ovl_layer { |
5608 | diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c |
5609 | index afbcb116a7f1..7621ff176d15 100644 |
5610 | --- a/fs/overlayfs/super.c |
5611 | +++ b/fs/overlayfs/super.c |
5612 | @@ -1255,7 +1255,7 @@ static bool ovl_lower_uuid_ok(struct ovl_fs *ofs, const uuid_t *uuid) |
5613 | { |
5614 | unsigned int i; |
5615 | |
5616 | - if (!ofs->config.nfs_export && !(ofs->config.index && ofs->upper_mnt)) |
5617 | + if (!ofs->config.nfs_export && !ofs->upper_mnt) |
5618 | return true; |
5619 | |
5620 | for (i = 0; i < ofs->numlowerfs; i++) { |
5621 | @@ -1263,9 +1263,13 @@ static bool ovl_lower_uuid_ok(struct ovl_fs *ofs, const uuid_t *uuid) |
5622 | * We use uuid to associate an overlay lower file handle with a |
5623 | * lower layer, so we can accept lower fs with null uuid as long |
5624 | * as all lower layers with null uuid are on the same fs. |
5625 | + * if we detect multiple lower fs with the same uuid, we |
5626 | + * disable lower file handle decoding on all of them. |
5627 | */ |
5628 | - if (uuid_equal(&ofs->lower_fs[i].sb->s_uuid, uuid)) |
5629 | + if (uuid_equal(&ofs->lower_fs[i].sb->s_uuid, uuid)) { |
5630 | + ofs->lower_fs[i].bad_uuid = true; |
5631 | return false; |
5632 | + } |
5633 | } |
5634 | return true; |
5635 | } |
5636 | @@ -1277,6 +1281,7 @@ static int ovl_get_fsid(struct ovl_fs *ofs, const struct path *path) |
5637 | unsigned int i; |
5638 | dev_t dev; |
5639 | int err; |
5640 | + bool bad_uuid = false; |
5641 | |
5642 | /* fsid 0 is reserved for upper fs even with non upper overlay */ |
5643 | if (ofs->upper_mnt && ofs->upper_mnt->mnt_sb == sb) |
5644 | @@ -1288,11 +1293,15 @@ static int ovl_get_fsid(struct ovl_fs *ofs, const struct path *path) |
5645 | } |
5646 | |
5647 | if (!ovl_lower_uuid_ok(ofs, &sb->s_uuid)) { |
5648 | - ofs->config.index = false; |
5649 | - ofs->config.nfs_export = false; |
5650 | - pr_warn("overlayfs: %s uuid detected in lower fs '%pd2', falling back to index=off,nfs_export=off.\n", |
5651 | - uuid_is_null(&sb->s_uuid) ? "null" : "conflicting", |
5652 | - path->dentry); |
5653 | + bad_uuid = true; |
5654 | + if (ofs->config.index || ofs->config.nfs_export) { |
5655 | + ofs->config.index = false; |
5656 | + ofs->config.nfs_export = false; |
5657 | + pr_warn("overlayfs: %s uuid detected in lower fs '%pd2', falling back to index=off,nfs_export=off.\n", |
5658 | + uuid_is_null(&sb->s_uuid) ? "null" : |
5659 | + "conflicting", |
5660 | + path->dentry); |
5661 | + } |
5662 | } |
5663 | |
5664 | err = get_anon_bdev(&dev); |
5665 | @@ -1303,6 +1312,7 @@ static int ovl_get_fsid(struct ovl_fs *ofs, const struct path *path) |
5666 | |
5667 | ofs->lower_fs[ofs->numlowerfs].sb = sb; |
5668 | ofs->lower_fs[ofs->numlowerfs].pseudo_dev = dev; |
5669 | + ofs->lower_fs[ofs->numlowerfs].bad_uuid = bad_uuid; |
5670 | ofs->numlowerfs++; |
5671 | |
5672 | return ofs->numlowerfs; |
5673 | diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c |
5674 | index 6e826b454082..7f0b39da5022 100644 |
5675 | --- a/fs/quota/dquot.c |
5676 | +++ b/fs/quota/dquot.c |
5677 | @@ -497,7 +497,7 @@ int dquot_release(struct dquot *dquot) |
5678 | |
5679 | mutex_lock(&dquot->dq_lock); |
5680 | /* Check whether we are not racing with some other dqget() */ |
5681 | - if (atomic_read(&dquot->dq_count) > 1) |
5682 | + if (dquot_is_busy(dquot)) |
5683 | goto out_dqlock; |
5684 | if (dqopt->ops[dquot->dq_id.type]->release_dqblk) { |
5685 | ret = dqopt->ops[dquot->dq_id.type]->release_dqblk(dquot); |
5686 | @@ -623,7 +623,7 @@ EXPORT_SYMBOL(dquot_scan_active); |
5687 | /* Write all dquot structures to quota files */ |
5688 | int dquot_writeback_dquots(struct super_block *sb, int type) |
5689 | { |
5690 | - struct list_head *dirty; |
5691 | + struct list_head dirty; |
5692 | struct dquot *dquot; |
5693 | struct quota_info *dqopt = sb_dqopt(sb); |
5694 | int cnt; |
5695 | @@ -637,9 +637,10 @@ int dquot_writeback_dquots(struct super_block *sb, int type) |
5696 | if (!sb_has_quota_active(sb, cnt)) |
5697 | continue; |
5698 | spin_lock(&dq_list_lock); |
5699 | - dirty = &dqopt->info[cnt].dqi_dirty_list; |
5700 | - while (!list_empty(dirty)) { |
5701 | - dquot = list_first_entry(dirty, struct dquot, |
5702 | + /* Move list away to avoid livelock. */ |
5703 | + list_replace_init(&dqopt->info[cnt].dqi_dirty_list, &dirty); |
5704 | + while (!list_empty(&dirty)) { |
5705 | + dquot = list_first_entry(&dirty, struct dquot, |
5706 | dq_dirty); |
5707 | |
5708 | WARN_ON(!test_bit(DQ_ACTIVE_B, &dquot->dq_flags)); |
5709 | diff --git a/fs/reiserfs/inode.c b/fs/reiserfs/inode.c |
5710 | index 132ec4406ed0..6419e6dacc39 100644 |
5711 | --- a/fs/reiserfs/inode.c |
5712 | +++ b/fs/reiserfs/inode.c |
5713 | @@ -2097,6 +2097,15 @@ int reiserfs_new_inode(struct reiserfs_transaction_handle *th, |
5714 | goto out_inserted_sd; |
5715 | } |
5716 | |
5717 | + /* |
5718 | + * Mark it private if we're creating the privroot |
5719 | + * or something under it. |
5720 | + */ |
5721 | + if (IS_PRIVATE(dir) || dentry == REISERFS_SB(sb)->priv_root) { |
5722 | + inode->i_flags |= S_PRIVATE; |
5723 | + inode->i_opflags &= ~IOP_XATTR; |
5724 | + } |
5725 | + |
5726 | if (reiserfs_posixacl(inode->i_sb)) { |
5727 | reiserfs_write_unlock(inode->i_sb); |
5728 | retval = reiserfs_inherit_default_acl(th, dir, dentry, inode); |
5729 | @@ -2111,8 +2120,7 @@ int reiserfs_new_inode(struct reiserfs_transaction_handle *th, |
5730 | reiserfs_warning(inode->i_sb, "jdm-13090", |
5731 | "ACLs aren't enabled in the fs, " |
5732 | "but vfs thinks they are!"); |
5733 | - } else if (IS_PRIVATE(dir)) |
5734 | - inode->i_flags |= S_PRIVATE; |
5735 | + } |
5736 | |
5737 | if (security->name) { |
5738 | reiserfs_write_unlock(inode->i_sb); |
5739 | diff --git a/fs/reiserfs/namei.c b/fs/reiserfs/namei.c |
5740 | index 97f3fc4fdd79..959a066b7bb0 100644 |
5741 | --- a/fs/reiserfs/namei.c |
5742 | +++ b/fs/reiserfs/namei.c |
5743 | @@ -377,10 +377,13 @@ static struct dentry *reiserfs_lookup(struct inode *dir, struct dentry *dentry, |
5744 | |
5745 | /* |
5746 | * Propagate the private flag so we know we're |
5747 | - * in the priv tree |
5748 | + * in the priv tree. Also clear IOP_XATTR |
5749 | + * since we don't have xattrs on xattr files. |
5750 | */ |
5751 | - if (IS_PRIVATE(dir)) |
5752 | + if (IS_PRIVATE(dir)) { |
5753 | inode->i_flags |= S_PRIVATE; |
5754 | + inode->i_opflags &= ~IOP_XATTR; |
5755 | + } |
5756 | } |
5757 | reiserfs_write_unlock(dir->i_sb); |
5758 | if (retval == IO_ERROR) { |
5759 | diff --git a/fs/reiserfs/reiserfs.h b/fs/reiserfs/reiserfs.h |
5760 | index e5ca9ed79e54..726580114d55 100644 |
5761 | --- a/fs/reiserfs/reiserfs.h |
5762 | +++ b/fs/reiserfs/reiserfs.h |
5763 | @@ -1168,6 +1168,8 @@ static inline int bmap_would_wrap(unsigned bmap_nr) |
5764 | return bmap_nr > ((1LL << 16) - 1); |
5765 | } |
5766 | |
5767 | +extern const struct xattr_handler *reiserfs_xattr_handlers[]; |
5768 | + |
5769 | /* |
5770 | * this says about version of key of all items (but stat data) the |
5771 | * object consists of |
5772 | diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c |
5773 | index d69b4ac0ae2f..3244037b1286 100644 |
5774 | --- a/fs/reiserfs/super.c |
5775 | +++ b/fs/reiserfs/super.c |
5776 | @@ -2049,6 +2049,8 @@ static int reiserfs_fill_super(struct super_block *s, void *data, int silent) |
5777 | if (replay_only(s)) |
5778 | goto error_unlocked; |
5779 | |
5780 | + s->s_xattr = reiserfs_xattr_handlers; |
5781 | + |
5782 | if (bdev_read_only(s->s_bdev) && !sb_rdonly(s)) { |
5783 | SWARN(silent, s, "clm-7000", |
5784 | "Detected readonly device, marking FS readonly"); |
5785 | diff --git a/fs/reiserfs/xattr.c b/fs/reiserfs/xattr.c |
5786 | index b5b26d8a192c..62b40df36c98 100644 |
5787 | --- a/fs/reiserfs/xattr.c |
5788 | +++ b/fs/reiserfs/xattr.c |
5789 | @@ -122,13 +122,13 @@ static struct dentry *open_xa_root(struct super_block *sb, int flags) |
5790 | struct dentry *xaroot; |
5791 | |
5792 | if (d_really_is_negative(privroot)) |
5793 | - return ERR_PTR(-ENODATA); |
5794 | + return ERR_PTR(-EOPNOTSUPP); |
5795 | |
5796 | inode_lock_nested(d_inode(privroot), I_MUTEX_XATTR); |
5797 | |
5798 | xaroot = dget(REISERFS_SB(sb)->xattr_root); |
5799 | if (!xaroot) |
5800 | - xaroot = ERR_PTR(-ENODATA); |
5801 | + xaroot = ERR_PTR(-EOPNOTSUPP); |
5802 | else if (d_really_is_negative(xaroot)) { |
5803 | int err = -ENODATA; |
5804 | |
5805 | @@ -619,6 +619,10 @@ int reiserfs_xattr_set(struct inode *inode, const char *name, |
5806 | int error, error2; |
5807 | size_t jbegin_count = reiserfs_xattr_nblocks(inode, buffer_size); |
5808 | |
5809 | + /* Check before we start a transaction and then do nothing. */ |
5810 | + if (!d_really_is_positive(REISERFS_SB(inode->i_sb)->priv_root)) |
5811 | + return -EOPNOTSUPP; |
5812 | + |
5813 | if (!(flags & XATTR_REPLACE)) |
5814 | jbegin_count += reiserfs_xattr_jcreate_nblocks(inode); |
5815 | |
5816 | @@ -841,8 +845,7 @@ ssize_t reiserfs_listxattr(struct dentry * dentry, char *buffer, size_t size) |
5817 | if (d_really_is_negative(dentry)) |
5818 | return -EINVAL; |
5819 | |
5820 | - if (!dentry->d_sb->s_xattr || |
5821 | - get_inode_sd_version(d_inode(dentry)) == STAT_DATA_V1) |
5822 | + if (get_inode_sd_version(d_inode(dentry)) == STAT_DATA_V1) |
5823 | return -EOPNOTSUPP; |
5824 | |
5825 | dir = open_xa_dir(d_inode(dentry), XATTR_REPLACE); |
5826 | @@ -882,6 +885,7 @@ static int create_privroot(struct dentry *dentry) |
5827 | } |
5828 | |
5829 | d_inode(dentry)->i_flags |= S_PRIVATE; |
5830 | + d_inode(dentry)->i_opflags &= ~IOP_XATTR; |
5831 | reiserfs_info(dentry->d_sb, "Created %s - reserved for xattr " |
5832 | "storage.\n", PRIVROOT_NAME); |
5833 | |
5834 | @@ -895,7 +899,7 @@ static int create_privroot(struct dentry *dentry) { return 0; } |
5835 | #endif |
5836 | |
5837 | /* Actual operations that are exported to VFS-land */ |
5838 | -static const struct xattr_handler *reiserfs_xattr_handlers[] = { |
5839 | +const struct xattr_handler *reiserfs_xattr_handlers[] = { |
5840 | #ifdef CONFIG_REISERFS_FS_XATTR |
5841 | &reiserfs_xattr_user_handler, |
5842 | &reiserfs_xattr_trusted_handler, |
5843 | @@ -966,8 +970,10 @@ int reiserfs_lookup_privroot(struct super_block *s) |
5844 | if (!IS_ERR(dentry)) { |
5845 | REISERFS_SB(s)->priv_root = dentry; |
5846 | d_set_d_op(dentry, &xattr_lookup_poison_ops); |
5847 | - if (d_really_is_positive(dentry)) |
5848 | + if (d_really_is_positive(dentry)) { |
5849 | d_inode(dentry)->i_flags |= S_PRIVATE; |
5850 | + d_inode(dentry)->i_opflags &= ~IOP_XATTR; |
5851 | + } |
5852 | } else |
5853 | err = PTR_ERR(dentry); |
5854 | inode_unlock(d_inode(s->s_root)); |
5855 | @@ -996,7 +1002,6 @@ int reiserfs_xattr_init(struct super_block *s, int mount_flags) |
5856 | } |
5857 | |
5858 | if (d_really_is_positive(privroot)) { |
5859 | - s->s_xattr = reiserfs_xattr_handlers; |
5860 | inode_lock(d_inode(privroot)); |
5861 | if (!REISERFS_SB(s)->xattr_root) { |
5862 | struct dentry *dentry; |
5863 | diff --git a/fs/reiserfs/xattr_acl.c b/fs/reiserfs/xattr_acl.c |
5864 | index aa9380bac196..05f666794561 100644 |
5865 | --- a/fs/reiserfs/xattr_acl.c |
5866 | +++ b/fs/reiserfs/xattr_acl.c |
5867 | @@ -320,10 +320,8 @@ reiserfs_inherit_default_acl(struct reiserfs_transaction_handle *th, |
5868 | * would be useless since permissions are ignored, and a pain because |
5869 | * it introduces locking cycles |
5870 | */ |
5871 | - if (IS_PRIVATE(dir)) { |
5872 | - inode->i_flags |= S_PRIVATE; |
5873 | + if (IS_PRIVATE(inode)) |
5874 | goto apply_umask; |
5875 | - } |
5876 | |
5877 | err = posix_acl_create(dir, &inode->i_mode, &default_acl, &acl); |
5878 | if (err) |
5879 | diff --git a/fs/splice.c b/fs/splice.c |
5880 | index 98412721f056..e509239d7e06 100644 |
5881 | --- a/fs/splice.c |
5882 | +++ b/fs/splice.c |
5883 | @@ -945,12 +945,13 @@ ssize_t splice_direct_to_actor(struct file *in, struct splice_desc *sd, |
5884 | WARN_ON_ONCE(pipe->nrbufs != 0); |
5885 | |
5886 | while (len) { |
5887 | + unsigned int pipe_pages; |
5888 | size_t read_len; |
5889 | loff_t pos = sd->pos, prev_pos = pos; |
5890 | |
5891 | /* Don't try to read more the pipe has space for. */ |
5892 | - read_len = min_t(size_t, len, |
5893 | - (pipe->buffers - pipe->nrbufs) << PAGE_SHIFT); |
5894 | + pipe_pages = pipe->buffers - pipe->nrbufs; |
5895 | + read_len = min(len, (size_t)pipe_pages << PAGE_SHIFT); |
5896 | ret = do_splice_to(in, &pos, pipe, read_len, flags); |
5897 | if (unlikely(ret <= 0)) |
5898 | goto out_release; |
5899 | @@ -1180,8 +1181,15 @@ static long do_splice(struct file *in, loff_t __user *off_in, |
5900 | |
5901 | pipe_lock(opipe); |
5902 | ret = wait_for_space(opipe, flags); |
5903 | - if (!ret) |
5904 | + if (!ret) { |
5905 | + unsigned int pipe_pages; |
5906 | + |
5907 | + /* Don't try to read more the pipe has space for. */ |
5908 | + pipe_pages = opipe->buffers - opipe->nrbufs; |
5909 | + len = min(len, (size_t)pipe_pages << PAGE_SHIFT); |
5910 | + |
5911 | ret = do_splice_to(in, &offset, opipe, len, flags); |
5912 | + } |
5913 | pipe_unlock(opipe); |
5914 | if (ret > 0) |
5915 | wakeup_pipe_readers(opipe); |
5916 | diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h |
5917 | index 175f7b40c585..3f6fddeb7519 100644 |
5918 | --- a/include/acpi/acpi_bus.h |
5919 | +++ b/include/acpi/acpi_bus.h |
5920 | @@ -78,9 +78,6 @@ acpi_evaluate_dsm_typed(acpi_handle handle, const guid_t *guid, u64 rev, |
5921 | bool acpi_dev_found(const char *hid); |
5922 | bool acpi_dev_present(const char *hid, const char *uid, s64 hrv); |
5923 | |
5924 | -struct acpi_device * |
5925 | -acpi_dev_get_first_match_dev(const char *hid, const char *uid, s64 hrv); |
5926 | - |
5927 | #ifdef CONFIG_ACPI |
5928 | |
5929 | #include <linux/proc_fs.h> |
5930 | @@ -683,6 +680,9 @@ static inline bool acpi_device_can_poweroff(struct acpi_device *adev) |
5931 | adev->power.states[ACPI_STATE_D3_HOT].flags.explicit_set); |
5932 | } |
5933 | |
5934 | +struct acpi_device * |
5935 | +acpi_dev_get_first_match_dev(const char *hid, const char *uid, s64 hrv); |
5936 | + |
5937 | static inline void acpi_dev_put(struct acpi_device *adev) |
5938 | { |
5939 | put_device(&adev->dev); |
5940 | diff --git a/include/linux/fs.h b/include/linux/fs.h |
5941 | index e0d909d35763..0b4d8fc79e0f 100644 |
5942 | --- a/include/linux/fs.h |
5943 | +++ b/include/linux/fs.h |
5944 | @@ -1727,6 +1727,13 @@ int vfs_mkobj(struct dentry *, umode_t, |
5945 | |
5946 | extern long vfs_ioctl(struct file *file, unsigned int cmd, unsigned long arg); |
5947 | |
5948 | +#ifdef CONFIG_COMPAT |
5949 | +extern long compat_ptr_ioctl(struct file *file, unsigned int cmd, |
5950 | + unsigned long arg); |
5951 | +#else |
5952 | +#define compat_ptr_ioctl NULL |
5953 | +#endif |
5954 | + |
5955 | /* |
5956 | * VFS file helper functions. |
5957 | */ |
5958 | diff --git a/include/linux/mfd/rk808.h b/include/linux/mfd/rk808.h |
5959 | index 7cfd2b0504df..a59bf323f713 100644 |
5960 | --- a/include/linux/mfd/rk808.h |
5961 | +++ b/include/linux/mfd/rk808.h |
5962 | @@ -610,7 +610,7 @@ enum { |
5963 | RK808_ID = 0x0000, |
5964 | RK809_ID = 0x8090, |
5965 | RK817_ID = 0x8170, |
5966 | - RK818_ID = 0x8181, |
5967 | + RK818_ID = 0x8180, |
5968 | }; |
5969 | |
5970 | struct rk808 { |
5971 | diff --git a/include/linux/quotaops.h b/include/linux/quotaops.h |
5972 | index 185d94829701..91e0b7624053 100644 |
5973 | --- a/include/linux/quotaops.h |
5974 | +++ b/include/linux/quotaops.h |
5975 | @@ -54,6 +54,16 @@ static inline struct dquot *dqgrab(struct dquot *dquot) |
5976 | atomic_inc(&dquot->dq_count); |
5977 | return dquot; |
5978 | } |
5979 | + |
5980 | +static inline bool dquot_is_busy(struct dquot *dquot) |
5981 | +{ |
5982 | + if (test_bit(DQ_MOD_B, &dquot->dq_flags)) |
5983 | + return true; |
5984 | + if (atomic_read(&dquot->dq_count) > 1) |
5985 | + return true; |
5986 | + return false; |
5987 | +} |
5988 | + |
5989 | void dqput(struct dquot *dquot); |
5990 | int dquot_scan_active(struct super_block *sb, |
5991 | int (*fn)(struct dquot *dquot, unsigned long priv), |
5992 | diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h |
5993 | index e7e733add99f..44c52639db55 100644 |
5994 | --- a/include/rdma/ib_verbs.h |
5995 | +++ b/include/rdma/ib_verbs.h |
5996 | @@ -4043,9 +4043,7 @@ static inline void ib_dma_unmap_sg_attrs(struct ib_device *dev, |
5997 | */ |
5998 | static inline unsigned int ib_dma_max_seg_size(struct ib_device *dev) |
5999 | { |
6000 | - struct device_dma_parameters *p = dev->dma_device->dma_parms; |
6001 | - |
6002 | - return p ? p->max_segment_size : UINT_MAX; |
6003 | + return dma_get_max_seg_size(dev->dma_device); |
6004 | } |
6005 | |
6006 | /** |
6007 | diff --git a/include/uapi/linux/cec.h b/include/uapi/linux/cec.h |
6008 | index 5704fa0292b5..423859e489c7 100644 |
6009 | --- a/include/uapi/linux/cec.h |
6010 | +++ b/include/uapi/linux/cec.h |
6011 | @@ -768,8 +768,8 @@ struct cec_event { |
6012 | #define CEC_MSG_SELECT_DIGITAL_SERVICE 0x93 |
6013 | #define CEC_MSG_TUNER_DEVICE_STATUS 0x07 |
6014 | /* Recording Flag Operand (rec_flag) */ |
6015 | -#define CEC_OP_REC_FLAG_USED 0 |
6016 | -#define CEC_OP_REC_FLAG_NOT_USED 1 |
6017 | +#define CEC_OP_REC_FLAG_NOT_USED 0 |
6018 | +#define CEC_OP_REC_FLAG_USED 1 |
6019 | /* Tuner Display Info Operand (tuner_display_info) */ |
6020 | #define CEC_OP_TUNER_DISPLAY_INFO_DIGITAL 0 |
6021 | #define CEC_OP_TUNER_DISPLAY_INFO_NONE 1 |
6022 | diff --git a/kernel/cgroup/pids.c b/kernel/cgroup/pids.c |
6023 | index 8e513a573fe9..138059eb730d 100644 |
6024 | --- a/kernel/cgroup/pids.c |
6025 | +++ b/kernel/cgroup/pids.c |
6026 | @@ -45,7 +45,7 @@ struct pids_cgroup { |
6027 | * %PIDS_MAX = (%PID_MAX_LIMIT + 1). |
6028 | */ |
6029 | atomic64_t counter; |
6030 | - int64_t limit; |
6031 | + atomic64_t limit; |
6032 | |
6033 | /* Handle for "pids.events" */ |
6034 | struct cgroup_file events_file; |
6035 | @@ -73,8 +73,8 @@ pids_css_alloc(struct cgroup_subsys_state *parent) |
6036 | if (!pids) |
6037 | return ERR_PTR(-ENOMEM); |
6038 | |
6039 | - pids->limit = PIDS_MAX; |
6040 | atomic64_set(&pids->counter, 0); |
6041 | + atomic64_set(&pids->limit, PIDS_MAX); |
6042 | atomic64_set(&pids->events_limit, 0); |
6043 | return &pids->css; |
6044 | } |
6045 | @@ -146,13 +146,14 @@ static int pids_try_charge(struct pids_cgroup *pids, int num) |
6046 | |
6047 | for (p = pids; parent_pids(p); p = parent_pids(p)) { |
6048 | int64_t new = atomic64_add_return(num, &p->counter); |
6049 | + int64_t limit = atomic64_read(&p->limit); |
6050 | |
6051 | /* |
6052 | * Since new is capped to the maximum number of pid_t, if |
6053 | * p->limit is %PIDS_MAX then we know that this test will never |
6054 | * fail. |
6055 | */ |
6056 | - if (new > p->limit) |
6057 | + if (new > limit) |
6058 | goto revert; |
6059 | } |
6060 | |
6061 | @@ -277,7 +278,7 @@ set_limit: |
6062 | * Limit updates don't need to be mutex'd, since it isn't |
6063 | * critical that any racing fork()s follow the new limit. |
6064 | */ |
6065 | - pids->limit = limit; |
6066 | + atomic64_set(&pids->limit, limit); |
6067 | return nbytes; |
6068 | } |
6069 | |
6070 | @@ -285,7 +286,7 @@ static int pids_max_show(struct seq_file *sf, void *v) |
6071 | { |
6072 | struct cgroup_subsys_state *css = seq_css(sf); |
6073 | struct pids_cgroup *pids = css_pids(css); |
6074 | - int64_t limit = pids->limit; |
6075 | + int64_t limit = atomic64_read(&pids->limit); |
6076 | |
6077 | if (limit >= PIDS_MAX) |
6078 | seq_printf(sf, "%s\n", PIDS_MAX_STR); |
6079 | diff --git a/kernel/workqueue.c b/kernel/workqueue.c |
6080 | index bc2e09a8ea61..649687622654 100644 |
6081 | --- a/kernel/workqueue.c |
6082 | +++ b/kernel/workqueue.c |
6083 | @@ -2532,8 +2532,14 @@ repeat: |
6084 | */ |
6085 | if (need_to_create_worker(pool)) { |
6086 | spin_lock(&wq_mayday_lock); |
6087 | - get_pwq(pwq); |
6088 | - list_move_tail(&pwq->mayday_node, &wq->maydays); |
6089 | + /* |
6090 | + * Queue iff we aren't racing destruction |
6091 | + * and somebody else hasn't queued it already. |
6092 | + */ |
6093 | + if (wq->rescuer && list_empty(&pwq->mayday_node)) { |
6094 | + get_pwq(pwq); |
6095 | + list_add_tail(&pwq->mayday_node, &wq->maydays); |
6096 | + } |
6097 | spin_unlock(&wq_mayday_lock); |
6098 | } |
6099 | } |
6100 | @@ -4325,9 +4331,29 @@ void destroy_workqueue(struct workqueue_struct *wq) |
6101 | struct pool_workqueue *pwq; |
6102 | int node; |
6103 | |
6104 | + /* |
6105 | + * Remove it from sysfs first so that sanity check failure doesn't |
6106 | + * lead to sysfs name conflicts. |
6107 | + */ |
6108 | + workqueue_sysfs_unregister(wq); |
6109 | + |
6110 | /* drain it before proceeding with destruction */ |
6111 | drain_workqueue(wq); |
6112 | |
6113 | + /* kill rescuer, if sanity checks fail, leave it w/o rescuer */ |
6114 | + if (wq->rescuer) { |
6115 | + struct worker *rescuer = wq->rescuer; |
6116 | + |
6117 | + /* this prevents new queueing */ |
6118 | + spin_lock_irq(&wq_mayday_lock); |
6119 | + wq->rescuer = NULL; |
6120 | + spin_unlock_irq(&wq_mayday_lock); |
6121 | + |
6122 | + /* rescuer will empty maydays list before exiting */ |
6123 | + kthread_stop(rescuer->task); |
6124 | + kfree(rescuer); |
6125 | + } |
6126 | + |
6127 | /* sanity checks */ |
6128 | mutex_lock(&wq->mutex); |
6129 | for_each_pwq(pwq, wq) { |
6130 | @@ -4359,11 +4385,6 @@ void destroy_workqueue(struct workqueue_struct *wq) |
6131 | list_del_rcu(&wq->list); |
6132 | mutex_unlock(&wq_pool_mutex); |
6133 | |
6134 | - workqueue_sysfs_unregister(wq); |
6135 | - |
6136 | - if (wq->rescuer) |
6137 | - kthread_stop(wq->rescuer->task); |
6138 | - |
6139 | if (!(wq->flags & WQ_UNBOUND)) { |
6140 | wq_unregister_lockdep(wq); |
6141 | /* |
6142 | @@ -4638,7 +4659,8 @@ static void show_pwq(struct pool_workqueue *pwq) |
6143 | pr_info(" pwq %d:", pool->id); |
6144 | pr_cont_pool_info(pool); |
6145 | |
6146 | - pr_cont(" active=%d/%d%s\n", pwq->nr_active, pwq->max_active, |
6147 | + pr_cont(" active=%d/%d refcnt=%d%s\n", |
6148 | + pwq->nr_active, pwq->max_active, pwq->refcnt, |
6149 | !list_empty(&pwq->mayday_node) ? " MAYDAY" : ""); |
6150 | |
6151 | hash_for_each(pool->busy_hash, bkt, worker, hentry) { |
6152 | diff --git a/lib/raid6/unroll.awk b/lib/raid6/unroll.awk |
6153 | index c6aa03631df8..0809805a7e23 100644 |
6154 | --- a/lib/raid6/unroll.awk |
6155 | +++ b/lib/raid6/unroll.awk |
6156 | @@ -13,7 +13,7 @@ BEGIN { |
6157 | for (i = 0; i < rep; ++i) { |
6158 | tmp = $0 |
6159 | gsub(/\$\$/, i, tmp) |
6160 | - gsub(/\$\#/, n, tmp) |
6161 | + gsub(/\$#/, n, tmp) |
6162 | gsub(/\$\*/, "$", tmp) |
6163 | print tmp |
6164 | } |
6165 | diff --git a/mm/shmem.c b/mm/shmem.c |
6166 | index 220be9fa2c41..7a22e3e03d11 100644 |
6167 | --- a/mm/shmem.c |
6168 | +++ b/mm/shmem.c |
6169 | @@ -2213,11 +2213,14 @@ static int shmem_mmap(struct file *file, struct vm_area_struct *vma) |
6170 | return -EPERM; |
6171 | |
6172 | /* |
6173 | - * Since the F_SEAL_FUTURE_WRITE seals allow for a MAP_SHARED |
6174 | - * read-only mapping, take care to not allow mprotect to revert |
6175 | - * protections. |
6176 | + * Since an F_SEAL_FUTURE_WRITE sealed memfd can be mapped as |
6177 | + * MAP_SHARED and read-only, take care to not allow mprotect to |
6178 | + * revert protections on such mappings. Do this only for shared |
6179 | + * mappings. For private mappings, don't need to mask |
6180 | + * VM_MAYWRITE as we still want them to be COW-writable. |
6181 | */ |
6182 | - vma->vm_flags &= ~(VM_MAYWRITE); |
6183 | + if (vma->vm_flags & VM_SHARED) |
6184 | + vma->vm_flags &= ~(VM_MAYWRITE); |
6185 | } |
6186 | |
6187 | file_accessed(file); |
6188 | @@ -2742,7 +2745,7 @@ static long shmem_fallocate(struct file *file, int mode, loff_t offset, |
6189 | } |
6190 | |
6191 | shmem_falloc.waitq = &shmem_falloc_waitq; |
6192 | - shmem_falloc.start = unmap_start >> PAGE_SHIFT; |
6193 | + shmem_falloc.start = (u64)unmap_start >> PAGE_SHIFT; |
6194 | shmem_falloc.next = (unmap_end + 1) >> PAGE_SHIFT; |
6195 | spin_lock(&inode->i_lock); |
6196 | inode->i_private = &shmem_falloc; |
6197 | diff --git a/mm/slab_common.c b/mm/slab_common.c |
6198 | index f9fb27b4c843..78402b362df9 100644 |
6199 | --- a/mm/slab_common.c |
6200 | +++ b/mm/slab_common.c |
6201 | @@ -904,6 +904,18 @@ static void flush_memcg_workqueue(struct kmem_cache *s) |
6202 | * previous workitems on workqueue are processed. |
6203 | */ |
6204 | flush_workqueue(memcg_kmem_cache_wq); |
6205 | + |
6206 | + /* |
6207 | + * If we're racing with children kmem_cache deactivation, it might |
6208 | + * take another rcu grace period to complete their destruction. |
6209 | + * At this moment the corresponding percpu_ref_kill() call should be |
6210 | + * done, but it might take another rcu grace period to complete |
6211 | + * switching to the atomic mode. |
6212 | + * Please, note that we check without grabbing the slab_mutex. It's safe |
6213 | + * because at this moment the children list can't grow. |
6214 | + */ |
6215 | + if (!list_empty(&s->memcg_params.children)) |
6216 | + rcu_barrier(); |
6217 | } |
6218 | #else |
6219 | static inline int shutdown_memcg_caches(struct kmem_cache *s) |
6220 | diff --git a/sound/firewire/fireface/ff-pcm.c b/sound/firewire/fireface/ff-pcm.c |
6221 | index 9eab3ad283ce..df6ff2df0124 100644 |
6222 | --- a/sound/firewire/fireface/ff-pcm.c |
6223 | +++ b/sound/firewire/fireface/ff-pcm.c |
6224 | @@ -219,7 +219,7 @@ static int pcm_hw_params(struct snd_pcm_substream *substream, |
6225 | mutex_unlock(&ff->mutex); |
6226 | } |
6227 | |
6228 | - return 0; |
6229 | + return err; |
6230 | } |
6231 | |
6232 | static int pcm_hw_free(struct snd_pcm_substream *substream) |
6233 | diff --git a/sound/firewire/oxfw/oxfw-pcm.c b/sound/firewire/oxfw/oxfw-pcm.c |
6234 | index 7c6d1c277d4d..78d906af9c00 100644 |
6235 | --- a/sound/firewire/oxfw/oxfw-pcm.c |
6236 | +++ b/sound/firewire/oxfw/oxfw-pcm.c |
6237 | @@ -255,7 +255,7 @@ static int pcm_playback_hw_params(struct snd_pcm_substream *substream, |
6238 | mutex_unlock(&oxfw->mutex); |
6239 | } |
6240 | |
6241 | - return 0; |
6242 | + return err; |
6243 | } |
6244 | |
6245 | static int pcm_capture_hw_free(struct snd_pcm_substream *substream) |
6246 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c |
6247 | index ed3e314b5233..e1229dbad6b2 100644 |
6248 | --- a/sound/pci/hda/patch_realtek.c |
6249 | +++ b/sound/pci/hda/patch_realtek.c |
6250 | @@ -7672,11 +7672,6 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = { |
6251 | {0x1a, 0x90a70130}, |
6252 | {0x1b, 0x90170110}, |
6253 | {0x21, 0x03211020}), |
6254 | - SND_HDA_PIN_QUIRK(0x10ec0274, 0x1028, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB, |
6255 | - {0x12, 0xb7a60130}, |
6256 | - {0x13, 0xb8a61140}, |
6257 | - {0x16, 0x90170110}, |
6258 | - {0x21, 0x04211020}), |
6259 | SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC280_FIXUP_HP_GPIO4, |
6260 | {0x12, 0x90a60130}, |
6261 | {0x14, 0x90170110}, |
6262 | @@ -7864,6 +7859,9 @@ static const struct snd_hda_pin_quirk alc269_fallback_pin_fixup_tbl[] = { |
6263 | SND_HDA_PIN_QUIRK(0x10ec0289, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, |
6264 | {0x19, 0x40000000}, |
6265 | {0x1b, 0x40000000}), |
6266 | + SND_HDA_PIN_QUIRK(0x10ec0274, 0x1028, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB, |
6267 | + {0x19, 0x40000000}, |
6268 | + {0x1a, 0x40000000}), |
6269 | {} |
6270 | }; |
6271 | |
6272 | diff --git a/sound/soc/codecs/rt5645.c b/sound/soc/codecs/rt5645.c |
6273 | index 1c06b3b9218c..19662ee330d6 100644 |
6274 | --- a/sound/soc/codecs/rt5645.c |
6275 | +++ b/sound/soc/codecs/rt5645.c |
6276 | @@ -3270,6 +3270,9 @@ static void rt5645_jack_detect_work(struct work_struct *work) |
6277 | snd_soc_jack_report(rt5645->mic_jack, |
6278 | report, SND_JACK_MICROPHONE); |
6279 | return; |
6280 | + case 4: |
6281 | + val = snd_soc_component_read32(rt5645->component, RT5645_A_JD_CTRL1) & 0x0020; |
6282 | + break; |
6283 | default: /* read rt5645 jd1_1 status */ |
6284 | val = snd_soc_component_read32(rt5645->component, RT5645_INT_IRQ_ST) & 0x1000; |
6285 | break; |
6286 | @@ -3603,7 +3606,7 @@ static const struct rt5645_platform_data intel_braswell_platform_data = { |
6287 | static const struct rt5645_platform_data buddy_platform_data = { |
6288 | .dmic1_data_pin = RT5645_DMIC_DATA_GPIO5, |
6289 | .dmic2_data_pin = RT5645_DMIC_DATA_IN2P, |
6290 | - .jd_mode = 3, |
6291 | + .jd_mode = 4, |
6292 | .level_trigger_irq = true, |
6293 | }; |
6294 | |
6295 | @@ -3999,6 +4002,7 @@ static int rt5645_i2c_probe(struct i2c_client *i2c, |
6296 | RT5645_JD1_MODE_1); |
6297 | break; |
6298 | case 3: |
6299 | + case 4: |
6300 | regmap_update_bits(rt5645->regmap, RT5645_A_JD_CTRL1, |
6301 | RT5645_JD1_MODE_MASK, |
6302 | RT5645_JD1_MODE_2); |
6303 | diff --git a/sound/soc/fsl/fsl_audmix.c b/sound/soc/fsl/fsl_audmix.c |
6304 | index c7e4e9757dce..a1db1bce330f 100644 |
6305 | --- a/sound/soc/fsl/fsl_audmix.c |
6306 | +++ b/sound/soc/fsl/fsl_audmix.c |
6307 | @@ -286,6 +286,7 @@ static int fsl_audmix_dai_trigger(struct snd_pcm_substream *substream, int cmd, |
6308 | struct snd_soc_dai *dai) |
6309 | { |
6310 | struct fsl_audmix *priv = snd_soc_dai_get_drvdata(dai); |
6311 | + unsigned long lock_flags; |
6312 | |
6313 | /* Capture stream shall not be handled */ |
6314 | if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) |
6315 | @@ -295,12 +296,16 @@ static int fsl_audmix_dai_trigger(struct snd_pcm_substream *substream, int cmd, |
6316 | case SNDRV_PCM_TRIGGER_START: |
6317 | case SNDRV_PCM_TRIGGER_RESUME: |
6318 | case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: |
6319 | + spin_lock_irqsave(&priv->lock, lock_flags); |
6320 | priv->tdms |= BIT(dai->driver->id); |
6321 | + spin_unlock_irqrestore(&priv->lock, lock_flags); |
6322 | break; |
6323 | case SNDRV_PCM_TRIGGER_STOP: |
6324 | case SNDRV_PCM_TRIGGER_SUSPEND: |
6325 | case SNDRV_PCM_TRIGGER_PAUSE_PUSH: |
6326 | + spin_lock_irqsave(&priv->lock, lock_flags); |
6327 | priv->tdms &= ~BIT(dai->driver->id); |
6328 | + spin_unlock_irqrestore(&priv->lock, lock_flags); |
6329 | break; |
6330 | default: |
6331 | return -EINVAL; |
6332 | @@ -491,6 +496,7 @@ static int fsl_audmix_probe(struct platform_device *pdev) |
6333 | return PTR_ERR(priv->ipg_clk); |
6334 | } |
6335 | |
6336 | + spin_lock_init(&priv->lock); |
6337 | platform_set_drvdata(pdev, priv); |
6338 | pm_runtime_enable(dev); |
6339 | |
6340 | diff --git a/sound/soc/fsl/fsl_audmix.h b/sound/soc/fsl/fsl_audmix.h |
6341 | index 7812ffec45c5..479f05695d53 100644 |
6342 | --- a/sound/soc/fsl/fsl_audmix.h |
6343 | +++ b/sound/soc/fsl/fsl_audmix.h |
6344 | @@ -96,6 +96,7 @@ struct fsl_audmix { |
6345 | struct platform_device *pdev; |
6346 | struct regmap *regmap; |
6347 | struct clk *ipg_clk; |
6348 | + spinlock_t lock; /* Protect tdms */ |
6349 | u8 tdms; |
6350 | }; |
6351 | |
6352 | diff --git a/sound/soc/soc-jack.c b/sound/soc/soc-jack.c |
6353 | index a71d2340eb05..b5748dcd490f 100644 |
6354 | --- a/sound/soc/soc-jack.c |
6355 | +++ b/sound/soc/soc-jack.c |
6356 | @@ -82,10 +82,9 @@ void snd_soc_jack_report(struct snd_soc_jack *jack, int status, int mask) |
6357 | unsigned int sync = 0; |
6358 | int enable; |
6359 | |
6360 | - trace_snd_soc_jack_report(jack, mask, status); |
6361 | - |
6362 | if (!jack) |
6363 | return; |
6364 | + trace_snd_soc_jack_report(jack, mask, status); |
6365 | |
6366 | dapm = &jack->card->dapm; |
6367 | |
6368 | diff --git a/tools/perf/tests/backward-ring-buffer.c b/tools/perf/tests/backward-ring-buffer.c |
6369 | index 338cd9faa835..5128f727c0ef 100644 |
6370 | --- a/tools/perf/tests/backward-ring-buffer.c |
6371 | +++ b/tools/perf/tests/backward-ring-buffer.c |
6372 | @@ -147,6 +147,15 @@ int test__backward_ring_buffer(struct test *test __maybe_unused, int subtest __m |
6373 | goto out_delete_evlist; |
6374 | } |
6375 | |
6376 | + evlist__close(evlist); |
6377 | + |
6378 | + err = evlist__open(evlist); |
6379 | + if (err < 0) { |
6380 | + pr_debug("perf_evlist__open: %s\n", |
6381 | + str_error_r(errno, sbuf, sizeof(sbuf))); |
6382 | + goto out_delete_evlist; |
6383 | + } |
6384 | + |
6385 | err = do_test(evlist, 1, &sample_count, &comm_count); |
6386 | if (err != TEST_OK) |
6387 | goto out_delete_evlist; |
6388 | diff --git a/tools/testing/selftests/seccomp/seccomp_bpf.c b/tools/testing/selftests/seccomp/seccomp_bpf.c |
6389 | index 7f8b5c8982e3..b505bb062d07 100644 |
6390 | --- a/tools/testing/selftests/seccomp/seccomp_bpf.c |
6391 | +++ b/tools/testing/selftests/seccomp/seccomp_bpf.c |
6392 | @@ -35,6 +35,7 @@ |
6393 | #include <stdbool.h> |
6394 | #include <string.h> |
6395 | #include <time.h> |
6396 | +#include <limits.h> |
6397 | #include <linux/elf.h> |
6398 | #include <sys/uio.h> |
6399 | #include <sys/utsname.h> |
6400 | @@ -3077,7 +3078,7 @@ static int user_trap_syscall(int nr, unsigned int flags) |
6401 | return seccomp(SECCOMP_SET_MODE_FILTER, flags, &prog); |
6402 | } |
6403 | |
6404 | -#define USER_NOTIF_MAGIC 116983961184613L |
6405 | +#define USER_NOTIF_MAGIC INT_MAX |
6406 | TEST(user_notification_basic) |
6407 | { |
6408 | pid_t pid; |