Magellan Linux

Annotation of /trunk/kernel26-magellan/patches-2.6.33-r3/0104-2.6.33.5-all-fixes.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1055 - (hide annotations) (download)
Wed Jul 7 10:02:52 2010 UTC (13 years, 10 months ago) by niro
File size: 52581 byte(s)
2.6.33-magellan-r3; udpated to linux-2.6.33.6

1 niro 1055 diff --git a/Documentation/filesystems/proc.txt b/Documentation/filesystems/proc.txt
2     index 0d07513..bf241be 100644
3     --- a/Documentation/filesystems/proc.txt
4     +++ b/Documentation/filesystems/proc.txt
5     @@ -308,7 +308,7 @@ address perms offset dev inode pathname
6     08049000-0804a000 rw-p 00001000 03:00 8312 /opt/test
7     0804a000-0806b000 rw-p 00000000 00:00 0 [heap]
8     a7cb1000-a7cb2000 ---p 00000000 00:00 0
9     -a7cb2000-a7eb2000 rw-p 00000000 00:00 0 [threadstack:001ff4b4]
10     +a7cb2000-a7eb2000 rw-p 00000000 00:00 0
11     a7eb2000-a7eb3000 ---p 00000000 00:00 0
12     a7eb3000-a7ed5000 rw-p 00000000 00:00 0
13     a7ed5000-a8008000 r-xp 00000000 03:00 4222 /lib/libc.so.6
14     @@ -344,7 +344,6 @@ is not associated with a file:
15     [stack] = the stack of the main process
16     [vdso] = the "virtual dynamic shared object",
17     the kernel system call handler
18     - [threadstack:xxxxxxxx] = the stack of the thread, xxxxxxxx is the stack size
19    
20     or if empty, the mapping is anonymous.
21    
22     diff --git a/arch/powerpc/include/asm/hw_irq.h b/arch/powerpc/include/asm/hw_irq.h
23     index 9f4c9d4..bd100fc 100644
24     --- a/arch/powerpc/include/asm/hw_irq.h
25     +++ b/arch/powerpc/include/asm/hw_irq.h
26     @@ -130,43 +130,5 @@ static inline int irqs_disabled_flags(unsigned long flags)
27     */
28     struct irq_chip;
29    
30     -#ifdef CONFIG_PERF_EVENTS
31     -
32     -#ifdef CONFIG_PPC64
33     -static inline unsigned long test_perf_event_pending(void)
34     -{
35     - unsigned long x;
36     -
37     - asm volatile("lbz %0,%1(13)"
38     - : "=r" (x)
39     - : "i" (offsetof(struct paca_struct, perf_event_pending)));
40     - return x;
41     -}
42     -
43     -static inline void set_perf_event_pending(void)
44     -{
45     - asm volatile("stb %0,%1(13)" : :
46     - "r" (1),
47     - "i" (offsetof(struct paca_struct, perf_event_pending)));
48     -}
49     -
50     -static inline void clear_perf_event_pending(void)
51     -{
52     - asm volatile("stb %0,%1(13)" : :
53     - "r" (0),
54     - "i" (offsetof(struct paca_struct, perf_event_pending)));
55     -}
56     -#endif /* CONFIG_PPC64 */
57     -
58     -#else /* CONFIG_PERF_EVENTS */
59     -
60     -static inline unsigned long test_perf_event_pending(void)
61     -{
62     - return 0;
63     -}
64     -
65     -static inline void clear_perf_event_pending(void) {}
66     -#endif /* CONFIG_PERF_EVENTS */
67     -
68     #endif /* __KERNEL__ */
69     #endif /* _ASM_POWERPC_HW_IRQ_H */
70     diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c
71     index a6c2b63..11d0668 100644
72     --- a/arch/powerpc/kernel/asm-offsets.c
73     +++ b/arch/powerpc/kernel/asm-offsets.c
74     @@ -133,7 +133,6 @@ int main(void)
75     DEFINE(PACAKMSR, offsetof(struct paca_struct, kernel_msr));
76     DEFINE(PACASOFTIRQEN, offsetof(struct paca_struct, soft_enabled));
77     DEFINE(PACAHARDIRQEN, offsetof(struct paca_struct, hard_enabled));
78     - DEFINE(PACAPERFPEND, offsetof(struct paca_struct, perf_event_pending));
79     DEFINE(PACACONTEXTID, offsetof(struct paca_struct, context.id));
80     #ifdef CONFIG_PPC_MM_SLICES
81     DEFINE(PACALOWSLICESPSIZE, offsetof(struct paca_struct,
82     diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S
83     index bdcb557..afbf400 100644
84     --- a/arch/powerpc/kernel/entry_64.S
85     +++ b/arch/powerpc/kernel/entry_64.S
86     @@ -556,15 +556,6 @@ ALT_FW_FTR_SECTION_END_IFCLR(FW_FEATURE_ISERIES)
87     2:
88     TRACE_AND_RESTORE_IRQ(r5);
89    
90     -#ifdef CONFIG_PERF_EVENTS
91     - /* check paca->perf_event_pending if we're enabling ints */
92     - lbz r3,PACAPERFPEND(r13)
93     - and. r3,r3,r5
94     - beq 27f
95     - bl .perf_event_do_pending
96     -27:
97     -#endif /* CONFIG_PERF_EVENTS */
98     -
99     /* extract EE bit and use it to restore paca->hard_enabled */
100     ld r3,_MSR(r1)
101     rldicl r4,r3,49,63 /* r0 = (r3 >> 15) & 1 */
102     diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c
103     index 9040330..dee83b8 100644
104     --- a/arch/powerpc/kernel/irq.c
105     +++ b/arch/powerpc/kernel/irq.c
106     @@ -53,7 +53,6 @@
107     #include <linux/bootmem.h>
108     #include <linux/pci.h>
109     #include <linux/debugfs.h>
110     -#include <linux/perf_event.h>
111    
112     #include <asm/uaccess.h>
113     #include <asm/system.h>
114     @@ -143,11 +142,6 @@ notrace void raw_local_irq_restore(unsigned long en)
115     }
116     #endif /* CONFIG_PPC_STD_MMU_64 */
117    
118     - if (test_perf_event_pending()) {
119     - clear_perf_event_pending();
120     - perf_event_do_pending();
121     - }
122     -
123     /*
124     * if (get_paca()->hard_enabled) return;
125     * But again we need to take care that gcc gets hard_enabled directly
126     diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c
127     index 6c6093d..6f174e7 100644
128     --- a/arch/powerpc/kernel/time.c
129     +++ b/arch/powerpc/kernel/time.c
130     @@ -532,25 +532,60 @@ void __init iSeries_time_init_early(void)
131     }
132     #endif /* CONFIG_PPC_ISERIES */
133    
134     -#if defined(CONFIG_PERF_EVENTS) && defined(CONFIG_PPC32)
135     -DEFINE_PER_CPU(u8, perf_event_pending);
136     +#ifdef CONFIG_PERF_EVENTS
137    
138     -void set_perf_event_pending(void)
139     +/*
140     + * 64-bit uses a byte in the PACA, 32-bit uses a per-cpu variable...
141     + */
142     +#ifdef CONFIG_PPC64
143     +static inline unsigned long test_perf_event_pending(void)
144     {
145     - get_cpu_var(perf_event_pending) = 1;
146     - set_dec(1);
147     - put_cpu_var(perf_event_pending);
148     + unsigned long x;
149     +
150     + asm volatile("lbz %0,%1(13)"
151     + : "=r" (x)
152     + : "i" (offsetof(struct paca_struct, perf_event_pending)));
153     + return x;
154     }
155    
156     +static inline void set_perf_event_pending_flag(void)
157     +{
158     + asm volatile("stb %0,%1(13)" : :
159     + "r" (1),
160     + "i" (offsetof(struct paca_struct, perf_event_pending)));
161     +}
162     +
163     +static inline void clear_perf_event_pending(void)
164     +{
165     + asm volatile("stb %0,%1(13)" : :
166     + "r" (0),
167     + "i" (offsetof(struct paca_struct, perf_event_pending)));
168     +}
169     +
170     +#else /* 32-bit */
171     +
172     +DEFINE_PER_CPU(u8, perf_event_pending);
173     +
174     +#define set_perf_event_pending_flag() __get_cpu_var(perf_event_pending) = 1
175     #define test_perf_event_pending() __get_cpu_var(perf_event_pending)
176     #define clear_perf_event_pending() __get_cpu_var(perf_event_pending) = 0
177    
178     -#else /* CONFIG_PERF_EVENTS && CONFIG_PPC32 */
179     +#endif /* 32 vs 64 bit */
180     +
181     +void set_perf_event_pending(void)
182     +{
183     + preempt_disable();
184     + set_perf_event_pending_flag();
185     + set_dec(1);
186     + preempt_enable();
187     +}
188     +
189     +#else /* CONFIG_PERF_EVENTS */
190    
191     #define test_perf_event_pending() 0
192     #define clear_perf_event_pending()
193    
194     -#endif /* CONFIG_PERF_EVENTS && CONFIG_PPC32 */
195     +#endif /* CONFIG_PERF_EVENTS */
196    
197     /*
198     * For iSeries shared processors, we have to let the hypervisor
199     @@ -580,10 +615,6 @@ void timer_interrupt(struct pt_regs * regs)
200     set_dec(DECREMENTER_MAX);
201    
202     #ifdef CONFIG_PPC32
203     - if (test_perf_event_pending()) {
204     - clear_perf_event_pending();
205     - perf_event_do_pending();
206     - }
207     if (atomic_read(&ppc_n_lost_interrupts) != 0)
208     do_IRQ(regs);
209     #endif
210     @@ -602,6 +633,11 @@ void timer_interrupt(struct pt_regs * regs)
211    
212     calculate_steal_time();
213    
214     + if (test_perf_event_pending()) {
215     + clear_perf_event_pending();
216     + perf_event_do_pending();
217     + }
218     +
219     #ifdef CONFIG_PPC_ISERIES
220     if (firmware_has_feature(FW_FEATURE_ISERIES))
221     get_lppaca()->int_dword.fields.decr_int = 0;
222     diff --git a/arch/s390/kernel/ptrace.c b/arch/s390/kernel/ptrace.c
223     index 7cf4642..11e94de 100644
224     --- a/arch/s390/kernel/ptrace.c
225     +++ b/arch/s390/kernel/ptrace.c
226     @@ -640,7 +640,7 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
227    
228     asmlinkage long do_syscall_trace_enter(struct pt_regs *regs)
229     {
230     - long ret;
231     + long ret = 0;
232    
233     /* Do the secure computing check first. */
234     secure_computing(regs->gprs[2]);
235     @@ -649,7 +649,6 @@ asmlinkage long do_syscall_trace_enter(struct pt_regs *regs)
236     * The sysc_tracesys code in entry.S stored the system
237     * call number to gprs[2].
238     */
239     - ret = regs->gprs[2];
240     if (test_thread_flag(TIF_SYSCALL_TRACE) &&
241     (tracehook_report_syscall_entry(regs) ||
242     regs->gprs[2] >= NR_syscalls)) {
243     @@ -671,7 +670,7 @@ asmlinkage long do_syscall_trace_enter(struct pt_regs *regs)
244     regs->gprs[2], regs->orig_gpr2,
245     regs->gprs[3], regs->gprs[4],
246     regs->gprs[5]);
247     - return ret;
248     + return ret ?: regs->gprs[2];
249     }
250    
251     asmlinkage void do_syscall_trace_exit(struct pt_regs *regs)
252     diff --git a/arch/x86/include/asm/k8.h b/arch/x86/include/asm/k8.h
253     index f70e600..af00bd1 100644
254     --- a/arch/x86/include/asm/k8.h
255     +++ b/arch/x86/include/asm/k8.h
256     @@ -16,11 +16,16 @@ extern int k8_numa_init(unsigned long start_pfn, unsigned long end_pfn);
257     extern int k8_scan_nodes(void);
258    
259     #ifdef CONFIG_K8_NB
260     +extern int num_k8_northbridges;
261     +
262     static inline struct pci_dev *node_to_k8_nb_misc(int node)
263     {
264     return (node < num_k8_northbridges) ? k8_northbridges[node] : NULL;
265     }
266     +
267     #else
268     +#define num_k8_northbridges 0
269     +
270     static inline struct pci_dev *node_to_k8_nb_misc(int node)
271     {
272     return NULL;
273     diff --git a/arch/x86/kernel/cpu/intel_cacheinfo.c b/arch/x86/kernel/cpu/intel_cacheinfo.c
274     index d440123..581924b 100644
275     --- a/arch/x86/kernel/cpu/intel_cacheinfo.c
276     +++ b/arch/x86/kernel/cpu/intel_cacheinfo.c
277     @@ -338,6 +338,10 @@ amd_check_l3_disable(int index, struct _cpuid4_info_regs *this_leaf)
278     (boot_cpu_data.x86_mask < 0x1)))
279     return;
280    
281     + /* not in virtualized environments */
282     + if (num_k8_northbridges == 0)
283     + return;
284     +
285     this_leaf->can_disable = true;
286     this_leaf->l3_indices = amd_calc_l3_indices();
287     }
288     diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c
289     index 999c8a6..0571b72 100644
290     --- a/arch/x86/kernel/process.c
291     +++ b/arch/x86/kernel/process.c
292     @@ -539,11 +539,13 @@ static int __cpuinit check_c1e_idle(const struct cpuinfo_x86 *c)
293     * check OSVW bit for CPUs that are not affected
294     * by erratum #400
295     */
296     - rdmsrl(MSR_AMD64_OSVW_ID_LENGTH, val);
297     - if (val >= 2) {
298     - rdmsrl(MSR_AMD64_OSVW_STATUS, val);
299     - if (!(val & BIT(1)))
300     - goto no_c1e_idle;
301     + if (cpu_has(c, X86_FEATURE_OSVW)) {
302     + rdmsrl(MSR_AMD64_OSVW_ID_LENGTH, val);
303     + if (val >= 2) {
304     + rdmsrl(MSR_AMD64_OSVW_STATUS, val);
305     + if (!(val & BIT(1)))
306     + goto no_c1e_idle;
307     + }
308     }
309     return 1;
310     }
311     diff --git a/crypto/authenc.c b/crypto/authenc.c
312     index 4d6f49a..0d54de9 100644
313     --- a/crypto/authenc.c
314     +++ b/crypto/authenc.c
315     @@ -46,6 +46,12 @@ struct authenc_request_ctx {
316     char tail[];
317     };
318    
319     +static void authenc_request_complete(struct aead_request *req, int err)
320     +{
321     + if (err != -EINPROGRESS)
322     + aead_request_complete(req, err);
323     +}
324     +
325     static int crypto_authenc_setkey(struct crypto_aead *authenc, const u8 *key,
326     unsigned int keylen)
327     {
328     @@ -142,7 +148,7 @@ static void authenc_geniv_ahash_update_done(struct crypto_async_request *areq,
329     crypto_aead_authsize(authenc), 1);
330    
331     out:
332     - aead_request_complete(req, err);
333     + authenc_request_complete(req, err);
334     }
335    
336     static void authenc_geniv_ahash_done(struct crypto_async_request *areq, int err)
337     @@ -208,7 +214,7 @@ static void authenc_verify_ahash_update_done(struct crypto_async_request *areq,
338     err = crypto_ablkcipher_decrypt(abreq);
339    
340     out:
341     - aead_request_complete(req, err);
342     + authenc_request_complete(req, err);
343     }
344    
345     static void authenc_verify_ahash_done(struct crypto_async_request *areq,
346     @@ -245,7 +251,7 @@ static void authenc_verify_ahash_done(struct crypto_async_request *areq,
347     err = crypto_ablkcipher_decrypt(abreq);
348    
349     out:
350     - aead_request_complete(req, err);
351     + authenc_request_complete(req, err);
352     }
353    
354     static u8 *crypto_authenc_ahash_fb(struct aead_request *req, unsigned int flags)
355     @@ -379,7 +385,7 @@ static void crypto_authenc_encrypt_done(struct crypto_async_request *req,
356     err = crypto_authenc_genicv(areq, iv, 0);
357     }
358    
359     - aead_request_complete(areq, err);
360     + authenc_request_complete(areq, err);
361     }
362    
363     static int crypto_authenc_encrypt(struct aead_request *req)
364     @@ -418,7 +424,7 @@ static void crypto_authenc_givencrypt_done(struct crypto_async_request *req,
365     err = crypto_authenc_genicv(areq, greq->giv, 0);
366     }
367    
368     - aead_request_complete(areq, err);
369     + authenc_request_complete(areq, err);
370     }
371    
372     static int crypto_authenc_givencrypt(struct aead_givcrypt_request *req)
373     diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c
374     index 7c85265..9ed9292 100644
375     --- a/drivers/acpi/sleep.c
376     +++ b/drivers/acpi/sleep.c
377     @@ -475,101 +475,13 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = {
378     },
379     {
380     .callback = init_set_sci_en_on_resume,
381     - .ident = "Lenovo ThinkPad X201",
382     + .ident = "Lenovo ThinkPad X201[s]",
383     .matches = {
384     DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
385     DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201"),
386     },
387     },
388     {
389     - .callback = init_set_sci_en_on_resume,
390     - .ident = "Lenovo ThinkPad X201",
391     - .matches = {
392     - DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
393     - DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201s"),
394     - },
395     - },
396     - {
397     - .callback = init_set_sci_en_on_resume,
398     - .ident = "Lenovo ThinkPad T410",
399     - .matches = {
400     - DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
401     - DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T410"),
402     - },
403     - },
404     - {
405     - .callback = init_set_sci_en_on_resume,
406     - .ident = "Lenovo ThinkPad T510",
407     - .matches = {
408     - DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
409     - DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T510"),
410     - },
411     - },
412     - {
413     - .callback = init_set_sci_en_on_resume,
414     - .ident = "Lenovo ThinkPad W510",
415     - .matches = {
416     - DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
417     - DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad W510"),
418     - },
419     - },
420     - {
421     - .callback = init_set_sci_en_on_resume,
422     - .ident = "Lenovo ThinkPad X201",
423     - .matches = {
424     - DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
425     - DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201"),
426     - },
427     - },
428     - {
429     - .callback = init_set_sci_en_on_resume,
430     - .ident = "Lenovo ThinkPad X201",
431     - .matches = {
432     - DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
433     - DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201s"),
434     - },
435     - },
436     - {
437     - .callback = init_set_sci_en_on_resume,
438     - .ident = "Lenovo ThinkPad T410",
439     - .matches = {
440     - DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
441     - DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T410"),
442     - },
443     - },
444     - {
445     - .callback = init_set_sci_en_on_resume,
446     - .ident = "Lenovo ThinkPad T510",
447     - .matches = {
448     - DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
449     - DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T510"),
450     - },
451     - },
452     - {
453     - .callback = init_set_sci_en_on_resume,
454     - .ident = "Lenovo ThinkPad W510",
455     - .matches = {
456     - DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
457     - DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad W510"),
458     - },
459     - },
460     - {
461     - .callback = init_set_sci_en_on_resume,
462     - .ident = "Lenovo ThinkPad X201",
463     - .matches = {
464     - DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
465     - DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201"),
466     - },
467     - },
468     - {
469     - .callback = init_set_sci_en_on_resume,
470     - .ident = "Lenovo ThinkPad X201",
471     - .matches = {
472     - DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
473     - DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201s"),
474     - },
475     - },
476     - {
477     .callback = init_old_suspend_ordering,
478     .ident = "Panasonic CF51-2L",
479     .matches = {
480     diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c
481     index 76253cf..9af6766 100644
482     --- a/drivers/char/tty_io.c
483     +++ b/drivers/char/tty_io.c
484     @@ -1875,6 +1875,7 @@ got_driver:
485     */
486     if (filp->f_op == &hung_up_tty_fops)
487     filp->f_op = &tty_fops;
488     + unlock_kernel();
489     goto retry_open;
490     }
491     unlock_kernel();
492     diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
493     index cf4cb3e..4746bfe 100644
494     --- a/drivers/gpu/drm/i915/i915_drv.c
495     +++ b/drivers/gpu/drm/i915/i915_drv.c
496     @@ -79,14 +79,14 @@ const static struct intel_device_info intel_i915g_info = {
497     .is_i915g = 1, .is_i9xx = 1, .cursor_needs_physical = 1,
498     };
499     const static struct intel_device_info intel_i915gm_info = {
500     - .is_i9xx = 1, .is_mobile = 1, .has_fbc = 1,
501     + .is_i9xx = 1, .is_mobile = 1,
502     .cursor_needs_physical = 1,
503     };
504     const static struct intel_device_info intel_i945g_info = {
505     .is_i9xx = 1, .has_hotplug = 1, .cursor_needs_physical = 1,
506     };
507     const static struct intel_device_info intel_i945gm_info = {
508     - .is_i945gm = 1, .is_i9xx = 1, .is_mobile = 1, .has_fbc = 1,
509     + .is_i945gm = 1, .is_i9xx = 1, .is_mobile = 1,
510     .has_hotplug = 1, .cursor_needs_physical = 1,
511     };
512    
513     diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
514     index 16ce3ba..0b33757 100644
515     --- a/drivers/gpu/drm/i915/i915_drv.h
516     +++ b/drivers/gpu/drm/i915/i915_drv.h
517     @@ -206,11 +206,14 @@ typedef struct drm_i915_private {
518    
519     drm_dma_handle_t *status_page_dmah;
520     void *hw_status_page;
521     + void *seqno_page;
522     dma_addr_t dma_status_page;
523     uint32_t counter;
524     unsigned int status_gfx_addr;
525     + unsigned int seqno_gfx_addr;
526     drm_local_map_t hws_map;
527     struct drm_gem_object *hws_obj;
528     + struct drm_gem_object *seqno_obj;
529     struct drm_gem_object *pwrctx;
530    
531     struct resource mch_res;
532     @@ -1090,6 +1093,7 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);
533    
534     #define HAS_PCH_SPLIT(dev) (IS_IRONLAKE(dev) || \
535     IS_GEN6(dev))
536     +#define HAS_PIPE_CONTROL(dev) (IS_IRONLAKE(dev) || IS_GEN6(dev))
537    
538     #define PRIMARY_RINGBUFFER_SIZE (128*1024)
539    
540     diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
541     index 6458400..c00c978 100644
542     --- a/drivers/gpu/drm/i915/i915_gem.c
543     +++ b/drivers/gpu/drm/i915/i915_gem.c
544     @@ -1559,6 +1559,13 @@ i915_gem_object_move_to_inactive(struct drm_gem_object *obj)
545     i915_verify_inactive(dev, __FILE__, __LINE__);
546     }
547    
548     +#define PIPE_CONTROL_FLUSH(addr) \
549     + OUT_RING(GFX_OP_PIPE_CONTROL | PIPE_CONTROL_QW_WRITE | \
550     + PIPE_CONTROL_DEPTH_STALL); \
551     + OUT_RING(addr | PIPE_CONTROL_GLOBAL_GTT); \
552     + OUT_RING(0); \
553     + OUT_RING(0); \
554     +
555     /**
556     * Creates a new sequence number, emitting a write of it to the status page
557     * plus an interrupt, which will trigger i915_user_interrupt_handler.
558     @@ -1593,13 +1600,47 @@ i915_add_request(struct drm_device *dev, struct drm_file *file_priv,
559     if (dev_priv->mm.next_gem_seqno == 0)
560     dev_priv->mm.next_gem_seqno++;
561    
562     - BEGIN_LP_RING(4);
563     - OUT_RING(MI_STORE_DWORD_INDEX);
564     - OUT_RING(I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
565     - OUT_RING(seqno);
566     + if (HAS_PIPE_CONTROL(dev)) {
567     + u32 scratch_addr = dev_priv->seqno_gfx_addr + 128;
568    
569     - OUT_RING(MI_USER_INTERRUPT);
570     - ADVANCE_LP_RING();
571     + /*
572     + * Workaround qword write incoherence by flushing the
573     + * PIPE_NOTIFY buffers out to memory before requesting
574     + * an interrupt.
575     + */
576     + BEGIN_LP_RING(32);
577     + OUT_RING(GFX_OP_PIPE_CONTROL | PIPE_CONTROL_QW_WRITE |
578     + PIPE_CONTROL_WC_FLUSH | PIPE_CONTROL_TC_FLUSH);
579     + OUT_RING(dev_priv->seqno_gfx_addr | PIPE_CONTROL_GLOBAL_GTT);
580     + OUT_RING(seqno);
581     + OUT_RING(0);
582     + PIPE_CONTROL_FLUSH(scratch_addr);
583     + scratch_addr += 128; /* write to separate cachelines */
584     + PIPE_CONTROL_FLUSH(scratch_addr);
585     + scratch_addr += 128;
586     + PIPE_CONTROL_FLUSH(scratch_addr);
587     + scratch_addr += 128;
588     + PIPE_CONTROL_FLUSH(scratch_addr);
589     + scratch_addr += 128;
590     + PIPE_CONTROL_FLUSH(scratch_addr);
591     + scratch_addr += 128;
592     + PIPE_CONTROL_FLUSH(scratch_addr);
593     + OUT_RING(GFX_OP_PIPE_CONTROL | PIPE_CONTROL_QW_WRITE |
594     + PIPE_CONTROL_WC_FLUSH | PIPE_CONTROL_TC_FLUSH |
595     + PIPE_CONTROL_NOTIFY);
596     + OUT_RING(dev_priv->seqno_gfx_addr | PIPE_CONTROL_GLOBAL_GTT);
597     + OUT_RING(seqno);
598     + OUT_RING(0);
599     + ADVANCE_LP_RING();
600     + } else {
601     + BEGIN_LP_RING(4);
602     + OUT_RING(MI_STORE_DWORD_INDEX);
603     + OUT_RING(I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
604     + OUT_RING(seqno);
605     +
606     + OUT_RING(MI_USER_INTERRUPT);
607     + ADVANCE_LP_RING();
608     + }
609    
610     DRM_DEBUG_DRIVER("%d\n", seqno);
611    
612     @@ -1744,7 +1785,10 @@ i915_get_gem_seqno(struct drm_device *dev)
613     {
614     drm_i915_private_t *dev_priv = dev->dev_private;
615    
616     - return READ_HWSP(dev_priv, I915_GEM_HWS_INDEX);
617     + if (HAS_PIPE_CONTROL(dev))
618     + return ((volatile u32 *)(dev_priv->seqno_page))[0];
619     + else
620     + return READ_HWSP(dev_priv, I915_GEM_HWS_INDEX);
621     }
622    
623     /**
624     @@ -4576,6 +4620,49 @@ i915_gem_idle(struct drm_device *dev)
625     return 0;
626     }
627    
628     +/*
629     + * 965+ support PIPE_CONTROL commands, which provide finer grained control
630     + * over cache flushing.
631     + */
632     +static int
633     +i915_gem_init_pipe_control(struct drm_device *dev)
634     +{
635     + drm_i915_private_t *dev_priv = dev->dev_private;
636     + struct drm_gem_object *obj;
637     + struct drm_i915_gem_object *obj_priv;
638     + int ret;
639     +
640     + obj = drm_gem_object_alloc(dev, 4096);
641     + if (obj == NULL) {
642     + DRM_ERROR("Failed to allocate seqno page\n");
643     + ret = -ENOMEM;
644     + goto err;
645     + }
646     + obj_priv = obj->driver_private;
647     + obj_priv->agp_type = AGP_USER_CACHED_MEMORY;
648     +
649     + ret = i915_gem_object_pin(obj, 4096);
650     + if (ret)
651     + goto err_unref;
652     +
653     + dev_priv->seqno_gfx_addr = obj_priv->gtt_offset;
654     + dev_priv->seqno_page = kmap(obj_priv->pages[0]);
655     + if (dev_priv->seqno_page == NULL)
656     + goto err_unpin;
657     +
658     + dev_priv->seqno_obj = obj;
659     + memset(dev_priv->seqno_page, 0, PAGE_SIZE);
660     +
661     + return 0;
662     +
663     +err_unpin:
664     + i915_gem_object_unpin(obj);
665     +err_unref:
666     + drm_gem_object_unreference(obj);
667     +err:
668     + return ret;
669     +}
670     +
671     static int
672     i915_gem_init_hws(struct drm_device *dev)
673     {
674     @@ -4593,7 +4680,8 @@ i915_gem_init_hws(struct drm_device *dev)
675     obj = drm_gem_object_alloc(dev, 4096);
676     if (obj == NULL) {
677     DRM_ERROR("Failed to allocate status page\n");
678     - return -ENOMEM;
679     + ret = -ENOMEM;
680     + goto err;
681     }
682     obj_priv = obj->driver_private;
683     obj_priv->agp_type = AGP_USER_CACHED_MEMORY;
684     @@ -4601,7 +4689,7 @@ i915_gem_init_hws(struct drm_device *dev)
685     ret = i915_gem_object_pin(obj, 4096);
686     if (ret != 0) {
687     drm_gem_object_unreference(obj);
688     - return ret;
689     + goto err_unref;
690     }
691    
692     dev_priv->status_gfx_addr = obj_priv->gtt_offset;
693     @@ -4610,10 +4698,16 @@ i915_gem_init_hws(struct drm_device *dev)
694     if (dev_priv->hw_status_page == NULL) {
695     DRM_ERROR("Failed to map status page.\n");
696     memset(&dev_priv->hws_map, 0, sizeof(dev_priv->hws_map));
697     - i915_gem_object_unpin(obj);
698     - drm_gem_object_unreference(obj);
699     - return -EINVAL;
700     + ret = -EINVAL;
701     + goto err_unpin;
702     }
703     +
704     + if (HAS_PIPE_CONTROL(dev)) {
705     + ret = i915_gem_init_pipe_control(dev);
706     + if (ret)
707     + goto err_unpin;
708     + }
709     +
710     dev_priv->hws_obj = obj;
711     memset(dev_priv->hw_status_page, 0, PAGE_SIZE);
712     I915_WRITE(HWS_PGA, dev_priv->status_gfx_addr);
713     @@ -4621,6 +4715,30 @@ i915_gem_init_hws(struct drm_device *dev)
714     DRM_DEBUG_DRIVER("hws offset: 0x%08x\n", dev_priv->status_gfx_addr);
715    
716     return 0;
717     +
718     +err_unpin:
719     + i915_gem_object_unpin(obj);
720     +err_unref:
721     + drm_gem_object_unreference(obj);
722     +err:
723     + return 0;
724     +}
725     +
726     +static void
727     +i915_gem_cleanup_pipe_control(struct drm_device *dev)
728     +{
729     + drm_i915_private_t *dev_priv = dev->dev_private;
730     + struct drm_gem_object *obj;
731     + struct drm_i915_gem_object *obj_priv;
732     +
733     + obj = dev_priv->seqno_obj;
734     + obj_priv = obj->driver_private;
735     + kunmap(obj_priv->pages[0]);
736     + i915_gem_object_unpin(obj);
737     + drm_gem_object_unreference(obj);
738     + dev_priv->seqno_obj = NULL;
739     +
740     + dev_priv->seqno_page = NULL;
741     }
742    
743     static void
744     @@ -4644,6 +4762,9 @@ i915_gem_cleanup_hws(struct drm_device *dev)
745     memset(&dev_priv->hws_map, 0, sizeof(dev_priv->hws_map));
746     dev_priv->hw_status_page = NULL;
747    
748     + if (HAS_PIPE_CONTROL(dev))
749     + i915_gem_cleanup_pipe_control(dev);
750     +
751     /* Write high address into HWS_PGA when disabling. */
752     I915_WRITE(HWS_PGA, 0x1ffff000);
753     }
754     diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
755     index 032f667..d6466d5 100644
756     --- a/drivers/gpu/drm/i915/i915_irq.c
757     +++ b/drivers/gpu/drm/i915/i915_irq.c
758     @@ -297,7 +297,7 @@ irqreturn_t ironlake_irq_handler(struct drm_device *dev)
759     READ_BREADCRUMB(dev_priv);
760     }
761    
762     - if (gt_iir & GT_USER_INTERRUPT) {
763     + if (gt_iir & GT_PIPE_NOTIFY) {
764     u32 seqno = i915_get_gem_seqno(dev);
765     dev_priv->mm.irq_gem_seqno = seqno;
766     trace_i915_gem_request_complete(dev, seqno);
767     @@ -738,7 +738,7 @@ void i915_user_irq_get(struct drm_device *dev)
768     spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags);
769     if (dev->irq_enabled && (++dev_priv->user_irq_refcount == 1)) {
770     if (HAS_PCH_SPLIT(dev))
771     - ironlake_enable_graphics_irq(dev_priv, GT_USER_INTERRUPT);
772     + ironlake_enable_graphics_irq(dev_priv, GT_PIPE_NOTIFY);
773     else
774     i915_enable_irq(dev_priv, I915_USER_INTERRUPT);
775     }
776     @@ -754,7 +754,7 @@ void i915_user_irq_put(struct drm_device *dev)
777     BUG_ON(dev->irq_enabled && dev_priv->user_irq_refcount <= 0);
778     if (dev->irq_enabled && (--dev_priv->user_irq_refcount == 0)) {
779     if (HAS_PCH_SPLIT(dev))
780     - ironlake_disable_graphics_irq(dev_priv, GT_USER_INTERRUPT);
781     + ironlake_disable_graphics_irq(dev_priv, GT_PIPE_NOTIFY);
782     else
783     i915_disable_irq(dev_priv, I915_USER_INTERRUPT);
784     }
785     @@ -1034,7 +1034,7 @@ static int ironlake_irq_postinstall(struct drm_device *dev)
786     /* enable kind of interrupts always enabled */
787     u32 display_mask = DE_MASTER_IRQ_CONTROL | DE_GSE | DE_PCH_EVENT |
788     DE_PLANEA_FLIP_DONE | DE_PLANEB_FLIP_DONE;
789     - u32 render_mask = GT_USER_INTERRUPT;
790     + u32 render_mask = GT_PIPE_NOTIFY;
791     u32 hotplug_mask = SDE_CRT_HOTPLUG | SDE_PORTB_HOTPLUG |
792     SDE_PORTC_HOTPLUG | SDE_PORTD_HOTPLUG;
793    
794     diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
795     index fd95bdf..30a2322 100644
796     --- a/drivers/gpu/drm/i915/i915_reg.h
797     +++ b/drivers/gpu/drm/i915/i915_reg.h
798     @@ -210,6 +210,16 @@
799     #define ASYNC_FLIP (1<<22)
800     #define DISPLAY_PLANE_A (0<<20)
801     #define DISPLAY_PLANE_B (1<<20)
802     +#define GFX_OP_PIPE_CONTROL ((0x3<<29)|(0x3<<27)|(0x2<<24)|2)
803     +#define PIPE_CONTROL_QW_WRITE (1<<14)
804     +#define PIPE_CONTROL_DEPTH_STALL (1<<13)
805     +#define PIPE_CONTROL_WC_FLUSH (1<<12)
806     +#define PIPE_CONTROL_IS_FLUSH (1<<11) /* MBZ on Ironlake */
807     +#define PIPE_CONTROL_TC_FLUSH (1<<10) /* GM45+ only */
808     +#define PIPE_CONTROL_ISP_DIS (1<<9)
809     +#define PIPE_CONTROL_NOTIFY (1<<8)
810     +#define PIPE_CONTROL_GLOBAL_GTT (1<<2) /* in addr dword */
811     +#define PIPE_CONTROL_STALL_EN (1<<1) /* in addr word, Ironlake+ only */
812    
813     /*
814     * Fence registers
815     @@ -2111,6 +2121,7 @@
816     #define DEIER 0x4400c
817    
818     /* GT interrupt */
819     +#define GT_PIPE_NOTIFY (1 << 4)
820     #define GT_SYNC_STATUS (1 << 2)
821     #define GT_USER_INTERRUPT (1 << 0)
822    
823     diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
824     index 4b2458d..3f00902 100644
825     --- a/drivers/gpu/drm/i915/intel_display.c
826     +++ b/drivers/gpu/drm/i915/intel_display.c
827     @@ -4683,7 +4683,7 @@ static void intel_init_display(struct drm_device *dev)
828     dev_priv->display.fbc_enabled = g4x_fbc_enabled;
829     dev_priv->display.enable_fbc = g4x_enable_fbc;
830     dev_priv->display.disable_fbc = g4x_disable_fbc;
831     - } else if (IS_I965GM(dev) || IS_I945GM(dev) || IS_I915GM(dev)) {
832     + } else if (IS_I965GM(dev)) {
833     dev_priv->display.fbc_enabled = i8xx_fbc_enabled;
834     dev_priv->display.enable_fbc = i8xx_enable_fbc;
835     dev_priv->display.disable_fbc = i8xx_disable_fbc;
836     diff --git a/drivers/hwmon/hp_accel.c b/drivers/hwmon/hp_accel.c
837     index be475e8..f16d60f 100644
838     --- a/drivers/hwmon/hp_accel.c
839     +++ b/drivers/hwmon/hp_accel.c
840     @@ -324,8 +324,8 @@ static int lis3lv02d_remove(struct acpi_device *device, int type)
841     lis3lv02d_joystick_disable();
842     lis3lv02d_poweroff(&lis3_dev);
843    
844     - flush_work(&hpled_led.work);
845     led_classdev_unregister(&hpled_led.led_classdev);
846     + flush_work(&hpled_led.work);
847    
848     return lis3lv02d_remove_fs(&lis3_dev);
849     }
850     diff --git a/drivers/mmc/host/atmel-mci.c b/drivers/mmc/host/atmel-mci.c
851     index 8072128..ee337df 100644
852     --- a/drivers/mmc/host/atmel-mci.c
853     +++ b/drivers/mmc/host/atmel-mci.c
854     @@ -568,9 +568,10 @@ static void atmci_dma_cleanup(struct atmel_mci *host)
855     {
856     struct mmc_data *data = host->data;
857    
858     - dma_unmap_sg(&host->pdev->dev, data->sg, data->sg_len,
859     - ((data->flags & MMC_DATA_WRITE)
860     - ? DMA_TO_DEVICE : DMA_FROM_DEVICE));
861     + if (data)
862     + dma_unmap_sg(&host->pdev->dev, data->sg, data->sg_len,
863     + ((data->flags & MMC_DATA_WRITE)
864     + ? DMA_TO_DEVICE : DMA_FROM_DEVICE));
865     }
866    
867     static void atmci_stop_dma(struct atmel_mci *host)
868     @@ -1098,8 +1099,8 @@ static void atmci_command_complete(struct atmel_mci *host,
869     "command error: status=0x%08x\n", status);
870    
871     if (cmd->data) {
872     - host->data = NULL;
873     atmci_stop_dma(host);
874     + host->data = NULL;
875     mci_writel(host, IDR, MCI_NOTBUSY
876     | MCI_TXRDY | MCI_RXRDY
877     | ATMCI_DATA_ERROR_FLAGS);
878     @@ -1292,6 +1293,7 @@ static void atmci_tasklet_func(unsigned long priv)
879     } else {
880     data->bytes_xfered = data->blocks * data->blksz;
881     data->error = 0;
882     + mci_writel(host, IDR, ATMCI_DATA_ERROR_FLAGS);
883     }
884    
885     if (!data->stop) {
886     @@ -1750,13 +1752,13 @@ static int __init atmci_probe(struct platform_device *pdev)
887     ret = -ENODEV;
888     if (pdata->slot[0].bus_width) {
889     ret = atmci_init_slot(host, &pdata->slot[0],
890     - MCI_SDCSEL_SLOT_A, 0);
891     + 0, MCI_SDCSEL_SLOT_A);
892     if (!ret)
893     nr_slots++;
894     }
895     if (pdata->slot[1].bus_width) {
896     ret = atmci_init_slot(host, &pdata->slot[1],
897     - MCI_SDCSEL_SLOT_B, 1);
898     + 1, MCI_SDCSEL_SLOT_B);
899     if (!ret)
900     nr_slots++;
901     }
902     diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c
903     index c3ce920..8b7c267 100644
904     --- a/drivers/net/wireless/ath/ath9k/xmit.c
905     +++ b/drivers/net/wireless/ath/ath9k/xmit.c
906     @@ -2244,7 +2244,7 @@ void ath_tx_node_cleanup(struct ath_softc *sc, struct ath_node *an)
907     if (ATH_TXQ_SETUP(sc, i)) {
908     txq = &sc->tx.txq[i];
909    
910     - spin_lock_bh(&txq->axq_lock);
911     + spin_lock(&txq->axq_lock);
912    
913     list_for_each_entry_safe(ac,
914     ac_tmp, &txq->axq_acq, list) {
915     @@ -2265,7 +2265,7 @@ void ath_tx_node_cleanup(struct ath_softc *sc, struct ath_node *an)
916     }
917     }
918    
919     - spin_unlock_bh(&txq->axq_lock);
920     + spin_unlock(&txq->axq_lock);
921     }
922     }
923     }
924     diff --git a/drivers/net/wireless/iwlwifi/iwl-4965.c b/drivers/net/wireless/iwlwifi/iwl-4965.c
925     index 3b4c5a4..82c1d2e 100644
926     --- a/drivers/net/wireless/iwlwifi/iwl-4965.c
927     +++ b/drivers/net/wireless/iwlwifi/iwl-4965.c
928     @@ -581,6 +581,11 @@ static int iwl4965_alive_notify(struct iwl_priv *priv)
929    
930     iwl4965_set_wr_ptrs(priv, IWL_CMD_QUEUE_NUM, 0);
931    
932     + /* make sure all queue are not stopped */
933     + memset(&priv->queue_stopped[0], 0, sizeof(priv->queue_stopped));
934     + for (i = 0; i < 4; i++)
935     + atomic_set(&priv->queue_stop_count[i], 0);
936     +
937     /* reset to 0 to enable all the queue first */
938     priv->txq_ctx_active_msk = 0;
939     /* Map each Tx/cmd queue to its corresponding fifo */
940     diff --git a/drivers/net/wireless/iwlwifi/iwl-5000.c b/drivers/net/wireless/iwlwifi/iwl-5000.c
941     index c610e5f..f7d41c7 100644
942     --- a/drivers/net/wireless/iwlwifi/iwl-5000.c
943     +++ b/drivers/net/wireless/iwlwifi/iwl-5000.c
944     @@ -657,6 +657,11 @@ int iwl5000_alive_notify(struct iwl_priv *priv)
945    
946     iwl5000_set_wr_ptrs(priv, IWL_CMD_QUEUE_NUM, 0);
947    
948     + /* make sure all queue are not stopped */
949     + memset(&priv->queue_stopped[0], 0, sizeof(priv->queue_stopped));
950     + for (i = 0; i < 4; i++)
951     + atomic_set(&priv->queue_stop_count[i], 0);
952     +
953     /* reset to 0 to enable all the queue first */
954     priv->txq_ctx_active_msk = 0;
955     /* map qos queues to fifos one-to-one */
956     diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c
957     index b93e491..3534d86 100644
958     --- a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c
959     +++ b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c
960     @@ -298,10 +298,23 @@ static void rs_tl_turn_on_agg_for_tid(struct iwl_priv *priv,
961     struct iwl_lq_sta *lq_data, u8 tid,
962     struct ieee80211_sta *sta)
963     {
964     + int ret;
965     +
966     if (rs_tl_get_load(lq_data, tid) > IWL_AGG_LOAD_THRESHOLD) {
967     IWL_DEBUG_HT(priv, "Starting Tx agg: STA: %pM tid: %d\n",
968     sta->addr, tid);
969     - ieee80211_start_tx_ba_session(sta, tid);
970     + ret = ieee80211_start_tx_ba_session(sta, tid);
971     + if (ret == -EAGAIN) {
972     + /*
973     + * driver and mac80211 is out of sync
974     + * this might be cause by reloading firmware
975     + * stop the tx ba session here
976     + */
977     + IWL_DEBUG_HT(priv, "Fail start Tx agg on tid: %d\n",
978     + tid);
979     + ret = ieee80211_stop_tx_ba_session(sta, tid,
980     + WLAN_BACK_INITIATOR);
981     + }
982     }
983     }
984    
985     diff --git a/drivers/net/wireless/iwlwifi/iwl-tx.c b/drivers/net/wireless/iwlwifi/iwl-tx.c
986     index 88470fb..e0ce039 100644
987     --- a/drivers/net/wireless/iwlwifi/iwl-tx.c
988     +++ b/drivers/net/wireless/iwlwifi/iwl-tx.c
989     @@ -821,8 +821,10 @@ int iwl_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)
990     hdr->seq_ctrl |= cpu_to_le16(seq_number);
991     seq_number += 0x10;
992     /* aggregation is on for this <sta,tid> */
993     - if (info->flags & IEEE80211_TX_CTL_AMPDU)
994     + if (info->flags & IEEE80211_TX_CTL_AMPDU &&
995     + priv->stations[sta_id].tid[tid].agg.state == IWL_AGG_ON) {
996     txq_id = priv->stations[sta_id].tid[tid].agg.txq_id;
997     + }
998     }
999    
1000     txq = &priv->txq[txq_id];
1001     @@ -1347,7 +1349,7 @@ int iwl_tx_agg_stop(struct iwl_priv *priv , const u8 *ra, u16 tid)
1002     {
1003     int tx_fifo_id, txq_id, sta_id, ssn = -1;
1004     struct iwl_tid_data *tid_data;
1005     - int ret, write_ptr, read_ptr;
1006     + int write_ptr, read_ptr;
1007     unsigned long flags;
1008    
1009     if (!ra) {
1010     @@ -1399,13 +1401,17 @@ int iwl_tx_agg_stop(struct iwl_priv *priv , const u8 *ra, u16 tid)
1011     priv->stations[sta_id].tid[tid].agg.state = IWL_AGG_OFF;
1012    
1013     spin_lock_irqsave(&priv->lock, flags);
1014     - ret = priv->cfg->ops->lib->txq_agg_disable(priv, txq_id, ssn,
1015     + /*
1016     + * the only reason this call can fail is queue number out of range,
1017     + * which can happen if uCode is reloaded and all the station
1018     + * information are lost. if it is outside the range, there is no need
1019     + * to deactivate the uCode queue, just return "success" to allow
1020     + * mac80211 to clean up it own data.
1021     + */
1022     + priv->cfg->ops->lib->txq_agg_disable(priv, txq_id, ssn,
1023     tx_fifo_id);
1024     spin_unlock_irqrestore(&priv->lock, flags);
1025    
1026     - if (ret)
1027     - return ret;
1028     -
1029     ieee80211_stop_tx_ba_cb_irqsafe(priv->vif, ra, tid);
1030    
1031     return 0;
1032     diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c
1033     index 5905936..e4bd795 100644
1034     --- a/drivers/s390/block/dasd.c
1035     +++ b/drivers/s390/block/dasd.c
1036     @@ -35,6 +35,9 @@
1037     */
1038     #define DASD_CHANQ_MAX_SIZE 4
1039    
1040     +#define DASD_SLEEPON_START_TAG (void *) 1
1041     +#define DASD_SLEEPON_END_TAG (void *) 2
1042     +
1043     /*
1044     * SECTION: exported variables of dasd.c
1045     */
1046     @@ -1460,7 +1463,10 @@ void dasd_add_request_tail(struct dasd_ccw_req *cqr)
1047     */
1048     static void dasd_wakeup_cb(struct dasd_ccw_req *cqr, void *data)
1049     {
1050     - wake_up((wait_queue_head_t *) data);
1051     + spin_lock_irq(get_ccwdev_lock(cqr->startdev->cdev));
1052     + cqr->callback_data = DASD_SLEEPON_END_TAG;
1053     + spin_unlock_irq(get_ccwdev_lock(cqr->startdev->cdev));
1054     + wake_up(&generic_waitq);
1055     }
1056    
1057     static inline int _wait_for_wakeup(struct dasd_ccw_req *cqr)
1058     @@ -1470,10 +1476,7 @@ static inline int _wait_for_wakeup(struct dasd_ccw_req *cqr)
1059    
1060     device = cqr->startdev;
1061     spin_lock_irq(get_ccwdev_lock(device->cdev));
1062     - rc = ((cqr->status == DASD_CQR_DONE ||
1063     - cqr->status == DASD_CQR_NEED_ERP ||
1064     - cqr->status == DASD_CQR_TERMINATED) &&
1065     - list_empty(&cqr->devlist));
1066     + rc = (cqr->callback_data == DASD_SLEEPON_END_TAG);
1067     spin_unlock_irq(get_ccwdev_lock(device->cdev));
1068     return rc;
1069     }
1070     @@ -1561,7 +1564,7 @@ static int _dasd_sleep_on(struct dasd_ccw_req *maincqr, int interruptible)
1071     wait_event(generic_waitq, !(device->stopped));
1072    
1073     cqr->callback = dasd_wakeup_cb;
1074     - cqr->callback_data = (void *) &generic_waitq;
1075     + cqr->callback_data = DASD_SLEEPON_START_TAG;
1076     dasd_add_request_tail(cqr);
1077     if (interruptible) {
1078     rc = wait_event_interruptible(
1079     @@ -1640,7 +1643,7 @@ int dasd_sleep_on_immediatly(struct dasd_ccw_req *cqr)
1080     }
1081    
1082     cqr->callback = dasd_wakeup_cb;
1083     - cqr->callback_data = (void *) &generic_waitq;
1084     + cqr->callback_data = DASD_SLEEPON_START_TAG;
1085     cqr->status = DASD_CQR_QUEUED;
1086     list_add(&cqr->devlist, &device->ccw_queue);
1087    
1088     diff --git a/drivers/serial/imx.c b/drivers/serial/imx.c
1089     index d00fcf8..fd6b135 100644
1090     --- a/drivers/serial/imx.c
1091     +++ b/drivers/serial/imx.c
1092     @@ -119,7 +119,8 @@
1093     #define MX2_UCR3_RXDMUXSEL (1<<2) /* RXD Muxed Input Select, on mx2/mx3 */
1094     #define UCR3_INVT (1<<1) /* Inverted Infrared transmission */
1095     #define UCR3_BPEN (1<<0) /* Preset registers enable */
1096     -#define UCR4_CTSTL_32 (32<<10) /* CTS trigger level (32 chars) */
1097     +#define UCR4_CTSTL_SHF 10 /* CTS trigger level shift */
1098     +#define UCR4_CTSTL_MASK 0x3F /* CTS trigger is 6 bits wide */
1099     #define UCR4_INVR (1<<9) /* Inverted infrared reception */
1100     #define UCR4_ENIRI (1<<8) /* Serial infrared interrupt enable */
1101     #define UCR4_WKEN (1<<7) /* Wake interrupt enable */
1102     @@ -590,6 +591,9 @@ static int imx_setup_ufcr(struct imx_port *sport, unsigned int mode)
1103     return 0;
1104     }
1105    
1106     +/* half the RX buffer size */
1107     +#define CTSTL 16
1108     +
1109     static int imx_startup(struct uart_port *port)
1110     {
1111     struct imx_port *sport = (struct imx_port *)port;
1112     @@ -606,6 +610,10 @@ static int imx_startup(struct uart_port *port)
1113     if (USE_IRDA(sport))
1114     temp |= UCR4_IRSC;
1115    
1116     + /* set the trigger level for CTS */
1117     + temp &= ~(UCR4_CTSTL_MASK<< UCR4_CTSTL_SHF);
1118     + temp |= CTSTL<< UCR4_CTSTL_SHF;
1119     +
1120     writel(temp & ~UCR4_DREN, sport->port.membase + UCR4);
1121    
1122     if (USE_IRDA(sport)) {
1123     diff --git a/drivers/video/bfin-t350mcqb-fb.c b/drivers/video/bfin-t350mcqb-fb.c
1124     index 2549c53..6c8b6b6 100644
1125     --- a/drivers/video/bfin-t350mcqb-fb.c
1126     +++ b/drivers/video/bfin-t350mcqb-fb.c
1127     @@ -515,9 +515,9 @@ static int __devinit bfin_t350mcqb_probe(struct platform_device *pdev)
1128     fbinfo->fbops = &bfin_t350mcqb_fb_ops;
1129     fbinfo->flags = FBINFO_FLAG_DEFAULT;
1130    
1131     - info->fb_buffer =
1132     - dma_alloc_coherent(NULL, fbinfo->fix.smem_len, &info->dma_handle,
1133     - GFP_KERNEL);
1134     + info->fb_buffer = dma_alloc_coherent(NULL, fbinfo->fix.smem_len +
1135     + ACTIVE_VIDEO_MEM_OFFSET,
1136     + &info->dma_handle, GFP_KERNEL);
1137    
1138     if (NULL == info->fb_buffer) {
1139     printk(KERN_ERR DRIVER_NAME
1140     @@ -587,8 +587,8 @@ out7:
1141     out6:
1142     fb_dealloc_cmap(&fbinfo->cmap);
1143     out4:
1144     - dma_free_coherent(NULL, fbinfo->fix.smem_len, info->fb_buffer,
1145     - info->dma_handle);
1146     + dma_free_coherent(NULL, fbinfo->fix.smem_len + ACTIVE_VIDEO_MEM_OFFSET,
1147     + info->fb_buffer, info->dma_handle);
1148     out3:
1149     framebuffer_release(fbinfo);
1150     out2:
1151     @@ -611,8 +611,9 @@ static int __devexit bfin_t350mcqb_remove(struct platform_device *pdev)
1152     free_irq(info->irq, info);
1153    
1154     if (info->fb_buffer != NULL)
1155     - dma_free_coherent(NULL, fbinfo->fix.smem_len, info->fb_buffer,
1156     - info->dma_handle);
1157     + dma_free_coherent(NULL, fbinfo->fix.smem_len +
1158     + ACTIVE_VIDEO_MEM_OFFSET, info->fb_buffer,
1159     + info->dma_handle);
1160    
1161     fb_dealloc_cmap(&fbinfo->cmap);
1162    
1163     diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
1164     index 645a179..2c6ee6a 100644
1165     --- a/fs/btrfs/ioctl.c
1166     +++ b/fs/btrfs/ioctl.c
1167     @@ -964,12 +964,17 @@ static noinline long btrfs_ioctl_clone(struct file *file, unsigned long srcfd,
1168     ret = -EBADF;
1169     goto out_drop_write;
1170     }
1171     +
1172     src = src_file->f_dentry->d_inode;
1173    
1174     ret = -EINVAL;
1175     if (src == inode)
1176     goto out_fput;
1177    
1178     + /* the src must be open for reading */
1179     + if (!(src_file->f_mode & FMODE_READ))
1180     + goto out_fput;
1181     +
1182     ret = -EISDIR;
1183     if (S_ISDIR(src->i_mode) || S_ISDIR(inode->i_mode))
1184     goto out_fput;
1185     diff --git a/fs/cachefiles/security.c b/fs/cachefiles/security.c
1186     index b5808cd..039b501 100644
1187     --- a/fs/cachefiles/security.c
1188     +++ b/fs/cachefiles/security.c
1189     @@ -77,6 +77,8 @@ static int cachefiles_check_cache_dir(struct cachefiles_cache *cache,
1190     /*
1191     * check the security details of the on-disk cache
1192     * - must be called with security override in force
1193     + * - must return with a security override in force - even in the case of an
1194     + * error
1195     */
1196     int cachefiles_determine_cache_security(struct cachefiles_cache *cache,
1197     struct dentry *root,
1198     @@ -99,6 +101,8 @@ int cachefiles_determine_cache_security(struct cachefiles_cache *cache,
1199     * which create files */
1200     ret = set_create_files_as(new, root->d_inode);
1201     if (ret < 0) {
1202     + abort_creds(new);
1203     + cachefiles_begin_secure(cache, _saved_cred);
1204     _leave(" = %d [cfa]", ret);
1205     return ret;
1206     }
1207     diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h
1208     index ed751bb..2568889 100644
1209     --- a/fs/cifs/cifsglob.h
1210     +++ b/fs/cifs/cifsglob.h
1211     @@ -500,6 +500,7 @@ struct dfs_info3_param {
1212     #define CIFS_FATTR_DFS_REFERRAL 0x1
1213     #define CIFS_FATTR_DELETE_PENDING 0x2
1214     #define CIFS_FATTR_NEED_REVAL 0x4
1215     +#define CIFS_FATTR_INO_COLLISION 0x8
1216    
1217     struct cifs_fattr {
1218     u32 cf_flags;
1219     diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c
1220     index e3fda97..7ec8555 100644
1221     --- a/fs/cifs/inode.c
1222     +++ b/fs/cifs/inode.c
1223     @@ -610,6 +610,16 @@ cifs_find_inode(struct inode *inode, void *opaque)
1224     if (CIFS_I(inode)->uniqueid != fattr->cf_uniqueid)
1225     return 0;
1226    
1227     + /*
1228     + * uh oh -- it's a directory. We can't use it since hardlinked dirs are
1229     + * verboten. Disable serverino and return it as if it were found, the
1230     + * caller can discard it, generate a uniqueid and retry the find
1231     + */
1232     + if (S_ISDIR(inode->i_mode) && !list_empty(&inode->i_dentry)) {
1233     + fattr->cf_flags |= CIFS_FATTR_INO_COLLISION;
1234     + cifs_autodisable_serverino(CIFS_SB(inode->i_sb));
1235     + }
1236     +
1237     return 1;
1238     }
1239    
1240     @@ -629,15 +639,22 @@ cifs_iget(struct super_block *sb, struct cifs_fattr *fattr)
1241     unsigned long hash;
1242     struct inode *inode;
1243    
1244     +retry_iget5_locked:
1245     cFYI(1, ("looking for uniqueid=%llu", fattr->cf_uniqueid));
1246    
1247     /* hash down to 32-bits on 32-bit arch */
1248     hash = cifs_uniqueid_to_ino_t(fattr->cf_uniqueid);
1249    
1250     inode = iget5_locked(sb, hash, cifs_find_inode, cifs_init_inode, fattr);
1251     -
1252     - /* we have fattrs in hand, update the inode */
1253     if (inode) {
1254     + /* was there a problematic inode number collision? */
1255     + if (fattr->cf_flags & CIFS_FATTR_INO_COLLISION) {
1256     + iput(inode);
1257     + fattr->cf_uniqueid = iunique(sb, ROOT_I);
1258     + fattr->cf_flags &= ~CIFS_FATTR_INO_COLLISION;
1259     + goto retry_iget5_locked;
1260     + }
1261     +
1262     cifs_fattr_to_inode(inode, fattr);
1263     if (sb->s_flags & MS_NOATIME)
1264     inode->i_flags |= S_NOATIME | S_NOCMTIME;
1265     diff --git a/fs/compat.c b/fs/compat.c
1266     index 00d90c2..514b623 100644
1267     --- a/fs/compat.c
1268     +++ b/fs/compat.c
1269     @@ -1530,8 +1530,6 @@ int compat_do_execve(char * filename,
1270     if (retval < 0)
1271     goto out;
1272    
1273     - current->stack_start = current->mm->start_stack;
1274     -
1275     /* execve succeeded */
1276     current->fs->in_exec = 0;
1277     current->in_execve = 0;
1278     diff --git a/fs/exec.c b/fs/exec.c
1279     index 9071360..332f781 100644
1280     --- a/fs/exec.c
1281     +++ b/fs/exec.c
1282     @@ -1386,8 +1386,6 @@ int do_execve(char * filename,
1283     if (retval < 0)
1284     goto out;
1285    
1286     - current->stack_start = current->mm->start_stack;
1287     -
1288     /* execve succeeded */
1289     current->fs->in_exec = 0;
1290     current->in_execve = 0;
1291     diff --git a/fs/nilfs2/super.c b/fs/nilfs2/super.c
1292     index 8173fae..4d3ddcc 100644
1293     --- a/fs/nilfs2/super.c
1294     +++ b/fs/nilfs2/super.c
1295     @@ -746,6 +746,7 @@ nilfs_fill_super(struct super_block *sb, void *data, int silent,
1296     sb->s_export_op = &nilfs_export_ops;
1297     sb->s_root = NULL;
1298     sb->s_time_gran = 1;
1299     + sb->s_bdi = nilfs->ns_bdi;
1300    
1301     err = load_nilfs(nilfs, sbi);
1302     if (err)
1303     diff --git a/fs/notify/inotify/inotify_fsnotify.c b/fs/notify/inotify/inotify_fsnotify.c
1304     index 1afb0a1..e27960c 100644
1305     --- a/fs/notify/inotify/inotify_fsnotify.c
1306     +++ b/fs/notify/inotify/inotify_fsnotify.c
1307     @@ -28,6 +28,7 @@
1308     #include <linux/path.h> /* struct path */
1309     #include <linux/slab.h> /* kmem_* */
1310     #include <linux/types.h>
1311     +#include <linux/sched.h>
1312    
1313     #include "inotify.h"
1314    
1315     @@ -146,6 +147,7 @@ static void inotify_free_group_priv(struct fsnotify_group *group)
1316     idr_for_each(&group->inotify_data.idr, idr_callback, group);
1317     idr_remove_all(&group->inotify_data.idr);
1318     idr_destroy(&group->inotify_data.idr);
1319     + free_uid(group->inotify_data.user);
1320     }
1321    
1322     void inotify_free_event_priv(struct fsnotify_event_private_data *fsn_event_priv)
1323     diff --git a/fs/notify/inotify/inotify_user.c b/fs/notify/inotify/inotify_user.c
1324     index a94e8bd..75aa15a 100644
1325     --- a/fs/notify/inotify/inotify_user.c
1326     +++ b/fs/notify/inotify/inotify_user.c
1327     @@ -550,21 +550,24 @@ retry:
1328     if (unlikely(!idr_pre_get(&group->inotify_data.idr, GFP_KERNEL)))
1329     goto out_err;
1330    
1331     + /* we are putting the mark on the idr, take a reference */
1332     + fsnotify_get_mark(&tmp_ientry->fsn_entry);
1333     +
1334     spin_lock(&group->inotify_data.idr_lock);
1335     ret = idr_get_new_above(&group->inotify_data.idr, &tmp_ientry->fsn_entry,
1336     group->inotify_data.last_wd+1,
1337     &tmp_ientry->wd);
1338     spin_unlock(&group->inotify_data.idr_lock);
1339     if (ret) {
1340     + /* we didn't get on the idr, drop the idr reference */
1341     + fsnotify_put_mark(&tmp_ientry->fsn_entry);
1342     +
1343     /* idr was out of memory allocate and try again */
1344     if (ret == -EAGAIN)
1345     goto retry;
1346     goto out_err;
1347     }
1348    
1349     - /* we put the mark on the idr, take a reference */
1350     - fsnotify_get_mark(&tmp_ientry->fsn_entry);
1351     -
1352     /* we are on the idr, now get on the inode */
1353     ret = fsnotify_add_mark(&tmp_ientry->fsn_entry, group, inode);
1354     if (ret) {
1355     diff --git a/fs/proc/array.c b/fs/proc/array.c
1356     index 13b5d07..69eb4c4 100644
1357     --- a/fs/proc/array.c
1358     +++ b/fs/proc/array.c
1359     @@ -82,7 +82,6 @@
1360     #include <linux/pid_namespace.h>
1361     #include <linux/ptrace.h>
1362     #include <linux/tracehook.h>
1363     -#include <linux/swapops.h>
1364    
1365     #include <asm/pgtable.h>
1366     #include <asm/processor.h>
1367     @@ -494,7 +493,7 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns,
1368     rsslim,
1369     mm ? mm->start_code : 0,
1370     mm ? mm->end_code : 0,
1371     - (permitted && mm) ? task->stack_start : 0,
1372     + (permitted && mm) ? mm->start_stack : 0,
1373     esp,
1374     eip,
1375     /* The signal information here is obsolete.
1376     diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
1377     index f277c4a..9df34a5 100644
1378     --- a/fs/proc/task_mmu.c
1379     +++ b/fs/proc/task_mmu.c
1380     @@ -243,25 +243,6 @@ static void show_map_vma(struct seq_file *m, struct vm_area_struct *vma)
1381     } else if (vma->vm_start <= mm->start_stack &&
1382     vma->vm_end >= mm->start_stack) {
1383     name = "[stack]";
1384     - } else {
1385     - unsigned long stack_start;
1386     - struct proc_maps_private *pmp;
1387     -
1388     - pmp = m->private;
1389     - stack_start = pmp->task->stack_start;
1390     -
1391     - if (vma->vm_start <= stack_start &&
1392     - vma->vm_end >= stack_start) {
1393     - pad_len_spaces(m, len);
1394     - seq_printf(m,
1395     - "[threadstack:%08lx]",
1396     -#ifdef CONFIG_STACK_GROWSUP
1397     - vma->vm_end - stack_start
1398     -#else
1399     - stack_start - vma->vm_start
1400     -#endif
1401     - );
1402     - }
1403     }
1404     } else {
1405     name = "[vdso]";
1406     diff --git a/include/asm-generic/dma-mapping-common.h b/include/asm-generic/dma-mapping-common.h
1407     index e694263..6920695 100644
1408     --- a/include/asm-generic/dma-mapping-common.h
1409     +++ b/include/asm-generic/dma-mapping-common.h
1410     @@ -131,7 +131,7 @@ static inline void dma_sync_single_range_for_cpu(struct device *dev,
1411     debug_dma_sync_single_range_for_cpu(dev, addr, offset, size, dir);
1412    
1413     } else
1414     - dma_sync_single_for_cpu(dev, addr, size, dir);
1415     + dma_sync_single_for_cpu(dev, addr + offset, size, dir);
1416     }
1417    
1418     static inline void dma_sync_single_range_for_device(struct device *dev,
1419     @@ -148,7 +148,7 @@ static inline void dma_sync_single_range_for_device(struct device *dev,
1420     debug_dma_sync_single_range_for_device(dev, addr, offset, size, dir);
1421    
1422     } else
1423     - dma_sync_single_for_device(dev, addr, size, dir);
1424     + dma_sync_single_for_device(dev, addr + offset, size, dir);
1425     }
1426    
1427     static inline void
1428     diff --git a/include/linux/sched.h b/include/linux/sched.h
1429     index 1f5fa53..db821a4 100644
1430     --- a/include/linux/sched.h
1431     +++ b/include/linux/sched.h
1432     @@ -1560,7 +1560,6 @@ struct task_struct {
1433     /* bitmask of trace recursion */
1434     unsigned long trace_recursion;
1435     #endif /* CONFIG_TRACING */
1436     - unsigned long stack_start;
1437     #ifdef CONFIG_CGROUP_MEM_RES_CTLR /* memcg uses this to do batch job */
1438     struct memcg_batch_info {
1439     int do_batch; /* incremented when batch uncharge started */
1440     diff --git a/kernel/fork.c b/kernel/fork.c
1441     index f88bd98..0ea67a3 100644
1442     --- a/kernel/fork.c
1443     +++ b/kernel/fork.c
1444     @@ -1134,8 +1134,6 @@ static struct task_struct *copy_process(unsigned long clone_flags,
1445    
1446     p->bts = NULL;
1447    
1448     - p->stack_start = stack_start;
1449     -
1450     /* Perform scheduler related setup. Assign this task to a CPU. */
1451     sched_fork(p, clone_flags);
1452    
1453     diff --git a/kernel/profile.c b/kernel/profile.c
1454     index a55d3a3..dfadc5b 100644
1455     --- a/kernel/profile.c
1456     +++ b/kernel/profile.c
1457     @@ -127,8 +127,10 @@ int __ref profile_init(void)
1458     return 0;
1459    
1460     prof_buffer = vmalloc(buffer_bytes);
1461     - if (prof_buffer)
1462     + if (prof_buffer) {
1463     + memset(prof_buffer, 0, buffer_bytes);
1464     return 0;
1465     + }
1466    
1467     free_cpumask_var(prof_cpu_mask);
1468     return -ENOMEM;
1469     diff --git a/mm/hugetlb.c b/mm/hugetlb.c
1470     index fd9ba95..e8d9544 100644
1471     --- a/mm/hugetlb.c
1472     +++ b/mm/hugetlb.c
1473     @@ -1039,7 +1039,7 @@ static struct page *alloc_huge_page(struct vm_area_struct *vma,
1474     page = alloc_buddy_huge_page(h, vma, addr);
1475     if (!page) {
1476     hugetlb_put_quota(inode->i_mapping, chg);
1477     - return ERR_PTR(-VM_FAULT_OOM);
1478     + return ERR_PTR(-VM_FAULT_SIGBUS);
1479     }
1480     }
1481    
1482     diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
1483     index 16190ca..955f0b2 100644
1484     --- a/net/ipv4/udp.c
1485     +++ b/net/ipv4/udp.c
1486     @@ -1527,6 +1527,9 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct udp_table *udptable,
1487    
1488     uh = udp_hdr(skb);
1489     ulen = ntohs(uh->len);
1490     + saddr = ip_hdr(skb)->saddr;
1491     + daddr = ip_hdr(skb)->daddr;
1492     +
1493     if (ulen > skb->len)
1494     goto short_packet;
1495    
1496     @@ -1540,9 +1543,6 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct udp_table *udptable,
1497     if (udp4_csum_init(skb, uh, proto))
1498     goto csum_error;
1499    
1500     - saddr = ip_hdr(skb)->saddr;
1501     - daddr = ip_hdr(skb)->daddr;
1502     -
1503     if (rt->rt_flags & (RTCF_BROADCAST|RTCF_MULTICAST))
1504     return __udp4_lib_mcast_deliver(net, skb, uh,
1505     saddr, daddr, udptable);
1506     diff --git a/security/min_addr.c b/security/min_addr.c
1507     index e86f297..f728728 100644
1508     --- a/security/min_addr.c
1509     +++ b/security/min_addr.c
1510     @@ -33,7 +33,7 @@ int mmap_min_addr_handler(struct ctl_table *table, int write,
1511     {
1512     int ret;
1513    
1514     - if (!capable(CAP_SYS_RAWIO))
1515     + if (write && !capable(CAP_SYS_RAWIO))
1516     return -EPERM;
1517    
1518     ret = proc_doulongvec_minmax(table, write, buffer, lenp, ppos);
1519     diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
1520     index fd831bd..a747871 100644
1521     --- a/sound/pci/hda/hda_intel.c
1522     +++ b/sound/pci/hda/hda_intel.c
1523     @@ -2718,6 +2718,7 @@ static struct pci_device_id azx_ids[] = {
1524     { PCI_DEVICE(0x8086, 0x3a6e), .driver_data = AZX_DRIVER_ICH },
1525     /* PCH */
1526     { PCI_DEVICE(0x8086, 0x3b56), .driver_data = AZX_DRIVER_ICH },
1527     + { PCI_DEVICE(0x8086, 0x3b57), .driver_data = AZX_DRIVER_ICH },
1528     /* CPT */
1529     { PCI_DEVICE(0x8086, 0x1c20), .driver_data = AZX_DRIVER_PCH },
1530     /* SCH */
1531     diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c
1532     index 1a97c81..a978645 100644
1533     --- a/sound/pci/hda/patch_conexant.c
1534     +++ b/sound/pci/hda/patch_conexant.c
1535     @@ -1176,9 +1176,10 @@ static int patch_cxt5045(struct hda_codec *codec)
1536     case 0x103c:
1537     case 0x1631:
1538     case 0x1734:
1539     - /* HP, Packard Bell, & Fujitsu-Siemens laptops have really bad
1540     - * sound over 0dB on NID 0x17. Fix max PCM level to 0 dB
1541     - * (originally it has 0x2b steps with 0dB offset 0x14)
1542     + case 0x17aa:
1543     + /* HP, Packard Bell, Fujitsu-Siemens & Lenovo laptops have
1544     + * really bad sound over 0dB on NID 0x17. Fix max PCM level to
1545     + * 0 dB (originally it has 0x2b steps with 0dB offset 0x14)
1546     */
1547     snd_hda_override_amp_caps(codec, 0x17, HDA_INPUT,
1548     (0x14 << AC_AMPCAP_OFFSET_SHIFT) |
1549     diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
1550     index b486daa..abfc558 100644
1551     --- a/sound/pci/hda/patch_realtek.c
1552     +++ b/sound/pci/hda/patch_realtek.c
1553     @@ -17348,7 +17348,6 @@ static struct snd_pci_quirk alc662_cfg_tbl[] = {
1554     ALC662_3ST_6ch_DIG),
1555     SND_PCI_QUIRK_MASK(0x1854, 0xf000, 0x2000, "ASUS H13-200x",
1556     ALC663_ASUS_H13),
1557     - SND_PCI_QUIRK(0x8086, 0xd604, "Intel mobo", ALC662_3ST_2ch_DIG),
1558     {}
1559     };
1560    
1561     diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c
1562     index ac2d528..cb474c0 100644
1563     --- a/sound/pci/hda/patch_sigmatel.c
1564     +++ b/sound/pci/hda/patch_sigmatel.c
1565     @@ -1539,11 +1539,9 @@ static unsigned int alienware_m17x_pin_configs[13] = {
1566     0x904601b0,
1567     };
1568    
1569     -static unsigned int intel_dg45id_pin_configs[14] = {
1570     +static unsigned int intel_dg45id_pin_configs[13] = {
1571     0x02214230, 0x02A19240, 0x01013214, 0x01014210,
1572     - 0x01A19250, 0x01011212, 0x01016211, 0x40f000f0,
1573     - 0x40f000f0, 0x40f000f0, 0x40f000f0, 0x014510A0,
1574     - 0x074510B0, 0x40f000f0
1575     + 0x01A19250, 0x01011212, 0x01016211
1576     };
1577    
1578     static unsigned int *stac92hd73xx_brd_tbl[STAC_92HD73XX_MODELS] = {
1579     diff --git a/sound/pci/ice1712/maya44.c b/sound/pci/ice1712/maya44.c
1580     index 3e1c20a..726fd4b 100644
1581     --- a/sound/pci/ice1712/maya44.c
1582     +++ b/sound/pci/ice1712/maya44.c
1583     @@ -347,7 +347,7 @@ static int maya_gpio_sw_put(struct snd_kcontrol *kcontrol,
1584    
1585     /* known working input slots (0-4) */
1586     #define MAYA_LINE_IN 1 /* in-2 */
1587     -#define MAYA_MIC_IN 4 /* in-5 */
1588     +#define MAYA_MIC_IN 3 /* in-4 */
1589    
1590     static void wm8776_select_input(struct snd_maya44 *chip, int idx, int line)
1591     {
1592     @@ -393,8 +393,8 @@ static int maya_rec_src_put(struct snd_kcontrol *kcontrol,
1593     int changed;
1594    
1595     mutex_lock(&chip->mutex);
1596     - changed = maya_set_gpio_bits(chip->ice, GPIO_MIC_RELAY,
1597     - sel ? GPIO_MIC_RELAY : 0);
1598     + changed = maya_set_gpio_bits(chip->ice, 1 << GPIO_MIC_RELAY,
1599     + sel ? (1 << GPIO_MIC_RELAY) : 0);
1600     wm8776_select_input(chip, 0, sel ? MAYA_MIC_IN : MAYA_LINE_IN);
1601     mutex_unlock(&chip->mutex);
1602     return changed;
1603     diff --git a/sound/pci/oxygen/xonar_cs43xx.c b/sound/pci/oxygen/xonar_cs43xx.c
1604     index 16c226b..7c4986b 100644
1605     --- a/sound/pci/oxygen/xonar_cs43xx.c
1606     +++ b/sound/pci/oxygen/xonar_cs43xx.c
1607     @@ -56,6 +56,7 @@
1608     #include <sound/pcm_params.h>
1609     #include <sound/tlv.h>
1610     #include "xonar.h"
1611     +#include "cm9780.h"
1612     #include "cs4398.h"
1613     #include "cs4362a.h"
1614    
1615     @@ -172,6 +173,8 @@ static void xonar_d1_init(struct oxygen *chip)
1616     oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA,
1617     GPIO_D1_FRONT_PANEL | GPIO_D1_INPUT_ROUTE);
1618    
1619     + oxygen_ac97_set_bits(chip, 0, CM9780_JACK, CM9780_FMIC2MIC);
1620     +
1621     xonar_init_cs53x1(chip);
1622     xonar_enable_output(chip);
1623