Contents of /trunk/kernel26-alx/patches-3.10/0155-3.10.56-all-fixes.patch
Parent Directory | Revision Log
Revision 2672 -
(show annotations)
(download)
Tue Jul 21 16:46:35 2015 UTC (9 years, 2 months ago) by niro
File size: 152756 byte(s)
Tue Jul 21 16:46:35 2015 UTC (9 years, 2 months ago) by niro
File size: 152756 byte(s)
-3.10.84-alx-r1
1 | diff --git a/Makefile b/Makefile |
2 | index 6141df04fcb5..03bd927522f7 100644 |
3 | --- a/Makefile |
4 | +++ b/Makefile |
5 | @@ -1,6 +1,6 @@ |
6 | VERSION = 3 |
7 | PATCHLEVEL = 10 |
8 | -SUBLEVEL = 55 |
9 | +SUBLEVEL = 56 |
10 | EXTRAVERSION = |
11 | NAME = TOSSUG Baby Fish |
12 | |
13 | diff --git a/arch/arm/configs/multi_v7_defconfig b/arch/arm/configs/multi_v7_defconfig |
14 | index 9ce8ba1a1433..adb9aa5c88c7 100644 |
15 | --- a/arch/arm/configs/multi_v7_defconfig |
16 | +++ b/arch/arm/configs/multi_v7_defconfig |
17 | @@ -48,6 +48,8 @@ CONFIG_SERIAL_SIRFSOC=y |
18 | CONFIG_SERIAL_SIRFSOC_CONSOLE=y |
19 | CONFIG_SERIAL_VT8500=y |
20 | CONFIG_SERIAL_VT8500_CONSOLE=y |
21 | +CONFIG_SERIAL_XILINX_PS_UART=y |
22 | +CONFIG_SERIAL_XILINX_PS_UART_CONSOLE=y |
23 | CONFIG_IPMI_HANDLER=y |
24 | CONFIG_IPMI_SI=y |
25 | CONFIG_I2C=y |
26 | diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S |
27 | index bc5bc0a97131..4bc816a74a2e 100644 |
28 | --- a/arch/arm/kernel/entry-common.S |
29 | +++ b/arch/arm/kernel/entry-common.S |
30 | @@ -362,6 +362,16 @@ ENTRY(vector_swi) |
31 | str r0, [sp, #S_OLD_R0] @ Save OLD_R0 |
32 | zero_fp |
33 | |
34 | +#ifdef CONFIG_ALIGNMENT_TRAP |
35 | + ldr ip, __cr_alignment |
36 | + ldr ip, [ip] |
37 | + mcr p15, 0, ip, c1, c0 @ update control register |
38 | +#endif |
39 | + |
40 | + enable_irq |
41 | + ct_user_exit |
42 | + get_thread_info tsk |
43 | + |
44 | /* |
45 | * Get the system call number. |
46 | */ |
47 | @@ -375,9 +385,9 @@ ENTRY(vector_swi) |
48 | #ifdef CONFIG_ARM_THUMB |
49 | tst r8, #PSR_T_BIT |
50 | movne r10, #0 @ no thumb OABI emulation |
51 | - ldreq r10, [lr, #-4] @ get SWI instruction |
52 | + USER( ldreq r10, [lr, #-4] ) @ get SWI instruction |
53 | #else |
54 | - ldr r10, [lr, #-4] @ get SWI instruction |
55 | + USER( ldr r10, [lr, #-4] ) @ get SWI instruction |
56 | #endif |
57 | #ifdef CONFIG_CPU_ENDIAN_BE8 |
58 | rev r10, r10 @ little endian instruction |
59 | @@ -392,22 +402,13 @@ ENTRY(vector_swi) |
60 | /* Legacy ABI only, possibly thumb mode. */ |
61 | tst r8, #PSR_T_BIT @ this is SPSR from save_user_regs |
62 | addne scno, r7, #__NR_SYSCALL_BASE @ put OS number in |
63 | - ldreq scno, [lr, #-4] |
64 | + USER( ldreq scno, [lr, #-4] ) |
65 | |
66 | #else |
67 | /* Legacy ABI only. */ |
68 | - ldr scno, [lr, #-4] @ get SWI instruction |
69 | + USER( ldr scno, [lr, #-4] ) @ get SWI instruction |
70 | #endif |
71 | |
72 | -#ifdef CONFIG_ALIGNMENT_TRAP |
73 | - ldr ip, __cr_alignment |
74 | - ldr ip, [ip] |
75 | - mcr p15, 0, ip, c1, c0 @ update control register |
76 | -#endif |
77 | - enable_irq |
78 | - ct_user_exit |
79 | - |
80 | - get_thread_info tsk |
81 | adr tbl, sys_call_table @ load syscall table pointer |
82 | |
83 | #if defined(CONFIG_OABI_COMPAT) |
84 | @@ -442,6 +443,21 @@ local_restart: |
85 | eor r0, scno, #__NR_SYSCALL_BASE @ put OS number back |
86 | bcs arm_syscall |
87 | b sys_ni_syscall @ not private func |
88 | + |
89 | +#if defined(CONFIG_OABI_COMPAT) || !defined(CONFIG_AEABI) |
90 | + /* |
91 | + * We failed to handle a fault trying to access the page |
92 | + * containing the swi instruction, but we're not really in a |
93 | + * position to return -EFAULT. Instead, return back to the |
94 | + * instruction and re-enter the user fault handling path trying |
95 | + * to page it in. This will likely result in sending SEGV to the |
96 | + * current task. |
97 | + */ |
98 | +9001: |
99 | + sub lr, lr, #4 |
100 | + str lr, [sp, #S_PC] |
101 | + b ret_fast_syscall |
102 | +#endif |
103 | ENDPROC(vector_swi) |
104 | |
105 | /* |
106 | diff --git a/arch/arm/kernel/irq.c b/arch/arm/kernel/irq.c |
107 | index 9723d17b8f38..1e782bdeee49 100644 |
108 | --- a/arch/arm/kernel/irq.c |
109 | +++ b/arch/arm/kernel/irq.c |
110 | @@ -163,7 +163,7 @@ static bool migrate_one_irq(struct irq_desc *desc) |
111 | c = irq_data_get_irq_chip(d); |
112 | if (!c->irq_set_affinity) |
113 | pr_debug("IRQ%u: unable to set affinity\n", d->irq); |
114 | - else if (c->irq_set_affinity(d, affinity, true) == IRQ_SET_MASK_OK && ret) |
115 | + else if (c->irq_set_affinity(d, affinity, false) == IRQ_SET_MASK_OK && ret) |
116 | cpumask_copy(d->affinity, affinity); |
117 | |
118 | return ret; |
119 | diff --git a/arch/arm/kernel/machine_kexec.c b/arch/arm/kernel/machine_kexec.c |
120 | index c3ef920823b6..70ae735dec53 100644 |
121 | --- a/arch/arm/kernel/machine_kexec.c |
122 | +++ b/arch/arm/kernel/machine_kexec.c |
123 | @@ -14,10 +14,11 @@ |
124 | #include <asm/pgalloc.h> |
125 | #include <asm/mmu_context.h> |
126 | #include <asm/cacheflush.h> |
127 | +#include <asm/fncpy.h> |
128 | #include <asm/mach-types.h> |
129 | #include <asm/system_misc.h> |
130 | |
131 | -extern const unsigned char relocate_new_kernel[]; |
132 | +extern void relocate_new_kernel(void); |
133 | extern const unsigned int relocate_new_kernel_size; |
134 | |
135 | extern unsigned long kexec_start_address; |
136 | @@ -133,6 +134,8 @@ void machine_kexec(struct kimage *image) |
137 | { |
138 | unsigned long page_list; |
139 | unsigned long reboot_code_buffer_phys; |
140 | + unsigned long reboot_entry = (unsigned long)relocate_new_kernel; |
141 | + unsigned long reboot_entry_phys; |
142 | void *reboot_code_buffer; |
143 | |
144 | if (num_online_cpus() > 1) { |
145 | @@ -156,18 +159,18 @@ void machine_kexec(struct kimage *image) |
146 | |
147 | |
148 | /* copy our kernel relocation code to the control code page */ |
149 | - memcpy(reboot_code_buffer, |
150 | - relocate_new_kernel, relocate_new_kernel_size); |
151 | + reboot_entry = fncpy(reboot_code_buffer, |
152 | + reboot_entry, |
153 | + relocate_new_kernel_size); |
154 | + reboot_entry_phys = (unsigned long)reboot_entry + |
155 | + (reboot_code_buffer_phys - (unsigned long)reboot_code_buffer); |
156 | |
157 | - |
158 | - flush_icache_range((unsigned long) reboot_code_buffer, |
159 | - (unsigned long) reboot_code_buffer + KEXEC_CONTROL_PAGE_SIZE); |
160 | printk(KERN_INFO "Bye!\n"); |
161 | |
162 | if (kexec_reinit) |
163 | kexec_reinit(); |
164 | |
165 | - soft_restart(reboot_code_buffer_phys); |
166 | + soft_restart(reboot_entry_phys); |
167 | } |
168 | |
169 | void arch_crash_save_vmcoreinfo(void) |
170 | diff --git a/arch/arm/kernel/relocate_kernel.S b/arch/arm/kernel/relocate_kernel.S |
171 | index d0cdedf4864d..95858966d84e 100644 |
172 | --- a/arch/arm/kernel/relocate_kernel.S |
173 | +++ b/arch/arm/kernel/relocate_kernel.S |
174 | @@ -2,10 +2,12 @@ |
175 | * relocate_kernel.S - put the kernel image in place to boot |
176 | */ |
177 | |
178 | +#include <linux/linkage.h> |
179 | #include <asm/kexec.h> |
180 | |
181 | - .globl relocate_new_kernel |
182 | -relocate_new_kernel: |
183 | + .align 3 /* not needed for this code, but keeps fncpy() happy */ |
184 | + |
185 | +ENTRY(relocate_new_kernel) |
186 | |
187 | ldr r0,kexec_indirection_page |
188 | ldr r1,kexec_start_address |
189 | @@ -79,6 +81,8 @@ kexec_mach_type: |
190 | kexec_boot_atags: |
191 | .long 0x0 |
192 | |
193 | +ENDPROC(relocate_new_kernel) |
194 | + |
195 | relocate_new_kernel_end: |
196 | |
197 | .globl relocate_new_kernel_size |
198 | diff --git a/arch/arm/mm/abort-ev6.S b/arch/arm/mm/abort-ev6.S |
199 | index 80741992a9fc..5d777a567c35 100644 |
200 | --- a/arch/arm/mm/abort-ev6.S |
201 | +++ b/arch/arm/mm/abort-ev6.S |
202 | @@ -17,12 +17,6 @@ |
203 | */ |
204 | .align 5 |
205 | ENTRY(v6_early_abort) |
206 | -#ifdef CONFIG_CPU_V6 |
207 | - sub r1, sp, #4 @ Get unused stack location |
208 | - strex r0, r1, [r1] @ Clear the exclusive monitor |
209 | -#elif defined(CONFIG_CPU_32v6K) |
210 | - clrex |
211 | -#endif |
212 | mrc p15, 0, r1, c5, c0, 0 @ get FSR |
213 | mrc p15, 0, r0, c6, c0, 0 @ get FAR |
214 | /* |
215 | diff --git a/arch/arm/mm/abort-ev7.S b/arch/arm/mm/abort-ev7.S |
216 | index 703375277ba6..4812ad054214 100644 |
217 | --- a/arch/arm/mm/abort-ev7.S |
218 | +++ b/arch/arm/mm/abort-ev7.S |
219 | @@ -13,12 +13,6 @@ |
220 | */ |
221 | .align 5 |
222 | ENTRY(v7_early_abort) |
223 | - /* |
224 | - * The effect of data aborts on on the exclusive access monitor are |
225 | - * UNPREDICTABLE. Do a CLREX to clear the state |
226 | - */ |
227 | - clrex |
228 | - |
229 | mrc p15, 0, r1, c5, c0, 0 @ get FSR |
230 | mrc p15, 0, r0, c6, c0, 0 @ get FAR |
231 | |
232 | diff --git a/arch/arm/mm/alignment.c b/arch/arm/mm/alignment.c |
233 | index 6f4585b89078..1fe0bf5c7375 100644 |
234 | --- a/arch/arm/mm/alignment.c |
235 | +++ b/arch/arm/mm/alignment.c |
236 | @@ -39,6 +39,7 @@ |
237 | * This code is not portable to processors with late data abort handling. |
238 | */ |
239 | #define CODING_BITS(i) (i & 0x0e000000) |
240 | +#define COND_BITS(i) (i & 0xf0000000) |
241 | |
242 | #define LDST_I_BIT(i) (i & (1 << 26)) /* Immediate constant */ |
243 | #define LDST_P_BIT(i) (i & (1 << 24)) /* Preindex */ |
244 | @@ -812,6 +813,8 @@ do_alignment(unsigned long addr, unsigned int fsr, struct pt_regs *regs) |
245 | break; |
246 | |
247 | case 0x04000000: /* ldr or str immediate */ |
248 | + if (COND_BITS(instr) == 0xf0000000) /* NEON VLDn, VSTn */ |
249 | + goto bad; |
250 | offset.un = OFFSET_BITS(instr); |
251 | handler = do_alignment_ldrstr; |
252 | break; |
253 | diff --git a/arch/arm64/include/asm/hw_breakpoint.h b/arch/arm64/include/asm/hw_breakpoint.h |
254 | index d064047612b1..52b484b6aa1a 100644 |
255 | --- a/arch/arm64/include/asm/hw_breakpoint.h |
256 | +++ b/arch/arm64/include/asm/hw_breakpoint.h |
257 | @@ -79,7 +79,6 @@ static inline void decode_ctrl_reg(u32 reg, |
258 | */ |
259 | #define ARM_MAX_BRP 16 |
260 | #define ARM_MAX_WRP 16 |
261 | -#define ARM_MAX_HBP_SLOTS (ARM_MAX_BRP + ARM_MAX_WRP) |
262 | |
263 | /* Virtual debug register bases. */ |
264 | #define AARCH64_DBG_REG_BVR 0 |
265 | diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c |
266 | index 46f02c3b5015..0860fc3077fc 100644 |
267 | --- a/arch/arm64/kernel/process.c |
268 | +++ b/arch/arm64/kernel/process.c |
269 | @@ -172,9 +172,27 @@ void exit_thread(void) |
270 | { |
271 | } |
272 | |
273 | +static void tls_thread_flush(void) |
274 | +{ |
275 | + asm ("msr tpidr_el0, xzr"); |
276 | + |
277 | + if (is_compat_task()) { |
278 | + current->thread.tp_value = 0; |
279 | + |
280 | + /* |
281 | + * We need to ensure ordering between the shadow state and the |
282 | + * hardware state, so that we don't corrupt the hardware state |
283 | + * with a stale shadow state during context switch. |
284 | + */ |
285 | + barrier(); |
286 | + asm ("msr tpidrro_el0, xzr"); |
287 | + } |
288 | +} |
289 | + |
290 | void flush_thread(void) |
291 | { |
292 | fpsimd_flush_thread(); |
293 | + tls_thread_flush(); |
294 | flush_ptrace_hw_breakpoint(current); |
295 | } |
296 | |
297 | diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c |
298 | index 85536688f753..33a74fc45959 100644 |
299 | --- a/arch/arm64/kernel/ptrace.c |
300 | +++ b/arch/arm64/kernel/ptrace.c |
301 | @@ -103,7 +103,8 @@ static void ptrace_hbptriggered(struct perf_event *bp, |
302 | break; |
303 | } |
304 | } |
305 | - for (i = ARM_MAX_BRP; i < ARM_MAX_HBP_SLOTS && !bp; ++i) { |
306 | + |
307 | + for (i = 0; i < ARM_MAX_WRP; ++i) { |
308 | if (current->thread.debug.hbp_watch[i] == bp) { |
309 | info.si_errno = -((i << 1) + 1); |
310 | break; |
311 | diff --git a/arch/arm64/kernel/sys_compat.c b/arch/arm64/kernel/sys_compat.c |
312 | index 26e9c4eeaba8..78039927c807 100644 |
313 | --- a/arch/arm64/kernel/sys_compat.c |
314 | +++ b/arch/arm64/kernel/sys_compat.c |
315 | @@ -79,6 +79,12 @@ long compat_arm_syscall(struct pt_regs *regs) |
316 | |
317 | case __ARM_NR_compat_set_tls: |
318 | current->thread.tp_value = regs->regs[0]; |
319 | + |
320 | + /* |
321 | + * Protect against register corruption from context switch. |
322 | + * See comment in tls_thread_flush. |
323 | + */ |
324 | + barrier(); |
325 | asm ("msr tpidrro_el0, %0" : : "r" (regs->regs[0])); |
326 | return 0; |
327 | |
328 | diff --git a/arch/mips/boot/compressed/decompress.c b/arch/mips/boot/compressed/decompress.c |
329 | index 2c9573098c0d..d498a1f9bccf 100644 |
330 | --- a/arch/mips/boot/compressed/decompress.c |
331 | +++ b/arch/mips/boot/compressed/decompress.c |
332 | @@ -13,6 +13,7 @@ |
333 | |
334 | #include <linux/types.h> |
335 | #include <linux/kernel.h> |
336 | +#include <linux/string.h> |
337 | |
338 | #include <asm/addrspace.h> |
339 | |
340 | diff --git a/arch/mips/kernel/mcount.S b/arch/mips/kernel/mcount.S |
341 | index 33d067148e61..3efbf0b29c1b 100644 |
342 | --- a/arch/mips/kernel/mcount.S |
343 | +++ b/arch/mips/kernel/mcount.S |
344 | @@ -123,7 +123,11 @@ NESTED(_mcount, PT_SIZE, ra) |
345 | nop |
346 | #endif |
347 | b ftrace_stub |
348 | +#ifdef CONFIG_32BIT |
349 | + addiu sp, sp, 8 |
350 | +#else |
351 | nop |
352 | +#endif |
353 | |
354 | static_trace: |
355 | MCOUNT_SAVE_REGS |
356 | @@ -133,6 +137,9 @@ static_trace: |
357 | move a1, AT /* arg2: parent's return address */ |
358 | |
359 | MCOUNT_RESTORE_REGS |
360 | +#ifdef CONFIG_32BIT |
361 | + addiu sp, sp, 8 |
362 | +#endif |
363 | .globl ftrace_stub |
364 | ftrace_stub: |
365 | RETURN_BACK |
366 | @@ -181,6 +188,11 @@ NESTED(ftrace_graph_caller, PT_SIZE, ra) |
367 | jal prepare_ftrace_return |
368 | nop |
369 | MCOUNT_RESTORE_REGS |
370 | +#ifndef CONFIG_DYNAMIC_FTRACE |
371 | +#ifdef CONFIG_32BIT |
372 | + addiu sp, sp, 8 |
373 | +#endif |
374 | +#endif |
375 | RETURN_BACK |
376 | END(ftrace_graph_caller) |
377 | |
378 | diff --git a/arch/parisc/Makefile b/arch/parisc/Makefile |
379 | index 96ec3982be8d..94607bfa273d 100644 |
380 | --- a/arch/parisc/Makefile |
381 | +++ b/arch/parisc/Makefile |
382 | @@ -46,7 +46,12 @@ cflags-y := -pipe |
383 | |
384 | # These flags should be implied by an hppa-linux configuration, but they |
385 | # are not in gcc 3.2. |
386 | -cflags-y += -mno-space-regs -mfast-indirect-calls |
387 | +cflags-y += -mno-space-regs |
388 | + |
389 | +# -mfast-indirect-calls is only relevant for 32-bit kernels. |
390 | +ifndef CONFIG_64BIT |
391 | +cflags-y += -mfast-indirect-calls |
392 | +endif |
393 | |
394 | # Currently we save and restore fpregs on all kernel entry/interruption paths. |
395 | # If that gets optimized, we might need to disable the use of fpregs in the |
396 | diff --git a/arch/powerpc/include/asm/ptrace.h b/arch/powerpc/include/asm/ptrace.h |
397 | index becc08e6a65c..637c97fcbeb5 100644 |
398 | --- a/arch/powerpc/include/asm/ptrace.h |
399 | +++ b/arch/powerpc/include/asm/ptrace.h |
400 | @@ -35,6 +35,12 @@ |
401 | STACK_FRAME_OVERHEAD + 288) |
402 | #define STACK_FRAME_MARKER 12 |
403 | |
404 | +#if defined(_CALL_ELF) && _CALL_ELF == 2 |
405 | +#define STACK_FRAME_MIN_SIZE 32 |
406 | +#else |
407 | +#define STACK_FRAME_MIN_SIZE STACK_FRAME_OVERHEAD |
408 | +#endif |
409 | + |
410 | /* Size of dummy stack frame allocated when calling signal handler. */ |
411 | #define __SIGNAL_FRAMESIZE 128 |
412 | #define __SIGNAL_FRAMESIZE32 64 |
413 | @@ -46,6 +52,7 @@ |
414 | #define STACK_FRAME_REGS_MARKER ASM_CONST(0x72656773) |
415 | #define STACK_INT_FRAME_SIZE (sizeof(struct pt_regs) + STACK_FRAME_OVERHEAD) |
416 | #define STACK_FRAME_MARKER 2 |
417 | +#define STACK_FRAME_MIN_SIZE STACK_FRAME_OVERHEAD |
418 | |
419 | /* Size of stack frame allocated when calling signal handler. */ |
420 | #define __SIGNAL_FRAMESIZE 64 |
421 | diff --git a/arch/powerpc/perf/callchain.c b/arch/powerpc/perf/callchain.c |
422 | index 74d1e780748b..2396dda282cd 100644 |
423 | --- a/arch/powerpc/perf/callchain.c |
424 | +++ b/arch/powerpc/perf/callchain.c |
425 | @@ -35,7 +35,7 @@ static int valid_next_sp(unsigned long sp, unsigned long prev_sp) |
426 | return 0; /* must be 16-byte aligned */ |
427 | if (!validate_sp(sp, current, STACK_FRAME_OVERHEAD)) |
428 | return 0; |
429 | - if (sp >= prev_sp + STACK_FRAME_OVERHEAD) |
430 | + if (sp >= prev_sp + STACK_FRAME_MIN_SIZE) |
431 | return 1; |
432 | /* |
433 | * sp could decrease when we jump off an interrupt stack |
434 | diff --git a/arch/x86/include/asm/fixmap.h b/arch/x86/include/asm/fixmap.h |
435 | index 0dc7d9e21c34..9d7d36c82fc2 100644 |
436 | --- a/arch/x86/include/asm/fixmap.h |
437 | +++ b/arch/x86/include/asm/fixmap.h |
438 | @@ -123,14 +123,14 @@ enum fixed_addresses { |
439 | __end_of_permanent_fixed_addresses, |
440 | |
441 | /* |
442 | - * 256 temporary boot-time mappings, used by early_ioremap(), |
443 | + * 512 temporary boot-time mappings, used by early_ioremap(), |
444 | * before ioremap() is functional. |
445 | * |
446 | - * If necessary we round it up to the next 256 pages boundary so |
447 | + * If necessary we round it up to the next 512 pages boundary so |
448 | * that we can have a single pgd entry and a single pte table: |
449 | */ |
450 | #define NR_FIX_BTMAPS 64 |
451 | -#define FIX_BTMAPS_SLOTS 4 |
452 | +#define FIX_BTMAPS_SLOTS 8 |
453 | #define TOTAL_FIX_BTMAPS (NR_FIX_BTMAPS * FIX_BTMAPS_SLOTS) |
454 | FIX_BTMAP_END = |
455 | (__end_of_permanent_fixed_addresses ^ |
456 | diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c |
457 | index fe862750583b..87084ab90d19 100644 |
458 | --- a/arch/x86/kernel/smpboot.c |
459 | +++ b/arch/x86/kernel/smpboot.c |
460 | @@ -1284,6 +1284,9 @@ static void remove_siblinginfo(int cpu) |
461 | |
462 | for_each_cpu(sibling, cpu_sibling_mask(cpu)) |
463 | cpumask_clear_cpu(cpu, cpu_sibling_mask(sibling)); |
464 | + for_each_cpu(sibling, cpu_llc_shared_mask(cpu)) |
465 | + cpumask_clear_cpu(cpu, cpu_llc_shared_mask(sibling)); |
466 | + cpumask_clear(cpu_llc_shared_mask(cpu)); |
467 | cpumask_clear(cpu_sibling_mask(cpu)); |
468 | cpumask_clear(cpu_core_mask(cpu)); |
469 | c->phys_proc_id = 0; |
470 | diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c |
471 | index 1be0a9e75d1f..e8753555f144 100644 |
472 | --- a/arch/x86/kvm/x86.c |
473 | +++ b/arch/x86/kvm/x86.c |
474 | @@ -1196,20 +1196,37 @@ void kvm_write_tsc(struct kvm_vcpu *vcpu, struct msr_data *msr) |
475 | elapsed = ns - kvm->arch.last_tsc_nsec; |
476 | |
477 | if (vcpu->arch.virtual_tsc_khz) { |
478 | + int faulted = 0; |
479 | + |
480 | /* n.b - signed multiplication and division required */ |
481 | usdiff = data - kvm->arch.last_tsc_write; |
482 | #ifdef CONFIG_X86_64 |
483 | usdiff = (usdiff * 1000) / vcpu->arch.virtual_tsc_khz; |
484 | #else |
485 | /* do_div() only does unsigned */ |
486 | - asm("idivl %2; xor %%edx, %%edx" |
487 | - : "=A"(usdiff) |
488 | - : "A"(usdiff * 1000), "rm"(vcpu->arch.virtual_tsc_khz)); |
489 | + asm("1: idivl %[divisor]\n" |
490 | + "2: xor %%edx, %%edx\n" |
491 | + " movl $0, %[faulted]\n" |
492 | + "3:\n" |
493 | + ".section .fixup,\"ax\"\n" |
494 | + "4: movl $1, %[faulted]\n" |
495 | + " jmp 3b\n" |
496 | + ".previous\n" |
497 | + |
498 | + _ASM_EXTABLE(1b, 4b) |
499 | + |
500 | + : "=A"(usdiff), [faulted] "=r" (faulted) |
501 | + : "A"(usdiff * 1000), [divisor] "rm"(vcpu->arch.virtual_tsc_khz)); |
502 | + |
503 | #endif |
504 | do_div(elapsed, 1000); |
505 | usdiff -= elapsed; |
506 | if (usdiff < 0) |
507 | usdiff = -usdiff; |
508 | + |
509 | + /* idivl overflow => difference is larger than USEC_PER_SEC */ |
510 | + if (faulted) |
511 | + usdiff = USEC_PER_SEC; |
512 | } else |
513 | usdiff = USEC_PER_SEC; /* disable TSC match window below */ |
514 | |
515 | diff --git a/arch/xtensa/include/asm/pgtable.h b/arch/xtensa/include/asm/pgtable.h |
516 | index d7546c94da52..385efb23ddce 100644 |
517 | --- a/arch/xtensa/include/asm/pgtable.h |
518 | +++ b/arch/xtensa/include/asm/pgtable.h |
519 | @@ -68,7 +68,12 @@ |
520 | #define VMALLOC_START 0xC0000000 |
521 | #define VMALLOC_END 0xC7FEFFFF |
522 | #define TLBTEMP_BASE_1 0xC7FF0000 |
523 | -#define TLBTEMP_BASE_2 0xC7FF8000 |
524 | +#define TLBTEMP_BASE_2 (TLBTEMP_BASE_1 + DCACHE_WAY_SIZE) |
525 | +#if 2 * DCACHE_WAY_SIZE > ICACHE_WAY_SIZE |
526 | +#define TLBTEMP_SIZE (2 * DCACHE_WAY_SIZE) |
527 | +#else |
528 | +#define TLBTEMP_SIZE ICACHE_WAY_SIZE |
529 | +#endif |
530 | |
531 | /* |
532 | * Xtensa Linux config PTE layout (when present): |
533 | diff --git a/arch/xtensa/include/asm/uaccess.h b/arch/xtensa/include/asm/uaccess.h |
534 | index fd686dc45d1a..c7211e7e182d 100644 |
535 | --- a/arch/xtensa/include/asm/uaccess.h |
536 | +++ b/arch/xtensa/include/asm/uaccess.h |
537 | @@ -52,7 +52,12 @@ |
538 | */ |
539 | .macro get_fs ad, sp |
540 | GET_CURRENT(\ad,\sp) |
541 | +#if THREAD_CURRENT_DS > 1020 |
542 | + addi \ad, \ad, TASK_THREAD |
543 | + l32i \ad, \ad, THREAD_CURRENT_DS - TASK_THREAD |
544 | +#else |
545 | l32i \ad, \ad, THREAD_CURRENT_DS |
546 | +#endif |
547 | .endm |
548 | |
549 | /* |
550 | diff --git a/arch/xtensa/include/uapi/asm/ioctls.h b/arch/xtensa/include/uapi/asm/ioctls.h |
551 | index b4cb1100c0fb..a47909f0c34b 100644 |
552 | --- a/arch/xtensa/include/uapi/asm/ioctls.h |
553 | +++ b/arch/xtensa/include/uapi/asm/ioctls.h |
554 | @@ -28,17 +28,17 @@ |
555 | #define TCSETSW 0x5403 |
556 | #define TCSETSF 0x5404 |
557 | |
558 | -#define TCGETA _IOR('t', 23, struct termio) |
559 | -#define TCSETA _IOW('t', 24, struct termio) |
560 | -#define TCSETAW _IOW('t', 25, struct termio) |
561 | -#define TCSETAF _IOW('t', 28, struct termio) |
562 | +#define TCGETA 0x80127417 /* _IOR('t', 23, struct termio) */ |
563 | +#define TCSETA 0x40127418 /* _IOW('t', 24, struct termio) */ |
564 | +#define TCSETAW 0x40127419 /* _IOW('t', 25, struct termio) */ |
565 | +#define TCSETAF 0x4012741C /* _IOW('t', 28, struct termio) */ |
566 | |
567 | #define TCSBRK _IO('t', 29) |
568 | #define TCXONC _IO('t', 30) |
569 | #define TCFLSH _IO('t', 31) |
570 | |
571 | -#define TIOCSWINSZ _IOW('t', 103, struct winsize) |
572 | -#define TIOCGWINSZ _IOR('t', 104, struct winsize) |
573 | +#define TIOCSWINSZ 0x40087467 /* _IOW('t', 103, struct winsize) */ |
574 | +#define TIOCGWINSZ 0x80087468 /* _IOR('t', 104, struct winsize) */ |
575 | #define TIOCSTART _IO('t', 110) /* start output, like ^Q */ |
576 | #define TIOCSTOP _IO('t', 111) /* stop output, like ^S */ |
577 | #define TIOCOUTQ _IOR('t', 115, int) /* output queue size */ |
578 | @@ -88,7 +88,6 @@ |
579 | #define TIOCSETD _IOW('T', 35, int) |
580 | #define TIOCGETD _IOR('T', 36, int) |
581 | #define TCSBRKP _IOW('T', 37, int) /* Needed for POSIX tcsendbreak()*/ |
582 | -#define TIOCTTYGSTRUCT _IOR('T', 38, struct tty_struct) /* For debugging only*/ |
583 | #define TIOCSBRK _IO('T', 39) /* BSD compatibility */ |
584 | #define TIOCCBRK _IO('T', 40) /* BSD compatibility */ |
585 | #define TIOCGSID _IOR('T', 41, pid_t) /* Return the session ID of FD*/ |
586 | @@ -114,8 +113,10 @@ |
587 | #define TIOCSERGETLSR _IOR('T', 89, unsigned int) /* Get line status reg. */ |
588 | /* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */ |
589 | # define TIOCSER_TEMT 0x01 /* Transmitter physically empty */ |
590 | -#define TIOCSERGETMULTI _IOR('T', 90, struct serial_multiport_struct) /* Get multiport config */ |
591 | -#define TIOCSERSETMULTI _IOW('T', 91, struct serial_multiport_struct) /* Set multiport config */ |
592 | +#define TIOCSERGETMULTI 0x80a8545a /* Get multiport config */ |
593 | + /* _IOR('T', 90, struct serial_multiport_struct) */ |
594 | +#define TIOCSERSETMULTI 0x40a8545b /* Set multiport config */ |
595 | + /* _IOW('T', 91, struct serial_multiport_struct) */ |
596 | |
597 | #define TIOCMIWAIT _IO('T', 92) /* wait for a change on serial input line(s) */ |
598 | #define TIOCGICOUNT 0x545D /* read serial port inline interrupt counts */ |
599 | diff --git a/arch/xtensa/kernel/entry.S b/arch/xtensa/kernel/entry.S |
600 | index aa7f9add7d77..6e53174f8556 100644 |
601 | --- a/arch/xtensa/kernel/entry.S |
602 | +++ b/arch/xtensa/kernel/entry.S |
603 | @@ -1121,9 +1121,8 @@ ENTRY(fast_syscall_xtensa) |
604 | movi a7, 4 # sizeof(unsigned int) |
605 | access_ok a3, a7, a0, a2, .Leac # a0: scratch reg, a2: sp |
606 | |
607 | - addi a6, a6, -1 # assuming SYS_XTENSA_ATOMIC_SET = 1 |
608 | - _bgeui a6, SYS_XTENSA_COUNT - 1, .Lill |
609 | - _bnei a6, SYS_XTENSA_ATOMIC_CMP_SWP - 1, .Lnswp |
610 | + _bgeui a6, SYS_XTENSA_COUNT, .Lill |
611 | + _bnei a6, SYS_XTENSA_ATOMIC_CMP_SWP, .Lnswp |
612 | |
613 | /* Fall through for ATOMIC_CMP_SWP. */ |
614 | |
615 | @@ -1135,27 +1134,26 @@ TRY s32i a5, a3, 0 # different, modify value |
616 | l32i a7, a2, PT_AREG7 # restore a7 |
617 | l32i a0, a2, PT_AREG0 # restore a0 |
618 | movi a2, 1 # and return 1 |
619 | - addi a6, a6, 1 # restore a6 (really necessary?) |
620 | rfe |
621 | |
622 | 1: l32i a7, a2, PT_AREG7 # restore a7 |
623 | l32i a0, a2, PT_AREG0 # restore a0 |
624 | movi a2, 0 # return 0 (note that we cannot set |
625 | - addi a6, a6, 1 # restore a6 (really necessary?) |
626 | rfe |
627 | |
628 | .Lnswp: /* Atomic set, add, and exg_add. */ |
629 | |
630 | TRY l32i a7, a3, 0 # orig |
631 | + addi a6, a6, -SYS_XTENSA_ATOMIC_SET |
632 | add a0, a4, a7 # + arg |
633 | moveqz a0, a4, a6 # set |
634 | + addi a6, a6, SYS_XTENSA_ATOMIC_SET |
635 | TRY s32i a0, a3, 0 # write new value |
636 | |
637 | mov a0, a2 |
638 | mov a2, a7 |
639 | l32i a7, a0, PT_AREG7 # restore a7 |
640 | l32i a0, a0, PT_AREG0 # restore a0 |
641 | - addi a6, a6, 1 # restore a6 (really necessary?) |
642 | rfe |
643 | |
644 | CATCH |
645 | @@ -1164,7 +1162,7 @@ CATCH |
646 | movi a2, -EFAULT |
647 | rfe |
648 | |
649 | -.Lill: l32i a7, a2, PT_AREG0 # restore a7 |
650 | +.Lill: l32i a7, a2, PT_AREG7 # restore a7 |
651 | l32i a0, a2, PT_AREG0 # restore a0 |
652 | movi a2, -EINVAL |
653 | rfe |
654 | @@ -1703,7 +1701,7 @@ ENTRY(fast_second_level_miss) |
655 | rsr a0, excvaddr |
656 | bltu a0, a3, 2f |
657 | |
658 | - addi a1, a0, -(2 << (DCACHE_ALIAS_ORDER + PAGE_SHIFT)) |
659 | + addi a1, a0, -TLBTEMP_SIZE |
660 | bgeu a1, a3, 2f |
661 | |
662 | /* Check if we have to restore an ITLB mapping. */ |
663 | @@ -1961,7 +1959,6 @@ ENTRY(_switch_to) |
664 | |
665 | entry a1, 16 |
666 | |
667 | - mov a10, a2 # preserve 'prev' (a2) |
668 | mov a11, a3 # and 'next' (a3) |
669 | |
670 | l32i a4, a2, TASK_THREAD_INFO |
671 | @@ -1969,8 +1966,14 @@ ENTRY(_switch_to) |
672 | |
673 | save_xtregs_user a4 a6 a8 a9 a12 a13 THREAD_XTREGS_USER |
674 | |
675 | - s32i a0, a10, THREAD_RA # save return address |
676 | - s32i a1, a10, THREAD_SP # save stack pointer |
677 | +#if THREAD_RA > 1020 || THREAD_SP > 1020 |
678 | + addi a10, a2, TASK_THREAD |
679 | + s32i a0, a10, THREAD_RA - TASK_THREAD # save return address |
680 | + s32i a1, a10, THREAD_SP - TASK_THREAD # save stack pointer |
681 | +#else |
682 | + s32i a0, a2, THREAD_RA # save return address |
683 | + s32i a1, a2, THREAD_SP # save stack pointer |
684 | +#endif |
685 | |
686 | /* Disable ints while we manipulate the stack pointer. */ |
687 | |
688 | @@ -2011,7 +2014,6 @@ ENTRY(_switch_to) |
689 | load_xtregs_user a5 a6 a8 a9 a12 a13 THREAD_XTREGS_USER |
690 | |
691 | wsr a14, ps |
692 | - mov a2, a10 # return 'prev' |
693 | rsync |
694 | |
695 | retw |
696 | diff --git a/arch/xtensa/kernel/pci-dma.c b/arch/xtensa/kernel/pci-dma.c |
697 | index 2d9cc6dbfd78..e8b76b8e4b29 100644 |
698 | --- a/arch/xtensa/kernel/pci-dma.c |
699 | +++ b/arch/xtensa/kernel/pci-dma.c |
700 | @@ -49,9 +49,8 @@ dma_alloc_coherent(struct device *dev,size_t size,dma_addr_t *handle,gfp_t flag) |
701 | |
702 | /* We currently don't support coherent memory outside KSEG */ |
703 | |
704 | - if (ret < XCHAL_KSEG_CACHED_VADDR |
705 | - || ret >= XCHAL_KSEG_CACHED_VADDR + XCHAL_KSEG_SIZE) |
706 | - BUG(); |
707 | + BUG_ON(ret < XCHAL_KSEG_CACHED_VADDR || |
708 | + ret > XCHAL_KSEG_CACHED_VADDR + XCHAL_KSEG_SIZE - 1); |
709 | |
710 | |
711 | if (ret != 0) { |
712 | @@ -68,10 +67,11 @@ EXPORT_SYMBOL(dma_alloc_coherent); |
713 | void dma_free_coherent(struct device *hwdev, size_t size, |
714 | void *vaddr, dma_addr_t dma_handle) |
715 | { |
716 | - long addr=(long)vaddr+XCHAL_KSEG_CACHED_VADDR-XCHAL_KSEG_BYPASS_VADDR; |
717 | + unsigned long addr = (unsigned long)vaddr + |
718 | + XCHAL_KSEG_CACHED_VADDR - XCHAL_KSEG_BYPASS_VADDR; |
719 | |
720 | - if (addr < 0 || addr >= XCHAL_KSEG_SIZE) |
721 | - BUG(); |
722 | + BUG_ON(addr < XCHAL_KSEG_CACHED_VADDR || |
723 | + addr > XCHAL_KSEG_CACHED_VADDR + XCHAL_KSEG_SIZE - 1); |
724 | |
725 | free_pages(addr, get_order(size)); |
726 | } |
727 | diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c |
728 | index c410752c5c65..c981097dd634 100644 |
729 | --- a/block/cfq-iosched.c |
730 | +++ b/block/cfq-iosched.c |
731 | @@ -1275,12 +1275,16 @@ __cfq_group_service_tree_add(struct cfq_rb_root *st, struct cfq_group *cfqg) |
732 | static void |
733 | cfq_update_group_weight(struct cfq_group *cfqg) |
734 | { |
735 | - BUG_ON(!RB_EMPTY_NODE(&cfqg->rb_node)); |
736 | - |
737 | if (cfqg->new_weight) { |
738 | cfqg->weight = cfqg->new_weight; |
739 | cfqg->new_weight = 0; |
740 | } |
741 | +} |
742 | + |
743 | +static void |
744 | +cfq_update_group_leaf_weight(struct cfq_group *cfqg) |
745 | +{ |
746 | + BUG_ON(!RB_EMPTY_NODE(&cfqg->rb_node)); |
747 | |
748 | if (cfqg->new_leaf_weight) { |
749 | cfqg->leaf_weight = cfqg->new_leaf_weight; |
750 | @@ -1299,7 +1303,7 @@ cfq_group_service_tree_add(struct cfq_rb_root *st, struct cfq_group *cfqg) |
751 | /* add to the service tree */ |
752 | BUG_ON(!RB_EMPTY_NODE(&cfqg->rb_node)); |
753 | |
754 | - cfq_update_group_weight(cfqg); |
755 | + cfq_update_group_leaf_weight(cfqg); |
756 | __cfq_group_service_tree_add(st, cfqg); |
757 | |
758 | /* |
759 | @@ -1323,6 +1327,7 @@ cfq_group_service_tree_add(struct cfq_rb_root *st, struct cfq_group *cfqg) |
760 | */ |
761 | while ((parent = cfqg_parent(pos))) { |
762 | if (propagate) { |
763 | + cfq_update_group_weight(pos); |
764 | propagate = !parent->nr_active++; |
765 | parent->children_weight += pos->weight; |
766 | } |
767 | diff --git a/block/genhd.c b/block/genhd.c |
768 | index cdeb5277dfd4..e670148c3773 100644 |
769 | --- a/block/genhd.c |
770 | +++ b/block/genhd.c |
771 | @@ -28,10 +28,10 @@ struct kobject *block_depr; |
772 | /* for extended dynamic devt allocation, currently only one major is used */ |
773 | #define NR_EXT_DEVT (1 << MINORBITS) |
774 | |
775 | -/* For extended devt allocation. ext_devt_mutex prevents look up |
776 | +/* For extended devt allocation. ext_devt_lock prevents look up |
777 | * results from going away underneath its user. |
778 | */ |
779 | -static DEFINE_MUTEX(ext_devt_mutex); |
780 | +static DEFINE_SPINLOCK(ext_devt_lock); |
781 | static DEFINE_IDR(ext_devt_idr); |
782 | |
783 | static struct device_type disk_type; |
784 | @@ -420,9 +420,13 @@ int blk_alloc_devt(struct hd_struct *part, dev_t *devt) |
785 | } |
786 | |
787 | /* allocate ext devt */ |
788 | - mutex_lock(&ext_devt_mutex); |
789 | - idx = idr_alloc(&ext_devt_idr, part, 0, NR_EXT_DEVT, GFP_KERNEL); |
790 | - mutex_unlock(&ext_devt_mutex); |
791 | + idr_preload(GFP_KERNEL); |
792 | + |
793 | + spin_lock(&ext_devt_lock); |
794 | + idx = idr_alloc(&ext_devt_idr, part, 0, NR_EXT_DEVT, GFP_NOWAIT); |
795 | + spin_unlock(&ext_devt_lock); |
796 | + |
797 | + idr_preload_end(); |
798 | if (idx < 0) |
799 | return idx == -ENOSPC ? -EBUSY : idx; |
800 | |
801 | @@ -441,15 +445,13 @@ int blk_alloc_devt(struct hd_struct *part, dev_t *devt) |
802 | */ |
803 | void blk_free_devt(dev_t devt) |
804 | { |
805 | - might_sleep(); |
806 | - |
807 | if (devt == MKDEV(0, 0)) |
808 | return; |
809 | |
810 | if (MAJOR(devt) == BLOCK_EXT_MAJOR) { |
811 | - mutex_lock(&ext_devt_mutex); |
812 | + spin_lock(&ext_devt_lock); |
813 | idr_remove(&ext_devt_idr, blk_mangle_minor(MINOR(devt))); |
814 | - mutex_unlock(&ext_devt_mutex); |
815 | + spin_unlock(&ext_devt_lock); |
816 | } |
817 | } |
818 | |
819 | @@ -665,7 +667,6 @@ void del_gendisk(struct gendisk *disk) |
820 | sysfs_remove_link(block_depr, dev_name(disk_to_dev(disk))); |
821 | pm_runtime_set_memalloc_noio(disk_to_dev(disk), false); |
822 | device_del(disk_to_dev(disk)); |
823 | - blk_free_devt(disk_to_dev(disk)->devt); |
824 | } |
825 | EXPORT_SYMBOL(del_gendisk); |
826 | |
827 | @@ -690,13 +691,13 @@ struct gendisk *get_gendisk(dev_t devt, int *partno) |
828 | } else { |
829 | struct hd_struct *part; |
830 | |
831 | - mutex_lock(&ext_devt_mutex); |
832 | + spin_lock(&ext_devt_lock); |
833 | part = idr_find(&ext_devt_idr, blk_mangle_minor(MINOR(devt))); |
834 | if (part && get_disk(part_to_disk(part))) { |
835 | *partno = part->partno; |
836 | disk = part_to_disk(part); |
837 | } |
838 | - mutex_unlock(&ext_devt_mutex); |
839 | + spin_unlock(&ext_devt_lock); |
840 | } |
841 | |
842 | return disk; |
843 | @@ -1098,6 +1099,7 @@ static void disk_release(struct device *dev) |
844 | { |
845 | struct gendisk *disk = dev_to_disk(dev); |
846 | |
847 | + blk_free_devt(dev->devt); |
848 | disk_release_events(disk); |
849 | kfree(disk->random); |
850 | disk_replace_part_tbl(disk, NULL); |
851 | diff --git a/block/partition-generic.c b/block/partition-generic.c |
852 | index 789cdea05893..0d9e5f97f0a8 100644 |
853 | --- a/block/partition-generic.c |
854 | +++ b/block/partition-generic.c |
855 | @@ -211,6 +211,7 @@ static const struct attribute_group *part_attr_groups[] = { |
856 | static void part_release(struct device *dev) |
857 | { |
858 | struct hd_struct *p = dev_to_part(dev); |
859 | + blk_free_devt(dev->devt); |
860 | free_part_stats(p); |
861 | free_part_info(p); |
862 | kfree(p); |
863 | @@ -253,7 +254,6 @@ void delete_partition(struct gendisk *disk, int partno) |
864 | rcu_assign_pointer(ptbl->last_lookup, NULL); |
865 | kobject_put(part->holder_dir); |
866 | device_del(part_to_dev(part)); |
867 | - blk_free_devt(part_devt(part)); |
868 | |
869 | hd_struct_put(part); |
870 | } |
871 | diff --git a/drivers/acpi/acpica/aclocal.h b/drivers/acpi/acpica/aclocal.h |
872 | index d5bfbd331bfd..95896886fc5a 100644 |
873 | --- a/drivers/acpi/acpica/aclocal.h |
874 | +++ b/drivers/acpi/acpica/aclocal.h |
875 | @@ -254,6 +254,7 @@ struct acpi_create_field_info { |
876 | u32 field_bit_position; |
877 | u32 field_bit_length; |
878 | u16 resource_length; |
879 | + u16 pin_number_index; |
880 | u8 field_flags; |
881 | u8 attribute; |
882 | u8 field_type; |
883 | diff --git a/drivers/acpi/acpica/acobject.h b/drivers/acpi/acpica/acobject.h |
884 | index cc7ab6dd724e..a47cc78ffd4f 100644 |
885 | --- a/drivers/acpi/acpica/acobject.h |
886 | +++ b/drivers/acpi/acpica/acobject.h |
887 | @@ -263,6 +263,7 @@ struct acpi_object_region_field { |
888 | ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_FIELD_INFO u16 resource_length; |
889 | union acpi_operand_object *region_obj; /* Containing op_region object */ |
890 | u8 *resource_buffer; /* resource_template for serial regions/fields */ |
891 | + u16 pin_number_index; /* Index relative to previous Connection/Template */ |
892 | }; |
893 | |
894 | struct acpi_object_bank_field { |
895 | diff --git a/drivers/acpi/acpica/dsfield.c b/drivers/acpi/acpica/dsfield.c |
896 | index feadeed1012d..e651d4ec7c4c 100644 |
897 | --- a/drivers/acpi/acpica/dsfield.c |
898 | +++ b/drivers/acpi/acpica/dsfield.c |
899 | @@ -360,6 +360,7 @@ acpi_ds_get_field_names(struct acpi_create_field_info *info, |
900 | */ |
901 | info->resource_buffer = NULL; |
902 | info->connection_node = NULL; |
903 | + info->pin_number_index = 0; |
904 | |
905 | /* |
906 | * A Connection() is either an actual resource descriptor (buffer) |
907 | @@ -437,6 +438,7 @@ acpi_ds_get_field_names(struct acpi_create_field_info *info, |
908 | } |
909 | |
910 | info->field_bit_position += info->field_bit_length; |
911 | + info->pin_number_index++; /* Index relative to previous Connection() */ |
912 | break; |
913 | |
914 | default: |
915 | diff --git a/drivers/acpi/acpica/evregion.c b/drivers/acpi/acpica/evregion.c |
916 | index 6555e350fc1f..8fab9262d98a 100644 |
917 | --- a/drivers/acpi/acpica/evregion.c |
918 | +++ b/drivers/acpi/acpica/evregion.c |
919 | @@ -141,6 +141,7 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj, |
920 | union acpi_operand_object *region_obj2; |
921 | void *region_context = NULL; |
922 | struct acpi_connection_info *context; |
923 | + acpi_physical_address address; |
924 | |
925 | ACPI_FUNCTION_TRACE(ev_address_space_dispatch); |
926 | |
927 | @@ -235,25 +236,23 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj, |
928 | /* We have everything we need, we can invoke the address space handler */ |
929 | |
930 | handler = handler_desc->address_space.handler; |
931 | - |
932 | - ACPI_DEBUG_PRINT((ACPI_DB_OPREGION, |
933 | - "Handler %p (@%p) Address %8.8X%8.8X [%s]\n", |
934 | - ®ion_obj->region.handler->address_space, handler, |
935 | - ACPI_FORMAT_NATIVE_UINT(region_obj->region.address + |
936 | - region_offset), |
937 | - acpi_ut_get_region_name(region_obj->region. |
938 | - space_id))); |
939 | + address = (region_obj->region.address + region_offset); |
940 | |
941 | /* |
942 | * Special handling for generic_serial_bus and general_purpose_io: |
943 | * There are three extra parameters that must be passed to the |
944 | * handler via the context: |
945 | - * 1) Connection buffer, a resource template from Connection() op. |
946 | - * 2) Length of the above buffer. |
947 | - * 3) Actual access length from the access_as() op. |
948 | + * 1) Connection buffer, a resource template from Connection() op |
949 | + * 2) Length of the above buffer |
950 | + * 3) Actual access length from the access_as() op |
951 | + * |
952 | + * In addition, for general_purpose_io, the Address and bit_width fields |
953 | + * are defined as follows: |
954 | + * 1) Address is the pin number index of the field (bit offset from |
955 | + * the previous Connection) |
956 | + * 2) bit_width is the actual bit length of the field (number of pins) |
957 | */ |
958 | - if (((region_obj->region.space_id == ACPI_ADR_SPACE_GSBUS) || |
959 | - (region_obj->region.space_id == ACPI_ADR_SPACE_GPIO)) && |
960 | + if ((region_obj->region.space_id == ACPI_ADR_SPACE_GSBUS) && |
961 | context && field_obj) { |
962 | |
963 | /* Get the Connection (resource_template) buffer */ |
964 | @@ -262,6 +261,24 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj, |
965 | context->length = field_obj->field.resource_length; |
966 | context->access_length = field_obj->field.access_length; |
967 | } |
968 | + if ((region_obj->region.space_id == ACPI_ADR_SPACE_GPIO) && |
969 | + context && field_obj) { |
970 | + |
971 | + /* Get the Connection (resource_template) buffer */ |
972 | + |
973 | + context->connection = field_obj->field.resource_buffer; |
974 | + context->length = field_obj->field.resource_length; |
975 | + context->access_length = field_obj->field.access_length; |
976 | + address = field_obj->field.pin_number_index; |
977 | + bit_width = field_obj->field.bit_length; |
978 | + } |
979 | + |
980 | + ACPI_DEBUG_PRINT((ACPI_DB_OPREGION, |
981 | + "Handler %p (@%p) Address %8.8X%8.8X [%s]\n", |
982 | + ®ion_obj->region.handler->address_space, handler, |
983 | + ACPI_FORMAT_NATIVE_UINT(address), |
984 | + acpi_ut_get_region_name(region_obj->region. |
985 | + space_id))); |
986 | |
987 | if (!(handler_desc->address_space.handler_flags & |
988 | ACPI_ADDR_HANDLER_DEFAULT_INSTALLED)) { |
989 | @@ -275,9 +292,7 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj, |
990 | |
991 | /* Call the handler */ |
992 | |
993 | - status = handler(function, |
994 | - (region_obj->region.address + region_offset), |
995 | - bit_width, value, context, |
996 | + status = handler(function, address, bit_width, value, context, |
997 | region_obj2->extra.region_context); |
998 | |
999 | if (ACPI_FAILURE(status)) { |
1000 | diff --git a/drivers/acpi/acpica/exfield.c b/drivers/acpi/acpica/exfield.c |
1001 | index 7d4bae71e8c6..0108d59665ab 100644 |
1002 | --- a/drivers/acpi/acpica/exfield.c |
1003 | +++ b/drivers/acpi/acpica/exfield.c |
1004 | @@ -178,6 +178,37 @@ acpi_ex_read_data_from_field(struct acpi_walk_state *walk_state, |
1005 | buffer = &buffer_desc->integer.value; |
1006 | } |
1007 | |
1008 | + if ((obj_desc->common.type == ACPI_TYPE_LOCAL_REGION_FIELD) && |
1009 | + (obj_desc->field.region_obj->region.space_id == |
1010 | + ACPI_ADR_SPACE_GPIO)) { |
1011 | + /* |
1012 | + * For GPIO (general_purpose_io), the Address will be the bit offset |
1013 | + * from the previous Connection() operator, making it effectively a |
1014 | + * pin number index. The bit_length is the length of the field, which |
1015 | + * is thus the number of pins. |
1016 | + */ |
1017 | + ACPI_DEBUG_PRINT((ACPI_DB_BFIELD, |
1018 | + "GPIO FieldRead [FROM]: Pin %u Bits %u\n", |
1019 | + obj_desc->field.pin_number_index, |
1020 | + obj_desc->field.bit_length)); |
1021 | + |
1022 | + /* Lock entire transaction if requested */ |
1023 | + |
1024 | + acpi_ex_acquire_global_lock(obj_desc->common_field.field_flags); |
1025 | + |
1026 | + /* Perform the write */ |
1027 | + |
1028 | + status = acpi_ex_access_region(obj_desc, 0, |
1029 | + (u64 *)buffer, ACPI_READ); |
1030 | + acpi_ex_release_global_lock(obj_desc->common_field.field_flags); |
1031 | + if (ACPI_FAILURE(status)) { |
1032 | + acpi_ut_remove_reference(buffer_desc); |
1033 | + } else { |
1034 | + *ret_buffer_desc = buffer_desc; |
1035 | + } |
1036 | + return_ACPI_STATUS(status); |
1037 | + } |
1038 | + |
1039 | ACPI_DEBUG_PRINT((ACPI_DB_BFIELD, |
1040 | "FieldRead [TO]: Obj %p, Type %X, Buf %p, ByteLen %X\n", |
1041 | obj_desc, obj_desc->common.type, buffer, |
1042 | @@ -325,6 +356,42 @@ acpi_ex_write_data_to_field(union acpi_operand_object *source_desc, |
1043 | |
1044 | *result_desc = buffer_desc; |
1045 | return_ACPI_STATUS(status); |
1046 | + } else if ((obj_desc->common.type == ACPI_TYPE_LOCAL_REGION_FIELD) && |
1047 | + (obj_desc->field.region_obj->region.space_id == |
1048 | + ACPI_ADR_SPACE_GPIO)) { |
1049 | + /* |
1050 | + * For GPIO (general_purpose_io), we will bypass the entire field |
1051 | + * mechanism and handoff the bit address and bit width directly to |
1052 | + * the handler. The Address will be the bit offset |
1053 | + * from the previous Connection() operator, making it effectively a |
1054 | + * pin number index. The bit_length is the length of the field, which |
1055 | + * is thus the number of pins. |
1056 | + */ |
1057 | + if (source_desc->common.type != ACPI_TYPE_INTEGER) { |
1058 | + return_ACPI_STATUS(AE_AML_OPERAND_TYPE); |
1059 | + } |
1060 | + |
1061 | + ACPI_DEBUG_PRINT((ACPI_DB_BFIELD, |
1062 | + "GPIO FieldWrite [FROM]: (%s:%X), Val %.8X [TO]: Pin %u Bits %u\n", |
1063 | + acpi_ut_get_type_name(source_desc->common. |
1064 | + type), |
1065 | + source_desc->common.type, |
1066 | + (u32)source_desc->integer.value, |
1067 | + obj_desc->field.pin_number_index, |
1068 | + obj_desc->field.bit_length)); |
1069 | + |
1070 | + buffer = &source_desc->integer.value; |
1071 | + |
1072 | + /* Lock entire transaction if requested */ |
1073 | + |
1074 | + acpi_ex_acquire_global_lock(obj_desc->common_field.field_flags); |
1075 | + |
1076 | + /* Perform the write */ |
1077 | + |
1078 | + status = acpi_ex_access_region(obj_desc, 0, |
1079 | + (u64 *)buffer, ACPI_WRITE); |
1080 | + acpi_ex_release_global_lock(obj_desc->common_field.field_flags); |
1081 | + return_ACPI_STATUS(status); |
1082 | } |
1083 | |
1084 | /* Get a pointer to the data to be written */ |
1085 | diff --git a/drivers/acpi/acpica/exprep.c b/drivers/acpi/acpica/exprep.c |
1086 | index 6b728aef2dca..df212fe4cf6c 100644 |
1087 | --- a/drivers/acpi/acpica/exprep.c |
1088 | +++ b/drivers/acpi/acpica/exprep.c |
1089 | @@ -479,6 +479,8 @@ acpi_status acpi_ex_prep_field_value(struct acpi_create_field_info *info) |
1090 | obj_desc->field.resource_length = info->resource_length; |
1091 | } |
1092 | |
1093 | + obj_desc->field.pin_number_index = info->pin_number_index; |
1094 | + |
1095 | /* Allow full data read from EC address space */ |
1096 | |
1097 | if ((obj_desc->field.region_obj->region.space_id == |
1098 | diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c |
1099 | index 3b39687c6336..c3f09505f795 100644 |
1100 | --- a/drivers/ata/ahci.c |
1101 | +++ b/drivers/ata/ahci.c |
1102 | @@ -304,6 +304,14 @@ static const struct pci_device_id ahci_pci_tbl[] = { |
1103 | { PCI_VDEVICE(INTEL, 0x9c85), board_ahci }, /* Wildcat Point-LP RAID */ |
1104 | { PCI_VDEVICE(INTEL, 0x9c87), board_ahci }, /* Wildcat Point-LP RAID */ |
1105 | { PCI_VDEVICE(INTEL, 0x9c8f), board_ahci }, /* Wildcat Point-LP RAID */ |
1106 | + { PCI_VDEVICE(INTEL, 0x8c82), board_ahci }, /* 9 Series AHCI */ |
1107 | + { PCI_VDEVICE(INTEL, 0x8c83), board_ahci }, /* 9 Series AHCI */ |
1108 | + { PCI_VDEVICE(INTEL, 0x8c84), board_ahci }, /* 9 Series RAID */ |
1109 | + { PCI_VDEVICE(INTEL, 0x8c85), board_ahci }, /* 9 Series RAID */ |
1110 | + { PCI_VDEVICE(INTEL, 0x8c86), board_ahci }, /* 9 Series RAID */ |
1111 | + { PCI_VDEVICE(INTEL, 0x8c87), board_ahci }, /* 9 Series RAID */ |
1112 | + { PCI_VDEVICE(INTEL, 0x8c8e), board_ahci }, /* 9 Series RAID */ |
1113 | + { PCI_VDEVICE(INTEL, 0x8c8f), board_ahci }, /* 9 Series RAID */ |
1114 | |
1115 | /* JMicron 360/1/3/5/6, match class to avoid IDE function */ |
1116 | { PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, |
1117 | @@ -441,6 +449,8 @@ static const struct pci_device_id ahci_pci_tbl[] = { |
1118 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x917a), |
1119 | .driver_data = board_ahci_yes_fbs }, /* 88se9172 */ |
1120 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9172), |
1121 | + .driver_data = board_ahci_yes_fbs }, /* 88se9182 */ |
1122 | + { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9182), |
1123 | .driver_data = board_ahci_yes_fbs }, /* 88se9172 */ |
1124 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9192), |
1125 | .driver_data = board_ahci_yes_fbs }, /* 88se9172 on some Gigabyte */ |
1126 | diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c |
1127 | index b92913a528b6..82aa7b550ea5 100644 |
1128 | --- a/drivers/ata/ata_piix.c |
1129 | +++ b/drivers/ata/ata_piix.c |
1130 | @@ -340,6 +340,14 @@ static const struct pci_device_id piix_pci_tbl[] = { |
1131 | { 0x8086, 0x0F21, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata_byt }, |
1132 | /* SATA Controller IDE (Coleto Creek) */ |
1133 | { 0x8086, 0x23a6, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, |
1134 | + /* SATA Controller IDE (9 Series) */ |
1135 | + { 0x8086, 0x8c88, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata_snb }, |
1136 | + /* SATA Controller IDE (9 Series) */ |
1137 | + { 0x8086, 0x8c89, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata_snb }, |
1138 | + /* SATA Controller IDE (9 Series) */ |
1139 | + { 0x8086, 0x8c80, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb }, |
1140 | + /* SATA Controller IDE (9 Series) */ |
1141 | + { 0x8086, 0x8c81, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb }, |
1142 | |
1143 | { } /* terminate list */ |
1144 | }; |
1145 | diff --git a/drivers/ata/pata_scc.c b/drivers/ata/pata_scc.c |
1146 | index f35f15f4d83e..f7badaa39eb6 100644 |
1147 | --- a/drivers/ata/pata_scc.c |
1148 | +++ b/drivers/ata/pata_scc.c |
1149 | @@ -586,7 +586,7 @@ static int scc_wait_after_reset(struct ata_link *link, unsigned int devmask, |
1150 | * Note: Original code is ata_bus_softreset(). |
1151 | */ |
1152 | |
1153 | -static unsigned int scc_bus_softreset(struct ata_port *ap, unsigned int devmask, |
1154 | +static int scc_bus_softreset(struct ata_port *ap, unsigned int devmask, |
1155 | unsigned long deadline) |
1156 | { |
1157 | struct ata_ioports *ioaddr = &ap->ioaddr; |
1158 | @@ -600,9 +600,7 @@ static unsigned int scc_bus_softreset(struct ata_port *ap, unsigned int devmask, |
1159 | udelay(20); |
1160 | out_be32(ioaddr->ctl_addr, ap->ctl); |
1161 | |
1162 | - scc_wait_after_reset(&ap->link, devmask, deadline); |
1163 | - |
1164 | - return 0; |
1165 | + return scc_wait_after_reset(&ap->link, devmask, deadline); |
1166 | } |
1167 | |
1168 | /** |
1169 | @@ -619,7 +617,8 @@ static int scc_softreset(struct ata_link *link, unsigned int *classes, |
1170 | { |
1171 | struct ata_port *ap = link->ap; |
1172 | unsigned int slave_possible = ap->flags & ATA_FLAG_SLAVE_POSS; |
1173 | - unsigned int devmask = 0, err_mask; |
1174 | + unsigned int devmask = 0; |
1175 | + int rc; |
1176 | u8 err; |
1177 | |
1178 | DPRINTK("ENTER\n"); |
1179 | @@ -635,9 +634,9 @@ static int scc_softreset(struct ata_link *link, unsigned int *classes, |
1180 | |
1181 | /* issue bus reset */ |
1182 | DPRINTK("about to softreset, devmask=%x\n", devmask); |
1183 | - err_mask = scc_bus_softreset(ap, devmask, deadline); |
1184 | - if (err_mask) { |
1185 | - ata_port_err(ap, "SRST failed (err_mask=0x%x)\n", err_mask); |
1186 | + rc = scc_bus_softreset(ap, devmask, deadline); |
1187 | + if (rc) { |
1188 | + ata_port_err(ap, "SRST failed (err_mask=0x%x)\n", rc); |
1189 | return -EIO; |
1190 | } |
1191 | |
1192 | diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c |
1193 | index d0c81d1f409c..4b5cf2e34e9a 100644 |
1194 | --- a/drivers/base/regmap/regmap.c |
1195 | +++ b/drivers/base/regmap/regmap.c |
1196 | @@ -114,7 +114,7 @@ bool regmap_readable(struct regmap *map, unsigned int reg) |
1197 | |
1198 | bool regmap_volatile(struct regmap *map, unsigned int reg) |
1199 | { |
1200 | - if (!regmap_readable(map, reg)) |
1201 | + if (!map->format.format_write && !regmap_readable(map, reg)) |
1202 | return false; |
1203 | |
1204 | if (map->volatile_reg) |
1205 | diff --git a/drivers/gpu/drm/ast/ast_main.c b/drivers/gpu/drm/ast/ast_main.c |
1206 | index f60fd7bd1183..96f874a508e2 100644 |
1207 | --- a/drivers/gpu/drm/ast/ast_main.c |
1208 | +++ b/drivers/gpu/drm/ast/ast_main.c |
1209 | @@ -100,7 +100,7 @@ static int ast_detect_chip(struct drm_device *dev) |
1210 | } |
1211 | ast->vga2_clone = false; |
1212 | } else { |
1213 | - ast->chip = 2000; |
1214 | + ast->chip = AST2000; |
1215 | DRM_INFO("AST 2000 detected\n"); |
1216 | } |
1217 | } |
1218 | diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c |
1219 | index 95070b2124c6..49acec155046 100644 |
1220 | --- a/drivers/gpu/drm/i915/intel_bios.c |
1221 | +++ b/drivers/gpu/drm/i915/intel_bios.c |
1222 | @@ -657,7 +657,7 @@ init_vbt_defaults(struct drm_i915_private *dev_priv) |
1223 | DRM_DEBUG_KMS("Set default to SSC at %dMHz\n", dev_priv->lvds_ssc_freq); |
1224 | } |
1225 | |
1226 | -static int __init intel_no_opregion_vbt_callback(const struct dmi_system_id *id) |
1227 | +static int intel_no_opregion_vbt_callback(const struct dmi_system_id *id) |
1228 | { |
1229 | DRM_DEBUG_KMS("Falling back to manually reading VBT from " |
1230 | "VBIOS ROM for %s\n", |
1231 | diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c |
1232 | index 4a809969c5ac..53435a9d847e 100644 |
1233 | --- a/drivers/gpu/drm/i915/intel_crt.c |
1234 | +++ b/drivers/gpu/drm/i915/intel_crt.c |
1235 | @@ -702,7 +702,7 @@ static const struct drm_encoder_funcs intel_crt_enc_funcs = { |
1236 | .destroy = intel_encoder_destroy, |
1237 | }; |
1238 | |
1239 | -static int __init intel_no_crt_dmi_callback(const struct dmi_system_id *id) |
1240 | +static int intel_no_crt_dmi_callback(const struct dmi_system_id *id) |
1241 | { |
1242 | DRM_INFO("Skipping CRT initialization for %s\n", id->ident); |
1243 | return 1; |
1244 | diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c |
1245 | index f77d42f74427..08e8e18b3f85 100644 |
1246 | --- a/drivers/gpu/drm/i915/intel_lvds.c |
1247 | +++ b/drivers/gpu/drm/i915/intel_lvds.c |
1248 | @@ -694,7 +694,7 @@ static const struct drm_encoder_funcs intel_lvds_enc_funcs = { |
1249 | .destroy = intel_encoder_destroy, |
1250 | }; |
1251 | |
1252 | -static int __init intel_no_lvds_dmi_callback(const struct dmi_system_id *id) |
1253 | +static int intel_no_lvds_dmi_callback(const struct dmi_system_id *id) |
1254 | { |
1255 | DRM_INFO("Skipping LVDS initialization for %s\n", id->ident); |
1256 | return 1; |
1257 | diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c |
1258 | index 629527d205de..4605c3877c95 100644 |
1259 | --- a/drivers/gpu/drm/i915/intel_ringbuffer.c |
1260 | +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c |
1261 | @@ -396,6 +396,9 @@ static int init_ring_common(struct intel_ring_buffer *ring) |
1262 | } |
1263 | } |
1264 | |
1265 | + /* Enforce ordering by reading HEAD register back */ |
1266 | + I915_READ_HEAD(ring); |
1267 | + |
1268 | /* Initialize the ring. This must happen _after_ we've cleared the ring |
1269 | * registers with the above sequence (the readback of the HEAD registers |
1270 | * also enforces ordering), otherwise the hw might lose the new ring |
1271 | diff --git a/drivers/gpu/drm/i915/intel_tv.c b/drivers/gpu/drm/i915/intel_tv.c |
1272 | index a202d8d08c56..7c4e3126df27 100644 |
1273 | --- a/drivers/gpu/drm/i915/intel_tv.c |
1274 | +++ b/drivers/gpu/drm/i915/intel_tv.c |
1275 | @@ -856,6 +856,10 @@ intel_enable_tv(struct intel_encoder *encoder) |
1276 | struct drm_device *dev = encoder->base.dev; |
1277 | struct drm_i915_private *dev_priv = dev->dev_private; |
1278 | |
1279 | + /* Prevents vblank waits from timing out in intel_tv_detect_type() */ |
1280 | + intel_wait_for_vblank(encoder->base.dev, |
1281 | + to_intel_crtc(encoder->base.crtc)->pipe); |
1282 | + |
1283 | I915_WRITE(TV_CTL, I915_READ(TV_CTL) | TV_ENC_ENABLE); |
1284 | } |
1285 | |
1286 | diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c |
1287 | index efb06e34aed7..ba2ab9a9b988 100644 |
1288 | --- a/drivers/gpu/drm/radeon/radeon_atombios.c |
1289 | +++ b/drivers/gpu/drm/radeon/radeon_atombios.c |
1290 | @@ -463,6 +463,13 @@ static bool radeon_atom_apply_quirks(struct drm_device *dev, |
1291 | } |
1292 | } |
1293 | |
1294 | + /* Fujitsu D3003-S2 board lists DVI-I as DVI-I and VGA */ |
1295 | + if ((dev->pdev->device == 0x9805) && |
1296 | + (dev->pdev->subsystem_vendor == 0x1734) && |
1297 | + (dev->pdev->subsystem_device == 0x11bd)) { |
1298 | + if (*connector_type == DRM_MODE_CONNECTOR_VGA) |
1299 | + return false; |
1300 | + } |
1301 | |
1302 | return true; |
1303 | } |
1304 | @@ -1908,7 +1915,7 @@ static const char *thermal_controller_names[] = { |
1305 | "adm1032", |
1306 | "adm1030", |
1307 | "max6649", |
1308 | - "lm64", |
1309 | + "lm63", /* lm64 */ |
1310 | "f75375", |
1311 | "asc7xxx", |
1312 | }; |
1313 | @@ -1919,7 +1926,7 @@ static const char *pp_lib_thermal_controller_names[] = { |
1314 | "adm1032", |
1315 | "adm1030", |
1316 | "max6649", |
1317 | - "lm64", |
1318 | + "lm63", /* lm64 */ |
1319 | "f75375", |
1320 | "RV6xx", |
1321 | "RV770", |
1322 | diff --git a/drivers/gpu/drm/tilcdc/tilcdc_drv.c b/drivers/gpu/drm/tilcdc/tilcdc_drv.c |
1323 | index 2b5461bcd9fb..f060b7487c34 100644 |
1324 | --- a/drivers/gpu/drm/tilcdc/tilcdc_drv.c |
1325 | +++ b/drivers/gpu/drm/tilcdc/tilcdc_drv.c |
1326 | @@ -116,6 +116,7 @@ static int tilcdc_unload(struct drm_device *dev) |
1327 | struct tilcdc_drm_private *priv = dev->dev_private; |
1328 | struct tilcdc_module *mod, *cur; |
1329 | |
1330 | + drm_fbdev_cma_fini(priv->fbdev); |
1331 | drm_kms_helper_poll_fini(dev); |
1332 | drm_mode_config_cleanup(dev); |
1333 | drm_vblank_cleanup(dev); |
1334 | @@ -596,10 +597,10 @@ static int __init tilcdc_drm_init(void) |
1335 | static void __exit tilcdc_drm_fini(void) |
1336 | { |
1337 | DBG("fini"); |
1338 | - tilcdc_tfp410_fini(); |
1339 | - tilcdc_slave_fini(); |
1340 | - tilcdc_panel_fini(); |
1341 | platform_driver_unregister(&tilcdc_platform_driver); |
1342 | + tilcdc_panel_fini(); |
1343 | + tilcdc_slave_fini(); |
1344 | + tilcdc_tfp410_fini(); |
1345 | } |
1346 | |
1347 | late_initcall(tilcdc_drm_init); |
1348 | diff --git a/drivers/gpu/drm/tilcdc/tilcdc_panel.c b/drivers/gpu/drm/tilcdc/tilcdc_panel.c |
1349 | index 09176654fddb..779d508616d3 100644 |
1350 | --- a/drivers/gpu/drm/tilcdc/tilcdc_panel.c |
1351 | +++ b/drivers/gpu/drm/tilcdc/tilcdc_panel.c |
1352 | @@ -151,6 +151,7 @@ struct panel_connector { |
1353 | static void panel_connector_destroy(struct drm_connector *connector) |
1354 | { |
1355 | struct panel_connector *panel_connector = to_panel_connector(connector); |
1356 | + drm_sysfs_connector_remove(connector); |
1357 | drm_connector_cleanup(connector); |
1358 | kfree(panel_connector); |
1359 | } |
1360 | @@ -285,10 +286,8 @@ static void panel_destroy(struct tilcdc_module *mod) |
1361 | { |
1362 | struct panel_module *panel_mod = to_panel_module(mod); |
1363 | |
1364 | - if (panel_mod->timings) { |
1365 | + if (panel_mod->timings) |
1366 | display_timings_release(panel_mod->timings); |
1367 | - kfree(panel_mod->timings); |
1368 | - } |
1369 | |
1370 | tilcdc_module_cleanup(mod); |
1371 | kfree(panel_mod->info); |
1372 | diff --git a/drivers/gpu/drm/tilcdc/tilcdc_slave.c b/drivers/gpu/drm/tilcdc/tilcdc_slave.c |
1373 | index db1d2fc9dfb5..5d6c597a5d69 100644 |
1374 | --- a/drivers/gpu/drm/tilcdc/tilcdc_slave.c |
1375 | +++ b/drivers/gpu/drm/tilcdc/tilcdc_slave.c |
1376 | @@ -142,6 +142,7 @@ struct slave_connector { |
1377 | static void slave_connector_destroy(struct drm_connector *connector) |
1378 | { |
1379 | struct slave_connector *slave_connector = to_slave_connector(connector); |
1380 | + drm_sysfs_connector_remove(connector); |
1381 | drm_connector_cleanup(connector); |
1382 | kfree(slave_connector); |
1383 | } |
1384 | diff --git a/drivers/gpu/drm/tilcdc/tilcdc_tfp410.c b/drivers/gpu/drm/tilcdc/tilcdc_tfp410.c |
1385 | index a36788fbcd98..986131dd9f47 100644 |
1386 | --- a/drivers/gpu/drm/tilcdc/tilcdc_tfp410.c |
1387 | +++ b/drivers/gpu/drm/tilcdc/tilcdc_tfp410.c |
1388 | @@ -168,6 +168,7 @@ struct tfp410_connector { |
1389 | static void tfp410_connector_destroy(struct drm_connector *connector) |
1390 | { |
1391 | struct tfp410_connector *tfp410_connector = to_tfp410_connector(connector); |
1392 | + drm_sysfs_connector_remove(connector); |
1393 | drm_connector_cleanup(connector); |
1394 | kfree(tfp410_connector); |
1395 | } |
1396 | diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c |
1397 | index b8b394319b45..de1a753b1d56 100644 |
1398 | --- a/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c |
1399 | +++ b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c |
1400 | @@ -1006,9 +1006,9 @@ EXPORT_SYMBOL_GPL(ttm_dma_unpopulate); |
1401 | static int ttm_dma_pool_mm_shrink(struct shrinker *shrink, |
1402 | struct shrink_control *sc) |
1403 | { |
1404 | - static atomic_t start_pool = ATOMIC_INIT(0); |
1405 | + static unsigned start_pool; |
1406 | unsigned idx = 0; |
1407 | - unsigned pool_offset = atomic_add_return(1, &start_pool); |
1408 | + unsigned pool_offset; |
1409 | unsigned shrink_pages = sc->nr_to_scan; |
1410 | struct device_pools *p; |
1411 | |
1412 | @@ -1016,7 +1016,9 @@ static int ttm_dma_pool_mm_shrink(struct shrinker *shrink, |
1413 | return 0; |
1414 | |
1415 | mutex_lock(&_manager->lock); |
1416 | - pool_offset = pool_offset % _manager->npools; |
1417 | + if (!_manager->npools) |
1418 | + goto out; |
1419 | + pool_offset = ++start_pool % _manager->npools; |
1420 | list_for_each_entry(p, &_manager->pools, pools) { |
1421 | unsigned nr_free; |
1422 | |
1423 | @@ -1033,6 +1035,7 @@ static int ttm_dma_pool_mm_shrink(struct shrinker *shrink, |
1424 | p->pool->dev_name, p->pool->name, current->pid, |
1425 | nr_free, shrink_pages); |
1426 | } |
1427 | +out: |
1428 | mutex_unlock(&_manager->lock); |
1429 | /* return estimated number of unused pages in pool */ |
1430 | return ttm_dma_pool_get_num_unused_pages(); |
1431 | diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c b/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c |
1432 | index 3eb148667d63..89664933861f 100644 |
1433 | --- a/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c |
1434 | +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c |
1435 | @@ -163,8 +163,9 @@ void vmw_fifo_release(struct vmw_private *dev_priv, struct vmw_fifo_state *fifo) |
1436 | |
1437 | mutex_lock(&dev_priv->hw_mutex); |
1438 | |
1439 | + vmw_write(dev_priv, SVGA_REG_SYNC, SVGA_SYNC_GENERIC); |
1440 | while (vmw_read(dev_priv, SVGA_REG_BUSY) != 0) |
1441 | - vmw_write(dev_priv, SVGA_REG_SYNC, SVGA_SYNC_GENERIC); |
1442 | + ; |
1443 | |
1444 | dev_priv->last_read_seqno = ioread32(fifo_mem + SVGA_FIFO_FENCE); |
1445 | |
1446 | diff --git a/drivers/hid/hid-logitech-dj.c b/drivers/hid/hid-logitech-dj.c |
1447 | index 51b1a5088c0d..d4c6d9f85ca5 100644 |
1448 | --- a/drivers/hid/hid-logitech-dj.c |
1449 | +++ b/drivers/hid/hid-logitech-dj.c |
1450 | @@ -679,7 +679,6 @@ static int logi_dj_raw_event(struct hid_device *hdev, |
1451 | struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); |
1452 | struct dj_report *dj_report = (struct dj_report *) data; |
1453 | unsigned long flags; |
1454 | - bool report_processed = false; |
1455 | |
1456 | dbg_hid("%s, size:%d\n", __func__, size); |
1457 | |
1458 | @@ -706,34 +705,42 @@ static int logi_dj_raw_event(struct hid_device *hdev, |
1459 | * device (via hid_input_report() ) and return 1 so hid-core does not do |
1460 | * anything else with it. |
1461 | */ |
1462 | + |
1463 | + /* case 1) */ |
1464 | + if (data[0] != REPORT_ID_DJ_SHORT) |
1465 | + return false; |
1466 | + |
1467 | if ((dj_report->device_index < DJ_DEVICE_INDEX_MIN) || |
1468 | (dj_report->device_index > DJ_DEVICE_INDEX_MAX)) { |
1469 | - dev_err(&hdev->dev, "%s: invalid device index:%d\n", |
1470 | + /* |
1471 | + * Device index is wrong, bail out. |
1472 | + * This driver can ignore safely the receiver notifications, |
1473 | + * so ignore those reports too. |
1474 | + */ |
1475 | + if (dj_report->device_index != DJ_RECEIVER_INDEX) |
1476 | + dev_err(&hdev->dev, "%s: invalid device index:%d\n", |
1477 | __func__, dj_report->device_index); |
1478 | return false; |
1479 | } |
1480 | |
1481 | spin_lock_irqsave(&djrcv_dev->lock, flags); |
1482 | - if (dj_report->report_id == REPORT_ID_DJ_SHORT) { |
1483 | - switch (dj_report->report_type) { |
1484 | - case REPORT_TYPE_NOTIF_DEVICE_PAIRED: |
1485 | - case REPORT_TYPE_NOTIF_DEVICE_UNPAIRED: |
1486 | - logi_dj_recv_queue_notification(djrcv_dev, dj_report); |
1487 | - break; |
1488 | - case REPORT_TYPE_NOTIF_CONNECTION_STATUS: |
1489 | - if (dj_report->report_params[CONNECTION_STATUS_PARAM_STATUS] == |
1490 | - STATUS_LINKLOSS) { |
1491 | - logi_dj_recv_forward_null_report(djrcv_dev, dj_report); |
1492 | - } |
1493 | - break; |
1494 | - default: |
1495 | - logi_dj_recv_forward_report(djrcv_dev, dj_report); |
1496 | + switch (dj_report->report_type) { |
1497 | + case REPORT_TYPE_NOTIF_DEVICE_PAIRED: |
1498 | + case REPORT_TYPE_NOTIF_DEVICE_UNPAIRED: |
1499 | + logi_dj_recv_queue_notification(djrcv_dev, dj_report); |
1500 | + break; |
1501 | + case REPORT_TYPE_NOTIF_CONNECTION_STATUS: |
1502 | + if (dj_report->report_params[CONNECTION_STATUS_PARAM_STATUS] == |
1503 | + STATUS_LINKLOSS) { |
1504 | + logi_dj_recv_forward_null_report(djrcv_dev, dj_report); |
1505 | } |
1506 | - report_processed = true; |
1507 | + break; |
1508 | + default: |
1509 | + logi_dj_recv_forward_report(djrcv_dev, dj_report); |
1510 | } |
1511 | spin_unlock_irqrestore(&djrcv_dev->lock, flags); |
1512 | |
1513 | - return report_processed; |
1514 | + return true; |
1515 | } |
1516 | |
1517 | static int logi_dj_probe(struct hid_device *hdev, |
1518 | diff --git a/drivers/hid/hid-logitech-dj.h b/drivers/hid/hid-logitech-dj.h |
1519 | index 4a4000340ce1..daeb0aa4bee9 100644 |
1520 | --- a/drivers/hid/hid-logitech-dj.h |
1521 | +++ b/drivers/hid/hid-logitech-dj.h |
1522 | @@ -27,6 +27,7 @@ |
1523 | |
1524 | #define DJ_MAX_PAIRED_DEVICES 6 |
1525 | #define DJ_MAX_NUMBER_NOTIFICATIONS 8 |
1526 | +#define DJ_RECEIVER_INDEX 0 |
1527 | #define DJ_DEVICE_INDEX_MIN 1 |
1528 | #define DJ_DEVICE_INDEX_MAX 6 |
1529 | |
1530 | diff --git a/drivers/hid/hid-magicmouse.c b/drivers/hid/hid-magicmouse.c |
1531 | index 5bc37343eb22..c24f3dfd9367 100644 |
1532 | --- a/drivers/hid/hid-magicmouse.c |
1533 | +++ b/drivers/hid/hid-magicmouse.c |
1534 | @@ -290,6 +290,11 @@ static int magicmouse_raw_event(struct hid_device *hdev, |
1535 | if (size < 4 || ((size - 4) % 9) != 0) |
1536 | return 0; |
1537 | npoints = (size - 4) / 9; |
1538 | + if (npoints > 15) { |
1539 | + hid_warn(hdev, "invalid size value (%d) for TRACKPAD_REPORT_ID\n", |
1540 | + size); |
1541 | + return 0; |
1542 | + } |
1543 | msc->ntouches = 0; |
1544 | for (ii = 0; ii < npoints; ii++) |
1545 | magicmouse_emit_touch(msc, ii, data + ii * 9 + 4); |
1546 | @@ -307,6 +312,11 @@ static int magicmouse_raw_event(struct hid_device *hdev, |
1547 | if (size < 6 || ((size - 6) % 8) != 0) |
1548 | return 0; |
1549 | npoints = (size - 6) / 8; |
1550 | + if (npoints > 15) { |
1551 | + hid_warn(hdev, "invalid size value (%d) for MOUSE_REPORT_ID\n", |
1552 | + size); |
1553 | + return 0; |
1554 | + } |
1555 | msc->ntouches = 0; |
1556 | for (ii = 0; ii < npoints; ii++) |
1557 | magicmouse_emit_touch(msc, ii, data + ii * 8 + 6); |
1558 | diff --git a/drivers/hid/hid-picolcd_core.c b/drivers/hid/hid-picolcd_core.c |
1559 | index acbb021065ec..020df3c2e8b4 100644 |
1560 | --- a/drivers/hid/hid-picolcd_core.c |
1561 | +++ b/drivers/hid/hid-picolcd_core.c |
1562 | @@ -350,6 +350,12 @@ static int picolcd_raw_event(struct hid_device *hdev, |
1563 | if (!data) |
1564 | return 1; |
1565 | |
1566 | + if (size > 64) { |
1567 | + hid_warn(hdev, "invalid size value (%d) for picolcd raw event\n", |
1568 | + size); |
1569 | + return 0; |
1570 | + } |
1571 | + |
1572 | if (report->id == REPORT_KEY_STATE) { |
1573 | if (data->input_keys) |
1574 | ret = picolcd_raw_keypad(data, report, raw_data+1, size-1); |
1575 | diff --git a/drivers/i2c/busses/i2c-at91.c b/drivers/i2c/busses/i2c-at91.c |
1576 | index f35ea236497b..b1240a250149 100644 |
1577 | --- a/drivers/i2c/busses/i2c-at91.c |
1578 | +++ b/drivers/i2c/busses/i2c-at91.c |
1579 | @@ -102,6 +102,7 @@ struct at91_twi_dev { |
1580 | unsigned twi_cwgr_reg; |
1581 | struct at91_twi_pdata *pdata; |
1582 | bool use_dma; |
1583 | + bool recv_len_abort; |
1584 | struct at91_twi_dma dma; |
1585 | }; |
1586 | |
1587 | @@ -268,12 +269,24 @@ static void at91_twi_read_next_byte(struct at91_twi_dev *dev) |
1588 | *dev->buf = at91_twi_read(dev, AT91_TWI_RHR) & 0xff; |
1589 | --dev->buf_len; |
1590 | |
1591 | + /* return if aborting, we only needed to read RHR to clear RXRDY*/ |
1592 | + if (dev->recv_len_abort) |
1593 | + return; |
1594 | + |
1595 | /* handle I2C_SMBUS_BLOCK_DATA */ |
1596 | if (unlikely(dev->msg->flags & I2C_M_RECV_LEN)) { |
1597 | - dev->msg->flags &= ~I2C_M_RECV_LEN; |
1598 | - dev->buf_len += *dev->buf; |
1599 | - dev->msg->len = dev->buf_len + 1; |
1600 | - dev_dbg(dev->dev, "received block length %d\n", dev->buf_len); |
1601 | + /* ensure length byte is a valid value */ |
1602 | + if (*dev->buf <= I2C_SMBUS_BLOCK_MAX && *dev->buf > 0) { |
1603 | + dev->msg->flags &= ~I2C_M_RECV_LEN; |
1604 | + dev->buf_len += *dev->buf; |
1605 | + dev->msg->len = dev->buf_len + 1; |
1606 | + dev_dbg(dev->dev, "received block length %d\n", |
1607 | + dev->buf_len); |
1608 | + } else { |
1609 | + /* abort and send the stop by reading one more byte */ |
1610 | + dev->recv_len_abort = true; |
1611 | + dev->buf_len = 1; |
1612 | + } |
1613 | } |
1614 | |
1615 | /* send stop if second but last byte has been read */ |
1616 | @@ -422,8 +435,8 @@ static int at91_do_twi_transfer(struct at91_twi_dev *dev) |
1617 | } |
1618 | } |
1619 | |
1620 | - ret = wait_for_completion_interruptible_timeout(&dev->cmd_complete, |
1621 | - dev->adapter.timeout); |
1622 | + ret = wait_for_completion_io_timeout(&dev->cmd_complete, |
1623 | + dev->adapter.timeout); |
1624 | if (ret == 0) { |
1625 | dev_err(dev->dev, "controller timed out\n"); |
1626 | at91_init_twi_bus(dev); |
1627 | @@ -445,6 +458,12 @@ static int at91_do_twi_transfer(struct at91_twi_dev *dev) |
1628 | ret = -EIO; |
1629 | goto error; |
1630 | } |
1631 | + if (dev->recv_len_abort) { |
1632 | + dev_err(dev->dev, "invalid smbus block length recvd\n"); |
1633 | + ret = -EPROTO; |
1634 | + goto error; |
1635 | + } |
1636 | + |
1637 | dev_dbg(dev->dev, "transfer complete\n"); |
1638 | |
1639 | return 0; |
1640 | @@ -501,6 +520,7 @@ static int at91_twi_xfer(struct i2c_adapter *adap, struct i2c_msg *msg, int num) |
1641 | dev->buf_len = m_start->len; |
1642 | dev->buf = m_start->buf; |
1643 | dev->msg = m_start; |
1644 | + dev->recv_len_abort = false; |
1645 | |
1646 | ret = at91_do_twi_transfer(dev); |
1647 | |
1648 | diff --git a/drivers/iio/adc/ad_sigma_delta.c b/drivers/iio/adc/ad_sigma_delta.c |
1649 | index f0d6335ae087..05d2733ef48c 100644 |
1650 | --- a/drivers/iio/adc/ad_sigma_delta.c |
1651 | +++ b/drivers/iio/adc/ad_sigma_delta.c |
1652 | @@ -477,7 +477,7 @@ static int ad_sd_probe_trigger(struct iio_dev *indio_dev) |
1653 | goto error_free_irq; |
1654 | |
1655 | /* select default trigger */ |
1656 | - indio_dev->trig = sigma_delta->trig; |
1657 | + indio_dev->trig = iio_trigger_get(sigma_delta->trig); |
1658 | |
1659 | return 0; |
1660 | |
1661 | diff --git a/drivers/iio/common/st_sensors/st_sensors_trigger.c b/drivers/iio/common/st_sensors/st_sensors_trigger.c |
1662 | index 8fc3a97eb266..8d8ca6f1e16a 100644 |
1663 | --- a/drivers/iio/common/st_sensors/st_sensors_trigger.c |
1664 | +++ b/drivers/iio/common/st_sensors/st_sensors_trigger.c |
1665 | @@ -49,7 +49,7 @@ int st_sensors_allocate_trigger(struct iio_dev *indio_dev, |
1666 | dev_err(&indio_dev->dev, "failed to register iio trigger.\n"); |
1667 | goto iio_trigger_register_error; |
1668 | } |
1669 | - indio_dev->trig = sdata->trig; |
1670 | + indio_dev->trig = iio_trigger_get(sdata->trig); |
1671 | |
1672 | return 0; |
1673 | |
1674 | diff --git a/drivers/iio/gyro/itg3200_buffer.c b/drivers/iio/gyro/itg3200_buffer.c |
1675 | index 6c43af9bb0a4..14917fae2d9d 100644 |
1676 | --- a/drivers/iio/gyro/itg3200_buffer.c |
1677 | +++ b/drivers/iio/gyro/itg3200_buffer.c |
1678 | @@ -135,7 +135,7 @@ int itg3200_probe_trigger(struct iio_dev *indio_dev) |
1679 | goto error_free_irq; |
1680 | |
1681 | /* select default trigger */ |
1682 | - indio_dev->trig = st->trig; |
1683 | + indio_dev->trig = iio_trigger_get(st->trig); |
1684 | |
1685 | return 0; |
1686 | |
1687 | diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_trigger.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_trigger.c |
1688 | index 03b9372c1212..926fccea8de0 100644 |
1689 | --- a/drivers/iio/imu/inv_mpu6050/inv_mpu_trigger.c |
1690 | +++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_trigger.c |
1691 | @@ -135,7 +135,7 @@ int inv_mpu6050_probe_trigger(struct iio_dev *indio_dev) |
1692 | ret = iio_trigger_register(st->trig); |
1693 | if (ret) |
1694 | goto error_free_irq; |
1695 | - indio_dev->trig = st->trig; |
1696 | + indio_dev->trig = iio_trigger_get(st->trig); |
1697 | |
1698 | return 0; |
1699 | |
1700 | diff --git a/drivers/iio/inkern.c b/drivers/iio/inkern.c |
1701 | index 1e8e94d4db7d..4fc88e617acf 100644 |
1702 | --- a/drivers/iio/inkern.c |
1703 | +++ b/drivers/iio/inkern.c |
1704 | @@ -178,7 +178,7 @@ static struct iio_channel *of_iio_channel_get_by_name(struct device_node *np, |
1705 | index = of_property_match_string(np, "io-channel-names", |
1706 | name); |
1707 | chan = of_iio_channel_get(np, index); |
1708 | - if (!IS_ERR(chan)) |
1709 | + if (!IS_ERR(chan) || PTR_ERR(chan) == -EPROBE_DEFER) |
1710 | break; |
1711 | else if (name && index >= 0) { |
1712 | pr_err("ERROR: could not get IIO channel %s:%s(%i)\n", |
1713 | diff --git a/drivers/iio/magnetometer/st_magn_core.c b/drivers/iio/magnetometer/st_magn_core.c |
1714 | index 16f0d6df239f..3ce3769c0823 100644 |
1715 | --- a/drivers/iio/magnetometer/st_magn_core.c |
1716 | +++ b/drivers/iio/magnetometer/st_magn_core.c |
1717 | @@ -40,7 +40,8 @@ |
1718 | #define ST_MAGN_FS_AVL_5600MG 5600 |
1719 | #define ST_MAGN_FS_AVL_8000MG 8000 |
1720 | #define ST_MAGN_FS_AVL_8100MG 8100 |
1721 | -#define ST_MAGN_FS_AVL_10000MG 10000 |
1722 | +#define ST_MAGN_FS_AVL_12000MG 12000 |
1723 | +#define ST_MAGN_FS_AVL_16000MG 16000 |
1724 | |
1725 | /* CUSTOM VALUES FOR SENSOR 1 */ |
1726 | #define ST_MAGN_1_WAI_EXP 0x3c |
1727 | @@ -67,20 +68,20 @@ |
1728 | #define ST_MAGN_1_FS_AVL_4700_VAL 0x05 |
1729 | #define ST_MAGN_1_FS_AVL_5600_VAL 0x06 |
1730 | #define ST_MAGN_1_FS_AVL_8100_VAL 0x07 |
1731 | -#define ST_MAGN_1_FS_AVL_1300_GAIN_XY 1100 |
1732 | -#define ST_MAGN_1_FS_AVL_1900_GAIN_XY 855 |
1733 | -#define ST_MAGN_1_FS_AVL_2500_GAIN_XY 670 |
1734 | -#define ST_MAGN_1_FS_AVL_4000_GAIN_XY 450 |
1735 | -#define ST_MAGN_1_FS_AVL_4700_GAIN_XY 400 |
1736 | -#define ST_MAGN_1_FS_AVL_5600_GAIN_XY 330 |
1737 | -#define ST_MAGN_1_FS_AVL_8100_GAIN_XY 230 |
1738 | -#define ST_MAGN_1_FS_AVL_1300_GAIN_Z 980 |
1739 | -#define ST_MAGN_1_FS_AVL_1900_GAIN_Z 760 |
1740 | -#define ST_MAGN_1_FS_AVL_2500_GAIN_Z 600 |
1741 | -#define ST_MAGN_1_FS_AVL_4000_GAIN_Z 400 |
1742 | -#define ST_MAGN_1_FS_AVL_4700_GAIN_Z 355 |
1743 | -#define ST_MAGN_1_FS_AVL_5600_GAIN_Z 295 |
1744 | -#define ST_MAGN_1_FS_AVL_8100_GAIN_Z 205 |
1745 | +#define ST_MAGN_1_FS_AVL_1300_GAIN_XY 909 |
1746 | +#define ST_MAGN_1_FS_AVL_1900_GAIN_XY 1169 |
1747 | +#define ST_MAGN_1_FS_AVL_2500_GAIN_XY 1492 |
1748 | +#define ST_MAGN_1_FS_AVL_4000_GAIN_XY 2222 |
1749 | +#define ST_MAGN_1_FS_AVL_4700_GAIN_XY 2500 |
1750 | +#define ST_MAGN_1_FS_AVL_5600_GAIN_XY 3030 |
1751 | +#define ST_MAGN_1_FS_AVL_8100_GAIN_XY 4347 |
1752 | +#define ST_MAGN_1_FS_AVL_1300_GAIN_Z 1020 |
1753 | +#define ST_MAGN_1_FS_AVL_1900_GAIN_Z 1315 |
1754 | +#define ST_MAGN_1_FS_AVL_2500_GAIN_Z 1666 |
1755 | +#define ST_MAGN_1_FS_AVL_4000_GAIN_Z 2500 |
1756 | +#define ST_MAGN_1_FS_AVL_4700_GAIN_Z 2816 |
1757 | +#define ST_MAGN_1_FS_AVL_5600_GAIN_Z 3389 |
1758 | +#define ST_MAGN_1_FS_AVL_8100_GAIN_Z 4878 |
1759 | #define ST_MAGN_1_MULTIREAD_BIT false |
1760 | |
1761 | /* CUSTOM VALUES FOR SENSOR 2 */ |
1762 | @@ -103,10 +104,12 @@ |
1763 | #define ST_MAGN_2_FS_MASK 0x60 |
1764 | #define ST_MAGN_2_FS_AVL_4000_VAL 0x00 |
1765 | #define ST_MAGN_2_FS_AVL_8000_VAL 0x01 |
1766 | -#define ST_MAGN_2_FS_AVL_10000_VAL 0x02 |
1767 | -#define ST_MAGN_2_FS_AVL_4000_GAIN 430 |
1768 | -#define ST_MAGN_2_FS_AVL_8000_GAIN 230 |
1769 | -#define ST_MAGN_2_FS_AVL_10000_GAIN 230 |
1770 | +#define ST_MAGN_2_FS_AVL_12000_VAL 0x02 |
1771 | +#define ST_MAGN_2_FS_AVL_16000_VAL 0x03 |
1772 | +#define ST_MAGN_2_FS_AVL_4000_GAIN 146 |
1773 | +#define ST_MAGN_2_FS_AVL_8000_GAIN 292 |
1774 | +#define ST_MAGN_2_FS_AVL_12000_GAIN 438 |
1775 | +#define ST_MAGN_2_FS_AVL_16000_GAIN 584 |
1776 | #define ST_MAGN_2_MULTIREAD_BIT false |
1777 | #define ST_MAGN_2_OUT_X_L_ADDR 0x28 |
1778 | #define ST_MAGN_2_OUT_Y_L_ADDR 0x2a |
1779 | @@ -252,9 +255,14 @@ static const struct st_sensors st_magn_sensors[] = { |
1780 | .gain = ST_MAGN_2_FS_AVL_8000_GAIN, |
1781 | }, |
1782 | [2] = { |
1783 | - .num = ST_MAGN_FS_AVL_10000MG, |
1784 | - .value = ST_MAGN_2_FS_AVL_10000_VAL, |
1785 | - .gain = ST_MAGN_2_FS_AVL_10000_GAIN, |
1786 | + .num = ST_MAGN_FS_AVL_12000MG, |
1787 | + .value = ST_MAGN_2_FS_AVL_12000_VAL, |
1788 | + .gain = ST_MAGN_2_FS_AVL_12000_GAIN, |
1789 | + }, |
1790 | + [3] = { |
1791 | + .num = ST_MAGN_FS_AVL_16000MG, |
1792 | + .value = ST_MAGN_2_FS_AVL_16000_VAL, |
1793 | + .gain = ST_MAGN_2_FS_AVL_16000_GAIN, |
1794 | }, |
1795 | }, |
1796 | }, |
1797 | diff --git a/drivers/infiniband/ulp/isert/ib_isert.c b/drivers/infiniband/ulp/isert/ib_isert.c |
1798 | index 0e93152384f0..acb3865710c2 100644 |
1799 | --- a/drivers/infiniband/ulp/isert/ib_isert.c |
1800 | +++ b/drivers/infiniband/ulp/isert/ib_isert.c |
1801 | @@ -404,7 +404,6 @@ isert_connect_request(struct rdma_cm_id *cma_id, struct rdma_cm_event *event) |
1802 | init_completion(&isert_conn->conn_wait); |
1803 | init_completion(&isert_conn->conn_wait_comp_err); |
1804 | kref_init(&isert_conn->conn_kref); |
1805 | - kref_get(&isert_conn->conn_kref); |
1806 | mutex_init(&isert_conn->conn_mutex); |
1807 | |
1808 | cma_id->context = isert_conn; |
1809 | @@ -530,7 +529,9 @@ isert_connect_release(struct isert_conn *isert_conn) |
1810 | static void |
1811 | isert_connected_handler(struct rdma_cm_id *cma_id) |
1812 | { |
1813 | - return; |
1814 | + struct isert_conn *isert_conn = cma_id->context; |
1815 | + |
1816 | + kref_get(&isert_conn->conn_kref); |
1817 | } |
1818 | |
1819 | static void |
1820 | @@ -582,7 +583,6 @@ isert_disconnect_work(struct work_struct *work) |
1821 | |
1822 | wake_up: |
1823 | complete(&isert_conn->conn_wait); |
1824 | - isert_put_conn(isert_conn); |
1825 | } |
1826 | |
1827 | static void |
1828 | @@ -2265,6 +2265,7 @@ static void isert_wait_conn(struct iscsi_conn *conn) |
1829 | wait_for_completion(&isert_conn->conn_wait_comp_err); |
1830 | |
1831 | wait_for_completion(&isert_conn->conn_wait); |
1832 | + isert_put_conn(isert_conn); |
1833 | } |
1834 | |
1835 | static void isert_free_conn(struct iscsi_conn *conn) |
1836 | diff --git a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c |
1837 | index 2dd1d0dd4f7d..6f5d79569136 100644 |
1838 | --- a/drivers/input/keyboard/atkbd.c |
1839 | +++ b/drivers/input/keyboard/atkbd.c |
1840 | @@ -1791,14 +1791,6 @@ static const struct dmi_system_id atkbd_dmi_quirk_table[] __initconst = { |
1841 | { |
1842 | .matches = { |
1843 | DMI_MATCH(DMI_SYS_VENDOR, "LG Electronics"), |
1844 | - DMI_MATCH(DMI_PRODUCT_NAME, "LW25-B7HV"), |
1845 | - }, |
1846 | - .callback = atkbd_deactivate_fixup, |
1847 | - }, |
1848 | - { |
1849 | - .matches = { |
1850 | - DMI_MATCH(DMI_SYS_VENDOR, "LG Electronics"), |
1851 | - DMI_MATCH(DMI_PRODUCT_NAME, "P1-J273B"), |
1852 | }, |
1853 | .callback = atkbd_deactivate_fixup, |
1854 | }, |
1855 | diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c |
1856 | index 1913301df08f..85e75239c814 100644 |
1857 | --- a/drivers/input/mouse/elantech.c |
1858 | +++ b/drivers/input/mouse/elantech.c |
1859 | @@ -1223,6 +1223,13 @@ static bool elantech_is_signature_valid(const unsigned char *param) |
1860 | if (param[1] == 0) |
1861 | return true; |
1862 | |
1863 | + /* |
1864 | + * Some models have a revision higher then 20. Meaning param[2] may |
1865 | + * be 10 or 20, skip the rates check for these. |
1866 | + */ |
1867 | + if (param[0] == 0x46 && (param[1] & 0xef) == 0x0f && param[2] < 40) |
1868 | + return true; |
1869 | + |
1870 | for (i = 0; i < ARRAY_SIZE(rates); i++) |
1871 | if (param[2] == rates[i]) |
1872 | return false; |
1873 | diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c |
1874 | index f36f7b88f260..d1c47d135c07 100644 |
1875 | --- a/drivers/input/mouse/synaptics.c |
1876 | +++ b/drivers/input/mouse/synaptics.c |
1877 | @@ -549,10 +549,61 @@ static int synaptics_parse_hw_state(const unsigned char buf[], |
1878 | ((buf[0] & 0x04) >> 1) | |
1879 | ((buf[3] & 0x04) >> 2)); |
1880 | |
1881 | + if ((SYN_CAP_ADV_GESTURE(priv->ext_cap_0c) || |
1882 | + SYN_CAP_IMAGE_SENSOR(priv->ext_cap_0c)) && |
1883 | + hw->w == 2) { |
1884 | + synaptics_parse_agm(buf, priv, hw); |
1885 | + return 1; |
1886 | + } |
1887 | + |
1888 | + hw->x = (((buf[3] & 0x10) << 8) | |
1889 | + ((buf[1] & 0x0f) << 8) | |
1890 | + buf[4]); |
1891 | + hw->y = (((buf[3] & 0x20) << 7) | |
1892 | + ((buf[1] & 0xf0) << 4) | |
1893 | + buf[5]); |
1894 | + hw->z = buf[2]; |
1895 | + |
1896 | hw->left = (buf[0] & 0x01) ? 1 : 0; |
1897 | hw->right = (buf[0] & 0x02) ? 1 : 0; |
1898 | |
1899 | - if (SYN_CAP_CLICKPAD(priv->ext_cap_0c)) { |
1900 | + if (SYN_CAP_FORCEPAD(priv->ext_cap_0c)) { |
1901 | + /* |
1902 | + * ForcePads, like Clickpads, use middle button |
1903 | + * bits to report primary button clicks. |
1904 | + * Unfortunately they report primary button not |
1905 | + * only when user presses on the pad above certain |
1906 | + * threshold, but also when there are more than one |
1907 | + * finger on the touchpad, which interferes with |
1908 | + * out multi-finger gestures. |
1909 | + */ |
1910 | + if (hw->z == 0) { |
1911 | + /* No contacts */ |
1912 | + priv->press = priv->report_press = false; |
1913 | + } else if (hw->w >= 4 && ((buf[0] ^ buf[3]) & 0x01)) { |
1914 | + /* |
1915 | + * Single-finger touch with pressure above |
1916 | + * the threshold. If pressure stays long |
1917 | + * enough, we'll start reporting primary |
1918 | + * button. We rely on the device continuing |
1919 | + * sending data even if finger does not |
1920 | + * move. |
1921 | + */ |
1922 | + if (!priv->press) { |
1923 | + priv->press_start = jiffies; |
1924 | + priv->press = true; |
1925 | + } else if (time_after(jiffies, |
1926 | + priv->press_start + |
1927 | + msecs_to_jiffies(50))) { |
1928 | + priv->report_press = true; |
1929 | + } |
1930 | + } else { |
1931 | + priv->press = false; |
1932 | + } |
1933 | + |
1934 | + hw->left = priv->report_press; |
1935 | + |
1936 | + } else if (SYN_CAP_CLICKPAD(priv->ext_cap_0c)) { |
1937 | /* |
1938 | * Clickpad's button is transmitted as middle button, |
1939 | * however, since it is primary button, we will report |
1940 | @@ -571,21 +622,6 @@ static int synaptics_parse_hw_state(const unsigned char buf[], |
1941 | hw->down = ((buf[0] ^ buf[3]) & 0x02) ? 1 : 0; |
1942 | } |
1943 | |
1944 | - if ((SYN_CAP_ADV_GESTURE(priv->ext_cap_0c) || |
1945 | - SYN_CAP_IMAGE_SENSOR(priv->ext_cap_0c)) && |
1946 | - hw->w == 2) { |
1947 | - synaptics_parse_agm(buf, priv, hw); |
1948 | - return 1; |
1949 | - } |
1950 | - |
1951 | - hw->x = (((buf[3] & 0x10) << 8) | |
1952 | - ((buf[1] & 0x0f) << 8) | |
1953 | - buf[4]); |
1954 | - hw->y = (((buf[3] & 0x20) << 7) | |
1955 | - ((buf[1] & 0xf0) << 4) | |
1956 | - buf[5]); |
1957 | - hw->z = buf[2]; |
1958 | - |
1959 | if (SYN_CAP_MULTI_BUTTON_NO(priv->ext_cap) && |
1960 | ((buf[0] ^ buf[3]) & 0x02)) { |
1961 | switch (SYN_CAP_MULTI_BUTTON_NO(priv->ext_cap) & ~0x01) { |
1962 | diff --git a/drivers/input/mouse/synaptics.h b/drivers/input/mouse/synaptics.h |
1963 | index e594af0b264b..fb2e076738ae 100644 |
1964 | --- a/drivers/input/mouse/synaptics.h |
1965 | +++ b/drivers/input/mouse/synaptics.h |
1966 | @@ -78,6 +78,11 @@ |
1967 | * 2 0x08 image sensor image sensor tracks 5 fingers, but only |
1968 | * reports 2. |
1969 | * 2 0x20 report min query 0x0f gives min coord reported |
1970 | + * 2 0x80 forcepad forcepad is a variant of clickpad that |
1971 | + * does not have physical buttons but rather |
1972 | + * uses pressure above certain threshold to |
1973 | + * report primary clicks. Forcepads also have |
1974 | + * clickpad bit set. |
1975 | */ |
1976 | #define SYN_CAP_CLICKPAD(ex0c) ((ex0c) & 0x100000) /* 1-button ClickPad */ |
1977 | #define SYN_CAP_CLICKPAD2BTN(ex0c) ((ex0c) & 0x000100) /* 2-button ClickPad */ |
1978 | @@ -86,6 +91,7 @@ |
1979 | #define SYN_CAP_ADV_GESTURE(ex0c) ((ex0c) & 0x080000) |
1980 | #define SYN_CAP_REDUCED_FILTERING(ex0c) ((ex0c) & 0x000400) |
1981 | #define SYN_CAP_IMAGE_SENSOR(ex0c) ((ex0c) & 0x000800) |
1982 | +#define SYN_CAP_FORCEPAD(ex0c) ((ex0c) & 0x008000) |
1983 | |
1984 | /* synaptics modes query bits */ |
1985 | #define SYN_MODE_ABSOLUTE(m) ((m) & (1 << 7)) |
1986 | @@ -177,6 +183,11 @@ struct synaptics_data { |
1987 | */ |
1988 | struct synaptics_hw_state agm; |
1989 | bool agm_pending; /* new AGM packet received */ |
1990 | + |
1991 | + /* ForcePad handling */ |
1992 | + unsigned long press_start; |
1993 | + bool press; |
1994 | + bool report_press; |
1995 | }; |
1996 | |
1997 | void synaptics_module_init(void); |
1998 | diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h |
1999 | index 0ec9abbe31fe..1291673bd57e 100644 |
2000 | --- a/drivers/input/serio/i8042-x86ia64io.h |
2001 | +++ b/drivers/input/serio/i8042-x86ia64io.h |
2002 | @@ -458,6 +458,13 @@ static const struct dmi_system_id __initconst i8042_dmi_nomux_table[] = { |
2003 | DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv4 Notebook PC"), |
2004 | }, |
2005 | }, |
2006 | + { |
2007 | + /* Avatar AVIU-145A6 */ |
2008 | + .matches = { |
2009 | + DMI_MATCH(DMI_SYS_VENDOR, "Intel"), |
2010 | + DMI_MATCH(DMI_PRODUCT_NAME, "IC4I"), |
2011 | + }, |
2012 | + }, |
2013 | { } |
2014 | }; |
2015 | |
2016 | @@ -601,6 +608,14 @@ static const struct dmi_system_id __initconst i8042_dmi_notimeout_table[] = { |
2017 | DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv4 Notebook PC"), |
2018 | }, |
2019 | }, |
2020 | + { |
2021 | + /* Fujitsu U574 laptop */ |
2022 | + /* https://bugzilla.kernel.org/show_bug.cgi?id=69731 */ |
2023 | + .matches = { |
2024 | + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), |
2025 | + DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK U574"), |
2026 | + }, |
2027 | + }, |
2028 | { } |
2029 | }; |
2030 | |
2031 | diff --git a/drivers/input/serio/serport.c b/drivers/input/serio/serport.c |
2032 | index 8755f5f3ad37..e4ecf3b64794 100644 |
2033 | --- a/drivers/input/serio/serport.c |
2034 | +++ b/drivers/input/serio/serport.c |
2035 | @@ -21,6 +21,7 @@ |
2036 | #include <linux/init.h> |
2037 | #include <linux/serio.h> |
2038 | #include <linux/tty.h> |
2039 | +#include <linux/compat.h> |
2040 | |
2041 | MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>"); |
2042 | MODULE_DESCRIPTION("Input device TTY line discipline"); |
2043 | @@ -196,28 +197,55 @@ static ssize_t serport_ldisc_read(struct tty_struct * tty, struct file * file, u |
2044 | return 0; |
2045 | } |
2046 | |
2047 | +static void serport_set_type(struct tty_struct *tty, unsigned long type) |
2048 | +{ |
2049 | + struct serport *serport = tty->disc_data; |
2050 | + |
2051 | + serport->id.proto = type & 0x000000ff; |
2052 | + serport->id.id = (type & 0x0000ff00) >> 8; |
2053 | + serport->id.extra = (type & 0x00ff0000) >> 16; |
2054 | +} |
2055 | + |
2056 | /* |
2057 | * serport_ldisc_ioctl() allows to set the port protocol, and device ID |
2058 | */ |
2059 | |
2060 | -static int serport_ldisc_ioctl(struct tty_struct * tty, struct file * file, unsigned int cmd, unsigned long arg) |
2061 | +static int serport_ldisc_ioctl(struct tty_struct *tty, struct file *file, |
2062 | + unsigned int cmd, unsigned long arg) |
2063 | { |
2064 | - struct serport *serport = (struct serport*) tty->disc_data; |
2065 | - unsigned long type; |
2066 | - |
2067 | if (cmd == SPIOCSTYPE) { |
2068 | + unsigned long type; |
2069 | + |
2070 | if (get_user(type, (unsigned long __user *) arg)) |
2071 | return -EFAULT; |
2072 | |
2073 | - serport->id.proto = type & 0x000000ff; |
2074 | - serport->id.id = (type & 0x0000ff00) >> 8; |
2075 | - serport->id.extra = (type & 0x00ff0000) >> 16; |
2076 | + serport_set_type(tty, type); |
2077 | + return 0; |
2078 | + } |
2079 | + |
2080 | + return -EINVAL; |
2081 | +} |
2082 | + |
2083 | +#ifdef CONFIG_COMPAT |
2084 | +#define COMPAT_SPIOCSTYPE _IOW('q', 0x01, compat_ulong_t) |
2085 | +static long serport_ldisc_compat_ioctl(struct tty_struct *tty, |
2086 | + struct file *file, |
2087 | + unsigned int cmd, unsigned long arg) |
2088 | +{ |
2089 | + if (cmd == COMPAT_SPIOCSTYPE) { |
2090 | + void __user *uarg = compat_ptr(arg); |
2091 | + compat_ulong_t compat_type; |
2092 | + |
2093 | + if (get_user(compat_type, (compat_ulong_t __user *)uarg)) |
2094 | + return -EFAULT; |
2095 | |
2096 | + serport_set_type(tty, compat_type); |
2097 | return 0; |
2098 | } |
2099 | |
2100 | return -EINVAL; |
2101 | } |
2102 | +#endif |
2103 | |
2104 | static void serport_ldisc_write_wakeup(struct tty_struct * tty) |
2105 | { |
2106 | @@ -241,6 +269,9 @@ static struct tty_ldisc_ops serport_ldisc = { |
2107 | .close = serport_ldisc_close, |
2108 | .read = serport_ldisc_read, |
2109 | .ioctl = serport_ldisc_ioctl, |
2110 | +#ifdef CONFIG_COMPAT |
2111 | + .compat_ioctl = serport_ldisc_compat_ioctl, |
2112 | +#endif |
2113 | .receive_buf = serport_ldisc_receive, |
2114 | .write_wakeup = serport_ldisc_write_wakeup |
2115 | }; |
2116 | diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c |
2117 | index 5177ba54559b..7409d79729ee 100644 |
2118 | --- a/drivers/md/dm-crypt.c |
2119 | +++ b/drivers/md/dm-crypt.c |
2120 | @@ -1506,6 +1506,7 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv) |
2121 | unsigned int key_size, opt_params; |
2122 | unsigned long long tmpll; |
2123 | int ret; |
2124 | + size_t iv_size_padding; |
2125 | struct dm_arg_set as; |
2126 | const char *opt_string; |
2127 | char dummy; |
2128 | @@ -1542,12 +1543,23 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv) |
2129 | |
2130 | cc->dmreq_start = sizeof(struct ablkcipher_request); |
2131 | cc->dmreq_start += crypto_ablkcipher_reqsize(any_tfm(cc)); |
2132 | - cc->dmreq_start = ALIGN(cc->dmreq_start, crypto_tfm_ctx_alignment()); |
2133 | - cc->dmreq_start += crypto_ablkcipher_alignmask(any_tfm(cc)) & |
2134 | - ~(crypto_tfm_ctx_alignment() - 1); |
2135 | + cc->dmreq_start = ALIGN(cc->dmreq_start, __alignof__(struct dm_crypt_request)); |
2136 | + |
2137 | + if (crypto_ablkcipher_alignmask(any_tfm(cc)) < CRYPTO_MINALIGN) { |
2138 | + /* Allocate the padding exactly */ |
2139 | + iv_size_padding = -(cc->dmreq_start + sizeof(struct dm_crypt_request)) |
2140 | + & crypto_ablkcipher_alignmask(any_tfm(cc)); |
2141 | + } else { |
2142 | + /* |
2143 | + * If the cipher requires greater alignment than kmalloc |
2144 | + * alignment, we don't know the exact position of the |
2145 | + * initialization vector. We must assume worst case. |
2146 | + */ |
2147 | + iv_size_padding = crypto_ablkcipher_alignmask(any_tfm(cc)); |
2148 | + } |
2149 | |
2150 | cc->req_pool = mempool_create_kmalloc_pool(MIN_IOS, cc->dmreq_start + |
2151 | - sizeof(struct dm_crypt_request) + cc->iv_size); |
2152 | + sizeof(struct dm_crypt_request) + iv_size_padding + cc->iv_size); |
2153 | if (!cc->req_pool) { |
2154 | ti->error = "Cannot allocate crypt request mempool"; |
2155 | goto bad; |
2156 | diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c |
2157 | index a176791509f6..e885dbf08c40 100644 |
2158 | --- a/drivers/md/raid1.c |
2159 | +++ b/drivers/md/raid1.c |
2160 | @@ -2051,7 +2051,7 @@ static void fix_read_error(struct r1conf *conf, int read_disk, |
2161 | d--; |
2162 | rdev = conf->mirrors[d].rdev; |
2163 | if (rdev && |
2164 | - test_bit(In_sync, &rdev->flags)) |
2165 | + !test_bit(Faulty, &rdev->flags)) |
2166 | r1_sync_page_io(rdev, sect, s, |
2167 | conf->tmppage, WRITE); |
2168 | } |
2169 | @@ -2063,7 +2063,7 @@ static void fix_read_error(struct r1conf *conf, int read_disk, |
2170 | d--; |
2171 | rdev = conf->mirrors[d].rdev; |
2172 | if (rdev && |
2173 | - test_bit(In_sync, &rdev->flags)) { |
2174 | + !test_bit(Faulty, &rdev->flags)) { |
2175 | if (r1_sync_page_io(rdev, sect, s, |
2176 | conf->tmppage, READ)) { |
2177 | atomic_add(s, &rdev->corrected_errors); |
2178 | diff --git a/drivers/media/pci/cx18/cx18-driver.c b/drivers/media/pci/cx18/cx18-driver.c |
2179 | index 16e89f026bca..018cb9045330 100644 |
2180 | --- a/drivers/media/pci/cx18/cx18-driver.c |
2181 | +++ b/drivers/media/pci/cx18/cx18-driver.c |
2182 | @@ -1092,6 +1092,7 @@ static int cx18_probe(struct pci_dev *pci_dev, |
2183 | setup.addr = ADDR_UNSET; |
2184 | setup.type = cx->options.tuner; |
2185 | setup.mode_mask = T_ANALOG_TV; /* matches TV tuners */ |
2186 | + setup.config = NULL; |
2187 | if (cx->options.radio > 0) |
2188 | setup.mode_mask |= T_RADIO; |
2189 | setup.tuner_callback = (setup.type == TUNER_XC2028) ? |
2190 | diff --git a/drivers/net/ethernet/ibm/ibmveth.c b/drivers/net/ethernet/ibm/ibmveth.c |
2191 | index 70fd55968844..040ecf2027cd 100644 |
2192 | --- a/drivers/net/ethernet/ibm/ibmveth.c |
2193 | +++ b/drivers/net/ethernet/ibm/ibmveth.c |
2194 | @@ -293,6 +293,18 @@ failure: |
2195 | atomic_add(buffers_added, &(pool->available)); |
2196 | } |
2197 | |
2198 | +/* |
2199 | + * The final 8 bytes of the buffer list is a counter of frames dropped |
2200 | + * because there was not a buffer in the buffer list capable of holding |
2201 | + * the frame. |
2202 | + */ |
2203 | +static void ibmveth_update_rx_no_buffer(struct ibmveth_adapter *adapter) |
2204 | +{ |
2205 | + __be64 *p = adapter->buffer_list_addr + 4096 - 8; |
2206 | + |
2207 | + adapter->rx_no_buffer = be64_to_cpup(p); |
2208 | +} |
2209 | + |
2210 | /* replenish routine */ |
2211 | static void ibmveth_replenish_task(struct ibmveth_adapter *adapter) |
2212 | { |
2213 | @@ -308,8 +320,7 @@ static void ibmveth_replenish_task(struct ibmveth_adapter *adapter) |
2214 | ibmveth_replenish_buffer_pool(adapter, pool); |
2215 | } |
2216 | |
2217 | - adapter->rx_no_buffer = *(u64 *)(((char*)adapter->buffer_list_addr) + |
2218 | - 4096 - 8); |
2219 | + ibmveth_update_rx_no_buffer(adapter); |
2220 | } |
2221 | |
2222 | /* empty and free ana buffer pool - also used to do cleanup in error paths */ |
2223 | @@ -689,8 +700,7 @@ static int ibmveth_close(struct net_device *netdev) |
2224 | |
2225 | free_irq(netdev->irq, netdev); |
2226 | |
2227 | - adapter->rx_no_buffer = *(u64 *)(((char *)adapter->buffer_list_addr) + |
2228 | - 4096 - 8); |
2229 | + ibmveth_update_rx_no_buffer(adapter); |
2230 | |
2231 | ibmveth_cleanup(adapter); |
2232 | |
2233 | diff --git a/drivers/net/wireless/ath/carl9170/carl9170.h b/drivers/net/wireless/ath/carl9170/carl9170.h |
2234 | index 9dce106cd6d4..95a334f0719c 100644 |
2235 | --- a/drivers/net/wireless/ath/carl9170/carl9170.h |
2236 | +++ b/drivers/net/wireless/ath/carl9170/carl9170.h |
2237 | @@ -253,6 +253,7 @@ struct ar9170 { |
2238 | atomic_t rx_work_urbs; |
2239 | atomic_t rx_pool_urbs; |
2240 | kernel_ulong_t features; |
2241 | + bool usb_ep_cmd_is_bulk; |
2242 | |
2243 | /* firmware settings */ |
2244 | struct completion fw_load_wait; |
2245 | diff --git a/drivers/net/wireless/ath/carl9170/usb.c b/drivers/net/wireless/ath/carl9170/usb.c |
2246 | index 307bc0ddff99..83d20c8b2ad7 100644 |
2247 | --- a/drivers/net/wireless/ath/carl9170/usb.c |
2248 | +++ b/drivers/net/wireless/ath/carl9170/usb.c |
2249 | @@ -621,9 +621,16 @@ int __carl9170_exec_cmd(struct ar9170 *ar, struct carl9170_cmd *cmd, |
2250 | goto err_free; |
2251 | } |
2252 | |
2253 | - usb_fill_int_urb(urb, ar->udev, usb_sndintpipe(ar->udev, |
2254 | - AR9170_USB_EP_CMD), cmd, cmd->hdr.len + 4, |
2255 | - carl9170_usb_cmd_complete, ar, 1); |
2256 | + if (ar->usb_ep_cmd_is_bulk) |
2257 | + usb_fill_bulk_urb(urb, ar->udev, |
2258 | + usb_sndbulkpipe(ar->udev, AR9170_USB_EP_CMD), |
2259 | + cmd, cmd->hdr.len + 4, |
2260 | + carl9170_usb_cmd_complete, ar); |
2261 | + else |
2262 | + usb_fill_int_urb(urb, ar->udev, |
2263 | + usb_sndintpipe(ar->udev, AR9170_USB_EP_CMD), |
2264 | + cmd, cmd->hdr.len + 4, |
2265 | + carl9170_usb_cmd_complete, ar, 1); |
2266 | |
2267 | if (free_buf) |
2268 | urb->transfer_flags |= URB_FREE_BUFFER; |
2269 | @@ -1032,9 +1039,10 @@ static void carl9170_usb_firmware_step2(const struct firmware *fw, |
2270 | static int carl9170_usb_probe(struct usb_interface *intf, |
2271 | const struct usb_device_id *id) |
2272 | { |
2273 | + struct usb_endpoint_descriptor *ep; |
2274 | struct ar9170 *ar; |
2275 | struct usb_device *udev; |
2276 | - int err; |
2277 | + int i, err; |
2278 | |
2279 | err = usb_reset_device(interface_to_usbdev(intf)); |
2280 | if (err) |
2281 | @@ -1050,6 +1058,21 @@ static int carl9170_usb_probe(struct usb_interface *intf, |
2282 | ar->intf = intf; |
2283 | ar->features = id->driver_info; |
2284 | |
2285 | + /* We need to remember the type of endpoint 4 because it differs |
2286 | + * between high- and full-speed configuration. The high-speed |
2287 | + * configuration specifies it as interrupt and the full-speed |
2288 | + * configuration as bulk endpoint. This information is required |
2289 | + * later when sending urbs to that endpoint. |
2290 | + */ |
2291 | + for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; ++i) { |
2292 | + ep = &intf->cur_altsetting->endpoint[i].desc; |
2293 | + |
2294 | + if (usb_endpoint_num(ep) == AR9170_USB_EP_CMD && |
2295 | + usb_endpoint_dir_out(ep) && |
2296 | + usb_endpoint_type(ep) == USB_ENDPOINT_XFER_BULK) |
2297 | + ar->usb_ep_cmd_is_bulk = true; |
2298 | + } |
2299 | + |
2300 | usb_set_intfdata(intf, ar); |
2301 | SET_IEEE80211_DEV(ar->hw, &intf->dev); |
2302 | |
2303 | diff --git a/drivers/net/wireless/iwlwifi/dvm/rxon.c b/drivers/net/wireless/iwlwifi/dvm/rxon.c |
2304 | index ca17e4c9eca2..cd1ad0019185 100644 |
2305 | --- a/drivers/net/wireless/iwlwifi/dvm/rxon.c |
2306 | +++ b/drivers/net/wireless/iwlwifi/dvm/rxon.c |
2307 | @@ -1072,6 +1072,13 @@ int iwlagn_commit_rxon(struct iwl_priv *priv, struct iwl_rxon_context *ctx) |
2308 | /* recalculate basic rates */ |
2309 | iwl_calc_basic_rates(priv, ctx); |
2310 | |
2311 | + /* |
2312 | + * force CTS-to-self frames protection if RTS-CTS is not preferred |
2313 | + * one aggregation protection method |
2314 | + */ |
2315 | + if (!priv->hw_params.use_rts_for_aggregation) |
2316 | + ctx->staging.flags |= RXON_FLG_SELF_CTS_EN; |
2317 | + |
2318 | if ((ctx->vif && ctx->vif->bss_conf.use_short_slot) || |
2319 | !(ctx->staging.flags & RXON_FLG_BAND_24G_MSK)) |
2320 | ctx->staging.flags |= RXON_FLG_SHORT_SLOT_MSK; |
2321 | @@ -1477,6 +1484,11 @@ void iwlagn_bss_info_changed(struct ieee80211_hw *hw, |
2322 | else |
2323 | ctx->staging.flags &= ~RXON_FLG_TGG_PROTECT_MSK; |
2324 | |
2325 | + if (bss_conf->use_cts_prot) |
2326 | + ctx->staging.flags |= RXON_FLG_SELF_CTS_EN; |
2327 | + else |
2328 | + ctx->staging.flags &= ~RXON_FLG_SELF_CTS_EN; |
2329 | + |
2330 | memcpy(ctx->staging.bssid_addr, bss_conf->bssid, ETH_ALEN); |
2331 | |
2332 | if (vif->type == NL80211_IFTYPE_AP || |
2333 | diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c |
2334 | index 8188dcb512f0..e7a2af3ad05a 100644 |
2335 | --- a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c |
2336 | +++ b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c |
2337 | @@ -316,6 +316,7 @@ static struct usb_device_id rtl8192c_usb_ids[] = { |
2338 | {RTL_USB_DEVICE(0x0bda, 0x5088, rtl92cu_hal_cfg)}, /*Thinkware-CC&C*/ |
2339 | {RTL_USB_DEVICE(0x0df6, 0x0052, rtl92cu_hal_cfg)}, /*Sitecom - Edimax*/ |
2340 | {RTL_USB_DEVICE(0x0df6, 0x005c, rtl92cu_hal_cfg)}, /*Sitecom - Edimax*/ |
2341 | + {RTL_USB_DEVICE(0x0df6, 0x0070, rtl92cu_hal_cfg)}, /*Sitecom - 150N */ |
2342 | {RTL_USB_DEVICE(0x0df6, 0x0077, rtl92cu_hal_cfg)}, /*Sitecom-WLA2100V2*/ |
2343 | {RTL_USB_DEVICE(0x0eb0, 0x9071, rtl92cu_hal_cfg)}, /*NO Brand - Etop*/ |
2344 | {RTL_USB_DEVICE(0x4856, 0x0091, rtl92cu_hal_cfg)}, /*NetweeN - Feixun*/ |
2345 | diff --git a/drivers/nfc/microread/microread.c b/drivers/nfc/microread/microread.c |
2346 | index 3420d833db17..384ab8ca4b37 100644 |
2347 | --- a/drivers/nfc/microread/microread.c |
2348 | +++ b/drivers/nfc/microread/microread.c |
2349 | @@ -501,9 +501,13 @@ static void microread_target_discovered(struct nfc_hci_dev *hdev, u8 gate, |
2350 | targets->sens_res = |
2351 | be16_to_cpu(*(u16 *)&skb->data[MICROREAD_EMCF_A_ATQA]); |
2352 | targets->sel_res = skb->data[MICROREAD_EMCF_A_SAK]; |
2353 | - memcpy(targets->nfcid1, &skb->data[MICROREAD_EMCF_A_UID], |
2354 | - skb->data[MICROREAD_EMCF_A_LEN]); |
2355 | targets->nfcid1_len = skb->data[MICROREAD_EMCF_A_LEN]; |
2356 | + if (targets->nfcid1_len > sizeof(targets->nfcid1)) { |
2357 | + r = -EINVAL; |
2358 | + goto exit_free; |
2359 | + } |
2360 | + memcpy(targets->nfcid1, &skb->data[MICROREAD_EMCF_A_UID], |
2361 | + targets->nfcid1_len); |
2362 | break; |
2363 | case MICROREAD_GATE_ID_MREAD_ISO_A_3: |
2364 | targets->supported_protocols = |
2365 | @@ -511,9 +515,13 @@ static void microread_target_discovered(struct nfc_hci_dev *hdev, u8 gate, |
2366 | targets->sens_res = |
2367 | be16_to_cpu(*(u16 *)&skb->data[MICROREAD_EMCF_A3_ATQA]); |
2368 | targets->sel_res = skb->data[MICROREAD_EMCF_A3_SAK]; |
2369 | - memcpy(targets->nfcid1, &skb->data[MICROREAD_EMCF_A3_UID], |
2370 | - skb->data[MICROREAD_EMCF_A3_LEN]); |
2371 | targets->nfcid1_len = skb->data[MICROREAD_EMCF_A3_LEN]; |
2372 | + if (targets->nfcid1_len > sizeof(targets->nfcid1)) { |
2373 | + r = -EINVAL; |
2374 | + goto exit_free; |
2375 | + } |
2376 | + memcpy(targets->nfcid1, &skb->data[MICROREAD_EMCF_A3_UID], |
2377 | + targets->nfcid1_len); |
2378 | break; |
2379 | case MICROREAD_GATE_ID_MREAD_ISO_B: |
2380 | targets->supported_protocols = NFC_PROTO_ISO14443_B_MASK; |
2381 | diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c |
2382 | index 5de946984500..f91d41788ce4 100644 |
2383 | --- a/drivers/scsi/libiscsi.c |
2384 | +++ b/drivers/scsi/libiscsi.c |
2385 | @@ -717,11 +717,21 @@ __iscsi_conn_send_pdu(struct iscsi_conn *conn, struct iscsi_hdr *hdr, |
2386 | return NULL; |
2387 | } |
2388 | |
2389 | + if (data_size > ISCSI_DEF_MAX_RECV_SEG_LEN) { |
2390 | + iscsi_conn_printk(KERN_ERR, conn, "Invalid buffer len of %u for login task. Max len is %u\n", data_size, ISCSI_DEF_MAX_RECV_SEG_LEN); |
2391 | + return NULL; |
2392 | + } |
2393 | + |
2394 | task = conn->login_task; |
2395 | } else { |
2396 | if (session->state != ISCSI_STATE_LOGGED_IN) |
2397 | return NULL; |
2398 | |
2399 | + if (data_size != 0) { |
2400 | + iscsi_conn_printk(KERN_ERR, conn, "Can not send data buffer of len %u for op 0x%x\n", data_size, opcode); |
2401 | + return NULL; |
2402 | + } |
2403 | + |
2404 | BUG_ON(conn->c_stage == ISCSI_CONN_INITIAL_STAGE); |
2405 | BUG_ON(conn->c_stage == ISCSI_CONN_STOPPED); |
2406 | |
2407 | diff --git a/drivers/staging/iio/meter/ade7758_trigger.c b/drivers/staging/iio/meter/ade7758_trigger.c |
2408 | index 7a94ddd42f59..8c4f2896cd0d 100644 |
2409 | --- a/drivers/staging/iio/meter/ade7758_trigger.c |
2410 | +++ b/drivers/staging/iio/meter/ade7758_trigger.c |
2411 | @@ -85,7 +85,7 @@ int ade7758_probe_trigger(struct iio_dev *indio_dev) |
2412 | ret = iio_trigger_register(st->trig); |
2413 | |
2414 | /* select default trigger */ |
2415 | - indio_dev->trig = st->trig; |
2416 | + indio_dev->trig = iio_trigger_get(st->trig); |
2417 | if (ret) |
2418 | goto error_free_irq; |
2419 | |
2420 | diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c |
2421 | index 799f84e686b5..651b5768862f 100644 |
2422 | --- a/drivers/target/iscsi/iscsi_target.c |
2423 | +++ b/drivers/target/iscsi/iscsi_target.c |
2424 | @@ -4453,6 +4453,7 @@ static void iscsit_logout_post_handler_diffcid( |
2425 | { |
2426 | struct iscsi_conn *l_conn; |
2427 | struct iscsi_session *sess = conn->sess; |
2428 | + bool conn_found = false; |
2429 | |
2430 | if (!sess) |
2431 | return; |
2432 | @@ -4461,12 +4462,13 @@ static void iscsit_logout_post_handler_diffcid( |
2433 | list_for_each_entry(l_conn, &sess->sess_conn_list, conn_list) { |
2434 | if (l_conn->cid == cid) { |
2435 | iscsit_inc_conn_usage_count(l_conn); |
2436 | + conn_found = true; |
2437 | break; |
2438 | } |
2439 | } |
2440 | spin_unlock_bh(&sess->conn_lock); |
2441 | |
2442 | - if (!l_conn) |
2443 | + if (!conn_found) |
2444 | return; |
2445 | |
2446 | if (l_conn->sock) |
2447 | diff --git a/drivers/target/iscsi/iscsi_target_parameters.c b/drivers/target/iscsi/iscsi_target_parameters.c |
2448 | index e38222191a33..30be6c9bdbc6 100644 |
2449 | --- a/drivers/target/iscsi/iscsi_target_parameters.c |
2450 | +++ b/drivers/target/iscsi/iscsi_target_parameters.c |
2451 | @@ -603,7 +603,7 @@ int iscsi_copy_param_list( |
2452 | param_list = kzalloc(sizeof(struct iscsi_param_list), GFP_KERNEL); |
2453 | if (!param_list) { |
2454 | pr_err("Unable to allocate memory for struct iscsi_param_list.\n"); |
2455 | - goto err_out; |
2456 | + return -1; |
2457 | } |
2458 | INIT_LIST_HEAD(¶m_list->param_list); |
2459 | INIT_LIST_HEAD(¶m_list->extra_response_list); |
2460 | diff --git a/drivers/tty/serial/8250/8250_dma.c b/drivers/tty/serial/8250/8250_dma.c |
2461 | index ab9096dc3849..148ffe4c232f 100644 |
2462 | --- a/drivers/tty/serial/8250/8250_dma.c |
2463 | +++ b/drivers/tty/serial/8250/8250_dma.c |
2464 | @@ -192,21 +192,28 @@ int serial8250_request_dma(struct uart_8250_port *p) |
2465 | |
2466 | dma->rx_buf = dma_alloc_coherent(dma->rxchan->device->dev, dma->rx_size, |
2467 | &dma->rx_addr, GFP_KERNEL); |
2468 | - if (!dma->rx_buf) { |
2469 | - dma_release_channel(dma->rxchan); |
2470 | - dma_release_channel(dma->txchan); |
2471 | - return -ENOMEM; |
2472 | - } |
2473 | + if (!dma->rx_buf) |
2474 | + goto err; |
2475 | |
2476 | /* TX buffer */ |
2477 | dma->tx_addr = dma_map_single(dma->txchan->device->dev, |
2478 | p->port.state->xmit.buf, |
2479 | UART_XMIT_SIZE, |
2480 | DMA_TO_DEVICE); |
2481 | + if (dma_mapping_error(dma->txchan->device->dev, dma->tx_addr)) { |
2482 | + dma_free_coherent(dma->rxchan->device->dev, dma->rx_size, |
2483 | + dma->rx_buf, dma->rx_addr); |
2484 | + goto err; |
2485 | + } |
2486 | |
2487 | dev_dbg_ratelimited(p->port.dev, "got both dma channels\n"); |
2488 | |
2489 | return 0; |
2490 | +err: |
2491 | + dma_release_channel(dma->rxchan); |
2492 | + dma_release_channel(dma->txchan); |
2493 | + |
2494 | + return -ENOMEM; |
2495 | } |
2496 | EXPORT_SYMBOL_GPL(serial8250_request_dma); |
2497 | |
2498 | diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c |
2499 | index a5631849017f..b5d42fee8a84 100644 |
2500 | --- a/drivers/usb/core/hub.c |
2501 | +++ b/drivers/usb/core/hub.c |
2502 | @@ -1165,7 +1165,8 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type) |
2503 | /* Tell khubd to disconnect the device or |
2504 | * check for a new connection |
2505 | */ |
2506 | - if (udev || (portstatus & USB_PORT_STAT_CONNECTION)) |
2507 | + if (udev || (portstatus & USB_PORT_STAT_CONNECTION) || |
2508 | + (portstatus & USB_PORT_STAT_OVERCURRENT)) |
2509 | set_bit(port1, hub->change_bits); |
2510 | |
2511 | } else if (portstatus & USB_PORT_STAT_ENABLE) { |
2512 | @@ -4702,9 +4703,10 @@ static void hub_events(void) |
2513 | |
2514 | hub = list_entry(tmp, struct usb_hub, event_list); |
2515 | kref_get(&hub->kref); |
2516 | + hdev = hub->hdev; |
2517 | + usb_get_dev(hdev); |
2518 | spin_unlock_irq(&hub_event_lock); |
2519 | |
2520 | - hdev = hub->hdev; |
2521 | hub_dev = hub->intfdev; |
2522 | intf = to_usb_interface(hub_dev); |
2523 | dev_dbg(hub_dev, "state %d ports %d chg %04x evt %04x\n", |
2524 | @@ -4919,6 +4921,7 @@ static void hub_events(void) |
2525 | usb_autopm_put_interface(intf); |
2526 | loop_disconnected: |
2527 | usb_unlock_device(hdev); |
2528 | + usb_put_dev(hdev); |
2529 | kref_put(&hub->kref, hub_release); |
2530 | |
2531 | } /* end while (1) */ |
2532 | diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c |
2533 | index 358375e0b291..1d386030d3c4 100644 |
2534 | --- a/drivers/usb/dwc3/core.c |
2535 | +++ b/drivers/usb/dwc3/core.c |
2536 | @@ -603,12 +603,6 @@ static int dwc3_remove(struct platform_device *pdev) |
2537 | { |
2538 | struct dwc3 *dwc = platform_get_drvdata(pdev); |
2539 | |
2540 | - usb_phy_set_suspend(dwc->usb2_phy, 1); |
2541 | - usb_phy_set_suspend(dwc->usb3_phy, 1); |
2542 | - |
2543 | - pm_runtime_put(&pdev->dev); |
2544 | - pm_runtime_disable(&pdev->dev); |
2545 | - |
2546 | dwc3_debugfs_exit(dwc); |
2547 | |
2548 | switch (dwc->mode) { |
2549 | @@ -629,8 +623,15 @@ static int dwc3_remove(struct platform_device *pdev) |
2550 | |
2551 | dwc3_event_buffers_cleanup(dwc); |
2552 | dwc3_free_event_buffers(dwc); |
2553 | + |
2554 | + usb_phy_set_suspend(dwc->usb2_phy, 1); |
2555 | + usb_phy_set_suspend(dwc->usb3_phy, 1); |
2556 | + |
2557 | dwc3_core_exit(dwc); |
2558 | |
2559 | + pm_runtime_put_sync(&pdev->dev); |
2560 | + pm_runtime_disable(&pdev->dev); |
2561 | + |
2562 | return 0; |
2563 | } |
2564 | |
2565 | diff --git a/drivers/usb/dwc3/dwc3-omap.c b/drivers/usb/dwc3/dwc3-omap.c |
2566 | index 34638b92500d..cb5f8c44eb3a 100644 |
2567 | --- a/drivers/usb/dwc3/dwc3-omap.c |
2568 | +++ b/drivers/usb/dwc3/dwc3-omap.c |
2569 | @@ -395,9 +395,9 @@ static int dwc3_omap_remove(struct platform_device *pdev) |
2570 | struct dwc3_omap *omap = platform_get_drvdata(pdev); |
2571 | |
2572 | dwc3_omap_disable_irqs(omap); |
2573 | + device_for_each_child(&pdev->dev, NULL, dwc3_omap_remove_core); |
2574 | pm_runtime_put_sync(&pdev->dev); |
2575 | pm_runtime_disable(&pdev->dev); |
2576 | - device_for_each_child(&pdev->dev, NULL, dwc3_omap_remove_core); |
2577 | |
2578 | return 0; |
2579 | } |
2580 | diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c |
2581 | index 4518b8189a9e..5a160063176d 100644 |
2582 | --- a/drivers/usb/host/ehci-hcd.c |
2583 | +++ b/drivers/usb/host/ehci-hcd.c |
2584 | @@ -972,8 +972,6 @@ rescan: |
2585 | } |
2586 | |
2587 | qh->exception = 1; |
2588 | - if (ehci->rh_state < EHCI_RH_RUNNING) |
2589 | - qh->qh_state = QH_STATE_IDLE; |
2590 | switch (qh->qh_state) { |
2591 | case QH_STATE_LINKED: |
2592 | case QH_STATE_COMPLETING: |
2593 | diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c |
2594 | index 7cdcfd024744..d939376c5dee 100644 |
2595 | --- a/drivers/usb/host/xhci-hub.c |
2596 | +++ b/drivers/usb/host/xhci-hub.c |
2597 | @@ -462,7 +462,8 @@ void xhci_test_and_clear_bit(struct xhci_hcd *xhci, __le32 __iomem **port_array, |
2598 | } |
2599 | |
2600 | /* Updates Link Status for super Speed port */ |
2601 | -static void xhci_hub_report_link_state(u32 *status, u32 status_reg) |
2602 | +static void xhci_hub_report_link_state(struct xhci_hcd *xhci, |
2603 | + u32 *status, u32 status_reg) |
2604 | { |
2605 | u32 pls = status_reg & PORT_PLS_MASK; |
2606 | |
2607 | @@ -501,7 +502,8 @@ static void xhci_hub_report_link_state(u32 *status, u32 status_reg) |
2608 | * in which sometimes the port enters compliance mode |
2609 | * caused by a delay on the host-device negotiation. |
2610 | */ |
2611 | - if (pls == USB_SS_PORT_LS_COMP_MOD) |
2612 | + if ((xhci->quirks & XHCI_COMP_MODE_QUIRK) && |
2613 | + (pls == USB_SS_PORT_LS_COMP_MOD)) |
2614 | pls |= USB_PORT_STAT_CONNECTION; |
2615 | } |
2616 | |
2617 | @@ -686,7 +688,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, |
2618 | } |
2619 | /* Update Port Link State for super speed ports*/ |
2620 | if (hcd->speed == HCD_USB3) { |
2621 | - xhci_hub_report_link_state(&status, temp); |
2622 | + xhci_hub_report_link_state(xhci, &status, temp); |
2623 | /* |
2624 | * Verify if all USB3 Ports Have entered U0 already. |
2625 | * Delete Compliance Mode Timer if so. |
2626 | diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c |
2627 | index d007f0920126..677f032482f7 100644 |
2628 | --- a/drivers/usb/host/xhci-mem.c |
2629 | +++ b/drivers/usb/host/xhci-mem.c |
2630 | @@ -1795,7 +1795,7 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci) |
2631 | } |
2632 | |
2633 | num_ports = HCS_MAX_PORTS(xhci->hcs_params1); |
2634 | - for (i = 0; i < num_ports; i++) { |
2635 | + for (i = 0; i < num_ports && xhci->rh_bw; i++) { |
2636 | struct xhci_interval_bw_table *bwt = &xhci->rh_bw[i].bw_table; |
2637 | for (j = 0; j < XHCI_MAX_INTERVAL; j++) { |
2638 | struct list_head *ep = &bwt->interval_bw[j].endpoints; |
2639 | diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c |
2640 | index 9a7088bc634d..10223f2b18d2 100644 |
2641 | --- a/drivers/usb/host/xhci.c |
2642 | +++ b/drivers/usb/host/xhci.c |
2643 | @@ -4407,13 +4407,21 @@ static int xhci_change_max_exit_latency(struct xhci_hcd *xhci, |
2644 | int ret; |
2645 | |
2646 | spin_lock_irqsave(&xhci->lock, flags); |
2647 | - if (max_exit_latency == xhci->devs[udev->slot_id]->current_mel) { |
2648 | + |
2649 | + virt_dev = xhci->devs[udev->slot_id]; |
2650 | + |
2651 | + /* |
2652 | + * virt_dev might not exists yet if xHC resumed from hibernate (S4) and |
2653 | + * xHC was re-initialized. Exit latency will be set later after |
2654 | + * hub_port_finish_reset() is done and xhci->devs[] are re-allocated |
2655 | + */ |
2656 | + |
2657 | + if (!virt_dev || max_exit_latency == virt_dev->current_mel) { |
2658 | spin_unlock_irqrestore(&xhci->lock, flags); |
2659 | return 0; |
2660 | } |
2661 | |
2662 | /* Attempt to issue an Evaluate Context command to change the MEL. */ |
2663 | - virt_dev = xhci->devs[udev->slot_id]; |
2664 | command = xhci->lpm_command; |
2665 | xhci_slot_copy(xhci, command->in_ctx, virt_dev->out_ctx); |
2666 | spin_unlock_irqrestore(&xhci->lock, flags); |
2667 | diff --git a/drivers/usb/misc/sisusbvga/sisusb.c b/drivers/usb/misc/sisusbvga/sisusb.c |
2668 | index de98906f786d..0aef801edbc1 100644 |
2669 | --- a/drivers/usb/misc/sisusbvga/sisusb.c |
2670 | +++ b/drivers/usb/misc/sisusbvga/sisusb.c |
2671 | @@ -3248,6 +3248,7 @@ static const struct usb_device_id sisusb_table[] = { |
2672 | { USB_DEVICE(0x0711, 0x0918) }, |
2673 | { USB_DEVICE(0x0711, 0x0920) }, |
2674 | { USB_DEVICE(0x0711, 0x0950) }, |
2675 | + { USB_DEVICE(0x0711, 0x5200) }, |
2676 | { USB_DEVICE(0x182d, 0x021c) }, |
2677 | { USB_DEVICE(0x182d, 0x0269) }, |
2678 | { } |
2679 | diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c |
2680 | index 120fff399c10..4235693ba2f7 100644 |
2681 | --- a/drivers/usb/serial/ftdi_sio.c |
2682 | +++ b/drivers/usb/serial/ftdi_sio.c |
2683 | @@ -744,6 +744,7 @@ static struct usb_device_id id_table_combined [] = { |
2684 | { USB_DEVICE(FTDI_VID, FTDI_NDI_AURORA_SCU_PID), |
2685 | .driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk }, |
2686 | { USB_DEVICE(TELLDUS_VID, TELLDUS_TELLSTICK_PID) }, |
2687 | + { USB_DEVICE(NOVITUS_VID, NOVITUS_BONO_E_PID) }, |
2688 | { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_S03_PID) }, |
2689 | { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_59_PID) }, |
2690 | { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_57A_PID) }, |
2691 | diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h |
2692 | index 70b0b1d88ae9..8927a5c39b00 100644 |
2693 | --- a/drivers/usb/serial/ftdi_sio_ids.h |
2694 | +++ b/drivers/usb/serial/ftdi_sio_ids.h |
2695 | @@ -837,6 +837,12 @@ |
2696 | #define TELLDUS_TELLSTICK_PID 0x0C30 /* RF control dongle 433 MHz using FT232RL */ |
2697 | |
2698 | /* |
2699 | + * NOVITUS printers |
2700 | + */ |
2701 | +#define NOVITUS_VID 0x1a28 |
2702 | +#define NOVITUS_BONO_E_PID 0x6010 |
2703 | + |
2704 | +/* |
2705 | * RT Systems programming cables for various ham radios |
2706 | */ |
2707 | #define RTSYSTEMS_VID 0x2100 /* Vendor ID */ |
2708 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c |
2709 | index 9da566a3f5c8..e47aabe0c760 100644 |
2710 | --- a/drivers/usb/serial/option.c |
2711 | +++ b/drivers/usb/serial/option.c |
2712 | @@ -275,8 +275,12 @@ static void option_instat_callback(struct urb *urb); |
2713 | #define ZTE_PRODUCT_MF622 0x0001 |
2714 | #define ZTE_PRODUCT_MF628 0x0015 |
2715 | #define ZTE_PRODUCT_MF626 0x0031 |
2716 | -#define ZTE_PRODUCT_MC2718 0xffe8 |
2717 | #define ZTE_PRODUCT_AC2726 0xfff1 |
2718 | +#define ZTE_PRODUCT_CDMA_TECH 0xfffe |
2719 | +#define ZTE_PRODUCT_AC8710T 0xffff |
2720 | +#define ZTE_PRODUCT_MC2718 0xffe8 |
2721 | +#define ZTE_PRODUCT_AD3812 0xffeb |
2722 | +#define ZTE_PRODUCT_MC2716 0xffed |
2723 | |
2724 | #define BENQ_VENDOR_ID 0x04a5 |
2725 | #define BENQ_PRODUCT_H10 0x4068 |
2726 | @@ -494,6 +498,10 @@ static void option_instat_callback(struct urb *urb); |
2727 | #define INOVIA_VENDOR_ID 0x20a6 |
2728 | #define INOVIA_SEW858 0x1105 |
2729 | |
2730 | +/* VIA Telecom */ |
2731 | +#define VIATELECOM_VENDOR_ID 0x15eb |
2732 | +#define VIATELECOM_PRODUCT_CDS7 0x0001 |
2733 | + |
2734 | /* some devices interfaces need special handling due to a number of reasons */ |
2735 | enum option_blacklist_reason { |
2736 | OPTION_BLACKLIST_NONE = 0, |
2737 | @@ -527,10 +535,18 @@ static const struct option_blacklist_info zte_k3765_z_blacklist = { |
2738 | .reserved = BIT(4), |
2739 | }; |
2740 | |
2741 | +static const struct option_blacklist_info zte_ad3812_z_blacklist = { |
2742 | + .sendsetup = BIT(0) | BIT(1) | BIT(2), |
2743 | +}; |
2744 | + |
2745 | static const struct option_blacklist_info zte_mc2718_z_blacklist = { |
2746 | .sendsetup = BIT(1) | BIT(2) | BIT(3) | BIT(4), |
2747 | }; |
2748 | |
2749 | +static const struct option_blacklist_info zte_mc2716_z_blacklist = { |
2750 | + .sendsetup = BIT(1) | BIT(2) | BIT(3), |
2751 | +}; |
2752 | + |
2753 | static const struct option_blacklist_info huawei_cdc12_blacklist = { |
2754 | .reserved = BIT(1) | BIT(2), |
2755 | }; |
2756 | @@ -1070,6 +1086,7 @@ static const struct usb_device_id option_ids[] = { |
2757 | { USB_DEVICE_INTERFACE_CLASS(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1012, 0xff) }, |
2758 | { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC650) }, |
2759 | { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC680) }, |
2760 | + { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6000)}, /* ZTE AC8700 */ |
2761 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */ |
2762 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x0023)}, /* ONYX 3G device */ |
2763 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x9000)}, /* SIMCom SIM5218 */ |
2764 | @@ -1544,13 +1561,18 @@ static const struct usb_device_id option_ids[] = { |
2765 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff93, 0xff, 0xff, 0xff) }, |
2766 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff94, 0xff, 0xff, 0xff) }, |
2767 | |
2768 | - /* NOTE: most ZTE CDMA devices should be driven by zte_ev, not option */ |
2769 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_CDMA_TECH, 0xff, 0xff, 0xff) }, |
2770 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC2726, 0xff, 0xff, 0xff) }, |
2771 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC8710T, 0xff, 0xff, 0xff) }, |
2772 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MC2718, 0xff, 0xff, 0xff), |
2773 | .driver_info = (kernel_ulong_t)&zte_mc2718_z_blacklist }, |
2774 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AD3812, 0xff, 0xff, 0xff), |
2775 | + .driver_info = (kernel_ulong_t)&zte_ad3812_z_blacklist }, |
2776 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MC2716, 0xff, 0xff, 0xff), |
2777 | + .driver_info = (kernel_ulong_t)&zte_mc2716_z_blacklist }, |
2778 | { USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x02, 0x01) }, |
2779 | { USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x02, 0x05) }, |
2780 | { USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x86, 0x10) }, |
2781 | - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC2726, 0xff, 0xff, 0xff) }, |
2782 | |
2783 | { USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_H10) }, |
2784 | { USB_DEVICE(DLINK_VENDOR_ID, DLINK_PRODUCT_DWM_652) }, |
2785 | @@ -1724,6 +1746,7 @@ static const struct usb_device_id option_ids[] = { |
2786 | { USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x3e01, 0xff, 0xff, 0xff) }, /* D-Link DWM-152/C1 */ |
2787 | { USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x3e02, 0xff, 0xff, 0xff) }, /* D-Link DWM-156/C1 */ |
2788 | { USB_DEVICE(INOVIA_VENDOR_ID, INOVIA_SEW858) }, |
2789 | + { USB_DEVICE(VIATELECOM_VENDOR_ID, VIATELECOM_PRODUCT_CDS7) }, |
2790 | { } /* Terminating entry */ |
2791 | }; |
2792 | MODULE_DEVICE_TABLE(usb, option_ids); |
2793 | @@ -1917,6 +1940,8 @@ static void option_instat_callback(struct urb *urb) |
2794 | dev_dbg(dev, "%s: type %x req %x\n", __func__, |
2795 | req_pkt->bRequestType, req_pkt->bRequest); |
2796 | } |
2797 | + } else if (status == -ENOENT || status == -ESHUTDOWN) { |
2798 | + dev_dbg(dev, "%s: urb stopped: %d\n", __func__, status); |
2799 | } else |
2800 | dev_err(dev, "%s: error %d\n", __func__, status); |
2801 | |
2802 | diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c |
2803 | index a0b58e252073..de3e15d8eb10 100644 |
2804 | --- a/drivers/usb/serial/pl2303.c |
2805 | +++ b/drivers/usb/serial/pl2303.c |
2806 | @@ -47,6 +47,7 @@ static const struct usb_device_id id_table[] = { |
2807 | { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GPRS) }, |
2808 | { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_HCR331) }, |
2809 | { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_MOTOROLA) }, |
2810 | + { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_ZTEK) }, |
2811 | { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) }, |
2812 | { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID_RSAQ5) }, |
2813 | { USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID) }, |
2814 | diff --git a/drivers/usb/serial/pl2303.h b/drivers/usb/serial/pl2303.h |
2815 | index 42bc082896ac..71fd9da1d6e7 100644 |
2816 | --- a/drivers/usb/serial/pl2303.h |
2817 | +++ b/drivers/usb/serial/pl2303.h |
2818 | @@ -22,6 +22,7 @@ |
2819 | #define PL2303_PRODUCT_ID_GPRS 0x0609 |
2820 | #define PL2303_PRODUCT_ID_HCR331 0x331a |
2821 | #define PL2303_PRODUCT_ID_MOTOROLA 0x0307 |
2822 | +#define PL2303_PRODUCT_ID_ZTEK 0xe1f1 |
2823 | |
2824 | #define ATEN_VENDOR_ID 0x0557 |
2825 | #define ATEN_VENDOR_ID2 0x0547 |
2826 | diff --git a/drivers/usb/serial/sierra.c b/drivers/usb/serial/sierra.c |
2827 | index 4e4590854123..5aaa2b675116 100644 |
2828 | --- a/drivers/usb/serial/sierra.c |
2829 | +++ b/drivers/usb/serial/sierra.c |
2830 | @@ -282,14 +282,19 @@ static const struct usb_device_id id_table[] = { |
2831 | /* Sierra Wireless HSPA Non-Composite Device */ |
2832 | { USB_DEVICE_AND_INTERFACE_INFO(0x1199, 0x6892, 0xFF, 0xFF, 0xFF)}, |
2833 | { USB_DEVICE(0x1199, 0x6893) }, /* Sierra Wireless Device */ |
2834 | - { USB_DEVICE(0x1199, 0x68A3), /* Sierra Wireless Direct IP modems */ |
2835 | + /* Sierra Wireless Direct IP modems */ |
2836 | + { USB_DEVICE_AND_INTERFACE_INFO(0x1199, 0x68A3, 0xFF, 0xFF, 0xFF), |
2837 | + .driver_info = (kernel_ulong_t)&direct_ip_interface_blacklist |
2838 | + }, |
2839 | + { USB_DEVICE_AND_INTERFACE_INFO(0x1199, 0x68AA, 0xFF, 0xFF, 0xFF), |
2840 | .driver_info = (kernel_ulong_t)&direct_ip_interface_blacklist |
2841 | }, |
2842 | /* AT&T Direct IP LTE modems */ |
2843 | { USB_DEVICE_AND_INTERFACE_INFO(0x0F3D, 0x68AA, 0xFF, 0xFF, 0xFF), |
2844 | .driver_info = (kernel_ulong_t)&direct_ip_interface_blacklist |
2845 | }, |
2846 | - { USB_DEVICE(0x0f3d, 0x68A3), /* Airprime/Sierra Wireless Direct IP modems */ |
2847 | + /* Airprime/Sierra Wireless Direct IP modems */ |
2848 | + { USB_DEVICE_AND_INTERFACE_INFO(0x0F3D, 0x68A3, 0xFF, 0xFF, 0xFF), |
2849 | .driver_info = (kernel_ulong_t)&direct_ip_interface_blacklist |
2850 | }, |
2851 | |
2852 | diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c |
2853 | index c1032d42b9d5..80d689f0fda9 100644 |
2854 | --- a/drivers/usb/serial/usb-serial.c |
2855 | +++ b/drivers/usb/serial/usb-serial.c |
2856 | @@ -778,29 +778,39 @@ static int usb_serial_probe(struct usb_interface *interface, |
2857 | if (usb_endpoint_is_bulk_in(endpoint)) { |
2858 | /* we found a bulk in endpoint */ |
2859 | dev_dbg(ddev, "found bulk in on endpoint %d\n", i); |
2860 | - bulk_in_endpoint[num_bulk_in] = endpoint; |
2861 | - ++num_bulk_in; |
2862 | + if (num_bulk_in < MAX_NUM_PORTS) { |
2863 | + bulk_in_endpoint[num_bulk_in] = endpoint; |
2864 | + ++num_bulk_in; |
2865 | + } |
2866 | } |
2867 | |
2868 | if (usb_endpoint_is_bulk_out(endpoint)) { |
2869 | /* we found a bulk out endpoint */ |
2870 | dev_dbg(ddev, "found bulk out on endpoint %d\n", i); |
2871 | - bulk_out_endpoint[num_bulk_out] = endpoint; |
2872 | - ++num_bulk_out; |
2873 | + if (num_bulk_out < MAX_NUM_PORTS) { |
2874 | + bulk_out_endpoint[num_bulk_out] = endpoint; |
2875 | + ++num_bulk_out; |
2876 | + } |
2877 | } |
2878 | |
2879 | if (usb_endpoint_is_int_in(endpoint)) { |
2880 | /* we found a interrupt in endpoint */ |
2881 | dev_dbg(ddev, "found interrupt in on endpoint %d\n", i); |
2882 | - interrupt_in_endpoint[num_interrupt_in] = endpoint; |
2883 | - ++num_interrupt_in; |
2884 | + if (num_interrupt_in < MAX_NUM_PORTS) { |
2885 | + interrupt_in_endpoint[num_interrupt_in] = |
2886 | + endpoint; |
2887 | + ++num_interrupt_in; |
2888 | + } |
2889 | } |
2890 | |
2891 | if (usb_endpoint_is_int_out(endpoint)) { |
2892 | /* we found an interrupt out endpoint */ |
2893 | dev_dbg(ddev, "found interrupt out on endpoint %d\n", i); |
2894 | - interrupt_out_endpoint[num_interrupt_out] = endpoint; |
2895 | - ++num_interrupt_out; |
2896 | + if (num_interrupt_out < MAX_NUM_PORTS) { |
2897 | + interrupt_out_endpoint[num_interrupt_out] = |
2898 | + endpoint; |
2899 | + ++num_interrupt_out; |
2900 | + } |
2901 | } |
2902 | } |
2903 | |
2904 | @@ -823,8 +833,10 @@ static int usb_serial_probe(struct usb_interface *interface, |
2905 | if (usb_endpoint_is_int_in(endpoint)) { |
2906 | /* we found a interrupt in endpoint */ |
2907 | dev_dbg(ddev, "found interrupt in for Prolific device on separate interface\n"); |
2908 | - interrupt_in_endpoint[num_interrupt_in] = endpoint; |
2909 | - ++num_interrupt_in; |
2910 | + if (num_interrupt_in < MAX_NUM_PORTS) { |
2911 | + interrupt_in_endpoint[num_interrupt_in] = endpoint; |
2912 | + ++num_interrupt_in; |
2913 | + } |
2914 | } |
2915 | } |
2916 | } |
2917 | @@ -864,6 +876,11 @@ static int usb_serial_probe(struct usb_interface *interface, |
2918 | num_ports = type->num_ports; |
2919 | } |
2920 | |
2921 | + if (num_ports > MAX_NUM_PORTS) { |
2922 | + dev_warn(ddev, "too many ports requested: %d\n", num_ports); |
2923 | + num_ports = MAX_NUM_PORTS; |
2924 | + } |
2925 | + |
2926 | serial->num_ports = num_ports; |
2927 | serial->num_bulk_in = num_bulk_in; |
2928 | serial->num_bulk_out = num_bulk_out; |
2929 | diff --git a/drivers/usb/serial/zte_ev.c b/drivers/usb/serial/zte_ev.c |
2930 | index eae2c873b39f..d6a3fbd029be 100644 |
2931 | --- a/drivers/usb/serial/zte_ev.c |
2932 | +++ b/drivers/usb/serial/zte_ev.c |
2933 | @@ -273,28 +273,16 @@ static void zte_ev_usb_serial_close(struct usb_serial_port *port) |
2934 | } |
2935 | |
2936 | static const struct usb_device_id id_table[] = { |
2937 | - /* AC8710, AC8710T */ |
2938 | - { USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xffff, 0xff, 0xff, 0xff) }, |
2939 | - /* AC8700 */ |
2940 | - { USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xfffe, 0xff, 0xff, 0xff) }, |
2941 | - /* MG880 */ |
2942 | - { USB_DEVICE(0x19d2, 0xfffd) }, |
2943 | - { USB_DEVICE(0x19d2, 0xfffc) }, |
2944 | - { USB_DEVICE(0x19d2, 0xfffb) }, |
2945 | - /* AC8710_V3 */ |
2946 | + { USB_DEVICE(0x19d2, 0xffec) }, |
2947 | + { USB_DEVICE(0x19d2, 0xffee) }, |
2948 | { USB_DEVICE(0x19d2, 0xfff6) }, |
2949 | { USB_DEVICE(0x19d2, 0xfff7) }, |
2950 | { USB_DEVICE(0x19d2, 0xfff8) }, |
2951 | { USB_DEVICE(0x19d2, 0xfff9) }, |
2952 | - { USB_DEVICE(0x19d2, 0xffee) }, |
2953 | - /* AC2716, MC2716 */ |
2954 | - { USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xffed, 0xff, 0xff, 0xff) }, |
2955 | - /* AD3812 */ |
2956 | - { USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xffeb, 0xff, 0xff, 0xff) }, |
2957 | - { USB_DEVICE(0x19d2, 0xffec) }, |
2958 | - { USB_DEVICE(0x05C6, 0x3197) }, |
2959 | - { USB_DEVICE(0x05C6, 0x6000) }, |
2960 | - { USB_DEVICE(0x05C6, 0x9008) }, |
2961 | + { USB_DEVICE(0x19d2, 0xfffb) }, |
2962 | + { USB_DEVICE(0x19d2, 0xfffc) }, |
2963 | + /* MG880 */ |
2964 | + { USB_DEVICE(0x19d2, 0xfffd) }, |
2965 | { }, |
2966 | }; |
2967 | MODULE_DEVICE_TABLE(usb, id_table); |
2968 | diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h |
2969 | index 042c83b01046..7f625306ea80 100644 |
2970 | --- a/drivers/usb/storage/unusual_devs.h |
2971 | +++ b/drivers/usb/storage/unusual_devs.h |
2972 | @@ -101,6 +101,12 @@ UNUSUAL_DEV( 0x03f0, 0x4002, 0x0001, 0x0001, |
2973 | "PhotoSmart R707", |
2974 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, US_FL_FIX_CAPACITY), |
2975 | |
2976 | +UNUSUAL_DEV( 0x03f3, 0x0001, 0x0000, 0x9999, |
2977 | + "Adaptec", |
2978 | + "USBConnect 2000", |
2979 | + USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_euscsi_init, |
2980 | + US_FL_SCM_MULT_TARG ), |
2981 | + |
2982 | /* Reported by Sebastian Kapfer <sebastian_kapfer@gmx.net> |
2983 | * and Olaf Hering <olh@suse.de> (different bcd's, same vendor/product) |
2984 | * for USB floppies that need the SINGLE_LUN enforcement. |
2985 | @@ -741,6 +747,12 @@ UNUSUAL_DEV( 0x059b, 0x0001, 0x0100, 0x0100, |
2986 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
2987 | US_FL_SINGLE_LUN ), |
2988 | |
2989 | +UNUSUAL_DEV( 0x059b, 0x0040, 0x0100, 0x0100, |
2990 | + "Iomega", |
2991 | + "Jaz USB Adapter", |
2992 | + USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
2993 | + US_FL_SINGLE_LUN ), |
2994 | + |
2995 | /* Reported by <Hendryk.Pfeiffer@gmx.de> */ |
2996 | UNUSUAL_DEV( 0x059f, 0x0643, 0x0000, 0x0000, |
2997 | "LaCie", |
2998 | @@ -1113,6 +1125,18 @@ UNUSUAL_DEV( 0x0851, 0x1543, 0x0200, 0x0200, |
2999 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
3000 | US_FL_NOT_LOCKABLE), |
3001 | |
3002 | +UNUSUAL_DEV( 0x085a, 0x0026, 0x0100, 0x0133, |
3003 | + "Xircom", |
3004 | + "PortGear USB-SCSI (Mac USB Dock)", |
3005 | + USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_euscsi_init, |
3006 | + US_FL_SCM_MULT_TARG ), |
3007 | + |
3008 | +UNUSUAL_DEV( 0x085a, 0x0028, 0x0100, 0x0133, |
3009 | + "Xircom", |
3010 | + "PortGear USB to SCSI Converter", |
3011 | + USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_euscsi_init, |
3012 | + US_FL_SCM_MULT_TARG ), |
3013 | + |
3014 | /* Submitted by Jan De Luyck <lkml@kcore.org> */ |
3015 | UNUSUAL_DEV( 0x08bd, 0x1100, 0x0000, 0x0000, |
3016 | "CITIZEN", |
3017 | @@ -1945,6 +1969,14 @@ UNUSUAL_DEV( 0x152d, 0x2329, 0x0100, 0x0100, |
3018 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
3019 | US_FL_IGNORE_RESIDUE | US_FL_SANE_SENSE ), |
3020 | |
3021 | +/* Entrega Technologies U1-SC25 (later Xircom PortGear PGSCSI) |
3022 | + * and Mac USB Dock USB-SCSI */ |
3023 | +UNUSUAL_DEV( 0x1645, 0x0007, 0x0100, 0x0133, |
3024 | + "Entrega Technologies", |
3025 | + "USB to SCSI Converter", |
3026 | + USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_euscsi_init, |
3027 | + US_FL_SCM_MULT_TARG ), |
3028 | + |
3029 | /* Reported by Robert Schedel <r.schedel@yahoo.de> |
3030 | * Note: this is a 'super top' device like the above 14cd/6600 device */ |
3031 | UNUSUAL_DEV( 0x1652, 0x6600, 0x0201, 0x0201, |
3032 | @@ -1967,6 +1999,12 @@ UNUSUAL_DEV( 0x177f, 0x0400, 0x0000, 0x0000, |
3033 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
3034 | US_FL_BULK_IGNORE_TAG | US_FL_MAX_SECTORS_64 ), |
3035 | |
3036 | +UNUSUAL_DEV( 0x1822, 0x0001, 0x0000, 0x9999, |
3037 | + "Ariston Technologies", |
3038 | + "iConnect USB to SCSI adapter", |
3039 | + USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_euscsi_init, |
3040 | + US_FL_SCM_MULT_TARG ), |
3041 | + |
3042 | /* Reported by Hans de Goede <hdegoede@redhat.com> |
3043 | * These Appotech controllers are found in Picture Frames, they provide a |
3044 | * (buggy) emulation of a cdrom drive which contains the windows software |
3045 | diff --git a/fs/buffer.c b/fs/buffer.c |
3046 | index 75964d734444..10fca21ee8aa 100644 |
3047 | --- a/fs/buffer.c |
3048 | +++ b/fs/buffer.c |
3049 | @@ -985,7 +985,8 @@ grow_dev_page(struct block_device *bdev, sector_t block, |
3050 | bh = page_buffers(page); |
3051 | if (bh->b_size == size) { |
3052 | end_block = init_page_buffers(page, bdev, |
3053 | - index << sizebits, size); |
3054 | + (sector_t)index << sizebits, |
3055 | + size); |
3056 | goto done; |
3057 | } |
3058 | if (!try_to_free_buffers(page)) |
3059 | @@ -1006,7 +1007,8 @@ grow_dev_page(struct block_device *bdev, sector_t block, |
3060 | */ |
3061 | spin_lock(&inode->i_mapping->private_lock); |
3062 | link_dev_buffers(page, bh); |
3063 | - end_block = init_page_buffers(page, bdev, index << sizebits, size); |
3064 | + end_block = init_page_buffers(page, bdev, (sector_t)index << sizebits, |
3065 | + size); |
3066 | spin_unlock(&inode->i_mapping->private_lock); |
3067 | done: |
3068 | ret = (block < end_block) ? 1 : -ENXIO; |
3069 | diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h |
3070 | index 52480240168e..f74dfa89c4c4 100644 |
3071 | --- a/fs/cifs/cifsglob.h |
3072 | +++ b/fs/cifs/cifsglob.h |
3073 | @@ -375,6 +375,8 @@ struct smb_version_operations { |
3074 | const char *, u32 *); |
3075 | int (*set_acl)(struct cifs_ntsd *, __u32, struct inode *, const char *, |
3076 | int); |
3077 | + /* check if we need to issue closedir */ |
3078 | + bool (*dir_needs_close)(struct cifsFileInfo *); |
3079 | }; |
3080 | |
3081 | struct smb_version_values { |
3082 | diff --git a/fs/cifs/file.c b/fs/cifs/file.c |
3083 | index 97b03895ac8c..5fcc10fa62bd 100644 |
3084 | --- a/fs/cifs/file.c |
3085 | +++ b/fs/cifs/file.c |
3086 | @@ -735,7 +735,7 @@ int cifs_closedir(struct inode *inode, struct file *file) |
3087 | |
3088 | cifs_dbg(FYI, "Freeing private data in close dir\n"); |
3089 | spin_lock(&cifs_file_list_lock); |
3090 | - if (!cfile->srch_inf.endOfSearch && !cfile->invalidHandle) { |
3091 | + if (server->ops->dir_needs_close(cfile)) { |
3092 | cfile->invalidHandle = true; |
3093 | spin_unlock(&cifs_file_list_lock); |
3094 | if (server->ops->close_dir) |
3095 | diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c |
3096 | index c9bce9b43855..0dee93706c98 100644 |
3097 | --- a/fs/cifs/inode.c |
3098 | +++ b/fs/cifs/inode.c |
3099 | @@ -1640,7 +1640,10 @@ cifs_rename(struct inode *source_dir, struct dentry *source_dentry, |
3100 | unlink_target: |
3101 | /* Try unlinking the target dentry if it's not negative */ |
3102 | if (target_dentry->d_inode && (rc == -EACCES || rc == -EEXIST)) { |
3103 | - tmprc = cifs_unlink(target_dir, target_dentry); |
3104 | + if (S_ISDIR(target_dentry->d_inode->i_mode)) |
3105 | + tmprc = cifs_rmdir(target_dir, target_dentry); |
3106 | + else |
3107 | + tmprc = cifs_unlink(target_dir, target_dentry); |
3108 | if (tmprc) |
3109 | goto cifs_rename_exit; |
3110 | rc = cifs_do_rename(xid, source_dentry, from_name, |
3111 | diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c |
3112 | index 87d125f682cd..85ebdaa21015 100644 |
3113 | --- a/fs/cifs/readdir.c |
3114 | +++ b/fs/cifs/readdir.c |
3115 | @@ -582,7 +582,7 @@ find_cifs_entry(const unsigned int xid, struct cifs_tcon *tcon, |
3116 | /* close and restart search */ |
3117 | cifs_dbg(FYI, "search backing up - close and restart search\n"); |
3118 | spin_lock(&cifs_file_list_lock); |
3119 | - if (!cfile->srch_inf.endOfSearch && !cfile->invalidHandle) { |
3120 | + if (server->ops->dir_needs_close(cfile)) { |
3121 | cfile->invalidHandle = true; |
3122 | spin_unlock(&cifs_file_list_lock); |
3123 | if (server->ops->close_dir) |
3124 | diff --git a/fs/cifs/smb1ops.c b/fs/cifs/smb1ops.c |
3125 | index 4885a40f3210..610c6c24d41d 100644 |
3126 | --- a/fs/cifs/smb1ops.c |
3127 | +++ b/fs/cifs/smb1ops.c |
3128 | @@ -885,6 +885,12 @@ cifs_mand_lock(const unsigned int xid, struct cifsFileInfo *cfile, __u64 offset, |
3129 | (__u8)type, wait, 0); |
3130 | } |
3131 | |
3132 | +static bool |
3133 | +cifs_dir_needs_close(struct cifsFileInfo *cfile) |
3134 | +{ |
3135 | + return !cfile->srch_inf.endOfSearch && !cfile->invalidHandle; |
3136 | +} |
3137 | + |
3138 | struct smb_version_operations smb1_operations = { |
3139 | .send_cancel = send_nt_cancel, |
3140 | .compare_fids = cifs_compare_fids, |
3141 | @@ -948,6 +954,7 @@ struct smb_version_operations smb1_operations = { |
3142 | .mand_lock = cifs_mand_lock, |
3143 | .mand_unlock_range = cifs_unlock_range, |
3144 | .push_mand_locks = cifs_push_mandatory_locks, |
3145 | + .dir_needs_close = cifs_dir_needs_close, |
3146 | #ifdef CONFIG_CIFS_XATTR |
3147 | .query_all_EAs = CIFSSMBQAllEAs, |
3148 | .set_EA = CIFSSMBSetEA, |
3149 | diff --git a/fs/cifs/smb2maperror.c b/fs/cifs/smb2maperror.c |
3150 | index 824696fb24db..4768cf8be6e2 100644 |
3151 | --- a/fs/cifs/smb2maperror.c |
3152 | +++ b/fs/cifs/smb2maperror.c |
3153 | @@ -214,7 +214,7 @@ static const struct status_to_posix_error smb2_error_map_table[] = { |
3154 | {STATUS_BREAKPOINT, -EIO, "STATUS_BREAKPOINT"}, |
3155 | {STATUS_SINGLE_STEP, -EIO, "STATUS_SINGLE_STEP"}, |
3156 | {STATUS_BUFFER_OVERFLOW, -EIO, "STATUS_BUFFER_OVERFLOW"}, |
3157 | - {STATUS_NO_MORE_FILES, -EIO, "STATUS_NO_MORE_FILES"}, |
3158 | + {STATUS_NO_MORE_FILES, -ENODATA, "STATUS_NO_MORE_FILES"}, |
3159 | {STATUS_WAKE_SYSTEM_DEBUGGER, -EIO, "STATUS_WAKE_SYSTEM_DEBUGGER"}, |
3160 | {STATUS_HANDLES_CLOSED, -EIO, "STATUS_HANDLES_CLOSED"}, |
3161 | {STATUS_NO_INHERITANCE, -EIO, "STATUS_NO_INHERITANCE"}, |
3162 | diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c |
3163 | index fe7ac989c6c4..e12f258a5ffa 100644 |
3164 | --- a/fs/cifs/smb2ops.c |
3165 | +++ b/fs/cifs/smb2ops.c |
3166 | @@ -554,6 +554,12 @@ smb2_new_lease_key(struct cifs_fid *fid) |
3167 | get_random_bytes(fid->lease_key, SMB2_LEASE_KEY_SIZE); |
3168 | } |
3169 | |
3170 | +static bool |
3171 | +smb2_dir_needs_close(struct cifsFileInfo *cfile) |
3172 | +{ |
3173 | + return !cfile->invalidHandle; |
3174 | +} |
3175 | + |
3176 | struct smb_version_operations smb21_operations = { |
3177 | .compare_fids = smb2_compare_fids, |
3178 | .setup_request = smb2_setup_request, |
3179 | @@ -618,6 +624,7 @@ struct smb_version_operations smb21_operations = { |
3180 | .set_lease_key = smb2_set_lease_key, |
3181 | .new_lease_key = smb2_new_lease_key, |
3182 | .calc_signature = smb2_calc_signature, |
3183 | + .dir_needs_close = smb2_dir_needs_close, |
3184 | }; |
3185 | |
3186 | |
3187 | @@ -685,6 +692,7 @@ struct smb_version_operations smb30_operations = { |
3188 | .set_lease_key = smb2_set_lease_key, |
3189 | .new_lease_key = smb2_new_lease_key, |
3190 | .calc_signature = smb3_calc_signature, |
3191 | + .dir_needs_close = smb2_dir_needs_close, |
3192 | }; |
3193 | |
3194 | struct smb_version_values smb20_values = { |
3195 | diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c |
3196 | index e37790841446..eb0de4c3ca76 100644 |
3197 | --- a/fs/cifs/smb2pdu.c |
3198 | +++ b/fs/cifs/smb2pdu.c |
3199 | @@ -1800,6 +1800,10 @@ SMB2_query_directory(const unsigned int xid, struct cifs_tcon *tcon, |
3200 | rsp = (struct smb2_query_directory_rsp *)iov[0].iov_base; |
3201 | |
3202 | if (rc) { |
3203 | + if (rc == -ENODATA && rsp->hdr.Status == STATUS_NO_MORE_FILES) { |
3204 | + srch_inf->endOfSearch = true; |
3205 | + rc = 0; |
3206 | + } |
3207 | cifs_stats_fail_inc(tcon, SMB2_QUERY_DIRECTORY_HE); |
3208 | goto qdir_exit; |
3209 | } |
3210 | @@ -1837,11 +1841,6 @@ SMB2_query_directory(const unsigned int xid, struct cifs_tcon *tcon, |
3211 | else |
3212 | cifs_dbg(VFS, "illegal search buffer type\n"); |
3213 | |
3214 | - if (rsp->hdr.Status == STATUS_NO_MORE_FILES) |
3215 | - srch_inf->endOfSearch = 1; |
3216 | - else |
3217 | - srch_inf->endOfSearch = 0; |
3218 | - |
3219 | return rc; |
3220 | |
3221 | qdir_exit: |
3222 | diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c |
3223 | index 0a87bb10998d..99d84ce038b8 100644 |
3224 | --- a/fs/ext2/inode.c |
3225 | +++ b/fs/ext2/inode.c |
3226 | @@ -632,6 +632,8 @@ static int ext2_get_blocks(struct inode *inode, |
3227 | int count = 0; |
3228 | ext2_fsblk_t first_block = 0; |
3229 | |
3230 | + BUG_ON(maxblocks == 0); |
3231 | + |
3232 | depth = ext2_block_to_path(inode,iblock,offsets,&blocks_to_boundary); |
3233 | |
3234 | if (depth == 0) |
3235 | diff --git a/fs/ext2/xip.c b/fs/ext2/xip.c |
3236 | index 1c3312858fcf..e98171a11cfe 100644 |
3237 | --- a/fs/ext2/xip.c |
3238 | +++ b/fs/ext2/xip.c |
3239 | @@ -35,6 +35,7 @@ __ext2_get_block(struct inode *inode, pgoff_t pgoff, int create, |
3240 | int rc; |
3241 | |
3242 | memset(&tmp, 0, sizeof(struct buffer_head)); |
3243 | + tmp.b_size = 1 << inode->i_blkbits; |
3244 | rc = ext2_get_block(inode, pgoff, &tmp, create); |
3245 | *result = tmp.b_blocknr; |
3246 | |
3247 | diff --git a/fs/lockd/svc.c b/fs/lockd/svc.c |
3248 | index d56a9904e52a..9c8a5a6d33df 100644 |
3249 | --- a/fs/lockd/svc.c |
3250 | +++ b/fs/lockd/svc.c |
3251 | @@ -253,13 +253,11 @@ static int lockd_up_net(struct svc_serv *serv, struct net *net) |
3252 | |
3253 | error = make_socks(serv, net); |
3254 | if (error < 0) |
3255 | - goto err_socks; |
3256 | + goto err_bind; |
3257 | set_grace_period(net); |
3258 | dprintk("lockd_up_net: per-net data created; net=%p\n", net); |
3259 | return 0; |
3260 | |
3261 | -err_socks: |
3262 | - svc_rpcb_cleanup(serv, net); |
3263 | err_bind: |
3264 | ln->nlmsvc_users--; |
3265 | return error; |
3266 | diff --git a/fs/nfs/nfs4client.c b/fs/nfs/nfs4client.c |
3267 | index 02773aab43c5..cc143ee7a56e 100644 |
3268 | --- a/fs/nfs/nfs4client.c |
3269 | +++ b/fs/nfs/nfs4client.c |
3270 | @@ -311,6 +311,16 @@ int nfs40_walk_client_list(struct nfs_client *new, |
3271 | |
3272 | spin_lock(&nn->nfs_client_lock); |
3273 | list_for_each_entry(pos, &nn->nfs_client_list, cl_share_link) { |
3274 | + |
3275 | + if (pos->rpc_ops != new->rpc_ops) |
3276 | + continue; |
3277 | + |
3278 | + if (pos->cl_proto != new->cl_proto) |
3279 | + continue; |
3280 | + |
3281 | + if (pos->cl_minorversion != new->cl_minorversion) |
3282 | + continue; |
3283 | + |
3284 | /* If "pos" isn't marked ready, we can't trust the |
3285 | * remaining fields in "pos" */ |
3286 | if (pos->cl_cons_state > NFS_CS_READY) { |
3287 | @@ -330,15 +340,6 @@ int nfs40_walk_client_list(struct nfs_client *new, |
3288 | if (pos->cl_cons_state != NFS_CS_READY) |
3289 | continue; |
3290 | |
3291 | - if (pos->rpc_ops != new->rpc_ops) |
3292 | - continue; |
3293 | - |
3294 | - if (pos->cl_proto != new->cl_proto) |
3295 | - continue; |
3296 | - |
3297 | - if (pos->cl_minorversion != new->cl_minorversion) |
3298 | - continue; |
3299 | - |
3300 | if (pos->cl_clientid != new->cl_clientid) |
3301 | continue; |
3302 | |
3303 | @@ -444,6 +445,16 @@ int nfs41_walk_client_list(struct nfs_client *new, |
3304 | |
3305 | spin_lock(&nn->nfs_client_lock); |
3306 | list_for_each_entry(pos, &nn->nfs_client_list, cl_share_link) { |
3307 | + |
3308 | + if (pos->rpc_ops != new->rpc_ops) |
3309 | + continue; |
3310 | + |
3311 | + if (pos->cl_proto != new->cl_proto) |
3312 | + continue; |
3313 | + |
3314 | + if (pos->cl_minorversion != new->cl_minorversion) |
3315 | + continue; |
3316 | + |
3317 | /* If "pos" isn't marked ready, we can't trust the |
3318 | * remaining fields in "pos", especially the client |
3319 | * ID and serverowner fields. Wait for CREATE_SESSION |
3320 | @@ -469,15 +480,6 @@ int nfs41_walk_client_list(struct nfs_client *new, |
3321 | if (pos->cl_cons_state != NFS_CS_READY) |
3322 | continue; |
3323 | |
3324 | - if (pos->rpc_ops != new->rpc_ops) |
3325 | - continue; |
3326 | - |
3327 | - if (pos->cl_proto != new->cl_proto) |
3328 | - continue; |
3329 | - |
3330 | - if (pos->cl_minorversion != new->cl_minorversion) |
3331 | - continue; |
3332 | - |
3333 | if (!nfs4_match_clientids(pos, new)) |
3334 | continue; |
3335 | |
3336 | diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c |
3337 | index 25559821771b..3fc87b6f9def 100644 |
3338 | --- a/fs/nfs/nfs4proc.c |
3339 | +++ b/fs/nfs/nfs4proc.c |
3340 | @@ -2299,23 +2299,23 @@ static void nfs4_close_prepare(struct rpc_task *task, void *data) |
3341 | is_rdwr = test_bit(NFS_O_RDWR_STATE, &state->flags); |
3342 | is_rdonly = test_bit(NFS_O_RDONLY_STATE, &state->flags); |
3343 | is_wronly = test_bit(NFS_O_WRONLY_STATE, &state->flags); |
3344 | - /* Calculate the current open share mode */ |
3345 | - calldata->arg.fmode = 0; |
3346 | - if (is_rdonly || is_rdwr) |
3347 | - calldata->arg.fmode |= FMODE_READ; |
3348 | - if (is_wronly || is_rdwr) |
3349 | - calldata->arg.fmode |= FMODE_WRITE; |
3350 | /* Calculate the change in open mode */ |
3351 | + calldata->arg.fmode = 0; |
3352 | if (state->n_rdwr == 0) { |
3353 | - if (state->n_rdonly == 0) { |
3354 | - call_close |= is_rdonly || is_rdwr; |
3355 | - calldata->arg.fmode &= ~FMODE_READ; |
3356 | - } |
3357 | - if (state->n_wronly == 0) { |
3358 | - call_close |= is_wronly || is_rdwr; |
3359 | - calldata->arg.fmode &= ~FMODE_WRITE; |
3360 | - } |
3361 | - } |
3362 | + if (state->n_rdonly == 0) |
3363 | + call_close |= is_rdonly; |
3364 | + else if (is_rdonly) |
3365 | + calldata->arg.fmode |= FMODE_READ; |
3366 | + if (state->n_wronly == 0) |
3367 | + call_close |= is_wronly; |
3368 | + else if (is_wronly) |
3369 | + calldata->arg.fmode |= FMODE_WRITE; |
3370 | + } else if (is_rdwr) |
3371 | + calldata->arg.fmode |= FMODE_READ|FMODE_WRITE; |
3372 | + |
3373 | + if (calldata->arg.fmode == 0) |
3374 | + call_close |= is_rdwr; |
3375 | + |
3376 | if (!nfs4_valid_open_stateid(state)) |
3377 | call_close = 0; |
3378 | spin_unlock(&state->owner->so_lock); |
3379 | diff --git a/fs/nilfs2/inode.c b/fs/nilfs2/inode.c |
3380 | index bccfec8343c5..2e1372efbb00 100644 |
3381 | --- a/fs/nilfs2/inode.c |
3382 | +++ b/fs/nilfs2/inode.c |
3383 | @@ -24,6 +24,7 @@ |
3384 | #include <linux/buffer_head.h> |
3385 | #include <linux/gfp.h> |
3386 | #include <linux/mpage.h> |
3387 | +#include <linux/pagemap.h> |
3388 | #include <linux/writeback.h> |
3389 | #include <linux/aio.h> |
3390 | #include "nilfs.h" |
3391 | @@ -219,10 +220,10 @@ static int nilfs_writepage(struct page *page, struct writeback_control *wbc) |
3392 | |
3393 | static int nilfs_set_page_dirty(struct page *page) |
3394 | { |
3395 | + struct inode *inode = page->mapping->host; |
3396 | int ret = __set_page_dirty_nobuffers(page); |
3397 | |
3398 | if (page_has_buffers(page)) { |
3399 | - struct inode *inode = page->mapping->host; |
3400 | unsigned nr_dirty = 0; |
3401 | struct buffer_head *bh, *head; |
3402 | |
3403 | @@ -245,6 +246,10 @@ static int nilfs_set_page_dirty(struct page *page) |
3404 | |
3405 | if (nr_dirty) |
3406 | nilfs_set_file_dirty(inode, nr_dirty); |
3407 | + } else if (ret) { |
3408 | + unsigned nr_dirty = 1 << (PAGE_CACHE_SHIFT - inode->i_blkbits); |
3409 | + |
3410 | + nilfs_set_file_dirty(inode, nr_dirty); |
3411 | } |
3412 | return ret; |
3413 | } |
3414 | diff --git a/fs/notify/fdinfo.c b/fs/notify/fdinfo.c |
3415 | index 238a5930cb3c..9d7e2b9659cb 100644 |
3416 | --- a/fs/notify/fdinfo.c |
3417 | +++ b/fs/notify/fdinfo.c |
3418 | @@ -42,7 +42,7 @@ static int show_mark_fhandle(struct seq_file *m, struct inode *inode) |
3419 | { |
3420 | struct { |
3421 | struct file_handle handle; |
3422 | - u8 pad[64]; |
3423 | + u8 pad[MAX_HANDLE_SZ]; |
3424 | } f; |
3425 | int size, ret, i; |
3426 | |
3427 | @@ -50,7 +50,7 @@ static int show_mark_fhandle(struct seq_file *m, struct inode *inode) |
3428 | size = f.handle.handle_bytes >> 2; |
3429 | |
3430 | ret = exportfs_encode_inode_fh(inode, (struct fid *)f.handle.f_handle, &size, 0); |
3431 | - if ((ret == 255) || (ret == -ENOSPC)) { |
3432 | + if ((ret == FILEID_INVALID) || (ret < 0)) { |
3433 | WARN_ONCE(1, "Can't encode file handler for inotify: %d\n", ret); |
3434 | return 0; |
3435 | } |
3436 | diff --git a/fs/ocfs2/dlm/dlmmaster.c b/fs/ocfs2/dlm/dlmmaster.c |
3437 | index 33ecbe0e6734..2b941113e423 100644 |
3438 | --- a/fs/ocfs2/dlm/dlmmaster.c |
3439 | +++ b/fs/ocfs2/dlm/dlmmaster.c |
3440 | @@ -653,12 +653,9 @@ void dlm_lockres_clear_refmap_bit(struct dlm_ctxt *dlm, |
3441 | clear_bit(bit, res->refmap); |
3442 | } |
3443 | |
3444 | - |
3445 | -void dlm_lockres_grab_inflight_ref(struct dlm_ctxt *dlm, |
3446 | +static void __dlm_lockres_grab_inflight_ref(struct dlm_ctxt *dlm, |
3447 | struct dlm_lock_resource *res) |
3448 | { |
3449 | - assert_spin_locked(&res->spinlock); |
3450 | - |
3451 | res->inflight_locks++; |
3452 | |
3453 | mlog(0, "%s: res %.*s, inflight++: now %u, %ps()\n", dlm->name, |
3454 | @@ -666,6 +663,13 @@ void dlm_lockres_grab_inflight_ref(struct dlm_ctxt *dlm, |
3455 | __builtin_return_address(0)); |
3456 | } |
3457 | |
3458 | +void dlm_lockres_grab_inflight_ref(struct dlm_ctxt *dlm, |
3459 | + struct dlm_lock_resource *res) |
3460 | +{ |
3461 | + assert_spin_locked(&res->spinlock); |
3462 | + __dlm_lockres_grab_inflight_ref(dlm, res); |
3463 | +} |
3464 | + |
3465 | void dlm_lockres_drop_inflight_ref(struct dlm_ctxt *dlm, |
3466 | struct dlm_lock_resource *res) |
3467 | { |
3468 | @@ -855,10 +859,8 @@ lookup: |
3469 | /* finally add the lockres to its hash bucket */ |
3470 | __dlm_insert_lockres(dlm, res); |
3471 | |
3472 | - /* Grab inflight ref to pin the resource */ |
3473 | - spin_lock(&res->spinlock); |
3474 | - dlm_lockres_grab_inflight_ref(dlm, res); |
3475 | - spin_unlock(&res->spinlock); |
3476 | + /* since this lockres is new it doesn't not require the spinlock */ |
3477 | + __dlm_lockres_grab_inflight_ref(dlm, res); |
3478 | |
3479 | /* get an extra ref on the mle in case this is a BLOCK |
3480 | * if so, the creator of the BLOCK may try to put the last |
3481 | diff --git a/include/linux/iio/trigger.h b/include/linux/iio/trigger.h |
3482 | index 3869c525b052..545deb149655 100644 |
3483 | --- a/include/linux/iio/trigger.h |
3484 | +++ b/include/linux/iio/trigger.h |
3485 | @@ -83,10 +83,12 @@ static inline void iio_trigger_put(struct iio_trigger *trig) |
3486 | put_device(&trig->dev); |
3487 | } |
3488 | |
3489 | -static inline void iio_trigger_get(struct iio_trigger *trig) |
3490 | +static inline struct iio_trigger *iio_trigger_get(struct iio_trigger *trig) |
3491 | { |
3492 | get_device(&trig->dev); |
3493 | __module_get(trig->ops->owner); |
3494 | + |
3495 | + return trig; |
3496 | } |
3497 | |
3498 | /** |
3499 | diff --git a/include/linux/init_task.h b/include/linux/init_task.h |
3500 | index 5cd0f0949927..998f4dfedecf 100644 |
3501 | --- a/include/linux/init_task.h |
3502 | +++ b/include/linux/init_task.h |
3503 | @@ -40,6 +40,7 @@ extern struct fs_struct init_fs; |
3504 | |
3505 | #define INIT_SIGNALS(sig) { \ |
3506 | .nr_threads = 1, \ |
3507 | + .thread_head = LIST_HEAD_INIT(init_task.thread_node), \ |
3508 | .wait_chldexit = __WAIT_QUEUE_HEAD_INITIALIZER(sig.wait_chldexit),\ |
3509 | .shared_pending = { \ |
3510 | .list = LIST_HEAD_INIT(sig.shared_pending.list), \ |
3511 | @@ -213,6 +214,7 @@ extern struct task_group root_task_group; |
3512 | [PIDTYPE_SID] = INIT_PID_LINK(PIDTYPE_SID), \ |
3513 | }, \ |
3514 | .thread_group = LIST_HEAD_INIT(tsk.thread_group), \ |
3515 | + .thread_node = LIST_HEAD_INIT(init_signals.thread_head), \ |
3516 | INIT_IDS \ |
3517 | INIT_PERF_EVENTS(tsk) \ |
3518 | INIT_TRACE_IRQFLAGS \ |
3519 | diff --git a/include/linux/sched.h b/include/linux/sched.h |
3520 | index 597c8ab005a0..8293545ac9b7 100644 |
3521 | --- a/include/linux/sched.h |
3522 | +++ b/include/linux/sched.h |
3523 | @@ -480,6 +480,7 @@ struct signal_struct { |
3524 | atomic_t sigcnt; |
3525 | atomic_t live; |
3526 | int nr_threads; |
3527 | + struct list_head thread_head; |
3528 | |
3529 | wait_queue_head_t wait_chldexit; /* for wait4() */ |
3530 | |
3531 | @@ -1160,6 +1161,7 @@ struct task_struct { |
3532 | /* PID/PID hash table linkage. */ |
3533 | struct pid_link pids[PIDTYPE_MAX]; |
3534 | struct list_head thread_group; |
3535 | + struct list_head thread_node; |
3536 | |
3537 | struct completion *vfork_done; /* for vfork() */ |
3538 | int __user *set_child_tid; /* CLONE_CHILD_SETTID */ |
3539 | @@ -2167,6 +2169,16 @@ extern bool current_is_single_threaded(void); |
3540 | #define while_each_thread(g, t) \ |
3541 | while ((t = next_thread(t)) != g) |
3542 | |
3543 | +#define __for_each_thread(signal, t) \ |
3544 | + list_for_each_entry_rcu(t, &(signal)->thread_head, thread_node) |
3545 | + |
3546 | +#define for_each_thread(p, t) \ |
3547 | + __for_each_thread((p)->signal, t) |
3548 | + |
3549 | +/* Careful: this is a double loop, 'break' won't work as expected. */ |
3550 | +#define for_each_process_thread(p, t) \ |
3551 | + for_each_process(p) for_each_thread(p, t) |
3552 | + |
3553 | static inline int get_nr_threads(struct task_struct *tsk) |
3554 | { |
3555 | return tsk->signal->nr_threads; |
3556 | diff --git a/include/linux/workqueue.h b/include/linux/workqueue.h |
3557 | index 623488fdc1f5..ff28cf578d01 100644 |
3558 | --- a/include/linux/workqueue.h |
3559 | +++ b/include/linux/workqueue.h |
3560 | @@ -414,7 +414,7 @@ __alloc_workqueue_key(const char *fmt, unsigned int flags, int max_active, |
3561 | #define create_freezable_workqueue(name) \ |
3562 | alloc_workqueue((name), WQ_FREEZABLE | WQ_UNBOUND | WQ_MEM_RECLAIM, 1) |
3563 | #define create_singlethread_workqueue(name) \ |
3564 | - alloc_workqueue((name), WQ_UNBOUND | WQ_MEM_RECLAIM, 1) |
3565 | + alloc_ordered_workqueue("%s", WQ_MEM_RECLAIM, name) |
3566 | |
3567 | extern void destroy_workqueue(struct workqueue_struct *wq); |
3568 | |
3569 | diff --git a/kernel/events/core.c b/kernel/events/core.c |
3570 | index 459b94c94721..6bf387a60399 100644 |
3571 | --- a/kernel/events/core.c |
3572 | +++ b/kernel/events/core.c |
3573 | @@ -1398,6 +1398,11 @@ retry: |
3574 | */ |
3575 | if (ctx->is_active) { |
3576 | raw_spin_unlock_irq(&ctx->lock); |
3577 | + /* |
3578 | + * Reload the task pointer, it might have been changed by |
3579 | + * a concurrent perf_event_context_sched_out(). |
3580 | + */ |
3581 | + task = ctx->task; |
3582 | goto retry; |
3583 | } |
3584 | |
3585 | @@ -1829,6 +1834,11 @@ retry: |
3586 | */ |
3587 | if (ctx->is_active) { |
3588 | raw_spin_unlock_irq(&ctx->lock); |
3589 | + /* |
3590 | + * Reload the task pointer, it might have been changed by |
3591 | + * a concurrent perf_event_context_sched_out(). |
3592 | + */ |
3593 | + task = ctx->task; |
3594 | goto retry; |
3595 | } |
3596 | |
3597 | diff --git a/kernel/exit.c b/kernel/exit.c |
3598 | index 6682b2ea5b11..717efbd7cb72 100644 |
3599 | --- a/kernel/exit.c |
3600 | +++ b/kernel/exit.c |
3601 | @@ -74,6 +74,7 @@ static void __unhash_process(struct task_struct *p, bool group_dead) |
3602 | __this_cpu_dec(process_counts); |
3603 | } |
3604 | list_del_rcu(&p->thread_group); |
3605 | + list_del_rcu(&p->thread_node); |
3606 | } |
3607 | |
3608 | /* |
3609 | diff --git a/kernel/fork.c b/kernel/fork.c |
3610 | index 814363a69b80..2c76e11ba939 100644 |
3611 | --- a/kernel/fork.c |
3612 | +++ b/kernel/fork.c |
3613 | @@ -1045,6 +1045,11 @@ static int copy_signal(unsigned long clone_flags, struct task_struct *tsk) |
3614 | sig->nr_threads = 1; |
3615 | atomic_set(&sig->live, 1); |
3616 | atomic_set(&sig->sigcnt, 1); |
3617 | + |
3618 | + /* list_add(thread_node, thread_head) without INIT_LIST_HEAD() */ |
3619 | + sig->thread_head = (struct list_head)LIST_HEAD_INIT(tsk->thread_node); |
3620 | + tsk->thread_node = (struct list_head)LIST_HEAD_INIT(sig->thread_head); |
3621 | + |
3622 | init_waitqueue_head(&sig->wait_chldexit); |
3623 | sig->curr_target = tsk; |
3624 | init_sigpending(&sig->shared_pending); |
3625 | @@ -1448,14 +1453,6 @@ static struct task_struct *copy_process(unsigned long clone_flags, |
3626 | goto bad_fork_free_pid; |
3627 | } |
3628 | |
3629 | - if (clone_flags & CLONE_THREAD) { |
3630 | - current->signal->nr_threads++; |
3631 | - atomic_inc(¤t->signal->live); |
3632 | - atomic_inc(¤t->signal->sigcnt); |
3633 | - p->group_leader = current->group_leader; |
3634 | - list_add_tail_rcu(&p->thread_group, &p->group_leader->thread_group); |
3635 | - } |
3636 | - |
3637 | if (likely(p->pid)) { |
3638 | ptrace_init_task(p, (clone_flags & CLONE_PTRACE) || trace); |
3639 | |
3640 | @@ -1472,6 +1469,15 @@ static struct task_struct *copy_process(unsigned long clone_flags, |
3641 | list_add_tail(&p->sibling, &p->real_parent->children); |
3642 | list_add_tail_rcu(&p->tasks, &init_task.tasks); |
3643 | __this_cpu_inc(process_counts); |
3644 | + } else { |
3645 | + current->signal->nr_threads++; |
3646 | + atomic_inc(¤t->signal->live); |
3647 | + atomic_inc(¤t->signal->sigcnt); |
3648 | + p->group_leader = current->group_leader; |
3649 | + list_add_tail_rcu(&p->thread_group, |
3650 | + &p->group_leader->thread_group); |
3651 | + list_add_tail_rcu(&p->thread_node, |
3652 | + &p->signal->thread_head); |
3653 | } |
3654 | attach_pid(p, PIDTYPE_PID, pid); |
3655 | nr_threads++; |
3656 | diff --git a/kernel/kcmp.c b/kernel/kcmp.c |
3657 | index e30ac0fe61c3..0aa69ea1d8fd 100644 |
3658 | --- a/kernel/kcmp.c |
3659 | +++ b/kernel/kcmp.c |
3660 | @@ -44,11 +44,12 @@ static long kptr_obfuscate(long v, int type) |
3661 | */ |
3662 | static int kcmp_ptr(void *v1, void *v2, enum kcmp_type type) |
3663 | { |
3664 | - long ret; |
3665 | + long t1, t2; |
3666 | |
3667 | - ret = kptr_obfuscate((long)v1, type) - kptr_obfuscate((long)v2, type); |
3668 | + t1 = kptr_obfuscate((long)v1, type); |
3669 | + t2 = kptr_obfuscate((long)v2, type); |
3670 | |
3671 | - return (ret < 0) | ((ret > 0) << 1); |
3672 | + return (t1 < t2) | ((t1 > t2) << 1); |
3673 | } |
3674 | |
3675 | /* The caller must have pinned the task */ |
3676 | diff --git a/kernel/power/main.c b/kernel/power/main.c |
3677 | index d77663bfedeb..312c1b2c725d 100644 |
3678 | --- a/kernel/power/main.c |
3679 | +++ b/kernel/power/main.c |
3680 | @@ -293,12 +293,12 @@ static ssize_t state_show(struct kobject *kobj, struct kobj_attribute *attr, |
3681 | { |
3682 | char *s = buf; |
3683 | #ifdef CONFIG_SUSPEND |
3684 | - int i; |
3685 | + suspend_state_t i; |
3686 | + |
3687 | + for (i = PM_SUSPEND_MIN; i < PM_SUSPEND_MAX; i++) |
3688 | + if (pm_states[i].state) |
3689 | + s += sprintf(s,"%s ", pm_states[i].label); |
3690 | |
3691 | - for (i = 0; i < PM_SUSPEND_MAX; i++) { |
3692 | - if (pm_states[i] && valid_state(i)) |
3693 | - s += sprintf(s,"%s ", pm_states[i]); |
3694 | - } |
3695 | #endif |
3696 | #ifdef CONFIG_HIBERNATION |
3697 | s += sprintf(s, "%s\n", "disk"); |
3698 | @@ -314,7 +314,7 @@ static suspend_state_t decode_state(const char *buf, size_t n) |
3699 | { |
3700 | #ifdef CONFIG_SUSPEND |
3701 | suspend_state_t state = PM_SUSPEND_MIN; |
3702 | - const char * const *s; |
3703 | + struct pm_sleep_state *s; |
3704 | #endif |
3705 | char *p; |
3706 | int len; |
3707 | @@ -328,8 +328,9 @@ static suspend_state_t decode_state(const char *buf, size_t n) |
3708 | |
3709 | #ifdef CONFIG_SUSPEND |
3710 | for (s = &pm_states[state]; state < PM_SUSPEND_MAX; s++, state++) |
3711 | - if (*s && len == strlen(*s) && !strncmp(buf, *s, len)) |
3712 | - return state; |
3713 | + if (s->state && len == strlen(s->label) |
3714 | + && !strncmp(buf, s->label, len)) |
3715 | + return s->state; |
3716 | #endif |
3717 | |
3718 | return PM_SUSPEND_ON; |
3719 | @@ -445,8 +446,8 @@ static ssize_t autosleep_show(struct kobject *kobj, |
3720 | |
3721 | #ifdef CONFIG_SUSPEND |
3722 | if (state < PM_SUSPEND_MAX) |
3723 | - return sprintf(buf, "%s\n", valid_state(state) ? |
3724 | - pm_states[state] : "error"); |
3725 | + return sprintf(buf, "%s\n", pm_states[state].state ? |
3726 | + pm_states[state].label : "error"); |
3727 | #endif |
3728 | #ifdef CONFIG_HIBERNATION |
3729 | return sprintf(buf, "disk\n"); |
3730 | diff --git a/kernel/power/power.h b/kernel/power/power.h |
3731 | index 7d4b7ffb3c1d..f770cad3666c 100644 |
3732 | --- a/kernel/power/power.h |
3733 | +++ b/kernel/power/power.h |
3734 | @@ -175,17 +175,20 @@ extern void swsusp_show_speed(struct timeval *, struct timeval *, |
3735 | unsigned int, char *); |
3736 | |
3737 | #ifdef CONFIG_SUSPEND |
3738 | +struct pm_sleep_state { |
3739 | + const char *label; |
3740 | + suspend_state_t state; |
3741 | +}; |
3742 | + |
3743 | /* kernel/power/suspend.c */ |
3744 | -extern const char *const pm_states[]; |
3745 | +extern struct pm_sleep_state pm_states[]; |
3746 | |
3747 | -extern bool valid_state(suspend_state_t state); |
3748 | extern int suspend_devices_and_enter(suspend_state_t state); |
3749 | #else /* !CONFIG_SUSPEND */ |
3750 | static inline int suspend_devices_and_enter(suspend_state_t state) |
3751 | { |
3752 | return -ENOSYS; |
3753 | } |
3754 | -static inline bool valid_state(suspend_state_t state) { return false; } |
3755 | #endif /* !CONFIG_SUSPEND */ |
3756 | |
3757 | #ifdef CONFIG_PM_TEST_SUSPEND |
3758 | diff --git a/kernel/power/suspend.c b/kernel/power/suspend.c |
3759 | index bef86d121eb2..903c517b14da 100644 |
3760 | --- a/kernel/power/suspend.c |
3761 | +++ b/kernel/power/suspend.c |
3762 | @@ -29,10 +29,10 @@ |
3763 | |
3764 | #include "power.h" |
3765 | |
3766 | -const char *const pm_states[PM_SUSPEND_MAX] = { |
3767 | - [PM_SUSPEND_FREEZE] = "freeze", |
3768 | - [PM_SUSPEND_STANDBY] = "standby", |
3769 | - [PM_SUSPEND_MEM] = "mem", |
3770 | +struct pm_sleep_state pm_states[PM_SUSPEND_MAX] = { |
3771 | + [PM_SUSPEND_FREEZE] = { .label = "freeze", .state = PM_SUSPEND_FREEZE }, |
3772 | + [PM_SUSPEND_STANDBY] = { .label = "standby", }, |
3773 | + [PM_SUSPEND_MEM] = { .label = "mem", }, |
3774 | }; |
3775 | |
3776 | static const struct platform_suspend_ops *suspend_ops; |
3777 | @@ -62,42 +62,34 @@ void freeze_wake(void) |
3778 | } |
3779 | EXPORT_SYMBOL_GPL(freeze_wake); |
3780 | |
3781 | +static bool valid_state(suspend_state_t state) |
3782 | +{ |
3783 | + /* |
3784 | + * PM_SUSPEND_STANDBY and PM_SUSPEND_MEM states need low level |
3785 | + * support and need to be valid to the low level |
3786 | + * implementation, no valid callback implies that none are valid. |
3787 | + */ |
3788 | + return suspend_ops && suspend_ops->valid && suspend_ops->valid(state); |
3789 | +} |
3790 | + |
3791 | /** |
3792 | * suspend_set_ops - Set the global suspend method table. |
3793 | * @ops: Suspend operations to use. |
3794 | */ |
3795 | void suspend_set_ops(const struct platform_suspend_ops *ops) |
3796 | { |
3797 | + suspend_state_t i; |
3798 | + |
3799 | lock_system_sleep(); |
3800 | + |
3801 | suspend_ops = ops; |
3802 | + for (i = PM_SUSPEND_STANDBY; i <= PM_SUSPEND_MEM; i++) |
3803 | + pm_states[i].state = valid_state(i) ? i : 0; |
3804 | + |
3805 | unlock_system_sleep(); |
3806 | } |
3807 | EXPORT_SYMBOL_GPL(suspend_set_ops); |
3808 | |
3809 | -bool valid_state(suspend_state_t state) |
3810 | -{ |
3811 | - if (state == PM_SUSPEND_FREEZE) { |
3812 | -#ifdef CONFIG_PM_DEBUG |
3813 | - if (pm_test_level != TEST_NONE && |
3814 | - pm_test_level != TEST_FREEZER && |
3815 | - pm_test_level != TEST_DEVICES && |
3816 | - pm_test_level != TEST_PLATFORM) { |
3817 | - printk(KERN_WARNING "Unsupported pm_test mode for " |
3818 | - "freeze state, please choose " |
3819 | - "none/freezer/devices/platform.\n"); |
3820 | - return false; |
3821 | - } |
3822 | -#endif |
3823 | - return true; |
3824 | - } |
3825 | - /* |
3826 | - * PM_SUSPEND_STANDBY and PM_SUSPEND_MEMORY states need lowlevel |
3827 | - * support and need to be valid to the lowlevel |
3828 | - * implementation, no valid callback implies that none are valid. |
3829 | - */ |
3830 | - return suspend_ops && suspend_ops->valid && suspend_ops->valid(state); |
3831 | -} |
3832 | - |
3833 | /** |
3834 | * suspend_valid_only_mem - Generic memory-only valid callback. |
3835 | * |
3836 | @@ -324,9 +316,17 @@ static int enter_state(suspend_state_t state) |
3837 | { |
3838 | int error; |
3839 | |
3840 | - if (!valid_state(state)) |
3841 | - return -ENODEV; |
3842 | - |
3843 | + if (state == PM_SUSPEND_FREEZE) { |
3844 | +#ifdef CONFIG_PM_DEBUG |
3845 | + if (pm_test_level != TEST_NONE && pm_test_level <= TEST_CPUS) { |
3846 | + pr_warning("PM: Unsupported test mode for freeze state," |
3847 | + "please choose none/freezer/devices/platform.\n"); |
3848 | + return -EAGAIN; |
3849 | + } |
3850 | +#endif |
3851 | + } else if (!valid_state(state)) { |
3852 | + return -EINVAL; |
3853 | + } |
3854 | if (!mutex_trylock(&pm_mutex)) |
3855 | return -EBUSY; |
3856 | |
3857 | @@ -337,7 +337,7 @@ static int enter_state(suspend_state_t state) |
3858 | sys_sync(); |
3859 | printk("done.\n"); |
3860 | |
3861 | - pr_debug("PM: Preparing system for %s sleep\n", pm_states[state]); |
3862 | + pr_debug("PM: Preparing system for %s sleep\n", pm_states[state].label); |
3863 | error = suspend_prepare(state); |
3864 | if (error) |
3865 | goto Unlock; |
3866 | @@ -345,7 +345,7 @@ static int enter_state(suspend_state_t state) |
3867 | if (suspend_test(TEST_FREEZER)) |
3868 | goto Finish; |
3869 | |
3870 | - pr_debug("PM: Entering %s sleep\n", pm_states[state]); |
3871 | + pr_debug("PM: Entering %s sleep\n", pm_states[state].label); |
3872 | pm_restrict_gfp_mask(); |
3873 | error = suspend_devices_and_enter(state); |
3874 | pm_restore_gfp_mask(); |
3875 | diff --git a/kernel/power/suspend_test.c b/kernel/power/suspend_test.c |
3876 | index 9b2a1d58558d..269b097e78ea 100644 |
3877 | --- a/kernel/power/suspend_test.c |
3878 | +++ b/kernel/power/suspend_test.c |
3879 | @@ -92,13 +92,13 @@ static void __init test_wakealarm(struct rtc_device *rtc, suspend_state_t state) |
3880 | } |
3881 | |
3882 | if (state == PM_SUSPEND_MEM) { |
3883 | - printk(info_test, pm_states[state]); |
3884 | + printk(info_test, pm_states[state].label); |
3885 | status = pm_suspend(state); |
3886 | if (status == -ENODEV) |
3887 | state = PM_SUSPEND_STANDBY; |
3888 | } |
3889 | if (state == PM_SUSPEND_STANDBY) { |
3890 | - printk(info_test, pm_states[state]); |
3891 | + printk(info_test, pm_states[state].label); |
3892 | status = pm_suspend(state); |
3893 | } |
3894 | if (status < 0) |
3895 | @@ -136,18 +136,16 @@ static char warn_bad_state[] __initdata = |
3896 | |
3897 | static int __init setup_test_suspend(char *value) |
3898 | { |
3899 | - unsigned i; |
3900 | + suspend_state_t i; |
3901 | |
3902 | /* "=mem" ==> "mem" */ |
3903 | value++; |
3904 | - for (i = 0; i < PM_SUSPEND_MAX; i++) { |
3905 | - if (!pm_states[i]) |
3906 | - continue; |
3907 | - if (strcmp(pm_states[i], value) != 0) |
3908 | - continue; |
3909 | - test_state = (__force suspend_state_t) i; |
3910 | - return 0; |
3911 | - } |
3912 | + for (i = PM_SUSPEND_MIN; i < PM_SUSPEND_MAX; i++) |
3913 | + if (!strcmp(pm_states[i].label, value)) { |
3914 | + test_state = pm_states[i].state; |
3915 | + return 0; |
3916 | + } |
3917 | + |
3918 | printk(warn_bad_state, value); |
3919 | return 0; |
3920 | } |
3921 | @@ -164,8 +162,8 @@ static int __init test_suspend(void) |
3922 | /* PM is initialized by now; is that state testable? */ |
3923 | if (test_state == PM_SUSPEND_ON) |
3924 | goto done; |
3925 | - if (!valid_state(test_state)) { |
3926 | - printk(warn_bad_state, pm_states[test_state]); |
3927 | + if (!pm_states[test_state].state) { |
3928 | + printk(warn_bad_state, pm_states[test_state].label); |
3929 | goto done; |
3930 | } |
3931 | |
3932 | diff --git a/kernel/time/alarmtimer.c b/kernel/time/alarmtimer.c |
3933 | index 294bf4ef1f47..7d19fca0617e 100644 |
3934 | --- a/kernel/time/alarmtimer.c |
3935 | +++ b/kernel/time/alarmtimer.c |
3936 | @@ -419,18 +419,26 @@ static enum alarmtimer_type clock2alarm(clockid_t clockid) |
3937 | static enum alarmtimer_restart alarm_handle_timer(struct alarm *alarm, |
3938 | ktime_t now) |
3939 | { |
3940 | + unsigned long flags; |
3941 | struct k_itimer *ptr = container_of(alarm, struct k_itimer, |
3942 | it.alarm.alarmtimer); |
3943 | - if (posix_timer_event(ptr, 0) != 0) |
3944 | - ptr->it_overrun++; |
3945 | + enum alarmtimer_restart result = ALARMTIMER_NORESTART; |
3946 | + |
3947 | + spin_lock_irqsave(&ptr->it_lock, flags); |
3948 | + if ((ptr->it_sigev_notify & ~SIGEV_THREAD_ID) != SIGEV_NONE) { |
3949 | + if (posix_timer_event(ptr, 0) != 0) |
3950 | + ptr->it_overrun++; |
3951 | + } |
3952 | |
3953 | /* Re-add periodic timers */ |
3954 | if (ptr->it.alarm.interval.tv64) { |
3955 | ptr->it_overrun += alarm_forward(alarm, now, |
3956 | ptr->it.alarm.interval); |
3957 | - return ALARMTIMER_RESTART; |
3958 | + result = ALARMTIMER_RESTART; |
3959 | } |
3960 | - return ALARMTIMER_NORESTART; |
3961 | + spin_unlock_irqrestore(&ptr->it_lock, flags); |
3962 | + |
3963 | + return result; |
3964 | } |
3965 | |
3966 | /** |
3967 | diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c |
3968 | index 5efbc122e5ce..0bc181b0524c 100644 |
3969 | --- a/kernel/trace/ring_buffer.c |
3970 | +++ b/kernel/trace/ring_buffer.c |
3971 | @@ -626,8 +626,22 @@ int ring_buffer_poll_wait(struct ring_buffer *buffer, int cpu, |
3972 | work = &cpu_buffer->irq_work; |
3973 | } |
3974 | |
3975 | - work->waiters_pending = true; |
3976 | poll_wait(filp, &work->waiters, poll_table); |
3977 | + work->waiters_pending = true; |
3978 | + /* |
3979 | + * There's a tight race between setting the waiters_pending and |
3980 | + * checking if the ring buffer is empty. Once the waiters_pending bit |
3981 | + * is set, the next event will wake the task up, but we can get stuck |
3982 | + * if there's only a single event in. |
3983 | + * |
3984 | + * FIXME: Ideally, we need a memory barrier on the writer side as well, |
3985 | + * but adding a memory barrier to all events will cause too much of a |
3986 | + * performance hit in the fast path. We only need a memory barrier when |
3987 | + * the buffer goes from empty to having content. But as this race is |
3988 | + * extremely small, and it's not a problem if another event comes in, we |
3989 | + * will fix it later. |
3990 | + */ |
3991 | + smp_mb(); |
3992 | |
3993 | if ((cpu == RING_BUFFER_ALL_CPUS && !ring_buffer_empty(buffer)) || |
3994 | (cpu != RING_BUFFER_ALL_CPUS && !ring_buffer_empty_cpu(buffer, cpu))) |
3995 | diff --git a/mm/oom_kill.c b/mm/oom_kill.c |
3996 | index dfa94ed3c7fa..8e40908e724a 100644 |
3997 | --- a/mm/oom_kill.c |
3998 | +++ b/mm/oom_kill.c |
3999 | @@ -47,19 +47,21 @@ static DEFINE_SPINLOCK(zone_scan_lock); |
4000 | #ifdef CONFIG_NUMA |
4001 | /** |
4002 | * has_intersects_mems_allowed() - check task eligiblity for kill |
4003 | - * @tsk: task struct of which task to consider |
4004 | + * @start: task struct of which task to consider |
4005 | * @mask: nodemask passed to page allocator for mempolicy ooms |
4006 | * |
4007 | * Task eligibility is determined by whether or not a candidate task, @tsk, |
4008 | * shares the same mempolicy nodes as current if it is bound by such a policy |
4009 | * and whether or not it has the same set of allowed cpuset nodes. |
4010 | */ |
4011 | -static bool has_intersects_mems_allowed(struct task_struct *tsk, |
4012 | +static bool has_intersects_mems_allowed(struct task_struct *start, |
4013 | const nodemask_t *mask) |
4014 | { |
4015 | - struct task_struct *start = tsk; |
4016 | + struct task_struct *tsk; |
4017 | + bool ret = false; |
4018 | |
4019 | - do { |
4020 | + rcu_read_lock(); |
4021 | + for_each_thread(start, tsk) { |
4022 | if (mask) { |
4023 | /* |
4024 | * If this is a mempolicy constrained oom, tsk's |
4025 | @@ -67,19 +69,20 @@ static bool has_intersects_mems_allowed(struct task_struct *tsk, |
4026 | * mempolicy intersects current, otherwise it may be |
4027 | * needlessly killed. |
4028 | */ |
4029 | - if (mempolicy_nodemask_intersects(tsk, mask)) |
4030 | - return true; |
4031 | + ret = mempolicy_nodemask_intersects(tsk, mask); |
4032 | } else { |
4033 | /* |
4034 | * This is not a mempolicy constrained oom, so only |
4035 | * check the mems of tsk's cpuset. |
4036 | */ |
4037 | - if (cpuset_mems_allowed_intersects(current, tsk)) |
4038 | - return true; |
4039 | + ret = cpuset_mems_allowed_intersects(current, tsk); |
4040 | } |
4041 | - } while_each_thread(start, tsk); |
4042 | + if (ret) |
4043 | + break; |
4044 | + } |
4045 | + rcu_read_unlock(); |
4046 | |
4047 | - return false; |
4048 | + return ret; |
4049 | } |
4050 | #else |
4051 | static bool has_intersects_mems_allowed(struct task_struct *tsk, |
4052 | @@ -97,16 +100,21 @@ static bool has_intersects_mems_allowed(struct task_struct *tsk, |
4053 | */ |
4054 | struct task_struct *find_lock_task_mm(struct task_struct *p) |
4055 | { |
4056 | - struct task_struct *t = p; |
4057 | + struct task_struct *t; |
4058 | |
4059 | - do { |
4060 | + rcu_read_lock(); |
4061 | + |
4062 | + for_each_thread(p, t) { |
4063 | task_lock(t); |
4064 | if (likely(t->mm)) |
4065 | - return t; |
4066 | + goto found; |
4067 | task_unlock(t); |
4068 | - } while_each_thread(p, t); |
4069 | + } |
4070 | + t = NULL; |
4071 | +found: |
4072 | + rcu_read_unlock(); |
4073 | |
4074 | - return NULL; |
4075 | + return t; |
4076 | } |
4077 | |
4078 | /* return true if the task is not adequate as candidate victim task. */ |
4079 | @@ -301,7 +309,7 @@ static struct task_struct *select_bad_process(unsigned int *ppoints, |
4080 | unsigned long chosen_points = 0; |
4081 | |
4082 | rcu_read_lock(); |
4083 | - do_each_thread(g, p) { |
4084 | + for_each_process_thread(g, p) { |
4085 | unsigned int points; |
4086 | |
4087 | switch (oom_scan_process_thread(p, totalpages, nodemask, |
4088 | @@ -323,7 +331,7 @@ static struct task_struct *select_bad_process(unsigned int *ppoints, |
4089 | chosen = p; |
4090 | chosen_points = points; |
4091 | } |
4092 | - } while_each_thread(g, p); |
4093 | + } |
4094 | if (chosen) |
4095 | get_task_struct(chosen); |
4096 | rcu_read_unlock(); |
4097 | @@ -406,7 +414,7 @@ void oom_kill_process(struct task_struct *p, gfp_t gfp_mask, int order, |
4098 | { |
4099 | struct task_struct *victim = p; |
4100 | struct task_struct *child; |
4101 | - struct task_struct *t = p; |
4102 | + struct task_struct *t; |
4103 | struct mm_struct *mm; |
4104 | unsigned int victim_points = 0; |
4105 | static DEFINE_RATELIMIT_STATE(oom_rs, DEFAULT_RATELIMIT_INTERVAL, |
4106 | @@ -437,7 +445,7 @@ void oom_kill_process(struct task_struct *p, gfp_t gfp_mask, int order, |
4107 | * still freeing memory. |
4108 | */ |
4109 | read_lock(&tasklist_lock); |
4110 | - do { |
4111 | + for_each_thread(p, t) { |
4112 | list_for_each_entry(child, &t->children, sibling) { |
4113 | unsigned int child_points; |
4114 | |
4115 | @@ -455,13 +463,11 @@ void oom_kill_process(struct task_struct *p, gfp_t gfp_mask, int order, |
4116 | get_task_struct(victim); |
4117 | } |
4118 | } |
4119 | - } while_each_thread(p, t); |
4120 | + } |
4121 | read_unlock(&tasklist_lock); |
4122 | |
4123 | - rcu_read_lock(); |
4124 | p = find_lock_task_mm(victim); |
4125 | if (!p) { |
4126 | - rcu_read_unlock(); |
4127 | put_task_struct(victim); |
4128 | return; |
4129 | } else if (victim != p) { |
4130 | @@ -487,6 +493,7 @@ void oom_kill_process(struct task_struct *p, gfp_t gfp_mask, int order, |
4131 | * That thread will now get access to memory reserves since it has a |
4132 | * pending fatal signal. |
4133 | */ |
4134 | + rcu_read_lock(); |
4135 | for_each_process(p) |
4136 | if (p->mm == mm && !same_thread_group(p, victim) && |
4137 | !(p->flags & PF_KTHREAD)) { |
4138 | diff --git a/mm/percpu-vm.c b/mm/percpu-vm.c |
4139 | index 3707c71ae4cd..51108165f829 100644 |
4140 | --- a/mm/percpu-vm.c |
4141 | +++ b/mm/percpu-vm.c |
4142 | @@ -108,7 +108,7 @@ static int pcpu_alloc_pages(struct pcpu_chunk *chunk, |
4143 | int page_start, int page_end) |
4144 | { |
4145 | const gfp_t gfp = GFP_KERNEL | __GFP_HIGHMEM | __GFP_COLD; |
4146 | - unsigned int cpu; |
4147 | + unsigned int cpu, tcpu; |
4148 | int i; |
4149 | |
4150 | for_each_possible_cpu(cpu) { |
4151 | @@ -116,14 +116,23 @@ static int pcpu_alloc_pages(struct pcpu_chunk *chunk, |
4152 | struct page **pagep = &pages[pcpu_page_idx(cpu, i)]; |
4153 | |
4154 | *pagep = alloc_pages_node(cpu_to_node(cpu), gfp, 0); |
4155 | - if (!*pagep) { |
4156 | - pcpu_free_pages(chunk, pages, populated, |
4157 | - page_start, page_end); |
4158 | - return -ENOMEM; |
4159 | - } |
4160 | + if (!*pagep) |
4161 | + goto err; |
4162 | } |
4163 | } |
4164 | return 0; |
4165 | + |
4166 | +err: |
4167 | + while (--i >= page_start) |
4168 | + __free_page(pages[pcpu_page_idx(cpu, i)]); |
4169 | + |
4170 | + for_each_possible_cpu(tcpu) { |
4171 | + if (tcpu == cpu) |
4172 | + break; |
4173 | + for (i = page_start; i < page_end; i++) |
4174 | + __free_page(pages[pcpu_page_idx(tcpu, i)]); |
4175 | + } |
4176 | + return -ENOMEM; |
4177 | } |
4178 | |
4179 | /** |
4180 | @@ -263,6 +272,7 @@ err: |
4181 | __pcpu_unmap_pages(pcpu_chunk_addr(chunk, tcpu, page_start), |
4182 | page_end - page_start); |
4183 | } |
4184 | + pcpu_post_unmap_tlb_flush(chunk, page_start, page_end); |
4185 | return err; |
4186 | } |
4187 | |
4188 | diff --git a/mm/percpu.c b/mm/percpu.c |
4189 | index 25e2ea52db82..9bc1bf914cc8 100644 |
4190 | --- a/mm/percpu.c |
4191 | +++ b/mm/percpu.c |
4192 | @@ -1910,6 +1910,8 @@ void __init setup_per_cpu_areas(void) |
4193 | |
4194 | if (pcpu_setup_first_chunk(ai, fc) < 0) |
4195 | panic("Failed to initialize percpu areas."); |
4196 | + |
4197 | + pcpu_free_alloc_info(ai); |
4198 | } |
4199 | |
4200 | #endif /* CONFIG_SMP */ |
4201 | diff --git a/mm/shmem.c b/mm/shmem.c |
4202 | index 16cc1d77f70a..4e4a7349c5cd 100644 |
4203 | --- a/mm/shmem.c |
4204 | +++ b/mm/shmem.c |
4205 | @@ -2128,8 +2128,10 @@ static int shmem_rename(struct inode *old_dir, struct dentry *old_dentry, struct |
4206 | |
4207 | if (new_dentry->d_inode) { |
4208 | (void) shmem_unlink(new_dir, new_dentry); |
4209 | - if (they_are_dirs) |
4210 | + if (they_are_dirs) { |
4211 | + drop_nlink(new_dentry->d_inode); |
4212 | drop_nlink(old_dir); |
4213 | + } |
4214 | } else if (they_are_dirs) { |
4215 | drop_nlink(old_dir); |
4216 | inc_nlink(new_dir); |
4217 | diff --git a/mm/util.c b/mm/util.c |
4218 | index ab1424dbe2e6..0b1725254ff1 100644 |
4219 | --- a/mm/util.c |
4220 | +++ b/mm/util.c |
4221 | @@ -272,17 +272,14 @@ pid_t vm_is_stack(struct task_struct *task, |
4222 | |
4223 | if (in_group) { |
4224 | struct task_struct *t; |
4225 | - rcu_read_lock(); |
4226 | - if (!pid_alive(task)) |
4227 | - goto done; |
4228 | |
4229 | - t = task; |
4230 | - do { |
4231 | + rcu_read_lock(); |
4232 | + for_each_thread(task, t) { |
4233 | if (vm_is_stack_for_task(t, vma)) { |
4234 | ret = t->pid; |
4235 | goto done; |
4236 | } |
4237 | - } while_each_thread(task, t); |
4238 | + } |
4239 | done: |
4240 | rcu_read_unlock(); |
4241 | } |
4242 | diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c |
4243 | index fc94937cd7b3..e606e4a113e1 100644 |
4244 | --- a/net/mac80211/mlme.c |
4245 | +++ b/net/mac80211/mlme.c |
4246 | @@ -4395,8 +4395,7 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata, |
4247 | rcu_read_unlock(); |
4248 | |
4249 | if (bss->wmm_used && bss->uapsd_supported && |
4250 | - (sdata->local->hw.flags & IEEE80211_HW_SUPPORTS_UAPSD) && |
4251 | - sdata->wmm_acm != 0xff) { |
4252 | + (sdata->local->hw.flags & IEEE80211_HW_SUPPORTS_UAPSD)) { |
4253 | assoc_data->uapsd = true; |
4254 | ifmgd->flags |= IEEE80211_STA_UAPSD_ENABLED; |
4255 | } else { |
4256 | diff --git a/net/netfilter/ipvs/ip_vs_conn.c b/net/netfilter/ipvs/ip_vs_conn.c |
4257 | index a083bda322b6..90e756cf6e52 100644 |
4258 | --- a/net/netfilter/ipvs/ip_vs_conn.c |
4259 | +++ b/net/netfilter/ipvs/ip_vs_conn.c |
4260 | @@ -797,7 +797,6 @@ static void ip_vs_conn_expire(unsigned long data) |
4261 | ip_vs_control_del(cp); |
4262 | |
4263 | if (cp->flags & IP_VS_CONN_F_NFCT) { |
4264 | - ip_vs_conn_drop_conntrack(cp); |
4265 | /* Do not access conntracks during subsys cleanup |
4266 | * because nf_conntrack_find_get can not be used after |
4267 | * conntrack cleanup for the net. |
4268 | diff --git a/net/netfilter/ipvs/ip_vs_core.c b/net/netfilter/ipvs/ip_vs_core.c |
4269 | index 663042e84e81..26b9a986a87f 100644 |
4270 | --- a/net/netfilter/ipvs/ip_vs_core.c |
4271 | +++ b/net/netfilter/ipvs/ip_vs_core.c |
4272 | @@ -1898,7 +1898,7 @@ static struct nf_hook_ops ip_vs_ops[] __read_mostly = { |
4273 | { |
4274 | .hook = ip_vs_local_reply6, |
4275 | .owner = THIS_MODULE, |
4276 | - .pf = NFPROTO_IPV4, |
4277 | + .pf = NFPROTO_IPV6, |
4278 | .hooknum = NF_INET_LOCAL_OUT, |
4279 | .priority = NF_IP6_PRI_NAT_DST + 1, |
4280 | }, |
4281 | diff --git a/net/netfilter/ipvs/ip_vs_xmit.c b/net/netfilter/ipvs/ip_vs_xmit.c |
4282 | index 7f0e1cf2d7e8..1692e7534759 100644 |
4283 | --- a/net/netfilter/ipvs/ip_vs_xmit.c |
4284 | +++ b/net/netfilter/ipvs/ip_vs_xmit.c |
4285 | @@ -967,8 +967,8 @@ ip_vs_tunnel_xmit_v6(struct sk_buff *skb, struct ip_vs_conn *cp, |
4286 | iph->nexthdr = IPPROTO_IPV6; |
4287 | iph->payload_len = old_iph->payload_len; |
4288 | be16_add_cpu(&iph->payload_len, sizeof(*old_iph)); |
4289 | - iph->priority = old_iph->priority; |
4290 | memset(&iph->flow_lbl, 0, sizeof(iph->flow_lbl)); |
4291 | + ipv6_change_dsfield(iph, 0, ipv6_get_dsfield(old_iph)); |
4292 | iph->daddr = cp->daddr.in6; |
4293 | iph->saddr = saddr; |
4294 | iph->hop_limit = old_iph->hop_limit; |
4295 | diff --git a/net/netfilter/nf_conntrack_proto_tcp.c b/net/netfilter/nf_conntrack_proto_tcp.c |
4296 | index 4d4d8f1d01fc..7dcc376eea5f 100644 |
4297 | --- a/net/netfilter/nf_conntrack_proto_tcp.c |
4298 | +++ b/net/netfilter/nf_conntrack_proto_tcp.c |
4299 | @@ -1043,6 +1043,12 @@ static int tcp_packet(struct nf_conn *ct, |
4300 | nf_ct_kill_acct(ct, ctinfo, skb); |
4301 | return NF_ACCEPT; |
4302 | } |
4303 | + /* ESTABLISHED without SEEN_REPLY, i.e. mid-connection |
4304 | + * pickup with loose=1. Avoid large ESTABLISHED timeout. |
4305 | + */ |
4306 | + if (new_state == TCP_CONNTRACK_ESTABLISHED && |
4307 | + timeout > timeouts[TCP_CONNTRACK_UNACK]) |
4308 | + timeout = timeouts[TCP_CONNTRACK_UNACK]; |
4309 | } else if (!test_bit(IPS_ASSURED_BIT, &ct->status) |
4310 | && (old_state == TCP_CONNTRACK_SYN_RECV |
4311 | || old_state == TCP_CONNTRACK_ESTABLISHED) |
4312 | diff --git a/sound/core/info.c b/sound/core/info.c |
4313 | index e79baa11b60e..08070e1eefeb 100644 |
4314 | --- a/sound/core/info.c |
4315 | +++ b/sound/core/info.c |
4316 | @@ -679,7 +679,7 @@ int snd_info_card_free(struct snd_card *card) |
4317 | * snd_info_get_line - read one line from the procfs buffer |
4318 | * @buffer: the procfs buffer |
4319 | * @line: the buffer to store |
4320 | - * @len: the max. buffer size - 1 |
4321 | + * @len: the max. buffer size |
4322 | * |
4323 | * Reads one line from the buffer and stores the string. |
4324 | * |
4325 | @@ -699,7 +699,7 @@ int snd_info_get_line(struct snd_info_buffer *buffer, char *line, int len) |
4326 | buffer->stop = 1; |
4327 | if (c == '\n') |
4328 | break; |
4329 | - if (len) { |
4330 | + if (len > 1) { |
4331 | len--; |
4332 | *line++ = c; |
4333 | } |
4334 | diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c |
4335 | index 3284940a4af2..8eddece217bb 100644 |
4336 | --- a/sound/core/pcm_lib.c |
4337 | +++ b/sound/core/pcm_lib.c |
4338 | @@ -1782,14 +1782,16 @@ static int snd_pcm_lib_ioctl_fifo_size(struct snd_pcm_substream *substream, |
4339 | { |
4340 | struct snd_pcm_hw_params *params = arg; |
4341 | snd_pcm_format_t format; |
4342 | - int channels, width; |
4343 | + int channels; |
4344 | + ssize_t frame_size; |
4345 | |
4346 | params->fifo_size = substream->runtime->hw.fifo_size; |
4347 | if (!(substream->runtime->hw.info & SNDRV_PCM_INFO_FIFO_IN_FRAMES)) { |
4348 | format = params_format(params); |
4349 | channels = params_channels(params); |
4350 | - width = snd_pcm_format_physical_width(format); |
4351 | - params->fifo_size /= width * channels; |
4352 | + frame_size = snd_pcm_format_size(format, channels); |
4353 | + if (frame_size > 0) |
4354 | + params->fifo_size /= (unsigned)frame_size; |
4355 | } |
4356 | return 0; |
4357 | } |
4358 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c |
4359 | index 593090e5bd77..4008034b6ebe 100644 |
4360 | --- a/sound/pci/hda/patch_realtek.c |
4361 | +++ b/sound/pci/hda/patch_realtek.c |
4362 | @@ -318,6 +318,7 @@ static void alc_auto_init_amp(struct hda_codec *codec, int type) |
4363 | case 0x10ec0885: |
4364 | case 0x10ec0887: |
4365 | /*case 0x10ec0889:*/ /* this causes an SPDIF problem */ |
4366 | + case 0x10ec0900: |
4367 | alc889_coef_init(codec); |
4368 | break; |
4369 | case 0x10ec0888: |
4370 | @@ -2252,6 +2253,7 @@ static int patch_alc882(struct hda_codec *codec) |
4371 | switch (codec->vendor_id) { |
4372 | case 0x10ec0882: |
4373 | case 0x10ec0885: |
4374 | + case 0x10ec0900: |
4375 | break; |
4376 | default: |
4377 | /* ALC883 and variants */ |
4378 | diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c |
4379 | index 132b4c802a47..5dd4c4af9c9f 100644 |
4380 | --- a/sound/pci/hda/patch_sigmatel.c |
4381 | +++ b/sound/pci/hda/patch_sigmatel.c |
4382 | @@ -539,8 +539,8 @@ static void stac_init_power_map(struct hda_codec *codec) |
4383 | if (snd_hda_jack_tbl_get(codec, nid)) |
4384 | continue; |
4385 | if (def_conf == AC_JACK_PORT_COMPLEX && |
4386 | - !(spec->vref_mute_led_nid == nid || |
4387 | - is_jack_detectable(codec, nid))) { |
4388 | + spec->vref_mute_led_nid != nid && |
4389 | + is_jack_detectable(codec, nid)) { |
4390 | snd_hda_jack_detect_enable_callback(codec, nid, |
4391 | STAC_PWR_EVENT, |
4392 | jack_update_power); |
4393 | @@ -3647,11 +3647,18 @@ static int stac_parse_auto_config(struct hda_codec *codec) |
4394 | return err; |
4395 | } |
4396 | |
4397 | - stac_init_power_map(codec); |
4398 | - |
4399 | return 0; |
4400 | } |
4401 | |
4402 | +static int stac_build_controls(struct hda_codec *codec) |
4403 | +{ |
4404 | + int err = snd_hda_gen_build_controls(codec); |
4405 | + |
4406 | + if (err < 0) |
4407 | + return err; |
4408 | + stac_init_power_map(codec); |
4409 | + return 0; |
4410 | +} |
4411 | |
4412 | static int stac_init(struct hda_codec *codec) |
4413 | { |
4414 | @@ -3794,7 +3801,7 @@ static void stac_set_power_state(struct hda_codec *codec, hda_nid_t fg, |
4415 | #endif /* CONFIG_PM */ |
4416 | |
4417 | static const struct hda_codec_ops stac_patch_ops = { |
4418 | - .build_controls = snd_hda_gen_build_controls, |
4419 | + .build_controls = stac_build_controls, |
4420 | .build_pcms = snd_hda_gen_build_pcms, |
4421 | .init = stac_init, |
4422 | .free = stac_free, |
4423 | diff --git a/sound/soc/davinci/davinci-mcasp.c b/sound/soc/davinci/davinci-mcasp.c |
4424 | index 81490febac6d..ade9d6379c1b 100644 |
4425 | --- a/sound/soc/davinci/davinci-mcasp.c |
4426 | +++ b/sound/soc/davinci/davinci-mcasp.c |
4427 | @@ -632,8 +632,17 @@ static int davinci_config_channel_size(struct davinci_audio_dev *dev, |
4428 | { |
4429 | u32 fmt; |
4430 | u32 tx_rotate = (word_length / 4) & 0x7; |
4431 | - u32 rx_rotate = (32 - word_length) / 4; |
4432 | u32 mask = (1ULL << word_length) - 1; |
4433 | + /* |
4434 | + * For captured data we should not rotate, inversion and masking is |
4435 | + * enoguh to get the data to the right position: |
4436 | + * Format data from bus after reverse (XRBUF) |
4437 | + * S16_LE: |LSB|MSB|xxx|xxx| |xxx|xxx|MSB|LSB| |
4438 | + * S24_3LE: |LSB|DAT|MSB|xxx| |xxx|MSB|DAT|LSB| |
4439 | + * S24_LE: |LSB|DAT|MSB|xxx| |xxx|MSB|DAT|LSB| |
4440 | + * S32_LE: |LSB|DAT|DAT|MSB| |MSB|DAT|DAT|LSB| |
4441 | + */ |
4442 | + u32 rx_rotate = 0; |
4443 | |
4444 | /* |
4445 | * if s BCLK-to-LRCLK ratio has been configured via the set_clkdiv() |
4446 | diff --git a/tools/perf/builtin-kmem.c b/tools/perf/builtin-kmem.c |
4447 | index 46878daca5cc..c9eac3edfe4d 100644 |
4448 | --- a/tools/perf/builtin-kmem.c |
4449 | +++ b/tools/perf/builtin-kmem.c |
4450 | @@ -101,7 +101,7 @@ static int setup_cpunode_map(void) |
4451 | |
4452 | dir1 = opendir(PATH_SYS_NODE); |
4453 | if (!dir1) |
4454 | - return -1; |
4455 | + return 0; |
4456 | |
4457 | while ((dent1 = readdir(dir1)) != NULL) { |
4458 | if (dent1->d_type != DT_DIR || |