Magellan Linux

Annotation of /trunk/kernel26-mcore/patches-2.6.36-r3/0101-2.6.36.2-all-fixes.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1231 - (hide annotations) (download)
Fri Dec 10 22:38:07 2010 UTC (13 years, 5 months ago) by niro
File size: 354024 byte(s)
-2.6.36-mcore-r3:
-using linux-2.6.36.2
-enabled ipv6 support
1 niro 1231 diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h
2     index 6e8f05c..d757555 100644
3     --- a/arch/arm/include/asm/assembler.h
4     +++ b/arch/arm/include/asm/assembler.h
5     @@ -215,7 +215,7 @@
6     @ Slightly optimised to avoid incrementing the pointer twice
7     usraccoff \instr, \reg, \ptr, \inc, 0, \cond, \abort
8     .if \rept == 2
9     - usraccoff \instr, \reg, \ptr, \inc, 4, \cond, \abort
10     + usraccoff \instr, \reg, \ptr, \inc, \inc, \cond, \abort
11     .endif
12    
13     add\cond \ptr, #\rept * \inc
14     diff --git a/arch/arm/lib/findbit.S b/arch/arm/lib/findbit.S
15     index 1e4cbd4..64f6bc1 100644
16     --- a/arch/arm/lib/findbit.S
17     +++ b/arch/arm/lib/findbit.S
18     @@ -174,8 +174,8 @@ ENDPROC(_find_next_bit_be)
19     */
20     .L_found:
21     #if __LINUX_ARM_ARCH__ >= 5
22     - rsb r1, r3, #0
23     - and r3, r3, r1
24     + rsb r0, r3, #0
25     + and r3, r3, r0
26     clz r3, r3
27     rsb r3, r3, #31
28     add r0, r2, r3
29     @@ -190,5 +190,7 @@ ENDPROC(_find_next_bit_be)
30     addeq r2, r2, #1
31     mov r0, r2
32     #endif
33     + cmp r1, r0 @ Clamp to maxbit
34     + movlo r0, r1
35     mov pc, lr
36    
37     diff --git a/arch/arm/mach-cns3xxx/pcie.c b/arch/arm/mach-cns3xxx/pcie.c
38     index 38088c3..78defd7 100644
39     --- a/arch/arm/mach-cns3xxx/pcie.c
40     +++ b/arch/arm/mach-cns3xxx/pcie.c
41     @@ -369,7 +369,7 @@ static int __init cns3xxx_pcie_init(void)
42     {
43     int i;
44    
45     - hook_fault_code(16 + 6, cns3xxx_pcie_abort_handler, SIGBUS,
46     + hook_fault_code(16 + 6, cns3xxx_pcie_abort_handler, SIGBUS, 0,
47     "imprecise external abort");
48    
49     for (i = 0; i < ARRAY_SIZE(cns3xxx_pcie); i++) {
50     diff --git a/arch/arm/mm/fault-armv.c b/arch/arm/mm/fault-armv.c
51     index 9b906de..56036ff 100644
52     --- a/arch/arm/mm/fault-armv.c
53     +++ b/arch/arm/mm/fault-armv.c
54     @@ -65,6 +65,30 @@ static int do_adjust_pte(struct vm_area_struct *vma, unsigned long address,
55     return ret;
56     }
57    
58     +#if USE_SPLIT_PTLOCKS
59     +/*
60     + * If we are using split PTE locks, then we need to take the page
61     + * lock here. Otherwise we are using shared mm->page_table_lock
62     + * which is already locked, thus cannot take it.
63     + */
64     +static inline void do_pte_lock(spinlock_t *ptl)
65     +{
66     + /*
67     + * Use nested version here to indicate that we are already
68     + * holding one similar spinlock.
69     + */
70     + spin_lock_nested(ptl, SINGLE_DEPTH_NESTING);
71     +}
72     +
73     +static inline void do_pte_unlock(spinlock_t *ptl)
74     +{
75     + spin_unlock(ptl);
76     +}
77     +#else /* !USE_SPLIT_PTLOCKS */
78     +static inline void do_pte_lock(spinlock_t *ptl) {}
79     +static inline void do_pte_unlock(spinlock_t *ptl) {}
80     +#endif /* USE_SPLIT_PTLOCKS */
81     +
82     static int adjust_pte(struct vm_area_struct *vma, unsigned long address,
83     unsigned long pfn)
84     {
85     @@ -89,11 +113,11 @@ static int adjust_pte(struct vm_area_struct *vma, unsigned long address,
86     */
87     ptl = pte_lockptr(vma->vm_mm, pmd);
88     pte = pte_offset_map_nested(pmd, address);
89     - spin_lock(ptl);
90     + do_pte_lock(ptl);
91    
92     ret = do_adjust_pte(vma, address, pfn, pte);
93    
94     - spin_unlock(ptl);
95     + do_pte_unlock(ptl);
96     pte_unmap_nested(pte);
97    
98     return ret;
99     diff --git a/arch/arm/plat-omap/dma.c b/arch/arm/plat-omap/dma.c
100     index ec7eddf..f5c5b8d 100644
101     --- a/arch/arm/plat-omap/dma.c
102     +++ b/arch/arm/plat-omap/dma.c
103     @@ -30,6 +30,7 @@
104     #include <linux/irq.h>
105     #include <linux/io.h>
106     #include <linux/slab.h>
107     +#include <linux/delay.h>
108    
109     #include <asm/system.h>
110     #include <mach/hardware.h>
111     @@ -996,11 +997,17 @@ void omap_start_dma(int lch)
112     l = dma_read(CCR(lch));
113    
114     /*
115     - * Errata: On ES2.0 BUFFERING disable must be set.
116     - * This will always fail on ES1.0
117     + * Errata: Inter Frame DMA buffering issue (All OMAP2420 and
118     + * OMAP2430ES1.0): DMA will wrongly buffer elements if packing and
119     + * bursting is enabled. This might result in data gets stalled in
120     + * FIFO at the end of the block.
121     + * Workaround: DMA channels must have BUFFERING_DISABLED bit set to
122     + * guarantee no data will stay in the DMA FIFO in case inter frame
123     + * buffering occurs.
124     */
125     - if (cpu_is_omap24xx())
126     - l |= OMAP_DMA_CCR_EN;
127     + if (cpu_is_omap2420() ||
128     + (cpu_is_omap2430() && (omap_type() == OMAP2430_REV_ES1_0)))
129     + l |= OMAP_DMA_CCR_BUFFERING_DISABLE;
130    
131     l |= OMAP_DMA_CCR_EN;
132     dma_write(l, CCR(lch));
133     @@ -1018,8 +1025,39 @@ void omap_stop_dma(int lch)
134     dma_write(0, CICR(lch));
135    
136     l = dma_read(CCR(lch));
137     - l &= ~OMAP_DMA_CCR_EN;
138     - dma_write(l, CCR(lch));
139     + /* OMAP3 Errata i541: sDMA FIFO draining does not finish */
140     + if (cpu_is_omap34xx() && (l & OMAP_DMA_CCR_SEL_SRC_DST_SYNC)) {
141     + int i = 0;
142     + u32 sys_cf;
143     +
144     + /* Configure No-Standby */
145     + l = dma_read(OCP_SYSCONFIG);
146     + sys_cf = l;
147     + l &= ~DMA_SYSCONFIG_MIDLEMODE_MASK;
148     + l |= DMA_SYSCONFIG_MIDLEMODE(DMA_IDLEMODE_NO_IDLE);
149     + dma_write(l , OCP_SYSCONFIG);
150     +
151     + l = dma_read(CCR(lch));
152     + l &= ~OMAP_DMA_CCR_EN;
153     + dma_write(l, CCR(lch));
154     +
155     + /* Wait for sDMA FIFO drain */
156     + l = dma_read(CCR(lch));
157     + while (i < 100 && (l & (OMAP_DMA_CCR_RD_ACTIVE |
158     + OMAP_DMA_CCR_WR_ACTIVE))) {
159     + udelay(5);
160     + i++;
161     + l = dma_read(CCR(lch));
162     + }
163     + if (i >= 100)
164     + printk(KERN_ERR "DMA drain did not complete on "
165     + "lch %d\n", lch);
166     + /* Restore OCP_SYSCONFIG */
167     + dma_write(sys_cf, OCP_SYSCONFIG);
168     + } else {
169     + l &= ~OMAP_DMA_CCR_EN;
170     + dma_write(l, CCR(lch));
171     + }
172    
173     if (!omap_dma_in_1510_mode() && dma_chan[lch].next_lch != -1) {
174     int next_lch, cur_lch = lch;
175     diff --git a/arch/arm/plat-omap/include/plat/dma.h b/arch/arm/plat-omap/include/plat/dma.h
176     index af3a039..cf66f85 100644
177     --- a/arch/arm/plat-omap/include/plat/dma.h
178     +++ b/arch/arm/plat-omap/include/plat/dma.h
179     @@ -335,6 +335,10 @@
180     #define OMAP2_DMA_MISALIGNED_ERR_IRQ (1 << 11)
181    
182     #define OMAP_DMA_CCR_EN (1 << 7)
183     +#define OMAP_DMA_CCR_RD_ACTIVE (1 << 9)
184     +#define OMAP_DMA_CCR_WR_ACTIVE (1 << 10)
185     +#define OMAP_DMA_CCR_SEL_SRC_DST_SYNC (1 << 24)
186     +#define OMAP_DMA_CCR_BUFFERING_DISABLE (1 << 25)
187    
188     #define OMAP_DMA_DATA_TYPE_S8 0x00
189     #define OMAP_DMA_DATA_TYPE_S16 0x01
190     diff --git a/arch/microblaze/Makefile b/arch/microblaze/Makefile
191     index 592c707..b07d990 100644
192     --- a/arch/microblaze/Makefile
193     +++ b/arch/microblaze/Makefile
194     @@ -72,12 +72,16 @@ export MMU DTB
195    
196     all: linux.bin
197    
198     -BOOT_TARGETS = linux.bin linux.bin.gz simpleImage.%
199     +# With make 3.82 we cannot mix normal and wildcard targets
200     +BOOT_TARGETS1 = linux.bin linux.bin.gz
201     +BOOT_TARGETS2 = simpleImage.%
202    
203     archclean:
204     $(Q)$(MAKE) $(clean)=$(boot)
205    
206     -$(BOOT_TARGETS): vmlinux
207     +$(BOOT_TARGETS1): vmlinux
208     + $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
209     +$(BOOT_TARGETS2): vmlinux
210     $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
211    
212     define archhelp
213     diff --git a/arch/powerpc/mm/hash_utils_64.c b/arch/powerpc/mm/hash_utils_64.c
214     index 09dffe6..1eb64ba 100644
215     --- a/arch/powerpc/mm/hash_utils_64.c
216     +++ b/arch/powerpc/mm/hash_utils_64.c
217     @@ -1122,7 +1122,7 @@ void hash_preload(struct mm_struct *mm, unsigned long ea,
218     else
219     #endif /* CONFIG_PPC_HAS_HASH_64K */
220     rc = __hash_page_4K(ea, access, vsid, ptep, trap, local, ssize,
221     - subpage_protection(pgdir, ea));
222     + subpage_protection(mm, ea));
223    
224     /* Dump some info in case of hash insertion failure, they should
225     * never happen so it is really useful to know if/when they do
226     diff --git a/arch/s390/kernel/nmi.c b/arch/s390/kernel/nmi.c
227     index ac15139..1995c17 100644
228     --- a/arch/s390/kernel/nmi.c
229     +++ b/arch/s390/kernel/nmi.c
230     @@ -95,7 +95,6 @@ EXPORT_SYMBOL_GPL(s390_handle_mcck);
231     static int notrace s390_revalidate_registers(struct mci *mci)
232     {
233     int kill_task;
234     - u64 tmpclock;
235     u64 zero;
236     void *fpt_save_area, *fpt_creg_save_area;
237    
238     @@ -214,11 +213,10 @@ static int notrace s390_revalidate_registers(struct mci *mci)
239     : "0", "cc");
240     #endif
241     /* Revalidate clock comparator register */
242     - asm volatile(
243     - " stck 0(%1)\n"
244     - " sckc 0(%1)"
245     - : "=m" (tmpclock) : "a" (&(tmpclock)) : "cc", "memory");
246     -
247     + if (S390_lowcore.clock_comparator == -1)
248     + set_clock_comparator(S390_lowcore.mcck_clock);
249     + else
250     + set_clock_comparator(S390_lowcore.clock_comparator);
251     /* Check if old PSW is valid */
252     if (!mci->wp)
253     /*
254     diff --git a/arch/s390/kernel/vtime.c b/arch/s390/kernel/vtime.c
255     index 3479f1b..c1e326c 100644
256     --- a/arch/s390/kernel/vtime.c
257     +++ b/arch/s390/kernel/vtime.c
258     @@ -19,6 +19,7 @@
259     #include <linux/kernel_stat.h>
260     #include <linux/rcupdate.h>
261     #include <linux/posix-timers.h>
262     +#include <linux/cpu.h>
263    
264     #include <asm/s390_ext.h>
265     #include <asm/timer.h>
266     @@ -565,6 +566,23 @@ void init_cpu_vtimer(void)
267     __ctl_set_bit(0,10);
268     }
269    
270     +static int __cpuinit s390_nohz_notify(struct notifier_block *self,
271     + unsigned long action, void *hcpu)
272     +{
273     + struct s390_idle_data *idle;
274     + long cpu = (long) hcpu;
275     +
276     + idle = &per_cpu(s390_idle, cpu);
277     + switch (action) {
278     + case CPU_DYING:
279     + case CPU_DYING_FROZEN:
280     + idle->nohz_delay = 0;
281     + default:
282     + break;
283     + }
284     + return NOTIFY_OK;
285     +}
286     +
287     void __init vtime_init(void)
288     {
289     /* request the cpu timer external interrupt */
290     @@ -573,5 +591,6 @@ void __init vtime_init(void)
291    
292     /* Enable cpu timer interrupts on the boot cpu. */
293     init_cpu_vtimer();
294     + cpu_notifier(s390_nohz_notify, 0);
295     }
296    
297     diff --git a/arch/s390/lib/delay.c b/arch/s390/lib/delay.c
298     index 752b362..7c37ec3 100644
299     --- a/arch/s390/lib/delay.c
300     +++ b/arch/s390/lib/delay.c
301     @@ -29,17 +29,21 @@ static void __udelay_disabled(unsigned long long usecs)
302     {
303     unsigned long mask, cr0, cr0_saved;
304     u64 clock_saved;
305     + u64 end;
306    
307     + mask = psw_kernel_bits | PSW_MASK_WAIT | PSW_MASK_EXT;
308     + end = get_clock() + (usecs << 12);
309     clock_saved = local_tick_disable();
310     - set_clock_comparator(get_clock() + (usecs << 12));
311     __ctl_store(cr0_saved, 0, 0);
312     cr0 = (cr0_saved & 0xffff00e0) | 0x00000800;
313     __ctl_load(cr0 , 0, 0);
314     - mask = psw_kernel_bits | PSW_MASK_WAIT | PSW_MASK_EXT;
315     lockdep_off();
316     - trace_hardirqs_on();
317     - __load_psw_mask(mask);
318     - local_irq_disable();
319     + do {
320     + set_clock_comparator(end);
321     + trace_hardirqs_on();
322     + __load_psw_mask(mask);
323     + local_irq_disable();
324     + } while (get_clock() < end);
325     lockdep_on();
326     __ctl_load(cr0_saved, 0, 0);
327     local_tick_enable(clock_saved);
328     diff --git a/arch/sh/include/asm/syscalls_32.h b/arch/sh/include/asm/syscalls_32.h
329     index be201fd..ae717e3 100644
330     --- a/arch/sh/include/asm/syscalls_32.h
331     +++ b/arch/sh/include/asm/syscalls_32.h
332     @@ -19,9 +19,10 @@ asmlinkage int sys_clone(unsigned long clone_flags, unsigned long newsp,
333     asmlinkage int sys_vfork(unsigned long r4, unsigned long r5,
334     unsigned long r6, unsigned long r7,
335     struct pt_regs __regs);
336     -asmlinkage int sys_execve(const char __user *ufilename, char __user * __user *uargv,
337     - char __user * __user *uenvp, unsigned long r7,
338     - struct pt_regs __regs);
339     +asmlinkage int sys_execve(const char __user *ufilename,
340     + const char __user *const __user *uargv,
341     + const char __user *const __user *uenvp,
342     + unsigned long r7, struct pt_regs __regs);
343     asmlinkage int sys_sigsuspend(old_sigset_t mask, unsigned long r5,
344     unsigned long r6, unsigned long r7,
345     struct pt_regs __regs);
346     diff --git a/arch/um/drivers/line.c b/arch/um/drivers/line.c
347     index 7f7338c..1664cce 100644
348     --- a/arch/um/drivers/line.c
349     +++ b/arch/um/drivers/line.c
350     @@ -727,6 +727,9 @@ struct winch {
351    
352     static void free_winch(struct winch *winch, int free_irq_ok)
353     {
354     + if (free_irq_ok)
355     + free_irq(WINCH_IRQ, winch);
356     +
357     list_del(&winch->list);
358    
359     if (winch->pid != -1)
360     @@ -735,8 +738,6 @@ static void free_winch(struct winch *winch, int free_irq_ok)
361     os_close_file(winch->fd);
362     if (winch->stack != 0)
363     free_stack(winch->stack, 0);
364     - if (free_irq_ok)
365     - free_irq(WINCH_IRQ, winch);
366     kfree(winch);
367     }
368    
369     diff --git a/arch/um/kernel/uml.lds.S b/arch/um/kernel/uml.lds.S
370     index ec63785..9a873d7 100644
371     --- a/arch/um/kernel/uml.lds.S
372     +++ b/arch/um/kernel/uml.lds.S
373     @@ -22,7 +22,7 @@ SECTIONS
374     _text = .;
375     _stext = .;
376     __init_begin = .;
377     - INIT_TEXT_SECTION(PAGE_SIZE)
378     + INIT_TEXT_SECTION(0)
379     . = ALIGN(PAGE_SIZE);
380    
381     .text :
382     diff --git a/arch/um/os-Linux/time.c b/arch/um/os-Linux/time.c
383     index dec5678..6e3359d 100644
384     --- a/arch/um/os-Linux/time.c
385     +++ b/arch/um/os-Linux/time.c
386     @@ -60,7 +60,7 @@ static inline long long timeval_to_ns(const struct timeval *tv)
387     long long disable_timer(void)
388     {
389     struct itimerval time = ((struct itimerval) { { 0, 0 }, { 0, 0 } });
390     - int remain, max = UM_NSEC_PER_SEC / UM_HZ;
391     + long long remain, max = UM_NSEC_PER_SEC / UM_HZ;
392    
393     if (setitimer(ITIMER_VIRTUAL, &time, &time) < 0)
394     printk(UM_KERN_ERR "disable_timer - setitimer failed, "
395     diff --git a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
396     index cd8da24..a2baafb 100644
397     --- a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
398     +++ b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
399     @@ -701,6 +701,7 @@ static int acpi_cpufreq_cpu_exit(struct cpufreq_policy *policy)
400     per_cpu(acfreq_data, policy->cpu) = NULL;
401     acpi_processor_unregister_performance(data->acpi_data,
402     policy->cpu);
403     + kfree(data->freq_table);
404     kfree(data);
405     }
406    
407     diff --git a/arch/x86/kernel/hw_breakpoint.c b/arch/x86/kernel/hw_breakpoint.c
408     index ff15c9d..42c5942 100644
409     --- a/arch/x86/kernel/hw_breakpoint.c
410     +++ b/arch/x86/kernel/hw_breakpoint.c
411     @@ -433,6 +433,10 @@ static int __kprobes hw_breakpoint_handler(struct die_args *args)
412     dr6_p = (unsigned long *)ERR_PTR(args->err);
413     dr6 = *dr6_p;
414    
415     + /* If it's a single step, TRAP bits are random */
416     + if (dr6 & DR_STEP)
417     + return NOTIFY_DONE;
418     +
419     /* Do an early return if no trap bits are set in DR6 */
420     if ((dr6 & DR_TRAP_BITS) == 0)
421     return NOTIFY_DONE;
422     diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
423     index 2a02a65..89055e0 100644
424     --- a/arch/x86/kvm/svm.c
425     +++ b/arch/x86/kvm/svm.c
426     @@ -3281,6 +3281,7 @@ static void svm_vcpu_run(struct kvm_vcpu *vcpu)
427     vcpu->arch.regs[VCPU_REGS_RIP] = svm->vmcb->save.rip;
428    
429     load_host_msrs(vcpu);
430     + kvm_load_ldt(ldt_selector);
431     loadsegment(fs, fs_selector);
432     #ifdef CONFIG_X86_64
433     load_gs_index(gs_selector);
434     @@ -3288,7 +3289,6 @@ static void svm_vcpu_run(struct kvm_vcpu *vcpu)
435     #else
436     loadsegment(gs, gs_selector);
437     #endif
438     - kvm_load_ldt(ldt_selector);
439    
440     reload_tss(vcpu);
441    
442     diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
443     index 7bddfab..f23f725 100644
444     --- a/arch/x86/kvm/vmx.c
445     +++ b/arch/x86/kvm/vmx.c
446     @@ -828,10 +828,9 @@ static void vmx_save_host_state(struct kvm_vcpu *vcpu)
447     #endif
448    
449     #ifdef CONFIG_X86_64
450     - if (is_long_mode(&vmx->vcpu)) {
451     - rdmsrl(MSR_KERNEL_GS_BASE, vmx->msr_host_kernel_gs_base);
452     + rdmsrl(MSR_KERNEL_GS_BASE, vmx->msr_host_kernel_gs_base);
453     + if (is_long_mode(&vmx->vcpu))
454     wrmsrl(MSR_KERNEL_GS_BASE, vmx->msr_guest_kernel_gs_base);
455     - }
456     #endif
457     for (i = 0; i < vmx->save_nmsrs; ++i)
458     kvm_set_shared_msr(vmx->guest_msrs[i].index,
459     @@ -846,23 +845,23 @@ static void __vmx_load_host_state(struct vcpu_vmx *vmx)
460    
461     ++vmx->vcpu.stat.host_state_reload;
462     vmx->host_state.loaded = 0;
463     - if (vmx->host_state.fs_reload_needed)
464     - loadsegment(fs, vmx->host_state.fs_sel);
465     +#ifdef CONFIG_X86_64
466     + if (is_long_mode(&vmx->vcpu))
467     + rdmsrl(MSR_KERNEL_GS_BASE, vmx->msr_guest_kernel_gs_base);
468     +#endif
469     if (vmx->host_state.gs_ldt_reload_needed) {
470     kvm_load_ldt(vmx->host_state.ldt_sel);
471     #ifdef CONFIG_X86_64
472     load_gs_index(vmx->host_state.gs_sel);
473     - wrmsrl(MSR_KERNEL_GS_BASE, current->thread.gs);
474     #else
475     loadsegment(gs, vmx->host_state.gs_sel);
476     #endif
477     }
478     + if (vmx->host_state.fs_reload_needed)
479     + loadsegment(fs, vmx->host_state.fs_sel);
480     reload_tss();
481     #ifdef CONFIG_X86_64
482     - if (is_long_mode(&vmx->vcpu)) {
483     - rdmsrl(MSR_KERNEL_GS_BASE, vmx->msr_guest_kernel_gs_base);
484     - wrmsrl(MSR_KERNEL_GS_BASE, vmx->msr_host_kernel_gs_base);
485     - }
486     + wrmsrl(MSR_KERNEL_GS_BASE, vmx->msr_host_kernel_gs_base);
487     #endif
488     if (current_thread_info()->status & TS_USEDFPU)
489     clts();
490     diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
491     index a4a427b..3f2d2b3 100644
492     --- a/arch/x86/kvm/x86.c
493     +++ b/arch/x86/kvm/x86.c
494     @@ -2305,6 +2305,7 @@ static void kvm_vcpu_ioctl_x86_get_vcpu_events(struct kvm_vcpu *vcpu,
495     !kvm_exception_is_soft(vcpu->arch.exception.nr);
496     events->exception.nr = vcpu->arch.exception.nr;
497     events->exception.has_error_code = vcpu->arch.exception.has_error_code;
498     + events->exception.pad = 0;
499     events->exception.error_code = vcpu->arch.exception.error_code;
500    
501     events->interrupt.injected =
502     @@ -2318,12 +2319,14 @@ static void kvm_vcpu_ioctl_x86_get_vcpu_events(struct kvm_vcpu *vcpu,
503     events->nmi.injected = vcpu->arch.nmi_injected;
504     events->nmi.pending = vcpu->arch.nmi_pending;
505     events->nmi.masked = kvm_x86_ops->get_nmi_mask(vcpu);
506     + events->nmi.pad = 0;
507    
508     events->sipi_vector = vcpu->arch.sipi_vector;
509    
510     events->flags = (KVM_VCPUEVENT_VALID_NMI_PENDING
511     | KVM_VCPUEVENT_VALID_SIPI_VECTOR
512     | KVM_VCPUEVENT_VALID_SHADOW);
513     + memset(&events->reserved, 0, sizeof(events->reserved));
514     }
515    
516     static int kvm_vcpu_ioctl_x86_set_vcpu_events(struct kvm_vcpu *vcpu,
517     @@ -2366,6 +2369,7 @@ static void kvm_vcpu_ioctl_x86_get_debugregs(struct kvm_vcpu *vcpu,
518     dbgregs->dr6 = vcpu->arch.dr6;
519     dbgregs->dr7 = vcpu->arch.dr7;
520     dbgregs->flags = 0;
521     + memset(&dbgregs->reserved, 0, sizeof(dbgregs->reserved));
522     }
523    
524     static int kvm_vcpu_ioctl_x86_set_debugregs(struct kvm_vcpu *vcpu,
525     @@ -2849,6 +2853,7 @@ static int kvm_vm_ioctl_get_pit2(struct kvm *kvm, struct kvm_pit_state2 *ps)
526     sizeof(ps->channels));
527     ps->flags = kvm->arch.vpit->pit_state.flags;
528     mutex_unlock(&kvm->arch.vpit->pit_state.lock);
529     + memset(&ps->reserved, 0, sizeof(ps->reserved));
530     return r;
531     }
532    
533     @@ -2912,10 +2917,6 @@ int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm,
534     struct kvm_memslots *slots, *old_slots;
535     unsigned long *dirty_bitmap;
536    
537     - spin_lock(&kvm->mmu_lock);
538     - kvm_mmu_slot_remove_write_access(kvm, log->slot);
539     - spin_unlock(&kvm->mmu_lock);
540     -
541     r = -ENOMEM;
542     dirty_bitmap = vmalloc(n);
543     if (!dirty_bitmap)
544     @@ -2937,6 +2938,10 @@ int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm,
545     dirty_bitmap = old_slots->memslots[log->slot].dirty_bitmap;
546     kfree(old_slots);
547    
548     + spin_lock(&kvm->mmu_lock);
549     + kvm_mmu_slot_remove_write_access(kvm, log->slot);
550     + spin_unlock(&kvm->mmu_lock);
551     +
552     r = -EFAULT;
553     if (copy_to_user(log->dirty_bitmap, dirty_bitmap, n)) {
554     vfree(dirty_bitmap);
555     @@ -3229,6 +3234,7 @@ long kvm_arch_vm_ioctl(struct file *filp,
556     now_ns = timespec_to_ns(&now);
557     user_ns.clock = kvm->arch.kvmclock_offset + now_ns;
558     user_ns.flags = 0;
559     + memset(&user_ns.pad, 0, sizeof(user_ns.pad));
560    
561     r = -EFAULT;
562     if (copy_to_user(argp, &user_ns, sizeof(user_ns)))
563     diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
564     index 44f8086..0f6cd14 100644
565     --- a/arch/x86/xen/enlighten.c
566     +++ b/arch/x86/xen/enlighten.c
567     @@ -1017,10 +1017,6 @@ static void xen_reboot(int reason)
568     {
569     struct sched_shutdown r = { .reason = reason };
570    
571     -#ifdef CONFIG_SMP
572     - stop_other_cpus();
573     -#endif
574     -
575     if (HYPERVISOR_sched_op(SCHEDOP_shutdown, &r))
576     BUG();
577     }
578     diff --git a/block/blk-map.c b/block/blk-map.c
579     index ade0a08..267a57b 100644
580     --- a/block/blk-map.c
581     +++ b/block/blk-map.c
582     @@ -205,6 +205,8 @@ int blk_rq_map_user_iov(struct request_queue *q, struct request *rq,
583     unaligned = 1;
584     break;
585     }
586     + if (!iov[i].iov_len)
587     + return -EINVAL;
588     }
589    
590     if (unaligned || (q->dma_pad_mask & len) || map_data)
591     diff --git a/block/blk-settings.c b/block/blk-settings.c
592     index a234f4b..450577d 100644
593     --- a/block/blk-settings.c
594     +++ b/block/blk-settings.c
595     @@ -343,7 +343,7 @@ EXPORT_SYMBOL(blk_queue_logical_block_size);
596     * hardware can operate on without reverting to read-modify-write
597     * operations.
598     */
599     -void blk_queue_physical_block_size(struct request_queue *q, unsigned short size)
600     +void blk_queue_physical_block_size(struct request_queue *q, unsigned int size)
601     {
602     q->limits.physical_block_size = size;
603    
604     diff --git a/block/genhd.c b/block/genhd.c
605     index 59a2db6..315afd2 100644
606     --- a/block/genhd.c
607     +++ b/block/genhd.c
608     @@ -541,13 +541,15 @@ void add_disk(struct gendisk *disk)
609     disk->major = MAJOR(devt);
610     disk->first_minor = MINOR(devt);
611    
612     + /* Register BDI before referencing it from bdev */
613     + bdi = &disk->queue->backing_dev_info;
614     + bdi_register_dev(bdi, disk_devt(disk));
615     +
616     blk_register_region(disk_devt(disk), disk->minors, NULL,
617     exact_match, exact_lock, disk);
618     register_disk(disk);
619     blk_register_queue(disk);
620    
621     - bdi = &disk->queue->backing_dev_info;
622     - bdi_register_dev(bdi, disk_devt(disk));
623     retval = sysfs_create_link(&disk_to_dev(disk)->kobj, &bdi->dev->kobj,
624     "bdi");
625     WARN_ON(retval);
626     diff --git a/block/scsi_ioctl.c b/block/scsi_ioctl.c
627     index a8b5a10..4f4230b 100644
628     --- a/block/scsi_ioctl.c
629     +++ b/block/scsi_ioctl.c
630     @@ -321,33 +321,47 @@ static int sg_io(struct request_queue *q, struct gendisk *bd_disk,
631     if (hdr->iovec_count) {
632     const int size = sizeof(struct sg_iovec) * hdr->iovec_count;
633     size_t iov_data_len;
634     - struct sg_iovec *iov;
635     + struct sg_iovec *sg_iov;
636     + struct iovec *iov;
637     + int i;
638    
639     - iov = kmalloc(size, GFP_KERNEL);
640     - if (!iov) {
641     + sg_iov = kmalloc(size, GFP_KERNEL);
642     + if (!sg_iov) {
643     ret = -ENOMEM;
644     goto out;
645     }
646    
647     - if (copy_from_user(iov, hdr->dxferp, size)) {
648     - kfree(iov);
649     + if (copy_from_user(sg_iov, hdr->dxferp, size)) {
650     + kfree(sg_iov);
651     ret = -EFAULT;
652     goto out;
653     }
654    
655     + /*
656     + * Sum up the vecs, making sure they don't overflow
657     + */
658     + iov = (struct iovec *) sg_iov;
659     + iov_data_len = 0;
660     + for (i = 0; i < hdr->iovec_count; i++) {
661     + if (iov_data_len + iov[i].iov_len < iov_data_len) {
662     + kfree(sg_iov);
663     + ret = -EINVAL;
664     + goto out;
665     + }
666     + iov_data_len += iov[i].iov_len;
667     + }
668     +
669     /* SG_IO howto says that the shorter of the two wins */
670     - iov_data_len = iov_length((struct iovec *)iov,
671     - hdr->iovec_count);
672     if (hdr->dxfer_len < iov_data_len) {
673     - hdr->iovec_count = iov_shorten((struct iovec *)iov,
674     + hdr->iovec_count = iov_shorten(iov,
675     hdr->iovec_count,
676     hdr->dxfer_len);
677     iov_data_len = hdr->dxfer_len;
678     }
679    
680     - ret = blk_rq_map_user_iov(q, rq, NULL, iov, hdr->iovec_count,
681     + ret = blk_rq_map_user_iov(q, rq, NULL, sg_iov, hdr->iovec_count,
682     iov_data_len, GFP_KERNEL);
683     - kfree(iov);
684     + kfree(sg_iov);
685     } else if (hdr->dxfer_len)
686     ret = blk_rq_map_user(q, rq, NULL, hdr->dxferp, hdr->dxfer_len,
687     GFP_KERNEL);
688     diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c
689     index 9841720..4c0a0a3 100644
690     --- a/drivers/acpi/battery.c
691     +++ b/drivers/acpi/battery.c
692     @@ -98,6 +98,7 @@ enum {
693     * due to bad math.
694     */
695     ACPI_BATTERY_QUIRK_SIGNED16_CURRENT,
696     + ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY,
697     };
698    
699     struct acpi_battery {
700     @@ -412,6 +413,8 @@ static int acpi_battery_get_info(struct acpi_battery *battery)
701     result = extract_package(battery, buffer.pointer,
702     info_offsets, ARRAY_SIZE(info_offsets));
703     kfree(buffer.pointer);
704     + if (test_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags))
705     + battery->full_charge_capacity = battery->design_capacity;
706     return result;
707     }
708    
709     @@ -448,6 +451,10 @@ static int acpi_battery_get_state(struct acpi_battery *battery)
710     battery->rate_now != -1)
711     battery->rate_now = abs((s16)battery->rate_now);
712    
713     + if (test_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags)
714     + && battery->capacity_now >= 0 && battery->capacity_now <= 100)
715     + battery->capacity_now = (battery->capacity_now *
716     + battery->full_charge_capacity) / 100;
717     return result;
718     }
719    
720     @@ -561,6 +568,33 @@ static void acpi_battery_quirks(struct acpi_battery *battery)
721     }
722     }
723    
724     +/*
725     + * According to the ACPI spec, some kinds of primary batteries can
726     + * report percentage battery remaining capacity directly to OS.
727     + * In this case, it reports the Last Full Charged Capacity == 100
728     + * and BatteryPresentRate == 0xFFFFFFFF.
729     + *
730     + * Now we found some battery reports percentage remaining capacity
731     + * even if it's rechargeable.
732     + * https://bugzilla.kernel.org/show_bug.cgi?id=15979
733     + *
734     + * Handle this correctly so that they won't break userspace.
735     + */
736     +static void acpi_battery_quirks2(struct acpi_battery *battery)
737     +{
738     + if (test_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags))
739     + return ;
740     +
741     + if (battery->full_charge_capacity == 100 &&
742     + battery->rate_now == ACPI_BATTERY_VALUE_UNKNOWN &&
743     + battery->capacity_now >=0 && battery->capacity_now <= 100) {
744     + set_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags);
745     + battery->full_charge_capacity = battery->design_capacity;
746     + battery->capacity_now = (battery->capacity_now *
747     + battery->full_charge_capacity) / 100;
748     + }
749     +}
750     +
751     static int acpi_battery_update(struct acpi_battery *battery)
752     {
753     int result, old_present = acpi_battery_present(battery);
754     @@ -586,7 +620,9 @@ static int acpi_battery_update(struct acpi_battery *battery)
755     if (!battery->bat.dev)
756     sysfs_add_battery(battery);
757     #endif
758     - return acpi_battery_get_state(battery);
759     + result = acpi_battery_get_state(battery);
760     + acpi_battery_quirks2(battery);
761     + return result;
762     }
763    
764     /* --------------------------------------------------------------------------
765     diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c
766     index 310e3b9..d68bd61 100644
767     --- a/drivers/acpi/bus.c
768     +++ b/drivers/acpi/bus.c
769     @@ -935,6 +935,12 @@ static int __init acpi_bus_init(void)
770     goto error1;
771     }
772    
773     + /*
774     + * _PDC control method may load dynamic SSDT tables,
775     + * and we need to install the table handler before that.
776     + */
777     + acpi_sysfs_init();
778     +
779     acpi_early_processor_set_pdc();
780    
781     /*
782     @@ -1026,7 +1032,6 @@ static int __init acpi_init(void)
783     acpi_scan_init();
784     acpi_ec_init();
785     acpi_power_init();
786     - acpi_sysfs_init();
787     acpi_debugfs_init();
788     acpi_sleep_proc_init();
789     acpi_wakeup_device_init();
790     diff --git a/drivers/acpi/debugfs.c b/drivers/acpi/debugfs.c
791     index 7de27d4..74c4a39 100644
792     --- a/drivers/acpi/debugfs.c
793     +++ b/drivers/acpi/debugfs.c
794     @@ -79,7 +79,7 @@ int __init acpi_debugfs_init(void)
795     if (!acpi_dir)
796     goto err;
797    
798     - cm_dentry = debugfs_create_file("custom_method", S_IWUGO,
799     + cm_dentry = debugfs_create_file("custom_method", S_IWUSR,
800     acpi_dir, NULL, &cm_fops);
801     if (!cm_dentry)
802     goto err;
803     diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c
804     index a89172c..7bb6787 100644
805     --- a/drivers/ata/libata-scsi.c
806     +++ b/drivers/ata/libata-scsi.c
807     @@ -2577,8 +2577,11 @@ static void atapi_qc_complete(struct ata_queued_cmd *qc)
808     *
809     * If door lock fails, always clear sdev->locked to
810     * avoid this infinite loop.
811     + *
812     + * This may happen before SCSI scan is complete. Make
813     + * sure qc->dev->sdev isn't NULL before dereferencing.
814     */
815     - if (qc->cdb[0] == ALLOW_MEDIUM_REMOVAL)
816     + if (qc->cdb[0] == ALLOW_MEDIUM_REMOVAL && qc->dev->sdev)
817     qc->dev->sdev->locked = 0;
818    
819     qc->scsicmd->result = SAM_STAT_CHECK_CONDITION;
820     diff --git a/drivers/ata/sata_via.c b/drivers/ata/sata_via.c
821     index 4730c42..c51b8d2 100644
822     --- a/drivers/ata/sata_via.c
823     +++ b/drivers/ata/sata_via.c
824     @@ -538,7 +538,7 @@ static int vt8251_prepare_host(struct pci_dev *pdev, struct ata_host **r_host)
825     return 0;
826     }
827    
828     -static void svia_configure(struct pci_dev *pdev)
829     +static void svia_configure(struct pci_dev *pdev, int board_id)
830     {
831     u8 tmp8;
832    
833     @@ -577,7 +577,7 @@ static void svia_configure(struct pci_dev *pdev)
834     }
835    
836     /*
837     - * vt6421 has problems talking to some drives. The following
838     + * vt6420/1 has problems talking to some drives. The following
839     * is the fix from Joseph Chan <JosephChan@via.com.tw>.
840     *
841     * When host issues HOLD, device may send up to 20DW of data
842     @@ -596,8 +596,9 @@ static void svia_configure(struct pci_dev *pdev)
843     *
844     * https://bugzilla.kernel.org/show_bug.cgi?id=15173
845     * http://article.gmane.org/gmane.linux.ide/46352
846     + * http://thread.gmane.org/gmane.linux.kernel/1062139
847     */
848     - if (pdev->device == 0x3249) {
849     + if (board_id == vt6420 || board_id == vt6421) {
850     pci_read_config_byte(pdev, 0x52, &tmp8);
851     tmp8 |= 1 << 2;
852     pci_write_config_byte(pdev, 0x52, tmp8);
853     @@ -652,7 +653,7 @@ static int svia_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
854     if (rc)
855     return rc;
856    
857     - svia_configure(pdev);
858     + svia_configure(pdev, board_id);
859    
860     pci_set_master(pdev);
861     return ata_host_activate(host, pdev->irq, ata_bmdma_interrupt,
862     diff --git a/drivers/char/agp/intel-agp.c b/drivers/char/agp/intel-agp.c
863     index cd18493..47350de 100644
864     --- a/drivers/char/agp/intel-agp.c
865     +++ b/drivers/char/agp/intel-agp.c
866     @@ -1049,6 +1049,7 @@ static struct pci_device_id agp_intel_pci_table[] = {
867     ID(PCI_DEVICE_ID_INTEL_G45_HB),
868     ID(PCI_DEVICE_ID_INTEL_G41_HB),
869     ID(PCI_DEVICE_ID_INTEL_B43_HB),
870     + ID(PCI_DEVICE_ID_INTEL_B43_1_HB),
871     ID(PCI_DEVICE_ID_INTEL_IRONLAKE_D_HB),
872     ID(PCI_DEVICE_ID_INTEL_IRONLAKE_M_HB),
873     ID(PCI_DEVICE_ID_INTEL_IRONLAKE_MA_HB),
874     diff --git a/drivers/char/agp/intel-gtt.c b/drivers/char/agp/intel-gtt.c
875     index 75e0a34..6ea3bf6 100644
876     --- a/drivers/char/agp/intel-gtt.c
877     +++ b/drivers/char/agp/intel-gtt.c
878     @@ -534,7 +534,7 @@ static void intel_i830_init_gtt_entries(void)
879    
880     pci_read_config_word(agp_bridge->dev, I830_GMCH_CTRL, &gmch_ctrl);
881    
882     - if (IS_I965) {
883     + if (IS_G33 || IS_I965) {
884     u32 pgetbl_ctl;
885     pgetbl_ctl = readl(intel_private.registers+I810_PGETBL_CTL);
886    
887     @@ -567,22 +567,6 @@ static void intel_i830_init_gtt_entries(void)
888     size = 512;
889     }
890     size += 4; /* add in BIOS popup space */
891     - } else if (IS_G33 && !IS_PINEVIEW) {
892     - /* G33's GTT size defined in gmch_ctrl */
893     - switch (gmch_ctrl & G33_PGETBL_SIZE_MASK) {
894     - case G33_PGETBL_SIZE_1M:
895     - size = 1024;
896     - break;
897     - case G33_PGETBL_SIZE_2M:
898     - size = 2048;
899     - break;
900     - default:
901     - dev_info(&agp_bridge->dev->dev,
902     - "unknown page table size 0x%x, assuming 512KB\n",
903     - (gmch_ctrl & G33_PGETBL_SIZE_MASK));
904     - size = 512;
905     - }
906     - size += 4;
907     } else if (IS_G4X || IS_PINEVIEW) {
908     /* On 4 series hardware, GTT stolen is separate from graphics
909     * stolen, ignore it in stolen gtt entries counting. However,
910     @@ -1257,24 +1241,31 @@ static int intel_i915_get_gtt_size(void)
911     int size;
912    
913     if (IS_G33) {
914     - u16 gmch_ctrl;
915     + u32 pgetbl_ctl;
916     + pgetbl_ctl = readl(intel_private.registers+I810_PGETBL_CTL);
917    
918     - /* G33's GTT size defined in gmch_ctrl */
919     - pci_read_config_word(agp_bridge->dev, I830_GMCH_CTRL, &gmch_ctrl);
920     - switch (gmch_ctrl & I830_GMCH_GMS_MASK) {
921     - case I830_GMCH_GMS_STOLEN_512:
922     + switch (pgetbl_ctl & I965_PGETBL_SIZE_MASK) {
923     + case I965_PGETBL_SIZE_128KB:
924     + size = 128;
925     + break;
926     + case I965_PGETBL_SIZE_256KB:
927     + size = 256;
928     + break;
929     + case I965_PGETBL_SIZE_512KB:
930     size = 512;
931     break;
932     - case I830_GMCH_GMS_STOLEN_1024:
933     + case I965_PGETBL_SIZE_1MB:
934     size = 1024;
935     break;
936     - case I830_GMCH_GMS_STOLEN_8192:
937     - size = 8*1024;
938     + case I965_PGETBL_SIZE_2MB:
939     + size = 2048;
940     + break;
941     + case I965_PGETBL_SIZE_1_5MB:
942     + size = 1024 + 512;
943     break;
944     default:
945     - dev_info(&agp_bridge->dev->dev,
946     - "unknown page table size 0x%x, assuming 512KB\n",
947     - (gmch_ctrl & I830_GMCH_GMS_MASK));
948     + dev_info(&intel_private.pcidev->dev,
949     + "unknown page table size, assuming 512KB\n");
950     size = 512;
951     }
952     } else {
953     @@ -1306,14 +1297,6 @@ static int intel_i915_create_gatt_table(struct agp_bridge_data *bridge)
954     pci_read_config_dword(intel_private.pcidev, I915_MMADDR, &temp);
955     pci_read_config_dword(intel_private.pcidev, I915_PTEADDR, &temp2);
956    
957     - gtt_map_size = intel_i915_get_gtt_size();
958     -
959     - intel_private.gtt = ioremap(temp2, gtt_map_size);
960     - if (!intel_private.gtt)
961     - return -ENOMEM;
962     -
963     - intel_private.gtt_total_size = gtt_map_size / 4;
964     -
965     temp &= 0xfff80000;
966    
967     intel_private.registers = ioremap(temp, 128 * 4096);
968     @@ -1322,6 +1305,14 @@ static int intel_i915_create_gatt_table(struct agp_bridge_data *bridge)
969     return -ENOMEM;
970     }
971    
972     + gtt_map_size = intel_i915_get_gtt_size();
973     +
974     + intel_private.gtt = ioremap(temp2, gtt_map_size);
975     + if (!intel_private.gtt)
976     + return -ENOMEM;
977     +
978     + intel_private.gtt_total_size = gtt_map_size / 4;
979     +
980     temp = readl(intel_private.registers+I810_PGETBL_CTL) & 0xfffff000;
981     global_cache_flush(); /* FIXME: ? */
982    
983     diff --git a/drivers/char/hpet.c b/drivers/char/hpet.c
984     index a0a1829..f8e7d89 100644
985     --- a/drivers/char/hpet.c
986     +++ b/drivers/char/hpet.c
987     @@ -479,6 +479,21 @@ static int hpet_ioctl_ieon(struct hpet_dev *devp)
988     if (irq) {
989     unsigned long irq_flags;
990    
991     + if (devp->hd_flags & HPET_SHARED_IRQ) {
992     + /*
993     + * To prevent the interrupt handler from seeing an
994     + * unwanted interrupt status bit, program the timer
995     + * so that it will not fire in the near future ...
996     + */
997     + writel(readl(&timer->hpet_config) & ~Tn_TYPE_CNF_MASK,
998     + &timer->hpet_config);
999     + write_counter(read_counter(&hpet->hpet_mc),
1000     + &timer->hpet_compare);
1001     + /* ... and clear any left-over status. */
1002     + isr = 1 << (devp - devp->hd_hpets->hp_dev);
1003     + writel(isr, &hpet->hpet_isr);
1004     + }
1005     +
1006     sprintf(devp->hd_name, "hpet%d", (int)(devp - hpetp->hp_dev));
1007     irq_flags = devp->hd_flags & HPET_SHARED_IRQ
1008     ? IRQF_SHARED : IRQF_DISABLED;
1009     @@ -970,6 +985,8 @@ static int hpet_acpi_add(struct acpi_device *device)
1010     return -ENODEV;
1011    
1012     if (!data.hd_address || !data.hd_nirqs) {
1013     + if (data.hd_address)
1014     + iounmap(data.hd_address);
1015     printk("%s: no address or irqs in _CRS\n", __func__);
1016     return -ENODEV;
1017     }
1018     diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c
1019     index 7bd7c45..501f115 100644
1020     --- a/drivers/char/ipmi/ipmi_si_intf.c
1021     +++ b/drivers/char/ipmi/ipmi_si_intf.c
1022     @@ -1665,6 +1665,17 @@ static int check_hotmod_int_op(const char *curr, const char *option,
1023     return 0;
1024     }
1025    
1026     +static struct smi_info *smi_info_alloc(void)
1027     +{
1028     + struct smi_info *info = kzalloc(sizeof(*info), GFP_KERNEL);
1029     +
1030     + if (info) {
1031     + spin_lock_init(&info->si_lock);
1032     + spin_lock_init(&info->msg_lock);
1033     + }
1034     + return info;
1035     +}
1036     +
1037     static int hotmod_handler(const char *val, struct kernel_param *kp)
1038     {
1039     char *str = kstrdup(val, GFP_KERNEL);
1040     @@ -1779,7 +1790,7 @@ static int hotmod_handler(const char *val, struct kernel_param *kp)
1041     }
1042    
1043     if (op == HM_ADD) {
1044     - info = kzalloc(sizeof(*info), GFP_KERNEL);
1045     + info = smi_info_alloc();
1046     if (!info) {
1047     rv = -ENOMEM;
1048     goto out;
1049     @@ -1844,7 +1855,7 @@ static __devinit void hardcode_find_bmc(void)
1050     if (!ports[i] && !addrs[i])
1051     continue;
1052    
1053     - info = kzalloc(sizeof(*info), GFP_KERNEL);
1054     + info = smi_info_alloc();
1055     if (!info)
1056     return;
1057    
1058     @@ -2028,7 +2039,7 @@ static __devinit int try_init_spmi(struct SPMITable *spmi)
1059     return -ENODEV;
1060     }
1061    
1062     - info = kzalloc(sizeof(*info), GFP_KERNEL);
1063     + info = smi_info_alloc();
1064     if (!info) {
1065     printk(KERN_ERR PFX "Could not allocate SI data (3)\n");
1066     return -ENOMEM;
1067     @@ -2138,7 +2149,7 @@ static int __devinit ipmi_pnp_probe(struct pnp_dev *dev,
1068     if (!acpi_dev)
1069     return -ENODEV;
1070    
1071     - info = kzalloc(sizeof(*info), GFP_KERNEL);
1072     + info = smi_info_alloc();
1073     if (!info)
1074     return -ENOMEM;
1075    
1076     @@ -2319,7 +2330,7 @@ static __devinit void try_init_dmi(struct dmi_ipmi_data *ipmi_data)
1077     {
1078     struct smi_info *info;
1079    
1080     - info = kzalloc(sizeof(*info), GFP_KERNEL);
1081     + info = smi_info_alloc();
1082     if (!info) {
1083     printk(KERN_ERR PFX "Could not allocate SI data\n");
1084     return;
1085     @@ -2426,7 +2437,7 @@ static int __devinit ipmi_pci_probe(struct pci_dev *pdev,
1086     int class_type = pdev->class & PCI_ERMC_CLASSCODE_TYPE_MASK;
1087     struct smi_info *info;
1088    
1089     - info = kzalloc(sizeof(*info), GFP_KERNEL);
1090     + info = smi_info_alloc();
1091     if (!info)
1092     return -ENOMEM;
1093    
1094     @@ -2567,7 +2578,7 @@ static int __devinit ipmi_of_probe(struct platform_device *dev,
1095     return -EINVAL;
1096     }
1097    
1098     - info = kzalloc(sizeof(*info), GFP_KERNEL);
1099     + info = smi_info_alloc();
1100    
1101     if (!info) {
1102     dev_err(&dev->dev,
1103     @@ -3014,7 +3025,7 @@ static __devinit void default_find_bmc(void)
1104     if (check_legacy_ioport(ipmi_defaults[i].port))
1105     continue;
1106     #endif
1107     - info = kzalloc(sizeof(*info), GFP_KERNEL);
1108     + info = smi_info_alloc();
1109     if (!info)
1110     return;
1111    
1112     @@ -3139,9 +3150,6 @@ static int try_smi_init(struct smi_info *new_smi)
1113     goto out_err;
1114     }
1115    
1116     - spin_lock_init(&(new_smi->si_lock));
1117     - spin_lock_init(&(new_smi->msg_lock));
1118     -
1119     /* Do low-level detection first. */
1120     if (new_smi->handlers->detect(new_smi->si_sm)) {
1121     if (new_smi->addr_source)
1122     diff --git a/drivers/char/tty_buffer.c b/drivers/char/tty_buffer.c
1123     index cc1e985..d8210ca 100644
1124     --- a/drivers/char/tty_buffer.c
1125     +++ b/drivers/char/tty_buffer.c
1126     @@ -413,7 +413,8 @@ static void flush_to_ldisc(struct work_struct *work)
1127     spin_lock_irqsave(&tty->buf.lock, flags);
1128    
1129     if (!test_and_set_bit(TTY_FLUSHING, &tty->flags)) {
1130     - struct tty_buffer *head;
1131     + struct tty_buffer *head, *tail = tty->buf.tail;
1132     + int seen_tail = 0;
1133     while ((head = tty->buf.head) != NULL) {
1134     int count;
1135     char *char_buf;
1136     @@ -423,6 +424,15 @@ static void flush_to_ldisc(struct work_struct *work)
1137     if (!count) {
1138     if (head->next == NULL)
1139     break;
1140     + /*
1141     + There's a possibility tty might get new buffer
1142     + added during the unlock window below. We could
1143     + end up spinning in here forever hogging the CPU
1144     + completely. To avoid this let's have a rest each
1145     + time we processed the tail buffer.
1146     + */
1147     + if (tail == head)
1148     + seen_tail = 1;
1149     tty->buf.head = head->next;
1150     tty_buffer_free(tty, head);
1151     continue;
1152     @@ -432,7 +442,7 @@ static void flush_to_ldisc(struct work_struct *work)
1153     line discipline as we want to empty the queue */
1154     if (test_bit(TTY_FLUSHPENDING, &tty->flags))
1155     break;
1156     - if (!tty->receive_room) {
1157     + if (!tty->receive_room || seen_tail) {
1158     schedule_delayed_work(&tty->buf.work, 1);
1159     break;
1160     }
1161     diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c
1162     index 613c852..e0f7f4b 100644
1163     --- a/drivers/char/tty_io.c
1164     +++ b/drivers/char/tty_io.c
1165     @@ -553,6 +553,9 @@ void __tty_hangup(struct tty_struct *tty)
1166    
1167     tty_lock();
1168    
1169     + /* some functions below drop BTM, so we need this bit */
1170     + set_bit(TTY_HUPPING, &tty->flags);
1171     +
1172     /* inuse_filps is protected by the single tty lock,
1173     this really needs to change if we want to flush the
1174     workqueue with the lock held */
1175     @@ -572,6 +575,10 @@ void __tty_hangup(struct tty_struct *tty)
1176     }
1177     spin_unlock(&tty_files_lock);
1178    
1179     + /*
1180     + * it drops BTM and thus races with reopen
1181     + * we protect the race by TTY_HUPPING
1182     + */
1183     tty_ldisc_hangup(tty);
1184    
1185     read_lock(&tasklist_lock);
1186     @@ -609,7 +616,6 @@ void __tty_hangup(struct tty_struct *tty)
1187     tty->session = NULL;
1188     tty->pgrp = NULL;
1189     tty->ctrl_status = 0;
1190     - set_bit(TTY_HUPPED, &tty->flags);
1191     spin_unlock_irqrestore(&tty->ctrl_lock, flags);
1192    
1193     /* Account for the p->signal references we killed */
1194     @@ -635,6 +641,7 @@ void __tty_hangup(struct tty_struct *tty)
1195     * can't yet guarantee all that.
1196     */
1197     set_bit(TTY_HUPPED, &tty->flags);
1198     + clear_bit(TTY_HUPPING, &tty->flags);
1199     tty_ldisc_enable(tty);
1200    
1201     tty_unlock();
1202     @@ -1304,7 +1311,9 @@ static int tty_reopen(struct tty_struct *tty)
1203     {
1204     struct tty_driver *driver = tty->driver;
1205    
1206     - if (test_bit(TTY_CLOSING, &tty->flags))
1207     + if (test_bit(TTY_CLOSING, &tty->flags) ||
1208     + test_bit(TTY_HUPPING, &tty->flags) ||
1209     + test_bit(TTY_LDISC_CHANGING, &tty->flags))
1210     return -EIO;
1211    
1212     if (driver->type == TTY_DRIVER_TYPE_PTY &&
1213     diff --git a/drivers/char/tty_ldisc.c b/drivers/char/tty_ldisc.c
1214     index 412f977..4214d58 100644
1215     --- a/drivers/char/tty_ldisc.c
1216     +++ b/drivers/char/tty_ldisc.c
1217     @@ -47,6 +47,7 @@
1218    
1219     static DEFINE_SPINLOCK(tty_ldisc_lock);
1220     static DECLARE_WAIT_QUEUE_HEAD(tty_ldisc_wait);
1221     +static DECLARE_WAIT_QUEUE_HEAD(tty_ldisc_idle);
1222     /* Line disc dispatch table */
1223     static struct tty_ldisc_ops *tty_ldiscs[NR_LDISCS];
1224    
1225     @@ -83,6 +84,7 @@ static void put_ldisc(struct tty_ldisc *ld)
1226     return;
1227     }
1228     local_irq_restore(flags);
1229     + wake_up(&tty_ldisc_idle);
1230     }
1231    
1232     /**
1233     @@ -452,6 +454,8 @@ static int tty_ldisc_open(struct tty_struct *tty, struct tty_ldisc *ld)
1234     /* BTM here locks versus a hangup event */
1235     WARN_ON(!tty_locked());
1236     ret = ld->ops->open(tty);
1237     + if (ret)
1238     + clear_bit(TTY_LDISC_OPEN, &tty->flags);
1239     return ret;
1240     }
1241     return 0;
1242     @@ -531,6 +535,23 @@ static int tty_ldisc_halt(struct tty_struct *tty)
1243     }
1244    
1245     /**
1246     + * tty_ldisc_wait_idle - wait for the ldisc to become idle
1247     + * @tty: tty to wait for
1248     + *
1249     + * Wait for the line discipline to become idle. The discipline must
1250     + * have been halted for this to guarantee it remains idle.
1251     + */
1252     +static int tty_ldisc_wait_idle(struct tty_struct *tty)
1253     +{
1254     + int ret;
1255     + ret = wait_event_interruptible_timeout(tty_ldisc_idle,
1256     + atomic_read(&tty->ldisc->users) == 1, 5 * HZ);
1257     + if (ret < 0)
1258     + return ret;
1259     + return ret > 0 ? 0 : -EBUSY;
1260     +}
1261     +
1262     +/**
1263     * tty_set_ldisc - set line discipline
1264     * @tty: the terminal to set
1265     * @ldisc: the line discipline
1266     @@ -634,8 +655,17 @@ int tty_set_ldisc(struct tty_struct *tty, int ldisc)
1267    
1268     flush_scheduled_work();
1269    
1270     + retval = tty_ldisc_wait_idle(tty);
1271     +
1272     tty_lock();
1273     mutex_lock(&tty->ldisc_mutex);
1274     +
1275     + /* handle wait idle failure locked */
1276     + if (retval) {
1277     + tty_ldisc_put(new_ldisc);
1278     + goto enable;
1279     + }
1280     +
1281     if (test_bit(TTY_HUPPED, &tty->flags)) {
1282     /* We were raced by the hangup method. It will have stomped
1283     the ldisc data and closed the ldisc down */
1284     @@ -669,6 +699,7 @@ int tty_set_ldisc(struct tty_struct *tty, int ldisc)
1285    
1286     tty_ldisc_put(o_ldisc);
1287    
1288     +enable:
1289     /*
1290     * Allow ldisc referencing to occur again
1291     */
1292     @@ -714,9 +745,12 @@ static void tty_reset_termios(struct tty_struct *tty)
1293     * state closed
1294     */
1295    
1296     -static void tty_ldisc_reinit(struct tty_struct *tty, int ldisc)
1297     +static int tty_ldisc_reinit(struct tty_struct *tty, int ldisc)
1298     {
1299     - struct tty_ldisc *ld;
1300     + struct tty_ldisc *ld = tty_ldisc_get(ldisc);
1301     +
1302     + if (IS_ERR(ld))
1303     + return -1;
1304    
1305     tty_ldisc_close(tty, tty->ldisc);
1306     tty_ldisc_put(tty->ldisc);
1307     @@ -724,10 +758,10 @@ static void tty_ldisc_reinit(struct tty_struct *tty, int ldisc)
1308     /*
1309     * Switch the line discipline back
1310     */
1311     - ld = tty_ldisc_get(ldisc);
1312     - BUG_ON(IS_ERR(ld));
1313     tty_ldisc_assign(tty, ld);
1314     tty_set_termios_ldisc(tty, ldisc);
1315     +
1316     + return 0;
1317     }
1318    
1319     /**
1320     @@ -802,13 +836,16 @@ void tty_ldisc_hangup(struct tty_struct *tty)
1321     a FIXME */
1322     if (tty->ldisc) { /* Not yet closed */
1323     if (reset == 0) {
1324     - tty_ldisc_reinit(tty, tty->termios->c_line);
1325     - err = tty_ldisc_open(tty, tty->ldisc);
1326     +
1327     + if (!tty_ldisc_reinit(tty, tty->termios->c_line))
1328     + err = tty_ldisc_open(tty, tty->ldisc);
1329     + else
1330     + err = 1;
1331     }
1332     /* If the re-open fails or we reset then go to N_TTY. The
1333     N_TTY open cannot fail */
1334     if (reset || err) {
1335     - tty_ldisc_reinit(tty, N_TTY);
1336     + BUG_ON(tty_ldisc_reinit(tty, N_TTY));
1337     WARN_ON(tty_ldisc_open(tty, tty->ldisc));
1338     }
1339     tty_ldisc_enable(tty);
1340     diff --git a/drivers/char/vt_ioctl.c b/drivers/char/vt_ioctl.c
1341     index 38df8c1..6b68a0f 100644
1342     --- a/drivers/char/vt_ioctl.c
1343     +++ b/drivers/char/vt_ioctl.c
1344     @@ -503,6 +503,7 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
1345     struct kbd_struct * kbd;
1346     unsigned int console;
1347     unsigned char ucval;
1348     + unsigned int uival;
1349     void __user *up = (void __user *)arg;
1350     int i, perm;
1351     int ret = 0;
1352     @@ -657,7 +658,7 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
1353     break;
1354    
1355     case KDGETMODE:
1356     - ucval = vc->vc_mode;
1357     + uival = vc->vc_mode;
1358     goto setint;
1359    
1360     case KDMAPDISP:
1361     @@ -695,7 +696,7 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
1362     break;
1363    
1364     case KDGKBMODE:
1365     - ucval = ((kbd->kbdmode == VC_RAW) ? K_RAW :
1366     + uival = ((kbd->kbdmode == VC_RAW) ? K_RAW :
1367     (kbd->kbdmode == VC_MEDIUMRAW) ? K_MEDIUMRAW :
1368     (kbd->kbdmode == VC_UNICODE) ? K_UNICODE :
1369     K_XLATE);
1370     @@ -717,9 +718,9 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
1371     break;
1372    
1373     case KDGKBMETA:
1374     - ucval = (vc_kbd_mode(kbd, VC_META) ? K_ESCPREFIX : K_METABIT);
1375     + uival = (vc_kbd_mode(kbd, VC_META) ? K_ESCPREFIX : K_METABIT);
1376     setint:
1377     - ret = put_user(ucval, (int __user *)arg);
1378     + ret = put_user(uival, (int __user *)arg);
1379     break;
1380    
1381     case KDGETKEYCODE:
1382     @@ -949,7 +950,7 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
1383     for (i = 0; i < MAX_NR_CONSOLES; ++i)
1384     if (! VT_IS_IN_USE(i))
1385     break;
1386     - ucval = i < MAX_NR_CONSOLES ? (i+1) : -1;
1387     + uival = i < MAX_NR_CONSOLES ? (i+1) : -1;
1388     goto setint;
1389    
1390     /*
1391     diff --git a/drivers/crypto/padlock-aes.c b/drivers/crypto/padlock-aes.c
1392     index 2e992bc..8a515ba 100644
1393     --- a/drivers/crypto/padlock-aes.c
1394     +++ b/drivers/crypto/padlock-aes.c
1395     @@ -286,7 +286,7 @@ static inline u8 *padlock_xcrypt_cbc(const u8 *input, u8 *output, void *key,
1396     if (initial)
1397     asm volatile (".byte 0xf3,0x0f,0xa7,0xd0" /* rep xcryptcbc */
1398     : "+S" (input), "+D" (output), "+a" (iv)
1399     - : "d" (control_word), "b" (key), "c" (count));
1400     + : "d" (control_word), "b" (key), "c" (initial));
1401    
1402     asm volatile (".byte 0xf3,0x0f,0xa7,0xd0" /* rep xcryptcbc */
1403     : "+S" (input), "+D" (output), "+a" (iv)
1404     diff --git a/drivers/firewire/ohci.c b/drivers/firewire/ohci.c
1405     index 9dcb17d..7570b71 100644
1406     --- a/drivers/firewire/ohci.c
1407     +++ b/drivers/firewire/ohci.c
1408     @@ -739,7 +739,7 @@ static void ar_context_tasklet(unsigned long data)
1409     d = &ab->descriptor;
1410    
1411     if (d->res_count == 0) {
1412     - size_t size, rest, offset;
1413     + size_t size, size2, rest, pktsize, size3, offset;
1414     dma_addr_t start_bus;
1415     void *start;
1416    
1417     @@ -750,25 +750,61 @@ static void ar_context_tasklet(unsigned long data)
1418     */
1419    
1420     offset = offsetof(struct ar_buffer, data);
1421     - start = buffer = ab;
1422     + start = ab;
1423     start_bus = le32_to_cpu(ab->descriptor.data_address) - offset;
1424     + buffer = ab->data;
1425    
1426     ab = ab->next;
1427     d = &ab->descriptor;
1428     - size = buffer + PAGE_SIZE - ctx->pointer;
1429     + size = start + PAGE_SIZE - ctx->pointer;
1430     + /* valid buffer data in the next page */
1431     rest = le16_to_cpu(d->req_count) - le16_to_cpu(d->res_count);
1432     + /* what actually fits in this page */
1433     + size2 = min(rest, (size_t)PAGE_SIZE - offset - size);
1434     memmove(buffer, ctx->pointer, size);
1435     - memcpy(buffer + size, ab->data, rest);
1436     - ctx->current_buffer = ab;
1437     - ctx->pointer = (void *) ab->data + rest;
1438     - end = buffer + size + rest;
1439     + memcpy(buffer + size, ab->data, size2);
1440     +
1441     + while (size > 0) {
1442     + void *next = handle_ar_packet(ctx, buffer);
1443     + pktsize = next - buffer;
1444     + if (pktsize >= size) {
1445     + /*
1446     + * We have handled all the data that was
1447     + * originally in this page, so we can now
1448     + * continue in the next page.
1449     + */
1450     + buffer = next;
1451     + break;
1452     + }
1453     + /* move the next packet to the start of the buffer */
1454     + memmove(buffer, next, size + size2 - pktsize);
1455     + size -= pktsize;
1456     + /* fill up this page again */
1457     + size3 = min(rest - size2,
1458     + (size_t)PAGE_SIZE - offset - size - size2);
1459     + memcpy(buffer + size + size2,
1460     + (void *) ab->data + size2, size3);
1461     + size2 += size3;
1462     + }
1463    
1464     - while (buffer < end)
1465     - buffer = handle_ar_packet(ctx, buffer);
1466     + if (rest > 0) {
1467     + /* handle the packets that are fully in the next page */
1468     + buffer = (void *) ab->data +
1469     + (buffer - (start + offset + size));
1470     + end = (void *) ab->data + rest;
1471     +
1472     + while (buffer < end)
1473     + buffer = handle_ar_packet(ctx, buffer);
1474    
1475     - dma_free_coherent(ohci->card.device, PAGE_SIZE,
1476     - start, start_bus);
1477     - ar_context_add_page(ctx);
1478     + ctx->current_buffer = ab;
1479     + ctx->pointer = end;
1480     +
1481     + dma_free_coherent(ohci->card.device, PAGE_SIZE,
1482     + start, start_bus);
1483     + ar_context_add_page(ctx);
1484     + } else {
1485     + ctx->pointer = start + PAGE_SIZE;
1486     + }
1487     } else {
1488     buffer = ctx->pointer;
1489     ctx->pointer = end =
1490     diff --git a/drivers/gpio/cs5535-gpio.c b/drivers/gpio/cs5535-gpio.c
1491     index e23c068..599f6c9 100644
1492     --- a/drivers/gpio/cs5535-gpio.c
1493     +++ b/drivers/gpio/cs5535-gpio.c
1494     @@ -56,6 +56,18 @@ static struct cs5535_gpio_chip {
1495     * registers, see include/linux/cs5535.h.
1496     */
1497    
1498     +static void errata_outl(u32 val, unsigned long addr)
1499     +{
1500     + /*
1501     + * According to the CS5536 errata (#36), after suspend
1502     + * a write to the high bank GPIO register will clear all
1503     + * non-selected bits; the recommended workaround is a
1504     + * read-modify-write operation.
1505     + */
1506     + val |= inl(addr);
1507     + outl(val, addr);
1508     +}
1509     +
1510     static void __cs5535_gpio_set(struct cs5535_gpio_chip *chip, unsigned offset,
1511     unsigned int reg)
1512     {
1513     @@ -64,7 +76,7 @@ static void __cs5535_gpio_set(struct cs5535_gpio_chip *chip, unsigned offset,
1514     outl(1 << offset, chip->base + reg);
1515     else
1516     /* high bank register */
1517     - outl(1 << (offset - 16), chip->base + 0x80 + reg);
1518     + errata_outl(1 << (offset - 16), chip->base + 0x80 + reg);
1519     }
1520    
1521     void cs5535_gpio_set(unsigned offset, unsigned int reg)
1522     @@ -86,7 +98,7 @@ static void __cs5535_gpio_clear(struct cs5535_gpio_chip *chip, unsigned offset,
1523     outl(1 << (offset + 16), chip->base + reg);
1524     else
1525     /* high bank register */
1526     - outl(1 << offset, chip->base + 0x80 + reg);
1527     + errata_outl(1 << offset, chip->base + 0x80 + reg);
1528     }
1529    
1530     void cs5535_gpio_clear(unsigned offset, unsigned int reg)
1531     diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
1532     index 2dd2c93..71c69b8 100644
1533     --- a/drivers/gpu/drm/i915/i915_dma.c
1534     +++ b/drivers/gpu/drm/i915/i915_dma.c
1535     @@ -2306,6 +2306,9 @@ int i915_driver_unload(struct drm_device *dev)
1536     i915_gem_lastclose(dev);
1537    
1538     intel_cleanup_overlay(dev);
1539     +
1540     + if (!I915_NEED_GFX_HWS(dev))
1541     + i915_free_hws(dev);
1542     }
1543    
1544     intel_teardown_mchbar(dev);
1545     diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
1546     index 744225e..477e4ac 100644
1547     --- a/drivers/gpu/drm/i915/i915_irq.c
1548     +++ b/drivers/gpu/drm/i915/i915_irq.c
1549     @@ -310,6 +310,7 @@ irqreturn_t ironlake_irq_handler(struct drm_device *dev)
1550     drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
1551     int ret = IRQ_NONE;
1552     u32 de_iir, gt_iir, de_ier, pch_iir;
1553     + u32 hotplug_mask;
1554     struct drm_i915_master_private *master_priv;
1555     struct intel_ring_buffer *render_ring = &dev_priv->render_ring;
1556    
1557     @@ -325,6 +326,11 @@ irqreturn_t ironlake_irq_handler(struct drm_device *dev)
1558     if (de_iir == 0 && gt_iir == 0 && pch_iir == 0)
1559     goto done;
1560    
1561     + if (HAS_PCH_CPT(dev))
1562     + hotplug_mask = SDE_HOTPLUG_MASK_CPT;
1563     + else
1564     + hotplug_mask = SDE_HOTPLUG_MASK;
1565     +
1566     ret = IRQ_HANDLED;
1567    
1568     if (dev->primary->master) {
1569     @@ -366,10 +372,8 @@ irqreturn_t ironlake_irq_handler(struct drm_device *dev)
1570     drm_handle_vblank(dev, 1);
1571    
1572     /* check event from PCH */
1573     - if ((de_iir & DE_PCH_EVENT) &&
1574     - (pch_iir & SDE_HOTPLUG_MASK)) {
1575     + if ((de_iir & DE_PCH_EVENT) && (pch_iir & hotplug_mask))
1576     queue_work(dev_priv->wq, &dev_priv->hotplug_work);
1577     - }
1578    
1579     if (de_iir & DE_PCU_EVENT) {
1580     I915_WRITE16(MEMINTRSTS, I915_READ(MEMINTRSTS));
1581     @@ -1424,8 +1428,7 @@ static int ironlake_irq_postinstall(struct drm_device *dev)
1582     u32 display_mask = DE_MASTER_IRQ_CONTROL | DE_GSE | DE_PCH_EVENT |
1583     DE_PLANEA_FLIP_DONE | DE_PLANEB_FLIP_DONE;
1584     u32 render_mask = GT_PIPE_NOTIFY | GT_BSD_USER_INTERRUPT;
1585     - u32 hotplug_mask = SDE_CRT_HOTPLUG | SDE_PORTB_HOTPLUG |
1586     - SDE_PORTC_HOTPLUG | SDE_PORTD_HOTPLUG;
1587     + u32 hotplug_mask;
1588    
1589     dev_priv->irq_mask_reg = ~display_mask;
1590     dev_priv->de_irq_enable_reg = display_mask | DE_PIPEA_VBLANK | DE_PIPEB_VBLANK;
1591     @@ -1450,6 +1453,14 @@ static int ironlake_irq_postinstall(struct drm_device *dev)
1592     I915_WRITE(GTIER, dev_priv->gt_irq_enable_reg);
1593     (void) I915_READ(GTIER);
1594    
1595     + if (HAS_PCH_CPT(dev)) {
1596     + hotplug_mask = SDE_CRT_HOTPLUG_CPT | SDE_PORTB_HOTPLUG_CPT |
1597     + SDE_PORTC_HOTPLUG_CPT | SDE_PORTD_HOTPLUG_CPT ;
1598     + } else {
1599     + hotplug_mask = SDE_CRT_HOTPLUG | SDE_PORTB_HOTPLUG |
1600     + SDE_PORTC_HOTPLUG | SDE_PORTD_HOTPLUG;
1601     + }
1602     +
1603     dev_priv->pch_irq_mask_reg = ~hotplug_mask;
1604     dev_priv->pch_irq_enable_reg = hotplug_mask;
1605    
1606     diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
1607     index 4f5e155..249addb 100644
1608     --- a/drivers/gpu/drm/i915/i915_reg.h
1609     +++ b/drivers/gpu/drm/i915/i915_reg.h
1610     @@ -2551,6 +2551,10 @@
1611     #define SDE_PORTD_HOTPLUG_CPT (1 << 23)
1612     #define SDE_PORTC_HOTPLUG_CPT (1 << 22)
1613     #define SDE_PORTB_HOTPLUG_CPT (1 << 21)
1614     +#define SDE_HOTPLUG_MASK_CPT (SDE_CRT_HOTPLUG_CPT | \
1615     + SDE_PORTD_HOTPLUG_CPT | \
1616     + SDE_PORTC_HOTPLUG_CPT | \
1617     + SDE_PORTB_HOTPLUG_CPT)
1618    
1619     #define SDEISR 0xc4000
1620     #define SDEIMR 0xc4004
1621     @@ -2722,6 +2726,9 @@
1622     #define FDI_RXB_CHICKEN 0xc2010
1623     #define FDI_RX_PHASE_SYNC_POINTER_ENABLE (1)
1624    
1625     +#define SOUTH_DSPCLK_GATE_D 0xc2020
1626     +#define PCH_DPLSUNIT_CLOCK_GATE_DISABLE (1<<29)
1627     +
1628     /* CPU: FDI_TX */
1629     #define FDI_TXA_CTL 0x60100
1630     #define FDI_TXB_CTL 0x61100
1631     diff --git a/drivers/gpu/drm/i915/i915_suspend.c b/drivers/gpu/drm/i915/i915_suspend.c
1632     index 31f0858..2df5b9a 100644
1633     --- a/drivers/gpu/drm/i915/i915_suspend.c
1634     +++ b/drivers/gpu/drm/i915/i915_suspend.c
1635     @@ -862,8 +862,10 @@ int i915_restore_state(struct drm_device *dev)
1636     /* Clock gating state */
1637     intel_init_clock_gating(dev);
1638    
1639     - if (HAS_PCH_SPLIT(dev))
1640     + if (HAS_PCH_SPLIT(dev)) {
1641     ironlake_enable_drps(dev);
1642     + intel_init_emon(dev);
1643     + }
1644    
1645     /* Cache mode state */
1646     I915_WRITE (CACHE_MODE_0, dev_priv->saveCACHE_MODE_0 | 0xffff0000);
1647     diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c
1648     index 197d4f3..0f950e7 100644
1649     --- a/drivers/gpu/drm/i915/intel_crt.c
1650     +++ b/drivers/gpu/drm/i915/intel_crt.c
1651     @@ -191,7 +191,8 @@ static bool intel_ironlake_crt_detect_hotplug(struct drm_connector *connector)
1652     DRM_DEBUG_KMS("timed out waiting for FORCE_TRIGGER");
1653    
1654     if (turn_off_dac) {
1655     - I915_WRITE(PCH_ADPA, temp);
1656     + /* Make sure hotplug is enabled */
1657     + I915_WRITE(PCH_ADPA, temp | ADPA_CRT_HOTPLUG_ENABLE);
1658     (void)I915_READ(PCH_ADPA);
1659     }
1660    
1661     diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
1662     index 9792285..e92ba16 100644
1663     --- a/drivers/gpu/drm/i915/intel_display.c
1664     +++ b/drivers/gpu/drm/i915/intel_display.c
1665     @@ -5674,6 +5674,13 @@ void intel_init_clock_gating(struct drm_device *dev)
1666     I915_WRITE(PCH_DSPCLK_GATE_D, dspclk_gate);
1667    
1668     /*
1669     + * On Ibex Peak and Cougar Point, we need to disable clock
1670     + * gating for the panel power sequencer or it will fail to
1671     + * start up when no ports are active.
1672     + */
1673     + I915_WRITE(SOUTH_DSPCLK_GATE_D, PCH_DPLSUNIT_CLOCK_GATE_DISABLE);
1674     +
1675     + /*
1676     * According to the spec the following bits should be set in
1677     * order to enable memory self-refresh
1678     * The bit 22/21 of 0x42004
1679     diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
1680     index 8828b3a..2b16137 100644
1681     --- a/drivers/gpu/drm/i915/intel_drv.h
1682     +++ b/drivers/gpu/drm/i915/intel_drv.h
1683     @@ -250,6 +250,7 @@ extern void intel_crtc_fb_gamma_get(struct drm_crtc *crtc, u16 *red, u16 *green,
1684     extern void intel_init_clock_gating(struct drm_device *dev);
1685     extern void ironlake_enable_drps(struct drm_device *dev);
1686     extern void ironlake_disable_drps(struct drm_device *dev);
1687     +extern void intel_init_emon(struct drm_device *dev);
1688    
1689     extern int intel_pin_and_fence_fb_obj(struct drm_device *dev,
1690     struct drm_gem_object *obj);
1691     diff --git a/drivers/gpu/drm/i915/intel_overlay.c b/drivers/gpu/drm/i915/intel_overlay.c
1692     index 1d306a4..7436641 100644
1693     --- a/drivers/gpu/drm/i915/intel_overlay.c
1694     +++ b/drivers/gpu/drm/i915/intel_overlay.c
1695     @@ -1367,6 +1367,12 @@ void intel_setup_overlay(struct drm_device *dev)
1696     goto out_free_bo;
1697     }
1698     overlay->flip_addr = overlay->reg_bo->gtt_offset;
1699     +
1700     + ret = i915_gem_object_set_to_gtt_domain(reg_bo, true);
1701     + if (ret) {
1702     + DRM_ERROR("failed to move overlay register bo into the GTT\n");
1703     + goto out_unpin_bo;
1704     + }
1705     } else {
1706     ret = i915_gem_attach_phys_object(dev, reg_bo,
1707     I915_GEM_PHYS_OVERLAY_REGS,
1708     @@ -1399,6 +1405,8 @@ void intel_setup_overlay(struct drm_device *dev)
1709     DRM_INFO("initialized overlay support\n");
1710     return;
1711    
1712     +out_unpin_bo:
1713     + i915_gem_object_unpin(reg_bo);
1714     out_free_bo:
1715     drm_gem_object_unreference(reg_bo);
1716     out_free:
1717     diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c
1718     index ee73e42..b60652b 100644
1719     --- a/drivers/gpu/drm/i915/intel_sdvo.c
1720     +++ b/drivers/gpu/drm/i915/intel_sdvo.c
1721     @@ -1498,10 +1498,12 @@ intel_sdvo_detect(struct drm_connector *connector, bool force)
1722     if (!intel_sdvo_write_cmd(intel_sdvo,
1723     SDVO_CMD_GET_ATTACHED_DISPLAYS, NULL, 0))
1724     return connector_status_unknown;
1725     - if (intel_sdvo->is_tv) {
1726     - /* add 30ms delay when the output type is SDVO-TV */
1727     +
1728     + /* add 30ms delay when the output type might be TV */
1729     + if (intel_sdvo->caps.output_flags &
1730     + (SDVO_OUTPUT_SVID0 | SDVO_OUTPUT_CVBS0))
1731     mdelay(30);
1732     - }
1733     +
1734     if (!intel_sdvo_read_response(intel_sdvo, &response, 2))
1735     return connector_status_unknown;
1736    
1737     diff --git a/drivers/gpu/drm/radeon/atom.c b/drivers/gpu/drm/radeon/atom.c
1738     index 8e421f6..05efb5b 100644
1739     --- a/drivers/gpu/drm/radeon/atom.c
1740     +++ b/drivers/gpu/drm/radeon/atom.c
1741     @@ -112,6 +112,7 @@ static uint32_t atom_iio_execute(struct atom_context *ctx, int base,
1742     base += 3;
1743     break;
1744     case ATOM_IIO_WRITE:
1745     + (void)ctx->card->ioreg_read(ctx->card, CU16(base + 1));
1746     ctx->card->ioreg_write(ctx->card, CU16(base + 1), temp);
1747     base += 3;
1748     break;
1749     diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c
1750     index e594223..0ba4163 100644
1751     --- a/drivers/gpu/drm/radeon/r100.c
1752     +++ b/drivers/gpu/drm/radeon/r100.c
1753     @@ -2318,6 +2318,9 @@ void r100_vram_init_sizes(struct radeon_device *rdev)
1754     /* Fix for RN50, M6, M7 with 8/16/32(??) MBs of VRAM -
1755     * Novell bug 204882 + along with lots of ubuntu ones
1756     */
1757     + if (rdev->mc.aper_size > config_aper_size)
1758     + config_aper_size = rdev->mc.aper_size;
1759     +
1760     if (config_aper_size > rdev->mc.real_vram_size)
1761     rdev->mc.mc_vram_size = config_aper_size;
1762     else
1763     @@ -3225,6 +3228,8 @@ static int r100_cs_track_texture_check(struct radeon_device *rdev,
1764     for (u = 0; u < track->num_texture; u++) {
1765     if (!track->textures[u].enabled)
1766     continue;
1767     + if (track->textures[u].lookup_disable)
1768     + continue;
1769     robj = track->textures[u].robj;
1770     if (robj == NULL) {
1771     DRM_ERROR("No texture bound to unit %u\n", u);
1772     @@ -3459,6 +3464,7 @@ void r100_cs_track_clear(struct radeon_device *rdev, struct r100_cs_track *track
1773     track->textures[i].robj = NULL;
1774     /* CS IB emission code makes sure texture unit are disabled */
1775     track->textures[i].enabled = false;
1776     + track->textures[i].lookup_disable = false;
1777     track->textures[i].roundup_w = true;
1778     track->textures[i].roundup_h = true;
1779     if (track->separate_cube)
1780     diff --git a/drivers/gpu/drm/radeon/r100_track.h b/drivers/gpu/drm/radeon/r100_track.h
1781     index f47cdca..af65600 100644
1782     --- a/drivers/gpu/drm/radeon/r100_track.h
1783     +++ b/drivers/gpu/drm/radeon/r100_track.h
1784     @@ -46,6 +46,7 @@ struct r100_cs_track_texture {
1785     unsigned height_11;
1786     bool use_pitch;
1787     bool enabled;
1788     + bool lookup_disable;
1789     bool roundup_w;
1790     bool roundup_h;
1791     unsigned compress_format;
1792     diff --git a/drivers/gpu/drm/radeon/r200.c b/drivers/gpu/drm/radeon/r200.c
1793     index 0266d72..d2408c3 100644
1794     --- a/drivers/gpu/drm/radeon/r200.c
1795     +++ b/drivers/gpu/drm/radeon/r200.c
1796     @@ -447,6 +447,8 @@ int r200_packet0_check(struct radeon_cs_parser *p,
1797     track->textures[i].width = 1 << ((idx_value >> RADEON_TXFORMAT_WIDTH_SHIFT) & RADEON_TXFORMAT_WIDTH_MASK);
1798     track->textures[i].height = 1 << ((idx_value >> RADEON_TXFORMAT_HEIGHT_SHIFT) & RADEON_TXFORMAT_HEIGHT_MASK);
1799     }
1800     + if (idx_value & R200_TXFORMAT_LOOKUP_DISABLE)
1801     + track->textures[i].lookup_disable = true;
1802     switch ((idx_value & RADEON_TXFORMAT_FORMAT_MASK)) {
1803     case R200_TXFORMAT_I8:
1804     case R200_TXFORMAT_RGB332:
1805     diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
1806     index 7b65e4e..d4503df 100644
1807     --- a/drivers/gpu/drm/radeon/r600.c
1808     +++ b/drivers/gpu/drm/radeon/r600.c
1809     @@ -97,14 +97,8 @@ u32 rv6xx_get_temp(struct radeon_device *rdev)
1810     {
1811     u32 temp = (RREG32(CG_THERMAL_STATUS) & ASIC_T_MASK) >>
1812     ASIC_T_SHIFT;
1813     - u32 actual_temp = 0;
1814    
1815     - if ((temp >> 7) & 1)
1816     - actual_temp = 0;
1817     - else
1818     - actual_temp = (temp >> 1) & 0xff;
1819     -
1820     - return actual_temp * 1000;
1821     + return temp * 1000;
1822     }
1823    
1824     void r600_pm_get_dynpm_state(struct radeon_device *rdev)
1825     @@ -1608,8 +1602,11 @@ void r600_gpu_init(struct radeon_device *rdev)
1826     rdev->config.r600.tiling_npipes = rdev->config.r600.max_tile_pipes;
1827     rdev->config.r600.tiling_nbanks = 4 << ((ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT);
1828     tiling_config |= BANK_TILING((ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT);
1829     - tiling_config |= GROUP_SIZE(0);
1830     - rdev->config.r600.tiling_group_size = 256;
1831     + tiling_config |= GROUP_SIZE((ramcfg & BURSTLENGTH_MASK) >> BURSTLENGTH_SHIFT);
1832     + if ((ramcfg & BURSTLENGTH_MASK) >> BURSTLENGTH_SHIFT)
1833     + rdev->config.r600.tiling_group_size = 512;
1834     + else
1835     + rdev->config.r600.tiling_group_size = 256;
1836     tmp = (ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT;
1837     if (tmp > 3) {
1838     tiling_config |= ROW_TILING(3);
1839     diff --git a/drivers/gpu/drm/radeon/r600_blit_kms.c b/drivers/gpu/drm/radeon/r600_blit_kms.c
1840     index 3473c00..e5d4928 100644
1841     --- a/drivers/gpu/drm/radeon/r600_blit_kms.c
1842     +++ b/drivers/gpu/drm/radeon/r600_blit_kms.c
1843     @@ -650,8 +650,8 @@ void r600_kms_blit_copy(struct radeon_device *rdev,
1844     int src_x = src_gpu_addr & 255;
1845     int dst_x = dst_gpu_addr & 255;
1846     int h = 1;
1847     - src_gpu_addr = src_gpu_addr & ~255;
1848     - dst_gpu_addr = dst_gpu_addr & ~255;
1849     + src_gpu_addr = src_gpu_addr & ~255ULL;
1850     + dst_gpu_addr = dst_gpu_addr & ~255ULL;
1851    
1852     if (!src_x && !dst_x) {
1853     h = (cur_size / max_bytes);
1854     @@ -744,8 +744,8 @@ void r600_kms_blit_copy(struct radeon_device *rdev,
1855     int src_x = (src_gpu_addr & 255);
1856     int dst_x = (dst_gpu_addr & 255);
1857     int h = 1;
1858     - src_gpu_addr = src_gpu_addr & ~255;
1859     - dst_gpu_addr = dst_gpu_addr & ~255;
1860     + src_gpu_addr = src_gpu_addr & ~255ULL;
1861     + dst_gpu_addr = dst_gpu_addr & ~255ULL;
1862    
1863     if (!src_x && !dst_x) {
1864     h = (cur_size / max_bytes);
1865     diff --git a/drivers/gpu/drm/radeon/r600_cs.c b/drivers/gpu/drm/radeon/r600_cs.c
1866     index 250a3a9..478fddf 100644
1867     --- a/drivers/gpu/drm/radeon/r600_cs.c
1868     +++ b/drivers/gpu/drm/radeon/r600_cs.c
1869     @@ -228,7 +228,7 @@ static inline int r600_cs_track_validate_cb(struct radeon_cs_parser *p, int i)
1870     __func__, __LINE__, pitch);
1871     return -EINVAL;
1872     }
1873     - if (!IS_ALIGNED((height / 8), track->nbanks)) {
1874     + if (!IS_ALIGNED((height / 8), track->npipes)) {
1875     dev_warn(p->dev, "%s:%d cb height (%d) invalid\n",
1876     __func__, __LINE__, height);
1877     return -EINVAL;
1878     @@ -367,7 +367,7 @@ static int r600_cs_track_check(struct radeon_cs_parser *p)
1879     __func__, __LINE__, pitch);
1880     return -EINVAL;
1881     }
1882     - if ((height / 8) & (track->nbanks - 1)) {
1883     + if (!IS_ALIGNED((height / 8), track->npipes)) {
1884     dev_warn(p->dev, "%s:%d db height (%d) invalid\n",
1885     __func__, __LINE__, height);
1886     return -EINVAL;
1887     diff --git a/drivers/gpu/drm/radeon/r600_reg.h b/drivers/gpu/drm/radeon/r600_reg.h
1888     index d84612a..33cda01 100644
1889     --- a/drivers/gpu/drm/radeon/r600_reg.h
1890     +++ b/drivers/gpu/drm/radeon/r600_reg.h
1891     @@ -86,6 +86,7 @@
1892     #define R600_HDP_NONSURFACE_BASE 0x2c04
1893    
1894     #define R600_BUS_CNTL 0x5420
1895     +# define R600_BIOS_ROM_DIS (1 << 1)
1896     #define R600_CONFIG_CNTL 0x5424
1897     #define R600_CONFIG_MEMSIZE 0x5428
1898     #define R600_CONFIG_F0_BASE 0x542C
1899     diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c
1900     index 8e43dda..3779265 100644
1901     --- a/drivers/gpu/drm/radeon/radeon_atombios.c
1902     +++ b/drivers/gpu/drm/radeon/radeon_atombios.c
1903     @@ -98,6 +98,14 @@ static inline struct radeon_i2c_bus_rec radeon_lookup_i2c_gpio(struct radeon_dev
1904     }
1905     }
1906    
1907     + /* some DCE3 boards have bad data for this entry */
1908     + if (ASIC_IS_DCE3(rdev)) {
1909     + if ((i == 4) &&
1910     + (gpio->usClkMaskRegisterIndex == 0x1fda) &&
1911     + (gpio->sucI2cId.ucAccess == 0x94))
1912     + gpio->sucI2cId.ucAccess = 0x14;
1913     + }
1914     +
1915     if (gpio->sucI2cId.ucAccess == id) {
1916     i2c.mask_clk_reg = le16_to_cpu(gpio->usClkMaskRegisterIndex) * 4;
1917     i2c.mask_data_reg = le16_to_cpu(gpio->usDataMaskRegisterIndex) * 4;
1918     @@ -174,6 +182,14 @@ void radeon_atombios_i2c_init(struct radeon_device *rdev)
1919     }
1920     }
1921    
1922     + /* some DCE3 boards have bad data for this entry */
1923     + if (ASIC_IS_DCE3(rdev)) {
1924     + if ((i == 4) &&
1925     + (gpio->usClkMaskRegisterIndex == 0x1fda) &&
1926     + (gpio->sucI2cId.ucAccess == 0x94))
1927     + gpio->sucI2cId.ucAccess = 0x14;
1928     + }
1929     +
1930     i2c.mask_clk_reg = le16_to_cpu(gpio->usClkMaskRegisterIndex) * 4;
1931     i2c.mask_data_reg = le16_to_cpu(gpio->usDataMaskRegisterIndex) * 4;
1932     i2c.en_clk_reg = le16_to_cpu(gpio->usClkEnRegisterIndex) * 4;
1933     diff --git a/drivers/gpu/drm/radeon/radeon_bios.c b/drivers/gpu/drm/radeon/radeon_bios.c
1934     index 654787e..8f2c7b5 100644
1935     --- a/drivers/gpu/drm/radeon/radeon_bios.c
1936     +++ b/drivers/gpu/drm/radeon/radeon_bios.c
1937     @@ -130,6 +130,7 @@ static bool radeon_atrm_get_bios(struct radeon_device *rdev)
1938     }
1939     return true;
1940     }
1941     +
1942     static bool r700_read_disabled_bios(struct radeon_device *rdev)
1943     {
1944     uint32_t viph_control;
1945     @@ -143,7 +144,7 @@ static bool r700_read_disabled_bios(struct radeon_device *rdev)
1946     bool r;
1947    
1948     viph_control = RREG32(RADEON_VIPH_CONTROL);
1949     - bus_cntl = RREG32(RADEON_BUS_CNTL);
1950     + bus_cntl = RREG32(R600_BUS_CNTL);
1951     d1vga_control = RREG32(AVIVO_D1VGA_CONTROL);
1952     d2vga_control = RREG32(AVIVO_D2VGA_CONTROL);
1953     vga_render_control = RREG32(AVIVO_VGA_RENDER_CONTROL);
1954     @@ -152,7 +153,7 @@ static bool r700_read_disabled_bios(struct radeon_device *rdev)
1955     /* disable VIP */
1956     WREG32(RADEON_VIPH_CONTROL, (viph_control & ~RADEON_VIPH_EN));
1957     /* enable the rom */
1958     - WREG32(RADEON_BUS_CNTL, (bus_cntl & ~RADEON_BUS_BIOS_DIS_ROM));
1959     + WREG32(R600_BUS_CNTL, (bus_cntl & ~R600_BIOS_ROM_DIS));
1960     /* Disable VGA mode */
1961     WREG32(AVIVO_D1VGA_CONTROL,
1962     (d1vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE |
1963     @@ -191,7 +192,7 @@ static bool r700_read_disabled_bios(struct radeon_device *rdev)
1964     cg_spll_status = RREG32(R600_CG_SPLL_STATUS);
1965     }
1966     WREG32(RADEON_VIPH_CONTROL, viph_control);
1967     - WREG32(RADEON_BUS_CNTL, bus_cntl);
1968     + WREG32(R600_BUS_CNTL, bus_cntl);
1969     WREG32(AVIVO_D1VGA_CONTROL, d1vga_control);
1970     WREG32(AVIVO_D2VGA_CONTROL, d2vga_control);
1971     WREG32(AVIVO_VGA_RENDER_CONTROL, vga_render_control);
1972     @@ -216,7 +217,7 @@ static bool r600_read_disabled_bios(struct radeon_device *rdev)
1973     bool r;
1974    
1975     viph_control = RREG32(RADEON_VIPH_CONTROL);
1976     - bus_cntl = RREG32(RADEON_BUS_CNTL);
1977     + bus_cntl = RREG32(R600_BUS_CNTL);
1978     d1vga_control = RREG32(AVIVO_D1VGA_CONTROL);
1979     d2vga_control = RREG32(AVIVO_D2VGA_CONTROL);
1980     vga_render_control = RREG32(AVIVO_VGA_RENDER_CONTROL);
1981     @@ -231,7 +232,7 @@ static bool r600_read_disabled_bios(struct radeon_device *rdev)
1982     /* disable VIP */
1983     WREG32(RADEON_VIPH_CONTROL, (viph_control & ~RADEON_VIPH_EN));
1984     /* enable the rom */
1985     - WREG32(RADEON_BUS_CNTL, (bus_cntl & ~RADEON_BUS_BIOS_DIS_ROM));
1986     + WREG32(R600_BUS_CNTL, (bus_cntl & ~R600_BIOS_ROM_DIS));
1987     /* Disable VGA mode */
1988     WREG32(AVIVO_D1VGA_CONTROL,
1989     (d1vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE |
1990     @@ -262,7 +263,7 @@ static bool r600_read_disabled_bios(struct radeon_device *rdev)
1991    
1992     /* restore regs */
1993     WREG32(RADEON_VIPH_CONTROL, viph_control);
1994     - WREG32(RADEON_BUS_CNTL, bus_cntl);
1995     + WREG32(R600_BUS_CNTL, bus_cntl);
1996     WREG32(AVIVO_D1VGA_CONTROL, d1vga_control);
1997     WREG32(AVIVO_D2VGA_CONTROL, d2vga_control);
1998     WREG32(AVIVO_VGA_RENDER_CONTROL, vga_render_control);
1999     diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c
2000     index 7b7ea26..137b807 100644
2001     --- a/drivers/gpu/drm/radeon/radeon_combios.c
2002     +++ b/drivers/gpu/drm/radeon/radeon_combios.c
2003     @@ -571,6 +571,7 @@ static struct radeon_i2c_bus_rec combios_setup_i2c_bus(struct radeon_device *rde
2004     }
2005    
2006     if (clk_mask && data_mask) {
2007     + /* system specific masks */
2008     i2c.mask_clk_mask = clk_mask;
2009     i2c.mask_data_mask = data_mask;
2010     i2c.a_clk_mask = clk_mask;
2011     @@ -579,7 +580,19 @@ static struct radeon_i2c_bus_rec combios_setup_i2c_bus(struct radeon_device *rde
2012     i2c.en_data_mask = data_mask;
2013     i2c.y_clk_mask = clk_mask;
2014     i2c.y_data_mask = data_mask;
2015     + } else if ((ddc_line == RADEON_GPIOPAD_MASK) ||
2016     + (ddc_line == RADEON_MDGPIO_MASK)) {
2017     + /* default gpiopad masks */
2018     + i2c.mask_clk_mask = (0x20 << 8);
2019     + i2c.mask_data_mask = 0x80;
2020     + i2c.a_clk_mask = (0x20 << 8);
2021     + i2c.a_data_mask = 0x80;
2022     + i2c.en_clk_mask = (0x20 << 8);
2023     + i2c.en_data_mask = 0x80;
2024     + i2c.y_clk_mask = (0x20 << 8);
2025     + i2c.y_data_mask = 0x80;
2026     } else {
2027     + /* default masks for ddc pads */
2028     i2c.mask_clk_mask = RADEON_GPIO_EN_1;
2029     i2c.mask_data_mask = RADEON_GPIO_EN_0;
2030     i2c.a_clk_mask = RADEON_GPIO_A_1;
2031     @@ -716,7 +729,7 @@ void radeon_combios_i2c_init(struct radeon_device *rdev)
2032     clk = RBIOS8(offset + 3 + (i * 5) + 3);
2033     data = RBIOS8(offset + 3 + (i * 5) + 4);
2034     i2c = combios_setup_i2c_bus(rdev, DDC_MONID,
2035     - clk, data);
2036     + (1 << clk), (1 << data));
2037     rdev->i2c_bus[4] = radeon_i2c_create(dev, &i2c, "GPIOPAD_MASK");
2038     break;
2039     }
2040     diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c
2041     index ecc1a8f..5e222c9 100644
2042     --- a/drivers/gpu/drm/radeon/radeon_connectors.c
2043     +++ b/drivers/gpu/drm/radeon/radeon_connectors.c
2044     @@ -1119,6 +1119,8 @@ radeon_add_atom_connector(struct drm_device *dev,
2045     /* no HPD on analog connectors */
2046     radeon_connector->hpd.hpd = RADEON_HPD_NONE;
2047     connector->polled = DRM_CONNECTOR_POLL_CONNECT;
2048     + connector->interlace_allowed = true;
2049     + connector->doublescan_allowed = true;
2050     break;
2051     case DRM_MODE_CONNECTOR_DVIA:
2052     drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
2053     @@ -1134,6 +1136,8 @@ radeon_add_atom_connector(struct drm_device *dev,
2054     1);
2055     /* no HPD on analog connectors */
2056     radeon_connector->hpd.hpd = RADEON_HPD_NONE;
2057     + connector->interlace_allowed = true;
2058     + connector->doublescan_allowed = true;
2059     break;
2060     case DRM_MODE_CONNECTOR_DVII:
2061     case DRM_MODE_CONNECTOR_DVID:
2062     @@ -1163,6 +1167,11 @@ radeon_add_atom_connector(struct drm_device *dev,
2063     rdev->mode_info.load_detect_property,
2064     1);
2065     }
2066     + connector->interlace_allowed = true;
2067     + if (connector_type == DRM_MODE_CONNECTOR_DVII)
2068     + connector->doublescan_allowed = true;
2069     + else
2070     + connector->doublescan_allowed = false;
2071     break;
2072     case DRM_MODE_CONNECTOR_HDMIA:
2073     case DRM_MODE_CONNECTOR_HDMIB:
2074     @@ -1186,6 +1195,11 @@ radeon_add_atom_connector(struct drm_device *dev,
2075     rdev->mode_info.underscan_property,
2076     UNDERSCAN_AUTO);
2077     subpixel_order = SubPixelHorizontalRGB;
2078     + connector->interlace_allowed = true;
2079     + if (connector_type == DRM_MODE_CONNECTOR_HDMIB)
2080     + connector->doublescan_allowed = true;
2081     + else
2082     + connector->doublescan_allowed = false;
2083     break;
2084     case DRM_MODE_CONNECTOR_DisplayPort:
2085     case DRM_MODE_CONNECTOR_eDP:
2086     @@ -1216,6 +1230,9 @@ radeon_add_atom_connector(struct drm_device *dev,
2087     drm_connector_attach_property(&radeon_connector->base,
2088     rdev->mode_info.underscan_property,
2089     UNDERSCAN_AUTO);
2090     + connector->interlace_allowed = true;
2091     + /* in theory with a DP to VGA converter... */
2092     + connector->doublescan_allowed = false;
2093     break;
2094     case DRM_MODE_CONNECTOR_SVIDEO:
2095     case DRM_MODE_CONNECTOR_Composite:
2096     @@ -1231,6 +1248,8 @@ radeon_add_atom_connector(struct drm_device *dev,
2097     radeon_atombios_get_tv_info(rdev));
2098     /* no HPD on analog connectors */
2099     radeon_connector->hpd.hpd = RADEON_HPD_NONE;
2100     + connector->interlace_allowed = false;
2101     + connector->doublescan_allowed = false;
2102     break;
2103     case DRM_MODE_CONNECTOR_LVDS:
2104     radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
2105     @@ -1249,6 +1268,8 @@ radeon_add_atom_connector(struct drm_device *dev,
2106     dev->mode_config.scaling_mode_property,
2107     DRM_MODE_SCALE_FULLSCREEN);
2108     subpixel_order = SubPixelHorizontalRGB;
2109     + connector->interlace_allowed = false;
2110     + connector->doublescan_allowed = false;
2111     break;
2112     }
2113    
2114     @@ -1326,6 +1347,8 @@ radeon_add_legacy_connector(struct drm_device *dev,
2115     /* no HPD on analog connectors */
2116     radeon_connector->hpd.hpd = RADEON_HPD_NONE;
2117     connector->polled = DRM_CONNECTOR_POLL_CONNECT;
2118     + connector->interlace_allowed = true;
2119     + connector->doublescan_allowed = true;
2120     break;
2121     case DRM_MODE_CONNECTOR_DVIA:
2122     drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
2123     @@ -1341,6 +1364,8 @@ radeon_add_legacy_connector(struct drm_device *dev,
2124     1);
2125     /* no HPD on analog connectors */
2126     radeon_connector->hpd.hpd = RADEON_HPD_NONE;
2127     + connector->interlace_allowed = true;
2128     + connector->doublescan_allowed = true;
2129     break;
2130     case DRM_MODE_CONNECTOR_DVII:
2131     case DRM_MODE_CONNECTOR_DVID:
2132     @@ -1358,6 +1383,11 @@ radeon_add_legacy_connector(struct drm_device *dev,
2133     1);
2134     }
2135     subpixel_order = SubPixelHorizontalRGB;
2136     + connector->interlace_allowed = true;
2137     + if (connector_type == DRM_MODE_CONNECTOR_DVII)
2138     + connector->doublescan_allowed = true;
2139     + else
2140     + connector->doublescan_allowed = false;
2141     break;
2142     case DRM_MODE_CONNECTOR_SVIDEO:
2143     case DRM_MODE_CONNECTOR_Composite:
2144     @@ -1380,6 +1410,8 @@ radeon_add_legacy_connector(struct drm_device *dev,
2145     radeon_combios_get_tv_info(rdev));
2146     /* no HPD on analog connectors */
2147     radeon_connector->hpd.hpd = RADEON_HPD_NONE;
2148     + connector->interlace_allowed = false;
2149     + connector->doublescan_allowed = false;
2150     break;
2151     case DRM_MODE_CONNECTOR_LVDS:
2152     drm_connector_init(dev, &radeon_connector->base, &radeon_lvds_connector_funcs, connector_type);
2153     @@ -1393,6 +1425,8 @@ radeon_add_legacy_connector(struct drm_device *dev,
2154     dev->mode_config.scaling_mode_property,
2155     DRM_MODE_SCALE_FULLSCREEN);
2156     subpixel_order = SubPixelHorizontalRGB;
2157     + connector->interlace_allowed = false;
2158     + connector->doublescan_allowed = false;
2159     break;
2160     }
2161    
2162     diff --git a/drivers/gpu/drm/radeon/radeon_encoders.c b/drivers/gpu/drm/radeon/radeon_encoders.c
2163     index 2c293e8..b82015e 100644
2164     --- a/drivers/gpu/drm/radeon/radeon_encoders.c
2165     +++ b/drivers/gpu/drm/radeon/radeon_encoders.c
2166     @@ -595,6 +595,7 @@ atombios_digital_setup(struct drm_encoder *encoder, int action)
2167     int
2168     atombios_get_encoder_mode(struct drm_encoder *encoder)
2169     {
2170     + struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
2171     struct drm_device *dev = encoder->dev;
2172     struct radeon_device *rdev = dev->dev_private;
2173     struct drm_connector *connector;
2174     @@ -602,9 +603,20 @@ atombios_get_encoder_mode(struct drm_encoder *encoder)
2175     struct radeon_connector_atom_dig *dig_connector;
2176    
2177     connector = radeon_get_connector_for_encoder(encoder);
2178     - if (!connector)
2179     - return 0;
2180     -
2181     + if (!connector) {
2182     + switch (radeon_encoder->encoder_id) {
2183     + case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
2184     + case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
2185     + case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
2186     + case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
2187     + case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
2188     + return ATOM_ENCODER_MODE_DVI;
2189     + case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1:
2190     + case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2:
2191     + default:
2192     + return ATOM_ENCODER_MODE_CRT;
2193     + }
2194     + }
2195     radeon_connector = to_radeon_connector(connector);
2196    
2197     switch (connector->connector_type) {
2198     @@ -1547,6 +1559,23 @@ static void radeon_atom_encoder_disable(struct drm_encoder *encoder)
2199     struct radeon_device *rdev = dev->dev_private;
2200     struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
2201     struct radeon_encoder_atom_dig *dig;
2202     +
2203     + /* check for pre-DCE3 cards with shared encoders;
2204     + * can't really use the links individually, so don't disable
2205     + * the encoder if it's in use by another connector
2206     + */
2207     + if (!ASIC_IS_DCE3(rdev)) {
2208     + struct drm_encoder *other_encoder;
2209     + struct radeon_encoder *other_radeon_encoder;
2210     +
2211     + list_for_each_entry(other_encoder, &dev->mode_config.encoder_list, head) {
2212     + other_radeon_encoder = to_radeon_encoder(other_encoder);
2213     + if ((radeon_encoder->encoder_id == other_radeon_encoder->encoder_id) &&
2214     + drm_helper_encoder_in_use(other_encoder))
2215     + goto disable_done;
2216     + }
2217     + }
2218     +
2219     radeon_atom_encoder_dpms(encoder, DRM_MODE_DPMS_OFF);
2220    
2221     switch (radeon_encoder->encoder_id) {
2222     @@ -1586,6 +1615,7 @@ static void radeon_atom_encoder_disable(struct drm_encoder *encoder)
2223     break;
2224     }
2225    
2226     +disable_done:
2227     if (radeon_encoder_is_digital(encoder)) {
2228     if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_HDMI)
2229     r600_hdmi_disable(encoder);
2230     diff --git a/drivers/gpu/drm/radeon/radeon_i2c.c b/drivers/gpu/drm/radeon/radeon_i2c.c
2231     index 6a13ee3..acae80e 100644
2232     --- a/drivers/gpu/drm/radeon/radeon_i2c.c
2233     +++ b/drivers/gpu/drm/radeon/radeon_i2c.c
2234     @@ -946,6 +946,7 @@ struct radeon_i2c_chan *radeon_i2c_create_dp(struct drm_device *dev,
2235     i2c->rec = *rec;
2236     i2c->adapter.owner = THIS_MODULE;
2237     i2c->dev = dev;
2238     + sprintf(i2c->adapter.name, "Radeon aux bus %s", name);
2239     i2c_set_adapdata(&i2c->adapter, i2c);
2240     i2c->adapter.algo_data = &i2c->algo.dp;
2241     i2c->algo.dp.aux_ch = radeon_dp_i2c_aux_ch;
2242     diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
2243     index b3b5306..25d345e 100644
2244     --- a/drivers/gpu/drm/radeon/radeon_object.c
2245     +++ b/drivers/gpu/drm/radeon/radeon_object.c
2246     @@ -102,6 +102,8 @@ int radeon_bo_create(struct radeon_device *rdev, struct drm_gem_object *gobj,
2247     type = ttm_bo_type_device;
2248     }
2249     *bo_ptr = NULL;
2250     +
2251     +retry:
2252     bo = kzalloc(sizeof(struct radeon_bo), GFP_KERNEL);
2253     if (bo == NULL)
2254     return -ENOMEM;
2255     @@ -109,8 +111,6 @@ int radeon_bo_create(struct radeon_device *rdev, struct drm_gem_object *gobj,
2256     bo->gobj = gobj;
2257     bo->surface_reg = -1;
2258     INIT_LIST_HEAD(&bo->list);
2259     -
2260     -retry:
2261     radeon_ttm_placement_from_domain(bo, domain);
2262     /* Kernel allocation are uninterruptible */
2263     mutex_lock(&rdev->vram_mutex);
2264     diff --git a/drivers/gpu/drm/radeon/radeon_reg.h b/drivers/gpu/drm/radeon/radeon_reg.h
2265     index c332f46..6492881 100644
2266     --- a/drivers/gpu/drm/radeon/radeon_reg.h
2267     +++ b/drivers/gpu/drm/radeon/radeon_reg.h
2268     @@ -2836,6 +2836,7 @@
2269     # define R200_TXFORMAT_ST_ROUTE_STQ5 (5 << 24)
2270     # define R200_TXFORMAT_ST_ROUTE_MASK (7 << 24)
2271     # define R200_TXFORMAT_ST_ROUTE_SHIFT 24
2272     +# define R200_TXFORMAT_LOOKUP_DISABLE (1 << 27)
2273     # define R200_TXFORMAT_ALPHA_MASK_ENABLE (1 << 28)
2274     # define R200_TXFORMAT_CHROMA_KEY_ENABLE (1 << 29)
2275     # define R200_TXFORMAT_CUBIC_MAP_ENABLE (1 << 30)
2276     diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c
2277     index 9490da7..b88353d 100644
2278     --- a/drivers/gpu/drm/radeon/rv770.c
2279     +++ b/drivers/gpu/drm/radeon/rv770.c
2280     @@ -643,10 +643,11 @@ static void rv770_gpu_init(struct radeon_device *rdev)
2281     else
2282     gb_tiling_config |= BANK_TILING((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT);
2283     rdev->config.rv770.tiling_nbanks = 4 << ((gb_tiling_config >> 4) & 0x3);
2284     -
2285     - gb_tiling_config |= GROUP_SIZE(0);
2286     - rdev->config.rv770.tiling_group_size = 256;
2287     -
2288     + gb_tiling_config |= GROUP_SIZE((mc_arb_ramcfg & BURSTLENGTH_MASK) >> BURSTLENGTH_SHIFT);
2289     + if ((mc_arb_ramcfg & BURSTLENGTH_MASK) >> BURSTLENGTH_SHIFT)
2290     + rdev->config.rv770.tiling_group_size = 512;
2291     + else
2292     + rdev->config.rv770.tiling_group_size = 256;
2293     if (((mc_arb_ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT) > 3) {
2294     gb_tiling_config |= ROW_TILING(3);
2295     gb_tiling_config |= SAMPLE_SPLIT(3);
2296     diff --git a/drivers/hid/hid-egalax.c b/drivers/hid/hid-egalax.c
2297     index 8ca7f65..54b017a 100644
2298     --- a/drivers/hid/hid-egalax.c
2299     +++ b/drivers/hid/hid-egalax.c
2300     @@ -31,7 +31,7 @@ struct egalax_data {
2301     bool first; /* is this the first finger in the frame? */
2302     bool valid; /* valid finger data, or just placeholder? */
2303     bool activity; /* at least one active finger previously? */
2304     - __u16 lastx, lasty; /* latest valid (x, y) in the frame */
2305     + __u16 lastx, lasty, lastz; /* latest valid (x, y, z) in the frame */
2306     };
2307    
2308     static int egalax_input_mapping(struct hid_device *hdev, struct hid_input *hi,
2309     @@ -79,6 +79,10 @@ static int egalax_input_mapping(struct hid_device *hdev, struct hid_input *hi,
2310     case HID_DG_TIPPRESSURE:
2311     hid_map_usage(hi, usage, bit, max,
2312     EV_ABS, ABS_MT_PRESSURE);
2313     + /* touchscreen emulation */
2314     + input_set_abs_params(hi->input, ABS_PRESSURE,
2315     + field->logical_minimum,
2316     + field->logical_maximum, 0, 0);
2317     return 1;
2318     }
2319     return 0;
2320     @@ -109,8 +113,8 @@ static void egalax_filter_event(struct egalax_data *td, struct input_dev *input)
2321     if (td->valid) {
2322     /* emit multitouch events */
2323     input_event(input, EV_ABS, ABS_MT_TRACKING_ID, td->id);
2324     - input_event(input, EV_ABS, ABS_MT_POSITION_X, td->x);
2325     - input_event(input, EV_ABS, ABS_MT_POSITION_Y, td->y);
2326     + input_event(input, EV_ABS, ABS_MT_POSITION_X, td->x >> 3);
2327     + input_event(input, EV_ABS, ABS_MT_POSITION_Y, td->y >> 3);
2328     input_event(input, EV_ABS, ABS_MT_PRESSURE, td->z);
2329    
2330     input_mt_sync(input);
2331     @@ -121,6 +125,7 @@ static void egalax_filter_event(struct egalax_data *td, struct input_dev *input)
2332     */
2333     td->lastx = td->x;
2334     td->lasty = td->y;
2335     + td->lastz = td->z;
2336     }
2337    
2338     /*
2339     @@ -129,8 +134,9 @@ static void egalax_filter_event(struct egalax_data *td, struct input_dev *input)
2340     * the oldest on the panel, the one we want for single touch
2341     */
2342     if (!td->first && td->activity) {
2343     - input_event(input, EV_ABS, ABS_X, td->lastx);
2344     - input_event(input, EV_ABS, ABS_Y, td->lasty);
2345     + input_event(input, EV_ABS, ABS_X, td->lastx >> 3);
2346     + input_event(input, EV_ABS, ABS_Y, td->lasty >> 3);
2347     + input_event(input, EV_ABS, ABS_PRESSURE, td->lastz);
2348     }
2349    
2350     if (!td->valid) {
2351     diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c
2352     index f0260c6..859ee7e 100644
2353     --- a/drivers/hid/usbhid/hid-quirks.c
2354     +++ b/drivers/hid/usbhid/hid-quirks.c
2355     @@ -34,7 +34,6 @@ static const struct hid_blacklist {
2356     { USB_VENDOR_ID_ALPS, USB_DEVICE_ID_IBM_GAMEPAD, HID_QUIRK_BADPAD },
2357     { USB_VENDOR_ID_CHIC, USB_DEVICE_ID_CHIC_GAMEPAD, HID_QUIRK_BADPAD },
2358     { USB_VENDOR_ID_DWAV, USB_DEVICE_ID_EGALAX_TOUCHCONTROLLER, HID_QUIRK_MULTI_INPUT | HID_QUIRK_NOGET },
2359     - { USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH, HID_QUIRK_MULTI_INPUT },
2360     { USB_VENDOR_ID_MOJO, USB_DEVICE_ID_RETRO_ADAPTER, HID_QUIRK_MULTI_INPUT },
2361     { USB_VENDOR_ID_TURBOX, USB_DEVICE_ID_TURBOX_TOUCHSCREEN_MOSART, HID_QUIRK_MULTI_INPUT },
2362     { USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_DRIVING, HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT },
2363     diff --git a/drivers/hwmon/lm85.c b/drivers/hwmon/lm85.c
2364     index b3841a6..2e8f0c9 100644
2365     --- a/drivers/hwmon/lm85.c
2366     +++ b/drivers/hwmon/lm85.c
2367     @@ -1259,6 +1259,7 @@ static int lm85_probe(struct i2c_client *client,
2368     switch (data->type) {
2369     case adm1027:
2370     case adt7463:
2371     + case adt7468:
2372     case emc6d100:
2373     case emc6d102:
2374     data->freq_map = adm1027_freq_map;
2375     diff --git a/drivers/i2c/busses/i2c-pca-platform.c b/drivers/i2c/busses/i2c-pca-platform.c
2376     index 5f6d7f8..ace6799 100644
2377     --- a/drivers/i2c/busses/i2c-pca-platform.c
2378     +++ b/drivers/i2c/busses/i2c-pca-platform.c
2379     @@ -224,7 +224,7 @@ static int __devinit i2c_pca_pf_probe(struct platform_device *pdev)
2380    
2381     if (irq) {
2382     ret = request_irq(irq, i2c_pca_pf_handler,
2383     - IRQF_TRIGGER_FALLING, i2c->adap.name, i2c);
2384     + IRQF_TRIGGER_FALLING, pdev->name, i2c);
2385     if (ret)
2386     goto e_reqirq;
2387     }
2388     diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h
2389     index ed7ad74..8c53926 100644
2390     --- a/drivers/input/serio/i8042-x86ia64io.h
2391     +++ b/drivers/input/serio/i8042-x86ia64io.h
2392     @@ -333,6 +333,13 @@ static const struct dmi_system_id __initconst i8042_dmi_nomux_table[] = {
2393     },
2394     },
2395     {
2396     + /* Sony Vaio VPCZ122GX */
2397     + .matches = {
2398     + DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
2399     + DMI_MATCH(DMI_PRODUCT_NAME, "VPCZ122GX"),
2400     + },
2401     + },
2402     + {
2403     /* Sony Vaio FS-115b */
2404     .matches = {
2405     DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
2406     diff --git a/drivers/isdn/gigaset/bas-gigaset.c b/drivers/isdn/gigaset/bas-gigaset.c
2407     index 707d9c9..131976d 100644
2408     --- a/drivers/isdn/gigaset/bas-gigaset.c
2409     +++ b/drivers/isdn/gigaset/bas-gigaset.c
2410     @@ -438,23 +438,27 @@ static void cmd_in_timeout(unsigned long data)
2411     return;
2412     }
2413    
2414     - if (ucs->retry_cmd_in++ < BAS_RETRY) {
2415     - dev_notice(cs->dev, "control read: timeout, retry %d\n",
2416     - ucs->retry_cmd_in);
2417     - rc = atread_submit(cs, BAS_TIMEOUT);
2418     - if (rc >= 0 || rc == -ENODEV)
2419     - /* resubmitted or disconnected */
2420     - /* - bypass regular exit block */
2421     - return;
2422     - } else {
2423     + if (ucs->retry_cmd_in++ >= BAS_RETRY) {
2424     dev_err(cs->dev,
2425     "control read: timeout, giving up after %d tries\n",
2426     ucs->retry_cmd_in);
2427     + kfree(ucs->rcvbuf);
2428     + ucs->rcvbuf = NULL;
2429     + ucs->rcvbuf_size = 0;
2430     + error_reset(cs);
2431     + return;
2432     + }
2433     +
2434     + gig_dbg(DEBUG_USBREQ, "%s: timeout, retry %d",
2435     + __func__, ucs->retry_cmd_in);
2436     + rc = atread_submit(cs, BAS_TIMEOUT);
2437     + if (rc < 0) {
2438     + kfree(ucs->rcvbuf);
2439     + ucs->rcvbuf = NULL;
2440     + ucs->rcvbuf_size = 0;
2441     + if (rc != -ENODEV)
2442     + error_reset(cs);
2443     }
2444     - kfree(ucs->rcvbuf);
2445     - ucs->rcvbuf = NULL;
2446     - ucs->rcvbuf_size = 0;
2447     - error_reset(cs);
2448     }
2449    
2450     /* read_ctrl_callback
2451     @@ -470,18 +474,11 @@ static void read_ctrl_callback(struct urb *urb)
2452     struct cardstate *cs = inbuf->cs;
2453     struct bas_cardstate *ucs = cs->hw.bas;
2454     int status = urb->status;
2455     - int have_data = 0;
2456     unsigned numbytes;
2457     int rc;
2458    
2459     update_basstate(ucs, 0, BS_ATRDPEND);
2460     wake_up(&ucs->waitqueue);
2461     -
2462     - if (!ucs->rcvbuf_size) {
2463     - dev_warn(cs->dev, "%s: no receive in progress\n", __func__);
2464     - return;
2465     - }
2466     -
2467     del_timer(&ucs->timer_cmd_in);
2468    
2469     switch (status) {
2470     @@ -495,19 +492,10 @@ static void read_ctrl_callback(struct urb *urb)
2471     numbytes = ucs->rcvbuf_size;
2472     }
2473    
2474     - /* copy received bytes to inbuf */
2475     - have_data = gigaset_fill_inbuf(inbuf, ucs->rcvbuf, numbytes);
2476     -
2477     - if (unlikely(numbytes < ucs->rcvbuf_size)) {
2478     - /* incomplete - resubmit for remaining bytes */
2479     - ucs->rcvbuf_size -= numbytes;
2480     - ucs->retry_cmd_in = 0;
2481     - rc = atread_submit(cs, BAS_TIMEOUT);
2482     - if (rc >= 0 || rc == -ENODEV)
2483     - /* resubmitted or disconnected */
2484     - /* - bypass regular exit block */
2485     - return;
2486     - error_reset(cs);
2487     + /* copy received bytes to inbuf, notify event layer */
2488     + if (gigaset_fill_inbuf(inbuf, ucs->rcvbuf, numbytes)) {
2489     + gig_dbg(DEBUG_INTR, "%s-->BH", __func__);
2490     + gigaset_schedule_event(cs);
2491     }
2492     break;
2493    
2494     @@ -516,37 +504,32 @@ static void read_ctrl_callback(struct urb *urb)
2495     case -EINPROGRESS: /* pending */
2496     case -ENODEV: /* device removed */
2497     case -ESHUTDOWN: /* device shut down */
2498     - /* no action necessary */
2499     + /* no further action necessary */
2500     gig_dbg(DEBUG_USBREQ, "%s: %s",
2501     __func__, get_usb_statmsg(status));
2502     break;
2503    
2504     - default: /* severe trouble */
2505     - dev_warn(cs->dev, "control read: %s\n",
2506     - get_usb_statmsg(status));
2507     + default: /* other errors: retry */
2508     if (ucs->retry_cmd_in++ < BAS_RETRY) {
2509     - dev_notice(cs->dev, "control read: retry %d\n",
2510     - ucs->retry_cmd_in);
2511     + gig_dbg(DEBUG_USBREQ, "%s: %s, retry %d", __func__,
2512     + get_usb_statmsg(status), ucs->retry_cmd_in);
2513     rc = atread_submit(cs, BAS_TIMEOUT);
2514     - if (rc >= 0 || rc == -ENODEV)
2515     - /* resubmitted or disconnected */
2516     - /* - bypass regular exit block */
2517     + if (rc >= 0)
2518     + /* successfully resubmitted, skip freeing */
2519     return;
2520     - } else {
2521     - dev_err(cs->dev,
2522     - "control read: giving up after %d tries\n",
2523     - ucs->retry_cmd_in);
2524     + if (rc == -ENODEV)
2525     + /* disconnect, no further action necessary */
2526     + break;
2527     }
2528     + dev_err(cs->dev, "control read: %s, giving up after %d tries\n",
2529     + get_usb_statmsg(status), ucs->retry_cmd_in);
2530     error_reset(cs);
2531     }
2532    
2533     + /* read finished, free buffer */
2534     kfree(ucs->rcvbuf);
2535     ucs->rcvbuf = NULL;
2536     ucs->rcvbuf_size = 0;
2537     - if (have_data) {
2538     - gig_dbg(DEBUG_INTR, "%s-->BH", __func__);
2539     - gigaset_schedule_event(cs);
2540     - }
2541     }
2542    
2543     /* atread_submit
2544     @@ -1598,13 +1581,13 @@ static int gigaset_init_bchannel(struct bc_state *bcs)
2545    
2546     ret = starturbs(bcs);
2547     if (ret < 0) {
2548     + spin_unlock_irqrestore(&cs->lock, flags);
2549     dev_err(cs->dev,
2550     "could not start isochronous I/O for channel B%d: %s\n",
2551     bcs->channel + 1,
2552     ret == -EFAULT ? "null URB" : get_usb_rcmsg(ret));
2553     if (ret != -ENODEV)
2554     error_hangup(bcs);
2555     - spin_unlock_irqrestore(&cs->lock, flags);
2556     return ret;
2557     }
2558    
2559     @@ -1614,11 +1597,11 @@ static int gigaset_init_bchannel(struct bc_state *bcs)
2560     dev_err(cs->dev, "could not open channel B%d\n",
2561     bcs->channel + 1);
2562     stopurbs(bcs->hw.bas);
2563     - if (ret != -ENODEV)
2564     - error_hangup(bcs);
2565     }
2566    
2567     spin_unlock_irqrestore(&cs->lock, flags);
2568     + if (ret < 0 && ret != -ENODEV)
2569     + error_hangup(bcs);
2570     return ret;
2571     }
2572    
2573     diff --git a/drivers/isdn/gigaset/isocdata.c b/drivers/isdn/gigaset/isocdata.c
2574     index 2dfd346..f39ccdf 100644
2575     --- a/drivers/isdn/gigaset/isocdata.c
2576     +++ b/drivers/isdn/gigaset/isocdata.c
2577     @@ -842,13 +842,14 @@ static inline void trans_receive(unsigned char *src, unsigned count,
2578    
2579     if (unlikely(bcs->ignore)) {
2580     bcs->ignore--;
2581     - hdlc_flush(bcs);
2582     return;
2583     }
2584     skb = bcs->rx_skb;
2585     - if (skb == NULL)
2586     + if (skb == NULL) {
2587     skb = gigaset_new_rx_skb(bcs);
2588     - bcs->hw.bas->goodbytes += skb->len;
2589     + if (skb == NULL)
2590     + return;
2591     + }
2592     dobytes = bcs->rx_bufsize - skb->len;
2593     while (count > 0) {
2594     dst = skb_put(skb, count < dobytes ? count : dobytes);
2595     @@ -860,6 +861,7 @@ static inline void trans_receive(unsigned char *src, unsigned count,
2596     if (dobytes == 0) {
2597     dump_bytes(DEBUG_STREAM_DUMP,
2598     "rcv data", skb->data, skb->len);
2599     + bcs->hw.bas->goodbytes += skb->len;
2600     gigaset_skb_rcvd(bcs, skb);
2601     skb = gigaset_new_rx_skb(bcs);
2602     if (skb == NULL)
2603     diff --git a/drivers/leds/leds-ss4200.c b/drivers/leds/leds-ss4200.c
2604     index a688293..614ebeb 100644
2605     --- a/drivers/leds/leds-ss4200.c
2606     +++ b/drivers/leds/leds-ss4200.c
2607     @@ -102,6 +102,7 @@ static struct dmi_system_id __initdata nas_led_whitelist[] = {
2608     DMI_MATCH(DMI_PRODUCT_VERSION, "1.00.00")
2609     }
2610     },
2611     + {}
2612     };
2613    
2614     /*
2615     diff --git a/drivers/md/md.c b/drivers/md/md.c
2616     index f20d13e..792574c 100644
2617     --- a/drivers/md/md.c
2618     +++ b/drivers/md/md.c
2619     @@ -1329,7 +1329,7 @@ super_90_rdev_size_change(mdk_rdev_t *rdev, sector_t num_sectors)
2620     md_super_write(rdev->mddev, rdev, rdev->sb_start, rdev->sb_size,
2621     rdev->sb_page);
2622     md_super_wait(rdev->mddev);
2623     - return num_sectors / 2; /* kB for sysfs */
2624     + return num_sectors;
2625     }
2626    
2627    
2628     @@ -1697,7 +1697,7 @@ super_1_rdev_size_change(mdk_rdev_t *rdev, sector_t num_sectors)
2629     md_super_write(rdev->mddev, rdev, rdev->sb_start, rdev->sb_size,
2630     rdev->sb_page);
2631     md_super_wait(rdev->mddev);
2632     - return num_sectors / 2; /* kB for sysfs */
2633     + return num_sectors;
2634     }
2635    
2636     static struct super_type super_types[] = {
2637     @@ -2172,6 +2172,8 @@ repeat:
2638     if (!mddev->persistent) {
2639     clear_bit(MD_CHANGE_CLEAN, &mddev->flags);
2640     clear_bit(MD_CHANGE_DEVS, &mddev->flags);
2641     + if (!mddev->external)
2642     + clear_bit(MD_CHANGE_PENDING, &mddev->flags);
2643     wake_up(&mddev->sb_wait);
2644     return;
2645     }
2646     diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
2647     index 0b830bb..d8b2d7b 100644
2648     --- a/drivers/md/raid1.c
2649     +++ b/drivers/md/raid1.c
2650     @@ -1210,6 +1210,7 @@ static int raid1_remove_disk(mddev_t *mddev, int number)
2651     * is not possible.
2652     */
2653     if (!test_bit(Faulty, &rdev->flags) &&
2654     + !mddev->recovery_disabled &&
2655     mddev->degraded < conf->raid_disks) {
2656     err = -EBUSY;
2657     goto abort;
2658     diff --git a/drivers/media/video/cx23885/cx23885-core.c b/drivers/media/video/cx23885/cx23885-core.c
2659     index f6b62e7..11c987e 100644
2660     --- a/drivers/media/video/cx23885/cx23885-core.c
2661     +++ b/drivers/media/video/cx23885/cx23885-core.c
2662     @@ -815,6 +815,7 @@ static void cx23885_dev_checkrevision(struct cx23885_dev *dev)
2663     case 0x0e:
2664     /* CX23887-15Z */
2665     dev->hwrevision = 0xc0;
2666     + break;
2667     case 0x0f:
2668     /* CX23887-14Z */
2669     dev->hwrevision = 0xb1;
2670     diff --git a/drivers/media/video/gspca/gspca.c b/drivers/media/video/gspca/gspca.c
2671     index 78abc1c..a50bf65 100644
2672     --- a/drivers/media/video/gspca/gspca.c
2673     +++ b/drivers/media/video/gspca/gspca.c
2674     @@ -652,7 +652,7 @@ static struct usb_host_endpoint *get_ep(struct gspca_dev *gspca_dev)
2675     : USB_ENDPOINT_XFER_ISOC;
2676     i = gspca_dev->alt; /* previous alt setting */
2677     if (gspca_dev->cam.reverse_alts) {
2678     - if (gspca_dev->audio)
2679     + if (gspca_dev->audio && i < gspca_dev->nbalt - 2)
2680     i++;
2681     while (++i < gspca_dev->nbalt) {
2682     ep = alt_xfer(&intf->altsetting[i], xfer);
2683     @@ -660,7 +660,7 @@ static struct usb_host_endpoint *get_ep(struct gspca_dev *gspca_dev)
2684     break;
2685     }
2686     } else {
2687     - if (gspca_dev->audio)
2688     + if (gspca_dev->audio && i > 1)
2689     i--;
2690     while (--i >= 0) {
2691     ep = alt_xfer(&intf->altsetting[i], xfer);
2692     diff --git a/drivers/media/video/gspca/sonixj.c b/drivers/media/video/gspca/sonixj.c
2693     index 3705443..c01d75b 100644
2694     --- a/drivers/media/video/gspca/sonixj.c
2695     +++ b/drivers/media/video/gspca/sonixj.c
2696     @@ -2474,8 +2474,7 @@ static int sd_start(struct gspca_dev *gspca_dev)
2697     reg1 = 0x44;
2698     reg17 = 0xa2;
2699     break;
2700     - default:
2701     -/* case SENSOR_SP80708: */
2702     + case SENSOR_SP80708:
2703     init = sp80708_sensor_param1;
2704     if (mode) {
2705     /*?? reg1 = 0x04; * 320 clk 48Mhz */
2706     diff --git a/drivers/media/video/hdpvr/hdpvr-video.c b/drivers/media/video/hdpvr/hdpvr-video.c
2707     index 4863a21..93f7959 100644
2708     --- a/drivers/media/video/hdpvr/hdpvr-video.c
2709     +++ b/drivers/media/video/hdpvr/hdpvr-video.c
2710     @@ -157,6 +157,7 @@ int hdpvr_alloc_buffers(struct hdpvr_device *dev, uint count)
2711     mem, dev->bulk_in_size,
2712     hdpvr_read_bulk_callback, buf);
2713    
2714     + buf->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
2715     buf->status = BUFSTAT_AVAILABLE;
2716     list_add_tail(&buf->buff_list, &dev->free_buff_list);
2717     }
2718     diff --git a/drivers/media/video/msp3400-driver.c b/drivers/media/video/msp3400-driver.c
2719     index 0e41213..4897d90f 100644
2720     --- a/drivers/media/video/msp3400-driver.c
2721     +++ b/drivers/media/video/msp3400-driver.c
2722     @@ -382,7 +382,12 @@ static int msp_s_ctrl(struct v4l2_ctrl *ctrl)
2723    
2724     void msp_update_volume(struct msp_state *state)
2725     {
2726     - v4l2_ctrl_s_ctrl(state->volume, v4l2_ctrl_g_ctrl(state->volume));
2727     + /* Force an update of the volume/mute cluster */
2728     + v4l2_ctrl_lock(state->volume);
2729     + state->volume->val = state->volume->cur.val;
2730     + state->muted->val = state->muted->cur.val;
2731     + msp_s_ctrl(state->volume);
2732     + v4l2_ctrl_unlock(state->volume);
2733     }
2734    
2735     /* --- v4l2 ioctls --- */
2736     diff --git a/drivers/media/video/saa7134/saa7134-cards.c b/drivers/media/video/saa7134/saa7134-cards.c
2737     index bb8d83d..7c74751 100644
2738     --- a/drivers/media/video/saa7134/saa7134-cards.c
2739     +++ b/drivers/media/video/saa7134/saa7134-cards.c
2740     @@ -6661,6 +6661,18 @@ struct pci_device_id saa7134_pci_tbl[] = {
2741     .subdevice = 0x2804,
2742     .driver_data = SAA7134_BOARD_TECHNOTREND_BUDGET_T3000,
2743     }, {
2744     + .vendor = PCI_VENDOR_ID_PHILIPS,
2745     + .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
2746     + .subvendor = 0x5ace, /* Beholder Intl. Ltd. */
2747     + .subdevice = 0x7190,
2748     + .driver_data = SAA7134_BOARD_BEHOLD_H7,
2749     + }, {
2750     + .vendor = PCI_VENDOR_ID_PHILIPS,
2751     + .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
2752     + .subvendor = 0x5ace, /* Beholder Intl. Ltd. */
2753     + .subdevice = 0x7090,
2754     + .driver_data = SAA7134_BOARD_BEHOLD_A7,
2755     + }, {
2756     /* --- boards without eeprom + subsystem ID --- */
2757     .vendor = PCI_VENDOR_ID_PHILIPS,
2758     .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
2759     @@ -6698,18 +6710,6 @@ struct pci_device_id saa7134_pci_tbl[] = {
2760     .subvendor = PCI_ANY_ID,
2761     .subdevice = PCI_ANY_ID,
2762     .driver_data = SAA7134_BOARD_UNKNOWN,
2763     - }, {
2764     - .vendor = PCI_VENDOR_ID_PHILIPS,
2765     - .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
2766     - .subvendor = 0x5ace, /* Beholder Intl. Ltd. */
2767     - .subdevice = 0x7190,
2768     - .driver_data = SAA7134_BOARD_BEHOLD_H7,
2769     - }, {
2770     - .vendor = PCI_VENDOR_ID_PHILIPS,
2771     - .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
2772     - .subvendor = 0x5ace, /* Beholder Intl. Ltd. */
2773     - .subdevice = 0x7090,
2774     - .driver_data = SAA7134_BOARD_BEHOLD_A7,
2775     },{
2776     /* --- end of list --- */
2777     }
2778     diff --git a/drivers/misc/ad525x_dpot-spi.c b/drivers/misc/ad525x_dpot-spi.c
2779     index b8c6df9..6cfcb63 100644
2780     --- a/drivers/misc/ad525x_dpot-spi.c
2781     +++ b/drivers/misc/ad525x_dpot-spi.c
2782     @@ -53,13 +53,13 @@ static int write8(void *client, u8 val)
2783     static int write16(void *client, u8 reg, u8 val)
2784     {
2785     u8 data[2] = {reg, val};
2786     - return spi_write(client, data, 1);
2787     + return spi_write(client, data, 2);
2788     }
2789    
2790     static int write24(void *client, u8 reg, u16 val)
2791     {
2792     u8 data[3] = {reg, val >> 8, val};
2793     - return spi_write(client, data, 1);
2794     + return spi_write(client, data, 3);
2795     }
2796    
2797     static int read8(void *client)
2798     diff --git a/drivers/misc/sgi-xp/xpc_partition.c b/drivers/misc/sgi-xp/xpc_partition.c
2799     index d551f09..6956f7e 100644
2800     --- a/drivers/misc/sgi-xp/xpc_partition.c
2801     +++ b/drivers/misc/sgi-xp/xpc_partition.c
2802     @@ -439,18 +439,23 @@ xpc_discovery(void)
2803     * nodes that can comprise an access protection grouping. The access
2804     * protection is in regards to memory, IOI and IPI.
2805     */
2806     - max_regions = 64;
2807     region_size = xp_region_size;
2808    
2809     - switch (region_size) {
2810     - case 128:
2811     - max_regions *= 2;
2812     - case 64:
2813     - max_regions *= 2;
2814     - case 32:
2815     - max_regions *= 2;
2816     - region_size = 16;
2817     - DBUG_ON(!is_shub2());
2818     + if (is_uv())
2819     + max_regions = 256;
2820     + else {
2821     + max_regions = 64;
2822     +
2823     + switch (region_size) {
2824     + case 128:
2825     + max_regions *= 2;
2826     + case 64:
2827     + max_regions *= 2;
2828     + case 32:
2829     + max_regions *= 2;
2830     + region_size = 16;
2831     + DBUG_ON(!is_shub2());
2832     + }
2833     }
2834    
2835     for (region = 0; region < max_regions; region++) {
2836     diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
2837     index 09eee6d..9ca553b 100644
2838     --- a/drivers/mmc/core/core.c
2839     +++ b/drivers/mmc/core/core.c
2840     @@ -1514,7 +1514,7 @@ void mmc_stop_host(struct mmc_host *host)
2841    
2842     if (host->caps & MMC_CAP_DISABLE)
2843     cancel_delayed_work(&host->disable);
2844     - cancel_delayed_work(&host->detect);
2845     + cancel_delayed_work_sync(&host->detect);
2846     mmc_flush_scheduled_work();
2847    
2848     /* clear pm flags now and let card drivers set them as needed */
2849     diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c
2850     index 5cc39ed..7132428 100644
2851     --- a/drivers/net/e1000/e1000_main.c
2852     +++ b/drivers/net/e1000/e1000_main.c
2853     @@ -31,7 +31,7 @@
2854    
2855     char e1000_driver_name[] = "e1000";
2856     static char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver";
2857     -#define DRV_VERSION "7.3.21-k6-NAPI"
2858     +#define DRV_VERSION "7.3.21-k8-NAPI"
2859     const char e1000_driver_version[] = DRV_VERSION;
2860     static const char e1000_copyright[] = "Copyright (c) 1999-2006 Intel Corporation.";
2861    
2862     @@ -483,9 +483,6 @@ void e1000_down(struct e1000_adapter *adapter)
2863     struct net_device *netdev = adapter->netdev;
2864     u32 rctl, tctl;
2865    
2866     - /* signal that we're down so the interrupt handler does not
2867     - * reschedule our watchdog timer */
2868     - set_bit(__E1000_DOWN, &adapter->flags);
2869    
2870     /* disable receives in the hardware */
2871     rctl = er32(RCTL);
2872     @@ -506,6 +503,13 @@ void e1000_down(struct e1000_adapter *adapter)
2873    
2874     e1000_irq_disable(adapter);
2875    
2876     + /*
2877     + * Setting DOWN must be after irq_disable to prevent
2878     + * a screaming interrupt. Setting DOWN also prevents
2879     + * timers and tasks from rescheduling.
2880     + */
2881     + set_bit(__E1000_DOWN, &adapter->flags);
2882     +
2883     del_timer_sync(&adapter->tx_fifo_stall_timer);
2884     del_timer_sync(&adapter->watchdog_timer);
2885     del_timer_sync(&adapter->phy_info_timer);
2886     diff --git a/drivers/net/jme.c b/drivers/net/jme.c
2887     index 99f24f5..f0643ac 100644
2888     --- a/drivers/net/jme.c
2889     +++ b/drivers/net/jme.c
2890     @@ -1575,6 +1575,16 @@ jme_free_irq(struct jme_adapter *jme)
2891     }
2892     }
2893    
2894     +static inline void
2895     +jme_phy_on(struct jme_adapter *jme)
2896     +{
2897     + u32 bmcr;
2898     +
2899     + bmcr = jme_mdio_read(jme->dev, jme->mii_if.phy_id, MII_BMCR);
2900     + bmcr &= ~BMCR_PDOWN;
2901     + jme_mdio_write(jme->dev, jme->mii_if.phy_id, MII_BMCR, bmcr);
2902     +}
2903     +
2904     static int
2905     jme_open(struct net_device *netdev)
2906     {
2907     @@ -1595,10 +1605,12 @@ jme_open(struct net_device *netdev)
2908    
2909     jme_start_irq(jme);
2910    
2911     - if (test_bit(JME_FLAG_SSET, &jme->flags))
2912     + if (test_bit(JME_FLAG_SSET, &jme->flags)) {
2913     + jme_phy_on(jme);
2914     jme_set_settings(netdev, &jme->old_ecmd);
2915     - else
2916     + } else {
2917     jme_reset_phy_processor(jme);
2918     + }
2919    
2920     jme_reset_link(jme);
2921    
2922     @@ -3006,10 +3018,12 @@ jme_resume(struct pci_dev *pdev)
2923     jme_clear_pm(jme);
2924     pci_restore_state(pdev);
2925    
2926     - if (test_bit(JME_FLAG_SSET, &jme->flags))
2927     + if (test_bit(JME_FLAG_SSET, &jme->flags)) {
2928     + jme_phy_on(jme);
2929     jme_set_settings(netdev, &jme->old_ecmd);
2930     - else
2931     + } else {
2932     jme_reset_phy_processor(jme);
2933     + }
2934    
2935     jme_start_irq(jme);
2936     netif_device_attach(netdev);
2937     diff --git a/drivers/net/pcmcia/pcnet_cs.c b/drivers/net/pcmcia/pcnet_cs.c
2938     index f9b509a..b12553b 100644
2939     --- a/drivers/net/pcmcia/pcnet_cs.c
2940     +++ b/drivers/net/pcmcia/pcnet_cs.c
2941     @@ -1622,6 +1622,7 @@ static struct pcmcia_device_id pcnet_ids[] = {
2942     PCMCIA_DEVICE_PROD_ID12("COMPU-SHACK", "FASTline PCMCIA 10/100 Fast-Ethernet", 0xfa2e424d, 0x3953d9b9),
2943     PCMCIA_DEVICE_PROD_ID12("CONTEC", "C-NET(PC)C-10L", 0x21cab552, 0xf6f90722),
2944     PCMCIA_DEVICE_PROD_ID12("corega", "FEther PCC-TXF", 0x0a21501a, 0xa51564a2),
2945     + PCMCIA_DEVICE_PROD_ID12("corega", "Ether CF-TD", 0x0a21501a, 0x6589340a),
2946     PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega EtherII PCC-T", 0x5261440f, 0xfa9d85bd),
2947     PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega EtherII PCC-TD", 0x5261440f, 0xc49bd73d),
2948     PCMCIA_DEVICE_PROD_ID12("Corega K.K.", "corega EtherII PCC-TD", 0xd4fdcbd8, 0xc49bd73d),
2949     diff --git a/drivers/net/phy/marvell.c b/drivers/net/phy/marvell.c
2950     index 0101f2b..c1ba49b 100644
2951     --- a/drivers/net/phy/marvell.c
2952     +++ b/drivers/net/phy/marvell.c
2953     @@ -196,20 +196,27 @@ static int m88e1121_config_aneg(struct phy_device *phydev)
2954     MII_88E1121_PHY_MSCR_PAGE);
2955     if (err < 0)
2956     return err;
2957     - mscr = phy_read(phydev, MII_88E1121_PHY_MSCR_REG) &
2958     - MII_88E1121_PHY_MSCR_DELAY_MASK;
2959    
2960     - if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID)
2961     - mscr |= (MII_88E1121_PHY_MSCR_RX_DELAY |
2962     - MII_88E1121_PHY_MSCR_TX_DELAY);
2963     - else if (phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID)
2964     - mscr |= MII_88E1121_PHY_MSCR_RX_DELAY;
2965     - else if (phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID)
2966     - mscr |= MII_88E1121_PHY_MSCR_TX_DELAY;
2967     + if ((phydev->interface == PHY_INTERFACE_MODE_RGMII) ||
2968     + (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) ||
2969     + (phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID) ||
2970     + (phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID)) {
2971    
2972     - err = phy_write(phydev, MII_88E1121_PHY_MSCR_REG, mscr);
2973     - if (err < 0)
2974     - return err;
2975     + mscr = phy_read(phydev, MII_88E1121_PHY_MSCR_REG) &
2976     + MII_88E1121_PHY_MSCR_DELAY_MASK;
2977     +
2978     + if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID)
2979     + mscr |= (MII_88E1121_PHY_MSCR_RX_DELAY |
2980     + MII_88E1121_PHY_MSCR_TX_DELAY);
2981     + else if (phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID)
2982     + mscr |= MII_88E1121_PHY_MSCR_RX_DELAY;
2983     + else if (phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID)
2984     + mscr |= MII_88E1121_PHY_MSCR_TX_DELAY;
2985     +
2986     + err = phy_write(phydev, MII_88E1121_PHY_MSCR_REG, mscr);
2987     + if (err < 0)
2988     + return err;
2989     + }
2990    
2991     phy_write(phydev, MII_88E1121_PHY_PAGE, oldpage);
2992    
2993     diff --git a/drivers/net/r6040.c b/drivers/net/r6040.c
2994     index 142c381..80666f0 100644
2995     --- a/drivers/net/r6040.c
2996     +++ b/drivers/net/r6040.c
2997     @@ -893,16 +893,18 @@ static void r6040_multicast_list(struct net_device *dev)
2998     /* Multicast Address 1~4 case */
2999     i = 0;
3000     netdev_for_each_mc_addr(ha, dev) {
3001     - if (i < MCAST_MAX) {
3002     - adrp = (u16 *) ha->addr;
3003     - iowrite16(adrp[0], ioaddr + MID_1L + 8 * i);
3004     - iowrite16(adrp[1], ioaddr + MID_1M + 8 * i);
3005     - iowrite16(adrp[2], ioaddr + MID_1H + 8 * i);
3006     - } else {
3007     - iowrite16(0xffff, ioaddr + MID_1L + 8 * i);
3008     - iowrite16(0xffff, ioaddr + MID_1M + 8 * i);
3009     - iowrite16(0xffff, ioaddr + MID_1H + 8 * i);
3010     - }
3011     + if (i >= MCAST_MAX)
3012     + break;
3013     + adrp = (u16 *) ha->addr;
3014     + iowrite16(adrp[0], ioaddr + MID_1L + 8 * i);
3015     + iowrite16(adrp[1], ioaddr + MID_1M + 8 * i);
3016     + iowrite16(adrp[2], ioaddr + MID_1H + 8 * i);
3017     + i++;
3018     + }
3019     + while (i < MCAST_MAX) {
3020     + iowrite16(0xffff, ioaddr + MID_1L + 8 * i);
3021     + iowrite16(0xffff, ioaddr + MID_1M + 8 * i);
3022     + iowrite16(0xffff, ioaddr + MID_1H + 8 * i);
3023     i++;
3024     }
3025     }
3026     diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
3027     index 992db2f..6fedc89 100644
3028     --- a/drivers/net/r8169.c
3029     +++ b/drivers/net/r8169.c
3030     @@ -2936,7 +2936,7 @@ static const struct rtl_cfg_info {
3031     .hw_start = rtl_hw_start_8168,
3032     .region = 2,
3033     .align = 8,
3034     - .intr_event = SYSErr | RxFIFOOver | LinkChg | RxOverflow |
3035     + .intr_event = SYSErr | LinkChg | RxOverflow |
3036     TxErr | TxOK | RxOK | RxErr,
3037     .napi_event = TxErr | TxOK | RxOK | RxOverflow,
3038     .features = RTL_FEATURE_GMII | RTL_FEATURE_MSI,
3039     @@ -4455,14 +4455,12 @@ static inline int rtl8169_fragmented_frame(u32 status)
3040     return (status & (FirstFrag | LastFrag)) != (FirstFrag | LastFrag);
3041     }
3042    
3043     -static inline void rtl8169_rx_csum(struct sk_buff *skb, struct RxDesc *desc)
3044     +static inline void rtl8169_rx_csum(struct sk_buff *skb, u32 opts1)
3045     {
3046     - u32 opts1 = le32_to_cpu(desc->opts1);
3047     u32 status = opts1 & RxProtoMask;
3048    
3049     if (((status == RxProtoTCP) && !(opts1 & TCPFail)) ||
3050     - ((status == RxProtoUDP) && !(opts1 & UDPFail)) ||
3051     - ((status == RxProtoIP) && !(opts1 & IPFail)))
3052     + ((status == RxProtoUDP) && !(opts1 & UDPFail)))
3053     skb->ip_summed = CHECKSUM_UNNECESSARY;
3054     else
3055     skb->ip_summed = CHECKSUM_NONE;
3056     @@ -4551,8 +4549,6 @@ static int rtl8169_rx_interrupt(struct net_device *dev,
3057     continue;
3058     }
3059    
3060     - rtl8169_rx_csum(skb, desc);
3061     -
3062     if (rtl8169_try_rx_copy(&skb, tp, pkt_size, addr)) {
3063     dma_sync_single_for_device(&pdev->dev, addr,
3064     pkt_size, PCI_DMA_FROMDEVICE);
3065     @@ -4563,6 +4559,7 @@ static int rtl8169_rx_interrupt(struct net_device *dev,
3066     tp->Rx_skbuff[entry] = NULL;
3067     }
3068    
3069     + rtl8169_rx_csum(skb, status);
3070     skb_put(skb, pkt_size);
3071     skb->protocol = eth_type_trans(skb, dev);
3072    
3073     @@ -4630,7 +4627,8 @@ static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance)
3074     }
3075    
3076     /* Work around for rx fifo overflow */
3077     - if (unlikely(status & RxFIFOOver)) {
3078     + if (unlikely(status & RxFIFOOver) &&
3079     + (tp->mac_version == RTL_GIGA_MAC_VER_11)) {
3080     netif_stop_queue(dev);
3081     rtl8169_tx_timeout(dev);
3082     break;
3083     @@ -4891,6 +4889,9 @@ static int rtl8169_resume(struct device *device)
3084     {
3085     struct pci_dev *pdev = to_pci_dev(device);
3086     struct net_device *dev = pci_get_drvdata(pdev);
3087     + struct rtl8169_private *tp = netdev_priv(dev);
3088     +
3089     + rtl8169_init_phy(dev, tp);
3090    
3091     if (netif_running(dev))
3092     __rtl8169_resume(dev);
3093     @@ -4931,6 +4932,8 @@ static int rtl8169_runtime_resume(struct device *device)
3094     tp->saved_wolopts = 0;
3095     spin_unlock_irq(&tp->lock);
3096    
3097     + rtl8169_init_phy(dev, tp);
3098     +
3099     __rtl8169_resume(dev);
3100    
3101     return 0;
3102     diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c
3103     index ca7fc9d..c04d49e 100644
3104     --- a/drivers/net/usb/usbnet.c
3105     +++ b/drivers/net/usb/usbnet.c
3106     @@ -45,6 +45,7 @@
3107     #include <linux/usb/usbnet.h>
3108     #include <linux/slab.h>
3109     #include <linux/kernel.h>
3110     +#include <linux/pm_runtime.h>
3111    
3112     #define DRIVER_VERSION "22-Aug-2005"
3113    
3114     @@ -1273,6 +1274,16 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
3115     struct usb_device *xdev;
3116     int status;
3117     const char *name;
3118     + struct usb_driver *driver = to_usb_driver(udev->dev.driver);
3119     +
3120     + /* usbnet already took usb runtime pm, so have to enable the feature
3121     + * for usb interface, otherwise usb_autopm_get_interface may return
3122     + * failure if USB_SUSPEND(RUNTIME_PM) is enabled.
3123     + */
3124     + if (!driver->supports_autosuspend) {
3125     + driver->supports_autosuspend = 1;
3126     + pm_runtime_enable(&udev->dev);
3127     + }
3128    
3129     name = udev->dev.driver->name;
3130     info = (struct driver_info *) prod->driver_info;
3131     diff --git a/drivers/net/wireless/ath/ath.h b/drivers/net/wireless/ath/ath.h
3132     index d32f282..a706202 100644
3133     --- a/drivers/net/wireless/ath/ath.h
3134     +++ b/drivers/net/wireless/ath/ath.h
3135     @@ -119,6 +119,7 @@ struct ath_common {
3136    
3137     u32 keymax;
3138     DECLARE_BITMAP(keymap, ATH_KEYMAX);
3139     + DECLARE_BITMAP(tkip_keymap, ATH_KEYMAX);
3140     u8 splitmic;
3141    
3142     struct ath_regulatory regulatory;
3143     diff --git a/drivers/net/wireless/ath/ath9k/ar9002_hw.c b/drivers/net/wireless/ath/ath9k/ar9002_hw.c
3144     index 303c63d..cb90aa8 100644
3145     --- a/drivers/net/wireless/ath/ath9k/ar9002_hw.c
3146     +++ b/drivers/net/wireless/ath/ath9k/ar9002_hw.c
3147     @@ -411,6 +411,9 @@ static void ar9002_hw_configpcipowersave(struct ath_hw *ah,
3148     val &= ~(AR_WA_BIT6 | AR_WA_BIT7);
3149     }
3150    
3151     + if (AR_SREV_9280(ah))
3152     + val |= AR_WA_BIT22;
3153     +
3154     if (AR_SREV_9285E_20(ah))
3155     val |= AR_WA_BIT23;
3156    
3157     diff --git a/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h b/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h
3158     index ec98ab5..a14a5e4 100644
3159     --- a/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h
3160     +++ b/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h
3161     @@ -34,6 +34,10 @@ static const u32 ar9300_2p2_radio_postamble[][5] = {
3162    
3163     static const u32 ar9300Modes_lowest_ob_db_tx_gain_table_2p2[][5] = {
3164     /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
3165     + {0x0000a2dc, 0x0380c7fc, 0x0380c7fc, 0x00637800, 0x00637800},
3166     + {0x0000a2e0, 0x0000f800, 0x0000f800, 0x03838000, 0x03838000},
3167     + {0x0000a2e4, 0x03ff0000, 0x03ff0000, 0x03fc0000, 0x03fc0000},
3168     + {0x0000a2e8, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
3169     {0x0000a410, 0x000050d9, 0x000050d9, 0x000050d9, 0x000050d9},
3170     {0x0000a500, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
3171     {0x0000a504, 0x06000003, 0x06000003, 0x04000002, 0x04000002},
3172     @@ -99,6 +103,30 @@ static const u32 ar9300Modes_lowest_ob_db_tx_gain_table_2p2[][5] = {
3173     {0x0000a5f4, 0x7782b08c, 0x7782b08c, 0x5d801eec, 0x5d801eec},
3174     {0x0000a5f8, 0x7782b08c, 0x7782b08c, 0x5d801eec, 0x5d801eec},
3175     {0x0000a5fc, 0x7782b08c, 0x7782b08c, 0x5d801eec, 0x5d801eec},
3176     + {0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
3177     + {0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
3178     + {0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
3179     + {0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
3180     + {0x0000a610, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
3181     + {0x0000a614, 0x01404000, 0x01404000, 0x01404000, 0x01404000},
3182     + {0x0000a618, 0x01404501, 0x01404501, 0x01404501, 0x01404501},
3183     + {0x0000a61c, 0x02008802, 0x02008802, 0x02008501, 0x02008501},
3184     + {0x0000a620, 0x0300cc03, 0x0300cc03, 0x0280ca03, 0x0280ca03},
3185     + {0x0000a624, 0x0300cc03, 0x0300cc03, 0x03010c04, 0x03010c04},
3186     + {0x0000a628, 0x0300cc03, 0x0300cc03, 0x04014c04, 0x04014c04},
3187     + {0x0000a62c, 0x03810c03, 0x03810c03, 0x04015005, 0x04015005},
3188     + {0x0000a630, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005},
3189     + {0x0000a634, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005},
3190     + {0x0000a638, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005},
3191     + {0x0000a63c, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005},
3192     + {0x0000b2dc, 0x0380c7fc, 0x0380c7fc, 0x00637800, 0x00637800},
3193     + {0x0000b2e0, 0x0000f800, 0x0000f800, 0x03838000, 0x03838000},
3194     + {0x0000b2e4, 0x03ff0000, 0x03ff0000, 0x03fc0000, 0x03fc0000},
3195     + {0x0000b2e8, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
3196     + {0x0000c2dc, 0x0380c7fc, 0x0380c7fc, 0x00637800, 0x00637800},
3197     + {0x0000c2e0, 0x0000f800, 0x0000f800, 0x03838000, 0x03838000},
3198     + {0x0000c2e4, 0x03ff0000, 0x03ff0000, 0x03fc0000, 0x03fc0000},
3199     + {0x0000c2e8, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
3200     {0x00016044, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4},
3201     {0x00016048, 0x62480001, 0x62480001, 0x62480001, 0x62480001},
3202     {0x00016068, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c},
3203     @@ -118,7 +146,7 @@ static const u32 ar9300Modes_fast_clock_2p2[][3] = {
3204     {0x00008014, 0x044c044c, 0x08980898},
3205     {0x0000801c, 0x148ec02b, 0x148ec057},
3206     {0x00008318, 0x000044c0, 0x00008980},
3207     - {0x00009e00, 0x03721821, 0x03721821},
3208     + {0x00009e00, 0x0372131c, 0x0372131c},
3209     {0x0000a230, 0x0000000b, 0x00000016},
3210     {0x0000a254, 0x00000898, 0x00001130},
3211     };
3212     @@ -595,15 +623,16 @@ static const u32 ar9300_2p2_baseband_postamble[][5] = {
3213     {0x0000982c, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4},
3214     {0x00009830, 0x0000059c, 0x0000059c, 0x0000119c, 0x0000119c},
3215     {0x00009c00, 0x000000c4, 0x000000c4, 0x000000c4, 0x000000c4},
3216     - {0x00009e00, 0x0372161e, 0x0372161e, 0x037216a0, 0x037216a0},
3217     - {0x00009e04, 0x00802020, 0x00802020, 0x00802020, 0x00802020},
3218     + {0x00009e00, 0x0372111a, 0x0372111a, 0x037216a0, 0x037216a0},
3219     + {0x00009e04, 0x001c2020, 0x001c2020, 0x001c2020, 0x001c2020},
3220     {0x00009e0c, 0x6c4000e2, 0x6d4000e2, 0x6d4000e2, 0x6c4000e2},
3221     {0x00009e10, 0x7ec88d2e, 0x7ec88d2e, 0x7ec84d2e, 0x7ec84d2e},
3222     - {0x00009e14, 0x31395d5e, 0x3139605e, 0x3139605e, 0x31395d5e},
3223     + {0x00009e14, 0x37b95d5e, 0x37b9605e, 0x3379605e, 0x33795d5e},
3224     {0x00009e18, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
3225     {0x00009e1c, 0x0001cf9c, 0x0001cf9c, 0x00021f9c, 0x00021f9c},
3226     {0x00009e20, 0x000003b5, 0x000003b5, 0x000003ce, 0x000003ce},
3227     {0x00009e2c, 0x0000001c, 0x0000001c, 0x00000021, 0x00000021},
3228     + {0x00009e3c, 0xcf946220, 0xcf946220, 0xcf946222, 0xcf946222},
3229     {0x00009e44, 0x02321e27, 0x02321e27, 0x02291e27, 0x02291e27},
3230     {0x00009e48, 0x5030201a, 0x5030201a, 0x50302012, 0x50302012},
3231     {0x00009fc8, 0x0003f000, 0x0003f000, 0x0001a000, 0x0001a000},
3232     @@ -624,16 +653,16 @@ static const u32 ar9300_2p2_baseband_postamble[][5] = {
3233     {0x0000a28c, 0x00022222, 0x00022222, 0x00022222, 0x00022222},
3234     {0x0000a2c4, 0x00158d18, 0x00158d18, 0x00158d18, 0x00158d18},
3235     {0x0000a2d0, 0x00071981, 0x00071981, 0x00071981, 0x00071982},
3236     - {0x0000a2d8, 0xf999a83a, 0xf999a83a, 0xf999a83a, 0xf999a83a},
3237     + {0x0000a2d8, 0x7999a83a, 0x7999a83a, 0x7999a83a, 0x7999a83a},
3238     {0x0000a358, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
3239     {0x0000a830, 0x0000019c, 0x0000019c, 0x0000019c, 0x0000019c},
3240     - {0x0000ae04, 0x00800000, 0x00800000, 0x00800000, 0x00800000},
3241     + {0x0000ae04, 0x001c0000, 0x001c0000, 0x001c0000, 0x001c0000},
3242     {0x0000ae18, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
3243     {0x0000ae1c, 0x0000019c, 0x0000019c, 0x0000019c, 0x0000019c},
3244     {0x0000ae20, 0x000001b5, 0x000001b5, 0x000001ce, 0x000001ce},
3245     {0x0000b284, 0x00000000, 0x00000000, 0x00000150, 0x00000150},
3246     {0x0000b830, 0x0000019c, 0x0000019c, 0x0000019c, 0x0000019c},
3247     - {0x0000be04, 0x00800000, 0x00800000, 0x00800000, 0x00800000},
3248     + {0x0000be04, 0x001c0000, 0x001c0000, 0x001c0000, 0x001c0000},
3249     {0x0000be18, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
3250     {0x0000be1c, 0x0000019c, 0x0000019c, 0x0000019c, 0x0000019c},
3251     {0x0000be20, 0x000001b5, 0x000001b5, 0x000001ce, 0x000001ce},
3252     @@ -649,13 +678,13 @@ static const u32 ar9300_2p2_baseband_core[][2] = {
3253     {0x00009814, 0x9280c00a},
3254     {0x00009818, 0x00000000},
3255     {0x0000981c, 0x00020028},
3256     - {0x00009834, 0x5f3ca3de},
3257     + {0x00009834, 0x6400a290},
3258     {0x00009838, 0x0108ecff},
3259     {0x0000983c, 0x14750600},
3260     {0x00009880, 0x201fff00},
3261     {0x00009884, 0x00001042},
3262     {0x000098a4, 0x00200400},
3263     - {0x000098b0, 0x52440bbe},
3264     + {0x000098b0, 0x32840bbe},
3265     {0x000098d0, 0x004b6a8e},
3266     {0x000098d4, 0x00000820},
3267     {0x000098dc, 0x00000000},
3268     @@ -681,7 +710,6 @@ static const u32 ar9300_2p2_baseband_core[][2] = {
3269     {0x00009e30, 0x06336f77},
3270     {0x00009e34, 0x6af6532f},
3271     {0x00009e38, 0x0cc80c00},
3272     - {0x00009e3c, 0xcf946222},
3273     {0x00009e40, 0x0d261820},
3274     {0x00009e4c, 0x00001004},
3275     {0x00009e50, 0x00ff03f1},
3276     @@ -694,7 +722,7 @@ static const u32 ar9300_2p2_baseband_core[][2] = {
3277     {0x0000a220, 0x00000000},
3278     {0x0000a224, 0x00000000},
3279     {0x0000a228, 0x10002310},
3280     - {0x0000a22c, 0x01036a1e},
3281     + {0x0000a22c, 0x01036a27},
3282     {0x0000a23c, 0x00000000},
3283     {0x0000a244, 0x0c000000},
3284     {0x0000a2a0, 0x00000001},
3285     @@ -702,10 +730,6 @@ static const u32 ar9300_2p2_baseband_core[][2] = {
3286     {0x0000a2c8, 0x00000000},
3287     {0x0000a2cc, 0x18c43433},
3288     {0x0000a2d4, 0x00000000},
3289     - {0x0000a2dc, 0x00000000},
3290     - {0x0000a2e0, 0x00000000},
3291     - {0x0000a2e4, 0x00000000},
3292     - {0x0000a2e8, 0x00000000},
3293     {0x0000a2ec, 0x00000000},
3294     {0x0000a2f0, 0x00000000},
3295     {0x0000a2f4, 0x00000000},
3296     @@ -753,33 +777,17 @@ static const u32 ar9300_2p2_baseband_core[][2] = {
3297     {0x0000a430, 0x1ce739ce},
3298     {0x0000a434, 0x00000000},
3299     {0x0000a438, 0x00001801},
3300     - {0x0000a43c, 0x00000000},
3301     + {0x0000a43c, 0x00100000},
3302     {0x0000a440, 0x00000000},
3303     {0x0000a444, 0x00000000},
3304     {0x0000a448, 0x06000080},
3305     {0x0000a44c, 0x00000001},
3306     {0x0000a450, 0x00010000},
3307     {0x0000a458, 0x00000000},
3308     - {0x0000a600, 0x00000000},
3309     - {0x0000a604, 0x00000000},
3310     - {0x0000a608, 0x00000000},
3311     - {0x0000a60c, 0x00000000},
3312     - {0x0000a610, 0x00000000},
3313     - {0x0000a614, 0x00000000},
3314     - {0x0000a618, 0x00000000},
3315     - {0x0000a61c, 0x00000000},
3316     - {0x0000a620, 0x00000000},
3317     - {0x0000a624, 0x00000000},
3318     - {0x0000a628, 0x00000000},
3319     - {0x0000a62c, 0x00000000},
3320     - {0x0000a630, 0x00000000},
3321     - {0x0000a634, 0x00000000},
3322     - {0x0000a638, 0x00000000},
3323     - {0x0000a63c, 0x00000000},
3324     {0x0000a640, 0x00000000},
3325     {0x0000a644, 0x3fad9d74},
3326     {0x0000a648, 0x0048060a},
3327     - {0x0000a64c, 0x00000637},
3328     + {0x0000a64c, 0x00003c37},
3329     {0x0000a670, 0x03020100},
3330     {0x0000a674, 0x09080504},
3331     {0x0000a678, 0x0d0c0b0a},
3332     @@ -802,10 +810,6 @@ static const u32 ar9300_2p2_baseband_core[][2] = {
3333     {0x0000a8f4, 0x00000000},
3334     {0x0000b2d0, 0x00000080},
3335     {0x0000b2d4, 0x00000000},
3336     - {0x0000b2dc, 0x00000000},
3337     - {0x0000b2e0, 0x00000000},
3338     - {0x0000b2e4, 0x00000000},
3339     - {0x0000b2e8, 0x00000000},
3340     {0x0000b2ec, 0x00000000},
3341     {0x0000b2f0, 0x00000000},
3342     {0x0000b2f4, 0x00000000},
3343     @@ -820,10 +824,6 @@ static const u32 ar9300_2p2_baseband_core[][2] = {
3344     {0x0000b8f4, 0x00000000},
3345     {0x0000c2d0, 0x00000080},
3346     {0x0000c2d4, 0x00000000},
3347     - {0x0000c2dc, 0x00000000},
3348     - {0x0000c2e0, 0x00000000},
3349     - {0x0000c2e4, 0x00000000},
3350     - {0x0000c2e8, 0x00000000},
3351     {0x0000c2ec, 0x00000000},
3352     {0x0000c2f0, 0x00000000},
3353     {0x0000c2f4, 0x00000000},
3354     @@ -835,6 +835,10 @@ static const u32 ar9300_2p2_baseband_core[][2] = {
3355    
3356     static const u32 ar9300Modes_high_power_tx_gain_table_2p2[][5] = {
3357     /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
3358     + {0x0000a2dc, 0x0380c7fc, 0x0380c7fc, 0x00637800, 0x00637800},
3359     + {0x0000a2e0, 0x0000f800, 0x0000f800, 0x03838000, 0x03838000},
3360     + {0x0000a2e4, 0x03ff0000, 0x03ff0000, 0x03fc0000, 0x03fc0000},
3361     + {0x0000a2e8, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
3362     {0x0000a410, 0x000050d8, 0x000050d8, 0x000050d9, 0x000050d9},
3363     {0x0000a500, 0x00002220, 0x00002220, 0x00000000, 0x00000000},
3364     {0x0000a504, 0x04002222, 0x04002222, 0x04000002, 0x04000002},
3365     @@ -855,7 +859,7 @@ static const u32 ar9300Modes_high_power_tx_gain_table_2p2[][5] = {
3366     {0x0000a540, 0x49005e72, 0x49005e72, 0x38001660, 0x38001660},
3367     {0x0000a544, 0x4e005eb2, 0x4e005eb2, 0x3b001861, 0x3b001861},
3368     {0x0000a548, 0x53005f12, 0x53005f12, 0x3e001a81, 0x3e001a81},
3369     - {0x0000a54c, 0x59025eb5, 0x59025eb5, 0x42001a83, 0x42001a83},
3370     + {0x0000a54c, 0x59025eb2, 0x59025eb2, 0x42001a83, 0x42001a83},
3371     {0x0000a550, 0x5e025f12, 0x5e025f12, 0x44001c84, 0x44001c84},
3372     {0x0000a554, 0x61027f12, 0x61027f12, 0x48001ce3, 0x48001ce3},
3373     {0x0000a558, 0x6702bf12, 0x6702bf12, 0x4c001ce5, 0x4c001ce5},
3374     @@ -900,6 +904,30 @@ static const u32 ar9300Modes_high_power_tx_gain_table_2p2[][5] = {
3375     {0x0000a5f4, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec},
3376     {0x0000a5f8, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec},
3377     {0x0000a5fc, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec},
3378     + {0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
3379     + {0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
3380     + {0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
3381     + {0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
3382     + {0x0000a610, 0x00804000, 0x00804000, 0x00000000, 0x00000000},
3383     + {0x0000a614, 0x00804201, 0x00804201, 0x01404000, 0x01404000},
3384     + {0x0000a618, 0x0280c802, 0x0280c802, 0x01404501, 0x01404501},
3385     + {0x0000a61c, 0x0280ca03, 0x0280ca03, 0x02008501, 0x02008501},
3386     + {0x0000a620, 0x04c15104, 0x04c15104, 0x0280ca03, 0x0280ca03},
3387     + {0x0000a624, 0x04c15305, 0x04c15305, 0x03010c04, 0x03010c04},
3388     + {0x0000a628, 0x04c15305, 0x04c15305, 0x04014c04, 0x04014c04},
3389     + {0x0000a62c, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
3390     + {0x0000a630, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
3391     + {0x0000a634, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
3392     + {0x0000a638, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
3393     + {0x0000a63c, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
3394     + {0x0000b2dc, 0x0380c7fc, 0x0380c7fc, 0x00637800, 0x00637800},
3395     + {0x0000b2e0, 0x0000f800, 0x0000f800, 0x03838000, 0x03838000},
3396     + {0x0000b2e4, 0x03ff0000, 0x03ff0000, 0x03fc0000, 0x03fc0000},
3397     + {0x0000b2e8, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
3398     + {0x0000c2dc, 0x0380c7fc, 0x0380c7fc, 0x00637800, 0x00637800},
3399     + {0x0000c2e0, 0x0000f800, 0x0000f800, 0x03838000, 0x03838000},
3400     + {0x0000c2e4, 0x03ff0000, 0x03ff0000, 0x03fc0000, 0x03fc0000},
3401     + {0x0000c2e8, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
3402     {0x00016044, 0x056db2e6, 0x056db2e6, 0x056db2e6, 0x056db2e6},
3403     {0x00016048, 0xae480001, 0xae480001, 0xae480001, 0xae480001},
3404     {0x00016068, 0x6eb6db6c, 0x6eb6db6c, 0x6eb6db6c, 0x6eb6db6c},
3405     @@ -913,6 +941,10 @@ static const u32 ar9300Modes_high_power_tx_gain_table_2p2[][5] = {
3406    
3407     static const u32 ar9300Modes_high_ob_db_tx_gain_table_2p2[][5] = {
3408     /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
3409     + {0x0000a2dc, 0x01feee00, 0x01feee00, 0x00637800, 0x00637800},
3410     + {0x0000a2e0, 0x0000f000, 0x0000f000, 0x03838000, 0x03838000},
3411     + {0x0000a2e4, 0x01ff0000, 0x01ff0000, 0x03fc0000, 0x03fc0000},
3412     + {0x0000a2e8, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
3413     {0x0000a410, 0x000050d8, 0x000050d8, 0x000050d9, 0x000050d9},
3414     {0x0000a500, 0x00002220, 0x00002220, 0x00000000, 0x00000000},
3415     {0x0000a504, 0x04002222, 0x04002222, 0x04000002, 0x04000002},
3416     @@ -933,7 +965,7 @@ static const u32 ar9300Modes_high_ob_db_tx_gain_table_2p2[][5] = {
3417     {0x0000a540, 0x49005e72, 0x49005e72, 0x38001660, 0x38001660},
3418     {0x0000a544, 0x4e005eb2, 0x4e005eb2, 0x3b001861, 0x3b001861},
3419     {0x0000a548, 0x53005f12, 0x53005f12, 0x3e001a81, 0x3e001a81},
3420     - {0x0000a54c, 0x59025eb5, 0x59025eb5, 0x42001a83, 0x42001a83},
3421     + {0x0000a54c, 0x59025eb2, 0x59025eb2, 0x42001a83, 0x42001a83},
3422     {0x0000a550, 0x5e025f12, 0x5e025f12, 0x44001c84, 0x44001c84},
3423     {0x0000a554, 0x61027f12, 0x61027f12, 0x48001ce3, 0x48001ce3},
3424     {0x0000a558, 0x6702bf12, 0x6702bf12, 0x4c001ce5, 0x4c001ce5},
3425     @@ -978,6 +1010,30 @@ static const u32 ar9300Modes_high_ob_db_tx_gain_table_2p2[][5] = {
3426     {0x0000a5f4, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec},
3427     {0x0000a5f8, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec},
3428     {0x0000a5fc, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec},
3429     + {0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
3430     + {0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
3431     + {0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
3432     + {0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
3433     + {0x0000a610, 0x00804000, 0x00804000, 0x00000000, 0x00000000},
3434     + {0x0000a614, 0x00804201, 0x00804201, 0x01404000, 0x01404000},
3435     + {0x0000a618, 0x0280c802, 0x0280c802, 0x01404501, 0x01404501},
3436     + {0x0000a61c, 0x0280ca03, 0x0280ca03, 0x02008501, 0x02008501},
3437     + {0x0000a620, 0x04c15104, 0x04c15104, 0x0280ca03, 0x0280ca03},
3438     + {0x0000a624, 0x04c15305, 0x04c15305, 0x03010c04, 0x03010c04},
3439     + {0x0000a628, 0x04c15305, 0x04c15305, 0x04014c04, 0x04014c04},
3440     + {0x0000a62c, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
3441     + {0x0000a630, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
3442     + {0x0000a634, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
3443     + {0x0000a638, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
3444     + {0x0000a63c, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
3445     + {0x0000b2dc, 0x01feee00, 0x01feee00, 0x00637800, 0x00637800},
3446     + {0x0000b2e0, 0x0000f000, 0x0000f000, 0x03838000, 0x03838000},
3447     + {0x0000b2e4, 0x01ff0000, 0x01ff0000, 0x03fc0000, 0x03fc0000},
3448     + {0x0000b2e8, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
3449     + {0x0000c2dc, 0x01feee00, 0x01feee00, 0x00637800, 0x00637800},
3450     + {0x0000c2e0, 0x0000f000, 0x0000f000, 0x03838000, 0x03838000},
3451     + {0x0000c2e4, 0x01ff0000, 0x01ff0000, 0x03fc0000, 0x03fc0000},
3452     + {0x0000c2e8, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
3453     {0x00016044, 0x056db2e4, 0x056db2e4, 0x056db2e4, 0x056db2e4},
3454     {0x00016048, 0x8e480001, 0x8e480001, 0x8e480001, 0x8e480001},
3455     {0x00016068, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c},
3456     @@ -1151,14 +1207,14 @@ static const u32 ar9300Common_rx_gain_table_2p2[][2] = {
3457     {0x0000b074, 0x00000000},
3458     {0x0000b078, 0x00000000},
3459     {0x0000b07c, 0x00000000},
3460     - {0x0000b080, 0x32323232},
3461     - {0x0000b084, 0x2f2f3232},
3462     - {0x0000b088, 0x23282a2d},
3463     - {0x0000b08c, 0x1c1e2123},
3464     - {0x0000b090, 0x14171919},
3465     - {0x0000b094, 0x0e0e1214},
3466     - {0x0000b098, 0x03050707},
3467     - {0x0000b09c, 0x00030303},
3468     + {0x0000b080, 0x2a2d2f32},
3469     + {0x0000b084, 0x21232328},
3470     + {0x0000b088, 0x19191c1e},
3471     + {0x0000b08c, 0x12141417},
3472     + {0x0000b090, 0x07070e0e},
3473     + {0x0000b094, 0x03030305},
3474     + {0x0000b098, 0x00000003},
3475     + {0x0000b09c, 0x00000000},
3476     {0x0000b0a0, 0x00000000},
3477     {0x0000b0a4, 0x00000000},
3478     {0x0000b0a8, 0x00000000},
3479     @@ -1251,6 +1307,10 @@ static const u32 ar9300Common_rx_gain_table_2p2[][2] = {
3480    
3481     static const u32 ar9300Modes_low_ob_db_tx_gain_table_2p2[][5] = {
3482     /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
3483     + {0x0000a2dc, 0x0380c7fc, 0x0380c7fc, 0x00637800, 0x00637800},
3484     + {0x0000a2e0, 0x0000f800, 0x0000f800, 0x03838000, 0x03838000},
3485     + {0x0000a2e4, 0x03ff0000, 0x03ff0000, 0x03fc0000, 0x03fc0000},
3486     + {0x0000a2e8, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
3487     {0x0000a410, 0x000050d9, 0x000050d9, 0x000050d9, 0x000050d9},
3488     {0x0000a500, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
3489     {0x0000a504, 0x06000003, 0x06000003, 0x04000002, 0x04000002},
3490     @@ -1316,6 +1376,30 @@ static const u32 ar9300Modes_low_ob_db_tx_gain_table_2p2[][5] = {
3491     {0x0000a5f4, 0x7782b08c, 0x7782b08c, 0x5d801eec, 0x5d801eec},
3492     {0x0000a5f8, 0x7782b08c, 0x7782b08c, 0x5d801eec, 0x5d801eec},
3493     {0x0000a5fc, 0x7782b08c, 0x7782b08c, 0x5d801eec, 0x5d801eec},
3494     + {0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
3495     + {0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
3496     + {0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
3497     + {0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
3498     + {0x0000a610, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
3499     + {0x0000a614, 0x01404000, 0x01404000, 0x01404000, 0x01404000},
3500     + {0x0000a618, 0x01404501, 0x01404501, 0x01404501, 0x01404501},
3501     + {0x0000a61c, 0x02008802, 0x02008802, 0x02008501, 0x02008501},
3502     + {0x0000a620, 0x0300cc03, 0x0300cc03, 0x0280ca03, 0x0280ca03},
3503     + {0x0000a624, 0x0300cc03, 0x0300cc03, 0x03010c04, 0x03010c04},
3504     + {0x0000a628, 0x0300cc03, 0x0300cc03, 0x04014c04, 0x04014c04},
3505     + {0x0000a62c, 0x03810c03, 0x03810c03, 0x04015005, 0x04015005},
3506     + {0x0000a630, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005},
3507     + {0x0000a634, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005},
3508     + {0x0000a638, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005},
3509     + {0x0000a63c, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005},
3510     + {0x0000b2dc, 0x0380c7fc, 0x0380c7fc, 0x00637800, 0x00637800},
3511     + {0x0000b2e0, 0x0000f800, 0x0000f800, 0x03838000, 0x03838000},
3512     + {0x0000b2e4, 0x03ff0000, 0x03ff0000, 0x03fc0000, 0x03fc0000},
3513     + {0x0000b2e8, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
3514     + {0x0000c2dc, 0x0380c7fc, 0x0380c7fc, 0x00637800, 0x00637800},
3515     + {0x0000c2e0, 0x0000f800, 0x0000f800, 0x03838000, 0x03838000},
3516     + {0x0000c2e4, 0x03ff0000, 0x03ff0000, 0x03fc0000, 0x03fc0000},
3517     + {0x0000c2e8, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
3518     {0x00016044, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4},
3519     {0x00016048, 0x66480001, 0x66480001, 0x66480001, 0x66480001},
3520     {0x00016068, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c},
3521     @@ -1414,15 +1498,10 @@ static const u32 ar9300_2p2_mac_core[][2] = {
3522     {0x00008144, 0xffffffff},
3523     {0x00008168, 0x00000000},
3524     {0x0000816c, 0x00000000},
3525     - {0x00008170, 0x18486200},
3526     - {0x00008174, 0x33332210},
3527     - {0x00008178, 0x00000000},
3528     - {0x0000817c, 0x00020000},
3529     {0x000081c0, 0x00000000},
3530     {0x000081c4, 0x33332210},
3531     {0x000081c8, 0x00000000},
3532     {0x000081cc, 0x00000000},
3533     - {0x000081d4, 0x00000000},
3534     {0x000081ec, 0x00000000},
3535     {0x000081f0, 0x00000000},
3536     {0x000081f4, 0x00000000},
3537     diff --git a/drivers/net/wireless/ath/ath9k/ar9003_mac.c b/drivers/net/wireless/ath/ath9k/ar9003_mac.c
3538     index 5b995be..1a0ab70 100644
3539     --- a/drivers/net/wireless/ath/ath9k/ar9003_mac.c
3540     +++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.c
3541     @@ -616,7 +616,8 @@ int ath9k_hw_process_rxdesc_edma(struct ath_hw *ah, struct ath_rx_status *rxs,
3542     rxs->rs_status |= ATH9K_RXERR_DECRYPT;
3543     } else if (rxsp->status11 & AR_MichaelErr) {
3544     rxs->rs_status |= ATH9K_RXERR_MIC;
3545     - }
3546     + } else if (rxsp->status11 & AR_KeyMiss)
3547     + rxs->rs_status |= ATH9K_RXERR_DECRYPT;
3548     }
3549    
3550     return 0;
3551     diff --git a/drivers/net/wireless/ath/ath9k/ar9003_paprd.c b/drivers/net/wireless/ath/ath9k/ar9003_paprd.c
3552     index 7c38229..716db41 100644
3553     --- a/drivers/net/wireless/ath/ath9k/ar9003_paprd.c
3554     +++ b/drivers/net/wireless/ath/ath9k/ar9003_paprd.c
3555     @@ -347,6 +347,10 @@ static bool create_pa_curve(u32 *data_L, u32 *data_U, u32 *pa_table, u16 *gain)
3556     (((Y[6] - Y[3]) * 1 << scale_factor) +
3557     (x_est[6] - x_est[3])) / (x_est[6] - x_est[3]);
3558    
3559     + /* prevent division by zero */
3560     + if (G_fxp == 0)
3561     + return false;
3562     +
3563     Y_intercept =
3564     (G_fxp * (x_est[0] - x_est[3]) +
3565     (1 << scale_factor)) / (1 << scale_factor) + Y[3];
3566     @@ -356,14 +360,12 @@ static bool create_pa_curve(u32 *data_L, u32 *data_U, u32 *pa_table, u16 *gain)
3567    
3568     for (i = 0; i <= 3; i++) {
3569     y_est[i] = i * 32;
3570     -
3571     - /* prevent division by zero */
3572     - if (G_fxp == 0)
3573     - return false;
3574     -
3575     x_est[i] = ((y_est[i] * 1 << scale_factor) + G_fxp) / G_fxp;
3576     }
3577    
3578     + if (y_est[max_index] == 0)
3579     + return false;
3580     +
3581     x_est_fxp1_nonlin =
3582     x_est[max_index] - ((1 << scale_factor) * y_est[max_index] +
3583     G_fxp) / G_fxp;
3584     @@ -457,6 +459,8 @@ static bool create_pa_curve(u32 *data_L, u32 *data_U, u32 *pa_table, u16 *gain)
3585    
3586     Q_scale_B = find_proper_scale(find_expn(abs(scale_B)), 10);
3587     scale_B = scale_B / (1 << Q_scale_B);
3588     + if (scale_B == 0)
3589     + return false;
3590     Q_beta = find_proper_scale(find_expn(abs(beta_raw)), 10);
3591     Q_alpha = find_proper_scale(find_expn(abs(alpha_raw)), 10);
3592     beta_raw = beta_raw / (1 << Q_beta);
3593     diff --git a/drivers/net/wireless/ath/ath9k/ath9k.h b/drivers/net/wireless/ath/ath9k/ath9k.h
3594     index 07f26ee..e7ab702 100644
3595     --- a/drivers/net/wireless/ath/ath9k/ath9k.h
3596     +++ b/drivers/net/wireless/ath/ath9k/ath9k.h
3597     @@ -312,7 +312,7 @@ struct ath_rx {
3598     u8 rxotherant;
3599     u32 *rxlink;
3600     unsigned int rxfilter;
3601     - spinlock_t rxflushlock;
3602     + spinlock_t pcu_lock;
3603     spinlock_t rxbuflock;
3604     struct list_head rxbuf;
3605     struct ath_descdma rxdma;
3606     @@ -346,8 +346,8 @@ void ath_tx_tasklet(struct ath_softc *sc);
3607     void ath_tx_edma_tasklet(struct ath_softc *sc);
3608     void ath_tx_cabq(struct ieee80211_hw *hw, struct sk_buff *skb);
3609     bool ath_tx_aggr_check(struct ath_softc *sc, struct ath_node *an, u8 tidno);
3610     -void ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta,
3611     - u16 tid, u16 *ssn);
3612     +int ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta,
3613     + u16 tid, u16 *ssn);
3614     void ath_tx_aggr_stop(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid);
3615     void ath_tx_aggr_resume(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid);
3616     void ath9k_enable_ps(struct ath_softc *sc);
3617     @@ -516,7 +516,6 @@ void ath_deinit_leds(struct ath_softc *sc);
3618     #define SC_OP_RXFLUSH BIT(7)
3619     #define SC_OP_LED_ASSOCIATED BIT(8)
3620     #define SC_OP_LED_ON BIT(9)
3621     -#define SC_OP_SCANNING BIT(10)
3622     #define SC_OP_TSF_RESET BIT(11)
3623     #define SC_OP_BT_PRIORITY_DETECTED BIT(12)
3624     #define SC_OP_BT_SCAN BIT(13)
3625     diff --git a/drivers/net/wireless/ath/ath9k/beacon.c b/drivers/net/wireless/ath/ath9k/beacon.c
3626     index 4d4b22d..20cf2d4 100644
3627     --- a/drivers/net/wireless/ath/ath9k/beacon.c
3628     +++ b/drivers/net/wireless/ath/ath9k/beacon.c
3629     @@ -366,7 +366,7 @@ void ath_beacon_tasklet(unsigned long data)
3630     ath_print(common, ATH_DBG_BEACON,
3631     "beacon is officially stuck\n");
3632     sc->sc_flags |= SC_OP_TSF_RESET;
3633     - ath_reset(sc, false);
3634     + ath_reset(sc, true);
3635     }
3636    
3637     return;
3638     diff --git a/drivers/net/wireless/ath/ath9k/common.c b/drivers/net/wireless/ath/ath9k/common.c
3639     index c86f7d3..108b433 100644
3640     --- a/drivers/net/wireless/ath/ath9k/common.c
3641     +++ b/drivers/net/wireless/ath/ath9k/common.c
3642     @@ -366,9 +366,13 @@ int ath9k_cmn_key_config(struct ath_common *common,
3643     set_bit(idx, common->keymap);
3644     if (key->alg == ALG_TKIP) {
3645     set_bit(idx + 64, common->keymap);
3646     + set_bit(idx, common->tkip_keymap);
3647     + set_bit(idx + 64, common->tkip_keymap);
3648     if (common->splitmic) {
3649     set_bit(idx + 32, common->keymap);
3650     set_bit(idx + 64 + 32, common->keymap);
3651     + set_bit(idx + 32, common->tkip_keymap);
3652     + set_bit(idx + 64 + 32, common->tkip_keymap);
3653     }
3654     }
3655    
3656     @@ -393,10 +397,17 @@ void ath9k_cmn_key_delete(struct ath_common *common,
3657     return;
3658    
3659     clear_bit(key->hw_key_idx + 64, common->keymap);
3660     +
3661     + clear_bit(key->hw_key_idx, common->tkip_keymap);
3662     + clear_bit(key->hw_key_idx + 64, common->tkip_keymap);
3663     +
3664     if (common->splitmic) {
3665     ath9k_hw_keyreset(ah, key->hw_key_idx + 32);
3666     clear_bit(key->hw_key_idx + 32, common->keymap);
3667     clear_bit(key->hw_key_idx + 64 + 32, common->keymap);
3668     +
3669     + clear_bit(key->hw_key_idx + 32, common->tkip_keymap);
3670     + clear_bit(key->hw_key_idx + 64 + 32, common->tkip_keymap);
3671     }
3672     }
3673     EXPORT_SYMBOL(ath9k_cmn_key_delete);
3674     diff --git a/drivers/net/wireless/ath/ath9k/eeprom_9287.c b/drivers/net/wireless/ath/ath9k/eeprom_9287.c
3675     index dff2da7..7cb356e 100644
3676     --- a/drivers/net/wireless/ath/ath9k/eeprom_9287.c
3677     +++ b/drivers/net/wireless/ath/ath9k/eeprom_9287.c
3678     @@ -37,7 +37,7 @@ static bool ath9k_hw_ar9287_fill_eeprom(struct ath_hw *ah)
3679     int addr, eep_start_loc;
3680     eep_data = (u16 *)eep;
3681    
3682     - if (ah->hw_version.devid == 0x7015)
3683     + if (AR9287_HTC_DEVID(ah))
3684     eep_start_loc = AR9287_HTC_EEP_START_LOC;
3685     else
3686     eep_start_loc = AR9287_EEP_START_LOC;
3687     diff --git a/drivers/net/wireless/ath/ath9k/hif_usb.c b/drivers/net/wireless/ath/ath9k/hif_usb.c
3688     index 17e7a9a..aba49bf 100644
3689     --- a/drivers/net/wireless/ath/ath9k/hif_usb.c
3690     +++ b/drivers/net/wireless/ath/ath9k/hif_usb.c
3691     @@ -35,8 +35,14 @@ static struct usb_device_id ath9k_hif_usb_ids[] = {
3692     { USB_DEVICE(0x07D1, 0x3A10) }, /* Dlink Wireless 150 */
3693     { USB_DEVICE(0x13D3, 0x3327) }, /* Azurewave */
3694     { USB_DEVICE(0x13D3, 0x3328) }, /* Azurewave */
3695     + { USB_DEVICE(0x13D3, 0x3346) }, /* IMC Networks */
3696     + { USB_DEVICE(0x13D3, 0x3348) }, /* Azurewave */
3697     + { USB_DEVICE(0x13D3, 0x3349) }, /* Azurewave */
3698     + { USB_DEVICE(0x13D3, 0x3350) }, /* Azurewave */
3699     { USB_DEVICE(0x04CA, 0x4605) }, /* Liteon */
3700     { USB_DEVICE(0x083A, 0xA704) }, /* SMC Networks */
3701     + { USB_DEVICE(0x040D, 0x3801) }, /* VIA */
3702     + { USB_DEVICE(0x1668, 0x1200) }, /* Verizon */
3703     { },
3704     };
3705    
3706     @@ -799,10 +805,18 @@ static int ath9k_hif_usb_download_fw(struct hif_device_usb *hif_dev)
3707     }
3708     kfree(buf);
3709    
3710     - if ((hif_dev->device_id == 0x7010) || (hif_dev->device_id == 0x7015))
3711     + switch (hif_dev->device_id) {
3712     + case 0x7010:
3713     + case 0x7015:
3714     + case 0x9018:
3715     + case 0xA704:
3716     + case 0x1200:
3717     firm_offset = AR7010_FIRMWARE_TEXT;
3718     - else
3719     + break;
3720     + default:
3721     firm_offset = AR9271_FIRMWARE_TEXT;
3722     + break;
3723     + }
3724    
3725     /*
3726     * Issue FW download complete command to firmware.
3727     @@ -903,6 +917,8 @@ static int ath9k_hif_usb_probe(struct usb_interface *interface,
3728     case 0x7010:
3729     case 0x7015:
3730     case 0x9018:
3731     + case 0xA704:
3732     + case 0x1200:
3733     if (le16_to_cpu(udev->descriptor.bcdDevice) == 0x0202)
3734     hif_dev->fw_name = FIRMWARE_AR7010_1_1;
3735     else
3736     diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_init.c b/drivers/net/wireless/ath/ath9k/htc_drv_init.c
3737     index 2d42791..e5a0122 100644
3738     --- a/drivers/net/wireless/ath/ath9k/htc_drv_init.c
3739     +++ b/drivers/net/wireless/ath/ath9k/htc_drv_init.c
3740     @@ -247,6 +247,8 @@ static int ath9k_init_htc_services(struct ath9k_htc_priv *priv, u16 devid)
3741     case 0x7010:
3742     case 0x7015:
3743     case 0x9018:
3744     + case 0xA704:
3745     + case 0x1200:
3746     priv->htc->credits = 45;
3747     break;
3748     default:
3749     diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
3750     index 2a6e45a..f06eeab 100644
3751     --- a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
3752     +++ b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
3753     @@ -121,7 +121,7 @@ int ath9k_htc_tx_start(struct ath9k_htc_priv *priv, struct sk_buff *skb)
3754     tx_hdr.data_type = ATH9K_HTC_NORMAL;
3755     }
3756    
3757     - if (ieee80211_is_data(fc)) {
3758     + if (ieee80211_is_data_qos(fc)) {
3759     qc = ieee80211_get_qos_ctl(hdr);
3760     tx_hdr.tidno = qc[0] & IEEE80211_QOS_CTL_TID_MASK;
3761     }
3762     diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c
3763     index 3384ca1..a5779a7 100644
3764     --- a/drivers/net/wireless/ath/ath9k/hw.c
3765     +++ b/drivers/net/wireless/ath/ath9k/hw.c
3766     @@ -486,6 +486,7 @@ static int ath9k_hw_post_init(struct ath_hw *ah)
3767     ath_print(ath9k_hw_common(ah), ATH_DBG_FATAL,
3768     "Failed allocating banks for "
3769     "external radio\n");
3770     + ath9k_hw_rf_free_ext_banks(ah);
3771     return ecode;
3772     }
3773    
3774     diff --git a/drivers/net/wireless/ath/ath9k/init.c b/drivers/net/wireless/ath/ath9k/init.c
3775     index 243c177..7924123 100644
3776     --- a/drivers/net/wireless/ath/ath9k/init.c
3777     +++ b/drivers/net/wireless/ath/ath9k/init.c
3778     @@ -56,7 +56,7 @@ MODULE_PARM_DESC(blink, "Enable LED blink on activity");
3779     * on 5 MHz steps, we support the channels which we know
3780     * we have calibration data for all cards though to make
3781     * this static */
3782     -static struct ieee80211_channel ath9k_2ghz_chantable[] = {
3783     +static const struct ieee80211_channel ath9k_2ghz_chantable[] = {
3784     CHAN2G(2412, 0), /* Channel 1 */
3785     CHAN2G(2417, 1), /* Channel 2 */
3786     CHAN2G(2422, 2), /* Channel 3 */
3787     @@ -77,7 +77,7 @@ static struct ieee80211_channel ath9k_2ghz_chantable[] = {
3788     * on 5 MHz steps, we support the channels which we know
3789     * we have calibration data for all cards though to make
3790     * this static */
3791     -static struct ieee80211_channel ath9k_5ghz_chantable[] = {
3792     +static const struct ieee80211_channel ath9k_5ghz_chantable[] = {
3793     /* _We_ call this UNII 1 */
3794     CHAN5G(5180, 14), /* Channel 36 */
3795     CHAN5G(5200, 15), /* Channel 40 */
3796     @@ -477,10 +477,17 @@ err:
3797     return -EIO;
3798     }
3799    
3800     -static void ath9k_init_channels_rates(struct ath_softc *sc)
3801     +static int ath9k_init_channels_rates(struct ath_softc *sc)
3802     {
3803     + void *channels;
3804     +
3805     if (test_bit(ATH9K_MODE_11G, sc->sc_ah->caps.wireless_modes)) {
3806     - sc->sbands[IEEE80211_BAND_2GHZ].channels = ath9k_2ghz_chantable;
3807     + channels = kmemdup(ath9k_2ghz_chantable,
3808     + sizeof(ath9k_2ghz_chantable), GFP_KERNEL);
3809     + if (!channels)
3810     + return -ENOMEM;
3811     +
3812     + sc->sbands[IEEE80211_BAND_2GHZ].channels = channels;
3813     sc->sbands[IEEE80211_BAND_2GHZ].band = IEEE80211_BAND_2GHZ;
3814     sc->sbands[IEEE80211_BAND_2GHZ].n_channels =
3815     ARRAY_SIZE(ath9k_2ghz_chantable);
3816     @@ -490,7 +497,15 @@ static void ath9k_init_channels_rates(struct ath_softc *sc)
3817     }
3818    
3819     if (test_bit(ATH9K_MODE_11A, sc->sc_ah->caps.wireless_modes)) {
3820     - sc->sbands[IEEE80211_BAND_5GHZ].channels = ath9k_5ghz_chantable;
3821     + channels = kmemdup(ath9k_5ghz_chantable,
3822     + sizeof(ath9k_5ghz_chantable), GFP_KERNEL);
3823     + if (!channels) {
3824     + if (sc->sbands[IEEE80211_BAND_2GHZ].channels)
3825     + kfree(sc->sbands[IEEE80211_BAND_2GHZ].channels);
3826     + return -ENOMEM;
3827     + }
3828     +
3829     + sc->sbands[IEEE80211_BAND_5GHZ].channels = channels;
3830     sc->sbands[IEEE80211_BAND_5GHZ].band = IEEE80211_BAND_5GHZ;
3831     sc->sbands[IEEE80211_BAND_5GHZ].n_channels =
3832     ARRAY_SIZE(ath9k_5ghz_chantable);
3833     @@ -499,6 +514,7 @@ static void ath9k_init_channels_rates(struct ath_softc *sc)
3834     sc->sbands[IEEE80211_BAND_5GHZ].n_bitrates =
3835     ARRAY_SIZE(ath9k_legacy_rates) - 4;
3836     }
3837     + return 0;
3838     }
3839    
3840     static void ath9k_init_misc(struct ath_softc *sc)
3841     @@ -593,8 +609,11 @@ static int ath9k_init_softc(u16 devid, struct ath_softc *sc, u16 subsysid,
3842     if (ret)
3843     goto err_btcoex;
3844    
3845     + ret = ath9k_init_channels_rates(sc);
3846     + if (ret)
3847     + goto err_btcoex;
3848     +
3849     ath9k_init_crypto(sc);
3850     - ath9k_init_channels_rates(sc);
3851     ath9k_init_misc(sc);
3852    
3853     return 0;
3854     @@ -641,7 +660,8 @@ void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw)
3855     BIT(NL80211_IFTYPE_ADHOC) |
3856     BIT(NL80211_IFTYPE_MESH_POINT);
3857    
3858     - hw->wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT;
3859     + if (AR_SREV_5416(sc->sc_ah))
3860     + hw->wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT;
3861    
3862     hw->queues = 4;
3863     hw->max_rates = 4;
3864     @@ -751,6 +771,12 @@ static void ath9k_deinit_softc(struct ath_softc *sc)
3865     {
3866     int i = 0;
3867    
3868     + if (sc->sbands[IEEE80211_BAND_2GHZ].channels)
3869     + kfree(sc->sbands[IEEE80211_BAND_2GHZ].channels);
3870     +
3871     + if (sc->sbands[IEEE80211_BAND_5GHZ].channels)
3872     + kfree(sc->sbands[IEEE80211_BAND_5GHZ].channels);
3873     +
3874     if ((sc->btcoex.no_stomp_timer) &&
3875     sc->sc_ah->btcoex_hw.scheme == ATH_BTCOEX_CFG_3WIRE)
3876     ath_gen_timer_free(sc->sc_ah, sc->btcoex.no_stomp_timer);
3877     diff --git a/drivers/net/wireless/ath/ath9k/mac.c b/drivers/net/wireless/ath/ath9k/mac.c
3878     index e955bb9..3efda8a 100644
3879     --- a/drivers/net/wireless/ath/ath9k/mac.c
3880     +++ b/drivers/net/wireless/ath/ath9k/mac.c
3881     @@ -711,8 +711,11 @@ int ath9k_hw_rxprocdesc(struct ath_hw *ah, struct ath_desc *ds,
3882     rs->rs_phyerr = phyerr;
3883     } else if (ads.ds_rxstatus8 & AR_DecryptCRCErr)
3884     rs->rs_status |= ATH9K_RXERR_DECRYPT;
3885     - else if (ads.ds_rxstatus8 & AR_MichaelErr)
3886     + else if ((ads.ds_rxstatus8 & AR_MichaelErr) &&
3887     + rs->rs_keyix != ATH9K_RXKEYIX_INVALID)
3888     rs->rs_status |= ATH9K_RXERR_MIC;
3889     + else if (ads.ds_rxstatus8 & AR_KeyMiss)
3890     + rs->rs_status |= ATH9K_RXERR_DECRYPT;
3891     }
3892    
3893     return 0;
3894     diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
3895     index 3caa323..853919c 100644
3896     --- a/drivers/net/wireless/ath/ath9k/main.c
3897     +++ b/drivers/net/wireless/ath/ath9k/main.c
3898     @@ -213,6 +213,9 @@ int ath_set_channel(struct ath_softc *sc, struct ieee80211_hw *hw,
3899     */
3900     ath9k_hw_set_interrupts(ah, 0);
3901     ath_drain_all_txq(sc, false);
3902     +
3903     + spin_lock_bh(&sc->rx.pcu_lock);
3904     +
3905     stopped = ath_stoprecv(sc);
3906    
3907     /* XXX: do not flush receive queue here. We don't want
3908     @@ -239,6 +242,7 @@ int ath_set_channel(struct ath_softc *sc, struct ieee80211_hw *hw,
3909     "reset status %d\n",
3910     channel->center_freq, r);
3911     spin_unlock_bh(&sc->sc_resetlock);
3912     + spin_unlock_bh(&sc->rx.pcu_lock);
3913     goto ps_restore;
3914     }
3915     spin_unlock_bh(&sc->sc_resetlock);
3916     @@ -247,17 +251,20 @@ int ath_set_channel(struct ath_softc *sc, struct ieee80211_hw *hw,
3917     ath_print(common, ATH_DBG_FATAL,
3918     "Unable to restart recv logic\n");
3919     r = -EIO;
3920     + spin_unlock_bh(&sc->rx.pcu_lock);
3921     goto ps_restore;
3922     }
3923    
3924     + spin_unlock_bh(&sc->rx.pcu_lock);
3925     +
3926     ath_cache_conf_rate(sc, &hw->conf);
3927     ath_update_txpow(sc);
3928     ath9k_hw_set_interrupts(ah, ah->imask);
3929    
3930     - if (!(sc->sc_flags & (SC_OP_OFFCHANNEL | SC_OP_SCANNING))) {
3931     - ath_start_ani(common);
3932     - ieee80211_queue_delayed_work(sc->hw, &sc->tx_complete_work, 0);
3933     + if (!(sc->sc_flags & (SC_OP_OFFCHANNEL))) {
3934     ath_beacon_config(sc, NULL);
3935     + ieee80211_queue_delayed_work(sc->hw, &sc->tx_complete_work, 0);
3936     + ath_start_ani(common);
3937     }
3938    
3939     ps_restore:
3940     @@ -269,6 +276,7 @@ static void ath_paprd_activate(struct ath_softc *sc)
3941     {
3942     struct ath_hw *ah = sc->sc_ah;
3943     struct ath9k_hw_cal_data *caldata = ah->caldata;
3944     + struct ath_common *common = ath9k_hw_common(ah);
3945     int chain;
3946    
3947     if (!caldata || !caldata->paprd_done)
3948     @@ -277,7 +285,7 @@ static void ath_paprd_activate(struct ath_softc *sc)
3949     ath9k_ps_wakeup(sc);
3950     ar9003_paprd_enable(ah, false);
3951     for (chain = 0; chain < AR9300_MAX_CHAINS; chain++) {
3952     - if (!(ah->caps.tx_chainmask & BIT(chain)))
3953     + if (!(common->tx_chainmask & BIT(chain)))
3954     continue;
3955    
3956     ar9003_paprd_populate_single_table(ah, caldata, chain);
3957     @@ -299,6 +307,7 @@ void ath_paprd_calibrate(struct work_struct *work)
3958     struct ieee80211_supported_band *sband = &sc->sbands[band];
3959     struct ath_tx_control txctl;
3960     struct ath9k_hw_cal_data *caldata = ah->caldata;
3961     + struct ath_common *common = ath9k_hw_common(ah);
3962     int qnum, ftype;
3963     int chain_ok = 0;
3964     int chain;
3965     @@ -332,7 +341,7 @@ void ath_paprd_calibrate(struct work_struct *work)
3966     ath9k_ps_wakeup(sc);
3967     ar9003_paprd_init_table(ah);
3968     for (chain = 0; chain < AR9300_MAX_CHAINS; chain++) {
3969     - if (!(ah->caps.tx_chainmask & BIT(chain)))
3970     + if (!(common->tx_chainmask & BIT(chain)))
3971     continue;
3972    
3973     chain_ok = 0;
3974     @@ -550,7 +559,7 @@ void ath_hw_check(struct work_struct *work)
3975    
3976     msleep(1);
3977     }
3978     - ath_reset(sc, false);
3979     + ath_reset(sc, true);
3980    
3981     out:
3982     ath9k_ps_restore(sc);
3983     @@ -568,7 +577,7 @@ void ath9k_tasklet(unsigned long data)
3984     ath9k_ps_wakeup(sc);
3985    
3986     if (status & ATH9K_INT_FATAL) {
3987     - ath_reset(sc, false);
3988     + ath_reset(sc, true);
3989     ath9k_ps_restore(sc);
3990     return;
3991     }
3992     @@ -583,7 +592,7 @@ void ath9k_tasklet(unsigned long data)
3993     rxmask = (ATH9K_INT_RX | ATH9K_INT_RXEOL | ATH9K_INT_RXORN);
3994    
3995     if (status & rxmask) {
3996     - spin_lock_bh(&sc->rx.rxflushlock);
3997     + spin_lock_bh(&sc->rx.pcu_lock);
3998    
3999     /* Check for high priority Rx first */
4000     if ((ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) &&
4001     @@ -591,7 +600,7 @@ void ath9k_tasklet(unsigned long data)
4002     ath_rx_tasklet(sc, 0, true);
4003    
4004     ath_rx_tasklet(sc, 0, false);
4005     - spin_unlock_bh(&sc->rx.rxflushlock);
4006     + spin_unlock_bh(&sc->rx.pcu_lock);
4007     }
4008    
4009     if (status & ATH9K_INT_TX) {
4010     @@ -838,6 +847,7 @@ void ath_radio_enable(struct ath_softc *sc, struct ieee80211_hw *hw)
4011     if (!ah->curchan)
4012     ah->curchan = ath_get_curchannel(sc, sc->hw);
4013    
4014     + spin_lock_bh(&sc->rx.pcu_lock);
4015     spin_lock_bh(&sc->sc_resetlock);
4016     r = ath9k_hw_reset(ah, ah->curchan, ah->caldata, false);
4017     if (r) {
4018     @@ -852,8 +862,10 @@ void ath_radio_enable(struct ath_softc *sc, struct ieee80211_hw *hw)
4019     if (ath_startrecv(sc) != 0) {
4020     ath_print(common, ATH_DBG_FATAL,
4021     "Unable to restart recv logic\n");
4022     + spin_unlock_bh(&sc->rx.pcu_lock);
4023     return;
4024     }
4025     + spin_unlock_bh(&sc->rx.pcu_lock);
4026    
4027     if (sc->sc_flags & SC_OP_BEACONS)
4028     ath_beacon_config(sc, NULL); /* restart beacons */
4029     @@ -892,6 +904,9 @@ void ath_radio_disable(struct ath_softc *sc, struct ieee80211_hw *hw)
4030     ath9k_hw_set_interrupts(ah, 0);
4031    
4032     ath_drain_all_txq(sc, false); /* clear pending tx frames */
4033     +
4034     + spin_lock_bh(&sc->rx.pcu_lock);
4035     +
4036     ath_stoprecv(sc); /* turn off frame recv */
4037     ath_flushrecv(sc); /* flush recv queue */
4038    
4039     @@ -909,6 +924,9 @@ void ath_radio_disable(struct ath_softc *sc, struct ieee80211_hw *hw)
4040     spin_unlock_bh(&sc->sc_resetlock);
4041    
4042     ath9k_hw_phy_disable(ah);
4043     +
4044     + spin_unlock_bh(&sc->rx.pcu_lock);
4045     +
4046     ath9k_hw_configpcipowersave(ah, 1, 1);
4047     ath9k_ps_restore(sc);
4048     ath9k_setpower(sc, ATH9K_PM_FULL_SLEEP);
4049     @@ -928,6 +946,9 @@ int ath_reset(struct ath_softc *sc, bool retry_tx)
4050    
4051     ath9k_hw_set_interrupts(ah, 0);
4052     ath_drain_all_txq(sc, retry_tx);
4053     +
4054     + spin_lock_bh(&sc->rx.pcu_lock);
4055     +
4056     ath_stoprecv(sc);
4057     ath_flushrecv(sc);
4058    
4059     @@ -942,6 +963,8 @@ int ath_reset(struct ath_softc *sc, bool retry_tx)
4060     ath_print(common, ATH_DBG_FATAL,
4061     "Unable to start recv logic\n");
4062    
4063     + spin_unlock_bh(&sc->rx.pcu_lock);
4064     +
4065     /*
4066     * We may be doing a reset in response to a request
4067     * that changes the channel so update any state that
4068     @@ -951,7 +974,7 @@ int ath_reset(struct ath_softc *sc, bool retry_tx)
4069    
4070     ath_update_txpow(sc);
4071    
4072     - if (sc->sc_flags & SC_OP_BEACONS)
4073     + if ((sc->sc_flags & SC_OP_BEACONS) || !(sc->sc_flags & (SC_OP_OFFCHANNEL)))
4074     ath_beacon_config(sc, NULL); /* restart beacons */
4075    
4076     ath9k_hw_set_interrupts(ah, ah->imask);
4077     @@ -1106,6 +1129,7 @@ static int ath9k_start(struct ieee80211_hw *hw)
4078     * be followed by initialization of the appropriate bits
4079     * and then setup of the interrupt mask.
4080     */
4081     + spin_lock_bh(&sc->rx.pcu_lock);
4082     spin_lock_bh(&sc->sc_resetlock);
4083     r = ath9k_hw_reset(ah, init_channel, ah->caldata, false);
4084     if (r) {
4085     @@ -1114,6 +1138,7 @@ static int ath9k_start(struct ieee80211_hw *hw)
4086     "(freq %u MHz)\n", r,
4087     curchan->center_freq);
4088     spin_unlock_bh(&sc->sc_resetlock);
4089     + spin_unlock_bh(&sc->rx.pcu_lock);
4090     goto mutex_unlock;
4091     }
4092     spin_unlock_bh(&sc->sc_resetlock);
4093     @@ -1135,8 +1160,10 @@ static int ath9k_start(struct ieee80211_hw *hw)
4094     ath_print(common, ATH_DBG_FATAL,
4095     "Unable to start recv logic\n");
4096     r = -EIO;
4097     + spin_unlock_bh(&sc->rx.pcu_lock);
4098     goto mutex_unlock;
4099     }
4100     + spin_unlock_bh(&sc->rx.pcu_lock);
4101    
4102     /* Setup our intr mask. */
4103     ah->imask = ATH9K_INT_TX | ATH9K_INT_RXEOL |
4104     @@ -1338,12 +1365,14 @@ static void ath9k_stop(struct ieee80211_hw *hw)
4105     * before setting the invalid flag. */
4106     ath9k_hw_set_interrupts(ah, 0);
4107    
4108     + spin_lock_bh(&sc->rx.pcu_lock);
4109     if (!(sc->sc_flags & SC_OP_INVALID)) {
4110     ath_drain_all_txq(sc, false);
4111     ath_stoprecv(sc);
4112     ath9k_hw_phy_disable(ah);
4113     } else
4114     sc->rx.rxlink = NULL;
4115     + spin_unlock_bh(&sc->rx.pcu_lock);
4116    
4117     /* disable HAL and put h/w to sleep */
4118     ath9k_hw_disable(ah);
4119     @@ -1556,6 +1585,8 @@ static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
4120     * IEEE80211_CONF_CHANGE_PS is only passed by mac80211 for STA mode.
4121     */
4122     if (changed & IEEE80211_CONF_CHANGE_PS) {
4123     + unsigned long flags;
4124     + spin_lock_irqsave(&sc->sc_pm_lock, flags);
4125     if (conf->flags & IEEE80211_CONF_PS) {
4126     sc->ps_flags |= PS_ENABLED;
4127     /*
4128     @@ -1570,7 +1601,7 @@ static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
4129     sc->ps_enabled = false;
4130     sc->ps_flags &= ~(PS_ENABLED |
4131     PS_NULLFUNC_COMPLETED);
4132     - ath9k_setpower(sc, ATH9K_PM_AWAKE);
4133     + ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_AWAKE);
4134     if (!(ah->caps.hw_caps &
4135     ATH9K_HW_CAP_AUTOSLEEP)) {
4136     ath9k_hw_setrxabort(sc->sc_ah, 0);
4137     @@ -1585,6 +1616,7 @@ static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
4138     }
4139     }
4140     }
4141     + spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
4142     }
4143    
4144     if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
4145     @@ -1968,8 +2000,9 @@ static int ath9k_ampdu_action(struct ieee80211_hw *hw,
4146     break;
4147     case IEEE80211_AMPDU_TX_START:
4148     ath9k_ps_wakeup(sc);
4149     - ath_tx_aggr_start(sc, sta, tid, ssn);
4150     - ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
4151     + ret = ath_tx_aggr_start(sc, sta, tid, ssn);
4152     + if (!ret)
4153     + ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
4154     ath9k_ps_restore(sc);
4155     break;
4156     case IEEE80211_AMPDU_TX_STOP:
4157     @@ -2032,7 +2065,6 @@ static void ath9k_sw_scan_start(struct ieee80211_hw *hw)
4158    
4159     aphy->state = ATH_WIPHY_SCAN;
4160     ath9k_wiphy_pause_all_forced(sc, aphy);
4161     - sc->sc_flags |= SC_OP_SCANNING;
4162     mutex_unlock(&sc->mutex);
4163     }
4164    
4165     @@ -2047,7 +2079,6 @@ static void ath9k_sw_scan_complete(struct ieee80211_hw *hw)
4166    
4167     mutex_lock(&sc->mutex);
4168     aphy->state = ATH_WIPHY_ACTIVE;
4169     - sc->sc_flags &= ~SC_OP_SCANNING;
4170     mutex_unlock(&sc->mutex);
4171     }
4172    
4173     diff --git a/drivers/net/wireless/ath/ath9k/rc.c b/drivers/net/wireless/ath/ath9k/rc.c
4174     index e49be73..5f825ce 100644
4175     --- a/drivers/net/wireless/ath/ath9k/rc.c
4176     +++ b/drivers/net/wireless/ath/ath9k/rc.c
4177     @@ -538,7 +538,7 @@ static u8 ath_rc_setvalid_rates(struct ath_rate_priv *ath_rc_priv,
4178     for (i = 0; i < rateset->rs_nrates; i++) {
4179     for (j = 0; j < rate_table->rate_cnt; j++) {
4180     u32 phy = rate_table->info[j].phy;
4181     - u16 rate_flags = rate_table->info[i].rate_flags;
4182     + u16 rate_flags = rate_table->info[j].rate_flags;
4183     u8 rate = rateset->rs_rates[i];
4184     u8 dot11rate = rate_table->info[j].dot11rate;
4185    
4186     @@ -1359,6 +1359,12 @@ static void ath_tx_status(void *priv, struct ieee80211_supported_band *sband,
4187     if (tx_info->flags & IEEE80211_TX_STAT_TX_FILTERED)
4188     return;
4189    
4190     + if (!(tx_info->flags & IEEE80211_TX_STAT_AMPDU)) {
4191     + tx_info->status.ampdu_ack_len =
4192     + (tx_info->flags & IEEE80211_TX_STAT_ACK ? 1 : 0);
4193     + tx_info->status.ampdu_len = 1;
4194     + }
4195     +
4196     /*
4197     * If an underrun error is seen assume it as an excessive retry only
4198     * if max frame trigger level has been reached (2 KB for singel stream,
4199     diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c
4200     index a3fc987..41ebd62 100644
4201     --- a/drivers/net/wireless/ath/ath9k/recv.c
4202     +++ b/drivers/net/wireless/ath/ath9k/recv.c
4203     @@ -288,19 +288,17 @@ static void ath_edma_start_recv(struct ath_softc *sc)
4204     ath_rx_addbuffer_edma(sc, ATH9K_RX_QUEUE_LP,
4205     sc->rx.rx_edma[ATH9K_RX_QUEUE_LP].rx_fifo_hwsize);
4206    
4207     - spin_unlock_bh(&sc->rx.rxbuflock);
4208     -
4209     ath_opmode_init(sc);
4210    
4211     - ath9k_hw_startpcureceive(sc->sc_ah, (sc->sc_flags & SC_OP_SCANNING));
4212     + ath9k_hw_startpcureceive(sc->sc_ah, (sc->sc_flags & SC_OP_OFFCHANNEL));
4213     +
4214     + spin_unlock_bh(&sc->rx.rxbuflock);
4215     }
4216    
4217     static void ath_edma_stop_recv(struct ath_softc *sc)
4218     {
4219     - spin_lock_bh(&sc->rx.rxbuflock);
4220     ath_rx_remove_buffer(sc, ATH9K_RX_QUEUE_HP);
4221     ath_rx_remove_buffer(sc, ATH9K_RX_QUEUE_LP);
4222     - spin_unlock_bh(&sc->rx.rxbuflock);
4223     }
4224    
4225     int ath_rx_init(struct ath_softc *sc, int nbufs)
4226     @@ -310,7 +308,7 @@ int ath_rx_init(struct ath_softc *sc, int nbufs)
4227     struct ath_buf *bf;
4228     int error = 0;
4229    
4230     - spin_lock_init(&sc->rx.rxflushlock);
4231     + spin_lock_init(&sc->rx.pcu_lock);
4232     sc->sc_flags &= ~SC_OP_RXFLUSH;
4233     spin_lock_init(&sc->rx.rxbuflock);
4234    
4235     @@ -496,9 +494,10 @@ int ath_startrecv(struct ath_softc *sc)
4236     ath9k_hw_rxena(ah);
4237    
4238     start_recv:
4239     - spin_unlock_bh(&sc->rx.rxbuflock);
4240     ath_opmode_init(sc);
4241     - ath9k_hw_startpcureceive(ah, (sc->sc_flags & SC_OP_SCANNING));
4242     + ath9k_hw_startpcureceive(ah, (sc->sc_flags & SC_OP_OFFCHANNEL));
4243     +
4244     + spin_unlock_bh(&sc->rx.rxbuflock);
4245    
4246     return 0;
4247     }
4248     @@ -508,7 +507,8 @@ bool ath_stoprecv(struct ath_softc *sc)
4249     struct ath_hw *ah = sc->sc_ah;
4250     bool stopped;
4251    
4252     - ath9k_hw_stoppcurecv(ah);
4253     + spin_lock_bh(&sc->rx.rxbuflock);
4254     + ath9k_hw_abortpcurecv(ah);
4255     ath9k_hw_setrxfilter(ah, 0);
4256     stopped = ath9k_hw_stopdmarecv(ah);
4257    
4258     @@ -516,19 +516,18 @@ bool ath_stoprecv(struct ath_softc *sc)
4259     ath_edma_stop_recv(sc);
4260     else
4261     sc->rx.rxlink = NULL;
4262     + spin_unlock_bh(&sc->rx.rxbuflock);
4263    
4264     return stopped;
4265     }
4266    
4267     void ath_flushrecv(struct ath_softc *sc)
4268     {
4269     - spin_lock_bh(&sc->rx.rxflushlock);
4270     sc->sc_flags |= SC_OP_RXFLUSH;
4271     if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)
4272     ath_rx_tasklet(sc, 1, true);
4273     ath_rx_tasklet(sc, 1, false);
4274     sc->sc_flags &= ~SC_OP_RXFLUSH;
4275     - spin_unlock_bh(&sc->rx.rxflushlock);
4276     }
4277    
4278     static bool ath_beacon_dtim_pending_cab(struct sk_buff *skb)
4279     @@ -631,7 +630,7 @@ static void ath_rx_ps(struct ath_softc *sc, struct sk_buff *skb)
4280     * No more broadcast/multicast frames to be received at this
4281     * point.
4282     */
4283     - sc->ps_flags &= ~PS_WAIT_FOR_CAB;
4284     + sc->ps_flags &= ~(PS_WAIT_FOR_CAB | PS_WAIT_FOR_BEACON);
4285     ath_print(common, ATH_DBG_PS,
4286     "All PS CAB frames received, back to sleep\n");
4287     } else if ((sc->ps_flags & PS_WAIT_FOR_PSPOLL_DATA) &&
4288     @@ -870,15 +869,18 @@ static bool ath9k_rx_accept(struct ath_common *common,
4289     if (rx_stats->rs_status & ATH9K_RXERR_DECRYPT) {
4290     *decrypt_error = true;
4291     } else if (rx_stats->rs_status & ATH9K_RXERR_MIC) {
4292     - if (ieee80211_is_ctl(fc))
4293     - /*
4294     - * Sometimes, we get invalid
4295     - * MIC failures on valid control frames.
4296     - * Remove these mic errors.
4297     - */
4298     - rx_stats->rs_status &= ~ATH9K_RXERR_MIC;
4299     - else
4300     + /*
4301     + * The MIC error bit is only valid if the frame
4302     + * is not a control frame or fragment, and it was
4303     + * decrypted using a valid TKIP key.
4304     + */
4305     + if (!ieee80211_is_ctl(fc) &&
4306     + !ieee80211_has_morefrags(fc) &&
4307     + !(le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_FRAG) &&
4308     + test_bit(rx_stats->rs_keyix, common->tkip_keymap))
4309     rxs->flag |= RX_FLAG_MMIC_ERROR;
4310     + else
4311     + rx_stats->rs_status &= ~ATH9K_RXERR_MIC;
4312     }
4313     /*
4314     * Reject error frames with the exception of
4315     @@ -1096,6 +1098,7 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp)
4316     u8 rx_status_len = ah->caps.rx_status_len;
4317     u64 tsf = 0;
4318     u32 tsf_lower = 0;
4319     + unsigned long flags;
4320    
4321     if (edma)
4322     dma_type = DMA_BIDIRECTIONAL;
4323     @@ -1204,11 +1207,13 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp)
4324     sc->rx.rxotherant = 0;
4325     }
4326    
4327     + spin_lock_irqsave(&sc->sc_pm_lock, flags);
4328     if (unlikely(ath9k_check_auto_sleep(sc) ||
4329     (sc->ps_flags & (PS_WAIT_FOR_BEACON |
4330     PS_WAIT_FOR_CAB |
4331     PS_WAIT_FOR_PSPOLL_DATA))))
4332     ath_rx_ps(sc, skb);
4333     + spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
4334    
4335     ath_rx_send_to_mac80211(hw, sc, skb, rxs);
4336    
4337     diff --git a/drivers/net/wireless/ath/ath9k/reg.h b/drivers/net/wireless/ath/ath9k/reg.h
4338     index d01c4ad..1c24fcc 100644
4339     --- a/drivers/net/wireless/ath/ath9k/reg.h
4340     +++ b/drivers/net/wireless/ath/ath9k/reg.h
4341     @@ -709,6 +709,7 @@
4342     #define AR_WA_RESET_EN (1 << 18) /* Sw Control to enable PCI-Reset to POR (bit 15) */
4343     #define AR_WA_ANALOG_SHIFT (1 << 20)
4344     #define AR_WA_POR_SHORT (1 << 21) /* PCI-E Phy reset control */
4345     +#define AR_WA_BIT22 (1 << 22)
4346     #define AR9285_WA_DEFAULT 0x004a050b
4347     #define AR9280_WA_DEFAULT 0x0040073b
4348     #define AR_WA_DEFAULT 0x0000073f
4349     @@ -900,7 +901,13 @@
4350     #define AR_DEVID_7010(_ah) \
4351     (((_ah)->hw_version.devid == 0x7010) || \
4352     ((_ah)->hw_version.devid == 0x7015) || \
4353     - ((_ah)->hw_version.devid == 0x9018))
4354     + ((_ah)->hw_version.devid == 0x9018) || \
4355     + ((_ah)->hw_version.devid == 0xA704) || \
4356     + ((_ah)->hw_version.devid == 0x1200))
4357     +
4358     +#define AR9287_HTC_DEVID(_ah) \
4359     + (((_ah)->hw_version.devid == 0x7015) || \
4360     + ((_ah)->hw_version.devid == 0x1200))
4361    
4362     #define AR_RADIO_SREV_MAJOR 0xf0
4363     #define AR_RAD5133_SREV_MAJOR 0xc0
4364     diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c
4365     index 4dda14e..a5c489c 100644
4366     --- a/drivers/net/wireless/ath/ath9k/xmit.c
4367     +++ b/drivers/net/wireless/ath/ath9k/xmit.c
4368     @@ -61,6 +61,8 @@ static int ath_tx_num_badfrms(struct ath_softc *sc, struct ath_buf *bf,
4369     struct ath_tx_status *ts, int txok);
4370     static void ath_tx_rc_status(struct ath_buf *bf, struct ath_tx_status *ts,
4371     int nbad, int txok, bool update_rc);
4372     +static void ath_tx_update_baw(struct ath_softc *sc, struct ath_atx_tid *tid,
4373     + int seqno);
4374    
4375     enum {
4376     MCS_HT20,
4377     @@ -143,18 +145,23 @@ static void ath_tx_flush_tid(struct ath_softc *sc, struct ath_atx_tid *tid)
4378     struct ath_txq *txq = &sc->tx.txq[tid->ac->qnum];
4379     struct ath_buf *bf;
4380     struct list_head bf_head;
4381     - INIT_LIST_HEAD(&bf_head);
4382     + struct ath_tx_status ts;
4383    
4384     - WARN_ON(!tid->paused);
4385     + INIT_LIST_HEAD(&bf_head);
4386    
4387     + memset(&ts, 0, sizeof(ts));
4388     spin_lock_bh(&txq->axq_lock);
4389     - tid->paused = false;
4390    
4391     while (!list_empty(&tid->buf_q)) {
4392     bf = list_first_entry(&tid->buf_q, struct ath_buf, list);
4393     - BUG_ON(bf_isretried(bf));
4394     list_move_tail(&bf->list, &bf_head);
4395     - ath_tx_send_ht_normal(sc, txq, tid, &bf_head);
4396     +
4397     + if (bf_isretried(bf)) {
4398     + ath_tx_update_baw(sc, tid, bf->bf_seqno);
4399     + ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0, 0);
4400     + } else {
4401     + ath_tx_send_ht_normal(sc, txq, tid, &bf_head);
4402     + }
4403     }
4404    
4405     spin_unlock_bh(&txq->axq_lock);
4406     @@ -312,6 +319,7 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,
4407     int isaggr, txfail, txpending, sendbar = 0, needreset = 0, nbad = 0;
4408     bool rc_update = true;
4409     struct ieee80211_tx_rate rates[4];
4410     + int nframes;
4411    
4412     skb = bf->bf_mpdu;
4413     hdr = (struct ieee80211_hdr *)skb->data;
4414     @@ -320,6 +328,7 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,
4415     hw = bf->aphy->hw;
4416    
4417     memcpy(rates, tx_info->control.rates, sizeof(rates));
4418     + nframes = bf->bf_nframes;
4419    
4420     rcu_read_lock();
4421    
4422     @@ -337,7 +346,7 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,
4423     !bf->bf_stale || bf_next != NULL)
4424     list_move_tail(&bf->list, &bf_head);
4425    
4426     - ath_tx_rc_status(bf, ts, 0, 0, false);
4427     + ath_tx_rc_status(bf, ts, 1, 0, false);
4428     ath_tx_complete_buf(sc, bf, txq, &bf_head, ts,
4429     0, 0);
4430    
4431     @@ -431,7 +440,7 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,
4432     list_move_tail(&bf->list, &bf_head);
4433     }
4434    
4435     - if (!txpending) {
4436     + if (!txpending || (tid->state & AGGR_CLEANUP)) {
4437     /*
4438     * complete the acked-ones/xretried ones; update
4439     * block-ack window
4440     @@ -442,6 +451,7 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,
4441    
4442     if (rc_update && (acked_cnt == 1 || txfail_cnt == 1)) {
4443     memcpy(tx_info->control.rates, rates, sizeof(rates));
4444     + bf->bf_nframes = nframes;
4445     ath_tx_rc_status(bf, ts, nbad, txok, true);
4446     rc_update = false;
4447     } else {
4448     @@ -510,15 +520,12 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,
4449     }
4450    
4451     if (tid->state & AGGR_CLEANUP) {
4452     + ath_tx_flush_tid(sc, tid);
4453     +
4454     if (tid->baw_head == tid->baw_tail) {
4455     tid->state &= ~AGGR_ADDBA_COMPLETE;
4456     tid->state &= ~AGGR_CLEANUP;
4457     -
4458     - /* send buffered frames as singles */
4459     - ath_tx_flush_tid(sc, tid);
4460     }
4461     - rcu_read_unlock();
4462     - return;
4463     }
4464    
4465     rcu_read_unlock();
4466     @@ -785,17 +792,23 @@ static void ath_tx_sched_aggr(struct ath_softc *sc, struct ath_txq *txq,
4467     status != ATH_AGGR_BAW_CLOSED);
4468     }
4469    
4470     -void ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta,
4471     - u16 tid, u16 *ssn)
4472     +int ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta,
4473     + u16 tid, u16 *ssn)
4474     {
4475     struct ath_atx_tid *txtid;
4476     struct ath_node *an;
4477    
4478     an = (struct ath_node *)sta->drv_priv;
4479     txtid = ATH_AN_2_TID(an, tid);
4480     +
4481     + if (txtid->state & (AGGR_CLEANUP | AGGR_ADDBA_COMPLETE))
4482     + return -EAGAIN;
4483     +
4484     txtid->state |= AGGR_ADDBA_PROGRESS;
4485     txtid->paused = true;
4486     *ssn = txtid->seq_start;
4487     +
4488     + return 0;
4489     }
4490    
4491     void ath_tx_aggr_stop(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid)
4492     @@ -803,12 +816,6 @@ void ath_tx_aggr_stop(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid)
4493     struct ath_node *an = (struct ath_node *)sta->drv_priv;
4494     struct ath_atx_tid *txtid = ATH_AN_2_TID(an, tid);
4495     struct ath_txq *txq = &sc->tx.txq[txtid->ac->qnum];
4496     - struct ath_tx_status ts;
4497     - struct ath_buf *bf;
4498     - struct list_head bf_head;
4499     -
4500     - memset(&ts, 0, sizeof(ts));
4501     - INIT_LIST_HEAD(&bf_head);
4502    
4503     if (txtid->state & AGGR_CLEANUP)
4504     return;
4505     @@ -818,31 +825,22 @@ void ath_tx_aggr_stop(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid)
4506     return;
4507     }
4508    
4509     - /* drop all software retried frames and mark this TID */
4510     spin_lock_bh(&txq->axq_lock);
4511     txtid->paused = true;
4512     - while (!list_empty(&txtid->buf_q)) {
4513     - bf = list_first_entry(&txtid->buf_q, struct ath_buf, list);
4514     - if (!bf_isretried(bf)) {
4515     - /*
4516     - * NB: it's based on the assumption that
4517     - * software retried frame will always stay
4518     - * at the head of software queue.
4519     - */
4520     - break;
4521     - }
4522     - list_move_tail(&bf->list, &bf_head);
4523     - ath_tx_update_baw(sc, txtid, bf->bf_seqno);
4524     - ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0, 0);
4525     - }
4526     - spin_unlock_bh(&txq->axq_lock);
4527    
4528     - if (txtid->baw_head != txtid->baw_tail) {
4529     + /*
4530     + * If frames are still being transmitted for this TID, they will be
4531     + * cleaned up during tx completion. To prevent race conditions, this
4532     + * TID can only be reused after all in-progress subframes have been
4533     + * completed.
4534     + */
4535     + if (txtid->baw_head != txtid->baw_tail)
4536     txtid->state |= AGGR_CLEANUP;
4537     - } else {
4538     + else
4539     txtid->state &= ~AGGR_ADDBA_COMPLETE;
4540     - ath_tx_flush_tid(sc, txtid);
4541     - }
4542     + spin_unlock_bh(&txq->axq_lock);
4543     +
4544     + ath_tx_flush_tid(sc, txtid);
4545     }
4546    
4547     void ath_tx_aggr_resume(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid)
4548     @@ -1103,15 +1101,6 @@ void ath_draintxq(struct ath_softc *sc, struct ath_txq *txq, bool retry_tx)
4549     txq->axq_tx_inprogress = false;
4550     spin_unlock_bh(&txq->axq_lock);
4551    
4552     - /* flush any pending frames if aggregation is enabled */
4553     - if (sc->sc_flags & SC_OP_TXAGGR) {
4554     - if (!retry_tx) {
4555     - spin_lock_bh(&txq->axq_lock);
4556     - ath_txq_drain_pending_buffers(sc, txq);
4557     - spin_unlock_bh(&txq->axq_lock);
4558     - }
4559     - }
4560     -
4561     if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) {
4562     spin_lock_bh(&txq->axq_lock);
4563     while (!list_empty(&txq->txq_fifo_pending)) {
4564     @@ -1132,6 +1121,15 @@ void ath_draintxq(struct ath_softc *sc, struct ath_txq *txq, bool retry_tx)
4565     }
4566     spin_unlock_bh(&txq->axq_lock);
4567     }
4568     +
4569     + /* flush any pending frames if aggregation is enabled */
4570     + if (sc->sc_flags & SC_OP_TXAGGR) {
4571     + if (!retry_tx) {
4572     + spin_lock_bh(&txq->axq_lock);
4573     + ath_txq_drain_pending_buffers(sc, txq);
4574     + spin_unlock_bh(&txq->axq_lock);
4575     + }
4576     + }
4577     }
4578    
4579     void ath_drain_all_txq(struct ath_softc *sc, bool retry_tx)
4580     @@ -2024,9 +2022,15 @@ static void ath_tx_rc_status(struct ath_buf *bf, struct ath_tx_status *ts,
4581    
4582     if (ts->ts_status & ATH9K_TXERR_FILT)
4583     tx_info->flags |= IEEE80211_TX_STAT_TX_FILTERED;
4584     - if ((tx_info->flags & IEEE80211_TX_CTL_AMPDU) && update_rc)
4585     + if ((tx_info->flags & IEEE80211_TX_CTL_AMPDU) && update_rc) {
4586     tx_info->flags |= IEEE80211_TX_STAT_AMPDU;
4587    
4588     + BUG_ON(nbad > bf->bf_nframes);
4589     +
4590     + tx_info->status.ampdu_len = bf->bf_nframes;
4591     + tx_info->status.ampdu_ack_len = bf->bf_nframes - nbad;
4592     + }
4593     +
4594     if ((ts->ts_status & ATH9K_TXERR_FILT) == 0 &&
4595     (bf->bf_flags & ATH9K_TXDESC_NOACK) == 0 && update_rc) {
4596     if (ieee80211_is_data(hdr->frame_control)) {
4597     @@ -2036,8 +2040,6 @@ static void ath_tx_rc_status(struct ath_buf *bf, struct ath_tx_status *ts,
4598     if ((ts->ts_status & ATH9K_TXERR_XRETRY) ||
4599     (ts->ts_status & ATH9K_TXERR_FIFO))
4600     tx_info->pad[0] |= ATH_TX_INFO_XRETRY;
4601     - tx_info->status.ampdu_len = bf->bf_nframes;
4602     - tx_info->status.ampdu_ack_len = bf->bf_nframes - nbad;
4603     }
4604     }
4605    
4606     @@ -2159,7 +2161,7 @@ static void ath_tx_processq(struct ath_softc *sc, struct ath_txq *txq)
4607     */
4608     if (ts.ts_status & ATH9K_TXERR_XRETRY)
4609     bf->bf_state.bf_type |= BUF_XRETRY;
4610     - ath_tx_rc_status(bf, &ts, 0, txok, true);
4611     + ath_tx_rc_status(bf, &ts, txok ? 0 : 1, txok, true);
4612     }
4613    
4614     if (bf_isampdu(bf))
4615     @@ -2204,7 +2206,7 @@ static void ath_tx_complete_poll_work(struct work_struct *work)
4616     ath_print(ath9k_hw_common(sc->sc_ah), ATH_DBG_RESET,
4617     "tx hung, resetting the chip\n");
4618     ath9k_ps_wakeup(sc);
4619     - ath_reset(sc, false);
4620     + ath_reset(sc, true);
4621     ath9k_ps_restore(sc);
4622     }
4623    
4624     @@ -2288,7 +2290,7 @@ void ath_tx_edma_tasklet(struct ath_softc *sc)
4625     if (!bf_isampdu(bf)) {
4626     if (txs.ts_status & ATH9K_TXERR_XRETRY)
4627     bf->bf_state.bf_type |= BUF_XRETRY;
4628     - ath_tx_rc_status(bf, &txs, 0, txok, true);
4629     + ath_tx_rc_status(bf, &txs, txok ? 0 : 1, txok, true);
4630     }
4631    
4632     if (bf_isampdu(bf))
4633     diff --git a/drivers/net/wireless/b43/sdio.c b/drivers/net/wireless/b43/sdio.c
4634     index 45933cf..09e2dfd 100644
4635     --- a/drivers/net/wireless/b43/sdio.c
4636     +++ b/drivers/net/wireless/b43/sdio.c
4637     @@ -163,6 +163,7 @@ static int b43_sdio_probe(struct sdio_func *func,
4638     err_free_ssb:
4639     kfree(sdio);
4640     err_disable_func:
4641     + sdio_claim_host(func);
4642     sdio_disable_func(func);
4643     err_release_host:
4644     sdio_release_host(func);
4645     @@ -175,7 +176,9 @@ static void b43_sdio_remove(struct sdio_func *func)
4646     struct b43_sdio *sdio = sdio_get_drvdata(func);
4647    
4648     ssb_bus_unregister(&sdio->ssb);
4649     + sdio_claim_host(func);
4650     sdio_disable_func(func);
4651     + sdio_release_host(func);
4652     kfree(sdio);
4653     sdio_set_drvdata(func, NULL);
4654     }
4655     diff --git a/drivers/oprofile/timer_int.c b/drivers/oprofile/timer_int.c
4656     index dc0ae4d..0107251 100644
4657     --- a/drivers/oprofile/timer_int.c
4658     +++ b/drivers/oprofile/timer_int.c
4659     @@ -21,6 +21,7 @@
4660     #include "oprof.h"
4661    
4662     static DEFINE_PER_CPU(struct hrtimer, oprofile_hrtimer);
4663     +static int ctr_running;
4664    
4665     static enum hrtimer_restart oprofile_hrtimer_notify(struct hrtimer *hrtimer)
4666     {
4667     @@ -33,6 +34,9 @@ static void __oprofile_hrtimer_start(void *unused)
4668     {
4669     struct hrtimer *hrtimer = &__get_cpu_var(oprofile_hrtimer);
4670    
4671     + if (!ctr_running)
4672     + return;
4673     +
4674     hrtimer_init(hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
4675     hrtimer->function = oprofile_hrtimer_notify;
4676    
4677     @@ -42,7 +46,10 @@ static void __oprofile_hrtimer_start(void *unused)
4678    
4679     static int oprofile_hrtimer_start(void)
4680     {
4681     + get_online_cpus();
4682     + ctr_running = 1;
4683     on_each_cpu(__oprofile_hrtimer_start, NULL, 1);
4684     + put_online_cpus();
4685     return 0;
4686     }
4687    
4688     @@ -50,6 +57,9 @@ static void __oprofile_hrtimer_stop(int cpu)
4689     {
4690     struct hrtimer *hrtimer = &per_cpu(oprofile_hrtimer, cpu);
4691    
4692     + if (!ctr_running)
4693     + return;
4694     +
4695     hrtimer_cancel(hrtimer);
4696     }
4697    
4698     @@ -57,8 +67,11 @@ static void oprofile_hrtimer_stop(void)
4699     {
4700     int cpu;
4701    
4702     + get_online_cpus();
4703     for_each_online_cpu(cpu)
4704     __oprofile_hrtimer_stop(cpu);
4705     + ctr_running = 0;
4706     + put_online_cpus();
4707     }
4708    
4709     static int __cpuinit oprofile_cpu_notify(struct notifier_block *self,
4710     diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c
4711     index b5a7d9b..4835a02 100644
4712     --- a/drivers/pci/pci-sysfs.c
4713     +++ b/drivers/pci/pci-sysfs.c
4714     @@ -705,17 +705,21 @@ void pci_remove_legacy_files(struct pci_bus *b)
4715    
4716     #ifdef HAVE_PCI_MMAP
4717    
4718     -int pci_mmap_fits(struct pci_dev *pdev, int resno, struct vm_area_struct *vma)
4719     +int pci_mmap_fits(struct pci_dev *pdev, int resno, struct vm_area_struct *vma,
4720     + enum pci_mmap_api mmap_api)
4721     {
4722     - unsigned long nr, start, size;
4723     + unsigned long nr, start, size, pci_start;
4724    
4725     + if (pci_resource_len(pdev, resno) == 0)
4726     + return 0;
4727     nr = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT;
4728     start = vma->vm_pgoff;
4729     size = ((pci_resource_len(pdev, resno) - 1) >> PAGE_SHIFT) + 1;
4730     - if (start < size && size - start >= nr)
4731     + pci_start = (mmap_api == PCI_MMAP_PROCFS) ?
4732     + pci_resource_start(pdev, resno) >> PAGE_SHIFT : 0;
4733     + if (start >= pci_start && start < pci_start + size &&
4734     + start + nr <= pci_start + size)
4735     return 1;
4736     - WARN(1, "process \"%s\" tried to map 0x%08lx-0x%08lx on %s BAR %d (size 0x%08lx)\n",
4737     - current->comm, start, start+nr, pci_name(pdev), resno, size);
4738     return 0;
4739     }
4740    
4741     @@ -745,8 +749,14 @@ pci_mmap_resource(struct kobject *kobj, struct bin_attribute *attr,
4742     if (i >= PCI_ROM_RESOURCE)
4743     return -ENODEV;
4744    
4745     - if (!pci_mmap_fits(pdev, i, vma))
4746     + if (!pci_mmap_fits(pdev, i, vma, PCI_MMAP_SYSFS)) {
4747     + WARN(1, "process \"%s\" tried to map 0x%08lx bytes "
4748     + "at page 0x%08lx on %s BAR %d (start 0x%16Lx, size 0x%16Lx)\n",
4749     + current->comm, vma->vm_end-vma->vm_start, vma->vm_pgoff,
4750     + pci_name(pdev), i,
4751     + pci_resource_start(pdev, i), pci_resource_len(pdev, i));
4752     return -EINVAL;
4753     + }
4754    
4755     /* pci_mmap_page_range() expects the same kind of entry as coming
4756     * from /proc/bus/pci/ which is a "user visible" value. If this is
4757     diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
4758     index 6beb11b..1001b1d 100644
4759     --- a/drivers/pci/pci.h
4760     +++ b/drivers/pci/pci.h
4761     @@ -22,8 +22,13 @@ extern void pci_remove_firmware_label_files(struct pci_dev *pdev);
4762     #endif
4763     extern void pci_cleanup_rom(struct pci_dev *dev);
4764     #ifdef HAVE_PCI_MMAP
4765     +enum pci_mmap_api {
4766     + PCI_MMAP_SYSFS, /* mmap on /sys/bus/pci/devices/<BDF>/resource<N> */
4767     + PCI_MMAP_PROCFS /* mmap on /proc/bus/pci/<BDF> */
4768     +};
4769     extern int pci_mmap_fits(struct pci_dev *pdev, int resno,
4770     - struct vm_area_struct *vma);
4771     + struct vm_area_struct *vmai,
4772     + enum pci_mmap_api mmap_api);
4773     #endif
4774     int pci_probe_reset_function(struct pci_dev *dev);
4775    
4776     diff --git a/drivers/pci/proc.c b/drivers/pci/proc.c
4777     index 01f0306..4aae016 100644
4778     --- a/drivers/pci/proc.c
4779     +++ b/drivers/pci/proc.c
4780     @@ -260,7 +260,7 @@ static int proc_bus_pci_mmap(struct file *file, struct vm_area_struct *vma)
4781    
4782     /* Make sure the caller is mapping a real resource for this device */
4783     for (i = 0; i < PCI_ROM_RESOURCE; i++) {
4784     - if (pci_mmap_fits(dev, i, vma))
4785     + if (pci_mmap_fits(dev, i, vma, PCI_MMAP_PROCFS))
4786     break;
4787     }
4788    
4789     diff --git a/drivers/pcmcia/soc_common.c b/drivers/pcmcia/soc_common.c
4790     index 6f1a86b..fd4c25a 100644
4791     --- a/drivers/pcmcia/soc_common.c
4792     +++ b/drivers/pcmcia/soc_common.c
4793     @@ -65,6 +65,7 @@ void soc_pcmcia_debug(struct soc_pcmcia_socket *skt, const char *func,
4794     va_end(args);
4795     }
4796     }
4797     +EXPORT_SYMBOL(soc_pcmcia_debug);
4798    
4799     #endif
4800    
4801     diff --git a/drivers/platform/x86/wmi.c b/drivers/platform/x86/wmi.c
4802     index b2978a0..6777834 100644
4803     --- a/drivers/platform/x86/wmi.c
4804     +++ b/drivers/platform/x86/wmi.c
4805     @@ -801,7 +801,7 @@ static bool guid_already_parsed(const char *guid_string)
4806     wblock = list_entry(p, struct wmi_block, list);
4807     gblock = &wblock->gblock;
4808    
4809     - if (strncmp(gblock->guid, guid_string, 16) == 0)
4810     + if (memcmp(gblock->guid, guid_string, 16) == 0)
4811     return true;
4812     }
4813     return false;
4814     diff --git a/drivers/pnp/pnpacpi/core.c b/drivers/pnp/pnpacpi/core.c
4815     index dc4e32e..0d943ee 100644
4816     --- a/drivers/pnp/pnpacpi/core.c
4817     +++ b/drivers/pnp/pnpacpi/core.c
4818     @@ -28,7 +28,7 @@
4819     #include "../base.h"
4820     #include "pnpacpi.h"
4821    
4822     -static int num = 0;
4823     +static int num;
4824    
4825     /* We need only to blacklist devices that have already an acpi driver that
4826     * can't use pnp layer. We don't need to blacklist device that are directly
4827     @@ -180,11 +180,24 @@ struct pnp_protocol pnpacpi_protocol = {
4828     };
4829     EXPORT_SYMBOL(pnpacpi_protocol);
4830    
4831     +static char *pnpacpi_get_id(struct acpi_device *device)
4832     +{
4833     + struct acpi_hardware_id *id;
4834     +
4835     + list_for_each_entry(id, &device->pnp.ids, list) {
4836     + if (ispnpidacpi(id->id))
4837     + return id->id;
4838     + }
4839     +
4840     + return NULL;
4841     +}
4842     +
4843     static int __init pnpacpi_add_device(struct acpi_device *device)
4844     {
4845     acpi_handle temp = NULL;
4846     acpi_status status;
4847     struct pnp_dev *dev;
4848     + char *pnpid;
4849     struct acpi_hardware_id *id;
4850    
4851     /*
4852     @@ -192,11 +205,17 @@ static int __init pnpacpi_add_device(struct acpi_device *device)
4853     * driver should not be loaded.
4854     */
4855     status = acpi_get_handle(device->handle, "_CRS", &temp);
4856     - if (ACPI_FAILURE(status) || !ispnpidacpi(acpi_device_hid(device)) ||
4857     - is_exclusive_device(device) || (!device->status.present))
4858     + if (ACPI_FAILURE(status))
4859     + return 0;
4860     +
4861     + pnpid = pnpacpi_get_id(device);
4862     + if (!pnpid)
4863     + return 0;
4864     +
4865     + if (is_exclusive_device(device) || !device->status.present)
4866     return 0;
4867    
4868     - dev = pnp_alloc_dev(&pnpacpi_protocol, num, acpi_device_hid(device));
4869     + dev = pnp_alloc_dev(&pnpacpi_protocol, num, pnpid);
4870     if (!dev)
4871     return -ENOMEM;
4872    
4873     @@ -227,7 +246,7 @@ static int __init pnpacpi_add_device(struct acpi_device *device)
4874     pnpacpi_parse_resource_option_data(dev);
4875    
4876     list_for_each_entry(id, &device->pnp.ids, list) {
4877     - if (!strcmp(id->id, acpi_device_hid(device)))
4878     + if (!strcmp(id->id, pnpid))
4879     continue;
4880     if (!ispnpidacpi(id->id))
4881     continue;
4882     diff --git a/drivers/power/olpc_battery.c b/drivers/power/olpc_battery.c
4883     index aafc1c5..5bc1dcf 100644
4884     --- a/drivers/power/olpc_battery.c
4885     +++ b/drivers/power/olpc_battery.c
4886     @@ -271,14 +271,14 @@ static int olpc_bat_get_property(struct power_supply *psy,
4887     if (ret)
4888     return ret;
4889    
4890     - val->intval = (int)be16_to_cpu(ec_word) * 9760L / 32;
4891     + val->intval = (s16)be16_to_cpu(ec_word) * 9760L / 32;
4892     break;
4893     case POWER_SUPPLY_PROP_CURRENT_AVG:
4894     ret = olpc_ec_cmd(EC_BAT_CURRENT, NULL, 0, (void *)&ec_word, 2);
4895     if (ret)
4896     return ret;
4897    
4898     - val->intval = (int)be16_to_cpu(ec_word) * 15625L / 120;
4899     + val->intval = (s16)be16_to_cpu(ec_word) * 15625L / 120;
4900     break;
4901     case POWER_SUPPLY_PROP_CAPACITY:
4902     ret = olpc_ec_cmd(EC_BAT_SOC, NULL, 0, &ec_byte, 1);
4903     @@ -299,7 +299,7 @@ static int olpc_bat_get_property(struct power_supply *psy,
4904     if (ret)
4905     return ret;
4906    
4907     - val->intval = (int)be16_to_cpu(ec_word) * 100 / 256;
4908     + val->intval = (s16)be16_to_cpu(ec_word) * 100 / 256;
4909     break;
4910     case POWER_SUPPLY_PROP_TEMP_AMBIENT:
4911     ret = olpc_ec_cmd(EC_AMB_TEMP, NULL, 0, (void *)&ec_word, 2);
4912     @@ -313,7 +313,7 @@ static int olpc_bat_get_property(struct power_supply *psy,
4913     if (ret)
4914     return ret;
4915    
4916     - val->intval = (int)be16_to_cpu(ec_word) * 6250 / 15;
4917     + val->intval = (s16)be16_to_cpu(ec_word) * 6250 / 15;
4918     break;
4919     case POWER_SUPPLY_PROP_SERIAL_NUMBER:
4920     ret = olpc_ec_cmd(EC_BAT_SERIAL, NULL, 0, (void *)&ser_buf, 8);
4921     diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h
4922     index 1a1b281..16df82a 100644
4923     --- a/drivers/scsi/qla2xxx/qla_gbl.h
4924     +++ b/drivers/scsi/qla2xxx/qla_gbl.h
4925     @@ -92,6 +92,7 @@ extern int ql2xshiftctondsd;
4926     extern int ql2xdbwr;
4927     extern int ql2xdontresethba;
4928     extern int ql2xasynctmfenable;
4929     +extern int ql2xgffidenable;
4930     extern int ql2xenabledif;
4931     extern int ql2xenablehba_err_chk;
4932     extern int ql2xtargetreset;
4933     diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
4934     index 9c383ba..49e7b09 100644
4935     --- a/drivers/scsi/qla2xxx/qla_init.c
4936     +++ b/drivers/scsi/qla2xxx/qla_init.c
4937     @@ -3258,8 +3258,9 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha,
4938     continue;
4939    
4940     /* Bypass ports whose FCP-4 type is not FCP_SCSI */
4941     - if (new_fcport->fc4_type != FC4_TYPE_FCP_SCSI &&
4942     - new_fcport->fc4_type != FC4_TYPE_UNKNOWN)
4943     + if (ql2xgffidenable &&
4944     + (new_fcport->fc4_type != FC4_TYPE_FCP_SCSI &&
4945     + new_fcport->fc4_type != FC4_TYPE_UNKNOWN))
4946     continue;
4947    
4948     /* Locate matching device in database. */
4949     diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
4950     index 1e4bff6..4e29d43 100644
4951     --- a/drivers/scsi/qla2xxx/qla_os.c
4952     +++ b/drivers/scsi/qla2xxx/qla_os.c
4953     @@ -160,6 +160,11 @@ MODULE_PARM_DESC(ql2xtargetreset,
4954     "Enable target reset."
4955     "Default is 1 - use hw defaults.");
4956    
4957     +int ql2xgffidenable;
4958     +module_param(ql2xgffidenable, int, S_IRUGO|S_IRUSR);
4959     +MODULE_PARM_DESC(ql2xgffidenable,
4960     + "Enables GFF_ID checks of port type. "
4961     + "Default is 0 - Do not use GFF_ID information.");
4962    
4963     int ql2xasynctmfenable;
4964     module_param(ql2xasynctmfenable, int, S_IRUGO|S_IRUSR);
4965     diff --git a/drivers/serial/mfd.c b/drivers/serial/mfd.c
4966     index 5dff45c..f083f7c 100644
4967     --- a/drivers/serial/mfd.c
4968     +++ b/drivers/serial/mfd.c
4969     @@ -892,8 +892,7 @@ serial_hsu_set_termios(struct uart_port *port, struct ktermios *termios,
4970     unsigned char cval, fcr = 0;
4971     unsigned long flags;
4972     unsigned int baud, quot;
4973     - u32 mul = 0x3600;
4974     - u32 ps = 0x10;
4975     + u32 ps, mul;
4976    
4977     switch (termios->c_cflag & CSIZE) {
4978     case CS5:
4979     @@ -937,20 +936,19 @@ serial_hsu_set_termios(struct uart_port *port, struct ktermios *termios,
4980     ps = 0xC;
4981     quot = 1;
4982     break;
4983     - case 2500000:
4984     - mul = 0x2710;
4985     - ps = 0x10;
4986     - quot = 1;
4987     - break;
4988     case 18432000:
4989     mul = 0x2400;
4990     ps = 0x10;
4991     quot = 1;
4992     break;
4993     + case 3000000:
4994     + case 2500000:
4995     + case 2000000:
4996     case 1500000:
4997     - mul = 0x1D4C;
4998     - ps = 0xc;
4999     - quot = 1;
5000     + case 1000000:
5001     + case 500000:
5002     + /* mul/ps/quot = 0x9C4/0x10/0x1 will make a 500000 bps */
5003     + mul = baud / 500000 * 0x9C4;
5004     break;
5005     default:
5006     ;
5007     diff --git a/drivers/ssb/b43_pci_bridge.c b/drivers/ssb/b43_pci_bridge.c
5008     index ef9c6a0..744d3f6 100644
5009     --- a/drivers/ssb/b43_pci_bridge.c
5010     +++ b/drivers/ssb/b43_pci_bridge.c
5011     @@ -24,6 +24,7 @@ static const struct pci_device_id b43_pci_bridge_tbl[] = {
5012     { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4312) },
5013     { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4315) },
5014     { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4318) },
5015     + { PCI_DEVICE(PCI_VENDOR_ID_BCM_GVC, 0x4318) },
5016     { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4319) },
5017     { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4320) },
5018     { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4321) },
5019     diff --git a/drivers/staging/asus_oled/asus_oled.c b/drivers/staging/asus_oled/asus_oled.c
5020     index 5b279fb..6244555 100644
5021     --- a/drivers/staging/asus_oled/asus_oled.c
5022     +++ b/drivers/staging/asus_oled/asus_oled.c
5023     @@ -620,13 +620,13 @@ static ssize_t class_set_picture(struct device *device,
5024    
5025     #define ASUS_OLED_DEVICE_ATTR(_file) dev_attr_asus_oled_##_file
5026    
5027     -static DEVICE_ATTR(asus_oled_enabled, S_IWUGO | S_IRUGO,
5028     +static DEVICE_ATTR(asus_oled_enabled, S_IWUSR | S_IRUGO,
5029     get_enabled, set_enabled);
5030     -static DEVICE_ATTR(asus_oled_picture, S_IWUGO , NULL, set_picture);
5031     +static DEVICE_ATTR(asus_oled_picture, S_IWUSR , NULL, set_picture);
5032    
5033     -static DEVICE_ATTR(enabled, S_IWUGO | S_IRUGO,
5034     +static DEVICE_ATTR(enabled, S_IWUSR | S_IRUGO,
5035     class_get_enabled, class_set_enabled);
5036     -static DEVICE_ATTR(picture, S_IWUGO, NULL, class_set_picture);
5037     +static DEVICE_ATTR(picture, S_IWUSR, NULL, class_set_picture);
5038    
5039     static int asus_oled_probe(struct usb_interface *interface,
5040     const struct usb_device_id *id)
5041     diff --git a/drivers/staging/batman-adv/soft-interface.c b/drivers/staging/batman-adv/soft-interface.c
5042     index 2ea97de..876be5a 100644
5043     --- a/drivers/staging/batman-adv/soft-interface.c
5044     +++ b/drivers/staging/batman-adv/soft-interface.c
5045     @@ -246,6 +246,10 @@ void interface_rx(struct sk_buff *skb, int hdr_size)
5046     skb_pull_rcsum(skb, hdr_size);
5047     /* skb_set_mac_header(skb, -sizeof(struct ethhdr));*/
5048    
5049     + if (unlikely(!pskb_may_pull(skb, ETH_HLEN))) {
5050     + kfree_skb(skb);
5051     + return;
5052     + }
5053     skb->dev = dev;
5054     skb->protocol = eth_type_trans(skb, dev);
5055    
5056     diff --git a/drivers/staging/frontier/tranzport.c b/drivers/staging/frontier/tranzport.c
5057     index eed74f0..f21a0e8 100644
5058     --- a/drivers/staging/frontier/tranzport.c
5059     +++ b/drivers/staging/frontier/tranzport.c
5060     @@ -204,7 +204,7 @@ static void usb_tranzport_abort_transfers(struct usb_tranzport *dev)
5061     t->value = temp; \
5062     return count; \
5063     } \
5064     - static DEVICE_ATTR(value, S_IWUGO | S_IRUGO, show_##value, set_##value);
5065     + static DEVICE_ATTR(value, S_IWUSR | S_IRUGO, show_##value, set_##value);
5066    
5067     show_int(enable);
5068     show_int(offline);
5069     diff --git a/drivers/staging/iio/accel/adis16220_core.c b/drivers/staging/iio/accel/adis16220_core.c
5070     index bb7d765..ab2d5fa 100644
5071     --- a/drivers/staging/iio/accel/adis16220_core.c
5072     +++ b/drivers/staging/iio/accel/adis16220_core.c
5073     @@ -506,7 +506,7 @@ static IIO_DEVICE_ATTR(reset, S_IWUSR, NULL,
5074     adis16220_write_reset, 0);
5075    
5076     #define IIO_DEV_ATTR_CAPTURE(_store) \
5077     - IIO_DEVICE_ATTR(capture, S_IWUGO, NULL, _store, 0)
5078     + IIO_DEVICE_ATTR(capture, S_IWUSR, NULL, _store, 0)
5079    
5080     static IIO_DEV_ATTR_CAPTURE(adis16220_write_capture);
5081    
5082     diff --git a/drivers/staging/line6/control.c b/drivers/staging/line6/control.c
5083     index 0b59852..e414571 100644
5084     --- a/drivers/staging/line6/control.c
5085     +++ b/drivers/staging/line6/control.c
5086     @@ -268,210 +268,210 @@ VARIAX_PARAM_R(float, mix2);
5087     VARIAX_PARAM_R(float, mix1);
5088     VARIAX_PARAM_R(int, pickup_wiring);
5089    
5090     -static DEVICE_ATTR(tweak, S_IWUGO | S_IRUGO, pod_get_tweak, pod_set_tweak);
5091     -static DEVICE_ATTR(wah_position, S_IWUGO | S_IRUGO, pod_get_wah_position,
5092     +static DEVICE_ATTR(tweak, S_IWUSR | S_IRUGO, pod_get_tweak, pod_set_tweak);
5093     +static DEVICE_ATTR(wah_position, S_IWUSR | S_IRUGO, pod_get_wah_position,
5094     pod_set_wah_position);
5095     -static DEVICE_ATTR(compression_gain, S_IWUGO | S_IRUGO,
5096     +static DEVICE_ATTR(compression_gain, S_IWUSR | S_IRUGO,
5097     pod_get_compression_gain, pod_set_compression_gain);
5098     -static DEVICE_ATTR(vol_pedal_position, S_IWUGO | S_IRUGO,
5099     +static DEVICE_ATTR(vol_pedal_position, S_IWUSR | S_IRUGO,
5100     pod_get_vol_pedal_position, pod_set_vol_pedal_position);
5101     -static DEVICE_ATTR(compression_threshold, S_IWUGO | S_IRUGO,
5102     +static DEVICE_ATTR(compression_threshold, S_IWUSR | S_IRUGO,
5103     pod_get_compression_threshold,
5104     pod_set_compression_threshold);
5105     -static DEVICE_ATTR(pan, S_IWUGO | S_IRUGO, pod_get_pan, pod_set_pan);
5106     -static DEVICE_ATTR(amp_model_setup, S_IWUGO | S_IRUGO, pod_get_amp_model_setup,
5107     +static DEVICE_ATTR(pan, S_IWUSR | S_IRUGO, pod_get_pan, pod_set_pan);
5108     +static DEVICE_ATTR(amp_model_setup, S_IWUSR | S_IRUGO, pod_get_amp_model_setup,
5109     pod_set_amp_model_setup);
5110     -static DEVICE_ATTR(amp_model, S_IWUGO | S_IRUGO, pod_get_amp_model,
5111     +static DEVICE_ATTR(amp_model, S_IWUSR | S_IRUGO, pod_get_amp_model,
5112     pod_set_amp_model);
5113     -static DEVICE_ATTR(drive, S_IWUGO | S_IRUGO, pod_get_drive, pod_set_drive);
5114     -static DEVICE_ATTR(bass, S_IWUGO | S_IRUGO, pod_get_bass, pod_set_bass);
5115     -static DEVICE_ATTR(mid, S_IWUGO | S_IRUGO, pod_get_mid, pod_set_mid);
5116     -static DEVICE_ATTR(lowmid, S_IWUGO | S_IRUGO, pod_get_lowmid, pod_set_lowmid);
5117     -static DEVICE_ATTR(treble, S_IWUGO | S_IRUGO, pod_get_treble, pod_set_treble);
5118     -static DEVICE_ATTR(highmid, S_IWUGO | S_IRUGO, pod_get_highmid,
5119     +static DEVICE_ATTR(drive, S_IWUSR | S_IRUGO, pod_get_drive, pod_set_drive);
5120     +static DEVICE_ATTR(bass, S_IWUSR | S_IRUGO, pod_get_bass, pod_set_bass);
5121     +static DEVICE_ATTR(mid, S_IWUSR | S_IRUGO, pod_get_mid, pod_set_mid);
5122     +static DEVICE_ATTR(lowmid, S_IWUSR | S_IRUGO, pod_get_lowmid, pod_set_lowmid);
5123     +static DEVICE_ATTR(treble, S_IWUSR | S_IRUGO, pod_get_treble, pod_set_treble);
5124     +static DEVICE_ATTR(highmid, S_IWUSR | S_IRUGO, pod_get_highmid,
5125     pod_set_highmid);
5126     -static DEVICE_ATTR(chan_vol, S_IWUGO | S_IRUGO, pod_get_chan_vol,
5127     +static DEVICE_ATTR(chan_vol, S_IWUSR | S_IRUGO, pod_get_chan_vol,
5128     pod_set_chan_vol);
5129     -static DEVICE_ATTR(reverb_mix, S_IWUGO | S_IRUGO, pod_get_reverb_mix,
5130     +static DEVICE_ATTR(reverb_mix, S_IWUSR | S_IRUGO, pod_get_reverb_mix,
5131     pod_set_reverb_mix);
5132     -static DEVICE_ATTR(effect_setup, S_IWUGO | S_IRUGO, pod_get_effect_setup,
5133     +static DEVICE_ATTR(effect_setup, S_IWUSR | S_IRUGO, pod_get_effect_setup,
5134     pod_set_effect_setup);
5135     -static DEVICE_ATTR(band_1_frequency, S_IWUGO | S_IRUGO,
5136     +static DEVICE_ATTR(band_1_frequency, S_IWUSR | S_IRUGO,
5137     pod_get_band_1_frequency, pod_set_band_1_frequency);
5138     -static DEVICE_ATTR(presence, S_IWUGO | S_IRUGO, pod_get_presence,
5139     +static DEVICE_ATTR(presence, S_IWUSR | S_IRUGO, pod_get_presence,
5140     pod_set_presence);
5141     -static DEVICE_ATTR2(treble__bass, treble, S_IWUGO | S_IRUGO,
5142     +static DEVICE_ATTR2(treble__bass, treble, S_IWUSR | S_IRUGO,
5143     pod_get_treble__bass, pod_set_treble__bass);
5144     -static DEVICE_ATTR(noise_gate_enable, S_IWUGO | S_IRUGO,
5145     +static DEVICE_ATTR(noise_gate_enable, S_IWUSR | S_IRUGO,
5146     pod_get_noise_gate_enable, pod_set_noise_gate_enable);
5147     -static DEVICE_ATTR(gate_threshold, S_IWUGO | S_IRUGO, pod_get_gate_threshold,
5148     +static DEVICE_ATTR(gate_threshold, S_IWUSR | S_IRUGO, pod_get_gate_threshold,
5149     pod_set_gate_threshold);
5150     -static DEVICE_ATTR(gate_decay_time, S_IWUGO | S_IRUGO, pod_get_gate_decay_time,
5151     +static DEVICE_ATTR(gate_decay_time, S_IWUSR | S_IRUGO, pod_get_gate_decay_time,
5152     pod_set_gate_decay_time);
5153     -static DEVICE_ATTR(stomp_enable, S_IWUGO | S_IRUGO, pod_get_stomp_enable,
5154     +static DEVICE_ATTR(stomp_enable, S_IWUSR | S_IRUGO, pod_get_stomp_enable,
5155     pod_set_stomp_enable);
5156     -static DEVICE_ATTR(comp_enable, S_IWUGO | S_IRUGO, pod_get_comp_enable,
5157     +static DEVICE_ATTR(comp_enable, S_IWUSR | S_IRUGO, pod_get_comp_enable,
5158     pod_set_comp_enable);
5159     -static DEVICE_ATTR(stomp_time, S_IWUGO | S_IRUGO, pod_get_stomp_time,
5160     +static DEVICE_ATTR(stomp_time, S_IWUSR | S_IRUGO, pod_get_stomp_time,
5161     pod_set_stomp_time);
5162     -static DEVICE_ATTR(delay_enable, S_IWUGO | S_IRUGO, pod_get_delay_enable,
5163     +static DEVICE_ATTR(delay_enable, S_IWUSR | S_IRUGO, pod_get_delay_enable,
5164     pod_set_delay_enable);
5165     -static DEVICE_ATTR(mod_param_1, S_IWUGO | S_IRUGO, pod_get_mod_param_1,
5166     +static DEVICE_ATTR(mod_param_1, S_IWUSR | S_IRUGO, pod_get_mod_param_1,
5167     pod_set_mod_param_1);
5168     -static DEVICE_ATTR(delay_param_1, S_IWUGO | S_IRUGO, pod_get_delay_param_1,
5169     +static DEVICE_ATTR(delay_param_1, S_IWUSR | S_IRUGO, pod_get_delay_param_1,
5170     pod_set_delay_param_1);
5171     -static DEVICE_ATTR(delay_param_1_note_value, S_IWUGO | S_IRUGO,
5172     +static DEVICE_ATTR(delay_param_1_note_value, S_IWUSR | S_IRUGO,
5173     pod_get_delay_param_1_note_value,
5174     pod_set_delay_param_1_note_value);
5175     -static DEVICE_ATTR2(band_2_frequency__bass, band_2_frequency, S_IWUGO | S_IRUGO,
5176     +static DEVICE_ATTR2(band_2_frequency__bass, band_2_frequency, S_IWUSR | S_IRUGO,
5177     pod_get_band_2_frequency__bass,
5178     pod_set_band_2_frequency__bass);
5179     -static DEVICE_ATTR(delay_param_2, S_IWUGO | S_IRUGO, pod_get_delay_param_2,
5180     +static DEVICE_ATTR(delay_param_2, S_IWUSR | S_IRUGO, pod_get_delay_param_2,
5181     pod_set_delay_param_2);
5182     -static DEVICE_ATTR(delay_volume_mix, S_IWUGO | S_IRUGO,
5183     +static DEVICE_ATTR(delay_volume_mix, S_IWUSR | S_IRUGO,
5184     pod_get_delay_volume_mix, pod_set_delay_volume_mix);
5185     -static DEVICE_ATTR(delay_param_3, S_IWUGO | S_IRUGO, pod_get_delay_param_3,
5186     +static DEVICE_ATTR(delay_param_3, S_IWUSR | S_IRUGO, pod_get_delay_param_3,
5187     pod_set_delay_param_3);
5188     -static DEVICE_ATTR(reverb_enable, S_IWUGO | S_IRUGO, pod_get_reverb_enable,
5189     +static DEVICE_ATTR(reverb_enable, S_IWUSR | S_IRUGO, pod_get_reverb_enable,
5190     pod_set_reverb_enable);
5191     -static DEVICE_ATTR(reverb_type, S_IWUGO | S_IRUGO, pod_get_reverb_type,
5192     +static DEVICE_ATTR(reverb_type, S_IWUSR | S_IRUGO, pod_get_reverb_type,
5193     pod_set_reverb_type);
5194     -static DEVICE_ATTR(reverb_decay, S_IWUGO | S_IRUGO, pod_get_reverb_decay,
5195     +static DEVICE_ATTR(reverb_decay, S_IWUSR | S_IRUGO, pod_get_reverb_decay,
5196     pod_set_reverb_decay);
5197     -static DEVICE_ATTR(reverb_tone, S_IWUGO | S_IRUGO, pod_get_reverb_tone,
5198     +static DEVICE_ATTR(reverb_tone, S_IWUSR | S_IRUGO, pod_get_reverb_tone,
5199     pod_set_reverb_tone);
5200     -static DEVICE_ATTR(reverb_pre_delay, S_IWUGO | S_IRUGO,
5201     +static DEVICE_ATTR(reverb_pre_delay, S_IWUSR | S_IRUGO,
5202     pod_get_reverb_pre_delay, pod_set_reverb_pre_delay);
5203     -static DEVICE_ATTR(reverb_pre_post, S_IWUGO | S_IRUGO, pod_get_reverb_pre_post,
5204     +static DEVICE_ATTR(reverb_pre_post, S_IWUSR | S_IRUGO, pod_get_reverb_pre_post,
5205     pod_set_reverb_pre_post);
5206     -static DEVICE_ATTR(band_2_frequency, S_IWUGO | S_IRUGO,
5207     +static DEVICE_ATTR(band_2_frequency, S_IWUSR | S_IRUGO,
5208     pod_get_band_2_frequency, pod_set_band_2_frequency);
5209     -static DEVICE_ATTR2(band_3_frequency__bass, band_3_frequency, S_IWUGO | S_IRUGO,
5210     +static DEVICE_ATTR2(band_3_frequency__bass, band_3_frequency, S_IWUSR | S_IRUGO,
5211     pod_get_band_3_frequency__bass,
5212     pod_set_band_3_frequency__bass);
5213     -static DEVICE_ATTR(wah_enable, S_IWUGO | S_IRUGO, pod_get_wah_enable,
5214     +static DEVICE_ATTR(wah_enable, S_IWUSR | S_IRUGO, pod_get_wah_enable,
5215     pod_set_wah_enable);
5216     -static DEVICE_ATTR(modulation_lo_cut, S_IWUGO | S_IRUGO,
5217     +static DEVICE_ATTR(modulation_lo_cut, S_IWUSR | S_IRUGO,
5218     pod_get_modulation_lo_cut, pod_set_modulation_lo_cut);
5219     -static DEVICE_ATTR(delay_reverb_lo_cut, S_IWUGO | S_IRUGO,
5220     +static DEVICE_ATTR(delay_reverb_lo_cut, S_IWUSR | S_IRUGO,
5221     pod_get_delay_reverb_lo_cut, pod_set_delay_reverb_lo_cut);
5222     -static DEVICE_ATTR(volume_pedal_minimum, S_IWUGO | S_IRUGO,
5223     +static DEVICE_ATTR(volume_pedal_minimum, S_IWUSR | S_IRUGO,
5224     pod_get_volume_pedal_minimum, pod_set_volume_pedal_minimum);
5225     -static DEVICE_ATTR(eq_pre_post, S_IWUGO | S_IRUGO, pod_get_eq_pre_post,
5226     +static DEVICE_ATTR(eq_pre_post, S_IWUSR | S_IRUGO, pod_get_eq_pre_post,
5227     pod_set_eq_pre_post);
5228     -static DEVICE_ATTR(volume_pre_post, S_IWUGO | S_IRUGO, pod_get_volume_pre_post,
5229     +static DEVICE_ATTR(volume_pre_post, S_IWUSR | S_IRUGO, pod_get_volume_pre_post,
5230     pod_set_volume_pre_post);
5231     -static DEVICE_ATTR(di_model, S_IWUGO | S_IRUGO, pod_get_di_model,
5232     +static DEVICE_ATTR(di_model, S_IWUSR | S_IRUGO, pod_get_di_model,
5233     pod_set_di_model);
5234     -static DEVICE_ATTR(di_delay, S_IWUGO | S_IRUGO, pod_get_di_delay,
5235     +static DEVICE_ATTR(di_delay, S_IWUSR | S_IRUGO, pod_get_di_delay,
5236     pod_set_di_delay);
5237     -static DEVICE_ATTR(mod_enable, S_IWUGO | S_IRUGO, pod_get_mod_enable,
5238     +static DEVICE_ATTR(mod_enable, S_IWUSR | S_IRUGO, pod_get_mod_enable,
5239     pod_set_mod_enable);
5240     -static DEVICE_ATTR(mod_param_1_note_value, S_IWUGO | S_IRUGO,
5241     +static DEVICE_ATTR(mod_param_1_note_value, S_IWUSR | S_IRUGO,
5242     pod_get_mod_param_1_note_value,
5243     pod_set_mod_param_1_note_value);
5244     -static DEVICE_ATTR(mod_param_2, S_IWUGO | S_IRUGO, pod_get_mod_param_2,
5245     +static DEVICE_ATTR(mod_param_2, S_IWUSR | S_IRUGO, pod_get_mod_param_2,
5246     pod_set_mod_param_2);
5247     -static DEVICE_ATTR(mod_param_3, S_IWUGO | S_IRUGO, pod_get_mod_param_3,
5248     +static DEVICE_ATTR(mod_param_3, S_IWUSR | S_IRUGO, pod_get_mod_param_3,
5249     pod_set_mod_param_3);
5250     -static DEVICE_ATTR(mod_param_4, S_IWUGO | S_IRUGO, pod_get_mod_param_4,
5251     +static DEVICE_ATTR(mod_param_4, S_IWUSR | S_IRUGO, pod_get_mod_param_4,
5252     pod_set_mod_param_4);
5253     -static DEVICE_ATTR(mod_param_5, S_IWUGO | S_IRUGO, pod_get_mod_param_5,
5254     +static DEVICE_ATTR(mod_param_5, S_IWUSR | S_IRUGO, pod_get_mod_param_5,
5255     pod_set_mod_param_5);
5256     -static DEVICE_ATTR(mod_volume_mix, S_IWUGO | S_IRUGO, pod_get_mod_volume_mix,
5257     +static DEVICE_ATTR(mod_volume_mix, S_IWUSR | S_IRUGO, pod_get_mod_volume_mix,
5258     pod_set_mod_volume_mix);
5259     -static DEVICE_ATTR(mod_pre_post, S_IWUGO | S_IRUGO, pod_get_mod_pre_post,
5260     +static DEVICE_ATTR(mod_pre_post, S_IWUSR | S_IRUGO, pod_get_mod_pre_post,
5261     pod_set_mod_pre_post);
5262     -static DEVICE_ATTR(modulation_model, S_IWUGO | S_IRUGO,
5263     +static DEVICE_ATTR(modulation_model, S_IWUSR | S_IRUGO,
5264     pod_get_modulation_model, pod_set_modulation_model);
5265     -static DEVICE_ATTR(band_3_frequency, S_IWUGO | S_IRUGO,
5266     +static DEVICE_ATTR(band_3_frequency, S_IWUSR | S_IRUGO,
5267     pod_get_band_3_frequency, pod_set_band_3_frequency);
5268     -static DEVICE_ATTR2(band_4_frequency__bass, band_4_frequency, S_IWUGO | S_IRUGO,
5269     +static DEVICE_ATTR2(band_4_frequency__bass, band_4_frequency, S_IWUSR | S_IRUGO,
5270     pod_get_band_4_frequency__bass,
5271     pod_set_band_4_frequency__bass);
5272     -static DEVICE_ATTR(mod_param_1_double_precision, S_IWUGO | S_IRUGO,
5273     +static DEVICE_ATTR(mod_param_1_double_precision, S_IWUSR | S_IRUGO,
5274     pod_get_mod_param_1_double_precision,
5275     pod_set_mod_param_1_double_precision);
5276     -static DEVICE_ATTR(delay_param_1_double_precision, S_IWUGO | S_IRUGO,
5277     +static DEVICE_ATTR(delay_param_1_double_precision, S_IWUSR | S_IRUGO,
5278     pod_get_delay_param_1_double_precision,
5279     pod_set_delay_param_1_double_precision);
5280     -static DEVICE_ATTR(eq_enable, S_IWUGO | S_IRUGO, pod_get_eq_enable,
5281     +static DEVICE_ATTR(eq_enable, S_IWUSR | S_IRUGO, pod_get_eq_enable,
5282     pod_set_eq_enable);
5283     -static DEVICE_ATTR(tap, S_IWUGO | S_IRUGO, pod_get_tap, pod_set_tap);
5284     -static DEVICE_ATTR(volume_tweak_pedal_assign, S_IWUGO | S_IRUGO,
5285     +static DEVICE_ATTR(tap, S_IWUSR | S_IRUGO, pod_get_tap, pod_set_tap);
5286     +static DEVICE_ATTR(volume_tweak_pedal_assign, S_IWUSR | S_IRUGO,
5287     pod_get_volume_tweak_pedal_assign,
5288     pod_set_volume_tweak_pedal_assign);
5289     -static DEVICE_ATTR(band_5_frequency, S_IWUGO | S_IRUGO,
5290     +static DEVICE_ATTR(band_5_frequency, S_IWUSR | S_IRUGO,
5291     pod_get_band_5_frequency, pod_set_band_5_frequency);
5292     -static DEVICE_ATTR(tuner, S_IWUGO | S_IRUGO, pod_get_tuner, pod_set_tuner);
5293     -static DEVICE_ATTR(mic_selection, S_IWUGO | S_IRUGO, pod_get_mic_selection,
5294     +static DEVICE_ATTR(tuner, S_IWUSR | S_IRUGO, pod_get_tuner, pod_set_tuner);
5295     +static DEVICE_ATTR(mic_selection, S_IWUSR | S_IRUGO, pod_get_mic_selection,
5296     pod_set_mic_selection);
5297     -static DEVICE_ATTR(cabinet_model, S_IWUGO | S_IRUGO, pod_get_cabinet_model,
5298     +static DEVICE_ATTR(cabinet_model, S_IWUSR | S_IRUGO, pod_get_cabinet_model,
5299     pod_set_cabinet_model);
5300     -static DEVICE_ATTR(stomp_model, S_IWUGO | S_IRUGO, pod_get_stomp_model,
5301     +static DEVICE_ATTR(stomp_model, S_IWUSR | S_IRUGO, pod_get_stomp_model,
5302     pod_set_stomp_model);
5303     -static DEVICE_ATTR(roomlevel, S_IWUGO | S_IRUGO, pod_get_roomlevel,
5304     +static DEVICE_ATTR(roomlevel, S_IWUSR | S_IRUGO, pod_get_roomlevel,
5305     pod_set_roomlevel);
5306     -static DEVICE_ATTR(band_4_frequency, S_IWUGO | S_IRUGO,
5307     +static DEVICE_ATTR(band_4_frequency, S_IWUSR | S_IRUGO,
5308     pod_get_band_4_frequency, pod_set_band_4_frequency);
5309     -static DEVICE_ATTR(band_6_frequency, S_IWUGO | S_IRUGO,
5310     +static DEVICE_ATTR(band_6_frequency, S_IWUSR | S_IRUGO,
5311     pod_get_band_6_frequency, pod_set_band_6_frequency);
5312     -static DEVICE_ATTR(stomp_param_1_note_value, S_IWUGO | S_IRUGO,
5313     +static DEVICE_ATTR(stomp_param_1_note_value, S_IWUSR | S_IRUGO,
5314     pod_get_stomp_param_1_note_value,
5315     pod_set_stomp_param_1_note_value);
5316     -static DEVICE_ATTR(stomp_param_2, S_IWUGO | S_IRUGO, pod_get_stomp_param_2,
5317     +static DEVICE_ATTR(stomp_param_2, S_IWUSR | S_IRUGO, pod_get_stomp_param_2,
5318     pod_set_stomp_param_2);
5319     -static DEVICE_ATTR(stomp_param_3, S_IWUGO | S_IRUGO, pod_get_stomp_param_3,
5320     +static DEVICE_ATTR(stomp_param_3, S_IWUSR | S_IRUGO, pod_get_stomp_param_3,
5321     pod_set_stomp_param_3);
5322     -static DEVICE_ATTR(stomp_param_4, S_IWUGO | S_IRUGO, pod_get_stomp_param_4,
5323     +static DEVICE_ATTR(stomp_param_4, S_IWUSR | S_IRUGO, pod_get_stomp_param_4,
5324     pod_set_stomp_param_4);
5325     -static DEVICE_ATTR(stomp_param_5, S_IWUGO | S_IRUGO, pod_get_stomp_param_5,
5326     +static DEVICE_ATTR(stomp_param_5, S_IWUSR | S_IRUGO, pod_get_stomp_param_5,
5327     pod_set_stomp_param_5);
5328     -static DEVICE_ATTR(stomp_param_6, S_IWUGO | S_IRUGO, pod_get_stomp_param_6,
5329     +static DEVICE_ATTR(stomp_param_6, S_IWUSR | S_IRUGO, pod_get_stomp_param_6,
5330     pod_set_stomp_param_6);
5331     -static DEVICE_ATTR(amp_switch_select, S_IWUGO | S_IRUGO,
5332     +static DEVICE_ATTR(amp_switch_select, S_IWUSR | S_IRUGO,
5333     pod_get_amp_switch_select, pod_set_amp_switch_select);
5334     -static DEVICE_ATTR(delay_param_4, S_IWUGO | S_IRUGO, pod_get_delay_param_4,
5335     +static DEVICE_ATTR(delay_param_4, S_IWUSR | S_IRUGO, pod_get_delay_param_4,
5336     pod_set_delay_param_4);
5337     -static DEVICE_ATTR(delay_param_5, S_IWUGO | S_IRUGO, pod_get_delay_param_5,
5338     +static DEVICE_ATTR(delay_param_5, S_IWUSR | S_IRUGO, pod_get_delay_param_5,
5339     pod_set_delay_param_5);
5340     -static DEVICE_ATTR(delay_pre_post, S_IWUGO | S_IRUGO, pod_get_delay_pre_post,
5341     +static DEVICE_ATTR(delay_pre_post, S_IWUSR | S_IRUGO, pod_get_delay_pre_post,
5342     pod_set_delay_pre_post);
5343     -static DEVICE_ATTR(delay_model, S_IWUGO | S_IRUGO, pod_get_delay_model,
5344     +static DEVICE_ATTR(delay_model, S_IWUSR | S_IRUGO, pod_get_delay_model,
5345     pod_set_delay_model);
5346     -static DEVICE_ATTR(delay_verb_model, S_IWUGO | S_IRUGO,
5347     +static DEVICE_ATTR(delay_verb_model, S_IWUSR | S_IRUGO,
5348     pod_get_delay_verb_model, pod_set_delay_verb_model);
5349     -static DEVICE_ATTR(tempo_msb, S_IWUGO | S_IRUGO, pod_get_tempo_msb,
5350     +static DEVICE_ATTR(tempo_msb, S_IWUSR | S_IRUGO, pod_get_tempo_msb,
5351     pod_set_tempo_msb);
5352     -static DEVICE_ATTR(tempo_lsb, S_IWUGO | S_IRUGO, pod_get_tempo_lsb,
5353     +static DEVICE_ATTR(tempo_lsb, S_IWUSR | S_IRUGO, pod_get_tempo_lsb,
5354     pod_set_tempo_lsb);
5355     -static DEVICE_ATTR(wah_model, S_IWUGO | S_IRUGO, pod_get_wah_model,
5356     +static DEVICE_ATTR(wah_model, S_IWUSR | S_IRUGO, pod_get_wah_model,
5357     pod_set_wah_model);
5358     -static DEVICE_ATTR(bypass_volume, S_IWUGO | S_IRUGO, pod_get_bypass_volume,
5359     +static DEVICE_ATTR(bypass_volume, S_IWUSR | S_IRUGO, pod_get_bypass_volume,
5360     pod_set_bypass_volume);
5361     -static DEVICE_ATTR(fx_loop_on_off, S_IWUGO | S_IRUGO, pod_get_fx_loop_on_off,
5362     +static DEVICE_ATTR(fx_loop_on_off, S_IWUSR | S_IRUGO, pod_get_fx_loop_on_off,
5363     pod_set_fx_loop_on_off);
5364     -static DEVICE_ATTR(tweak_param_select, S_IWUGO | S_IRUGO,
5365     +static DEVICE_ATTR(tweak_param_select, S_IWUSR | S_IRUGO,
5366     pod_get_tweak_param_select, pod_set_tweak_param_select);
5367     -static DEVICE_ATTR(amp1_engage, S_IWUGO | S_IRUGO, pod_get_amp1_engage,
5368     +static DEVICE_ATTR(amp1_engage, S_IWUSR | S_IRUGO, pod_get_amp1_engage,
5369     pod_set_amp1_engage);
5370     -static DEVICE_ATTR(band_1_gain, S_IWUGO | S_IRUGO, pod_get_band_1_gain,
5371     +static DEVICE_ATTR(band_1_gain, S_IWUSR | S_IRUGO, pod_get_band_1_gain,
5372     pod_set_band_1_gain);
5373     -static DEVICE_ATTR2(band_2_gain__bass, band_2_gain, S_IWUGO | S_IRUGO,
5374     +static DEVICE_ATTR2(band_2_gain__bass, band_2_gain, S_IWUSR | S_IRUGO,
5375     pod_get_band_2_gain__bass, pod_set_band_2_gain__bass);
5376     -static DEVICE_ATTR(band_2_gain, S_IWUGO | S_IRUGO, pod_get_band_2_gain,
5377     +static DEVICE_ATTR(band_2_gain, S_IWUSR | S_IRUGO, pod_get_band_2_gain,
5378     pod_set_band_2_gain);
5379     -static DEVICE_ATTR2(band_3_gain__bass, band_3_gain, S_IWUGO | S_IRUGO,
5380     +static DEVICE_ATTR2(band_3_gain__bass, band_3_gain, S_IWUSR | S_IRUGO,
5381     pod_get_band_3_gain__bass, pod_set_band_3_gain__bass);
5382     -static DEVICE_ATTR(band_3_gain, S_IWUGO | S_IRUGO, pod_get_band_3_gain,
5383     +static DEVICE_ATTR(band_3_gain, S_IWUSR | S_IRUGO, pod_get_band_3_gain,
5384     pod_set_band_3_gain);
5385     -static DEVICE_ATTR2(band_4_gain__bass, band_4_gain, S_IWUGO | S_IRUGO,
5386     +static DEVICE_ATTR2(band_4_gain__bass, band_4_gain, S_IWUSR | S_IRUGO,
5387     pod_get_band_4_gain__bass, pod_set_band_4_gain__bass);
5388     -static DEVICE_ATTR2(band_5_gain__bass, band_5_gain, S_IWUGO | S_IRUGO,
5389     +static DEVICE_ATTR2(band_5_gain__bass, band_5_gain, S_IWUSR | S_IRUGO,
5390     pod_get_band_5_gain__bass, pod_set_band_5_gain__bass);
5391     -static DEVICE_ATTR(band_4_gain, S_IWUGO | S_IRUGO, pod_get_band_4_gain,
5392     +static DEVICE_ATTR(band_4_gain, S_IWUSR | S_IRUGO, pod_get_band_4_gain,
5393     pod_set_band_4_gain);
5394     -static DEVICE_ATTR2(band_6_gain__bass, band_6_gain, S_IWUGO | S_IRUGO,
5395     +static DEVICE_ATTR2(band_6_gain__bass, band_6_gain, S_IWUSR | S_IRUGO,
5396     pod_get_band_6_gain__bass, pod_set_band_6_gain__bass);
5397     static DEVICE_ATTR(body, S_IRUGO, variax_get_body, line6_nop_write);
5398     static DEVICE_ATTR(pickup1_enable, S_IRUGO, variax_get_pickup1_enable,
5399     diff --git a/drivers/staging/line6/midi.c b/drivers/staging/line6/midi.c
5400     index 32b6ca7..9b42e34 100644
5401     --- a/drivers/staging/line6/midi.c
5402     +++ b/drivers/staging/line6/midi.c
5403     @@ -362,8 +362,8 @@ static ssize_t midi_set_midi_mask_receive(struct device *dev,
5404     return count;
5405     }
5406    
5407     -static DEVICE_ATTR(midi_mask_transmit, S_IWUGO | S_IRUGO, midi_get_midi_mask_transmit, midi_set_midi_mask_transmit);
5408     -static DEVICE_ATTR(midi_mask_receive, S_IWUGO | S_IRUGO, midi_get_midi_mask_receive, midi_set_midi_mask_receive);
5409     +static DEVICE_ATTR(midi_mask_transmit, S_IWUSR | S_IRUGO, midi_get_midi_mask_transmit, midi_set_midi_mask_transmit);
5410     +static DEVICE_ATTR(midi_mask_receive, S_IWUSR | S_IRUGO, midi_get_midi_mask_receive, midi_set_midi_mask_receive);
5411    
5412     /* MIDI device destructor */
5413     static int snd_line6_midi_free(struct snd_device *device)
5414     diff --git a/drivers/staging/line6/pod.c b/drivers/staging/line6/pod.c
5415     index 28f5146..63318d7 100644
5416     --- a/drivers/staging/line6/pod.c
5417     +++ b/drivers/staging/line6/pod.c
5418     @@ -952,33 +952,33 @@ POD_GET_SYSTEM_PARAM(tuner_pitch, 1, 1);
5419     #undef GET_SYSTEM_PARAM
5420    
5421     /* POD special files: */
5422     -static DEVICE_ATTR(channel, S_IWUGO | S_IRUGO, pod_get_channel, pod_set_channel);
5423     +static DEVICE_ATTR(channel, S_IWUSR | S_IRUGO, pod_get_channel, pod_set_channel);
5424     static DEVICE_ATTR(clip, S_IRUGO, pod_wait_for_clip, line6_nop_write);
5425     static DEVICE_ATTR(device_id, S_IRUGO, pod_get_device_id, line6_nop_write);
5426     static DEVICE_ATTR(dirty, S_IRUGO, pod_get_dirty, line6_nop_write);
5427     -static DEVICE_ATTR(dump, S_IWUGO | S_IRUGO, pod_get_dump, pod_set_dump);
5428     -static DEVICE_ATTR(dump_buf, S_IWUGO | S_IRUGO, pod_get_dump_buf, pod_set_dump_buf);
5429     -static DEVICE_ATTR(finish, S_IWUGO, line6_nop_read, pod_set_finish);
5430     +static DEVICE_ATTR(dump, S_IWUSR | S_IRUGO, pod_get_dump, pod_set_dump);
5431     +static DEVICE_ATTR(dump_buf, S_IWUSR | S_IRUGO, pod_get_dump_buf, pod_set_dump_buf);
5432     +static DEVICE_ATTR(finish, S_IWUSR, line6_nop_read, pod_set_finish);
5433     static DEVICE_ATTR(firmware_version, S_IRUGO, pod_get_firmware_version, line6_nop_write);
5434     -static DEVICE_ATTR(midi_postprocess, S_IWUGO | S_IRUGO, pod_get_midi_postprocess, pod_set_midi_postprocess);
5435     -static DEVICE_ATTR(monitor_level, S_IWUGO | S_IRUGO, pod_get_monitor_level, pod_set_monitor_level);
5436     +static DEVICE_ATTR(midi_postprocess, S_IWUSR | S_IRUGO, pod_get_midi_postprocess, pod_set_midi_postprocess);
5437     +static DEVICE_ATTR(monitor_level, S_IWUSR | S_IRUGO, pod_get_monitor_level, pod_set_monitor_level);
5438     static DEVICE_ATTR(name, S_IRUGO, pod_get_name, line6_nop_write);
5439     static DEVICE_ATTR(name_buf, S_IRUGO, pod_get_name_buf, line6_nop_write);
5440     -static DEVICE_ATTR(retrieve_amp_setup, S_IWUGO, line6_nop_read, pod_set_retrieve_amp_setup);
5441     -static DEVICE_ATTR(retrieve_channel, S_IWUGO, line6_nop_read, pod_set_retrieve_channel);
5442     -static DEVICE_ATTR(retrieve_effects_setup, S_IWUGO, line6_nop_read, pod_set_retrieve_effects_setup);
5443     -static DEVICE_ATTR(routing, S_IWUGO | S_IRUGO, pod_get_routing, pod_set_routing);
5444     +static DEVICE_ATTR(retrieve_amp_setup, S_IWUSR, line6_nop_read, pod_set_retrieve_amp_setup);
5445     +static DEVICE_ATTR(retrieve_channel, S_IWUSR, line6_nop_read, pod_set_retrieve_channel);
5446     +static DEVICE_ATTR(retrieve_effects_setup, S_IWUSR, line6_nop_read, pod_set_retrieve_effects_setup);
5447     +static DEVICE_ATTR(routing, S_IWUSR | S_IRUGO, pod_get_routing, pod_set_routing);
5448     static DEVICE_ATTR(serial_number, S_IRUGO, pod_get_serial_number, line6_nop_write);
5449     -static DEVICE_ATTR(store_amp_setup, S_IWUGO, line6_nop_read, pod_set_store_amp_setup);
5450     -static DEVICE_ATTR(store_channel, S_IWUGO, line6_nop_read, pod_set_store_channel);
5451     -static DEVICE_ATTR(store_effects_setup, S_IWUGO, line6_nop_read, pod_set_store_effects_setup);
5452     -static DEVICE_ATTR(tuner_freq, S_IWUGO | S_IRUGO, pod_get_tuner_freq, pod_set_tuner_freq);
5453     -static DEVICE_ATTR(tuner_mute, S_IWUGO | S_IRUGO, pod_get_tuner_mute, pod_set_tuner_mute);
5454     +static DEVICE_ATTR(store_amp_setup, S_IWUSR, line6_nop_read, pod_set_store_amp_setup);
5455     +static DEVICE_ATTR(store_channel, S_IWUSR, line6_nop_read, pod_set_store_channel);
5456     +static DEVICE_ATTR(store_effects_setup, S_IWUSR, line6_nop_read, pod_set_store_effects_setup);
5457     +static DEVICE_ATTR(tuner_freq, S_IWUSR | S_IRUGO, pod_get_tuner_freq, pod_set_tuner_freq);
5458     +static DEVICE_ATTR(tuner_mute, S_IWUSR | S_IRUGO, pod_get_tuner_mute, pod_set_tuner_mute);
5459     static DEVICE_ATTR(tuner_note, S_IRUGO, pod_get_tuner_note, line6_nop_write);
5460     static DEVICE_ATTR(tuner_pitch, S_IRUGO, pod_get_tuner_pitch, line6_nop_write);
5461    
5462     #if CREATE_RAW_FILE
5463     -static DEVICE_ATTR(raw, S_IWUGO, line6_nop_read, line6_set_raw);
5464     +static DEVICE_ATTR(raw, S_IWUSR, line6_nop_read, line6_set_raw);
5465     #endif
5466    
5467     /*
5468     diff --git a/drivers/staging/line6/toneport.c b/drivers/staging/line6/toneport.c
5469     index e6770ea..db42178 100644
5470     --- a/drivers/staging/line6/toneport.c
5471     +++ b/drivers/staging/line6/toneport.c
5472     @@ -124,9 +124,9 @@ static ssize_t toneport_set_led_green(struct device *dev,
5473     return count;
5474     }
5475    
5476     -static DEVICE_ATTR(led_red, S_IWUGO | S_IRUGO, line6_nop_read,
5477     +static DEVICE_ATTR(led_red, S_IWUSR | S_IRUGO, line6_nop_read,
5478     toneport_set_led_red);
5479     -static DEVICE_ATTR(led_green, S_IWUGO | S_IRUGO, line6_nop_read,
5480     +static DEVICE_ATTR(led_green, S_IWUSR | S_IRUGO, line6_nop_read,
5481     toneport_set_led_green);
5482    
5483     static int toneport_send_cmd(struct usb_device *usbdev, int cmd1, int cmd2)
5484     diff --git a/drivers/staging/line6/variax.c b/drivers/staging/line6/variax.c
5485     index 58ddbe6..b2fc09b 100644
5486     --- a/drivers/staging/line6/variax.c
5487     +++ b/drivers/staging/line6/variax.c
5488     @@ -389,17 +389,17 @@ static ssize_t variax_set_raw2(struct device *dev,
5489     #endif
5490    
5491     /* Variax workbench special files: */
5492     -static DEVICE_ATTR(model, S_IWUGO | S_IRUGO, variax_get_model, variax_set_model);
5493     -static DEVICE_ATTR(volume, S_IWUGO | S_IRUGO, variax_get_volume, variax_set_volume);
5494     -static DEVICE_ATTR(tone, S_IWUGO | S_IRUGO, variax_get_tone, variax_set_tone);
5495     +static DEVICE_ATTR(model, S_IWUSR | S_IRUGO, variax_get_model, variax_set_model);
5496     +static DEVICE_ATTR(volume, S_IWUSR | S_IRUGO, variax_get_volume, variax_set_volume);
5497     +static DEVICE_ATTR(tone, S_IWUSR | S_IRUGO, variax_get_tone, variax_set_tone);
5498     static DEVICE_ATTR(name, S_IRUGO, variax_get_name, line6_nop_write);
5499     static DEVICE_ATTR(bank, S_IRUGO, variax_get_bank, line6_nop_write);
5500     static DEVICE_ATTR(dump, S_IRUGO, variax_get_dump, line6_nop_write);
5501     -static DEVICE_ATTR(active, S_IWUGO | S_IRUGO, variax_get_active, variax_set_active);
5502     +static DEVICE_ATTR(active, S_IWUSR | S_IRUGO, variax_get_active, variax_set_active);
5503    
5504     #if CREATE_RAW_FILE
5505     -static DEVICE_ATTR(raw, S_IWUGO, line6_nop_read, line6_set_raw);
5506     -static DEVICE_ATTR(raw2, S_IWUGO, line6_nop_read, variax_set_raw2);
5507     +static DEVICE_ATTR(raw, S_IWUSR, line6_nop_read, line6_set_raw);
5508     +static DEVICE_ATTR(raw2, S_IWUSR, line6_nop_read, variax_set_raw2);
5509     #endif
5510    
5511    
5512     diff --git a/drivers/staging/rt2860/usb_main_dev.c b/drivers/staging/rt2860/usb_main_dev.c
5513     index ebf9074..cd15daa 100644
5514     --- a/drivers/staging/rt2860/usb_main_dev.c
5515     +++ b/drivers/staging/rt2860/usb_main_dev.c
5516     @@ -65,6 +65,7 @@ struct usb_device_id rtusb_usb_id[] = {
5517     {USB_DEVICE(0x14B2, 0x3C07)}, /* AL */
5518     {USB_DEVICE(0x050D, 0x8053)}, /* Belkin */
5519     {USB_DEVICE(0x050D, 0x825B)}, /* Belkin */
5520     + {USB_DEVICE(0x050D, 0x935A)}, /* Belkin F6D4050 v1 */
5521     {USB_DEVICE(0x050D, 0x935B)}, /* Belkin F6D4050 v2 */
5522     {USB_DEVICE(0x14B2, 0x3C23)}, /* Airlink */
5523     {USB_DEVICE(0x14B2, 0x3C27)}, /* Airlink */
5524     @@ -181,6 +182,7 @@ struct usb_device_id rtusb_usb_id[] = {
5525     {USB_DEVICE(0x2001, 0x3C09)}, /* D-Link */
5526     {USB_DEVICE(0x2001, 0x3C0A)}, /* D-Link 3072 */
5527     {USB_DEVICE(0x2019, 0xED14)}, /* Planex Communications, Inc. */
5528     + {USB_DEVICE(0x0411, 0x015D)}, /* Buffalo Airstation WLI-UC-GN */
5529     {} /* Terminating entry */
5530     };
5531    
5532     diff --git a/drivers/staging/rtl8187se/r8185b_init.c b/drivers/staging/rtl8187se/r8185b_init.c
5533     index a0ece1f..e7e8745 100644
5534     --- a/drivers/staging/rtl8187se/r8185b_init.c
5535     +++ b/drivers/staging/rtl8187se/r8185b_init.c
5536     @@ -268,8 +268,12 @@ HwHSSIThreeWire(
5537     }
5538     udelay(10);
5539     }
5540     - if (TryCnt == TC_3W_POLL_MAX_TRY_CNT)
5541     - panic("HwThreeWire(): CmdReg: %#X RE|WE bits are not clear!!\n", u1bTmp);
5542     + if (TryCnt == TC_3W_POLL_MAX_TRY_CNT) {
5543     + printk(KERN_ERR "rtl8187se: HwThreeWire(): CmdReg:"
5544     + " %#X RE|WE bits are not clear!!\n", u1bTmp);
5545     + dump_stack();
5546     + return 0;
5547     + }
5548    
5549     // RTL8187S HSSI Read/Write Function
5550     u1bTmp = read_nic_byte(dev, RF_SW_CONFIG);
5551     @@ -309,13 +313,23 @@ HwHSSIThreeWire(
5552     int idx;
5553     int ByteCnt = nDataBufBitCnt / 8;
5554     //printk("%d\n",nDataBufBitCnt);
5555     - if ((nDataBufBitCnt % 8) != 0)
5556     - panic("HwThreeWire(): nDataBufBitCnt(%d) should be multiple of 8!!!\n",
5557     - nDataBufBitCnt);
5558     + if ((nDataBufBitCnt % 8) != 0) {
5559     + printk(KERN_ERR "rtl8187se: "
5560     + "HwThreeWire(): nDataBufBitCnt(%d)"
5561     + " should be multiple of 8!!!\n",
5562     + nDataBufBitCnt);
5563     + dump_stack();
5564     + nDataBufBitCnt += 8;
5565     + nDataBufBitCnt &= ~7;
5566     + }
5567    
5568     - if (nDataBufBitCnt > 64)
5569     - panic("HwThreeWire(): nDataBufBitCnt(%d) should <= 64!!!\n",
5570     - nDataBufBitCnt);
5571     + if (nDataBufBitCnt > 64) {
5572     + printk(KERN_ERR "rtl8187se: HwThreeWire():"
5573     + " nDataBufBitCnt(%d) should <= 64!!!\n",
5574     + nDataBufBitCnt);
5575     + dump_stack();
5576     + nDataBufBitCnt = 64;
5577     + }
5578    
5579     for(idx = 0; idx < ByteCnt; idx++)
5580     {
5581     diff --git a/drivers/staging/samsung-laptop/samsung-laptop.c b/drivers/staging/samsung-laptop/samsung-laptop.c
5582     index eb44b60..ac2bf11 100644
5583     --- a/drivers/staging/samsung-laptop/samsung-laptop.c
5584     +++ b/drivers/staging/samsung-laptop/samsung-laptop.c
5585     @@ -356,7 +356,7 @@ static ssize_t set_silent_state(struct device *dev,
5586     }
5587     return count;
5588     }
5589     -static DEVICE_ATTR(silent, S_IWUGO | S_IRUGO,
5590     +static DEVICE_ATTR(silent, S_IWUSR | S_IRUGO,
5591     get_silent_state, set_silent_state);
5592    
5593    
5594     diff --git a/drivers/staging/udlfb/udlfb.c b/drivers/staging/udlfb/udlfb.c
5595     index c7e061e..456cd5c 100644
5596     --- a/drivers/staging/udlfb/udlfb.c
5597     +++ b/drivers/staging/udlfb/udlfb.c
5598     @@ -1143,7 +1143,7 @@ static struct device_attribute fb_device_attrs[] = {
5599     __ATTR_RO(metrics_bytes_sent),
5600     __ATTR_RO(metrics_cpu_kcycles_used),
5601     __ATTR_RO(metrics_misc),
5602     - __ATTR(metrics_reset, S_IWUGO, NULL, metrics_reset_store),
5603     + __ATTR(metrics_reset, S_IWUSR, NULL, metrics_reset_store),
5604     __ATTR_RW(use_defio),
5605     };
5606    
5607     diff --git a/drivers/usb/atm/ueagle-atm.c b/drivers/usb/atm/ueagle-atm.c
5608     index ea071a5..44447f5 100644
5609     --- a/drivers/usb/atm/ueagle-atm.c
5610     +++ b/drivers/usb/atm/ueagle-atm.c
5611     @@ -2301,7 +2301,7 @@ out:
5612     return ret;
5613     }
5614    
5615     -static DEVICE_ATTR(stat_status, S_IWUGO | S_IRUGO, read_status, reboot);
5616     +static DEVICE_ATTR(stat_status, S_IWUSR | S_IRUGO, read_status, reboot);
5617    
5618     static ssize_t read_human_status(struct device *dev,
5619     struct device_attribute *attr, char *buf)
5620     @@ -2364,8 +2364,7 @@ out:
5621     return ret;
5622     }
5623    
5624     -static DEVICE_ATTR(stat_human_status, S_IWUGO | S_IRUGO,
5625     - read_human_status, NULL);
5626     +static DEVICE_ATTR(stat_human_status, S_IRUGO, read_human_status, NULL);
5627    
5628     static ssize_t read_delin(struct device *dev, struct device_attribute *attr,
5629     char *buf)
5630     @@ -2397,7 +2396,7 @@ out:
5631     return ret;
5632     }
5633    
5634     -static DEVICE_ATTR(stat_delin, S_IWUGO | S_IRUGO, read_delin, NULL);
5635     +static DEVICE_ATTR(stat_delin, S_IRUGO, read_delin, NULL);
5636    
5637     #define UEA_ATTR(name, reset) \
5638     \
5639     diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c
5640     index f1aaff6..045bb4b 100644
5641     --- a/drivers/usb/core/devio.c
5642     +++ b/drivers/usb/core/devio.c
5643     @@ -965,10 +965,11 @@ static int proc_getdriver(struct dev_state *ps, void __user *arg)
5644    
5645     static int proc_connectinfo(struct dev_state *ps, void __user *arg)
5646     {
5647     - struct usbdevfs_connectinfo ci;
5648     + struct usbdevfs_connectinfo ci = {
5649     + .devnum = ps->dev->devnum,
5650     + .slow = ps->dev->speed == USB_SPEED_LOW
5651     + };
5652    
5653     - ci.devnum = ps->dev->devnum;
5654     - ci.slow = ps->dev->speed == USB_SPEED_LOW;
5655     if (copy_to_user(arg, &ci, sizeof(ci)))
5656     return -EFAULT;
5657     return 0;
5658     diff --git a/drivers/usb/gadget/atmel_usba_udc.c b/drivers/usb/gadget/atmel_usba_udc.c
5659     index 959f062..2d19d88 100644
5660     --- a/drivers/usb/gadget/atmel_usba_udc.c
5661     +++ b/drivers/usb/gadget/atmel_usba_udc.c
5662     @@ -2016,7 +2016,7 @@ static int __init usba_udc_probe(struct platform_device *pdev)
5663     }
5664     } else {
5665     /* gpio_request fail so use -EINVAL for gpio_is_valid */
5666     - ubc->vbus_pin = -EINVAL;
5667     + udc->vbus_pin = -EINVAL;
5668     }
5669     }
5670    
5671     diff --git a/drivers/usb/host/ehci-dbg.c b/drivers/usb/host/ehci-dbg.c
5672     index 76b7fd2..b349021 100644
5673     --- a/drivers/usb/host/ehci-dbg.c
5674     +++ b/drivers/usb/host/ehci-dbg.c
5675     @@ -1063,7 +1063,7 @@ static inline void create_debug_files (struct ehci_hcd *ehci)
5676     &debug_registers_fops))
5677     goto file_error;
5678    
5679     - if (!debugfs_create_file("lpm", S_IRUGO|S_IWUGO, ehci->debug_dir, bus,
5680     + if (!debugfs_create_file("lpm", S_IRUGO|S_IWUSR, ehci->debug_dir, bus,
5681     &debug_lpm_fops))
5682     goto file_error;
5683    
5684     diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
5685     index 34a928d..df7b194 100644
5686     --- a/drivers/usb/host/ehci-hcd.c
5687     +++ b/drivers/usb/host/ehci-hcd.c
5688     @@ -1048,10 +1048,11 @@ rescan:
5689     tmp && tmp != qh;
5690     tmp = tmp->qh_next.qh)
5691     continue;
5692     - /* periodic qh self-unlinks on empty */
5693     - if (!tmp)
5694     - goto nogood;
5695     - unlink_async (ehci, qh);
5696     + /* periodic qh self-unlinks on empty, and a COMPLETING qh
5697     + * may already be unlinked.
5698     + */
5699     + if (tmp)
5700     + unlink_async(ehci, qh);
5701     /* FALL THROUGH */
5702     case QH_STATE_UNLINK: /* wait for hw to finish? */
5703     case QH_STATE_UNLINK_WAIT:
5704     @@ -1068,7 +1069,6 @@ idle_timeout:
5705     }
5706     /* else FALL THROUGH */
5707     default:
5708     -nogood:
5709     /* caller was supposed to have unlinked any requests;
5710     * that's not our job. just leak this memory.
5711     */
5712     diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c
5713     index a1e8d27..8d24d1c 100644
5714     --- a/drivers/usb/host/ehci-pci.c
5715     +++ b/drivers/usb/host/ehci-pci.c
5716     @@ -148,6 +148,18 @@ static int ehci_pci_setup(struct usb_hcd *hcd)
5717     if (pdev->revision < 0xa4)
5718     ehci->no_selective_suspend = 1;
5719     break;
5720     +
5721     + /* MCP89 chips on the MacBookAir3,1 give EPROTO when
5722     + * fetching device descriptors unless LPM is disabled.
5723     + * There are also intermittent problems enumerating
5724     + * devices with PPCD enabled.
5725     + */
5726     + case 0x0d9d:
5727     + ehci_info(ehci, "disable lpm/ppcd for nvidia mcp89");
5728     + ehci->has_lpm = 0;
5729     + ehci->has_ppcd = 0;
5730     + ehci->command &= ~CMD_PPCEE;
5731     + break;
5732     }
5733     break;
5734     case PCI_VENDOR_ID_VIA:
5735     diff --git a/drivers/usb/host/ohci-jz4740.c b/drivers/usb/host/ohci-jz4740.c
5736     index 10e1872..931d588 100644
5737     --- a/drivers/usb/host/ohci-jz4740.c
5738     +++ b/drivers/usb/host/ohci-jz4740.c
5739     @@ -273,4 +273,4 @@ static struct platform_driver ohci_hcd_jz4740_driver = {
5740     },
5741     };
5742    
5743     -MODULE_ALIAS("platfrom:jz4740-ohci");
5744     +MODULE_ALIAS("platform:jz4740-ohci");
5745     diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c
5746     index a1a7a97..480936a 100644
5747     --- a/drivers/usb/host/xhci-hub.c
5748     +++ b/drivers/usb/host/xhci-hub.c
5749     @@ -132,6 +132,13 @@ static u32 xhci_port_state_to_neutral(u32 state)
5750     static void xhci_disable_port(struct xhci_hcd *xhci, u16 wIndex,
5751     u32 __iomem *addr, u32 port_status)
5752     {
5753     + /* Don't allow the USB core to disable SuperSpeed ports. */
5754     + if (xhci->port_array[wIndex] == 0x03) {
5755     + xhci_dbg(xhci, "Ignoring request to disable "
5756     + "SuperSpeed port.\n");
5757     + return;
5758     + }
5759     +
5760     /* Write 1 to disable the port */
5761     xhci_writel(xhci, port_status | PORT_PE, addr);
5762     port_status = xhci_readl(xhci, addr);
5763     diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c
5764     index 4e51343..e0ec1a2 100644
5765     --- a/drivers/usb/host/xhci-mem.c
5766     +++ b/drivers/usb/host/xhci-mem.c
5767     @@ -1043,7 +1043,7 @@ static inline u32 xhci_get_max_esit_payload(struct xhci_hcd *xhci,
5768     if (udev->speed == USB_SPEED_SUPER)
5769     return ep->ss_ep_comp.wBytesPerInterval;
5770    
5771     - max_packet = ep->desc.wMaxPacketSize & 0x3ff;
5772     + max_packet = GET_MAX_PACKET(ep->desc.wMaxPacketSize);
5773     max_burst = (ep->desc.wMaxPacketSize & 0x1800) >> 11;
5774     /* A 0 in max burst means 1 transfer per ESIT */
5775     return max_packet * (max_burst + 1);
5776     @@ -1133,7 +1133,7 @@ int xhci_endpoint_init(struct xhci_hcd *xhci,
5777     /* Fall through */
5778     case USB_SPEED_FULL:
5779     case USB_SPEED_LOW:
5780     - max_packet = ep->desc.wMaxPacketSize & 0x3ff;
5781     + max_packet = GET_MAX_PACKET(ep->desc.wMaxPacketSize);
5782     ep_ctx->ep_info2 |= MAX_PACKET(max_packet);
5783     break;
5784     default:
5785     @@ -1441,6 +1441,13 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci)
5786     xhci->dcbaa = NULL;
5787    
5788     scratchpad_free(xhci);
5789     +
5790     + xhci->num_usb2_ports = 0;
5791     + xhci->num_usb3_ports = 0;
5792     + kfree(xhci->usb2_ports);
5793     + kfree(xhci->usb3_ports);
5794     + kfree(xhci->port_array);
5795     +
5796     xhci->page_size = 0;
5797     xhci->page_shift = 0;
5798     }
5799     @@ -1624,6 +1631,161 @@ static void xhci_set_hc_event_deq(struct xhci_hcd *xhci)
5800     &xhci->ir_set->erst_dequeue);
5801     }
5802    
5803     +static void xhci_add_in_port(struct xhci_hcd *xhci, unsigned int num_ports,
5804     + u32 __iomem *addr, u8 major_revision)
5805     +{
5806     + u32 temp, port_offset, port_count;
5807     + int i;
5808     +
5809     + if (major_revision > 0x03) {
5810     + xhci_warn(xhci, "Ignoring unknown port speed, "
5811     + "Ext Cap %p, revision = 0x%x\n",
5812     + addr, major_revision);
5813     + /* Ignoring port protocol we can't understand. FIXME */
5814     + return;
5815     + }
5816     +
5817     + /* Port offset and count in the third dword, see section 7.2 */
5818     + temp = xhci_readl(xhci, addr + 2);
5819     + port_offset = XHCI_EXT_PORT_OFF(temp);
5820     + port_count = XHCI_EXT_PORT_COUNT(temp);
5821     + xhci_dbg(xhci, "Ext Cap %p, port offset = %u, "
5822     + "count = %u, revision = 0x%x\n",
5823     + addr, port_offset, port_count, major_revision);
5824     + /* Port count includes the current port offset */
5825     + if (port_offset == 0 || (port_offset + port_count - 1) > num_ports)
5826     + /* WTF? "Valid values are ‘1’ to MaxPorts" */
5827     + return;
5828     + port_offset--;
5829     + for (i = port_offset; i < (port_offset + port_count); i++) {
5830     + /* Duplicate entry. Ignore the port if the revisions differ. */
5831     + if (xhci->port_array[i] != 0) {
5832     + xhci_warn(xhci, "Duplicate port entry, Ext Cap %p,"
5833     + " port %u\n", addr, i);
5834     + xhci_warn(xhci, "Port was marked as USB %u, "
5835     + "duplicated as USB %u\n",
5836     + xhci->port_array[i], major_revision);
5837     + /* Only adjust the roothub port counts if we haven't
5838     + * found a similar duplicate.
5839     + */
5840     + if (xhci->port_array[i] != major_revision &&
5841     + xhci->port_array[i] != (u8) -1) {
5842     + if (xhci->port_array[i] == 0x03)
5843     + xhci->num_usb3_ports--;
5844     + else
5845     + xhci->num_usb2_ports--;
5846     + xhci->port_array[i] = (u8) -1;
5847     + }
5848     + /* FIXME: Should we disable the port? */
5849     + }
5850     + xhci->port_array[i] = major_revision;
5851     + if (major_revision == 0x03)
5852     + xhci->num_usb3_ports++;
5853     + else
5854     + xhci->num_usb2_ports++;
5855     + }
5856     + /* FIXME: Should we disable ports not in the Extended Capabilities? */
5857     +}
5858     +
5859     +/*
5860     + * Scan the Extended Capabilities for the "Supported Protocol Capabilities" that
5861     + * specify what speeds each port is supposed to be. We can't count on the port
5862     + * speed bits in the PORTSC register being correct until a device is connected,
5863     + * but we need to set up the two fake roothubs with the correct number of USB
5864     + * 3.0 and USB 2.0 ports at host controller initialization time.
5865     + */
5866     +static int xhci_setup_port_arrays(struct xhci_hcd *xhci, gfp_t flags)
5867     +{
5868     + u32 __iomem *addr;
5869     + u32 offset;
5870     + unsigned int num_ports;
5871     + int i, port_index;
5872     +
5873     + addr = &xhci->cap_regs->hcc_params;
5874     + offset = XHCI_HCC_EXT_CAPS(xhci_readl(xhci, addr));
5875     + if (offset == 0) {
5876     + xhci_err(xhci, "No Extended Capability registers, "
5877     + "unable to set up roothub.\n");
5878     + return -ENODEV;
5879     + }
5880     +
5881     + num_ports = HCS_MAX_PORTS(xhci->hcs_params1);
5882     + xhci->port_array = kzalloc(sizeof(*xhci->port_array)*num_ports, flags);
5883     + if (!xhci->port_array)
5884     + return -ENOMEM;
5885     +
5886     + /*
5887     + * For whatever reason, the first capability offset is from the
5888     + * capability register base, not from the HCCPARAMS register.
5889     + * See section 5.3.6 for offset calculation.
5890     + */
5891     + addr = &xhci->cap_regs->hc_capbase + offset;
5892     + while (1) {
5893     + u32 cap_id;
5894     +
5895     + cap_id = xhci_readl(xhci, addr);
5896     + if (XHCI_EXT_CAPS_ID(cap_id) == XHCI_EXT_CAPS_PROTOCOL)
5897     + xhci_add_in_port(xhci, num_ports, addr,
5898     + (u8) XHCI_EXT_PORT_MAJOR(cap_id));
5899     + offset = XHCI_EXT_CAPS_NEXT(cap_id);
5900     + if (!offset || (xhci->num_usb2_ports + xhci->num_usb3_ports)
5901     + == num_ports)
5902     + break;
5903     + /*
5904     + * Once you're into the Extended Capabilities, the offset is
5905     + * always relative to the register holding the offset.
5906     + */
5907     + addr += offset;
5908     + }
5909     +
5910     + if (xhci->num_usb2_ports == 0 && xhci->num_usb3_ports == 0) {
5911     + xhci_warn(xhci, "No ports on the roothubs?\n");
5912     + return -ENODEV;
5913     + }
5914     + xhci_dbg(xhci, "Found %u USB 2.0 ports and %u USB 3.0 ports.\n",
5915     + xhci->num_usb2_ports, xhci->num_usb3_ports);
5916     + /*
5917     + * Note we could have all USB 3.0 ports, or all USB 2.0 ports.
5918     + * Not sure how the USB core will handle a hub with no ports...
5919     + */
5920     + if (xhci->num_usb2_ports) {
5921     + xhci->usb2_ports = kmalloc(sizeof(*xhci->usb2_ports)*
5922     + xhci->num_usb2_ports, flags);
5923     + if (!xhci->usb2_ports)
5924     + return -ENOMEM;
5925     +
5926     + port_index = 0;
5927     + for (i = 0; i < num_ports; i++)
5928     + if (xhci->port_array[i] != 0x03) {
5929     + xhci->usb2_ports[port_index] =
5930     + &xhci->op_regs->port_status_base +
5931     + NUM_PORT_REGS*i;
5932     + xhci_dbg(xhci, "USB 2.0 port at index %u, "
5933     + "addr = %p\n", i,
5934     + xhci->usb2_ports[port_index]);
5935     + port_index++;
5936     + }
5937     + }
5938     + if (xhci->num_usb3_ports) {
5939     + xhci->usb3_ports = kmalloc(sizeof(*xhci->usb3_ports)*
5940     + xhci->num_usb3_ports, flags);
5941     + if (!xhci->usb3_ports)
5942     + return -ENOMEM;
5943     +
5944     + port_index = 0;
5945     + for (i = 0; i < num_ports; i++)
5946     + if (xhci->port_array[i] == 0x03) {
5947     + xhci->usb3_ports[port_index] =
5948     + &xhci->op_regs->port_status_base +
5949     + NUM_PORT_REGS*i;
5950     + xhci_dbg(xhci, "USB 3.0 port at index %u, "
5951     + "addr = %p\n", i,
5952     + xhci->usb3_ports[port_index]);
5953     + port_index++;
5954     + }
5955     + }
5956     + return 0;
5957     +}
5958    
5959     int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags)
5960     {
5961     @@ -1804,6 +1966,8 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags)
5962    
5963     if (scratchpad_alloc(xhci, flags))
5964     goto fail;
5965     + if (xhci_setup_port_arrays(xhci, flags))
5966     + goto fail;
5967    
5968     return 0;
5969    
5970     diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
5971     index 48e60d1..e7547d8 100644
5972     --- a/drivers/usb/host/xhci-ring.c
5973     +++ b/drivers/usb/host/xhci-ring.c
5974     @@ -2028,7 +2028,6 @@ irqreturn_t xhci_irq(struct usb_hcd *hcd)
5975    
5976     if (!(status & STS_EINT)) {
5977     spin_unlock(&xhci->lock);
5978     - xhci_warn(xhci, "Spurious interrupt.\n");
5979     return IRQ_NONE;
5980     }
5981     xhci_dbg(xhci, "op reg status = %08x\n", status);
5982     diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
5983     index d5c550e..f3d5222 100644
5984     --- a/drivers/usb/host/xhci.c
5985     +++ b/drivers/usb/host/xhci.c
5986     @@ -1284,6 +1284,15 @@ static int xhci_configure_endpoint(struct xhci_hcd *xhci,
5987     cmd_completion = command->completion;
5988     cmd_status = &command->status;
5989     command->command_trb = xhci->cmd_ring->enqueue;
5990     +
5991     + /* Enqueue pointer can be left pointing to the link TRB,
5992     + * we must handle that
5993     + */
5994     + if ((command->command_trb->link.control & TRB_TYPE_BITMASK)
5995     + == TRB_TYPE(TRB_LINK))
5996     + command->command_trb =
5997     + xhci->cmd_ring->enq_seg->next->trbs;
5998     +
5999     list_add_tail(&command->cmd_list, &virt_dev->cmd_list);
6000     } else {
6001     in_ctx = virt_dev->in_ctx;
6002     @@ -1993,6 +2002,15 @@ int xhci_reset_device(struct usb_hcd *hcd, struct usb_device *udev)
6003     /* Attempt to submit the Reset Device command to the command ring */
6004     spin_lock_irqsave(&xhci->lock, flags);
6005     reset_device_cmd->command_trb = xhci->cmd_ring->enqueue;
6006     +
6007     + /* Enqueue pointer can be left pointing to the link TRB,
6008     + * we must handle that
6009     + */
6010     + if ((reset_device_cmd->command_trb->link.control & TRB_TYPE_BITMASK)
6011     + == TRB_TYPE(TRB_LINK))
6012     + reset_device_cmd->command_trb =
6013     + xhci->cmd_ring->enq_seg->next->trbs;
6014     +
6015     list_add_tail(&reset_device_cmd->cmd_list, &virt_dev->cmd_list);
6016     ret = xhci_queue_reset_device(xhci, slot_id);
6017     if (ret) {
6018     diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h
6019     index 34a60d9..404ecbc 100644
6020     --- a/drivers/usb/host/xhci.h
6021     +++ b/drivers/usb/host/xhci.h
6022     @@ -448,6 +448,24 @@ struct xhci_doorbell_array {
6023    
6024    
6025     /**
6026     + * struct xhci_protocol_caps
6027     + * @revision: major revision, minor revision, capability ID,
6028     + * and next capability pointer.
6029     + * @name_string: Four ASCII characters to say which spec this xHC
6030     + * follows, typically "USB ".
6031     + * @port_info: Port offset, count, and protocol-defined information.
6032     + */
6033     +struct xhci_protocol_caps {
6034     + u32 revision;
6035     + u32 name_string;
6036     + u32 port_info;
6037     +};
6038     +
6039     +#define XHCI_EXT_PORT_MAJOR(x) (((x) >> 24) & 0xff)
6040     +#define XHCI_EXT_PORT_OFF(x) ((x) & 0xff)
6041     +#define XHCI_EXT_PORT_COUNT(x) (((x) >> 8) & 0xff)
6042     +
6043     +/**
6044     * struct xhci_container_ctx
6045     * @type: Type of context. Used to calculated offsets to contained contexts.
6046     * @size: Size of the context data
6047     @@ -614,6 +632,11 @@ struct xhci_ep_ctx {
6048     #define MAX_PACKET_MASK (0xffff << 16)
6049     #define MAX_PACKET_DECODED(p) (((p) >> 16) & 0xffff)
6050    
6051     +/* Get max packet size from ep desc. Bit 10..0 specify the max packet size.
6052     + * USB2.0 spec 9.6.6.
6053     + */
6054     +#define GET_MAX_PACKET(p) ((p) & 0x7ff)
6055     +
6056     /* tx_info bitmasks */
6057     #define AVG_TRB_LENGTH_FOR_EP(p) ((p) & 0xffff)
6058     #define MAX_ESIT_PAYLOAD_FOR_EP(p) (((p) & 0xffff) << 16)
6059     @@ -1199,6 +1222,15 @@ struct xhci_hcd {
6060     #define XHCI_LINK_TRB_QUIRK (1 << 0)
6061     #define XHCI_RESET_EP_QUIRK (1 << 1)
6062     #define XHCI_NEC_HOST (1 << 2)
6063     +
6064     + /* Is each xHCI roothub port a USB 3.0, USB 2.0, or USB 1.1 port? */
6065     + u8 *port_array;
6066     + /* Array of pointers to USB 3.0 PORTSC registers */
6067     + u32 __iomem **usb3_ports;
6068     + unsigned int num_usb3_ports;
6069     + /* Array of pointers to USB 2.0 PORTSC registers */
6070     + u32 __iomem **usb2_ports;
6071     + unsigned int num_usb2_ports;
6072     };
6073    
6074     /* For testing purposes */
6075     diff --git a/drivers/usb/misc/cypress_cy7c63.c b/drivers/usb/misc/cypress_cy7c63.c
6076     index 2f43c57..9251773 100644
6077     --- a/drivers/usb/misc/cypress_cy7c63.c
6078     +++ b/drivers/usb/misc/cypress_cy7c63.c
6079     @@ -196,11 +196,9 @@ static ssize_t get_port1_handler(struct device *dev,
6080     return read_port(dev, attr, buf, 1, CYPRESS_READ_PORT_ID1);
6081     }
6082    
6083     -static DEVICE_ATTR(port0, S_IWUGO | S_IRUGO,
6084     - get_port0_handler, set_port0_handler);
6085     +static DEVICE_ATTR(port0, S_IRUGO | S_IWUSR, get_port0_handler, set_port0_handler);
6086    
6087     -static DEVICE_ATTR(port1, S_IWUGO | S_IRUGO,
6088     - get_port1_handler, set_port1_handler);
6089     +static DEVICE_ATTR(port1, S_IRUGO | S_IWUSR, get_port1_handler, set_port1_handler);
6090    
6091    
6092     static int cypress_probe(struct usb_interface *interface,
6093     diff --git a/drivers/usb/misc/iowarrior.c b/drivers/usb/misc/iowarrior.c
6094     index bc88c79..0db05b2 100644
6095     --- a/drivers/usb/misc/iowarrior.c
6096     +++ b/drivers/usb/misc/iowarrior.c
6097     @@ -553,6 +553,7 @@ static long iowarrior_ioctl(struct file *file, unsigned int cmd,
6098     /* needed for power consumption */
6099     struct usb_config_descriptor *cfg_descriptor = &dev->udev->actconfig->desc;
6100    
6101     + memset(&info, 0, sizeof(info));
6102     /* directly from the descriptor */
6103     info.vendor = le16_to_cpu(dev->udev->descriptor.idVendor);
6104     info.product = dev->product_id;
6105     diff --git a/drivers/usb/misc/sisusbvga/sisusb.c b/drivers/usb/misc/sisusbvga/sisusb.c
6106     index 70d00e9..dd573ab 100644
6107     --- a/drivers/usb/misc/sisusbvga/sisusb.c
6108     +++ b/drivers/usb/misc/sisusbvga/sisusb.c
6109     @@ -3008,6 +3008,7 @@ sisusb_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
6110     #else
6111     x.sisusb_conactive = 0;
6112     #endif
6113     + memset(x.sisusb_reserved, 0, sizeof(x.sisusb_reserved));
6114    
6115     if (copy_to_user((void __user *)arg, &x, sizeof(x)))
6116     retval = -EFAULT;
6117     diff --git a/drivers/usb/misc/trancevibrator.c b/drivers/usb/misc/trancevibrator.c
6118     index d77aba4..f63776a 100644
6119     --- a/drivers/usb/misc/trancevibrator.c
6120     +++ b/drivers/usb/misc/trancevibrator.c
6121     @@ -86,7 +86,7 @@ static ssize_t set_speed(struct device *dev, struct device_attribute *attr,
6122     return count;
6123     }
6124    
6125     -static DEVICE_ATTR(speed, S_IWUGO | S_IRUGO, show_speed, set_speed);
6126     +static DEVICE_ATTR(speed, S_IRUGO | S_IWUSR, show_speed, set_speed);
6127    
6128     static int tv_probe(struct usb_interface *interface,
6129     const struct usb_device_id *id)
6130     diff --git a/drivers/usb/misc/usbled.c b/drivers/usb/misc/usbled.c
6131     index 63da2c3..c96f51d 100644
6132     --- a/drivers/usb/misc/usbled.c
6133     +++ b/drivers/usb/misc/usbled.c
6134     @@ -94,7 +94,7 @@ static ssize_t set_##value(struct device *dev, struct device_attribute *attr, co
6135     change_color(led); \
6136     return count; \
6137     } \
6138     -static DEVICE_ATTR(value, S_IWUGO | S_IRUGO, show_##value, set_##value);
6139     +static DEVICE_ATTR(value, S_IRUGO | S_IWUSR, show_##value, set_##value);
6140     show_set(blue);
6141     show_set(red);
6142     show_set(green);
6143     diff --git a/drivers/usb/misc/usbsevseg.c b/drivers/usb/misc/usbsevseg.c
6144     index de8ef94..417b8f2 100644
6145     --- a/drivers/usb/misc/usbsevseg.c
6146     +++ b/drivers/usb/misc/usbsevseg.c
6147     @@ -192,7 +192,7 @@ static ssize_t set_attr_##name(struct device *dev, \
6148     \
6149     return count; \
6150     } \
6151     -static DEVICE_ATTR(name, S_IWUGO | S_IRUGO, show_attr_##name, set_attr_##name);
6152     +static DEVICE_ATTR(name, S_IRUGO | S_IWUSR, show_attr_##name, set_attr_##name);
6153    
6154     static ssize_t show_attr_text(struct device *dev,
6155     struct device_attribute *attr, char *buf)
6156     @@ -223,7 +223,7 @@ static ssize_t set_attr_text(struct device *dev,
6157     return count;
6158     }
6159    
6160     -static DEVICE_ATTR(text, S_IWUGO | S_IRUGO, show_attr_text, set_attr_text);
6161     +static DEVICE_ATTR(text, S_IRUGO | S_IWUSR, show_attr_text, set_attr_text);
6162    
6163     static ssize_t show_attr_decimals(struct device *dev,
6164     struct device_attribute *attr, char *buf)
6165     @@ -272,8 +272,7 @@ static ssize_t set_attr_decimals(struct device *dev,
6166     return count;
6167     }
6168    
6169     -static DEVICE_ATTR(decimals, S_IWUGO | S_IRUGO,
6170     - show_attr_decimals, set_attr_decimals);
6171     +static DEVICE_ATTR(decimals, S_IRUGO | S_IWUSR, show_attr_decimals, set_attr_decimals);
6172    
6173     static ssize_t show_attr_textmode(struct device *dev,
6174     struct device_attribute *attr, char *buf)
6175     @@ -319,8 +318,7 @@ static ssize_t set_attr_textmode(struct device *dev,
6176     return -EINVAL;
6177     }
6178    
6179     -static DEVICE_ATTR(textmode, S_IWUGO | S_IRUGO,
6180     - show_attr_textmode, set_attr_textmode);
6181     +static DEVICE_ATTR(textmode, S_IRUGO | S_IWUSR, show_attr_textmode, set_attr_textmode);
6182    
6183    
6184     MYDEV_ATTR_SIMPLE_UNSIGNED(powered, update_display_powered);
6185     diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c
6186     index 513d6bd..0707b29 100644
6187     --- a/drivers/usb/musb/musb_core.c
6188     +++ b/drivers/usb/musb/musb_core.c
6189     @@ -2243,7 +2243,6 @@ static int __exit musb_remove(struct platform_device *pdev)
6190     #endif
6191     musb_writeb(musb->mregs, MUSB_DEVCTL, 0);
6192     musb_platform_exit(musb);
6193     - musb_writeb(musb->mregs, MUSB_DEVCTL, 0);
6194    
6195     musb_free(musb);
6196     iounmap(ctrl_base);
6197     diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
6198     index 01ba740..bc1d9c1 100644
6199     --- a/drivers/usb/serial/ftdi_sio.c
6200     +++ b/drivers/usb/serial/ftdi_sio.c
6201     @@ -201,6 +201,7 @@ static struct usb_device_id id_table_combined [] = {
6202     { USB_DEVICE(FTDI_VID, FTDI_MTXORB_5_PID) },
6203     { USB_DEVICE(FTDI_VID, FTDI_MTXORB_6_PID) },
6204     { USB_DEVICE(FTDI_VID, FTDI_R2000KU_TRUE_RNG) },
6205     + { USB_DEVICE(FTDI_VID, FTDI_VARDAAN_PID) },
6206     { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0100_PID) },
6207     { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0101_PID) },
6208     { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0102_PID) },
6209     @@ -696,6 +697,7 @@ static struct usb_device_id id_table_combined [] = {
6210     .driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
6211     { USB_DEVICE(TELLDUS_VID, TELLDUS_TELLSTICK_PID) },
6212     { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_SERIAL_VX7_PID) },
6213     + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_CT29B_PID) },
6214     { USB_DEVICE(FTDI_VID, FTDI_MAXSTREAM_PID) },
6215     { USB_DEVICE(FTDI_VID, FTDI_PHI_FISCO_PID) },
6216     { USB_DEVICE(TML_VID, TML_USB_SERIAL_PID) },
6217     @@ -794,6 +796,8 @@ static struct usb_device_id id_table_combined [] = {
6218     { USB_DEVICE(FTDI_VID, FTDI_SCIENCESCOPE_LOGBOOKML_PID) },
6219     { USB_DEVICE(FTDI_VID, FTDI_SCIENCESCOPE_LS_LOGBOOK_PID) },
6220     { USB_DEVICE(FTDI_VID, FTDI_SCIENCESCOPE_HS_LOGBOOK_PID) },
6221     + { USB_DEVICE(QIHARDWARE_VID, MILKYMISTONE_JTAGSERIAL_PID),
6222     + .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
6223     { }, /* Optional parameter entry */
6224     { } /* Terminating entry */
6225     };
6226     diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h
6227     index cf1aea1b..393c37d 100644
6228     --- a/drivers/usb/serial/ftdi_sio_ids.h
6229     +++ b/drivers/usb/serial/ftdi_sio_ids.h
6230     @@ -114,6 +114,9 @@
6231     /* Lenz LI-USB Computer Interface. */
6232     #define FTDI_LENZ_LIUSB_PID 0xD780
6233    
6234     +/* Vardaan Enterprises Serial Interface VEUSB422R3 */
6235     +#define FTDI_VARDAAN_PID 0xF070
6236     +
6237     /*
6238     * Xsens Technologies BV products (http://www.xsens.com).
6239     */
6240     @@ -721,6 +724,7 @@
6241     */
6242     #define RTSYSTEMS_VID 0x2100 /* Vendor ID */
6243     #define RTSYSTEMS_SERIAL_VX7_PID 0x9e52 /* Serial converter for VX-7 Radios using FT232RL */
6244     +#define RTSYSTEMS_CT29B_PID 0x9e54 /* CT29B Radio Cable */
6245    
6246     /*
6247     * Bayer Ascensia Contour blood glucose meter USB-converter cable.
6248     @@ -1100,3 +1104,10 @@
6249     #define FTDI_SCIENCESCOPE_LOGBOOKML_PID 0xFF18
6250     #define FTDI_SCIENCESCOPE_LS_LOGBOOK_PID 0xFF1C
6251     #define FTDI_SCIENCESCOPE_HS_LOGBOOK_PID 0xFF1D
6252     +
6253     +/*
6254     + * Milkymist One JTAG/Serial
6255     + */
6256     +#define QIHARDWARE_VID 0x20B7
6257     +#define MILKYMISTONE_JTAGSERIAL_PID 0x0713
6258     +
6259     diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
6260     index 51de0dd..12d5f82 100644
6261     --- a/drivers/usb/serial/option.c
6262     +++ b/drivers/usb/serial/option.c
6263     @@ -512,7 +512,7 @@ static const struct usb_device_id option_ids[] = {
6264     { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4505, 0xff, 0xff, 0xff) },
6265     { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3765, 0xff, 0xff, 0xff) },
6266     { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_ETS1220, 0xff, 0xff, 0xff) },
6267     - { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E14AC) },
6268     + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E14AC, 0xff, 0xff, 0xff) },
6269     { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V640) },
6270     { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V620) },
6271     { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V740) },
6272     diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c
6273     index 7a2177c..b993e8d 100644
6274     --- a/drivers/usb/serial/usb-serial.c
6275     +++ b/drivers/usb/serial/usb-serial.c
6276     @@ -52,6 +52,7 @@ static struct usb_driver usb_serial_driver = {
6277     .suspend = usb_serial_suspend,
6278     .resume = usb_serial_resume,
6279     .no_dynamic_id = 1,
6280     + .supports_autosuspend = 1,
6281     };
6282    
6283     /* There is no MODULE_DEVICE_TABLE for usbserial.c. Instead
6284     @@ -1331,6 +1332,8 @@ int usb_serial_register(struct usb_serial_driver *driver)
6285     return -ENODEV;
6286    
6287     fixup_generic(driver);
6288     + if (driver->usb_driver)
6289     + driver->usb_driver->supports_autosuspend = 1;
6290    
6291     if (!driver->description)
6292     driver->description = driver->driver.name;
6293     diff --git a/drivers/usb/storage/sierra_ms.c b/drivers/usb/storage/sierra_ms.c
6294     index 57fc2f5..ceba512 100644
6295     --- a/drivers/usb/storage/sierra_ms.c
6296     +++ b/drivers/usb/storage/sierra_ms.c
6297     @@ -121,7 +121,7 @@ static ssize_t show_truinst(struct device *dev, struct device_attribute *attr,
6298     }
6299     return result;
6300     }
6301     -static DEVICE_ATTR(truinst, S_IWUGO | S_IRUGO, show_truinst, NULL);
6302     +static DEVICE_ATTR(truinst, S_IRUGO, show_truinst, NULL);
6303    
6304     int sierra_ms_init(struct us_data *us)
6305     {
6306     diff --git a/drivers/video/backlight/backlight.c b/drivers/video/backlight/backlight.c
6307     index e207810..0870329 100644
6308     --- a/drivers/video/backlight/backlight.c
6309     +++ b/drivers/video/backlight/backlight.c
6310     @@ -197,12 +197,12 @@ static int backlight_suspend(struct device *dev, pm_message_t state)
6311     {
6312     struct backlight_device *bd = to_backlight_device(dev);
6313    
6314     - if (bd->ops->options & BL_CORE_SUSPENDRESUME) {
6315     - mutex_lock(&bd->ops_lock);
6316     + mutex_lock(&bd->ops_lock);
6317     + if (bd->ops && bd->ops->options & BL_CORE_SUSPENDRESUME) {
6318     bd->props.state |= BL_CORE_SUSPENDED;
6319     backlight_update_status(bd);
6320     - mutex_unlock(&bd->ops_lock);
6321     }
6322     + mutex_unlock(&bd->ops_lock);
6323    
6324     return 0;
6325     }
6326     @@ -211,12 +211,12 @@ static int backlight_resume(struct device *dev)
6327     {
6328     struct backlight_device *bd = to_backlight_device(dev);
6329    
6330     - if (bd->ops->options & BL_CORE_SUSPENDRESUME) {
6331     - mutex_lock(&bd->ops_lock);
6332     + mutex_lock(&bd->ops_lock);
6333     + if (bd->ops && bd->ops->options & BL_CORE_SUSPENDRESUME) {
6334     bd->props.state &= ~BL_CORE_SUSPENDED;
6335     backlight_update_status(bd);
6336     - mutex_unlock(&bd->ops_lock);
6337     }
6338     + mutex_unlock(&bd->ops_lock);
6339    
6340     return 0;
6341     }
6342     diff --git a/drivers/video/via/accel.c b/drivers/video/via/accel.c
6343     index e44893e..c2f4e6e 100644
6344     --- a/drivers/video/via/accel.c
6345     +++ b/drivers/video/via/accel.c
6346     @@ -283,11 +283,12 @@ static int hw_bitblt_2(void __iomem *engine, u8 op, u32 width, u32 height,
6347     writel(tmp, engine + 0x1C);
6348     }
6349    
6350     - if (op != VIA_BITBLT_COLOR)
6351     + if (op == VIA_BITBLT_FILL) {
6352     + writel(fg_color, engine + 0x58);
6353     + } else if (op == VIA_BITBLT_MONO) {
6354     writel(fg_color, engine + 0x4C);
6355     -
6356     - if (op == VIA_BITBLT_MONO)
6357     writel(bg_color, engine + 0x50);
6358     + }
6359    
6360     if (op == VIA_BITBLT_FILL)
6361     ge_cmd |= fill_rop << 24 | 0x00002000 | 0x00000001;
6362     diff --git a/drivers/video/via/via_i2c.c b/drivers/video/via/via_i2c.c
6363     index da9e4ca..021112e 100644
6364     --- a/drivers/video/via/via_i2c.c
6365     +++ b/drivers/video/via/via_i2c.c
6366     @@ -114,6 +114,7 @@ static void via_i2c_setsda(void *data, int state)
6367    
6368     int viafb_i2c_readbyte(u8 adap, u8 slave_addr, u8 index, u8 *pdata)
6369     {
6370     + int ret;
6371     u8 mm1[] = {0x00};
6372     struct i2c_msg msgs[2];
6373    
6374     @@ -126,11 +127,18 @@ int viafb_i2c_readbyte(u8 adap, u8 slave_addr, u8 index, u8 *pdata)
6375     mm1[0] = index;
6376     msgs[0].len = 1; msgs[1].len = 1;
6377     msgs[0].buf = mm1; msgs[1].buf = pdata;
6378     - return i2c_transfer(&via_i2c_par[adap].adapter, msgs, 2);
6379     + ret = i2c_transfer(&via_i2c_par[adap].adapter, msgs, 2);
6380     + if (ret == 2)
6381     + ret = 0;
6382     + else if (ret >= 0)
6383     + ret = -EIO;
6384     +
6385     + return ret;
6386     }
6387    
6388     int viafb_i2c_writebyte(u8 adap, u8 slave_addr, u8 index, u8 data)
6389     {
6390     + int ret;
6391     u8 msg[2] = { index, data };
6392     struct i2c_msg msgs;
6393    
6394     @@ -140,11 +148,18 @@ int viafb_i2c_writebyte(u8 adap, u8 slave_addr, u8 index, u8 data)
6395     msgs.addr = slave_addr / 2;
6396     msgs.len = 2;
6397     msgs.buf = msg;
6398     - return i2c_transfer(&via_i2c_par[adap].adapter, &msgs, 1);
6399     + ret = i2c_transfer(&via_i2c_par[adap].adapter, &msgs, 1);
6400     + if (ret == 1)
6401     + ret = 0;
6402     + else if (ret >= 0)
6403     + ret = -EIO;
6404     +
6405     + return ret;
6406     }
6407    
6408     int viafb_i2c_readbytes(u8 adap, u8 slave_addr, u8 index, u8 *buff, int buff_len)
6409     {
6410     + int ret;
6411     u8 mm1[] = {0x00};
6412     struct i2c_msg msgs[2];
6413    
6414     @@ -156,7 +171,13 @@ int viafb_i2c_readbytes(u8 adap, u8 slave_addr, u8 index, u8 *buff, int buff_len
6415     mm1[0] = index;
6416     msgs[0].len = 1; msgs[1].len = buff_len;
6417     msgs[0].buf = mm1; msgs[1].buf = buff;
6418     - return i2c_transfer(&via_i2c_par[adap].adapter, msgs, 2);
6419     + ret = i2c_transfer(&via_i2c_par[adap].adapter, msgs, 2);
6420     + if (ret == 2)
6421     + ret = 0;
6422     + else if (ret >= 0)
6423     + ret = -EIO;
6424     +
6425     + return ret;
6426     }
6427    
6428     /*
6429     diff --git a/drivers/xen/events.c b/drivers/xen/events.c
6430     index 13365ba..a68cc62 100644
6431     --- a/drivers/xen/events.c
6432     +++ b/drivers/xen/events.c
6433     @@ -261,7 +261,7 @@ static void init_evtchn_cpu_bindings(void)
6434     }
6435     #endif
6436    
6437     - memset(cpu_evtchn_mask(0), ~0, sizeof(cpu_evtchn_mask(0)));
6438     + memset(cpu_evtchn_mask(0), ~0, sizeof(struct cpu_evtchn_s));
6439     }
6440    
6441     static inline void clear_evtchn(int port)
6442     diff --git a/fs/bio.c b/fs/bio.c
6443     index 8abb2df..4bd454f 100644
6444     --- a/fs/bio.c
6445     +++ b/fs/bio.c
6446     @@ -370,6 +370,9 @@ struct bio *bio_kmalloc(gfp_t gfp_mask, int nr_iovecs)
6447     {
6448     struct bio *bio;
6449    
6450     + if (nr_iovecs > UIO_MAXIOV)
6451     + return NULL;
6452     +
6453     bio = kmalloc(sizeof(struct bio) + nr_iovecs * sizeof(struct bio_vec),
6454     gfp_mask);
6455     if (unlikely(!bio))
6456     @@ -697,8 +700,12 @@ static void bio_free_map_data(struct bio_map_data *bmd)
6457     static struct bio_map_data *bio_alloc_map_data(int nr_segs, int iov_count,
6458     gfp_t gfp_mask)
6459     {
6460     - struct bio_map_data *bmd = kmalloc(sizeof(*bmd), gfp_mask);
6461     + struct bio_map_data *bmd;
6462    
6463     + if (iov_count > UIO_MAXIOV)
6464     + return NULL;
6465     +
6466     + bmd = kmalloc(sizeof(*bmd), gfp_mask);
6467     if (!bmd)
6468     return NULL;
6469    
6470     @@ -827,6 +834,12 @@ struct bio *bio_copy_user_iov(struct request_queue *q,
6471     end = (uaddr + iov[i].iov_len + PAGE_SIZE - 1) >> PAGE_SHIFT;
6472     start = uaddr >> PAGE_SHIFT;
6473    
6474     + /*
6475     + * Overflow, abort
6476     + */
6477     + if (end < start)
6478     + return ERR_PTR(-EINVAL);
6479     +
6480     nr_pages += end - start;
6481     len += iov[i].iov_len;
6482     }
6483     @@ -955,6 +968,12 @@ static struct bio *__bio_map_user_iov(struct request_queue *q,
6484     unsigned long end = (uaddr + len + PAGE_SIZE - 1) >> PAGE_SHIFT;
6485     unsigned long start = uaddr >> PAGE_SHIFT;
6486    
6487     + /*
6488     + * Overflow, abort
6489     + */
6490     + if (end < start)
6491     + return ERR_PTR(-EINVAL);
6492     +
6493     nr_pages += end - start;
6494     /*
6495     * buffer must be aligned to at least hardsector size for now
6496     @@ -982,7 +1001,7 @@ static struct bio *__bio_map_user_iov(struct request_queue *q,
6497     unsigned long start = uaddr >> PAGE_SHIFT;
6498     const int local_nr_pages = end - start;
6499     const int page_limit = cur_page + local_nr_pages;
6500     -
6501     +
6502     ret = get_user_pages_fast(uaddr, local_nr_pages,
6503     write_to_vm, &pages[cur_page]);
6504     if (ret < local_nr_pages) {
6505     diff --git a/fs/cifs/dns_resolve.c b/fs/cifs/dns_resolve.c
6506     index 0eb8702..548f062 100644
6507     --- a/fs/cifs/dns_resolve.c
6508     +++ b/fs/cifs/dns_resolve.c
6509     @@ -66,7 +66,7 @@ dns_resolve_server_name_to_ip(const char *unc, char **ip_addr)
6510     /* Search for server name delimiter */
6511     sep = memchr(hostname, '\\', len);
6512     if (sep)
6513     - len = sep - unc;
6514     + len = sep - hostname;
6515     else
6516     cFYI(1, "%s: probably server name is whole unc: %s",
6517     __func__, unc);
6518     diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c
6519     index 53cce8c..00d1ff3 100644
6520     --- a/fs/cifs/inode.c
6521     +++ b/fs/cifs/inode.c
6522     @@ -835,8 +835,10 @@ struct inode *cifs_root_iget(struct super_block *sb, unsigned long ino)
6523     rc = cifs_get_inode_info(&inode, full_path, NULL, sb,
6524     xid, NULL);
6525    
6526     - if (!inode)
6527     - return ERR_PTR(rc);
6528     + if (!inode) {
6529     + inode = ERR_PTR(rc);
6530     + goto out;
6531     + }
6532    
6533     #ifdef CONFIG_CIFS_FSCACHE
6534     /* populate tcon->resource_id */
6535     @@ -852,13 +854,11 @@ struct inode *cifs_root_iget(struct super_block *sb, unsigned long ino)
6536     inode->i_uid = cifs_sb->mnt_uid;
6537     inode->i_gid = cifs_sb->mnt_gid;
6538     } else if (rc) {
6539     - kfree(full_path);
6540     - _FreeXid(xid);
6541     iget_failed(inode);
6542     - return ERR_PTR(rc);
6543     + inode = ERR_PTR(rc);
6544     }
6545    
6546     -
6547     +out:
6548     kfree(full_path);
6549     /* can not call macro FreeXid here since in a void func
6550     * TODO: This is no longer true
6551     diff --git a/fs/compat.c b/fs/compat.c
6552     index 0644a15..8b41dcd 100644
6553     --- a/fs/compat.c
6554     +++ b/fs/compat.c
6555     @@ -1378,6 +1378,10 @@ static int compat_count(compat_uptr_t __user *argv, int max)
6556     argv++;
6557     if (i++ >= max)
6558     return -E2BIG;
6559     +
6560     + if (fatal_signal_pending(current))
6561     + return -ERESTARTNOHAND;
6562     + cond_resched();
6563     }
6564     }
6565     return i;
6566     @@ -1419,6 +1423,12 @@ static int compat_copy_strings(int argc, compat_uptr_t __user *argv,
6567     while (len > 0) {
6568     int offset, bytes_to_copy;
6569    
6570     + if (fatal_signal_pending(current)) {
6571     + ret = -ERESTARTNOHAND;
6572     + goto out;
6573     + }
6574     + cond_resched();
6575     +
6576     offset = pos % PAGE_SIZE;
6577     if (offset == 0)
6578     offset = PAGE_SIZE;
6579     @@ -1435,18 +1445,8 @@ static int compat_copy_strings(int argc, compat_uptr_t __user *argv,
6580     if (!kmapped_page || kpos != (pos & PAGE_MASK)) {
6581     struct page *page;
6582    
6583     -#ifdef CONFIG_STACK_GROWSUP
6584     - ret = expand_stack_downwards(bprm->vma, pos);
6585     - if (ret < 0) {
6586     - /* We've exceed the stack rlimit. */
6587     - ret = -E2BIG;
6588     - goto out;
6589     - }
6590     -#endif
6591     - ret = get_user_pages(current, bprm->mm, pos,
6592     - 1, 1, 1, &page, NULL);
6593     - if (ret <= 0) {
6594     - /* We've exceed the stack rlimit. */
6595     + page = get_arg_page(bprm, pos, 1);
6596     + if (!page) {
6597     ret = -E2BIG;
6598     goto out;
6599     }
6600     @@ -1567,8 +1567,10 @@ int compat_do_execve(char * filename,
6601     return retval;
6602    
6603     out:
6604     - if (bprm->mm)
6605     + if (bprm->mm) {
6606     + acct_arg_size(bprm, 0);
6607     mmput(bprm->mm);
6608     + }
6609    
6610     out_file:
6611     if (bprm->file) {
6612     diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c
6613     index 3fbc942..9d1a22d 100644
6614     --- a/fs/ecryptfs/inode.c
6615     +++ b/fs/ecryptfs/inode.c
6616     @@ -32,6 +32,7 @@
6617     #include <linux/crypto.h>
6618     #include <linux/fs_stack.h>
6619     #include <linux/slab.h>
6620     +#include <linux/xattr.h>
6621     #include <asm/unaligned.h>
6622     #include "ecryptfs_kernel.h"
6623    
6624     @@ -70,15 +71,19 @@ ecryptfs_create_underlying_file(struct inode *lower_dir_inode,
6625     struct vfsmount *lower_mnt = ecryptfs_dentry_to_lower_mnt(dentry);
6626     struct dentry *dentry_save;
6627     struct vfsmount *vfsmount_save;
6628     + unsigned int flags_save;
6629     int rc;
6630    
6631     dentry_save = nd->path.dentry;
6632     vfsmount_save = nd->path.mnt;
6633     + flags_save = nd->flags;
6634     nd->path.dentry = lower_dentry;
6635     nd->path.mnt = lower_mnt;
6636     + nd->flags &= ~LOOKUP_OPEN;
6637     rc = vfs_create(lower_dir_inode, lower_dentry, mode, nd);
6638     nd->path.dentry = dentry_save;
6639     nd->path.mnt = vfsmount_save;
6640     + nd->flags = flags_save;
6641     return rc;
6642     }
6643    
6644     @@ -1108,10 +1113,8 @@ ecryptfs_setxattr(struct dentry *dentry, const char *name, const void *value,
6645     rc = -EOPNOTSUPP;
6646     goto out;
6647     }
6648     - mutex_lock(&lower_dentry->d_inode->i_mutex);
6649     - rc = lower_dentry->d_inode->i_op->setxattr(lower_dentry, name, value,
6650     - size, flags);
6651     - mutex_unlock(&lower_dentry->d_inode->i_mutex);
6652     +
6653     + rc = vfs_setxattr(lower_dentry, name, value, size, flags);
6654     out:
6655     return rc;
6656     }
6657     diff --git a/fs/exec.c b/fs/exec.c
6658     index 6d2b6f9..d750cc0 100644
6659     --- a/fs/exec.c
6660     +++ b/fs/exec.c
6661     @@ -157,7 +157,26 @@ out:
6662    
6663     #ifdef CONFIG_MMU
6664    
6665     -static struct page *get_arg_page(struct linux_binprm *bprm, unsigned long pos,
6666     +void acct_arg_size(struct linux_binprm *bprm, unsigned long pages)
6667     +{
6668     + struct mm_struct *mm = current->mm;
6669     + long diff = (long)(pages - bprm->vma_pages);
6670     +
6671     + if (!mm || !diff)
6672     + return;
6673     +
6674     + bprm->vma_pages = pages;
6675     +
6676     +#ifdef SPLIT_RSS_COUNTING
6677     + add_mm_counter(mm, MM_ANONPAGES, diff);
6678     +#else
6679     + spin_lock(&mm->page_table_lock);
6680     + add_mm_counter(mm, MM_ANONPAGES, diff);
6681     + spin_unlock(&mm->page_table_lock);
6682     +#endif
6683     +}
6684     +
6685     +struct page *get_arg_page(struct linux_binprm *bprm, unsigned long pos,
6686     int write)
6687     {
6688     struct page *page;
6689     @@ -179,6 +198,8 @@ static struct page *get_arg_page(struct linux_binprm *bprm, unsigned long pos,
6690     unsigned long size = bprm->vma->vm_end - bprm->vma->vm_start;
6691     struct rlimit *rlim;
6692    
6693     + acct_arg_size(bprm, size / PAGE_SIZE);
6694     +
6695     /*
6696     * We've historically supported up to 32 pages (ARG_MAX)
6697     * of argument strings even with small stacks
6698     @@ -269,7 +290,11 @@ static bool valid_arg_len(struct linux_binprm *bprm, long len)
6699    
6700     #else
6701    
6702     -static struct page *get_arg_page(struct linux_binprm *bprm, unsigned long pos,
6703     +void acct_arg_size(struct linux_binprm *bprm, unsigned long pages)
6704     +{
6705     +}
6706     +
6707     +struct page *get_arg_page(struct linux_binprm *bprm, unsigned long pos,
6708     int write)
6709     {
6710     struct page *page;
6711     @@ -992,6 +1017,7 @@ int flush_old_exec(struct linux_binprm * bprm)
6712     /*
6713     * Release all of the old mmap stuff
6714     */
6715     + acct_arg_size(bprm, 0);
6716     retval = exec_mmap(bprm->mm);
6717     if (retval)
6718     goto out;
6719     @@ -1416,8 +1442,10 @@ int do_execve(const char * filename,
6720     return retval;
6721    
6722     out:
6723     - if (bprm->mm)
6724     - mmput (bprm->mm);
6725     + if (bprm->mm) {
6726     + acct_arg_size(bprm, 0);
6727     + mmput(bprm->mm);
6728     + }
6729    
6730     out_file:
6731     if (bprm->file) {
6732     diff --git a/fs/ext4/super.c b/fs/ext4/super.c
6733     index 2614774..751997d 100644
6734     --- a/fs/ext4/super.c
6735     +++ b/fs/ext4/super.c
6736     @@ -719,6 +719,7 @@ static void ext4_put_super(struct super_block *sb)
6737     ext4_abort(sb, "Couldn't clean up the journal");
6738     }
6739    
6740     + del_timer(&sbi->s_err_report);
6741     ext4_release_system_zone(sb);
6742     ext4_mb_release(sb);
6743     ext4_ext_release(sb);
6744     diff --git a/fs/fuse/file.c b/fs/fuse/file.c
6745     index c822458..9242d29 100644
6746     --- a/fs/fuse/file.c
6747     +++ b/fs/fuse/file.c
6748     @@ -134,6 +134,7 @@ EXPORT_SYMBOL_GPL(fuse_do_open);
6749     void fuse_finish_open(struct inode *inode, struct file *file)
6750     {
6751     struct fuse_file *ff = file->private_data;
6752     + struct fuse_conn *fc = get_fuse_conn(inode);
6753    
6754     if (ff->open_flags & FOPEN_DIRECT_IO)
6755     file->f_op = &fuse_direct_io_file_operations;
6756     @@ -141,6 +142,15 @@ void fuse_finish_open(struct inode *inode, struct file *file)
6757     invalidate_inode_pages2(inode->i_mapping);
6758     if (ff->open_flags & FOPEN_NONSEEKABLE)
6759     nonseekable_open(inode, file);
6760     + if (fc->atomic_o_trunc && (file->f_flags & O_TRUNC)) {
6761     + struct fuse_inode *fi = get_fuse_inode(inode);
6762     +
6763     + spin_lock(&fc->lock);
6764     + fi->attr_version = ++fc->attr_version;
6765     + i_size_write(inode, 0);
6766     + spin_unlock(&fc->lock);
6767     + fuse_invalidate_attr(inode);
6768     + }
6769     }
6770    
6771     int fuse_open_common(struct inode *inode, struct file *file, bool isdir)
6772     diff --git a/fs/hostfs/hostfs.h b/fs/hostfs/hostfs.h
6773     index 6bbd75c..3ccb4e4 100644
6774     --- a/fs/hostfs/hostfs.h
6775     +++ b/fs/hostfs/hostfs.h
6776     @@ -96,7 +96,6 @@ extern int rename_file(char *from, char *to);
6777     extern int do_statfs(char *root, long *bsize_out, long long *blocks_out,
6778     long long *bfree_out, long long *bavail_out,
6779     long long *files_out, long long *ffree_out,
6780     - void *fsid_out, int fsid_size, long *namelen_out,
6781     - long *spare_out);
6782     + void *fsid_out, int fsid_size, long *namelen_out);
6783    
6784     #endif
6785     diff --git a/fs/hostfs/hostfs_kern.c b/fs/hostfs/hostfs_kern.c
6786     index f7dc9b5..cd7c939 100644
6787     --- a/fs/hostfs/hostfs_kern.c
6788     +++ b/fs/hostfs/hostfs_kern.c
6789     @@ -217,7 +217,7 @@ int hostfs_statfs(struct dentry *dentry, struct kstatfs *sf)
6790     err = do_statfs(dentry->d_sb->s_fs_info,
6791     &sf->f_bsize, &f_blocks, &f_bfree, &f_bavail, &f_files,
6792     &f_ffree, &sf->f_fsid, sizeof(sf->f_fsid),
6793     - &sf->f_namelen, sf->f_spare);
6794     + &sf->f_namelen);
6795     if (err)
6796     return err;
6797     sf->f_blocks = f_blocks;
6798     diff --git a/fs/hostfs/hostfs_user.c b/fs/hostfs/hostfs_user.c
6799     index 6777aa0..8d02683 100644
6800     --- a/fs/hostfs/hostfs_user.c
6801     +++ b/fs/hostfs/hostfs_user.c
6802     @@ -364,8 +364,7 @@ int rename_file(char *from, char *to)
6803     int do_statfs(char *root, long *bsize_out, long long *blocks_out,
6804     long long *bfree_out, long long *bavail_out,
6805     long long *files_out, long long *ffree_out,
6806     - void *fsid_out, int fsid_size, long *namelen_out,
6807     - long *spare_out)
6808     + void *fsid_out, int fsid_size, long *namelen_out)
6809     {
6810     struct statfs64 buf;
6811     int err;
6812     @@ -384,10 +383,6 @@ int do_statfs(char *root, long *bsize_out, long long *blocks_out,
6813     sizeof(buf.f_fsid) > fsid_size ? fsid_size :
6814     sizeof(buf.f_fsid));
6815     *namelen_out = buf.f_namelen;
6816     - spare_out[0] = buf.f_spare[0];
6817     - spare_out[1] = buf.f_spare[1];
6818     - spare_out[2] = buf.f_spare[2];
6819     - spare_out[3] = buf.f_spare[3];
6820     - spare_out[4] = buf.f_spare[4];
6821     +
6822     return 0;
6823     }
6824     diff --git a/fs/nfs/file.c b/fs/nfs/file.c
6825     index 05bf3c0..6d95e24 100644
6826     --- a/fs/nfs/file.c
6827     +++ b/fs/nfs/file.c
6828     @@ -551,7 +551,7 @@ static int nfs_vm_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
6829     struct file *filp = vma->vm_file;
6830     struct dentry *dentry = filp->f_path.dentry;
6831     unsigned pagelen;
6832     - int ret = -EINVAL;
6833     + int ret = VM_FAULT_NOPAGE;
6834     struct address_space *mapping;
6835    
6836     dfprintk(PAGECACHE, "NFS: vm_page_mkwrite(%s/%s(%ld), offset %lld)\n",
6837     @@ -567,21 +567,20 @@ static int nfs_vm_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
6838     if (mapping != dentry->d_inode->i_mapping)
6839     goto out_unlock;
6840    
6841     - ret = 0;
6842     pagelen = nfs_page_length(page);
6843     if (pagelen == 0)
6844     goto out_unlock;
6845    
6846     - ret = nfs_flush_incompatible(filp, page);
6847     - if (ret != 0)
6848     - goto out_unlock;
6849     + ret = VM_FAULT_LOCKED;
6850     + if (nfs_flush_incompatible(filp, page) == 0 &&
6851     + nfs_updatepage(filp, page, 0, pagelen) == 0)
6852     + goto out;
6853    
6854     - ret = nfs_updatepage(filp, page, 0, pagelen);
6855     + ret = VM_FAULT_SIGBUS;
6856     out_unlock:
6857     - if (!ret)
6858     - return VM_FAULT_LOCKED;
6859     unlock_page(page);
6860     - return VM_FAULT_SIGBUS;
6861     +out:
6862     + return ret;
6863     }
6864    
6865     static const struct vm_operations_struct nfs_file_vm_ops = {
6866     diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
6867     index 089da5b..74aa54e 100644
6868     --- a/fs/nfs/nfs4proc.c
6869     +++ b/fs/nfs/nfs4proc.c
6870     @@ -255,9 +255,6 @@ static int nfs4_handle_exception(const struct nfs_server *server, int errorcode,
6871     nfs4_state_mark_reclaim_nograce(clp, state);
6872     goto do_state_recovery;
6873     case -NFS4ERR_STALE_STATEID:
6874     - if (state == NULL)
6875     - break;
6876     - nfs4_state_mark_reclaim_reboot(clp, state);
6877     case -NFS4ERR_STALE_CLIENTID:
6878     case -NFS4ERR_EXPIRED:
6879     goto do_state_recovery;
6880     @@ -1120,6 +1117,7 @@ static int nfs4_open_recover(struct nfs4_opendata *opendata, struct nfs4_state *
6881     clear_bit(NFS_DELEGATED_STATE, &state->flags);
6882     smp_rmb();
6883     if (state->n_rdwr != 0) {
6884     + clear_bit(NFS_O_RDWR_STATE, &state->flags);
6885     ret = nfs4_open_recover_helper(opendata, FMODE_READ|FMODE_WRITE, &newstate);
6886     if (ret != 0)
6887     return ret;
6888     @@ -1127,6 +1125,7 @@ static int nfs4_open_recover(struct nfs4_opendata *opendata, struct nfs4_state *
6889     return -ESTALE;
6890     }
6891     if (state->n_wronly != 0) {
6892     + clear_bit(NFS_O_WRONLY_STATE, &state->flags);
6893     ret = nfs4_open_recover_helper(opendata, FMODE_WRITE, &newstate);
6894     if (ret != 0)
6895     return ret;
6896     @@ -1134,6 +1133,7 @@ static int nfs4_open_recover(struct nfs4_opendata *opendata, struct nfs4_state *
6897     return -ESTALE;
6898     }
6899     if (state->n_rdonly != 0) {
6900     + clear_bit(NFS_O_RDONLY_STATE, &state->flags);
6901     ret = nfs4_open_recover_helper(opendata, FMODE_READ, &newstate);
6902     if (ret != 0)
6903     return ret;
6904     @@ -3490,9 +3490,6 @@ nfs4_async_handle_error(struct rpc_task *task, const struct nfs_server *server,
6905     nfs4_state_mark_reclaim_nograce(clp, state);
6906     goto do_state_recovery;
6907     case -NFS4ERR_STALE_STATEID:
6908     - if (state == NULL)
6909     - break;
6910     - nfs4_state_mark_reclaim_reboot(clp, state);
6911     case -NFS4ERR_STALE_CLIENTID:
6912     case -NFS4ERR_EXPIRED:
6913     goto do_state_recovery;
6914     diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
6915     index 3e2f19b..940cf7c 100644
6916     --- a/fs/nfs/nfs4state.c
6917     +++ b/fs/nfs/nfs4state.c
6918     @@ -1138,16 +1138,14 @@ static void nfs4_reclaim_complete(struct nfs_client *clp,
6919     (void)ops->reclaim_complete(clp);
6920     }
6921    
6922     -static void nfs4_state_end_reclaim_reboot(struct nfs_client *clp)
6923     +static int nfs4_state_clear_reclaim_reboot(struct nfs_client *clp)
6924     {
6925     struct nfs4_state_owner *sp;
6926     struct rb_node *pos;
6927     struct nfs4_state *state;
6928    
6929     if (!test_and_clear_bit(NFS4CLNT_RECLAIM_REBOOT, &clp->cl_state))
6930     - return;
6931     -
6932     - nfs4_reclaim_complete(clp, clp->cl_mvops->reboot_recovery_ops);
6933     + return 0;
6934    
6935     for (pos = rb_first(&clp->cl_state_owners); pos != NULL; pos = rb_next(pos)) {
6936     sp = rb_entry(pos, struct nfs4_state_owner, so_client_node);
6937     @@ -1161,6 +1159,14 @@ static void nfs4_state_end_reclaim_reboot(struct nfs_client *clp)
6938     }
6939    
6940     nfs_delegation_reap_unclaimed(clp);
6941     + return 1;
6942     +}
6943     +
6944     +static void nfs4_state_end_reclaim_reboot(struct nfs_client *clp)
6945     +{
6946     + if (!nfs4_state_clear_reclaim_reboot(clp))
6947     + return;
6948     + nfs4_reclaim_complete(clp, clp->cl_mvops->reboot_recovery_ops);
6949     }
6950    
6951     static void nfs_delegation_clear_all(struct nfs_client *clp)
6952     @@ -1187,7 +1193,7 @@ static int nfs4_recovery_handle_error(struct nfs_client *clp, int error)
6953     case -NFS4ERR_STALE_CLIENTID:
6954     case -NFS4ERR_LEASE_MOVED:
6955     set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
6956     - nfs4_state_end_reclaim_reboot(clp);
6957     + nfs4_state_clear_reclaim_reboot(clp);
6958     nfs4_state_start_reclaim_reboot(clp);
6959     break;
6960     case -NFS4ERR_EXPIRED:
6961     diff --git a/fs/nfs/pagelist.c b/fs/nfs/pagelist.c
6962     index 9194902..137b549 100644
6963     --- a/fs/nfs/pagelist.c
6964     +++ b/fs/nfs/pagelist.c
6965     @@ -65,6 +65,13 @@ nfs_create_request(struct nfs_open_context *ctx, struct inode *inode,
6966     if (req == NULL)
6967     return ERR_PTR(-ENOMEM);
6968    
6969     + /* get lock context early so we can deal with alloc failures */
6970     + req->wb_lock_context = nfs_get_lock_context(ctx);
6971     + if (req->wb_lock_context == NULL) {
6972     + nfs_page_free(req);
6973     + return ERR_PTR(-ENOMEM);
6974     + }
6975     +
6976     /* Initialize the request struct. Initially, we assume a
6977     * long write-back delay. This will be adjusted in
6978     * update_nfs_request below if the region is not locked. */
6979     @@ -79,7 +86,6 @@ nfs_create_request(struct nfs_open_context *ctx, struct inode *inode,
6980     req->wb_pgbase = offset;
6981     req->wb_bytes = count;
6982     req->wb_context = get_nfs_open_context(ctx);
6983     - req->wb_lock_context = nfs_get_lock_context(ctx);
6984     kref_init(&req->wb_kref);
6985     return req;
6986     }
6987     diff --git a/fs/pipe.c b/fs/pipe.c
6988     index 37eb1eb..a58d7ee 100644
6989     --- a/fs/pipe.c
6990     +++ b/fs/pipe.c
6991     @@ -1197,12 +1197,24 @@ int pipe_proc_fn(struct ctl_table *table, int write, void __user *buf,
6992     return ret;
6993     }
6994    
6995     +/*
6996     + * After the inode slimming patch, i_pipe/i_bdev/i_cdev share the same
6997     + * location, so checking ->i_pipe is not enough to verify that this is a
6998     + * pipe.
6999     + */
7000     +struct pipe_inode_info *get_pipe_info(struct file *file)
7001     +{
7002     + struct inode *i = file->f_path.dentry->d_inode;
7003     +
7004     + return S_ISFIFO(i->i_mode) ? i->i_pipe : NULL;
7005     +}
7006     +
7007     long pipe_fcntl(struct file *file, unsigned int cmd, unsigned long arg)
7008     {
7009     struct pipe_inode_info *pipe;
7010     long ret;
7011    
7012     - pipe = file->f_path.dentry->d_inode->i_pipe;
7013     + pipe = get_pipe_info(file);
7014     if (!pipe)
7015     return -EBADF;
7016    
7017     diff --git a/fs/proc/base.c b/fs/proc/base.c
7018     index 8e4adda..632b907 100644
7019     --- a/fs/proc/base.c
7020     +++ b/fs/proc/base.c
7021     @@ -1526,7 +1526,7 @@ static int do_proc_readlink(struct path *path, char __user *buffer, int buflen)
7022     if (!tmp)
7023     return -ENOMEM;
7024    
7025     - pathname = d_path_with_unreachable(path, tmp, PAGE_SIZE);
7026     + pathname = d_path(path, tmp, PAGE_SIZE);
7027     len = PTR_ERR(pathname);
7028     if (IS_ERR(pathname))
7029     goto out;
7030     diff --git a/fs/reiserfs/ioctl.c b/fs/reiserfs/ioctl.c
7031     index 5cbb81e..4131f4a 100644
7032     --- a/fs/reiserfs/ioctl.c
7033     +++ b/fs/reiserfs/ioctl.c
7034     @@ -186,12 +186,11 @@ int reiserfs_unpack(struct inode *inode, struct file *filp)
7035     return 0;
7036     }
7037    
7038     - /* we need to make sure nobody is changing the file size beneath
7039     - ** us
7040     - */
7041     - reiserfs_mutex_lock_safe(&inode->i_mutex, inode->i_sb);
7042     depth = reiserfs_write_lock_once(inode->i_sb);
7043    
7044     + /* we need to make sure nobody is changing the file size beneath us */
7045     + reiserfs_mutex_lock_safe(&inode->i_mutex, inode->i_sb);
7046     +
7047     write_from = inode->i_size & (blocksize - 1);
7048     /* if we are on a block boundary, we are already unpacked. */
7049     if (write_from == 0) {
7050     diff --git a/fs/reiserfs/xattr_acl.c b/fs/reiserfs/xattr_acl.c
7051     index 536d697..90d2fcb 100644
7052     --- a/fs/reiserfs/xattr_acl.c
7053     +++ b/fs/reiserfs/xattr_acl.c
7054     @@ -472,7 +472,9 @@ int reiserfs_acl_chmod(struct inode *inode)
7055     struct reiserfs_transaction_handle th;
7056     size_t size = reiserfs_xattr_nblocks(inode,
7057     reiserfs_acl_size(clone->a_count));
7058     - reiserfs_write_lock(inode->i_sb);
7059     + int depth;
7060     +
7061     + depth = reiserfs_write_lock_once(inode->i_sb);
7062     error = journal_begin(&th, inode->i_sb, size * 2);
7063     if (!error) {
7064     int error2;
7065     @@ -482,7 +484,7 @@ int reiserfs_acl_chmod(struct inode *inode)
7066     if (error2)
7067     error = error2;
7068     }
7069     - reiserfs_write_unlock(inode->i_sb);
7070     + reiserfs_write_unlock_once(inode->i_sb, depth);
7071     }
7072     posix_acl_release(clone);
7073     return error;
7074     diff --git a/fs/splice.c b/fs/splice.c
7075     index 8f1dfae..ce2f025 100644
7076     --- a/fs/splice.c
7077     +++ b/fs/splice.c
7078     @@ -1311,18 +1311,6 @@ long do_splice_direct(struct file *in, loff_t *ppos, struct file *out,
7079     static int splice_pipe_to_pipe(struct pipe_inode_info *ipipe,
7080     struct pipe_inode_info *opipe,
7081     size_t len, unsigned int flags);
7082     -/*
7083     - * After the inode slimming patch, i_pipe/i_bdev/i_cdev share the same
7084     - * location, so checking ->i_pipe is not enough to verify that this is a
7085     - * pipe.
7086     - */
7087     -static inline struct pipe_inode_info *pipe_info(struct inode *inode)
7088     -{
7089     - if (S_ISFIFO(inode->i_mode))
7090     - return inode->i_pipe;
7091     -
7092     - return NULL;
7093     -}
7094    
7095     /*
7096     * Determine where to splice to/from.
7097     @@ -1336,8 +1324,8 @@ static long do_splice(struct file *in, loff_t __user *off_in,
7098     loff_t offset, *off;
7099     long ret;
7100    
7101     - ipipe = pipe_info(in->f_path.dentry->d_inode);
7102     - opipe = pipe_info(out->f_path.dentry->d_inode);
7103     + ipipe = get_pipe_info(in);
7104     + opipe = get_pipe_info(out);
7105    
7106     if (ipipe && opipe) {
7107     if (off_in || off_out)
7108     @@ -1555,7 +1543,7 @@ static long vmsplice_to_user(struct file *file, const struct iovec __user *iov,
7109     int error;
7110     long ret;
7111    
7112     - pipe = pipe_info(file->f_path.dentry->d_inode);
7113     + pipe = get_pipe_info(file);
7114     if (!pipe)
7115     return -EBADF;
7116    
7117     @@ -1642,7 +1630,7 @@ static long vmsplice_to_pipe(struct file *file, const struct iovec __user *iov,
7118     };
7119     long ret;
7120    
7121     - pipe = pipe_info(file->f_path.dentry->d_inode);
7122     + pipe = get_pipe_info(file);
7123     if (!pipe)
7124     return -EBADF;
7125    
7126     @@ -2022,8 +2010,8 @@ static int link_pipe(struct pipe_inode_info *ipipe,
7127     static long do_tee(struct file *in, struct file *out, size_t len,
7128     unsigned int flags)
7129     {
7130     - struct pipe_inode_info *ipipe = pipe_info(in->f_path.dentry->d_inode);
7131     - struct pipe_inode_info *opipe = pipe_info(out->f_path.dentry->d_inode);
7132     + struct pipe_inode_info *ipipe = get_pipe_info(in);
7133     + struct pipe_inode_info *opipe = get_pipe_info(out);
7134     int ret = -EINVAL;
7135    
7136     /*
7137     diff --git a/include/linux/binfmts.h b/include/linux/binfmts.h
7138     index a065612..64a7114 100644
7139     --- a/include/linux/binfmts.h
7140     +++ b/include/linux/binfmts.h
7141     @@ -29,6 +29,7 @@ struct linux_binprm{
7142     char buf[BINPRM_BUF_SIZE];
7143     #ifdef CONFIG_MMU
7144     struct vm_area_struct *vma;
7145     + unsigned long vma_pages;
7146     #else
7147     # define MAX_ARG_PAGES 32
7148     struct page *page[MAX_ARG_PAGES];
7149     @@ -59,6 +60,10 @@ struct linux_binprm{
7150     unsigned long loader, exec;
7151     };
7152    
7153     +extern void acct_arg_size(struct linux_binprm *bprm, unsigned long pages);
7154     +extern struct page *get_arg_page(struct linux_binprm *bprm, unsigned long pos,
7155     + int write);
7156     +
7157     #define BINPRM_FLAGS_ENFORCE_NONDUMP_BIT 0
7158     #define BINPRM_FLAGS_ENFORCE_NONDUMP (1 << BINPRM_FLAGS_ENFORCE_NONDUMP_BIT)
7159    
7160     diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
7161     index 2c54906..9e443b9 100644
7162     --- a/include/linux/blkdev.h
7163     +++ b/include/linux/blkdev.h
7164     @@ -851,7 +851,7 @@ extern void blk_queue_max_segment_size(struct request_queue *, unsigned int);
7165     extern void blk_queue_max_discard_sectors(struct request_queue *q,
7166     unsigned int max_discard_sectors);
7167     extern void blk_queue_logical_block_size(struct request_queue *, unsigned short);
7168     -extern void blk_queue_physical_block_size(struct request_queue *, unsigned short);
7169     +extern void blk_queue_physical_block_size(struct request_queue *, unsigned int);
7170     extern void blk_queue_alignment_offset(struct request_queue *q,
7171     unsigned int alignment);
7172     extern void blk_limits_io_min(struct queue_limits *limits, unsigned int min);
7173     @@ -1004,7 +1004,7 @@ static inline unsigned int queue_physical_block_size(struct request_queue *q)
7174     return q->limits.physical_block_size;
7175     }
7176    
7177     -static inline int bdev_physical_block_size(struct block_device *bdev)
7178     +static inline unsigned int bdev_physical_block_size(struct block_device *bdev)
7179     {
7180     return queue_physical_block_size(bdev_get_queue(bdev));
7181     }
7182     diff --git a/include/linux/gfp.h b/include/linux/gfp.h
7183     index 975609c..81483c2 100644
7184     --- a/include/linux/gfp.h
7185     +++ b/include/linux/gfp.h
7186     @@ -339,7 +339,7 @@ void drain_local_pages(void *dummy);
7187    
7188     extern gfp_t gfp_allowed_mask;
7189    
7190     -extern void set_gfp_allowed_mask(gfp_t mask);
7191     -extern gfp_t clear_gfp_allowed_mask(gfp_t mask);
7192     +extern void pm_restrict_gfp_mask(void);
7193     +extern void pm_restore_gfp_mask(void);
7194    
7195     #endif /* __LINUX_GFP_H */
7196     diff --git a/include/linux/kfifo.h b/include/linux/kfifo.h
7197     index 62dbee5..c238ad2 100644
7198     --- a/include/linux/kfifo.h
7199     +++ b/include/linux/kfifo.h
7200     @@ -171,11 +171,8 @@ struct kfifo_rec_ptr_2 __STRUCT_KFIFO_PTR(unsigned char, 2, void);
7201     }
7202    
7203    
7204     -static inline unsigned int __must_check
7205     -__kfifo_must_check_helper(unsigned int val)
7206     -{
7207     - return val;
7208     -}
7209     +/* __kfifo_must_check_helper() is temporarily disabled because it was faulty */
7210     +#define __kfifo_must_check_helper(x) (x)
7211    
7212     /**
7213     * kfifo_initialized - Check if the fifo is initialized
7214     diff --git a/include/linux/netfilter.h b/include/linux/netfilter.h
7215     index 89341c3..03317c8 100644
7216     --- a/include/linux/netfilter.h
7217     +++ b/include/linux/netfilter.h
7218     @@ -215,7 +215,7 @@ NF_HOOK_COND(uint8_t pf, unsigned int hook, struct sk_buff *skb,
7219     int ret;
7220    
7221     if (!cond ||
7222     - (ret = nf_hook_thresh(pf, hook, skb, in, out, okfn, INT_MIN) == 1))
7223     + ((ret = nf_hook_thresh(pf, hook, skb, in, out, okfn, INT_MIN)) == 1))
7224     ret = okfn(skb);
7225     return ret;
7226     }
7227     diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
7228     index 570fdde..db8aa93 100644
7229     --- a/include/linux/pci_ids.h
7230     +++ b/include/linux/pci_ids.h
7231     @@ -2041,6 +2041,7 @@
7232     #define PCI_DEVICE_ID_AFAVLAB_P030 0x2182
7233     #define PCI_SUBDEVICE_ID_AFAVLAB_P061 0x2150
7234    
7235     +#define PCI_VENDOR_ID_BCM_GVC 0x14a4
7236     #define PCI_VENDOR_ID_BROADCOM 0x14e4
7237     #define PCI_DEVICE_ID_TIGON3_5752 0x1600
7238     #define PCI_DEVICE_ID_TIGON3_5752M 0x1601
7239     diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
7240     index 716f99b..1d42c6e 100644
7241     --- a/include/linux/perf_event.h
7242     +++ b/include/linux/perf_event.h
7243     @@ -788,6 +788,7 @@ struct perf_event_context {
7244     int nr_active;
7245     int is_active;
7246     int nr_stat;
7247     + int rotate_disable;
7248     atomic_t refcount;
7249     struct task_struct *task;
7250    
7251     diff --git a/include/linux/pipe_fs_i.h b/include/linux/pipe_fs_i.h
7252     index 4457969..bb27d7e 100644
7253     --- a/include/linux/pipe_fs_i.h
7254     +++ b/include/linux/pipe_fs_i.h
7255     @@ -160,5 +160,6 @@ void generic_pipe_buf_release(struct pipe_inode_info *, struct pipe_buffer *);
7256    
7257     /* for F_SETPIPE_SZ and F_GETPIPE_SZ */
7258     long pipe_fcntl(struct file *, unsigned int, unsigned long arg);
7259     +struct pipe_inode_info *get_pipe_info(struct file *file);
7260    
7261     #endif
7262     diff --git a/include/linux/radix-tree.h b/include/linux/radix-tree.h
7263     index 634b8e6..9f38fe5 100644
7264     --- a/include/linux/radix-tree.h
7265     +++ b/include/linux/radix-tree.h
7266     @@ -36,17 +36,6 @@
7267     * RCU.
7268     */
7269     #define RADIX_TREE_INDIRECT_PTR 1
7270     -#define RADIX_TREE_RETRY ((void *)-1UL)
7271     -
7272     -static inline void *radix_tree_ptr_to_indirect(void *ptr)
7273     -{
7274     - return (void *)((unsigned long)ptr | RADIX_TREE_INDIRECT_PTR);
7275     -}
7276     -
7277     -static inline void *radix_tree_indirect_to_ptr(void *ptr)
7278     -{
7279     - return (void *)((unsigned long)ptr & ~RADIX_TREE_INDIRECT_PTR);
7280     -}
7281    
7282     static inline int radix_tree_is_indirect_ptr(void *ptr)
7283     {
7284     @@ -138,16 +127,29 @@ do { \
7285     * removed.
7286     *
7287     * For use with radix_tree_lookup_slot(). Caller must hold tree at least read
7288     - * locked across slot lookup and dereference. More likely, will be used with
7289     - * radix_tree_replace_slot(), as well, so caller will hold tree write locked.
7290     + * locked across slot lookup and dereference. Not required if write lock is
7291     + * held (ie. items cannot be concurrently inserted).
7292     + *
7293     + * radix_tree_deref_retry must be used to confirm validity of the pointer if
7294     + * only the read lock is held.
7295     */
7296     static inline void *radix_tree_deref_slot(void **pslot)
7297     {
7298     - void *ret = rcu_dereference(*pslot);
7299     - if (unlikely(radix_tree_is_indirect_ptr(ret)))
7300     - ret = RADIX_TREE_RETRY;
7301     - return ret;
7302     + return rcu_dereference(*pslot);
7303     }
7304     +
7305     +/**
7306     + * radix_tree_deref_retry - check radix_tree_deref_slot
7307     + * @arg: pointer returned by radix_tree_deref_slot
7308     + * Returns: 0 if retry is not required, otherwise retry is required
7309     + *
7310     + * radix_tree_deref_retry must be used with radix_tree_deref_slot.
7311     + */
7312     +static inline int radix_tree_deref_retry(void *arg)
7313     +{
7314     + return unlikely((unsigned long)arg & RADIX_TREE_INDIRECT_PTR);
7315     +}
7316     +
7317     /**
7318     * radix_tree_replace_slot - replace item in a slot
7319     * @pslot: pointer to slot, returned by radix_tree_lookup_slot
7320     diff --git a/include/linux/socket.h b/include/linux/socket.h
7321     index a8f56e1..a2fada9 100644
7322     --- a/include/linux/socket.h
7323     +++ b/include/linux/socket.h
7324     @@ -322,7 +322,7 @@ extern int csum_partial_copy_fromiovecend(unsigned char *kdata,
7325     int offset,
7326     unsigned int len, __wsum *csump);
7327    
7328     -extern long verify_iovec(struct msghdr *m, struct iovec *iov, struct sockaddr *address, int mode);
7329     +extern int verify_iovec(struct msghdr *m, struct iovec *iov, struct sockaddr *address, int mode);
7330     extern int memcpy_toiovec(struct iovec *v, unsigned char *kdata, int len);
7331     extern int memcpy_toiovecend(const struct iovec *v, unsigned char *kdata,
7332     int offset, int len);
7333     diff --git a/include/linux/tty.h b/include/linux/tty.h
7334     index 67d64e6..6f62c30 100644
7335     --- a/include/linux/tty.h
7336     +++ b/include/linux/tty.h
7337     @@ -365,6 +365,7 @@ struct tty_file_private {
7338     #define TTY_HUPPED 18 /* Post driver->hangup() */
7339     #define TTY_FLUSHING 19 /* Flushing to ldisc in progress */
7340     #define TTY_FLUSHPENDING 20 /* Queued buffer flush pending */
7341     +#define TTY_HUPPING 21 /* ->hangup() in progress */
7342    
7343     #define TTY_WRITE_FLUSH(tty) tty_write_flush((tty))
7344    
7345     diff --git a/include/net/mac80211.h b/include/net/mac80211.h
7346     index b0787a1..05aaa87 100644
7347     --- a/include/net/mac80211.h
7348     +++ b/include/net/mac80211.h
7349     @@ -315,6 +315,9 @@ struct ieee80211_bss_conf {
7350     * @IEEE80211_TX_CTL_LDPC: tells the driver to use LDPC for this frame
7351     * @IEEE80211_TX_CTL_STBC: Enables Space-Time Block Coding (STBC) for this
7352     * frame and selects the maximum number of streams that it can use.
7353     + *
7354     + * Note: If you have to add new flags to the enumeration, then don't
7355     + * forget to update %IEEE80211_TX_TEMPORARY_FLAGS when necessary.
7356     */
7357     enum mac80211_tx_control_flags {
7358     IEEE80211_TX_CTL_REQ_TX_STATUS = BIT(0),
7359     @@ -344,6 +347,19 @@ enum mac80211_tx_control_flags {
7360    
7361     #define IEEE80211_TX_CTL_STBC_SHIFT 23
7362    
7363     +/*
7364     + * This definition is used as a mask to clear all temporary flags, which are
7365     + * set by the tx handlers for each transmission attempt by the mac80211 stack.
7366     + */
7367     +#define IEEE80211_TX_TEMPORARY_FLAGS (IEEE80211_TX_CTL_NO_ACK | \
7368     + IEEE80211_TX_CTL_CLEAR_PS_FILT | IEEE80211_TX_CTL_FIRST_FRAGMENT | \
7369     + IEEE80211_TX_CTL_SEND_AFTER_DTIM | IEEE80211_TX_CTL_AMPDU | \
7370     + IEEE80211_TX_STAT_TX_FILTERED | IEEE80211_TX_STAT_ACK | \
7371     + IEEE80211_TX_STAT_AMPDU | IEEE80211_TX_STAT_AMPDU_NO_BACK | \
7372     + IEEE80211_TX_CTL_RATE_CTRL_PROBE | IEEE80211_TX_CTL_PSPOLL_RESPONSE | \
7373     + IEEE80211_TX_CTL_MORE_FRAMES | IEEE80211_TX_CTL_LDPC | \
7374     + IEEE80211_TX_CTL_STBC)
7375     +
7376     /**
7377     * enum mac80211_rate_control_flags - per-rate flags set by the
7378     * Rate Control algorithm.
7379     diff --git a/ipc/compat.c b/ipc/compat.c
7380     index 9dc2c7d..845a287 100644
7381     --- a/ipc/compat.c
7382     +++ b/ipc/compat.c
7383     @@ -241,6 +241,8 @@ long compat_sys_semctl(int first, int second, int third, void __user *uptr)
7384     struct semid64_ds __user *up64;
7385     int version = compat_ipc_parse_version(&third);
7386    
7387     + memset(&s64, 0, sizeof(s64));
7388     +
7389     if (!uptr)
7390     return -EINVAL;
7391     if (get_user(pad, (u32 __user *) uptr))
7392     @@ -421,6 +423,8 @@ long compat_sys_msgctl(int first, int second, void __user *uptr)
7393     int version = compat_ipc_parse_version(&second);
7394     void __user *p;
7395    
7396     + memset(&m64, 0, sizeof(m64));
7397     +
7398     switch (second & (~IPC_64)) {
7399     case IPC_INFO:
7400     case IPC_RMID:
7401     @@ -594,6 +598,8 @@ long compat_sys_shmctl(int first, int second, void __user *uptr)
7402     int err, err2;
7403     int version = compat_ipc_parse_version(&second);
7404    
7405     + memset(&s64, 0, sizeof(s64));
7406     +
7407     switch (second & (~IPC_64)) {
7408     case IPC_RMID:
7409     case SHM_LOCK:
7410     diff --git a/ipc/compat_mq.c b/ipc/compat_mq.c
7411     index d8d1e9f..380ea4f 100644
7412     --- a/ipc/compat_mq.c
7413     +++ b/ipc/compat_mq.c
7414     @@ -53,6 +53,9 @@ asmlinkage long compat_sys_mq_open(const char __user *u_name,
7415     void __user *p = NULL;
7416     if (u_attr && oflag & O_CREAT) {
7417     struct mq_attr attr;
7418     +
7419     + memset(&attr, 0, sizeof(attr));
7420     +
7421     p = compat_alloc_user_space(sizeof(attr));
7422     if (get_compat_mq_attr(&attr, u_attr) ||
7423     copy_to_user(p, &attr, sizeof(attr)))
7424     @@ -127,6 +130,8 @@ asmlinkage long compat_sys_mq_getsetattr(mqd_t mqdes,
7425     struct mq_attr __user *p = compat_alloc_user_space(2 * sizeof(*p));
7426     long ret;
7427    
7428     + memset(&mqstat, 0, sizeof(mqstat));
7429     +
7430     if (u_mqstat) {
7431     if (get_compat_mq_attr(&mqstat, u_mqstat) ||
7432     copy_to_user(p, &mqstat, sizeof(mqstat)))
7433     diff --git a/ipc/shm.c b/ipc/shm.c
7434     index 52ed77e..b427380 100644
7435     --- a/ipc/shm.c
7436     +++ b/ipc/shm.c
7437     @@ -473,6 +473,7 @@ static inline unsigned long copy_shmid_to_user(void __user *buf, struct shmid64_
7438     {
7439     struct shmid_ds out;
7440    
7441     + memset(&out, 0, sizeof(out));
7442     ipc64_perm_to_ipc_perm(&in->shm_perm, &out.shm_perm);
7443     out.shm_segsz = in->shm_segsz;
7444     out.shm_atime = in->shm_atime;
7445     diff --git a/kernel/exit.c b/kernel/exit.c
7446     index 0312022..d72167d 100644
7447     --- a/kernel/exit.c
7448     +++ b/kernel/exit.c
7449     @@ -903,6 +903,15 @@ NORET_TYPE void do_exit(long code)
7450     if (unlikely(!tsk->pid))
7451     panic("Attempted to kill the idle task!");
7452    
7453     + /*
7454     + * If do_exit is called because this processes oopsed, it's possible
7455     + * that get_fs() was left as KERNEL_DS, so reset it to USER_DS before
7456     + * continuing. Amongst other possible reasons, this is to prevent
7457     + * mm_release()->clear_child_tid() from writing to a user-controlled
7458     + * kernel address.
7459     + */
7460     + set_fs(USER_DS);
7461     +
7462     tracehook_report_exit(&code);
7463    
7464     validate_creds_for_do_exit(tsk);
7465     diff --git a/kernel/irq/proc.c b/kernel/irq/proc.c
7466     index 09a2ee5..345e0b7 100644
7467     --- a/kernel/irq/proc.c
7468     +++ b/kernel/irq/proc.c
7469     @@ -214,7 +214,7 @@ static int irq_spurious_proc_show(struct seq_file *m, void *v)
7470    
7471     static int irq_spurious_proc_open(struct inode *inode, struct file *file)
7472     {
7473     - return single_open(file, irq_spurious_proc_show, NULL);
7474     + return single_open(file, irq_spurious_proc_show, PDE(inode)->data);
7475     }
7476    
7477     static const struct file_operations irq_spurious_proc_fops = {
7478     diff --git a/kernel/latencytop.c b/kernel/latencytop.c
7479     index 877fb30..17110a4 100644
7480     --- a/kernel/latencytop.c
7481     +++ b/kernel/latencytop.c
7482     @@ -194,14 +194,7 @@ __account_scheduler_latency(struct task_struct *tsk, int usecs, int inter)
7483    
7484     account_global_scheduler_latency(tsk, &lat);
7485    
7486     - /*
7487     - * short term hack; if we're > 32 we stop; future we recycle:
7488     - */
7489     - tsk->latency_record_count++;
7490     - if (tsk->latency_record_count >= LT_SAVECOUNT)
7491     - goto out_unlock;
7492     -
7493     - for (i = 0; i < LT_SAVECOUNT; i++) {
7494     + for (i = 0; i < tsk->latency_record_count; i++) {
7495     struct latency_record *mylat;
7496     int same = 1;
7497    
7498     @@ -227,8 +220,14 @@ __account_scheduler_latency(struct task_struct *tsk, int usecs, int inter)
7499     }
7500     }
7501    
7502     + /*
7503     + * short term hack; if we're > 32 we stop; future we recycle:
7504     + */
7505     + if (tsk->latency_record_count >= LT_SAVECOUNT)
7506     + goto out_unlock;
7507     +
7508     /* Allocated a new one: */
7509     - i = tsk->latency_record_count;
7510     + i = tsk->latency_record_count++;
7511     memcpy(&tsk->latency_record[i], &lat, sizeof(struct latency_record));
7512    
7513     out_unlock:
7514     diff --git a/kernel/perf_event.c b/kernel/perf_event.c
7515     index 03bb897..65b09a8 100644
7516     --- a/kernel/perf_event.c
7517     +++ b/kernel/perf_event.c
7518     @@ -1620,8 +1620,12 @@ static void rotate_ctx(struct perf_event_context *ctx)
7519     {
7520     raw_spin_lock(&ctx->lock);
7521    
7522     - /* Rotate the first entry last of non-pinned groups */
7523     - list_rotate_left(&ctx->flexible_groups);
7524     + /*
7525     + * Rotate the first entry last of non-pinned groups. Rotation might be
7526     + * disabled by the inheritance code.
7527     + */
7528     + if (!ctx->rotate_disable)
7529     + list_rotate_left(&ctx->flexible_groups);
7530    
7531     raw_spin_unlock(&ctx->lock);
7532     }
7533     @@ -5622,6 +5626,7 @@ int perf_event_init_task(struct task_struct *child)
7534     struct perf_event *event;
7535     struct task_struct *parent = current;
7536     int inherited_all = 1;
7537     + unsigned long flags;
7538     int ret = 0;
7539    
7540     child->perf_event_ctxp = NULL;
7541     @@ -5662,6 +5667,15 @@ int perf_event_init_task(struct task_struct *child)
7542     break;
7543     }
7544    
7545     + /*
7546     + * We can't hold ctx->lock when iterating the ->flexible_group list due
7547     + * to allocations, but we need to prevent rotation because
7548     + * rotate_ctx() will change the list from interrupt context.
7549     + */
7550     + raw_spin_lock_irqsave(&parent_ctx->lock, flags);
7551     + parent_ctx->rotate_disable = 1;
7552     + raw_spin_unlock_irqrestore(&parent_ctx->lock, flags);
7553     +
7554     list_for_each_entry(event, &parent_ctx->flexible_groups, group_entry) {
7555     ret = inherit_task_group(event, parent, parent_ctx, child,
7556     &inherited_all);
7557     @@ -5669,6 +5683,10 @@ int perf_event_init_task(struct task_struct *child)
7558     break;
7559     }
7560    
7561     + raw_spin_lock_irqsave(&parent_ctx->lock, flags);
7562     + parent_ctx->rotate_disable = 0;
7563     + raw_spin_unlock_irqrestore(&parent_ctx->lock, flags);
7564     +
7565     child_ctx = child->perf_event_ctxp;
7566    
7567     if (child_ctx && inherited_all) {
7568     diff --git a/kernel/pm_qos_params.c b/kernel/pm_qos_params.c
7569     index 645e541..0da2837 100644
7570     --- a/kernel/pm_qos_params.c
7571     +++ b/kernel/pm_qos_params.c
7572     @@ -120,10 +120,10 @@ static inline int pm_qos_get_value(struct pm_qos_object *o)
7573    
7574     switch (o->type) {
7575     case PM_QOS_MIN:
7576     - return plist_last(&o->requests)->prio;
7577     + return plist_first(&o->requests)->prio;
7578    
7579     case PM_QOS_MAX:
7580     - return plist_first(&o->requests)->prio;
7581     + return plist_last(&o->requests)->prio;
7582    
7583     default:
7584     /* runtime check for not using enum */
7585     diff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c
7586     index 8dc31e0..7a931a9 100644
7587     --- a/kernel/power/hibernate.c
7588     +++ b/kernel/power/hibernate.c
7589     @@ -326,7 +326,6 @@ static int create_image(int platform_mode)
7590     int hibernation_snapshot(int platform_mode)
7591     {
7592     int error;
7593     - gfp_t saved_mask;
7594    
7595     error = platform_begin(platform_mode);
7596     if (error)
7597     @@ -338,7 +337,7 @@ int hibernation_snapshot(int platform_mode)
7598     goto Close;
7599    
7600     suspend_console();
7601     - saved_mask = clear_gfp_allowed_mask(GFP_IOFS);
7602     + pm_restrict_gfp_mask();
7603     error = dpm_suspend_start(PMSG_FREEZE);
7604     if (error)
7605     goto Recover_platform;
7606     @@ -347,7 +346,10 @@ int hibernation_snapshot(int platform_mode)
7607     goto Recover_platform;
7608    
7609     error = create_image(platform_mode);
7610     - /* Control returns here after successful restore */
7611     + /*
7612     + * Control returns here (1) after the image has been created or the
7613     + * image creation has failed and (2) after a successful restore.
7614     + */
7615    
7616     Resume_devices:
7617     /* We may need to release the preallocated image pages here. */
7618     @@ -356,7 +358,10 @@ int hibernation_snapshot(int platform_mode)
7619    
7620     dpm_resume_end(in_suspend ?
7621     (error ? PMSG_RECOVER : PMSG_THAW) : PMSG_RESTORE);
7622     - set_gfp_allowed_mask(saved_mask);
7623     +
7624     + if (error || !in_suspend)
7625     + pm_restore_gfp_mask();
7626     +
7627     resume_console();
7628     Close:
7629     platform_end(platform_mode);
7630     @@ -451,17 +456,16 @@ static int resume_target_kernel(bool platform_mode)
7631     int hibernation_restore(int platform_mode)
7632     {
7633     int error;
7634     - gfp_t saved_mask;
7635    
7636     pm_prepare_console();
7637     suspend_console();
7638     - saved_mask = clear_gfp_allowed_mask(GFP_IOFS);
7639     + pm_restrict_gfp_mask();
7640     error = dpm_suspend_start(PMSG_QUIESCE);
7641     if (!error) {
7642     error = resume_target_kernel(platform_mode);
7643     dpm_resume_end(PMSG_RECOVER);
7644     }
7645     - set_gfp_allowed_mask(saved_mask);
7646     + pm_restore_gfp_mask();
7647     resume_console();
7648     pm_restore_console();
7649     return error;
7650     @@ -475,7 +479,6 @@ int hibernation_restore(int platform_mode)
7651     int hibernation_platform_enter(void)
7652     {
7653     int error;
7654     - gfp_t saved_mask;
7655    
7656     if (!hibernation_ops)
7657     return -ENOSYS;
7658     @@ -491,7 +494,6 @@ int hibernation_platform_enter(void)
7659    
7660     entering_platform_hibernation = true;
7661     suspend_console();
7662     - saved_mask = clear_gfp_allowed_mask(GFP_IOFS);
7663     error = dpm_suspend_start(PMSG_HIBERNATE);
7664     if (error) {
7665     if (hibernation_ops->recover)
7666     @@ -535,7 +537,6 @@ int hibernation_platform_enter(void)
7667     Resume_devices:
7668     entering_platform_hibernation = false;
7669     dpm_resume_end(PMSG_RESTORE);
7670     - set_gfp_allowed_mask(saved_mask);
7671     resume_console();
7672    
7673     Close:
7674     @@ -643,6 +644,7 @@ int hibernate(void)
7675     swsusp_free();
7676     if (!error)
7677     power_down();
7678     + pm_restore_gfp_mask();
7679     } else {
7680     pr_debug("PM: Image restored successfully.\n");
7681     }
7682     diff --git a/kernel/power/suspend.c b/kernel/power/suspend.c
7683     index 7335952..ecf7705 100644
7684     --- a/kernel/power/suspend.c
7685     +++ b/kernel/power/suspend.c
7686     @@ -197,7 +197,6 @@ static int suspend_enter(suspend_state_t state)
7687     int suspend_devices_and_enter(suspend_state_t state)
7688     {
7689     int error;
7690     - gfp_t saved_mask;
7691    
7692     if (!suspend_ops)
7693     return -ENOSYS;
7694     @@ -208,7 +207,7 @@ int suspend_devices_and_enter(suspend_state_t state)
7695     goto Close;
7696     }
7697     suspend_console();
7698     - saved_mask = clear_gfp_allowed_mask(GFP_IOFS);
7699     + pm_restrict_gfp_mask();
7700     suspend_test_start();
7701     error = dpm_suspend_start(PMSG_SUSPEND);
7702     if (error) {
7703     @@ -225,7 +224,7 @@ int suspend_devices_and_enter(suspend_state_t state)
7704     suspend_test_start();
7705     dpm_resume_end(PMSG_RESUME);
7706     suspend_test_finish("resume devices");
7707     - set_gfp_allowed_mask(saved_mask);
7708     + pm_restore_gfp_mask();
7709     resume_console();
7710     Close:
7711     if (suspend_ops->end)
7712     diff --git a/kernel/power/user.c b/kernel/power/user.c
7713     index e819e17..1b2ea31 100644
7714     --- a/kernel/power/user.c
7715     +++ b/kernel/power/user.c
7716     @@ -263,6 +263,7 @@ static long snapshot_ioctl(struct file *filp, unsigned int cmd,
7717     case SNAPSHOT_UNFREEZE:
7718     if (!data->frozen || data->ready)
7719     break;
7720     + pm_restore_gfp_mask();
7721     thaw_processes();
7722     usermodehelper_enable();
7723     data->frozen = 0;
7724     @@ -275,6 +276,7 @@ static long snapshot_ioctl(struct file *filp, unsigned int cmd,
7725     error = -EPERM;
7726     break;
7727     }
7728     + pm_restore_gfp_mask();
7729     error = hibernation_snapshot(data->platform_support);
7730     if (!error)
7731     error = put_user(in_suspend, (int __user *)arg);
7732     diff --git a/kernel/sched.c b/kernel/sched.c
7733     index 3fd774c..285f587 100644
7734     --- a/kernel/sched.c
7735     +++ b/kernel/sched.c
7736     @@ -5330,7 +5330,19 @@ void __cpuinit init_idle(struct task_struct *idle, int cpu)
7737     idle->se.exec_start = sched_clock();
7738    
7739     cpumask_copy(&idle->cpus_allowed, cpumask_of(cpu));
7740     + /*
7741     + * We're having a chicken and egg problem, even though we are
7742     + * holding rq->lock, the cpu isn't yet set to this cpu so the
7743     + * lockdep check in task_group() will fail.
7744     + *
7745     + * Similar case to sched_fork(). / Alternatively we could
7746     + * use task_rq_lock() here and obtain the other rq->lock.
7747     + *
7748     + * Silence PROVE_RCU
7749     + */
7750     + rcu_read_lock();
7751     __set_task_cpu(idle, cpu);
7752     + rcu_read_unlock();
7753    
7754     rq->curr = rq->idle = idle;
7755     #if defined(CONFIG_SMP) && defined(__ARCH_WANT_UNLOCKED_CTXSW)
7756     diff --git a/lib/percpu_counter.c b/lib/percpu_counter.c
7757     index ec9048e..209448e 100644
7758     --- a/lib/percpu_counter.c
7759     +++ b/lib/percpu_counter.c
7760     @@ -76,6 +76,7 @@ int __percpu_counter_init(struct percpu_counter *fbc, s64 amount,
7761     if (!fbc->counters)
7762     return -ENOMEM;
7763     #ifdef CONFIG_HOTPLUG_CPU
7764     + INIT_LIST_HEAD(&fbc->list);
7765     mutex_lock(&percpu_counters_lock);
7766     list_add(&fbc->list, &percpu_counters);
7767     mutex_unlock(&percpu_counters_lock);
7768     diff --git a/lib/radix-tree.c b/lib/radix-tree.c
7769     index efd16fa..296eb81 100644
7770     --- a/lib/radix-tree.c
7771     +++ b/lib/radix-tree.c
7772     @@ -82,6 +82,16 @@ struct radix_tree_preload {
7773     };
7774     static DEFINE_PER_CPU(struct radix_tree_preload, radix_tree_preloads) = { 0, };
7775    
7776     +static inline void *ptr_to_indirect(void *ptr)
7777     +{
7778     + return (void *)((unsigned long)ptr | RADIX_TREE_INDIRECT_PTR);
7779     +}
7780     +
7781     +static inline void *indirect_to_ptr(void *ptr)
7782     +{
7783     + return (void *)((unsigned long)ptr & ~RADIX_TREE_INDIRECT_PTR);
7784     +}
7785     +
7786     static inline gfp_t root_gfp_mask(struct radix_tree_root *root)
7787     {
7788     return root->gfp_mask & __GFP_BITS_MASK;
7789     @@ -265,7 +275,7 @@ static int radix_tree_extend(struct radix_tree_root *root, unsigned long index)
7790     return -ENOMEM;
7791    
7792     /* Increase the height. */
7793     - node->slots[0] = radix_tree_indirect_to_ptr(root->rnode);
7794     + node->slots[0] = indirect_to_ptr(root->rnode);
7795    
7796     /* Propagate the aggregated tag info into the new root */
7797     for (tag = 0; tag < RADIX_TREE_MAX_TAGS; tag++) {
7798     @@ -276,7 +286,7 @@ static int radix_tree_extend(struct radix_tree_root *root, unsigned long index)
7799     newheight = root->height+1;
7800     node->height = newheight;
7801     node->count = 1;
7802     - node = radix_tree_ptr_to_indirect(node);
7803     + node = ptr_to_indirect(node);
7804     rcu_assign_pointer(root->rnode, node);
7805     root->height = newheight;
7806     } while (height > root->height);
7807     @@ -309,7 +319,7 @@ int radix_tree_insert(struct radix_tree_root *root,
7808     return error;
7809     }
7810    
7811     - slot = radix_tree_indirect_to_ptr(root->rnode);
7812     + slot = indirect_to_ptr(root->rnode);
7813    
7814     height = root->height;
7815     shift = (height-1) * RADIX_TREE_MAP_SHIFT;
7816     @@ -325,8 +335,7 @@ int radix_tree_insert(struct radix_tree_root *root,
7817     rcu_assign_pointer(node->slots[offset], slot);
7818     node->count++;
7819     } else
7820     - rcu_assign_pointer(root->rnode,
7821     - radix_tree_ptr_to_indirect(slot));
7822     + rcu_assign_pointer(root->rnode, ptr_to_indirect(slot));
7823     }
7824    
7825     /* Go a level down */
7826     @@ -374,7 +383,7 @@ static void *radix_tree_lookup_element(struct radix_tree_root *root,
7827     return NULL;
7828     return is_slot ? (void *)&root->rnode : node;
7829     }
7830     - node = radix_tree_indirect_to_ptr(node);
7831     + node = indirect_to_ptr(node);
7832    
7833     height = node->height;
7834     if (index > radix_tree_maxindex(height))
7835     @@ -393,7 +402,7 @@ static void *radix_tree_lookup_element(struct radix_tree_root *root,
7836     height--;
7837     } while (height > 0);
7838    
7839     - return is_slot ? (void *)slot:node;
7840     + return is_slot ? (void *)slot : indirect_to_ptr(node);
7841     }
7842    
7843     /**
7844     @@ -455,7 +464,7 @@ void *radix_tree_tag_set(struct radix_tree_root *root,
7845     height = root->height;
7846     BUG_ON(index > radix_tree_maxindex(height));
7847    
7848     - slot = radix_tree_indirect_to_ptr(root->rnode);
7849     + slot = indirect_to_ptr(root->rnode);
7850     shift = (height - 1) * RADIX_TREE_MAP_SHIFT;
7851    
7852     while (height > 0) {
7853     @@ -509,7 +518,7 @@ void *radix_tree_tag_clear(struct radix_tree_root *root,
7854    
7855     shift = (height - 1) * RADIX_TREE_MAP_SHIFT;
7856     pathp->node = NULL;
7857     - slot = radix_tree_indirect_to_ptr(root->rnode);
7858     + slot = indirect_to_ptr(root->rnode);
7859    
7860     while (height > 0) {
7861     int offset;
7862     @@ -579,7 +588,7 @@ int radix_tree_tag_get(struct radix_tree_root *root,
7863    
7864     if (!radix_tree_is_indirect_ptr(node))
7865     return (index == 0);
7866     - node = radix_tree_indirect_to_ptr(node);
7867     + node = indirect_to_ptr(node);
7868    
7869     height = node->height;
7870     if (index > radix_tree_maxindex(height))
7871     @@ -666,7 +675,7 @@ unsigned long radix_tree_range_tag_if_tagged(struct radix_tree_root *root,
7872     }
7873    
7874     shift = (height - 1) * RADIX_TREE_MAP_SHIFT;
7875     - slot = radix_tree_indirect_to_ptr(root->rnode);
7876     + slot = indirect_to_ptr(root->rnode);
7877    
7878     /*
7879     * we fill the path from (root->height - 2) to 0, leaving the index at
7880     @@ -897,7 +906,7 @@ radix_tree_gang_lookup(struct radix_tree_root *root, void **results,
7881     results[0] = node;
7882     return 1;
7883     }
7884     - node = radix_tree_indirect_to_ptr(node);
7885     + node = indirect_to_ptr(node);
7886    
7887     max_index = radix_tree_maxindex(node->height);
7888    
7889     @@ -916,7 +925,8 @@ radix_tree_gang_lookup(struct radix_tree_root *root, void **results,
7890     slot = *(((void ***)results)[ret + i]);
7891     if (!slot)
7892     continue;
7893     - results[ret + nr_found] = rcu_dereference_raw(slot);
7894     + results[ret + nr_found] =
7895     + indirect_to_ptr(rcu_dereference_raw(slot));
7896     nr_found++;
7897     }
7898     ret += nr_found;
7899     @@ -965,7 +975,7 @@ radix_tree_gang_lookup_slot(struct radix_tree_root *root, void ***results,
7900     results[0] = (void **)&root->rnode;
7901     return 1;
7902     }
7903     - node = radix_tree_indirect_to_ptr(node);
7904     + node = indirect_to_ptr(node);
7905    
7906     max_index = radix_tree_maxindex(node->height);
7907    
7908     @@ -1090,7 +1100,7 @@ radix_tree_gang_lookup_tag(struct radix_tree_root *root, void **results,
7909     results[0] = node;
7910     return 1;
7911     }
7912     - node = radix_tree_indirect_to_ptr(node);
7913     + node = indirect_to_ptr(node);
7914    
7915     max_index = radix_tree_maxindex(node->height);
7916    
7917     @@ -1109,7 +1119,8 @@ radix_tree_gang_lookup_tag(struct radix_tree_root *root, void **results,
7918     slot = *(((void ***)results)[ret + i]);
7919     if (!slot)
7920     continue;
7921     - results[ret + nr_found] = rcu_dereference_raw(slot);
7922     + results[ret + nr_found] =
7923     + indirect_to_ptr(rcu_dereference_raw(slot));
7924     nr_found++;
7925     }
7926     ret += nr_found;
7927     @@ -1159,7 +1170,7 @@ radix_tree_gang_lookup_tag_slot(struct radix_tree_root *root, void ***results,
7928     results[0] = (void **)&root->rnode;
7929     return 1;
7930     }
7931     - node = radix_tree_indirect_to_ptr(node);
7932     + node = indirect_to_ptr(node);
7933    
7934     max_index = radix_tree_maxindex(node->height);
7935    
7936     @@ -1195,7 +1206,7 @@ static inline void radix_tree_shrink(struct radix_tree_root *root)
7937     void *newptr;
7938    
7939     BUG_ON(!radix_tree_is_indirect_ptr(to_free));
7940     - to_free = radix_tree_indirect_to_ptr(to_free);
7941     + to_free = indirect_to_ptr(to_free);
7942    
7943     /*
7944     * The candidate node has more than one child, or its child
7945     @@ -1208,16 +1219,39 @@ static inline void radix_tree_shrink(struct radix_tree_root *root)
7946    
7947     /*
7948     * We don't need rcu_assign_pointer(), since we are simply
7949     - * moving the node from one part of the tree to another. If
7950     - * it was safe to dereference the old pointer to it
7951     + * moving the node from one part of the tree to another: if it
7952     + * was safe to dereference the old pointer to it
7953     * (to_free->slots[0]), it will be safe to dereference the new
7954     - * one (root->rnode).
7955     + * one (root->rnode) as far as dependent read barriers go.
7956     */
7957     newptr = to_free->slots[0];
7958     if (root->height > 1)
7959     - newptr = radix_tree_ptr_to_indirect(newptr);
7960     + newptr = ptr_to_indirect(newptr);
7961     root->rnode = newptr;
7962     root->height--;
7963     +
7964     + /*
7965     + * We have a dilemma here. The node's slot[0] must not be
7966     + * NULLed in case there are concurrent lookups expecting to
7967     + * find the item. However if this was a bottom-level node,
7968     + * then it may be subject to the slot pointer being visible
7969     + * to callers dereferencing it. If item corresponding to
7970     + * slot[0] is subsequently deleted, these callers would expect
7971     + * their slot to become empty sooner or later.
7972     + *
7973     + * For example, lockless pagecache will look up a slot, deref
7974     + * the page pointer, and if the page is 0 refcount it means it
7975     + * was concurrently deleted from pagecache so try the deref
7976     + * again. Fortunately there is already a requirement for logic
7977     + * to retry the entire slot lookup -- the indirect pointer
7978     + * problem (replacing direct root node with an indirect pointer
7979     + * also results in a stale slot). So tag the slot as indirect
7980     + * to force callers to retry.
7981     + */
7982     + if (root->height == 0)
7983     + *((unsigned long *)&to_free->slots[0]) |=
7984     + RADIX_TREE_INDIRECT_PTR;
7985     +
7986     radix_tree_node_free(to_free);
7987     }
7988     }
7989     @@ -1254,7 +1288,7 @@ void *radix_tree_delete(struct radix_tree_root *root, unsigned long index)
7990     root->rnode = NULL;
7991     goto out;
7992     }
7993     - slot = radix_tree_indirect_to_ptr(slot);
7994     + slot = indirect_to_ptr(slot);
7995    
7996     shift = (height - 1) * RADIX_TREE_MAP_SHIFT;
7997     pathp->node = NULL;
7998     @@ -1296,8 +1330,7 @@ void *radix_tree_delete(struct radix_tree_root *root, unsigned long index)
7999     radix_tree_node_free(to_free);
8000    
8001     if (pathp->node->count) {
8002     - if (pathp->node ==
8003     - radix_tree_indirect_to_ptr(root->rnode))
8004     + if (pathp->node == indirect_to_ptr(root->rnode))
8005     radix_tree_shrink(root);
8006     goto out;
8007     }
8008     diff --git a/mm/filemap.c b/mm/filemap.c
8009     index 3d4df44..9701a50 100644
8010     --- a/mm/filemap.c
8011     +++ b/mm/filemap.c
8012     @@ -631,7 +631,9 @@ repeat:
8013     pagep = radix_tree_lookup_slot(&mapping->page_tree, offset);
8014     if (pagep) {
8015     page = radix_tree_deref_slot(pagep);
8016     - if (unlikely(!page || page == RADIX_TREE_RETRY))
8017     + if (unlikely(!page))
8018     + goto out;
8019     + if (radix_tree_deref_retry(page))
8020     goto repeat;
8021    
8022     if (!page_cache_get_speculative(page))
8023     @@ -647,6 +649,7 @@ repeat:
8024     goto repeat;
8025     }
8026     }
8027     +out:
8028     rcu_read_unlock();
8029    
8030     return page;
8031     @@ -764,12 +767,11 @@ repeat:
8032     page = radix_tree_deref_slot((void **)pages[i]);
8033     if (unlikely(!page))
8034     continue;
8035     - /*
8036     - * this can only trigger if nr_found == 1, making livelock
8037     - * a non issue.
8038     - */
8039     - if (unlikely(page == RADIX_TREE_RETRY))
8040     + if (radix_tree_deref_retry(page)) {
8041     + if (ret)
8042     + start = pages[ret-1]->index;
8043     goto restart;
8044     + }
8045    
8046     if (!page_cache_get_speculative(page))
8047     goto repeat;
8048     @@ -817,11 +819,7 @@ repeat:
8049     page = radix_tree_deref_slot((void **)pages[i]);
8050     if (unlikely(!page))
8051     continue;
8052     - /*
8053     - * this can only trigger if nr_found == 1, making livelock
8054     - * a non issue.
8055     - */
8056     - if (unlikely(page == RADIX_TREE_RETRY))
8057     + if (radix_tree_deref_retry(page))
8058     goto restart;
8059    
8060     if (page->mapping == NULL || page->index != index)
8061     @@ -874,11 +872,7 @@ repeat:
8062     page = radix_tree_deref_slot((void **)pages[i]);
8063     if (unlikely(!page))
8064     continue;
8065     - /*
8066     - * this can only trigger if nr_found == 1, making livelock
8067     - * a non issue.
8068     - */
8069     - if (unlikely(page == RADIX_TREE_RETRY))
8070     + if (radix_tree_deref_retry(page))
8071     goto restart;
8072    
8073     if (!page_cache_get_speculative(page))
8074     @@ -1016,6 +1010,9 @@ find_page:
8075     goto page_not_up_to_date;
8076     if (!trylock_page(page))
8077     goto page_not_up_to_date;
8078     + /* Did it get truncated before we got the lock? */
8079     + if (!page->mapping)
8080     + goto page_not_up_to_date_locked;
8081     if (!mapping->a_ops->is_partially_uptodate(page,
8082     desc, offset))
8083     goto page_not_up_to_date_locked;
8084     diff --git a/mm/hugetlb.c b/mm/hugetlb.c
8085     index c032738..2697806 100644
8086     --- a/mm/hugetlb.c
8087     +++ b/mm/hugetlb.c
8088     @@ -2380,8 +2380,11 @@ retry_avoidcopy:
8089     * When the original hugepage is shared one, it does not have
8090     * anon_vma prepared.
8091     */
8092     - if (unlikely(anon_vma_prepare(vma)))
8093     + if (unlikely(anon_vma_prepare(vma))) {
8094     + /* Caller expects lock to be held */
8095     + spin_lock(&mm->page_table_lock);
8096     return VM_FAULT_OOM;
8097     + }
8098    
8099     copy_huge_page(new_page, old_page, address, vma);
8100     __SetPageUptodate(new_page);
8101     @@ -2665,7 +2668,8 @@ out_page_table_lock:
8102     unlock_page(pagecache_page);
8103     put_page(pagecache_page);
8104     }
8105     - unlock_page(page);
8106     + if (page != pagecache_page)
8107     + unlock_page(page);
8108    
8109     out_mutex:
8110     mutex_unlock(&hugetlb_instantiation_mutex);
8111     diff --git a/mm/internal.h b/mm/internal.h
8112     index 6a697bb..dedb0af 100644
8113     --- a/mm/internal.h
8114     +++ b/mm/internal.h
8115     @@ -62,7 +62,7 @@ extern bool is_free_buddy_page(struct page *page);
8116     */
8117     static inline unsigned long page_order(struct page *page)
8118     {
8119     - VM_BUG_ON(!PageBuddy(page));
8120     + /* PageBuddy() must be checked by the caller */
8121     return page_private(page);
8122     }
8123    
8124     diff --git a/mm/memcontrol.c b/mm/memcontrol.c
8125     index 9be3cf8..e6aadd6 100644
8126     --- a/mm/memcontrol.c
8127     +++ b/mm/memcontrol.c
8128     @@ -269,13 +269,14 @@ enum move_type {
8129    
8130     /* "mc" and its members are protected by cgroup_mutex */
8131     static struct move_charge_struct {
8132     - spinlock_t lock; /* for from, to, moving_task */
8133     + spinlock_t lock; /* for from, to */
8134     struct mem_cgroup *from;
8135     struct mem_cgroup *to;
8136     unsigned long precharge;
8137     unsigned long moved_charge;
8138     unsigned long moved_swap;
8139     struct task_struct *moving_task; /* a task moving charges */
8140     + struct mm_struct *mm;
8141     wait_queue_head_t waitq; /* a waitq for other context */
8142     } mc = {
8143     .lock = __SPIN_LOCK_UNLOCKED(mc.lock),
8144     @@ -4445,7 +4446,7 @@ static unsigned long mem_cgroup_count_precharge(struct mm_struct *mm)
8145     unsigned long precharge;
8146     struct vm_area_struct *vma;
8147    
8148     - down_read(&mm->mmap_sem);
8149     + /* We've already held the mmap_sem */
8150     for (vma = mm->mmap; vma; vma = vma->vm_next) {
8151     struct mm_walk mem_cgroup_count_precharge_walk = {
8152     .pmd_entry = mem_cgroup_count_precharge_pte_range,
8153     @@ -4457,7 +4458,6 @@ static unsigned long mem_cgroup_count_precharge(struct mm_struct *mm)
8154     walk_page_range(vma->vm_start, vma->vm_end,
8155     &mem_cgroup_count_precharge_walk);
8156     }
8157     - up_read(&mm->mmap_sem);
8158    
8159     precharge = mc.precharge;
8160     mc.precharge = 0;
8161     @@ -4508,11 +4508,16 @@ static void mem_cgroup_clear_mc(void)
8162    
8163     mc.moved_swap = 0;
8164     }
8165     + if (mc.mm) {
8166     + up_read(&mc.mm->mmap_sem);
8167     + mmput(mc.mm);
8168     + }
8169     spin_lock(&mc.lock);
8170     mc.from = NULL;
8171     mc.to = NULL;
8172     - mc.moving_task = NULL;
8173     spin_unlock(&mc.lock);
8174     + mc.moving_task = NULL;
8175     + mc.mm = NULL;
8176     memcg_oom_recover(from);
8177     memcg_oom_recover(to);
8178     wake_up_all(&mc.waitq);
8179     @@ -4537,26 +4542,37 @@ static int mem_cgroup_can_attach(struct cgroup_subsys *ss,
8180     return 0;
8181     /* We move charges only when we move a owner of the mm */
8182     if (mm->owner == p) {
8183     + /*
8184     + * We do all the move charge works under one mmap_sem to
8185     + * avoid deadlock with down_write(&mmap_sem)
8186     + * -> try_charge() -> if (mc.moving_task) -> sleep.
8187     + */
8188     + down_read(&mm->mmap_sem);
8189     +
8190     VM_BUG_ON(mc.from);
8191     VM_BUG_ON(mc.to);
8192     VM_BUG_ON(mc.precharge);
8193     VM_BUG_ON(mc.moved_charge);
8194     VM_BUG_ON(mc.moved_swap);
8195     VM_BUG_ON(mc.moving_task);
8196     + VM_BUG_ON(mc.mm);
8197     +
8198     spin_lock(&mc.lock);
8199     mc.from = from;
8200     mc.to = mem;
8201     mc.precharge = 0;
8202     mc.moved_charge = 0;
8203     mc.moved_swap = 0;
8204     - mc.moving_task = current;
8205     spin_unlock(&mc.lock);
8206     + mc.moving_task = current;
8207     + mc.mm = mm;
8208    
8209     ret = mem_cgroup_precharge_mc(mm);
8210     if (ret)
8211     mem_cgroup_clear_mc();
8212     - }
8213     - mmput(mm);
8214     + /* We call up_read() and mmput() in clear_mc(). */
8215     + } else
8216     + mmput(mm);
8217     }
8218     return ret;
8219     }
8220     @@ -4644,7 +4660,7 @@ static void mem_cgroup_move_charge(struct mm_struct *mm)
8221     struct vm_area_struct *vma;
8222    
8223     lru_add_drain_all();
8224     - down_read(&mm->mmap_sem);
8225     + /* We've already held the mmap_sem */
8226     for (vma = mm->mmap; vma; vma = vma->vm_next) {
8227     int ret;
8228     struct mm_walk mem_cgroup_move_charge_walk = {
8229     @@ -4663,7 +4679,6 @@ static void mem_cgroup_move_charge(struct mm_struct *mm)
8230     */
8231     break;
8232     }
8233     - up_read(&mm->mmap_sem);
8234     }
8235    
8236     static void mem_cgroup_move_task(struct cgroup_subsys *ss,
8237     @@ -4672,17 +4687,11 @@ static void mem_cgroup_move_task(struct cgroup_subsys *ss,
8238     struct task_struct *p,
8239     bool threadgroup)
8240     {
8241     - struct mm_struct *mm;
8242     -
8243     - if (!mc.to)
8244     + if (!mc.mm)
8245     /* no need to move charge */
8246     return;
8247    
8248     - mm = get_task_mm(p);
8249     - if (mm) {
8250     - mem_cgroup_move_charge(mm);
8251     - mmput(mm);
8252     - }
8253     + mem_cgroup_move_charge(mc.mm);
8254     mem_cgroup_clear_mc();
8255     }
8256     #else /* !CONFIG_MMU */
8257     diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
8258     index dd186c1..6345dfe 100644
8259     --- a/mm/memory_hotplug.c
8260     +++ b/mm/memory_hotplug.c
8261     @@ -659,7 +659,7 @@ static int test_pages_in_a_zone(unsigned long start_pfn, unsigned long end_pfn)
8262     * Scanning pfn is much easier than scanning lru list.
8263     * Scan pfn from start to end and Find LRU page.
8264     */
8265     -int scan_lru_pages(unsigned long start, unsigned long end)
8266     +unsigned long scan_lru_pages(unsigned long start, unsigned long end)
8267     {
8268     unsigned long pfn;
8269     struct page *page;
8270     diff --git a/mm/mempolicy.c b/mm/mempolicy.c
8271     index f969da5..c1002c6 100644
8272     --- a/mm/mempolicy.c
8273     +++ b/mm/mempolicy.c
8274     @@ -1588,7 +1588,7 @@ unsigned slab_node(struct mempolicy *policy)
8275     (void)first_zones_zonelist(zonelist, highest_zoneidx,
8276     &policy->v.nodes,
8277     &zone);
8278     - return zone->node;
8279     + return zone ? zone->node : numa_node_id();
8280     }
8281    
8282     default:
8283     diff --git a/mm/mprotect.c b/mm/mprotect.c
8284     index 2d1bf7c..4c51338 100644
8285     --- a/mm/mprotect.c
8286     +++ b/mm/mprotect.c
8287     @@ -211,6 +211,7 @@ success:
8288     mmu_notifier_invalidate_range_end(mm, start, end);
8289     vm_stat_account(mm, oldflags, vma->vm_file, -nrpages);
8290     vm_stat_account(mm, newflags, vma->vm_file, nrpages);
8291     + perf_event_mmap(vma);
8292     return 0;
8293    
8294     fail:
8295     @@ -299,7 +300,6 @@ SYSCALL_DEFINE3(mprotect, unsigned long, start, size_t, len,
8296     error = mprotect_fixup(vma, &prev, nstart, tmp, newflags);
8297     if (error)
8298     goto out;
8299     - perf_event_mmap(vma);
8300     nstart = tmp;
8301    
8302     if (nstart < prev->vm_end)
8303     diff --git a/mm/nommu.c b/mm/nommu.c
8304     index 88ff091..acb3bd3 100644
8305     --- a/mm/nommu.c
8306     +++ b/mm/nommu.c
8307     @@ -1668,6 +1668,7 @@ void exit_mmap(struct mm_struct *mm)
8308     mm->mmap = vma->vm_next;
8309     delete_vma_from_mm(vma);
8310     delete_vma(mm, vma);
8311     + cond_resched();
8312     }
8313    
8314     kleave("");
8315     diff --git a/mm/page_alloc.c b/mm/page_alloc.c
8316     index f12ad18..2bd6f6d 100644
8317     --- a/mm/page_alloc.c
8318     +++ b/mm/page_alloc.c
8319     @@ -103,19 +103,24 @@ gfp_t gfp_allowed_mask __read_mostly = GFP_BOOT_MASK;
8320     * only be modified with pm_mutex held, unless the suspend/hibernate code is
8321     * guaranteed not to run in parallel with that modification).
8322     */
8323     -void set_gfp_allowed_mask(gfp_t mask)
8324     +
8325     +static gfp_t saved_gfp_mask;
8326     +
8327     +void pm_restore_gfp_mask(void)
8328     {
8329     WARN_ON(!mutex_is_locked(&pm_mutex));
8330     - gfp_allowed_mask = mask;
8331     + if (saved_gfp_mask) {
8332     + gfp_allowed_mask = saved_gfp_mask;
8333     + saved_gfp_mask = 0;
8334     + }
8335     }
8336    
8337     -gfp_t clear_gfp_allowed_mask(gfp_t mask)
8338     +void pm_restrict_gfp_mask(void)
8339     {
8340     - gfp_t ret = gfp_allowed_mask;
8341     -
8342     WARN_ON(!mutex_is_locked(&pm_mutex));
8343     - gfp_allowed_mask &= ~mask;
8344     - return ret;
8345     + WARN_ON(saved_gfp_mask);
8346     + saved_gfp_mask = gfp_allowed_mask;
8347     + gfp_allowed_mask &= ~GFP_IOFS;
8348     }
8349     #endif /* CONFIG_PM_SLEEP */
8350    
8351     @@ -530,7 +535,7 @@ static inline void __free_one_page(struct page *page,
8352     * so it's less likely to be used soon and more likely to be merged
8353     * as a higher order page
8354     */
8355     - if ((order < MAX_ORDER-1) && pfn_valid_within(page_to_pfn(buddy))) {
8356     + if ((order < MAX_ORDER-2) && pfn_valid_within(page_to_pfn(buddy))) {
8357     struct page *higher_page, *higher_buddy;
8358     combined_idx = __find_combined_index(page_idx, order);
8359     higher_page = page + combined_idx - page_idx;
8360     diff --git a/net/8021q/vlan_core.c b/net/8021q/vlan_core.c
8361     index 0eb96f7..2dcff0b 100644
8362     --- a/net/8021q/vlan_core.c
8363     +++ b/net/8021q/vlan_core.c
8364     @@ -43,6 +43,9 @@ int vlan_hwaccel_do_receive(struct sk_buff *skb)
8365     struct net_device *dev = skb->dev;
8366     struct vlan_rx_stats *rx_stats;
8367    
8368     + if (unlikely(!is_vlan_dev(dev)))
8369     + return 0;
8370     +
8371     skb->dev = vlan_dev_info(dev)->real_dev;
8372     netif_nit_deliver(skb);
8373    
8374     diff --git a/net/can/bcm.c b/net/can/bcm.c
8375     index 08ffe9e..6faa825 100644
8376     --- a/net/can/bcm.c
8377     +++ b/net/can/bcm.c
8378     @@ -125,7 +125,7 @@ struct bcm_sock {
8379     struct list_head tx_ops;
8380     unsigned long dropped_usr_msgs;
8381     struct proc_dir_entry *bcm_proc_read;
8382     - char procname [9]; /* pointer printed in ASCII with \0 */
8383     + char procname [20]; /* pointer printed in ASCII with \0 */
8384     };
8385    
8386     static inline struct bcm_sock *bcm_sk(const struct sock *sk)
8387     diff --git a/net/compat.c b/net/compat.c
8388     index 63d260e..3649d58 100644
8389     --- a/net/compat.c
8390     +++ b/net/compat.c
8391     @@ -41,10 +41,12 @@ static inline int iov_from_user_compat_to_kern(struct iovec *kiov,
8392     compat_size_t len;
8393    
8394     if (get_user(len, &uiov32->iov_len) ||
8395     - get_user(buf, &uiov32->iov_base)) {
8396     - tot_len = -EFAULT;
8397     - break;
8398     - }
8399     + get_user(buf, &uiov32->iov_base))
8400     + return -EFAULT;
8401     +
8402     + if (len > INT_MAX - tot_len)
8403     + len = INT_MAX - tot_len;
8404     +
8405     tot_len += len;
8406     kiov->iov_base = compat_ptr(buf);
8407     kiov->iov_len = (__kernel_size_t) len;
8408     diff --git a/net/core/dev.c b/net/core/dev.c
8409     index 660dd41..1dad6c0 100644
8410     --- a/net/core/dev.c
8411     +++ b/net/core/dev.c
8412     @@ -1648,10 +1648,10 @@ EXPORT_SYMBOL(netif_device_attach);
8413    
8414     static bool can_checksum_protocol(unsigned long features, __be16 protocol)
8415     {
8416     - return ((features & NETIF_F_GEN_CSUM) ||
8417     - ((features & NETIF_F_IP_CSUM) &&
8418     + return ((features & NETIF_F_NO_CSUM) ||
8419     + ((features & NETIF_F_V4_CSUM) &&
8420     protocol == htons(ETH_P_IP)) ||
8421     - ((features & NETIF_F_IPV6_CSUM) &&
8422     + ((features & NETIF_F_V6_CSUM) &&
8423     protocol == htons(ETH_P_IPV6)) ||
8424     ((features & NETIF_F_FCOE_CRC) &&
8425     protocol == htons(ETH_P_FCOE)));
8426     @@ -2891,6 +2891,15 @@ static int __netif_receive_skb(struct sk_buff *skb)
8427     ncls:
8428     #endif
8429    
8430     + /* If we got this far with a hardware accelerated VLAN tag, it means
8431     + * that we were put in promiscuous mode but nobody is interested in
8432     + * this vid. Drop the packet now to prevent it from getting propagated
8433     + * to other parts of the stack that won't know how to deal with packets
8434     + * tagged in this manner.
8435     + */
8436     + if (unlikely(vlan_tx_tag_present(skb)))
8437     + goto bypass;
8438     +
8439     /* Handle special case of bridge or macvlan */
8440     rx_handler = rcu_dereference(skb->dev->rx_handler);
8441     if (rx_handler) {
8442     @@ -2927,6 +2936,7 @@ ncls:
8443     }
8444     }
8445    
8446     +bypass:
8447     if (pt_prev) {
8448     ret = pt_prev->func(skb, skb->dev, pt_prev, orig_dev);
8449     } else {
8450     diff --git a/net/core/filter.c b/net/core/filter.c
8451     index 52b051f..f68e497 100644
8452     --- a/net/core/filter.c
8453     +++ b/net/core/filter.c
8454     @@ -112,39 +112,41 @@ EXPORT_SYMBOL(sk_filter);
8455     */
8456     unsigned int sk_run_filter(struct sk_buff *skb, struct sock_filter *filter, int flen)
8457     {
8458     - struct sock_filter *fentry; /* We walk down these */
8459     void *ptr;
8460     u32 A = 0; /* Accumulator */
8461     u32 X = 0; /* Index Register */
8462     u32 mem[BPF_MEMWORDS]; /* Scratch Memory Store */
8463     + unsigned long memvalid = 0;
8464     u32 tmp;
8465     int k;
8466     int pc;
8467    
8468     + BUILD_BUG_ON(BPF_MEMWORDS > BITS_PER_LONG);
8469     /*
8470     * Process array of filter instructions.
8471     */
8472     for (pc = 0; pc < flen; pc++) {
8473     - fentry = &filter[pc];
8474     + const struct sock_filter *fentry = &filter[pc];
8475     + u32 f_k = fentry->k;
8476    
8477     switch (fentry->code) {
8478     case BPF_S_ALU_ADD_X:
8479     A += X;
8480     continue;
8481     case BPF_S_ALU_ADD_K:
8482     - A += fentry->k;
8483     + A += f_k;
8484     continue;
8485     case BPF_S_ALU_SUB_X:
8486     A -= X;
8487     continue;
8488     case BPF_S_ALU_SUB_K:
8489     - A -= fentry->k;
8490     + A -= f_k;
8491     continue;
8492     case BPF_S_ALU_MUL_X:
8493     A *= X;
8494     continue;
8495     case BPF_S_ALU_MUL_K:
8496     - A *= fentry->k;
8497     + A *= f_k;
8498     continue;
8499     case BPF_S_ALU_DIV_X:
8500     if (X == 0)
8501     @@ -152,49 +154,49 @@ unsigned int sk_run_filter(struct sk_buff *skb, struct sock_filter *filter, int
8502     A /= X;
8503     continue;
8504     case BPF_S_ALU_DIV_K:
8505     - A /= fentry->k;
8506     + A /= f_k;
8507     continue;
8508     case BPF_S_ALU_AND_X:
8509     A &= X;
8510     continue;
8511     case BPF_S_ALU_AND_K:
8512     - A &= fentry->k;
8513     + A &= f_k;
8514     continue;
8515     case BPF_S_ALU_OR_X:
8516     A |= X;
8517     continue;
8518     case BPF_S_ALU_OR_K:
8519     - A |= fentry->k;
8520     + A |= f_k;
8521     continue;
8522     case BPF_S_ALU_LSH_X:
8523     A <<= X;
8524     continue;
8525     case BPF_S_ALU_LSH_K:
8526     - A <<= fentry->k;
8527     + A <<= f_k;
8528     continue;
8529     case BPF_S_ALU_RSH_X:
8530     A >>= X;
8531     continue;
8532     case BPF_S_ALU_RSH_K:
8533     - A >>= fentry->k;
8534     + A >>= f_k;
8535     continue;
8536     case BPF_S_ALU_NEG:
8537     A = -A;
8538     continue;
8539     case BPF_S_JMP_JA:
8540     - pc += fentry->k;
8541     + pc += f_k;
8542     continue;
8543     case BPF_S_JMP_JGT_K:
8544     - pc += (A > fentry->k) ? fentry->jt : fentry->jf;
8545     + pc += (A > f_k) ? fentry->jt : fentry->jf;
8546     continue;
8547     case BPF_S_JMP_JGE_K:
8548     - pc += (A >= fentry->k) ? fentry->jt : fentry->jf;
8549     + pc += (A >= f_k) ? fentry->jt : fentry->jf;
8550     continue;
8551     case BPF_S_JMP_JEQ_K:
8552     - pc += (A == fentry->k) ? fentry->jt : fentry->jf;
8553     + pc += (A == f_k) ? fentry->jt : fentry->jf;
8554     continue;
8555     case BPF_S_JMP_JSET_K:
8556     - pc += (A & fentry->k) ? fentry->jt : fentry->jf;
8557     + pc += (A & f_k) ? fentry->jt : fentry->jf;
8558     continue;
8559     case BPF_S_JMP_JGT_X:
8560     pc += (A > X) ? fentry->jt : fentry->jf;
8561     @@ -209,7 +211,7 @@ unsigned int sk_run_filter(struct sk_buff *skb, struct sock_filter *filter, int
8562     pc += (A & X) ? fentry->jt : fentry->jf;
8563     continue;
8564     case BPF_S_LD_W_ABS:
8565     - k = fentry->k;
8566     + k = f_k;
8567     load_w:
8568     ptr = load_pointer(skb, k, 4, &tmp);
8569     if (ptr != NULL) {
8570     @@ -218,7 +220,7 @@ load_w:
8571     }
8572     break;
8573     case BPF_S_LD_H_ABS:
8574     - k = fentry->k;
8575     + k = f_k;
8576     load_h:
8577     ptr = load_pointer(skb, k, 2, &tmp);
8578     if (ptr != NULL) {
8579     @@ -227,7 +229,7 @@ load_h:
8580     }
8581     break;
8582     case BPF_S_LD_B_ABS:
8583     - k = fentry->k;
8584     + k = f_k;
8585     load_b:
8586     ptr = load_pointer(skb, k, 1, &tmp);
8587     if (ptr != NULL) {
8588     @@ -242,32 +244,34 @@ load_b:
8589     X = skb->len;
8590     continue;
8591     case BPF_S_LD_W_IND:
8592     - k = X + fentry->k;
8593     + k = X + f_k;
8594     goto load_w;
8595     case BPF_S_LD_H_IND:
8596     - k = X + fentry->k;
8597     + k = X + f_k;
8598     goto load_h;
8599     case BPF_S_LD_B_IND:
8600     - k = X + fentry->k;
8601     + k = X + f_k;
8602     goto load_b;
8603     case BPF_S_LDX_B_MSH:
8604     - ptr = load_pointer(skb, fentry->k, 1, &tmp);
8605     + ptr = load_pointer(skb, f_k, 1, &tmp);
8606     if (ptr != NULL) {
8607     X = (*(u8 *)ptr & 0xf) << 2;
8608     continue;
8609     }
8610     return 0;
8611     case BPF_S_LD_IMM:
8612     - A = fentry->k;
8613     + A = f_k;
8614     continue;
8615     case BPF_S_LDX_IMM:
8616     - X = fentry->k;
8617     + X = f_k;
8618     continue;
8619     case BPF_S_LD_MEM:
8620     - A = mem[fentry->k];
8621     + A = (memvalid & (1UL << f_k)) ?
8622     + mem[f_k] : 0;
8623     continue;
8624     case BPF_S_LDX_MEM:
8625     - X = mem[fentry->k];
8626     + X = (memvalid & (1UL << f_k)) ?
8627     + mem[f_k] : 0;
8628     continue;
8629     case BPF_S_MISC_TAX:
8630     X = A;
8631     @@ -276,14 +280,16 @@ load_b:
8632     A = X;
8633     continue;
8634     case BPF_S_RET_K:
8635     - return fentry->k;
8636     + return f_k;
8637     case BPF_S_RET_A:
8638     return A;
8639     case BPF_S_ST:
8640     - mem[fentry->k] = A;
8641     + memvalid |= 1UL << f_k;
8642     + mem[f_k] = A;
8643     continue;
8644     case BPF_S_STX:
8645     - mem[fentry->k] = X;
8646     + memvalid |= 1UL << f_k;
8647     + mem[f_k] = X;
8648     continue;
8649     default:
8650     WARN_ON(1);
8651     diff --git a/net/core/iovec.c b/net/core/iovec.c
8652     index e6b133b..58eb999 100644
8653     --- a/net/core/iovec.c
8654     +++ b/net/core/iovec.c
8655     @@ -35,10 +35,9 @@
8656     * in any case.
8657     */
8658    
8659     -long verify_iovec(struct msghdr *m, struct iovec *iov, struct sockaddr *address, int mode)
8660     +int verify_iovec(struct msghdr *m, struct iovec *iov, struct sockaddr *address, int mode)
8661     {
8662     - int size, ct;
8663     - long err;
8664     + int size, ct, err;
8665    
8666     if (m->msg_namelen) {
8667     if (mode == VERIFY_READ) {
8668     @@ -60,14 +59,13 @@ long verify_iovec(struct msghdr *m, struct iovec *iov, struct sockaddr *address,
8669     err = 0;
8670    
8671     for (ct = 0; ct < m->msg_iovlen; ct++) {
8672     - err += iov[ct].iov_len;
8673     - /*
8674     - * Goal is not to verify user data, but to prevent returning
8675     - * negative value, which is interpreted as errno.
8676     - * Overflow is still possible, but it is harmless.
8677     - */
8678     - if (err < 0)
8679     - return -EMSGSIZE;
8680     + size_t len = iov[ct].iov_len;
8681     +
8682     + if (len > INT_MAX - err) {
8683     + len = INT_MAX - err;
8684     + iov[ct].iov_len = len;
8685     + }
8686     + err += len;
8687     }
8688    
8689     return err;
8690     diff --git a/net/decnet/af_decnet.c b/net/decnet/af_decnet.c
8691     index d6b93d1..cf38f52 100644
8692     --- a/net/decnet/af_decnet.c
8693     +++ b/net/decnet/af_decnet.c
8694     @@ -1556,6 +1556,8 @@ static int __dn_getsockopt(struct socket *sock, int level,int optname, char __us
8695     if (r_len > sizeof(struct linkinfo_dn))
8696     r_len = sizeof(struct linkinfo_dn);
8697    
8698     + memset(&link, 0, sizeof(link));
8699     +
8700     switch(sock->state) {
8701     case SS_CONNECTING:
8702     link.idn_linkstate = LL_CONNECTING;
8703     diff --git a/net/econet/af_econet.c b/net/econet/af_econet.c
8704     index dc54bd0..d2fe17d 100644
8705     --- a/net/econet/af_econet.c
8706     +++ b/net/econet/af_econet.c
8707     @@ -31,6 +31,7 @@
8708     #include <linux/skbuff.h>
8709     #include <linux/udp.h>
8710     #include <linux/slab.h>
8711     +#include <linux/vmalloc.h>
8712     #include <net/sock.h>
8713     #include <net/inet_common.h>
8714     #include <linux/stat.h>
8715     @@ -276,12 +277,12 @@ static int econet_sendmsg(struct kiocb *iocb, struct socket *sock,
8716     #endif
8717     #ifdef CONFIG_ECONET_AUNUDP
8718     struct msghdr udpmsg;
8719     - struct iovec iov[msg->msg_iovlen+1];
8720     + struct iovec iov[2];
8721     struct aunhdr ah;
8722     struct sockaddr_in udpdest;
8723     __kernel_size_t size;
8724     - int i;
8725     mm_segment_t oldfs;
8726     + char *userbuf;
8727     #endif
8728    
8729     /*
8730     @@ -297,23 +298,14 @@ static int econet_sendmsg(struct kiocb *iocb, struct socket *sock,
8731    
8732     mutex_lock(&econet_mutex);
8733    
8734     - if (saddr == NULL) {
8735     - struct econet_sock *eo = ec_sk(sk);
8736     -
8737     - addr.station = eo->station;
8738     - addr.net = eo->net;
8739     - port = eo->port;
8740     - cb = eo->cb;
8741     - } else {
8742     - if (msg->msg_namelen < sizeof(struct sockaddr_ec)) {
8743     - mutex_unlock(&econet_mutex);
8744     - return -EINVAL;
8745     - }
8746     - addr.station = saddr->addr.station;
8747     - addr.net = saddr->addr.net;
8748     - port = saddr->port;
8749     - cb = saddr->cb;
8750     - }
8751     + if (saddr == NULL || msg->msg_namelen < sizeof(struct sockaddr_ec)) {
8752     + mutex_unlock(&econet_mutex);
8753     + return -EINVAL;
8754     + }
8755     + addr.station = saddr->addr.station;
8756     + addr.net = saddr->addr.net;
8757     + port = saddr->port;
8758     + cb = saddr->cb;
8759    
8760     /* Look for a device with the right network number. */
8761     dev = net2dev_map[addr.net];
8762     @@ -328,17 +320,17 @@ static int econet_sendmsg(struct kiocb *iocb, struct socket *sock,
8763     }
8764     }
8765    
8766     - if (len + 15 > dev->mtu) {
8767     - mutex_unlock(&econet_mutex);
8768     - return -EMSGSIZE;
8769     - }
8770     -
8771     if (dev->type == ARPHRD_ECONET) {
8772     /* Real hardware Econet. We're not worthy etc. */
8773     #ifdef CONFIG_ECONET_NATIVE
8774     unsigned short proto = 0;
8775     int res;
8776    
8777     + if (len + 15 > dev->mtu) {
8778     + mutex_unlock(&econet_mutex);
8779     + return -EMSGSIZE;
8780     + }
8781     +
8782     dev_hold(dev);
8783    
8784     skb = sock_alloc_send_skb(sk, len+LL_ALLOCATED_SPACE(dev),
8785     @@ -351,7 +343,6 @@ static int econet_sendmsg(struct kiocb *iocb, struct socket *sock,
8786    
8787     eb = (struct ec_cb *)&skb->cb;
8788    
8789     - /* BUG: saddr may be NULL */
8790     eb->cookie = saddr->cookie;
8791     eb->sec = *saddr;
8792     eb->sent = ec_tx_done;
8793     @@ -415,6 +406,11 @@ static int econet_sendmsg(struct kiocb *iocb, struct socket *sock,
8794     return -ENETDOWN; /* No socket - can't send */
8795     }
8796    
8797     + if (len > 32768) {
8798     + err = -E2BIG;
8799     + goto error;
8800     + }
8801     +
8802     /* Make up a UDP datagram and hand it off to some higher intellect. */
8803    
8804     memset(&udpdest, 0, sizeof(udpdest));
8805     @@ -446,36 +442,26 @@ static int econet_sendmsg(struct kiocb *iocb, struct socket *sock,
8806    
8807     /* tack our header on the front of the iovec */
8808     size = sizeof(struct aunhdr);
8809     - /*
8810     - * XXX: that is b0rken. We can't mix userland and kernel pointers
8811     - * in iovec, since on a lot of platforms copy_from_user() will
8812     - * *not* work with the kernel and userland ones at the same time,
8813     - * regardless of what we do with set_fs(). And we are talking about
8814     - * econet-over-ethernet here, so "it's only ARM anyway" doesn't
8815     - * apply. Any suggestions on fixing that code? -- AV
8816     - */
8817     iov[0].iov_base = (void *)&ah;
8818     iov[0].iov_len = size;
8819     - for (i = 0; i < msg->msg_iovlen; i++) {
8820     - void __user *base = msg->msg_iov[i].iov_base;
8821     - size_t iov_len = msg->msg_iov[i].iov_len;
8822     - /* Check it now since we switch to KERNEL_DS later. */
8823     - if (!access_ok(VERIFY_READ, base, iov_len)) {
8824     - mutex_unlock(&econet_mutex);
8825     - return -EFAULT;
8826     - }
8827     - iov[i+1].iov_base = base;
8828     - iov[i+1].iov_len = iov_len;
8829     - size += iov_len;
8830     +
8831     + userbuf = vmalloc(len);
8832     + if (userbuf == NULL) {
8833     + err = -ENOMEM;
8834     + goto error;
8835     }
8836    
8837     + iov[1].iov_base = userbuf;
8838     + iov[1].iov_len = len;
8839     + err = memcpy_fromiovec(userbuf, msg->msg_iov, len);
8840     + if (err)
8841     + goto error_free_buf;
8842     +
8843     /* Get a skbuff (no data, just holds our cb information) */
8844     if ((skb = sock_alloc_send_skb(sk, 0,
8845     msg->msg_flags & MSG_DONTWAIT,
8846     - &err)) == NULL) {
8847     - mutex_unlock(&econet_mutex);
8848     - return err;
8849     - }
8850     + &err)) == NULL)
8851     + goto error_free_buf;
8852    
8853     eb = (struct ec_cb *)&skb->cb;
8854    
8855     @@ -491,7 +477,7 @@ static int econet_sendmsg(struct kiocb *iocb, struct socket *sock,
8856     udpmsg.msg_name = (void *)&udpdest;
8857     udpmsg.msg_namelen = sizeof(udpdest);
8858     udpmsg.msg_iov = &iov[0];
8859     - udpmsg.msg_iovlen = msg->msg_iovlen + 1;
8860     + udpmsg.msg_iovlen = 2;
8861     udpmsg.msg_control = NULL;
8862     udpmsg.msg_controllen = 0;
8863     udpmsg.msg_flags=0;
8864     @@ -499,9 +485,13 @@ static int econet_sendmsg(struct kiocb *iocb, struct socket *sock,
8865     oldfs = get_fs(); set_fs(KERNEL_DS); /* More privs :-) */
8866     err = sock_sendmsg(udpsock, &udpmsg, size);
8867     set_fs(oldfs);
8868     +
8869     +error_free_buf:
8870     + vfree(userbuf);
8871     #else
8872     err = -EPROTOTYPE;
8873     #endif
8874     + error:
8875     mutex_unlock(&econet_mutex);
8876    
8877     return err;
8878     @@ -671,6 +661,9 @@ static int ec_dev_ioctl(struct socket *sock, unsigned int cmd, void __user *arg)
8879     err = 0;
8880     switch (cmd) {
8881     case SIOCSIFADDR:
8882     + if (!capable(CAP_NET_ADMIN))
8883     + return -EPERM;
8884     +
8885     edev = dev->ec_ptr;
8886     if (edev == NULL) {
8887     /* Magic up a new one. */
8888     diff --git a/net/irda/iriap.c b/net/irda/iriap.c
8889     index fce364c..5b743bd 100644
8890     --- a/net/irda/iriap.c
8891     +++ b/net/irda/iriap.c
8892     @@ -502,7 +502,8 @@ static void iriap_getvaluebyclass_confirm(struct iriap_cb *self,
8893     IRDA_DEBUG(4, "%s(), strlen=%d\n", __func__, value_len);
8894    
8895     /* Make sure the string is null-terminated */
8896     - fp[n+value_len] = 0x00;
8897     + if (n + value_len < skb->len)
8898     + fp[n + value_len] = 0x00;
8899     IRDA_DEBUG(4, "Got string %s\n", fp+n);
8900    
8901     /* Will truncate to IAS_MAX_STRING bytes */
8902     diff --git a/net/irda/parameters.c b/net/irda/parameters.c
8903     index fc1a205..71cd38c 100644
8904     --- a/net/irda/parameters.c
8905     +++ b/net/irda/parameters.c
8906     @@ -298,6 +298,8 @@ static int irda_extract_string(void *self, __u8 *buf, int len, __u8 pi,
8907    
8908     p.pi = pi; /* In case handler needs to know */
8909     p.pl = buf[1]; /* Extract length of value */
8910     + if (p.pl > 32)
8911     + p.pl = 32;
8912    
8913     IRDA_DEBUG(2, "%s(), pi=%#x, pl=%d\n", __func__,
8914     p.pi, p.pl);
8915     @@ -318,7 +320,7 @@ static int irda_extract_string(void *self, __u8 *buf, int len, __u8 pi,
8916     (__u8) str[0], (__u8) str[1]);
8917    
8918     /* Null terminate string */
8919     - str[p.pl+1] = '\0';
8920     + str[p.pl] = '\0';
8921    
8922     p.pv.c = str; /* Handler will need to take a copy */
8923    
8924     diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
8925     index 29ac8e1..2095602 100644
8926     --- a/net/mac80211/cfg.c
8927     +++ b/net/mac80211/cfg.c
8928     @@ -634,6 +634,7 @@ static void sta_apply_parameters(struct ieee80211_local *local,
8929     struct sta_info *sta,
8930     struct station_parameters *params)
8931     {
8932     + unsigned long flags;
8933     u32 rates;
8934     int i, j;
8935     struct ieee80211_supported_band *sband;
8936     @@ -642,7 +643,7 @@ static void sta_apply_parameters(struct ieee80211_local *local,
8937    
8938     sband = local->hw.wiphy->bands[local->oper_channel->band];
8939    
8940     - spin_lock_bh(&sta->lock);
8941     + spin_lock_irqsave(&sta->flaglock, flags);
8942     mask = params->sta_flags_mask;
8943     set = params->sta_flags_set;
8944    
8945     @@ -669,7 +670,7 @@ static void sta_apply_parameters(struct ieee80211_local *local,
8946     if (set & BIT(NL80211_STA_FLAG_MFP))
8947     sta->flags |= WLAN_STA_MFP;
8948     }
8949     - spin_unlock_bh(&sta->lock);
8950     + spin_unlock_irqrestore(&sta->flaglock, flags);
8951    
8952     /*
8953     * cfg80211 validates this (1-2007) and allows setting the AID
8954     diff --git a/net/mac80211/ibss.c b/net/mac80211/ibss.c
8955     index c691780..45c99f0 100644
8956     --- a/net/mac80211/ibss.c
8957     +++ b/net/mac80211/ibss.c
8958     @@ -435,6 +435,7 @@ struct sta_info *ieee80211_ibss_add_sta(struct ieee80211_sub_if_data *sdata,
8959     if (!sta)
8960     return NULL;
8961    
8962     + sta->last_rx = jiffies;
8963     set_sta_flags(sta, WLAN_STA_AUTHORIZED);
8964    
8965     /* make sure mandatory rates are always added */
8966     diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
8967     index 65e0ed6..3546054 100644
8968     --- a/net/mac80211/ieee80211_i.h
8969     +++ b/net/mac80211/ieee80211_i.h
8970     @@ -1003,6 +1003,8 @@ void ieee80211_sta_restart(struct ieee80211_sub_if_data *sdata);
8971     void ieee80211_sta_work(struct ieee80211_sub_if_data *sdata);
8972     void ieee80211_sta_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
8973     struct sk_buff *skb);
8974     +void ieee80211_sta_reset_beacon_monitor(struct ieee80211_sub_if_data *sdata);
8975     +void ieee80211_sta_reset_conn_monitor(struct ieee80211_sub_if_data *sdata);
8976    
8977     /* IBSS code */
8978     void ieee80211_ibss_notify_scan_completed(struct ieee80211_local *local);
8979     diff --git a/net/mac80211/main.c b/net/mac80211/main.c
8980     index ded5c38..e8acdb2 100644
8981     --- a/net/mac80211/main.c
8982     +++ b/net/mac80211/main.c
8983     @@ -108,7 +108,8 @@ int ieee80211_hw_config(struct ieee80211_local *local, u32 changed)
8984     chan = scan_chan;
8985     channel_type = NL80211_CHAN_NO_HT;
8986     local->hw.conf.flags |= IEEE80211_CONF_OFFCHANNEL;
8987     - } else if (local->tmp_channel) {
8988     + } else if (local->tmp_channel &&
8989     + local->oper_channel != local->tmp_channel) {
8990     chan = scan_chan = local->tmp_channel;
8991     channel_type = local->tmp_channel_type;
8992     local->hw.conf.flags |= IEEE80211_CONF_OFFCHANNEL;
8993     diff --git a/net/mac80211/mesh_plink.c b/net/mac80211/mesh_plink.c
8994     index ea13a80..1c91f0f 100644
8995     --- a/net/mac80211/mesh_plink.c
8996     +++ b/net/mac80211/mesh_plink.c
8997     @@ -412,7 +412,7 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m
8998     enum plink_event event;
8999     enum plink_frame_type ftype;
9000     size_t baselen;
9001     - bool deactivated;
9002     + bool deactivated, matches_local = true;
9003     u8 ie_len;
9004     u8 *baseaddr;
9005     __le16 plid, llid, reason;
9006     @@ -487,6 +487,7 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m
9007     /* Now we will figure out the appropriate event... */
9008     event = PLINK_UNDEFINED;
9009     if (ftype != PLINK_CLOSE && (!mesh_matches_local(&elems, sdata))) {
9010     + matches_local = false;
9011     switch (ftype) {
9012     case PLINK_OPEN:
9013     event = OPN_RJCT;
9014     @@ -498,7 +499,15 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m
9015     /* avoid warning */
9016     break;
9017     }
9018     - spin_lock_bh(&sta->lock);
9019     + }
9020     +
9021     + if (!sta && !matches_local) {
9022     + rcu_read_unlock();
9023     + reason = cpu_to_le16(MESH_CAPABILITY_POLICY_VIOLATION);
9024     + llid = 0;
9025     + mesh_plink_frame_tx(sdata, PLINK_CLOSE, mgmt->sa, llid,
9026     + plid, reason);
9027     + return;
9028     } else if (!sta) {
9029     /* ftype == PLINK_OPEN */
9030     u32 rates;
9031     @@ -522,7 +531,7 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m
9032     }
9033     event = OPN_ACPT;
9034     spin_lock_bh(&sta->lock);
9035     - } else {
9036     + } else if (matches_local) {
9037     spin_lock_bh(&sta->lock);
9038     switch (ftype) {
9039     case PLINK_OPEN:
9040     @@ -564,6 +573,8 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m
9041     rcu_read_unlock();
9042     return;
9043     }
9044     + } else {
9045     + spin_lock_bh(&sta->lock);
9046     }
9047    
9048     mpl_dbg("Mesh plink (peer, state, llid, plid, event): %pM %s %d %d %d\n",
9049     diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
9050     index b6c163a..4c5eed9 100644
9051     --- a/net/mac80211/mlme.c
9052     +++ b/net/mac80211/mlme.c
9053     @@ -109,7 +109,7 @@ static void run_again(struct ieee80211_if_managed *ifmgd,
9054     mod_timer(&ifmgd->timer, timeout);
9055     }
9056    
9057     -static void mod_beacon_timer(struct ieee80211_sub_if_data *sdata)
9058     +void ieee80211_sta_reset_beacon_monitor(struct ieee80211_sub_if_data *sdata)
9059     {
9060     if (sdata->local->hw.flags & IEEE80211_HW_BEACON_FILTER)
9061     return;
9062     @@ -118,6 +118,19 @@ static void mod_beacon_timer(struct ieee80211_sub_if_data *sdata)
9063     round_jiffies_up(jiffies + IEEE80211_BEACON_LOSS_TIME));
9064     }
9065    
9066     +void ieee80211_sta_reset_conn_monitor(struct ieee80211_sub_if_data *sdata)
9067     +{
9068     + struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
9069     +
9070     + if (sdata->local->hw.flags & IEEE80211_HW_CONNECTION_MONITOR)
9071     + return;
9072     +
9073     + mod_timer(&sdata->u.mgd.conn_mon_timer,
9074     + round_jiffies_up(jiffies + IEEE80211_CONNECTION_IDLE_TIME));
9075     +
9076     + ifmgd->probe_send_count = 0;
9077     +}
9078     +
9079     static int ecw2cw(int ecw)
9080     {
9081     return (1 << ecw) - 1;
9082     @@ -1006,21 +1019,26 @@ void ieee80211_sta_rx_notify(struct ieee80211_sub_if_data *sdata,
9083     if (is_multicast_ether_addr(hdr->addr1))
9084     return;
9085    
9086     - if (sdata->local->hw.flags & IEEE80211_HW_CONNECTION_MONITOR)
9087     - return;
9088     -
9089     - mod_timer(&sdata->u.mgd.conn_mon_timer,
9090     - round_jiffies_up(jiffies + IEEE80211_CONNECTION_IDLE_TIME));
9091     + ieee80211_sta_reset_conn_monitor(sdata);
9092     }
9093    
9094     static void ieee80211_mgd_probe_ap_send(struct ieee80211_sub_if_data *sdata)
9095     {
9096     struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
9097     const u8 *ssid;
9098     + u8 *dst = ifmgd->associated->bssid;
9099     + u8 unicast_limit = max(1, IEEE80211_MAX_PROBE_TRIES - 3);
9100     +
9101     + /*
9102     + * Try sending broadcast probe requests for the last three
9103     + * probe requests after the first ones failed since some
9104     + * buggy APs only support broadcast probe requests.
9105     + */
9106     + if (ifmgd->probe_send_count >= unicast_limit)
9107     + dst = NULL;
9108    
9109     ssid = ieee80211_bss_get_ie(ifmgd->associated, WLAN_EID_SSID);
9110     - ieee80211_send_probe_req(sdata, ifmgd->associated->bssid,
9111     - ssid + 2, ssid[1], NULL, 0);
9112     + ieee80211_send_probe_req(sdata, dst, ssid + 2, ssid[1], NULL, 0);
9113    
9114     ifmgd->probe_send_count++;
9115     ifmgd->probe_timeout = jiffies + IEEE80211_PROBE_WAIT;
9116     @@ -1262,7 +1280,7 @@ static bool ieee80211_assoc_success(struct ieee80211_work *wk,
9117    
9118     rates = 0;
9119     basic_rates = 0;
9120     - sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
9121     + sband = local->hw.wiphy->bands[wk->chan->band];
9122    
9123     for (i = 0; i < elems.supp_rates_len; i++) {
9124     int rate = (elems.supp_rates[i] & 0x7f) * 5;
9125     @@ -1298,11 +1316,11 @@ static bool ieee80211_assoc_success(struct ieee80211_work *wk,
9126     }
9127     }
9128    
9129     - sta->sta.supp_rates[local->hw.conf.channel->band] = rates;
9130     + sta->sta.supp_rates[wk->chan->band] = rates;
9131     sdata->vif.bss_conf.basic_rates = basic_rates;
9132    
9133     /* cf. IEEE 802.11 9.2.12 */
9134     - if (local->hw.conf.channel->band == IEEE80211_BAND_2GHZ &&
9135     + if (wk->chan->band == IEEE80211_BAND_2GHZ &&
9136     have_higher_than_11mbit)
9137     sdata->flags |= IEEE80211_SDATA_OPERATING_GMODE;
9138     else
9139     @@ -1362,7 +1380,7 @@ static bool ieee80211_assoc_success(struct ieee80211_work *wk,
9140     * Also start the timer that will detect beacon loss.
9141     */
9142     ieee80211_sta_rx_notify(sdata, (struct ieee80211_hdr *)mgmt);
9143     - mod_beacon_timer(sdata);
9144     + ieee80211_sta_reset_beacon_monitor(sdata);
9145    
9146     return true;
9147     }
9148     @@ -1465,7 +1483,7 @@ static void ieee80211_rx_mgmt_probe_resp(struct ieee80211_sub_if_data *sdata,
9149     * we have or will be receiving any beacons or data, so let's
9150     * schedule the timers again, just in case.
9151     */
9152     - mod_beacon_timer(sdata);
9153     + ieee80211_sta_reset_beacon_monitor(sdata);
9154    
9155     mod_timer(&ifmgd->conn_mon_timer,
9156     round_jiffies_up(jiffies +
9157     @@ -1540,7 +1558,7 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
9158     ifmgd->last_beacon_signal = rx_status->signal;
9159     if (ifmgd->flags & IEEE80211_STA_RESET_SIGNAL_AVE) {
9160     ifmgd->flags &= ~IEEE80211_STA_RESET_SIGNAL_AVE;
9161     - ifmgd->ave_beacon_signal = rx_status->signal;
9162     + ifmgd->ave_beacon_signal = rx_status->signal * 16;
9163     ifmgd->last_cqm_event_signal = 0;
9164     } else {
9165     ifmgd->ave_beacon_signal =
9166     @@ -1588,7 +1606,7 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
9167     * Push the beacon loss detection into the future since
9168     * we are processing a beacon from the AP just now.
9169     */
9170     - mod_beacon_timer(sdata);
9171     + ieee80211_sta_reset_beacon_monitor(sdata);
9172    
9173     ncrc = crc32_be(0, (void *)&mgmt->u.beacon.beacon_int, 4);
9174     ncrc = ieee802_11_parse_elems_crc(mgmt->u.beacon.variable,
9175     diff --git a/net/mac80211/offchannel.c b/net/mac80211/offchannel.c
9176     index c36b191..cf5ee30 100644
9177     --- a/net/mac80211/offchannel.c
9178     +++ b/net/mac80211/offchannel.c
9179     @@ -22,12 +22,16 @@
9180     static void ieee80211_offchannel_ps_enable(struct ieee80211_sub_if_data *sdata)
9181     {
9182     struct ieee80211_local *local = sdata->local;
9183     + struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
9184    
9185     local->offchannel_ps_enabled = false;
9186    
9187     /* FIXME: what to do when local->pspolling is true? */
9188    
9189     del_timer_sync(&local->dynamic_ps_timer);
9190     + del_timer_sync(&ifmgd->bcn_mon_timer);
9191     + del_timer_sync(&ifmgd->conn_mon_timer);
9192     +
9193     cancel_work_sync(&local->dynamic_ps_enable_work);
9194    
9195     if (local->hw.conf.flags & IEEE80211_CONF_PS) {
9196     @@ -85,6 +89,9 @@ static void ieee80211_offchannel_ps_disable(struct ieee80211_sub_if_data *sdata)
9197     mod_timer(&local->dynamic_ps_timer, jiffies +
9198     msecs_to_jiffies(local->hw.conf.dynamic_ps_timeout));
9199     }
9200     +
9201     + ieee80211_sta_reset_beacon_monitor(sdata);
9202     + ieee80211_sta_reset_conn_monitor(sdata);
9203     }
9204    
9205     void ieee80211_offchannel_stop_beaconing(struct ieee80211_local *local)
9206     diff --git a/net/mac80211/rate.c b/net/mac80211/rate.c
9207     index be04d461..82d5750 100644
9208     --- a/net/mac80211/rate.c
9209     +++ b/net/mac80211/rate.c
9210     @@ -328,6 +328,9 @@ void rate_control_get_rate(struct ieee80211_sub_if_data *sdata,
9211     * if needed.
9212     */
9213     for (i = 0; i < IEEE80211_TX_MAX_RATES; i++) {
9214     + /* Skip invalid rates */
9215     + if (info->control.rates[i].idx < 0)
9216     + break;
9217     /* Rate masking supports only legacy rates for now */
9218     if (info->control.rates[i].flags & IEEE80211_TX_RC_MCS)
9219     continue;
9220     diff --git a/net/mac80211/rc80211_minstrel_ht.c b/net/mac80211/rc80211_minstrel_ht.c
9221     index c5b4659..2a18d66 100644
9222     --- a/net/mac80211/rc80211_minstrel_ht.c
9223     +++ b/net/mac80211/rc80211_minstrel_ht.c
9224     @@ -397,8 +397,9 @@ minstrel_ht_tx_status(void *priv, struct ieee80211_supported_band *sband,
9225     !(info->flags & IEEE80211_TX_STAT_AMPDU))
9226     return;
9227    
9228     - if (!info->status.ampdu_len) {
9229     - info->status.ampdu_ack_len = 1;
9230     + if (!(info->flags & IEEE80211_TX_STAT_AMPDU)) {
9231     + info->status.ampdu_ack_len =
9232     + (info->flags & IEEE80211_TX_STAT_ACK ? 1 : 0);
9233     info->status.ampdu_len = 1;
9234     }
9235    
9236     @@ -426,7 +427,7 @@ minstrel_ht_tx_status(void *priv, struct ieee80211_supported_band *sband,
9237     group = minstrel_ht_get_group_idx(&ar[i]);
9238     rate = &mi->groups[group].rates[ar[i].idx % 8];
9239    
9240     - if (last && (info->flags & IEEE80211_TX_STAT_ACK))
9241     + if (last)
9242     rate->success += info->status.ampdu_ack_len;
9243    
9244     rate->attempts += ar[i].count * info->status.ampdu_len;
9245     diff --git a/net/mac80211/status.c b/net/mac80211/status.c
9246     index 34da679..6ffa26a 100644
9247     --- a/net/mac80211/status.c
9248     +++ b/net/mac80211/status.c
9249     @@ -58,6 +58,7 @@ static void ieee80211_handle_filtered_frame(struct ieee80211_local *local,
9250     info->control.vif = &sta->sdata->vif;
9251     info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING |
9252     IEEE80211_TX_INTFL_RETRANSMISSION;
9253     + info->flags &= ~IEEE80211_TX_TEMPORARY_FLAGS;
9254    
9255     sta->tx_filtered_count++;
9256    
9257     diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c
9258     index df3eedb..a37a6b1 100644
9259     --- a/net/netfilter/nf_conntrack_core.c
9260     +++ b/net/netfilter/nf_conntrack_core.c
9261     @@ -1260,7 +1260,8 @@ void *nf_ct_alloc_hashtable(unsigned int *sizep, int *vmalloced, int nulls)
9262     if (!hash) {
9263     *vmalloced = 1;
9264     printk(KERN_WARNING "nf_conntrack: falling back to vmalloc.\n");
9265     - hash = __vmalloc(sz, GFP_KERNEL | __GFP_ZERO, PAGE_KERNEL);
9266     + hash = __vmalloc(sz, GFP_KERNEL | __GFP_HIGHMEM | __GFP_ZERO,
9267     + PAGE_KERNEL);
9268     }
9269    
9270     if (hash && nulls)
9271     diff --git a/net/rds/rdma.c b/net/rds/rdma.c
9272     index 75fd13b..3998967 100644
9273     --- a/net/rds/rdma.c
9274     +++ b/net/rds/rdma.c
9275     @@ -474,7 +474,7 @@ static struct rds_rdma_op *rds_rdma_prepare(struct rds_sock *rs,
9276     goto out;
9277     }
9278    
9279     - if (args->nr_local > (u64)UINT_MAX) {
9280     + if (args->nr_local > UIO_MAXIOV) {
9281     ret = -EMSGSIZE;
9282     goto out;
9283     }
9284     diff --git a/net/socket.c b/net/socket.c
9285     index 2270b94..58dfc91 100644
9286     --- a/net/socket.c
9287     +++ b/net/socket.c
9288     @@ -1651,6 +1651,8 @@ SYSCALL_DEFINE6(sendto, int, fd, void __user *, buff, size_t, len,
9289     struct iovec iov;
9290     int fput_needed;
9291    
9292     + if (len > INT_MAX)
9293     + len = INT_MAX;
9294     sock = sockfd_lookup_light(fd, &err, &fput_needed);
9295     if (!sock)
9296     goto out;
9297     @@ -1708,6 +1710,8 @@ SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, ubuf, size_t, size,
9298     int err, err2;
9299     int fput_needed;
9300    
9301     + if (size > INT_MAX)
9302     + size = INT_MAX;
9303     sock = sockfd_lookup_light(fd, &err, &fput_needed);
9304     if (!sock)
9305     goto out;
9306     diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c
9307     index fa55490..cbc5b8c 100644
9308     --- a/net/sunrpc/clnt.c
9309     +++ b/net/sunrpc/clnt.c
9310     @@ -1675,7 +1675,7 @@ rpc_verify_header(struct rpc_task *task)
9311     rpcauth_invalcred(task);
9312     /* Ensure we obtain a new XID! */
9313     xprt_release(task);
9314     - task->tk_action = call_refresh;
9315     + task->tk_action = call_reserve;
9316     goto out_retry;
9317     case RPC_AUTH_BADCRED:
9318     case RPC_AUTH_BADVERF:
9319     diff --git a/net/wireless/chan.c b/net/wireless/chan.c
9320     index d0c92dd..d8f443b 100644
9321     --- a/net/wireless/chan.c
9322     +++ b/net/wireless/chan.c
9323     @@ -44,6 +44,36 @@ rdev_freq_to_chan(struct cfg80211_registered_device *rdev,
9324     return chan;
9325     }
9326    
9327     +static bool can_beacon_sec_chan(struct wiphy *wiphy,
9328     + struct ieee80211_channel *chan,
9329     + enum nl80211_channel_type channel_type)
9330     +{
9331     + struct ieee80211_channel *sec_chan;
9332     + int diff;
9333     +
9334     + switch (channel_type) {
9335     + case NL80211_CHAN_HT40PLUS:
9336     + diff = 20;
9337     + case NL80211_CHAN_HT40MINUS:
9338     + diff = -20;
9339     + default:
9340     + return false;
9341     + }
9342     +
9343     + sec_chan = ieee80211_get_channel(wiphy, chan->center_freq + diff);
9344     + if (!sec_chan)
9345     + return false;
9346     +
9347     + /* we'll need a DFS capability later */
9348     + if (sec_chan->flags & (IEEE80211_CHAN_DISABLED |
9349     + IEEE80211_CHAN_PASSIVE_SCAN |
9350     + IEEE80211_CHAN_NO_IBSS |
9351     + IEEE80211_CHAN_RADAR))
9352     + return false;
9353     +
9354     + return true;
9355     +}
9356     +
9357     int cfg80211_set_freq(struct cfg80211_registered_device *rdev,
9358     struct wireless_dev *wdev, int freq,
9359     enum nl80211_channel_type channel_type)
9360     @@ -68,6 +98,27 @@ int cfg80211_set_freq(struct cfg80211_registered_device *rdev,
9361     if (!chan)
9362     return -EINVAL;
9363    
9364     + /* Both channels should be able to initiate communication */
9365     + if (wdev && (wdev->iftype == NL80211_IFTYPE_ADHOC ||
9366     + wdev->iftype == NL80211_IFTYPE_AP ||
9367     + wdev->iftype == NL80211_IFTYPE_AP_VLAN ||
9368     + wdev->iftype == NL80211_IFTYPE_MESH_POINT)) {
9369     + switch (channel_type) {
9370     + case NL80211_CHAN_HT40PLUS:
9371     + case NL80211_CHAN_HT40MINUS:
9372     + if (!can_beacon_sec_chan(&rdev->wiphy, chan,
9373     + channel_type)) {
9374     + printk(KERN_DEBUG
9375     + "cfg80211: Secondary channel not "
9376     + "allowed to initiate communication\n");
9377     + return -EINVAL;
9378     + }
9379     + break;
9380     + default:
9381     + break;
9382     + }
9383     + }
9384     +
9385     result = rdev->ops->set_channel(&rdev->wiphy,
9386     wdev ? wdev->netdev : NULL,
9387     chan, channel_type);
9388     diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
9389     index 37902a5..9a8cde9 100644
9390     --- a/net/wireless/nl80211.c
9391     +++ b/net/wireless/nl80211.c
9392     @@ -761,11 +761,13 @@ static int nl80211_set_channel(struct sk_buff *skb, struct genl_info *info)
9393    
9394     result = get_rdev_dev_by_info_ifindex(info, &rdev, &netdev);
9395     if (result)
9396     - goto unlock;
9397     + goto unlock_rtnl;
9398    
9399     result = __nl80211_set_channel(rdev, netdev->ieee80211_ptr, info);
9400    
9401     - unlock:
9402     + dev_put(netdev);
9403     + cfg80211_unlock_rdev(rdev);
9404     + unlock_rtnl:
9405     rtnl_unlock();
9406    
9407     return result;
9408     @@ -4996,7 +4998,7 @@ static int nl80211_set_cqm_rssi(struct genl_info *info,
9409    
9410     err = get_rdev_dev_by_info_ifindex(info, &rdev, &dev);
9411     if (err)
9412     - goto unlock_rdev;
9413     + goto unlock_rtnl;
9414    
9415     wdev = dev->ieee80211_ptr;
9416    
9417     @@ -5013,9 +5015,10 @@ static int nl80211_set_cqm_rssi(struct genl_info *info,
9418     err = rdev->ops->set_cqm_rssi_config(wdev->wiphy, dev,
9419     threshold, hysteresis);
9420    
9421     -unlock_rdev:
9422     + unlock_rdev:
9423     cfg80211_unlock_rdev(rdev);
9424     dev_put(dev);
9425     + unlock_rtnl:
9426     rtnl_unlock();
9427    
9428     return err;
9429     diff --git a/net/wireless/reg.c b/net/wireless/reg.c
9430     index f180db0..39890ef 100644
9431     --- a/net/wireless/reg.c
9432     +++ b/net/wireless/reg.c
9433     @@ -1170,7 +1170,7 @@ static int ignore_request(struct wiphy *wiphy,
9434     return 0;
9435     return -EALREADY;
9436     }
9437     - return REG_INTERSECT;
9438     + return 0;
9439     case NL80211_REGDOM_SET_BY_DRIVER:
9440     if (last_request->initiator == NL80211_REGDOM_SET_BY_CORE) {
9441     if (regdom_changes(pending_request->alpha2))
9442     diff --git a/net/wireless/scan.c b/net/wireless/scan.c
9443     index 5ca8c71..503ebb8 100644
9444     --- a/net/wireless/scan.c
9445     +++ b/net/wireless/scan.c
9446     @@ -650,14 +650,14 @@ void cfg80211_unlink_bss(struct wiphy *wiphy, struct cfg80211_bss *pub)
9447     bss = container_of(pub, struct cfg80211_internal_bss, pub);
9448    
9449     spin_lock_bh(&dev->bss_lock);
9450     + if (!list_empty(&bss->list)) {
9451     + list_del_init(&bss->list);
9452     + dev->bss_generation++;
9453     + rb_erase(&bss->rbn, &dev->bss_tree);
9454    
9455     - list_del(&bss->list);
9456     - dev->bss_generation++;
9457     - rb_erase(&bss->rbn, &dev->bss_tree);
9458     -
9459     + kref_put(&bss->ref, bss_release);
9460     + }
9461     spin_unlock_bh(&dev->bss_lock);
9462     -
9463     - kref_put(&bss->ref, bss_release);
9464     }
9465     EXPORT_SYMBOL(cfg80211_unlink_bss);
9466    
9467     diff --git a/net/x25/x25_facilities.c b/net/x25/x25_facilities.c
9468     index 771bab0..55187c8 100644
9469     --- a/net/x25/x25_facilities.c
9470     +++ b/net/x25/x25_facilities.c
9471     @@ -61,6 +61,8 @@ int x25_parse_facilities(struct sk_buff *skb, struct x25_facilities *facilities,
9472     while (len > 0) {
9473     switch (*p & X25_FAC_CLASS_MASK) {
9474     case X25_FAC_CLASS_A:
9475     + if (len < 2)
9476     + return 0;
9477     switch (*p) {
9478     case X25_FAC_REVERSE:
9479     if((p[1] & 0x81) == 0x81) {
9480     @@ -104,6 +106,8 @@ int x25_parse_facilities(struct sk_buff *skb, struct x25_facilities *facilities,
9481     len -= 2;
9482     break;
9483     case X25_FAC_CLASS_B:
9484     + if (len < 3)
9485     + return 0;
9486     switch (*p) {
9487     case X25_FAC_PACKET_SIZE:
9488     facilities->pacsize_in = p[1];
9489     @@ -125,6 +129,8 @@ int x25_parse_facilities(struct sk_buff *skb, struct x25_facilities *facilities,
9490     len -= 3;
9491     break;
9492     case X25_FAC_CLASS_C:
9493     + if (len < 4)
9494     + return 0;
9495     printk(KERN_DEBUG "X.25: unknown facility %02X, "
9496     "values %02X, %02X, %02X\n",
9497     p[0], p[1], p[2], p[3]);
9498     @@ -132,26 +138,26 @@ int x25_parse_facilities(struct sk_buff *skb, struct x25_facilities *facilities,
9499     len -= 4;
9500     break;
9501     case X25_FAC_CLASS_D:
9502     + if (len < p[1] + 2)
9503     + return 0;
9504     switch (*p) {
9505     case X25_FAC_CALLING_AE:
9506     - if (p[1] > X25_MAX_DTE_FACIL_LEN)
9507     - break;
9508     + if (p[1] > X25_MAX_DTE_FACIL_LEN || p[1] <= 1)
9509     + return 0;
9510     dte_facs->calling_len = p[2];
9511     memcpy(dte_facs->calling_ae, &p[3], p[1] - 1);
9512     *vc_fac_mask |= X25_MASK_CALLING_AE;
9513     break;
9514     case X25_FAC_CALLED_AE:
9515     - if (p[1] > X25_MAX_DTE_FACIL_LEN)
9516     - break;
9517     + if (p[1] > X25_MAX_DTE_FACIL_LEN || p[1] <= 1)
9518     + return 0;
9519     dte_facs->called_len = p[2];
9520     memcpy(dte_facs->called_ae, &p[3], p[1] - 1);
9521     *vc_fac_mask |= X25_MASK_CALLED_AE;
9522     break;
9523     default:
9524     printk(KERN_DEBUG "X.25: unknown facility %02X,"
9525     - "length %d, values %02X, %02X, "
9526     - "%02X, %02X\n",
9527     - p[0], p[1], p[2], p[3], p[4], p[5]);
9528     + "length %d\n", p[0], p[1]);
9529     break;
9530     }
9531     len -= p[1] + 2;
9532     diff --git a/net/x25/x25_in.c b/net/x25/x25_in.c
9533     index 6317896..f729f02 100644
9534     --- a/net/x25/x25_in.c
9535     +++ b/net/x25/x25_in.c
9536     @@ -119,6 +119,8 @@ static int x25_state1_machine(struct sock *sk, struct sk_buff *skb, int frametyp
9537     &x25->vc_facil_mask);
9538     if (len > 0)
9539     skb_pull(skb, len);
9540     + else
9541     + return -1;
9542     /*
9543     * Copy any Call User Data.
9544     */
9545     diff --git a/scripts/kconfig/conf.c b/scripts/kconfig/conf.c
9546     index 7ef429c..6968f5b 100644
9547     --- a/scripts/kconfig/conf.c
9548     +++ b/scripts/kconfig/conf.c
9549     @@ -466,7 +466,7 @@ int main(int ac, char **av)
9550     bindtextdomain(PACKAGE, LOCALEDIR);
9551     textdomain(PACKAGE);
9552    
9553     - while ((opt = getopt_long_only(ac, av, "", long_opts, NULL)) != -1) {
9554     + while ((opt = getopt_long(ac, av, "", long_opts, NULL)) != -1) {
9555     input_mode = (enum input_mode)opt;
9556     switch (opt) {
9557     case silentoldconfig:
9558     diff --git a/sound/core/oss/mixer_oss.c b/sound/core/oss/mixer_oss.c
9559     index f50ebf2..8442a08 100644
9560     --- a/sound/core/oss/mixer_oss.c
9561     +++ b/sound/core/oss/mixer_oss.c
9562     @@ -618,8 +618,10 @@ static void snd_mixer_oss_put_volume1_vol(struct snd_mixer_oss_file *fmixer,
9563     if (numid == ID_UNKNOWN)
9564     return;
9565     down_read(&card->controls_rwsem);
9566     - if ((kctl = snd_ctl_find_numid(card, numid)) == NULL)
9567     + if ((kctl = snd_ctl_find_numid(card, numid)) == NULL) {
9568     + up_read(&card->controls_rwsem);
9569     return;
9570     + }
9571     uinfo = kzalloc(sizeof(*uinfo), GFP_KERNEL);
9572     uctl = kzalloc(sizeof(*uctl), GFP_KERNEL);
9573     if (uinfo == NULL || uctl == NULL)
9574     @@ -658,7 +660,7 @@ static void snd_mixer_oss_put_volume1_sw(struct snd_mixer_oss_file *fmixer,
9575     return;
9576     down_read(&card->controls_rwsem);
9577     if ((kctl = snd_ctl_find_numid(card, numid)) == NULL) {
9578     - up_read(&fmixer->card->controls_rwsem);
9579     + up_read(&card->controls_rwsem);
9580     return;
9581     }
9582     uinfo = kzalloc(sizeof(*uinfo), GFP_KERNEL);
9583     @@ -797,7 +799,7 @@ static int snd_mixer_oss_get_recsrc2(struct snd_mixer_oss_file *fmixer, unsigned
9584     uctl = kzalloc(sizeof(*uctl), GFP_KERNEL);
9585     if (uinfo == NULL || uctl == NULL) {
9586     err = -ENOMEM;
9587     - goto __unlock;
9588     + goto __free_only;
9589     }
9590     down_read(&card->controls_rwsem);
9591     kctl = snd_mixer_oss_test_id(mixer, "Capture Source", 0);
9592     @@ -826,6 +828,7 @@ static int snd_mixer_oss_get_recsrc2(struct snd_mixer_oss_file *fmixer, unsigned
9593     err = 0;
9594     __unlock:
9595     up_read(&card->controls_rwsem);
9596     + __free_only:
9597     kfree(uctl);
9598     kfree(uinfo);
9599     return err;
9600     @@ -847,7 +850,7 @@ static int snd_mixer_oss_put_recsrc2(struct snd_mixer_oss_file *fmixer, unsigned
9601     uctl = kzalloc(sizeof(*uctl), GFP_KERNEL);
9602     if (uinfo == NULL || uctl == NULL) {
9603     err = -ENOMEM;
9604     - goto __unlock;
9605     + goto __free_only;
9606     }
9607     down_read(&card->controls_rwsem);
9608     kctl = snd_mixer_oss_test_id(mixer, "Capture Source", 0);
9609     @@ -880,6 +883,7 @@ static int snd_mixer_oss_put_recsrc2(struct snd_mixer_oss_file *fmixer, unsigned
9610     err = 0;
9611     __unlock:
9612     up_read(&card->controls_rwsem);
9613     + __free_only:
9614     kfree(uctl);
9615     kfree(uinfo);
9616     return err;
9617     diff --git a/sound/core/oss/pcm_oss.c b/sound/core/oss/pcm_oss.c
9618     index 5c8c7df..aed06c9 100644
9619     --- a/sound/core/oss/pcm_oss.c
9620     +++ b/sound/core/oss/pcm_oss.c
9621     @@ -1510,16 +1510,19 @@ static ssize_t snd_pcm_oss_read1(struct snd_pcm_substream *substream, char __use
9622     static int snd_pcm_oss_reset(struct snd_pcm_oss_file *pcm_oss_file)
9623     {
9624     struct snd_pcm_substream *substream;
9625     + struct snd_pcm_runtime *runtime;
9626     + int i;
9627    
9628     - substream = pcm_oss_file->streams[SNDRV_PCM_STREAM_PLAYBACK];
9629     - if (substream != NULL) {
9630     - snd_pcm_kernel_ioctl(substream, SNDRV_PCM_IOCTL_DROP, NULL);
9631     - substream->runtime->oss.prepare = 1;
9632     - }
9633     - substream = pcm_oss_file->streams[SNDRV_PCM_STREAM_CAPTURE];
9634     - if (substream != NULL) {
9635     + for (i = 0; i < 2; i++) {
9636     + substream = pcm_oss_file->streams[i];
9637     + if (!substream)
9638     + continue;
9639     + runtime = substream->runtime;
9640     snd_pcm_kernel_ioctl(substream, SNDRV_PCM_IOCTL_DROP, NULL);
9641     - substream->runtime->oss.prepare = 1;
9642     + runtime->oss.prepare = 1;
9643     + runtime->oss.buffer_used = 0;
9644     + runtime->oss.prev_hw_ptr_period = 0;
9645     + runtime->oss.period_ptr = 0;
9646     }
9647     return 0;
9648     }
9649     diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c
9650     index 1482921..b959c9f 100644
9651     --- a/sound/pci/hda/hda_codec.c
9652     +++ b/sound/pci/hda/hda_codec.c
9653     @@ -1216,6 +1216,7 @@ void snd_hda_codec_setup_stream(struct hda_codec *codec, hda_nid_t nid,
9654     struct hda_codec *c;
9655     struct hda_cvt_setup *p;
9656     unsigned int oldval, newval;
9657     + int type;
9658     int i;
9659    
9660     if (!nid)
9661     @@ -1254,10 +1255,12 @@ void snd_hda_codec_setup_stream(struct hda_codec *codec, hda_nid_t nid,
9662     p->dirty = 0;
9663    
9664     /* make other inactive cvts with the same stream-tag dirty */
9665     + type = get_wcaps_type(get_wcaps(codec, nid));
9666     list_for_each_entry(c, &codec->bus->codec_list, list) {
9667     for (i = 0; i < c->cvt_setups.used; i++) {
9668     p = snd_array_elem(&c->cvt_setups, i);
9669     - if (!p->active && p->stream_tag == stream_tag)
9670     + if (!p->active && p->stream_tag == stream_tag &&
9671     + get_wcaps_type(get_wcaps(codec, p->nid)) == type)
9672     p->dirty = 1;
9673     }
9674     }
9675     @@ -1281,6 +1284,9 @@ void __snd_hda_codec_cleanup_stream(struct hda_codec *codec, hda_nid_t nid,
9676     if (!nid)
9677     return;
9678    
9679     + if (codec->no_sticky_stream)
9680     + do_now = 1;
9681     +
9682     snd_printdd("hda_codec_cleanup_stream: NID=0x%x\n", nid);
9683     p = get_hda_cvt_setup(codec, nid);
9684     if (p) {
9685     diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h
9686     index 62c7022..c3ad374 100644
9687     --- a/sound/pci/hda/hda_codec.h
9688     +++ b/sound/pci/hda/hda_codec.h
9689     @@ -850,6 +850,7 @@ struct hda_codec {
9690     unsigned int pin_amp_workaround:1; /* pin out-amp takes index
9691     * (e.g. Conexant codecs)
9692     */
9693     + unsigned int no_sticky_stream:1; /* no sticky-PCM stream assignment */
9694     unsigned int pins_shutup:1; /* pins are shut up */
9695     unsigned int no_trigger_sense:1; /* don't trigger at pin-sensing */
9696     #ifdef CONFIG_SND_HDA_POWER_SAVE
9697     diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
9698     index 34940a0..935ffca 100644
9699     --- a/sound/pci/hda/hda_intel.c
9700     +++ b/sound/pci/hda/hda_intel.c
9701     @@ -458,6 +458,7 @@ enum {
9702     AZX_DRIVER_ULI,
9703     AZX_DRIVER_NVIDIA,
9704     AZX_DRIVER_TERA,
9705     + AZX_DRIVER_CTX,
9706     AZX_DRIVER_GENERIC,
9707     AZX_NUM_DRIVERS, /* keep this as last entry */
9708     };
9709     @@ -473,6 +474,7 @@ static char *driver_short_names[] __devinitdata = {
9710     [AZX_DRIVER_ULI] = "HDA ULI M5461",
9711     [AZX_DRIVER_NVIDIA] = "HDA NVidia",
9712     [AZX_DRIVER_TERA] = "HDA Teradici",
9713     + [AZX_DRIVER_CTX] = "HDA Creative",
9714     [AZX_DRIVER_GENERIC] = "HD-Audio Generic",
9715     };
9716    
9717     @@ -563,7 +565,10 @@ static void azx_init_cmd_io(struct azx *chip)
9718     /* reset the rirb hw write pointer */
9719     azx_writew(chip, RIRBWP, ICH6_RIRBWP_RST);
9720     /* set N=1, get RIRB response interrupt for new entry */
9721     - azx_writew(chip, RINTCNT, 1);
9722     + if (chip->driver_type == AZX_DRIVER_CTX)
9723     + azx_writew(chip, RINTCNT, 0xc0);
9724     + else
9725     + azx_writew(chip, RINTCNT, 1);
9726     /* enable rirb dma and response irq */
9727     azx_writeb(chip, RIRBCTL, ICH6_RBCTL_DMA_EN | ICH6_RBCTL_IRQ_EN);
9728     spin_unlock_irq(&chip->reg_lock);
9729     @@ -1136,8 +1141,11 @@ static irqreturn_t azx_interrupt(int irq, void *dev_id)
9730     /* clear rirb int */
9731     status = azx_readb(chip, RIRBSTS);
9732     if (status & RIRB_INT_MASK) {
9733     - if (status & RIRB_INT_RESPONSE)
9734     + if (status & RIRB_INT_RESPONSE) {
9735     + if (chip->driver_type == AZX_DRIVER_CTX)
9736     + udelay(80);
9737     azx_update_rirb(chip);
9738     + }
9739     azx_writeb(chip, RIRBSTS, RIRB_INT_MASK);
9740     }
9741    
9742     @@ -1647,7 +1655,7 @@ static int azx_pcm_prepare(struct snd_pcm_substream *substream)
9743     struct azx_dev *azx_dev = get_azx_dev(substream);
9744     struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
9745     struct snd_pcm_runtime *runtime = substream->runtime;
9746     - unsigned int bufsize, period_bytes, format_val;
9747     + unsigned int bufsize, period_bytes, format_val, stream_tag;
9748     int err;
9749    
9750     azx_stream_reset(chip, azx_dev);
9751     @@ -1689,7 +1697,12 @@ static int azx_pcm_prepare(struct snd_pcm_substream *substream)
9752     else
9753     azx_dev->fifo_size = 0;
9754    
9755     - return snd_hda_codec_prepare(apcm->codec, hinfo, azx_dev->stream_tag,
9756     + stream_tag = azx_dev->stream_tag;
9757     + /* CA-IBG chips need the playback stream starting from 1 */
9758     + if (chip->driver_type == AZX_DRIVER_CTX &&
9759     + stream_tag > chip->capture_streams)
9760     + stream_tag -= chip->capture_streams;
9761     + return snd_hda_codec_prepare(apcm->codec, hinfo, stream_tag,
9762     azx_dev->format_val, substream);
9763     }
9764    
9765     @@ -2794,10 +2807,10 @@ static DEFINE_PCI_DEVICE_TABLE(azx_ids) = {
9766     { PCI_DEVICE(PCI_VENDOR_ID_CREATIVE, PCI_ANY_ID),
9767     .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
9768     .class_mask = 0xffffff,
9769     - .driver_data = AZX_DRIVER_GENERIC },
9770     + .driver_data = AZX_DRIVER_CTX },
9771     #else
9772     /* this entry seems still valid -- i.e. without emu20kx chip */
9773     - { PCI_DEVICE(0x1102, 0x0009), .driver_data = AZX_DRIVER_GENERIC },
9774     + { PCI_DEVICE(0x1102, 0x0009), .driver_data = AZX_DRIVER_CTX },
9775     #endif
9776     /* AMD/ATI Generic, PCI class code and Vendor ID for HD Audio */
9777     { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_ANY_ID),
9778     diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c
9779     index 10bbbaf..0da636d 100644
9780     --- a/sound/pci/hda/patch_analog.c
9781     +++ b/sound/pci/hda/patch_analog.c
9782     @@ -1276,6 +1276,7 @@ static int patch_ad1986a(struct hda_codec *codec)
9783     spec->multiout.no_share_stream = 1;
9784    
9785     codec->no_trigger_sense = 1;
9786     + codec->no_sticky_stream = 1;
9787    
9788     return 0;
9789     }
9790     @@ -1463,6 +1464,7 @@ static int patch_ad1983(struct hda_codec *codec)
9791     codec->patch_ops = ad198x_patch_ops;
9792    
9793     codec->no_trigger_sense = 1;
9794     + codec->no_sticky_stream = 1;
9795    
9796     return 0;
9797     }
9798     @@ -1917,6 +1919,7 @@ static int patch_ad1981(struct hda_codec *codec)
9799     }
9800    
9801     codec->no_trigger_sense = 1;
9802     + codec->no_sticky_stream = 1;
9803    
9804     return 0;
9805     }
9806     @@ -3235,6 +3238,7 @@ static int patch_ad1988(struct hda_codec *codec)
9807     spec->vmaster_nid = 0x04;
9808    
9809     codec->no_trigger_sense = 1;
9810     + codec->no_sticky_stream = 1;
9811    
9812     return 0;
9813     }
9814     @@ -3449,6 +3453,7 @@ static int patch_ad1884(struct hda_codec *codec)
9815     codec->patch_ops = ad198x_patch_ops;
9816    
9817     codec->no_trigger_sense = 1;
9818     + codec->no_sticky_stream = 1;
9819    
9820     return 0;
9821     }
9822     @@ -4422,6 +4427,7 @@ static int patch_ad1884a(struct hda_codec *codec)
9823     }
9824    
9825     codec->no_trigger_sense = 1;
9826     + codec->no_sticky_stream = 1;
9827    
9828     return 0;
9829     }
9830     @@ -4761,6 +4767,7 @@ static int patch_ad1882(struct hda_codec *codec)
9831     }
9832    
9833     codec->no_trigger_sense = 1;
9834     + codec->no_sticky_stream = 1;
9835    
9836     return 0;
9837     }
9838     diff --git a/sound/pci/hda/patch_ca0110.c b/sound/pci/hda/patch_ca0110.c
9839     index af47801..9544463 100644
9840     --- a/sound/pci/hda/patch_ca0110.c
9841     +++ b/sound/pci/hda/patch_ca0110.c
9842     @@ -489,7 +489,7 @@ static void parse_digital(struct hda_codec *codec)
9843     if (cfg->dig_outs &&
9844     snd_hda_get_connections(codec, cfg->dig_out_pins[0],
9845     &spec->dig_out, 1) == 1)
9846     - spec->multiout.dig_out_nid = cfg->dig_out_pins[0];
9847     + spec->multiout.dig_out_nid = spec->dig_out;
9848     }
9849    
9850     static int ca0110_parse_auto_config(struct hda_codec *codec)
9851     diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c
9852     index 972e7c4..32ab7a6 100644
9853     --- a/sound/pci/hda/patch_conexant.c
9854     +++ b/sound/pci/hda/patch_conexant.c
9855     @@ -3092,6 +3092,7 @@ static struct snd_pci_quirk cxt5066_cfg_tbl[] = {
9856     SND_PCI_QUIRK(0x1028, 0x0402, "Dell Vostro", CXT5066_DELL_VOSTO),
9857     SND_PCI_QUIRK(0x1028, 0x0408, "Dell Inspiron One 19T", CXT5066_IDEAPAD),
9858     SND_PCI_QUIRK(0x103c, 0x360b, "HP G60", CXT5066_HP_LAPTOP),
9859     + SND_PCI_QUIRK(0x1043, 0x13f3, "Asus A52J", CXT5066_HP_LAPTOP),
9860     SND_PCI_QUIRK(0x1179, 0xff1e, "Toshiba Satellite C650D", CXT5066_IDEAPAD),
9861     SND_PCI_QUIRK(0x1179, 0xff50, "Toshiba Satellite P500-PSPGSC-01800T", CXT5066_OLPC_XO_1_5),
9862     SND_PCI_QUIRK(0x1179, 0xffe0, "Toshiba Satellite Pro T130-15F", CXT5066_OLPC_XO_1_5),
9863     diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
9864     index a432e6e..7262980 100644
9865     --- a/sound/pci/hda/patch_realtek.c
9866     +++ b/sound/pci/hda/patch_realtek.c
9867     @@ -1438,6 +1438,7 @@ do_sku:
9868     spec->init_amp = ALC_INIT_GPIO3;
9869     break;
9870     case 5:
9871     + default:
9872     spec->init_amp = ALC_INIT_DEFAULT;
9873     break;
9874     }
9875     @@ -9664,7 +9665,6 @@ static struct snd_pci_quirk alc882_cfg_tbl[] = {
9876     SND_PCI_QUIRK(0x17aa, 0x3bfc, "Lenovo NB0763", ALC883_LENOVO_NB0763),
9877     SND_PCI_QUIRK(0x17aa, 0x3bfd, "Lenovo NB0763", ALC883_LENOVO_NB0763),
9878     SND_PCI_QUIRK(0x17aa, 0x101d, "Lenovo Sky", ALC888_LENOVO_SKY),
9879     - SND_PCI_QUIRK(0x17c0, 0x4071, "MEDION MD2", ALC883_MEDION_MD2),
9880     SND_PCI_QUIRK(0x17c0, 0x4085, "MEDION MD96630", ALC888_LENOVO_MS7195_DIG),
9881     SND_PCI_QUIRK(0x17f2, 0x5000, "Albatron KI690-AM2", ALC883_6ST_DIG),
9882     SND_PCI_QUIRK(0x1991, 0x5625, "Haier W66", ALC883_HAIER_W66),
9883     @@ -16557,7 +16557,7 @@ static struct alc_config_preset alc861vd_presets[] = {
9884     static int alc861vd_auto_create_input_ctls(struct hda_codec *codec,
9885     const struct auto_pin_cfg *cfg)
9886     {
9887     - return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x09, 0);
9888     + return alc_auto_create_input_ctls(codec, cfg, 0x0b, 0x22, 0);
9889     }
9890    
9891    
9892     @@ -18612,6 +18612,8 @@ static inline hda_nid_t alc662_mix_to_dac(hda_nid_t nid)
9893     return 0x02;
9894     else if (nid >= 0x0c && nid <= 0x0e)
9895     return nid - 0x0c + 0x02;
9896     + else if (nid == 0x26) /* ALC887-VD has this DAC too */
9897     + return 0x25;
9898     else
9899     return 0;
9900     }
9901     @@ -18620,7 +18622,7 @@ static inline hda_nid_t alc662_mix_to_dac(hda_nid_t nid)
9902     static hda_nid_t alc662_dac_to_mix(struct hda_codec *codec, hda_nid_t pin,
9903     hda_nid_t dac)
9904     {
9905     - hda_nid_t mix[4];
9906     + hda_nid_t mix[5];
9907     int i, num;
9908    
9909     num = snd_hda_get_connections(codec, pin, mix, ARRAY_SIZE(mix));
9910     @@ -18935,6 +18937,36 @@ static void alc662_auto_init(struct hda_codec *codec)
9911     alc_inithook(codec);
9912     }
9913    
9914     +enum {
9915     + ALC662_FIXUP_ASPIRE,
9916     + ALC662_FIXUP_IDEAPAD,
9917     +};
9918     +
9919     +static const struct alc_fixup alc662_fixups[] = {
9920     + [ALC662_FIXUP_ASPIRE] = {
9921     + .pins = (const struct alc_pincfg[]) {
9922     + { 0x15, 0x99130112 }, /* subwoofer */
9923     + { }
9924     + }
9925     + },
9926     + [ALC662_FIXUP_IDEAPAD] = {
9927     + .pins = (const struct alc_pincfg[]) {
9928     + { 0x17, 0x99130112 }, /* subwoofer */
9929     + { }
9930     + }
9931     + },
9932     +};
9933     +
9934     +static struct snd_pci_quirk alc662_fixup_tbl[] = {
9935     + SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE),
9936     + SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD),
9937     + SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD),
9938     + SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD),
9939     + {}
9940     +};
9941     +
9942     +
9943     +
9944     static int patch_alc662(struct hda_codec *codec)
9945     {
9946     struct alc_spec *spec;
9947     @@ -18967,6 +18999,7 @@ static int patch_alc662(struct hda_codec *codec)
9948     }
9949    
9950     if (board_config == ALC662_AUTO) {
9951     + alc_pick_fixup(codec, alc662_fixup_tbl, alc662_fixups, 1);
9952     /* automatic parse from the BIOS config */
9953     err = alc662_parse_auto_config(codec);
9954     if (err < 0) {
9955     @@ -19025,8 +19058,11 @@ static int patch_alc662(struct hda_codec *codec)
9956     spec->vmaster_nid = 0x02;
9957    
9958     codec->patch_ops = alc_patch_ops;
9959     - if (board_config == ALC662_AUTO)
9960     + if (board_config == ALC662_AUTO) {
9961     spec->init_hook = alc662_auto_init;
9962     + alc_pick_fixup(codec, alc662_fixup_tbl, alc662_fixups, 0);
9963     + }
9964     +
9965     #ifdef CONFIG_SND_HDA_POWER_SAVE
9966     if (!spec->loopback.amplist)
9967     spec->loopback.amplist = alc662_loopbacks;
9968     @@ -19039,7 +19075,10 @@ static int patch_alc888(struct hda_codec *codec)
9969     {
9970     if ((alc_read_coef_idx(codec, 0) & 0x00f0)==0x0030){
9971     kfree(codec->chip_name);
9972     - codec->chip_name = kstrdup("ALC888-VD", GFP_KERNEL);
9973     + if (codec->vendor_id == 0x10ec0887)
9974     + codec->chip_name = kstrdup("ALC887-VD", GFP_KERNEL);
9975     + else
9976     + codec->chip_name = kstrdup("ALC888-VD", GFP_KERNEL);
9977     if (!codec->chip_name) {
9978     alc_free(codec);
9979     return -ENOMEM;
9980     @@ -19521,7 +19560,7 @@ static struct hda_codec_preset snd_hda_preset_realtek[] = {
9981     { .id = 0x10ec0885, .rev = 0x100103, .name = "ALC889A",
9982     .patch = patch_alc882 },
9983     { .id = 0x10ec0885, .name = "ALC885", .patch = patch_alc882 },
9984     - { .id = 0x10ec0887, .name = "ALC887", .patch = patch_alc882 },
9985     + { .id = 0x10ec0887, .name = "ALC887", .patch = patch_alc888 },
9986     { .id = 0x10ec0888, .rev = 0x100101, .name = "ALC1200",
9987     .patch = patch_alc882 },
9988     { .id = 0x10ec0888, .name = "ALC888", .patch = patch_alc888 },
9989     diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c
9990     index c16c5ba..78f1206 100644
9991     --- a/sound/pci/hda/patch_sigmatel.c
9992     +++ b/sound/pci/hda/patch_sigmatel.c
9993     @@ -93,6 +93,7 @@ enum {
9994     STAC_92HD83XXX_REF,
9995     STAC_92HD83XXX_PWR_REF,
9996     STAC_DELL_S14,
9997     + STAC_DELL_E6410,
9998     STAC_92HD83XXX_HP,
9999     STAC_HP_DV7_4000,
10000     STAC_92HD83XXX_MODELS
10001     @@ -1618,6 +1619,8 @@ static struct snd_pci_quirk stac92hd73xx_cfg_tbl[] = {
10002     static struct snd_pci_quirk stac92hd73xx_codec_id_cfg_tbl[] = {
10003     SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02a1,
10004     "Alienware M17x", STAC_ALIENWARE_M17X),
10005     + SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x043a,
10006     + "Alienware M17x", STAC_ALIENWARE_M17X),
10007     {} /* terminator */
10008     };
10009    
10010     @@ -1633,6 +1636,13 @@ static unsigned int dell_s14_pin_configs[10] = {
10011     0x40f000f0, 0x40f000f0,
10012     };
10013    
10014     +/* Deliberately turn off 0x0f (Dock Mic) to make it choose Int Mic instead */
10015     +static unsigned int dell_e6410_pin_configs[10] = {
10016     + 0x04a11020, 0x0421101f, 0x400000f0, 0x90170110,
10017     + 0x23011050, 0x40f000f0, 0x400000f0, 0x90a60130,
10018     + 0x40f000f0, 0x40f000f0,
10019     +};
10020     +
10021     static unsigned int hp_dv7_4000_pin_configs[10] = {
10022     0x03a12050, 0x0321201f, 0x40f000f0, 0x90170110,
10023     0x40f000f0, 0x40f000f0, 0x90170110, 0xd5a30140,
10024     @@ -1643,6 +1653,7 @@ static unsigned int *stac92hd83xxx_brd_tbl[STAC_92HD83XXX_MODELS] = {
10025     [STAC_92HD83XXX_REF] = ref92hd83xxx_pin_configs,
10026     [STAC_92HD83XXX_PWR_REF] = ref92hd83xxx_pin_configs,
10027     [STAC_DELL_S14] = dell_s14_pin_configs,
10028     + [STAC_DELL_E6410] = dell_e6410_pin_configs,
10029     [STAC_HP_DV7_4000] = hp_dv7_4000_pin_configs,
10030     };
10031    
10032     @@ -1651,6 +1662,7 @@ static const char *stac92hd83xxx_models[STAC_92HD83XXX_MODELS] = {
10033     [STAC_92HD83XXX_REF] = "ref",
10034     [STAC_92HD83XXX_PWR_REF] = "mic-ref",
10035     [STAC_DELL_S14] = "dell-s14",
10036     + [STAC_DELL_E6410] = "dell-e6410",
10037     [STAC_92HD83XXX_HP] = "hp",
10038     [STAC_HP_DV7_4000] = "hp-dv7-4000",
10039     };
10040     @@ -1663,6 +1675,10 @@ static struct snd_pci_quirk stac92hd83xxx_cfg_tbl[] = {
10041     "DFI LanParty", STAC_92HD83XXX_REF),
10042     SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02ba,
10043     "unknown Dell", STAC_DELL_S14),
10044     + SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x040a,
10045     + "Dell E6410", STAC_DELL_E6410),
10046     + SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x040b,
10047     + "Dell E6510", STAC_DELL_E6410),
10048     SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xff00, 0x3600,
10049     "HP", STAC_92HD83XXX_HP),
10050     {} /* terminator */
10051     diff --git a/sound/pci/intel8x0.c b/sound/pci/intel8x0.c
10052     index 4677492..ebfa1f8 100644
10053     --- a/sound/pci/intel8x0.c
10054     +++ b/sound/pci/intel8x0.c
10055     @@ -1866,6 +1866,12 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = {
10056     },
10057     {
10058     .subvendor = 0x1028,
10059     + .subdevice = 0x0182,
10060     + .name = "Dell Latitude D610", /* STAC9750/51 */
10061     + .type = AC97_TUNE_HP_ONLY
10062     + },
10063     + {
10064     + .subvendor = 0x1028,
10065     .subdevice = 0x0186,
10066     .name = "Dell Latitude D810", /* cf. Malone #41015 */
10067     .type = AC97_TUNE_HP_MUTE_LED
10068     diff --git a/sound/soc/codecs/wm8900.c b/sound/soc/codecs/wm8900.c
10069     index 5da17a7..4b8ffc2 100644
10070     --- a/sound/soc/codecs/wm8900.c
10071     +++ b/sound/soc/codecs/wm8900.c
10072     @@ -188,7 +188,6 @@ static int wm8900_volatile_register(unsigned int reg)
10073     {
10074     switch (reg) {
10075     case WM8900_REG_ID:
10076     - case WM8900_REG_POWER1:
10077     return 1;
10078     default:
10079     return 0;
10080     @@ -1236,11 +1235,6 @@ static __devinit int wm8900_i2c_probe(struct i2c_client *i2c,
10081     goto err;
10082     }
10083    
10084     - /* Read back from the chip */
10085     - reg = snd_soc_read(codec, WM8900_REG_POWER1);
10086     - reg = (reg >> 12) & 0xf;
10087     - dev_info(&i2c->dev, "WM8900 revision %d\n", reg);
10088     -
10089     wm8900_reset(codec);
10090    
10091     /* Turn the chip on */
10092     diff --git a/sound/soc/codecs/wm8961.c b/sound/soc/codecs/wm8961.c
10093     index 2549d3a..3bd65c8 100644
10094     --- a/sound/soc/codecs/wm8961.c
10095     +++ b/sound/soc/codecs/wm8961.c
10096     @@ -711,7 +711,7 @@ static int wm8961_hw_params(struct snd_pcm_substream *substream,
10097     if (fs <= 24000)
10098     reg |= WM8961_DACSLOPE;
10099     else
10100     - reg &= WM8961_DACSLOPE;
10101     + reg &= ~WM8961_DACSLOPE;
10102     snd_soc_write(codec, WM8961_ADC_DAC_CONTROL_2, reg);
10103    
10104     return 0;
10105     @@ -736,7 +736,7 @@ static int wm8961_set_sysclk(struct snd_soc_dai *dai, int clk_id,
10106     freq /= 2;
10107     } else {
10108     dev_dbg(codec->dev, "Using MCLK/1 for %dHz MCLK\n", freq);
10109     - reg &= WM8961_MCLKDIV;
10110     + reg &= ~WM8961_MCLKDIV;
10111     }
10112    
10113     snd_soc_write(codec, WM8961_CLOCKING1, reg);