Contents of /trunk/kernel-magellan/patches-4.15/0106-4.15.7-all-fixes.patch
Parent Directory | Revision Log
Revision 3090 -
(show annotations)
(download)
Wed Mar 21 14:52:38 2018 UTC (6 years, 6 months ago) by niro
File size: 68791 byte(s)
Wed Mar 21 14:52:38 2018 UTC (6 years, 6 months ago) by niro
File size: 68791 byte(s)
-linux-4.15.7
1 | diff --git a/Makefile b/Makefile |
2 | index 51563c76bdf6..49f524444050 100644 |
3 | --- a/Makefile |
4 | +++ b/Makefile |
5 | @@ -1,7 +1,7 @@ |
6 | # SPDX-License-Identifier: GPL-2.0 |
7 | VERSION = 4 |
8 | PATCHLEVEL = 15 |
9 | -SUBLEVEL = 6 |
10 | +SUBLEVEL = 7 |
11 | EXTRAVERSION = |
12 | NAME = Fearless Coyote |
13 | |
14 | diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c |
15 | index 46dee071bab1..1bcf03b5cd04 100644 |
16 | --- a/arch/arm64/kernel/cpufeature.c |
17 | +++ b/arch/arm64/kernel/cpufeature.c |
18 | @@ -197,9 +197,11 @@ static const struct arm64_ftr_bits ftr_id_aa64mmfr2[] = { |
19 | }; |
20 | |
21 | static const struct arm64_ftr_bits ftr_ctr[] = { |
22 | - ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_EXACT, 31, 1, 1), /* RAO */ |
23 | + ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_EXACT, 31, 1, 1), /* RES1 */ |
24 | + ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, 29, 1, 1), /* DIC */ |
25 | + ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, 28, 1, 1), /* IDC */ |
26 | ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_HIGHER_SAFE, 24, 4, 0), /* CWG */ |
27 | - ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, 20, 4, 0), /* ERG */ |
28 | + ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_HIGHER_SAFE, 20, 4, 0), /* ERG */ |
29 | ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, 16, 4, 1), /* DminLine */ |
30 | /* |
31 | * Linux can handle differing I-cache policies. Userspace JITs will |
32 | diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c |
33 | index 583fd8154695..d6ca5fccb229 100644 |
34 | --- a/arch/arm64/kernel/process.c |
35 | +++ b/arch/arm64/kernel/process.c |
36 | @@ -221,8 +221,15 @@ void __show_regs(struct pt_regs *regs) |
37 | |
38 | show_regs_print_info(KERN_DEFAULT); |
39 | print_pstate(regs); |
40 | - print_symbol("pc : %s\n", regs->pc); |
41 | - print_symbol("lr : %s\n", lr); |
42 | + |
43 | + if (!user_mode(regs)) { |
44 | + print_symbol("pc : %s\n", regs->pc); |
45 | + print_symbol("lr : %s\n", lr); |
46 | + } else { |
47 | + printk("pc : %016llx\n", regs->pc); |
48 | + printk("lr : %016llx\n", lr); |
49 | + } |
50 | + |
51 | printk("sp : %016llx\n", sp); |
52 | |
53 | i = top_reg; |
54 | diff --git a/arch/arm64/kernel/traps.c b/arch/arm64/kernel/traps.c |
55 | index 3d3588fcd1c7..c759d9ca0e5a 100644 |
56 | --- a/arch/arm64/kernel/traps.c |
57 | +++ b/arch/arm64/kernel/traps.c |
58 | @@ -57,7 +57,7 @@ static const char *handler[]= { |
59 | "Error" |
60 | }; |
61 | |
62 | -int show_unhandled_signals = 1; |
63 | +int show_unhandled_signals = 0; |
64 | |
65 | static void dump_backtrace_entry(unsigned long where) |
66 | { |
67 | @@ -526,14 +526,6 @@ asmlinkage long do_ni_syscall(struct pt_regs *regs) |
68 | } |
69 | #endif |
70 | |
71 | - if (show_unhandled_signals_ratelimited()) { |
72 | - pr_info("%s[%d]: syscall %d\n", current->comm, |
73 | - task_pid_nr(current), regs->syscallno); |
74 | - dump_instr("", regs); |
75 | - if (user_mode(regs)) |
76 | - __show_regs(regs); |
77 | - } |
78 | - |
79 | return sys_ni_syscall(); |
80 | } |
81 | |
82 | diff --git a/arch/arm64/mm/proc.S b/arch/arm64/mm/proc.S |
83 | index 248f2e7b24ab..a233975848cc 100644 |
84 | --- a/arch/arm64/mm/proc.S |
85 | +++ b/arch/arm64/mm/proc.S |
86 | @@ -155,7 +155,7 @@ ENDPROC(cpu_do_switch_mm) |
87 | |
88 | .macro __idmap_cpu_set_reserved_ttbr1, tmp1, tmp2 |
89 | adrp \tmp1, empty_zero_page |
90 | - msr ttbr1_el1, \tmp2 |
91 | + msr ttbr1_el1, \tmp1 |
92 | isb |
93 | tlbi vmalle1 |
94 | dsb nsh |
95 | diff --git a/arch/microblaze/Makefile b/arch/microblaze/Makefile |
96 | index 830ee7d42fa0..d269dd4b8279 100644 |
97 | --- a/arch/microblaze/Makefile |
98 | +++ b/arch/microblaze/Makefile |
99 | @@ -36,16 +36,21 @@ endif |
100 | CPUFLAGS-$(CONFIG_XILINX_MICROBLAZE0_USE_DIV) += -mno-xl-soft-div |
101 | CPUFLAGS-$(CONFIG_XILINX_MICROBLAZE0_USE_BARREL) += -mxl-barrel-shift |
102 | CPUFLAGS-$(CONFIG_XILINX_MICROBLAZE0_USE_PCMP_INSTR) += -mxl-pattern-compare |
103 | -CPUFLAGS-$(CONFIG_BIG_ENDIAN) += -mbig-endian |
104 | -CPUFLAGS-$(CONFIG_LITTLE_ENDIAN) += -mlittle-endian |
105 | + |
106 | +ifdef CONFIG_CPU_BIG_ENDIAN |
107 | +KBUILD_CFLAGS += -mbig-endian |
108 | +KBUILD_AFLAGS += -mbig-endian |
109 | +LD += -EB |
110 | +else |
111 | +KBUILD_CFLAGS += -mlittle-endian |
112 | +KBUILD_AFLAGS += -mlittle-endian |
113 | +LD += -EL |
114 | +endif |
115 | |
116 | CPUFLAGS-1 += $(call cc-option,-mcpu=v$(CPU_VER)) |
117 | |
118 | # r31 holds current when in kernel mode |
119 | -KBUILD_CFLAGS += -ffixed-r31 $(CPUFLAGS-1) $(CPUFLAGS-2) |
120 | - |
121 | -LDFLAGS := |
122 | -LDFLAGS_vmlinux := |
123 | +KBUILD_CFLAGS += -ffixed-r31 $(CPUFLAGS-y) $(CPUFLAGS-1) $(CPUFLAGS-2) |
124 | |
125 | head-y := arch/microblaze/kernel/head.o |
126 | libs-y += arch/microblaze/lib/ |
127 | diff --git a/arch/mips/boot/Makefile b/arch/mips/boot/Makefile |
128 | index 1bd5c4f00d19..c22da16d67b8 100644 |
129 | --- a/arch/mips/boot/Makefile |
130 | +++ b/arch/mips/boot/Makefile |
131 | @@ -126,6 +126,7 @@ $(obj)/vmlinux.its.S: $(addprefix $(srctree)/arch/mips/$(PLATFORM)/,$(ITS_INPUTS |
132 | |
133 | quiet_cmd_cpp_its_S = ITS $@ |
134 | cmd_cpp_its_S = $(CPP) $(cpp_flags) -P -C -o $@ $< \ |
135 | + -D__ASSEMBLY__ \ |
136 | -DKERNEL_NAME="\"Linux $(KERNELRELEASE)\"" \ |
137 | -DVMLINUX_BINARY="\"$(3)\"" \ |
138 | -DVMLINUX_COMPRESSION="\"$(2)\"" \ |
139 | diff --git a/arch/mips/include/asm/compat.h b/arch/mips/include/asm/compat.h |
140 | index 49691331ada4..08ec0762ca50 100644 |
141 | --- a/arch/mips/include/asm/compat.h |
142 | +++ b/arch/mips/include/asm/compat.h |
143 | @@ -86,7 +86,6 @@ struct compat_flock { |
144 | compat_off_t l_len; |
145 | s32 l_sysid; |
146 | compat_pid_t l_pid; |
147 | - short __unused; |
148 | s32 pad[4]; |
149 | }; |
150 | |
151 | diff --git a/arch/x86/kernel/apic/vector.c b/arch/x86/kernel/apic/vector.c |
152 | index 3cc471beb50b..bb6f7a2148d7 100644 |
153 | --- a/arch/x86/kernel/apic/vector.c |
154 | +++ b/arch/x86/kernel/apic/vector.c |
155 | @@ -134,21 +134,40 @@ static void apic_update_vector(struct irq_data *irqd, unsigned int newvec, |
156 | { |
157 | struct apic_chip_data *apicd = apic_chip_data(irqd); |
158 | struct irq_desc *desc = irq_data_to_desc(irqd); |
159 | + bool managed = irqd_affinity_is_managed(irqd); |
160 | |
161 | lockdep_assert_held(&vector_lock); |
162 | |
163 | trace_vector_update(irqd->irq, newvec, newcpu, apicd->vector, |
164 | apicd->cpu); |
165 | |
166 | - /* Setup the vector move, if required */ |
167 | - if (apicd->vector && cpu_online(apicd->cpu)) { |
168 | + /* |
169 | + * If there is no vector associated or if the associated vector is |
170 | + * the shutdown vector, which is associated to make PCI/MSI |
171 | + * shutdown mode work, then there is nothing to release. Clear out |
172 | + * prev_vector for this and the offlined target case. |
173 | + */ |
174 | + apicd->prev_vector = 0; |
175 | + if (!apicd->vector || apicd->vector == MANAGED_IRQ_SHUTDOWN_VECTOR) |
176 | + goto setnew; |
177 | + /* |
178 | + * If the target CPU of the previous vector is online, then mark |
179 | + * the vector as move in progress and store it for cleanup when the |
180 | + * first interrupt on the new vector arrives. If the target CPU is |
181 | + * offline then the regular release mechanism via the cleanup |
182 | + * vector is not possible and the vector can be immediately freed |
183 | + * in the underlying matrix allocator. |
184 | + */ |
185 | + if (cpu_online(apicd->cpu)) { |
186 | apicd->move_in_progress = true; |
187 | apicd->prev_vector = apicd->vector; |
188 | apicd->prev_cpu = apicd->cpu; |
189 | } else { |
190 | - apicd->prev_vector = 0; |
191 | + irq_matrix_free(vector_matrix, apicd->cpu, apicd->vector, |
192 | + managed); |
193 | } |
194 | |
195 | +setnew: |
196 | apicd->vector = newvec; |
197 | apicd->cpu = newcpu; |
198 | BUG_ON(!IS_ERR_OR_NULL(per_cpu(vector_irq, newcpu)[newvec])); |
199 | diff --git a/arch/x86/oprofile/nmi_int.c b/arch/x86/oprofile/nmi_int.c |
200 | index 174c59774cc9..a7a7677265b6 100644 |
201 | --- a/arch/x86/oprofile/nmi_int.c |
202 | +++ b/arch/x86/oprofile/nmi_int.c |
203 | @@ -460,7 +460,7 @@ static int nmi_setup(void) |
204 | goto fail; |
205 | |
206 | for_each_possible_cpu(cpu) { |
207 | - if (!cpu) |
208 | + if (!IS_ENABLED(CONFIG_SMP) || !cpu) |
209 | continue; |
210 | |
211 | memcpy(per_cpu(cpu_msrs, cpu).counters, |
212 | diff --git a/arch/xtensa/mm/init.c b/arch/xtensa/mm/init.c |
213 | index 720fe4e8b497..8dad076661fc 100644 |
214 | --- a/arch/xtensa/mm/init.c |
215 | +++ b/arch/xtensa/mm/init.c |
216 | @@ -79,19 +79,75 @@ void __init zones_init(void) |
217 | free_area_init_node(0, zones_size, ARCH_PFN_OFFSET, NULL); |
218 | } |
219 | |
220 | +#ifdef CONFIG_HIGHMEM |
221 | +static void __init free_area_high(unsigned long pfn, unsigned long end) |
222 | +{ |
223 | + for (; pfn < end; pfn++) |
224 | + free_highmem_page(pfn_to_page(pfn)); |
225 | +} |
226 | + |
227 | +static void __init free_highpages(void) |
228 | +{ |
229 | + unsigned long max_low = max_low_pfn; |
230 | + struct memblock_region *mem, *res; |
231 | + |
232 | + reset_all_zones_managed_pages(); |
233 | + /* set highmem page free */ |
234 | + for_each_memblock(memory, mem) { |
235 | + unsigned long start = memblock_region_memory_base_pfn(mem); |
236 | + unsigned long end = memblock_region_memory_end_pfn(mem); |
237 | + |
238 | + /* Ignore complete lowmem entries */ |
239 | + if (end <= max_low) |
240 | + continue; |
241 | + |
242 | + if (memblock_is_nomap(mem)) |
243 | + continue; |
244 | + |
245 | + /* Truncate partial highmem entries */ |
246 | + if (start < max_low) |
247 | + start = max_low; |
248 | + |
249 | + /* Find and exclude any reserved regions */ |
250 | + for_each_memblock(reserved, res) { |
251 | + unsigned long res_start, res_end; |
252 | + |
253 | + res_start = memblock_region_reserved_base_pfn(res); |
254 | + res_end = memblock_region_reserved_end_pfn(res); |
255 | + |
256 | + if (res_end < start) |
257 | + continue; |
258 | + if (res_start < start) |
259 | + res_start = start; |
260 | + if (res_start > end) |
261 | + res_start = end; |
262 | + if (res_end > end) |
263 | + res_end = end; |
264 | + if (res_start != start) |
265 | + free_area_high(start, res_start); |
266 | + start = res_end; |
267 | + if (start == end) |
268 | + break; |
269 | + } |
270 | + |
271 | + /* And now free anything which remains */ |
272 | + if (start < end) |
273 | + free_area_high(start, end); |
274 | + } |
275 | +} |
276 | +#else |
277 | +static void __init free_highpages(void) |
278 | +{ |
279 | +} |
280 | +#endif |
281 | + |
282 | /* |
283 | * Initialize memory pages. |
284 | */ |
285 | |
286 | void __init mem_init(void) |
287 | { |
288 | -#ifdef CONFIG_HIGHMEM |
289 | - unsigned long tmp; |
290 | - |
291 | - reset_all_zones_managed_pages(); |
292 | - for (tmp = max_low_pfn; tmp < max_pfn; tmp++) |
293 | - free_highmem_page(pfn_to_page(tmp)); |
294 | -#endif |
295 | + free_highpages(); |
296 | |
297 | max_mapnr = max_pfn - ARCH_PFN_OFFSET; |
298 | high_memory = (void *)__va(max_low_pfn << PAGE_SHIFT); |
299 | diff --git a/crypto/asymmetric_keys/pkcs7_verify.c b/crypto/asymmetric_keys/pkcs7_verify.c |
300 | index 39e6de0c2761..97c77f66b20d 100644 |
301 | --- a/crypto/asymmetric_keys/pkcs7_verify.c |
302 | +++ b/crypto/asymmetric_keys/pkcs7_verify.c |
303 | @@ -270,7 +270,7 @@ static int pkcs7_verify_sig_chain(struct pkcs7_message *pkcs7, |
304 | sinfo->index); |
305 | return 0; |
306 | } |
307 | - ret = public_key_verify_signature(p->pub, p->sig); |
308 | + ret = public_key_verify_signature(p->pub, x509->sig); |
309 | if (ret < 0) |
310 | return ret; |
311 | x509->signer = p; |
312 | @@ -366,8 +366,7 @@ static int pkcs7_verify_one(struct pkcs7_message *pkcs7, |
313 | * |
314 | * (*) -EBADMSG if some part of the message was invalid, or: |
315 | * |
316 | - * (*) 0 if no signature chains were found to be blacklisted or to contain |
317 | - * unsupported crypto, or: |
318 | + * (*) 0 if a signature chain passed verification, or: |
319 | * |
320 | * (*) -EKEYREJECTED if a blacklisted key was encountered, or: |
321 | * |
322 | @@ -423,8 +422,11 @@ int pkcs7_verify(struct pkcs7_message *pkcs7, |
323 | |
324 | for (sinfo = pkcs7->signed_infos; sinfo; sinfo = sinfo->next) { |
325 | ret = pkcs7_verify_one(pkcs7, sinfo); |
326 | - if (sinfo->blacklisted && actual_ret == -ENOPKG) |
327 | - actual_ret = -EKEYREJECTED; |
328 | + if (sinfo->blacklisted) { |
329 | + if (actual_ret == -ENOPKG) |
330 | + actual_ret = -EKEYREJECTED; |
331 | + continue; |
332 | + } |
333 | if (ret < 0) { |
334 | if (ret == -ENOPKG) { |
335 | sinfo->unsupported_crypto = true; |
336 | diff --git a/crypto/asymmetric_keys/public_key.c b/crypto/asymmetric_keys/public_key.c |
337 | index de996586762a..e929fe1e4106 100644 |
338 | --- a/crypto/asymmetric_keys/public_key.c |
339 | +++ b/crypto/asymmetric_keys/public_key.c |
340 | @@ -79,9 +79,11 @@ int public_key_verify_signature(const struct public_key *pkey, |
341 | |
342 | BUG_ON(!pkey); |
343 | BUG_ON(!sig); |
344 | - BUG_ON(!sig->digest); |
345 | BUG_ON(!sig->s); |
346 | |
347 | + if (!sig->digest) |
348 | + return -ENOPKG; |
349 | + |
350 | alg_name = sig->pkey_algo; |
351 | if (strcmp(sig->pkey_algo, "rsa") == 0) { |
352 | /* The data wangled by the RSA algorithm is typically padded |
353 | diff --git a/crypto/asymmetric_keys/restrict.c b/crypto/asymmetric_keys/restrict.c |
354 | index 86fb68508952..7c93c7728454 100644 |
355 | --- a/crypto/asymmetric_keys/restrict.c |
356 | +++ b/crypto/asymmetric_keys/restrict.c |
357 | @@ -67,8 +67,9 @@ __setup("ca_keys=", ca_keys_setup); |
358 | * |
359 | * Returns 0 if the new certificate was accepted, -ENOKEY if we couldn't find a |
360 | * matching parent certificate in the trusted list, -EKEYREJECTED if the |
361 | - * signature check fails or the key is blacklisted and some other error if |
362 | - * there is a matching certificate but the signature check cannot be performed. |
363 | + * signature check fails or the key is blacklisted, -ENOPKG if the signature |
364 | + * uses unsupported crypto, or some other error if there is a matching |
365 | + * certificate but the signature check cannot be performed. |
366 | */ |
367 | int restrict_link_by_signature(struct key *dest_keyring, |
368 | const struct key_type *type, |
369 | @@ -88,6 +89,8 @@ int restrict_link_by_signature(struct key *dest_keyring, |
370 | return -EOPNOTSUPP; |
371 | |
372 | sig = payload->data[asym_auth]; |
373 | + if (!sig) |
374 | + return -ENOPKG; |
375 | if (!sig->auth_ids[0] && !sig->auth_ids[1]) |
376 | return -ENOKEY; |
377 | |
378 | @@ -139,6 +142,8 @@ static int key_or_keyring_common(struct key *dest_keyring, |
379 | return -EOPNOTSUPP; |
380 | |
381 | sig = payload->data[asym_auth]; |
382 | + if (!sig) |
383 | + return -ENOPKG; |
384 | if (!sig->auth_ids[0] && !sig->auth_ids[1]) |
385 | return -ENOKEY; |
386 | |
387 | @@ -222,9 +227,9 @@ static int key_or_keyring_common(struct key *dest_keyring, |
388 | * |
389 | * Returns 0 if the new certificate was accepted, -ENOKEY if we |
390 | * couldn't find a matching parent certificate in the trusted list, |
391 | - * -EKEYREJECTED if the signature check fails, and some other error if |
392 | - * there is a matching certificate but the signature check cannot be |
393 | - * performed. |
394 | + * -EKEYREJECTED if the signature check fails, -ENOPKG if the signature uses |
395 | + * unsupported crypto, or some other error if there is a matching certificate |
396 | + * but the signature check cannot be performed. |
397 | */ |
398 | int restrict_link_by_key_or_keyring(struct key *dest_keyring, |
399 | const struct key_type *type, |
400 | @@ -249,9 +254,9 @@ int restrict_link_by_key_or_keyring(struct key *dest_keyring, |
401 | * |
402 | * Returns 0 if the new certificate was accepted, -ENOKEY if we |
403 | * couldn't find a matching parent certificate in the trusted list, |
404 | - * -EKEYREJECTED if the signature check fails, and some other error if |
405 | - * there is a matching certificate but the signature check cannot be |
406 | - * performed. |
407 | + * -EKEYREJECTED if the signature check fails, -ENOPKG if the signature uses |
408 | + * unsupported crypto, or some other error if there is a matching certificate |
409 | + * but the signature check cannot be performed. |
410 | */ |
411 | int restrict_link_by_key_or_keyring_chain(struct key *dest_keyring, |
412 | const struct key_type *type, |
413 | diff --git a/drivers/extcon/extcon-intel-int3496.c b/drivers/extcon/extcon-intel-int3496.c |
414 | index c8691b5a9cb0..191e99f06a9a 100644 |
415 | --- a/drivers/extcon/extcon-intel-int3496.c |
416 | +++ b/drivers/extcon/extcon-intel-int3496.c |
417 | @@ -153,8 +153,9 @@ static int int3496_probe(struct platform_device *pdev) |
418 | return ret; |
419 | } |
420 | |
421 | - /* queue initial processing of id-pin */ |
422 | + /* process id-pin so that we start with the right status */ |
423 | queue_delayed_work(system_wq, &data->work, 0); |
424 | + flush_delayed_work(&data->work); |
425 | |
426 | platform_set_drvdata(pdev, data); |
427 | |
428 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c |
429 | index c13c51af0b68..c53095b3b0fb 100644 |
430 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c |
431 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c |
432 | @@ -14,6 +14,16 @@ |
433 | |
434 | #include "amd_acpi.h" |
435 | |
436 | +#define AMDGPU_PX_QUIRK_FORCE_ATPX (1 << 0) |
437 | + |
438 | +struct amdgpu_px_quirk { |
439 | + u32 chip_vendor; |
440 | + u32 chip_device; |
441 | + u32 subsys_vendor; |
442 | + u32 subsys_device; |
443 | + u32 px_quirk_flags; |
444 | +}; |
445 | + |
446 | struct amdgpu_atpx_functions { |
447 | bool px_params; |
448 | bool power_cntl; |
449 | @@ -35,6 +45,7 @@ struct amdgpu_atpx { |
450 | static struct amdgpu_atpx_priv { |
451 | bool atpx_detected; |
452 | bool bridge_pm_usable; |
453 | + unsigned int quirks; |
454 | /* handle for device - and atpx */ |
455 | acpi_handle dhandle; |
456 | acpi_handle other_handle; |
457 | @@ -205,13 +216,19 @@ static int amdgpu_atpx_validate(struct amdgpu_atpx *atpx) |
458 | |
459 | atpx->is_hybrid = false; |
460 | if (valid_bits & ATPX_MS_HYBRID_GFX_SUPPORTED) { |
461 | - printk("ATPX Hybrid Graphics\n"); |
462 | - /* |
463 | - * Disable legacy PM methods only when pcie port PM is usable, |
464 | - * otherwise the device might fail to power off or power on. |
465 | - */ |
466 | - atpx->functions.power_cntl = !amdgpu_atpx_priv.bridge_pm_usable; |
467 | - atpx->is_hybrid = true; |
468 | + if (amdgpu_atpx_priv.quirks & AMDGPU_PX_QUIRK_FORCE_ATPX) { |
469 | + printk("ATPX Hybrid Graphics, forcing to ATPX\n"); |
470 | + atpx->functions.power_cntl = true; |
471 | + atpx->is_hybrid = false; |
472 | + } else { |
473 | + printk("ATPX Hybrid Graphics\n"); |
474 | + /* |
475 | + * Disable legacy PM methods only when pcie port PM is usable, |
476 | + * otherwise the device might fail to power off or power on. |
477 | + */ |
478 | + atpx->functions.power_cntl = !amdgpu_atpx_priv.bridge_pm_usable; |
479 | + atpx->is_hybrid = true; |
480 | + } |
481 | } |
482 | |
483 | atpx->dgpu_req_power_for_displays = false; |
484 | @@ -547,6 +564,31 @@ static const struct vga_switcheroo_handler amdgpu_atpx_handler = { |
485 | .get_client_id = amdgpu_atpx_get_client_id, |
486 | }; |
487 | |
488 | +static const struct amdgpu_px_quirk amdgpu_px_quirk_list[] = { |
489 | + /* HG _PR3 doesn't seem to work on this A+A weston board */ |
490 | + { 0x1002, 0x6900, 0x1002, 0x0124, AMDGPU_PX_QUIRK_FORCE_ATPX }, |
491 | + { 0x1002, 0x6900, 0x1028, 0x0812, AMDGPU_PX_QUIRK_FORCE_ATPX }, |
492 | + { 0x1002, 0x6900, 0x1028, 0x0813, AMDGPU_PX_QUIRK_FORCE_ATPX }, |
493 | + { 0, 0, 0, 0, 0 }, |
494 | +}; |
495 | + |
496 | +static void amdgpu_atpx_get_quirks(struct pci_dev *pdev) |
497 | +{ |
498 | + const struct amdgpu_px_quirk *p = amdgpu_px_quirk_list; |
499 | + |
500 | + /* Apply PX quirks */ |
501 | + while (p && p->chip_device != 0) { |
502 | + if (pdev->vendor == p->chip_vendor && |
503 | + pdev->device == p->chip_device && |
504 | + pdev->subsystem_vendor == p->subsys_vendor && |
505 | + pdev->subsystem_device == p->subsys_device) { |
506 | + amdgpu_atpx_priv.quirks |= p->px_quirk_flags; |
507 | + break; |
508 | + } |
509 | + ++p; |
510 | + } |
511 | +} |
512 | + |
513 | /** |
514 | * amdgpu_atpx_detect - detect whether we have PX |
515 | * |
516 | @@ -570,6 +612,7 @@ static bool amdgpu_atpx_detect(void) |
517 | |
518 | parent_pdev = pci_upstream_bridge(pdev); |
519 | d3_supported |= parent_pdev && parent_pdev->bridge_d3; |
520 | + amdgpu_atpx_get_quirks(pdev); |
521 | } |
522 | |
523 | while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_OTHER << 8, pdev)) != NULL) { |
524 | @@ -579,6 +622,7 @@ static bool amdgpu_atpx_detect(void) |
525 | |
526 | parent_pdev = pci_upstream_bridge(pdev); |
527 | d3_supported |= parent_pdev && parent_pdev->bridge_d3; |
528 | + amdgpu_atpx_get_quirks(pdev); |
529 | } |
530 | |
531 | if (has_atpx && vga_count == 2) { |
532 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c |
533 | index 57abf7abd7a9..b9cfcffbf80f 100644 |
534 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c |
535 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c |
536 | @@ -865,8 +865,8 @@ static int amdgpu_cs_ib_vm_chunk(struct amdgpu_device *adev, |
537 | struct amdgpu_bo_va_mapping *m; |
538 | struct amdgpu_bo *aobj = NULL; |
539 | struct amdgpu_cs_chunk *chunk; |
540 | + uint64_t offset, va_start; |
541 | struct amdgpu_ib *ib; |
542 | - uint64_t offset; |
543 | uint8_t *kptr; |
544 | |
545 | chunk = &p->chunks[i]; |
546 | @@ -876,14 +876,14 @@ static int amdgpu_cs_ib_vm_chunk(struct amdgpu_device *adev, |
547 | if (chunk->chunk_id != AMDGPU_CHUNK_ID_IB) |
548 | continue; |
549 | |
550 | - r = amdgpu_cs_find_mapping(p, chunk_ib->va_start, |
551 | - &aobj, &m); |
552 | + va_start = chunk_ib->va_start & AMDGPU_VA_HOLE_MASK; |
553 | + r = amdgpu_cs_find_mapping(p, va_start, &aobj, &m); |
554 | if (r) { |
555 | DRM_ERROR("IB va_start is invalid\n"); |
556 | return r; |
557 | } |
558 | |
559 | - if ((chunk_ib->va_start + chunk_ib->ib_bytes) > |
560 | + if ((va_start + chunk_ib->ib_bytes) > |
561 | (m->last + 1) * AMDGPU_GPU_PAGE_SIZE) { |
562 | DRM_ERROR("IB va_start+ib_bytes is invalid\n"); |
563 | return -EINVAL; |
564 | @@ -896,7 +896,7 @@ static int amdgpu_cs_ib_vm_chunk(struct amdgpu_device *adev, |
565 | } |
566 | |
567 | offset = m->start * AMDGPU_GPU_PAGE_SIZE; |
568 | - kptr += chunk_ib->va_start - offset; |
569 | + kptr += va_start - offset; |
570 | |
571 | memcpy(ib->ptr, kptr, chunk_ib->ib_bytes); |
572 | amdgpu_bo_kunmap(aobj); |
573 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c |
574 | index 3573ecdb06ee..3288cbdd2df0 100644 |
575 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c |
576 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c |
577 | @@ -2228,8 +2228,6 @@ int amdgpu_device_init(struct amdgpu_device *adev, |
578 | * ignore it */ |
579 | vga_client_register(adev->pdev, adev, NULL, amdgpu_vga_set_decode); |
580 | |
581 | - if (amdgpu_runtime_pm == 1) |
582 | - runtime = true; |
583 | if (amdgpu_device_is_px(ddev)) |
584 | runtime = true; |
585 | if (!pci_is_thunderbolt_attached(adev->pdev)) |
586 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c |
587 | index e87eedcc0da9..1eac7c3c687b 100644 |
588 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c |
589 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c |
590 | @@ -563,6 +563,17 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data, |
591 | return -EINVAL; |
592 | } |
593 | |
594 | + if (args->va_address >= AMDGPU_VA_HOLE_START && |
595 | + args->va_address < AMDGPU_VA_HOLE_END) { |
596 | + dev_dbg(&dev->pdev->dev, |
597 | + "va_address 0x%LX is in VA hole 0x%LX-0x%LX\n", |
598 | + args->va_address, AMDGPU_VA_HOLE_START, |
599 | + AMDGPU_VA_HOLE_END); |
600 | + return -EINVAL; |
601 | + } |
602 | + |
603 | + args->va_address &= AMDGPU_VA_HOLE_MASK; |
604 | + |
605 | if ((args->flags & ~valid_flags) && (args->flags & ~prt_flags)) { |
606 | dev_err(&dev->pdev->dev, "invalid flags combination 0x%08X\n", |
607 | args->flags); |
608 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c |
609 | index 720139e182a3..c8b7abf887ed 100644 |
610 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c |
611 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c |
612 | @@ -586,7 +586,9 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file |
613 | if (amdgpu_sriov_vf(adev)) |
614 | dev_info.ids_flags |= AMDGPU_IDS_FLAGS_PREEMPTION; |
615 | dev_info.virtual_address_offset = AMDGPU_VA_RESERVED_SIZE; |
616 | - dev_info.virtual_address_max = (uint64_t)adev->vm_manager.max_pfn * AMDGPU_GPU_PAGE_SIZE; |
617 | + dev_info.virtual_address_max = |
618 | + min(adev->vm_manager.max_pfn * AMDGPU_GPU_PAGE_SIZE, |
619 | + AMDGPU_VA_HOLE_START); |
620 | dev_info.virtual_address_alignment = max((int)PAGE_SIZE, AMDGPU_GPU_PAGE_SIZE); |
621 | dev_info.pte_fragment_size = (1 << adev->vm_manager.fragment_size) * AMDGPU_GPU_PAGE_SIZE; |
622 | dev_info.gart_page_size = AMDGPU_GPU_PAGE_SIZE; |
623 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h |
624 | index bae77353447b..aef9ae5cec51 100644 |
625 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h |
626 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h |
627 | @@ -96,6 +96,19 @@ struct amdgpu_bo_list_entry; |
628 | /* hardcode that limit for now */ |
629 | #define AMDGPU_VA_RESERVED_SIZE (8ULL << 20) |
630 | |
631 | +/* VA hole for 48bit addresses on Vega10 */ |
632 | +#define AMDGPU_VA_HOLE_START 0x0000800000000000ULL |
633 | +#define AMDGPU_VA_HOLE_END 0xffff800000000000ULL |
634 | + |
635 | +/* |
636 | + * Hardware is programmed as if the hole doesn't exists with start and end |
637 | + * address values. |
638 | + * |
639 | + * This mask is used to remove the upper 16bits of the VA and so come up with |
640 | + * the linear addr value. |
641 | + */ |
642 | +#define AMDGPU_VA_HOLE_MASK 0x0000ffffffffffffULL |
643 | + |
644 | /* max vmids dedicated for process */ |
645 | #define AMDGPU_VM_MAX_RESERVED_VMID 1 |
646 | |
647 | diff --git a/drivers/gpu/drm/amd/amdgpu/si_dpm.c b/drivers/gpu/drm/amd/amdgpu/si_dpm.c |
648 | index 51fd0c9a20a5..3af322adae76 100644 |
649 | --- a/drivers/gpu/drm/amd/amdgpu/si_dpm.c |
650 | +++ b/drivers/gpu/drm/amd/amdgpu/si_dpm.c |
651 | @@ -3464,6 +3464,11 @@ static void si_apply_state_adjust_rules(struct amdgpu_device *adev, |
652 | (adev->pdev->device == 0x6667)) { |
653 | max_sclk = 75000; |
654 | } |
655 | + if ((adev->pdev->revision == 0xC3) || |
656 | + (adev->pdev->device == 0x6665)) { |
657 | + max_sclk = 60000; |
658 | + max_mclk = 80000; |
659 | + } |
660 | } else if (adev->asic_type == CHIP_OLAND) { |
661 | if ((adev->pdev->revision == 0xC7) || |
662 | (adev->pdev->revision == 0x80) || |
663 | diff --git a/drivers/gpu/drm/amd/amdgpu/soc15.c b/drivers/gpu/drm/amd/amdgpu/soc15.c |
664 | index 4e67fe1e7955..40767fdb6cd3 100644 |
665 | --- a/drivers/gpu/drm/amd/amdgpu/soc15.c |
666 | +++ b/drivers/gpu/drm/amd/amdgpu/soc15.c |
667 | @@ -659,8 +659,8 @@ static int soc15_common_early_init(void *handle) |
668 | AMD_CG_SUPPORT_MC_LS | |
669 | AMD_CG_SUPPORT_SDMA_MGCG | |
670 | AMD_CG_SUPPORT_SDMA_LS; |
671 | - adev->pg_flags = AMD_PG_SUPPORT_SDMA | |
672 | - AMD_PG_SUPPORT_MMHUB; |
673 | + adev->pg_flags = AMD_PG_SUPPORT_SDMA; |
674 | + |
675 | adev->external_rev_id = 0x1; |
676 | break; |
677 | default: |
678 | diff --git a/drivers/gpu/drm/amd/amdgpu/vi.c b/drivers/gpu/drm/amd/amdgpu/vi.c |
679 | index 3a4c2fa7e36d..d582964702ad 100644 |
680 | --- a/drivers/gpu/drm/amd/amdgpu/vi.c |
681 | +++ b/drivers/gpu/drm/amd/amdgpu/vi.c |
682 | @@ -449,14 +449,19 @@ static bool vi_read_bios_from_rom(struct amdgpu_device *adev, |
683 | |
684 | static void vi_detect_hw_virtualization(struct amdgpu_device *adev) |
685 | { |
686 | - uint32_t reg = RREG32(mmBIF_IOV_FUNC_IDENTIFIER); |
687 | - /* bit0: 0 means pf and 1 means vf */ |
688 | - /* bit31: 0 means disable IOV and 1 means enable */ |
689 | - if (reg & 1) |
690 | - adev->virt.caps |= AMDGPU_SRIOV_CAPS_IS_VF; |
691 | - |
692 | - if (reg & 0x80000000) |
693 | - adev->virt.caps |= AMDGPU_SRIOV_CAPS_ENABLE_IOV; |
694 | + uint32_t reg = 0; |
695 | + |
696 | + if (adev->asic_type == CHIP_TONGA || |
697 | + adev->asic_type == CHIP_FIJI) { |
698 | + reg = RREG32(mmBIF_IOV_FUNC_IDENTIFIER); |
699 | + /* bit0: 0 means pf and 1 means vf */ |
700 | + /* bit31: 0 means disable IOV and 1 means enable */ |
701 | + if (reg & 1) |
702 | + adev->virt.caps |= AMDGPU_SRIOV_CAPS_IS_VF; |
703 | + |
704 | + if (reg & 0x80000000) |
705 | + adev->virt.caps |= AMDGPU_SRIOV_CAPS_ENABLE_IOV; |
706 | + } |
707 | |
708 | if (reg == 0) { |
709 | if (is_virtual_machine()) /* passthrough mode exclus sr-iov mode */ |
710 | diff --git a/drivers/gpu/drm/cirrus/cirrus_mode.c b/drivers/gpu/drm/cirrus/cirrus_mode.c |
711 | index cd23b1b28259..c91b9b054e3f 100644 |
712 | --- a/drivers/gpu/drm/cirrus/cirrus_mode.c |
713 | +++ b/drivers/gpu/drm/cirrus/cirrus_mode.c |
714 | @@ -294,22 +294,7 @@ static void cirrus_crtc_prepare(struct drm_crtc *crtc) |
715 | { |
716 | } |
717 | |
718 | -/* |
719 | - * This is called after a mode is programmed. It should reverse anything done |
720 | - * by the prepare function |
721 | - */ |
722 | -static void cirrus_crtc_commit(struct drm_crtc *crtc) |
723 | -{ |
724 | -} |
725 | - |
726 | -/* |
727 | - * The core can pass us a set of gamma values to program. We actually only |
728 | - * use this for 8-bit mode so can't perform smooth fades on deeper modes, |
729 | - * but it's a requirement that we provide the function |
730 | - */ |
731 | -static int cirrus_crtc_gamma_set(struct drm_crtc *crtc, u16 *red, u16 *green, |
732 | - u16 *blue, uint32_t size, |
733 | - struct drm_modeset_acquire_ctx *ctx) |
734 | +static void cirrus_crtc_load_lut(struct drm_crtc *crtc) |
735 | { |
736 | struct drm_device *dev = crtc->dev; |
737 | struct cirrus_device *cdev = dev->dev_private; |
738 | @@ -317,7 +302,7 @@ static int cirrus_crtc_gamma_set(struct drm_crtc *crtc, u16 *red, u16 *green, |
739 | int i; |
740 | |
741 | if (!crtc->enabled) |
742 | - return 0; |
743 | + return; |
744 | |
745 | r = crtc->gamma_store; |
746 | g = r + crtc->gamma_size; |
747 | @@ -330,6 +315,27 @@ static int cirrus_crtc_gamma_set(struct drm_crtc *crtc, u16 *red, u16 *green, |
748 | WREG8(PALETTE_DATA, *g++ >> 8); |
749 | WREG8(PALETTE_DATA, *b++ >> 8); |
750 | } |
751 | +} |
752 | + |
753 | +/* |
754 | + * This is called after a mode is programmed. It should reverse anything done |
755 | + * by the prepare function |
756 | + */ |
757 | +static void cirrus_crtc_commit(struct drm_crtc *crtc) |
758 | +{ |
759 | + cirrus_crtc_load_lut(crtc); |
760 | +} |
761 | + |
762 | +/* |
763 | + * The core can pass us a set of gamma values to program. We actually only |
764 | + * use this for 8-bit mode so can't perform smooth fades on deeper modes, |
765 | + * but it's a requirement that we provide the function |
766 | + */ |
767 | +static int cirrus_crtc_gamma_set(struct drm_crtc *crtc, u16 *red, u16 *green, |
768 | + u16 *blue, uint32_t size, |
769 | + struct drm_modeset_acquire_ctx *ctx) |
770 | +{ |
771 | + cirrus_crtc_load_lut(crtc); |
772 | |
773 | return 0; |
774 | } |
775 | diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c |
776 | index b16f1d69a0bb..e8c249361d7e 100644 |
777 | --- a/drivers/gpu/drm/drm_atomic_helper.c |
778 | +++ b/drivers/gpu/drm/drm_atomic_helper.c |
779 | @@ -1778,6 +1778,8 @@ int drm_atomic_helper_setup_commit(struct drm_atomic_state *state, |
780 | new_crtc_state->event->base.completion = &commit->flip_done; |
781 | new_crtc_state->event->base.completion_release = release_crtc_commit; |
782 | drm_crtc_commit_get(commit); |
783 | + |
784 | + commit->abort_completion = true; |
785 | } |
786 | |
787 | for_each_oldnew_connector_in_state(state, conn, old_conn_state, new_conn_state, i) { |
788 | @@ -3327,8 +3329,21 @@ EXPORT_SYMBOL(drm_atomic_helper_crtc_duplicate_state); |
789 | void __drm_atomic_helper_crtc_destroy_state(struct drm_crtc_state *state) |
790 | { |
791 | if (state->commit) { |
792 | + /* |
793 | + * In the event that a non-blocking commit returns |
794 | + * -ERESTARTSYS before the commit_tail work is queued, we will |
795 | + * have an extra reference to the commit object. Release it, if |
796 | + * the event has not been consumed by the worker. |
797 | + * |
798 | + * state->event may be freed, so we can't directly look at |
799 | + * state->event->base.completion. |
800 | + */ |
801 | + if (state->event && state->commit->abort_completion) |
802 | + drm_crtc_commit_put(state->commit); |
803 | + |
804 | kfree(state->commit->event); |
805 | state->commit->event = NULL; |
806 | + |
807 | drm_crtc_commit_put(state->commit); |
808 | } |
809 | |
810 | diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c |
811 | index cb487148359a..16fb76ba6509 100644 |
812 | --- a/drivers/gpu/drm/drm_edid.c |
813 | +++ b/drivers/gpu/drm/drm_edid.c |
814 | @@ -113,6 +113,9 @@ static const struct edid_quirk { |
815 | /* AEO model 0 reports 8 bpc, but is a 6 bpc panel */ |
816 | { "AEO", 0, EDID_QUIRK_FORCE_6BPC }, |
817 | |
818 | + /* CPT panel of Asus UX303LA reports 8 bpc, but is a 6 bpc panel */ |
819 | + { "CPT", 0x17df, EDID_QUIRK_FORCE_6BPC }, |
820 | + |
821 | /* Belinea 10 15 55 */ |
822 | { "MAX", 1516, EDID_QUIRK_PREFER_LARGE_60 }, |
823 | { "MAX", 0x77e, EDID_QUIRK_PREFER_LARGE_60 }, |
824 | diff --git a/drivers/gpu/drm/drm_mm.c b/drivers/gpu/drm/drm_mm.c |
825 | index c3c79ee6119e..edab571dbc90 100644 |
826 | --- a/drivers/gpu/drm/drm_mm.c |
827 | +++ b/drivers/gpu/drm/drm_mm.c |
828 | @@ -836,9 +836,24 @@ struct drm_mm_node *drm_mm_scan_color_evict(struct drm_mm_scan *scan) |
829 | if (!mm->color_adjust) |
830 | return NULL; |
831 | |
832 | - hole = list_first_entry(&mm->hole_stack, typeof(*hole), hole_stack); |
833 | - hole_start = __drm_mm_hole_node_start(hole); |
834 | - hole_end = hole_start + hole->hole_size; |
835 | + /* |
836 | + * The hole found during scanning should ideally be the first element |
837 | + * in the hole_stack list, but due to side-effects in the driver it |
838 | + * may not be. |
839 | + */ |
840 | + list_for_each_entry(hole, &mm->hole_stack, hole_stack) { |
841 | + hole_start = __drm_mm_hole_node_start(hole); |
842 | + hole_end = hole_start + hole->hole_size; |
843 | + |
844 | + if (hole_start <= scan->hit_start && |
845 | + hole_end >= scan->hit_end) |
846 | + break; |
847 | + } |
848 | + |
849 | + /* We should only be called after we found the hole previously */ |
850 | + DRM_MM_BUG_ON(&hole->hole_stack == &mm->hole_stack); |
851 | + if (unlikely(&hole->hole_stack == &mm->hole_stack)) |
852 | + return NULL; |
853 | |
854 | DRM_MM_BUG_ON(hole_start > scan->hit_start); |
855 | DRM_MM_BUG_ON(hole_end < scan->hit_end); |
856 | diff --git a/drivers/gpu/drm/i915/intel_breadcrumbs.c b/drivers/gpu/drm/i915/intel_breadcrumbs.c |
857 | index bcbc7abe6693..5d0c6504efe8 100644 |
858 | --- a/drivers/gpu/drm/i915/intel_breadcrumbs.c |
859 | +++ b/drivers/gpu/drm/i915/intel_breadcrumbs.c |
860 | @@ -552,29 +552,16 @@ void intel_engine_remove_wait(struct intel_engine_cs *engine, |
861 | spin_unlock_irq(&b->rb_lock); |
862 | } |
863 | |
864 | -static bool signal_valid(const struct drm_i915_gem_request *request) |
865 | -{ |
866 | - return intel_wait_check_request(&request->signaling.wait, request); |
867 | -} |
868 | - |
869 | static bool signal_complete(const struct drm_i915_gem_request *request) |
870 | { |
871 | if (!request) |
872 | return false; |
873 | |
874 | - /* If another process served as the bottom-half it may have already |
875 | - * signalled that this wait is already completed. |
876 | - */ |
877 | - if (intel_wait_complete(&request->signaling.wait)) |
878 | - return signal_valid(request); |
879 | - |
880 | - /* Carefully check if the request is complete, giving time for the |
881 | + /* |
882 | + * Carefully check if the request is complete, giving time for the |
883 | * seqno to be visible or if the GPU hung. |
884 | */ |
885 | - if (__i915_request_irq_complete(request)) |
886 | - return true; |
887 | - |
888 | - return false; |
889 | + return __i915_request_irq_complete(request); |
890 | } |
891 | |
892 | static struct drm_i915_gem_request *to_signaler(struct rb_node *rb) |
893 | @@ -617,9 +604,13 @@ static int intel_breadcrumbs_signaler(void *arg) |
894 | request = i915_gem_request_get_rcu(request); |
895 | rcu_read_unlock(); |
896 | if (signal_complete(request)) { |
897 | - local_bh_disable(); |
898 | - dma_fence_signal(&request->fence); |
899 | - local_bh_enable(); /* kick start the tasklets */ |
900 | + if (!test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, |
901 | + &request->fence.flags)) { |
902 | + local_bh_disable(); |
903 | + dma_fence_signal(&request->fence); |
904 | + GEM_BUG_ON(!i915_gem_request_completed(request)); |
905 | + local_bh_enable(); /* kick start the tasklets */ |
906 | + } |
907 | |
908 | spin_lock_irq(&b->rb_lock); |
909 | |
910 | diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c |
911 | index b5f85d6f6bef..721633658544 100644 |
912 | --- a/drivers/hid/hid-core.c |
913 | +++ b/drivers/hid/hid-core.c |
914 | @@ -2721,6 +2721,9 @@ static const struct hid_device_id hid_ignore_list[] = { |
915 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYTIME) }, |
916 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYTEMPERATURE) }, |
917 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYPH) }, |
918 | + { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POWERANALYSERCASSY) }, |
919 | + { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_CONVERTERCONTROLLERCASSY) }, |
920 | + { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MACHINETESTCASSY) }, |
921 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_JWM) }, |
922 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_DMMP) }, |
923 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_UMIP) }, |
924 | diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h |
925 | index 5da3d6256d25..a0baa5ba5b84 100644 |
926 | --- a/drivers/hid/hid-ids.h |
927 | +++ b/drivers/hid/hid-ids.h |
928 | @@ -641,6 +641,9 @@ |
929 | #define USB_DEVICE_ID_LD_MICROCASSYTIME 0x1033 |
930 | #define USB_DEVICE_ID_LD_MICROCASSYTEMPERATURE 0x1035 |
931 | #define USB_DEVICE_ID_LD_MICROCASSYPH 0x1038 |
932 | +#define USB_DEVICE_ID_LD_POWERANALYSERCASSY 0x1040 |
933 | +#define USB_DEVICE_ID_LD_CONVERTERCONTROLLERCASSY 0x1042 |
934 | +#define USB_DEVICE_ID_LD_MACHINETESTCASSY 0x1043 |
935 | #define USB_DEVICE_ID_LD_JWM 0x1080 |
936 | #define USB_DEVICE_ID_LD_DMMP 0x1081 |
937 | #define USB_DEVICE_ID_LD_UMIP 0x1090 |
938 | diff --git a/drivers/i2c/busses/i2c-bcm2835.c b/drivers/i2c/busses/i2c-bcm2835.c |
939 | index cd07a69e2e93..44deae78913e 100644 |
940 | --- a/drivers/i2c/busses/i2c-bcm2835.c |
941 | +++ b/drivers/i2c/busses/i2c-bcm2835.c |
942 | @@ -50,6 +50,9 @@ |
943 | #define BCM2835_I2C_S_CLKT BIT(9) |
944 | #define BCM2835_I2C_S_LEN BIT(10) /* Fake bit for SW error reporting */ |
945 | |
946 | +#define BCM2835_I2C_FEDL_SHIFT 16 |
947 | +#define BCM2835_I2C_REDL_SHIFT 0 |
948 | + |
949 | #define BCM2835_I2C_CDIV_MIN 0x0002 |
950 | #define BCM2835_I2C_CDIV_MAX 0xFFFE |
951 | |
952 | @@ -81,7 +84,7 @@ static inline u32 bcm2835_i2c_readl(struct bcm2835_i2c_dev *i2c_dev, u32 reg) |
953 | |
954 | static int bcm2835_i2c_set_divider(struct bcm2835_i2c_dev *i2c_dev) |
955 | { |
956 | - u32 divider; |
957 | + u32 divider, redl, fedl; |
958 | |
959 | divider = DIV_ROUND_UP(clk_get_rate(i2c_dev->clk), |
960 | i2c_dev->bus_clk_rate); |
961 | @@ -100,6 +103,22 @@ static int bcm2835_i2c_set_divider(struct bcm2835_i2c_dev *i2c_dev) |
962 | |
963 | bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_DIV, divider); |
964 | |
965 | + /* |
966 | + * Number of core clocks to wait after falling edge before |
967 | + * outputting the next data bit. Note that both FEDL and REDL |
968 | + * can't be greater than CDIV/2. |
969 | + */ |
970 | + fedl = max(divider / 16, 1u); |
971 | + |
972 | + /* |
973 | + * Number of core clocks to wait after rising edge before |
974 | + * sampling the next incoming data bit. |
975 | + */ |
976 | + redl = max(divider / 4, 1u); |
977 | + |
978 | + bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_DEL, |
979 | + (fedl << BCM2835_I2C_FEDL_SHIFT) | |
980 | + (redl << BCM2835_I2C_REDL_SHIFT)); |
981 | return 0; |
982 | } |
983 | |
984 | diff --git a/drivers/i2c/busses/i2c-designware-master.c b/drivers/i2c/busses/i2c-designware-master.c |
985 | index 418c233075d3..13e849bf9aa0 100644 |
986 | --- a/drivers/i2c/busses/i2c-designware-master.c |
987 | +++ b/drivers/i2c/busses/i2c-designware-master.c |
988 | @@ -207,7 +207,7 @@ static void i2c_dw_xfer_init(struct dw_i2c_dev *dev) |
989 | i2c_dw_disable_int(dev); |
990 | |
991 | /* Enable the adapter */ |
992 | - __i2c_dw_enable(dev, true); |
993 | + __i2c_dw_enable_and_wait(dev, true); |
994 | |
995 | /* Clear and enable interrupts */ |
996 | dw_readl(dev, DW_IC_CLR_INTR); |
997 | diff --git a/drivers/iio/adc/stm32-adc.c b/drivers/iio/adc/stm32-adc.c |
998 | index cecf1e5b244c..b61b52f43179 100644 |
999 | --- a/drivers/iio/adc/stm32-adc.c |
1000 | +++ b/drivers/iio/adc/stm32-adc.c |
1001 | @@ -765,8 +765,6 @@ static int stm32h7_adc_enable(struct stm32_adc *adc) |
1002 | int ret; |
1003 | u32 val; |
1004 | |
1005 | - /* Clear ADRDY by writing one, then enable ADC */ |
1006 | - stm32_adc_set_bits(adc, STM32H7_ADC_ISR, STM32H7_ADRDY); |
1007 | stm32_adc_set_bits(adc, STM32H7_ADC_CR, STM32H7_ADEN); |
1008 | |
1009 | /* Poll for ADRDY to be set (after adc startup time) */ |
1010 | @@ -774,8 +772,11 @@ static int stm32h7_adc_enable(struct stm32_adc *adc) |
1011 | val & STM32H7_ADRDY, |
1012 | 100, STM32_ADC_TIMEOUT_US); |
1013 | if (ret) { |
1014 | - stm32_adc_clr_bits(adc, STM32H7_ADC_CR, STM32H7_ADEN); |
1015 | + stm32_adc_set_bits(adc, STM32H7_ADC_CR, STM32H7_ADDIS); |
1016 | dev_err(&indio_dev->dev, "Failed to enable ADC\n"); |
1017 | + } else { |
1018 | + /* Clear ADRDY by writing one */ |
1019 | + stm32_adc_set_bits(adc, STM32H7_ADC_ISR, STM32H7_ADRDY); |
1020 | } |
1021 | |
1022 | return ret; |
1023 | diff --git a/drivers/iio/imu/adis_trigger.c b/drivers/iio/imu/adis_trigger.c |
1024 | index 0dd5a381be64..457372f36791 100644 |
1025 | --- a/drivers/iio/imu/adis_trigger.c |
1026 | +++ b/drivers/iio/imu/adis_trigger.c |
1027 | @@ -46,6 +46,10 @@ int adis_probe_trigger(struct adis *adis, struct iio_dev *indio_dev) |
1028 | if (adis->trig == NULL) |
1029 | return -ENOMEM; |
1030 | |
1031 | + adis->trig->dev.parent = &adis->spi->dev; |
1032 | + adis->trig->ops = &adis_trigger_ops; |
1033 | + iio_trigger_set_drvdata(adis->trig, adis); |
1034 | + |
1035 | ret = request_irq(adis->spi->irq, |
1036 | &iio_trigger_generic_data_rdy_poll, |
1037 | IRQF_TRIGGER_RISING, |
1038 | @@ -54,9 +58,6 @@ int adis_probe_trigger(struct adis *adis, struct iio_dev *indio_dev) |
1039 | if (ret) |
1040 | goto error_free_trig; |
1041 | |
1042 | - adis->trig->dev.parent = &adis->spi->dev; |
1043 | - adis->trig->ops = &adis_trigger_ops; |
1044 | - iio_trigger_set_drvdata(adis->trig, adis); |
1045 | ret = iio_trigger_register(adis->trig); |
1046 | |
1047 | indio_dev->trig = iio_trigger_get(adis->trig); |
1048 | diff --git a/drivers/iio/industrialio-buffer.c b/drivers/iio/industrialio-buffer.c |
1049 | index d2b465140a6b..78482d456c3b 100644 |
1050 | --- a/drivers/iio/industrialio-buffer.c |
1051 | +++ b/drivers/iio/industrialio-buffer.c |
1052 | @@ -175,7 +175,7 @@ unsigned int iio_buffer_poll(struct file *filp, |
1053 | struct iio_dev *indio_dev = filp->private_data; |
1054 | struct iio_buffer *rb = indio_dev->buffer; |
1055 | |
1056 | - if (!indio_dev->info) |
1057 | + if (!indio_dev->info || rb == NULL) |
1058 | return 0; |
1059 | |
1060 | poll_wait(filp, &rb->pollq, wait); |
1061 | diff --git a/drivers/iio/proximity/Kconfig b/drivers/iio/proximity/Kconfig |
1062 | index fcb1c4ba5e41..f726f9427602 100644 |
1063 | --- a/drivers/iio/proximity/Kconfig |
1064 | +++ b/drivers/iio/proximity/Kconfig |
1065 | @@ -68,6 +68,8 @@ config SX9500 |
1066 | |
1067 | config SRF08 |
1068 | tristate "Devantech SRF02/SRF08/SRF10 ultrasonic ranger sensor" |
1069 | + select IIO_BUFFER |
1070 | + select IIO_TRIGGERED_BUFFER |
1071 | depends on I2C |
1072 | help |
1073 | Say Y here to build a driver for Devantech SRF02/SRF08/SRF10 |
1074 | diff --git a/drivers/infiniband/core/rdma_core.c b/drivers/infiniband/core/rdma_core.c |
1075 | index 85b5ee4defa4..4e1f76730855 100644 |
1076 | --- a/drivers/infiniband/core/rdma_core.c |
1077 | +++ b/drivers/infiniband/core/rdma_core.c |
1078 | @@ -196,7 +196,15 @@ static struct ib_uobject *lookup_get_idr_uobject(const struct uverbs_obj_type *t |
1079 | goto free; |
1080 | } |
1081 | |
1082 | - uverbs_uobject_get(uobj); |
1083 | + /* |
1084 | + * The idr_find is guaranteed to return a pointer to something that |
1085 | + * isn't freed yet, or NULL, as the free after idr_remove goes through |
1086 | + * kfree_rcu(). However the object may still have been released and |
1087 | + * kfree() could be called at any time. |
1088 | + */ |
1089 | + if (!kref_get_unless_zero(&uobj->ref)) |
1090 | + uobj = ERR_PTR(-ENOENT); |
1091 | + |
1092 | free: |
1093 | rcu_read_unlock(); |
1094 | return uobj; |
1095 | diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c |
1096 | index 840b24096690..df127c8b9a9f 100644 |
1097 | --- a/drivers/infiniband/core/uverbs_cmd.c |
1098 | +++ b/drivers/infiniband/core/uverbs_cmd.c |
1099 | @@ -560,9 +560,10 @@ ssize_t ib_uverbs_open_xrcd(struct ib_uverbs_file *file, |
1100 | if (f.file) |
1101 | fdput(f); |
1102 | |
1103 | + mutex_unlock(&file->device->xrcd_tree_mutex); |
1104 | + |
1105 | uobj_alloc_commit(&obj->uobject); |
1106 | |
1107 | - mutex_unlock(&file->device->xrcd_tree_mutex); |
1108 | return in_len; |
1109 | |
1110 | err_copy: |
1111 | @@ -601,10 +602,8 @@ ssize_t ib_uverbs_close_xrcd(struct ib_uverbs_file *file, |
1112 | |
1113 | uobj = uobj_get_write(uobj_get_type(xrcd), cmd.xrcd_handle, |
1114 | file->ucontext); |
1115 | - if (IS_ERR(uobj)) { |
1116 | - mutex_unlock(&file->device->xrcd_tree_mutex); |
1117 | + if (IS_ERR(uobj)) |
1118 | return PTR_ERR(uobj); |
1119 | - } |
1120 | |
1121 | ret = uobj_remove_commit(uobj); |
1122 | return ret ?: in_len; |
1123 | @@ -1971,8 +1970,15 @@ static int modify_qp(struct ib_uverbs_file *file, |
1124 | goto release_qp; |
1125 | } |
1126 | |
1127 | + if ((cmd->base.attr_mask & IB_QP_AV) && |
1128 | + !rdma_is_port_valid(qp->device, cmd->base.dest.port_num)) { |
1129 | + ret = -EINVAL; |
1130 | + goto release_qp; |
1131 | + } |
1132 | + |
1133 | if ((cmd->base.attr_mask & IB_QP_ALT_PATH) && |
1134 | - !rdma_is_port_valid(qp->device, cmd->base.alt_port_num)) { |
1135 | + (!rdma_is_port_valid(qp->device, cmd->base.alt_port_num) || |
1136 | + !rdma_is_port_valid(qp->device, cmd->base.alt_dest.port_num))) { |
1137 | ret = -EINVAL; |
1138 | goto release_qp; |
1139 | } |
1140 | diff --git a/drivers/infiniband/core/uverbs_main.c b/drivers/infiniband/core/uverbs_main.c |
1141 | index 381fd9c096ae..0804239e43f0 100644 |
1142 | --- a/drivers/infiniband/core/uverbs_main.c |
1143 | +++ b/drivers/infiniband/core/uverbs_main.c |
1144 | @@ -648,12 +648,21 @@ static int verify_command_mask(struct ib_device *ib_dev, __u32 command) |
1145 | return -1; |
1146 | } |
1147 | |
1148 | +static bool verify_command_idx(u32 command, bool extended) |
1149 | +{ |
1150 | + if (extended) |
1151 | + return command < ARRAY_SIZE(uverbs_ex_cmd_table); |
1152 | + |
1153 | + return command < ARRAY_SIZE(uverbs_cmd_table); |
1154 | +} |
1155 | + |
1156 | static ssize_t ib_uverbs_write(struct file *filp, const char __user *buf, |
1157 | size_t count, loff_t *pos) |
1158 | { |
1159 | struct ib_uverbs_file *file = filp->private_data; |
1160 | struct ib_device *ib_dev; |
1161 | struct ib_uverbs_cmd_hdr hdr; |
1162 | + bool extended_command; |
1163 | __u32 command; |
1164 | __u32 flags; |
1165 | int srcu_key; |
1166 | @@ -686,6 +695,15 @@ static ssize_t ib_uverbs_write(struct file *filp, const char __user *buf, |
1167 | } |
1168 | |
1169 | command = hdr.command & IB_USER_VERBS_CMD_COMMAND_MASK; |
1170 | + flags = (hdr.command & |
1171 | + IB_USER_VERBS_CMD_FLAGS_MASK) >> IB_USER_VERBS_CMD_FLAGS_SHIFT; |
1172 | + |
1173 | + extended_command = flags & IB_USER_VERBS_CMD_FLAG_EXTENDED; |
1174 | + if (!verify_command_idx(command, extended_command)) { |
1175 | + ret = -EINVAL; |
1176 | + goto out; |
1177 | + } |
1178 | + |
1179 | if (verify_command_mask(ib_dev, command)) { |
1180 | ret = -EOPNOTSUPP; |
1181 | goto out; |
1182 | @@ -697,12 +715,8 @@ static ssize_t ib_uverbs_write(struct file *filp, const char __user *buf, |
1183 | goto out; |
1184 | } |
1185 | |
1186 | - flags = (hdr.command & |
1187 | - IB_USER_VERBS_CMD_FLAGS_MASK) >> IB_USER_VERBS_CMD_FLAGS_SHIFT; |
1188 | - |
1189 | if (!flags) { |
1190 | - if (command >= ARRAY_SIZE(uverbs_cmd_table) || |
1191 | - !uverbs_cmd_table[command]) { |
1192 | + if (!uverbs_cmd_table[command]) { |
1193 | ret = -EINVAL; |
1194 | goto out; |
1195 | } |
1196 | @@ -723,8 +737,7 @@ static ssize_t ib_uverbs_write(struct file *filp, const char __user *buf, |
1197 | struct ib_udata uhw; |
1198 | size_t written_count = count; |
1199 | |
1200 | - if (command >= ARRAY_SIZE(uverbs_ex_cmd_table) || |
1201 | - !uverbs_ex_cmd_table[command]) { |
1202 | + if (!uverbs_ex_cmd_table[command]) { |
1203 | ret = -ENOSYS; |
1204 | goto out; |
1205 | } |
1206 | diff --git a/drivers/irqchip/irq-gic-v3.c b/drivers/irqchip/irq-gic-v3.c |
1207 | index b56c3e23f0af..980ae8e7df30 100644 |
1208 | --- a/drivers/irqchip/irq-gic-v3.c |
1209 | +++ b/drivers/irqchip/irq-gic-v3.c |
1210 | @@ -688,7 +688,7 @@ static void gic_raise_softirq(const struct cpumask *mask, unsigned int irq) |
1211 | * Ensure that stores to Normal memory are visible to the |
1212 | * other CPUs before issuing the IPI. |
1213 | */ |
1214 | - smp_wmb(); |
1215 | + wmb(); |
1216 | |
1217 | for_each_cpu(cpu, mask) { |
1218 | u64 cluster_id = MPIDR_TO_SGI_CLUSTER_ID(cpu_logical_map(cpu)); |
1219 | diff --git a/drivers/irqchip/irq-mips-gic.c b/drivers/irqchip/irq-mips-gic.c |
1220 | index ef92a4d2038e..d32268cc1174 100644 |
1221 | --- a/drivers/irqchip/irq-mips-gic.c |
1222 | +++ b/drivers/irqchip/irq-mips-gic.c |
1223 | @@ -424,8 +424,6 @@ static int gic_shared_irq_domain_map(struct irq_domain *d, unsigned int virq, |
1224 | spin_lock_irqsave(&gic_lock, flags); |
1225 | write_gic_map_pin(intr, GIC_MAP_PIN_MAP_TO_PIN | gic_cpu_pin); |
1226 | write_gic_map_vp(intr, BIT(mips_cm_vp_id(cpu))); |
1227 | - gic_clear_pcpu_masks(intr); |
1228 | - set_bit(intr, per_cpu_ptr(pcpu_masks, cpu)); |
1229 | irq_data_update_effective_affinity(data, cpumask_of(cpu)); |
1230 | spin_unlock_irqrestore(&gic_lock, flags); |
1231 | |
1232 | diff --git a/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c b/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c |
1233 | index 375ef86a84da..322671076c9c 100644 |
1234 | --- a/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c |
1235 | +++ b/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c |
1236 | @@ -2632,7 +2632,6 @@ void t4_get_regs(struct adapter *adap, void *buf, size_t buf_size) |
1237 | } |
1238 | |
1239 | #define EEPROM_STAT_ADDR 0x7bfc |
1240 | -#define VPD_SIZE 0x800 |
1241 | #define VPD_BASE 0x400 |
1242 | #define VPD_BASE_OLD 0 |
1243 | #define VPD_LEN 1024 |
1244 | @@ -2699,15 +2698,6 @@ int t4_get_raw_vpd_params(struct adapter *adapter, struct vpd_params *p) |
1245 | if (!vpd) |
1246 | return -ENOMEM; |
1247 | |
1248 | - /* We have two VPD data structures stored in the adapter VPD area. |
1249 | - * By default, Linux calculates the size of the VPD area by traversing |
1250 | - * the first VPD area at offset 0x0, so we need to tell the OS what |
1251 | - * our real VPD size is. |
1252 | - */ |
1253 | - ret = pci_set_vpd_size(adapter->pdev, VPD_SIZE); |
1254 | - if (ret < 0) |
1255 | - goto out; |
1256 | - |
1257 | /* Card information normally starts at VPD_BASE but early cards had |
1258 | * it at 0. |
1259 | */ |
1260 | diff --git a/drivers/net/thunderbolt.c b/drivers/net/thunderbolt.c |
1261 | index ca5e375de27c..e0d6760f3219 100644 |
1262 | --- a/drivers/net/thunderbolt.c |
1263 | +++ b/drivers/net/thunderbolt.c |
1264 | @@ -166,6 +166,8 @@ struct tbnet_ring { |
1265 | * @connected_work: Worker that finalizes the ThunderboltIP connection |
1266 | * setup and enables DMA paths for high speed data |
1267 | * transfers |
1268 | + * @disconnect_work: Worker that handles tearing down the ThunderboltIP |
1269 | + * connection |
1270 | * @rx_hdr: Copy of the currently processed Rx frame. Used when a |
1271 | * network packet consists of multiple Thunderbolt frames. |
1272 | * In host byte order. |
1273 | @@ -190,6 +192,7 @@ struct tbnet { |
1274 | int login_retries; |
1275 | struct delayed_work login_work; |
1276 | struct work_struct connected_work; |
1277 | + struct work_struct disconnect_work; |
1278 | struct thunderbolt_ip_frame_header rx_hdr; |
1279 | struct tbnet_ring rx_ring; |
1280 | atomic_t frame_id; |
1281 | @@ -445,7 +448,7 @@ static int tbnet_handle_packet(const void *buf, size_t size, void *data) |
1282 | case TBIP_LOGOUT: |
1283 | ret = tbnet_logout_response(net, route, sequence, command_id); |
1284 | if (!ret) |
1285 | - tbnet_tear_down(net, false); |
1286 | + queue_work(system_long_wq, &net->disconnect_work); |
1287 | break; |
1288 | |
1289 | default: |
1290 | @@ -659,6 +662,13 @@ static void tbnet_login_work(struct work_struct *work) |
1291 | } |
1292 | } |
1293 | |
1294 | +static void tbnet_disconnect_work(struct work_struct *work) |
1295 | +{ |
1296 | + struct tbnet *net = container_of(work, typeof(*net), disconnect_work); |
1297 | + |
1298 | + tbnet_tear_down(net, false); |
1299 | +} |
1300 | + |
1301 | static bool tbnet_check_frame(struct tbnet *net, const struct tbnet_frame *tf, |
1302 | const struct thunderbolt_ip_frame_header *hdr) |
1303 | { |
1304 | @@ -881,6 +891,7 @@ static int tbnet_stop(struct net_device *dev) |
1305 | |
1306 | napi_disable(&net->napi); |
1307 | |
1308 | + cancel_work_sync(&net->disconnect_work); |
1309 | tbnet_tear_down(net, true); |
1310 | |
1311 | tb_ring_free(net->rx_ring.ring); |
1312 | @@ -1195,6 +1206,7 @@ static int tbnet_probe(struct tb_service *svc, const struct tb_service_id *id) |
1313 | net = netdev_priv(dev); |
1314 | INIT_DELAYED_WORK(&net->login_work, tbnet_login_work); |
1315 | INIT_WORK(&net->connected_work, tbnet_connected_work); |
1316 | + INIT_WORK(&net->disconnect_work, tbnet_disconnect_work); |
1317 | mutex_init(&net->connection_lock); |
1318 | atomic_set(&net->command_id, 0); |
1319 | atomic_set(&net->frame_id, 0); |
1320 | @@ -1270,10 +1282,7 @@ static int __maybe_unused tbnet_suspend(struct device *dev) |
1321 | stop_login(net); |
1322 | if (netif_running(net->dev)) { |
1323 | netif_device_detach(net->dev); |
1324 | - tb_ring_stop(net->rx_ring.ring); |
1325 | - tb_ring_stop(net->tx_ring.ring); |
1326 | - tbnet_free_buffers(&net->rx_ring); |
1327 | - tbnet_free_buffers(&net->tx_ring); |
1328 | + tbnet_tear_down(net, true); |
1329 | } |
1330 | |
1331 | return 0; |
1332 | diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c |
1333 | index d22750ea7444..d7135140bf40 100644 |
1334 | --- a/drivers/pci/quirks.c |
1335 | +++ b/drivers/pci/quirks.c |
1336 | @@ -3419,22 +3419,29 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PORT_RIDGE, |
1337 | |
1338 | static void quirk_chelsio_extend_vpd(struct pci_dev *dev) |
1339 | { |
1340 | - pci_set_vpd_size(dev, 8192); |
1341 | -} |
1342 | - |
1343 | -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x20, quirk_chelsio_extend_vpd); |
1344 | -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x21, quirk_chelsio_extend_vpd); |
1345 | -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x22, quirk_chelsio_extend_vpd); |
1346 | -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x23, quirk_chelsio_extend_vpd); |
1347 | -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x24, quirk_chelsio_extend_vpd); |
1348 | -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x25, quirk_chelsio_extend_vpd); |
1349 | -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x26, quirk_chelsio_extend_vpd); |
1350 | -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x30, quirk_chelsio_extend_vpd); |
1351 | -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x31, quirk_chelsio_extend_vpd); |
1352 | -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x32, quirk_chelsio_extend_vpd); |
1353 | -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x35, quirk_chelsio_extend_vpd); |
1354 | -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x36, quirk_chelsio_extend_vpd); |
1355 | -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x37, quirk_chelsio_extend_vpd); |
1356 | + int chip = (dev->device & 0xf000) >> 12; |
1357 | + int func = (dev->device & 0x0f00) >> 8; |
1358 | + int prod = (dev->device & 0x00ff) >> 0; |
1359 | + |
1360 | + /* |
1361 | + * If this is a T3-based adapter, there's a 1KB VPD area at offset |
1362 | + * 0xc00 which contains the preferred VPD values. If this is a T4 or |
1363 | + * later based adapter, the special VPD is at offset 0x400 for the |
1364 | + * Physical Functions (the SR-IOV Virtual Functions have no VPD |
1365 | + * Capabilities). The PCI VPD Access core routines will normally |
1366 | + * compute the size of the VPD by parsing the VPD Data Structure at |
1367 | + * offset 0x000. This will result in silent failures when attempting |
1368 | + * to accesses these other VPD areas which are beyond those computed |
1369 | + * limits. |
1370 | + */ |
1371 | + if (chip == 0x0 && prod >= 0x20) |
1372 | + pci_set_vpd_size(dev, 8192); |
1373 | + else if (chip >= 0x4 && func < 0x8) |
1374 | + pci_set_vpd_size(dev, 2048); |
1375 | +} |
1376 | + |
1377 | +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, PCI_ANY_ID, |
1378 | + quirk_chelsio_extend_vpd); |
1379 | |
1380 | #ifdef CONFIG_ACPI |
1381 | /* |
1382 | diff --git a/drivers/scsi/ibmvscsi/ibmvfc.h b/drivers/scsi/ibmvscsi/ibmvfc.h |
1383 | index 9a0696f68f37..b81a53c4a9a8 100644 |
1384 | --- a/drivers/scsi/ibmvscsi/ibmvfc.h |
1385 | +++ b/drivers/scsi/ibmvscsi/ibmvfc.h |
1386 | @@ -367,7 +367,7 @@ enum ibmvfc_fcp_rsp_info_codes { |
1387 | }; |
1388 | |
1389 | struct ibmvfc_fcp_rsp_info { |
1390 | - __be16 reserved; |
1391 | + u8 reserved[3]; |
1392 | u8 rsp_code; |
1393 | u8 reserved2[4]; |
1394 | }__attribute__((packed, aligned (2))); |
1395 | diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c |
1396 | index 4024926c1d68..f4a548471f0f 100644 |
1397 | --- a/drivers/usb/core/quirks.c |
1398 | +++ b/drivers/usb/core/quirks.c |
1399 | @@ -226,6 +226,9 @@ static const struct usb_device_id usb_quirk_list[] = { |
1400 | { USB_DEVICE(0x1a0a, 0x0200), .driver_info = |
1401 | USB_QUIRK_LINEAR_UFRAME_INTR_BINTERVAL }, |
1402 | |
1403 | + /* Corsair K70 RGB */ |
1404 | + { USB_DEVICE(0x1b1c, 0x1b13), .driver_info = USB_QUIRK_DELAY_INIT }, |
1405 | + |
1406 | /* Corsair Strafe RGB */ |
1407 | { USB_DEVICE(0x1b1c, 0x1b20), .driver_info = USB_QUIRK_DELAY_INIT }, |
1408 | |
1409 | diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c |
1410 | index fd3e7ad2eb0e..618b4260f0d9 100644 |
1411 | --- a/drivers/usb/dwc3/ep0.c |
1412 | +++ b/drivers/usb/dwc3/ep0.c |
1413 | @@ -858,7 +858,12 @@ static void dwc3_ep0_complete_data(struct dwc3 *dwc, |
1414 | trb++; |
1415 | trb->ctrl &= ~DWC3_TRB_CTRL_HWO; |
1416 | trace_dwc3_complete_trb(ep0, trb); |
1417 | - ep0->trb_enqueue = 0; |
1418 | + |
1419 | + if (r->direction) |
1420 | + dwc->eps[1]->trb_enqueue = 0; |
1421 | + else |
1422 | + dwc->eps[0]->trb_enqueue = 0; |
1423 | + |
1424 | dwc->ep0_bounced = false; |
1425 | } |
1426 | |
1427 | diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c |
1428 | index 639dd1b163a0..21abea0ac622 100644 |
1429 | --- a/drivers/usb/dwc3/gadget.c |
1430 | +++ b/drivers/usb/dwc3/gadget.c |
1431 | @@ -2744,6 +2744,8 @@ static void dwc3_gadget_conndone_interrupt(struct dwc3 *dwc) |
1432 | break; |
1433 | } |
1434 | |
1435 | + dwc->eps[1]->endpoint.maxpacket = dwc->gadget.ep0->maxpacket; |
1436 | + |
1437 | /* Enable USB2 LPM Capability */ |
1438 | |
1439 | if ((dwc->revision > DWC3_REVISION_194A) && |
1440 | diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c |
1441 | index f9bd351637cd..0ef08a909ba6 100644 |
1442 | --- a/drivers/usb/gadget/function/f_fs.c |
1443 | +++ b/drivers/usb/gadget/function/f_fs.c |
1444 | @@ -1852,44 +1852,20 @@ static int ffs_func_eps_enable(struct ffs_function *func) |
1445 | |
1446 | spin_lock_irqsave(&func->ffs->eps_lock, flags); |
1447 | while(count--) { |
1448 | - struct usb_endpoint_descriptor *ds; |
1449 | - struct usb_ss_ep_comp_descriptor *comp_desc = NULL; |
1450 | - int needs_comp_desc = false; |
1451 | - int desc_idx; |
1452 | - |
1453 | - if (ffs->gadget->speed == USB_SPEED_SUPER) { |
1454 | - desc_idx = 2; |
1455 | - needs_comp_desc = true; |
1456 | - } else if (ffs->gadget->speed == USB_SPEED_HIGH) |
1457 | - desc_idx = 1; |
1458 | - else |
1459 | - desc_idx = 0; |
1460 | - |
1461 | - /* fall-back to lower speed if desc missing for current speed */ |
1462 | - do { |
1463 | - ds = ep->descs[desc_idx]; |
1464 | - } while (!ds && --desc_idx >= 0); |
1465 | - |
1466 | - if (!ds) { |
1467 | - ret = -EINVAL; |
1468 | - break; |
1469 | - } |
1470 | - |
1471 | ep->ep->driver_data = ep; |
1472 | - ep->ep->desc = ds; |
1473 | |
1474 | - if (needs_comp_desc) { |
1475 | - comp_desc = (struct usb_ss_ep_comp_descriptor *)(ds + |
1476 | - USB_DT_ENDPOINT_SIZE); |
1477 | - ep->ep->maxburst = comp_desc->bMaxBurst + 1; |
1478 | - ep->ep->comp_desc = comp_desc; |
1479 | + ret = config_ep_by_speed(func->gadget, &func->function, ep->ep); |
1480 | + if (ret) { |
1481 | + pr_err("%s: config_ep_by_speed(%s) returned %d\n", |
1482 | + __func__, ep->ep->name, ret); |
1483 | + break; |
1484 | } |
1485 | |
1486 | ret = usb_ep_enable(ep->ep); |
1487 | if (likely(!ret)) { |
1488 | epfile->ep = ep; |
1489 | - epfile->in = usb_endpoint_dir_in(ds); |
1490 | - epfile->isoc = usb_endpoint_xfer_isoc(ds); |
1491 | + epfile->in = usb_endpoint_dir_in(ep->ep->desc); |
1492 | + epfile->isoc = usb_endpoint_xfer_isoc(ep->ep->desc); |
1493 | } else { |
1494 | break; |
1495 | } |
1496 | @@ -2976,10 +2952,8 @@ static int _ffs_func_bind(struct usb_configuration *c, |
1497 | struct ffs_data *ffs = func->ffs; |
1498 | |
1499 | const int full = !!func->ffs->fs_descs_count; |
1500 | - const int high = gadget_is_dualspeed(func->gadget) && |
1501 | - func->ffs->hs_descs_count; |
1502 | - const int super = gadget_is_superspeed(func->gadget) && |
1503 | - func->ffs->ss_descs_count; |
1504 | + const int high = !!func->ffs->hs_descs_count; |
1505 | + const int super = !!func->ffs->ss_descs_count; |
1506 | |
1507 | int fs_len, hs_len, ss_len, ret, i; |
1508 | struct ffs_ep *eps_ptr; |
1509 | diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c |
1510 | index facafdf8fb95..d7641cbdee43 100644 |
1511 | --- a/drivers/usb/host/ehci-hub.c |
1512 | +++ b/drivers/usb/host/ehci-hub.c |
1513 | @@ -774,12 +774,12 @@ static struct urb *request_single_step_set_feature_urb( |
1514 | atomic_inc(&urb->use_count); |
1515 | atomic_inc(&urb->dev->urbnum); |
1516 | urb->setup_dma = dma_map_single( |
1517 | - hcd->self.controller, |
1518 | + hcd->self.sysdev, |
1519 | urb->setup_packet, |
1520 | sizeof(struct usb_ctrlrequest), |
1521 | DMA_TO_DEVICE); |
1522 | urb->transfer_dma = dma_map_single( |
1523 | - hcd->self.controller, |
1524 | + hcd->self.sysdev, |
1525 | urb->transfer_buffer, |
1526 | urb->transfer_buffer_length, |
1527 | DMA_FROM_DEVICE); |
1528 | diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c |
1529 | index ee9676349333..84f88fa411cd 100644 |
1530 | --- a/drivers/usb/host/ohci-hcd.c |
1531 | +++ b/drivers/usb/host/ohci-hcd.c |
1532 | @@ -74,6 +74,7 @@ static const char hcd_name [] = "ohci_hcd"; |
1533 | |
1534 | #define STATECHANGE_DELAY msecs_to_jiffies(300) |
1535 | #define IO_WATCHDOG_DELAY msecs_to_jiffies(275) |
1536 | +#define IO_WATCHDOG_OFF 0xffffff00 |
1537 | |
1538 | #include "ohci.h" |
1539 | #include "pci-quirks.h" |
1540 | @@ -231,7 +232,7 @@ static int ohci_urb_enqueue ( |
1541 | } |
1542 | |
1543 | /* Start up the I/O watchdog timer, if it's not running */ |
1544 | - if (!timer_pending(&ohci->io_watchdog) && |
1545 | + if (ohci->prev_frame_no == IO_WATCHDOG_OFF && |
1546 | list_empty(&ohci->eds_in_use) && |
1547 | !(ohci->flags & OHCI_QUIRK_QEMU)) { |
1548 | ohci->prev_frame_no = ohci_frame_no(ohci); |
1549 | @@ -501,6 +502,7 @@ static int ohci_init (struct ohci_hcd *ohci) |
1550 | return 0; |
1551 | |
1552 | timer_setup(&ohci->io_watchdog, io_watchdog_func, 0); |
1553 | + ohci->prev_frame_no = IO_WATCHDOG_OFF; |
1554 | |
1555 | ohci->hcca = dma_alloc_coherent (hcd->self.controller, |
1556 | sizeof(*ohci->hcca), &ohci->hcca_dma, GFP_KERNEL); |
1557 | @@ -730,7 +732,7 @@ static void io_watchdog_func(struct timer_list *t) |
1558 | u32 head; |
1559 | struct ed *ed; |
1560 | struct td *td, *td_start, *td_next; |
1561 | - unsigned frame_no; |
1562 | + unsigned frame_no, prev_frame_no = IO_WATCHDOG_OFF; |
1563 | unsigned long flags; |
1564 | |
1565 | spin_lock_irqsave(&ohci->lock, flags); |
1566 | @@ -835,7 +837,7 @@ static void io_watchdog_func(struct timer_list *t) |
1567 | } |
1568 | } |
1569 | if (!list_empty(&ohci->eds_in_use)) { |
1570 | - ohci->prev_frame_no = frame_no; |
1571 | + prev_frame_no = frame_no; |
1572 | ohci->prev_wdh_cnt = ohci->wdh_cnt; |
1573 | ohci->prev_donehead = ohci_readl(ohci, |
1574 | &ohci->regs->donehead); |
1575 | @@ -845,6 +847,7 @@ static void io_watchdog_func(struct timer_list *t) |
1576 | } |
1577 | |
1578 | done: |
1579 | + ohci->prev_frame_no = prev_frame_no; |
1580 | spin_unlock_irqrestore(&ohci->lock, flags); |
1581 | } |
1582 | |
1583 | @@ -973,6 +976,7 @@ static void ohci_stop (struct usb_hcd *hcd) |
1584 | if (quirk_nec(ohci)) |
1585 | flush_work(&ohci->nec_work); |
1586 | del_timer_sync(&ohci->io_watchdog); |
1587 | + ohci->prev_frame_no = IO_WATCHDOG_OFF; |
1588 | |
1589 | ohci_writel (ohci, OHCI_INTR_MIE, &ohci->regs->intrdisable); |
1590 | ohci_usb_reset(ohci); |
1591 | diff --git a/drivers/usb/host/ohci-hub.c b/drivers/usb/host/ohci-hub.c |
1592 | index fb7aaa3b9d06..634f3c7bf774 100644 |
1593 | --- a/drivers/usb/host/ohci-hub.c |
1594 | +++ b/drivers/usb/host/ohci-hub.c |
1595 | @@ -311,8 +311,10 @@ static int ohci_bus_suspend (struct usb_hcd *hcd) |
1596 | rc = ohci_rh_suspend (ohci, 0); |
1597 | spin_unlock_irq (&ohci->lock); |
1598 | |
1599 | - if (rc == 0) |
1600 | + if (rc == 0) { |
1601 | del_timer_sync(&ohci->io_watchdog); |
1602 | + ohci->prev_frame_no = IO_WATCHDOG_OFF; |
1603 | + } |
1604 | return rc; |
1605 | } |
1606 | |
1607 | diff --git a/drivers/usb/host/ohci-q.c b/drivers/usb/host/ohci-q.c |
1608 | index b2ec8c399363..4ccb85a67bb3 100644 |
1609 | --- a/drivers/usb/host/ohci-q.c |
1610 | +++ b/drivers/usb/host/ohci-q.c |
1611 | @@ -1019,6 +1019,8 @@ static void finish_unlinks(struct ohci_hcd *ohci) |
1612 | * have modified this list. normally it's just prepending |
1613 | * entries (which we'd ignore), but paranoia won't hurt. |
1614 | */ |
1615 | + *last = ed->ed_next; |
1616 | + ed->ed_next = NULL; |
1617 | modified = 0; |
1618 | |
1619 | /* unlink urbs as requested, but rescan the list after |
1620 | @@ -1077,21 +1079,22 @@ static void finish_unlinks(struct ohci_hcd *ohci) |
1621 | goto rescan_this; |
1622 | |
1623 | /* |
1624 | - * If no TDs are queued, take ED off the ed_rm_list. |
1625 | + * If no TDs are queued, ED is now idle. |
1626 | * Otherwise, if the HC is running, reschedule. |
1627 | - * If not, leave it on the list for further dequeues. |
1628 | + * If the HC isn't running, add ED back to the |
1629 | + * start of the list for later processing. |
1630 | */ |
1631 | if (list_empty(&ed->td_list)) { |
1632 | - *last = ed->ed_next; |
1633 | - ed->ed_next = NULL; |
1634 | ed->state = ED_IDLE; |
1635 | list_del(&ed->in_use_list); |
1636 | } else if (ohci->rh_state == OHCI_RH_RUNNING) { |
1637 | - *last = ed->ed_next; |
1638 | - ed->ed_next = NULL; |
1639 | ed_schedule(ohci, ed); |
1640 | } else { |
1641 | - last = &ed->ed_next; |
1642 | + ed->ed_next = ohci->ed_rm_list; |
1643 | + ohci->ed_rm_list = ed; |
1644 | + /* Don't loop on the same ED */ |
1645 | + if (last == &ohci->ed_rm_list) |
1646 | + last = &ed->ed_next; |
1647 | } |
1648 | |
1649 | if (modified) |
1650 | diff --git a/drivers/usb/misc/ldusb.c b/drivers/usb/misc/ldusb.c |
1651 | index 5c1a3b852453..98ef7fcbda58 100644 |
1652 | --- a/drivers/usb/misc/ldusb.c |
1653 | +++ b/drivers/usb/misc/ldusb.c |
1654 | @@ -42,6 +42,9 @@ |
1655 | #define USB_DEVICE_ID_LD_MICROCASSYTIME 0x1033 /* USB Product ID of Micro-CASSY Time (reserved) */ |
1656 | #define USB_DEVICE_ID_LD_MICROCASSYTEMPERATURE 0x1035 /* USB Product ID of Micro-CASSY Temperature */ |
1657 | #define USB_DEVICE_ID_LD_MICROCASSYPH 0x1038 /* USB Product ID of Micro-CASSY pH */ |
1658 | +#define USB_DEVICE_ID_LD_POWERANALYSERCASSY 0x1040 /* USB Product ID of Power Analyser CASSY */ |
1659 | +#define USB_DEVICE_ID_LD_CONVERTERCONTROLLERCASSY 0x1042 /* USB Product ID of Converter Controller CASSY */ |
1660 | +#define USB_DEVICE_ID_LD_MACHINETESTCASSY 0x1043 /* USB Product ID of Machine Test CASSY */ |
1661 | #define USB_DEVICE_ID_LD_JWM 0x1080 /* USB Product ID of Joule and Wattmeter */ |
1662 | #define USB_DEVICE_ID_LD_DMMP 0x1081 /* USB Product ID of Digital Multimeter P (reserved) */ |
1663 | #define USB_DEVICE_ID_LD_UMIP 0x1090 /* USB Product ID of UMI P */ |
1664 | @@ -84,6 +87,9 @@ static const struct usb_device_id ld_usb_table[] = { |
1665 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYTIME) }, |
1666 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYTEMPERATURE) }, |
1667 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYPH) }, |
1668 | + { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POWERANALYSERCASSY) }, |
1669 | + { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_CONVERTERCONTROLLERCASSY) }, |
1670 | + { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MACHINETESTCASSY) }, |
1671 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_JWM) }, |
1672 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_DMMP) }, |
1673 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_UMIP) }, |
1674 | diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c |
1675 | index 2627363fb4fe..6f311212f3c5 100644 |
1676 | --- a/drivers/usb/musb/musb_host.c |
1677 | +++ b/drivers/usb/musb/musb_host.c |
1678 | @@ -393,13 +393,7 @@ static void musb_advance_schedule(struct musb *musb, struct urb *urb, |
1679 | } |
1680 | } |
1681 | |
1682 | - /* |
1683 | - * The pipe must be broken if current urb->status is set, so don't |
1684 | - * start next urb. |
1685 | - * TODO: to minimize the risk of regression, only check urb->status |
1686 | - * for RX, until we have a test case to understand the behavior of TX. |
1687 | - */ |
1688 | - if ((!status || !is_in) && qh && qh->is_ready) { |
1689 | + if (qh != NULL && qh->is_ready) { |
1690 | musb_dbg(musb, "... next ep%d %cX urb %p", |
1691 | hw_ep->epnum, is_in ? 'R' : 'T', next_urb(qh)); |
1692 | musb_start_urb(musb, is_in, qh); |
1693 | diff --git a/drivers/usb/phy/phy-mxs-usb.c b/drivers/usb/phy/phy-mxs-usb.c |
1694 | index da031c45395a..fbec863350f6 100644 |
1695 | --- a/drivers/usb/phy/phy-mxs-usb.c |
1696 | +++ b/drivers/usb/phy/phy-mxs-usb.c |
1697 | @@ -602,6 +602,9 @@ static enum usb_charger_type mxs_phy_charger_detect(struct usb_phy *phy) |
1698 | void __iomem *base = phy->io_priv; |
1699 | enum usb_charger_type chgr_type = UNKNOWN_TYPE; |
1700 | |
1701 | + if (!regmap) |
1702 | + return UNKNOWN_TYPE; |
1703 | + |
1704 | if (mxs_charger_data_contact_detect(mxs_phy)) |
1705 | return chgr_type; |
1706 | |
1707 | diff --git a/drivers/usb/renesas_usbhs/fifo.c b/drivers/usb/renesas_usbhs/fifo.c |
1708 | index 2d24ef3076ef..b295e204a575 100644 |
1709 | --- a/drivers/usb/renesas_usbhs/fifo.c |
1710 | +++ b/drivers/usb/renesas_usbhs/fifo.c |
1711 | @@ -989,6 +989,10 @@ static int usbhsf_dma_prepare_pop_with_usb_dmac(struct usbhs_pkt *pkt, |
1712 | if ((uintptr_t)pkt->buf & (USBHS_USB_DMAC_XFER_SIZE - 1)) |
1713 | goto usbhsf_pio_prepare_pop; |
1714 | |
1715 | + /* return at this time if the pipe is running */ |
1716 | + if (usbhs_pipe_is_running(pipe)) |
1717 | + return 0; |
1718 | + |
1719 | usbhs_pipe_config_change_bfre(pipe, 1); |
1720 | |
1721 | ret = usbhsf_fifo_select(pipe, fifo, 0); |
1722 | @@ -1179,6 +1183,7 @@ static int usbhsf_dma_pop_done_with_usb_dmac(struct usbhs_pkt *pkt, |
1723 | usbhsf_fifo_clear(pipe, fifo); |
1724 | pkt->actual = usbhs_dma_calc_received_size(pkt, chan, rcv_len); |
1725 | |
1726 | + usbhs_pipe_running(pipe, 0); |
1727 | usbhsf_dma_stop(pipe, fifo); |
1728 | usbhsf_dma_unmap(pkt); |
1729 | usbhsf_fifo_unselect(pipe, pipe->fifo); |
1730 | diff --git a/drivers/xen/tmem.c b/drivers/xen/tmem.c |
1731 | index bf13d1ec51f3..04e7b3b29bac 100644 |
1732 | --- a/drivers/xen/tmem.c |
1733 | +++ b/drivers/xen/tmem.c |
1734 | @@ -284,6 +284,10 @@ static int tmem_frontswap_store(unsigned type, pgoff_t offset, |
1735 | int pool = tmem_frontswap_poolid; |
1736 | int ret; |
1737 | |
1738 | + /* THP isn't supported */ |
1739 | + if (PageTransHuge(page)) |
1740 | + return -1; |
1741 | + |
1742 | if (pool < 0) |
1743 | return -1; |
1744 | if (ind64 != ind) |
1745 | diff --git a/include/drm/drm_atomic.h b/include/drm/drm_atomic.h |
1746 | index 5afd6e364fb6..c63b0b48e884 100644 |
1747 | --- a/include/drm/drm_atomic.h |
1748 | +++ b/include/drm/drm_atomic.h |
1749 | @@ -134,6 +134,15 @@ struct drm_crtc_commit { |
1750 | * &drm_pending_vblank_event pointer to clean up private events. |
1751 | */ |
1752 | struct drm_pending_vblank_event *event; |
1753 | + |
1754 | + /** |
1755 | + * @abort_completion: |
1756 | + * |
1757 | + * A flag that's set after drm_atomic_helper_setup_commit takes a second |
1758 | + * reference for the completion of $drm_crtc_state.event. It's used by |
1759 | + * the free code to remove the second reference if commit fails. |
1760 | + */ |
1761 | + bool abort_completion; |
1762 | }; |
1763 | |
1764 | struct __drm_planes_state { |
1765 | diff --git a/include/linux/kconfig.h b/include/linux/kconfig.h |
1766 | index fec5076eda91..dcde9471897d 100644 |
1767 | --- a/include/linux/kconfig.h |
1768 | +++ b/include/linux/kconfig.h |
1769 | @@ -4,6 +4,12 @@ |
1770 | |
1771 | #include <generated/autoconf.h> |
1772 | |
1773 | +#ifdef CONFIG_CPU_BIG_ENDIAN |
1774 | +#define __BIG_ENDIAN 4321 |
1775 | +#else |
1776 | +#define __LITTLE_ENDIAN 1234 |
1777 | +#endif |
1778 | + |
1779 | #define __ARG_PLACEHOLDER_1 0, |
1780 | #define __take_second_arg(__ignored, val, ...) val |
1781 | |
1782 | @@ -64,4 +70,7 @@ |
1783 | */ |
1784 | #define IS_ENABLED(option) __or(IS_BUILTIN(option), IS_MODULE(option)) |
1785 | |
1786 | +/* Make sure we always have all types and struct attributes defined. */ |
1787 | +#include <linux/compiler_types.h> |
1788 | + |
1789 | #endif /* __LINUX_KCONFIG_H */ |
1790 | diff --git a/include/uapi/linux/if_ether.h b/include/uapi/linux/if_ether.h |
1791 | index 144de4d2f385..153c9c2eaaa7 100644 |
1792 | --- a/include/uapi/linux/if_ether.h |
1793 | +++ b/include/uapi/linux/if_ether.h |
1794 | @@ -23,7 +23,6 @@ |
1795 | #define _UAPI_LINUX_IF_ETHER_H |
1796 | |
1797 | #include <linux/types.h> |
1798 | -#include <linux/libc-compat.h> |
1799 | |
1800 | /* |
1801 | * IEEE 802.3 Ethernet magic constants. The frame sizes omit the preamble |
1802 | @@ -150,6 +149,11 @@ |
1803 | * This is an Ethernet frame header. |
1804 | */ |
1805 | |
1806 | +/* allow libcs like musl to deactivate this, glibc does not implement this. */ |
1807 | +#ifndef __UAPI_DEF_ETHHDR |
1808 | +#define __UAPI_DEF_ETHHDR 1 |
1809 | +#endif |
1810 | + |
1811 | #if __UAPI_DEF_ETHHDR |
1812 | struct ethhdr { |
1813 | unsigned char h_dest[ETH_ALEN]; /* destination eth addr */ |
1814 | diff --git a/include/uapi/linux/libc-compat.h b/include/uapi/linux/libc-compat.h |
1815 | index fc29efaa918c..8254c937c9f4 100644 |
1816 | --- a/include/uapi/linux/libc-compat.h |
1817 | +++ b/include/uapi/linux/libc-compat.h |
1818 | @@ -264,10 +264,4 @@ |
1819 | |
1820 | #endif /* __GLIBC__ */ |
1821 | |
1822 | -/* Definitions for if_ether.h */ |
1823 | -/* allow libcs like musl to deactivate this, glibc does not implement this. */ |
1824 | -#ifndef __UAPI_DEF_ETHHDR |
1825 | -#define __UAPI_DEF_ETHHDR 1 |
1826 | -#endif |
1827 | - |
1828 | #endif /* _UAPI_LIBC_COMPAT_H */ |
1829 | diff --git a/kernel/irq/matrix.c b/kernel/irq/matrix.c |
1830 | index 5187dfe809ac..4c5770407031 100644 |
1831 | --- a/kernel/irq/matrix.c |
1832 | +++ b/kernel/irq/matrix.c |
1833 | @@ -16,6 +16,7 @@ struct cpumap { |
1834 | unsigned int available; |
1835 | unsigned int allocated; |
1836 | unsigned int managed; |
1837 | + bool initialized; |
1838 | bool online; |
1839 | unsigned long alloc_map[IRQ_MATRIX_SIZE]; |
1840 | unsigned long managed_map[IRQ_MATRIX_SIZE]; |
1841 | @@ -81,9 +82,11 @@ void irq_matrix_online(struct irq_matrix *m) |
1842 | |
1843 | BUG_ON(cm->online); |
1844 | |
1845 | - bitmap_zero(cm->alloc_map, m->matrix_bits); |
1846 | - cm->available = m->alloc_size - (cm->managed + m->systembits_inalloc); |
1847 | - cm->allocated = 0; |
1848 | + if (!cm->initialized) { |
1849 | + cm->available = m->alloc_size; |
1850 | + cm->available -= cm->managed + m->systembits_inalloc; |
1851 | + cm->initialized = true; |
1852 | + } |
1853 | m->global_available += cm->available; |
1854 | cm->online = true; |
1855 | m->online_maps++; |
1856 | @@ -370,14 +373,16 @@ void irq_matrix_free(struct irq_matrix *m, unsigned int cpu, |
1857 | if (WARN_ON_ONCE(bit < m->alloc_start || bit >= m->alloc_end)) |
1858 | return; |
1859 | |
1860 | - if (cm->online) { |
1861 | - clear_bit(bit, cm->alloc_map); |
1862 | - cm->allocated--; |
1863 | + clear_bit(bit, cm->alloc_map); |
1864 | + cm->allocated--; |
1865 | + |
1866 | + if (cm->online) |
1867 | m->total_allocated--; |
1868 | - if (!managed) { |
1869 | - cm->available++; |
1870 | + |
1871 | + if (!managed) { |
1872 | + cm->available++; |
1873 | + if (cm->online) |
1874 | m->global_available++; |
1875 | - } |
1876 | } |
1877 | trace_irq_matrix_free(bit, cpu, m, cm); |
1878 | } |
1879 | diff --git a/mm/page_alloc.c b/mm/page_alloc.c |
1880 | index d23818c5465a..9f927497f2f5 100644 |
1881 | --- a/mm/page_alloc.c |
1882 | +++ b/mm/page_alloc.c |
1883 | @@ -46,6 +46,7 @@ |
1884 | #include <linux/stop_machine.h> |
1885 | #include <linux/sort.h> |
1886 | #include <linux/pfn.h> |
1887 | +#include <xen/xen.h> |
1888 | #include <linux/backing-dev.h> |
1889 | #include <linux/fault-inject.h> |
1890 | #include <linux/page-isolation.h> |
1891 | @@ -347,6 +348,9 @@ static inline bool update_defer_init(pg_data_t *pgdat, |
1892 | /* Always populate low zones for address-contrained allocations */ |
1893 | if (zone_end < pgdat_end_pfn(pgdat)) |
1894 | return true; |
1895 | + /* Xen PV domains need page structures early */ |
1896 | + if (xen_pv_domain()) |
1897 | + return true; |
1898 | (*nr_initialised)++; |
1899 | if ((*nr_initialised > pgdat->static_init_pgcnt) && |
1900 | (pfn & (PAGES_PER_SECTION - 1)) == 0) { |
1901 | diff --git a/mm/zswap.c b/mm/zswap.c |
1902 | index d39581a076c3..597008a44f70 100644 |
1903 | --- a/mm/zswap.c |
1904 | +++ b/mm/zswap.c |
1905 | @@ -970,6 +970,12 @@ static int zswap_frontswap_store(unsigned type, pgoff_t offset, |
1906 | u8 *src, *dst; |
1907 | struct zswap_header *zhdr; |
1908 | |
1909 | + /* THP isn't supported */ |
1910 | + if (PageTransHuge(page)) { |
1911 | + ret = -EINVAL; |
1912 | + goto reject; |
1913 | + } |
1914 | + |
1915 | if (!zswap_enabled || !tree) { |
1916 | ret = -ENODEV; |
1917 | goto reject; |
1918 | diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c |
1919 | index c7df4969f80a..f56aab54e0c8 100644 |
1920 | --- a/net/ipv4/ip_sockglue.c |
1921 | +++ b/net/ipv4/ip_sockglue.c |
1922 | @@ -1563,10 +1563,7 @@ int ip_getsockopt(struct sock *sk, int level, |
1923 | if (get_user(len, optlen)) |
1924 | return -EFAULT; |
1925 | |
1926 | - lock_sock(sk); |
1927 | - err = nf_getsockopt(sk, PF_INET, optname, optval, |
1928 | - &len); |
1929 | - release_sock(sk); |
1930 | + err = nf_getsockopt(sk, PF_INET, optname, optval, &len); |
1931 | if (err >= 0) |
1932 | err = put_user(len, optlen); |
1933 | return err; |
1934 | @@ -1598,9 +1595,7 @@ int compat_ip_getsockopt(struct sock *sk, int level, int optname, |
1935 | if (get_user(len, optlen)) |
1936 | return -EFAULT; |
1937 | |
1938 | - lock_sock(sk); |
1939 | err = compat_nf_getsockopt(sk, PF_INET, optname, optval, &len); |
1940 | - release_sock(sk); |
1941 | if (err >= 0) |
1942 | err = put_user(len, optlen); |
1943 | return err; |
1944 | diff --git a/net/ipv6/ipv6_sockglue.c b/net/ipv6/ipv6_sockglue.c |
1945 | index d78d41fc4b1a..24535169663d 100644 |
1946 | --- a/net/ipv6/ipv6_sockglue.c |
1947 | +++ b/net/ipv6/ipv6_sockglue.c |
1948 | @@ -1367,10 +1367,7 @@ int ipv6_getsockopt(struct sock *sk, int level, int optname, |
1949 | if (get_user(len, optlen)) |
1950 | return -EFAULT; |
1951 | |
1952 | - lock_sock(sk); |
1953 | - err = nf_getsockopt(sk, PF_INET6, optname, optval, |
1954 | - &len); |
1955 | - release_sock(sk); |
1956 | + err = nf_getsockopt(sk, PF_INET6, optname, optval, &len); |
1957 | if (err >= 0) |
1958 | err = put_user(len, optlen); |
1959 | } |
1960 | @@ -1409,10 +1406,7 @@ int compat_ipv6_getsockopt(struct sock *sk, int level, int optname, |
1961 | if (get_user(len, optlen)) |
1962 | return -EFAULT; |
1963 | |
1964 | - lock_sock(sk); |
1965 | - err = compat_nf_getsockopt(sk, PF_INET6, |
1966 | - optname, optval, &len); |
1967 | - release_sock(sk); |
1968 | + err = compat_nf_getsockopt(sk, PF_INET6, optname, optval, &len); |
1969 | if (err >= 0) |
1970 | err = put_user(len, optlen); |
1971 | } |
1972 | diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c |
1973 | index fb15d3b97cb2..84f757c5d91a 100644 |
1974 | --- a/net/mac80211/cfg.c |
1975 | +++ b/net/mac80211/cfg.c |
1976 | @@ -2863,7 +2863,7 @@ cfg80211_beacon_dup(struct cfg80211_beacon_data *beacon) |
1977 | } |
1978 | if (beacon->probe_resp_len) { |
1979 | new_beacon->probe_resp_len = beacon->probe_resp_len; |
1980 | - beacon->probe_resp = pos; |
1981 | + new_beacon->probe_resp = pos; |
1982 | memcpy(pos, beacon->probe_resp, beacon->probe_resp_len); |
1983 | pos += beacon->probe_resp_len; |
1984 | } |