Magellan Linux

Contents of /trunk/kernel26-magellan/patches-2.6.34-r1/0100-2.6.34.1-all-fixes.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1114 - (show annotations) (download)
Sun Aug 22 17:59:15 2010 UTC (13 years, 8 months ago) by niro
File size: 295155 byte(s)
-added

1 diff --git a/Documentation/hwmon/ltc4245 b/Documentation/hwmon/ltc4245
2 index 02838a4..86b5880 100644
3 --- a/Documentation/hwmon/ltc4245
4 +++ b/Documentation/hwmon/ltc4245
5 @@ -72,9 +72,7 @@ in6_min_alarm 5v output undervoltage alarm
6 in7_min_alarm 3v output undervoltage alarm
7 in8_min_alarm Vee (-12v) output undervoltage alarm
8
9 -in9_input GPIO #1 voltage data
10 -in10_input GPIO #2 voltage data
11 -in11_input GPIO #3 voltage data
12 +in9_input GPIO voltage data
13
14 power1_input 12v power usage (mW)
15 power2_input 5v power usage (mW)
16 diff --git a/arch/arm/common/sa1111.c b/arch/arm/common/sa1111.c
17 index a52a27c..6f80665 100644
18 --- a/arch/arm/common/sa1111.c
19 +++ b/arch/arm/common/sa1111.c
20 @@ -951,8 +951,6 @@ static int sa1111_resume(struct platform_device *dev)
21 if (!save)
22 return 0;
23
24 - spin_lock_irqsave(&sachip->lock, flags);
25 -
26 /*
27 * Ensure that the SA1111 is still here.
28 * FIXME: shouldn't do this here.
29 @@ -969,6 +967,13 @@ static int sa1111_resume(struct platform_device *dev)
30 * First of all, wake up the chip.
31 */
32 sa1111_wake(sachip);
33 +
34 + /*
35 + * Only lock for write ops. Also, sa1111_wake must be called with
36 + * released spinlock!
37 + */
38 + spin_lock_irqsave(&sachip->lock, flags);
39 +
40 sa1111_writel(0, sachip->base + SA1111_INTC + SA1111_INTEN0);
41 sa1111_writel(0, sachip->base + SA1111_INTC + SA1111_INTEN1);
42
43 diff --git a/arch/arm/mach-mx2/devices.c b/arch/arm/mach-mx2/devices.c
44 index b91e412..04f36d8 100644
45 --- a/arch/arm/mach-mx2/devices.c
46 +++ b/arch/arm/mach-mx2/devices.c
47 @@ -483,8 +483,8 @@ int __init mxc_register_gpios(void)
48 #ifdef CONFIG_MACH_MX21
49 static struct resource mx21_usbhc_resources[] = {
50 {
51 - .start = MX21_BASE_ADDR,
52 - .end = MX21_BASE_ADDR + 0x1FFF,
53 + .start = MX21_USBOTG_BASE_ADDR,
54 + .end = MX21_USBOTG_BASE_ADDR + SZ_8K - 1,
55 .flags = IORESOURCE_MEM,
56 },
57 {
58 diff --git a/arch/arm/mm/cache-v7.S b/arch/arm/mm/cache-v7.S
59 index 06a90dc..37c8157 100644
60 --- a/arch/arm/mm/cache-v7.S
61 +++ b/arch/arm/mm/cache-v7.S
62 @@ -91,7 +91,11 @@ ENTRY(v7_flush_kern_cache_all)
63 THUMB( stmfd sp!, {r4-r7, r9-r11, lr} )
64 bl v7_flush_dcache_all
65 mov r0, #0
66 +#ifdef CONFIG_SMP
67 + mcr p15, 0, r0, c7, c1, 0 @ invalidate I-cache inner shareable
68 +#else
69 mcr p15, 0, r0, c7, c5, 0 @ I+BTB cache invalidate
70 +#endif
71 ARM( ldmfd sp!, {r4-r5, r7, r9-r11, lr} )
72 THUMB( ldmfd sp!, {r4-r7, r9-r11, lr} )
73 mov pc, lr
74 diff --git a/arch/arm/mm/copypage-feroceon.c b/arch/arm/mm/copypage-feroceon.c
75 index 5eb4fd9..ac163de 100644
76 --- a/arch/arm/mm/copypage-feroceon.c
77 +++ b/arch/arm/mm/copypage-feroceon.c
78 @@ -18,7 +18,7 @@ feroceon_copy_user_page(void *kto, const void *kfrom)
79 {
80 asm("\
81 stmfd sp!, {r4-r9, lr} \n\
82 - mov ip, %0 \n\
83 + mov ip, %2 \n\
84 1: mov lr, r1 \n\
85 ldmia r1!, {r2 - r9} \n\
86 pld [lr, #32] \n\
87 @@ -64,7 +64,7 @@ feroceon_copy_user_page(void *kto, const void *kfrom)
88 mcr p15, 0, ip, c7, c10, 4 @ drain WB\n\
89 ldmfd sp!, {r4-r9, pc}"
90 :
91 - : "I" (PAGE_SIZE));
92 + : "r" (kto), "r" (kfrom), "I" (PAGE_SIZE));
93 }
94
95 void feroceon_copy_user_highpage(struct page *to, struct page *from,
96 diff --git a/arch/arm/mm/copypage-v4wb.c b/arch/arm/mm/copypage-v4wb.c
97 index 7c2eb55..cb589cb 100644
98 --- a/arch/arm/mm/copypage-v4wb.c
99 +++ b/arch/arm/mm/copypage-v4wb.c
100 @@ -27,7 +27,7 @@ v4wb_copy_user_page(void *kto, const void *kfrom)
101 {
102 asm("\
103 stmfd sp!, {r4, lr} @ 2\n\
104 - mov r2, %0 @ 1\n\
105 + mov r2, %2 @ 1\n\
106 ldmia r1!, {r3, r4, ip, lr} @ 4\n\
107 1: mcr p15, 0, r0, c7, c6, 1 @ 1 invalidate D line\n\
108 stmia r0!, {r3, r4, ip, lr} @ 4\n\
109 @@ -44,7 +44,7 @@ v4wb_copy_user_page(void *kto, const void *kfrom)
110 mcr p15, 0, r1, c7, c10, 4 @ 1 drain WB\n\
111 ldmfd sp!, {r4, pc} @ 3"
112 :
113 - : "I" (PAGE_SIZE / 64));
114 + : "r" (kto), "r" (kfrom), "I" (PAGE_SIZE / 64));
115 }
116
117 void v4wb_copy_user_highpage(struct page *to, struct page *from,
118 diff --git a/arch/arm/mm/copypage-v4wt.c b/arch/arm/mm/copypage-v4wt.c
119 index 172e6a5..30c7d04 100644
120 --- a/arch/arm/mm/copypage-v4wt.c
121 +++ b/arch/arm/mm/copypage-v4wt.c
122 @@ -25,7 +25,7 @@ v4wt_copy_user_page(void *kto, const void *kfrom)
123 {
124 asm("\
125 stmfd sp!, {r4, lr} @ 2\n\
126 - mov r2, %0 @ 1\n\
127 + mov r2, %2 @ 1\n\
128 ldmia r1!, {r3, r4, ip, lr} @ 4\n\
129 1: stmia r0!, {r3, r4, ip, lr} @ 4\n\
130 ldmia r1!, {r3, r4, ip, lr} @ 4+1\n\
131 @@ -40,7 +40,7 @@ v4wt_copy_user_page(void *kto, const void *kfrom)
132 mcr p15, 0, r2, c7, c7, 0 @ flush ID cache\n\
133 ldmfd sp!, {r4, pc} @ 3"
134 :
135 - : "I" (PAGE_SIZE / 64));
136 + : "r" (kto), "r" (kfrom), "I" (PAGE_SIZE / 64));
137 }
138
139 void v4wt_copy_user_highpage(struct page *to, struct page *from,
140 diff --git a/arch/arm/mm/copypage-xsc3.c b/arch/arm/mm/copypage-xsc3.c
141 index 747ad41..f9cde07 100644
142 --- a/arch/arm/mm/copypage-xsc3.c
143 +++ b/arch/arm/mm/copypage-xsc3.c
144 @@ -34,7 +34,7 @@ xsc3_mc_copy_user_page(void *kto, const void *kfrom)
145 {
146 asm("\
147 stmfd sp!, {r4, r5, lr} \n\
148 - mov lr, %0 \n\
149 + mov lr, %2 \n\
150 \n\
151 pld [r1, #0] \n\
152 pld [r1, #32] \n\
153 @@ -67,7 +67,7 @@ xsc3_mc_copy_user_page(void *kto, const void *kfrom)
154 \n\
155 ldmfd sp!, {r4, r5, pc}"
156 :
157 - : "I" (PAGE_SIZE / 64 - 1));
158 + : "r" (kto), "r" (kfrom), "I" (PAGE_SIZE / 64 - 1));
159 }
160
161 void xsc3_mc_copy_user_highpage(struct page *to, struct page *from,
162 diff --git a/arch/arm/mm/fault.c b/arch/arm/mm/fault.c
163 index 9d40c34..8ad75e9 100644
164 --- a/arch/arm/mm/fault.c
165 +++ b/arch/arm/mm/fault.c
166 @@ -393,6 +393,9 @@ do_translation_fault(unsigned long addr, unsigned int fsr,
167 if (addr < TASK_SIZE)
168 return do_page_fault(addr, fsr, regs);
169
170 + if (user_mode(regs))
171 + goto bad_area;
172 +
173 index = pgd_index(addr);
174
175 /*
176 diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c
177 index 0ed29bf..55d07c8 100644
178 --- a/arch/arm/mm/init.c
179 +++ b/arch/arm/mm/init.c
180 @@ -712,10 +712,10 @@ void __init mem_init(void)
181 void free_initmem(void)
182 {
183 #ifdef CONFIG_HAVE_TCM
184 - extern char *__tcm_start, *__tcm_end;
185 + extern char __tcm_start, __tcm_end;
186
187 - totalram_pages += free_area(__phys_to_pfn(__pa(__tcm_start)),
188 - __phys_to_pfn(__pa(__tcm_end)),
189 + totalram_pages += free_area(__phys_to_pfn(__pa(&__tcm_start)),
190 + __phys_to_pfn(__pa(&__tcm_end)),
191 "TCM link");
192 #endif
193
194 diff --git a/arch/arm/vfp/vfphw.S b/arch/arm/vfp/vfphw.S
195 index 66dc2d0..d66cead 100644
196 --- a/arch/arm/vfp/vfphw.S
197 +++ b/arch/arm/vfp/vfphw.S
198 @@ -277,7 +277,7 @@ ENTRY(vfp_put_double)
199 #ifdef CONFIG_VFPv3
200 @ d16 - d31 registers
201 .irp dr,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
202 -1: mcrr p11, 3, r1, r2, c\dr @ fmdrr r1, r2, d\dr
203 +1: mcrr p11, 3, r0, r1, c\dr @ fmdrr r0, r1, d\dr
204 mov pc, lr
205 .org 1b + 8
206 .endr
207 diff --git a/arch/blackfin/include/asm/cache.h b/arch/blackfin/include/asm/cache.h
208 index 8542bc3..93f6c63 100644
209 --- a/arch/blackfin/include/asm/cache.h
210 +++ b/arch/blackfin/include/asm/cache.h
211 @@ -15,6 +15,8 @@
212 #define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT)
213 #define SMP_CACHE_BYTES L1_CACHE_BYTES
214
215 +#define ARCH_KMALLOC_MINALIGN L1_CACHE_BYTES
216 +
217 #ifdef CONFIG_SMP
218 #define __cacheline_aligned
219 #else
220 diff --git a/arch/frv/include/asm/cache.h b/arch/frv/include/asm/cache.h
221 index 2797163..7dc0f0f 100644
222 --- a/arch/frv/include/asm/cache.h
223 +++ b/arch/frv/include/asm/cache.h
224 @@ -17,6 +17,8 @@
225 #define L1_CACHE_SHIFT (CONFIG_FRV_L1_CACHE_SHIFT)
226 #define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT)
227
228 +#define ARCH_KMALLOC_MINALIGN L1_CACHE_BYTES
229 +
230 #define __cacheline_aligned __attribute__((aligned(L1_CACHE_BYTES)))
231 #define ____cacheline_aligned __attribute__((aligned(L1_CACHE_BYTES)))
232
233 diff --git a/arch/m68k/include/asm/cache.h b/arch/m68k/include/asm/cache.h
234 index fed3fd3..ecafbe1 100644
235 --- a/arch/m68k/include/asm/cache.h
236 +++ b/arch/m68k/include/asm/cache.h
237 @@ -8,4 +8,6 @@
238 #define L1_CACHE_SHIFT 4
239 #define L1_CACHE_BYTES (1<< L1_CACHE_SHIFT)
240
241 +#define ARCH_KMALLOC_MINALIGN L1_CACHE_BYTES
242 +
243 #endif
244 diff --git a/arch/mn10300/include/asm/cache.h b/arch/mn10300/include/asm/cache.h
245 index e03cfa2..6e2fe28 100644
246 --- a/arch/mn10300/include/asm/cache.h
247 +++ b/arch/mn10300/include/asm/cache.h
248 @@ -21,6 +21,8 @@
249 #define L1_CACHE_DISPARITY L1_CACHE_NENTRIES * L1_CACHE_BYTES
250 #endif
251
252 +#define ARCH_KMALLOC_MINALIGN L1_CACHE_BYTES
253 +
254 /* data cache purge registers
255 * - read from the register to unconditionally purge that cache line
256 * - write address & 0xffffff00 to conditionally purge that cache line
257 diff --git a/arch/parisc/math-emu/decode_exc.c b/arch/parisc/math-emu/decode_exc.c
258 index 3ca1c61..27a7492 100644
259 --- a/arch/parisc/math-emu/decode_exc.c
260 +++ b/arch/parisc/math-emu/decode_exc.c
261 @@ -342,6 +342,7 @@ decode_fpu(unsigned int Fpu_register[], unsigned int trap_counts[])
262 return SIGNALCODE(SIGFPE, FPE_FLTINV);
263 case DIVISIONBYZEROEXCEPTION:
264 update_trap_counts(Fpu_register, aflags, bflags, trap_counts);
265 + Clear_excp_register(exception_index);
266 return SIGNALCODE(SIGFPE, FPE_FLTDIV);
267 case INEXACTEXCEPTION:
268 update_trap_counts(Fpu_register, aflags, bflags, trap_counts);
269 diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c
270 index c09138d..b894721 100644
271 --- a/arch/powerpc/kernel/asm-offsets.c
272 +++ b/arch/powerpc/kernel/asm-offsets.c
273 @@ -447,6 +447,14 @@ int main(void)
274 DEFINE(PGD_T_LOG2, PGD_T_LOG2);
275 DEFINE(PTE_T_LOG2, PTE_T_LOG2);
276 #endif
277 +#ifdef CONFIG_FSL_BOOKE
278 + DEFINE(TLBCAM_SIZE, sizeof(struct tlbcam));
279 + DEFINE(TLBCAM_MAS0, offsetof(struct tlbcam, MAS0));
280 + DEFINE(TLBCAM_MAS1, offsetof(struct tlbcam, MAS1));
281 + DEFINE(TLBCAM_MAS2, offsetof(struct tlbcam, MAS2));
282 + DEFINE(TLBCAM_MAS3, offsetof(struct tlbcam, MAS3));
283 + DEFINE(TLBCAM_MAS7, offsetof(struct tlbcam, MAS7));
284 +#endif
285
286 #ifdef CONFIG_KVM_EXIT_TIMING
287 DEFINE(VCPU_TIMING_EXIT_TBU, offsetof(struct kvm_vcpu,
288 diff --git a/arch/powerpc/kernel/head_fsl_booke.S b/arch/powerpc/kernel/head_fsl_booke.S
289 index 7255265..edd4a57 100644
290 --- a/arch/powerpc/kernel/head_fsl_booke.S
291 +++ b/arch/powerpc/kernel/head_fsl_booke.S
292 @@ -639,6 +639,13 @@ interrupt_base:
293 rlwinm r12,r12,0,16,1
294 mtspr SPRN_MAS1,r12
295
296 + /* Make up the required permissions for kernel code */
297 +#ifdef CONFIG_PTE_64BIT
298 + li r13,_PAGE_PRESENT | _PAGE_BAP_SX
299 + oris r13,r13,_PAGE_ACCESSED@h
300 +#else
301 + li r13,_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_EXEC
302 +#endif
303 b 4f
304
305 /* Get the PGD for the current thread */
306 @@ -646,15 +653,15 @@ interrupt_base:
307 mfspr r11,SPRN_SPRG_THREAD
308 lwz r11,PGDIR(r11)
309
310 -4:
311 - /* Make up the required permissions */
312 + /* Make up the required permissions for user code */
313 #ifdef CONFIG_PTE_64BIT
314 - li r13,_PAGE_PRESENT | _PAGE_EXEC
315 + li r13,_PAGE_PRESENT | _PAGE_BAP_UX
316 oris r13,r13,_PAGE_ACCESSED@h
317 #else
318 li r13,_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_EXEC
319 #endif
320
321 +4:
322 FIND_PTE
323 andc. r13,r13,r11 /* Check permission */
324
325 diff --git a/arch/powerpc/kvm/book3s.c b/arch/powerpc/kvm/book3s.c
326 index 604af29..ecb532b 100644
327 --- a/arch/powerpc/kvm/book3s.c
328 +++ b/arch/powerpc/kvm/book3s.c
329 @@ -922,6 +922,8 @@ int kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu,
330 struct kvmppc_vcpu_book3s *vcpu3s = to_book3s(vcpu);
331 int i;
332
333 + vcpu_load(vcpu);
334 +
335 sregs->pvr = vcpu->arch.pvr;
336
337 sregs->u.s.sdr1 = to_book3s(vcpu)->sdr1;
338 @@ -940,6 +942,9 @@ int kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu,
339 sregs->u.s.ppc32.dbat[i] = vcpu3s->dbat[i].raw;
340 }
341 }
342 +
343 + vcpu_put(vcpu);
344 +
345 return 0;
346 }
347
348 @@ -949,6 +954,8 @@ int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu,
349 struct kvmppc_vcpu_book3s *vcpu3s = to_book3s(vcpu);
350 int i;
351
352 + vcpu_load(vcpu);
353 +
354 kvmppc_set_pvr(vcpu, sregs->pvr);
355
356 vcpu3s->sdr1 = sregs->u.s.sdr1;
357 @@ -975,6 +982,9 @@ int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu,
358
359 /* Flush the MMU after messing with the segments */
360 kvmppc_mmu_pte_flush(vcpu, 0, 0);
361 +
362 + vcpu_put(vcpu);
363 +
364 return 0;
365 }
366
367 diff --git a/arch/powerpc/kvm/booke.c b/arch/powerpc/kvm/booke.c
368 index 2a3a195..df0182a 100644
369 --- a/arch/powerpc/kvm/booke.c
370 +++ b/arch/powerpc/kvm/booke.c
371 @@ -479,6 +479,8 @@ int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
372 {
373 int i;
374
375 + vcpu_load(vcpu);
376 +
377 regs->pc = vcpu->arch.pc;
378 regs->cr = kvmppc_get_cr(vcpu);
379 regs->ctr = vcpu->arch.ctr;
380 @@ -499,6 +501,8 @@ int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
381 for (i = 0; i < ARRAY_SIZE(regs->gpr); i++)
382 regs->gpr[i] = kvmppc_get_gpr(vcpu, i);
383
384 + vcpu_put(vcpu);
385 +
386 return 0;
387 }
388
389 @@ -506,6 +510,8 @@ int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
390 {
391 int i;
392
393 + vcpu_load(vcpu);
394 +
395 vcpu->arch.pc = regs->pc;
396 kvmppc_set_cr(vcpu, regs->cr);
397 vcpu->arch.ctr = regs->ctr;
398 @@ -525,6 +531,8 @@ int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
399 for (i = 0; i < ARRAY_SIZE(regs->gpr); i++)
400 kvmppc_set_gpr(vcpu, i, regs->gpr[i]);
401
402 + vcpu_put(vcpu);
403 +
404 return 0;
405 }
406
407 @@ -553,7 +561,12 @@ int kvm_arch_vcpu_ioctl_set_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)
408 int kvm_arch_vcpu_ioctl_translate(struct kvm_vcpu *vcpu,
409 struct kvm_translation *tr)
410 {
411 - return kvmppc_core_vcpu_translate(vcpu, tr);
412 + int r;
413 +
414 + vcpu_load(vcpu);
415 + r = kvmppc_core_vcpu_translate(vcpu, tr);
416 + vcpu_put(vcpu);
417 + return r;
418 }
419
420 int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, struct kvm_dirty_log *log)
421 diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c
422 index 297fcd2..bf36a9d 100644
423 --- a/arch/powerpc/kvm/powerpc.c
424 +++ b/arch/powerpc/kvm/powerpc.c
425 @@ -193,7 +193,8 @@ struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm, unsigned int id)
426 {
427 struct kvm_vcpu *vcpu;
428 vcpu = kvmppc_core_vcpu_create(kvm, id);
429 - kvmppc_create_vcpu_debugfs(vcpu, id);
430 + if (!IS_ERR(vcpu))
431 + kvmppc_create_vcpu_debugfs(vcpu, id);
432 return vcpu;
433 }
434
435 diff --git a/arch/powerpc/lib/string.S b/arch/powerpc/lib/string.S
436 index 64e2e49..3ac0cd3 100644
437 --- a/arch/powerpc/lib/string.S
438 +++ b/arch/powerpc/lib/string.S
439 @@ -71,7 +71,7 @@ _GLOBAL(strcmp)
440
441 _GLOBAL(strncmp)
442 PPC_LCMPI r5,0
443 - beqlr
444 + ble- 2f
445 mtctr r5
446 addi r5,r3,-1
447 addi r4,r4,-1
448 @@ -82,6 +82,8 @@ _GLOBAL(strncmp)
449 beqlr 1
450 bdnzt eq,1b
451 blr
452 +2: li r3,0
453 + blr
454
455 _GLOBAL(strlen)
456 addi r4,r3,-1
457 diff --git a/arch/powerpc/mm/fsl_booke_mmu.c b/arch/powerpc/mm/fsl_booke_mmu.c
458 index 1ed6b52..cdc7526 100644
459 --- a/arch/powerpc/mm/fsl_booke_mmu.c
460 +++ b/arch/powerpc/mm/fsl_booke_mmu.c
461 @@ -2,7 +2,7 @@
462 * Modifications by Kumar Gala (galak@kernel.crashing.org) to support
463 * E500 Book E processors.
464 *
465 - * Copyright 2004 Freescale Semiconductor, Inc
466 + * Copyright 2004,2010 Freescale Semiconductor, Inc.
467 *
468 * This file contains the routines for initializing the MMU
469 * on the 4xx series of chips.
470 @@ -56,19 +56,13 @@
471
472 unsigned int tlbcam_index;
473
474 -#define NUM_TLBCAMS (64)
475
476 #if defined(CONFIG_LOWMEM_CAM_NUM_BOOL) && (CONFIG_LOWMEM_CAM_NUM >= NUM_TLBCAMS)
477 #error "LOWMEM_CAM_NUM must be less than NUM_TLBCAMS"
478 #endif
479
480 -struct tlbcam {
481 - u32 MAS0;
482 - u32 MAS1;
483 - unsigned long MAS2;
484 - u32 MAS3;
485 - u32 MAS7;
486 -} TLBCAM[NUM_TLBCAMS];
487 +#define NUM_TLBCAMS (64)
488 +struct tlbcam TLBCAM[NUM_TLBCAMS];
489
490 struct tlbcamrange {
491 unsigned long start;
492 @@ -109,19 +103,6 @@ unsigned long p_mapped_by_tlbcam(phys_addr_t pa)
493 return 0;
494 }
495
496 -void loadcam_entry(int idx)
497 -{
498 - mtspr(SPRN_MAS0, TLBCAM[idx].MAS0);
499 - mtspr(SPRN_MAS1, TLBCAM[idx].MAS1);
500 - mtspr(SPRN_MAS2, TLBCAM[idx].MAS2);
501 - mtspr(SPRN_MAS3, TLBCAM[idx].MAS3);
502 -
503 - if (mmu_has_feature(MMU_FTR_BIG_PHYS))
504 - mtspr(SPRN_MAS7, TLBCAM[idx].MAS7);
505 -
506 - asm volatile("isync;tlbwe;isync" : : : "memory");
507 -}
508 -
509 /*
510 * Set up one of the I/D BAT (block address translation) register pairs.
511 * The parameters are not checked; in particular size must be a power
512 diff --git a/arch/powerpc/mm/mmu_decl.h b/arch/powerpc/mm/mmu_decl.h
513 index d49a775..0591f25 100644
514 --- a/arch/powerpc/mm/mmu_decl.h
515 +++ b/arch/powerpc/mm/mmu_decl.h
516 @@ -149,7 +149,15 @@ extern unsigned long mmu_mapin_ram(unsigned long top);
517 extern void MMU_init_hw(void);
518 extern unsigned long mmu_mapin_ram(unsigned long top);
519 extern void adjust_total_lowmem(void);
520 -
521 +extern void loadcam_entry(unsigned int index);
522 +
523 +struct tlbcam {
524 + u32 MAS0;
525 + u32 MAS1;
526 + unsigned long MAS2;
527 + u32 MAS3;
528 + u32 MAS7;
529 +};
530 #elif defined(CONFIG_PPC32)
531 /* anything 32-bit except 4xx or 8xx */
532 extern void MMU_init_hw(void);
533 diff --git a/arch/powerpc/mm/pgtable_32.c b/arch/powerpc/mm/pgtable_32.c
534 index b9243e7..767b0cf 100644
535 --- a/arch/powerpc/mm/pgtable_32.c
536 +++ b/arch/powerpc/mm/pgtable_32.c
537 @@ -146,6 +146,14 @@ ioremap_flags(phys_addr_t addr, unsigned long size, unsigned long flags)
538 /* we don't want to let _PAGE_USER and _PAGE_EXEC leak out */
539 flags &= ~(_PAGE_USER | _PAGE_EXEC);
540
541 +#ifdef _PAGE_BAP_SR
542 + /* _PAGE_USER contains _PAGE_BAP_SR on BookE using the new PTE format
543 + * which means that we just cleared supervisor access... oops ;-) This
544 + * restores it
545 + */
546 + flags |= _PAGE_BAP_SR;
547 +#endif
548 +
549 return __ioremap_caller(addr, size, flags, __builtin_return_address(0));
550 }
551 EXPORT_SYMBOL(ioremap_flags);
552 diff --git a/arch/powerpc/mm/pgtable_64.c b/arch/powerpc/mm/pgtable_64.c
553 index d95679a..d050fc8 100644
554 --- a/arch/powerpc/mm/pgtable_64.c
555 +++ b/arch/powerpc/mm/pgtable_64.c
556 @@ -265,6 +265,14 @@ void __iomem * ioremap_flags(phys_addr_t addr, unsigned long size,
557 /* we don't want to let _PAGE_USER and _PAGE_EXEC leak out */
558 flags &= ~(_PAGE_USER | _PAGE_EXEC);
559
560 +#ifdef _PAGE_BAP_SR
561 + /* _PAGE_USER contains _PAGE_BAP_SR on BookE using the new PTE format
562 + * which means that we just cleared supervisor access... oops ;-) This
563 + * restores it
564 + */
565 + flags |= _PAGE_BAP_SR;
566 +#endif
567 +
568 if (ppc_md.ioremap)
569 return ppc_md.ioremap(addr, size, flags, caller);
570 return __ioremap_caller(addr, size, flags, caller);
571 diff --git a/arch/powerpc/mm/tlb_nohash_low.S b/arch/powerpc/mm/tlb_nohash_low.S
572 index bbdc5b5..8656ecf 100644
573 --- a/arch/powerpc/mm/tlb_nohash_low.S
574 +++ b/arch/powerpc/mm/tlb_nohash_low.S
575 @@ -271,3 +271,31 @@ _GLOBAL(set_context)
576 #else
577 #error Unsupported processor type !
578 #endif
579 +
580 +#if defined(CONFIG_FSL_BOOKE)
581 +/*
582 + * extern void loadcam_entry(unsigned int index)
583 + *
584 + * Load TLBCAM[index] entry in to the L2 CAM MMU
585 + */
586 +_GLOBAL(loadcam_entry)
587 + LOAD_REG_ADDR(r4, TLBCAM)
588 + mulli r5,r3,TLBCAM_SIZE
589 + add r3,r5,r4
590 + lwz r4,TLBCAM_MAS0(r3)
591 + mtspr SPRN_MAS0,r4
592 + lwz r4,TLBCAM_MAS1(r3)
593 + mtspr SPRN_MAS1,r4
594 + PPC_LL r4,TLBCAM_MAS2(r3)
595 + mtspr SPRN_MAS2,r4
596 + lwz r4,TLBCAM_MAS3(r3)
597 + mtspr SPRN_MAS3,r4
598 +BEGIN_MMU_FTR_SECTION
599 + lwz r4,TLBCAM_MAS7(r3)
600 + mtspr SPRN_MAS7,r4
601 +END_MMU_FTR_SECTION_IFSET(MMU_FTR_BIG_PHYS)
602 + isync
603 + tlbwe
604 + isync
605 + blr
606 +#endif
607 diff --git a/arch/powerpc/oprofile/op_model_cell.c b/arch/powerpc/oprofile/op_model_cell.c
608 index 2c9e522..7fd90d0 100644
609 --- a/arch/powerpc/oprofile/op_model_cell.c
610 +++ b/arch/powerpc/oprofile/op_model_cell.c
611 @@ -1077,7 +1077,7 @@ static int calculate_lfsr(int n)
612 index = ENTRIES-1;
613
614 /* make sure index is valid */
615 - if ((index > ENTRIES) || (index < 0))
616 + if ((index >= ENTRIES) || (index < 0))
617 index = ENTRIES-1;
618
619 return initial_lfsr[index];
620 diff --git a/arch/powerpc/platforms/pseries/hotplug-cpu.c b/arch/powerpc/platforms/pseries/hotplug-cpu.c
621 index a8e1d5d..b0760d7 100644
622 --- a/arch/powerpc/platforms/pseries/hotplug-cpu.c
623 +++ b/arch/powerpc/platforms/pseries/hotplug-cpu.c
624 @@ -154,30 +154,6 @@ static void pseries_mach_cpu_die(void)
625 for(;;);
626 }
627
628 -static int qcss_tok; /* query-cpu-stopped-state token */
629 -
630 -/* Get state of physical CPU.
631 - * Return codes:
632 - * 0 - The processor is in the RTAS stopped state
633 - * 1 - stop-self is in progress
634 - * 2 - The processor is not in the RTAS stopped state
635 - * -1 - Hardware Error
636 - * -2 - Hardware Busy, Try again later.
637 - */
638 -static int query_cpu_stopped(unsigned int pcpu)
639 -{
640 - int cpu_status, status;
641 -
642 - status = rtas_call(qcss_tok, 1, 2, &cpu_status, pcpu);
643 - if (status != 0) {
644 - printk(KERN_ERR
645 - "RTAS query-cpu-stopped-state failed: %i\n", status);
646 - return status;
647 - }
648 -
649 - return cpu_status;
650 -}
651 -
652 static int pseries_cpu_disable(void)
653 {
654 int cpu = smp_processor_id();
655 @@ -224,8 +200,9 @@ static void pseries_cpu_die(unsigned int cpu)
656 } else if (get_preferred_offline_state(cpu) == CPU_STATE_OFFLINE) {
657
658 for (tries = 0; tries < 25; tries++) {
659 - cpu_status = query_cpu_stopped(pcpu);
660 - if (cpu_status == 0 || cpu_status == -1)
661 + cpu_status = smp_query_cpu_stopped(pcpu);
662 + if (cpu_status == QCSS_STOPPED ||
663 + cpu_status == QCSS_HARDWARE_ERROR)
664 break;
665 cpu_relax();
666 }
667 @@ -388,6 +365,7 @@ static int __init pseries_cpu_hotplug_init(void)
668 struct device_node *np;
669 const char *typep;
670 int cpu;
671 + int qcss_tok;
672
673 for_each_node_by_name(np, "interrupt-controller") {
674 typep = of_get_property(np, "compatible", NULL);
675 diff --git a/arch/powerpc/platforms/pseries/plpar_wrappers.h b/arch/powerpc/platforms/pseries/plpar_wrappers.h
676 index a05f8d4..6c4fd2c 100644
677 --- a/arch/powerpc/platforms/pseries/plpar_wrappers.h
678 +++ b/arch/powerpc/platforms/pseries/plpar_wrappers.h
679 @@ -4,6 +4,14 @@
680 #include <asm/hvcall.h>
681 #include <asm/page.h>
682
683 +/* Get state of physical CPU from query_cpu_stopped */
684 +int smp_query_cpu_stopped(unsigned int pcpu);
685 +#define QCSS_STOPPED 0
686 +#define QCSS_STOPPING 1
687 +#define QCSS_NOT_STOPPED 2
688 +#define QCSS_HARDWARE_ERROR -1
689 +#define QCSS_HARDWARE_BUSY -2
690 +
691 static inline long poll_pending(void)
692 {
693 return plpar_hcall_norets(H_POLL_PENDING);
694 diff --git a/arch/powerpc/platforms/pseries/smp.c b/arch/powerpc/platforms/pseries/smp.c
695 index 4e7f89a..8979982 100644
696 --- a/arch/powerpc/platforms/pseries/smp.c
697 +++ b/arch/powerpc/platforms/pseries/smp.c
698 @@ -57,6 +57,28 @@
699 */
700 static cpumask_t of_spin_map;
701
702 +/* Query where a cpu is now. Return codes #defined in plpar_wrappers.h */
703 +int smp_query_cpu_stopped(unsigned int pcpu)
704 +{
705 + int cpu_status, status;
706 + int qcss_tok = rtas_token("query-cpu-stopped-state");
707 +
708 + if (qcss_tok == RTAS_UNKNOWN_SERVICE) {
709 + printk(KERN_INFO "Firmware doesn't support "
710 + "query-cpu-stopped-state\n");
711 + return QCSS_HARDWARE_ERROR;
712 + }
713 +
714 + status = rtas_call(qcss_tok, 1, 2, &cpu_status, pcpu);
715 + if (status != 0) {
716 + printk(KERN_ERR
717 + "RTAS query-cpu-stopped-state failed: %i\n", status);
718 + return status;
719 + }
720 +
721 + return cpu_status;
722 +}
723 +
724 /**
725 * smp_startup_cpu() - start the given cpu
726 *
727 @@ -82,6 +104,12 @@ static inline int __devinit smp_startup_cpu(unsigned int lcpu)
728
729 pcpu = get_hard_smp_processor_id(lcpu);
730
731 + /* Check to see if the CPU out of FW already for kexec */
732 + if (smp_query_cpu_stopped(pcpu) == QCSS_NOT_STOPPED){
733 + cpu_set(lcpu, of_spin_map);
734 + return 1;
735 + }
736 +
737 /* Fixup atomic count: it exited inside IRQ handler. */
738 task_thread_info(paca[lcpu].__current)->preempt_count = 0;
739
740 diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
741 index 4929286..ee7c713 100644
742 --- a/arch/s390/kvm/kvm-s390.c
743 +++ b/arch/s390/kvm/kvm-s390.c
744 @@ -341,11 +341,13 @@ struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm,
745
746 rc = kvm_vcpu_init(vcpu, kvm, id);
747 if (rc)
748 - goto out_free_cpu;
749 + goto out_free_sie_block;
750 VM_EVENT(kvm, 3, "create cpu %d at %p, sie block at %p", id, vcpu,
751 vcpu->arch.sie_block);
752
753 return vcpu;
754 +out_free_sie_block:
755 + free_page((unsigned long)(vcpu->arch.sie_block));
756 out_free_cpu:
757 kfree(vcpu);
758 out_nomem:
759 diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
760 index 06d9e79..63400e6 100644
761 --- a/arch/x86/include/asm/kvm_host.h
762 +++ b/arch/x86/include/asm/kvm_host.h
763 @@ -180,6 +180,7 @@ union kvm_mmu_page_role {
764 unsigned invalid:1;
765 unsigned cr4_pge:1;
766 unsigned nxe:1;
767 + unsigned cr0_wp:1;
768 };
769 };
770
771 @@ -541,6 +542,8 @@ struct kvm_x86_ops {
772 int (*get_lpage_level)(void);
773 bool (*rdtscp_supported)(void);
774
775 + void (*set_supported_cpuid)(u32 func, struct kvm_cpuid_entry2 *entry);
776 +
777 const struct trace_print_flags *exit_reasons_str;
778 };
779
780 diff --git a/arch/x86/include/asm/msr-index.h b/arch/x86/include/asm/msr-index.h
781 index 4604e6a..d86da72 100644
782 --- a/arch/x86/include/asm/msr-index.h
783 +++ b/arch/x86/include/asm/msr-index.h
784 @@ -199,8 +199,9 @@
785 #define MSR_IA32_EBL_CR_POWERON 0x0000002a
786 #define MSR_IA32_FEATURE_CONTROL 0x0000003a
787
788 -#define FEATURE_CONTROL_LOCKED (1<<0)
789 -#define FEATURE_CONTROL_VMXON_ENABLED (1<<2)
790 +#define FEATURE_CONTROL_LOCKED (1<<0)
791 +#define FEATURE_CONTROL_VMXON_ENABLED_INSIDE_SMX (1<<1)
792 +#define FEATURE_CONTROL_VMXON_ENABLED_OUTSIDE_SMX (1<<2)
793
794 #define MSR_IA32_APICBASE 0x0000001b
795 #define MSR_IA32_APICBASE_BSP (1<<8)
796 diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c
797 index f854d89..29e5e6e 100644
798 --- a/arch/x86/kernel/amd_iommu.c
799 +++ b/arch/x86/kernel/amd_iommu.c
800 @@ -1420,6 +1420,7 @@ static int __attach_device(struct device *dev,
801 struct protection_domain *domain)
802 {
803 struct iommu_dev_data *dev_data, *alias_data;
804 + int ret;
805
806 dev_data = get_dev_data(dev);
807 alias_data = get_dev_data(dev_data->alias);
808 @@ -1431,13 +1432,14 @@ static int __attach_device(struct device *dev,
809 spin_lock(&domain->lock);
810
811 /* Some sanity checks */
812 + ret = -EBUSY;
813 if (alias_data->domain != NULL &&
814 alias_data->domain != domain)
815 - return -EBUSY;
816 + goto out_unlock;
817
818 if (dev_data->domain != NULL &&
819 dev_data->domain != domain)
820 - return -EBUSY;
821 + goto out_unlock;
822
823 /* Do real assignment */
824 if (dev_data->alias != dev) {
825 @@ -1453,10 +1455,14 @@ static int __attach_device(struct device *dev,
826
827 atomic_inc(&dev_data->bind);
828
829 + ret = 0;
830 +
831 +out_unlock:
832 +
833 /* ready */
834 spin_unlock(&domain->lock);
835
836 - return 0;
837 + return ret;
838 }
839
840 /*
841 @@ -2257,10 +2263,6 @@ int __init amd_iommu_init_dma_ops(void)
842
843 iommu_detected = 1;
844 swiotlb = 0;
845 -#ifdef CONFIG_GART_IOMMU
846 - gart_iommu_aperture_disabled = 1;
847 - gart_iommu_aperture = 0;
848 -#endif
849
850 /* Make the driver finally visible to the drivers */
851 dma_ops = &amd_iommu_dma_ops;
852 diff --git a/arch/x86/kernel/amd_iommu_init.c b/arch/x86/kernel/amd_iommu_init.c
853 index 6360abf..6f8ce75 100644
854 --- a/arch/x86/kernel/amd_iommu_init.c
855 +++ b/arch/x86/kernel/amd_iommu_init.c
856 @@ -286,8 +286,12 @@ static u8 * __init iommu_map_mmio_space(u64 address)
857 {
858 u8 *ret;
859
860 - if (!request_mem_region(address, MMIO_REGION_LENGTH, "amd_iommu"))
861 + if (!request_mem_region(address, MMIO_REGION_LENGTH, "amd_iommu")) {
862 + pr_err("AMD-Vi: Can not reserve memory region %llx for mmio\n",
863 + address);
864 + pr_err("AMD-Vi: This is a BIOS bug. Please contact your hardware vendor\n");
865 return NULL;
866 + }
867
868 ret = ioremap_nocache(address, MMIO_REGION_LENGTH);
869 if (ret != NULL)
870 @@ -1313,7 +1317,7 @@ static int __init amd_iommu_init(void)
871 ret = amd_iommu_init_dma_ops();
872
873 if (ret)
874 - goto free;
875 + goto free_disable;
876
877 amd_iommu_init_api();
878
879 @@ -1331,9 +1335,10 @@ static int __init amd_iommu_init(void)
880 out:
881 return ret;
882
883 -free:
884 +free_disable:
885 disable_iommus();
886
887 +free:
888 amd_iommu_uninit_devices();
889
890 free_pages((unsigned long)amd_iommu_pd_alloc_bitmap,
891 @@ -1352,6 +1357,15 @@ free:
892
893 free_unity_maps();
894
895 +#ifdef CONFIG_GART_IOMMU
896 + /*
897 + * We failed to initialize the AMD IOMMU - try fallback to GART
898 + * if possible.
899 + */
900 + gart_iommu_init();
901 +
902 +#endif
903 +
904 goto out;
905 }
906
907 diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c
908 index db5bdc8..c5e8b53 100644
909 --- a/arch/x86/kernel/cpu/perf_event.c
910 +++ b/arch/x86/kernel/cpu/perf_event.c
911 @@ -460,8 +460,11 @@ static int __hw_perf_event_init(struct perf_event *event)
912 if (atomic_read(&active_events) == 0) {
913 if (!reserve_pmc_hardware())
914 err = -EBUSY;
915 - else
916 + else {
917 err = reserve_bts_hardware();
918 + if (err)
919 + release_pmc_hardware();
920 + }
921 }
922 if (!err)
923 atomic_inc(&active_events);
924 diff --git a/arch/x86/kernel/pvclock.c b/arch/x86/kernel/pvclock.c
925 index 03801f2..dfdfe46 100644
926 --- a/arch/x86/kernel/pvclock.c
927 +++ b/arch/x86/kernel/pvclock.c
928 @@ -109,11 +109,14 @@ unsigned long pvclock_tsc_khz(struct pvclock_vcpu_time_info *src)
929 return pv_tsc_khz;
930 }
931
932 +static atomic64_t last_value = ATOMIC64_INIT(0);
933 +
934 cycle_t pvclock_clocksource_read(struct pvclock_vcpu_time_info *src)
935 {
936 struct pvclock_shadow_time shadow;
937 unsigned version;
938 cycle_t ret, offset;
939 + u64 last;
940
941 do {
942 version = pvclock_get_time_values(&shadow, src);
943 @@ -123,6 +126,27 @@ cycle_t pvclock_clocksource_read(struct pvclock_vcpu_time_info *src)
944 barrier();
945 } while (version != src->version);
946
947 + /*
948 + * Assumption here is that last_value, a global accumulator, always goes
949 + * forward. If we are less than that, we should not be much smaller.
950 + * We assume there is an error marging we're inside, and then the correction
951 + * does not sacrifice accuracy.
952 + *
953 + * For reads: global may have changed between test and return,
954 + * but this means someone else updated poked the clock at a later time.
955 + * We just need to make sure we are not seeing a backwards event.
956 + *
957 + * For updates: last_value = ret is not enough, since two vcpus could be
958 + * updating at the same time, and one of them could be slightly behind,
959 + * making the assumption that last_value always go forward fail to hold.
960 + */
961 + last = atomic64_read(&last_value);
962 + do {
963 + if (ret < last)
964 + return last;
965 + last = atomic64_cmpxchg(&last_value, last, ret);
966 + } while (unlikely(last != ret));
967 +
968 return ret;
969 }
970
971 diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
972 index c4851ef..47ae912 100644
973 --- a/arch/x86/kernel/setup.c
974 +++ b/arch/x86/kernel/setup.c
975 @@ -676,6 +676,17 @@ static struct dmi_system_id __initdata bad_bios_dmi_table[] = {
976 DMI_MATCH(DMI_BOARD_NAME, "DG45FC"),
977 },
978 },
979 + /*
980 + * The Dell Inspiron Mini 1012 has DMI_BIOS_VENDOR = "Dell Inc.", so
981 + * match on the product name.
982 + */
983 + {
984 + .callback = dmi_low_memory_corruption,
985 + .ident = "Phoenix BIOS",
986 + .matches = {
987 + DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 1012"),
988 + },
989 + },
990 #endif
991 {}
992 };
993 diff --git a/arch/x86/kernel/tboot.c b/arch/x86/kernel/tboot.c
994 index 86c9f91..46b8277 100644
995 --- a/arch/x86/kernel/tboot.c
996 +++ b/arch/x86/kernel/tboot.c
997 @@ -46,6 +46,7 @@
998
999 /* Global pointer to shared data; NULL means no measured launch. */
1000 struct tboot *tboot __read_mostly;
1001 +EXPORT_SYMBOL(tboot);
1002
1003 /* timeout for APs (in secs) to enter wait-for-SIPI state during shutdown */
1004 #define AP_WAIT_TIMEOUT 1
1005 diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
1006 index 19a8906..62fd8e6 100644
1007 --- a/arch/x86/kvm/mmu.c
1008 +++ b/arch/x86/kvm/mmu.c
1009 @@ -223,7 +223,7 @@ void kvm_mmu_set_mask_ptes(u64 user_mask, u64 accessed_mask,
1010 }
1011 EXPORT_SYMBOL_GPL(kvm_mmu_set_mask_ptes);
1012
1013 -static int is_write_protection(struct kvm_vcpu *vcpu)
1014 +static bool is_write_protection(struct kvm_vcpu *vcpu)
1015 {
1016 return kvm_read_cr0_bits(vcpu, X86_CR0_WP);
1017 }
1018 @@ -2085,11 +2085,13 @@ static int mmu_alloc_roots(struct kvm_vcpu *vcpu)
1019 direct = 1;
1020 if (mmu_check_root(vcpu, root_gfn))
1021 return 1;
1022 + spin_lock(&vcpu->kvm->mmu_lock);
1023 sp = kvm_mmu_get_page(vcpu, root_gfn, 0,
1024 PT64_ROOT_LEVEL, direct,
1025 ACC_ALL, NULL);
1026 root = __pa(sp->spt);
1027 ++sp->root_count;
1028 + spin_unlock(&vcpu->kvm->mmu_lock);
1029 vcpu->arch.mmu.root_hpa = root;
1030 return 0;
1031 }
1032 @@ -2111,11 +2113,14 @@ static int mmu_alloc_roots(struct kvm_vcpu *vcpu)
1033 root_gfn = 0;
1034 if (mmu_check_root(vcpu, root_gfn))
1035 return 1;
1036 + spin_lock(&vcpu->kvm->mmu_lock);
1037 sp = kvm_mmu_get_page(vcpu, root_gfn, i << 30,
1038 PT32_ROOT_LEVEL, direct,
1039 ACC_ALL, NULL);
1040 root = __pa(sp->spt);
1041 ++sp->root_count;
1042 + spin_unlock(&vcpu->kvm->mmu_lock);
1043 +
1044 vcpu->arch.mmu.pae_root[i] = root | PT_PRESENT_MASK;
1045 }
1046 vcpu->arch.mmu.root_hpa = __pa(vcpu->arch.mmu.pae_root);
1047 @@ -2439,6 +2444,7 @@ static int init_kvm_softmmu(struct kvm_vcpu *vcpu)
1048 r = paging32_init_context(vcpu);
1049
1050 vcpu->arch.mmu.base_role.glevels = vcpu->arch.mmu.root_level;
1051 + vcpu->arch.mmu.base_role.cr0_wp = is_write_protection(vcpu);
1052
1053 return r;
1054 }
1055 @@ -2478,7 +2484,9 @@ int kvm_mmu_load(struct kvm_vcpu *vcpu)
1056 goto out;
1057 spin_lock(&vcpu->kvm->mmu_lock);
1058 kvm_mmu_free_some_pages(vcpu);
1059 + spin_unlock(&vcpu->kvm->mmu_lock);
1060 r = mmu_alloc_roots(vcpu);
1061 + spin_lock(&vcpu->kvm->mmu_lock);
1062 mmu_sync_roots(vcpu);
1063 spin_unlock(&vcpu->kvm->mmu_lock);
1064 if (r)
1065 diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
1066 index 737361f..1185b55 100644
1067 --- a/arch/x86/kvm/svm.c
1068 +++ b/arch/x86/kvm/svm.c
1069 @@ -129,6 +129,7 @@ static void svm_flush_tlb(struct kvm_vcpu *vcpu);
1070 static void svm_complete_interrupts(struct vcpu_svm *svm);
1071
1072 static int nested_svm_exit_handled(struct vcpu_svm *svm);
1073 +static int nested_svm_intercept(struct vcpu_svm *svm);
1074 static int nested_svm_vmexit(struct vcpu_svm *svm);
1075 static int nested_svm_check_exception(struct vcpu_svm *svm, unsigned nr,
1076 bool has_error_code, u32 error_code);
1077 @@ -1384,6 +1385,8 @@ static int nested_svm_check_permissions(struct vcpu_svm *svm)
1078 static int nested_svm_check_exception(struct vcpu_svm *svm, unsigned nr,
1079 bool has_error_code, u32 error_code)
1080 {
1081 + int vmexit;
1082 +
1083 if (!is_nested(svm))
1084 return 0;
1085
1086 @@ -1392,19 +1395,24 @@ static int nested_svm_check_exception(struct vcpu_svm *svm, unsigned nr,
1087 svm->vmcb->control.exit_info_1 = error_code;
1088 svm->vmcb->control.exit_info_2 = svm->vcpu.arch.cr2;
1089
1090 - return nested_svm_exit_handled(svm);
1091 + vmexit = nested_svm_intercept(svm);
1092 + if (vmexit == NESTED_EXIT_DONE)
1093 + svm->nested.exit_required = true;
1094 +
1095 + return vmexit;
1096 }
1097
1098 -static inline int nested_svm_intr(struct vcpu_svm *svm)
1099 +/* This function returns true if it is save to enable the irq window */
1100 +static inline bool nested_svm_intr(struct vcpu_svm *svm)
1101 {
1102 if (!is_nested(svm))
1103 - return 0;
1104 + return true;
1105
1106 if (!(svm->vcpu.arch.hflags & HF_VINTR_MASK))
1107 - return 0;
1108 + return true;
1109
1110 if (!(svm->vcpu.arch.hflags & HF_HIF_MASK))
1111 - return 0;
1112 + return false;
1113
1114 svm->vmcb->control.exit_code = SVM_EXIT_INTR;
1115
1116 @@ -1417,13 +1425,13 @@ static inline int nested_svm_intr(struct vcpu_svm *svm)
1117 */
1118 svm->nested.exit_required = true;
1119 trace_kvm_nested_intr_vmexit(svm->vmcb->save.rip);
1120 - return 1;
1121 + return false;
1122 }
1123
1124 - return 0;
1125 + return true;
1126 }
1127
1128 -static void *nested_svm_map(struct vcpu_svm *svm, u64 gpa, enum km_type idx)
1129 +static void *nested_svm_map(struct vcpu_svm *svm, u64 gpa, struct page **_page)
1130 {
1131 struct page *page;
1132
1133 @@ -1431,7 +1439,9 @@ static void *nested_svm_map(struct vcpu_svm *svm, u64 gpa, enum km_type idx)
1134 if (is_error_page(page))
1135 goto error;
1136
1137 - return kmap_atomic(page, idx);
1138 + *_page = page;
1139 +
1140 + return kmap(page);
1141
1142 error:
1143 kvm_release_page_clean(page);
1144 @@ -1440,16 +1450,9 @@ error:
1145 return NULL;
1146 }
1147
1148 -static void nested_svm_unmap(void *addr, enum km_type idx)
1149 +static void nested_svm_unmap(struct page *page)
1150 {
1151 - struct page *page;
1152 -
1153 - if (!addr)
1154 - return;
1155 -
1156 - page = kmap_atomic_to_page(addr);
1157 -
1158 - kunmap_atomic(addr, idx);
1159 + kunmap(page);
1160 kvm_release_page_dirty(page);
1161 }
1162
1163 @@ -1459,16 +1462,11 @@ static bool nested_svm_exit_handled_msr(struct vcpu_svm *svm)
1164 u32 msr = svm->vcpu.arch.regs[VCPU_REGS_RCX];
1165 bool ret = false;
1166 u32 t0, t1;
1167 - u8 *msrpm;
1168 + u8 val;
1169
1170 if (!(svm->nested.intercept & (1ULL << INTERCEPT_MSR_PROT)))
1171 return false;
1172
1173 - msrpm = nested_svm_map(svm, svm->nested.vmcb_msrpm, KM_USER0);
1174 -
1175 - if (!msrpm)
1176 - goto out;
1177 -
1178 switch (msr) {
1179 case 0 ... 0x1fff:
1180 t0 = (msr * 2) % 8;
1181 @@ -1489,11 +1487,10 @@ static bool nested_svm_exit_handled_msr(struct vcpu_svm *svm)
1182 goto out;
1183 }
1184
1185 - ret = msrpm[t1] & ((1 << param) << t0);
1186 + if (!kvm_read_guest(svm->vcpu.kvm, svm->nested.vmcb_msrpm + t1, &val, 1))
1187 + ret = val & ((1 << param) << t0);
1188
1189 out:
1190 - nested_svm_unmap(msrpm, KM_USER0);
1191 -
1192 return ret;
1193 }
1194
1195 @@ -1525,7 +1522,7 @@ static int nested_svm_exit_special(struct vcpu_svm *svm)
1196 /*
1197 * If this function returns true, this #vmexit was already handled
1198 */
1199 -static int nested_svm_exit_handled(struct vcpu_svm *svm)
1200 +static int nested_svm_intercept(struct vcpu_svm *svm)
1201 {
1202 u32 exit_code = svm->vmcb->control.exit_code;
1203 int vmexit = NESTED_EXIT_HOST;
1204 @@ -1571,9 +1568,17 @@ static int nested_svm_exit_handled(struct vcpu_svm *svm)
1205 }
1206 }
1207
1208 - if (vmexit == NESTED_EXIT_DONE) {
1209 + return vmexit;
1210 +}
1211 +
1212 +static int nested_svm_exit_handled(struct vcpu_svm *svm)
1213 +{
1214 + int vmexit;
1215 +
1216 + vmexit = nested_svm_intercept(svm);
1217 +
1218 + if (vmexit == NESTED_EXIT_DONE)
1219 nested_svm_vmexit(svm);
1220 - }
1221
1222 return vmexit;
1223 }
1224 @@ -1615,6 +1620,7 @@ static int nested_svm_vmexit(struct vcpu_svm *svm)
1225 struct vmcb *nested_vmcb;
1226 struct vmcb *hsave = svm->nested.hsave;
1227 struct vmcb *vmcb = svm->vmcb;
1228 + struct page *page;
1229
1230 trace_kvm_nested_vmexit_inject(vmcb->control.exit_code,
1231 vmcb->control.exit_info_1,
1232 @@ -1622,7 +1628,7 @@ static int nested_svm_vmexit(struct vcpu_svm *svm)
1233 vmcb->control.exit_int_info,
1234 vmcb->control.exit_int_info_err);
1235
1236 - nested_vmcb = nested_svm_map(svm, svm->nested.vmcb, KM_USER0);
1237 + nested_vmcb = nested_svm_map(svm, svm->nested.vmcb, &page);
1238 if (!nested_vmcb)
1239 return 1;
1240
1241 @@ -1635,9 +1641,13 @@ static int nested_svm_vmexit(struct vcpu_svm *svm)
1242 nested_vmcb->save.ds = vmcb->save.ds;
1243 nested_vmcb->save.gdtr = vmcb->save.gdtr;
1244 nested_vmcb->save.idtr = vmcb->save.idtr;
1245 + nested_vmcb->save.cr0 = kvm_read_cr0(&svm->vcpu);
1246 if (npt_enabled)
1247 nested_vmcb->save.cr3 = vmcb->save.cr3;
1248 + else
1249 + nested_vmcb->save.cr3 = svm->vcpu.arch.cr3;
1250 nested_vmcb->save.cr2 = vmcb->save.cr2;
1251 + nested_vmcb->save.cr4 = svm->vcpu.arch.cr4;
1252 nested_vmcb->save.rflags = vmcb->save.rflags;
1253 nested_vmcb->save.rip = vmcb->save.rip;
1254 nested_vmcb->save.rsp = vmcb->save.rsp;
1255 @@ -1712,7 +1722,7 @@ static int nested_svm_vmexit(struct vcpu_svm *svm)
1256 /* Exit nested SVM mode */
1257 svm->nested.vmcb = 0;
1258
1259 - nested_svm_unmap(nested_vmcb, KM_USER0);
1260 + nested_svm_unmap(page);
1261
1262 kvm_mmu_reset_context(&svm->vcpu);
1263 kvm_mmu_load(&svm->vcpu);
1264 @@ -1723,9 +1733,10 @@ static int nested_svm_vmexit(struct vcpu_svm *svm)
1265 static bool nested_svm_vmrun_msrpm(struct vcpu_svm *svm)
1266 {
1267 u32 *nested_msrpm;
1268 + struct page *page;
1269 int i;
1270
1271 - nested_msrpm = nested_svm_map(svm, svm->nested.vmcb_msrpm, KM_USER0);
1272 + nested_msrpm = nested_svm_map(svm, svm->nested.vmcb_msrpm, &page);
1273 if (!nested_msrpm)
1274 return false;
1275
1276 @@ -1734,7 +1745,7 @@ static bool nested_svm_vmrun_msrpm(struct vcpu_svm *svm)
1277
1278 svm->vmcb->control.msrpm_base_pa = __pa(svm->nested.msrpm);
1279
1280 - nested_svm_unmap(nested_msrpm, KM_USER0);
1281 + nested_svm_unmap(page);
1282
1283 return true;
1284 }
1285 @@ -1744,8 +1755,9 @@ static bool nested_svm_vmrun(struct vcpu_svm *svm)
1286 struct vmcb *nested_vmcb;
1287 struct vmcb *hsave = svm->nested.hsave;
1288 struct vmcb *vmcb = svm->vmcb;
1289 + struct page *page;
1290
1291 - nested_vmcb = nested_svm_map(svm, svm->vmcb->save.rax, KM_USER0);
1292 + nested_vmcb = nested_svm_map(svm, svm->vmcb->save.rax, &page);
1293 if (!nested_vmcb)
1294 return false;
1295
1296 @@ -1819,21 +1831,6 @@ static bool nested_svm_vmrun(struct vcpu_svm *svm)
1297 svm->vmcb->save.dr6 = nested_vmcb->save.dr6;
1298 svm->vmcb->save.cpl = nested_vmcb->save.cpl;
1299
1300 - /* We don't want a nested guest to be more powerful than the guest,
1301 - so all intercepts are ORed */
1302 - svm->vmcb->control.intercept_cr_read |=
1303 - nested_vmcb->control.intercept_cr_read;
1304 - svm->vmcb->control.intercept_cr_write |=
1305 - nested_vmcb->control.intercept_cr_write;
1306 - svm->vmcb->control.intercept_dr_read |=
1307 - nested_vmcb->control.intercept_dr_read;
1308 - svm->vmcb->control.intercept_dr_write |=
1309 - nested_vmcb->control.intercept_dr_write;
1310 - svm->vmcb->control.intercept_exceptions |=
1311 - nested_vmcb->control.intercept_exceptions;
1312 -
1313 - svm->vmcb->control.intercept |= nested_vmcb->control.intercept;
1314 -
1315 svm->nested.vmcb_msrpm = nested_vmcb->control.msrpm_base_pa;
1316
1317 /* cache intercepts */
1318 @@ -1851,13 +1848,38 @@ static bool nested_svm_vmrun(struct vcpu_svm *svm)
1319 else
1320 svm->vcpu.arch.hflags &= ~HF_VINTR_MASK;
1321
1322 + if (svm->vcpu.arch.hflags & HF_VINTR_MASK) {
1323 + /* We only want the cr8 intercept bits of the guest */
1324 + svm->vmcb->control.intercept_cr_read &= ~INTERCEPT_CR8_MASK;
1325 + svm->vmcb->control.intercept_cr_write &= ~INTERCEPT_CR8_MASK;
1326 + }
1327 +
1328 + /* We don't want to see VMMCALLs from a nested guest */
1329 + svm->vmcb->control.intercept &= ~(1ULL << INTERCEPT_VMMCALL);
1330 +
1331 + /* We don't want a nested guest to be more powerful than the guest,
1332 + so all intercepts are ORed */
1333 + svm->vmcb->control.intercept_cr_read |=
1334 + nested_vmcb->control.intercept_cr_read;
1335 + svm->vmcb->control.intercept_cr_write |=
1336 + nested_vmcb->control.intercept_cr_write;
1337 + svm->vmcb->control.intercept_dr_read |=
1338 + nested_vmcb->control.intercept_dr_read;
1339 + svm->vmcb->control.intercept_dr_write |=
1340 + nested_vmcb->control.intercept_dr_write;
1341 + svm->vmcb->control.intercept_exceptions |=
1342 + nested_vmcb->control.intercept_exceptions;
1343 +
1344 + svm->vmcb->control.intercept |= nested_vmcb->control.intercept;
1345 +
1346 + svm->vmcb->control.lbr_ctl = nested_vmcb->control.lbr_ctl;
1347 svm->vmcb->control.int_vector = nested_vmcb->control.int_vector;
1348 svm->vmcb->control.int_state = nested_vmcb->control.int_state;
1349 svm->vmcb->control.tsc_offset += nested_vmcb->control.tsc_offset;
1350 svm->vmcb->control.event_inj = nested_vmcb->control.event_inj;
1351 svm->vmcb->control.event_inj_err = nested_vmcb->control.event_inj_err;
1352
1353 - nested_svm_unmap(nested_vmcb, KM_USER0);
1354 + nested_svm_unmap(page);
1355
1356 enable_gif(svm);
1357
1358 @@ -1883,6 +1905,7 @@ static void nested_svm_vmloadsave(struct vmcb *from_vmcb, struct vmcb *to_vmcb)
1359 static int vmload_interception(struct vcpu_svm *svm)
1360 {
1361 struct vmcb *nested_vmcb;
1362 + struct page *page;
1363
1364 if (nested_svm_check_permissions(svm))
1365 return 1;
1366 @@ -1890,12 +1913,12 @@ static int vmload_interception(struct vcpu_svm *svm)
1367 svm->next_rip = kvm_rip_read(&svm->vcpu) + 3;
1368 skip_emulated_instruction(&svm->vcpu);
1369
1370 - nested_vmcb = nested_svm_map(svm, svm->vmcb->save.rax, KM_USER0);
1371 + nested_vmcb = nested_svm_map(svm, svm->vmcb->save.rax, &page);
1372 if (!nested_vmcb)
1373 return 1;
1374
1375 nested_svm_vmloadsave(nested_vmcb, svm->vmcb);
1376 - nested_svm_unmap(nested_vmcb, KM_USER0);
1377 + nested_svm_unmap(page);
1378
1379 return 1;
1380 }
1381 @@ -1903,6 +1926,7 @@ static int vmload_interception(struct vcpu_svm *svm)
1382 static int vmsave_interception(struct vcpu_svm *svm)
1383 {
1384 struct vmcb *nested_vmcb;
1385 + struct page *page;
1386
1387 if (nested_svm_check_permissions(svm))
1388 return 1;
1389 @@ -1910,12 +1934,12 @@ static int vmsave_interception(struct vcpu_svm *svm)
1390 svm->next_rip = kvm_rip_read(&svm->vcpu) + 3;
1391 skip_emulated_instruction(&svm->vcpu);
1392
1393 - nested_vmcb = nested_svm_map(svm, svm->vmcb->save.rax, KM_USER0);
1394 + nested_vmcb = nested_svm_map(svm, svm->vmcb->save.rax, &page);
1395 if (!nested_vmcb)
1396 return 1;
1397
1398 nested_svm_vmloadsave(svm->vmcb, nested_vmcb);
1399 - nested_svm_unmap(nested_vmcb, KM_USER0);
1400 + nested_svm_unmap(page);
1401
1402 return 1;
1403 }
1404 @@ -2511,6 +2535,9 @@ static void update_cr8_intercept(struct kvm_vcpu *vcpu, int tpr, int irr)
1405 {
1406 struct vcpu_svm *svm = to_svm(vcpu);
1407
1408 + if (is_nested(svm) && (vcpu->arch.hflags & HF_VINTR_MASK))
1409 + return;
1410 +
1411 if (irr == -1)
1412 return;
1413
1414 @@ -2568,13 +2595,11 @@ static void enable_irq_window(struct kvm_vcpu *vcpu)
1415 {
1416 struct vcpu_svm *svm = to_svm(vcpu);
1417
1418 - nested_svm_intr(svm);
1419 -
1420 /* In case GIF=0 we can't rely on the CPU to tell us when
1421 * GIF becomes 1, because that's a separate STGI/VMRUN intercept.
1422 * The next time we get that intercept, this function will be
1423 * called again though and we'll get the vintr intercept. */
1424 - if (gif_set(svm)) {
1425 + if (gif_set(svm) && nested_svm_intr(svm)) {
1426 svm_set_vintr(svm);
1427 svm_inject_irq(svm, 0x0);
1428 }
1429 @@ -2614,6 +2639,9 @@ static inline void sync_cr8_to_lapic(struct kvm_vcpu *vcpu)
1430 {
1431 struct vcpu_svm *svm = to_svm(vcpu);
1432
1433 + if (is_nested(svm) && (vcpu->arch.hflags & HF_VINTR_MASK))
1434 + return;
1435 +
1436 if (!(svm->vmcb->control.intercept_cr_write & INTERCEPT_CR8_MASK)) {
1437 int cr8 = svm->vmcb->control.int_ctl & V_TPR_MASK;
1438 kvm_set_cr8(vcpu, cr8);
1439 @@ -2625,6 +2653,9 @@ static inline void sync_lapic_to_cr8(struct kvm_vcpu *vcpu)
1440 struct vcpu_svm *svm = to_svm(vcpu);
1441 u64 cr8;
1442
1443 + if (is_nested(svm) && (vcpu->arch.hflags & HF_VINTR_MASK))
1444 + return;
1445 +
1446 cr8 = kvm_get_cr8(vcpu);
1447 svm->vmcb->control.int_ctl &= ~V_TPR_MASK;
1448 svm->vmcb->control.int_ctl |= cr8 & V_TPR_MASK;
1449 @@ -2879,6 +2910,20 @@ static void svm_cpuid_update(struct kvm_vcpu *vcpu)
1450 {
1451 }
1452
1453 +static void svm_set_supported_cpuid(u32 func, struct kvm_cpuid_entry2 *entry)
1454 +{
1455 + switch (func) {
1456 + case 0x8000000A:
1457 + entry->eax = 1; /* SVM revision 1 */
1458 + entry->ebx = 8; /* Lets support 8 ASIDs in case we add proper
1459 + ASID emulation to nested SVM */
1460 + entry->ecx = 0; /* Reserved */
1461 + entry->edx = 0; /* Do not support any additional features */
1462 +
1463 + break;
1464 + }
1465 +}
1466 +
1467 static const struct trace_print_flags svm_exit_reasons_str[] = {
1468 { SVM_EXIT_READ_CR0, "read_cr0" },
1469 { SVM_EXIT_READ_CR3, "read_cr3" },
1470 @@ -3023,6 +3068,8 @@ static struct kvm_x86_ops svm_x86_ops = {
1471 .cpuid_update = svm_cpuid_update,
1472
1473 .rdtscp_supported = svm_rdtscp_supported,
1474 +
1475 + .set_supported_cpuid = svm_set_supported_cpuid,
1476 };
1477
1478 static int __init svm_init(void)
1479 diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
1480 index 2f8db0e..3c86c42 100644
1481 --- a/arch/x86/kvm/vmx.c
1482 +++ b/arch/x86/kvm/vmx.c
1483 @@ -27,6 +27,7 @@
1484 #include <linux/moduleparam.h>
1485 #include <linux/ftrace_event.h>
1486 #include <linux/slab.h>
1487 +#include <linux/tboot.h>
1488 #include "kvm_cache_regs.h"
1489 #include "x86.h"
1490
1491 @@ -1176,9 +1177,16 @@ static __init int vmx_disabled_by_bios(void)
1492 u64 msr;
1493
1494 rdmsrl(MSR_IA32_FEATURE_CONTROL, msr);
1495 - return (msr & (FEATURE_CONTROL_LOCKED |
1496 - FEATURE_CONTROL_VMXON_ENABLED))
1497 - == FEATURE_CONTROL_LOCKED;
1498 + if (msr & FEATURE_CONTROL_LOCKED) {
1499 + if (!(msr & FEATURE_CONTROL_VMXON_ENABLED_INSIDE_SMX)
1500 + && tboot_enabled())
1501 + return 1;
1502 + if (!(msr & FEATURE_CONTROL_VMXON_ENABLED_OUTSIDE_SMX)
1503 + && !tboot_enabled())
1504 + return 1;
1505 + }
1506 +
1507 + return 0;
1508 /* locked but not enabled */
1509 }
1510
1511 @@ -1186,21 +1194,23 @@ static int hardware_enable(void *garbage)
1512 {
1513 int cpu = raw_smp_processor_id();
1514 u64 phys_addr = __pa(per_cpu(vmxarea, cpu));
1515 - u64 old;
1516 + u64 old, test_bits;
1517
1518 if (read_cr4() & X86_CR4_VMXE)
1519 return -EBUSY;
1520
1521 INIT_LIST_HEAD(&per_cpu(vcpus_on_cpu, cpu));
1522 rdmsrl(MSR_IA32_FEATURE_CONTROL, old);
1523 - if ((old & (FEATURE_CONTROL_LOCKED |
1524 - FEATURE_CONTROL_VMXON_ENABLED))
1525 - != (FEATURE_CONTROL_LOCKED |
1526 - FEATURE_CONTROL_VMXON_ENABLED))
1527 +
1528 + test_bits = FEATURE_CONTROL_LOCKED;
1529 + test_bits |= FEATURE_CONTROL_VMXON_ENABLED_OUTSIDE_SMX;
1530 + if (tboot_enabled())
1531 + test_bits |= FEATURE_CONTROL_VMXON_ENABLED_INSIDE_SMX;
1532 +
1533 + if ((old & test_bits) != test_bits) {
1534 /* enable and lock */
1535 - wrmsrl(MSR_IA32_FEATURE_CONTROL, old |
1536 - FEATURE_CONTROL_LOCKED |
1537 - FEATURE_CONTROL_VMXON_ENABLED);
1538 + wrmsrl(MSR_IA32_FEATURE_CONTROL, old | test_bits);
1539 + }
1540 write_cr4(read_cr4() | X86_CR4_VMXE); /* FIXME: not cpu hotplug safe */
1541 asm volatile (ASM_VMX_VMXON_RAX
1542 : : "a"(&phys_addr), "m"(phys_addr)
1543 @@ -4115,6 +4125,10 @@ static void vmx_cpuid_update(struct kvm_vcpu *vcpu)
1544 }
1545 }
1546
1547 +static void vmx_set_supported_cpuid(u32 func, struct kvm_cpuid_entry2 *entry)
1548 +{
1549 +}
1550 +
1551 static struct kvm_x86_ops vmx_x86_ops = {
1552 .cpu_has_kvm_support = cpu_has_kvm_support,
1553 .disabled_by_bios = vmx_disabled_by_bios,
1554 @@ -4186,6 +4200,8 @@ static struct kvm_x86_ops vmx_x86_ops = {
1555 .cpuid_update = vmx_cpuid_update,
1556
1557 .rdtscp_supported = vmx_rdtscp_supported,
1558 +
1559 + .set_supported_cpuid = vmx_set_supported_cpuid,
1560 };
1561
1562 static int __init vmx_init(void)
1563 diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
1564 index c4f35b5..a6517a2 100644
1565 --- a/arch/x86/kvm/x86.c
1566 +++ b/arch/x86/kvm/x86.c
1567 @@ -484,7 +484,7 @@ EXPORT_SYMBOL_GPL(kvm_set_cr0);
1568
1569 void kvm_lmsw(struct kvm_vcpu *vcpu, unsigned long msw)
1570 {
1571 - kvm_set_cr0(vcpu, kvm_read_cr0_bits(vcpu, ~0x0ful) | (msw & 0x0f));
1572 + kvm_set_cr0(vcpu, kvm_read_cr0_bits(vcpu, ~0x0eul) | (msw & 0x0f));
1573 }
1574 EXPORT_SYMBOL_GPL(kvm_lmsw);
1575
1576 @@ -624,48 +624,42 @@ static u32 emulated_msrs[] = {
1577 MSR_IA32_MISC_ENABLE,
1578 };
1579
1580 -static void set_efer(struct kvm_vcpu *vcpu, u64 efer)
1581 +static int set_efer(struct kvm_vcpu *vcpu, u64 efer)
1582 {
1583 - if (efer & efer_reserved_bits) {
1584 - kvm_inject_gp(vcpu, 0);
1585 - return;
1586 - }
1587 + if (efer & efer_reserved_bits)
1588 + return 1;
1589
1590 if (is_paging(vcpu)
1591 - && (vcpu->arch.efer & EFER_LME) != (efer & EFER_LME)) {
1592 - kvm_inject_gp(vcpu, 0);
1593 - return;
1594 - }
1595 + && (vcpu->arch.efer & EFER_LME) != (efer & EFER_LME))
1596 + return 1;
1597
1598 if (efer & EFER_FFXSR) {
1599 struct kvm_cpuid_entry2 *feat;
1600
1601 feat = kvm_find_cpuid_entry(vcpu, 0x80000001, 0);
1602 - if (!feat || !(feat->edx & bit(X86_FEATURE_FXSR_OPT))) {
1603 - kvm_inject_gp(vcpu, 0);
1604 - return;
1605 - }
1606 + if (!feat || !(feat->edx & bit(X86_FEATURE_FXSR_OPT)))
1607 + return 1;
1608 }
1609
1610 if (efer & EFER_SVME) {
1611 struct kvm_cpuid_entry2 *feat;
1612
1613 feat = kvm_find_cpuid_entry(vcpu, 0x80000001, 0);
1614 - if (!feat || !(feat->ecx & bit(X86_FEATURE_SVM))) {
1615 - kvm_inject_gp(vcpu, 0);
1616 - return;
1617 - }
1618 + if (!feat || !(feat->ecx & bit(X86_FEATURE_SVM)))
1619 + return 1;
1620 }
1621
1622 - kvm_x86_ops->set_efer(vcpu, efer);
1623 -
1624 efer &= ~EFER_LMA;
1625 efer |= vcpu->arch.efer & EFER_LMA;
1626
1627 + kvm_x86_ops->set_efer(vcpu, efer);
1628 +
1629 vcpu->arch.efer = efer;
1630
1631 vcpu->arch.mmu.base_role.nxe = (efer & EFER_NX) && !tdp_enabled;
1632 kvm_mmu_reset_context(vcpu);
1633 +
1634 + return 0;
1635 }
1636
1637 void kvm_enable_efer_bits(u64 mask)
1638 @@ -695,14 +689,22 @@ static int do_set_msr(struct kvm_vcpu *vcpu, unsigned index, u64 *data)
1639
1640 static void kvm_write_wall_clock(struct kvm *kvm, gpa_t wall_clock)
1641 {
1642 - static int version;
1643 + int version;
1644 + int r;
1645 struct pvclock_wall_clock wc;
1646 struct timespec boot;
1647
1648 if (!wall_clock)
1649 return;
1650
1651 - version++;
1652 + r = kvm_read_guest(kvm, wall_clock, &version, sizeof(version));
1653 + if (r)
1654 + return;
1655 +
1656 + if (version & 1)
1657 + ++version; /* first time write, random junk */
1658 +
1659 + ++version;
1660
1661 kvm_write_guest(kvm, wall_clock, &version, sizeof(version));
1662
1663 @@ -1086,8 +1088,7 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 data)
1664 {
1665 switch (msr) {
1666 case MSR_EFER:
1667 - set_efer(vcpu, data);
1668 - break;
1669 + return set_efer(vcpu, data);
1670 case MSR_K7_HWCR:
1671 data &= ~(u64)0x40; /* ignore flush filter disable */
1672 if (data != 0) {
1673 @@ -1768,6 +1769,7 @@ static int kvm_vcpu_ioctl_get_cpuid2(struct kvm_vcpu *vcpu,
1674 {
1675 int r;
1676
1677 + vcpu_load(vcpu);
1678 r = -E2BIG;
1679 if (cpuid->nent < vcpu->arch.cpuid_nent)
1680 goto out;
1681 @@ -1779,6 +1781,7 @@ static int kvm_vcpu_ioctl_get_cpuid2(struct kvm_vcpu *vcpu,
1682
1683 out:
1684 cpuid->nent = vcpu->arch.cpuid_nent;
1685 + vcpu_put(vcpu);
1686 return r;
1687 }
1688
1689 @@ -1917,6 +1920,9 @@ static void do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function,
1690 entry->ecx &= kvm_supported_word6_x86_features;
1691 break;
1692 }
1693 +
1694 + kvm_x86_ops->set_supported_cpuid(function, entry);
1695 +
1696 put_cpu();
1697 }
1698
1699 @@ -2031,6 +2037,7 @@ static int kvm_vcpu_ioctl_x86_setup_mce(struct kvm_vcpu *vcpu,
1700 int r;
1701 unsigned bank_num = mcg_cap & 0xff, bank;
1702
1703 + vcpu_load(vcpu);
1704 r = -EINVAL;
1705 if (!bank_num || bank_num >= KVM_MAX_MCE_BANKS)
1706 goto out;
1707 @@ -2045,6 +2052,7 @@ static int kvm_vcpu_ioctl_x86_setup_mce(struct kvm_vcpu *vcpu,
1708 for (bank = 0; bank < bank_num; bank++)
1709 vcpu->arch.mce_banks[bank*4] = ~(u64)0;
1710 out:
1711 + vcpu_put(vcpu);
1712 return r;
1713 }
1714
1715 @@ -2312,7 +2320,9 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
1716 r = -EFAULT;
1717 if (copy_from_user(&mce, argp, sizeof mce))
1718 goto out;
1719 + vcpu_load(vcpu);
1720 r = kvm_vcpu_ioctl_x86_set_mce(vcpu, &mce);
1721 + vcpu_put(vcpu);
1722 break;
1723 }
1724 case KVM_GET_VCPU_EVENTS: {
1725 diff --git a/arch/x86/oprofile/nmi_int.c b/arch/x86/oprofile/nmi_int.c
1726 index 2c505ee..f1fb411 100644
1727 --- a/arch/x86/oprofile/nmi_int.c
1728 +++ b/arch/x86/oprofile/nmi_int.c
1729 @@ -95,7 +95,10 @@ static void nmi_cpu_save_registers(struct op_msrs *msrs)
1730 static void nmi_cpu_start(void *dummy)
1731 {
1732 struct op_msrs const *msrs = &__get_cpu_var(cpu_msrs);
1733 - model->start(msrs);
1734 + if (!msrs->controls)
1735 + WARN_ON_ONCE(1);
1736 + else
1737 + model->start(msrs);
1738 }
1739
1740 static int nmi_start(void)
1741 @@ -107,7 +110,10 @@ static int nmi_start(void)
1742 static void nmi_cpu_stop(void *dummy)
1743 {
1744 struct op_msrs const *msrs = &__get_cpu_var(cpu_msrs);
1745 - model->stop(msrs);
1746 + if (!msrs->controls)
1747 + WARN_ON_ONCE(1);
1748 + else
1749 + model->stop(msrs);
1750 }
1751
1752 static void nmi_stop(void)
1753 diff --git a/arch/x86/xen/suspend.c b/arch/x86/xen/suspend.c
1754 index 987267f..a9c6611 100644
1755 --- a/arch/x86/xen/suspend.c
1756 +++ b/arch/x86/xen/suspend.c
1757 @@ -60,6 +60,6 @@ static void xen_vcpu_notify_restore(void *data)
1758
1759 void xen_arch_resume(void)
1760 {
1761 - smp_call_function(xen_vcpu_notify_restore,
1762 - (void *)CLOCK_EVT_NOTIFY_RESUME, 1);
1763 + on_each_cpu(xen_vcpu_notify_restore,
1764 + (void *)CLOCK_EVT_NOTIFY_RESUME, 1);
1765 }
1766 diff --git a/arch/xtensa/include/asm/cache.h b/arch/xtensa/include/asm/cache.h
1767 index f04c989..ed8cd3c 100644
1768 --- a/arch/xtensa/include/asm/cache.h
1769 +++ b/arch/xtensa/include/asm/cache.h
1770 @@ -29,5 +29,6 @@
1771 # define CACHE_WAY_SIZE ICACHE_WAY_SIZE
1772 #endif
1773
1774 +#define ARCH_KMALLOC_MINALIGN L1_CACHE_BYTES
1775
1776 #endif /* _XTENSA_CACHE_H */
1777 diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c
1778 index 5f127cf..002c0ce 100644
1779 --- a/block/cfq-iosched.c
1780 +++ b/block/cfq-iosched.c
1781 @@ -2503,15 +2503,10 @@ static void cfq_free_io_context(struct io_context *ioc)
1782 __call_for_each_cic(ioc, cic_free_func);
1783 }
1784
1785 -static void cfq_exit_cfqq(struct cfq_data *cfqd, struct cfq_queue *cfqq)
1786 +static void cfq_put_cooperator(struct cfq_queue *cfqq)
1787 {
1788 struct cfq_queue *__cfqq, *next;
1789
1790 - if (unlikely(cfqq == cfqd->active_queue)) {
1791 - __cfq_slice_expired(cfqd, cfqq, 0);
1792 - cfq_schedule_dispatch(cfqd);
1793 - }
1794 -
1795 /*
1796 * If this queue was scheduled to merge with another queue, be
1797 * sure to drop the reference taken on that queue (and others in
1798 @@ -2527,6 +2522,16 @@ static void cfq_exit_cfqq(struct cfq_data *cfqd, struct cfq_queue *cfqq)
1799 cfq_put_queue(__cfqq);
1800 __cfqq = next;
1801 }
1802 +}
1803 +
1804 +static void cfq_exit_cfqq(struct cfq_data *cfqd, struct cfq_queue *cfqq)
1805 +{
1806 + if (unlikely(cfqq == cfqd->active_queue)) {
1807 + __cfq_slice_expired(cfqd, cfqq, 0);
1808 + cfq_schedule_dispatch(cfqd);
1809 + }
1810 +
1811 + cfq_put_cooperator(cfqq);
1812
1813 cfq_put_queue(cfqq);
1814 }
1815 @@ -3470,6 +3475,9 @@ split_cfqq(struct cfq_io_context *cic, struct cfq_queue *cfqq)
1816 }
1817
1818 cic_set_cfqq(cic, NULL, 1);
1819 +
1820 + cfq_put_cooperator(cfqq);
1821 +
1822 cfq_put_queue(cfqq);
1823 return NULL;
1824 }
1825 diff --git a/drivers/acpi/video_detect.c b/drivers/acpi/video_detect.c
1826 index fc2f26b..c5fef01 100644
1827 --- a/drivers/acpi/video_detect.c
1828 +++ b/drivers/acpi/video_detect.c
1829 @@ -250,7 +250,7 @@ static int __init acpi_backlight(char *str)
1830 ACPI_VIDEO_BACKLIGHT_FORCE_VENDOR;
1831 if (!strcmp("video", str))
1832 acpi_video_support |=
1833 - ACPI_VIDEO_OUTPUT_SWITCHING_FORCE_VIDEO;
1834 + ACPI_VIDEO_BACKLIGHT_FORCE_VIDEO;
1835 }
1836 return 1;
1837 }
1838 diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
1839 index 49cffb6..5abab5d 100644
1840 --- a/drivers/ata/libata-core.c
1841 +++ b/drivers/ata/libata-core.c
1842 @@ -160,6 +160,10 @@ int libata_allow_tpm = 0;
1843 module_param_named(allow_tpm, libata_allow_tpm, int, 0444);
1844 MODULE_PARM_DESC(allow_tpm, "Permit the use of TPM commands (0=off [default], 1=on)");
1845
1846 +static int atapi_an;
1847 +module_param(atapi_an, int, 0444);
1848 +MODULE_PARM_DESC(atapi_an, "Enable ATAPI AN media presence notification (0=0ff [default], 1=on)");
1849 +
1850 MODULE_AUTHOR("Jeff Garzik");
1851 MODULE_DESCRIPTION("Library module for ATA devices");
1852 MODULE_LICENSE("GPL");
1853 @@ -2572,7 +2576,8 @@ int ata_dev_configure(struct ata_device *dev)
1854 * to enable ATAPI AN to discern between PHY status
1855 * changed notifications and ATAPI ANs.
1856 */
1857 - if ((ap->flags & ATA_FLAG_AN) && ata_id_has_atapi_AN(id) &&
1858 + if (atapi_an &&
1859 + (ap->flags & ATA_FLAG_AN) && ata_id_has_atapi_AN(id) &&
1860 (!sata_pmp_attached(ap) ||
1861 sata_scr_read(&ap->link, SCR_NOTIFICATION, &sntf) == 0)) {
1862 unsigned int err_mask;
1863 diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c
1864 index e3877b6..4723648 100644
1865 --- a/drivers/ata/libata-sff.c
1866 +++ b/drivers/ata/libata-sff.c
1867 @@ -894,7 +894,7 @@ static void ata_pio_sector(struct ata_queued_cmd *qc)
1868 do_write);
1869 }
1870
1871 - if (!do_write)
1872 + if (!do_write && !PageSlab(page))
1873 flush_dcache_page(page);
1874
1875 qc->curbytes += qc->sect_size;
1876 diff --git a/drivers/ata/sata_nv.c b/drivers/ata/sata_nv.c
1877 index 2a98b09..7f3d179 100644
1878 --- a/drivers/ata/sata_nv.c
1879 +++ b/drivers/ata/sata_nv.c
1880 @@ -1674,7 +1674,6 @@ static void nv_mcp55_freeze(struct ata_port *ap)
1881 mask = readl(mmio_base + NV_INT_ENABLE_MCP55);
1882 mask &= ~(NV_INT_ALL_MCP55 << shift);
1883 writel(mask, mmio_base + NV_INT_ENABLE_MCP55);
1884 - ata_sff_freeze(ap);
1885 }
1886
1887 static void nv_mcp55_thaw(struct ata_port *ap)
1888 @@ -1688,7 +1687,6 @@ static void nv_mcp55_thaw(struct ata_port *ap)
1889 mask = readl(mmio_base + NV_INT_ENABLE_MCP55);
1890 mask |= (NV_INT_MASK_MCP55 << shift);
1891 writel(mask, mmio_base + NV_INT_ENABLE_MCP55);
1892 - ata_sff_thaw(ap);
1893 }
1894
1895 static void nv_adma_error_handler(struct ata_port *ap)
1896 @@ -2479,8 +2477,7 @@ static int nv_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
1897 }
1898
1899 pci_set_master(pdev);
1900 - return ata_host_activate(host, pdev->irq, ipriv->irq_handler,
1901 - IRQF_SHARED, ipriv->sht);
1902 + return ata_pci_sff_activate_host(host, ipriv->irq_handler, ipriv->sht);
1903 }
1904
1905 #ifdef CONFIG_PM
1906 diff --git a/drivers/ata/sata_via.c b/drivers/ata/sata_via.c
1907 index 08f6549..0553455 100644
1908 --- a/drivers/ata/sata_via.c
1909 +++ b/drivers/ata/sata_via.c
1910 @@ -575,6 +575,19 @@ static void svia_configure(struct pci_dev *pdev)
1911 tmp8 |= NATIVE_MODE_ALL;
1912 pci_write_config_byte(pdev, SATA_NATIVE_MODE, tmp8);
1913 }
1914 +
1915 + /*
1916 + * vt6421 has problems talking to some drives. The following
1917 + * is the magic fix from Joseph Chan <JosephChan@via.com.tw>.
1918 + * Please add proper documentation if possible.
1919 + *
1920 + * https://bugzilla.kernel.org/show_bug.cgi?id=15173
1921 + */
1922 + if (pdev->device == 0x3249) {
1923 + pci_read_config_byte(pdev, 0x52, &tmp8);
1924 + tmp8 |= 1 << 2;
1925 + pci_write_config_byte(pdev, 0x52, tmp8);
1926 + }
1927 }
1928
1929 static int svia_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
1930 diff --git a/drivers/base/cpu.c b/drivers/base/cpu.c
1931 index f35719a..251acea 100644
1932 --- a/drivers/base/cpu.c
1933 +++ b/drivers/base/cpu.c
1934 @@ -186,7 +186,7 @@ static ssize_t print_cpus_offline(struct sysdev_class *class,
1935 /* display offline cpus < nr_cpu_ids */
1936 if (!alloc_cpumask_var(&offline, GFP_KERNEL))
1937 return -ENOMEM;
1938 - cpumask_complement(offline, cpu_online_mask);
1939 + cpumask_andnot(offline, cpu_possible_mask, cpu_online_mask);
1940 n = cpulist_scnprintf(buf, len, offline);
1941 free_cpumask_var(offline);
1942
1943 diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c
1944 index 4462b11..9ead05d 100644
1945 --- a/drivers/char/ipmi/ipmi_si_intf.c
1946 +++ b/drivers/char/ipmi/ipmi_si_intf.c
1947 @@ -314,9 +314,14 @@ static void deliver_recv_msg(struct smi_info *smi_info,
1948 {
1949 /* Deliver the message to the upper layer with the lock
1950 released. */
1951 - spin_unlock(&(smi_info->si_lock));
1952 - ipmi_smi_msg_received(smi_info->intf, msg);
1953 - spin_lock(&(smi_info->si_lock));
1954 +
1955 + if (smi_info->run_to_completion) {
1956 + ipmi_smi_msg_received(smi_info->intf, msg);
1957 + } else {
1958 + spin_unlock(&(smi_info->si_lock));
1959 + ipmi_smi_msg_received(smi_info->intf, msg);
1960 + spin_lock(&(smi_info->si_lock));
1961 + }
1962 }
1963
1964 static void return_hosed_msg(struct smi_info *smi_info, int cCode)
1965 diff --git a/drivers/clocksource/sh_cmt.c b/drivers/clocksource/sh_cmt.c
1966 index 744f748..a860ec0 100644
1967 --- a/drivers/clocksource/sh_cmt.c
1968 +++ b/drivers/clocksource/sh_cmt.c
1969 @@ -413,18 +413,10 @@ static cycle_t sh_cmt_clocksource_read(struct clocksource *cs)
1970 static int sh_cmt_clocksource_enable(struct clocksource *cs)
1971 {
1972 struct sh_cmt_priv *p = cs_to_sh_cmt(cs);
1973 - int ret;
1974
1975 p->total_cycles = 0;
1976
1977 - ret = sh_cmt_start(p, FLAG_CLOCKSOURCE);
1978 - if (ret)
1979 - return ret;
1980 -
1981 - /* TODO: calculate good shift from rate and counter bit width */
1982 - cs->shift = 0;
1983 - cs->mult = clocksource_hz2mult(p->rate, cs->shift);
1984 - return 0;
1985 + return sh_cmt_start(p, FLAG_CLOCKSOURCE);
1986 }
1987
1988 static void sh_cmt_clocksource_disable(struct clocksource *cs)
1989 @@ -451,7 +443,18 @@ static int sh_cmt_register_clocksource(struct sh_cmt_priv *p,
1990 cs->resume = sh_cmt_clocksource_resume;
1991 cs->mask = CLOCKSOURCE_MASK(sizeof(unsigned long) * 8);
1992 cs->flags = CLOCK_SOURCE_IS_CONTINUOUS;
1993 +
1994 + /* clk_get_rate() needs an enabled clock */
1995 + clk_enable(p->clk);
1996 + p->rate = clk_get_rate(p->clk) / (p->width == 16) ? 512 : 8;
1997 + clk_disable(p->clk);
1998 +
1999 + /* TODO: calculate good shift from rate and counter bit width */
2000 + cs->shift = 10;
2001 + cs->mult = clocksource_hz2mult(p->rate, cs->shift);
2002 +
2003 pr_info("sh_cmt: %s used as clock source\n", cs->name);
2004 +
2005 clocksource_register(cs);
2006 return 0;
2007 }
2008 diff --git a/drivers/clocksource/sh_tmu.c b/drivers/clocksource/sh_tmu.c
2009 index fc9ff1e..7a24160 100644
2010 --- a/drivers/clocksource/sh_tmu.c
2011 +++ b/drivers/clocksource/sh_tmu.c
2012 @@ -200,16 +200,8 @@ static cycle_t sh_tmu_clocksource_read(struct clocksource *cs)
2013 static int sh_tmu_clocksource_enable(struct clocksource *cs)
2014 {
2015 struct sh_tmu_priv *p = cs_to_sh_tmu(cs);
2016 - int ret;
2017 -
2018 - ret = sh_tmu_enable(p);
2019 - if (ret)
2020 - return ret;
2021
2022 - /* TODO: calculate good shift from rate and counter bit width */
2023 - cs->shift = 10;
2024 - cs->mult = clocksource_hz2mult(p->rate, cs->shift);
2025 - return 0;
2026 + return sh_tmu_enable(p);
2027 }
2028
2029 static void sh_tmu_clocksource_disable(struct clocksource *cs)
2030 @@ -229,6 +221,16 @@ static int sh_tmu_register_clocksource(struct sh_tmu_priv *p,
2031 cs->disable = sh_tmu_clocksource_disable;
2032 cs->mask = CLOCKSOURCE_MASK(32);
2033 cs->flags = CLOCK_SOURCE_IS_CONTINUOUS;
2034 +
2035 + /* clk_get_rate() needs an enabled clock */
2036 + clk_enable(p->clk);
2037 + /* channel will be configured at parent clock / 4 */
2038 + p->rate = clk_get_rate(p->clk) / 4;
2039 + clk_disable(p->clk);
2040 + /* TODO: calculate good shift from rate and counter bit width */
2041 + cs->shift = 10;
2042 + cs->mult = clocksource_hz2mult(p->rate, cs->shift);
2043 +
2044 pr_info("sh_tmu: %s used as clock source\n", cs->name);
2045 clocksource_register(cs);
2046 return 0;
2047 diff --git a/drivers/firewire/core-card.c b/drivers/firewire/core-card.c
2048 index 5045156..991447b 100644
2049 --- a/drivers/firewire/core-card.c
2050 +++ b/drivers/firewire/core-card.c
2051 @@ -231,7 +231,7 @@ void fw_schedule_bm_work(struct fw_card *card, unsigned long delay)
2052 static void fw_card_bm_work(struct work_struct *work)
2053 {
2054 struct fw_card *card = container_of(work, struct fw_card, work.work);
2055 - struct fw_device *root_device;
2056 + struct fw_device *root_device, *irm_device;
2057 struct fw_node *root_node;
2058 unsigned long flags;
2059 int root_id, new_root_id, irm_id, local_id;
2060 @@ -239,6 +239,7 @@ static void fw_card_bm_work(struct work_struct *work)
2061 bool do_reset = false;
2062 bool root_device_is_running;
2063 bool root_device_is_cmc;
2064 + bool irm_is_1394_1995_only;
2065
2066 spin_lock_irqsave(&card->lock, flags);
2067
2068 @@ -248,12 +249,18 @@ static void fw_card_bm_work(struct work_struct *work)
2069 }
2070
2071 generation = card->generation;
2072 +
2073 root_node = card->root_node;
2074 fw_node_get(root_node);
2075 root_device = root_node->data;
2076 root_device_is_running = root_device &&
2077 atomic_read(&root_device->state) == FW_DEVICE_RUNNING;
2078 root_device_is_cmc = root_device && root_device->cmc;
2079 +
2080 + irm_device = card->irm_node->data;
2081 + irm_is_1394_1995_only = irm_device && irm_device->config_rom &&
2082 + (irm_device->config_rom[2] & 0x000000f0) == 0;
2083 +
2084 root_id = root_node->node_id;
2085 irm_id = card->irm_node->node_id;
2086 local_id = card->local_node->node_id;
2087 @@ -276,8 +283,15 @@ static void fw_card_bm_work(struct work_struct *work)
2088
2089 if (!card->irm_node->link_on) {
2090 new_root_id = local_id;
2091 - fw_notify("IRM has link off, making local node (%02x) root.\n",
2092 - new_root_id);
2093 + fw_notify("%s, making local node (%02x) root.\n",
2094 + "IRM has link off", new_root_id);
2095 + goto pick_me;
2096 + }
2097 +
2098 + if (irm_is_1394_1995_only) {
2099 + new_root_id = local_id;
2100 + fw_notify("%s, making local node (%02x) root.\n",
2101 + "IRM is not 1394a compliant", new_root_id);
2102 goto pick_me;
2103 }
2104
2105 @@ -316,8 +330,8 @@ static void fw_card_bm_work(struct work_struct *work)
2106 * root, and thus, IRM.
2107 */
2108 new_root_id = local_id;
2109 - fw_notify("BM lock failed, making local node (%02x) root.\n",
2110 - new_root_id);
2111 + fw_notify("%s, making local node (%02x) root.\n",
2112 + "BM lock failed", new_root_id);
2113 goto pick_me;
2114 }
2115 } else if (card->bm_generation != generation) {
2116 diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
2117 index 18f41d7..10348d3 100644
2118 --- a/drivers/gpu/drm/drm_edid.c
2119 +++ b/drivers/gpu/drm/drm_edid.c
2120 @@ -335,7 +335,7 @@ static struct drm_display_mode drm_dmt_modes[] = {
2121 DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
2122 /* 1024x768@85Hz */
2123 { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 94500, 1024, 1072,
2124 - 1072, 1376, 0, 768, 769, 772, 808, 0,
2125 + 1168, 1376, 0, 768, 769, 772, 808, 0,
2126 DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
2127 /* 1152x864@75Hz */
2128 { DRM_MODE("1152x864", DRM_MODE_TYPE_DRIVER, 108000, 1152, 1216,
2129 diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
2130 index ef3d91d..691701a 100644
2131 --- a/drivers/gpu/drm/i915/i915_gem.c
2132 +++ b/drivers/gpu/drm/i915/i915_gem.c
2133 @@ -2688,6 +2688,14 @@ i915_gem_object_bind_to_gtt(struct drm_gem_object *obj, unsigned alignment)
2134 return -EINVAL;
2135 }
2136
2137 + /* If the object is bigger than the entire aperture, reject it early
2138 + * before evicting everything in a vain attempt to find space.
2139 + */
2140 + if (obj->size > dev->gtt_total) {
2141 + DRM_ERROR("Attempting to bind an object larger than the aperture\n");
2142 + return -E2BIG;
2143 + }
2144 +
2145 search_free:
2146 free_space = drm_mm_search_free(&dev_priv->mm.gtt_space,
2147 obj->size, alignment, 0);
2148 @@ -4231,6 +4239,17 @@ i915_gem_object_pin(struct drm_gem_object *obj, uint32_t alignment)
2149 int ret;
2150
2151 i915_verify_inactive(dev, __FILE__, __LINE__);
2152 +
2153 + if (obj_priv->gtt_space != NULL) {
2154 + if (alignment == 0)
2155 + alignment = i915_gem_get_gtt_alignment(obj);
2156 + if (obj_priv->gtt_offset & (alignment - 1)) {
2157 + ret = i915_gem_object_unbind(obj);
2158 + if (ret)
2159 + return ret;
2160 + }
2161 + }
2162 +
2163 if (obj_priv->gtt_space == NULL) {
2164 ret = i915_gem_object_bind_to_gtt(obj, alignment);
2165 if (ret)
2166 diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
2167 index c7502b6..70765cf 100644
2168 --- a/drivers/gpu/drm/i915/intel_display.c
2169 +++ b/drivers/gpu/drm/i915/intel_display.c
2170 @@ -4155,12 +4155,6 @@ void intel_finish_page_flip(struct drm_device *dev, int pipe)
2171 spin_lock_irqsave(&dev->event_lock, flags);
2172 work = intel_crtc->unpin_work;
2173 if (work == NULL || !work->pending) {
2174 - if (work && !work->pending) {
2175 - obj_priv = to_intel_bo(work->pending_flip_obj);
2176 - DRM_DEBUG_DRIVER("flip finish: %p (%d) not pending?\n",
2177 - obj_priv,
2178 - atomic_read(&obj_priv->pending_flip));
2179 - }
2180 spin_unlock_irqrestore(&dev->event_lock, flags);
2181 return;
2182 }
2183 diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
2184 index 77e40cf..7c28ff1 100644
2185 --- a/drivers/gpu/drm/i915/intel_dp.c
2186 +++ b/drivers/gpu/drm/i915/intel_dp.c
2187 @@ -1180,16 +1180,6 @@ intel_dp_detect(struct drm_connector *connector)
2188 if (HAS_PCH_SPLIT(dev))
2189 return ironlake_dp_detect(connector);
2190
2191 - temp = I915_READ(PORT_HOTPLUG_EN);
2192 -
2193 - I915_WRITE(PORT_HOTPLUG_EN,
2194 - temp |
2195 - DPB_HOTPLUG_INT_EN |
2196 - DPC_HOTPLUG_INT_EN |
2197 - DPD_HOTPLUG_INT_EN);
2198 -
2199 - POSTING_READ(PORT_HOTPLUG_EN);
2200 -
2201 switch (dp_priv->output_reg) {
2202 case DP_B:
2203 bit = DPB_HOTPLUG_INT_STATUS;
2204 diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
2205 index 034218c..4c7204a 100644
2206 --- a/drivers/gpu/drm/radeon/radeon.h
2207 +++ b/drivers/gpu/drm/radeon/radeon.h
2208 @@ -566,6 +566,7 @@ typedef int (*radeon_packet3_check_t)(struct radeon_cs_parser *p,
2209 */
2210 int radeon_agp_init(struct radeon_device *rdev);
2211 void radeon_agp_resume(struct radeon_device *rdev);
2212 +void radeon_agp_suspend(struct radeon_device *rdev);
2213 void radeon_agp_fini(struct radeon_device *rdev);
2214
2215
2216 diff --git a/drivers/gpu/drm/radeon/radeon_agp.c b/drivers/gpu/drm/radeon/radeon_agp.c
2217 index 28e473f..f40dfb7 100644
2218 --- a/drivers/gpu/drm/radeon/radeon_agp.c
2219 +++ b/drivers/gpu/drm/radeon/radeon_agp.c
2220 @@ -270,3 +270,8 @@ void radeon_agp_fini(struct radeon_device *rdev)
2221 }
2222 #endif
2223 }
2224 +
2225 +void radeon_agp_suspend(struct radeon_device *rdev)
2226 +{
2227 + radeon_agp_fini(rdev);
2228 +}
2229 diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c
2230 index 9916d82..1a4fa9b 100644
2231 --- a/drivers/gpu/drm/radeon/radeon_atombios.c
2232 +++ b/drivers/gpu/drm/radeon/radeon_atombios.c
2233 @@ -530,6 +530,8 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev)
2234 }
2235
2236 /* look up gpio for ddc, hpd */
2237 + ddc_bus.valid = false;
2238 + hpd.hpd = RADEON_HPD_NONE;
2239 if ((le16_to_cpu(path->usDeviceTag) &
2240 (ATOM_DEVICE_TV_SUPPORT | ATOM_DEVICE_CV_SUPPORT)) == 0) {
2241 for (j = 0; j < con_obj->ucNumberOfObjects; j++) {
2242 @@ -585,9 +587,6 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev)
2243 break;
2244 }
2245 }
2246 - } else {
2247 - hpd.hpd = RADEON_HPD_NONE;
2248 - ddc_bus.valid = false;
2249 }
2250
2251 /* needed for aux chan transactions */
2252 @@ -1174,7 +1173,7 @@ struct radeon_encoder_atom_dig *radeon_atombios_get_lvds_info(struct
2253 lvds->native_mode.vtotal = lvds->native_mode.vdisplay +
2254 le16_to_cpu(lvds_info->info.sLCDTiming.usVBlanking_Time);
2255 lvds->native_mode.vsync_start = lvds->native_mode.vdisplay +
2256 - le16_to_cpu(lvds_info->info.sLCDTiming.usVSyncWidth);
2257 + le16_to_cpu(lvds_info->info.sLCDTiming.usVSyncOffset);
2258 lvds->native_mode.vsync_end = lvds->native_mode.vsync_start +
2259 le16_to_cpu(lvds_info->info.sLCDTiming.usVSyncWidth);
2260 lvds->panel_pwr_delay =
2261 diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c
2262 index 7b629e3..ed6a724 100644
2263 --- a/drivers/gpu/drm/radeon/radeon_device.c
2264 +++ b/drivers/gpu/drm/radeon/radeon_device.c
2265 @@ -748,6 +748,8 @@ int radeon_suspend_kms(struct drm_device *dev, pm_message_t state)
2266 /* evict remaining vram memory */
2267 radeon_bo_evict_vram(rdev);
2268
2269 + radeon_agp_suspend(rdev);
2270 +
2271 pci_save_state(dev->pdev);
2272 if (state.event == PM_EVENT_SUSPEND) {
2273 /* Shut down the device */
2274 diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c
2275 index bb1c122..c2848e0 100644
2276 --- a/drivers/gpu/drm/radeon/radeon_display.c
2277 +++ b/drivers/gpu/drm/radeon/radeon_display.c
2278 @@ -978,8 +978,11 @@ void radeon_update_display_priority(struct radeon_device *rdev)
2279 /* set display priority to high for r3xx, rv515 chips
2280 * this avoids flickering due to underflow to the
2281 * display controllers during heavy acceleration.
2282 + * Don't force high on rs4xx igp chips as it seems to
2283 + * affect the sound card. See kernel bug 15982.
2284 */
2285 - if (ASIC_IS_R300(rdev) || (rdev->family == CHIP_RV515))
2286 + if ((ASIC_IS_R300(rdev) || (rdev->family == CHIP_RV515)) &&
2287 + !(rdev->flags & RADEON_IS_IGP))
2288 rdev->disp_priority = 2;
2289 else
2290 rdev->disp_priority = 0;
2291 diff --git a/drivers/gpu/drm/radeon/radeon_state.c b/drivers/gpu/drm/radeon/radeon_state.c
2292 index cc5316d..b3ba44c 100644
2293 --- a/drivers/gpu/drm/radeon/radeon_state.c
2294 +++ b/drivers/gpu/drm/radeon/radeon_state.c
2295 @@ -900,9 +900,10 @@ static void radeon_cp_dispatch_clear(struct drm_device * dev,
2296 flags |= RADEON_FRONT;
2297 }
2298 if (flags & (RADEON_DEPTH|RADEON_STENCIL)) {
2299 - if (!dev_priv->have_z_offset)
2300 + if (!dev_priv->have_z_offset) {
2301 printk_once(KERN_ERR "radeon: illegal depth clear request. Buggy mesa detected - please update.\n");
2302 - flags &= ~(RADEON_DEPTH | RADEON_STENCIL);
2303 + flags &= ~(RADEON_DEPTH | RADEON_STENCIL);
2304 + }
2305 }
2306
2307 if (flags & (RADEON_FRONT | RADEON_BACK)) {
2308 diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
2309 index 143e788..0010efa 100644
2310 --- a/drivers/hid/hid-core.c
2311 +++ b/drivers/hid/hid-core.c
2312 @@ -1305,6 +1305,7 @@ static const struct hid_device_id hid_blacklist[] = {
2313 { HID_USB_DEVICE(USB_VENDOR_ID_GREENASIA, 0x0012) },
2314 { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE) },
2315 { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE_2) },
2316 + { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE_3) },
2317 { HID_USB_DEVICE(USB_VENDOR_ID_KENSINGTON, USB_DEVICE_ID_KS_SLIMBLADE) },
2318 { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_ERGO_525V) },
2319 { HID_USB_DEVICE(USB_VENDOR_ID_LABTEC, USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD) },
2320 diff --git a/drivers/hid/hid-gyration.c b/drivers/hid/hid-gyration.c
2321 index 62416e6..3975e03 100644
2322 --- a/drivers/hid/hid-gyration.c
2323 +++ b/drivers/hid/hid-gyration.c
2324 @@ -73,6 +73,7 @@ static int gyration_event(struct hid_device *hdev, struct hid_field *field,
2325 static const struct hid_device_id gyration_devices[] = {
2326 { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE) },
2327 { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE_2) },
2328 + { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE_3) },
2329 { }
2330 };
2331 MODULE_DEVICE_TABLE(hid, gyration_devices);
2332 diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
2333 index 09d2764..b681cbf 100644
2334 --- a/drivers/hid/hid-ids.h
2335 +++ b/drivers/hid/hid-ids.h
2336 @@ -267,6 +267,7 @@
2337 #define USB_VENDOR_ID_GYRATION 0x0c16
2338 #define USB_DEVICE_ID_GYRATION_REMOTE 0x0002
2339 #define USB_DEVICE_ID_GYRATION_REMOTE_2 0x0003
2340 +#define USB_DEVICE_ID_GYRATION_REMOTE_3 0x0008
2341
2342 #define USB_VENDOR_ID_HAPP 0x078b
2343 #define USB_DEVICE_ID_UGCI_DRIVING 0x0010
2344 diff --git a/drivers/hwmon/ltc4245.c b/drivers/hwmon/ltc4245.c
2345 index 65c232a..21d201b 100644
2346 --- a/drivers/hwmon/ltc4245.c
2347 +++ b/drivers/hwmon/ltc4245.c
2348 @@ -45,9 +45,7 @@ enum ltc4245_cmd {
2349 LTC4245_VEEIN = 0x19,
2350 LTC4245_VEESENSE = 0x1a,
2351 LTC4245_VEEOUT = 0x1b,
2352 - LTC4245_GPIOADC1 = 0x1c,
2353 - LTC4245_GPIOADC2 = 0x1d,
2354 - LTC4245_GPIOADC3 = 0x1e,
2355 + LTC4245_GPIOADC = 0x1c,
2356 };
2357
2358 struct ltc4245_data {
2359 @@ -61,7 +59,7 @@ struct ltc4245_data {
2360 u8 cregs[0x08];
2361
2362 /* Voltage registers */
2363 - u8 vregs[0x0f];
2364 + u8 vregs[0x0d];
2365 };
2366
2367 static struct ltc4245_data *ltc4245_update_device(struct device *dev)
2368 @@ -86,7 +84,7 @@ static struct ltc4245_data *ltc4245_update_device(struct device *dev)
2369 data->cregs[i] = val;
2370 }
2371
2372 - /* Read voltage registers -- 0x10 to 0x1f */
2373 + /* Read voltage registers -- 0x10 to 0x1c */
2374 for (i = 0; i < ARRAY_SIZE(data->vregs); i++) {
2375 val = i2c_smbus_read_byte_data(client, i+0x10);
2376 if (unlikely(val < 0))
2377 @@ -128,9 +126,7 @@ static int ltc4245_get_voltage(struct device *dev, u8 reg)
2378 case LTC4245_VEEOUT:
2379 voltage = regval * -55;
2380 break;
2381 - case LTC4245_GPIOADC1:
2382 - case LTC4245_GPIOADC2:
2383 - case LTC4245_GPIOADC3:
2384 + case LTC4245_GPIOADC:
2385 voltage = regval * 10;
2386 break;
2387 default:
2388 @@ -297,9 +293,7 @@ LTC4245_ALARM(in7_min_alarm, (1 << 2), LTC4245_FAULT2);
2389 LTC4245_ALARM(in8_min_alarm, (1 << 3), LTC4245_FAULT2);
2390
2391 /* GPIO voltages */
2392 -LTC4245_VOLTAGE(in9_input, LTC4245_GPIOADC1);
2393 -LTC4245_VOLTAGE(in10_input, LTC4245_GPIOADC2);
2394 -LTC4245_VOLTAGE(in11_input, LTC4245_GPIOADC3);
2395 +LTC4245_VOLTAGE(in9_input, LTC4245_GPIOADC);
2396
2397 /* Power Consumption (virtual) */
2398 LTC4245_POWER(power1_input, LTC4245_12VSENSE);
2399 @@ -342,8 +336,6 @@ static struct attribute *ltc4245_attributes[] = {
2400 &sensor_dev_attr_in8_min_alarm.dev_attr.attr,
2401
2402 &sensor_dev_attr_in9_input.dev_attr.attr,
2403 - &sensor_dev_attr_in10_input.dev_attr.attr,
2404 - &sensor_dev_attr_in11_input.dev_attr.attr,
2405
2406 &sensor_dev_attr_power1_input.dev_attr.attr,
2407 &sensor_dev_attr_power2_input.dev_attr.attr,
2408 diff --git a/drivers/md/linear.c b/drivers/md/linear.c
2409 index 09437e9..0a1042b 100644
2410 --- a/drivers/md/linear.c
2411 +++ b/drivers/md/linear.c
2412 @@ -282,6 +282,7 @@ static int linear_stop (mddev_t *mddev)
2413 rcu_barrier();
2414 blk_sync_queue(mddev->queue); /* the unplug fn references 'conf'*/
2415 kfree(conf);
2416 + mddev->private = NULL;
2417
2418 return 0;
2419 }
2420 diff --git a/drivers/md/md.c b/drivers/md/md.c
2421 index cefd63d..336792e 100644
2422 --- a/drivers/md/md.c
2423 +++ b/drivers/md/md.c
2424 @@ -508,9 +508,36 @@ static inline int mddev_trylock(mddev_t * mddev)
2425 return mutex_trylock(&mddev->reconfig_mutex);
2426 }
2427
2428 -static inline void mddev_unlock(mddev_t * mddev)
2429 -{
2430 - mutex_unlock(&mddev->reconfig_mutex);
2431 +static struct attribute_group md_redundancy_group;
2432 +
2433 +static void mddev_unlock(mddev_t * mddev)
2434 +{
2435 + if (mddev->to_remove) {
2436 + /* These cannot be removed under reconfig_mutex as
2437 + * an access to the files will try to take reconfig_mutex
2438 + * while holding the file unremovable, which leads to
2439 + * a deadlock.
2440 + * So hold open_mutex instead - we are allowed to take
2441 + * it while holding reconfig_mutex, and md_run can
2442 + * use it to wait for the remove to complete.
2443 + */
2444 + struct attribute_group *to_remove = mddev->to_remove;
2445 + mddev->to_remove = NULL;
2446 + mutex_lock(&mddev->open_mutex);
2447 + mutex_unlock(&mddev->reconfig_mutex);
2448 +
2449 + if (to_remove != &md_redundancy_group)
2450 + sysfs_remove_group(&mddev->kobj, to_remove);
2451 + if (mddev->pers == NULL ||
2452 + mddev->pers->sync_request == NULL) {
2453 + sysfs_remove_group(&mddev->kobj, &md_redundancy_group);
2454 + if (mddev->sysfs_action)
2455 + sysfs_put(mddev->sysfs_action);
2456 + mddev->sysfs_action = NULL;
2457 + }
2458 + mutex_unlock(&mddev->open_mutex);
2459 + } else
2460 + mutex_unlock(&mddev->reconfig_mutex);
2461
2462 md_wakeup_thread(mddev->thread);
2463 }
2464 @@ -2980,6 +3007,23 @@ level_store(mddev_t *mddev, const char *buf, size_t len)
2465 /* Looks like we have a winner */
2466 mddev_suspend(mddev);
2467 mddev->pers->stop(mddev);
2468 +
2469 + if (mddev->pers->sync_request == NULL &&
2470 + pers->sync_request != NULL) {
2471 + /* need to add the md_redundancy_group */
2472 + if (sysfs_create_group(&mddev->kobj, &md_redundancy_group))
2473 + printk(KERN_WARNING
2474 + "md: cannot register extra attributes for %s\n",
2475 + mdname(mddev));
2476 + mddev->sysfs_action = sysfs_get_dirent(mddev->kobj.sd, "sync_action");
2477 + }
2478 + if (mddev->pers->sync_request != NULL &&
2479 + pers->sync_request == NULL) {
2480 + /* need to remove the md_redundancy_group */
2481 + if (mddev->to_remove == NULL)
2482 + mddev->to_remove = &md_redundancy_group;
2483 + }
2484 +
2485 module_put(mddev->pers->owner);
2486 /* Invalidate devices that are now superfluous */
2487 list_for_each_entry(rdev, &mddev->disks, same_set)
2488 @@ -4082,15 +4126,6 @@ static void mddev_delayed_delete(struct work_struct *ws)
2489 {
2490 mddev_t *mddev = container_of(ws, mddev_t, del_work);
2491
2492 - if (mddev->private) {
2493 - sysfs_remove_group(&mddev->kobj, &md_redundancy_group);
2494 - if (mddev->private != (void*)1)
2495 - sysfs_remove_group(&mddev->kobj, mddev->private);
2496 - if (mddev->sysfs_action)
2497 - sysfs_put(mddev->sysfs_action);
2498 - mddev->sysfs_action = NULL;
2499 - mddev->private = NULL;
2500 - }
2501 sysfs_remove_group(&mddev->kobj, &md_bitmap_group);
2502 kobject_del(&mddev->kobj);
2503 kobject_put(&mddev->kobj);
2504 @@ -4248,6 +4283,13 @@ static int do_md_run(mddev_t * mddev)
2505 if (mddev->pers)
2506 return -EBUSY;
2507
2508 + /* These two calls synchronise us with the
2509 + * sysfs_remove_group calls in mddev_unlock,
2510 + * so they must have completed.
2511 + */
2512 + mutex_lock(&mddev->open_mutex);
2513 + mutex_unlock(&mddev->open_mutex);
2514 +
2515 /*
2516 * Analyze all RAID superblock(s)
2517 */
2518 @@ -4536,8 +4578,8 @@ static int do_md_stop(mddev_t * mddev, int mode, int is_open)
2519 mddev->queue->unplug_fn = NULL;
2520 mddev->queue->backing_dev_info.congested_fn = NULL;
2521 module_put(mddev->pers->owner);
2522 - if (mddev->pers->sync_request && mddev->private == NULL)
2523 - mddev->private = (void*)1;
2524 + if (mddev->pers->sync_request && mddev->to_remove == NULL)
2525 + mddev->to_remove = &md_redundancy_group;
2526 mddev->pers = NULL;
2527 /* tell userspace to handle 'inactive' */
2528 sysfs_notify_dirent(mddev->sysfs_state);
2529 @@ -5496,6 +5538,7 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode,
2530 int err = 0;
2531 void __user *argp = (void __user *)arg;
2532 mddev_t *mddev = NULL;
2533 + int ro;
2534
2535 if (!capable(CAP_SYS_ADMIN))
2536 return -EACCES;
2537 @@ -5631,6 +5674,34 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode,
2538 err = do_md_stop(mddev, 1, 1);
2539 goto done_unlock;
2540
2541 + case BLKROSET:
2542 + if (get_user(ro, (int __user *)(arg))) {
2543 + err = -EFAULT;
2544 + goto done_unlock;
2545 + }
2546 + err = -EINVAL;
2547 +
2548 + /* if the bdev is going readonly the value of mddev->ro
2549 + * does not matter, no writes are coming
2550 + */
2551 + if (ro)
2552 + goto done_unlock;
2553 +
2554 + /* are we are already prepared for writes? */
2555 + if (mddev->ro != 1)
2556 + goto done_unlock;
2557 +
2558 + /* transitioning to readauto need only happen for
2559 + * arrays that call md_write_start
2560 + */
2561 + if (mddev->pers) {
2562 + err = restart_array(mddev);
2563 + if (err == 0) {
2564 + mddev->ro = 2;
2565 + set_disk_ro(mddev->gendisk, 0);
2566 + }
2567 + }
2568 + goto done_unlock;
2569 }
2570
2571 /*
2572 diff --git a/drivers/md/md.h b/drivers/md/md.h
2573 index 8e4c75c..722f5df 100644
2574 --- a/drivers/md/md.h
2575 +++ b/drivers/md/md.h
2576 @@ -305,6 +305,7 @@ struct mddev_s
2577 atomic_t max_corr_read_errors; /* max read retries */
2578 struct list_head all_mddevs;
2579
2580 + struct attribute_group *to_remove;
2581 /* Generic barrier handling.
2582 * If there is a pending barrier request, all other
2583 * writes are blocked while the devices are flushed.
2584 diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
2585 index e59b10e..84d3bf0 100644
2586 --- a/drivers/md/raid1.c
2587 +++ b/drivers/md/raid1.c
2588 @@ -418,7 +418,7 @@ static void raid1_end_write_request(struct bio *bio, int error)
2589 */
2590 static int read_balance(conf_t *conf, r1bio_t *r1_bio)
2591 {
2592 - const unsigned long this_sector = r1_bio->sector;
2593 + const sector_t this_sector = r1_bio->sector;
2594 int new_disk = conf->last_used, disk = new_disk;
2595 int wonly_disk = -1;
2596 const int sectors = r1_bio->sectors;
2597 @@ -434,7 +434,7 @@ static int read_balance(conf_t *conf, r1bio_t *r1_bio)
2598 retry:
2599 if (conf->mddev->recovery_cp < MaxSector &&
2600 (this_sector + sectors >= conf->next_resync)) {
2601 - /* Choose the first operation device, for consistancy */
2602 + /* Choose the first operational device, for consistancy */
2603 new_disk = 0;
2604
2605 for (rdev = rcu_dereference(conf->mirrors[new_disk].rdev);
2606 @@ -912,9 +912,10 @@ static int make_request(struct request_queue *q, struct bio * bio)
2607 if (test_bit(Faulty, &rdev->flags)) {
2608 rdev_dec_pending(rdev, mddev);
2609 r1_bio->bios[i] = NULL;
2610 - } else
2611 + } else {
2612 r1_bio->bios[i] = bio;
2613 - targets++;
2614 + targets++;
2615 + }
2616 } else
2617 r1_bio->bios[i] = NULL;
2618 }
2619 diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
2620 index e2766d8..ad945cc 100644
2621 --- a/drivers/md/raid10.c
2622 +++ b/drivers/md/raid10.c
2623 @@ -494,7 +494,7 @@ static int raid10_mergeable_bvec(struct request_queue *q,
2624 */
2625 static int read_balance(conf_t *conf, r10bio_t *r10_bio)
2626 {
2627 - const unsigned long this_sector = r10_bio->sector;
2628 + const sector_t this_sector = r10_bio->sector;
2629 int disk, slot, nslot;
2630 const int sectors = r10_bio->sectors;
2631 sector_t new_distance, current_distance;
2632 diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
2633 index 15348c3..6af0a6d 100644
2634 --- a/drivers/md/raid5.c
2635 +++ b/drivers/md/raid5.c
2636 @@ -5087,7 +5087,9 @@ static int run(mddev_t *mddev)
2637 }
2638
2639 /* Ok, everything is just fine now */
2640 - if (sysfs_create_group(&mddev->kobj, &raid5_attrs_group))
2641 + if (mddev->to_remove == &raid5_attrs_group)
2642 + mddev->to_remove = NULL;
2643 + else if (sysfs_create_group(&mddev->kobj, &raid5_attrs_group))
2644 printk(KERN_WARNING
2645 "raid5: failed to create sysfs attributes for %s\n",
2646 mdname(mddev));
2647 @@ -5134,7 +5136,8 @@ static int stop(mddev_t *mddev)
2648 mddev->queue->backing_dev_info.congested_fn = NULL;
2649 blk_sync_queue(mddev->queue); /* the unplug fn references 'conf'*/
2650 free_conf(conf);
2651 - mddev->private = &raid5_attrs_group;
2652 + mddev->private = NULL;
2653 + mddev->to_remove = &raid5_attrs_group;
2654 return 0;
2655 }
2656
2657 diff --git a/drivers/media/video/uvc/uvc_ctrl.c b/drivers/media/video/uvc/uvc_ctrl.c
2658 index 6d3850b..2194da5 100644
2659 --- a/drivers/media/video/uvc/uvc_ctrl.c
2660 +++ b/drivers/media/video/uvc/uvc_ctrl.c
2661 @@ -1047,6 +1047,8 @@ int uvc_ctrl_set(struct uvc_video_chain *chain,
2662 uvc_ctrl_data(ctrl, UVC_CTRL_DATA_MAX));
2663 step = mapping->get(mapping, UVC_GET_RES,
2664 uvc_ctrl_data(ctrl, UVC_CTRL_DATA_RES));
2665 + if (step == 0)
2666 + step = 1;
2667
2668 xctrl->value = min + (xctrl->value - min + step/2) / step * step;
2669 xctrl->value = clamp(xctrl->value, min, max);
2670 diff --git a/drivers/misc/vmware_balloon.c b/drivers/misc/vmware_balloon.c
2671 index e7161c4..ad8fb09 100644
2672 --- a/drivers/misc/vmware_balloon.c
2673 +++ b/drivers/misc/vmware_balloon.c
2674 @@ -45,7 +45,7 @@
2675
2676 MODULE_AUTHOR("VMware, Inc.");
2677 MODULE_DESCRIPTION("VMware Memory Control (Balloon) Driver");
2678 -MODULE_VERSION("1.2.1.0-K");
2679 +MODULE_VERSION("1.2.1.1-k");
2680 MODULE_ALIAS("dmi:*:svnVMware*:*");
2681 MODULE_ALIAS("vmware_vmmemctl");
2682 MODULE_LICENSE("GPL");
2683 @@ -101,6 +101,8 @@ MODULE_LICENSE("GPL");
2684 /* Maximum number of page allocations without yielding processor */
2685 #define VMW_BALLOON_YIELD_THRESHOLD 1024
2686
2687 +/* Maximum number of refused pages we accumulate during inflation cycle */
2688 +#define VMW_BALLOON_MAX_REFUSED 16
2689
2690 /*
2691 * Hypervisor communication port definitions.
2692 @@ -183,6 +185,7 @@ struct vmballoon {
2693
2694 /* transient list of non-balloonable pages */
2695 struct list_head refused_pages;
2696 + unsigned int n_refused_pages;
2697
2698 /* balloon size in pages */
2699 unsigned int size;
2700 @@ -428,14 +431,21 @@ static int vmballoon_reserve_page(struct vmballoon *b, bool can_sleep)
2701 /* inform monitor */
2702 locked = vmballoon_send_lock_page(b, page_to_pfn(page));
2703 if (!locked) {
2704 + STATS_INC(b->stats.refused_alloc);
2705 +
2706 if (b->reset_required) {
2707 __free_page(page);
2708 return -EIO;
2709 }
2710
2711 - /* place on list of non-balloonable pages, retry allocation */
2712 + /*
2713 + * Place page on the list of non-balloonable pages
2714 + * and retry allocation, unless we already accumulated
2715 + * too many of them, in which case take a breather.
2716 + */
2717 list_add(&page->lru, &b->refused_pages);
2718 - STATS_INC(b->stats.refused_alloc);
2719 + if (++b->n_refused_pages >= VMW_BALLOON_MAX_REFUSED)
2720 + return -EIO;
2721 }
2722 } while (!locked);
2723
2724 @@ -483,6 +493,8 @@ static void vmballoon_release_refused_pages(struct vmballoon *b)
2725 __free_page(page);
2726 STATS_INC(b->stats.refused_free);
2727 }
2728 +
2729 + b->n_refused_pages = 0;
2730 }
2731
2732 /*
2733 diff --git a/drivers/net/arcnet/com20020-pci.c b/drivers/net/arcnet/com20020-pci.c
2734 index 2c712af..48a1dbf 100644
2735 --- a/drivers/net/arcnet/com20020-pci.c
2736 +++ b/drivers/net/arcnet/com20020-pci.c
2737 @@ -164,8 +164,8 @@ static DEFINE_PCI_DEVICE_TABLE(com20020pci_id_table) = {
2738 { 0x1571, 0xa204, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ARC_CAN_10MBIT },
2739 { 0x1571, 0xa205, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ARC_CAN_10MBIT },
2740 { 0x1571, 0xa206, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ARC_CAN_10MBIT },
2741 - { 0x10B5, 0x9030, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ARC_CAN_10MBIT },
2742 - { 0x10B5, 0x9050, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ARC_CAN_10MBIT },
2743 + { 0x10B5, 0x9030, 0x10B5, 0x2978, 0, 0, ARC_CAN_10MBIT },
2744 + { 0x10B5, 0x9050, 0x10B5, 0x2273, 0, 0, ARC_CAN_10MBIT },
2745 { 0x14BA, 0x6000, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ARC_CAN_10MBIT },
2746 { 0x10B5, 0x2200, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ARC_CAN_10MBIT },
2747 {0,}
2748 diff --git a/drivers/net/can/sja1000/sja1000.c b/drivers/net/can/sja1000/sja1000.c
2749 index 145b1a7..dd70d0c 100644
2750 --- a/drivers/net/can/sja1000/sja1000.c
2751 +++ b/drivers/net/can/sja1000/sja1000.c
2752 @@ -84,6 +84,20 @@ static struct can_bittiming_const sja1000_bittiming_const = {
2753 .brp_inc = 1,
2754 };
2755
2756 +static void sja1000_write_cmdreg(struct sja1000_priv *priv, u8 val)
2757 +{
2758 + unsigned long flags;
2759 +
2760 + /*
2761 + * The command register needs some locking and time to settle
2762 + * the write_reg() operation - especially on SMP systems.
2763 + */
2764 + spin_lock_irqsave(&priv->cmdreg_lock, flags);
2765 + priv->write_reg(priv, REG_CMR, val);
2766 + priv->read_reg(priv, REG_SR);
2767 + spin_unlock_irqrestore(&priv->cmdreg_lock, flags);
2768 +}
2769 +
2770 static int sja1000_probe_chip(struct net_device *dev)
2771 {
2772 struct sja1000_priv *priv = netdev_priv(dev);
2773 @@ -297,7 +311,7 @@ static netdev_tx_t sja1000_start_xmit(struct sk_buff *skb,
2774
2775 can_put_echo_skb(skb, dev, 0);
2776
2777 - priv->write_reg(priv, REG_CMR, CMD_TR);
2778 + sja1000_write_cmdreg(priv, CMD_TR);
2779
2780 return NETDEV_TX_OK;
2781 }
2782 @@ -346,7 +360,7 @@ static void sja1000_rx(struct net_device *dev)
2783 cf->can_id = id;
2784
2785 /* release receive buffer */
2786 - priv->write_reg(priv, REG_CMR, CMD_RRB);
2787 + sja1000_write_cmdreg(priv, CMD_RRB);
2788
2789 netif_rx(skb);
2790
2791 @@ -374,7 +388,7 @@ static int sja1000_err(struct net_device *dev, uint8_t isrc, uint8_t status)
2792 cf->data[1] = CAN_ERR_CRTL_RX_OVERFLOW;
2793 stats->rx_over_errors++;
2794 stats->rx_errors++;
2795 - priv->write_reg(priv, REG_CMR, CMD_CDO); /* clear bit */
2796 + sja1000_write_cmdreg(priv, CMD_CDO); /* clear bit */
2797 }
2798
2799 if (isrc & IRQ_EI) {
2800 diff --git a/drivers/net/can/sja1000/sja1000.h b/drivers/net/can/sja1000/sja1000.h
2801 index 97a622b..de8e778 100644
2802 --- a/drivers/net/can/sja1000/sja1000.h
2803 +++ b/drivers/net/can/sja1000/sja1000.h
2804 @@ -167,6 +167,7 @@ struct sja1000_priv {
2805
2806 void __iomem *reg_base; /* ioremap'ed address to registers */
2807 unsigned long irq_flags; /* for request_irq() */
2808 + spinlock_t cmdreg_lock; /* lock for concurrent cmd register writes */
2809
2810 u16 flags; /* custom mode flags */
2811 u8 ocr; /* output control register */
2812 diff --git a/drivers/net/mlx4/icm.c b/drivers/net/mlx4/icm.c
2813 index 57288ca..ef62f17 100644
2814 --- a/drivers/net/mlx4/icm.c
2815 +++ b/drivers/net/mlx4/icm.c
2816 @@ -175,9 +175,10 @@ struct mlx4_icm *mlx4_alloc_icm(struct mlx4_dev *dev, int npages,
2817
2818 if (chunk->nsg <= 0)
2819 goto fail;
2820 + }
2821
2822 + if (chunk->npages == MLX4_ICM_CHUNK_LEN)
2823 chunk = NULL;
2824 - }
2825
2826 npages -= 1 << cur_order;
2827 } else {
2828 diff --git a/drivers/net/wireless/ath/ar9170/hw.h b/drivers/net/wireless/ath/ar9170/hw.h
2829 index 0a1d4c2..06f1f3c 100644
2830 --- a/drivers/net/wireless/ath/ar9170/hw.h
2831 +++ b/drivers/net/wireless/ath/ar9170/hw.h
2832 @@ -425,5 +425,6 @@ enum ar9170_txq {
2833
2834 #define AR9170_TXQ_DEPTH 32
2835 #define AR9170_TX_MAX_PENDING 128
2836 +#define AR9170_RX_STREAM_MAX_SIZE 65535
2837
2838 #endif /* __AR9170_HW_H */
2839 diff --git a/drivers/net/wireless/ath/ar9170/main.c b/drivers/net/wireless/ath/ar9170/main.c
2840 index c536929..144db02 100644
2841 --- a/drivers/net/wireless/ath/ar9170/main.c
2842 +++ b/drivers/net/wireless/ath/ar9170/main.c
2843 @@ -2516,7 +2516,7 @@ void *ar9170_alloc(size_t priv_size)
2844 * tends to split the streams into separate rx descriptors.
2845 */
2846
2847 - skb = __dev_alloc_skb(AR9170_MAX_RX_BUFFER_SIZE, GFP_KERNEL);
2848 + skb = __dev_alloc_skb(AR9170_RX_STREAM_MAX_SIZE, GFP_KERNEL);
2849 if (!skb)
2850 goto err_nomem;
2851
2852 diff --git a/drivers/net/wireless/ath/ar9170/usb.c b/drivers/net/wireless/ath/ar9170/usb.c
2853 index e1c2fca..7bae7fd 100644
2854 --- a/drivers/net/wireless/ath/ar9170/usb.c
2855 +++ b/drivers/net/wireless/ath/ar9170/usb.c
2856 @@ -67,18 +67,28 @@ static struct usb_device_id ar9170_usb_ids[] = {
2857 { USB_DEVICE(0x0cf3, 0x1001) },
2858 /* TP-Link TL-WN821N v2 */
2859 { USB_DEVICE(0x0cf3, 0x1002) },
2860 + /* 3Com Dual Band 802.11n USB Adapter */
2861 + { USB_DEVICE(0x0cf3, 0x1010) },
2862 + /* H3C Dual Band 802.11n USB Adapter */
2863 + { USB_DEVICE(0x0cf3, 0x1011) },
2864 /* Cace Airpcap NX */
2865 { USB_DEVICE(0xcace, 0x0300) },
2866 /* D-Link DWA 160 A1 */
2867 { USB_DEVICE(0x07d1, 0x3c10) },
2868 /* D-Link DWA 160 A2 */
2869 { USB_DEVICE(0x07d1, 0x3a09) },
2870 + /* Netgear WNA1000 */
2871 + { USB_DEVICE(0x0846, 0x9040) },
2872 /* Netgear WNDA3100 */
2873 { USB_DEVICE(0x0846, 0x9010) },
2874 /* Netgear WN111 v2 */
2875 { USB_DEVICE(0x0846, 0x9001) },
2876 /* Zydas ZD1221 */
2877 { USB_DEVICE(0x0ace, 0x1221) },
2878 + /* Proxim ORiNOCO 802.11n USB */
2879 + { USB_DEVICE(0x1435, 0x0804) },
2880 + /* WNC Generic 11n USB Dongle */
2881 + { USB_DEVICE(0x1435, 0x0326) },
2882 /* ZyXEL NWD271N */
2883 { USB_DEVICE(0x0586, 0x3417) },
2884 /* Z-Com UB81 BG */
2885 diff --git a/drivers/net/wireless/ath/ath5k/base.c b/drivers/net/wireless/ath/ath5k/base.c
2886 index 3abbe75..ea90997 100644
2887 --- a/drivers/net/wireless/ath/ath5k/base.c
2888 +++ b/drivers/net/wireless/ath/ath5k/base.c
2889 @@ -1211,6 +1211,7 @@ ath5k_rxbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf)
2890 struct ath5k_hw *ah = sc->ah;
2891 struct sk_buff *skb = bf->skb;
2892 struct ath5k_desc *ds;
2893 + int ret;
2894
2895 if (!skb) {
2896 skb = ath5k_rx_skb_alloc(sc, &bf->skbaddr);
2897 @@ -1237,9 +1238,9 @@ ath5k_rxbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf)
2898 ds = bf->desc;
2899 ds->ds_link = bf->daddr; /* link to self */
2900 ds->ds_data = bf->skbaddr;
2901 - ah->ah_setup_rx_desc(ah, ds,
2902 - skb_tailroom(skb), /* buffer size */
2903 - 0);
2904 + ret = ah->ah_setup_rx_desc(ah, ds, ah->common.rx_bufsize, 0);
2905 + if (ret)
2906 + return ret;
2907
2908 if (sc->rxlink != NULL)
2909 *sc->rxlink = bf->daddr;
2910 @@ -2993,13 +2994,15 @@ static void ath5k_configure_filter(struct ieee80211_hw *hw,
2911
2912 if (changed_flags & (FIF_PROMISC_IN_BSS | FIF_OTHER_BSS)) {
2913 if (*new_flags & FIF_PROMISC_IN_BSS) {
2914 - rfilt |= AR5K_RX_FILTER_PROM;
2915 __set_bit(ATH_STAT_PROMISC, sc->status);
2916 } else {
2917 __clear_bit(ATH_STAT_PROMISC, sc->status);
2918 }
2919 }
2920
2921 + if (test_bit(ATH_STAT_PROMISC, sc->status))
2922 + rfilt |= AR5K_RX_FILTER_PROM;
2923 +
2924 /* Note, AR5K_RX_FILTER_MCAST is already enabled */
2925 if (*new_flags & FIF_ALLMULTI) {
2926 mfilt[0] = ~0;
2927 diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c
2928 index 78b5711..20d5414 100644
2929 --- a/drivers/net/wireless/ath/ath9k/hw.c
2930 +++ b/drivers/net/wireless/ath/ath9k/hw.c
2931 @@ -1241,7 +1241,7 @@ void ath9k_hw_deinit(struct ath_hw *ah)
2932 {
2933 struct ath_common *common = ath9k_hw_common(ah);
2934
2935 - if (common->state <= ATH_HW_INITIALIZED)
2936 + if (common->state < ATH_HW_INITIALIZED)
2937 goto free_hw;
2938
2939 if (!AR_SREV_9100(ah))
2940 @@ -1252,8 +1252,6 @@ void ath9k_hw_deinit(struct ath_hw *ah)
2941 free_hw:
2942 if (!AR_SREV_9280_10_OR_LATER(ah))
2943 ath9k_hw_rf_free_ext_banks(ah);
2944 - kfree(ah);
2945 - ah = NULL;
2946 }
2947 EXPORT_SYMBOL(ath9k_hw_deinit);
2948
2949 diff --git a/drivers/net/wireless/ath/ath9k/init.c b/drivers/net/wireless/ath/ath9k/init.c
2950 index 3d4d897..b78308c 100644
2951 --- a/drivers/net/wireless/ath/ath9k/init.c
2952 +++ b/drivers/net/wireless/ath/ath9k/init.c
2953 @@ -760,6 +760,9 @@ static void ath9k_deinit_softc(struct ath_softc *sc)
2954
2955 tasklet_kill(&sc->intr_tq);
2956 tasklet_kill(&sc->bcon_tasklet);
2957 +
2958 + kfree(sc->sc_ah);
2959 + sc->sc_ah = NULL;
2960 }
2961
2962 void ath9k_deinit_device(struct ath_softc *sc)
2963 diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c
2964 index 1460116..d3ef2a9 100644
2965 --- a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c
2966 +++ b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c
2967 @@ -2077,10 +2077,12 @@ static void rs_rate_scale_perform(struct iwl_priv *priv,
2968 }
2969 /* Else we have enough samples; calculate estimate of
2970 * actual average throughput */
2971 -
2972 - /* Sanity-check TPT calculations */
2973 - BUG_ON(window->average_tpt != ((window->success_ratio *
2974 - tbl->expected_tpt[index] + 64) / 128));
2975 + if (window->average_tpt != ((window->success_ratio *
2976 + tbl->expected_tpt[index] + 64) / 128)) {
2977 + IWL_ERR(priv, "expected_tpt should have been calculated by now\n");
2978 + window->average_tpt = ((window->success_ratio *
2979 + tbl->expected_tpt[index] + 64) / 128);
2980 + }
2981
2982 /* If we are searching for better modulation mode, check success. */
2983 if (lq_sta->search_better_tbl &&
2984 diff --git a/drivers/net/wireless/iwlwifi/iwl-scan.c b/drivers/net/wireless/iwlwifi/iwl-scan.c
2985 index 741e65e..661e36b 100644
2986 --- a/drivers/net/wireless/iwlwifi/iwl-scan.c
2987 +++ b/drivers/net/wireless/iwlwifi/iwl-scan.c
2988 @@ -561,6 +561,11 @@ static void iwl_bg_start_internal_scan(struct work_struct *work)
2989
2990 mutex_lock(&priv->mutex);
2991
2992 + if (priv->is_internal_short_scan == true) {
2993 + IWL_DEBUG_SCAN(priv, "Internal scan already in progress\n");
2994 + goto unlock;
2995 + }
2996 +
2997 if (!iwl_is_ready_rf(priv)) {
2998 IWL_DEBUG_SCAN(priv, "not ready or exit pending\n");
2999 goto unlock;
3000 @@ -958,17 +963,27 @@ void iwl_bg_scan_completed(struct work_struct *work)
3001 {
3002 struct iwl_priv *priv =
3003 container_of(work, struct iwl_priv, scan_completed);
3004 + bool internal = false;
3005
3006 IWL_DEBUG_SCAN(priv, "SCAN complete scan\n");
3007
3008 cancel_delayed_work(&priv->scan_check);
3009
3010 - if (!priv->is_internal_short_scan)
3011 - ieee80211_scan_completed(priv->hw, false);
3012 - else {
3013 + mutex_lock(&priv->mutex);
3014 + if (priv->is_internal_short_scan) {
3015 priv->is_internal_short_scan = false;
3016 IWL_DEBUG_SCAN(priv, "internal short scan completed\n");
3017 + internal = true;
3018 }
3019 + mutex_unlock(&priv->mutex);
3020 +
3021 + /*
3022 + * Do not hold mutex here since this will cause mac80211 to call
3023 + * into driver again into functions that will attempt to take
3024 + * mutex.
3025 + */
3026 + if (!internal)
3027 + ieee80211_scan_completed(priv->hw, false);
3028
3029 if (test_bit(STATUS_EXIT_PENDING, &priv->status))
3030 return;
3031 diff --git a/drivers/net/wireless/iwlwifi/iwl-tx.c b/drivers/net/wireless/iwlwifi/iwl-tx.c
3032 index 8dd0c03..c243df7 100644
3033 --- a/drivers/net/wireless/iwlwifi/iwl-tx.c
3034 +++ b/drivers/net/wireless/iwlwifi/iwl-tx.c
3035 @@ -1198,6 +1198,7 @@ static void iwl_tx_status(struct iwl_priv *priv, struct sk_buff *skb)
3036 struct ieee80211_sta *sta;
3037 struct iwl_station_priv *sta_priv;
3038
3039 + rcu_read_lock();
3040 sta = ieee80211_find_sta(priv->vif, hdr->addr1);
3041 if (sta) {
3042 sta_priv = (void *)sta->drv_priv;
3043 @@ -1206,6 +1207,7 @@ static void iwl_tx_status(struct iwl_priv *priv, struct sk_buff *skb)
3044 atomic_dec_return(&sta_priv->pending_frames) == 0)
3045 ieee80211_sta_block_awake(priv->hw, sta, false);
3046 }
3047 + rcu_read_unlock();
3048
3049 ieee80211_tx_status_irqsafe(priv->hw, skb);
3050 }
3051 diff --git a/drivers/net/wireless/p54/p54usb.c b/drivers/net/wireless/p54/p54usb.c
3052 index 743a6c6..186dc71 100644
3053 --- a/drivers/net/wireless/p54/p54usb.c
3054 +++ b/drivers/net/wireless/p54/p54usb.c
3055 @@ -80,6 +80,7 @@ static struct usb_device_id p54u_table[] __devinitdata = {
3056 {USB_DEVICE(0x1413, 0x5400)}, /* Telsey 802.11g USB2.0 Adapter */
3057 {USB_DEVICE(0x1435, 0x0427)}, /* Inventel UR054G */
3058 {USB_DEVICE(0x2001, 0x3704)}, /* DLink DWL-G122 rev A2 */
3059 + {USB_DEVICE(0x413c, 0x5513)}, /* Dell WLA3310 USB Wireless Adapter */
3060 {USB_DEVICE(0x413c, 0x8102)}, /* Spinnaker DUT */
3061 {USB_DEVICE(0x413c, 0x8104)}, /* Cohiba Proto board */
3062 {}
3063 diff --git a/drivers/net/wireless/rtl818x/rtl8180_dev.c b/drivers/net/wireless/rtl818x/rtl8180_dev.c
3064 index 2131a44..de632ec 100644
3065 --- a/drivers/net/wireless/rtl818x/rtl8180_dev.c
3066 +++ b/drivers/net/wireless/rtl818x/rtl8180_dev.c
3067 @@ -188,6 +188,7 @@ static void rtl8180_handle_tx(struct ieee80211_hw *dev, unsigned int prio)
3068 info->flags |= IEEE80211_TX_STAT_ACK;
3069
3070 info->status.rates[0].count = (flags & 0xFF) + 1;
3071 + info->status.rates[1].idx = -1;
3072
3073 ieee80211_tx_status_irqsafe(dev, skb);
3074 if (ring->entries - skb_queue_len(&ring->queue) == 2)
3075 diff --git a/drivers/net/wireless/wl12xx/wl1251_sdio.c b/drivers/net/wireless/wl12xx/wl1251_sdio.c
3076 index 9423f22..d74b89b 100644
3077 --- a/drivers/net/wireless/wl12xx/wl1251_sdio.c
3078 +++ b/drivers/net/wireless/wl12xx/wl1251_sdio.c
3079 @@ -160,6 +160,7 @@ disable:
3080 sdio_disable_func(func);
3081 release:
3082 sdio_release_host(func);
3083 + wl1251_free_hw(wl);
3084 return ret;
3085 }
3086
3087 diff --git a/drivers/oprofile/cpu_buffer.c b/drivers/oprofile/cpu_buffer.c
3088 index 166b67e..de82183 100644
3089 --- a/drivers/oprofile/cpu_buffer.c
3090 +++ b/drivers/oprofile/cpu_buffer.c
3091 @@ -30,23 +30,7 @@
3092
3093 #define OP_BUFFER_FLAGS 0
3094
3095 -/*
3096 - * Read and write access is using spin locking. Thus, writing to the
3097 - * buffer by NMI handler (x86) could occur also during critical
3098 - * sections when reading the buffer. To avoid this, there are 2
3099 - * buffers for independent read and write access. Read access is in
3100 - * process context only, write access only in the NMI handler. If the
3101 - * read buffer runs empty, both buffers are swapped atomically. There
3102 - * is potentially a small window during swapping where the buffers are
3103 - * disabled and samples could be lost.
3104 - *
3105 - * Using 2 buffers is a little bit overhead, but the solution is clear
3106 - * and does not require changes in the ring buffer implementation. It
3107 - * can be changed to a single buffer solution when the ring buffer
3108 - * access is implemented as non-locking atomic code.
3109 - */
3110 -static struct ring_buffer *op_ring_buffer_read;
3111 -static struct ring_buffer *op_ring_buffer_write;
3112 +static struct ring_buffer *op_ring_buffer;
3113 DEFINE_PER_CPU(struct oprofile_cpu_buffer, op_cpu_buffer);
3114
3115 static void wq_sync_buffer(struct work_struct *work);
3116 @@ -68,12 +52,9 @@ void oprofile_cpu_buffer_inc_smpl_lost(void)
3117
3118 void free_cpu_buffers(void)
3119 {
3120 - if (op_ring_buffer_read)
3121 - ring_buffer_free(op_ring_buffer_read);
3122 - op_ring_buffer_read = NULL;
3123 - if (op_ring_buffer_write)
3124 - ring_buffer_free(op_ring_buffer_write);
3125 - op_ring_buffer_write = NULL;
3126 + if (op_ring_buffer)
3127 + ring_buffer_free(op_ring_buffer);
3128 + op_ring_buffer = NULL;
3129 }
3130
3131 #define RB_EVENT_HDR_SIZE 4
3132 @@ -86,11 +67,8 @@ int alloc_cpu_buffers(void)
3133 unsigned long byte_size = buffer_size * (sizeof(struct op_sample) +
3134 RB_EVENT_HDR_SIZE);
3135
3136 - op_ring_buffer_read = ring_buffer_alloc(byte_size, OP_BUFFER_FLAGS);
3137 - if (!op_ring_buffer_read)
3138 - goto fail;
3139 - op_ring_buffer_write = ring_buffer_alloc(byte_size, OP_BUFFER_FLAGS);
3140 - if (!op_ring_buffer_write)
3141 + op_ring_buffer = ring_buffer_alloc(byte_size, OP_BUFFER_FLAGS);
3142 + if (!op_ring_buffer)
3143 goto fail;
3144
3145 for_each_possible_cpu(i) {
3146 @@ -162,16 +140,11 @@ struct op_sample
3147 *op_cpu_buffer_write_reserve(struct op_entry *entry, unsigned long size)
3148 {
3149 entry->event = ring_buffer_lock_reserve
3150 - (op_ring_buffer_write, sizeof(struct op_sample) +
3151 + (op_ring_buffer, sizeof(struct op_sample) +
3152 size * sizeof(entry->sample->data[0]));
3153 - if (entry->event)
3154 - entry->sample = ring_buffer_event_data(entry->event);
3155 - else
3156 - entry->sample = NULL;
3157 -
3158 - if (!entry->sample)
3159 + if (!entry->event)
3160 return NULL;
3161 -
3162 + entry->sample = ring_buffer_event_data(entry->event);
3163 entry->size = size;
3164 entry->data = entry->sample->data;
3165
3166 @@ -180,25 +153,16 @@ struct op_sample
3167
3168 int op_cpu_buffer_write_commit(struct op_entry *entry)
3169 {
3170 - return ring_buffer_unlock_commit(op_ring_buffer_write, entry->event);
3171 + return ring_buffer_unlock_commit(op_ring_buffer, entry->event);
3172 }
3173
3174 struct op_sample *op_cpu_buffer_read_entry(struct op_entry *entry, int cpu)
3175 {
3176 struct ring_buffer_event *e;
3177 - e = ring_buffer_consume(op_ring_buffer_read, cpu, NULL);
3178 - if (e)
3179 - goto event;
3180 - if (ring_buffer_swap_cpu(op_ring_buffer_read,
3181 - op_ring_buffer_write,
3182 - cpu))
3183 + e = ring_buffer_consume(op_ring_buffer, cpu, NULL);
3184 + if (!e)
3185 return NULL;
3186 - e = ring_buffer_consume(op_ring_buffer_read, cpu, NULL);
3187 - if (e)
3188 - goto event;
3189 - return NULL;
3190
3191 -event:
3192 entry->event = e;
3193 entry->sample = ring_buffer_event_data(e);
3194 entry->size = (ring_buffer_event_length(e) - sizeof(struct op_sample))
3195 @@ -209,8 +173,7 @@ event:
3196
3197 unsigned long op_cpu_buffer_entries(int cpu)
3198 {
3199 - return ring_buffer_entries_cpu(op_ring_buffer_read, cpu)
3200 - + ring_buffer_entries_cpu(op_ring_buffer_write, cpu);
3201 + return ring_buffer_entries_cpu(op_ring_buffer, cpu);
3202 }
3203
3204 static int
3205 diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
3206 index 27c0e6e..2f2d0ec 100644
3207 --- a/drivers/pci/quirks.c
3208 +++ b/drivers/pci/quirks.c
3209 @@ -1457,7 +1457,8 @@ static void quirk_jmicron_ata(struct pci_dev *pdev)
3210 conf5 &= ~(1 << 24); /* Clear bit 24 */
3211
3212 switch (pdev->device) {
3213 - case PCI_DEVICE_ID_JMICRON_JMB360:
3214 + case PCI_DEVICE_ID_JMICRON_JMB360: /* SATA single port */
3215 + case PCI_DEVICE_ID_JMICRON_JMB362: /* SATA dual ports */
3216 /* The controller should be in single function ahci mode */
3217 conf1 |= 0x0002A100; /* Set 8, 13, 15, 17 */
3218 break;
3219 @@ -1493,12 +1494,14 @@ static void quirk_jmicron_ata(struct pci_dev *pdev)
3220 }
3221 DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB360, quirk_jmicron_ata);
3222 DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB361, quirk_jmicron_ata);
3223 +DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB362, quirk_jmicron_ata);
3224 DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB363, quirk_jmicron_ata);
3225 DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB365, quirk_jmicron_ata);
3226 DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB366, quirk_jmicron_ata);
3227 DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB368, quirk_jmicron_ata);
3228 DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB360, quirk_jmicron_ata);
3229 DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB361, quirk_jmicron_ata);
3230 +DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB362, quirk_jmicron_ata);
3231 DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB363, quirk_jmicron_ata);
3232 DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB365, quirk_jmicron_ata);
3233 DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB366, quirk_jmicron_ata);
3234 @@ -2127,6 +2130,7 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, 0x9602, quirk_disable_msi);
3235 DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ASUSTEK, 0x9602, quirk_disable_msi);
3236 DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AI, 0x9602, quirk_disable_msi);
3237 DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, 0xa238, quirk_disable_msi);
3238 +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0x5a3f, quirk_disable_msi);
3239
3240 /* Go through the list of Hypertransport capabilities and
3241 * return 1 if a HT MSI capability is found and enabled */
3242 @@ -2218,15 +2222,16 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SERVERWORKS,
3243 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8132_BRIDGE,
3244 ht_enable_msi_mapping);
3245
3246 -/* The P5N32-SLI Premium motherboard from Asus has a problem with msi
3247 +/* The P5N32-SLI motherboards from Asus have a problem with msi
3248 * for the MCP55 NIC. It is not yet determined whether the msi problem
3249 * also affects other devices. As for now, turn off msi for this device.
3250 */
3251 static void __devinit nvenet_msi_disable(struct pci_dev *dev)
3252 {
3253 - if (dmi_name_in_vendors("P5N32-SLI PREMIUM")) {
3254 + if (dmi_name_in_vendors("P5N32-SLI PREMIUM") ||
3255 + dmi_name_in_vendors("P5N32-E SLI")) {
3256 dev_info(&dev->dev,
3257 - "Disabling msi for MCP55 NIC on P5N32-SLI Premium\n");
3258 + "Disabling msi for MCP55 NIC on P5N32-SLI\n");
3259 dev->no_msi = 1;
3260 }
3261 }
3262 diff --git a/drivers/pcmcia/ds.c b/drivers/pcmcia/ds.c
3263 index 041eee4..6df5dff 100644
3264 --- a/drivers/pcmcia/ds.c
3265 +++ b/drivers/pcmcia/ds.c
3266 @@ -682,6 +682,7 @@ static void pcmcia_requery(struct pcmcia_socket *s)
3267 if (old_funcs != new_funcs) {
3268 /* we need to re-start */
3269 pcmcia_card_remove(s, NULL);
3270 + s->functions = 0;
3271 pcmcia_card_add(s);
3272 }
3273 }
3274 diff --git a/drivers/pcmcia/yenta_socket.c b/drivers/pcmcia/yenta_socket.c
3275 index 83ace27..6bb6cb9 100644
3276 --- a/drivers/pcmcia/yenta_socket.c
3277 +++ b/drivers/pcmcia/yenta_socket.c
3278 @@ -975,7 +975,7 @@ static irqreturn_t yenta_probe_handler(int irq, void *dev_id)
3279 /* probes the PCI interrupt, use only on override functions */
3280 static int yenta_probe_cb_irq(struct yenta_socket *socket)
3281 {
3282 - u8 reg;
3283 + u8 reg = 0;
3284
3285 if (!socket->cb_irq)
3286 return -1;
3287 @@ -989,7 +989,8 @@ static int yenta_probe_cb_irq(struct yenta_socket *socket)
3288 }
3289
3290 /* generate interrupt, wait */
3291 - reg = exca_readb(socket, I365_CSCINT);
3292 + if (!socket->dev->irq)
3293 + reg = exca_readb(socket, I365_CSCINT);
3294 exca_writeb(socket, I365_CSCINT, reg | I365_CSC_STSCHG);
3295 cb_writel(socket, CB_SOCKET_EVENT, -1);
3296 cb_writel(socket, CB_SOCKET_MASK, CB_CSTSMASK);
3297 diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig
3298 index 6c3320d..50601d9 100644
3299 --- a/drivers/platform/x86/Kconfig
3300 +++ b/drivers/platform/x86/Kconfig
3301 @@ -390,6 +390,7 @@ config EEEPC_WMI
3302 depends on ACPI_WMI
3303 depends on INPUT
3304 depends on EXPERIMENTAL
3305 + depends on BACKLIGHT_CLASS_DEVICE
3306 select INPUT_SPARSEKMAP
3307 ---help---
3308 Say Y here if you want to support WMI-based hotkeys on Eee PC laptops.
3309 diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c
3310 index e9aa814..aa13875 100644
3311 --- a/drivers/rtc/rtc-cmos.c
3312 +++ b/drivers/rtc/rtc-cmos.c
3313 @@ -719,6 +719,9 @@ cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq)
3314 }
3315 }
3316
3317 + cmos_rtc.dev = dev;
3318 + dev_set_drvdata(dev, &cmos_rtc);
3319 +
3320 cmos_rtc.rtc = rtc_device_register(driver_name, dev,
3321 &cmos_rtc_ops, THIS_MODULE);
3322 if (IS_ERR(cmos_rtc.rtc)) {
3323 @@ -726,8 +729,6 @@ cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq)
3324 goto cleanup0;
3325 }
3326
3327 - cmos_rtc.dev = dev;
3328 - dev_set_drvdata(dev, &cmos_rtc);
3329 rename_region(ports, dev_name(&cmos_rtc.rtc->dev));
3330
3331 spin_lock_irq(&rtc_lock);
3332 diff --git a/drivers/rtc/rtc-s3c.c b/drivers/rtc/rtc-s3c.c
3333 index 4969b60..3793ea6 100644
3334 --- a/drivers/rtc/rtc-s3c.c
3335 +++ b/drivers/rtc/rtc-s3c.c
3336 @@ -457,8 +457,6 @@ static int __devinit s3c_rtc_probe(struct platform_device *pdev)
3337 pr_debug("s3c2410_rtc: RTCCON=%02x\n",
3338 readb(s3c_rtc_base + S3C2410_RTCCON));
3339
3340 - s3c_rtc_setfreq(&pdev->dev, 1);
3341 -
3342 device_init_wakeup(&pdev->dev, 1);
3343
3344 /* register RTC and exit */
3345 @@ -475,6 +473,9 @@ static int __devinit s3c_rtc_probe(struct platform_device *pdev)
3346 rtc->max_user_freq = 128;
3347
3348 platform_set_drvdata(pdev, rtc);
3349 +
3350 + s3c_rtc_setfreq(&pdev->dev, 1);
3351 +
3352 return 0;
3353
3354 err_nortc:
3355 diff --git a/drivers/scsi/libsas/sas_ata.c b/drivers/scsi/libsas/sas_ata.c
3356 index 88f7446..8c496b5 100644
3357 --- a/drivers/scsi/libsas/sas_ata.c
3358 +++ b/drivers/scsi/libsas/sas_ata.c
3359 @@ -395,12 +395,13 @@ int sas_ata_init_host_and_port(struct domain_device *found_dev,
3360 void sas_ata_task_abort(struct sas_task *task)
3361 {
3362 struct ata_queued_cmd *qc = task->uldd_task;
3363 - struct request_queue *q = qc->scsicmd->device->request_queue;
3364 struct completion *waiting;
3365 - unsigned long flags;
3366
3367 /* Bounce SCSI-initiated commands to the SCSI EH */
3368 if (qc->scsicmd) {
3369 + struct request_queue *q = qc->scsicmd->device->request_queue;
3370 + unsigned long flags;
3371 +
3372 spin_lock_irqsave(q->queue_lock, flags);
3373 blk_abort_request(qc->scsicmd->request);
3374 spin_unlock_irqrestore(q->queue_lock, flags);
3375 diff --git a/drivers/scsi/libsas/sas_scsi_host.c b/drivers/scsi/libsas/sas_scsi_host.c
3376 index 8228350..53849f2 100644
3377 --- a/drivers/scsi/libsas/sas_scsi_host.c
3378 +++ b/drivers/scsi/libsas/sas_scsi_host.c
3379 @@ -1030,8 +1030,6 @@ int __sas_task_abort(struct sas_task *task)
3380 void sas_task_abort(struct sas_task *task)
3381 {
3382 struct scsi_cmnd *sc = task->uldd_task;
3383 - struct request_queue *q = sc->device->request_queue;
3384 - unsigned long flags;
3385
3386 /* Escape for libsas internal commands */
3387 if (!sc) {
3388 @@ -1043,13 +1041,15 @@ void sas_task_abort(struct sas_task *task)
3389
3390 if (dev_is_sata(task->dev)) {
3391 sas_ata_task_abort(task);
3392 - return;
3393 - }
3394 + } else {
3395 + struct request_queue *q = sc->device->request_queue;
3396 + unsigned long flags;
3397
3398 - spin_lock_irqsave(q->queue_lock, flags);
3399 - blk_abort_request(sc->request);
3400 - spin_unlock_irqrestore(q->queue_lock, flags);
3401 - scsi_schedule_eh(sc->device->host);
3402 + spin_lock_irqsave(q->queue_lock, flags);
3403 + blk_abort_request(sc->request);
3404 + spin_unlock_irqrestore(q->queue_lock, flags);
3405 + scsi_schedule_eh(sc->device->host);
3406 + }
3407 }
3408
3409 int sas_slave_alloc(struct scsi_device *scsi_dev)
3410 diff --git a/drivers/serial/68328serial.c b/drivers/serial/68328serial.c
3411 index 78ed24b..3046386 100644
3412 --- a/drivers/serial/68328serial.c
3413 +++ b/drivers/serial/68328serial.c
3414 @@ -1437,7 +1437,7 @@ int m68328_console_setup(struct console *cp, char *arg)
3415 for (i = 0; i < ARRAY_SIZE(baud_table); i++)
3416 if (baud_table[i] == n)
3417 break;
3418 - if (i < BAUD_TABLE_SIZE) {
3419 + if (i < ARRAY_SIZE(baud_table)) {
3420 m68328_console_baud = n;
3421 m68328_console_cbaud = 0;
3422 if (i > 15) {
3423 diff --git a/drivers/staging/batman-adv/proc.c b/drivers/staging/batman-adv/proc.c
3424 index 7de60e8..c9366bc 100644
3425 --- a/drivers/staging/batman-adv/proc.c
3426 +++ b/drivers/staging/batman-adv/proc.c
3427 @@ -41,7 +41,7 @@ static int proc_interfaces_read(struct seq_file *seq, void *offset)
3428
3429 rcu_read_lock();
3430 list_for_each_entry_rcu(batman_if, &if_list, list) {
3431 - seq_printf(seq, "[%8s] %s %s \n",
3432 + seq_printf(seq, "[%8s] %s %s\n",
3433 (batman_if->if_active == IF_ACTIVE ?
3434 "active" : "inactive"),
3435 batman_if->dev,
3436 @@ -188,18 +188,18 @@ static int proc_originators_read(struct seq_file *seq, void *offset)
3437 rcu_read_lock();
3438 if (list_empty(&if_list)) {
3439 rcu_read_unlock();
3440 - seq_printf(seq, "BATMAN disabled - please specify interfaces to enable it \n");
3441 + seq_printf(seq, "BATMAN disabled - please specify interfaces to enable it\n");
3442 goto end;
3443 }
3444
3445 if (((struct batman_if *)if_list.next)->if_active != IF_ACTIVE) {
3446 rcu_read_unlock();
3447 - seq_printf(seq, "BATMAN disabled - primary interface not active \n");
3448 + seq_printf(seq, "BATMAN disabled - primary interface not active\n");
3449 goto end;
3450 }
3451
3452 seq_printf(seq,
3453 - " %-14s (%s/%i) %17s [%10s]: %20s ... [B.A.T.M.A.N. adv %s%s, MainIF/MAC: %s/%s] \n",
3454 + " %-14s (%s/%i) %17s [%10s]: %20s ... [B.A.T.M.A.N. adv %s%s, MainIF/MAC: %s/%s]\n",
3455 "Originator", "#", TQ_MAX_VALUE, "Nexthop", "outgoingIF",
3456 "Potential nexthops", SOURCE_VERSION, REVISION_VERSION_STR,
3457 ((struct batman_if *)if_list.next)->dev,
3458 @@ -240,7 +240,7 @@ static int proc_originators_read(struct seq_file *seq, void *offset)
3459 spin_unlock_irqrestore(&orig_hash_lock, flags);
3460
3461 if (batman_count == 0)
3462 - seq_printf(seq, "No batman nodes in range ... \n");
3463 + seq_printf(seq, "No batman nodes in range ...\n");
3464
3465 end:
3466 return 0;
3467 @@ -262,7 +262,7 @@ static int proc_transt_local_read(struct seq_file *seq, void *offset)
3468 rcu_read_lock();
3469 if (list_empty(&if_list)) {
3470 rcu_read_unlock();
3471 - seq_printf(seq, "BATMAN disabled - please specify interfaces to enable it \n");
3472 + seq_printf(seq, "BATMAN disabled - please specify interfaces to enable it\n");
3473 goto end;
3474 }
3475
3476 @@ -294,7 +294,7 @@ static int proc_transt_global_read(struct seq_file *seq, void *offset)
3477 rcu_read_lock();
3478 if (list_empty(&if_list)) {
3479 rcu_read_unlock();
3480 - seq_printf(seq, "BATMAN disabled - please specify interfaces to enable it \n");
3481 + seq_printf(seq, "BATMAN disabled - please specify interfaces to enable it\n");
3482 goto end;
3483 }
3484 rcu_read_unlock();
3485 @@ -350,9 +350,9 @@ static int proc_vis_srv_read(struct seq_file *seq, void *offset)
3486 {
3487 int vis_server = atomic_read(&vis_mode);
3488
3489 - seq_printf(seq, "[%c] client mode (server disabled) \n",
3490 + seq_printf(seq, "[%c] client mode (server disabled)\n",
3491 (vis_server == VIS_TYPE_CLIENT_UPDATE) ? 'x' : ' ');
3492 - seq_printf(seq, "[%c] server mode (server enabled) \n",
3493 + seq_printf(seq, "[%c] server mode (server enabled)\n",
3494 (vis_server == VIS_TYPE_SERVER_SYNC) ? 'x' : ' ');
3495
3496 return 0;
3497 @@ -369,6 +369,8 @@ static int proc_vis_data_read(struct seq_file *seq, void *offset)
3498 struct vis_info *info;
3499 struct vis_info_entry *entries;
3500 HLIST_HEAD(vis_if_list);
3501 + struct if_list_entry *entry;
3502 + struct hlist_node *pos, *n;
3503 int i;
3504 char tmp_addr_str[ETH_STR_LEN];
3505 unsigned long flags;
3506 @@ -387,17 +389,34 @@ static int proc_vis_data_read(struct seq_file *seq, void *offset)
3507 info = hashit.bucket->data;
3508 entries = (struct vis_info_entry *)
3509 ((char *)info + sizeof(struct vis_info));
3510 - addr_to_string(tmp_addr_str, info->packet.vis_orig);
3511 - seq_printf(seq, "%s,", tmp_addr_str);
3512
3513 for (i = 0; i < info->packet.entries; i++) {
3514 - proc_vis_read_entry(seq, &entries[i], &vis_if_list,
3515 - info->packet.vis_orig);
3516 + if (entries[i].quality == 0)
3517 + continue;
3518 + proc_vis_insert_interface(entries[i].src, &vis_if_list,
3519 + compare_orig(entries[i].src,
3520 + info->packet.vis_orig));
3521 }
3522
3523 - /* add primary/secondary records */
3524 - proc_vis_read_prim_sec(seq, &vis_if_list);
3525 - seq_printf(seq, "\n");
3526 + hlist_for_each_entry(entry, pos, &vis_if_list, list) {
3527 + addr_to_string(tmp_addr_str, entry->addr);
3528 + seq_printf(seq, "%s,", tmp_addr_str);
3529 +
3530 + for (i = 0; i < info->packet.entries; i++)
3531 + proc_vis_read_entry(seq, &entries[i],
3532 + entry->addr, entry->primary);
3533 +
3534 + /* add primary/secondary records */
3535 + if (compare_orig(entry->addr, info->packet.vis_orig))
3536 + proc_vis_read_prim_sec(seq, &vis_if_list);
3537 +
3538 + seq_printf(seq, "\n");
3539 + }
3540 +
3541 + hlist_for_each_entry_safe(entry, pos, n, &vis_if_list, list) {
3542 + hlist_del(&entry->list);
3543 + kfree(entry);
3544 + }
3545 }
3546 spin_unlock_irqrestore(&vis_hash_lock, flags);
3547
3548 diff --git a/drivers/staging/batman-adv/vis.c b/drivers/staging/batman-adv/vis.c
3549 index fedec1b..28eac7e 100644
3550 --- a/drivers/staging/batman-adv/vis.c
3551 +++ b/drivers/staging/batman-adv/vis.c
3552 @@ -27,24 +27,44 @@
3553 #include "hard-interface.h"
3554 #include "hash.h"
3555
3556 +/* Returns the smallest signed integer in two's complement with the sizeof x */
3557 +#define smallest_signed_int(x) (1u << (7u + 8u * (sizeof(x) - 1u)))
3558 +
3559 +/* Checks if a sequence number x is a predecessor/successor of y.
3560 + they handle overflows/underflows and can correctly check for a
3561 + predecessor/successor unless the variable sequence number has grown by
3562 + more then 2**(bitwidth(x)-1)-1.
3563 + This means that for a uint8_t with the maximum value 255, it would think:
3564 + * when adding nothing - it is neither a predecessor nor a successor
3565 + * before adding more than 127 to the starting value - it is a predecessor,
3566 + * when adding 128 - it is neither a predecessor nor a successor,
3567 + * after adding more than 127 to the starting value - it is a successor */
3568 +#define seq_before(x, y) ({typeof(x) _dummy = (x - y); \
3569 + _dummy > smallest_signed_int(_dummy); })
3570 +#define seq_after(x, y) seq_before(y, x)
3571 +
3572 struct hashtable_t *vis_hash;
3573 DEFINE_SPINLOCK(vis_hash_lock);
3574 +static DEFINE_SPINLOCK(recv_list_lock);
3575 static struct vis_info *my_vis_info;
3576 static struct list_head send_list; /* always locked with vis_hash_lock */
3577
3578 static void start_vis_timer(void);
3579
3580 /* free the info */
3581 -static void free_info(void *data)
3582 +static void free_info(struct kref *ref)
3583 {
3584 - struct vis_info *info = data;
3585 + struct vis_info *info = container_of(ref, struct vis_info, refcount);
3586 struct recvlist_node *entry, *tmp;
3587 + unsigned long flags;
3588
3589 list_del_init(&info->send_list);
3590 + spin_lock_irqsave(&recv_list_lock, flags);
3591 list_for_each_entry_safe(entry, tmp, &info->recv_list, list) {
3592 list_del(&entry->list);
3593 kfree(entry);
3594 }
3595 + spin_unlock_irqrestore(&recv_list_lock, flags);
3596 kfree(info);
3597 }
3598
3599 @@ -82,7 +102,7 @@ static int vis_info_choose(void *data, int size)
3600
3601 /* insert interface to the list of interfaces of one originator, if it
3602 * does not already exist in the list */
3603 -static void proc_vis_insert_interface(const uint8_t *interface,
3604 +void proc_vis_insert_interface(const uint8_t *interface,
3605 struct hlist_head *if_list,
3606 bool primary)
3607 {
3608 @@ -107,38 +127,51 @@ void proc_vis_read_prim_sec(struct seq_file *seq,
3609 struct hlist_head *if_list)
3610 {
3611 struct if_list_entry *entry;
3612 - struct hlist_node *pos, *n;
3613 + struct hlist_node *pos;
3614 char tmp_addr_str[ETH_STR_LEN];
3615
3616 - hlist_for_each_entry_safe(entry, pos, n, if_list, list) {
3617 - if (entry->primary) {
3618 + hlist_for_each_entry(entry, pos, if_list, list) {
3619 + if (entry->primary)
3620 seq_printf(seq, "PRIMARY, ");
3621 - } else {
3622 + else {
3623 addr_to_string(tmp_addr_str, entry->addr);
3624 seq_printf(seq, "SEC %s, ", tmp_addr_str);
3625 }
3626 -
3627 - hlist_del(&entry->list);
3628 - kfree(entry);
3629 }
3630 }
3631
3632 /* read an entry */
3633 void proc_vis_read_entry(struct seq_file *seq,
3634 struct vis_info_entry *entry,
3635 - struct hlist_head *if_list,
3636 - uint8_t *vis_orig)
3637 + uint8_t *src,
3638 + bool primary)
3639 {
3640 char to[40];
3641
3642 addr_to_string(to, entry->dest);
3643 - if (entry->quality == 0) {
3644 - proc_vis_insert_interface(vis_orig, if_list, true);
3645 + if (primary && entry->quality == 0)
3646 seq_printf(seq, "HNA %s, ", to);
3647 - } else {
3648 - proc_vis_insert_interface(entry->src, if_list,
3649 - compare_orig(entry->src, vis_orig));
3650 + else if (compare_orig(entry->src, src))
3651 seq_printf(seq, "TQ %s %d, ", to, entry->quality);
3652 +}
3653 +
3654 +/* add the info packet to the send list, if it was not
3655 + * already linked in. */
3656 +static void send_list_add(struct vis_info *info)
3657 +{
3658 + if (list_empty(&info->send_list)) {
3659 + kref_get(&info->refcount);
3660 + list_add_tail(&info->send_list, &send_list);
3661 + }
3662 +}
3663 +
3664 +/* delete the info packet from the send list, if it was
3665 + * linked in. */
3666 +static void send_list_del(struct vis_info *info)
3667 +{
3668 + if (!list_empty(&info->send_list)) {
3669 + list_del_init(&info->send_list);
3670 + kref_put(&info->refcount, free_info);
3671 }
3672 }
3673
3674 @@ -146,32 +179,41 @@ void proc_vis_read_entry(struct seq_file *seq,
3675 static void recv_list_add(struct list_head *recv_list, char *mac)
3676 {
3677 struct recvlist_node *entry;
3678 + unsigned long flags;
3679 +
3680 entry = kmalloc(sizeof(struct recvlist_node), GFP_ATOMIC);
3681 if (!entry)
3682 return;
3683
3684 memcpy(entry->mac, mac, ETH_ALEN);
3685 + spin_lock_irqsave(&recv_list_lock, flags);
3686 list_add_tail(&entry->list, recv_list);
3687 + spin_unlock_irqrestore(&recv_list_lock, flags);
3688 }
3689
3690 /* returns 1 if this mac is in the recv_list */
3691 static int recv_list_is_in(struct list_head *recv_list, char *mac)
3692 {
3693 struct recvlist_node *entry;
3694 + unsigned long flags;
3695
3696 + spin_lock_irqsave(&recv_list_lock, flags);
3697 list_for_each_entry(entry, recv_list, list) {
3698 - if (memcmp(entry->mac, mac, ETH_ALEN) == 0)
3699 + if (memcmp(entry->mac, mac, ETH_ALEN) == 0) {
3700 + spin_unlock_irqrestore(&recv_list_lock, flags);
3701 return 1;
3702 + }
3703 }
3704 -
3705 + spin_unlock_irqrestore(&recv_list_lock, flags);
3706 return 0;
3707 }
3708
3709 /* try to add the packet to the vis_hash. return NULL if invalid (e.g. too old,
3710 - * broken.. ). vis hash must be locked outside. is_new is set when the packet
3711 + * broken.. ). vis hash must be locked outside. is_new is set when the packet
3712 * is newer than old entries in the hash. */
3713 static struct vis_info *add_packet(struct vis_packet *vis_packet,
3714 - int vis_info_len, int *is_new)
3715 + int vis_info_len, int *is_new,
3716 + int make_broadcast)
3717 {
3718 struct vis_info *info, *old_info;
3719 struct vis_info search_elem;
3720 @@ -186,7 +228,7 @@ static struct vis_info *add_packet(struct vis_packet *vis_packet,
3721 old_info = hash_find(vis_hash, &search_elem);
3722
3723 if (old_info != NULL) {
3724 - if (vis_packet->seqno - old_info->packet.seqno <= 0) {
3725 + if (!seq_after(vis_packet->seqno, old_info->packet.seqno)) {
3726 if (old_info->packet.seqno == vis_packet->seqno) {
3727 recv_list_add(&old_info->recv_list,
3728 vis_packet->sender_orig);
3729 @@ -198,13 +240,15 @@ static struct vis_info *add_packet(struct vis_packet *vis_packet,
3730 }
3731 /* remove old entry */
3732 hash_remove(vis_hash, old_info);
3733 - free_info(old_info);
3734 + send_list_del(old_info);
3735 + kref_put(&old_info->refcount, free_info);
3736 }
3737
3738 info = kmalloc(sizeof(struct vis_info) + vis_info_len, GFP_ATOMIC);
3739 if (info == NULL)
3740 return NULL;
3741
3742 + kref_init(&info->refcount);
3743 INIT_LIST_HEAD(&info->send_list);
3744 INIT_LIST_HEAD(&info->recv_list);
3745 info->first_seen = jiffies;
3746 @@ -214,16 +258,21 @@ static struct vis_info *add_packet(struct vis_packet *vis_packet,
3747 /* initialize and add new packet. */
3748 *is_new = 1;
3749
3750 + /* Make it a broadcast packet, if required */
3751 + if (make_broadcast)
3752 + memcpy(info->packet.target_orig, broadcastAddr, ETH_ALEN);
3753 +
3754 /* repair if entries is longer than packet. */
3755 if (info->packet.entries * sizeof(struct vis_info_entry) > vis_info_len)
3756 - info->packet.entries = vis_info_len / sizeof(struct vis_info_entry);
3757 + info->packet.entries = vis_info_len /
3758 + sizeof(struct vis_info_entry);
3759
3760 recv_list_add(&info->recv_list, info->packet.sender_orig);
3761
3762 /* try to add it */
3763 if (hash_add(vis_hash, info) < 0) {
3764 /* did not work (for some reason) */
3765 - free_info(info);
3766 + kref_put(&old_info->refcount, free_info);
3767 info = NULL;
3768 }
3769
3770 @@ -234,22 +283,21 @@ static struct vis_info *add_packet(struct vis_packet *vis_packet,
3771 void receive_server_sync_packet(struct vis_packet *vis_packet, int vis_info_len)
3772 {
3773 struct vis_info *info;
3774 - int is_new;
3775 + int is_new, make_broadcast;
3776 unsigned long flags;
3777 int vis_server = atomic_read(&vis_mode);
3778
3779 + make_broadcast = (vis_server == VIS_TYPE_SERVER_SYNC);
3780 +
3781 spin_lock_irqsave(&vis_hash_lock, flags);
3782 - info = add_packet(vis_packet, vis_info_len, &is_new);
3783 + info = add_packet(vis_packet, vis_info_len, &is_new, make_broadcast);
3784 if (info == NULL)
3785 goto end;
3786
3787 /* only if we are server ourselves and packet is newer than the one in
3788 * hash.*/
3789 - if (vis_server == VIS_TYPE_SERVER_SYNC && is_new) {
3790 - memcpy(info->packet.target_orig, broadcastAddr, ETH_ALEN);
3791 - if (list_empty(&info->send_list))
3792 - list_add_tail(&info->send_list, &send_list);
3793 - }
3794 + if (vis_server == VIS_TYPE_SERVER_SYNC && is_new)
3795 + send_list_add(info);
3796 end:
3797 spin_unlock_irqrestore(&vis_hash_lock, flags);
3798 }
3799 @@ -262,31 +310,32 @@ void receive_client_update_packet(struct vis_packet *vis_packet,
3800 int is_new;
3801 unsigned long flags;
3802 int vis_server = atomic_read(&vis_mode);
3803 + int are_target = 0;
3804
3805 /* clients shall not broadcast. */
3806 if (is_bcast(vis_packet->target_orig))
3807 return;
3808
3809 + /* Are we the target for this VIS packet? */
3810 + if (vis_server == VIS_TYPE_SERVER_SYNC &&
3811 + is_my_mac(vis_packet->target_orig))
3812 + are_target = 1;
3813 +
3814 spin_lock_irqsave(&vis_hash_lock, flags);
3815 - info = add_packet(vis_packet, vis_info_len, &is_new);
3816 + info = add_packet(vis_packet, vis_info_len, &is_new, are_target);
3817 if (info == NULL)
3818 goto end;
3819 /* note that outdated packets will be dropped at this point. */
3820
3821
3822 /* send only if we're the target server or ... */
3823 - if (vis_server == VIS_TYPE_SERVER_SYNC &&
3824 - is_my_mac(info->packet.target_orig) &&
3825 - is_new) {
3826 + if (are_target && is_new) {
3827 info->packet.vis_type = VIS_TYPE_SERVER_SYNC; /* upgrade! */
3828 - memcpy(info->packet.target_orig, broadcastAddr, ETH_ALEN);
3829 - if (list_empty(&info->send_list))
3830 - list_add_tail(&info->send_list, &send_list);
3831 + send_list_add(info);
3832
3833 /* ... we're not the recipient (and thus need to forward). */
3834 } else if (!is_my_mac(info->packet.target_orig)) {
3835 - if (list_empty(&info->send_list))
3836 - list_add_tail(&info->send_list, &send_list);
3837 + send_list_add(info);
3838 }
3839 end:
3840 spin_unlock_irqrestore(&vis_hash_lock, flags);
3841 @@ -361,14 +410,17 @@ static int generate_vis_packet(void)
3842 while (hash_iterate(orig_hash, &hashit_global)) {
3843 orig_node = hashit_global.bucket->data;
3844 if (orig_node->router != NULL
3845 - && compare_orig(orig_node->router->addr, orig_node->orig)
3846 + && compare_orig(orig_node->router->addr,
3847 + orig_node->orig)
3848 && orig_node->batman_if
3849 && (orig_node->batman_if->if_active == IF_ACTIVE)
3850 && orig_node->router->tq_avg > 0) {
3851
3852 /* fill one entry into buffer. */
3853 entry = &entry_array[info->packet.entries];
3854 - memcpy(entry->src, orig_node->batman_if->net_dev->dev_addr, ETH_ALEN);
3855 + memcpy(entry->src,
3856 + orig_node->batman_if->net_dev->dev_addr,
3857 + ETH_ALEN);
3858 memcpy(entry->dest, orig_node->orig, ETH_ALEN);
3859 entry->quality = orig_node->router->tq_avg;
3860 info->packet.entries++;
3861 @@ -400,6 +452,8 @@ static int generate_vis_packet(void)
3862 return 0;
3863 }
3864
3865 +/* free old vis packets. Must be called with this vis_hash_lock
3866 + * held */
3867 static void purge_vis_packets(void)
3868 {
3869 HASHIT(hashit);
3870 @@ -412,7 +466,8 @@ static void purge_vis_packets(void)
3871 if (time_after(jiffies,
3872 info->first_seen + (VIS_TIMEOUT*HZ)/1000)) {
3873 hash_remove_bucket(vis_hash, &hashit);
3874 - free_info(info);
3875 + send_list_del(info);
3876 + kref_put(&info->refcount, free_info);
3877 }
3878 }
3879 }
3880 @@ -422,6 +477,8 @@ static void broadcast_vis_packet(struct vis_info *info, int packet_length)
3881 HASHIT(hashit);
3882 struct orig_node *orig_node;
3883 unsigned long flags;
3884 + struct batman_if *batman_if;
3885 + uint8_t dstaddr[ETH_ALEN];
3886
3887 spin_lock_irqsave(&orig_hash_lock, flags);
3888
3889 @@ -430,45 +487,56 @@ static void broadcast_vis_packet(struct vis_info *info, int packet_length)
3890 orig_node = hashit.bucket->data;
3891
3892 /* if it's a vis server and reachable, send it. */
3893 - if (orig_node &&
3894 - (orig_node->flags & VIS_SERVER) &&
3895 - orig_node->batman_if &&
3896 - orig_node->router) {
3897 + if ((!orig_node) || (!orig_node->batman_if) ||
3898 + (!orig_node->router))
3899 + continue;
3900 + if (!(orig_node->flags & VIS_SERVER))
3901 + continue;
3902 + /* don't send it if we already received the packet from
3903 + * this node. */
3904 + if (recv_list_is_in(&info->recv_list, orig_node->orig))
3905 + continue;
3906
3907 - /* don't send it if we already received the packet from
3908 - * this node. */
3909 - if (recv_list_is_in(&info->recv_list, orig_node->orig))
3910 - continue;
3911 + memcpy(info->packet.target_orig, orig_node->orig, ETH_ALEN);
3912 + batman_if = orig_node->batman_if;
3913 + memcpy(dstaddr, orig_node->router->addr, ETH_ALEN);
3914 + spin_unlock_irqrestore(&orig_hash_lock, flags);
3915
3916 - memcpy(info->packet.target_orig,
3917 - orig_node->orig, ETH_ALEN);
3918 + send_raw_packet((unsigned char *)&info->packet,
3919 + packet_length, batman_if, dstaddr);
3920 +
3921 + spin_lock_irqsave(&orig_hash_lock, flags);
3922
3923 - send_raw_packet((unsigned char *) &info->packet,
3924 - packet_length,
3925 - orig_node->batman_if,
3926 - orig_node->router->addr);
3927 - }
3928 }
3929 - memcpy(info->packet.target_orig, broadcastAddr, ETH_ALEN);
3930 spin_unlock_irqrestore(&orig_hash_lock, flags);
3931 + memcpy(info->packet.target_orig, broadcastAddr, ETH_ALEN);
3932 }
3933
3934 static void unicast_vis_packet(struct vis_info *info, int packet_length)
3935 {
3936 struct orig_node *orig_node;
3937 unsigned long flags;
3938 + struct batman_if *batman_if;
3939 + uint8_t dstaddr[ETH_ALEN];
3940
3941 spin_lock_irqsave(&orig_hash_lock, flags);
3942 orig_node = ((struct orig_node *)
3943 hash_find(orig_hash, info->packet.target_orig));
3944
3945 - if ((orig_node != NULL) &&
3946 - (orig_node->batman_if != NULL) &&
3947 - (orig_node->router != NULL)) {
3948 - send_raw_packet((unsigned char *) &info->packet, packet_length,
3949 - orig_node->batman_if,
3950 - orig_node->router->addr);
3951 - }
3952 + if ((!orig_node) || (!orig_node->batman_if) || (!orig_node->router))
3953 + goto out;
3954 +
3955 + /* don't lock while sending the packets ... we therefore
3956 + * copy the required data before sending */
3957 + batman_if = orig_node->batman_if;
3958 + memcpy(dstaddr, orig_node->router->addr, ETH_ALEN);
3959 + spin_unlock_irqrestore(&orig_hash_lock, flags);
3960 +
3961 + send_raw_packet((unsigned char *)&info->packet,
3962 + packet_length, batman_if, dstaddr);
3963 + return;
3964 +
3965 +out:
3966 spin_unlock_irqrestore(&orig_hash_lock, flags);
3967 }
3968
3969 @@ -502,15 +570,24 @@ static void send_vis_packets(struct work_struct *work)
3970 unsigned long flags;
3971
3972 spin_lock_irqsave(&vis_hash_lock, flags);
3973 +
3974 purge_vis_packets();
3975
3976 - if (generate_vis_packet() == 0)
3977 + if (generate_vis_packet() == 0) {
3978 /* schedule if generation was successful */
3979 - list_add_tail(&my_vis_info->send_list, &send_list);
3980 + send_list_add(my_vis_info);
3981 + }
3982
3983 list_for_each_entry_safe(info, temp, &send_list, send_list) {
3984 - list_del_init(&info->send_list);
3985 +
3986 + kref_get(&info->refcount);
3987 + spin_unlock_irqrestore(&vis_hash_lock, flags);
3988 +
3989 send_vis_packet(info);
3990 +
3991 + spin_lock_irqsave(&vis_hash_lock, flags);
3992 + send_list_del(info);
3993 + kref_put(&info->refcount, free_info);
3994 }
3995 spin_unlock_irqrestore(&vis_hash_lock, flags);
3996 start_vis_timer();
3997 @@ -543,6 +620,7 @@ int vis_init(void)
3998 my_vis_info->first_seen = jiffies - atomic_read(&vis_interval);
3999 INIT_LIST_HEAD(&my_vis_info->recv_list);
4000 INIT_LIST_HEAD(&my_vis_info->send_list);
4001 + kref_init(&my_vis_info->refcount);
4002 my_vis_info->packet.version = COMPAT_VERSION;
4003 my_vis_info->packet.packet_type = BAT_VIS;
4004 my_vis_info->packet.ttl = TTL;
4005 @@ -556,9 +634,9 @@ int vis_init(void)
4006
4007 if (hash_add(vis_hash, my_vis_info) < 0) {
4008 printk(KERN_ERR
4009 - "batman-adv:Can't add own vis packet into hash\n");
4010 - free_info(my_vis_info); /* not in hash, need to remove it
4011 - * manually. */
4012 + "batman-adv:Can't add own vis packet into hash\n");
4013 + /* not in hash, need to remove it manually. */
4014 + kref_put(&my_vis_info->refcount, free_info);
4015 goto err;
4016 }
4017
4018 @@ -572,6 +650,15 @@ err:
4019 return 0;
4020 }
4021
4022 +/* Decrease the reference count on a hash item info */
4023 +static void free_info_ref(void *data)
4024 +{
4025 + struct vis_info *info = data;
4026 +
4027 + send_list_del(info);
4028 + kref_put(&info->refcount, free_info);
4029 +}
4030 +
4031 /* shutdown vis-server */
4032 void vis_quit(void)
4033 {
4034 @@ -583,7 +670,7 @@ void vis_quit(void)
4035
4036 spin_lock_irqsave(&vis_hash_lock, flags);
4037 /* properly remove, kill timers ... */
4038 - hash_delete(vis_hash, free_info);
4039 + hash_delete(vis_hash, free_info_ref);
4040 vis_hash = NULL;
4041 my_vis_info = NULL;
4042 spin_unlock_irqrestore(&vis_hash_lock, flags);
4043 diff --git a/drivers/staging/batman-adv/vis.h b/drivers/staging/batman-adv/vis.h
4044 index 0cdafde..a1f92a4 100644
4045 --- a/drivers/staging/batman-adv/vis.h
4046 +++ b/drivers/staging/batman-adv/vis.h
4047 @@ -29,6 +29,7 @@ struct vis_info {
4048 /* list of server-neighbors we received a vis-packet
4049 * from. we should not reply to them. */
4050 struct list_head send_list;
4051 + struct kref refcount;
4052 /* this packet might be part of the vis send queue. */
4053 struct vis_packet packet;
4054 /* vis_info may follow here*/
4055 @@ -48,10 +49,13 @@ struct recvlist_node {
4056 extern struct hashtable_t *vis_hash;
4057 extern spinlock_t vis_hash_lock;
4058
4059 +void proc_vis_insert_interface(const uint8_t *interface,
4060 + struct hlist_head *if_list,
4061 + bool primary);
4062 void proc_vis_read_entry(struct seq_file *seq,
4063 struct vis_info_entry *entry,
4064 - struct hlist_head *if_list,
4065 - uint8_t *vis_orig);
4066 + uint8_t *src,
4067 + bool primary);
4068 void proc_vis_read_prim_sec(struct seq_file *seq,
4069 struct hlist_head *if_list);
4070 void receive_server_sync_packet(struct vis_packet *vis_packet,
4071 diff --git a/drivers/staging/comedi/drivers/ni_mio_cs.c b/drivers/staging/comedi/drivers/ni_mio_cs.c
4072 index dc4849a..9855608 100644
4073 --- a/drivers/staging/comedi/drivers/ni_mio_cs.c
4074 +++ b/drivers/staging/comedi/drivers/ni_mio_cs.c
4075 @@ -123,7 +123,7 @@ static const struct ni_board_struct ni_boards[] = {
4076 .adbits = 12,
4077 .ai_fifo_depth = 1024,
4078 .alwaysdither = 0,
4079 - .gainlkup = ai_gain_16,
4080 + .gainlkup = ai_gain_4,
4081 .ai_speed = 5000,
4082 .n_aochan = 2,
4083 .aobits = 12,
4084 diff --git a/drivers/staging/rt2860/usb_main_dev.c b/drivers/staging/rt2860/usb_main_dev.c
4085 index 740db0c..2ffd0fe 100644
4086 --- a/drivers/staging/rt2860/usb_main_dev.c
4087 +++ b/drivers/staging/rt2860/usb_main_dev.c
4088 @@ -98,6 +98,7 @@ struct usb_device_id rtusb_usb_id[] = {
4089 {USB_DEVICE(0x5A57, 0x0282)}, /* Zinwell */
4090 {USB_DEVICE(0x7392, 0x7718)},
4091 {USB_DEVICE(0x7392, 0x7717)},
4092 + {USB_DEVICE(0x0411, 0x016f)}, /* MelCo.,Inc. WLI-UC-G301N */
4093 {USB_DEVICE(0x1737, 0x0070)}, /* Linksys WUSB100 */
4094 {USB_DEVICE(0x1737, 0x0071)}, /* Linksys WUSB600N */
4095 {USB_DEVICE(0x0411, 0x00e8)}, /* Buffalo WLI-UC-G300N */
4096 diff --git a/drivers/staging/vt6655/device_main.c b/drivers/staging/vt6655/device_main.c
4097 index e40a2e9..fea0e99 100644
4098 --- a/drivers/staging/vt6655/device_main.c
4099 +++ b/drivers/staging/vt6655/device_main.c
4100 @@ -1090,11 +1090,13 @@ device_found1(struct pci_dev *pcid, const struct pci_device_id *ent)
4101 }
4102 //2008-07-21-01<Add>by MikeLiu
4103 //register wpadev
4104 +#if 0
4105 if(wpa_set_wpadev(pDevice, 1)!=0) {
4106 printk("Fail to Register WPADEV?\n");
4107 unregister_netdev(pDevice->dev);
4108 free_netdev(dev);
4109 }
4110 +#endif
4111 device_print_info(pDevice);
4112 pci_set_drvdata(pcid, pDevice);
4113 return 0;
4114 diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
4115 index 5e1a253..3c73add 100644
4116 --- a/drivers/usb/class/cdc-acm.c
4117 +++ b/drivers/usb/class/cdc-acm.c
4118 @@ -1201,7 +1201,7 @@ made_compressed_probe:
4119 if (rcv->urb == NULL) {
4120 dev_dbg(&intf->dev,
4121 "out of memory (read urbs usb_alloc_urb)\n");
4122 - goto alloc_fail7;
4123 + goto alloc_fail6;
4124 }
4125
4126 rcv->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
4127 @@ -1225,7 +1225,7 @@ made_compressed_probe:
4128 if (snd->urb == NULL) {
4129 dev_dbg(&intf->dev,
4130 "out of memory (write urbs usb_alloc_urb)");
4131 - goto alloc_fail7;
4132 + goto alloc_fail8;
4133 }
4134
4135 if (usb_endpoint_xfer_int(epwrite))
4136 @@ -1264,6 +1264,7 @@ made_compressed_probe:
4137 i = device_create_file(&intf->dev,
4138 &dev_attr_iCountryCodeRelDate);
4139 if (i < 0) {
4140 + device_remove_file(&intf->dev, &dev_attr_wCountryCodes);
4141 kfree(acm->country_codes);
4142 goto skip_countries;
4143 }
4144 @@ -1300,6 +1301,7 @@ alloc_fail8:
4145 usb_free_urb(acm->wb[i].urb);
4146 alloc_fail7:
4147 acm_read_buffers_free(acm);
4148 +alloc_fail6:
4149 for (i = 0; i < num_rx_buf; i++)
4150 usb_free_urb(acm->ru[i].urb);
4151 usb_free_urb(acm->ctrlurb);
4152 diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c
4153 index 2f3dc4c..9d02dc6 100644
4154 --- a/drivers/usb/core/driver.c
4155 +++ b/drivers/usb/core/driver.c
4156 @@ -1322,6 +1322,7 @@ int usb_resume(struct device *dev, pm_message_t msg)
4157
4158 /* For all other calls, take the device back to full power and
4159 * tell the PM core in case it was autosuspended previously.
4160 + * Unbind the interfaces that will need rebinding later.
4161 */
4162 } else {
4163 status = usb_resume_both(udev, msg);
4164 @@ -1330,6 +1331,7 @@ int usb_resume(struct device *dev, pm_message_t msg)
4165 pm_runtime_set_active(dev);
4166 pm_runtime_enable(dev);
4167 udev->last_busy = jiffies;
4168 + do_unbind_rebind(udev, DO_REBIND);
4169 }
4170 }
4171
4172 diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
4173 index 2f8cedd..b60a14d 100644
4174 --- a/drivers/usb/core/hcd.c
4175 +++ b/drivers/usb/core/hcd.c
4176 @@ -1261,6 +1261,51 @@ static void hcd_free_coherent(struct usb_bus *bus, dma_addr_t *dma_handle,
4177 *dma_handle = 0;
4178 }
4179
4180 +static void unmap_urb_for_dma(struct usb_hcd *hcd, struct urb *urb)
4181 +{
4182 + enum dma_data_direction dir;
4183 +
4184 + if (urb->transfer_flags & URB_SETUP_MAP_SINGLE)
4185 + dma_unmap_single(hcd->self.controller,
4186 + urb->setup_dma,
4187 + sizeof(struct usb_ctrlrequest),
4188 + DMA_TO_DEVICE);
4189 + else if (urb->transfer_flags & URB_SETUP_MAP_LOCAL)
4190 + hcd_free_coherent(urb->dev->bus,
4191 + &urb->setup_dma,
4192 + (void **) &urb->setup_packet,
4193 + sizeof(struct usb_ctrlrequest),
4194 + DMA_TO_DEVICE);
4195 +
4196 + dir = usb_urb_dir_in(urb) ? DMA_FROM_DEVICE : DMA_TO_DEVICE;
4197 + if (urb->transfer_flags & URB_DMA_MAP_SG)
4198 + dma_unmap_sg(hcd->self.controller,
4199 + urb->sg->sg,
4200 + urb->num_sgs,
4201 + dir);
4202 + else if (urb->transfer_flags & URB_DMA_MAP_PAGE)
4203 + dma_unmap_page(hcd->self.controller,
4204 + urb->transfer_dma,
4205 + urb->transfer_buffer_length,
4206 + dir);
4207 + else if (urb->transfer_flags & URB_DMA_MAP_SINGLE)
4208 + dma_unmap_single(hcd->self.controller,
4209 + urb->transfer_dma,
4210 + urb->transfer_buffer_length,
4211 + dir);
4212 + else if (urb->transfer_flags & URB_MAP_LOCAL)
4213 + hcd_free_coherent(urb->dev->bus,
4214 + &urb->transfer_dma,
4215 + &urb->transfer_buffer,
4216 + urb->transfer_buffer_length,
4217 + dir);
4218 +
4219 + /* Make it safe to call this routine more than once */
4220 + urb->transfer_flags &= ~(URB_SETUP_MAP_SINGLE | URB_SETUP_MAP_LOCAL |
4221 + URB_DMA_MAP_SG | URB_DMA_MAP_PAGE |
4222 + URB_DMA_MAP_SINGLE | URB_MAP_LOCAL);
4223 +}
4224 +
4225 static int map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb,
4226 gfp_t mem_flags)
4227 {
4228 @@ -1272,8 +1317,6 @@ static int map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb,
4229 * unless it uses pio or talks to another transport,
4230 * or uses the provided scatter gather list for bulk.
4231 */
4232 - if (is_root_hub(urb->dev))
4233 - return 0;
4234
4235 if (usb_endpoint_xfer_control(&urb->ep->desc)
4236 && !(urb->transfer_flags & URB_NO_SETUP_DMA_MAP)) {
4237 @@ -1286,6 +1329,7 @@ static int map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb,
4238 if (dma_mapping_error(hcd->self.controller,
4239 urb->setup_dma))
4240 return -EAGAIN;
4241 + urb->transfer_flags |= URB_SETUP_MAP_SINGLE;
4242 } else if (hcd->driver->flags & HCD_LOCAL_MEM)
4243 ret = hcd_alloc_coherent(
4244 urb->dev->bus, mem_flags,
4245 @@ -1293,20 +1337,57 @@ static int map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb,
4246 (void **)&urb->setup_packet,
4247 sizeof(struct usb_ctrlrequest),
4248 DMA_TO_DEVICE);
4249 + if (ret)
4250 + return ret;
4251 + urb->transfer_flags |= URB_SETUP_MAP_LOCAL;
4252 }
4253
4254 dir = usb_urb_dir_in(urb) ? DMA_FROM_DEVICE : DMA_TO_DEVICE;
4255 - if (ret == 0 && urb->transfer_buffer_length != 0
4256 + if (urb->transfer_buffer_length != 0
4257 && !(urb->transfer_flags & URB_NO_TRANSFER_DMA_MAP)) {
4258 if (hcd->self.uses_dma) {
4259 - urb->transfer_dma = dma_map_single (
4260 - hcd->self.controller,
4261 - urb->transfer_buffer,
4262 - urb->transfer_buffer_length,
4263 - dir);
4264 - if (dma_mapping_error(hcd->self.controller,
4265 + if (urb->num_sgs) {
4266 + int n = dma_map_sg(
4267 + hcd->self.controller,
4268 + urb->sg->sg,
4269 + urb->num_sgs,
4270 + dir);
4271 + if (n <= 0)
4272 + ret = -EAGAIN;
4273 + else
4274 + urb->transfer_flags |= URB_DMA_MAP_SG;
4275 + if (n != urb->num_sgs) {
4276 + urb->num_sgs = n;
4277 + urb->transfer_flags |=
4278 + URB_DMA_SG_COMBINED;
4279 + }
4280 + } else if (urb->sg) {
4281 + struct scatterlist *sg;
4282 +
4283 + sg = (struct scatterlist *) urb->sg;
4284 + urb->transfer_dma = dma_map_page(
4285 + hcd->self.controller,
4286 + sg_page(sg),
4287 + sg->offset,
4288 + urb->transfer_buffer_length,
4289 + dir);
4290 + if (dma_mapping_error(hcd->self.controller,
4291 urb->transfer_dma))
4292 - return -EAGAIN;
4293 + ret = -EAGAIN;
4294 + else
4295 + urb->transfer_flags |= URB_DMA_MAP_PAGE;
4296 + } else {
4297 + urb->transfer_dma = dma_map_single(
4298 + hcd->self.controller,
4299 + urb->transfer_buffer,
4300 + urb->transfer_buffer_length,
4301 + dir);
4302 + if (dma_mapping_error(hcd->self.controller,
4303 + urb->transfer_dma))
4304 + ret = -EAGAIN;
4305 + else
4306 + urb->transfer_flags |= URB_DMA_MAP_SINGLE;
4307 + }
4308 } else if (hcd->driver->flags & HCD_LOCAL_MEM) {
4309 ret = hcd_alloc_coherent(
4310 urb->dev->bus, mem_flags,
4311 @@ -1314,55 +1395,16 @@ static int map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb,
4312 &urb->transfer_buffer,
4313 urb->transfer_buffer_length,
4314 dir);
4315 -
4316 - if (ret && usb_endpoint_xfer_control(&urb->ep->desc)
4317 - && !(urb->transfer_flags & URB_NO_SETUP_DMA_MAP))
4318 - hcd_free_coherent(urb->dev->bus,
4319 - &urb->setup_dma,
4320 - (void **)&urb->setup_packet,
4321 - sizeof(struct usb_ctrlrequest),
4322 - DMA_TO_DEVICE);
4323 + if (ret == 0)
4324 + urb->transfer_flags |= URB_MAP_LOCAL;
4325 }
4326 + if (ret && (urb->transfer_flags & (URB_SETUP_MAP_SINGLE |
4327 + URB_SETUP_MAP_LOCAL)))
4328 + unmap_urb_for_dma(hcd, urb);
4329 }
4330 return ret;
4331 }
4332
4333 -static void unmap_urb_for_dma(struct usb_hcd *hcd, struct urb *urb)
4334 -{
4335 - enum dma_data_direction dir;
4336 -
4337 - if (is_root_hub(urb->dev))
4338 - return;
4339 -
4340 - if (usb_endpoint_xfer_control(&urb->ep->desc)
4341 - && !(urb->transfer_flags & URB_NO_SETUP_DMA_MAP)) {
4342 - if (hcd->self.uses_dma)
4343 - dma_unmap_single(hcd->self.controller, urb->setup_dma,
4344 - sizeof(struct usb_ctrlrequest),
4345 - DMA_TO_DEVICE);
4346 - else if (hcd->driver->flags & HCD_LOCAL_MEM)
4347 - hcd_free_coherent(urb->dev->bus, &urb->setup_dma,
4348 - (void **)&urb->setup_packet,
4349 - sizeof(struct usb_ctrlrequest),
4350 - DMA_TO_DEVICE);
4351 - }
4352 -
4353 - dir = usb_urb_dir_in(urb) ? DMA_FROM_DEVICE : DMA_TO_DEVICE;
4354 - if (urb->transfer_buffer_length != 0
4355 - && !(urb->transfer_flags & URB_NO_TRANSFER_DMA_MAP)) {
4356 - if (hcd->self.uses_dma)
4357 - dma_unmap_single(hcd->self.controller,
4358 - urb->transfer_dma,
4359 - urb->transfer_buffer_length,
4360 - dir);
4361 - else if (hcd->driver->flags & HCD_LOCAL_MEM)
4362 - hcd_free_coherent(urb->dev->bus, &urb->transfer_dma,
4363 - &urb->transfer_buffer,
4364 - urb->transfer_buffer_length,
4365 - dir);
4366 - }
4367 -}
4368 -
4369 /*-------------------------------------------------------------------------*/
4370
4371 /* may be called in any context with a valid urb->dev usecount
4372 @@ -1391,21 +1433,20 @@ int usb_hcd_submit_urb (struct urb *urb, gfp_t mem_flags)
4373 * URBs must be submitted in process context with interrupts
4374 * enabled.
4375 */
4376 - status = map_urb_for_dma(hcd, urb, mem_flags);
4377 - if (unlikely(status)) {
4378 - usbmon_urb_submit_error(&hcd->self, urb, status);
4379 - goto error;
4380 - }
4381
4382 - if (is_root_hub(urb->dev))
4383 + if (is_root_hub(urb->dev)) {
4384 status = rh_urb_enqueue(hcd, urb);
4385 - else
4386 - status = hcd->driver->urb_enqueue(hcd, urb, mem_flags);
4387 + } else {
4388 + status = map_urb_for_dma(hcd, urb, mem_flags);
4389 + if (likely(status == 0)) {
4390 + status = hcd->driver->urb_enqueue(hcd, urb, mem_flags);
4391 + if (unlikely(status))
4392 + unmap_urb_for_dma(hcd, urb);
4393 + }
4394 + }
4395
4396 if (unlikely(status)) {
4397 usbmon_urb_submit_error(&hcd->self, urb, status);
4398 - unmap_urb_for_dma(hcd, urb);
4399 - error:
4400 urb->hcpriv = NULL;
4401 INIT_LIST_HEAD(&urb->urb_list);
4402 atomic_dec(&urb->use_count);
4403 diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c
4404 index cd22027..794dca2 100644
4405 --- a/drivers/usb/core/message.c
4406 +++ b/drivers/usb/core/message.c
4407 @@ -259,9 +259,6 @@ static void sg_clean(struct usb_sg_request *io)
4408 kfree(io->urbs);
4409 io->urbs = NULL;
4410 }
4411 - if (io->dev->dev.dma_mask != NULL)
4412 - usb_buffer_unmap_sg(io->dev, usb_pipein(io->pipe),
4413 - io->sg, io->nents);
4414 io->dev = NULL;
4415 }
4416
4417 @@ -364,7 +361,6 @@ int usb_sg_init(struct usb_sg_request *io, struct usb_device *dev,
4418 {
4419 int i;
4420 int urb_flags;
4421 - int dma;
4422 int use_sg;
4423
4424 if (!io || !dev || !sg
4425 @@ -378,21 +374,9 @@ int usb_sg_init(struct usb_sg_request *io, struct usb_device *dev,
4426 io->pipe = pipe;
4427 io->sg = sg;
4428 io->nents = nents;
4429 -
4430 - /* not all host controllers use DMA (like the mainstream pci ones);
4431 - * they can use PIO (sl811) or be software over another transport.
4432 - */
4433 - dma = (dev->dev.dma_mask != NULL);
4434 - if (dma)
4435 - io->entries = usb_buffer_map_sg(dev, usb_pipein(pipe),
4436 - sg, nents);
4437 - else
4438 - io->entries = nents;
4439 + io->entries = nents;
4440
4441 /* initialize all the urbs we'll use */
4442 - if (io->entries <= 0)
4443 - return io->entries;
4444 -
4445 if (dev->bus->sg_tablesize > 0) {
4446 io->urbs = kmalloc(sizeof *io->urbs, mem_flags);
4447 use_sg = true;
4448 @@ -404,8 +388,6 @@ int usb_sg_init(struct usb_sg_request *io, struct usb_device *dev,
4449 goto nomem;
4450
4451 urb_flags = 0;
4452 - if (dma)
4453 - urb_flags |= URB_NO_TRANSFER_DMA_MAP;
4454 if (usb_pipein(pipe))
4455 urb_flags |= URB_SHORT_NOT_OK;
4456
4457 @@ -423,12 +405,13 @@ int usb_sg_init(struct usb_sg_request *io, struct usb_device *dev,
4458
4459 io->urbs[0]->complete = sg_complete;
4460 io->urbs[0]->context = io;
4461 +
4462 /* A length of zero means transfer the whole sg list */
4463 io->urbs[0]->transfer_buffer_length = length;
4464 if (length == 0) {
4465 for_each_sg(sg, sg, io->entries, i) {
4466 io->urbs[0]->transfer_buffer_length +=
4467 - sg_dma_len(sg);
4468 + sg->length;
4469 }
4470 }
4471 io->urbs[0]->sg = io;
4472 @@ -454,26 +437,16 @@ int usb_sg_init(struct usb_sg_request *io, struct usb_device *dev,
4473 io->urbs[i]->context = io;
4474
4475 /*
4476 - * Some systems need to revert to PIO when DMA is temporarily
4477 - * unavailable. For their sakes, both transfer_buffer and
4478 - * transfer_dma are set when possible.
4479 - *
4480 - * Note that if IOMMU coalescing occurred, we cannot
4481 - * trust sg_page anymore, so check if S/G list shrunk.
4482 + * Some systems can't use DMA; they use PIO instead.
4483 + * For their sakes, transfer_buffer is set whenever
4484 + * possible.
4485 */
4486 - if (io->nents == io->entries && !PageHighMem(sg_page(sg)))
4487 + if (!PageHighMem(sg_page(sg)))
4488 io->urbs[i]->transfer_buffer = sg_virt(sg);
4489 else
4490 io->urbs[i]->transfer_buffer = NULL;
4491
4492 - if (dma) {
4493 - io->urbs[i]->transfer_dma = sg_dma_address(sg);
4494 - len = sg_dma_len(sg);
4495 - } else {
4496 - /* hc may use _only_ transfer_buffer */
4497 - len = sg->length;
4498 - }
4499 -
4500 + len = sg->length;
4501 if (length) {
4502 len = min_t(unsigned, len, length);
4503 length -= len;
4504 @@ -481,6 +454,8 @@ int usb_sg_init(struct usb_sg_request *io, struct usb_device *dev,
4505 io->entries = i + 1;
4506 }
4507 io->urbs[i]->transfer_buffer_length = len;
4508 +
4509 + io->urbs[i]->sg = (struct usb_sg_request *) sg;
4510 }
4511 io->urbs[--i]->transfer_flags &= ~URB_NO_INTERRUPT;
4512 }
4513 diff --git a/drivers/usb/core/urb.c b/drivers/usb/core/urb.c
4514 index 45a32da..fec46d0 100644
4515 --- a/drivers/usb/core/urb.c
4516 +++ b/drivers/usb/core/urb.c
4517 @@ -333,9 +333,12 @@ int usb_submit_urb(struct urb *urb, gfp_t mem_flags)
4518 is_out = usb_endpoint_dir_out(&ep->desc);
4519 }
4520
4521 - /* Cache the direction for later use */
4522 - urb->transfer_flags = (urb->transfer_flags & ~URB_DIR_MASK) |
4523 - (is_out ? URB_DIR_OUT : URB_DIR_IN);
4524 + /* Clear the internal flags and cache the direction for later use */
4525 + urb->transfer_flags &= ~(URB_DIR_MASK | URB_DMA_MAP_SINGLE |
4526 + URB_DMA_MAP_PAGE | URB_DMA_MAP_SG | URB_MAP_LOCAL |
4527 + URB_SETUP_MAP_SINGLE | URB_SETUP_MAP_LOCAL |
4528 + URB_DMA_SG_COMBINED);
4529 + urb->transfer_flags |= (is_out ? URB_DIR_OUT : URB_DIR_IN);
4530
4531 if (xfertype != USB_ENDPOINT_XFER_CONTROL &&
4532 dev->state < USB_STATE_CONFIGURED)
4533 diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
4534 index 0561430..956108e 100644
4535 --- a/drivers/usb/core/usb.c
4536 +++ b/drivers/usb/core/usb.c
4537 @@ -893,6 +893,7 @@ void usb_buffer_unmap(struct urb *urb)
4538 EXPORT_SYMBOL_GPL(usb_buffer_unmap);
4539 #endif /* 0 */
4540
4541 +#if 0
4542 /**
4543 * usb_buffer_map_sg - create scatterlist DMA mapping(s) for an endpoint
4544 * @dev: device to which the scatterlist will be mapped
4545 @@ -936,6 +937,7 @@ int usb_buffer_map_sg(const struct usb_device *dev, int is_in,
4546 is_in ? DMA_FROM_DEVICE : DMA_TO_DEVICE) ? : -ENOMEM;
4547 }
4548 EXPORT_SYMBOL_GPL(usb_buffer_map_sg);
4549 +#endif
4550
4551 /* XXX DISABLED, no users currently. If you wish to re-enable this
4552 * XXX please determine whether the sync is to transfer ownership of
4553 @@ -972,6 +974,7 @@ void usb_buffer_dmasync_sg(const struct usb_device *dev, int is_in,
4554 EXPORT_SYMBOL_GPL(usb_buffer_dmasync_sg);
4555 #endif
4556
4557 +#if 0
4558 /**
4559 * usb_buffer_unmap_sg - free DMA mapping(s) for a scatterlist
4560 * @dev: device to which the scatterlist will be mapped
4561 @@ -997,6 +1000,7 @@ void usb_buffer_unmap_sg(const struct usb_device *dev, int is_in,
4562 is_in ? DMA_FROM_DEVICE : DMA_TO_DEVICE);
4563 }
4564 EXPORT_SYMBOL_GPL(usb_buffer_unmap_sg);
4565 +#endif
4566
4567 /* To disable USB, kernel command line is 'nousb' not 'usbcore.nousb' */
4568 #ifdef MODULE
4569 diff --git a/drivers/usb/gadget/fsl_udc_core.c b/drivers/usb/gadget/fsl_udc_core.c
4570 index fa3d142..08a9a62 100644
4571 --- a/drivers/usb/gadget/fsl_udc_core.c
4572 +++ b/drivers/usb/gadget/fsl_udc_core.c
4573 @@ -489,7 +489,7 @@ static int fsl_ep_enable(struct usb_ep *_ep,
4574 case USB_ENDPOINT_XFER_ISOC:
4575 /* Calculate transactions needed for high bandwidth iso */
4576 mult = (unsigned char)(1 + ((max >> 11) & 0x03));
4577 - max = max & 0x8ff; /* bit 0~10 */
4578 + max = max & 0x7ff; /* bit 0~10 */
4579 /* 3 transactions at most */
4580 if (mult > 3)
4581 goto en_done;
4582 diff --git a/drivers/usb/host/ehci-au1xxx.c b/drivers/usb/host/ehci-au1xxx.c
4583 index e3a74e7..a422a1b 100644
4584 --- a/drivers/usb/host/ehci-au1xxx.c
4585 +++ b/drivers/usb/host/ehci-au1xxx.c
4586 @@ -215,26 +215,17 @@ static int ehci_hcd_au1xxx_drv_suspend(struct device *dev)
4587 msleep(10);
4588
4589 /* Root hub was already suspended. Disable irq emission and
4590 - * mark HW unaccessible, bail out if RH has been resumed. Use
4591 - * the spinlock to properly synchronize with possible pending
4592 - * RH suspend or resume activity.
4593 - *
4594 - * This is still racy as hcd->state is manipulated outside of
4595 - * any locks =P But that will be a different fix.
4596 + * mark HW unaccessible. The PM and USB cores make sure that
4597 + * the root hub is either suspended or stopped.
4598 */
4599 spin_lock_irqsave(&ehci->lock, flags);
4600 - if (hcd->state != HC_STATE_SUSPENDED) {
4601 - rc = -EINVAL;
4602 - goto bail;
4603 - }
4604 + ehci_prepare_ports_for_controller_suspend(ehci);
4605 ehci_writel(ehci, 0, &ehci->regs->intr_enable);
4606 (void)ehci_readl(ehci, &ehci->regs->intr_enable);
4607
4608 clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
4609
4610 au1xxx_stop_ehc();
4611 -
4612 -bail:
4613 spin_unlock_irqrestore(&ehci->lock, flags);
4614
4615 // could save FLADJ in case of Vaux power loss
4616 @@ -264,6 +255,7 @@ static int ehci_hcd_au1xxx_drv_resume(struct device *dev)
4617 if (ehci_readl(ehci, &ehci->regs->configured_flag) == FLAG_CF) {
4618 int mask = INTR_MASK;
4619
4620 + ehci_prepare_ports_for_controller_resume(ehci);
4621 if (!hcd->self.root_hub->do_remote_wakeup)
4622 mask &= ~STS_PCD;
4623 ehci_writel(ehci, mask, &ehci->regs->intr_enable);
4624 diff --git a/drivers/usb/host/ehci-fsl.c b/drivers/usb/host/ehci-fsl.c
4625 index 0e26aa1..5cd967d 100644
4626 --- a/drivers/usb/host/ehci-fsl.c
4627 +++ b/drivers/usb/host/ehci-fsl.c
4628 @@ -313,6 +313,7 @@ static int ehci_fsl_drv_suspend(struct device *dev)
4629 struct ehci_fsl *ehci_fsl = hcd_to_ehci_fsl(hcd);
4630 void __iomem *non_ehci = hcd->regs;
4631
4632 + ehci_prepare_ports_for_controller_suspend(hcd_to_ehci(hcd));
4633 if (!fsl_deep_sleep())
4634 return 0;
4635
4636 @@ -327,6 +328,7 @@ static int ehci_fsl_drv_resume(struct device *dev)
4637 struct ehci_hcd *ehci = hcd_to_ehci(hcd);
4638 void __iomem *non_ehci = hcd->regs;
4639
4640 + ehci_prepare_ports_for_controller_resume(ehci);
4641 if (!fsl_deep_sleep())
4642 return 0;
4643
4644 diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c
4645 index c7178bc..1b2af4d 100644
4646 --- a/drivers/usb/host/ehci-hub.c
4647 +++ b/drivers/usb/host/ehci-hub.c
4648 @@ -106,12 +106,75 @@ static void ehci_handover_companion_ports(struct ehci_hcd *ehci)
4649 ehci->owned_ports = 0;
4650 }
4651
4652 +static void ehci_adjust_port_wakeup_flags(struct ehci_hcd *ehci,
4653 + bool suspending)
4654 +{
4655 + int port;
4656 + u32 temp;
4657 +
4658 + /* If remote wakeup is enabled for the root hub but disabled
4659 + * for the controller, we must adjust all the port wakeup flags
4660 + * when the controller is suspended or resumed. In all other
4661 + * cases they don't need to be changed.
4662 + */
4663 + if (!ehci_to_hcd(ehci)->self.root_hub->do_remote_wakeup ||
4664 + device_may_wakeup(ehci_to_hcd(ehci)->self.controller))
4665 + return;
4666 +
4667 + /* clear phy low-power mode before changing wakeup flags */
4668 + if (ehci->has_hostpc) {
4669 + port = HCS_N_PORTS(ehci->hcs_params);
4670 + while (port--) {
4671 + u32 __iomem *hostpc_reg;
4672 +
4673 + hostpc_reg = (u32 __iomem *)((u8 *) ehci->regs
4674 + + HOSTPC0 + 4 * port);
4675 + temp = ehci_readl(ehci, hostpc_reg);
4676 + ehci_writel(ehci, temp & ~HOSTPC_PHCD, hostpc_reg);
4677 + }
4678 + msleep(5);
4679 + }
4680 +
4681 + port = HCS_N_PORTS(ehci->hcs_params);
4682 + while (port--) {
4683 + u32 __iomem *reg = &ehci->regs->port_status[port];
4684 + u32 t1 = ehci_readl(ehci, reg) & ~PORT_RWC_BITS;
4685 + u32 t2 = t1 & ~PORT_WAKE_BITS;
4686 +
4687 + /* If we are suspending the controller, clear the flags.
4688 + * If we are resuming the controller, set the wakeup flags.
4689 + */
4690 + if (!suspending) {
4691 + if (t1 & PORT_CONNECT)
4692 + t2 |= PORT_WKOC_E | PORT_WKDISC_E;
4693 + else
4694 + t2 |= PORT_WKOC_E | PORT_WKCONN_E;
4695 + }
4696 + ehci_vdbg(ehci, "port %d, %08x -> %08x\n",
4697 + port + 1, t1, t2);
4698 + ehci_writel(ehci, t2, reg);
4699 + }
4700 +
4701 + /* enter phy low-power mode again */
4702 + if (ehci->has_hostpc) {
4703 + port = HCS_N_PORTS(ehci->hcs_params);
4704 + while (port--) {
4705 + u32 __iomem *hostpc_reg;
4706 +
4707 + hostpc_reg = (u32 __iomem *)((u8 *) ehci->regs
4708 + + HOSTPC0 + 4 * port);
4709 + temp = ehci_readl(ehci, hostpc_reg);
4710 + ehci_writel(ehci, temp | HOSTPC_PHCD, hostpc_reg);
4711 + }
4712 + }
4713 +}
4714 +
4715 static int ehci_bus_suspend (struct usb_hcd *hcd)
4716 {
4717 struct ehci_hcd *ehci = hcd_to_ehci (hcd);
4718 int port;
4719 int mask;
4720 - u32 __iomem *hostpc_reg = NULL;
4721 + int changed;
4722
4723 ehci_dbg(ehci, "suspend root hub\n");
4724
4725 @@ -155,15 +218,13 @@ static int ehci_bus_suspend (struct usb_hcd *hcd)
4726 */
4727 ehci->bus_suspended = 0;
4728 ehci->owned_ports = 0;
4729 + changed = 0;
4730 port = HCS_N_PORTS(ehci->hcs_params);
4731 while (port--) {
4732 u32 __iomem *reg = &ehci->regs->port_status [port];
4733 u32 t1 = ehci_readl(ehci, reg) & ~PORT_RWC_BITS;
4734 - u32 t2 = t1;
4735 + u32 t2 = t1 & ~PORT_WAKE_BITS;
4736
4737 - if (ehci->has_hostpc)
4738 - hostpc_reg = (u32 __iomem *)((u8 *)ehci->regs
4739 - + HOSTPC0 + 4 * (port & 0xff));
4740 /* keep track of which ports we suspend */
4741 if (t1 & PORT_OWNER)
4742 set_bit(port, &ehci->owned_ports);
4743 @@ -172,40 +233,45 @@ static int ehci_bus_suspend (struct usb_hcd *hcd)
4744 set_bit(port, &ehci->bus_suspended);
4745 }
4746
4747 - /* enable remote wakeup on all ports */
4748 + /* enable remote wakeup on all ports, if told to do so */
4749 if (hcd->self.root_hub->do_remote_wakeup) {
4750 /* only enable appropriate wake bits, otherwise the
4751 * hardware can not go phy low power mode. If a race
4752 * condition happens here(connection change during bits
4753 * set), the port change detection will finally fix it.
4754 */
4755 - if (t1 & PORT_CONNECT) {
4756 + if (t1 & PORT_CONNECT)
4757 t2 |= PORT_WKOC_E | PORT_WKDISC_E;
4758 - t2 &= ~PORT_WKCONN_E;
4759 - } else {
4760 + else
4761 t2 |= PORT_WKOC_E | PORT_WKCONN_E;
4762 - t2 &= ~PORT_WKDISC_E;
4763 - }
4764 - } else
4765 - t2 &= ~PORT_WAKE_BITS;
4766 + }
4767
4768 if (t1 != t2) {
4769 ehci_vdbg (ehci, "port %d, %08x -> %08x\n",
4770 port + 1, t1, t2);
4771 ehci_writel(ehci, t2, reg);
4772 - if (hostpc_reg) {
4773 - u32 t3;
4774 + changed = 1;
4775 + }
4776 + }
4777
4778 - spin_unlock_irq(&ehci->lock);
4779 - msleep(5);/* 5ms for HCD enter low pwr mode */
4780 - spin_lock_irq(&ehci->lock);
4781 - t3 = ehci_readl(ehci, hostpc_reg);
4782 - ehci_writel(ehci, t3 | HOSTPC_PHCD, hostpc_reg);
4783 - t3 = ehci_readl(ehci, hostpc_reg);
4784 - ehci_dbg(ehci, "Port%d phy low pwr mode %s\n",
4785 + if (changed && ehci->has_hostpc) {
4786 + spin_unlock_irq(&ehci->lock);
4787 + msleep(5); /* 5 ms for HCD to enter low-power mode */
4788 + spin_lock_irq(&ehci->lock);
4789 +
4790 + port = HCS_N_PORTS(ehci->hcs_params);
4791 + while (port--) {
4792 + u32 __iomem *hostpc_reg;
4793 + u32 t3;
4794 +
4795 + hostpc_reg = (u32 __iomem *)((u8 *) ehci->regs
4796 + + HOSTPC0 + 4 * port);
4797 + t3 = ehci_readl(ehci, hostpc_reg);
4798 + ehci_writel(ehci, t3 | HOSTPC_PHCD, hostpc_reg);
4799 + t3 = ehci_readl(ehci, hostpc_reg);
4800 + ehci_dbg(ehci, "Port %d phy low-power mode %s\n",
4801 port, (t3 & HOSTPC_PHCD) ?
4802 "succeeded" : "failed");
4803 - }
4804 }
4805 }
4806
4807 @@ -291,6 +357,25 @@ static int ehci_bus_resume (struct usb_hcd *hcd)
4808 msleep(8);
4809 spin_lock_irq(&ehci->lock);
4810
4811 + /* clear phy low-power mode before resume */
4812 + if (ehci->bus_suspended && ehci->has_hostpc) {
4813 + i = HCS_N_PORTS(ehci->hcs_params);
4814 + while (i--) {
4815 + if (test_bit(i, &ehci->bus_suspended)) {
4816 + u32 __iomem *hostpc_reg;
4817 +
4818 + hostpc_reg = (u32 __iomem *)((u8 *) ehci->regs
4819 + + HOSTPC0 + 4 * i);
4820 + temp = ehci_readl(ehci, hostpc_reg);
4821 + ehci_writel(ehci, temp & ~HOSTPC_PHCD,
4822 + hostpc_reg);
4823 + }
4824 + }
4825 + spin_unlock_irq(&ehci->lock);
4826 + msleep(5);
4827 + spin_lock_irq(&ehci->lock);
4828 + }
4829 +
4830 /* manually resume the ports we suspended during bus_suspend() */
4831 i = HCS_N_PORTS (ehci->hcs_params);
4832 while (i--) {
4833 @@ -675,16 +760,25 @@ static int ehci_hub_control (
4834 goto error;
4835 if (ehci->no_selective_suspend)
4836 break;
4837 - if (temp & PORT_SUSPEND) {
4838 - if ((temp & PORT_PE) == 0)
4839 - goto error;
4840 - /* resume signaling for 20 msec */
4841 - temp &= ~(PORT_RWC_BITS | PORT_WAKE_BITS);
4842 - ehci_writel(ehci, temp | PORT_RESUME,
4843 - status_reg);
4844 - ehci->reset_done [wIndex] = jiffies
4845 - + msecs_to_jiffies (20);
4846 + if (!(temp & PORT_SUSPEND))
4847 + break;
4848 + if ((temp & PORT_PE) == 0)
4849 + goto error;
4850 +
4851 + /* clear phy low-power mode before resume */
4852 + if (hostpc_reg) {
4853 + temp1 = ehci_readl(ehci, hostpc_reg);
4854 + ehci_writel(ehci, temp1 & ~HOSTPC_PHCD,
4855 + hostpc_reg);
4856 + spin_unlock_irqrestore(&ehci->lock, flags);
4857 + msleep(5);/* wait to leave low-power mode */
4858 + spin_lock_irqsave(&ehci->lock, flags);
4859 }
4860 + /* resume signaling for 20 msec */
4861 + temp &= ~(PORT_RWC_BITS | PORT_WAKE_BITS);
4862 + ehci_writel(ehci, temp | PORT_RESUME, status_reg);
4863 + ehci->reset_done[wIndex] = jiffies
4864 + + msecs_to_jiffies(20);
4865 break;
4866 case USB_PORT_FEAT_C_SUSPEND:
4867 clear_bit(wIndex, &ehci->port_c_suspend);
4868 diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c
4869 index ead5f4f..c5f662d 100644
4870 --- a/drivers/usb/host/ehci-pci.c
4871 +++ b/drivers/usb/host/ehci-pci.c
4872 @@ -284,23 +284,15 @@ static int ehci_pci_suspend(struct usb_hcd *hcd)
4873 msleep(10);
4874
4875 /* Root hub was already suspended. Disable irq emission and
4876 - * mark HW unaccessible, bail out if RH has been resumed. Use
4877 - * the spinlock to properly synchronize with possible pending
4878 - * RH suspend or resume activity.
4879 - *
4880 - * This is still racy as hcd->state is manipulated outside of
4881 - * any locks =P But that will be a different fix.
4882 + * mark HW unaccessible. The PM and USB cores make sure that
4883 + * the root hub is either suspended or stopped.
4884 */
4885 spin_lock_irqsave (&ehci->lock, flags);
4886 - if (hcd->state != HC_STATE_SUSPENDED) {
4887 - rc = -EINVAL;
4888 - goto bail;
4889 - }
4890 + ehci_prepare_ports_for_controller_suspend(ehci);
4891 ehci_writel(ehci, 0, &ehci->regs->intr_enable);
4892 (void)ehci_readl(ehci, &ehci->regs->intr_enable);
4893
4894 clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
4895 - bail:
4896 spin_unlock_irqrestore (&ehci->lock, flags);
4897
4898 // could save FLADJ in case of Vaux power loss
4899 @@ -330,6 +322,7 @@ static int ehci_pci_resume(struct usb_hcd *hcd, bool hibernated)
4900 !hibernated) {
4901 int mask = INTR_MASK;
4902
4903 + ehci_prepare_ports_for_controller_resume(ehci);
4904 if (!hcd->self.root_hub->do_remote_wakeup)
4905 mask &= ~STS_PCD;
4906 ehci_writel(ehci, mask, &ehci->regs->intr_enable);
4907 diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h
4908 index 556c0b4..ddf61c3 100644
4909 --- a/drivers/usb/host/ehci.h
4910 +++ b/drivers/usb/host/ehci.h
4911 @@ -536,6 +536,16 @@ struct ehci_fstn {
4912
4913 /*-------------------------------------------------------------------------*/
4914
4915 +/* Prepare the PORTSC wakeup flags during controller suspend/resume */
4916 +
4917 +#define ehci_prepare_ports_for_controller_suspend(ehci) \
4918 + ehci_adjust_port_wakeup_flags(ehci, true);
4919 +
4920 +#define ehci_prepare_ports_for_controller_resume(ehci) \
4921 + ehci_adjust_port_wakeup_flags(ehci, false);
4922 +
4923 +/*-------------------------------------------------------------------------*/
4924 +
4925 #ifdef CONFIG_USB_EHCI_ROOT_HUB_TT
4926
4927 /*
4928 diff --git a/drivers/usb/host/fhci.h b/drivers/usb/host/fhci.h
4929 index 72dae1c..3b6e864 100644
4930 --- a/drivers/usb/host/fhci.h
4931 +++ b/drivers/usb/host/fhci.h
4932 @@ -20,6 +20,7 @@
4933
4934 #include <linux/kernel.h>
4935 #include <linux/types.h>
4936 +#include <linux/bug.h>
4937 #include <linux/spinlock.h>
4938 #include <linux/interrupt.h>
4939 #include <linux/kfifo.h>
4940 @@ -515,9 +516,13 @@ static inline int cq_put(struct kfifo *kfifo, void *p)
4941
4942 static inline void *cq_get(struct kfifo *kfifo)
4943 {
4944 - void *p = NULL;
4945 + unsigned int sz;
4946 + void *p;
4947 +
4948 + sz = kfifo_out(kfifo, (void *)&p, sizeof(p));
4949 + if (sz != sizeof(p))
4950 + return NULL;
4951
4952 - kfifo_out(kfifo, (void *)&p, sizeof(p));
4953 return p;
4954 }
4955
4956 diff --git a/drivers/usb/host/whci/qset.c b/drivers/usb/host/whci/qset.c
4957 index 141d049..b388dd1 100644
4958 --- a/drivers/usb/host/whci/qset.c
4959 +++ b/drivers/usb/host/whci/qset.c
4960 @@ -646,7 +646,7 @@ int qset_add_urb(struct whc *whc, struct whc_qset *qset, struct urb *urb,
4961 wurb->urb = urb;
4962 INIT_WORK(&wurb->dequeue_work, urb_dequeue_work);
4963
4964 - if (urb->sg) {
4965 + if (urb->num_sgs) {
4966 ret = qset_add_urb_sg(whc, qset, urb, mem_flags);
4967 if (ret == -EINVAL) {
4968 qset_free_stds(qset, urb);
4969 diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c
4970 index 417d37a..98a73cd 100644
4971 --- a/drivers/usb/host/xhci-pci.c
4972 +++ b/drivers/usb/host/xhci-pci.c
4973 @@ -54,7 +54,7 @@ static int xhci_pci_setup(struct usb_hcd *hcd)
4974 struct pci_dev *pdev = to_pci_dev(hcd->self.controller);
4975 int retval;
4976
4977 - hcd->self.sg_tablesize = TRBS_PER_SEGMENT - 1;
4978 + hcd->self.sg_tablesize = TRBS_PER_SEGMENT - 2;
4979
4980 xhci->cap_regs = hcd->regs;
4981 xhci->op_regs = hcd->regs +
4982 diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
4983 index 85d7e8f..40cba25 100644
4984 --- a/drivers/usb/host/xhci-ring.c
4985 +++ b/drivers/usb/host/xhci-ring.c
4986 @@ -242,10 +242,27 @@ static int room_on_ring(struct xhci_hcd *xhci, struct xhci_ring *ring,
4987 int i;
4988 union xhci_trb *enq = ring->enqueue;
4989 struct xhci_segment *enq_seg = ring->enq_seg;
4990 + struct xhci_segment *cur_seg;
4991 + unsigned int left_on_ring;
4992
4993 /* Check if ring is empty */
4994 - if (enq == ring->dequeue)
4995 + if (enq == ring->dequeue) {
4996 + /* Can't use link trbs */
4997 + left_on_ring = TRBS_PER_SEGMENT - 1;
4998 + for (cur_seg = enq_seg->next; cur_seg != enq_seg;
4999 + cur_seg = cur_seg->next)
5000 + left_on_ring += TRBS_PER_SEGMENT - 1;
5001 +
5002 + /* Always need one TRB free in the ring. */
5003 + left_on_ring -= 1;
5004 + if (num_trbs > left_on_ring) {
5005 + xhci_warn(xhci, "Not enough room on ring; "
5006 + "need %u TRBs, %u TRBs left\n",
5007 + num_trbs, left_on_ring);
5008 + return 0;
5009 + }
5010 return 1;
5011 + }
5012 /* Make sure there's an extra empty TRB available */
5013 for (i = 0; i <= num_trbs; ++i) {
5014 if (enq == ring->dequeue)
5015 @@ -334,7 +351,8 @@ static struct xhci_segment *find_trb_seg(
5016 while (cur_seg->trbs > trb ||
5017 &cur_seg->trbs[TRBS_PER_SEGMENT - 1] < trb) {
5018 generic_trb = &cur_seg->trbs[TRBS_PER_SEGMENT - 1].generic;
5019 - if (TRB_TYPE(generic_trb->field[3]) == TRB_LINK &&
5020 + if ((generic_trb->field[3] & TRB_TYPE_BITMASK) ==
5021 + TRB_TYPE(TRB_LINK) &&
5022 (generic_trb->field[3] & LINK_TOGGLE))
5023 *cycle_state = ~(*cycle_state) & 0x1;
5024 cur_seg = cur_seg->next;
5025 @@ -390,7 +408,7 @@ void xhci_find_new_dequeue_state(struct xhci_hcd *xhci,
5026 BUG();
5027
5028 trb = &state->new_deq_ptr->generic;
5029 - if (TRB_TYPE(trb->field[3]) == TRB_LINK &&
5030 + if ((trb->field[3] & TRB_TYPE_BITMASK) == TRB_TYPE(TRB_LINK) &&
5031 (trb->field[3] & LINK_TOGGLE))
5032 state->new_cycle_state = ~(state->new_cycle_state) & 0x1;
5033 next_trb(xhci, ep_ring, &state->new_deq_seg, &state->new_deq_ptr);
5034 @@ -578,6 +596,8 @@ static void handle_stopped_endpoint(struct xhci_hcd *xhci,
5035 /* Otherwise just ring the doorbell to restart the ring */
5036 ring_ep_doorbell(xhci, slot_id, ep_index);
5037 }
5038 + ep->stopped_td = NULL;
5039 + ep->stopped_trb = NULL;
5040
5041 /*
5042 * Drop the lock and complete the URBs in the cancelled TD list.
5043 @@ -1061,8 +1081,13 @@ static void xhci_cleanup_halted_endpoint(struct xhci_hcd *xhci,
5044 ep->ep_state |= EP_HALTED;
5045 ep->stopped_td = td;
5046 ep->stopped_trb = event_trb;
5047 +
5048 xhci_queue_reset_ep(xhci, slot_id, ep_index);
5049 xhci_cleanup_stalled_ring(xhci, td->urb->dev, ep_index);
5050 +
5051 + ep->stopped_td = NULL;
5052 + ep->stopped_trb = NULL;
5053 +
5054 xhci_ring_cmd_db(xhci);
5055 }
5056
5057 @@ -1390,8 +1415,10 @@ static int handle_tx_event(struct xhci_hcd *xhci,
5058 for (cur_trb = ep_ring->dequeue, cur_seg = ep_ring->deq_seg;
5059 cur_trb != event_trb;
5060 next_trb(xhci, ep_ring, &cur_seg, &cur_trb)) {
5061 - if (TRB_TYPE(cur_trb->generic.field[3]) != TRB_TR_NOOP &&
5062 - TRB_TYPE(cur_trb->generic.field[3]) != TRB_LINK)
5063 + if ((cur_trb->generic.field[3] &
5064 + TRB_TYPE_BITMASK) != TRB_TYPE(TRB_TR_NOOP) &&
5065 + (cur_trb->generic.field[3] &
5066 + TRB_TYPE_BITMASK) != TRB_TYPE(TRB_LINK))
5067 td->urb->actual_length +=
5068 TRB_LEN(cur_trb->generic.field[2]);
5069 }
5070 @@ -1938,7 +1965,7 @@ int xhci_queue_bulk_tx(struct xhci_hcd *xhci, gfp_t mem_flags,
5071 int running_total, trb_buff_len, ret;
5072 u64 addr;
5073
5074 - if (urb->sg)
5075 + if (urb->num_sgs)
5076 return queue_bulk_sg_tx(xhci, mem_flags, urb, slot_id, ep_index);
5077
5078 ep_ring = xhci->devs[slot_id]->eps[ep_index].ring;
5079 diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
5080 index 7e42772..5a752d6 100644
5081 --- a/drivers/usb/host/xhci.c
5082 +++ b/drivers/usb/host/xhci.c
5083 @@ -105,6 +105,33 @@ int xhci_halt(struct xhci_hcd *xhci)
5084 }
5085
5086 /*
5087 + * Set the run bit and wait for the host to be running.
5088 + */
5089 +int xhci_start(struct xhci_hcd *xhci)
5090 +{
5091 + u32 temp;
5092 + int ret;
5093 +
5094 + temp = xhci_readl(xhci, &xhci->op_regs->command);
5095 + temp |= (CMD_RUN);
5096 + xhci_dbg(xhci, "// Turn on HC, cmd = 0x%x.\n",
5097 + temp);
5098 + xhci_writel(xhci, temp, &xhci->op_regs->command);
5099 +
5100 + /*
5101 + * Wait for the HCHalted Status bit to be 0 to indicate the host is
5102 + * running.
5103 + */
5104 + ret = handshake(xhci, &xhci->op_regs->status,
5105 + STS_HALT, 0, XHCI_MAX_HALT_USEC);
5106 + if (ret == -ETIMEDOUT)
5107 + xhci_err(xhci, "Host took too long to start, "
5108 + "waited %u microseconds.\n",
5109 + XHCI_MAX_HALT_USEC);
5110 + return ret;
5111 +}
5112 +
5113 +/*
5114 * Reset a halted HC, and set the internal HC state to HC_STATE_HALT.
5115 *
5116 * This resets pipelines, timers, counters, state machines, etc.
5117 @@ -115,6 +142,7 @@ int xhci_reset(struct xhci_hcd *xhci)
5118 {
5119 u32 command;
5120 u32 state;
5121 + int ret;
5122
5123 state = xhci_readl(xhci, &xhci->op_regs->status);
5124 if ((state & STS_HALT) == 0) {
5125 @@ -129,7 +157,17 @@ int xhci_reset(struct xhci_hcd *xhci)
5126 /* XXX: Why does EHCI set this here? Shouldn't other code do this? */
5127 xhci_to_hcd(xhci)->state = HC_STATE_HALT;
5128
5129 - return handshake(xhci, &xhci->op_regs->command, CMD_RESET, 0, 250 * 1000);
5130 + ret = handshake(xhci, &xhci->op_regs->command,
5131 + CMD_RESET, 0, 250 * 1000);
5132 + if (ret)
5133 + return ret;
5134 +
5135 + xhci_dbg(xhci, "Wait for controller to be ready for doorbell rings\n");
5136 + /*
5137 + * xHCI cannot write to any doorbells or operational registers other
5138 + * than status until the "Controller Not Ready" flag is cleared.
5139 + */
5140 + return handshake(xhci, &xhci->op_regs->status, STS_CNR, 0, 250 * 1000);
5141 }
5142
5143
5144 @@ -452,13 +490,11 @@ int xhci_run(struct usb_hcd *hcd)
5145 if (NUM_TEST_NOOPS > 0)
5146 doorbell = xhci_setup_one_noop(xhci);
5147
5148 - temp = xhci_readl(xhci, &xhci->op_regs->command);
5149 - temp |= (CMD_RUN);
5150 - xhci_dbg(xhci, "// Turn on HC, cmd = 0x%x.\n",
5151 - temp);
5152 - xhci_writel(xhci, temp, &xhci->op_regs->command);
5153 - /* Flush PCI posted writes */
5154 - temp = xhci_readl(xhci, &xhci->op_regs->command);
5155 + if (xhci_start(xhci)) {
5156 + xhci_halt(xhci);
5157 + return -ENODEV;
5158 + }
5159 +
5160 xhci_dbg(xhci, "// @%p = 0x%x\n", &xhci->op_regs->command, temp);
5161 if (doorbell)
5162 (*doorbell)(xhci);
5163 @@ -1438,6 +1474,8 @@ void xhci_endpoint_reset(struct usb_hcd *hcd,
5164 kfree(virt_ep->stopped_td);
5165 xhci_ring_cmd_db(xhci);
5166 }
5167 + virt_ep->stopped_td = NULL;
5168 + virt_ep->stopped_trb = NULL;
5169 spin_unlock_irqrestore(&xhci->lock, flags);
5170
5171 if (ret)
5172 diff --git a/drivers/usb/mon/mon_bin.c b/drivers/usb/mon/mon_bin.c
5173 index ddf7f9a..8a7968d 100644
5174 --- a/drivers/usb/mon/mon_bin.c
5175 +++ b/drivers/usb/mon/mon_bin.c
5176 @@ -416,7 +416,7 @@ static unsigned int mon_bin_get_data(const struct mon_reader_bin *rp,
5177
5178 } else {
5179 /* If IOMMU coalescing occurred, we cannot trust sg_page */
5180 - if (urb->sg->nents != urb->num_sgs) {
5181 + if (urb->transfer_flags & URB_DMA_SG_COMBINED) {
5182 *flag = 'D';
5183 return length;
5184 }
5185 diff --git a/drivers/usb/mon/mon_text.c b/drivers/usb/mon/mon_text.c
5186 index 4d0be13..d562602 100644
5187 --- a/drivers/usb/mon/mon_text.c
5188 +++ b/drivers/usb/mon/mon_text.c
5189 @@ -161,9 +161,7 @@ static inline char mon_text_get_data(struct mon_event_text *ep, struct urb *urb,
5190 } else {
5191 struct scatterlist *sg = urb->sg->sg;
5192
5193 - /* If IOMMU coalescing occurred, we cannot trust sg_page */
5194 - if (urb->sg->nents != urb->num_sgs ||
5195 - PageHighMem(sg_page(sg)))
5196 + if (PageHighMem(sg_page(sg)))
5197 return 'D';
5198
5199 /* For the text interface we copy only the first sg buffer */
5200 diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c
5201 index ec9b044..009e26c 100644
5202 --- a/drivers/usb/serial/cp210x.c
5203 +++ b/drivers/usb/serial/cp210x.c
5204 @@ -61,6 +61,8 @@ static const struct usb_device_id id_table[] = {
5205 { USB_DEVICE(0x0745, 0x1000) }, /* CipherLab USB CCD Barcode Scanner 1000 */
5206 { USB_DEVICE(0x08e6, 0x5501) }, /* Gemalto Prox-PU/CU contactless smartcard reader */
5207 { USB_DEVICE(0x08FD, 0x000A) }, /* Digianswer A/S , ZigBee/802.15.4 MAC Device */
5208 + { USB_DEVICE(0x0BED, 0x1100) }, /* MEI (TM) Cashflow-SC Bill/Voucher Acceptor */
5209 + { USB_DEVICE(0x0BED, 0x1101) }, /* MEI series 2000 Combo Acceptor */
5210 { USB_DEVICE(0x0FCF, 0x1003) }, /* Dynastream ANT development board */
5211 { USB_DEVICE(0x0FCF, 0x1004) }, /* Dynastream ANT2USB */
5212 { USB_DEVICE(0x0FCF, 0x1006) }, /* Dynastream ANT development board */
5213 @@ -72,9 +74,12 @@ static const struct usb_device_id id_table[] = {
5214 { USB_DEVICE(0x10C4, 0x1601) }, /* Arkham Technology DS101 Adapter */
5215 { USB_DEVICE(0x10C4, 0x800A) }, /* SPORTident BSM7-D-USB main station */
5216 { USB_DEVICE(0x10C4, 0x803B) }, /* Pololu USB-serial converter */
5217 + { USB_DEVICE(0x10C4, 0x8044) }, /* Cygnal Debug Adapter */
5218 + { USB_DEVICE(0x10C4, 0x804E) }, /* Software Bisque Paramount ME build-in converter */
5219 { USB_DEVICE(0x10C4, 0x8053) }, /* Enfora EDG1228 */
5220 { USB_DEVICE(0x10C4, 0x8054) }, /* Enfora GSM2228 */
5221 { USB_DEVICE(0x10C4, 0x8066) }, /* Argussoft In-System Programmer */
5222 + { USB_DEVICE(0x10C4, 0x806F) }, /* IMS USB to RS422 Converter Cable */
5223 { USB_DEVICE(0x10C4, 0x807A) }, /* Crumb128 board */
5224 { USB_DEVICE(0x10C4, 0x80CA) }, /* Degree Controls Inc */
5225 { USB_DEVICE(0x10C4, 0x80DD) }, /* Tracient RFID */
5226 @@ -82,12 +87,15 @@ static const struct usb_device_id id_table[] = {
5227 { USB_DEVICE(0x10C4, 0x8115) }, /* Arygon NFC/Mifare Reader */
5228 { USB_DEVICE(0x10C4, 0x813D) }, /* Burnside Telecom Deskmobile */
5229 { USB_DEVICE(0x10C4, 0x813F) }, /* Tams Master Easy Control */
5230 + { USB_DEVICE(0x10C4, 0x8149) }, /* West Mountain Radio Computerized Battery Analyzer */
5231 { USB_DEVICE(0x10C4, 0x814A) }, /* West Mountain Radio RIGblaster P&P */
5232 { USB_DEVICE(0x10C4, 0x814B) }, /* West Mountain Radio RIGtalk */
5233 { USB_DEVICE(0x10C4, 0x815E) }, /* Helicomm IP-Link 1220-DVM */
5234 + { USB_DEVICE(0x10C4, 0x818B) }, /* AVIT Research USB to TTL */
5235 { USB_DEVICE(0x10C4, 0x819F) }, /* MJS USB Toslink Switcher */
5236 { USB_DEVICE(0x10C4, 0x81A6) }, /* ThinkOptics WavIt */
5237 { USB_DEVICE(0x10C4, 0x81AC) }, /* MSD Dash Hawk */
5238 + { USB_DEVICE(0x10C4, 0x81AD) }, /* INSYS USB Modem */
5239 { USB_DEVICE(0x10C4, 0x81C8) }, /* Lipowsky Industrie Elektronik GmbH, Baby-JTAG */
5240 { USB_DEVICE(0x10C4, 0x81E2) }, /* Lipowsky Industrie Elektronik GmbH, Baby-LIN */
5241 { USB_DEVICE(0x10C4, 0x81E7) }, /* Aerocomm Radio */
5242 @@ -105,6 +113,7 @@ static const struct usb_device_id id_table[] = {
5243 { USB_DEVICE(0x10C4, 0x846E) }, /* BEI USB Sensor Interface (VCP) */
5244 { USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */
5245 { USB_DEVICE(0x10C4, 0xEA61) }, /* Silicon Labs factory default */
5246 + { USB_DEVICE(0x10C4, 0xEA71) }, /* Infinity GPS-MIC-1 Radio Monophone */
5247 { USB_DEVICE(0x10C4, 0xF001) }, /* Elan Digital Systems USBscope50 */
5248 { USB_DEVICE(0x10C4, 0xF002) }, /* Elan Digital Systems USBwave12 */
5249 { USB_DEVICE(0x10C4, 0xF003) }, /* Elan Digital Systems USBpulse100 */
5250 @@ -115,6 +124,8 @@ static const struct usb_device_id id_table[] = {
5251 { USB_DEVICE(0x1555, 0x0004) }, /* Owen AC4 USB-RS485 Converter */
5252 { USB_DEVICE(0x166A, 0x0303) }, /* Clipsal 5500PCU C-Bus USB interface */
5253 { USB_DEVICE(0x16D6, 0x0001) }, /* Jablotron serial interface */
5254 + { USB_DEVICE(0x17F4, 0xAAAA) }, /* Wavesense Jazz blood glucose meter */
5255 + { USB_DEVICE(0x1843, 0x0200) }, /* Vaisala USB Instrument Cable */
5256 { USB_DEVICE(0x18EF, 0xE00F) }, /* ELV USB-I2C-Interface */
5257 { USB_DEVICE(0x413C, 0x9500) }, /* DW700 GPS USB interface */
5258 { } /* Terminating Entry */
5259 diff --git a/drivers/usb/serial/cypress_m8.c b/drivers/usb/serial/cypress_m8.c
5260 index e23c779..582e832 100644
5261 --- a/drivers/usb/serial/cypress_m8.c
5262 +++ b/drivers/usb/serial/cypress_m8.c
5263 @@ -1309,7 +1309,7 @@ static void cypress_read_int_callback(struct urb *urb)
5264 /* process read if there is data other than line status */
5265 if (tty && bytes > i) {
5266 tty_insert_flip_string_fixed_flag(tty, data + i,
5267 - bytes - i, tty_flag);
5268 + tty_flag, bytes - i);
5269 tty_flip_buffer_push(tty);
5270 }
5271
5272 diff --git a/drivers/usb/serial/digi_acceleport.c b/drivers/usb/serial/digi_acceleport.c
5273 index 68b0aa5..3edda3e 100644
5274 --- a/drivers/usb/serial/digi_acceleport.c
5275 +++ b/drivers/usb/serial/digi_acceleport.c
5276 @@ -1703,8 +1703,8 @@ static int digi_read_inb_callback(struct urb *urb)
5277 /* data length is len-1 (one byte of len is port_status) */
5278 --len;
5279 if (len > 0) {
5280 - tty_insert_flip_string_fixed_flag(tty, data, len,
5281 - flag);
5282 + tty_insert_flip_string_fixed_flag(tty, data, flag,
5283 + len);
5284 tty_flip_buffer_push(tty);
5285 }
5286 }
5287 diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
5288 index 1d7c4fa..3f5676e 100644
5289 --- a/drivers/usb/serial/ftdi_sio.c
5290 +++ b/drivers/usb/serial/ftdi_sio.c
5291 @@ -2289,6 +2289,8 @@ static void ftdi_set_termios(struct tty_struct *tty,
5292 "urb failed to set to rts/cts flow control\n");
5293 }
5294
5295 + /* raise DTR/RTS */
5296 + set_mctrl(port, TIOCM_DTR | TIOCM_RTS);
5297 } else {
5298 /*
5299 * Xon/Xoff code
5300 @@ -2336,6 +2338,8 @@ static void ftdi_set_termios(struct tty_struct *tty,
5301 }
5302 }
5303
5304 + /* lower DTR/RTS */
5305 + clear_mctrl(port, TIOCM_DTR | TIOCM_RTS);
5306 }
5307 return;
5308 }
5309 diff --git a/drivers/usb/serial/ir-usb.c b/drivers/usb/serial/ir-usb.c
5310 index 4a0f519..71bdbe0 100644
5311 --- a/drivers/usb/serial/ir-usb.c
5312 +++ b/drivers/usb/serial/ir-usb.c
5313 @@ -312,6 +312,7 @@ static int ir_open(struct tty_struct *tty, struct usb_serial_port *port)
5314 kfree(port->read_urb->transfer_buffer);
5315 port->read_urb->transfer_buffer = buffer;
5316 port->read_urb->transfer_buffer_length = buffer_size;
5317 + port->bulk_in_buffer = buffer;
5318
5319 buffer = kmalloc(buffer_size, GFP_KERNEL);
5320 if (!buffer) {
5321 @@ -321,6 +322,7 @@ static int ir_open(struct tty_struct *tty, struct usb_serial_port *port)
5322 kfree(port->write_urb->transfer_buffer);
5323 port->write_urb->transfer_buffer = buffer;
5324 port->write_urb->transfer_buffer_length = buffer_size;
5325 + port->bulk_out_buffer = buffer;
5326 port->bulk_out_size = buffer_size;
5327 }
5328
5329 diff --git a/drivers/usb/serial/kl5kusb105.c b/drivers/usb/serial/kl5kusb105.c
5330 index 8eef91b..cc0ba38 100644
5331 --- a/drivers/usb/serial/kl5kusb105.c
5332 +++ b/drivers/usb/serial/kl5kusb105.c
5333 @@ -321,6 +321,7 @@ err_cleanup:
5334 usb_free_urb(priv->write_urb_pool[j]);
5335 }
5336 }
5337 + kfree(priv);
5338 usb_set_serial_port_data(serial->port[i], NULL);
5339 }
5340 return -ENOMEM;
5341 diff --git a/drivers/usb/serial/kobil_sct.c b/drivers/usb/serial/kobil_sct.c
5342 index c113a2a..bd5bd85 100644
5343 --- a/drivers/usb/serial/kobil_sct.c
5344 +++ b/drivers/usb/serial/kobil_sct.c
5345 @@ -345,7 +345,8 @@ static void kobil_close(struct usb_serial_port *port)
5346
5347 /* FIXME: Add rts/dtr methods */
5348 if (port->write_urb) {
5349 - usb_kill_urb(port->write_urb);
5350 + usb_poison_urb(port->write_urb);
5351 + kfree(port->write_urb->transfer_buffer);
5352 usb_free_urb(port->write_urb);
5353 port->write_urb = NULL;
5354 }
5355 diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c
5356 index 2fda1c0..68f6a1d 100644
5357 --- a/drivers/usb/serial/mos7840.c
5358 +++ b/drivers/usb/serial/mos7840.c
5359 @@ -731,7 +731,6 @@ static void mos7840_bulk_in_callback(struct urb *urb)
5360 mos7840_port = urb->context;
5361 if (!mos7840_port) {
5362 dbg("%s", "NULL mos7840_port pointer");
5363 - mos7840_port->read_urb_busy = false;
5364 return;
5365 }
5366
5367 diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
5368 index 84d0eda..8b2e612 100644
5369 --- a/drivers/usb/serial/option.c
5370 +++ b/drivers/usb/serial/option.c
5371 @@ -380,6 +380,10 @@ static int option_resume(struct usb_serial *serial);
5372
5373 #define CINTERION_VENDOR_ID 0x0681
5374
5375 +/* Olivetti products */
5376 +#define OLIVETTI_VENDOR_ID 0x0b3c
5377 +#define OLIVETTI_PRODUCT_OLICARD100 0xc000
5378 +
5379 /* some devices interfaces need special handling due to a number of reasons */
5380 enum option_blacklist_reason {
5381 OPTION_BLACKLIST_NONE = 0,
5382 @@ -675,6 +679,180 @@ static const struct usb_device_id option_ids[] = {
5383 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0160, 0xff, 0xff, 0xff) },
5384 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0161, 0xff, 0xff, 0xff) },
5385 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0162, 0xff, 0xff, 0xff) },
5386 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1008, 0xff, 0xff, 0xff) },
5387 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1010, 0xff, 0xff, 0xff) },
5388 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1012, 0xff, 0xff, 0xff) },
5389 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1057, 0xff, 0xff, 0xff) },
5390 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1058, 0xff, 0xff, 0xff) },
5391 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1059, 0xff, 0xff, 0xff) },
5392 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1060, 0xff, 0xff, 0xff) },
5393 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1061, 0xff, 0xff, 0xff) },
5394 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1062, 0xff, 0xff, 0xff) },
5395 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1063, 0xff, 0xff, 0xff) },
5396 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1064, 0xff, 0xff, 0xff) },
5397 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1065, 0xff, 0xff, 0xff) },
5398 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1066, 0xff, 0xff, 0xff) },
5399 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1067, 0xff, 0xff, 0xff) },
5400 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1068, 0xff, 0xff, 0xff) },
5401 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1069, 0xff, 0xff, 0xff) },
5402 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1070, 0xff, 0xff, 0xff) },
5403 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1071, 0xff, 0xff, 0xff) },
5404 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1072, 0xff, 0xff, 0xff) },
5405 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1073, 0xff, 0xff, 0xff) },
5406 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1074, 0xff, 0xff, 0xff) },
5407 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1075, 0xff, 0xff, 0xff) },
5408 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1076, 0xff, 0xff, 0xff) },
5409 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1077, 0xff, 0xff, 0xff) },
5410 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1078, 0xff, 0xff, 0xff) },
5411 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1079, 0xff, 0xff, 0xff) },
5412 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1080, 0xff, 0xff, 0xff) },
5413 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1081, 0xff, 0xff, 0xff) },
5414 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1082, 0xff, 0xff, 0xff) },
5415 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1083, 0xff, 0xff, 0xff) },
5416 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1084, 0xff, 0xff, 0xff) },
5417 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1085, 0xff, 0xff, 0xff) },
5418 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1086, 0xff, 0xff, 0xff) },
5419 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1087, 0xff, 0xff, 0xff) },
5420 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1088, 0xff, 0xff, 0xff) },
5421 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1089, 0xff, 0xff, 0xff) },
5422 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1090, 0xff, 0xff, 0xff) },
5423 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1091, 0xff, 0xff, 0xff) },
5424 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1092, 0xff, 0xff, 0xff) },
5425 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1093, 0xff, 0xff, 0xff) },
5426 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1094, 0xff, 0xff, 0xff) },
5427 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1095, 0xff, 0xff, 0xff) },
5428 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1096, 0xff, 0xff, 0xff) },
5429 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1097, 0xff, 0xff, 0xff) },
5430 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1098, 0xff, 0xff, 0xff) },
5431 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1099, 0xff, 0xff, 0xff) },
5432 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1100, 0xff, 0xff, 0xff) },
5433 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1101, 0xff, 0xff, 0xff) },
5434 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1102, 0xff, 0xff, 0xff) },
5435 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1103, 0xff, 0xff, 0xff) },
5436 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1104, 0xff, 0xff, 0xff) },
5437 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1105, 0xff, 0xff, 0xff) },
5438 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1106, 0xff, 0xff, 0xff) },
5439 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1107, 0xff, 0xff, 0xff) },
5440 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1108, 0xff, 0xff, 0xff) },
5441 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1109, 0xff, 0xff, 0xff) },
5442 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1110, 0xff, 0xff, 0xff) },
5443 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1111, 0xff, 0xff, 0xff) },
5444 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1112, 0xff, 0xff, 0xff) },
5445 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1113, 0xff, 0xff, 0xff) },
5446 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1114, 0xff, 0xff, 0xff) },
5447 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1115, 0xff, 0xff, 0xff) },
5448 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1116, 0xff, 0xff, 0xff) },
5449 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1117, 0xff, 0xff, 0xff) },
5450 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1118, 0xff, 0xff, 0xff) },
5451 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1119, 0xff, 0xff, 0xff) },
5452 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1120, 0xff, 0xff, 0xff) },
5453 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1121, 0xff, 0xff, 0xff) },
5454 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1122, 0xff, 0xff, 0xff) },
5455 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1123, 0xff, 0xff, 0xff) },
5456 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1124, 0xff, 0xff, 0xff) },
5457 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1125, 0xff, 0xff, 0xff) },
5458 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1126, 0xff, 0xff, 0xff) },
5459 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1127, 0xff, 0xff, 0xff) },
5460 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1128, 0xff, 0xff, 0xff) },
5461 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1129, 0xff, 0xff, 0xff) },
5462 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1130, 0xff, 0xff, 0xff) },
5463 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1131, 0xff, 0xff, 0xff) },
5464 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1132, 0xff, 0xff, 0xff) },
5465 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1133, 0xff, 0xff, 0xff) },
5466 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1134, 0xff, 0xff, 0xff) },
5467 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1135, 0xff, 0xff, 0xff) },
5468 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1136, 0xff, 0xff, 0xff) },
5469 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1137, 0xff, 0xff, 0xff) },
5470 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1138, 0xff, 0xff, 0xff) },
5471 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1139, 0xff, 0xff, 0xff) },
5472 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1140, 0xff, 0xff, 0xff) },
5473 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1141, 0xff, 0xff, 0xff) },
5474 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1142, 0xff, 0xff, 0xff) },
5475 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1143, 0xff, 0xff, 0xff) },
5476 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1144, 0xff, 0xff, 0xff) },
5477 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1145, 0xff, 0xff, 0xff) },
5478 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1146, 0xff, 0xff, 0xff) },
5479 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1147, 0xff, 0xff, 0xff) },
5480 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1148, 0xff, 0xff, 0xff) },
5481 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1149, 0xff, 0xff, 0xff) },
5482 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1150, 0xff, 0xff, 0xff) },
5483 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1151, 0xff, 0xff, 0xff) },
5484 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1152, 0xff, 0xff, 0xff) },
5485 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1153, 0xff, 0xff, 0xff) },
5486 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1154, 0xff, 0xff, 0xff) },
5487 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1155, 0xff, 0xff, 0xff) },
5488 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1156, 0xff, 0xff, 0xff) },
5489 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1157, 0xff, 0xff, 0xff) },
5490 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1158, 0xff, 0xff, 0xff) },
5491 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1159, 0xff, 0xff, 0xff) },
5492 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1160, 0xff, 0xff, 0xff) },
5493 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1161, 0xff, 0xff, 0xff) },
5494 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1162, 0xff, 0xff, 0xff) },
5495 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1163, 0xff, 0xff, 0xff) },
5496 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1164, 0xff, 0xff, 0xff) },
5497 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1165, 0xff, 0xff, 0xff) },
5498 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1166, 0xff, 0xff, 0xff) },
5499 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1167, 0xff, 0xff, 0xff) },
5500 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1168, 0xff, 0xff, 0xff) },
5501 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1169, 0xff, 0xff, 0xff) },
5502 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1170, 0xff, 0xff, 0xff) },
5503 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1244, 0xff, 0xff, 0xff) },
5504 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1245, 0xff, 0xff, 0xff) },
5505 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1246, 0xff, 0xff, 0xff) },
5506 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1247, 0xff, 0xff, 0xff) },
5507 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1248, 0xff, 0xff, 0xff) },
5508 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1249, 0xff, 0xff, 0xff) },
5509 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1250, 0xff, 0xff, 0xff) },
5510 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1251, 0xff, 0xff, 0xff) },
5511 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1252, 0xff, 0xff, 0xff) },
5512 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1253, 0xff, 0xff, 0xff) },
5513 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1254, 0xff, 0xff, 0xff) },
5514 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1255, 0xff, 0xff, 0xff) },
5515 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1256, 0xff, 0xff, 0xff) },
5516 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1257, 0xff, 0xff, 0xff) },
5517 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1258, 0xff, 0xff, 0xff) },
5518 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1259, 0xff, 0xff, 0xff) },
5519 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1260, 0xff, 0xff, 0xff) },
5520 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1261, 0xff, 0xff, 0xff) },
5521 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1262, 0xff, 0xff, 0xff) },
5522 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1263, 0xff, 0xff, 0xff) },
5523 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1264, 0xff, 0xff, 0xff) },
5524 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1265, 0xff, 0xff, 0xff) },
5525 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1266, 0xff, 0xff, 0xff) },
5526 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1267, 0xff, 0xff, 0xff) },
5527 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1268, 0xff, 0xff, 0xff) },
5528 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1269, 0xff, 0xff, 0xff) },
5529 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1270, 0xff, 0xff, 0xff) },
5530 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1271, 0xff, 0xff, 0xff) },
5531 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1272, 0xff, 0xff, 0xff) },
5532 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1273, 0xff, 0xff, 0xff) },
5533 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1274, 0xff, 0xff, 0xff) },
5534 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1275, 0xff, 0xff, 0xff) },
5535 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1276, 0xff, 0xff, 0xff) },
5536 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1277, 0xff, 0xff, 0xff) },
5537 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1278, 0xff, 0xff, 0xff) },
5538 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1279, 0xff, 0xff, 0xff) },
5539 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1280, 0xff, 0xff, 0xff) },
5540 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1281, 0xff, 0xff, 0xff) },
5541 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1282, 0xff, 0xff, 0xff) },
5542 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1283, 0xff, 0xff, 0xff) },
5543 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1284, 0xff, 0xff, 0xff) },
5544 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1285, 0xff, 0xff, 0xff) },
5545 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1286, 0xff, 0xff, 0xff) },
5546 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1287, 0xff, 0xff, 0xff) },
5547 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1288, 0xff, 0xff, 0xff) },
5548 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1289, 0xff, 0xff, 0xff) },
5549 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1290, 0xff, 0xff, 0xff) },
5550 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1291, 0xff, 0xff, 0xff) },
5551 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1292, 0xff, 0xff, 0xff) },
5552 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1293, 0xff, 0xff, 0xff) },
5553 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1294, 0xff, 0xff, 0xff) },
5554 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1295, 0xff, 0xff, 0xff) },
5555 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1296, 0xff, 0xff, 0xff) },
5556 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1297, 0xff, 0xff, 0xff) },
5557 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1298, 0xff, 0xff, 0xff) },
5558 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1299, 0xff, 0xff, 0xff) },
5559 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1300, 0xff, 0xff, 0xff) },
5560 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0014, 0xff, 0xff, 0xff) }, /* ZTE CDMA products */
5561 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0027, 0xff, 0xff, 0xff) },
5562 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0059, 0xff, 0xff, 0xff) },
5563 @@ -726,6 +904,8 @@ static const struct usb_device_id option_ids[] = {
5564 { USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_1012)},
5565
5566 { USB_DEVICE(CINTERION_VENDOR_ID, 0x0047) },
5567 +
5568 + { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD100) },
5569 { } /* Terminating entry */
5570 };
5571 MODULE_DEVICE_TABLE(usb, option_ids);
5572 diff --git a/drivers/usb/serial/qcaux.c b/drivers/usb/serial/qcaux.c
5573 index 7e3bea2..214a3e5 100644
5574 --- a/drivers/usb/serial/qcaux.c
5575 +++ b/drivers/usb/serial/qcaux.c
5576 @@ -50,6 +50,10 @@
5577 #define SANYO_VENDOR_ID 0x0474
5578 #define SANYO_PRODUCT_KATANA_LX 0x0754 /* SCP-3800 (Katana LX) */
5579
5580 +/* Samsung devices */
5581 +#define SAMSUNG_VENDOR_ID 0x04e8
5582 +#define SAMSUNG_PRODUCT_U520 0x6640 /* SCH-U520 */
5583 +
5584 static struct usb_device_id id_table[] = {
5585 { USB_DEVICE_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, UTSTARCOM_PRODUCT_PC5740, 0xff, 0x00, 0x00) },
5586 { USB_DEVICE_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, UTSTARCOM_PRODUCT_PC5750, 0xff, 0x00, 0x00) },
5587 @@ -61,6 +65,7 @@ static struct usb_device_id id_table[] = {
5588 { USB_DEVICE_AND_INTERFACE_INFO(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CDX650, 0xff, 0xff, 0x00) },
5589 { USB_DEVICE_AND_INTERFACE_INFO(LG_VENDOR_ID, LG_PRODUCT_VX4400_6000, 0xff, 0xff, 0x00) },
5590 { USB_DEVICE_AND_INTERFACE_INFO(SANYO_VENDOR_ID, SANYO_PRODUCT_KATANA_LX, 0xff, 0xff, 0x00) },
5591 + { USB_DEVICE_AND_INTERFACE_INFO(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_U520, 0xff, 0x00, 0x00) },
5592 { },
5593 };
5594 MODULE_DEVICE_TABLE(usb, id_table);
5595 diff --git a/drivers/usb/serial/spcp8x5.c b/drivers/usb/serial/spcp8x5.c
5596 index 5d39191..2ea32c5 100644
5597 --- a/drivers/usb/serial/spcp8x5.c
5598 +++ b/drivers/usb/serial/spcp8x5.c
5599 @@ -726,8 +726,8 @@ static void spcp8x5_read_bulk_callback(struct urb *urb)
5600 /* overrun is special, not associated with a char */
5601 if (status & UART_OVERRUN_ERROR)
5602 tty_insert_flip_char(tty, 0, TTY_OVERRUN);
5603 - tty_insert_flip_string_fixed_flag(tty, data,
5604 - urb->actual_length, tty_flag);
5605 + tty_insert_flip_string_fixed_flag(tty, data, tty_flag,
5606 + urb->actual_length);
5607 tty_flip_buffer_push(tty);
5608 }
5609 tty_kref_put(tty);
5610 diff --git a/drivers/usb/serial/visor.c b/drivers/usb/serial/visor.c
5611 index 0949427..fb7fc40 100644
5612 --- a/drivers/usb/serial/visor.c
5613 +++ b/drivers/usb/serial/visor.c
5614 @@ -249,6 +249,7 @@ static struct usb_serial_driver clie_3_5_device = {
5615 .throttle = visor_throttle,
5616 .unthrottle = visor_unthrottle,
5617 .attach = clie_3_5_startup,
5618 + .release = visor_release,
5619 .write = visor_write,
5620 .write_room = visor_write_room,
5621 .write_bulk_callback = visor_write_bulk_callback,
5622 diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h
5623 index ccf1dbb..55b3cd1 100644
5624 --- a/drivers/usb/storage/unusual_devs.h
5625 +++ b/drivers/usb/storage/unusual_devs.h
5626 @@ -1853,6 +1853,21 @@ UNUSUAL_DEV( 0x1652, 0x6600, 0x0201, 0x0201,
5627 US_SC_DEVICE, US_PR_DEVICE, NULL,
5628 US_FL_IGNORE_RESIDUE ),
5629
5630 +/* Reported by Hans de Goede <hdegoede@redhat.com>
5631 + * These Appotech controllers are found in Picture Frames, they provide a
5632 + * (buggy) emulation of a cdrom drive which contains the windows software
5633 + * Uploading of pictures happens over the corresponding /dev/sg device. */
5634 +UNUSUAL_DEV( 0x1908, 0x1315, 0x0000, 0x0000,
5635 + "BUILDWIN",
5636 + "Photo Frame",
5637 + US_SC_DEVICE, US_PR_DEVICE, NULL,
5638 + US_FL_BAD_SENSE ),
5639 +UNUSUAL_DEV( 0x1908, 0x1320, 0x0000, 0x0000,
5640 + "BUILDWIN",
5641 + "Photo Frame",
5642 + US_SC_DEVICE, US_PR_DEVICE, NULL,
5643 + US_FL_BAD_SENSE ),
5644 +
5645 UNUSUAL_DEV( 0x2116, 0x0320, 0x0001, 0x0001,
5646 "ST",
5647 "2A",
5648 diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c
5649 index 9777583..c9d0c79 100644
5650 --- a/drivers/vhost/net.c
5651 +++ b/drivers/vhost/net.c
5652 @@ -637,7 +637,7 @@ const static struct file_operations vhost_net_fops = {
5653 };
5654
5655 static struct miscdevice vhost_net_misc = {
5656 - VHOST_NET_MINOR,
5657 + MISC_DYNAMIC_MINOR,
5658 "vhost-net",
5659 &vhost_net_fops,
5660 };
5661 diff --git a/drivers/video/arcfb.c b/drivers/video/arcfb.c
5662 index 8d406fb..f3d7440 100644
5663 --- a/drivers/video/arcfb.c
5664 +++ b/drivers/video/arcfb.c
5665 @@ -80,7 +80,7 @@ struct arcfb_par {
5666 spinlock_t lock;
5667 };
5668
5669 -static struct fb_fix_screeninfo arcfb_fix __initdata = {
5670 +static struct fb_fix_screeninfo arcfb_fix __devinitdata = {
5671 .id = "arcfb",
5672 .type = FB_TYPE_PACKED_PIXELS,
5673 .visual = FB_VISUAL_MONO01,
5674 @@ -90,7 +90,7 @@ static struct fb_fix_screeninfo arcfb_fix __initdata = {
5675 .accel = FB_ACCEL_NONE,
5676 };
5677
5678 -static struct fb_var_screeninfo arcfb_var __initdata = {
5679 +static struct fb_var_screeninfo arcfb_var __devinitdata = {
5680 .xres = 128,
5681 .yres = 64,
5682 .xres_virtual = 128,
5683 @@ -588,7 +588,7 @@ err:
5684 return retval;
5685 }
5686
5687 -static int arcfb_remove(struct platform_device *dev)
5688 +static int __devexit arcfb_remove(struct platform_device *dev)
5689 {
5690 struct fb_info *info = platform_get_drvdata(dev);
5691
5692 @@ -602,7 +602,7 @@ static int arcfb_remove(struct platform_device *dev)
5693
5694 static struct platform_driver arcfb_driver = {
5695 .probe = arcfb_probe,
5696 - .remove = arcfb_remove,
5697 + .remove = __devexit_p(arcfb_remove),
5698 .driver = {
5699 .name = "arcfb",
5700 },
5701 diff --git a/drivers/video/hgafb.c b/drivers/video/hgafb.c
5702 index 8bbf251..af8f0f2 100644
5703 --- a/drivers/video/hgafb.c
5704 +++ b/drivers/video/hgafb.c
5705 @@ -106,7 +106,7 @@ static DEFINE_SPINLOCK(hga_reg_lock);
5706
5707 /* Framebuffer driver structures */
5708
5709 -static struct fb_var_screeninfo __initdata hga_default_var = {
5710 +static struct fb_var_screeninfo hga_default_var __devinitdata = {
5711 .xres = 720,
5712 .yres = 348,
5713 .xres_virtual = 720,
5714 @@ -120,7 +120,7 @@ static struct fb_var_screeninfo __initdata hga_default_var = {
5715 .width = -1,
5716 };
5717
5718 -static struct fb_fix_screeninfo __initdata hga_fix = {
5719 +static struct fb_fix_screeninfo hga_fix __devinitdata = {
5720 .id = "HGA",
5721 .type = FB_TYPE_PACKED_PIXELS, /* (not sure) */
5722 .visual = FB_VISUAL_MONO10,
5723 @@ -276,7 +276,7 @@ static void hga_blank(int blank_mode)
5724 spin_unlock_irqrestore(&hga_reg_lock, flags);
5725 }
5726
5727 -static int __init hga_card_detect(void)
5728 +static int __devinit hga_card_detect(void)
5729 {
5730 int count = 0;
5731 void __iomem *p, *q;
5732 @@ -596,7 +596,7 @@ static int __devinit hgafb_probe(struct platform_device *pdev)
5733 return 0;
5734 }
5735
5736 -static int hgafb_remove(struct platform_device *pdev)
5737 +static int __devexit hgafb_remove(struct platform_device *pdev)
5738 {
5739 struct fb_info *info = platform_get_drvdata(pdev);
5740
5741 @@ -621,7 +621,7 @@ static int hgafb_remove(struct platform_device *pdev)
5742
5743 static struct platform_driver hgafb_driver = {
5744 .probe = hgafb_probe,
5745 - .remove = hgafb_remove,
5746 + .remove = __devexit_p(hgafb_remove),
5747 .driver = {
5748 .name = "hgafb",
5749 },
5750 diff --git a/drivers/video/vfb.c b/drivers/video/vfb.c
5751 index 9b5532b..bc67251 100644
5752 --- a/drivers/video/vfb.c
5753 +++ b/drivers/video/vfb.c
5754 @@ -78,7 +78,7 @@ static void rvfree(void *mem, unsigned long size)
5755 vfree(mem);
5756 }
5757
5758 -static struct fb_var_screeninfo vfb_default __initdata = {
5759 +static struct fb_var_screeninfo vfb_default __devinitdata = {
5760 .xres = 640,
5761 .yres = 480,
5762 .xres_virtual = 640,
5763 @@ -100,7 +100,7 @@ static struct fb_var_screeninfo vfb_default __initdata = {
5764 .vmode = FB_VMODE_NONINTERLACED,
5765 };
5766
5767 -static struct fb_fix_screeninfo vfb_fix __initdata = {
5768 +static struct fb_fix_screeninfo vfb_fix __devinitdata = {
5769 .id = "Virtual FB",
5770 .type = FB_TYPE_PACKED_PIXELS,
5771 .visual = FB_VISUAL_PSEUDOCOLOR,
5772 diff --git a/drivers/video/vga16fb.c b/drivers/video/vga16fb.c
5773 index bf638a4..2ab3cc7 100644
5774 --- a/drivers/video/vga16fb.c
5775 +++ b/drivers/video/vga16fb.c
5776 @@ -65,7 +65,7 @@ struct vga16fb_par {
5777
5778 /* --------------------------------------------------------------------- */
5779
5780 -static struct fb_var_screeninfo vga16fb_defined __initdata = {
5781 +static struct fb_var_screeninfo vga16fb_defined __devinitdata = {
5782 .xres = 640,
5783 .yres = 480,
5784 .xres_virtual = 640,
5785 @@ -85,7 +85,7 @@ static struct fb_var_screeninfo vga16fb_defined __initdata = {
5786 };
5787
5788 /* name should not depend on EGA/VGA */
5789 -static struct fb_fix_screeninfo vga16fb_fix __initdata = {
5790 +static struct fb_fix_screeninfo vga16fb_fix __devinitdata = {
5791 .id = "VGA16 VGA",
5792 .smem_start = VGA_FB_PHYS,
5793 .smem_len = VGA_FB_PHYS_LEN,
5794 @@ -1278,7 +1278,7 @@ static struct fb_ops vga16fb_ops = {
5795 };
5796
5797 #ifndef MODULE
5798 -static int vga16fb_setup(char *options)
5799 +static int __init vga16fb_setup(char *options)
5800 {
5801 char *this_opt;
5802
5803 @@ -1376,7 +1376,7 @@ static int __devinit vga16fb_probe(struct platform_device *dev)
5804 return ret;
5805 }
5806
5807 -static int vga16fb_remove(struct platform_device *dev)
5808 +static int __devexit vga16fb_remove(struct platform_device *dev)
5809 {
5810 struct fb_info *info = platform_get_drvdata(dev);
5811
5812 @@ -1393,7 +1393,7 @@ static int vga16fb_remove(struct platform_device *dev)
5813
5814 static struct platform_driver vga16fb_driver = {
5815 .probe = vga16fb_probe,
5816 - .remove = vga16fb_remove,
5817 + .remove = __devexit_p(vga16fb_remove),
5818 .driver = {
5819 .name = "vga16fb",
5820 },
5821 diff --git a/drivers/video/w100fb.c b/drivers/video/w100fb.c
5822 index 31b0e17..e66b8b1 100644
5823 --- a/drivers/video/w100fb.c
5824 +++ b/drivers/video/w100fb.c
5825 @@ -53,7 +53,7 @@ static void w100_update_enable(void);
5826 static void w100_update_disable(void);
5827 static void calc_hsync(struct w100fb_par *par);
5828 static void w100_init_graphic_engine(struct w100fb_par *par);
5829 -struct w100_pll_info *w100_get_xtal_table(unsigned int freq);
5830 +struct w100_pll_info *w100_get_xtal_table(unsigned int freq) __devinit;
5831
5832 /* Pseudo palette size */
5833 #define MAX_PALETTES 16
5834 @@ -782,7 +782,7 @@ out:
5835 }
5836
5837
5838 -static int w100fb_remove(struct platform_device *pdev)
5839 +static int __devexit w100fb_remove(struct platform_device *pdev)
5840 {
5841 struct fb_info *info = platform_get_drvdata(pdev);
5842 struct w100fb_par *par=info->par;
5843 @@ -1020,7 +1020,7 @@ static struct pll_entries {
5844 { 0 },
5845 };
5846
5847 -struct w100_pll_info *w100_get_xtal_table(unsigned int freq)
5848 +struct w100_pll_info __devinit *w100_get_xtal_table(unsigned int freq)
5849 {
5850 struct pll_entries *pll_entry = w100_pll_tables;
5851
5852 @@ -1611,7 +1611,7 @@ static void w100_vsync(void)
5853
5854 static struct platform_driver w100fb_driver = {
5855 .probe = w100fb_probe,
5856 - .remove = w100fb_remove,
5857 + .remove = __devexit_p(w100fb_remove),
5858 .suspend = w100fb_suspend,
5859 .resume = w100fb_resume,
5860 .driver = {
5861 @@ -1619,7 +1619,7 @@ static struct platform_driver w100fb_driver = {
5862 },
5863 };
5864
5865 -int __devinit w100fb_init(void)
5866 +int __init w100fb_init(void)
5867 {
5868 return platform_driver_register(&w100fb_driver);
5869 }
5870 diff --git a/drivers/xen/xenbus/xenbus_xs.c b/drivers/xen/xenbus/xenbus_xs.c
5871 index eab33f1..7b547f5 100644
5872 --- a/drivers/xen/xenbus/xenbus_xs.c
5873 +++ b/drivers/xen/xenbus/xenbus_xs.c
5874 @@ -499,7 +499,7 @@ int xenbus_printf(struct xenbus_transaction t,
5875 #define PRINTF_BUFFER_SIZE 4096
5876 char *printf_buffer;
5877
5878 - printf_buffer = kmalloc(PRINTF_BUFFER_SIZE, GFP_KERNEL);
5879 + printf_buffer = kmalloc(PRINTF_BUFFER_SIZE, GFP_NOIO | __GFP_HIGH);
5880 if (printf_buffer == NULL)
5881 return -ENOMEM;
5882
5883 diff --git a/fs/aio.c b/fs/aio.c
5884 index 1cf12b3..48fdeeb 100644
5885 --- a/fs/aio.c
5886 +++ b/fs/aio.c
5887 @@ -36,6 +36,7 @@
5888 #include <linux/blkdev.h>
5889 #include <linux/mempool.h>
5890 #include <linux/hash.h>
5891 +#include <linux/compat.h>
5892
5893 #include <asm/kmap_types.h>
5894 #include <asm/uaccess.h>
5895 @@ -1384,13 +1385,22 @@ static ssize_t aio_fsync(struct kiocb *iocb)
5896 return ret;
5897 }
5898
5899 -static ssize_t aio_setup_vectored_rw(int type, struct kiocb *kiocb)
5900 +static ssize_t aio_setup_vectored_rw(int type, struct kiocb *kiocb, bool compat)
5901 {
5902 ssize_t ret;
5903
5904 - ret = rw_copy_check_uvector(type, (struct iovec __user *)kiocb->ki_buf,
5905 - kiocb->ki_nbytes, 1,
5906 - &kiocb->ki_inline_vec, &kiocb->ki_iovec);
5907 +#ifdef CONFIG_COMPAT
5908 + if (compat)
5909 + ret = compat_rw_copy_check_uvector(type,
5910 + (struct compat_iovec __user *)kiocb->ki_buf,
5911 + kiocb->ki_nbytes, 1, &kiocb->ki_inline_vec,
5912 + &kiocb->ki_iovec);
5913 + else
5914 +#endif
5915 + ret = rw_copy_check_uvector(type,
5916 + (struct iovec __user *)kiocb->ki_buf,
5917 + kiocb->ki_nbytes, 1, &kiocb->ki_inline_vec,
5918 + &kiocb->ki_iovec);
5919 if (ret < 0)
5920 goto out;
5921
5922 @@ -1420,7 +1430,7 @@ static ssize_t aio_setup_single_vector(struct kiocb *kiocb)
5923 * Performs the initial checks and aio retry method
5924 * setup for the kiocb at the time of io submission.
5925 */
5926 -static ssize_t aio_setup_iocb(struct kiocb *kiocb)
5927 +static ssize_t aio_setup_iocb(struct kiocb *kiocb, bool compat)
5928 {
5929 struct file *file = kiocb->ki_filp;
5930 ssize_t ret = 0;
5931 @@ -1469,7 +1479,7 @@ static ssize_t aio_setup_iocb(struct kiocb *kiocb)
5932 ret = security_file_permission(file, MAY_READ);
5933 if (unlikely(ret))
5934 break;
5935 - ret = aio_setup_vectored_rw(READ, kiocb);
5936 + ret = aio_setup_vectored_rw(READ, kiocb, compat);
5937 if (ret)
5938 break;
5939 ret = -EINVAL;
5940 @@ -1483,7 +1493,7 @@ static ssize_t aio_setup_iocb(struct kiocb *kiocb)
5941 ret = security_file_permission(file, MAY_WRITE);
5942 if (unlikely(ret))
5943 break;
5944 - ret = aio_setup_vectored_rw(WRITE, kiocb);
5945 + ret = aio_setup_vectored_rw(WRITE, kiocb, compat);
5946 if (ret)
5947 break;
5948 ret = -EINVAL;
5949 @@ -1548,7 +1558,8 @@ static void aio_batch_free(struct hlist_head *batch_hash)
5950 }
5951
5952 static int io_submit_one(struct kioctx *ctx, struct iocb __user *user_iocb,
5953 - struct iocb *iocb, struct hlist_head *batch_hash)
5954 + struct iocb *iocb, struct hlist_head *batch_hash,
5955 + bool compat)
5956 {
5957 struct kiocb *req;
5958 struct file *file;
5959 @@ -1609,7 +1620,7 @@ static int io_submit_one(struct kioctx *ctx, struct iocb __user *user_iocb,
5960 req->ki_left = req->ki_nbytes = iocb->aio_nbytes;
5961 req->ki_opcode = iocb->aio_lio_opcode;
5962
5963 - ret = aio_setup_iocb(req);
5964 + ret = aio_setup_iocb(req, compat);
5965
5966 if (ret)
5967 goto out_put_req;
5968 @@ -1637,20 +1648,8 @@ out_put_req:
5969 return ret;
5970 }
5971
5972 -/* sys_io_submit:
5973 - * Queue the nr iocbs pointed to by iocbpp for processing. Returns
5974 - * the number of iocbs queued. May return -EINVAL if the aio_context
5975 - * specified by ctx_id is invalid, if nr is < 0, if the iocb at
5976 - * *iocbpp[0] is not properly initialized, if the operation specified
5977 - * is invalid for the file descriptor in the iocb. May fail with
5978 - * -EFAULT if any of the data structures point to invalid data. May
5979 - * fail with -EBADF if the file descriptor specified in the first
5980 - * iocb is invalid. May fail with -EAGAIN if insufficient resources
5981 - * are available to queue any iocbs. Will return 0 if nr is 0. Will
5982 - * fail with -ENOSYS if not implemented.
5983 - */
5984 -SYSCALL_DEFINE3(io_submit, aio_context_t, ctx_id, long, nr,
5985 - struct iocb __user * __user *, iocbpp)
5986 +long do_io_submit(aio_context_t ctx_id, long nr,
5987 + struct iocb __user *__user *iocbpp, bool compat)
5988 {
5989 struct kioctx *ctx;
5990 long ret = 0;
5991 @@ -1687,7 +1686,7 @@ SYSCALL_DEFINE3(io_submit, aio_context_t, ctx_id, long, nr,
5992 break;
5993 }
5994
5995 - ret = io_submit_one(ctx, user_iocb, &tmp, batch_hash);
5996 + ret = io_submit_one(ctx, user_iocb, &tmp, batch_hash, compat);
5997 if (ret)
5998 break;
5999 }
6000 @@ -1697,6 +1696,24 @@ SYSCALL_DEFINE3(io_submit, aio_context_t, ctx_id, long, nr,
6001 return i ? i : ret;
6002 }
6003
6004 +/* sys_io_submit:
6005 + * Queue the nr iocbs pointed to by iocbpp for processing. Returns
6006 + * the number of iocbs queued. May return -EINVAL if the aio_context
6007 + * specified by ctx_id is invalid, if nr is < 0, if the iocb at
6008 + * *iocbpp[0] is not properly initialized, if the operation specified
6009 + * is invalid for the file descriptor in the iocb. May fail with
6010 + * -EFAULT if any of the data structures point to invalid data. May
6011 + * fail with -EBADF if the file descriptor specified in the first
6012 + * iocb is invalid. May fail with -EAGAIN if insufficient resources
6013 + * are available to queue any iocbs. Will return 0 if nr is 0. Will
6014 + * fail with -ENOSYS if not implemented.
6015 + */
6016 +SYSCALL_DEFINE3(io_submit, aio_context_t, ctx_id, long, nr,
6017 + struct iocb __user * __user *, iocbpp)
6018 +{
6019 + return do_io_submit(ctx_id, nr, iocbpp, 0);
6020 +}
6021 +
6022 /* lookup_kiocb
6023 * Finds a given iocb for cancellation.
6024 */
6025 diff --git a/fs/btrfs/acl.c b/fs/btrfs/acl.c
6026 index 6ef7b26..6b4d0cc 100644
6027 --- a/fs/btrfs/acl.c
6028 +++ b/fs/btrfs/acl.c
6029 @@ -160,6 +160,9 @@ static int btrfs_xattr_acl_set(struct dentry *dentry, const char *name,
6030 int ret;
6031 struct posix_acl *acl = NULL;
6032
6033 + if (!is_owner_or_cap(dentry->d_inode))
6034 + return -EPERM;
6035 +
6036 if (value) {
6037 acl = posix_acl_from_xattr(value, size);
6038 if (acl == NULL) {
6039 diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h
6040 index 39e47f4..a6db615 100644
6041 --- a/fs/cifs/cifsproto.h
6042 +++ b/fs/cifs/cifsproto.h
6043 @@ -95,8 +95,10 @@ extern struct cifsFileInfo *cifs_new_fileinfo(struct inode *newinode,
6044 __u16 fileHandle, struct file *file,
6045 struct vfsmount *mnt, unsigned int oflags);
6046 extern int cifs_posix_open(char *full_path, struct inode **pinode,
6047 - struct vfsmount *mnt, int mode, int oflags,
6048 - __u32 *poplock, __u16 *pnetfid, int xid);
6049 + struct vfsmount *mnt,
6050 + struct super_block *sb,
6051 + int mode, int oflags,
6052 + __u32 *poplock, __u16 *pnetfid, int xid);
6053 extern void cifs_unix_basic_to_fattr(struct cifs_fattr *fattr,
6054 FILE_UNIX_BASIC_INFO *info,
6055 struct cifs_sb_info *cifs_sb);
6056 diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c
6057 index e9f7ecc..ff3d891 100644
6058 --- a/fs/cifs/dir.c
6059 +++ b/fs/cifs/dir.c
6060 @@ -183,13 +183,14 @@ cifs_new_fileinfo(struct inode *newinode, __u16 fileHandle,
6061 }
6062
6063 int cifs_posix_open(char *full_path, struct inode **pinode,
6064 - struct vfsmount *mnt, int mode, int oflags,
6065 - __u32 *poplock, __u16 *pnetfid, int xid)
6066 + struct vfsmount *mnt, struct super_block *sb,
6067 + int mode, int oflags,
6068 + __u32 *poplock, __u16 *pnetfid, int xid)
6069 {
6070 int rc;
6071 FILE_UNIX_BASIC_INFO *presp_data;
6072 __u32 posix_flags = 0;
6073 - struct cifs_sb_info *cifs_sb = CIFS_SB(mnt->mnt_sb);
6074 + struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
6075 struct cifs_fattr fattr;
6076
6077 cFYI(1, ("posix open %s", full_path));
6078 @@ -242,7 +243,7 @@ int cifs_posix_open(char *full_path, struct inode **pinode,
6079
6080 /* get new inode and set it up */
6081 if (*pinode == NULL) {
6082 - *pinode = cifs_iget(mnt->mnt_sb, &fattr);
6083 + *pinode = cifs_iget(sb, &fattr);
6084 if (!*pinode) {
6085 rc = -ENOMEM;
6086 goto posix_open_ret;
6087 @@ -251,7 +252,8 @@ int cifs_posix_open(char *full_path, struct inode **pinode,
6088 cifs_fattr_to_inode(*pinode, &fattr);
6089 }
6090
6091 - cifs_new_fileinfo(*pinode, *pnetfid, NULL, mnt, oflags);
6092 + if (mnt)
6093 + cifs_new_fileinfo(*pinode, *pnetfid, NULL, mnt, oflags);
6094
6095 posix_open_ret:
6096 kfree(presp_data);
6097 @@ -315,13 +317,14 @@ cifs_create(struct inode *inode, struct dentry *direntry, int mode,
6098 if (nd && (nd->flags & LOOKUP_OPEN))
6099 oflags = nd->intent.open.flags;
6100 else
6101 - oflags = FMODE_READ;
6102 + oflags = FMODE_READ | SMB_O_CREAT;
6103
6104 if (tcon->unix_ext && (tcon->ses->capabilities & CAP_UNIX) &&
6105 (CIFS_UNIX_POSIX_PATH_OPS_CAP &
6106 le64_to_cpu(tcon->fsUnixInfo.Capability))) {
6107 - rc = cifs_posix_open(full_path, &newinode, nd->path.mnt,
6108 - mode, oflags, &oplock, &fileHandle, xid);
6109 + rc = cifs_posix_open(full_path, &newinode,
6110 + nd ? nd->path.mnt : NULL,
6111 + inode->i_sb, mode, oflags, &oplock, &fileHandle, xid);
6112 /* EIO could indicate that (posix open) operation is not
6113 supported, despite what server claimed in capability
6114 negotation. EREMOTE indicates DFS junction, which is not
6115 @@ -678,6 +681,7 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry,
6116 (nd->flags & LOOKUP_OPEN) && !pTcon->broken_posix_open &&
6117 (nd->intent.open.flags & O_CREAT)) {
6118 rc = cifs_posix_open(full_path, &newInode, nd->path.mnt,
6119 + parent_dir_inode->i_sb,
6120 nd->intent.open.create_mode,
6121 nd->intent.open.flags, &oplock,
6122 &fileHandle, xid);
6123 diff --git a/fs/cifs/file.c b/fs/cifs/file.c
6124 index 9b11a8f..4cbdb20 100644
6125 --- a/fs/cifs/file.c
6126 +++ b/fs/cifs/file.c
6127 @@ -298,10 +298,12 @@ int cifs_open(struct inode *inode, struct file *file)
6128 (CIFS_UNIX_POSIX_PATH_OPS_CAP &
6129 le64_to_cpu(tcon->fsUnixInfo.Capability))) {
6130 int oflags = (int) cifs_posix_convert_flags(file->f_flags);
6131 + oflags |= SMB_O_CREAT;
6132 /* can not refresh inode info since size could be stale */
6133 rc = cifs_posix_open(full_path, &inode, file->f_path.mnt,
6134 - cifs_sb->mnt_file_mode /* ignored */,
6135 - oflags, &oplock, &netfid, xid);
6136 + inode->i_sb,
6137 + cifs_sb->mnt_file_mode /* ignored */,
6138 + oflags, &oplock, &netfid, xid);
6139 if (rc == 0) {
6140 cFYI(1, ("posix open succeeded"));
6141 /* no need for special case handling of setting mode
6142 @@ -513,8 +515,9 @@ reopen_error_exit:
6143 int oflags = (int) cifs_posix_convert_flags(file->f_flags);
6144 /* can not refresh inode info since size could be stale */
6145 rc = cifs_posix_open(full_path, NULL, file->f_path.mnt,
6146 - cifs_sb->mnt_file_mode /* ignored */,
6147 - oflags, &oplock, &netfid, xid);
6148 + inode->i_sb,
6149 + cifs_sb->mnt_file_mode /* ignored */,
6150 + oflags, &oplock, &netfid, xid);
6151 if (rc == 0) {
6152 cFYI(1, ("posix reopen succeeded"));
6153 goto reopen_success;
6154 diff --git a/fs/compat.c b/fs/compat.c
6155 index 0544873..6490d21 100644
6156 --- a/fs/compat.c
6157 +++ b/fs/compat.c
6158 @@ -568,6 +568,79 @@ out:
6159 return ret;
6160 }
6161
6162 +/* A write operation does a read from user space and vice versa */
6163 +#define vrfy_dir(type) ((type) == READ ? VERIFY_WRITE : VERIFY_READ)
6164 +
6165 +ssize_t compat_rw_copy_check_uvector(int type,
6166 + const struct compat_iovec __user *uvector, unsigned long nr_segs,
6167 + unsigned long fast_segs, struct iovec *fast_pointer,
6168 + struct iovec **ret_pointer)
6169 +{
6170 + compat_ssize_t tot_len;
6171 + struct iovec *iov = *ret_pointer = fast_pointer;
6172 + ssize_t ret = 0;
6173 + int seg;
6174 +
6175 + /*
6176 + * SuS says "The readv() function *may* fail if the iovcnt argument
6177 + * was less than or equal to 0, or greater than {IOV_MAX}. Linux has
6178 + * traditionally returned zero for zero segments, so...
6179 + */
6180 + if (nr_segs == 0)
6181 + goto out;
6182 +
6183 + ret = -EINVAL;
6184 + if (nr_segs > UIO_MAXIOV || nr_segs < 0)
6185 + goto out;
6186 + if (nr_segs > fast_segs) {
6187 + ret = -ENOMEM;
6188 + iov = kmalloc(nr_segs*sizeof(struct iovec), GFP_KERNEL);
6189 + if (iov == NULL) {
6190 + *ret_pointer = fast_pointer;
6191 + goto out;
6192 + }
6193 + }
6194 + *ret_pointer = iov;
6195 +
6196 + /*
6197 + * Single unix specification:
6198 + * We should -EINVAL if an element length is not >= 0 and fitting an
6199 + * ssize_t. The total length is fitting an ssize_t
6200 + *
6201 + * Be careful here because iov_len is a size_t not an ssize_t
6202 + */
6203 + tot_len = 0;
6204 + ret = -EINVAL;
6205 + for (seg = 0; seg < nr_segs; seg++) {
6206 + compat_ssize_t tmp = tot_len;
6207 + compat_uptr_t buf;
6208 + compat_ssize_t len;
6209 +
6210 + if (__get_user(len, &uvector->iov_len) ||
6211 + __get_user(buf, &uvector->iov_base)) {
6212 + ret = -EFAULT;
6213 + goto out;
6214 + }
6215 + if (len < 0) /* size_t not fitting in compat_ssize_t .. */
6216 + goto out;
6217 + tot_len += len;
6218 + if (tot_len < tmp) /* maths overflow on the compat_ssize_t */
6219 + goto out;
6220 + if (!access_ok(vrfy_dir(type), compat_ptr(buf), len)) {
6221 + ret = -EFAULT;
6222 + goto out;
6223 + }
6224 + iov->iov_base = compat_ptr(buf);
6225 + iov->iov_len = (compat_size_t) len;
6226 + uvector++;
6227 + iov++;
6228 + }
6229 + ret = tot_len;
6230 +
6231 +out:
6232 + return ret;
6233 +}
6234 +
6235 static inline long
6236 copy_iocb(long nr, u32 __user *ptr32, struct iocb __user * __user *ptr64)
6237 {
6238 @@ -600,7 +673,7 @@ compat_sys_io_submit(aio_context_t ctx_id, int nr, u32 __user *iocb)
6239 iocb64 = compat_alloc_user_space(nr * sizeof(*iocb64));
6240 ret = copy_iocb(nr, iocb, iocb64);
6241 if (!ret)
6242 - ret = sys_io_submit(ctx_id, nr, iocb64);
6243 + ret = do_io_submit(ctx_id, nr, iocb64, 1);
6244 return ret;
6245 }
6246
6247 @@ -1077,70 +1150,21 @@ static ssize_t compat_do_readv_writev(int type, struct file *file,
6248 {
6249 compat_ssize_t tot_len;
6250 struct iovec iovstack[UIO_FASTIOV];
6251 - struct iovec *iov=iovstack, *vector;
6252 + struct iovec *iov;
6253 ssize_t ret;
6254 - int seg;
6255 io_fn_t fn;
6256 iov_fn_t fnv;
6257
6258 - /*
6259 - * SuS says "The readv() function *may* fail if the iovcnt argument
6260 - * was less than or equal to 0, or greater than {IOV_MAX}. Linux has
6261 - * traditionally returned zero for zero segments, so...
6262 - */
6263 - ret = 0;
6264 - if (nr_segs == 0)
6265 - goto out;
6266 -
6267 - /*
6268 - * First get the "struct iovec" from user memory and
6269 - * verify all the pointers
6270 - */
6271 ret = -EINVAL;
6272 - if ((nr_segs > UIO_MAXIOV) || (nr_segs <= 0))
6273 - goto out;
6274 if (!file->f_op)
6275 goto out;
6276 - if (nr_segs > UIO_FASTIOV) {
6277 - ret = -ENOMEM;
6278 - iov = kmalloc(nr_segs*sizeof(struct iovec), GFP_KERNEL);
6279 - if (!iov)
6280 - goto out;
6281 - }
6282 +
6283 ret = -EFAULT;
6284 if (!access_ok(VERIFY_READ, uvector, nr_segs*sizeof(*uvector)))
6285 goto out;
6286
6287 - /*
6288 - * Single unix specification:
6289 - * We should -EINVAL if an element length is not >= 0 and fitting an
6290 - * ssize_t. The total length is fitting an ssize_t
6291 - *
6292 - * Be careful here because iov_len is a size_t not an ssize_t
6293 - */
6294 - tot_len = 0;
6295 - vector = iov;
6296 - ret = -EINVAL;
6297 - for (seg = 0 ; seg < nr_segs; seg++) {
6298 - compat_ssize_t tmp = tot_len;
6299 - compat_ssize_t len;
6300 - compat_uptr_t buf;
6301 -
6302 - if (__get_user(len, &uvector->iov_len) ||
6303 - __get_user(buf, &uvector->iov_base)) {
6304 - ret = -EFAULT;
6305 - goto out;
6306 - }
6307 - if (len < 0) /* size_t not fitting an compat_ssize_t .. */
6308 - goto out;
6309 - tot_len += len;
6310 - if (tot_len < tmp) /* maths overflow on the compat_ssize_t */
6311 - goto out;
6312 - vector->iov_base = compat_ptr(buf);
6313 - vector->iov_len = (compat_size_t) len;
6314 - uvector++;
6315 - vector++;
6316 - }
6317 + tot_len = compat_rw_copy_check_uvector(type, uvector, nr_segs,
6318 + UIO_FASTIOV, iovstack, &iov);
6319 if (tot_len == 0) {
6320 ret = 0;
6321 goto out;
6322 diff --git a/fs/dcache.c b/fs/dcache.c
6323 index f1358e5..2b6f09a 100644
6324 --- a/fs/dcache.c
6325 +++ b/fs/dcache.c
6326 @@ -1529,6 +1529,7 @@ void d_delete(struct dentry * dentry)
6327 spin_lock(&dentry->d_lock);
6328 isdir = S_ISDIR(dentry->d_inode->i_mode);
6329 if (atomic_read(&dentry->d_count) == 1) {
6330 + dentry->d_flags &= ~DCACHE_CANT_MOUNT;
6331 dentry_iput(dentry);
6332 fsnotify_nameremove(dentry, isdir);
6333 return;
6334 diff --git a/fs/exofs/dir.c b/fs/exofs/dir.c
6335 index 4cfab1c..d91e9d8 100644
6336 --- a/fs/exofs/dir.c
6337 +++ b/fs/exofs/dir.c
6338 @@ -608,7 +608,7 @@ int exofs_make_empty(struct inode *inode, struct inode *parent)
6339 de->inode_no = cpu_to_le64(parent->i_ino);
6340 memcpy(de->name, PARENT_DIR, sizeof(PARENT_DIR));
6341 exofs_set_de_type(de, inode);
6342 - kunmap_atomic(page, KM_USER0);
6343 + kunmap_atomic(kaddr, KM_USER0);
6344 err = exofs_commit_chunk(page, 0, chunk_size);
6345 fail:
6346 page_cache_release(page);
6347 diff --git a/fs/ext4/move_extent.c b/fs/ext4/move_extent.c
6348 index d1fc662..d3d6a64 100644
6349 --- a/fs/ext4/move_extent.c
6350 +++ b/fs/ext4/move_extent.c
6351 @@ -959,6 +959,9 @@ mext_check_arguments(struct inode *orig_inode,
6352 return -EINVAL;
6353 }
6354
6355 + if (IS_IMMUTABLE(donor_inode) || IS_APPEND(donor_inode))
6356 + return -EPERM;
6357 +
6358 /* Ext4 move extent does not support swapfile */
6359 if (IS_SWAPFILE(orig_inode) || IS_SWAPFILE(donor_inode)) {
6360 ext4_debug("ext4 move extent: The argument files should "
6361 diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c
6362 index 5692c48..6df797e 100644
6363 --- a/fs/ext4/resize.c
6364 +++ b/fs/ext4/resize.c
6365 @@ -911,7 +911,8 @@ int ext4_group_add(struct super_block *sb, struct ext4_new_group_data *input)
6366 percpu_counter_add(&sbi->s_freeinodes_counter,
6367 EXT4_INODES_PER_GROUP(sb));
6368
6369 - if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_FLEX_BG)) {
6370 + if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_FLEX_BG) &&
6371 + sbi->s_log_groups_per_flex) {
6372 ext4_group_t flex_group;
6373 flex_group = ext4_flex_group(sbi, input->group);
6374 atomic_add(input->free_blocks_count,
6375 diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c
6376 index 4b37f7c..760dc8d 100644
6377 --- a/fs/fs-writeback.c
6378 +++ b/fs/fs-writeback.c
6379 @@ -852,6 +852,12 @@ static long wb_check_old_data_flush(struct bdi_writeback *wb)
6380 unsigned long expired;
6381 long nr_pages;
6382
6383 + /*
6384 + * When set to zero, disable periodic writeback
6385 + */
6386 + if (!dirty_writeback_interval)
6387 + return 0;
6388 +
6389 expired = wb->last_old_flush +
6390 msecs_to_jiffies(dirty_writeback_interval * 10);
6391 if (time_before(jiffies, expired))
6392 @@ -947,8 +953,12 @@ int bdi_writeback_task(struct bdi_writeback *wb)
6393 break;
6394 }
6395
6396 - wait_jiffies = msecs_to_jiffies(dirty_writeback_interval * 10);
6397 - schedule_timeout_interruptible(wait_jiffies);
6398 + if (dirty_writeback_interval) {
6399 + wait_jiffies = msecs_to_jiffies(dirty_writeback_interval * 10);
6400 + schedule_timeout_interruptible(wait_jiffies);
6401 + } else
6402 + schedule();
6403 +
6404 try_to_freeze();
6405 }
6406
6407 diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c
6408 index e6dd2ae..b20bfcc 100644
6409 --- a/fs/gfs2/file.c
6410 +++ b/fs/gfs2/file.c
6411 @@ -218,6 +218,11 @@ static int do_gfs2_set_flags(struct file *filp, u32 reqflags, u32 mask)
6412 if (error)
6413 goto out_drop_write;
6414
6415 + error = -EACCES;
6416 + if (!is_owner_or_cap(inode))
6417 + goto out;
6418 +
6419 + error = 0;
6420 flags = ip->i_diskflags;
6421 new_flags = (flags & ~mask) | (reqflags & mask);
6422 if ((new_flags ^ flags) == 0)
6423 @@ -275,8 +280,10 @@ static int gfs2_set_flags(struct file *filp, u32 __user *ptr)
6424 {
6425 struct inode *inode = filp->f_path.dentry->d_inode;
6426 u32 fsflags, gfsflags;
6427 +
6428 if (get_user(fsflags, ptr))
6429 return -EFAULT;
6430 +
6431 gfsflags = fsflags_cvt(fsflags_to_gfs2, fsflags);
6432 if (!S_ISDIR(inode->i_mode)) {
6433 if (gfsflags & GFS2_DIF_INHERIT_JDATA)
6434 diff --git a/fs/libfs.c b/fs/libfs.c
6435 index ea9a6cc..b016af9 100644
6436 --- a/fs/libfs.c
6437 +++ b/fs/libfs.c
6438 @@ -418,7 +418,8 @@ int simple_write_end(struct file *file, struct address_space *mapping,
6439 * unique inode values later for this filesystem, then you must take care
6440 * to pass it an appropriate max_reserved value to avoid collisions.
6441 */
6442 -int simple_fill_super(struct super_block *s, int magic, struct tree_descr *files)
6443 +int simple_fill_super(struct super_block *s, unsigned long magic,
6444 + struct tree_descr *files)
6445 {
6446 struct inode *inode;
6447 struct dentry *root;
6448 diff --git a/fs/namei.c b/fs/namei.c
6449 index b86b96f..f6c7fcf 100644
6450 --- a/fs/namei.c
6451 +++ b/fs/namei.c
6452 @@ -1620,6 +1620,7 @@ static struct file *do_last(struct nameidata *nd, struct path *path,
6453 case LAST_DOTDOT:
6454 follow_dotdot(nd);
6455 dir = nd->path.dentry;
6456 + case LAST_DOT:
6457 if (nd->path.mnt->mnt_sb->s_type->fs_flags & FS_REVAL_DOT) {
6458 if (!dir->d_op->d_revalidate(dir, nd)) {
6459 error = -ESTALE;
6460 @@ -1627,7 +1628,6 @@ static struct file *do_last(struct nameidata *nd, struct path *path,
6461 }
6462 }
6463 /* fallthrough */
6464 - case LAST_DOT:
6465 case LAST_ROOT:
6466 if (open_flag & O_CREAT)
6467 goto exit;
6468 diff --git a/fs/nfs/write.c b/fs/nfs/write.c
6469 index 3aea3ca..91679e2 100644
6470 --- a/fs/nfs/write.c
6471 +++ b/fs/nfs/write.c
6472 @@ -1386,7 +1386,7 @@ static int nfs_commit_inode(struct inode *inode, int how)
6473 int res = 0;
6474
6475 if (!nfs_commit_set_lock(NFS_I(inode), may_wait))
6476 - goto out;
6477 + goto out_mark_dirty;
6478 spin_lock(&inode->i_lock);
6479 res = nfs_scan_commit(inode, &head, 0, 0);
6480 spin_unlock(&inode->i_lock);
6481 @@ -1398,9 +1398,18 @@ static int nfs_commit_inode(struct inode *inode, int how)
6482 wait_on_bit(&NFS_I(inode)->flags, NFS_INO_COMMIT,
6483 nfs_wait_bit_killable,
6484 TASK_KILLABLE);
6485 + else
6486 + goto out_mark_dirty;
6487 } else
6488 nfs_commit_clear_lock(NFS_I(inode));
6489 -out:
6490 + return res;
6491 + /* Note: If we exit without ensuring that the commit is complete,
6492 + * we must mark the inode as dirty. Otherwise, future calls to
6493 + * sync_inode() with the WB_SYNC_ALL flag set will fail to ensure
6494 + * that the data is on the disk.
6495 + */
6496 +out_mark_dirty:
6497 + __mark_inode_dirty(inode, I_DIRTY_DATASYNC);
6498 return res;
6499 }
6500
6501 @@ -1509,14 +1518,17 @@ int nfs_wb_page(struct inode *inode, struct page *page)
6502 };
6503 int ret;
6504
6505 - while(PagePrivate(page)) {
6506 + for (;;) {
6507 wait_on_page_writeback(page);
6508 if (clear_page_dirty_for_io(page)) {
6509 ret = nfs_writepage_locked(page, &wbc);
6510 if (ret < 0)
6511 goto out_error;
6512 + continue;
6513 }
6514 - ret = sync_inode(inode, &wbc);
6515 + if (!PagePrivate(page))
6516 + break;
6517 + ret = nfs_commit_inode(inode, FLUSH_SYNC);
6518 if (ret < 0)
6519 goto out_error;
6520 }
6521 diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c
6522 index 171699e..06b2a26 100644
6523 --- a/fs/nfsd/nfssvc.c
6524 +++ b/fs/nfsd/nfssvc.c
6525 @@ -120,7 +120,7 @@ u32 nfsd_supported_minorversion;
6526 int nfsd_vers(int vers, enum vers_op change)
6527 {
6528 if (vers < NFSD_MINVERS || vers >= NFSD_NRVERS)
6529 - return -1;
6530 + return 0;
6531 switch(change) {
6532 case NFSD_SET:
6533 nfsd_versions[vers] = nfsd_version[vers];
6534 diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c
6535 index 6dd5f19..4eb9baa 100644
6536 --- a/fs/nfsd/vfs.c
6537 +++ b/fs/nfsd/vfs.c
6538 @@ -443,8 +443,7 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap,
6539 if (size_change)
6540 put_write_access(inode);
6541 if (!err)
6542 - if (EX_ISSYNC(fhp->fh_export))
6543 - write_inode_now(inode, 1);
6544 + commit_metadata(fhp);
6545 out:
6546 return err;
6547
6548 @@ -724,7 +723,7 @@ nfsd_open(struct svc_rqst *rqstp, struct svc_fh *fhp, int type,
6549 struct inode *inode;
6550 int flags = O_RDONLY|O_LARGEFILE;
6551 __be32 err;
6552 - int host_err;
6553 + int host_err = 0;
6554
6555 validate_process_creds();
6556
6557 @@ -761,7 +760,8 @@ nfsd_open(struct svc_rqst *rqstp, struct svc_fh *fhp, int type,
6558 * Check to see if there are any leases on this file.
6559 * This may block while leases are broken.
6560 */
6561 - host_err = break_lease(inode, O_NONBLOCK | ((access & NFSD_MAY_WRITE) ? O_WRONLY : 0));
6562 + if (!(access & NFSD_MAY_NOT_BREAK_LEASE))
6563 + host_err = break_lease(inode, O_NONBLOCK | ((access & NFSD_MAY_WRITE) ? O_WRONLY : 0));
6564 if (host_err == -EWOULDBLOCK)
6565 host_err = -ETIMEDOUT;
6566 if (host_err) /* NOMEM or WOULDBLOCK */
6567 @@ -1169,7 +1169,8 @@ nfsd_commit(struct svc_rqst *rqstp, struct svc_fh *fhp,
6568 goto out;
6569 }
6570
6571 - err = nfsd_open(rqstp, fhp, S_IFREG, NFSD_MAY_WRITE, &file);
6572 + err = nfsd_open(rqstp, fhp, S_IFREG,
6573 + NFSD_MAY_WRITE|NFSD_MAY_NOT_BREAK_LEASE, &file);
6574 if (err)
6575 goto out;
6576 if (EX_ISSYNC(fhp->fh_export)) {
6577 diff --git a/fs/nfsd/vfs.h b/fs/nfsd/vfs.h
6578 index 4b1de0a..217a62c 100644
6579 --- a/fs/nfsd/vfs.h
6580 +++ b/fs/nfsd/vfs.h
6581 @@ -20,6 +20,7 @@
6582 #define NFSD_MAY_OWNER_OVERRIDE 64
6583 #define NFSD_MAY_LOCAL_ACCESS 128 /* IRIX doing local access check on device special file*/
6584 #define NFSD_MAY_BYPASS_GSS_ON_ROOT 256
6585 +#define NFSD_MAY_NOT_BREAK_LEASE 512
6586
6587 #define NFSD_MAY_CREATE (NFSD_MAY_EXEC|NFSD_MAY_WRITE)
6588 #define NFSD_MAY_REMOVE (NFSD_MAY_EXEC|NFSD_MAY_WRITE|NFSD_MAY_TRUNC)
6589 diff --git a/include/linux/aio.h b/include/linux/aio.h
6590 index 811dbb3..7a8db41 100644
6591 --- a/include/linux/aio.h
6592 +++ b/include/linux/aio.h
6593 @@ -212,6 +212,8 @@ extern void kick_iocb(struct kiocb *iocb);
6594 extern int aio_complete(struct kiocb *iocb, long res, long res2);
6595 struct mm_struct;
6596 extern void exit_aio(struct mm_struct *mm);
6597 +extern long do_io_submit(aio_context_t ctx_id, long nr,
6598 + struct iocb __user *__user *iocbpp, bool compat);
6599 #else
6600 static inline ssize_t wait_on_sync_kiocb(struct kiocb *iocb) { return 0; }
6601 static inline int aio_put_req(struct kiocb *iocb) { return 0; }
6602 @@ -219,6 +221,9 @@ static inline void kick_iocb(struct kiocb *iocb) { }
6603 static inline int aio_complete(struct kiocb *iocb, long res, long res2) { return 0; }
6604 struct mm_struct;
6605 static inline void exit_aio(struct mm_struct *mm) { }
6606 +static inline long do_io_submit(aio_context_t ctx_id, long nr,
6607 + struct iocb __user * __user *iocbpp,
6608 + bool compat) { return 0; }
6609 #endif /* CONFIG_AIO */
6610
6611 static inline struct kiocb *list_kiocb(struct list_head *h)
6612 diff --git a/include/linux/compat.h b/include/linux/compat.h
6613 index 717c691..168f7da 100644
6614 --- a/include/linux/compat.h
6615 +++ b/include/linux/compat.h
6616 @@ -356,5 +356,9 @@ asmlinkage long compat_sys_newfstatat(unsigned int dfd, char __user * filename,
6617 asmlinkage long compat_sys_openat(unsigned int dfd, const char __user *filename,
6618 int flags, int mode);
6619
6620 +extern ssize_t compat_rw_copy_check_uvector(int type,
6621 + const struct compat_iovec __user *uvector, unsigned long nr_segs,
6622 + unsigned long fast_segs, struct iovec *fast_pointer,
6623 + struct iovec **ret_pointer);
6624 #endif /* CONFIG_COMPAT */
6625 #endif /* _LINUX_COMPAT_H */
6626 diff --git a/include/linux/fs.h b/include/linux/fs.h
6627 index 44f35ae..801b398 100644
6628 --- a/include/linux/fs.h
6629 +++ b/include/linux/fs.h
6630 @@ -2356,7 +2356,7 @@ extern const struct file_operations simple_dir_operations;
6631 extern const struct inode_operations simple_dir_inode_operations;
6632 struct tree_descr { char *name; const struct file_operations *ops; int mode; };
6633 struct dentry *d_alloc_name(struct dentry *, const char *);
6634 -extern int simple_fill_super(struct super_block *, int, struct tree_descr *);
6635 +extern int simple_fill_super(struct super_block *, unsigned long, struct tree_descr *);
6636 extern int simple_pin_fs(struct file_system_type *, struct vfsmount **mount, int *count);
6637 extern void simple_release_fs(struct vfsmount **mount, int *count);
6638
6639 diff --git a/include/linux/miscdevice.h b/include/linux/miscdevice.h
6640 index 8b5f7cc..ce9cd11 100644
6641 --- a/include/linux/miscdevice.h
6642 +++ b/include/linux/miscdevice.h
6643 @@ -3,6 +3,12 @@
6644 #include <linux/module.h>
6645 #include <linux/major.h>
6646
6647 +/*
6648 + * These allocations are managed by device@lanana.org. If you use an
6649 + * entry that is not in assigned your entry may well be moved and
6650 + * reassigned, or set dynamic if a fixed value is not justified.
6651 + */
6652 +
6653 #define PSMOUSE_MINOR 1
6654 #define MS_BUSMOUSE_MINOR 2
6655 #define ATIXL_BUSMOUSE_MINOR 3
6656 @@ -30,7 +36,6 @@
6657 #define HPET_MINOR 228
6658 #define FUSE_MINOR 229
6659 #define KVM_MINOR 232
6660 -#define VHOST_NET_MINOR 233
6661 #define MISC_DYNAMIC_MINOR 255
6662
6663 struct device;
6664 diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
6665 index 9f688d2..c516a33 100644
6666 --- a/include/linux/pci_ids.h
6667 +++ b/include/linux/pci_ids.h
6668 @@ -2321,6 +2321,7 @@
6669 #define PCI_VENDOR_ID_JMICRON 0x197B
6670 #define PCI_DEVICE_ID_JMICRON_JMB360 0x2360
6671 #define PCI_DEVICE_ID_JMICRON_JMB361 0x2361
6672 +#define PCI_DEVICE_ID_JMICRON_JMB362 0x2362
6673 #define PCI_DEVICE_ID_JMICRON_JMB363 0x2363
6674 #define PCI_DEVICE_ID_JMICRON_JMB365 0x2365
6675 #define PCI_DEVICE_ID_JMICRON_JMB366 0x2366
6676 diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
6677 index c8e3754..eea9188 100644
6678 --- a/include/linux/perf_event.h
6679 +++ b/include/linux/perf_event.h
6680 @@ -531,6 +531,7 @@ enum perf_event_active_state {
6681 struct file;
6682
6683 struct perf_mmap_data {
6684 + atomic_t refcount;
6685 struct rcu_head rcu_head;
6686 #ifdef CONFIG_PERF_USE_VMALLOC
6687 struct work_struct work;
6688 @@ -538,7 +539,6 @@ struct perf_mmap_data {
6689 int data_order;
6690 int nr_pages; /* nr of data pages */
6691 int writable; /* are we writable */
6692 - int nr_locked; /* nr pages mlocked */
6693
6694 atomic_t poll; /* POLL_ for wakeups */
6695 atomic_t events; /* event_id limit */
6696 @@ -582,7 +582,6 @@ struct perf_event {
6697 int nr_siblings;
6698 int group_flags;
6699 struct perf_event *group_leader;
6700 - struct perf_event *output;
6701 const struct pmu *pmu;
6702
6703 enum perf_event_active_state state;
6704 @@ -643,6 +642,8 @@ struct perf_event {
6705 /* mmap bits */
6706 struct mutex mmap_mutex;
6707 atomic_t mmap_count;
6708 + int mmap_locked;
6709 + struct user_struct *mmap_user;
6710 struct perf_mmap_data *data;
6711
6712 /* poll related */
6713 diff --git a/include/linux/slub_def.h b/include/linux/slub_def.h
6714 index 0249d41..c3dc7e1 100644
6715 --- a/include/linux/slub_def.h
6716 +++ b/include/linux/slub_def.h
6717 @@ -75,12 +75,6 @@ struct kmem_cache {
6718 int offset; /* Free pointer offset. */
6719 struct kmem_cache_order_objects oo;
6720
6721 - /*
6722 - * Avoid an extra cache line for UP, SMP and for the node local to
6723 - * struct kmem_cache.
6724 - */
6725 - struct kmem_cache_node local_node;
6726 -
6727 /* Allocation and freeing of slabs */
6728 struct kmem_cache_order_objects max;
6729 struct kmem_cache_order_objects min;
6730 @@ -102,6 +96,9 @@ struct kmem_cache {
6731 */
6732 int remote_node_defrag_ratio;
6733 struct kmem_cache_node *node[MAX_NUMNODES];
6734 +#else
6735 + /* Avoid an extra cache line for UP */
6736 + struct kmem_cache_node local_node;
6737 #endif
6738 };
6739
6740 @@ -132,7 +129,7 @@ struct kmem_cache {
6741 #ifdef CONFIG_ZONE_DMA
6742 #define SLUB_DMA __GFP_DMA
6743 /* Reserve extra caches for potential DMA use */
6744 -#define KMALLOC_CACHES (2 * SLUB_PAGE_SHIFT - 6)
6745 +#define KMALLOC_CACHES (2 * SLUB_PAGE_SHIFT)
6746 #else
6747 /* Disable DMA functionality */
6748 #define SLUB_DMA (__force gfp_t)0
6749 diff --git a/include/linux/swap.h b/include/linux/swap.h
6750 index 1f59d93..d70f424 100644
6751 --- a/include/linux/swap.h
6752 +++ b/include/linux/swap.h
6753 @@ -223,21 +223,11 @@ static inline void lru_cache_add_anon(struct page *page)
6754 __lru_cache_add(page, LRU_INACTIVE_ANON);
6755 }
6756
6757 -static inline void lru_cache_add_active_anon(struct page *page)
6758 -{
6759 - __lru_cache_add(page, LRU_ACTIVE_ANON);
6760 -}
6761 -
6762 static inline void lru_cache_add_file(struct page *page)
6763 {
6764 __lru_cache_add(page, LRU_INACTIVE_FILE);
6765 }
6766
6767 -static inline void lru_cache_add_active_file(struct page *page)
6768 -{
6769 - __lru_cache_add(page, LRU_ACTIVE_FILE);
6770 -}
6771 -
6772 /* linux/mm/vmscan.c */
6773 extern unsigned long try_to_free_pages(struct zonelist *zonelist, int order,
6774 gfp_t gfp_mask, nodemask_t *mask);
6775 diff --git a/include/linux/tboot.h b/include/linux/tboot.h
6776 index bf2a0c7..1dba6ee 100644
6777 --- a/include/linux/tboot.h
6778 +++ b/include/linux/tboot.h
6779 @@ -150,6 +150,7 @@ extern int tboot_force_iommu(void);
6780
6781 #else
6782
6783 +#define tboot_enabled() 0
6784 #define tboot_probe() do { } while (0)
6785 #define tboot_shutdown(shutdown_type) do { } while (0)
6786 #define tboot_sleep(sleep_state, pm1a_control, pm1b_control) \
6787 diff --git a/include/linux/usb.h b/include/linux/usb.h
6788 index 739f1fd..9983302 100644
6789 --- a/include/linux/usb.h
6790 +++ b/include/linux/usb.h
6791 @@ -965,10 +965,19 @@ extern int usb_disabled(void);
6792 * needed */
6793 #define URB_FREE_BUFFER 0x0100 /* Free transfer buffer with the URB */
6794
6795 +/* The following flags are used internally by usbcore and HCDs */
6796 #define URB_DIR_IN 0x0200 /* Transfer from device to host */
6797 #define URB_DIR_OUT 0
6798 #define URB_DIR_MASK URB_DIR_IN
6799
6800 +#define URB_DMA_MAP_SINGLE 0x00010000 /* Non-scatter-gather mapping */
6801 +#define URB_DMA_MAP_PAGE 0x00020000 /* HCD-unsupported S-G */
6802 +#define URB_DMA_MAP_SG 0x00040000 /* HCD-supported S-G */
6803 +#define URB_MAP_LOCAL 0x00080000 /* HCD-local-memory mapping */
6804 +#define URB_SETUP_MAP_SINGLE 0x00100000 /* Setup packet DMA mapped */
6805 +#define URB_SETUP_MAP_LOCAL 0x00200000 /* HCD-local setup packet */
6806 +#define URB_DMA_SG_COMBINED 0x00400000 /* S-G entries were combined */
6807 +
6808 struct usb_iso_packet_descriptor {
6809 unsigned int offset;
6810 unsigned int length; /* expected length */
6811 diff --git a/include/trace/events/signal.h b/include/trace/events/signal.h
6812 index a510b75..32c0697 100644
6813 --- a/include/trace/events/signal.h
6814 +++ b/include/trace/events/signal.h
6815 @@ -10,7 +10,8 @@
6816
6817 #define TP_STORE_SIGINFO(__entry, info) \
6818 do { \
6819 - if (info == SEND_SIG_NOINFO) { \
6820 + if (info == SEND_SIG_NOINFO || \
6821 + info == SEND_SIG_FORCED) { \
6822 __entry->errno = 0; \
6823 __entry->code = SI_USER; \
6824 } else if (info == SEND_SIG_PRIV) { \
6825 diff --git a/kernel/cgroup.c b/kernel/cgroup.c
6826 index 6d870f2..bf4f78f 100644
6827 --- a/kernel/cgroup.c
6828 +++ b/kernel/cgroup.c
6829 @@ -4599,7 +4599,7 @@ static int alloc_css_id(struct cgroup_subsys *ss, struct cgroup *parent,
6830 parent_css = parent->subsys[subsys_id];
6831 child_css = child->subsys[subsys_id];
6832 parent_id = parent_css->id;
6833 - depth = parent_id->depth;
6834 + depth = parent_id->depth + 1;
6835
6836 child_id = get_new_cssid(ss, depth);
6837 if (IS_ERR(child_id))
6838 diff --git a/kernel/compat.c b/kernel/compat.c
6839 index 7f40e92..5adab05 100644
6840 --- a/kernel/compat.c
6841 +++ b/kernel/compat.c
6842 @@ -495,29 +495,26 @@ asmlinkage long compat_sys_sched_getaffinity(compat_pid_t pid, unsigned int len,
6843 {
6844 int ret;
6845 cpumask_var_t mask;
6846 - unsigned long *k;
6847 - unsigned int min_length = cpumask_size();
6848 -
6849 - if (nr_cpu_ids <= BITS_PER_COMPAT_LONG)
6850 - min_length = sizeof(compat_ulong_t);
6851
6852 - if (len < min_length)
6853 + if ((len * BITS_PER_BYTE) < nr_cpu_ids)
6854 + return -EINVAL;
6855 + if (len & (sizeof(compat_ulong_t)-1))
6856 return -EINVAL;
6857
6858 if (!alloc_cpumask_var(&mask, GFP_KERNEL))
6859 return -ENOMEM;
6860
6861 ret = sched_getaffinity(pid, mask);
6862 - if (ret < 0)
6863 - goto out;
6864 + if (ret == 0) {
6865 + size_t retlen = min_t(size_t, len, cpumask_size());
6866
6867 - k = cpumask_bits(mask);
6868 - ret = compat_put_bitmap(user_mask_ptr, k, min_length * 8);
6869 - if (ret == 0)
6870 - ret = min_length;
6871 -
6872 -out:
6873 + if (compat_put_bitmap(user_mask_ptr, cpumask_bits(mask), retlen * 8))
6874 + ret = -EFAULT;
6875 + else
6876 + ret = retlen;
6877 + }
6878 free_cpumask_var(mask);
6879 +
6880 return ret;
6881 }
6882
6883 diff --git a/kernel/mutex.c b/kernel/mutex.c
6884 index 632f04c..4c0b7b3 100644
6885 --- a/kernel/mutex.c
6886 +++ b/kernel/mutex.c
6887 @@ -172,6 +172,13 @@ __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass,
6888 struct thread_info *owner;
6889
6890 /*
6891 + * If we own the BKL, then don't spin. The owner of
6892 + * the mutex might be waiting on us to release the BKL.
6893 + */
6894 + if (unlikely(current->lock_depth >= 0))
6895 + break;
6896 +
6897 + /*
6898 * If there's an owner, wait for it to either
6899 * release the lock or go to sleep.
6900 */
6901 diff --git a/kernel/perf_event.c b/kernel/perf_event.c
6902 index 3d1552d..a244651 100644
6903 --- a/kernel/perf_event.c
6904 +++ b/kernel/perf_event.c
6905 @@ -262,6 +262,18 @@ static void update_event_times(struct perf_event *event)
6906 event->total_time_running = run_end - event->tstamp_running;
6907 }
6908
6909 +/*
6910 + * Update total_time_enabled and total_time_running for all events in a group.
6911 + */
6912 +static void update_group_times(struct perf_event *leader)
6913 +{
6914 + struct perf_event *event;
6915 +
6916 + update_event_times(leader);
6917 + list_for_each_entry(event, &leader->sibling_list, group_entry)
6918 + update_event_times(event);
6919 +}
6920 +
6921 static struct list_head *
6922 ctx_group_list(struct perf_event *event, struct perf_event_context *ctx)
6923 {
6924 @@ -315,8 +327,6 @@ list_add_event(struct perf_event *event, struct perf_event_context *ctx)
6925 static void
6926 list_del_event(struct perf_event *event, struct perf_event_context *ctx)
6927 {
6928 - struct perf_event *sibling, *tmp;
6929 -
6930 if (list_empty(&event->group_entry))
6931 return;
6932 ctx->nr_events--;
6933 @@ -329,7 +339,7 @@ list_del_event(struct perf_event *event, struct perf_event_context *ctx)
6934 if (event->group_leader != event)
6935 event->group_leader->nr_siblings--;
6936
6937 - update_event_times(event);
6938 + update_group_times(event);
6939
6940 /*
6941 * If event was in error state, then keep it
6942 @@ -340,6 +350,12 @@ list_del_event(struct perf_event *event, struct perf_event_context *ctx)
6943 */
6944 if (event->state > PERF_EVENT_STATE_OFF)
6945 event->state = PERF_EVENT_STATE_OFF;
6946 +}
6947 +
6948 +static void
6949 +perf_destroy_group(struct perf_event *event, struct perf_event_context *ctx)
6950 +{
6951 + struct perf_event *sibling, *tmp;
6952
6953 /*
6954 * If this was a group event with sibling events then
6955 @@ -505,18 +521,6 @@ retry:
6956 }
6957
6958 /*
6959 - * Update total_time_enabled and total_time_running for all events in a group.
6960 - */
6961 -static void update_group_times(struct perf_event *leader)
6962 -{
6963 - struct perf_event *event;
6964 -
6965 - update_event_times(leader);
6966 - list_for_each_entry(event, &leader->sibling_list, group_entry)
6967 - update_event_times(event);
6968 -}
6969 -
6970 -/*
6971 * Cross CPU call to disable a performance event
6972 */
6973 static void __perf_event_disable(void *info)
6974 @@ -1452,6 +1456,9 @@ do { \
6975 divisor = nsec * frequency;
6976 }
6977
6978 + if (!divisor)
6979 + return dividend;
6980 +
6981 return div64_u64(dividend, divisor);
6982 }
6983
6984 @@ -1474,7 +1481,7 @@ static int perf_event_start(struct perf_event *event)
6985 static void perf_adjust_period(struct perf_event *event, u64 nsec, u64 count)
6986 {
6987 struct hw_perf_event *hwc = &event->hw;
6988 - u64 period, sample_period;
6989 + s64 period, sample_period;
6990 s64 delta;
6991
6992 period = perf_calculate_period(event, nsec, count);
6993 @@ -1825,6 +1832,7 @@ static void free_event_rcu(struct rcu_head *head)
6994 }
6995
6996 static void perf_pending_sync(struct perf_event *event);
6997 +static void perf_mmap_data_put(struct perf_mmap_data *data);
6998
6999 static void free_event(struct perf_event *event)
7000 {
7001 @@ -1840,9 +1848,9 @@ static void free_event(struct perf_event *event)
7002 atomic_dec(&nr_task_events);
7003 }
7004
7005 - if (event->output) {
7006 - fput(event->output->filp);
7007 - event->output = NULL;
7008 + if (event->data) {
7009 + perf_mmap_data_put(event->data);
7010 + event->data = NULL;
7011 }
7012
7013 if (event->destroy)
7014 @@ -1856,9 +1864,18 @@ int perf_event_release_kernel(struct perf_event *event)
7015 {
7016 struct perf_event_context *ctx = event->ctx;
7017
7018 + /*
7019 + * Remove from the PMU, can't get re-enabled since we got
7020 + * here because the last ref went.
7021 + */
7022 + perf_event_disable(event);
7023 +
7024 WARN_ON_ONCE(ctx->parent_ctx);
7025 mutex_lock(&ctx->mutex);
7026 - perf_event_remove_from_context(event);
7027 + raw_spin_lock_irq(&ctx->lock);
7028 + list_del_event(event, ctx);
7029 + perf_destroy_group(event, ctx);
7030 + raw_spin_unlock_irq(&ctx->lock);
7031 mutex_unlock(&ctx->mutex);
7032
7033 mutex_lock(&event->owner->perf_event_mutex);
7034 @@ -2138,7 +2155,27 @@ unlock:
7035 return ret;
7036 }
7037
7038 -static int perf_event_set_output(struct perf_event *event, int output_fd);
7039 +static const struct file_operations perf_fops;
7040 +
7041 +static struct perf_event *perf_fget_light(int fd, int *fput_needed)
7042 +{
7043 + struct file *file;
7044 +
7045 + file = fget_light(fd, fput_needed);
7046 + if (!file)
7047 + return ERR_PTR(-EBADF);
7048 +
7049 + if (file->f_op != &perf_fops) {
7050 + fput_light(file, *fput_needed);
7051 + *fput_needed = 0;
7052 + return ERR_PTR(-EBADF);
7053 + }
7054 +
7055 + return file->private_data;
7056 +}
7057 +
7058 +static int perf_event_set_output(struct perf_event *event,
7059 + struct perf_event *output_event);
7060 static int perf_event_set_filter(struct perf_event *event, void __user *arg);
7061
7062 static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
7063 @@ -2165,7 +2202,23 @@ static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
7064 return perf_event_period(event, (u64 __user *)arg);
7065
7066 case PERF_EVENT_IOC_SET_OUTPUT:
7067 - return perf_event_set_output(event, arg);
7068 + {
7069 + struct perf_event *output_event = NULL;
7070 + int fput_needed = 0;
7071 + int ret;
7072 +
7073 + if (arg != -1) {
7074 + output_event = perf_fget_light(arg, &fput_needed);
7075 + if (IS_ERR(output_event))
7076 + return PTR_ERR(output_event);
7077 + }
7078 +
7079 + ret = perf_event_set_output(event, output_event);
7080 + if (output_event)
7081 + fput_light(output_event->filp, fput_needed);
7082 +
7083 + return ret;
7084 + }
7085
7086 case PERF_EVENT_IOC_SET_FILTER:
7087 return perf_event_set_filter(event, (void __user *)arg);
7088 @@ -2290,8 +2343,6 @@ perf_mmap_data_alloc(struct perf_event *event, int nr_pages)
7089 unsigned long size;
7090 int i;
7091
7092 - WARN_ON(atomic_read(&event->mmap_count));
7093 -
7094 size = sizeof(struct perf_mmap_data);
7095 size += nr_pages * sizeof(void *);
7096
7097 @@ -2398,8 +2449,6 @@ perf_mmap_data_alloc(struct perf_event *event, int nr_pages)
7098 unsigned long size;
7099 void *all_buf;
7100
7101 - WARN_ON(atomic_read(&event->mmap_count));
7102 -
7103 size = sizeof(struct perf_mmap_data);
7104 size += sizeof(void *);
7105
7106 @@ -2479,7 +2528,7 @@ perf_mmap_data_init(struct perf_event *event, struct perf_mmap_data *data)
7107 if (!data->watermark)
7108 data->watermark = max_size / 2;
7109
7110 -
7111 + atomic_set(&data->refcount, 1);
7112 rcu_assign_pointer(event->data, data);
7113 }
7114
7115 @@ -2491,13 +2540,26 @@ static void perf_mmap_data_free_rcu(struct rcu_head *rcu_head)
7116 perf_mmap_data_free(data);
7117 }
7118
7119 -static void perf_mmap_data_release(struct perf_event *event)
7120 +static struct perf_mmap_data *perf_mmap_data_get(struct perf_event *event)
7121 {
7122 - struct perf_mmap_data *data = event->data;
7123 + struct perf_mmap_data *data;
7124 +
7125 + rcu_read_lock();
7126 + data = rcu_dereference(event->data);
7127 + if (data) {
7128 + if (!atomic_inc_not_zero(&data->refcount))
7129 + data = NULL;
7130 + }
7131 + rcu_read_unlock();
7132
7133 - WARN_ON(atomic_read(&event->mmap_count));
7134 + return data;
7135 +}
7136 +
7137 +static void perf_mmap_data_put(struct perf_mmap_data *data)
7138 +{
7139 + if (!atomic_dec_and_test(&data->refcount))
7140 + return;
7141
7142 - rcu_assign_pointer(event->data, NULL);
7143 call_rcu(&data->rcu_head, perf_mmap_data_free_rcu);
7144 }
7145
7146 @@ -2512,15 +2574,18 @@ static void perf_mmap_close(struct vm_area_struct *vma)
7147 {
7148 struct perf_event *event = vma->vm_file->private_data;
7149
7150 - WARN_ON_ONCE(event->ctx->parent_ctx);
7151 if (atomic_dec_and_mutex_lock(&event->mmap_count, &event->mmap_mutex)) {
7152 unsigned long size = perf_data_size(event->data);
7153 - struct user_struct *user = current_user();
7154 + struct user_struct *user = event->mmap_user;
7155 + struct perf_mmap_data *data = event->data;
7156
7157 atomic_long_sub((size >> PAGE_SHIFT) + 1, &user->locked_vm);
7158 - vma->vm_mm->locked_vm -= event->data->nr_locked;
7159 - perf_mmap_data_release(event);
7160 + vma->vm_mm->locked_vm -= event->mmap_locked;
7161 + rcu_assign_pointer(event->data, NULL);
7162 mutex_unlock(&event->mmap_mutex);
7163 +
7164 + perf_mmap_data_put(data);
7165 + free_uid(user);
7166 }
7167 }
7168
7169 @@ -2564,13 +2629,10 @@ static int perf_mmap(struct file *file, struct vm_area_struct *vma)
7170
7171 WARN_ON_ONCE(event->ctx->parent_ctx);
7172 mutex_lock(&event->mmap_mutex);
7173 - if (event->output) {
7174 - ret = -EINVAL;
7175 - goto unlock;
7176 - }
7177 -
7178 - if (atomic_inc_not_zero(&event->mmap_count)) {
7179 - if (nr_pages != event->data->nr_pages)
7180 + if (event->data) {
7181 + if (event->data->nr_pages == nr_pages)
7182 + atomic_inc(&event->data->refcount);
7183 + else
7184 ret = -EINVAL;
7185 goto unlock;
7186 }
7187 @@ -2602,21 +2664,23 @@ static int perf_mmap(struct file *file, struct vm_area_struct *vma)
7188 WARN_ON(event->data);
7189
7190 data = perf_mmap_data_alloc(event, nr_pages);
7191 - ret = -ENOMEM;
7192 - if (!data)
7193 + if (!data) {
7194 + ret = -ENOMEM;
7195 goto unlock;
7196 + }
7197
7198 - ret = 0;
7199 perf_mmap_data_init(event, data);
7200 -
7201 - atomic_set(&event->mmap_count, 1);
7202 - atomic_long_add(user_extra, &user->locked_vm);
7203 - vma->vm_mm->locked_vm += extra;
7204 - event->data->nr_locked = extra;
7205 if (vma->vm_flags & VM_WRITE)
7206 event->data->writable = 1;
7207
7208 + atomic_long_add(user_extra, &user->locked_vm);
7209 + event->mmap_locked = extra;
7210 + event->mmap_user = get_current_user();
7211 + vma->vm_mm->locked_vm += event->mmap_locked;
7212 +
7213 unlock:
7214 + if (!ret)
7215 + atomic_inc(&event->mmap_count);
7216 mutex_unlock(&event->mmap_mutex);
7217
7218 vma->vm_flags |= VM_RESERVED;
7219 @@ -2946,7 +3010,6 @@ int perf_output_begin(struct perf_output_handle *handle,
7220 struct perf_event *event, unsigned int size,
7221 int nmi, int sample)
7222 {
7223 - struct perf_event *output_event;
7224 struct perf_mmap_data *data;
7225 unsigned long tail, offset, head;
7226 int have_lost;
7227 @@ -2963,10 +3026,6 @@ int perf_output_begin(struct perf_output_handle *handle,
7228 if (event->parent)
7229 event = event->parent;
7230
7231 - output_event = rcu_dereference(event->output);
7232 - if (output_event)
7233 - event = output_event;
7234 -
7235 data = rcu_dereference(event->data);
7236 if (!data)
7237 goto out;
7238 @@ -4730,54 +4789,41 @@ err_size:
7239 goto out;
7240 }
7241
7242 -static int perf_event_set_output(struct perf_event *event, int output_fd)
7243 +static int
7244 +perf_event_set_output(struct perf_event *event, struct perf_event *output_event)
7245 {
7246 - struct perf_event *output_event = NULL;
7247 - struct file *output_file = NULL;
7248 - struct perf_event *old_output;
7249 - int fput_needed = 0;
7250 + struct perf_mmap_data *data = NULL, *old_data = NULL;
7251 int ret = -EINVAL;
7252
7253 - if (!output_fd)
7254 + if (!output_event)
7255 goto set;
7256
7257 - output_file = fget_light(output_fd, &fput_needed);
7258 - if (!output_file)
7259 - return -EBADF;
7260 -
7261 - if (output_file->f_op != &perf_fops)
7262 + /* don't allow circular references */
7263 + if (event == output_event)
7264 goto out;
7265
7266 - output_event = output_file->private_data;
7267 -
7268 - /* Don't chain output fds */
7269 - if (output_event->output)
7270 - goto out;
7271 -
7272 - /* Don't set an output fd when we already have an output channel */
7273 - if (event->data)
7274 - goto out;
7275 -
7276 - atomic_long_inc(&output_file->f_count);
7277 -
7278 set:
7279 mutex_lock(&event->mmap_mutex);
7280 - old_output = event->output;
7281 - rcu_assign_pointer(event->output, output_event);
7282 - mutex_unlock(&event->mmap_mutex);
7283 + /* Can't redirect output if we've got an active mmap() */
7284 + if (atomic_read(&event->mmap_count))
7285 + goto unlock;
7286
7287 - if (old_output) {
7288 - /*
7289 - * we need to make sure no existing perf_output_*()
7290 - * is still referencing this event.
7291 - */
7292 - synchronize_rcu();
7293 - fput(old_output->filp);
7294 + if (output_event) {
7295 + /* get the buffer we want to redirect to */
7296 + data = perf_mmap_data_get(output_event);
7297 + if (!data)
7298 + goto unlock;
7299 }
7300
7301 + old_data = event->data;
7302 + rcu_assign_pointer(event->data, data);
7303 ret = 0;
7304 +unlock:
7305 + mutex_unlock(&event->mmap_mutex);
7306 +
7307 + if (old_data)
7308 + perf_mmap_data_put(old_data);
7309 out:
7310 - fput_light(output_file, fput_needed);
7311 return ret;
7312 }
7313
7314 @@ -4793,13 +4839,13 @@ SYSCALL_DEFINE5(perf_event_open,
7315 struct perf_event_attr __user *, attr_uptr,
7316 pid_t, pid, int, cpu, int, group_fd, unsigned long, flags)
7317 {
7318 - struct perf_event *event, *group_leader;
7319 + struct perf_event *event, *group_leader = NULL, *output_event = NULL;
7320 struct perf_event_attr attr;
7321 struct perf_event_context *ctx;
7322 struct file *event_file = NULL;
7323 struct file *group_file = NULL;
7324 + int event_fd;
7325 int fput_needed = 0;
7326 - int fput_needed2 = 0;
7327 int err;
7328
7329 /* for future expandability... */
7330 @@ -4820,26 +4866,38 @@ SYSCALL_DEFINE5(perf_event_open,
7331 return -EINVAL;
7332 }
7333
7334 + event_fd = get_unused_fd_flags(O_RDWR);
7335 + if (event_fd < 0)
7336 + return event_fd;
7337 +
7338 + if (group_fd != -1) {
7339 + group_leader = perf_fget_light(group_fd, &fput_needed);
7340 + if (IS_ERR(group_leader)) {
7341 + err = PTR_ERR(group_leader);
7342 + goto err_put_context;
7343 + }
7344 + group_file = group_leader->filp;
7345 + if (flags & PERF_FLAG_FD_OUTPUT)
7346 + output_event = group_leader;
7347 + if (flags & PERF_FLAG_FD_NO_GROUP)
7348 + group_leader = NULL;
7349 + }
7350 +
7351 /*
7352 * Get the target context (task or percpu):
7353 */
7354 ctx = find_get_context(pid, cpu);
7355 - if (IS_ERR(ctx))
7356 - return PTR_ERR(ctx);
7357 + if (IS_ERR(ctx)) {
7358 + err = PTR_ERR(ctx);
7359 + goto err_fd;
7360 + }
7361
7362 /*
7363 * Look up the group leader (we will attach this event to it):
7364 */
7365 - group_leader = NULL;
7366 - if (group_fd != -1 && !(flags & PERF_FLAG_FD_NO_GROUP)) {
7367 + if (group_leader) {
7368 err = -EINVAL;
7369 - group_file = fget_light(group_fd, &fput_needed);
7370 - if (!group_file)
7371 - goto err_put_context;
7372 - if (group_file->f_op != &perf_fops)
7373 - goto err_put_context;
7374
7375 - group_leader = group_file->private_data;
7376 /*
7377 * Do not allow a recursive hierarchy (this new sibling
7378 * becoming part of another group-sibling):
7379 @@ -4861,22 +4919,21 @@ SYSCALL_DEFINE5(perf_event_open,
7380
7381 event = perf_event_alloc(&attr, cpu, ctx, group_leader,
7382 NULL, NULL, GFP_KERNEL);
7383 - err = PTR_ERR(event);
7384 - if (IS_ERR(event))
7385 + if (IS_ERR(event)) {
7386 + err = PTR_ERR(event);
7387 goto err_put_context;
7388 + }
7389
7390 - err = anon_inode_getfd("[perf_event]", &perf_fops, event, O_RDWR);
7391 - if (err < 0)
7392 - goto err_free_put_context;
7393 + if (output_event) {
7394 + err = perf_event_set_output(event, output_event);
7395 + if (err)
7396 + goto err_free_put_context;
7397 + }
7398
7399 - event_file = fget_light(err, &fput_needed2);
7400 - if (!event_file)
7401 + event_file = anon_inode_getfile("[perf_event]", &perf_fops, event, O_RDWR);
7402 + if (IS_ERR(event_file)) {
7403 + err = PTR_ERR(event_file);
7404 goto err_free_put_context;
7405 -
7406 - if (flags & PERF_FLAG_FD_OUTPUT) {
7407 - err = perf_event_set_output(event, group_fd);
7408 - if (err)
7409 - goto err_fput_free_put_context;
7410 }
7411
7412 event->filp = event_file;
7413 @@ -4892,19 +4949,17 @@ SYSCALL_DEFINE5(perf_event_open,
7414 list_add_tail(&event->owner_entry, &current->perf_event_list);
7415 mutex_unlock(&current->perf_event_mutex);
7416
7417 -err_fput_free_put_context:
7418 - fput_light(event_file, fput_needed2);
7419 + fput_light(group_file, fput_needed);
7420 + fd_install(event_fd, event_file);
7421 + return event_fd;
7422
7423 err_free_put_context:
7424 - if (err < 0)
7425 - free_event(event);
7426 -
7427 + free_event(event);
7428 err_put_context:
7429 - if (err < 0)
7430 - put_ctx(ctx);
7431 -
7432 fput_light(group_file, fput_needed);
7433 -
7434 + put_ctx(ctx);
7435 +err_fd:
7436 + put_unused_fd(event_fd);
7437 return err;
7438 }
7439
7440 diff --git a/kernel/posix-timers.c b/kernel/posix-timers.c
7441 index 00d1fda..ad72342 100644
7442 --- a/kernel/posix-timers.c
7443 +++ b/kernel/posix-timers.c
7444 @@ -559,14 +559,7 @@ SYSCALL_DEFINE3(timer_create, const clockid_t, which_clock,
7445 new_timer->it_id = (timer_t) new_timer_id;
7446 new_timer->it_clock = which_clock;
7447 new_timer->it_overrun = -1;
7448 - error = CLOCK_DISPATCH(which_clock, timer_create, (new_timer));
7449 - if (error)
7450 - goto out;
7451
7452 - /*
7453 - * return the timer_id now. The next step is hard to
7454 - * back out if there is an error.
7455 - */
7456 if (copy_to_user(created_timer_id,
7457 &new_timer_id, sizeof (new_timer_id))) {
7458 error = -EFAULT;
7459 @@ -597,6 +590,10 @@ SYSCALL_DEFINE3(timer_create, const clockid_t, which_clock,
7460 new_timer->sigq->info.si_tid = new_timer->it_id;
7461 new_timer->sigq->info.si_code = SI_TIMER;
7462
7463 + error = CLOCK_DISPATCH(which_clock, timer_create, (new_timer));
7464 + if (error)
7465 + goto out;
7466 +
7467 spin_lock_irq(&current->sighand->siglock);
7468 new_timer->it_signal = current->signal;
7469 list_add(&new_timer->list, &current->signal->posix_timers);
7470 diff --git a/kernel/signal.c b/kernel/signal.c
7471 index dbd7fe0..48f2130 100644
7472 --- a/kernel/signal.c
7473 +++ b/kernel/signal.c
7474 @@ -642,7 +642,7 @@ static inline bool si_fromuser(const struct siginfo *info)
7475 static int check_kill_permission(int sig, struct siginfo *info,
7476 struct task_struct *t)
7477 {
7478 - const struct cred *cred = current_cred(), *tcred;
7479 + const struct cred *cred, *tcred;
7480 struct pid *sid;
7481 int error;
7482
7483 @@ -656,8 +656,10 @@ static int check_kill_permission(int sig, struct siginfo *info,
7484 if (error)
7485 return error;
7486
7487 + cred = current_cred();
7488 tcred = __task_cred(t);
7489 - if ((cred->euid ^ tcred->suid) &&
7490 + if (!same_thread_group(current, t) &&
7491 + (cred->euid ^ tcred->suid) &&
7492 (cred->euid ^ tcred->uid) &&
7493 (cred->uid ^ tcred->suid) &&
7494 (cred->uid ^ tcred->uid) &&
7495 diff --git a/lib/idr.c b/lib/idr.c
7496 index 2eb1dca..0d74f6b 100644
7497 --- a/lib/idr.c
7498 +++ b/lib/idr.c
7499 @@ -445,6 +445,7 @@ EXPORT_SYMBOL(idr_remove);
7500 void idr_remove_all(struct idr *idp)
7501 {
7502 int n, id, max;
7503 + int bt_mask;
7504 struct idr_layer *p;
7505 struct idr_layer *pa[MAX_LEVEL];
7506 struct idr_layer **paa = &pa[0];
7507 @@ -462,8 +463,10 @@ void idr_remove_all(struct idr *idp)
7508 p = p->ary[(id >> n) & IDR_MASK];
7509 }
7510
7511 + bt_mask = id;
7512 id += 1 << n;
7513 - while (n < fls(id)) {
7514 + /* Get the highest bit that the above add changed from 0->1. */
7515 + while (n < fls(id ^ bt_mask)) {
7516 if (p)
7517 free_layer(p);
7518 n += IDR_BITS;
7519 diff --git a/mm/filemap.c b/mm/filemap.c
7520 index 140ebda..3760bdc 100644
7521 --- a/mm/filemap.c
7522 +++ b/mm/filemap.c
7523 @@ -441,7 +441,7 @@ int add_to_page_cache_lru(struct page *page, struct address_space *mapping,
7524 /*
7525 * Splice_read and readahead add shmem/tmpfs pages into the page cache
7526 * before shmem_readpage has a chance to mark them as SwapBacked: they
7527 - * need to go on the active_anon lru below, and mem_cgroup_cache_charge
7528 + * need to go on the anon lru below, and mem_cgroup_cache_charge
7529 * (called in add_to_page_cache) needs to know where they're going too.
7530 */
7531 if (mapping_cap_swap_backed(mapping))
7532 @@ -452,7 +452,7 @@ int add_to_page_cache_lru(struct page *page, struct address_space *mapping,
7533 if (page_is_file_cache(page))
7534 lru_cache_add_file(page);
7535 else
7536 - lru_cache_add_active_anon(page);
7537 + lru_cache_add_anon(page);
7538 }
7539 return ret;
7540 }
7541 @@ -1099,6 +1099,12 @@ page_not_up_to_date_locked:
7542 }
7543
7544 readpage:
7545 + /*
7546 + * A previous I/O error may have been due to temporary
7547 + * failures, eg. multipath errors.
7548 + * PG_error will be set again if readpage fails.
7549 + */
7550 + ClearPageError(page);
7551 /* Start the actual read. The read will unlock the page. */
7552 error = mapping->a_ops->readpage(filp, page);
7553
7554 diff --git a/mm/slub.c b/mm/slub.c
7555 index d2a54fe..6cf6be7 100644
7556 --- a/mm/slub.c
7557 +++ b/mm/slub.c
7558 @@ -2141,7 +2141,7 @@ static void free_kmem_cache_nodes(struct kmem_cache *s)
7559
7560 for_each_node_state(node, N_NORMAL_MEMORY) {
7561 struct kmem_cache_node *n = s->node[node];
7562 - if (n && n != &s->local_node)
7563 + if (n)
7564 kmem_cache_free(kmalloc_caches, n);
7565 s->node[node] = NULL;
7566 }
7567 @@ -2150,33 +2150,22 @@ static void free_kmem_cache_nodes(struct kmem_cache *s)
7568 static int init_kmem_cache_nodes(struct kmem_cache *s, gfp_t gfpflags)
7569 {
7570 int node;
7571 - int local_node;
7572 -
7573 - if (slab_state >= UP && (s < kmalloc_caches ||
7574 - s >= kmalloc_caches + KMALLOC_CACHES))
7575 - local_node = page_to_nid(virt_to_page(s));
7576 - else
7577 - local_node = 0;
7578
7579 for_each_node_state(node, N_NORMAL_MEMORY) {
7580 struct kmem_cache_node *n;
7581
7582 - if (local_node == node)
7583 - n = &s->local_node;
7584 - else {
7585 - if (slab_state == DOWN) {
7586 - early_kmem_cache_node_alloc(gfpflags, node);
7587 - continue;
7588 - }
7589 - n = kmem_cache_alloc_node(kmalloc_caches,
7590 - gfpflags, node);
7591 -
7592 - if (!n) {
7593 - free_kmem_cache_nodes(s);
7594 - return 0;
7595 - }
7596 + if (slab_state == DOWN) {
7597 + early_kmem_cache_node_alloc(gfpflags, node);
7598 + continue;
7599 + }
7600 + n = kmem_cache_alloc_node(kmalloc_caches,
7601 + gfpflags, node);
7602
7603 + if (!n) {
7604 + free_kmem_cache_nodes(s);
7605 + return 0;
7606 }
7607 +
7608 s->node[node] = n;
7609 init_kmem_cache_node(n, s);
7610 }
7611 diff --git a/net/mac80211/Kconfig b/net/mac80211/Kconfig
7612 index a952b7f..334c359 100644
7613 --- a/net/mac80211/Kconfig
7614 +++ b/net/mac80211/Kconfig
7615 @@ -15,8 +15,12 @@ comment "CFG80211 needs to be enabled for MAC80211"
7616
7617 if MAC80211 != n
7618
7619 +config MAC80211_HAS_RC
7620 + def_bool n
7621 +
7622 config MAC80211_RC_PID
7623 bool "PID controller based rate control algorithm" if EMBEDDED
7624 + select MAC80211_HAS_RC
7625 ---help---
7626 This option enables a TX rate control algorithm for
7627 mac80211 that uses a PID controller to select the TX
7628 @@ -24,12 +28,14 @@ config MAC80211_RC_PID
7629
7630 config MAC80211_RC_MINSTREL
7631 bool "Minstrel" if EMBEDDED
7632 + select MAC80211_HAS_RC
7633 default y
7634 ---help---
7635 This option enables the 'minstrel' TX rate control algorithm
7636
7637 choice
7638 prompt "Default rate control algorithm"
7639 + depends on MAC80211_HAS_RC
7640 default MAC80211_RC_DEFAULT_MINSTREL
7641 ---help---
7642 This option selects the default rate control algorithm
7643 @@ -62,6 +68,9 @@ config MAC80211_RC_DEFAULT
7644
7645 endif
7646
7647 +comment "Some wireless drivers require a rate control algorithm"
7648 + depends on MAC80211_HAS_RC=n
7649 +
7650 config MAC80211_MESH
7651 bool "Enable mac80211 mesh networking (pre-802.11s) support"
7652 depends on MAC80211 && EXPERIMENTAL
7653 diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
7654 index edc872e..0d1811b 100644
7655 --- a/net/mac80211/cfg.c
7656 +++ b/net/mac80211/cfg.c
7657 @@ -97,9 +97,6 @@ static int ieee80211_change_iface(struct wiphy *wiphy,
7658 params->mesh_id_len,
7659 params->mesh_id);
7660
7661 - if (sdata->vif.type != NL80211_IFTYPE_MONITOR || !flags)
7662 - return 0;
7663 -
7664 if (type == NL80211_IFTYPE_AP_VLAN &&
7665 params && params->use_4addr == 0)
7666 rcu_assign_pointer(sdata->u.vlan.sta, NULL);
7667 @@ -107,7 +104,9 @@ static int ieee80211_change_iface(struct wiphy *wiphy,
7668 params && params->use_4addr >= 0)
7669 sdata->u.mgd.use_4addr = params->use_4addr;
7670
7671 - sdata->u.mntr_flags = *flags;
7672 + if (sdata->vif.type == NL80211_IFTYPE_MONITOR && flags)
7673 + sdata->u.mntr_flags = *flags;
7674 +
7675 return 0;
7676 }
7677
7678 diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
7679 index 875c8de..1349a09 100644
7680 --- a/net/mac80211/mlme.c
7681 +++ b/net/mac80211/mlme.c
7682 @@ -1530,9 +1530,45 @@ static void ieee80211_sta_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
7683 mutex_unlock(&ifmgd->mtx);
7684
7685 if (skb->len >= 24 + 2 /* mgmt + deauth reason */ &&
7686 - (fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_DEAUTH)
7687 - cfg80211_send_deauth(sdata->dev, (u8 *)mgmt, skb->len);
7688 + (fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_DEAUTH) {
7689 + struct ieee80211_local *local = sdata->local;
7690 + struct ieee80211_work *wk;
7691 +
7692 + mutex_lock(&local->work_mtx);
7693 + list_for_each_entry(wk, &local->work_list, list) {
7694 + if (wk->sdata != sdata)
7695 + continue;
7696 +
7697 + if (wk->type != IEEE80211_WORK_ASSOC)
7698 + continue;
7699 +
7700 + if (memcmp(mgmt->bssid, wk->filter_ta, ETH_ALEN))
7701 + continue;
7702 + if (memcmp(mgmt->sa, wk->filter_ta, ETH_ALEN))
7703 + continue;
7704
7705 + /*
7706 + * Printing the message only here means we can't
7707 + * spuriously print it, but it also means that it
7708 + * won't be printed when the frame comes in before
7709 + * we even tried to associate or in similar cases.
7710 + *
7711 + * Ultimately, I suspect cfg80211 should print the
7712 + * messages instead.
7713 + */
7714 + printk(KERN_DEBUG
7715 + "%s: deauthenticated from %pM (Reason: %u)\n",
7716 + sdata->name, mgmt->bssid,
7717 + le16_to_cpu(mgmt->u.deauth.reason_code));
7718 +
7719 + list_del_rcu(&wk->list);
7720 + free_work(wk);
7721 + break;
7722 + }
7723 + mutex_unlock(&local->work_mtx);
7724 +
7725 + cfg80211_send_deauth(sdata->dev, (u8 *)mgmt, skb->len);
7726 + }
7727 out:
7728 kfree_skb(skb);
7729 }
7730 diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
7731 index 04ea07f..1946f6b 100644
7732 --- a/net/mac80211/rx.c
7733 +++ b/net/mac80211/rx.c
7734 @@ -1414,7 +1414,8 @@ ieee80211_drop_unencrypted_mgmt(struct ieee80211_rx_data *rx)
7735 return res;
7736
7737 if (rx->sta && test_sta_flags(rx->sta, WLAN_STA_MFP)) {
7738 - if (unlikely(ieee80211_is_unicast_robust_mgmt_frame(rx->skb) &&
7739 + if (unlikely(!ieee80211_has_protected(fc) &&
7740 + ieee80211_is_unicast_robust_mgmt_frame(rx->skb) &&
7741 rx->key))
7742 return -EACCES;
7743 /* BIP does not use Protected field, so need to check MMIE */
7744 diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
7745 index cfc473e..d0716b9 100644
7746 --- a/net/mac80211/tx.c
7747 +++ b/net/mac80211/tx.c
7748 @@ -584,7 +584,8 @@ ieee80211_tx_h_rate_ctrl(struct ieee80211_tx_data *tx)
7749 struct ieee80211_hdr *hdr = (void *)tx->skb->data;
7750 struct ieee80211_supported_band *sband;
7751 struct ieee80211_rate *rate;
7752 - int i, len;
7753 + int i;
7754 + u32 len;
7755 bool inval = false, rts = false, short_preamble = false;
7756 struct ieee80211_tx_rate_control txrc;
7757 u32 sta_flags;
7758 @@ -593,7 +594,7 @@ ieee80211_tx_h_rate_ctrl(struct ieee80211_tx_data *tx)
7759
7760 sband = tx->local->hw.wiphy->bands[tx->channel->band];
7761
7762 - len = min_t(int, tx->skb->len + FCS_LEN,
7763 + len = min_t(u32, tx->skb->len + FCS_LEN,
7764 tx->local->hw.wiphy->frag_threshold);
7765
7766 /* set up the tx rate control struct we give the RC algo */
7767 diff --git a/scripts/kconfig/Makefile b/scripts/kconfig/Makefile
7768 index 186c466..9842611 100644
7769 --- a/scripts/kconfig/Makefile
7770 +++ b/scripts/kconfig/Makefile
7771 @@ -208,7 +208,7 @@ HOSTCFLAGS_zconf.tab.o := -I$(src)
7772 HOSTLOADLIBES_qconf = $(KC_QT_LIBS) -ldl
7773 HOSTCXXFLAGS_qconf.o = $(KC_QT_CFLAGS) -D LKC_DIRECT_LINK
7774
7775 -HOSTLOADLIBES_gconf = `pkg-config --libs gtk+-2.0 gmodule-2.0 libglade-2.0`
7776 +HOSTLOADLIBES_gconf = `pkg-config --libs gtk+-2.0 gmodule-2.0 libglade-2.0` -ldl
7777 HOSTCFLAGS_gconf.o = `pkg-config --cflags gtk+-2.0 gmodule-2.0 libglade-2.0` \
7778 -D LKC_DIRECT_LINK
7779
7780 diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c
7781 index a2ff861..e9d98be 100644
7782 --- a/sound/core/pcm_lib.c
7783 +++ b/sound/core/pcm_lib.c
7784 @@ -345,7 +345,9 @@ static int snd_pcm_update_hw_ptr0(struct snd_pcm_substream *substream,
7785 new_hw_ptr = hw_base + pos;
7786 }
7787 __delta:
7788 - delta = (new_hw_ptr - old_hw_ptr) % runtime->boundary;
7789 + delta = new_hw_ptr - old_hw_ptr;
7790 + if (delta < 0)
7791 + delta += runtime->boundary;
7792 if (xrun_debug(substream, in_interrupt ?
7793 XRUN_DEBUG_PERIODUPDATE : XRUN_DEBUG_HWPTRUPDATE)) {
7794 char name[16];
7795 @@ -439,8 +441,13 @@ static int snd_pcm_update_hw_ptr0(struct snd_pcm_substream *substream,
7796 snd_pcm_playback_silence(substream, new_hw_ptr);
7797
7798 if (in_interrupt) {
7799 - runtime->hw_ptr_interrupt = new_hw_ptr -
7800 - (new_hw_ptr % runtime->period_size);
7801 + delta = new_hw_ptr - runtime->hw_ptr_interrupt;
7802 + if (delta < 0)
7803 + delta += runtime->boundary;
7804 + delta -= (snd_pcm_uframes_t)delta % runtime->period_size;
7805 + runtime->hw_ptr_interrupt += delta;
7806 + if (runtime->hw_ptr_interrupt >= runtime->boundary)
7807 + runtime->hw_ptr_interrupt -= runtime->boundary;
7808 }
7809 runtime->hw_ptr_base = hw_base;
7810 runtime->status->hw_ptr = new_hw_ptr;
7811 diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c
7812 index 20b5982..d124e95 100644
7813 --- a/sound/core/pcm_native.c
7814 +++ b/sound/core/pcm_native.c
7815 @@ -27,7 +27,6 @@
7816 #include <linux/pm_qos_params.h>
7817 #include <linux/uio.h>
7818 #include <linux/dma-mapping.h>
7819 -#include <linux/math64.h>
7820 #include <sound/core.h>
7821 #include <sound/control.h>
7822 #include <sound/info.h>
7823 @@ -370,38 +369,6 @@ static int period_to_usecs(struct snd_pcm_runtime *runtime)
7824 return usecs;
7825 }
7826
7827 -static int calc_boundary(struct snd_pcm_runtime *runtime)
7828 -{
7829 - u_int64_t boundary;
7830 -
7831 - boundary = (u_int64_t)runtime->buffer_size *
7832 - (u_int64_t)runtime->period_size;
7833 -#if BITS_PER_LONG < 64
7834 - /* try to find lowest common multiple for buffer and period */
7835 - if (boundary > LONG_MAX - runtime->buffer_size) {
7836 - u_int32_t remainder = -1;
7837 - u_int32_t divident = runtime->buffer_size;
7838 - u_int32_t divisor = runtime->period_size;
7839 - while (remainder) {
7840 - remainder = divident % divisor;
7841 - if (remainder) {
7842 - divident = divisor;
7843 - divisor = remainder;
7844 - }
7845 - }
7846 - boundary = div_u64(boundary, divisor);
7847 - if (boundary > LONG_MAX - runtime->buffer_size)
7848 - return -ERANGE;
7849 - }
7850 -#endif
7851 - if (boundary == 0)
7852 - return -ERANGE;
7853 - runtime->boundary = boundary;
7854 - while (runtime->boundary * 2 <= LONG_MAX - runtime->buffer_size)
7855 - runtime->boundary *= 2;
7856 - return 0;
7857 -}
7858 -
7859 static int snd_pcm_hw_params(struct snd_pcm_substream *substream,
7860 struct snd_pcm_hw_params *params)
7861 {
7862 @@ -477,9 +444,9 @@ static int snd_pcm_hw_params(struct snd_pcm_substream *substream,
7863 runtime->stop_threshold = runtime->buffer_size;
7864 runtime->silence_threshold = 0;
7865 runtime->silence_size = 0;
7866 - err = calc_boundary(runtime);
7867 - if (err < 0)
7868 - goto _error;
7869 + runtime->boundary = runtime->buffer_size;
7870 + while (runtime->boundary * 2 <= LONG_MAX - runtime->buffer_size)
7871 + runtime->boundary *= 2;
7872
7873 snd_pcm_timer_resolution_change(substream);
7874 runtime->status->state = SNDRV_PCM_STATE_SETUP;
7875 diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
7876 index cec6815..0bc24bd 100644
7877 --- a/sound/pci/hda/hda_intel.c
7878 +++ b/sound/pci/hda/hda_intel.c
7879 @@ -2263,16 +2263,23 @@ static int azx_dev_free(struct snd_device *device)
7880 * white/black-listing for position_fix
7881 */
7882 static struct snd_pci_quirk position_fix_list[] __devinitdata = {
7883 + SND_PCI_QUIRK(0x1025, 0x009f, "Acer Aspire 5110", POS_FIX_LPIB),
7884 SND_PCI_QUIRK(0x1028, 0x01cc, "Dell D820", POS_FIX_LPIB),
7885 SND_PCI_QUIRK(0x1028, 0x01de, "Dell Precision 390", POS_FIX_LPIB),
7886 SND_PCI_QUIRK(0x1028, 0x01f6, "Dell Latitude 131L", POS_FIX_LPIB),
7887 SND_PCI_QUIRK(0x103c, 0x306d, "HP dv3", POS_FIX_LPIB),
7888 - SND_PCI_QUIRK(0x1106, 0x3288, "ASUS M2V-MX SE", POS_FIX_LPIB),
7889 SND_PCI_QUIRK(0x1043, 0x813d, "ASUS P5AD2", POS_FIX_LPIB),
7890 + SND_PCI_QUIRK(0x1043, 0x81b3, "ASUS", POS_FIX_LPIB),
7891 + SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS M2V", POS_FIX_LPIB),
7892 + SND_PCI_QUIRK(0x104d, 0x9069, "Sony VPCS11V9E", POS_FIX_LPIB),
7893 + SND_PCI_QUIRK(0x1106, 0x3288, "ASUS M2V-MX SE", POS_FIX_LPIB),
7894 + SND_PCI_QUIRK(0x1179, 0xff10, "Toshiba A100-259", POS_FIX_LPIB),
7895 + SND_PCI_QUIRK(0x1297, 0x3166, "Shuttle", POS_FIX_LPIB),
7896 SND_PCI_QUIRK(0x1458, 0xa022, "ga-ma770-ud3", POS_FIX_LPIB),
7897 SND_PCI_QUIRK(0x1462, 0x1002, "MSI Wind U115", POS_FIX_LPIB),
7898 SND_PCI_QUIRK(0x1565, 0x820f, "Biostar Microtech", POS_FIX_LPIB),
7899 SND_PCI_QUIRK(0x1565, 0x8218, "Biostar Microtech", POS_FIX_LPIB),
7900 + SND_PCI_QUIRK(0x1849, 0x0888, "775Dual-VSTA", POS_FIX_LPIB),
7901 SND_PCI_QUIRK(0x8086, 0x2503, "DG965OT AAD63733-203", POS_FIX_LPIB),
7902 SND_PCI_QUIRK(0x8086, 0xd601, "eMachines T5212", POS_FIX_LPIB),
7903 {}
7904 diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
7905 index 886d8e4..3273765 100644
7906 --- a/sound/pci/hda/patch_realtek.c
7907 +++ b/sound/pci/hda/patch_realtek.c
7908 @@ -9392,6 +9392,7 @@ static struct snd_pci_quirk alc882_ssid_cfg_tbl[] = {
7909 SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_IMAC24),
7910 SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_IMAC24),
7911 SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC885_MBP3),
7912 + SND_PCI_QUIRK(0x106b, 0x3000, "iMac", ALC889A_MB31),
7913 SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889A_MB31),
7914 SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC885_MBP3),
7915 SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_IMAC24),
7916 diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c
7917 index a0e06d8..f1e7bab 100644
7918 --- a/sound/pci/hda/patch_sigmatel.c
7919 +++ b/sound/pci/hda/patch_sigmatel.c
7920 @@ -2078,12 +2078,12 @@ static struct snd_pci_quirk stac927x_cfg_tbl[] = {
7921 SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_INTEL, 0xff00, 0x2000,
7922 "Intel D965", STAC_D965_3ST),
7923 /* Dell 3 stack systems */
7924 - SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f7, "Dell XPS M1730", STAC_DELL_3ST),
7925 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01dd, "Dell Dimension E520", STAC_DELL_3ST),
7926 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ed, "Dell ", STAC_DELL_3ST),
7927 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f4, "Dell ", STAC_DELL_3ST),
7928 /* Dell 3 stack systems with verb table in BIOS */
7929 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f3, "Dell Inspiron 1420", STAC_DELL_BIOS),
7930 + SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f7, "Dell XPS M1730", STAC_DELL_BIOS),
7931 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0227, "Dell Vostro 1400 ", STAC_DELL_BIOS),
7932 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x022e, "Dell ", STAC_DELL_BIOS),
7933 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x022f, "Dell Inspiron 1525", STAC_DELL_BIOS),
7934 diff --git a/sound/soc/codecs/wm8350.c b/sound/soc/codecs/wm8350.c
7935 index 2e0772f..1e22141 100644
7936 --- a/sound/soc/codecs/wm8350.c
7937 +++ b/sound/soc/codecs/wm8350.c
7938 @@ -424,8 +424,8 @@ static const struct soc_enum wm8350_enum[] = {
7939 SOC_ENUM_SINGLE(WM8350_INPUT_MIXER_VOLUME, 15, 2, wm8350_lr),
7940 };
7941
7942 -static DECLARE_TLV_DB_LINEAR(pre_amp_tlv, -1200, 3525);
7943 -static DECLARE_TLV_DB_LINEAR(out_pga_tlv, -5700, 600);
7944 +static DECLARE_TLV_DB_SCALE(pre_amp_tlv, -1200, 3525, 0);
7945 +static DECLARE_TLV_DB_SCALE(out_pga_tlv, -5700, 600, 0);
7946 static DECLARE_TLV_DB_SCALE(dac_pcm_tlv, -7163, 36, 1);
7947 static DECLARE_TLV_DB_SCALE(adc_pcm_tlv, -12700, 50, 1);
7948 static DECLARE_TLV_DB_SCALE(out_mix_tlv, -1500, 300, 1);
7949 diff --git a/sound/soc/codecs/wm8400.c b/sound/soc/codecs/wm8400.c
7950 index 6acc885..a9fa46c 100644
7951 --- a/sound/soc/codecs/wm8400.c
7952 +++ b/sound/soc/codecs/wm8400.c
7953 @@ -107,21 +107,21 @@ static void wm8400_codec_reset(struct snd_soc_codec *codec)
7954 wm8400_reset_codec_reg_cache(wm8400->wm8400);
7955 }
7956
7957 -static const DECLARE_TLV_DB_LINEAR(rec_mix_tlv, -1500, 600);
7958 +static const DECLARE_TLV_DB_SCALE(rec_mix_tlv, -1500, 600, 0);
7959
7960 -static const DECLARE_TLV_DB_LINEAR(in_pga_tlv, -1650, 3000);
7961 +static const DECLARE_TLV_DB_SCALE(in_pga_tlv, -1650, 3000, 0);
7962
7963 -static const DECLARE_TLV_DB_LINEAR(out_mix_tlv, -2100, 0);
7964 +static const DECLARE_TLV_DB_SCALE(out_mix_tlv, -2100, 0, 0);
7965
7966 -static const DECLARE_TLV_DB_LINEAR(out_pga_tlv, -7300, 600);
7967 +static const DECLARE_TLV_DB_SCALE(out_pga_tlv, -7300, 600, 0);
7968
7969 -static const DECLARE_TLV_DB_LINEAR(out_omix_tlv, -600, 0);
7970 +static const DECLARE_TLV_DB_SCALE(out_omix_tlv, -600, 0, 0);
7971
7972 -static const DECLARE_TLV_DB_LINEAR(out_dac_tlv, -7163, 0);
7973 +static const DECLARE_TLV_DB_SCALE(out_dac_tlv, -7163, 0, 0);
7974
7975 -static const DECLARE_TLV_DB_LINEAR(in_adc_tlv, -7163, 1763);
7976 +static const DECLARE_TLV_DB_SCALE(in_adc_tlv, -7163, 1763, 0);
7977
7978 -static const DECLARE_TLV_DB_LINEAR(out_sidetone_tlv, -3600, 0);
7979 +static const DECLARE_TLV_DB_SCALE(out_sidetone_tlv, -3600, 0, 0);
7980
7981 static int wm8400_outpga_put_volsw_vu(struct snd_kcontrol *kcontrol,
7982 struct snd_ctl_elem_value *ucontrol)
7983 @@ -440,7 +440,7 @@ static int outmixer_event (struct snd_soc_dapm_widget *w,
7984 /* INMIX dB values */
7985 static const unsigned int in_mix_tlv[] = {
7986 TLV_DB_RANGE_HEAD(1),
7987 - 0,7, TLV_DB_LINEAR_ITEM(-1200, 600),
7988 + 0,7, TLV_DB_SCALE_ITEM(-1200, 600, 0),
7989 };
7990
7991 /* Left In PGA Connections */
7992 diff --git a/sound/soc/codecs/wm8990.c b/sound/soc/codecs/wm8990.c
7993 index 831f473..7c6b00e 100644
7994 --- a/sound/soc/codecs/wm8990.c
7995 +++ b/sound/soc/codecs/wm8990.c
7996 @@ -111,21 +111,21 @@ static const u16 wm8990_reg[] = {
7997
7998 #define wm8990_reset(c) snd_soc_write(c, WM8990_RESET, 0)
7999
8000 -static const DECLARE_TLV_DB_LINEAR(rec_mix_tlv, -1500, 600);
8001 +static const DECLARE_TLV_DB_SCALE(rec_mix_tlv, -1500, 600, 0);
8002
8003 -static const DECLARE_TLV_DB_LINEAR(in_pga_tlv, -1650, 3000);
8004 +static const DECLARE_TLV_DB_SCALE(in_pga_tlv, -1650, 3000, 0);
8005
8006 -static const DECLARE_TLV_DB_LINEAR(out_mix_tlv, 0, -2100);
8007 +static const DECLARE_TLV_DB_SCALE(out_mix_tlv, 0, -2100, 0);
8008
8009 -static const DECLARE_TLV_DB_LINEAR(out_pga_tlv, -7300, 600);
8010 +static const DECLARE_TLV_DB_SCALE(out_pga_tlv, -7300, 600, 0);
8011
8012 -static const DECLARE_TLV_DB_LINEAR(out_omix_tlv, -600, 0);
8013 +static const DECLARE_TLV_DB_SCALE(out_omix_tlv, -600, 0, 0);
8014
8015 -static const DECLARE_TLV_DB_LINEAR(out_dac_tlv, -7163, 0);
8016 +static const DECLARE_TLV_DB_SCALE(out_dac_tlv, -7163, 0, 0);
8017
8018 -static const DECLARE_TLV_DB_LINEAR(in_adc_tlv, -7163, 1763);
8019 +static const DECLARE_TLV_DB_SCALE(in_adc_tlv, -7163, 1763, 0);
8020
8021 -static const DECLARE_TLV_DB_LINEAR(out_sidetone_tlv, -3600, 0);
8022 +static const DECLARE_TLV_DB_SCALE(out_sidetone_tlv, -3600, 0, 0);
8023
8024 static int wm899x_outpga_put_volsw_vu(struct snd_kcontrol *kcontrol,
8025 struct snd_ctl_elem_value *ucontrol)
8026 @@ -451,7 +451,7 @@ static int outmixer_event(struct snd_soc_dapm_widget *w,
8027 /* INMIX dB values */
8028 static const unsigned int in_mix_tlv[] = {
8029 TLV_DB_RANGE_HEAD(1),
8030 - 0, 7, TLV_DB_LINEAR_ITEM(-1200, 600),
8031 + 0, 7, TLV_DB_SCALE_ITEM(-1200, 600, 0),
8032 };
8033
8034 /* Left In PGA Connections */
8035 diff --git a/sound/soc/imx/imx-pcm-dma-mx2.c b/sound/soc/imx/imx-pcm-dma-mx2.c
8036 index 2b31ac6..803aeef 100644
8037 --- a/sound/soc/imx/imx-pcm-dma-mx2.c
8038 +++ b/sound/soc/imx/imx-pcm-dma-mx2.c
8039 @@ -73,7 +73,8 @@ static void snd_imx_dma_err_callback(int channel, void *data, int err)
8040 {
8041 struct snd_pcm_substream *substream = data;
8042 struct snd_soc_pcm_runtime *rtd = substream->private_data;
8043 - struct imx_pcm_dma_params *dma_params = rtd->dai->cpu_dai->dma_data;
8044 + struct imx_pcm_dma_params *dma_params =
8045 + snd_soc_dai_get_dma_data(rtd->dai->cpu_dai, substream);
8046 struct snd_pcm_runtime *runtime = substream->runtime;
8047 struct imx_pcm_runtime_data *iprtd = runtime->private_data;
8048 int ret;
8049 @@ -102,7 +103,7 @@ static int imx_ssi_dma_alloc(struct snd_pcm_substream *substream)
8050 struct imx_pcm_runtime_data *iprtd = runtime->private_data;
8051 int ret;
8052
8053 - dma_params = snd_soc_get_dma_data(rtd->dai->cpu_dai, substream);
8054 + dma_params = snd_soc_dai_get_dma_data(rtd->dai->cpu_dai, substream);
8055
8056 iprtd->dma = imx_dma_request_by_prio(DRV_NAME, DMA_PRIO_HIGH);
8057 if (iprtd->dma < 0) {
8058 @@ -212,7 +213,7 @@ static int snd_imx_pcm_prepare(struct snd_pcm_substream *substream)
8059 struct imx_pcm_runtime_data *iprtd = runtime->private_data;
8060 int err;
8061
8062 - dma_params = snd_soc_get_dma_data(rtd->dai->cpu_dai, substream);
8063 + dma_params = snd_soc_dai_get_dma_data(rtd->dai->cpu_dai, substream);
8064
8065 iprtd->substream = substream;
8066 iprtd->buf = (unsigned int *)substream->dma_buffer.area;
8067 diff --git a/tools/perf/bench/mem-memcpy.c b/tools/perf/bench/mem-memcpy.c
8068 index 8977317..5fd55cd 100644
8069 --- a/tools/perf/bench/mem-memcpy.c
8070 +++ b/tools/perf/bench/mem-memcpy.c
8071 @@ -24,7 +24,7 @@
8072
8073 static const char *length_str = "1MB";
8074 static const char *routine = "default";
8075 -static int use_clock = 0;
8076 +static bool use_clock = false;
8077 static int clock_fd;
8078
8079 static const struct option options[] = {
8080 diff --git a/tools/perf/bench/sched-messaging.c b/tools/perf/bench/sched-messaging.c
8081 index 81cee78..da1b2e9 100644
8082 --- a/tools/perf/bench/sched-messaging.c
8083 +++ b/tools/perf/bench/sched-messaging.c
8084 @@ -31,9 +31,9 @@
8085
8086 #define DATASIZE 100
8087
8088 -static int use_pipes = 0;
8089 +static bool use_pipes = false;
8090 static unsigned int loops = 100;
8091 -static unsigned int thread_mode = 0;
8092 +static bool thread_mode = false;
8093 static unsigned int num_groups = 10;
8094
8095 struct sender_context {
8096 diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c
8097 index 6ad7148..94a814c 100644
8098 --- a/tools/perf/builtin-annotate.c
8099 +++ b/tools/perf/builtin-annotate.c
8100 @@ -29,11 +29,11 @@
8101
8102 static char const *input_name = "perf.data";
8103
8104 -static int force;
8105 +static bool force;
8106
8107 -static int full_paths;
8108 +static bool full_paths;
8109
8110 -static int print_line;
8111 +static bool print_line;
8112
8113 struct sym_hist {
8114 u64 sum;
8115 @@ -584,7 +584,7 @@ static const struct option options[] = {
8116 OPT_STRING('s', "symbol", &sym_hist_filter, "symbol",
8117 "symbol to annotate"),
8118 OPT_BOOLEAN('f', "force", &force, "don't complain, do it"),
8119 - OPT_BOOLEAN('v', "verbose", &verbose,
8120 + OPT_INCR('v', "verbose", &verbose,
8121 "be more verbose (show symbol address, etc)"),
8122 OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace,
8123 "dump raw trace in ASCII"),
8124 diff --git a/tools/perf/builtin-buildid-cache.c b/tools/perf/builtin-buildid-cache.c
8125 index 30a05f5..f8e3d18 100644
8126 --- a/tools/perf/builtin-buildid-cache.c
8127 +++ b/tools/perf/builtin-buildid-cache.c
8128 @@ -27,7 +27,7 @@ static const struct option buildid_cache_options[] = {
8129 "file list", "file(s) to add"),
8130 OPT_STRING('r', "remove", &remove_name_list_str, "file list",
8131 "file(s) to remove"),
8132 - OPT_BOOLEAN('v', "verbose", &verbose, "be more verbose"),
8133 + OPT_INCR('v', "verbose", &verbose, "be more verbose"),
8134 OPT_END()
8135 };
8136
8137 diff --git a/tools/perf/builtin-buildid-list.c b/tools/perf/builtin-buildid-list.c
8138 index d0675c0..af2ad8b 100644
8139 --- a/tools/perf/builtin-buildid-list.c
8140 +++ b/tools/perf/builtin-buildid-list.c
8141 @@ -16,7 +16,7 @@
8142 #include "util/symbol.h"
8143
8144 static char const *input_name = "perf.data";
8145 -static int force;
8146 +static bool force;
8147 static bool with_hits;
8148
8149 static const char * const buildid_list_usage[] = {
8150 @@ -29,7 +29,7 @@ static const struct option options[] = {
8151 OPT_STRING('i', "input", &input_name, "file",
8152 "input file name"),
8153 OPT_BOOLEAN('f', "force", &force, "don't complain, do it"),
8154 - OPT_BOOLEAN('v', "verbose", &verbose,
8155 + OPT_INCR('v', "verbose", &verbose,
8156 "be more verbose"),
8157 OPT_END()
8158 };
8159 diff --git a/tools/perf/builtin-diff.c b/tools/perf/builtin-diff.c
8160 index 1ea15d8..3a1d94d 100644
8161 --- a/tools/perf/builtin-diff.c
8162 +++ b/tools/perf/builtin-diff.c
8163 @@ -19,7 +19,7 @@
8164 static char const *input_old = "perf.data.old",
8165 *input_new = "perf.data";
8166 static char diff__default_sort_order[] = "dso,symbol";
8167 -static int force;
8168 +static bool force;
8169 static bool show_displacement;
8170
8171 static int perf_session__add_hist_entry(struct perf_session *self,
8172 @@ -188,7 +188,7 @@ static const char * const diff_usage[] = {
8173 };
8174
8175 static const struct option options[] = {
8176 - OPT_BOOLEAN('v', "verbose", &verbose,
8177 + OPT_INCR('v', "verbose", &verbose,
8178 "be more verbose (show symbol address, etc)"),
8179 OPT_BOOLEAN('m', "displacement", &show_displacement,
8180 "Show position displacement relative to baseline"),
8181 diff --git a/tools/perf/builtin-help.c b/tools/perf/builtin-help.c
8182 index 215b584..81e3ecc 100644
8183 --- a/tools/perf/builtin-help.c
8184 +++ b/tools/perf/builtin-help.c
8185 @@ -29,7 +29,7 @@ enum help_format {
8186 HELP_FORMAT_WEB,
8187 };
8188
8189 -static int show_all = 0;
8190 +static bool show_all = false;
8191 static enum help_format help_format = HELP_FORMAT_MAN;
8192 static struct option builtin_help_options[] = {
8193 OPT_BOOLEAN('a', "all", &show_all, "print all available commands"),
8194 diff --git a/tools/perf/builtin-lock.c b/tools/perf/builtin-lock.c
8195 index e12c844..6c38e4f 100644
8196 --- a/tools/perf/builtin-lock.c
8197 +++ b/tools/perf/builtin-lock.c
8198 @@ -744,7 +744,7 @@ static const char * const lock_usage[] = {
8199
8200 static const struct option lock_options[] = {
8201 OPT_STRING('i', "input", &input_name, "file", "input file name"),
8202 - OPT_BOOLEAN('v', "verbose", &verbose, "be more verbose (show symbol address, etc)"),
8203 + OPT_INCR('v', "verbose", &verbose, "be more verbose (show symbol address, etc)"),
8204 OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace, "dump raw trace in ASCII"),
8205 OPT_END()
8206 };
8207 diff --git a/tools/perf/builtin-probe.c b/tools/perf/builtin-probe.c
8208 index 152d6c9..0562c50 100644
8209 --- a/tools/perf/builtin-probe.c
8210 +++ b/tools/perf/builtin-probe.c
8211 @@ -162,7 +162,7 @@ static const char * const probe_usage[] = {
8212 };
8213
8214 static const struct option options[] = {
8215 - OPT_BOOLEAN('v', "verbose", &verbose,
8216 + OPT_INCR('v', "verbose", &verbose,
8217 "be more verbose (show parsed arguments, etc)"),
8218 #ifndef NO_DWARF_SUPPORT
8219 OPT_STRING('k', "vmlinux", &symbol_conf.vmlinux_name,
8220 diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
8221 index f1411e9..d2d1b02 100644
8222 --- a/tools/perf/builtin-record.c
8223 +++ b/tools/perf/builtin-record.c
8224 @@ -39,19 +39,19 @@ static int output;
8225 static const char *output_name = "perf.data";
8226 static int group = 0;
8227 static unsigned int realtime_prio = 0;
8228 -static int raw_samples = 0;
8229 -static int system_wide = 0;
8230 +static bool raw_samples = false;
8231 +static bool system_wide = false;
8232 static int profile_cpu = -1;
8233 static pid_t target_pid = -1;
8234 static pid_t child_pid = -1;
8235 -static int inherit = 1;
8236 -static int force = 0;
8237 -static int append_file = 0;
8238 -static int call_graph = 0;
8239 -static int inherit_stat = 0;
8240 -static int no_samples = 0;
8241 -static int sample_address = 0;
8242 -static int multiplex = 0;
8243 +static bool inherit = true;
8244 +static bool force = false;
8245 +static bool append_file = false;
8246 +static bool call_graph = false;
8247 +static bool inherit_stat = false;
8248 +static bool no_samples = false;
8249 +static bool sample_address = false;
8250 +static bool multiplex = false;
8251 static int multiplex_fd = -1;
8252
8253 static long samples = 0;
8254 @@ -451,7 +451,7 @@ static int __cmd_record(int argc, const char **argv)
8255 rename(output_name, oldname);
8256 }
8257 } else {
8258 - append_file = 0;
8259 + append_file = false;
8260 }
8261
8262 flags = O_CREAT|O_RDWR;
8263 @@ -676,7 +676,7 @@ static const struct option options[] = {
8264 "number of mmap data pages"),
8265 OPT_BOOLEAN('g', "call-graph", &call_graph,
8266 "do call-graph (stack chain/backtrace) recording"),
8267 - OPT_BOOLEAN('v', "verbose", &verbose,
8268 + OPT_INCR('v', "verbose", &verbose,
8269 "be more verbose (show counter open errors, etc)"),
8270 OPT_BOOLEAN('s', "stat", &inherit_stat,
8271 "per thread counts"),
8272 diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
8273 index f815de2..63fc64e 100644
8274 --- a/tools/perf/builtin-report.c
8275 +++ b/tools/perf/builtin-report.c
8276 @@ -33,11 +33,11 @@
8277
8278 static char const *input_name = "perf.data";
8279
8280 -static int force;
8281 +static bool force;
8282 static bool hide_unresolved;
8283 static bool dont_use_callchains;
8284
8285 -static int show_threads;
8286 +static bool show_threads;
8287 static struct perf_read_values show_threads_values;
8288
8289 static char default_pretty_printing_style[] = "normal";
8290 @@ -400,7 +400,7 @@ static const char * const report_usage[] = {
8291 static const struct option options[] = {
8292 OPT_STRING('i', "input", &input_name, "file",
8293 "input file name"),
8294 - OPT_BOOLEAN('v', "verbose", &verbose,
8295 + OPT_INCR('v', "verbose", &verbose,
8296 "be more verbose (show symbol address, etc)"),
8297 OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace,
8298 "dump raw trace in ASCII"),
8299 diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c
8300 index 4f5a03e..682783c 100644
8301 --- a/tools/perf/builtin-sched.c
8302 +++ b/tools/perf/builtin-sched.c
8303 @@ -1790,7 +1790,7 @@ static const char * const sched_usage[] = {
8304 static const struct option sched_options[] = {
8305 OPT_STRING('i', "input", &input_name, "file",
8306 "input file name"),
8307 - OPT_BOOLEAN('v', "verbose", &verbose,
8308 + OPT_INCR('v', "verbose", &verbose,
8309 "be more verbose (show symbol address, etc)"),
8310 OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace,
8311 "dump raw trace in ASCII"),
8312 @@ -1805,7 +1805,7 @@ static const char * const latency_usage[] = {
8313 static const struct option latency_options[] = {
8314 OPT_STRING('s', "sort", &sort_order, "key[,key2...]",
8315 "sort by key(s): runtime, switch, avg, max"),
8316 - OPT_BOOLEAN('v', "verbose", &verbose,
8317 + OPT_INCR('v', "verbose", &verbose,
8318 "be more verbose (show symbol address, etc)"),
8319 OPT_INTEGER('C', "CPU", &profile_cpu,
8320 "CPU to profile on"),
8321 @@ -1822,7 +1822,7 @@ static const char * const replay_usage[] = {
8322 static const struct option replay_options[] = {
8323 OPT_INTEGER('r', "repeat", &replay_repeat,
8324 "repeat the workload replay N times (-1: infinite)"),
8325 - OPT_BOOLEAN('v', "verbose", &verbose,
8326 + OPT_INCR('v', "verbose", &verbose,
8327 "be more verbose (show symbol address, etc)"),
8328 OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace,
8329 "dump raw trace in ASCII"),
8330 diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
8331 index 95db31c..f7f4a88 100644
8332 --- a/tools/perf/builtin-stat.c
8333 +++ b/tools/perf/builtin-stat.c
8334 @@ -66,16 +66,16 @@ static struct perf_event_attr default_attrs[] = {
8335
8336 };
8337
8338 -static int system_wide = 0;
8339 +static bool system_wide = false;
8340 static unsigned int nr_cpus = 0;
8341 static int run_idx = 0;
8342
8343 static int run_count = 1;
8344 -static int inherit = 1;
8345 -static int scale = 1;
8346 +static bool inherit = true;
8347 +static bool scale = true;
8348 static pid_t target_pid = -1;
8349 static pid_t child_pid = -1;
8350 -static int null_run = 0;
8351 +static bool null_run = false;
8352
8353 static int fd[MAX_NR_CPUS][MAX_COUNTERS];
8354
8355 @@ -494,7 +494,7 @@ static const struct option options[] = {
8356 "system-wide collection from all CPUs"),
8357 OPT_BOOLEAN('c', "scale", &scale,
8358 "scale/normalize counters"),
8359 - OPT_BOOLEAN('v', "verbose", &verbose,
8360 + OPT_INCR('v', "verbose", &verbose,
8361 "be more verbose (show counter open errors, etc)"),
8362 OPT_INTEGER('r', "repeat", &run_count,
8363 "repeat command and print average + stddev (max: 100)"),
8364 diff --git a/tools/perf/builtin-timechart.c b/tools/perf/builtin-timechart.c
8365 index 0d4d8ff..1d7416d 100644
8366 --- a/tools/perf/builtin-timechart.c
8367 +++ b/tools/perf/builtin-timechart.c
8368 @@ -43,7 +43,7 @@ static u64 turbo_frequency;
8369
8370 static u64 first_time, last_time;
8371
8372 -static int power_only;
8373 +static bool power_only;
8374
8375
8376 struct per_pid;
8377 diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c
8378 index 1f52932..4f94b10 100644
8379 --- a/tools/perf/builtin-top.c
8380 +++ b/tools/perf/builtin-top.c
8381 @@ -57,7 +57,7 @@
8382
8383 static int fd[MAX_NR_CPUS][MAX_COUNTERS];
8384
8385 -static int system_wide = 0;
8386 +static bool system_wide = false;
8387
8388 static int default_interval = 0;
8389
8390 @@ -65,18 +65,18 @@ static int count_filter = 5;
8391 static int print_entries;
8392
8393 static int target_pid = -1;
8394 -static int inherit = 0;
8395 +static bool inherit = false;
8396 static int profile_cpu = -1;
8397 static int nr_cpus = 0;
8398 static unsigned int realtime_prio = 0;
8399 -static int group = 0;
8400 +static bool group = false;
8401 static unsigned int page_size;
8402 static unsigned int mmap_pages = 16;
8403 static int freq = 1000; /* 1 KHz */
8404
8405 static int delay_secs = 2;
8406 -static int zero = 0;
8407 -static int dump_symtab = 0;
8408 +static bool zero = false;
8409 +static bool dump_symtab = false;
8410
8411 static bool hide_kernel_symbols = false;
8412 static bool hide_user_symbols = false;
8413 @@ -169,7 +169,7 @@ static void sig_winch_handler(int sig __used)
8414 update_print_entries(&winsize);
8415 }
8416
8417 -static void parse_source(struct sym_entry *syme)
8418 +static int parse_source(struct sym_entry *syme)
8419 {
8420 struct symbol *sym;
8421 struct sym_entry_source *source;
8422 @@ -180,12 +180,21 @@ static void parse_source(struct sym_entry *syme)
8423 u64 len;
8424
8425 if (!syme)
8426 - return;
8427 + return -1;
8428 +
8429 + sym = sym_entry__symbol(syme);
8430 + map = syme->map;
8431 +
8432 + /*
8433 + * We can't annotate with just /proc/kallsyms
8434 + */
8435 + if (map->dso->origin == DSO__ORIG_KERNEL)
8436 + return -1;
8437
8438 if (syme->src == NULL) {
8439 syme->src = zalloc(sizeof(*source));
8440 if (syme->src == NULL)
8441 - return;
8442 + return -1;
8443 pthread_mutex_init(&syme->src->lock, NULL);
8444 }
8445
8446 @@ -195,9 +204,6 @@ static void parse_source(struct sym_entry *syme)
8447 pthread_mutex_lock(&source->lock);
8448 goto out_assign;
8449 }
8450 -
8451 - sym = sym_entry__symbol(syme);
8452 - map = syme->map;
8453 path = map->dso->long_name;
8454
8455 len = sym->end - sym->start;
8456 @@ -209,7 +215,7 @@ static void parse_source(struct sym_entry *syme)
8457
8458 file = popen(command, "r");
8459 if (!file)
8460 - return;
8461 + return -1;
8462
8463 pthread_mutex_lock(&source->lock);
8464 source->lines_tail = &source->lines;
8465 @@ -245,6 +251,7 @@ static void parse_source(struct sym_entry *syme)
8466 out_assign:
8467 sym_filter_entry = syme;
8468 pthread_mutex_unlock(&source->lock);
8469 + return 0;
8470 }
8471
8472 static void __zero_source_counters(struct sym_entry *syme)
8473 @@ -839,7 +846,7 @@ static void handle_keypress(int c)
8474 display_weighted = ~display_weighted;
8475 break;
8476 case 'z':
8477 - zero = ~zero;
8478 + zero = !zero;
8479 break;
8480 default:
8481 break;
8482 @@ -990,7 +997,17 @@ static void event__process_sample(const event_t *self,
8483 if (sym_filter_entry_sched) {
8484 sym_filter_entry = sym_filter_entry_sched;
8485 sym_filter_entry_sched = NULL;
8486 - parse_source(sym_filter_entry);
8487 + if (parse_source(sym_filter_entry) < 0) {
8488 + struct symbol *sym = sym_entry__symbol(sym_filter_entry);
8489 +
8490 + pr_err("Can't annotate %s", sym->name);
8491 + if (sym_filter_entry->map->dso->origin == DSO__ORIG_KERNEL) {
8492 + pr_err(": No vmlinux file was found in the path:\n");
8493 + vmlinux_path__fprintf(stderr);
8494 + } else
8495 + pr_err(".\n");
8496 + exit(1);
8497 + }
8498 }
8499
8500 syme = symbol__priv(al.sym);
8501 @@ -1296,7 +1313,7 @@ static const struct option options[] = {
8502 "display this many functions"),
8503 OPT_BOOLEAN('U', "hide_user_symbols", &hide_user_symbols,
8504 "hide user symbols"),
8505 - OPT_BOOLEAN('v', "verbose", &verbose,
8506 + OPT_INCR('v', "verbose", &verbose,
8507 "be more verbose (show counter open errors, etc)"),
8508 OPT_END()
8509 };
8510 diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
8511 index 407041d..8fc50d8 100644
8512 --- a/tools/perf/builtin-trace.c
8513 +++ b/tools/perf/builtin-trace.c
8514 @@ -505,7 +505,7 @@ static const char * const trace_usage[] = {
8515 static const struct option options[] = {
8516 OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace,
8517 "dump raw trace in ASCII"),
8518 - OPT_BOOLEAN('v', "verbose", &verbose,
8519 + OPT_INCR('v', "verbose", &verbose,
8520 "be more verbose (show symbol address, etc)"),
8521 OPT_BOOLEAN('L', "Latency", &latency_format,
8522 "show latency attributes (irqs/preemption disabled, etc)"),
8523 diff --git a/tools/perf/util/debug.c b/tools/perf/util/debug.c
8524 index 0905600..666b1c2 100644
8525 --- a/tools/perf/util/debug.c
8526 +++ b/tools/perf/util/debug.c
8527 @@ -12,7 +12,7 @@
8528 #include "util.h"
8529
8530 int verbose = 0;
8531 -int dump_trace = 0;
8532 +bool dump_trace = false;
8533
8534 int eprintf(int level, const char *fmt, ...)
8535 {
8536 diff --git a/tools/perf/util/debug.h b/tools/perf/util/debug.h
8537 index c6c24c5..0f7af87 100644
8538 --- a/tools/perf/util/debug.h
8539 +++ b/tools/perf/util/debug.h
8540 @@ -2,10 +2,11 @@
8541 #ifndef __PERF_DEBUG_H
8542 #define __PERF_DEBUG_H
8543
8544 +#include <stdbool.h>
8545 #include "event.h"
8546
8547 extern int verbose;
8548 -extern int dump_trace;
8549 +extern bool dump_trace;
8550
8551 int eprintf(int level,
8552 const char *fmt, ...) __attribute__((format(printf, 2, 3)));
8553 diff --git a/tools/perf/util/parse-options.c b/tools/perf/util/parse-options.c
8554 index efebd5b..bbe646b 100644
8555 --- a/tools/perf/util/parse-options.c
8556 +++ b/tools/perf/util/parse-options.c
8557 @@ -49,6 +49,7 @@ static int get_value(struct parse_opt_ctx_t *p,
8558 break;
8559 /* FALLTHROUGH */
8560 case OPTION_BOOLEAN:
8561 + case OPTION_INCR:
8562 case OPTION_BIT:
8563 case OPTION_SET_INT:
8564 case OPTION_SET_PTR:
8565 @@ -73,6 +74,10 @@ static int get_value(struct parse_opt_ctx_t *p,
8566 return 0;
8567
8568 case OPTION_BOOLEAN:
8569 + *(bool *)opt->value = unset ? false : true;
8570 + return 0;
8571 +
8572 + case OPTION_INCR:
8573 *(int *)opt->value = unset ? 0 : *(int *)opt->value + 1;
8574 return 0;
8575
8576 @@ -478,6 +483,7 @@ int usage_with_options_internal(const char * const *usagestr,
8577 case OPTION_GROUP:
8578 case OPTION_BIT:
8579 case OPTION_BOOLEAN:
8580 + case OPTION_INCR:
8581 case OPTION_SET_INT:
8582 case OPTION_SET_PTR:
8583 case OPTION_LONG:
8584 diff --git a/tools/perf/util/parse-options.h b/tools/perf/util/parse-options.h
8585 index 948805a..b2da725 100644
8586 --- a/tools/perf/util/parse-options.h
8587 +++ b/tools/perf/util/parse-options.h
8588 @@ -8,7 +8,8 @@ enum parse_opt_type {
8589 OPTION_GROUP,
8590 /* options with no arguments */
8591 OPTION_BIT,
8592 - OPTION_BOOLEAN, /* _INCR would have been a better name */
8593 + OPTION_BOOLEAN,
8594 + OPTION_INCR,
8595 OPTION_SET_INT,
8596 OPTION_SET_PTR,
8597 /* options with arguments (usually) */
8598 @@ -95,6 +96,7 @@ struct option {
8599 #define OPT_GROUP(h) { .type = OPTION_GROUP, .help = (h) }
8600 #define OPT_BIT(s, l, v, h, b) { .type = OPTION_BIT, .short_name = (s), .long_name = (l), .value = (v), .help = (h), .defval = (b) }
8601 #define OPT_BOOLEAN(s, l, v, h) { .type = OPTION_BOOLEAN, .short_name = (s), .long_name = (l), .value = (v), .help = (h) }
8602 +#define OPT_INCR(s, l, v, h) { .type = OPTION_INCR, .short_name = (s), .long_name = (l), .value = (v), .help = (h) }
8603 #define OPT_SET_INT(s, l, v, h, i) { .type = OPTION_SET_INT, .short_name = (s), .long_name = (l), .value = (v), .help = (h), .defval = (i) }
8604 #define OPT_SET_PTR(s, l, v, h, p) { .type = OPTION_SET_PTR, .short_name = (s), .long_name = (l), .value = (v), .help = (h), .defval = (p) }
8605 #define OPT_INTEGER(s, l, v, h) { .type = OPTION_INTEGER, .short_name = (s), .long_name = (l), .value = (v), .help = (h) }
8606 diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
8607 index c458c4a..4acb5d7 100644
8608 --- a/tools/perf/util/symbol.c
8609 +++ b/tools/perf/util/symbol.c
8610 @@ -18,18 +18,6 @@
8611 #define NT_GNU_BUILD_ID 3
8612 #endif
8613
8614 -enum dso_origin {
8615 - DSO__ORIG_KERNEL = 0,
8616 - DSO__ORIG_JAVA_JIT,
8617 - DSO__ORIG_BUILD_ID_CACHE,
8618 - DSO__ORIG_FEDORA,
8619 - DSO__ORIG_UBUNTU,
8620 - DSO__ORIG_BUILDID,
8621 - DSO__ORIG_DSO,
8622 - DSO__ORIG_KMODULE,
8623 - DSO__ORIG_NOT_FOUND,
8624 -};
8625 -
8626 static void dsos__add(struct list_head *head, struct dso *dso);
8627 static struct map *map__new2(u64 start, struct dso *dso, enum map_type type);
8628 static int dso__load_kernel_sym(struct dso *self, struct map *map,
8629 @@ -1025,7 +1013,7 @@ static int dso__load_sym(struct dso *self, struct map *map, const char *name,
8630 }
8631 curr_map->map_ip = identity__map_ip;
8632 curr_map->unmap_ip = identity__map_ip;
8633 - curr_dso->origin = DSO__ORIG_KERNEL;
8634 + curr_dso->origin = self->origin;
8635 map_groups__insert(kmap->kmaps, curr_map);
8636 dsos__add(&dsos__kernel, curr_dso);
8637 dso__set_loaded(curr_dso, map->type);
8638 @@ -1895,6 +1883,17 @@ out_fail:
8639 return -1;
8640 }
8641
8642 +size_t vmlinux_path__fprintf(FILE *fp)
8643 +{
8644 + int i;
8645 + size_t printed = 0;
8646 +
8647 + for (i = 0; i < vmlinux_path__nr_entries; ++i)
8648 + printed += fprintf(fp, "[%d] %s\n", i, vmlinux_path[i]);
8649 +
8650 + return printed;
8651 +}
8652 +
8653 static int setup_list(struct strlist **list, const char *list_str,
8654 const char *list_name)
8655 {
8656 diff --git a/tools/perf/util/symbol.h b/tools/perf/util/symbol.h
8657 index f30a374..044a4bc 100644
8658 --- a/tools/perf/util/symbol.h
8659 +++ b/tools/perf/util/symbol.h
8660 @@ -150,6 +150,19 @@ size_t dsos__fprintf_buildid(FILE *fp, bool with_hits);
8661
8662 size_t dso__fprintf_buildid(struct dso *self, FILE *fp);
8663 size_t dso__fprintf(struct dso *self, enum map_type type, FILE *fp);
8664 +
8665 +enum dso_origin {
8666 + DSO__ORIG_KERNEL = 0,
8667 + DSO__ORIG_JAVA_JIT,
8668 + DSO__ORIG_BUILD_ID_CACHE,
8669 + DSO__ORIG_FEDORA,
8670 + DSO__ORIG_UBUNTU,
8671 + DSO__ORIG_BUILDID,
8672 + DSO__ORIG_DSO,
8673 + DSO__ORIG_KMODULE,
8674 + DSO__ORIG_NOT_FOUND,
8675 +};
8676 +
8677 char dso__symtab_origin(const struct dso *self);
8678 void dso__set_long_name(struct dso *self, char *name);
8679 void dso__set_build_id(struct dso *self, void *build_id);
8680 @@ -169,4 +182,6 @@ int kallsyms__parse(const char *filename, void *arg,
8681 int symbol__init(void);
8682 bool symbol_type__is_a(char symbol_type, enum map_type map_type);
8683
8684 +size_t vmlinux_path__fprintf(FILE *fp);
8685 +
8686 #endif /* __PERF_SYMBOL */
8687 diff --git a/tools/perf/util/trace-event-parse.c b/tools/perf/util/trace-event-parse.c
8688 index 613c9cc..dc78bae 100644
8689 --- a/tools/perf/util/trace-event-parse.c
8690 +++ b/tools/perf/util/trace-event-parse.c
8691 @@ -40,7 +40,7 @@ int header_page_size_size;
8692 int header_page_data_offset;
8693 int header_page_data_size;
8694
8695 -int latency_format;
8696 +bool latency_format;
8697
8698 static char *input_buf;
8699 static unsigned long long input_buf_ptr;
8700 diff --git a/tools/perf/util/trace-event.h b/tools/perf/util/trace-event.h
8701 index c3269b9..81f2fd2 100644
8702 --- a/tools/perf/util/trace-event.h
8703 +++ b/tools/perf/util/trace-event.h
8704 @@ -1,6 +1,7 @@
8705 #ifndef __PERF_TRACE_EVENTS_H
8706 #define __PERF_TRACE_EVENTS_H
8707
8708 +#include <stdbool.h>
8709 #include "parse-events.h"
8710
8711 #define __unused __attribute__((unused))
8712 @@ -241,7 +242,7 @@ extern int header_page_size_size;
8713 extern int header_page_data_offset;
8714 extern int header_page_data_size;
8715
8716 -extern int latency_format;
8717 +extern bool latency_format;
8718
8719 int parse_header_page(char *buf, unsigned long size);
8720 int trace_parse_common_type(void *data);