Annotation of /trunk/kernel-alx/patches-3.10/0155-3.10.56-all-fixes.patch
Parent Directory | Revision Log
Revision 2643 -
(hide annotations)
(download)
Tue Jul 21 16:20:20 2015 UTC (9 years, 2 months ago) by niro
File size: 152756 byte(s)
Tue Jul 21 16:20:20 2015 UTC (9 years, 2 months ago) by niro
File size: 152756 byte(s)
-linux-3.10.56
1 | niro | 2643 | 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 || |