Contents of /trunk/kernel26-alx/patches-2.6.33-r2/0103-2.6.33.4-all-fixes.patch
Parent Directory | Revision Log
Revision 1192 -
(show annotations)
(download)
Sat Nov 20 15:43:20 2010 UTC (13 years, 10 months ago) by niro
File size: 132383 byte(s)
Sat Nov 20 15:43:20 2010 UTC (13 years, 10 months ago) by niro
File size: 132383 byte(s)
added fixes for intel-agp and i915 module loading issues
1 | diff --git a/arch/arm/mach-pxa/include/mach/colibri.h b/arch/arm/mach-pxa/include/mach/colibri.h |
2 | index 811743c..5f2ba8d 100644 |
3 | --- a/arch/arm/mach-pxa/include/mach/colibri.h |
4 | +++ b/arch/arm/mach-pxa/include/mach/colibri.h |
5 | @@ -2,6 +2,7 @@ |
6 | #define _COLIBRI_H_ |
7 | |
8 | #include <net/ax88796.h> |
9 | +#include <mach/mfp.h> |
10 | |
11 | /* |
12 | * common settings for all modules |
13 | diff --git a/arch/mips/include/asm/mach-sibyte/war.h b/arch/mips/include/asm/mach-sibyte/war.h |
14 | index 7950ef4..743385d 100644 |
15 | --- a/arch/mips/include/asm/mach-sibyte/war.h |
16 | +++ b/arch/mips/include/asm/mach-sibyte/war.h |
17 | @@ -16,7 +16,11 @@ |
18 | #if defined(CONFIG_SB1_PASS_1_WORKAROUNDS) || \ |
19 | defined(CONFIG_SB1_PASS_2_WORKAROUNDS) |
20 | |
21 | -#define BCM1250_M3_WAR 1 |
22 | +#ifndef __ASSEMBLY__ |
23 | +extern int sb1250_m3_workaround_needed(void); |
24 | +#endif |
25 | + |
26 | +#define BCM1250_M3_WAR sb1250_m3_workaround_needed() |
27 | #define SIBYTE_1956_WAR 1 |
28 | |
29 | #else |
30 | diff --git a/arch/mips/sibyte/sb1250/setup.c b/arch/mips/sibyte/sb1250/setup.c |
31 | index 0444da1..92da315 100644 |
32 | --- a/arch/mips/sibyte/sb1250/setup.c |
33 | +++ b/arch/mips/sibyte/sb1250/setup.c |
34 | @@ -87,6 +87,21 @@ static int __init setup_bcm1250(void) |
35 | return ret; |
36 | } |
37 | |
38 | +int sb1250_m3_workaround_needed(void) |
39 | +{ |
40 | + switch (soc_type) { |
41 | + case K_SYS_SOC_TYPE_BCM1250: |
42 | + case K_SYS_SOC_TYPE_BCM1250_ALT: |
43 | + case K_SYS_SOC_TYPE_BCM1250_ALT2: |
44 | + case K_SYS_SOC_TYPE_BCM1125: |
45 | + case K_SYS_SOC_TYPE_BCM1125H: |
46 | + return soc_pass < K_SYS_REVISION_BCM1250_C0; |
47 | + |
48 | + default: |
49 | + return 0; |
50 | + } |
51 | +} |
52 | + |
53 | static int __init setup_bcm112x(void) |
54 | { |
55 | int ret = 0; |
56 | diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S |
57 | index 9258074..567cd57 100644 |
58 | --- a/arch/powerpc/kernel/head_64.S |
59 | +++ b/arch/powerpc/kernel/head_64.S |
60 | @@ -615,6 +615,17 @@ _GLOBAL(start_secondary_prolog) |
61 | std r3,0(r1) /* Zero the stack frame pointer */ |
62 | bl .start_secondary |
63 | b . |
64 | +/* |
65 | + * Reset stack pointer and call start_secondary |
66 | + * to continue with online operation when woken up |
67 | + * from cede in cpu offline. |
68 | + */ |
69 | +_GLOBAL(start_secondary_resume) |
70 | + ld r1,PACAKSAVE(r13) /* Reload kernel stack pointer */ |
71 | + li r3,0 |
72 | + std r3,0(r1) /* Zero the stack frame pointer */ |
73 | + bl .start_secondary |
74 | + b . |
75 | #endif |
76 | |
77 | /* |
78 | diff --git a/arch/powerpc/mm/fsl_booke_mmu.c b/arch/powerpc/mm/fsl_booke_mmu.c |
79 | index c539472..1ce9dd5 100644 |
80 | --- a/arch/powerpc/mm/fsl_booke_mmu.c |
81 | +++ b/arch/powerpc/mm/fsl_booke_mmu.c |
82 | @@ -155,15 +155,10 @@ static void settlbcam(int index, unsigned long virt, phys_addr_t phys, |
83 | if (cur_cpu_spec->cpu_features & MMU_FTR_BIG_PHYS) |
84 | TLBCAM[index].MAS7 = (u64)phys >> 32; |
85 | |
86 | -#ifndef CONFIG_KGDB /* want user access for breakpoints */ |
87 | if (flags & _PAGE_USER) { |
88 | TLBCAM[index].MAS3 |= MAS3_UX | MAS3_UR; |
89 | TLBCAM[index].MAS3 |= ((flags & _PAGE_RW) ? MAS3_UW : 0); |
90 | } |
91 | -#else |
92 | - TLBCAM[index].MAS3 |= MAS3_UX | MAS3_UR; |
93 | - TLBCAM[index].MAS3 |= ((flags & _PAGE_RW) ? MAS3_UW : 0); |
94 | -#endif |
95 | |
96 | tlbcam_addrs[index].start = virt; |
97 | tlbcam_addrs[index].limit = virt + size - 1; |
98 | diff --git a/arch/powerpc/platforms/pseries/hotplug-cpu.c b/arch/powerpc/platforms/pseries/hotplug-cpu.c |
99 | index 6ea4698..b842378 100644 |
100 | --- a/arch/powerpc/platforms/pseries/hotplug-cpu.c |
101 | +++ b/arch/powerpc/platforms/pseries/hotplug-cpu.c |
102 | @@ -122,44 +122,32 @@ static void pseries_mach_cpu_die(void) |
103 | if (!get_lppaca()->shared_proc) |
104 | get_lppaca()->donate_dedicated_cpu = 1; |
105 | |
106 | - printk(KERN_INFO |
107 | - "cpu %u (hwid %u) ceding for offline with hint %d\n", |
108 | - cpu, hwcpu, cede_latency_hint); |
109 | while (get_preferred_offline_state(cpu) == CPU_STATE_INACTIVE) { |
110 | extended_cede_processor(cede_latency_hint); |
111 | - printk(KERN_INFO "cpu %u (hwid %u) returned from cede.\n", |
112 | - cpu, hwcpu); |
113 | - printk(KERN_INFO |
114 | - "Decrementer value = %x Timebase value = %llx\n", |
115 | - get_dec(), get_tb()); |
116 | } |
117 | |
118 | - printk(KERN_INFO "cpu %u (hwid %u) got prodded to go online\n", |
119 | - cpu, hwcpu); |
120 | - |
121 | if (!get_lppaca()->shared_proc) |
122 | get_lppaca()->donate_dedicated_cpu = 0; |
123 | get_lppaca()->idle = 0; |
124 | - } |
125 | |
126 | - if (get_preferred_offline_state(cpu) == CPU_STATE_ONLINE) { |
127 | - unregister_slb_shadow(hwcpu, __pa(get_slb_shadow())); |
128 | + if (get_preferred_offline_state(cpu) == CPU_STATE_ONLINE) { |
129 | + unregister_slb_shadow(hwcpu, __pa(get_slb_shadow())); |
130 | |
131 | - /* |
132 | - * NOTE: Calling start_secondary() here for now to |
133 | - * start new context. |
134 | - * However, need to do it cleanly by resetting the |
135 | - * stack pointer. |
136 | - */ |
137 | - start_secondary(); |
138 | + /* |
139 | + * Call to start_secondary_resume() will not return. |
140 | + * Kernel stack will be reset and start_secondary() |
141 | + * will be called to continue the online operation. |
142 | + */ |
143 | + start_secondary_resume(); |
144 | + } |
145 | + } |
146 | |
147 | - } else if (get_preferred_offline_state(cpu) == CPU_STATE_OFFLINE) { |
148 | + /* Requested state is CPU_STATE_OFFLINE at this point */ |
149 | + WARN_ON(get_preferred_offline_state(cpu) != CPU_STATE_OFFLINE); |
150 | |
151 | - set_cpu_current_state(cpu, CPU_STATE_OFFLINE); |
152 | - unregister_slb_shadow(hard_smp_processor_id(), |
153 | - __pa(get_slb_shadow())); |
154 | - rtas_stop_self(); |
155 | - } |
156 | + set_cpu_current_state(cpu, CPU_STATE_OFFLINE); |
157 | + unregister_slb_shadow(hwcpu, __pa(get_slb_shadow())); |
158 | + rtas_stop_self(); |
159 | |
160 | /* Should never get here... */ |
161 | BUG(); |
162 | diff --git a/arch/powerpc/platforms/pseries/offline_states.h b/arch/powerpc/platforms/pseries/offline_states.h |
163 | index 202d869..75a6f48 100644 |
164 | --- a/arch/powerpc/platforms/pseries/offline_states.h |
165 | +++ b/arch/powerpc/platforms/pseries/offline_states.h |
166 | @@ -35,4 +35,5 @@ static inline void set_default_offline_state(int cpu) |
167 | |
168 | extern enum cpu_state_vals get_preferred_offline_state(int cpu); |
169 | extern int start_secondary(void); |
170 | +extern void start_secondary_resume(void); |
171 | #endif |
172 | diff --git a/arch/sparc/include/asm/irqflags_64.h b/arch/sparc/include/asm/irqflags_64.h |
173 | index 8b49bf9..bfa1ea4 100644 |
174 | --- a/arch/sparc/include/asm/irqflags_64.h |
175 | +++ b/arch/sparc/include/asm/irqflags_64.h |
176 | @@ -76,9 +76,26 @@ static inline int raw_irqs_disabled(void) |
177 | */ |
178 | static inline unsigned long __raw_local_irq_save(void) |
179 | { |
180 | - unsigned long flags = __raw_local_save_flags(); |
181 | - |
182 | - raw_local_irq_disable(); |
183 | + unsigned long flags, tmp; |
184 | + |
185 | + /* Disable interrupts to PIL_NORMAL_MAX unless we already |
186 | + * are using PIL_NMI, in which case PIL_NMI is retained. |
187 | + * |
188 | + * The only values we ever program into the %pil are 0, |
189 | + * PIL_NORMAL_MAX and PIL_NMI. |
190 | + * |
191 | + * Since PIL_NMI is the largest %pil value and all bits are |
192 | + * set in it (0xf), it doesn't matter what PIL_NORMAL_MAX |
193 | + * actually is. |
194 | + */ |
195 | + __asm__ __volatile__( |
196 | + "rdpr %%pil, %0\n\t" |
197 | + "or %0, %2, %1\n\t" |
198 | + "wrpr %1, 0x0, %%pil" |
199 | + : "=r" (flags), "=r" (tmp) |
200 | + : "i" (PIL_NORMAL_MAX) |
201 | + : "memory" |
202 | + ); |
203 | |
204 | return flags; |
205 | } |
206 | diff --git a/arch/sparc/include/asm/thread_info_64.h b/arch/sparc/include/asm/thread_info_64.h |
207 | index 39be9f2..3df02de 100644 |
208 | --- a/arch/sparc/include/asm/thread_info_64.h |
209 | +++ b/arch/sparc/include/asm/thread_info_64.h |
210 | @@ -121,7 +121,7 @@ struct thread_info { |
211 | #define THREAD_SHIFT PAGE_SHIFT |
212 | #endif /* PAGE_SHIFT == 13 */ |
213 | |
214 | -#define PREEMPT_ACTIVE 0x4000000 |
215 | +#define PREEMPT_ACTIVE 0x10000000 |
216 | |
217 | /* |
218 | * macros/functions for gaining access to the thread information structure |
219 | diff --git a/arch/sparc/kernel/pci_common.c b/arch/sparc/kernel/pci_common.c |
220 | index b775658..8a00058 100644 |
221 | --- a/arch/sparc/kernel/pci_common.c |
222 | +++ b/arch/sparc/kernel/pci_common.c |
223 | @@ -371,14 +371,19 @@ static void pci_register_iommu_region(struct pci_pbm_info *pbm) |
224 | struct resource *rp = kzalloc(sizeof(*rp), GFP_KERNEL); |
225 | |
226 | if (!rp) { |
227 | - prom_printf("Cannot allocate IOMMU resource.\n"); |
228 | - prom_halt(); |
229 | + pr_info("%s: Cannot allocate IOMMU resource.\n", |
230 | + pbm->name); |
231 | + return; |
232 | } |
233 | rp->name = "IOMMU"; |
234 | rp->start = pbm->mem_space.start + (unsigned long) vdma[0]; |
235 | rp->end = rp->start + (unsigned long) vdma[1] - 1UL; |
236 | rp->flags = IORESOURCE_BUSY; |
237 | - request_resource(&pbm->mem_space, rp); |
238 | + if (request_resource(&pbm->mem_space, rp)) { |
239 | + pr_info("%s: Unable to request IOMMU resource.\n", |
240 | + pbm->name); |
241 | + kfree(rp); |
242 | + } |
243 | } |
244 | } |
245 | |
246 | diff --git a/arch/sparc/kernel/rtrap_64.S b/arch/sparc/kernel/rtrap_64.S |
247 | index fd3cee4..c720f0c 100644 |
248 | --- a/arch/sparc/kernel/rtrap_64.S |
249 | +++ b/arch/sparc/kernel/rtrap_64.S |
250 | @@ -172,7 +172,17 @@ rtrap_xcall: |
251 | nop |
252 | call trace_hardirqs_on |
253 | nop |
254 | - wrpr %l4, %pil |
255 | + /* Do not actually set the %pil here. We will do that |
256 | + * below after we clear PSTATE_IE in the %pstate register. |
257 | + * If we re-enable interrupts here, we can recurse down |
258 | + * the hardirq stack potentially endlessly, causing a |
259 | + * stack overflow. |
260 | + * |
261 | + * It is tempting to put this test and trace_hardirqs_on |
262 | + * call at the 'rt_continue' label, but that will not work |
263 | + * as that path hits unconditionally and we do not want to |
264 | + * execute this in NMI return paths, for example. |
265 | + */ |
266 | #endif |
267 | rtrap_no_irq_enable: |
268 | andcc %l1, TSTATE_PRIV, %l3 |
269 | diff --git a/arch/sparc/kernel/traps_64.c b/arch/sparc/kernel/traps_64.c |
270 | index 10f7bb9..22cd475 100644 |
271 | --- a/arch/sparc/kernel/traps_64.c |
272 | +++ b/arch/sparc/kernel/traps_64.c |
273 | @@ -2202,27 +2202,6 @@ void dump_stack(void) |
274 | |
275 | EXPORT_SYMBOL(dump_stack); |
276 | |
277 | -static inline int is_kernel_stack(struct task_struct *task, |
278 | - struct reg_window *rw) |
279 | -{ |
280 | - unsigned long rw_addr = (unsigned long) rw; |
281 | - unsigned long thread_base, thread_end; |
282 | - |
283 | - if (rw_addr < PAGE_OFFSET) { |
284 | - if (task != &init_task) |
285 | - return 0; |
286 | - } |
287 | - |
288 | - thread_base = (unsigned long) task_stack_page(task); |
289 | - thread_end = thread_base + sizeof(union thread_union); |
290 | - if (rw_addr >= thread_base && |
291 | - rw_addr < thread_end && |
292 | - !(rw_addr & 0x7UL)) |
293 | - return 1; |
294 | - |
295 | - return 0; |
296 | -} |
297 | - |
298 | static inline struct reg_window *kernel_stack_up(struct reg_window *rw) |
299 | { |
300 | unsigned long fp = rw->ins[6]; |
301 | @@ -2251,6 +2230,7 @@ void die_if_kernel(char *str, struct pt_regs *regs) |
302 | show_regs(regs); |
303 | add_taint(TAINT_DIE); |
304 | if (regs->tstate & TSTATE_PRIV) { |
305 | + struct thread_info *tp = current_thread_info(); |
306 | struct reg_window *rw = (struct reg_window *) |
307 | (regs->u_regs[UREG_FP] + STACK_BIAS); |
308 | |
309 | @@ -2258,8 +2238,8 @@ void die_if_kernel(char *str, struct pt_regs *regs) |
310 | * find some badly aligned kernel stack. |
311 | */ |
312 | while (rw && |
313 | - count++ < 30&& |
314 | - is_kernel_stack(current, rw)) { |
315 | + count++ < 30 && |
316 | + kstack_valid(tp, (unsigned long) rw)) { |
317 | printk("Caller[%016lx]: %pS\n", rw->ins[7], |
318 | (void *) rw->ins[7]); |
319 | |
320 | diff --git a/arch/sparc/kernel/unaligned_64.c b/arch/sparc/kernel/unaligned_64.c |
321 | index 378ca82..95a8e9a 100644 |
322 | --- a/arch/sparc/kernel/unaligned_64.c |
323 | +++ b/arch/sparc/kernel/unaligned_64.c |
324 | @@ -49,7 +49,7 @@ static inline enum direction decode_direction(unsigned int insn) |
325 | } |
326 | |
327 | /* 16 = double-word, 8 = extra-word, 4 = word, 2 = half-word */ |
328 | -static inline int decode_access_size(unsigned int insn) |
329 | +static inline int decode_access_size(struct pt_regs *regs, unsigned int insn) |
330 | { |
331 | unsigned int tmp; |
332 | |
333 | @@ -65,7 +65,7 @@ static inline int decode_access_size(unsigned int insn) |
334 | return 2; |
335 | else { |
336 | printk("Impossible unaligned trap. insn=%08x\n", insn); |
337 | - die_if_kernel("Byte sized unaligned access?!?!", current_thread_info()->kregs); |
338 | + die_if_kernel("Byte sized unaligned access?!?!", regs); |
339 | |
340 | /* GCC should never warn that control reaches the end |
341 | * of this function without returning a value because |
342 | @@ -289,7 +289,7 @@ static void log_unaligned(struct pt_regs *regs) |
343 | asmlinkage void kernel_unaligned_trap(struct pt_regs *regs, unsigned int insn) |
344 | { |
345 | enum direction dir = decode_direction(insn); |
346 | - int size = decode_access_size(insn); |
347 | + int size = decode_access_size(regs, insn); |
348 | int orig_asi, asi; |
349 | |
350 | current_thread_info()->kern_una_regs = regs; |
351 | diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig |
352 | index eb40925..ddb52b8 100644 |
353 | --- a/arch/x86/Kconfig |
354 | +++ b/arch/x86/Kconfig |
355 | @@ -627,7 +627,7 @@ config GART_IOMMU |
356 | bool "GART IOMMU support" if EMBEDDED |
357 | default y |
358 | select SWIOTLB |
359 | - depends on X86_64 && PCI |
360 | + depends on X86_64 && PCI && K8_NB |
361 | ---help--- |
362 | Support for full DMA access of devices with 32bit memory access only |
363 | on systems with more than 3GB. This is usually needed for USB, |
364 | @@ -2026,7 +2026,7 @@ endif # X86_32 |
365 | |
366 | config K8_NB |
367 | def_bool y |
368 | - depends on AGP_AMD64 || (X86_64 && (GART_IOMMU || (PCI && NUMA))) |
369 | + depends on CPU_SUP_AMD && PCI |
370 | |
371 | source "drivers/pcmcia/Kconfig" |
372 | |
373 | diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c |
374 | index be37059..b35c160 100644 |
375 | --- a/arch/x86/kernel/apic/io_apic.c |
376 | +++ b/arch/x86/kernel/apic/io_apic.c |
377 | @@ -2539,6 +2539,9 @@ void irq_force_complete_move(int irq) |
378 | struct irq_desc *desc = irq_to_desc(irq); |
379 | struct irq_cfg *cfg = desc->chip_data; |
380 | |
381 | + if (!cfg) |
382 | + return; |
383 | + |
384 | __irq_complete_move(&desc, cfg->vector); |
385 | } |
386 | #else |
387 | diff --git a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c |
388 | index 6e44519..3b5ea38 100644 |
389 | --- a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c |
390 | +++ b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c |
391 | @@ -929,7 +929,8 @@ static int fill_powernow_table_pstate(struct powernow_k8_data *data, |
392 | powernow_table[i].index = index; |
393 | |
394 | /* Frequency may be rounded for these */ |
395 | - if (boot_cpu_data.x86 == 0x10 || boot_cpu_data.x86 == 0x11) { |
396 | + if ((boot_cpu_data.x86 == 0x10 && boot_cpu_data.x86_model < 10) |
397 | + || boot_cpu_data.x86 == 0x11) { |
398 | powernow_table[i].frequency = |
399 | freq_from_fid_did(lo & 0x3f, (lo >> 6) & 7); |
400 | } else |
401 | diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c |
402 | index 7e1cca1..1366c7c 100644 |
403 | --- a/arch/x86/kernel/cpu/intel.c |
404 | +++ b/arch/x86/kernel/cpu/intel.c |
405 | @@ -47,6 +47,27 @@ static void __cpuinit early_init_intel(struct cpuinfo_x86 *c) |
406 | (c->x86 == 0x6 && c->x86_model >= 0x0e)) |
407 | set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC); |
408 | |
409 | + /* |
410 | + * Atom erratum AAE44/AAF40/AAG38/AAH41: |
411 | + * |
412 | + * A race condition between speculative fetches and invalidating |
413 | + * a large page. This is worked around in microcode, but we |
414 | + * need the microcode to have already been loaded... so if it is |
415 | + * not, recommend a BIOS update and disable large pages. |
416 | + */ |
417 | + if (c->x86 == 6 && c->x86_model == 0x1c && c->x86_mask <= 2) { |
418 | + u32 ucode, junk; |
419 | + |
420 | + wrmsr(MSR_IA32_UCODE_REV, 0, 0); |
421 | + sync_core(); |
422 | + rdmsr(MSR_IA32_UCODE_REV, junk, ucode); |
423 | + |
424 | + if (ucode < 0x20e) { |
425 | + printk(KERN_WARNING "Atom PSE erratum detected, BIOS microcode update recommended\n"); |
426 | + clear_cpu_cap(c, X86_FEATURE_PSE); |
427 | + } |
428 | + } |
429 | + |
430 | #ifdef CONFIG_X86_64 |
431 | set_cpu_cap(c, X86_FEATURE_SYSENTER32); |
432 | #else |
433 | diff --git a/arch/x86/kernel/k8.c b/arch/x86/kernel/k8.c |
434 | index cbc4332..9b89546 100644 |
435 | --- a/arch/x86/kernel/k8.c |
436 | +++ b/arch/x86/kernel/k8.c |
437 | @@ -121,3 +121,17 @@ void k8_flush_garts(void) |
438 | } |
439 | EXPORT_SYMBOL_GPL(k8_flush_garts); |
440 | |
441 | +static __init int init_k8_nbs(void) |
442 | +{ |
443 | + int err = 0; |
444 | + |
445 | + err = cache_k8_northbridges(); |
446 | + |
447 | + if (err < 0) |
448 | + printk(KERN_NOTICE "K8 NB: Cannot enumerate AMD northbridges.\n"); |
449 | + |
450 | + return err; |
451 | +} |
452 | + |
453 | +/* This has to go after the PCI subsystem */ |
454 | +fs_initcall(init_k8_nbs); |
455 | diff --git a/arch/x86/kernel/pci-gart_64.c b/arch/x86/kernel/pci-gart_64.c |
456 | index 4f41b29..0ae24d9 100644 |
457 | --- a/arch/x86/kernel/pci-gart_64.c |
458 | +++ b/arch/x86/kernel/pci-gart_64.c |
459 | @@ -738,7 +738,7 @@ int __init gart_iommu_init(void) |
460 | unsigned long scratch; |
461 | long i; |
462 | |
463 | - if (cache_k8_northbridges() < 0 || num_k8_northbridges == 0) |
464 | + if (num_k8_northbridges == 0) |
465 | return 0; |
466 | |
467 | #ifndef CONFIG_AGP_AMD64 |
468 | diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c |
469 | index 126f0b4..11d0702 100644 |
470 | --- a/arch/x86/kernel/process_64.c |
471 | +++ b/arch/x86/kernel/process_64.c |
472 | @@ -282,12 +282,12 @@ int copy_thread(unsigned long clone_flags, unsigned long sp, |
473 | |
474 | set_tsk_thread_flag(p, TIF_FORK); |
475 | |
476 | - p->thread.fs = me->thread.fs; |
477 | - p->thread.gs = me->thread.gs; |
478 | p->thread.io_bitmap_ptr = NULL; |
479 | |
480 | savesegment(gs, p->thread.gsindex); |
481 | + p->thread.gs = p->thread.gsindex ? 0 : me->thread.gs; |
482 | savesegment(fs, p->thread.fsindex); |
483 | + p->thread.fs = p->thread.fsindex ? 0 : me->thread.fs; |
484 | savesegment(es, p->thread.es); |
485 | savesegment(ds, p->thread.ds); |
486 | |
487 | diff --git a/block/blk-timeout.c b/block/blk-timeout.c |
488 | index 1ba7e0a..4f0c06c 100644 |
489 | --- a/block/blk-timeout.c |
490 | +++ b/block/blk-timeout.c |
491 | @@ -109,6 +109,7 @@ void blk_rq_timed_out_timer(unsigned long data) |
492 | struct request_queue *q = (struct request_queue *) data; |
493 | unsigned long flags, next = 0; |
494 | struct request *rq, *tmp; |
495 | + int next_set = 0; |
496 | |
497 | spin_lock_irqsave(q->queue_lock, flags); |
498 | |
499 | @@ -122,16 +123,13 @@ void blk_rq_timed_out_timer(unsigned long data) |
500 | if (blk_mark_rq_complete(rq)) |
501 | continue; |
502 | blk_rq_timed_out(rq); |
503 | - } else if (!next || time_after(next, rq->deadline)) |
504 | + } else if (!next_set || time_after(next, rq->deadline)) { |
505 | next = rq->deadline; |
506 | + next_set = 1; |
507 | + } |
508 | } |
509 | |
510 | - /* |
511 | - * next can never be 0 here with the list non-empty, since we always |
512 | - * bump ->deadline to 1 so we can detect if the timer was ever added |
513 | - * or not. See comment in blk_add_timer() |
514 | - */ |
515 | - if (next) |
516 | + if (next_set) |
517 | mod_timer(&q->timeout, round_jiffies_up(next)); |
518 | |
519 | spin_unlock_irqrestore(q->queue_lock, flags); |
520 | diff --git a/crypto/async_tx/async_raid6_recov.c b/crypto/async_tx/async_raid6_recov.c |
521 | index 943f2ab..ce038d8 100644 |
522 | --- a/crypto/async_tx/async_raid6_recov.c |
523 | +++ b/crypto/async_tx/async_raid6_recov.c |
524 | @@ -324,6 +324,7 @@ struct dma_async_tx_descriptor * |
525 | async_raid6_2data_recov(int disks, size_t bytes, int faila, int failb, |
526 | struct page **blocks, struct async_submit_ctl *submit) |
527 | { |
528 | + void *scribble = submit->scribble; |
529 | int non_zero_srcs, i; |
530 | |
531 | BUG_ON(faila == failb); |
532 | @@ -332,11 +333,13 @@ async_raid6_2data_recov(int disks, size_t bytes, int faila, int failb, |
533 | |
534 | pr_debug("%s: disks: %d len: %zu\n", __func__, disks, bytes); |
535 | |
536 | - /* we need to preserve the contents of 'blocks' for the async |
537 | - * case, so punt to synchronous if a scribble buffer is not available |
538 | + /* if a dma resource is not available or a scribble buffer is not |
539 | + * available punt to the synchronous path. In the 'dma not |
540 | + * available' case be sure to use the scribble buffer to |
541 | + * preserve the content of 'blocks' as the caller intended. |
542 | */ |
543 | - if (!submit->scribble) { |
544 | - void **ptrs = (void **) blocks; |
545 | + if (!async_dma_find_channel(DMA_PQ) || !scribble) { |
546 | + void **ptrs = scribble ? scribble : (void **) blocks; |
547 | |
548 | async_tx_quiesce(&submit->depend_tx); |
549 | for (i = 0; i < disks; i++) |
550 | @@ -406,11 +409,13 @@ async_raid6_datap_recov(int disks, size_t bytes, int faila, |
551 | |
552 | pr_debug("%s: disks: %d len: %zu\n", __func__, disks, bytes); |
553 | |
554 | - /* we need to preserve the contents of 'blocks' for the async |
555 | - * case, so punt to synchronous if a scribble buffer is not available |
556 | + /* if a dma resource is not available or a scribble buffer is not |
557 | + * available punt to the synchronous path. In the 'dma not |
558 | + * available' case be sure to use the scribble buffer to |
559 | + * preserve the content of 'blocks' as the caller intended. |
560 | */ |
561 | - if (!scribble) { |
562 | - void **ptrs = (void **) blocks; |
563 | + if (!async_dma_find_channel(DMA_PQ) || !scribble) { |
564 | + void **ptrs = scribble ? scribble : (void **) blocks; |
565 | |
566 | async_tx_quiesce(&submit->depend_tx); |
567 | for (i = 0; i < disks; i++) |
568 | diff --git a/drivers/Makefile b/drivers/Makefile |
569 | index 6ee53c7..8b0b948 100644 |
570 | --- a/drivers/Makefile |
571 | +++ b/drivers/Makefile |
572 | @@ -17,6 +17,7 @@ obj-$(CONFIG_SFI) += sfi/ |
573 | obj-$(CONFIG_PNP) += pnp/ |
574 | obj-$(CONFIG_ARM_AMBA) += amba/ |
575 | |
576 | +obj-$(CONFIG_VIRTIO) += virtio/ |
577 | obj-$(CONFIG_XEN) += xen/ |
578 | |
579 | # regulators early, since some subsystems rely on them to initialize |
580 | @@ -106,7 +107,6 @@ obj-$(CONFIG_HID) += hid/ |
581 | obj-$(CONFIG_PPC_PS3) += ps3/ |
582 | obj-$(CONFIG_OF) += of/ |
583 | obj-$(CONFIG_SSB) += ssb/ |
584 | -obj-$(CONFIG_VIRTIO) += virtio/ |
585 | obj-$(CONFIG_VLYNQ) += vlynq/ |
586 | obj-$(CONFIG_STAGING) += staging/ |
587 | obj-y += platform/ |
588 | diff --git a/drivers/acpi/power_meter.c b/drivers/acpi/power_meter.c |
589 | index dc4ffad..e02d93c 100644 |
590 | --- a/drivers/acpi/power_meter.c |
591 | +++ b/drivers/acpi/power_meter.c |
592 | @@ -34,7 +34,7 @@ |
593 | #define ACPI_POWER_METER_NAME "power_meter" |
594 | ACPI_MODULE_NAME(ACPI_POWER_METER_NAME); |
595 | #define ACPI_POWER_METER_DEVICE_NAME "Power Meter" |
596 | -#define ACPI_POWER_METER_CLASS "power_meter_resource" |
597 | +#define ACPI_POWER_METER_CLASS "pwr_meter_resource" |
598 | |
599 | #define NUM_SENSORS 17 |
600 | |
601 | diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c |
602 | index 79d33d9..7c85265 100644 |
603 | --- a/drivers/acpi/sleep.c |
604 | +++ b/drivers/acpi/sleep.c |
605 | @@ -450,6 +450,126 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = { |
606 | }, |
607 | }, |
608 | { |
609 | + .callback = init_set_sci_en_on_resume, |
610 | + .ident = "Lenovo ThinkPad T410", |
611 | + .matches = { |
612 | + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), |
613 | + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T410"), |
614 | + }, |
615 | + }, |
616 | + { |
617 | + .callback = init_set_sci_en_on_resume, |
618 | + .ident = "Lenovo ThinkPad T510", |
619 | + .matches = { |
620 | + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), |
621 | + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T510"), |
622 | + }, |
623 | + }, |
624 | + { |
625 | + .callback = init_set_sci_en_on_resume, |
626 | + .ident = "Lenovo ThinkPad W510", |
627 | + .matches = { |
628 | + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), |
629 | + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad W510"), |
630 | + }, |
631 | + }, |
632 | + { |
633 | + .callback = init_set_sci_en_on_resume, |
634 | + .ident = "Lenovo ThinkPad X201", |
635 | + .matches = { |
636 | + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), |
637 | + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201"), |
638 | + }, |
639 | + }, |
640 | + { |
641 | + .callback = init_set_sci_en_on_resume, |
642 | + .ident = "Lenovo ThinkPad X201", |
643 | + .matches = { |
644 | + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), |
645 | + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201s"), |
646 | + }, |
647 | + }, |
648 | + { |
649 | + .callback = init_set_sci_en_on_resume, |
650 | + .ident = "Lenovo ThinkPad T410", |
651 | + .matches = { |
652 | + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), |
653 | + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T410"), |
654 | + }, |
655 | + }, |
656 | + { |
657 | + .callback = init_set_sci_en_on_resume, |
658 | + .ident = "Lenovo ThinkPad T510", |
659 | + .matches = { |
660 | + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), |
661 | + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T510"), |
662 | + }, |
663 | + }, |
664 | + { |
665 | + .callback = init_set_sci_en_on_resume, |
666 | + .ident = "Lenovo ThinkPad W510", |
667 | + .matches = { |
668 | + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), |
669 | + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad W510"), |
670 | + }, |
671 | + }, |
672 | + { |
673 | + .callback = init_set_sci_en_on_resume, |
674 | + .ident = "Lenovo ThinkPad X201", |
675 | + .matches = { |
676 | + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), |
677 | + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201"), |
678 | + }, |
679 | + }, |
680 | + { |
681 | + .callback = init_set_sci_en_on_resume, |
682 | + .ident = "Lenovo ThinkPad X201", |
683 | + .matches = { |
684 | + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), |
685 | + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201s"), |
686 | + }, |
687 | + }, |
688 | + { |
689 | + .callback = init_set_sci_en_on_resume, |
690 | + .ident = "Lenovo ThinkPad T410", |
691 | + .matches = { |
692 | + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), |
693 | + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T410"), |
694 | + }, |
695 | + }, |
696 | + { |
697 | + .callback = init_set_sci_en_on_resume, |
698 | + .ident = "Lenovo ThinkPad T510", |
699 | + .matches = { |
700 | + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), |
701 | + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T510"), |
702 | + }, |
703 | + }, |
704 | + { |
705 | + .callback = init_set_sci_en_on_resume, |
706 | + .ident = "Lenovo ThinkPad W510", |
707 | + .matches = { |
708 | + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), |
709 | + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad W510"), |
710 | + }, |
711 | + }, |
712 | + { |
713 | + .callback = init_set_sci_en_on_resume, |
714 | + .ident = "Lenovo ThinkPad X201", |
715 | + .matches = { |
716 | + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), |
717 | + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201"), |
718 | + }, |
719 | + }, |
720 | + { |
721 | + .callback = init_set_sci_en_on_resume, |
722 | + .ident = "Lenovo ThinkPad X201", |
723 | + .matches = { |
724 | + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), |
725 | + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201s"), |
726 | + }, |
727 | + }, |
728 | + { |
729 | .callback = init_old_suspend_ordering, |
730 | .ident = "Panasonic CF51-2L", |
731 | .matches = { |
732 | @@ -458,6 +578,30 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = { |
733 | DMI_MATCH(DMI_BOARD_NAME, "CF51-2L"), |
734 | }, |
735 | }, |
736 | + { |
737 | + .callback = init_set_sci_en_on_resume, |
738 | + .ident = "Dell Studio 1558", |
739 | + .matches = { |
740 | + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), |
741 | + DMI_MATCH(DMI_PRODUCT_NAME, "Studio 1558"), |
742 | + }, |
743 | + }, |
744 | + { |
745 | + .callback = init_set_sci_en_on_resume, |
746 | + .ident = "Dell Studio 1557", |
747 | + .matches = { |
748 | + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), |
749 | + DMI_MATCH(DMI_PRODUCT_NAME, "Studio 1557"), |
750 | + }, |
751 | + }, |
752 | + { |
753 | + .callback = init_set_sci_en_on_resume, |
754 | + .ident = "Dell Studio 1555", |
755 | + .matches = { |
756 | + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), |
757 | + DMI_MATCH(DMI_PRODUCT_NAME, "Studio 1555"), |
758 | + }, |
759 | + }, |
760 | {}, |
761 | }; |
762 | #endif /* CONFIG_SUSPEND */ |
763 | diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c |
764 | index 9f6cfac..228740f 100644 |
765 | --- a/drivers/ata/libata-eh.c |
766 | +++ b/drivers/ata/libata-eh.c |
767 | @@ -879,6 +879,8 @@ static void ata_eh_set_pending(struct ata_port *ap, int fastdrain) |
768 | void ata_qc_schedule_eh(struct ata_queued_cmd *qc) |
769 | { |
770 | struct ata_port *ap = qc->ap; |
771 | + struct request_queue *q = qc->scsicmd->device->request_queue; |
772 | + unsigned long flags; |
773 | |
774 | WARN_ON(!ap->ops->error_handler); |
775 | |
776 | @@ -890,7 +892,9 @@ void ata_qc_schedule_eh(struct ata_queued_cmd *qc) |
777 | * Note that ATA_QCFLAG_FAILED is unconditionally set after |
778 | * this function completes. |
779 | */ |
780 | + spin_lock_irqsave(q->queue_lock, flags); |
781 | blk_abort_request(qc->scsicmd->request); |
782 | + spin_unlock_irqrestore(q->queue_lock, flags); |
783 | } |
784 | |
785 | /** |
786 | @@ -1624,6 +1628,7 @@ void ata_eh_analyze_ncq_error(struct ata_link *link) |
787 | } |
788 | |
789 | /* okay, this error is ours */ |
790 | + memset(&tf, 0, sizeof(tf)); |
791 | rc = ata_eh_read_log_10h(dev, &tag, &tf); |
792 | if (rc) { |
793 | ata_link_printk(link, KERN_ERR, "failed to read log page 10h " |
794 | diff --git a/drivers/base/memory.c b/drivers/base/memory.c |
795 | index bd02505..d7d77d4 100644 |
796 | --- a/drivers/base/memory.c |
797 | +++ b/drivers/base/memory.c |
798 | @@ -311,7 +311,7 @@ static SYSDEV_ATTR(removable, 0444, show_mem_removable, NULL); |
799 | static ssize_t |
800 | print_block_size(struct class *class, char *buf) |
801 | { |
802 | - return sprintf(buf, "%#lx\n", (unsigned long)PAGES_PER_SECTION * PAGE_SIZE); |
803 | + return sprintf(buf, "%lx\n", (unsigned long)PAGES_PER_SECTION * PAGE_SIZE); |
804 | } |
805 | |
806 | static CLASS_ATTR(block_size_bytes, 0444, print_block_size, NULL); |
807 | diff --git a/drivers/char/agp/Kconfig b/drivers/char/agp/Kconfig |
808 | index 2fb3a48..4b66c69 100644 |
809 | --- a/drivers/char/agp/Kconfig |
810 | +++ b/drivers/char/agp/Kconfig |
811 | @@ -57,7 +57,7 @@ config AGP_AMD |
812 | |
813 | config AGP_AMD64 |
814 | tristate "AMD Opteron/Athlon64 on-CPU GART support" |
815 | - depends on AGP && X86 |
816 | + depends on AGP && X86 && K8_NB |
817 | help |
818 | This option gives you AGP support for the GLX component of |
819 | X using the on-CPU northbridge of the AMD Athlon64/Opteron CPUs. |
820 | diff --git a/drivers/cpuidle/governors/menu.c b/drivers/cpuidle/governors/menu.c |
821 | index 73655ae..f8e57c6 100644 |
822 | --- a/drivers/cpuidle/governors/menu.c |
823 | +++ b/drivers/cpuidle/governors/menu.c |
824 | @@ -101,7 +101,6 @@ struct menu_device { |
825 | |
826 | unsigned int expected_us; |
827 | u64 predicted_us; |
828 | - unsigned int measured_us; |
829 | unsigned int exit_us; |
830 | unsigned int bucket; |
831 | u64 correction_factor[BUCKETS]; |
832 | @@ -187,14 +186,14 @@ static int menu_select(struct cpuidle_device *dev) |
833 | int i; |
834 | int multiplier; |
835 | |
836 | - data->last_state_idx = 0; |
837 | - data->exit_us = 0; |
838 | - |
839 | if (data->needs_update) { |
840 | menu_update(dev); |
841 | data->needs_update = 0; |
842 | } |
843 | |
844 | + data->last_state_idx = 0; |
845 | + data->exit_us = 0; |
846 | + |
847 | /* Special case when user has set very strict latency requirement */ |
848 | if (unlikely(latency_req == 0)) |
849 | return 0; |
850 | @@ -294,7 +293,7 @@ static void menu_update(struct cpuidle_device *dev) |
851 | new_factor = data->correction_factor[data->bucket] |
852 | * (DECAY - 1) / DECAY; |
853 | |
854 | - if (data->expected_us > 0 && data->measured_us < MAX_INTERESTING) |
855 | + if (data->expected_us > 0 && measured_us < MAX_INTERESTING) |
856 | new_factor += RESOLUTION * measured_us / data->expected_us; |
857 | else |
858 | /* |
859 | diff --git a/drivers/edac/edac_mce_amd.c b/drivers/edac/edac_mce_amd.c |
860 | index f5b6d9f..97e64bc 100644 |
861 | --- a/drivers/edac/edac_mce_amd.c |
862 | +++ b/drivers/edac/edac_mce_amd.c |
863 | @@ -294,7 +294,6 @@ wrong_ls_mce: |
864 | void amd_decode_nb_mce(int node_id, struct err_regs *regs, int handle_errors) |
865 | { |
866 | u32 ec = ERROR_CODE(regs->nbsl); |
867 | - u32 xec = EXT_ERROR_CODE(regs->nbsl); |
868 | |
869 | if (!handle_errors) |
870 | return; |
871 | @@ -324,7 +323,7 @@ void amd_decode_nb_mce(int node_id, struct err_regs *regs, int handle_errors) |
872 | pr_cont("\n"); |
873 | } |
874 | |
875 | - pr_emerg("%s.\n", EXT_ERR_MSG(xec)); |
876 | + pr_emerg("%s.\n", EXT_ERR_MSG(regs->nbsl)); |
877 | |
878 | if (BUS_ERROR(ec) && nb_bus_decoder) |
879 | nb_bus_decoder(node_id, regs); |
880 | @@ -374,7 +373,7 @@ static int amd_decode_mce(struct notifier_block *nb, unsigned long val, |
881 | ((m->status & MCI_STATUS_PCC) ? "yes" : "no")); |
882 | |
883 | /* do the two bits[14:13] together */ |
884 | - ecc = m->status & (3ULL << 45); |
885 | + ecc = (m->status >> 45) & 0x3; |
886 | if (ecc) |
887 | pr_cont(", %sECC Error", ((ecc == 2) ? "C" : "U")); |
888 | |
889 | diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c |
890 | index a894ade..1372796 100644 |
891 | --- a/drivers/gpu/drm/i915/i915_debugfs.c |
892 | +++ b/drivers/gpu/drm/i915/i915_debugfs.c |
893 | @@ -162,7 +162,7 @@ static int i915_interrupt_info(struct seq_file *m, void *data) |
894 | struct drm_device *dev = node->minor->dev; |
895 | drm_i915_private_t *dev_priv = dev->dev_private; |
896 | |
897 | - if (!IS_IRONLAKE(dev)) { |
898 | + if (!HAS_PCH_SPLIT(dev)) { |
899 | seq_printf(m, "Interrupt enable: %08x\n", |
900 | I915_READ(IER)); |
901 | seq_printf(m, "Interrupt identity: %08x\n", |
902 | diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c |
903 | index 2307f98..d642efd 100644 |
904 | --- a/drivers/gpu/drm/i915/i915_dma.c |
905 | +++ b/drivers/gpu/drm/i915/i915_dma.c |
906 | @@ -978,15 +978,21 @@ static int i915_probe_agp(struct drm_device *dev, uint32_t *aperture_size, |
907 | * Some of the preallocated space is taken by the GTT |
908 | * and popup. GTT is 1K per MB of aperture size, and popup is 4K. |
909 | */ |
910 | - if (IS_G4X(dev) || IS_PINEVIEW(dev) || IS_IRONLAKE(dev)) |
911 | + if (IS_G4X(dev) || IS_PINEVIEW(dev) || IS_IRONLAKE(dev) || IS_GEN6(dev)) |
912 | overhead = 4096; |
913 | else |
914 | overhead = (*aperture_size / 1024) + 4096; |
915 | |
916 | switch (tmp & INTEL_GMCH_GMS_MASK) { |
917 | case INTEL_855_GMCH_GMS_DISABLED: |
918 | - DRM_ERROR("video memory is disabled\n"); |
919 | - return -1; |
920 | + /* XXX: This is what my A1 silicon has. */ |
921 | + if (IS_GEN6(dev)) { |
922 | + stolen = 64 * 1024 * 1024; |
923 | + } else { |
924 | + DRM_ERROR("video memory is disabled\n"); |
925 | + return -1; |
926 | + } |
927 | + break; |
928 | case INTEL_855_GMCH_GMS_STOLEN_1M: |
929 | stolen = 1 * 1024 * 1024; |
930 | break; |
931 | @@ -1064,7 +1070,7 @@ static unsigned long i915_gtt_to_phys(struct drm_device *dev, |
932 | int gtt_offset, gtt_size; |
933 | |
934 | if (IS_I965G(dev)) { |
935 | - if (IS_G4X(dev) || IS_IRONLAKE(dev)) { |
936 | + if (IS_G4X(dev) || IS_IRONLAKE(dev) || IS_GEN6(dev)) { |
937 | gtt_offset = 2*1024*1024; |
938 | gtt_size = 2*1024*1024; |
939 | } else { |
940 | @@ -1445,7 +1451,7 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) |
941 | |
942 | dev->driver->get_vblank_counter = i915_get_vblank_counter; |
943 | dev->max_vblank_count = 0xffffff; /* only 24 bits of frame count */ |
944 | - if (IS_G4X(dev) || IS_IRONLAKE(dev)) { |
945 | + if (IS_G4X(dev) || IS_IRONLAKE(dev) || IS_GEN6(dev)) { |
946 | dev->max_vblank_count = 0xffffffff; /* full 32 bit counter */ |
947 | dev->driver->get_vblank_counter = gm45_get_vblank_counter; |
948 | } |
949 | diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h |
950 | index b99b6a8..16ce3ba 100644 |
951 | --- a/drivers/gpu/drm/i915/i915_drv.h |
952 | +++ b/drivers/gpu/drm/i915/i915_drv.h |
953 | @@ -1026,7 +1026,7 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller); |
954 | #define IS_845G(dev) ((dev)->pci_device == 0x2562) |
955 | #define IS_I85X(dev) ((dev)->pci_device == 0x3582) |
956 | #define IS_I865G(dev) ((dev)->pci_device == 0x2572) |
957 | -#define IS_I8XX(dev) (INTEL_INFO(dev)->is_i8xx) |
958 | +#define IS_GEN2(dev) (INTEL_INFO(dev)->is_i8xx) |
959 | #define IS_I915G(dev) (INTEL_INFO(dev)->is_i915g) |
960 | #define IS_I915GM(dev) ((dev)->pci_device == 0x2592) |
961 | #define IS_I945G(dev) ((dev)->pci_device == 0x2772) |
962 | @@ -1045,8 +1045,29 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller); |
963 | #define IS_I9XX(dev) (INTEL_INFO(dev)->is_i9xx) |
964 | #define IS_MOBILE(dev) (INTEL_INFO(dev)->is_mobile) |
965 | |
966 | +#define IS_GEN3(dev) (IS_I915G(dev) || \ |
967 | + IS_I915GM(dev) || \ |
968 | + IS_I945G(dev) || \ |
969 | + IS_I945GM(dev) || \ |
970 | + IS_G33(dev) || \ |
971 | + IS_PINEVIEW(dev)) |
972 | +#define IS_GEN4(dev) ((dev)->pci_device == 0x2972 || \ |
973 | + (dev)->pci_device == 0x2982 || \ |
974 | + (dev)->pci_device == 0x2992 || \ |
975 | + (dev)->pci_device == 0x29A2 || \ |
976 | + (dev)->pci_device == 0x2A02 || \ |
977 | + (dev)->pci_device == 0x2A12 || \ |
978 | + (dev)->pci_device == 0x2E02 || \ |
979 | + (dev)->pci_device == 0x2E12 || \ |
980 | + (dev)->pci_device == 0x2E22 || \ |
981 | + (dev)->pci_device == 0x2E32 || \ |
982 | + (dev)->pci_device == 0x2A42 || \ |
983 | + (dev)->pci_device == 0x2E42) |
984 | + |
985 | #define I915_NEED_GFX_HWS(dev) (INTEL_INFO(dev)->need_gfx_hws) |
986 | |
987 | +#define IS_GEN6(dev) ((dev)->pci_device == 0x0102) |
988 | + |
989 | /* With the 945 and later, Y tiling got adjusted so that it was 32 128-byte |
990 | * rows, which changed the alignment requirements and fence programming. |
991 | */ |
992 | @@ -1067,6 +1088,9 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller); |
993 | #define I915_HAS_FBC(dev) (INTEL_INFO(dev)->has_fbc) |
994 | #define I915_HAS_RC6(dev) (INTEL_INFO(dev)->has_rc6) |
995 | |
996 | +#define HAS_PCH_SPLIT(dev) (IS_IRONLAKE(dev) || \ |
997 | + IS_GEN6(dev)) |
998 | + |
999 | #define PRIMARY_RINGBUFFER_SIZE (128*1024) |
1000 | |
1001 | #endif |
1002 | diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c |
1003 | index fd099a1..6458400 100644 |
1004 | --- a/drivers/gpu/drm/i915/i915_gem.c |
1005 | +++ b/drivers/gpu/drm/i915/i915_gem.c |
1006 | @@ -1819,7 +1819,7 @@ i915_do_wait_request(struct drm_device *dev, uint32_t seqno, int interruptible) |
1007 | return -EIO; |
1008 | |
1009 | if (!i915_seqno_passed(i915_get_gem_seqno(dev), seqno)) { |
1010 | - if (IS_IRONLAKE(dev)) |
1011 | + if (HAS_PCH_SPLIT(dev)) |
1012 | ier = I915_READ(DEIER) | I915_READ(GTIER); |
1013 | else |
1014 | ier = I915_READ(IER); |
1015 | @@ -2316,6 +2316,12 @@ static void i915_write_fence_reg(struct drm_i915_fence_reg *reg) |
1016 | pitch_val = obj_priv->stride / tile_width; |
1017 | pitch_val = ffs(pitch_val) - 1; |
1018 | |
1019 | + if (obj_priv->tiling_mode == I915_TILING_Y && |
1020 | + HAS_128_BYTE_Y_TILING(dev)) |
1021 | + WARN_ON(pitch_val > I830_FENCE_MAX_PITCH_VAL); |
1022 | + else |
1023 | + WARN_ON(pitch_val > I915_FENCE_MAX_PITCH_VAL); |
1024 | + |
1025 | val = obj_priv->gtt_offset; |
1026 | if (obj_priv->tiling_mode == I915_TILING_Y) |
1027 | val |= 1 << I830_FENCE_TILING_Y_SHIFT; |
1028 | diff --git a/drivers/gpu/drm/i915/i915_gem_tiling.c b/drivers/gpu/drm/i915/i915_gem_tiling.c |
1029 | index df278b2..040e80c 100644 |
1030 | --- a/drivers/gpu/drm/i915/i915_gem_tiling.c |
1031 | +++ b/drivers/gpu/drm/i915/i915_gem_tiling.c |
1032 | @@ -209,7 +209,7 @@ i915_gem_detect_bit_6_swizzle(struct drm_device *dev) |
1033 | uint32_t swizzle_y = I915_BIT_6_SWIZZLE_UNKNOWN; |
1034 | bool need_disable; |
1035 | |
1036 | - if (IS_IRONLAKE(dev)) { |
1037 | + if (IS_IRONLAKE(dev) || IS_GEN6(dev)) { |
1038 | /* On Ironlake whatever DRAM config, GPU always do |
1039 | * same swizzling setup. |
1040 | */ |
1041 | @@ -357,21 +357,17 @@ i915_tiling_ok(struct drm_device *dev, int stride, int size, int tiling_mode) |
1042 | * reg, so dont bother to check the size */ |
1043 | if (stride / 128 > I965_FENCE_MAX_PITCH_VAL) |
1044 | return false; |
1045 | - } else if (IS_I9XX(dev)) { |
1046 | - uint32_t pitch_val = ffs(stride / tile_width) - 1; |
1047 | - |
1048 | - /* XXX: For Y tiling, FENCE_MAX_PITCH_VAL is actually 6 (8KB) |
1049 | - * instead of 4 (2KB) on 945s. |
1050 | - */ |
1051 | - if (pitch_val > I915_FENCE_MAX_PITCH_VAL || |
1052 | - size > (I830_FENCE_MAX_SIZE_VAL << 20)) |
1053 | + } else if (IS_GEN3(dev) || IS_GEN2(dev)) { |
1054 | + if (stride > 8192) |
1055 | return false; |
1056 | - } else { |
1057 | - uint32_t pitch_val = ffs(stride / tile_width) - 1; |
1058 | |
1059 | - if (pitch_val > I830_FENCE_MAX_PITCH_VAL || |
1060 | - size > (I830_FENCE_MAX_SIZE_VAL << 19)) |
1061 | - return false; |
1062 | + if (IS_GEN3(dev)) { |
1063 | + if (size > I830_FENCE_MAX_SIZE_VAL << 20) |
1064 | + return false; |
1065 | + } else { |
1066 | + if (size > I830_FENCE_MAX_SIZE_VAL << 19) |
1067 | + return false; |
1068 | + } |
1069 | } |
1070 | |
1071 | /* 965+ just needs multiples of tile width */ |
1072 | diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c |
1073 | index a17d6bd..032f667 100644 |
1074 | --- a/drivers/gpu/drm/i915/i915_irq.c |
1075 | +++ b/drivers/gpu/drm/i915/i915_irq.c |
1076 | @@ -576,7 +576,7 @@ irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS) |
1077 | |
1078 | atomic_inc(&dev_priv->irq_received); |
1079 | |
1080 | - if (IS_IRONLAKE(dev)) |
1081 | + if (HAS_PCH_SPLIT(dev)) |
1082 | return ironlake_irq_handler(dev); |
1083 | |
1084 | iir = I915_READ(IIR); |
1085 | @@ -737,7 +737,7 @@ void i915_user_irq_get(struct drm_device *dev) |
1086 | |
1087 | spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); |
1088 | if (dev->irq_enabled && (++dev_priv->user_irq_refcount == 1)) { |
1089 | - if (IS_IRONLAKE(dev)) |
1090 | + if (HAS_PCH_SPLIT(dev)) |
1091 | ironlake_enable_graphics_irq(dev_priv, GT_USER_INTERRUPT); |
1092 | else |
1093 | i915_enable_irq(dev_priv, I915_USER_INTERRUPT); |
1094 | @@ -753,7 +753,7 @@ void i915_user_irq_put(struct drm_device *dev) |
1095 | spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); |
1096 | BUG_ON(dev->irq_enabled && dev_priv->user_irq_refcount <= 0); |
1097 | if (dev->irq_enabled && (--dev_priv->user_irq_refcount == 0)) { |
1098 | - if (IS_IRONLAKE(dev)) |
1099 | + if (HAS_PCH_SPLIT(dev)) |
1100 | ironlake_disable_graphics_irq(dev_priv, GT_USER_INTERRUPT); |
1101 | else |
1102 | i915_disable_irq(dev_priv, I915_USER_INTERRUPT); |
1103 | @@ -861,7 +861,7 @@ int i915_enable_vblank(struct drm_device *dev, int pipe) |
1104 | return -EINVAL; |
1105 | |
1106 | spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); |
1107 | - if (IS_IRONLAKE(dev)) |
1108 | + if (HAS_PCH_SPLIT(dev)) |
1109 | ironlake_enable_display_irq(dev_priv, (pipe == 0) ? |
1110 | DE_PIPEA_VBLANK: DE_PIPEB_VBLANK); |
1111 | else if (IS_I965G(dev)) |
1112 | @@ -883,7 +883,7 @@ void i915_disable_vblank(struct drm_device *dev, int pipe) |
1113 | unsigned long irqflags; |
1114 | |
1115 | spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); |
1116 | - if (IS_IRONLAKE(dev)) |
1117 | + if (HAS_PCH_SPLIT(dev)) |
1118 | ironlake_disable_display_irq(dev_priv, (pipe == 0) ? |
1119 | DE_PIPEA_VBLANK: DE_PIPEB_VBLANK); |
1120 | else |
1121 | @@ -897,7 +897,7 @@ void i915_enable_interrupt (struct drm_device *dev) |
1122 | { |
1123 | struct drm_i915_private *dev_priv = dev->dev_private; |
1124 | |
1125 | - if (!IS_IRONLAKE(dev)) |
1126 | + if (!HAS_PCH_SPLIT(dev)) |
1127 | opregion_enable_asle(dev); |
1128 | dev_priv->irq_enabled = 1; |
1129 | } |
1130 | @@ -1076,7 +1076,7 @@ void i915_driver_irq_preinstall(struct drm_device * dev) |
1131 | INIT_WORK(&dev_priv->hotplug_work, i915_hotplug_work_func); |
1132 | INIT_WORK(&dev_priv->error_work, i915_error_work_func); |
1133 | |
1134 | - if (IS_IRONLAKE(dev)) { |
1135 | + if (HAS_PCH_SPLIT(dev)) { |
1136 | ironlake_irq_preinstall(dev); |
1137 | return; |
1138 | } |
1139 | @@ -1108,7 +1108,7 @@ int i915_driver_irq_postinstall(struct drm_device *dev) |
1140 | |
1141 | dev_priv->vblank_pipe = DRM_I915_VBLANK_PIPE_A | DRM_I915_VBLANK_PIPE_B; |
1142 | |
1143 | - if (IS_IRONLAKE(dev)) |
1144 | + if (HAS_PCH_SPLIT(dev)) |
1145 | return ironlake_irq_postinstall(dev); |
1146 | |
1147 | /* Unmask the interrupts that we always want on. */ |
1148 | @@ -1196,7 +1196,7 @@ void i915_driver_irq_uninstall(struct drm_device * dev) |
1149 | |
1150 | dev_priv->vblank_pipe = 0; |
1151 | |
1152 | - if (IS_IRONLAKE(dev)) { |
1153 | + if (HAS_PCH_SPLIT(dev)) { |
1154 | ironlake_irq_uninstall(dev); |
1155 | return; |
1156 | } |
1157 | diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h |
1158 | index ab1bd2d..fd95bdf 100644 |
1159 | --- a/drivers/gpu/drm/i915/i915_reg.h |
1160 | +++ b/drivers/gpu/drm/i915/i915_reg.h |
1161 | @@ -221,7 +221,7 @@ |
1162 | #define I830_FENCE_SIZE_BITS(size) ((ffs((size) >> 19) - 1) << 8) |
1163 | #define I830_FENCE_PITCH_SHIFT 4 |
1164 | #define I830_FENCE_REG_VALID (1<<0) |
1165 | -#define I915_FENCE_MAX_PITCH_VAL 0x10 |
1166 | +#define I915_FENCE_MAX_PITCH_VAL 4 |
1167 | #define I830_FENCE_MAX_PITCH_VAL 6 |
1168 | #define I830_FENCE_MAX_SIZE_VAL (1<<8) |
1169 | |
1170 | diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c |
1171 | index 15fbc1b..70c9d4b 100644 |
1172 | --- a/drivers/gpu/drm/i915/intel_bios.c |
1173 | +++ b/drivers/gpu/drm/i915/intel_bios.c |
1174 | @@ -247,6 +247,7 @@ static void |
1175 | parse_general_features(struct drm_i915_private *dev_priv, |
1176 | struct bdb_header *bdb) |
1177 | { |
1178 | + struct drm_device *dev = dev_priv->dev; |
1179 | struct bdb_general_features *general; |
1180 | |
1181 | /* Set sensible defaults in case we can't find the general block */ |
1182 | @@ -263,7 +264,7 @@ parse_general_features(struct drm_i915_private *dev_priv, |
1183 | if (IS_I85X(dev_priv->dev)) |
1184 | dev_priv->lvds_ssc_freq = |
1185 | general->ssc_freq ? 66 : 48; |
1186 | - else if (IS_IRONLAKE(dev_priv->dev)) |
1187 | + else if (IS_IRONLAKE(dev_priv->dev) || IS_GEN6(dev)) |
1188 | dev_priv->lvds_ssc_freq = |
1189 | general->ssc_freq ? 100 : 120; |
1190 | else |
1191 | diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c |
1192 | index 79dd402..fccf074 100644 |
1193 | --- a/drivers/gpu/drm/i915/intel_crt.c |
1194 | +++ b/drivers/gpu/drm/i915/intel_crt.c |
1195 | @@ -39,7 +39,7 @@ static void intel_crt_dpms(struct drm_encoder *encoder, int mode) |
1196 | struct drm_i915_private *dev_priv = dev->dev_private; |
1197 | u32 temp, reg; |
1198 | |
1199 | - if (IS_IRONLAKE(dev)) |
1200 | + if (HAS_PCH_SPLIT(dev)) |
1201 | reg = PCH_ADPA; |
1202 | else |
1203 | reg = ADPA; |
1204 | @@ -113,7 +113,7 @@ static void intel_crt_mode_set(struct drm_encoder *encoder, |
1205 | else |
1206 | dpll_md_reg = DPLL_B_MD; |
1207 | |
1208 | - if (IS_IRONLAKE(dev)) |
1209 | + if (HAS_PCH_SPLIT(dev)) |
1210 | adpa_reg = PCH_ADPA; |
1211 | else |
1212 | adpa_reg = ADPA; |
1213 | @@ -122,7 +122,7 @@ static void intel_crt_mode_set(struct drm_encoder *encoder, |
1214 | * Disable separate mode multiplier used when cloning SDVO to CRT |
1215 | * XXX this needs to be adjusted when we really are cloning |
1216 | */ |
1217 | - if (IS_I965G(dev) && !IS_IRONLAKE(dev)) { |
1218 | + if (IS_I965G(dev) && !HAS_PCH_SPLIT(dev)) { |
1219 | dpll_md = I915_READ(dpll_md_reg); |
1220 | I915_WRITE(dpll_md_reg, |
1221 | dpll_md & ~DPLL_MD_UDI_MULTIPLIER_MASK); |
1222 | @@ -136,11 +136,11 @@ static void intel_crt_mode_set(struct drm_encoder *encoder, |
1223 | |
1224 | if (intel_crtc->pipe == 0) { |
1225 | adpa |= ADPA_PIPE_A_SELECT; |
1226 | - if (!IS_IRONLAKE(dev)) |
1227 | + if (!HAS_PCH_SPLIT(dev)) |
1228 | I915_WRITE(BCLRPAT_A, 0); |
1229 | } else { |
1230 | adpa |= ADPA_PIPE_B_SELECT; |
1231 | - if (!IS_IRONLAKE(dev)) |
1232 | + if (!HAS_PCH_SPLIT(dev)) |
1233 | I915_WRITE(BCLRPAT_B, 0); |
1234 | } |
1235 | |
1236 | @@ -202,7 +202,7 @@ static bool intel_crt_detect_hotplug(struct drm_connector *connector) |
1237 | u32 hotplug_en; |
1238 | int i, tries = 0; |
1239 | |
1240 | - if (IS_IRONLAKE(dev)) |
1241 | + if (HAS_PCH_SPLIT(dev)) |
1242 | return intel_ironlake_crt_detect_hotplug(connector); |
1243 | |
1244 | /* |
1245 | @@ -524,7 +524,7 @@ void intel_crt_init(struct drm_device *dev) |
1246 | &intel_output->enc); |
1247 | |
1248 | /* Set up the DDC bus. */ |
1249 | - if (IS_IRONLAKE(dev)) |
1250 | + if (HAS_PCH_SPLIT(dev)) |
1251 | i2c_reg = PCH_GPIOA; |
1252 | else { |
1253 | i2c_reg = GPIOA; |
1254 | diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c |
1255 | index b27202d..4b2458d 100644 |
1256 | --- a/drivers/gpu/drm/i915/intel_display.c |
1257 | +++ b/drivers/gpu/drm/i915/intel_display.c |
1258 | @@ -232,7 +232,7 @@ struct intel_limit { |
1259 | #define G4X_P2_DISPLAY_PORT_FAST 10 |
1260 | #define G4X_P2_DISPLAY_PORT_LIMIT 0 |
1261 | |
1262 | -/* Ironlake */ |
1263 | +/* Ironlake / Sandybridge */ |
1264 | /* as we calculate clock using (register_value + 2) for |
1265 | N/M1/M2, so here the range value for them is (actual_value-2). |
1266 | */ |
1267 | @@ -690,7 +690,7 @@ static const intel_limit_t *intel_limit(struct drm_crtc *crtc) |
1268 | struct drm_device *dev = crtc->dev; |
1269 | const intel_limit_t *limit; |
1270 | |
1271 | - if (IS_IRONLAKE(dev)) |
1272 | + if (HAS_PCH_SPLIT(dev)) |
1273 | limit = intel_ironlake_limit(crtc); |
1274 | else if (IS_G4X(dev)) { |
1275 | limit = intel_g4x_limit(crtc); |
1276 | @@ -1366,7 +1366,7 @@ intel_pipe_set_base(struct drm_crtc *crtc, int x, int y, |
1277 | dspcntr &= ~DISPPLANE_TILED; |
1278 | } |
1279 | |
1280 | - if (IS_IRONLAKE(dev)) |
1281 | + if (HAS_PCH_SPLIT(dev)) |
1282 | /* must disable */ |
1283 | dspcntr |= DISPPLANE_TRICKLE_FEED_DISABLE; |
1284 | |
1285 | @@ -1427,7 +1427,7 @@ static void i915_disable_vga (struct drm_device *dev) |
1286 | u8 sr1; |
1287 | u32 vga_reg; |
1288 | |
1289 | - if (IS_IRONLAKE(dev)) |
1290 | + if (HAS_PCH_SPLIT(dev)) |
1291 | vga_reg = CPU_VGACNTRL; |
1292 | else |
1293 | vga_reg = VGACNTRL; |
1294 | @@ -2111,7 +2111,7 @@ static bool intel_crtc_mode_fixup(struct drm_crtc *crtc, |
1295 | struct drm_display_mode *adjusted_mode) |
1296 | { |
1297 | struct drm_device *dev = crtc->dev; |
1298 | - if (IS_IRONLAKE(dev)) { |
1299 | + if (HAS_PCH_SPLIT(dev)) { |
1300 | /* FDI link clock is fixed at 2.7G */ |
1301 | if (mode->clock * 3 > 27000 * 4) |
1302 | return MODE_CLOCK_HIGH; |
1303 | @@ -2967,7 +2967,7 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, |
1304 | refclk / 1000); |
1305 | } else if (IS_I9XX(dev)) { |
1306 | refclk = 96000; |
1307 | - if (IS_IRONLAKE(dev)) |
1308 | + if (HAS_PCH_SPLIT(dev)) |
1309 | refclk = 120000; /* 120Mhz refclk */ |
1310 | } else { |
1311 | refclk = 48000; |
1312 | @@ -3025,7 +3025,7 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, |
1313 | } |
1314 | |
1315 | /* FDI link */ |
1316 | - if (IS_IRONLAKE(dev)) { |
1317 | + if (HAS_PCH_SPLIT(dev)) { |
1318 | int lane, link_bw, bpp; |
1319 | /* eDP doesn't require FDI link, so just set DP M/N |
1320 | according to current link config */ |
1321 | @@ -3102,7 +3102,7 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, |
1322 | * PCH B stepping, previous chipset stepping should be |
1323 | * ignoring this setting. |
1324 | */ |
1325 | - if (IS_IRONLAKE(dev)) { |
1326 | + if (HAS_PCH_SPLIT(dev)) { |
1327 | temp = I915_READ(PCH_DREF_CONTROL); |
1328 | /* Always enable nonspread source */ |
1329 | temp &= ~DREF_NONSPREAD_SOURCE_MASK; |
1330 | @@ -3149,7 +3149,7 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, |
1331 | reduced_clock.m2; |
1332 | } |
1333 | |
1334 | - if (!IS_IRONLAKE(dev)) |
1335 | + if (!HAS_PCH_SPLIT(dev)) |
1336 | dpll = DPLL_VGA_MODE_DIS; |
1337 | |
1338 | if (IS_I9XX(dev)) { |
1339 | @@ -3162,7 +3162,7 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, |
1340 | sdvo_pixel_multiply = adjusted_mode->clock / mode->clock; |
1341 | if (IS_I945G(dev) || IS_I945GM(dev) || IS_G33(dev)) |
1342 | dpll |= (sdvo_pixel_multiply - 1) << SDVO_MULTIPLIER_SHIFT_HIRES; |
1343 | - else if (IS_IRONLAKE(dev)) |
1344 | + else if (HAS_PCH_SPLIT(dev)) |
1345 | dpll |= (sdvo_pixel_multiply - 1) << PLL_REF_SDVO_HDMI_MULTIPLIER_SHIFT; |
1346 | } |
1347 | if (is_dp) |
1348 | @@ -3174,7 +3174,7 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, |
1349 | else { |
1350 | dpll |= (1 << (clock.p1 - 1)) << DPLL_FPA01_P1_POST_DIV_SHIFT; |
1351 | /* also FPA1 */ |
1352 | - if (IS_IRONLAKE(dev)) |
1353 | + if (HAS_PCH_SPLIT(dev)) |
1354 | dpll |= (1 << (clock.p1 - 1)) << DPLL_FPA1_P1_POST_DIV_SHIFT; |
1355 | if (IS_G4X(dev) && has_reduced_clock) |
1356 | dpll |= (1 << (reduced_clock.p1 - 1)) << DPLL_FPA1_P1_POST_DIV_SHIFT; |
1357 | @@ -3193,7 +3193,7 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, |
1358 | dpll |= DPLLB_LVDS_P2_CLOCK_DIV_14; |
1359 | break; |
1360 | } |
1361 | - if (IS_I965G(dev) && !IS_IRONLAKE(dev)) |
1362 | + if (IS_I965G(dev) && !HAS_PCH_SPLIT(dev)) |
1363 | dpll |= (6 << PLL_LOAD_PULSE_PHASE_SHIFT); |
1364 | } else { |
1365 | if (is_lvds) { |
1366 | @@ -3227,7 +3227,7 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, |
1367 | |
1368 | /* Ironlake's plane is forced to pipe, bit 24 is to |
1369 | enable color space conversion */ |
1370 | - if (!IS_IRONLAKE(dev)) { |
1371 | + if (!HAS_PCH_SPLIT(dev)) { |
1372 | if (pipe == 0) |
1373 | dspcntr &= ~DISPPLANE_SEL_PIPE_MASK; |
1374 | else |
1375 | @@ -3254,14 +3254,14 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, |
1376 | |
1377 | |
1378 | /* Disable the panel fitter if it was on our pipe */ |
1379 | - if (!IS_IRONLAKE(dev) && intel_panel_fitter_pipe(dev) == pipe) |
1380 | + if (!HAS_PCH_SPLIT(dev) && intel_panel_fitter_pipe(dev) == pipe) |
1381 | I915_WRITE(PFIT_CONTROL, 0); |
1382 | |
1383 | DRM_DEBUG_KMS("Mode for pipe %c:\n", pipe == 0 ? 'A' : 'B'); |
1384 | drm_mode_debug_printmodeline(mode); |
1385 | |
1386 | /* assign to Ironlake registers */ |
1387 | - if (IS_IRONLAKE(dev)) { |
1388 | + if (HAS_PCH_SPLIT(dev)) { |
1389 | fp_reg = pch_fp_reg; |
1390 | dpll_reg = pch_dpll_reg; |
1391 | } |
1392 | @@ -3282,7 +3282,7 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, |
1393 | if (is_lvds) { |
1394 | u32 lvds; |
1395 | |
1396 | - if (IS_IRONLAKE(dev)) |
1397 | + if (HAS_PCH_SPLIT(dev)) |
1398 | lvds_reg = PCH_LVDS; |
1399 | |
1400 | lvds = I915_READ(lvds_reg); |
1401 | @@ -3328,7 +3328,7 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, |
1402 | /* Wait for the clocks to stabilize. */ |
1403 | udelay(150); |
1404 | |
1405 | - if (IS_I965G(dev) && !IS_IRONLAKE(dev)) { |
1406 | + if (IS_I965G(dev) && !HAS_PCH_SPLIT(dev)) { |
1407 | if (is_sdvo) { |
1408 | sdvo_pixel_multiply = adjusted_mode->clock / mode->clock; |
1409 | I915_WRITE(dpll_md_reg, (0 << DPLL_MD_UDI_DIVIDER_SHIFT) | |
1410 | @@ -3375,14 +3375,14 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, |
1411 | /* pipesrc and dspsize control the size that is scaled from, which should |
1412 | * always be the user's requested size. |
1413 | */ |
1414 | - if (!IS_IRONLAKE(dev)) { |
1415 | + if (!HAS_PCH_SPLIT(dev)) { |
1416 | I915_WRITE(dspsize_reg, ((mode->vdisplay - 1) << 16) | |
1417 | (mode->hdisplay - 1)); |
1418 | I915_WRITE(dsppos_reg, 0); |
1419 | } |
1420 | I915_WRITE(pipesrc_reg, ((mode->hdisplay - 1) << 16) | (mode->vdisplay - 1)); |
1421 | |
1422 | - if (IS_IRONLAKE(dev)) { |
1423 | + if (HAS_PCH_SPLIT(dev)) { |
1424 | I915_WRITE(data_m1_reg, TU_SIZE(m_n.tu) | m_n.gmch_m); |
1425 | I915_WRITE(data_n1_reg, TU_SIZE(m_n.tu) | m_n.gmch_n); |
1426 | I915_WRITE(link_m1_reg, m_n.link_m); |
1427 | @@ -3403,7 +3403,7 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, |
1428 | |
1429 | intel_wait_for_vblank(dev); |
1430 | |
1431 | - if (IS_IRONLAKE(dev)) { |
1432 | + if (HAS_PCH_SPLIT(dev)) { |
1433 | /* enable address swizzle for tiling buffer */ |
1434 | temp = I915_READ(DISP_ARB_CTL); |
1435 | I915_WRITE(DISP_ARB_CTL, temp | DISP_TILE_SURFACE_SWIZZLING); |
1436 | @@ -3438,7 +3438,7 @@ void intel_crtc_load_lut(struct drm_crtc *crtc) |
1437 | return; |
1438 | |
1439 | /* use legacy palette for Ironlake */ |
1440 | - if (IS_IRONLAKE(dev)) |
1441 | + if (HAS_PCH_SPLIT(dev)) |
1442 | palreg = (intel_crtc->pipe == 0) ? LGC_PALETTE_A : |
1443 | LGC_PALETTE_B; |
1444 | |
1445 | @@ -3922,7 +3922,7 @@ static void intel_increase_pllclock(struct drm_crtc *crtc, bool schedule) |
1446 | int dpll_reg = (pipe == 0) ? DPLL_A : DPLL_B; |
1447 | int dpll = I915_READ(dpll_reg); |
1448 | |
1449 | - if (IS_IRONLAKE(dev)) |
1450 | + if (HAS_PCH_SPLIT(dev)) |
1451 | return; |
1452 | |
1453 | if (!dev_priv->lvds_downclock_avail) |
1454 | @@ -3961,7 +3961,7 @@ static void intel_decrease_pllclock(struct drm_crtc *crtc) |
1455 | int dpll_reg = (pipe == 0) ? DPLL_A : DPLL_B; |
1456 | int dpll = I915_READ(dpll_reg); |
1457 | |
1458 | - if (IS_IRONLAKE(dev)) |
1459 | + if (HAS_PCH_SPLIT(dev)) |
1460 | return; |
1461 | |
1462 | if (!dev_priv->lvds_downclock_avail) |
1463 | @@ -4382,7 +4382,7 @@ static void intel_setup_outputs(struct drm_device *dev) |
1464 | if (IS_MOBILE(dev) && !IS_I830(dev)) |
1465 | intel_lvds_init(dev); |
1466 | |
1467 | - if (IS_IRONLAKE(dev)) { |
1468 | + if (HAS_PCH_SPLIT(dev)) { |
1469 | int found; |
1470 | |
1471 | if (IS_MOBILE(dev) && (I915_READ(DP_A) & DP_DETECTED)) |
1472 | @@ -4451,7 +4451,7 @@ static void intel_setup_outputs(struct drm_device *dev) |
1473 | DRM_DEBUG_KMS("probing DP_D\n"); |
1474 | intel_dp_init(dev, DP_D); |
1475 | } |
1476 | - } else if (IS_I8XX(dev)) |
1477 | + } else if (IS_GEN2(dev)) |
1478 | intel_dvo_init(dev); |
1479 | |
1480 | if (SUPPORTS_TV(dev)) |
1481 | @@ -4599,7 +4599,7 @@ void intel_init_clock_gating(struct drm_device *dev) |
1482 | * Disable clock gating reported to work incorrectly according to the |
1483 | * specs, but enable as much else as we can. |
1484 | */ |
1485 | - if (IS_IRONLAKE(dev)) { |
1486 | + if (HAS_PCH_SPLIT(dev)) { |
1487 | return; |
1488 | } else if (IS_G4X(dev)) { |
1489 | uint32_t dspclk_gate; |
1490 | @@ -4672,7 +4672,7 @@ static void intel_init_display(struct drm_device *dev) |
1491 | struct drm_i915_private *dev_priv = dev->dev_private; |
1492 | |
1493 | /* We always want a DPMS function */ |
1494 | - if (IS_IRONLAKE(dev)) |
1495 | + if (HAS_PCH_SPLIT(dev)) |
1496 | dev_priv->display.dpms = ironlake_crtc_dpms; |
1497 | else |
1498 | dev_priv->display.dpms = i9xx_crtc_dpms; |
1499 | @@ -4715,7 +4715,7 @@ static void intel_init_display(struct drm_device *dev) |
1500 | i830_get_display_clock_speed; |
1501 | |
1502 | /* For FIFO watermark updates */ |
1503 | - if (IS_IRONLAKE(dev)) |
1504 | + if (HAS_PCH_SPLIT(dev)) |
1505 | dev_priv->display.update_wm = NULL; |
1506 | else if (IS_G4X(dev)) |
1507 | dev_priv->display.update_wm = g4x_update_wm; |
1508 | diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c |
1509 | index 1238bc9..66df0c3 100644 |
1510 | --- a/drivers/gpu/drm/i915/intel_lvds.c |
1511 | +++ b/drivers/gpu/drm/i915/intel_lvds.c |
1512 | @@ -661,7 +661,7 @@ static enum drm_connector_status intel_lvds_detect(struct drm_connector *connect |
1513 | /* ACPI lid methods were generally unreliable in this generation, so |
1514 | * don't even bother. |
1515 | */ |
1516 | - if (IS_I8XX(dev)) |
1517 | + if (IS_GEN2(dev)) |
1518 | return connector_status_connected; |
1519 | |
1520 | if (!dmi_check_system(bad_lid_status) && !acpi_lid_open()) |
1521 | diff --git a/drivers/gpu/drm/i915/intel_overlay.c b/drivers/gpu/drm/i915/intel_overlay.c |
1522 | index 63f569b..6b89042 100644 |
1523 | --- a/drivers/gpu/drm/i915/intel_overlay.c |
1524 | +++ b/drivers/gpu/drm/i915/intel_overlay.c |
1525 | @@ -172,7 +172,7 @@ struct overlay_registers { |
1526 | #define OFC_UPDATE 0x1 |
1527 | |
1528 | #define OVERLAY_NONPHYSICAL(dev) (IS_G33(dev) || IS_I965G(dev)) |
1529 | -#define OVERLAY_EXISTS(dev) (!IS_G4X(dev) && !IS_IRONLAKE(dev)) |
1530 | +#define OVERLAY_EXISTS(dev) (!IS_G4X(dev) && !IS_IRONLAKE(dev) && !IS_GEN6(dev)) |
1531 | |
1532 | |
1533 | static struct overlay_registers *intel_overlay_map_regs_atomic(struct intel_overlay *overlay) |
1534 | diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c |
1535 | index 10be7b5..855911e 100644 |
1536 | --- a/drivers/i2c/i2c-core.c |
1537 | +++ b/drivers/i2c/i2c-core.c |
1538 | @@ -1210,12 +1210,23 @@ static int i2c_detect_address(struct i2c_client *temp_client, |
1539 | return 0; |
1540 | |
1541 | /* Make sure there is something at this address */ |
1542 | - if (i2c_smbus_xfer(adapter, addr, 0, 0, 0, I2C_SMBUS_QUICK, NULL) < 0) |
1543 | - return 0; |
1544 | + if (addr == 0x73 && (adapter->class & I2C_CLASS_HWMON)) { |
1545 | + /* Special probe for FSC hwmon chips */ |
1546 | + union i2c_smbus_data dummy; |
1547 | |
1548 | - /* Prevent 24RF08 corruption */ |
1549 | - if ((addr & ~0x0f) == 0x50) |
1550 | - i2c_smbus_xfer(adapter, addr, 0, 0, 0, I2C_SMBUS_QUICK, NULL); |
1551 | + if (i2c_smbus_xfer(adapter, addr, 0, I2C_SMBUS_READ, 0, |
1552 | + I2C_SMBUS_BYTE_DATA, &dummy) < 0) |
1553 | + return 0; |
1554 | + } else { |
1555 | + if (i2c_smbus_xfer(adapter, addr, 0, I2C_SMBUS_WRITE, 0, |
1556 | + I2C_SMBUS_QUICK, NULL) < 0) |
1557 | + return 0; |
1558 | + |
1559 | + /* Prevent 24RF08 corruption */ |
1560 | + if ((addr & ~0x0f) == 0x50) |
1561 | + i2c_smbus_xfer(adapter, addr, 0, I2C_SMBUS_WRITE, 0, |
1562 | + I2C_SMBUS_QUICK, NULL); |
1563 | + } |
1564 | |
1565 | /* Finally call the custom detection function */ |
1566 | memset(&info, 0, sizeof(struct i2c_board_info)); |
1567 | diff --git a/drivers/md/md.c b/drivers/md/md.c |
1568 | index a20a71e..2ecd1d5 100644 |
1569 | --- a/drivers/md/md.c |
1570 | +++ b/drivers/md/md.c |
1571 | @@ -2108,12 +2108,18 @@ repeat: |
1572 | if (!mddev->in_sync || mddev->recovery_cp != MaxSector) { /* not clean */ |
1573 | /* .. if the array isn't clean, an 'even' event must also go |
1574 | * to spares. */ |
1575 | - if ((mddev->events&1)==0) |
1576 | + if ((mddev->events&1)==0) { |
1577 | nospares = 0; |
1578 | + sync_req = 2; /* force a second update to get the |
1579 | + * even/odd in sync */ |
1580 | + } |
1581 | } else { |
1582 | /* otherwise an 'odd' event must go to spares */ |
1583 | - if ((mddev->events&1)) |
1584 | + if ((mddev->events&1)) { |
1585 | nospares = 0; |
1586 | + sync_req = 2; /* force a second update to get the |
1587 | + * even/odd in sync */ |
1588 | + } |
1589 | } |
1590 | } |
1591 | |
1592 | diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c |
1593 | index ceb24af..0468f5b 100644 |
1594 | --- a/drivers/md/raid5.c |
1595 | +++ b/drivers/md/raid5.c |
1596 | @@ -1526,7 +1526,7 @@ static void raid5_end_read_request(struct bio * bi, int error) |
1597 | |
1598 | clear_bit(R5_UPTODATE, &sh->dev[i].flags); |
1599 | atomic_inc(&rdev->read_errors); |
1600 | - if (conf->mddev->degraded) |
1601 | + if (conf->mddev->degraded >= conf->max_degraded) |
1602 | printk_rl(KERN_WARNING |
1603 | "raid5:%s: read error not correctable " |
1604 | "(sector %llu on %s).\n", |
1605 | @@ -1649,8 +1649,8 @@ static sector_t raid5_compute_sector(raid5_conf_t *conf, sector_t r_sector, |
1606 | int previous, int *dd_idx, |
1607 | struct stripe_head *sh) |
1608 | { |
1609 | - long stripe; |
1610 | - unsigned long chunk_number; |
1611 | + sector_t stripe, stripe2; |
1612 | + sector_t chunk_number; |
1613 | unsigned int chunk_offset; |
1614 | int pd_idx, qd_idx; |
1615 | int ddf_layout = 0; |
1616 | @@ -1670,18 +1670,13 @@ static sector_t raid5_compute_sector(raid5_conf_t *conf, sector_t r_sector, |
1617 | */ |
1618 | chunk_offset = sector_div(r_sector, sectors_per_chunk); |
1619 | chunk_number = r_sector; |
1620 | - BUG_ON(r_sector != chunk_number); |
1621 | |
1622 | /* |
1623 | * Compute the stripe number |
1624 | */ |
1625 | - stripe = chunk_number / data_disks; |
1626 | - |
1627 | - /* |
1628 | - * Compute the data disk and parity disk indexes inside the stripe |
1629 | - */ |
1630 | - *dd_idx = chunk_number % data_disks; |
1631 | - |
1632 | + stripe = chunk_number; |
1633 | + *dd_idx = sector_div(stripe, data_disks); |
1634 | + stripe2 = stripe; |
1635 | /* |
1636 | * Select the parity disk based on the user selected algorithm. |
1637 | */ |
1638 | @@ -1693,21 +1688,21 @@ static sector_t raid5_compute_sector(raid5_conf_t *conf, sector_t r_sector, |
1639 | case 5: |
1640 | switch (algorithm) { |
1641 | case ALGORITHM_LEFT_ASYMMETRIC: |
1642 | - pd_idx = data_disks - stripe % raid_disks; |
1643 | + pd_idx = data_disks - sector_div(stripe2, raid_disks); |
1644 | if (*dd_idx >= pd_idx) |
1645 | (*dd_idx)++; |
1646 | break; |
1647 | case ALGORITHM_RIGHT_ASYMMETRIC: |
1648 | - pd_idx = stripe % raid_disks; |
1649 | + pd_idx = sector_div(stripe2, raid_disks); |
1650 | if (*dd_idx >= pd_idx) |
1651 | (*dd_idx)++; |
1652 | break; |
1653 | case ALGORITHM_LEFT_SYMMETRIC: |
1654 | - pd_idx = data_disks - stripe % raid_disks; |
1655 | + pd_idx = data_disks - sector_div(stripe2, raid_disks); |
1656 | *dd_idx = (pd_idx + 1 + *dd_idx) % raid_disks; |
1657 | break; |
1658 | case ALGORITHM_RIGHT_SYMMETRIC: |
1659 | - pd_idx = stripe % raid_disks; |
1660 | + pd_idx = sector_div(stripe2, raid_disks); |
1661 | *dd_idx = (pd_idx + 1 + *dd_idx) % raid_disks; |
1662 | break; |
1663 | case ALGORITHM_PARITY_0: |
1664 | @@ -1727,7 +1722,7 @@ static sector_t raid5_compute_sector(raid5_conf_t *conf, sector_t r_sector, |
1665 | |
1666 | switch (algorithm) { |
1667 | case ALGORITHM_LEFT_ASYMMETRIC: |
1668 | - pd_idx = raid_disks - 1 - (stripe % raid_disks); |
1669 | + pd_idx = raid_disks - 1 - sector_div(stripe2, raid_disks); |
1670 | qd_idx = pd_idx + 1; |
1671 | if (pd_idx == raid_disks-1) { |
1672 | (*dd_idx)++; /* Q D D D P */ |
1673 | @@ -1736,7 +1731,7 @@ static sector_t raid5_compute_sector(raid5_conf_t *conf, sector_t r_sector, |
1674 | (*dd_idx) += 2; /* D D P Q D */ |
1675 | break; |
1676 | case ALGORITHM_RIGHT_ASYMMETRIC: |
1677 | - pd_idx = stripe % raid_disks; |
1678 | + pd_idx = sector_div(stripe2, raid_disks); |
1679 | qd_idx = pd_idx + 1; |
1680 | if (pd_idx == raid_disks-1) { |
1681 | (*dd_idx)++; /* Q D D D P */ |
1682 | @@ -1745,12 +1740,12 @@ static sector_t raid5_compute_sector(raid5_conf_t *conf, sector_t r_sector, |
1683 | (*dd_idx) += 2; /* D D P Q D */ |
1684 | break; |
1685 | case ALGORITHM_LEFT_SYMMETRIC: |
1686 | - pd_idx = raid_disks - 1 - (stripe % raid_disks); |
1687 | + pd_idx = raid_disks - 1 - sector_div(stripe2, raid_disks); |
1688 | qd_idx = (pd_idx + 1) % raid_disks; |
1689 | *dd_idx = (pd_idx + 2 + *dd_idx) % raid_disks; |
1690 | break; |
1691 | case ALGORITHM_RIGHT_SYMMETRIC: |
1692 | - pd_idx = stripe % raid_disks; |
1693 | + pd_idx = sector_div(stripe2, raid_disks); |
1694 | qd_idx = (pd_idx + 1) % raid_disks; |
1695 | *dd_idx = (pd_idx + 2 + *dd_idx) % raid_disks; |
1696 | break; |
1697 | @@ -1769,7 +1764,7 @@ static sector_t raid5_compute_sector(raid5_conf_t *conf, sector_t r_sector, |
1698 | /* Exactly the same as RIGHT_ASYMMETRIC, but or |
1699 | * of blocks for computing Q is different. |
1700 | */ |
1701 | - pd_idx = stripe % raid_disks; |
1702 | + pd_idx = sector_div(stripe2, raid_disks); |
1703 | qd_idx = pd_idx + 1; |
1704 | if (pd_idx == raid_disks-1) { |
1705 | (*dd_idx)++; /* Q D D D P */ |
1706 | @@ -1784,7 +1779,8 @@ static sector_t raid5_compute_sector(raid5_conf_t *conf, sector_t r_sector, |
1707 | * D D D P Q rather than |
1708 | * Q D D D P |
1709 | */ |
1710 | - pd_idx = raid_disks - 1 - ((stripe + 1) % raid_disks); |
1711 | + stripe2 += 1; |
1712 | + pd_idx = raid_disks - 1 - sector_div(stripe2, raid_disks); |
1713 | qd_idx = pd_idx + 1; |
1714 | if (pd_idx == raid_disks-1) { |
1715 | (*dd_idx)++; /* Q D D D P */ |
1716 | @@ -1796,7 +1792,7 @@ static sector_t raid5_compute_sector(raid5_conf_t *conf, sector_t r_sector, |
1717 | |
1718 | case ALGORITHM_ROTATING_N_CONTINUE: |
1719 | /* Same as left_symmetric but Q is before P */ |
1720 | - pd_idx = raid_disks - 1 - (stripe % raid_disks); |
1721 | + pd_idx = raid_disks - 1 - sector_div(stripe2, raid_disks); |
1722 | qd_idx = (pd_idx + raid_disks - 1) % raid_disks; |
1723 | *dd_idx = (pd_idx + 1 + *dd_idx) % raid_disks; |
1724 | ddf_layout = 1; |
1725 | @@ -1804,27 +1800,27 @@ static sector_t raid5_compute_sector(raid5_conf_t *conf, sector_t r_sector, |
1726 | |
1727 | case ALGORITHM_LEFT_ASYMMETRIC_6: |
1728 | /* RAID5 left_asymmetric, with Q on last device */ |
1729 | - pd_idx = data_disks - stripe % (raid_disks-1); |
1730 | + pd_idx = data_disks - sector_div(stripe2, raid_disks-1); |
1731 | if (*dd_idx >= pd_idx) |
1732 | (*dd_idx)++; |
1733 | qd_idx = raid_disks - 1; |
1734 | break; |
1735 | |
1736 | case ALGORITHM_RIGHT_ASYMMETRIC_6: |
1737 | - pd_idx = stripe % (raid_disks-1); |
1738 | + pd_idx = sector_div(stripe2, raid_disks-1); |
1739 | if (*dd_idx >= pd_idx) |
1740 | (*dd_idx)++; |
1741 | qd_idx = raid_disks - 1; |
1742 | break; |
1743 | |
1744 | case ALGORITHM_LEFT_SYMMETRIC_6: |
1745 | - pd_idx = data_disks - stripe % (raid_disks-1); |
1746 | + pd_idx = data_disks - sector_div(stripe2, raid_disks-1); |
1747 | *dd_idx = (pd_idx + 1 + *dd_idx) % (raid_disks-1); |
1748 | qd_idx = raid_disks - 1; |
1749 | break; |
1750 | |
1751 | case ALGORITHM_RIGHT_SYMMETRIC_6: |
1752 | - pd_idx = stripe % (raid_disks-1); |
1753 | + pd_idx = sector_div(stripe2, raid_disks-1); |
1754 | *dd_idx = (pd_idx + 1 + *dd_idx) % (raid_disks-1); |
1755 | qd_idx = raid_disks - 1; |
1756 | break; |
1757 | @@ -1869,14 +1865,14 @@ static sector_t compute_blocknr(struct stripe_head *sh, int i, int previous) |
1758 | : conf->algorithm; |
1759 | sector_t stripe; |
1760 | int chunk_offset; |
1761 | - int chunk_number, dummy1, dd_idx = i; |
1762 | + sector_t chunk_number; |
1763 | + int dummy1, dd_idx = i; |
1764 | sector_t r_sector; |
1765 | struct stripe_head sh2; |
1766 | |
1767 | |
1768 | chunk_offset = sector_div(new_sector, sectors_per_chunk); |
1769 | stripe = new_sector; |
1770 | - BUG_ON(new_sector != stripe); |
1771 | |
1772 | if (i == sh->pd_idx) |
1773 | return 0; |
1774 | @@ -1969,7 +1965,7 @@ static sector_t compute_blocknr(struct stripe_head *sh, int i, int previous) |
1775 | } |
1776 | |
1777 | chunk_number = stripe * data_disks + i; |
1778 | - r_sector = (sector_t)chunk_number * sectors_per_chunk + chunk_offset; |
1779 | + r_sector = chunk_number * sectors_per_chunk + chunk_offset; |
1780 | |
1781 | check = raid5_compute_sector(conf, r_sector, |
1782 | previous, &dummy1, &sh2); |
1783 | diff --git a/drivers/media/dvb/ttpci/budget.c b/drivers/media/dvb/ttpci/budget.c |
1784 | index e48380c..95a463c 100644 |
1785 | --- a/drivers/media/dvb/ttpci/budget.c |
1786 | +++ b/drivers/media/dvb/ttpci/budget.c |
1787 | @@ -643,9 +643,6 @@ static void frontend_init(struct budget *budget) |
1788 | &budget->i2c_adap, |
1789 | &tt1600_isl6423_config); |
1790 | |
1791 | - } else { |
1792 | - dvb_frontend_detach(budget->dvb_frontend); |
1793 | - budget->dvb_frontend = NULL; |
1794 | } |
1795 | } |
1796 | break; |
1797 | diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c |
1798 | index 65df1de..a555c90 100644 |
1799 | --- a/drivers/net/bnx2.c |
1800 | +++ b/drivers/net/bnx2.c |
1801 | @@ -4772,8 +4772,12 @@ bnx2_reset_chip(struct bnx2 *bp, u32 reset_code) |
1802 | rc = bnx2_alloc_bad_rbuf(bp); |
1803 | } |
1804 | |
1805 | - if (bp->flags & BNX2_FLAG_USING_MSIX) |
1806 | + if (bp->flags & BNX2_FLAG_USING_MSIX) { |
1807 | bnx2_setup_msix_tbl(bp); |
1808 | + /* Prevent MSIX table reads and write from timing out */ |
1809 | + REG_WR(bp, BNX2_MISC_ECO_HW_CTL, |
1810 | + BNX2_MISC_ECO_HW_CTL_LARGE_GRC_TMOUT_EN); |
1811 | + } |
1812 | |
1813 | return rc; |
1814 | } |
1815 | diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c |
1816 | index 3db85da..787befc 100644 |
1817 | --- a/drivers/net/r8169.c |
1818 | +++ b/drivers/net/r8169.c |
1819 | @@ -2832,8 +2832,13 @@ static void rtl_rar_set(struct rtl8169_private *tp, u8 *addr) |
1820 | spin_lock_irq(&tp->lock); |
1821 | |
1822 | RTL_W8(Cfg9346, Cfg9346_Unlock); |
1823 | - RTL_W32(MAC0, low); |
1824 | + |
1825 | RTL_W32(MAC4, high); |
1826 | + RTL_R32(MAC4); |
1827 | + |
1828 | + RTL_W32(MAC0, low); |
1829 | + RTL_R32(MAC0); |
1830 | + |
1831 | RTL_W8(Cfg9346, Cfg9346_Lock); |
1832 | |
1833 | spin_unlock_irq(&tp->lock); |
1834 | @@ -4316,7 +4321,7 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb, |
1835 | |
1836 | tp->cur_tx += frags + 1; |
1837 | |
1838 | - smp_wmb(); |
1839 | + wmb(); |
1840 | |
1841 | RTL_W8(TxPoll, NPQ); /* set polling bit */ |
1842 | |
1843 | @@ -4675,7 +4680,7 @@ static int rtl8169_poll(struct napi_struct *napi, int budget) |
1844 | * until it does. |
1845 | */ |
1846 | tp->intr_mask = 0xffff; |
1847 | - smp_wmb(); |
1848 | + wmb(); |
1849 | RTL_W16(IntrMask, tp->intr_event); |
1850 | } |
1851 | |
1852 | @@ -4813,8 +4818,8 @@ static void rtl_set_rx_mode(struct net_device *dev) |
1853 | mc_filter[1] = swab32(data); |
1854 | } |
1855 | |
1856 | - RTL_W32(MAR0 + 0, mc_filter[0]); |
1857 | RTL_W32(MAR0 + 4, mc_filter[1]); |
1858 | + RTL_W32(MAR0 + 0, mc_filter[0]); |
1859 | |
1860 | RTL_W32(RxConfig, tmp); |
1861 | |
1862 | diff --git a/drivers/net/sfc/efx.c b/drivers/net/sfc/efx.c |
1863 | index 46997e1..fb52e47 100644 |
1864 | --- a/drivers/net/sfc/efx.c |
1865 | +++ b/drivers/net/sfc/efx.c |
1866 | @@ -1862,6 +1862,7 @@ out: |
1867 | } |
1868 | |
1869 | if (disabled) { |
1870 | + dev_close(efx->net_dev); |
1871 | EFX_ERR(efx, "has been disabled\n"); |
1872 | efx->state = STATE_DISABLED; |
1873 | } else { |
1874 | @@ -1885,8 +1886,7 @@ static void efx_reset_work(struct work_struct *data) |
1875 | } |
1876 | |
1877 | rtnl_lock(); |
1878 | - if (efx_reset(efx, efx->reset_pending)) |
1879 | - dev_close(efx->net_dev); |
1880 | + (void)efx_reset(efx, efx->reset_pending); |
1881 | rtnl_unlock(); |
1882 | } |
1883 | |
1884 | diff --git a/drivers/net/sfc/falcon.c b/drivers/net/sfc/falcon.c |
1885 | index 9d009c4..e20a824 100644 |
1886 | --- a/drivers/net/sfc/falcon.c |
1887 | +++ b/drivers/net/sfc/falcon.c |
1888 | @@ -1317,7 +1317,9 @@ static int falcon_probe_nvconfig(struct efx_nic *efx) |
1889 | |
1890 | EFX_LOG(efx, "PHY is %d phy_id %d\n", efx->phy_type, efx->mdio.prtad); |
1891 | |
1892 | - falcon_probe_board(efx, board_rev); |
1893 | + rc = falcon_probe_board(efx, board_rev); |
1894 | + if (rc) |
1895 | + goto fail2; |
1896 | |
1897 | kfree(nvconfig); |
1898 | return 0; |
1899 | diff --git a/drivers/net/sfc/falcon_boards.c b/drivers/net/sfc/falcon_boards.c |
1900 | index 5712fdd..c7a933a 100644 |
1901 | --- a/drivers/net/sfc/falcon_boards.c |
1902 | +++ b/drivers/net/sfc/falcon_boards.c |
1903 | @@ -728,15 +728,7 @@ static const struct falcon_board_type board_types[] = { |
1904 | }, |
1905 | }; |
1906 | |
1907 | -static const struct falcon_board_type falcon_dummy_board = { |
1908 | - .init = efx_port_dummy_op_int, |
1909 | - .init_phy = efx_port_dummy_op_void, |
1910 | - .fini = efx_port_dummy_op_void, |
1911 | - .set_id_led = efx_port_dummy_op_set_id_led, |
1912 | - .monitor = efx_port_dummy_op_int, |
1913 | -}; |
1914 | - |
1915 | -void falcon_probe_board(struct efx_nic *efx, u16 revision_info) |
1916 | +int falcon_probe_board(struct efx_nic *efx, u16 revision_info) |
1917 | { |
1918 | struct falcon_board *board = falcon_board(efx); |
1919 | u8 type_id = FALCON_BOARD_TYPE(revision_info); |
1920 | @@ -754,8 +746,9 @@ void falcon_probe_board(struct efx_nic *efx, u16 revision_info) |
1921 | (efx->pci_dev->subsystem_vendor == EFX_VENDID_SFC) |
1922 | ? board->type->ref_model : board->type->gen_type, |
1923 | 'A' + board->major, board->minor); |
1924 | + return 0; |
1925 | } else { |
1926 | EFX_ERR(efx, "unknown board type %d\n", type_id); |
1927 | - board->type = &falcon_dummy_board; |
1928 | + return -ENODEV; |
1929 | } |
1930 | } |
1931 | diff --git a/drivers/net/sfc/nic.h b/drivers/net/sfc/nic.h |
1932 | index 9351c03..3166baf 100644 |
1933 | --- a/drivers/net/sfc/nic.h |
1934 | +++ b/drivers/net/sfc/nic.h |
1935 | @@ -156,7 +156,7 @@ extern struct efx_nic_type siena_a0_nic_type; |
1936 | ************************************************************************** |
1937 | */ |
1938 | |
1939 | -extern void falcon_probe_board(struct efx_nic *efx, u16 revision_info); |
1940 | +extern int falcon_probe_board(struct efx_nic *efx, u16 revision_info); |
1941 | |
1942 | /* TX data path */ |
1943 | extern int efx_nic_probe_tx(struct efx_tx_queue *tx_queue); |
1944 | diff --git a/drivers/net/sfc/siena.c b/drivers/net/sfc/siena.c |
1945 | index f8c6771..afbac2d 100644 |
1946 | --- a/drivers/net/sfc/siena.c |
1947 | +++ b/drivers/net/sfc/siena.c |
1948 | @@ -454,8 +454,17 @@ static int siena_try_update_nic_stats(struct efx_nic *efx) |
1949 | |
1950 | static void siena_update_nic_stats(struct efx_nic *efx) |
1951 | { |
1952 | - while (siena_try_update_nic_stats(efx) == -EAGAIN) |
1953 | - cpu_relax(); |
1954 | + int retry; |
1955 | + |
1956 | + /* If we're unlucky enough to read statistics wduring the DMA, wait |
1957 | + * up to 10ms for it to finish (typically takes <500us) */ |
1958 | + for (retry = 0; retry < 100; ++retry) { |
1959 | + if (siena_try_update_nic_stats(efx) == 0) |
1960 | + return; |
1961 | + udelay(100); |
1962 | + } |
1963 | + |
1964 | + /* Use the old values instead */ |
1965 | } |
1966 | |
1967 | static void siena_start_nic_stats(struct efx_nic *efx) |
1968 | diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c |
1969 | index 17d1493..8405fb8 100644 |
1970 | --- a/drivers/net/tg3.c |
1971 | +++ b/drivers/net/tg3.c |
1972 | @@ -8572,6 +8572,7 @@ static int tg3_test_msi(struct tg3 *tp) |
1973 | pci_disable_msi(tp->pdev); |
1974 | |
1975 | tp->tg3_flags2 &= ~TG3_FLG2_USING_MSI; |
1976 | + tp->napi[0].irq_vec = tp->pdev->irq; |
1977 | |
1978 | err = tg3_request_irq(tp, 0); |
1979 | if (err) |
1980 | diff --git a/drivers/net/tun.c b/drivers/net/tun.c |
1981 | index 2834a01..909b73d 100644 |
1982 | --- a/drivers/net/tun.c |
1983 | +++ b/drivers/net/tun.c |
1984 | @@ -380,6 +380,10 @@ static netdev_tx_t tun_net_xmit(struct sk_buff *skb, struct net_device *dev) |
1985 | } |
1986 | } |
1987 | |
1988 | + /* Orphan the skb - required as we might hang on to it |
1989 | + * for indefinite time. */ |
1990 | + skb_orphan(skb); |
1991 | + |
1992 | /* Enqueue packet */ |
1993 | skb_queue_tail(&tun->socket.sk->sk_receive_queue, skb); |
1994 | dev->trans_start = jiffies; |
1995 | diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c |
1996 | index 5f3b9ea..8a6e027 100644 |
1997 | --- a/drivers/net/usb/cdc_ether.c |
1998 | +++ b/drivers/net/usb/cdc_ether.c |
1999 | @@ -433,6 +433,7 @@ static const struct driver_info mbm_info = { |
2000 | .bind = cdc_bind, |
2001 | .unbind = usbnet_cdc_unbind, |
2002 | .status = cdc_status, |
2003 | + .manage_power = cdc_manage_power, |
2004 | }; |
2005 | |
2006 | /*-------------------------------------------------------------------------*/ |
2007 | diff --git a/drivers/net/usb/dm9601.c b/drivers/net/usb/dm9601.c |
2008 | index 3d406f9..c60625b 100644 |
2009 | --- a/drivers/net/usb/dm9601.c |
2010 | +++ b/drivers/net/usb/dm9601.c |
2011 | @@ -238,7 +238,7 @@ static int dm_write_shared_word(struct usbnet *dev, int phy, u8 reg, __le16 valu |
2012 | goto out; |
2013 | |
2014 | dm_write_reg(dev, DM_SHARED_ADDR, phy ? (reg | 0x40) : reg); |
2015 | - dm_write_reg(dev, DM_SHARED_CTRL, phy ? 0x1c : 0x14); |
2016 | + dm_write_reg(dev, DM_SHARED_CTRL, phy ? 0x1a : 0x12); |
2017 | |
2018 | for (i = 0; i < DM_TIMEOUT; i++) { |
2019 | u8 tmp; |
2020 | diff --git a/drivers/net/wan/hdlc_ppp.c b/drivers/net/wan/hdlc_ppp.c |
2021 | index b9b9d6b..941f053 100644 |
2022 | --- a/drivers/net/wan/hdlc_ppp.c |
2023 | +++ b/drivers/net/wan/hdlc_ppp.c |
2024 | @@ -628,9 +628,15 @@ static void ppp_stop(struct net_device *dev) |
2025 | ppp_cp_event(dev, PID_LCP, STOP, 0, 0, 0, NULL); |
2026 | } |
2027 | |
2028 | +static void ppp_close(struct net_device *dev) |
2029 | +{ |
2030 | + ppp_tx_flush(); |
2031 | +} |
2032 | + |
2033 | static struct hdlc_proto proto = { |
2034 | .start = ppp_start, |
2035 | .stop = ppp_stop, |
2036 | + .close = ppp_close, |
2037 | .type_trans = ppp_type_trans, |
2038 | .ioctl = ppp_ioctl, |
2039 | .netif_rx = ppp_rx, |
2040 | diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c |
2041 | index 7b1eab4..e55f718 100644 |
2042 | --- a/drivers/net/wireless/ath/ath9k/main.c |
2043 | +++ b/drivers/net/wireless/ath/ath9k/main.c |
2044 | @@ -1358,9 +1358,9 @@ void ath_cleanup(struct ath_softc *sc) |
2045 | free_irq(sc->irq, sc); |
2046 | ath_bus_cleanup(common); |
2047 | kfree(sc->sec_wiphy); |
2048 | - ieee80211_free_hw(sc->hw); |
2049 | |
2050 | ath9k_uninit_hw(sc); |
2051 | + ieee80211_free_hw(sc->hw); |
2052 | } |
2053 | |
2054 | static int ath9k_reg_notifier(struct wiphy *wiphy, |
2055 | diff --git a/drivers/net/wireless/p54/p54pci.c b/drivers/net/wireless/p54/p54pci.c |
2056 | index 4bf4c21..41d33cd 100644 |
2057 | --- a/drivers/net/wireless/p54/p54pci.c |
2058 | +++ b/drivers/net/wireless/p54/p54pci.c |
2059 | @@ -245,7 +245,7 @@ static void p54p_check_tx_ring(struct ieee80211_hw *dev, u32 *index, |
2060 | u32 idx, i; |
2061 | |
2062 | i = (*index) % ring_limit; |
2063 | - (*index) = idx = le32_to_cpu(ring_control->device_idx[1]); |
2064 | + (*index) = idx = le32_to_cpu(ring_control->device_idx[ring_index]); |
2065 | idx %= ring_limit; |
2066 | |
2067 | while (i != idx) { |
2068 | diff --git a/drivers/net/wireless/p54/p54usb.c b/drivers/net/wireless/p54/p54usb.c |
2069 | index 8742640..b3c4fbd 100644 |
2070 | --- a/drivers/net/wireless/p54/p54usb.c |
2071 | +++ b/drivers/net/wireless/p54/p54usb.c |
2072 | @@ -36,6 +36,7 @@ static struct usb_device_id p54u_table[] __devinitdata = { |
2073 | /* Version 1 devices (pci chip + net2280) */ |
2074 | {USB_DEVICE(0x0506, 0x0a11)}, /* 3COM 3CRWE254G72 */ |
2075 | {USB_DEVICE(0x0707, 0xee06)}, /* SMC 2862W-G */ |
2076 | + {USB_DEVICE(0x07aa, 0x001c)}, /* Corega CG-WLUSB2GT */ |
2077 | {USB_DEVICE(0x083a, 0x4501)}, /* Accton 802.11g WN4501 USB */ |
2078 | {USB_DEVICE(0x083a, 0x4502)}, /* Siemens Gigaset USB Adapter */ |
2079 | {USB_DEVICE(0x083a, 0x5501)}, /* Phillips CPWUA054 */ |
2080 | diff --git a/drivers/net/wireless/p54/txrx.c b/drivers/net/wireless/p54/txrx.c |
2081 | index b6dda2b..9d147de 100644 |
2082 | --- a/drivers/net/wireless/p54/txrx.c |
2083 | +++ b/drivers/net/wireless/p54/txrx.c |
2084 | @@ -186,7 +186,7 @@ static int p54_tx_qos_accounting_alloc(struct p54_common *priv, |
2085 | struct ieee80211_tx_queue_stats *queue; |
2086 | unsigned long flags; |
2087 | |
2088 | - if (WARN_ON(p54_queue > P54_QUEUE_NUM)) |
2089 | + if (WARN_ON(p54_queue >= P54_QUEUE_NUM)) |
2090 | return -EINVAL; |
2091 | |
2092 | queue = &priv->tx_stats[p54_queue]; |
2093 | diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c |
2094 | index c4fead1..b8eb5e7 100644 |
2095 | --- a/drivers/pci/pci.c |
2096 | +++ b/drivers/pci/pci.c |
2097 | @@ -624,7 +624,7 @@ static void __pci_start_power_transition(struct pci_dev *dev, pci_power_t state) |
2098 | */ |
2099 | int __pci_complete_power_transition(struct pci_dev *dev, pci_power_t state) |
2100 | { |
2101 | - return state > PCI_D0 ? |
2102 | + return state >= PCI_D0 ? |
2103 | pci_platform_power_transition(dev, state) : -EINVAL; |
2104 | } |
2105 | EXPORT_SYMBOL_GPL(__pci_complete_power_transition); |
2106 | @@ -661,10 +661,6 @@ int pci_set_power_state(struct pci_dev *dev, pci_power_t state) |
2107 | */ |
2108 | return 0; |
2109 | |
2110 | - /* Check if we're already there */ |
2111 | - if (dev->current_state == state) |
2112 | - return 0; |
2113 | - |
2114 | __pci_start_power_transition(dev, state); |
2115 | |
2116 | /* This device is quirked not to be put into D3, so |
2117 | diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c |
2118 | index e6b67f2..741672f 100644 |
2119 | --- a/drivers/scsi/libiscsi.c |
2120 | +++ b/drivers/scsi/libiscsi.c |
2121 | @@ -470,12 +470,12 @@ static int iscsi_prep_scsi_cmd_pdu(struct iscsi_task *task) |
2122 | |
2123 | WARN_ON(hdrlength >= 256); |
2124 | hdr->hlength = hdrlength & 0xFF; |
2125 | + hdr->cmdsn = task->cmdsn = cpu_to_be32(session->cmdsn); |
2126 | |
2127 | if (session->tt->init_task && session->tt->init_task(task)) |
2128 | return -EIO; |
2129 | |
2130 | task->state = ISCSI_TASK_RUNNING; |
2131 | - hdr->cmdsn = task->cmdsn = cpu_to_be32(session->cmdsn); |
2132 | session->cmdsn++; |
2133 | |
2134 | conn->scsicmd_pdus_cnt++; |
2135 | diff --git a/drivers/scsi/libsas/sas_ata.c b/drivers/scsi/libsas/sas_ata.c |
2136 | index e155011..816ab97 100644 |
2137 | --- a/drivers/scsi/libsas/sas_ata.c |
2138 | +++ b/drivers/scsi/libsas/sas_ata.c |
2139 | @@ -394,11 +394,15 @@ int sas_ata_init_host_and_port(struct domain_device *found_dev, |
2140 | void sas_ata_task_abort(struct sas_task *task) |
2141 | { |
2142 | struct ata_queued_cmd *qc = task->uldd_task; |
2143 | + struct request_queue *q = qc->scsicmd->device->request_queue; |
2144 | struct completion *waiting; |
2145 | + unsigned long flags; |
2146 | |
2147 | /* Bounce SCSI-initiated commands to the SCSI EH */ |
2148 | if (qc->scsicmd) { |
2149 | + spin_lock_irqsave(q->queue_lock, flags); |
2150 | blk_abort_request(qc->scsicmd->request); |
2151 | + spin_unlock_irqrestore(q->queue_lock, flags); |
2152 | scsi_schedule_eh(qc->scsicmd->device->host); |
2153 | return; |
2154 | } |
2155 | diff --git a/drivers/scsi/libsas/sas_scsi_host.c b/drivers/scsi/libsas/sas_scsi_host.c |
2156 | index 14b1319..b672d10 100644 |
2157 | --- a/drivers/scsi/libsas/sas_scsi_host.c |
2158 | +++ b/drivers/scsi/libsas/sas_scsi_host.c |
2159 | @@ -1029,6 +1029,8 @@ int __sas_task_abort(struct sas_task *task) |
2160 | void sas_task_abort(struct sas_task *task) |
2161 | { |
2162 | struct scsi_cmnd *sc = task->uldd_task; |
2163 | + struct request_queue *q = sc->device->request_queue; |
2164 | + unsigned long flags; |
2165 | |
2166 | /* Escape for libsas internal commands */ |
2167 | if (!sc) { |
2168 | @@ -1043,7 +1045,9 @@ void sas_task_abort(struct sas_task *task) |
2169 | return; |
2170 | } |
2171 | |
2172 | + spin_lock_irqsave(q->queue_lock, flags); |
2173 | blk_abort_request(sc->request); |
2174 | + spin_unlock_irqrestore(q->queue_lock, flags); |
2175 | scsi_schedule_eh(sc->device->host); |
2176 | } |
2177 | |
2178 | diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c |
2179 | index 0b575c8..aa2a2dc 100644 |
2180 | --- a/drivers/scsi/scsi_debug.c |
2181 | +++ b/drivers/scsi/scsi_debug.c |
2182 | @@ -956,7 +956,8 @@ static int resp_start_stop(struct scsi_cmnd * scp, |
2183 | static sector_t get_sdebug_capacity(void) |
2184 | { |
2185 | if (scsi_debug_virtual_gb > 0) |
2186 | - return 2048 * 1024 * (sector_t)scsi_debug_virtual_gb; |
2187 | + return (sector_t)scsi_debug_virtual_gb * |
2188 | + (1073741824 / scsi_debug_sector_size); |
2189 | else |
2190 | return sdebug_store_sectors; |
2191 | } |
2192 | diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c |
2193 | index 08ed506..e46155b 100644 |
2194 | --- a/drivers/scsi/scsi_error.c |
2195 | +++ b/drivers/scsi/scsi_error.c |
2196 | @@ -301,7 +301,20 @@ static int scsi_check_sense(struct scsi_cmnd *scmd) |
2197 | if (scmd->device->allow_restart && |
2198 | (sshdr.asc == 0x04) && (sshdr.ascq == 0x02)) |
2199 | return FAILED; |
2200 | - return SUCCESS; |
2201 | + |
2202 | + if (blk_barrier_rq(scmd->request)) |
2203 | + /* |
2204 | + * barrier requests should always retry on UA |
2205 | + * otherwise block will get a spurious error |
2206 | + */ |
2207 | + return NEEDS_RETRY; |
2208 | + else |
2209 | + /* |
2210 | + * for normal (non barrier) commands, pass the |
2211 | + * UA upwards for a determination in the |
2212 | + * completion functions |
2213 | + */ |
2214 | + return SUCCESS; |
2215 | |
2216 | /* these three are not supported */ |
2217 | case COPY_ABORTED: |
2218 | diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c |
2219 | index c664242..5697709 100644 |
2220 | --- a/drivers/scsi/scsi_lib.c |
2221 | +++ b/drivers/scsi/scsi_lib.c |
2222 | @@ -773,8 +773,14 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes) |
2223 | * we already took a copy of the original into rq->errors which |
2224 | * is what gets returned to the user |
2225 | */ |
2226 | - if (sense_valid && sshdr.sense_key == RECOVERED_ERROR) { |
2227 | - if (!(req->cmd_flags & REQ_QUIET)) |
2228 | + if (sense_valid && (sshdr.sense_key == RECOVERED_ERROR)) { |
2229 | + /* if ATA PASS-THROUGH INFORMATION AVAILABLE skip |
2230 | + * print since caller wants ATA registers. Only occurs on |
2231 | + * SCSI ATA PASS_THROUGH commands when CK_COND=1 |
2232 | + */ |
2233 | + if ((sshdr.asc == 0x0) && (sshdr.ascq == 0x1d)) |
2234 | + ; |
2235 | + else if (!(req->cmd_flags & REQ_QUIET)) |
2236 | scsi_print_sense("", cmd); |
2237 | result = 0; |
2238 | /* BLOCK_PC may have set error */ |
2239 | diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c |
2240 | index 255da53..bf15920 100644 |
2241 | --- a/drivers/scsi/sd.c |
2242 | +++ b/drivers/scsi/sd.c |
2243 | @@ -1039,6 +1039,7 @@ static void sd_prepare_flush(struct request_queue *q, struct request *rq) |
2244 | { |
2245 | rq->cmd_type = REQ_TYPE_BLOCK_PC; |
2246 | rq->timeout = SD_TIMEOUT; |
2247 | + rq->retries = SD_MAX_RETRIES; |
2248 | rq->cmd[0] = SYNCHRONIZE_CACHE; |
2249 | rq->cmd_len = 10; |
2250 | } |
2251 | diff --git a/drivers/serial/8250_pnp.c b/drivers/serial/8250_pnp.c |
2252 | index 24485cc..4822cb5 100644 |
2253 | --- a/drivers/serial/8250_pnp.c |
2254 | +++ b/drivers/serial/8250_pnp.c |
2255 | @@ -348,6 +348,8 @@ static const struct pnp_device_id pnp_dev_table[] = { |
2256 | { "FUJ02E6", 0 }, |
2257 | /* Fujitsu Wacom 2FGT Tablet PC device */ |
2258 | { "FUJ02E7", 0 }, |
2259 | + /* Fujitsu Wacom 1FGT Tablet PC device */ |
2260 | + { "FUJ02E9", 0 }, |
2261 | /* |
2262 | * LG C1 EXPRESS DUAL (C1-PB11A3) touch screen (actually a FUJ02E6 in |
2263 | * disguise) |
2264 | diff --git a/drivers/staging/hv/Hv.c b/drivers/staging/hv/Hv.c |
2265 | index c2809f2..b12237f 100644 |
2266 | --- a/drivers/staging/hv/Hv.c |
2267 | +++ b/drivers/staging/hv/Hv.c |
2268 | @@ -306,9 +306,9 @@ void HvCleanup(void) |
2269 | DPRINT_ENTER(VMBUS); |
2270 | |
2271 | if (gHvContext.SignalEventBuffer) { |
2272 | + kfree(gHvContext.SignalEventBuffer); |
2273 | gHvContext.SignalEventBuffer = NULL; |
2274 | gHvContext.SignalEventParam = NULL; |
2275 | - kfree(gHvContext.SignalEventBuffer); |
2276 | } |
2277 | |
2278 | if (gHvContext.GuestId == HV_LINUX_GUEST_ID) { |
2279 | diff --git a/drivers/staging/hv/RndisFilter.c b/drivers/staging/hv/RndisFilter.c |
2280 | index 26d7997..f05f4e1 100644 |
2281 | --- a/drivers/staging/hv/RndisFilter.c |
2282 | +++ b/drivers/staging/hv/RndisFilter.c |
2283 | @@ -756,6 +756,7 @@ static int RndisFilterOpenDevice(struct rndis_device *Device) |
2284 | |
2285 | ret = RndisFilterSetPacketFilter(Device, |
2286 | NDIS_PACKET_TYPE_BROADCAST | |
2287 | + NDIS_PACKET_TYPE_ALL_MULTICAST | |
2288 | NDIS_PACKET_TYPE_DIRECTED); |
2289 | if (ret == 0) |
2290 | Device->State = RNDIS_DEV_DATAINITIALIZED; |
2291 | diff --git a/drivers/staging/hv/netvsc_drv.c b/drivers/staging/hv/netvsc_drv.c |
2292 | index 0d7459e..4c3c8bc 100644 |
2293 | --- a/drivers/staging/hv/netvsc_drv.c |
2294 | +++ b/drivers/staging/hv/netvsc_drv.c |
2295 | @@ -413,8 +413,7 @@ static int netvsc_probe(struct device *device) |
2296 | if (!net_drv_obj->Base.OnDeviceAdd) |
2297 | return -1; |
2298 | |
2299 | - net = alloc_netdev(sizeof(struct net_device_context), "seth%d", |
2300 | - ether_setup); |
2301 | + net = alloc_etherdev(sizeof(struct net_device_context)); |
2302 | if (!net) |
2303 | return -1; |
2304 | |
2305 | diff --git a/drivers/staging/usbip/usbip_event.c b/drivers/staging/usbip/usbip_event.c |
2306 | index 6da1021..a2566f1 100644 |
2307 | --- a/drivers/staging/usbip/usbip_event.c |
2308 | +++ b/drivers/staging/usbip/usbip_event.c |
2309 | @@ -117,6 +117,9 @@ void usbip_stop_eh(struct usbip_device *ud) |
2310 | { |
2311 | struct usbip_task *eh = &ud->eh; |
2312 | |
2313 | + if (eh->thread == current) |
2314 | + return; /* do not wait for myself */ |
2315 | + |
2316 | wait_for_completion(&eh->thread_done); |
2317 | usbip_dbg_eh("usbip_eh has finished\n"); |
2318 | } |
2319 | diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c |
2320 | index ca479a7..d9d0bf5 100644 |
2321 | --- a/drivers/usb/core/driver.c |
2322 | +++ b/drivers/usb/core/driver.c |
2323 | @@ -1255,9 +1255,8 @@ static int usb_suspend_both(struct usb_device *udev, pm_message_t msg) |
2324 | udev->state == USB_STATE_SUSPENDED) |
2325 | goto done; |
2326 | |
2327 | - udev->do_remote_wakeup = device_may_wakeup(&udev->dev); |
2328 | - |
2329 | if (msg.event & PM_EVENT_AUTO) { |
2330 | + udev->do_remote_wakeup = device_may_wakeup(&udev->dev); |
2331 | status = autosuspend_check(udev, 0); |
2332 | if (status < 0) |
2333 | goto done; |
2334 | @@ -1789,6 +1788,34 @@ int usb_external_resume_device(struct usb_device *udev, pm_message_t msg) |
2335 | return status; |
2336 | } |
2337 | |
2338 | +static void choose_wakeup(struct usb_device *udev, pm_message_t msg) |
2339 | +{ |
2340 | + int w, i; |
2341 | + struct usb_interface *intf; |
2342 | + |
2343 | + /* Remote wakeup is needed only when we actually go to sleep. |
2344 | + * For things like FREEZE and QUIESCE, if the device is already |
2345 | + * autosuspended then its current wakeup setting is okay. |
2346 | + */ |
2347 | + if (msg.event == PM_EVENT_FREEZE || msg.event == PM_EVENT_QUIESCE) { |
2348 | + udev->do_remote_wakeup = 0; |
2349 | + return; |
2350 | + } |
2351 | + |
2352 | + /* If remote wakeup is permitted, see whether any interface drivers |
2353 | + * actually want it. |
2354 | + */ |
2355 | + w = 0; |
2356 | + if (device_may_wakeup(&udev->dev) && udev->actconfig) { |
2357 | + for (i = 0; i < udev->actconfig->desc.bNumInterfaces; i++) { |
2358 | + intf = udev->actconfig->interface[i]; |
2359 | + w |= intf->needs_remote_wakeup; |
2360 | + } |
2361 | + } |
2362 | + |
2363 | + udev->do_remote_wakeup = w; |
2364 | +} |
2365 | + |
2366 | int usb_suspend(struct device *dev, pm_message_t msg) |
2367 | { |
2368 | struct usb_device *udev; |
2369 | @@ -1808,6 +1835,7 @@ int usb_suspend(struct device *dev, pm_message_t msg) |
2370 | } |
2371 | |
2372 | udev->skip_sys_resume = 0; |
2373 | + choose_wakeup(udev, msg); |
2374 | return usb_external_suspend_device(udev, msg); |
2375 | } |
2376 | |
2377 | diff --git a/drivers/usb/core/generic.c b/drivers/usb/core/generic.c |
2378 | index bdf87a8..2c95153 100644 |
2379 | --- a/drivers/usb/core/generic.c |
2380 | +++ b/drivers/usb/core/generic.c |
2381 | @@ -120,7 +120,7 @@ int usb_choose_configuration(struct usb_device *udev) |
2382 | * than a vendor-specific driver. */ |
2383 | else if (udev->descriptor.bDeviceClass != |
2384 | USB_CLASS_VENDOR_SPEC && |
2385 | - (!desc || desc->bInterfaceClass != |
2386 | + (desc && desc->bInterfaceClass != |
2387 | USB_CLASS_VENDOR_SPEC)) { |
2388 | best = c; |
2389 | break; |
2390 | diff --git a/drivers/usb/core/inode.c b/drivers/usb/core/inode.c |
2391 | index 97b40ce..4a6366a 100644 |
2392 | --- a/drivers/usb/core/inode.c |
2393 | +++ b/drivers/usb/core/inode.c |
2394 | @@ -515,13 +515,13 @@ static int fs_create_by_name (const char *name, mode_t mode, |
2395 | *dentry = NULL; |
2396 | mutex_lock(&parent->d_inode->i_mutex); |
2397 | *dentry = lookup_one_len(name, parent, strlen(name)); |
2398 | - if (!IS_ERR(dentry)) { |
2399 | + if (!IS_ERR(*dentry)) { |
2400 | if ((mode & S_IFMT) == S_IFDIR) |
2401 | error = usbfs_mkdir (parent->d_inode, *dentry, mode); |
2402 | else |
2403 | error = usbfs_create (parent->d_inode, *dentry, mode); |
2404 | } else |
2405 | - error = PTR_ERR(dentry); |
2406 | + error = PTR_ERR(*dentry); |
2407 | mutex_unlock(&parent->d_inode->i_mutex); |
2408 | |
2409 | return error; |
2410 | diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c |
2411 | index 9bc95fe..1a48aac 100644 |
2412 | --- a/drivers/usb/core/message.c |
2413 | +++ b/drivers/usb/core/message.c |
2414 | @@ -1471,7 +1471,7 @@ int usb_reset_configuration(struct usb_device *dev) |
2415 | /* If not, reinstate the old alternate settings */ |
2416 | if (retval < 0) { |
2417 | reset_old_alts: |
2418 | - for (; i >= 0; i--) { |
2419 | + for (i--; i >= 0; i--) { |
2420 | struct usb_interface *intf = config->interface[i]; |
2421 | struct usb_host_interface *alt; |
2422 | |
2423 | diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c |
2424 | index 9c90b67..efa0372 100644 |
2425 | --- a/drivers/usb/host/ehci-hcd.c |
2426 | +++ b/drivers/usb/host/ehci-hcd.c |
2427 | @@ -543,6 +543,7 @@ static int ehci_init(struct usb_hcd *hcd) |
2428 | */ |
2429 | ehci->periodic_size = DEFAULT_I_TDPS; |
2430 | INIT_LIST_HEAD(&ehci->cached_itd_list); |
2431 | + INIT_LIST_HEAD(&ehci->cached_sitd_list); |
2432 | if ((retval = ehci_mem_init(ehci, GFP_KERNEL)) < 0) |
2433 | return retval; |
2434 | |
2435 | diff --git a/drivers/usb/host/ehci-mem.c b/drivers/usb/host/ehci-mem.c |
2436 | index aeda96e..1f3f01e 100644 |
2437 | --- a/drivers/usb/host/ehci-mem.c |
2438 | +++ b/drivers/usb/host/ehci-mem.c |
2439 | @@ -136,7 +136,7 @@ static inline void qh_put (struct ehci_qh *qh) |
2440 | |
2441 | static void ehci_mem_cleanup (struct ehci_hcd *ehci) |
2442 | { |
2443 | - free_cached_itd_list(ehci); |
2444 | + free_cached_lists(ehci); |
2445 | if (ehci->async) |
2446 | qh_put (ehci->async); |
2447 | ehci->async = NULL; |
2448 | diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c |
2449 | index df533ce..2064045 100644 |
2450 | --- a/drivers/usb/host/ehci-sched.c |
2451 | +++ b/drivers/usb/host/ehci-sched.c |
2452 | @@ -2137,13 +2137,27 @@ sitd_complete ( |
2453 | (stream->bEndpointAddress & USB_DIR_IN) ? "in" : "out"); |
2454 | } |
2455 | iso_stream_put (ehci, stream); |
2456 | - /* OK to recycle this SITD now that its completion callback ran. */ |
2457 | + |
2458 | done: |
2459 | sitd->urb = NULL; |
2460 | - sitd->stream = NULL; |
2461 | - list_move(&sitd->sitd_list, &stream->free_list); |
2462 | - iso_stream_put(ehci, stream); |
2463 | - |
2464 | + if (ehci->clock_frame != sitd->frame) { |
2465 | + /* OK to recycle this SITD now. */ |
2466 | + sitd->stream = NULL; |
2467 | + list_move(&sitd->sitd_list, &stream->free_list); |
2468 | + iso_stream_put(ehci, stream); |
2469 | + } else { |
2470 | + /* HW might remember this SITD, so we can't recycle it yet. |
2471 | + * Move it to a safe place until a new frame starts. |
2472 | + */ |
2473 | + list_move(&sitd->sitd_list, &ehci->cached_sitd_list); |
2474 | + if (stream->refcount == 2) { |
2475 | + /* If iso_stream_put() were called here, stream |
2476 | + * would be freed. Instead, just prevent reuse. |
2477 | + */ |
2478 | + stream->ep->hcpriv = NULL; |
2479 | + stream->ep = NULL; |
2480 | + } |
2481 | + } |
2482 | return retval; |
2483 | } |
2484 | |
2485 | @@ -2209,9 +2223,10 @@ done: |
2486 | |
2487 | /*-------------------------------------------------------------------------*/ |
2488 | |
2489 | -static void free_cached_itd_list(struct ehci_hcd *ehci) |
2490 | +static void free_cached_lists(struct ehci_hcd *ehci) |
2491 | { |
2492 | struct ehci_itd *itd, *n; |
2493 | + struct ehci_sitd *sitd, *sn; |
2494 | |
2495 | list_for_each_entry_safe(itd, n, &ehci->cached_itd_list, itd_list) { |
2496 | struct ehci_iso_stream *stream = itd->stream; |
2497 | @@ -2219,6 +2234,13 @@ static void free_cached_itd_list(struct ehci_hcd *ehci) |
2498 | list_move(&itd->itd_list, &stream->free_list); |
2499 | iso_stream_put(ehci, stream); |
2500 | } |
2501 | + |
2502 | + list_for_each_entry_safe(sitd, sn, &ehci->cached_sitd_list, sitd_list) { |
2503 | + struct ehci_iso_stream *stream = sitd->stream; |
2504 | + sitd->stream = NULL; |
2505 | + list_move(&sitd->sitd_list, &stream->free_list); |
2506 | + iso_stream_put(ehci, stream); |
2507 | + } |
2508 | } |
2509 | |
2510 | /*-------------------------------------------------------------------------*/ |
2511 | @@ -2245,7 +2267,7 @@ scan_periodic (struct ehci_hcd *ehci) |
2512 | clock_frame = -1; |
2513 | } |
2514 | if (ehci->clock_frame != clock_frame) { |
2515 | - free_cached_itd_list(ehci); |
2516 | + free_cached_lists(ehci); |
2517 | ehci->clock_frame = clock_frame; |
2518 | } |
2519 | clock %= mod; |
2520 | @@ -2408,7 +2430,7 @@ restart: |
2521 | clock = now; |
2522 | clock_frame = clock >> 3; |
2523 | if (ehci->clock_frame != clock_frame) { |
2524 | - free_cached_itd_list(ehci); |
2525 | + free_cached_lists(ehci); |
2526 | ehci->clock_frame = clock_frame; |
2527 | } |
2528 | } else { |
2529 | diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h |
2530 | index b1dce96..556c0b4 100644 |
2531 | --- a/drivers/usb/host/ehci.h |
2532 | +++ b/drivers/usb/host/ehci.h |
2533 | @@ -87,8 +87,9 @@ struct ehci_hcd { /* one per controller */ |
2534 | int next_uframe; /* scan periodic, start here */ |
2535 | unsigned periodic_sched; /* periodic activity count */ |
2536 | |
2537 | - /* list of itds completed while clock_frame was still active */ |
2538 | + /* list of itds & sitds completed while clock_frame was still active */ |
2539 | struct list_head cached_itd_list; |
2540 | + struct list_head cached_sitd_list; |
2541 | unsigned clock_frame; |
2542 | |
2543 | /* per root hub port */ |
2544 | @@ -195,7 +196,7 @@ timer_action_done (struct ehci_hcd *ehci, enum ehci_timer_action action) |
2545 | clear_bit (action, &ehci->actions); |
2546 | } |
2547 | |
2548 | -static void free_cached_itd_list(struct ehci_hcd *ehci); |
2549 | +static void free_cached_lists(struct ehci_hcd *ehci); |
2550 | |
2551 | /*-------------------------------------------------------------------------*/ |
2552 | |
2553 | diff --git a/drivers/usb/host/ohci-hub.c b/drivers/usb/host/ohci-hub.c |
2554 | index 32bbce9..65cac8c 100644 |
2555 | --- a/drivers/usb/host/ohci-hub.c |
2556 | +++ b/drivers/usb/host/ohci-hub.c |
2557 | @@ -697,7 +697,7 @@ static int ohci_hub_control ( |
2558 | u16 wLength |
2559 | ) { |
2560 | struct ohci_hcd *ohci = hcd_to_ohci (hcd); |
2561 | - int ports = hcd_to_bus (hcd)->root_hub->maxchild; |
2562 | + int ports = ohci->num_ports; |
2563 | u32 temp; |
2564 | int retval = 0; |
2565 | |
2566 | diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c |
2567 | index bffcef7..6c1f673 100644 |
2568 | --- a/drivers/usb/host/xhci-mem.c |
2569 | +++ b/drivers/usb/host/xhci-mem.c |
2570 | @@ -549,6 +549,19 @@ static inline unsigned int xhci_get_endpoint_interval(struct usb_device *udev, |
2571 | return EP_INTERVAL(interval); |
2572 | } |
2573 | |
2574 | +/* The "Mult" field in the endpoint context is only set for SuperSpeed devices. |
2575 | + * High speed endpoint descriptors can define "the number of additional |
2576 | + * transaction opportunities per microframe", but that goes in the Max Burst |
2577 | + * endpoint context field. |
2578 | + */ |
2579 | +static inline u32 xhci_get_endpoint_mult(struct usb_device *udev, |
2580 | + struct usb_host_endpoint *ep) |
2581 | +{ |
2582 | + if (udev->speed != USB_SPEED_SUPER || !ep->ss_ep_comp) |
2583 | + return 0; |
2584 | + return ep->ss_ep_comp->desc.bmAttributes; |
2585 | +} |
2586 | + |
2587 | static inline u32 xhci_get_endpoint_type(struct usb_device *udev, |
2588 | struct usb_host_endpoint *ep) |
2589 | { |
2590 | @@ -579,6 +592,36 @@ static inline u32 xhci_get_endpoint_type(struct usb_device *udev, |
2591 | return type; |
2592 | } |
2593 | |
2594 | +/* Return the maximum endpoint service interval time (ESIT) payload. |
2595 | + * Basically, this is the maxpacket size, multiplied by the burst size |
2596 | + * and mult size. |
2597 | + */ |
2598 | +static inline u32 xhci_get_max_esit_payload(struct xhci_hcd *xhci, |
2599 | + struct usb_device *udev, |
2600 | + struct usb_host_endpoint *ep) |
2601 | +{ |
2602 | + int max_burst; |
2603 | + int max_packet; |
2604 | + |
2605 | + /* Only applies for interrupt or isochronous endpoints */ |
2606 | + if (usb_endpoint_xfer_control(&ep->desc) || |
2607 | + usb_endpoint_xfer_bulk(&ep->desc)) |
2608 | + return 0; |
2609 | + |
2610 | + if (udev->speed == USB_SPEED_SUPER) { |
2611 | + if (ep->ss_ep_comp) |
2612 | + return ep->ss_ep_comp->desc.wBytesPerInterval; |
2613 | + xhci_warn(xhci, "WARN no SS endpoint companion descriptor.\n"); |
2614 | + /* Assume no bursts, no multiple opportunities to send. */ |
2615 | + return ep->desc.wMaxPacketSize; |
2616 | + } |
2617 | + |
2618 | + max_packet = ep->desc.wMaxPacketSize & 0x3ff; |
2619 | + max_burst = (ep->desc.wMaxPacketSize & 0x1800) >> 11; |
2620 | + /* A 0 in max burst means 1 transfer per ESIT */ |
2621 | + return max_packet * (max_burst + 1); |
2622 | +} |
2623 | + |
2624 | int xhci_endpoint_init(struct xhci_hcd *xhci, |
2625 | struct xhci_virt_device *virt_dev, |
2626 | struct usb_device *udev, |
2627 | @@ -590,6 +633,7 @@ int xhci_endpoint_init(struct xhci_hcd *xhci, |
2628 | struct xhci_ring *ep_ring; |
2629 | unsigned int max_packet; |
2630 | unsigned int max_burst; |
2631 | + u32 max_esit_payload; |
2632 | |
2633 | ep_index = xhci_get_endpoint_index(&ep->desc); |
2634 | ep_ctx = xhci_get_ep_ctx(xhci, virt_dev->in_ctx, ep_index); |
2635 | @@ -611,6 +655,7 @@ int xhci_endpoint_init(struct xhci_hcd *xhci, |
2636 | ep_ctx->deq = ep_ring->first_seg->dma | ep_ring->cycle_state; |
2637 | |
2638 | ep_ctx->ep_info = xhci_get_endpoint_interval(udev, ep); |
2639 | + ep_ctx->ep_info |= EP_MULT(xhci_get_endpoint_mult(udev, ep)); |
2640 | |
2641 | /* FIXME dig Mult and streams info out of ep companion desc */ |
2642 | |
2643 | @@ -656,6 +701,26 @@ int xhci_endpoint_init(struct xhci_hcd *xhci, |
2644 | default: |
2645 | BUG(); |
2646 | } |
2647 | + max_esit_payload = xhci_get_max_esit_payload(xhci, udev, ep); |
2648 | + ep_ctx->tx_info = MAX_ESIT_PAYLOAD_FOR_EP(max_esit_payload); |
2649 | + |
2650 | + /* |
2651 | + * XXX no idea how to calculate the average TRB buffer length for bulk |
2652 | + * endpoints, as the driver gives us no clue how big each scatter gather |
2653 | + * list entry (or buffer) is going to be. |
2654 | + * |
2655 | + * For isochronous and interrupt endpoints, we set it to the max |
2656 | + * available, until we have new API in the USB core to allow drivers to |
2657 | + * declare how much bandwidth they actually need. |
2658 | + * |
2659 | + * Normally, it would be calculated by taking the total of the buffer |
2660 | + * lengths in the TD and then dividing by the number of TRBs in a TD, |
2661 | + * including link TRBs, No-op TRBs, and Event data TRBs. Since we don't |
2662 | + * use Event Data TRBs, and we don't chain in a link TRB on short |
2663 | + * transfers, we're basically dividing by 1. |
2664 | + */ |
2665 | + ep_ctx->tx_info |= AVG_TRB_LENGTH_FOR_EP(max_esit_payload); |
2666 | + |
2667 | /* FIXME Debug endpoint context */ |
2668 | return 0; |
2669 | } |
2670 | diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h |
2671 | index 8778135..9e904a6 100644 |
2672 | --- a/drivers/usb/host/xhci.h |
2673 | +++ b/drivers/usb/host/xhci.h |
2674 | @@ -609,6 +609,10 @@ struct xhci_ep_ctx { |
2675 | #define MAX_PACKET_MASK (0xffff << 16) |
2676 | #define MAX_PACKET_DECODED(p) (((p) >> 16) & 0xffff) |
2677 | |
2678 | +/* tx_info bitmasks */ |
2679 | +#define AVG_TRB_LENGTH_FOR_EP(p) ((p) & 0xffff) |
2680 | +#define MAX_ESIT_PAYLOAD_FOR_EP(p) (((p) & 0xffff) << 16) |
2681 | + |
2682 | |
2683 | /** |
2684 | * struct xhci_input_control_context |
2685 | diff --git a/drivers/usb/serial/sierra.c b/drivers/usb/serial/sierra.c |
2686 | index 0cfd621..a442989 100644 |
2687 | --- a/drivers/usb/serial/sierra.c |
2688 | +++ b/drivers/usb/serial/sierra.c |
2689 | @@ -229,6 +229,7 @@ static const struct sierra_iface_info direct_ip_interface_blacklist = { |
2690 | static struct usb_device_id id_table [] = { |
2691 | { USB_DEVICE(0x0F3D, 0x0112) }, /* Airprime/Sierra PC 5220 */ |
2692 | { USB_DEVICE(0x03F0, 0x1B1D) }, /* HP ev2200 a.k.a MC5720 */ |
2693 | + { USB_DEVICE(0x03F0, 0x211D) }, /* HP ev2210 a.k.a MC5725 */ |
2694 | { USB_DEVICE(0x03F0, 0x1E1D) }, /* HP hs2300 a.k.a MC8775 */ |
2695 | |
2696 | { USB_DEVICE(0x1199, 0x0017) }, /* Sierra Wireless EM5625 */ |
2697 | diff --git a/drivers/w1/slaves/w1_therm.c b/drivers/w1/slaves/w1_therm.c |
2698 | index 1ed3d55..17726a0 100644 |
2699 | --- a/drivers/w1/slaves/w1_therm.c |
2700 | +++ b/drivers/w1/slaves/w1_therm.c |
2701 | @@ -115,9 +115,8 @@ static struct w1_therm_family_converter w1_therm_families[] = { |
2702 | |
2703 | static inline int w1_DS18B20_convert_temp(u8 rom[9]) |
2704 | { |
2705 | - int t = ((s16)rom[1] << 8) | rom[0]; |
2706 | - t = t*1000/16; |
2707 | - return t; |
2708 | + s16 t = le16_to_cpup((__le16 *)rom); |
2709 | + return t*1000/16; |
2710 | } |
2711 | |
2712 | static inline int w1_DS18S20_convert_temp(u8 rom[9]) |
2713 | diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c |
2714 | index c568779..cae75c1 100644 |
2715 | --- a/fs/ext4/extents.c |
2716 | +++ b/fs/ext4/extents.c |
2717 | @@ -3767,7 +3767,6 @@ int ext4_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, |
2718 | __u64 start, __u64 len) |
2719 | { |
2720 | ext4_lblk_t start_blk; |
2721 | - ext4_lblk_t len_blks; |
2722 | int error = 0; |
2723 | |
2724 | /* fallback to generic here if not in extents fmt */ |
2725 | @@ -3781,8 +3780,14 @@ int ext4_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, |
2726 | if (fieinfo->fi_flags & FIEMAP_FLAG_XATTR) { |
2727 | error = ext4_xattr_fiemap(inode, fieinfo); |
2728 | } else { |
2729 | + ext4_lblk_t len_blks; |
2730 | + __u64 last_blk; |
2731 | + |
2732 | start_blk = start >> inode->i_sb->s_blocksize_bits; |
2733 | - len_blks = len >> inode->i_sb->s_blocksize_bits; |
2734 | + last_blk = (start + len - 1) >> inode->i_sb->s_blocksize_bits; |
2735 | + if (last_blk >= EXT_MAX_BLOCK) |
2736 | + last_blk = EXT_MAX_BLOCK-1; |
2737 | + len_blks = ((ext4_lblk_t) last_blk) - start_blk + 1; |
2738 | |
2739 | /* |
2740 | * Walk the extent tree gathering extent information. |
2741 | diff --git a/fs/jfs/resize.c b/fs/jfs/resize.c |
2742 | index 7f24a0b..1aba003 100644 |
2743 | --- a/fs/jfs/resize.c |
2744 | +++ b/fs/jfs/resize.c |
2745 | @@ -81,6 +81,7 @@ int jfs_extendfs(struct super_block *sb, s64 newLVSize, int newLogSize) |
2746 | struct inode *iplist[1]; |
2747 | struct jfs_superblock *j_sb, *j_sb2; |
2748 | uint old_agsize; |
2749 | + int agsizechanged = 0; |
2750 | struct buffer_head *bh, *bh2; |
2751 | |
2752 | /* If the volume hasn't grown, get out now */ |
2753 | @@ -333,6 +334,9 @@ int jfs_extendfs(struct super_block *sb, s64 newLVSize, int newLogSize) |
2754 | */ |
2755 | if ((rc = dbExtendFS(ipbmap, XAddress, nblocks))) |
2756 | goto error_out; |
2757 | + |
2758 | + agsizechanged |= (bmp->db_agsize != old_agsize); |
2759 | + |
2760 | /* |
2761 | * the map now has extended to cover additional nblocks: |
2762 | * dn_mapsize = oldMapsize + nblocks; |
2763 | @@ -432,7 +436,7 @@ int jfs_extendfs(struct super_block *sb, s64 newLVSize, int newLogSize) |
2764 | * will correctly identify the new ag); |
2765 | */ |
2766 | /* if new AG size the same as old AG size, done! */ |
2767 | - if (bmp->db_agsize != old_agsize) { |
2768 | + if (agsizechanged) { |
2769 | if ((rc = diExtendFS(ipimap, ipbmap))) |
2770 | goto error_out; |
2771 | |
2772 | diff --git a/fs/nfs/client.c b/fs/nfs/client.c |
2773 | index bd39abc..37d555c 100644 |
2774 | --- a/fs/nfs/client.c |
2775 | +++ b/fs/nfs/client.c |
2776 | @@ -965,6 +965,8 @@ out_error: |
2777 | static void nfs_server_copy_userdata(struct nfs_server *target, struct nfs_server *source) |
2778 | { |
2779 | target->flags = source->flags; |
2780 | + target->rsize = source->rsize; |
2781 | + target->wsize = source->wsize; |
2782 | target->acregmin = source->acregmin; |
2783 | target->acregmax = source->acregmax; |
2784 | target->acdirmin = source->acdirmin; |
2785 | diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c |
2786 | index af6948d..b5d55d3 100644 |
2787 | --- a/fs/nfs/dir.c |
2788 | +++ b/fs/nfs/dir.c |
2789 | @@ -837,6 +837,8 @@ out_zap_parent: |
2790 | /* If we have submounts, don't unhash ! */ |
2791 | if (have_submounts(dentry)) |
2792 | goto out_valid; |
2793 | + if (dentry->d_flags & DCACHE_DISCONNECTED) |
2794 | + goto out_valid; |
2795 | shrink_dcache_parent(dentry); |
2796 | } |
2797 | d_drop(dentry); |
2798 | diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c |
2799 | index bbf72d8..718f3fb 100644 |
2800 | --- a/fs/nfsd/nfs4xdr.c |
2801 | +++ b/fs/nfsd/nfs4xdr.c |
2802 | @@ -160,10 +160,10 @@ static __be32 *read_buf(struct nfsd4_compoundargs *argp, u32 nbytes) |
2803 | argp->p = page_address(argp->pagelist[0]); |
2804 | argp->pagelist++; |
2805 | if (argp->pagelen < PAGE_SIZE) { |
2806 | - argp->end = p + (argp->pagelen>>2); |
2807 | + argp->end = argp->p + (argp->pagelen>>2); |
2808 | argp->pagelen = 0; |
2809 | } else { |
2810 | - argp->end = p + (PAGE_SIZE>>2); |
2811 | + argp->end = argp->p + (PAGE_SIZE>>2); |
2812 | argp->pagelen -= PAGE_SIZE; |
2813 | } |
2814 | memcpy(((char*)p)+avail, argp->p, (nbytes - avail)); |
2815 | @@ -1425,10 +1425,10 @@ nfsd4_decode_compound(struct nfsd4_compoundargs *argp) |
2816 | argp->p = page_address(argp->pagelist[0]); |
2817 | argp->pagelist++; |
2818 | if (argp->pagelen < PAGE_SIZE) { |
2819 | - argp->end = p + (argp->pagelen>>2); |
2820 | + argp->end = argp->p + (argp->pagelen>>2); |
2821 | argp->pagelen = 0; |
2822 | } else { |
2823 | - argp->end = p + (PAGE_SIZE>>2); |
2824 | + argp->end = argp->p + (PAGE_SIZE>>2); |
2825 | argp->pagelen -= PAGE_SIZE; |
2826 | } |
2827 | } |
2828 | diff --git a/fs/ocfs2/buffer_head_io.c b/fs/ocfs2/buffer_head_io.c |
2829 | index 21c808f..b18c6d6 100644 |
2830 | --- a/fs/ocfs2/buffer_head_io.c |
2831 | +++ b/fs/ocfs2/buffer_head_io.c |
2832 | @@ -407,6 +407,7 @@ int ocfs2_write_super_or_backup(struct ocfs2_super *osb, |
2833 | struct buffer_head *bh) |
2834 | { |
2835 | int ret = 0; |
2836 | + struct ocfs2_dinode *di = (struct ocfs2_dinode *)bh->b_data; |
2837 | |
2838 | mlog_entry_void(); |
2839 | |
2840 | @@ -426,6 +427,7 @@ int ocfs2_write_super_or_backup(struct ocfs2_super *osb, |
2841 | |
2842 | get_bh(bh); /* for end_buffer_write_sync() */ |
2843 | bh->b_end_io = end_buffer_write_sync; |
2844 | + ocfs2_compute_meta_ecc(osb->sb, bh->b_data, &di->i_check); |
2845 | submit_bh(WRITE, bh); |
2846 | |
2847 | wait_on_buffer(bh); |
2848 | diff --git a/fs/ocfs2/dlm/dlmfs.c b/fs/ocfs2/dlm/dlmfs.c |
2849 | index 02bf178..18bc101 100644 |
2850 | --- a/fs/ocfs2/dlm/dlmfs.c |
2851 | +++ b/fs/ocfs2/dlm/dlmfs.c |
2852 | @@ -205,7 +205,7 @@ static ssize_t dlmfs_file_read(struct file *filp, |
2853 | if ((count + *ppos) > i_size_read(inode)) |
2854 | readlen = i_size_read(inode) - *ppos; |
2855 | else |
2856 | - readlen = count - *ppos; |
2857 | + readlen = count; |
2858 | |
2859 | lvb_buf = kmalloc(readlen, GFP_NOFS); |
2860 | if (!lvb_buf) |
2861 | diff --git a/fs/ocfs2/inode.c b/fs/ocfs2/inode.c |
2862 | index 88459bd..ec4d97f 100644 |
2863 | --- a/fs/ocfs2/inode.c |
2864 | +++ b/fs/ocfs2/inode.c |
2865 | @@ -559,6 +559,7 @@ static int ocfs2_truncate_for_delete(struct ocfs2_super *osb, |
2866 | handle = ocfs2_start_trans(osb, OCFS2_INODE_UPDATE_CREDITS); |
2867 | if (IS_ERR(handle)) { |
2868 | status = PTR_ERR(handle); |
2869 | + handle = NULL; |
2870 | mlog_errno(status); |
2871 | goto out; |
2872 | } |
2873 | diff --git a/fs/ocfs2/refcounttree.c b/fs/ocfs2/refcounttree.c |
2874 | index 8ae65c9..a8e8572 100644 |
2875 | --- a/fs/ocfs2/refcounttree.c |
2876 | +++ b/fs/ocfs2/refcounttree.c |
2877 | @@ -4083,6 +4083,9 @@ static int ocfs2_complete_reflink(struct inode *s_inode, |
2878 | di->i_attr = s_di->i_attr; |
2879 | |
2880 | if (preserve) { |
2881 | + t_inode->i_uid = s_inode->i_uid; |
2882 | + t_inode->i_gid = s_inode->i_gid; |
2883 | + t_inode->i_mode = s_inode->i_mode; |
2884 | di->i_uid = s_di->i_uid; |
2885 | di->i_gid = s_di->i_gid; |
2886 | di->i_mode = s_di->i_mode; |
2887 | diff --git a/fs/proc/base.c b/fs/proc/base.c |
2888 | index 3cd449d..8dce96c 100644 |
2889 | --- a/fs/proc/base.c |
2890 | +++ b/fs/proc/base.c |
2891 | @@ -2910,7 +2910,7 @@ out_no_task: |
2892 | */ |
2893 | static const struct pid_entry tid_base_stuff[] = { |
2894 | DIR("fd", S_IRUSR|S_IXUSR, proc_fd_inode_operations, proc_fd_operations), |
2895 | - DIR("fdinfo", S_IRUSR|S_IXUSR, proc_fdinfo_inode_operations, proc_fd_operations), |
2896 | + DIR("fdinfo", S_IRUSR|S_IXUSR, proc_fdinfo_inode_operations, proc_fdinfo_operations), |
2897 | REG("environ", S_IRUSR, proc_environ_operations), |
2898 | INF("auxv", S_IRUSR, proc_pid_auxv), |
2899 | ONE("status", S_IRUGO, proc_pid_status), |
2900 | diff --git a/fs/reiserfs/dir.c b/fs/reiserfs/dir.c |
2901 | index c094f58..1e686ee 100644 |
2902 | --- a/fs/reiserfs/dir.c |
2903 | +++ b/fs/reiserfs/dir.c |
2904 | @@ -45,8 +45,6 @@ static inline bool is_privroot_deh(struct dentry *dir, |
2905 | struct reiserfs_de_head *deh) |
2906 | { |
2907 | struct dentry *privroot = REISERFS_SB(dir->d_sb)->priv_root; |
2908 | - if (reiserfs_expose_privroot(dir->d_sb)) |
2909 | - return 0; |
2910 | return (dir == dir->d_parent && privroot->d_inode && |
2911 | deh->deh_objectid == INODE_PKEY(privroot->d_inode)->k_objectid); |
2912 | } |
2913 | diff --git a/fs/reiserfs/xattr.c b/fs/reiserfs/xattr.c |
2914 | index 81f09fa..0392e82 100644 |
2915 | --- a/fs/reiserfs/xattr.c |
2916 | +++ b/fs/reiserfs/xattr.c |
2917 | @@ -557,7 +557,7 @@ reiserfs_xattr_set_handle(struct reiserfs_transaction_handle *th, |
2918 | if (!err && new_size < i_size_read(dentry->d_inode)) { |
2919 | struct iattr newattrs = { |
2920 | .ia_ctime = current_fs_time(inode->i_sb), |
2921 | - .ia_size = buffer_size, |
2922 | + .ia_size = new_size, |
2923 | .ia_valid = ATTR_SIZE | ATTR_CTIME, |
2924 | }; |
2925 | |
2926 | @@ -976,21 +976,13 @@ int reiserfs_permission(struct inode *inode, int mask) |
2927 | return generic_permission(inode, mask, NULL); |
2928 | } |
2929 | |
2930 | -/* This will catch lookups from the fs root to .reiserfs_priv */ |
2931 | -static int |
2932 | -xattr_lookup_poison(struct dentry *dentry, struct qstr *q1, struct qstr *name) |
2933 | +static int xattr_hide_revalidate(struct dentry *dentry, struct nameidata *nd) |
2934 | { |
2935 | - struct dentry *priv_root = REISERFS_SB(dentry->d_sb)->priv_root; |
2936 | - if (container_of(q1, struct dentry, d_name) == priv_root) |
2937 | - return -ENOENT; |
2938 | - if (q1->len == name->len && |
2939 | - !memcmp(q1->name, name->name, name->len)) |
2940 | - return 0; |
2941 | - return 1; |
2942 | + return -EPERM; |
2943 | } |
2944 | |
2945 | static const struct dentry_operations xattr_lookup_poison_ops = { |
2946 | - .d_compare = xattr_lookup_poison, |
2947 | + .d_revalidate = xattr_hide_revalidate, |
2948 | }; |
2949 | |
2950 | int reiserfs_lookup_privroot(struct super_block *s) |
2951 | @@ -1004,8 +996,7 @@ int reiserfs_lookup_privroot(struct super_block *s) |
2952 | strlen(PRIVROOT_NAME)); |
2953 | if (!IS_ERR(dentry)) { |
2954 | REISERFS_SB(s)->priv_root = dentry; |
2955 | - if (!reiserfs_expose_privroot(s)) |
2956 | - s->s_root->d_op = &xattr_lookup_poison_ops; |
2957 | + dentry->d_op = &xattr_lookup_poison_ops; |
2958 | if (dentry->d_inode) |
2959 | dentry->d_inode->i_flags |= S_PRIVATE; |
2960 | } else |
2961 | diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c |
2962 | index 77414db..146d491 100644 |
2963 | --- a/fs/xfs/linux-2.6/xfs_super.c |
2964 | +++ b/fs/xfs/linux-2.6/xfs_super.c |
2965 | @@ -1160,6 +1160,7 @@ xfs_fs_put_super( |
2966 | |
2967 | xfs_unmountfs(mp); |
2968 | xfs_freesb(mp); |
2969 | + xfs_inode_shrinker_unregister(mp); |
2970 | xfs_icsb_destroy_counters(mp); |
2971 | xfs_close_devices(mp); |
2972 | xfs_dmops_put(mp); |
2973 | @@ -1523,6 +1524,8 @@ xfs_fs_fill_super( |
2974 | if (error) |
2975 | goto fail_vnrele; |
2976 | |
2977 | + xfs_inode_shrinker_register(mp); |
2978 | + |
2979 | kfree(mtpt); |
2980 | return 0; |
2981 | |
2982 | @@ -1767,6 +1770,7 @@ init_xfs_fs(void) |
2983 | goto out_cleanup_procfs; |
2984 | |
2985 | vfs_initquota(); |
2986 | + xfs_inode_shrinker_init(); |
2987 | |
2988 | error = register_filesystem(&xfs_fs_type); |
2989 | if (error) |
2990 | @@ -1794,6 +1798,7 @@ exit_xfs_fs(void) |
2991 | { |
2992 | vfs_exitquota(); |
2993 | unregister_filesystem(&xfs_fs_type); |
2994 | + xfs_inode_shrinker_destroy(); |
2995 | xfs_sysctl_unregister(); |
2996 | xfs_cleanup_procfs(); |
2997 | xfs_buf_terminate(); |
2998 | diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c |
2999 | index 6b6b394..57adf2d 100644 |
3000 | --- a/fs/xfs/linux-2.6/xfs_sync.c |
3001 | +++ b/fs/xfs/linux-2.6/xfs_sync.c |
3002 | @@ -95,7 +95,8 @@ xfs_inode_ag_walk( |
3003 | struct xfs_perag *pag, int flags), |
3004 | int flags, |
3005 | int tag, |
3006 | - int exclusive) |
3007 | + int exclusive, |
3008 | + int *nr_to_scan) |
3009 | { |
3010 | struct xfs_perag *pag = &mp->m_perag[ag]; |
3011 | uint32_t first_index; |
3012 | @@ -135,7 +136,7 @@ restart: |
3013 | if (error == EFSCORRUPTED) |
3014 | break; |
3015 | |
3016 | - } while (1); |
3017 | + } while ((*nr_to_scan)--); |
3018 | |
3019 | if (skipped) { |
3020 | delay(1); |
3021 | @@ -153,23 +154,30 @@ xfs_inode_ag_iterator( |
3022 | struct xfs_perag *pag, int flags), |
3023 | int flags, |
3024 | int tag, |
3025 | - int exclusive) |
3026 | + int exclusive, |
3027 | + int *nr_to_scan) |
3028 | { |
3029 | int error = 0; |
3030 | int last_error = 0; |
3031 | xfs_agnumber_t ag; |
3032 | + int nr; |
3033 | |
3034 | + nr = nr_to_scan ? *nr_to_scan : INT_MAX; |
3035 | for (ag = 0; ag < mp->m_sb.sb_agcount; ag++) { |
3036 | if (!mp->m_perag[ag].pag_ici_init) |
3037 | continue; |
3038 | error = xfs_inode_ag_walk(mp, ag, execute, flags, tag, |
3039 | - exclusive); |
3040 | + exclusive, &nr); |
3041 | if (error) { |
3042 | last_error = error; |
3043 | if (error == EFSCORRUPTED) |
3044 | break; |
3045 | } |
3046 | + if (nr <= 0) |
3047 | + break; |
3048 | } |
3049 | + if (nr_to_scan) |
3050 | + *nr_to_scan = nr; |
3051 | return XFS_ERROR(last_error); |
3052 | } |
3053 | |
3054 | @@ -289,7 +297,7 @@ xfs_sync_data( |
3055 | ASSERT((flags & ~(SYNC_TRYLOCK|SYNC_WAIT)) == 0); |
3056 | |
3057 | error = xfs_inode_ag_iterator(mp, xfs_sync_inode_data, flags, |
3058 | - XFS_ICI_NO_TAG, 0); |
3059 | + XFS_ICI_NO_TAG, 0, NULL); |
3060 | if (error) |
3061 | return XFS_ERROR(error); |
3062 | |
3063 | @@ -311,7 +319,7 @@ xfs_sync_attr( |
3064 | ASSERT((flags & ~SYNC_WAIT) == 0); |
3065 | |
3066 | return xfs_inode_ag_iterator(mp, xfs_sync_inode_attr, flags, |
3067 | - XFS_ICI_NO_TAG, 0); |
3068 | + XFS_ICI_NO_TAG, 0, NULL); |
3069 | } |
3070 | |
3071 | STATIC int |
3072 | @@ -679,6 +687,7 @@ __xfs_inode_set_reclaim_tag( |
3073 | radix_tree_tag_set(&pag->pag_ici_root, |
3074 | XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino), |
3075 | XFS_ICI_RECLAIM_TAG); |
3076 | + pag->pag_ici_reclaimable++; |
3077 | } |
3078 | |
3079 | /* |
3080 | @@ -710,6 +719,7 @@ __xfs_inode_clear_reclaim_tag( |
3081 | { |
3082 | radix_tree_tag_clear(&pag->pag_ici_root, |
3083 | XFS_INO_TO_AGINO(mp, ip->i_ino), XFS_ICI_RECLAIM_TAG); |
3084 | + pag->pag_ici_reclaimable--; |
3085 | } |
3086 | |
3087 | STATIC int |
3088 | @@ -770,5 +780,88 @@ xfs_reclaim_inodes( |
3089 | int mode) |
3090 | { |
3091 | return xfs_inode_ag_iterator(mp, xfs_reclaim_inode, mode, |
3092 | - XFS_ICI_RECLAIM_TAG, 1); |
3093 | + XFS_ICI_RECLAIM_TAG, 1, NULL); |
3094 | +} |
3095 | + |
3096 | +/* |
3097 | + * Shrinker infrastructure. |
3098 | + * |
3099 | + * This is all far more complex than it needs to be. It adds a global list of |
3100 | + * mounts because the shrinkers can only call a global context. We need to make |
3101 | + * the shrinkers pass a context to avoid the need for global state. |
3102 | + */ |
3103 | +static LIST_HEAD(xfs_mount_list); |
3104 | +static struct rw_semaphore xfs_mount_list_lock; |
3105 | + |
3106 | +static int |
3107 | +xfs_reclaim_inode_shrink( |
3108 | + int nr_to_scan, |
3109 | + gfp_t gfp_mask) |
3110 | +{ |
3111 | + struct xfs_mount *mp; |
3112 | + xfs_agnumber_t ag; |
3113 | + int reclaimable = 0; |
3114 | + |
3115 | + if (nr_to_scan) { |
3116 | + if (!(gfp_mask & __GFP_FS)) |
3117 | + return -1; |
3118 | + |
3119 | + down_read(&xfs_mount_list_lock); |
3120 | + list_for_each_entry(mp, &xfs_mount_list, m_mplist) { |
3121 | + xfs_inode_ag_iterator(mp, xfs_reclaim_inode, 0, |
3122 | + XFS_ICI_RECLAIM_TAG, 1, &nr_to_scan); |
3123 | + if (nr_to_scan <= 0) |
3124 | + break; |
3125 | + } |
3126 | + up_read(&xfs_mount_list_lock); |
3127 | + } |
3128 | + |
3129 | + down_read(&xfs_mount_list_lock); |
3130 | + list_for_each_entry(mp, &xfs_mount_list, m_mplist) { |
3131 | + for (ag = 0; ag < mp->m_sb.sb_agcount; ag++) { |
3132 | + |
3133 | + if (!mp->m_perag[ag].pag_ici_init) |
3134 | + continue; |
3135 | + reclaimable += mp->m_perag[ag].pag_ici_reclaimable; |
3136 | + } |
3137 | + } |
3138 | + up_read(&xfs_mount_list_lock); |
3139 | + return reclaimable; |
3140 | +} |
3141 | + |
3142 | +static struct shrinker xfs_inode_shrinker = { |
3143 | + .shrink = xfs_reclaim_inode_shrink, |
3144 | + .seeks = DEFAULT_SEEKS, |
3145 | +}; |
3146 | + |
3147 | +void __init |
3148 | +xfs_inode_shrinker_init(void) |
3149 | +{ |
3150 | + init_rwsem(&xfs_mount_list_lock); |
3151 | + register_shrinker(&xfs_inode_shrinker); |
3152 | +} |
3153 | + |
3154 | +void |
3155 | +xfs_inode_shrinker_destroy(void) |
3156 | +{ |
3157 | + ASSERT(list_empty(&xfs_mount_list)); |
3158 | + unregister_shrinker(&xfs_inode_shrinker); |
3159 | +} |
3160 | + |
3161 | +void |
3162 | +xfs_inode_shrinker_register( |
3163 | + struct xfs_mount *mp) |
3164 | +{ |
3165 | + down_write(&xfs_mount_list_lock); |
3166 | + list_add_tail(&mp->m_mplist, &xfs_mount_list); |
3167 | + up_write(&xfs_mount_list_lock); |
3168 | +} |
3169 | + |
3170 | +void |
3171 | +xfs_inode_shrinker_unregister( |
3172 | + struct xfs_mount *mp) |
3173 | +{ |
3174 | + down_write(&xfs_mount_list_lock); |
3175 | + list_del(&mp->m_mplist); |
3176 | + up_write(&xfs_mount_list_lock); |
3177 | } |
3178 | diff --git a/fs/xfs/linux-2.6/xfs_sync.h b/fs/xfs/linux-2.6/xfs_sync.h |
3179 | index ea932b4..0b28c13 100644 |
3180 | --- a/fs/xfs/linux-2.6/xfs_sync.h |
3181 | +++ b/fs/xfs/linux-2.6/xfs_sync.h |
3182 | @@ -54,6 +54,11 @@ void __xfs_inode_clear_reclaim_tag(struct xfs_mount *mp, struct xfs_perag *pag, |
3183 | int xfs_sync_inode_valid(struct xfs_inode *ip, struct xfs_perag *pag); |
3184 | int xfs_inode_ag_iterator(struct xfs_mount *mp, |
3185 | int (*execute)(struct xfs_inode *ip, struct xfs_perag *pag, int flags), |
3186 | - int flags, int tag, int write_lock); |
3187 | + int flags, int tag, int write_lock, int *nr_to_scan); |
3188 | + |
3189 | +void xfs_inode_shrinker_init(void); |
3190 | +void xfs_inode_shrinker_destroy(void); |
3191 | +void xfs_inode_shrinker_register(struct xfs_mount *mp); |
3192 | +void xfs_inode_shrinker_unregister(struct xfs_mount *mp); |
3193 | |
3194 | #endif |
3195 | diff --git a/fs/xfs/quota/xfs_qm_syscalls.c b/fs/xfs/quota/xfs_qm_syscalls.c |
3196 | index 873e07e..145f596 100644 |
3197 | --- a/fs/xfs/quota/xfs_qm_syscalls.c |
3198 | +++ b/fs/xfs/quota/xfs_qm_syscalls.c |
3199 | @@ -891,7 +891,8 @@ xfs_qm_dqrele_all_inodes( |
3200 | uint flags) |
3201 | { |
3202 | ASSERT(mp->m_quotainfo); |
3203 | - xfs_inode_ag_iterator(mp, xfs_dqrele_inode, flags, XFS_ICI_NO_TAG, 0); |
3204 | + xfs_inode_ag_iterator(mp, xfs_dqrele_inode, flags, |
3205 | + XFS_ICI_NO_TAG, 0, NULL); |
3206 | } |
3207 | |
3208 | /*------------------------------------------------------------------------*/ |
3209 | diff --git a/fs/xfs/xfs_ag.h b/fs/xfs/xfs_ag.h |
3210 | index 6702bd8..1182604 100644 |
3211 | --- a/fs/xfs/xfs_ag.h |
3212 | +++ b/fs/xfs/xfs_ag.h |
3213 | @@ -229,6 +229,7 @@ typedef struct xfs_perag |
3214 | int pag_ici_init; /* incore inode cache initialised */ |
3215 | rwlock_t pag_ici_lock; /* incore inode lock */ |
3216 | struct radix_tree_root pag_ici_root; /* incore inode cache root */ |
3217 | + int pag_ici_reclaimable; /* reclaimable inodes */ |
3218 | #endif |
3219 | } xfs_perag_t; |
3220 | |
3221 | diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h |
3222 | index 1df7e45..c95f81a 100644 |
3223 | --- a/fs/xfs/xfs_mount.h |
3224 | +++ b/fs/xfs/xfs_mount.h |
3225 | @@ -257,6 +257,7 @@ typedef struct xfs_mount { |
3226 | wait_queue_head_t m_wait_single_sync_task; |
3227 | __int64_t m_update_flags; /* sb flags we need to update |
3228 | on the next remount,rw */ |
3229 | + struct list_head m_mplist; /* inode shrinker mount list */ |
3230 | } xfs_mount_t; |
3231 | |
3232 | /* |
3233 | diff --git a/include/linux/ata.h b/include/linux/ata.h |
3234 | index 20f3156..f8bd0f9 100644 |
3235 | --- a/include/linux/ata.h |
3236 | +++ b/include/linux/ata.h |
3237 | @@ -1024,8 +1024,8 @@ static inline int ata_ok(u8 status) |
3238 | |
3239 | static inline int lba_28_ok(u64 block, u32 n_block) |
3240 | { |
3241 | - /* check the ending block number */ |
3242 | - return ((block + n_block) < ((u64)1 << 28)) && (n_block <= 256); |
3243 | + /* check the ending block number: must be LESS THAN 0x0fffffff */ |
3244 | + return ((block + n_block) < ((1 << 28) - 1)) && (n_block <= 256); |
3245 | } |
3246 | |
3247 | static inline int lba_48_ok(u64 block, u32 n_block) |
3248 | diff --git a/include/linux/poison.h b/include/linux/poison.h |
3249 | index 2110a81..34066ff 100644 |
3250 | --- a/include/linux/poison.h |
3251 | +++ b/include/linux/poison.h |
3252 | @@ -48,6 +48,15 @@ |
3253 | #define POISON_FREE 0x6b /* for use-after-free poisoning */ |
3254 | #define POISON_END 0xa5 /* end-byte of poisoning */ |
3255 | |
3256 | +/********** mm/hugetlb.c **********/ |
3257 | +/* |
3258 | + * Private mappings of hugetlb pages use this poisoned value for |
3259 | + * page->mapping. The core VM should not be doing anything with this mapping |
3260 | + * but futex requires the existence of some page->mapping value even though it |
3261 | + * is unused if PAGE_MAPPING_ANON is set. |
3262 | + */ |
3263 | +#define HUGETLB_POISON ((void *)(0x00300300 + POISON_POINTER_DELTA + PAGE_MAPPING_ANON)) |
3264 | + |
3265 | /********** arch/$ARCH/mm/init.c **********/ |
3266 | #define POISON_FREE_INITMEM 0xcc |
3267 | |
3268 | diff --git a/include/net/sctp/command.h b/include/net/sctp/command.h |
3269 | index 8be5135..2c55a7e 100644 |
3270 | --- a/include/net/sctp/command.h |
3271 | +++ b/include/net/sctp/command.h |
3272 | @@ -107,6 +107,7 @@ typedef enum { |
3273 | SCTP_CMD_T1_RETRAN, /* Mark for retransmission after T1 timeout */ |
3274 | SCTP_CMD_UPDATE_INITTAG, /* Update peer inittag */ |
3275 | SCTP_CMD_SEND_MSG, /* Send the whole use message */ |
3276 | + SCTP_CMD_SEND_NEXT_ASCONF, /* Send the next ASCONF after ACK */ |
3277 | SCTP_CMD_LAST |
3278 | } sctp_verb_t; |
3279 | |
3280 | diff --git a/include/net/sctp/sctp.h b/include/net/sctp/sctp.h |
3281 | index 78740ec..fa6cde5 100644 |
3282 | --- a/include/net/sctp/sctp.h |
3283 | +++ b/include/net/sctp/sctp.h |
3284 | @@ -128,6 +128,7 @@ extern int sctp_register_pf(struct sctp_pf *, sa_family_t); |
3285 | int sctp_backlog_rcv(struct sock *sk, struct sk_buff *skb); |
3286 | int sctp_inet_listen(struct socket *sock, int backlog); |
3287 | void sctp_write_space(struct sock *sk); |
3288 | +void sctp_data_ready(struct sock *sk, int len); |
3289 | unsigned int sctp_poll(struct file *file, struct socket *sock, |
3290 | poll_table *wait); |
3291 | void sctp_sock_rfree(struct sk_buff *skb); |
3292 | diff --git a/init/initramfs.c b/init/initramfs.c |
3293 | index b37d34b..b27d045 100644 |
3294 | --- a/init/initramfs.c |
3295 | +++ b/init/initramfs.c |
3296 | @@ -457,7 +457,8 @@ static char * __init unpack_to_rootfs(char *buf, unsigned len) |
3297 | compress_name); |
3298 | message = msg_buf; |
3299 | } |
3300 | - } |
3301 | + } else |
3302 | + error("junk in compressed archive"); |
3303 | if (state != Reset) |
3304 | error("junk in compressed archive"); |
3305 | this_header = saved_offset + my_inptr; |
3306 | diff --git a/kernel/cred.c b/kernel/cred.c |
3307 | index 1ed8ca1..099f5e6 100644 |
3308 | --- a/kernel/cred.c |
3309 | +++ b/kernel/cred.c |
3310 | @@ -786,8 +786,6 @@ bool creds_are_invalid(const struct cred *cred) |
3311 | { |
3312 | if (cred->magic != CRED_MAGIC) |
3313 | return true; |
3314 | - if (atomic_read(&cred->usage) < atomic_read(&cred->subscribers)) |
3315 | - return true; |
3316 | #ifdef CONFIG_SECURITY_SELINUX |
3317 | if (selinux_is_enabled()) { |
3318 | if ((unsigned long) cred->security < PAGE_SIZE) |
3319 | diff --git a/kernel/perf_event.c b/kernel/perf_event.c |
3320 | index 32d0ae2..e928e1a 100644 |
3321 | --- a/kernel/perf_event.c |
3322 | +++ b/kernel/perf_event.c |
3323 | @@ -4811,7 +4811,7 @@ err_fput_free_put_context: |
3324 | |
3325 | err_free_put_context: |
3326 | if (err < 0) |
3327 | - kfree(event); |
3328 | + free_event(event); |
3329 | |
3330 | err_put_context: |
3331 | if (err < 0) |
3332 | diff --git a/lib/flex_array.c b/lib/flex_array.c |
3333 | index 66eef2e..41b1804 100644 |
3334 | --- a/lib/flex_array.c |
3335 | +++ b/lib/flex_array.c |
3336 | @@ -99,7 +99,7 @@ struct flex_array *flex_array_alloc(int element_size, unsigned int total, |
3337 | ret->element_size = element_size; |
3338 | ret->total_nr_elements = total; |
3339 | if (elements_fit_in_base(ret) && !(flags & __GFP_ZERO)) |
3340 | - memset(ret->parts[0], FLEX_ARRAY_FREE, |
3341 | + memset(&ret->parts[0], FLEX_ARRAY_FREE, |
3342 | FLEX_ARRAY_BASE_BYTES_LEFT); |
3343 | return ret; |
3344 | } |
3345 | diff --git a/mm/hugetlb.c b/mm/hugetlb.c |
3346 | index 2d16fa6..fd9ba95 100644 |
3347 | --- a/mm/hugetlb.c |
3348 | +++ b/mm/hugetlb.c |
3349 | @@ -546,6 +546,7 @@ static void free_huge_page(struct page *page) |
3350 | |
3351 | mapping = (struct address_space *) page_private(page); |
3352 | set_page_private(page, 0); |
3353 | + page->mapping = NULL; |
3354 | BUG_ON(page_count(page)); |
3355 | INIT_LIST_HEAD(&page->lru); |
3356 | |
3357 | @@ -2447,8 +2448,10 @@ retry: |
3358 | spin_lock(&inode->i_lock); |
3359 | inode->i_blocks += blocks_per_huge_page(h); |
3360 | spin_unlock(&inode->i_lock); |
3361 | - } else |
3362 | + } else { |
3363 | lock_page(page); |
3364 | + page->mapping = HUGETLB_POISON; |
3365 | + } |
3366 | } |
3367 | |
3368 | /* |
3369 | diff --git a/mm/memcontrol.c b/mm/memcontrol.c |
3370 | index 954032b..dff3379 100644 |
3371 | --- a/mm/memcontrol.c |
3372 | +++ b/mm/memcontrol.c |
3373 | @@ -2215,12 +2215,12 @@ int mem_cgroup_prepare_migration(struct page *page, struct mem_cgroup **ptr) |
3374 | } |
3375 | unlock_page_cgroup(pc); |
3376 | |
3377 | + *ptr = mem; |
3378 | if (mem) { |
3379 | - ret = __mem_cgroup_try_charge(NULL, GFP_KERNEL, &mem, false, |
3380 | + ret = __mem_cgroup_try_charge(NULL, GFP_KERNEL, ptr, false, |
3381 | page); |
3382 | css_put(&mem->css); |
3383 | } |
3384 | - *ptr = mem; |
3385 | return ret; |
3386 | } |
3387 | |
3388 | diff --git a/net/ieee802154/af_ieee802154.c b/net/ieee802154/af_ieee802154.c |
3389 | index bad1c49..72340dd 100644 |
3390 | --- a/net/ieee802154/af_ieee802154.c |
3391 | +++ b/net/ieee802154/af_ieee802154.c |
3392 | @@ -147,6 +147,9 @@ static int ieee802154_dev_ioctl(struct sock *sk, struct ifreq __user *arg, |
3393 | dev_load(sock_net(sk), ifr.ifr_name); |
3394 | dev = dev_get_by_name(sock_net(sk), ifr.ifr_name); |
3395 | |
3396 | + if (!dev) |
3397 | + return -ENODEV; |
3398 | + |
3399 | if (dev->type == ARPHRD_IEEE802154 && dev->netdev_ops->ndo_do_ioctl) |
3400 | ret = dev->netdev_ops->ndo_do_ioctl(dev, &ifr, cmd); |
3401 | |
3402 | diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c |
3403 | index 564a0f8..03c55ac 100644 |
3404 | --- a/net/ipv4/tcp.c |
3405 | +++ b/net/ipv4/tcp.c |
3406 | @@ -1368,6 +1368,7 @@ int tcp_read_sock(struct sock *sk, read_descriptor_t *desc, |
3407 | sk_eat_skb(sk, skb, 0); |
3408 | if (!desc->count) |
3409 | break; |
3410 | + tp->copied_seq = seq; |
3411 | } |
3412 | tp->copied_seq = seq; |
3413 | |
3414 | diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c |
3415 | index 112c611..16190ca 100644 |
3416 | --- a/net/ipv4/udp.c |
3417 | +++ b/net/ipv4/udp.c |
3418 | @@ -471,8 +471,8 @@ static struct sock *__udp4_lib_lookup(struct net *net, __be32 saddr, |
3419 | if (hslot->count < hslot2->count) |
3420 | goto begin; |
3421 | |
3422 | - result = udp4_lib_lookup2(net, INADDR_ANY, sport, |
3423 | - daddr, hnum, dif, |
3424 | + result = udp4_lib_lookup2(net, saddr, sport, |
3425 | + INADDR_ANY, hnum, dif, |
3426 | hslot2, slot2); |
3427 | } |
3428 | rcu_read_unlock(); |
3429 | diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c |
3430 | index 548a06e..d2ef3a3 100644 |
3431 | --- a/net/ipv6/tcp_ipv6.c |
3432 | +++ b/net/ipv6/tcp_ipv6.c |
3433 | @@ -1006,7 +1006,7 @@ static void tcp_v6_send_response(struct sk_buff *skb, u32 seq, u32 ack, u32 win, |
3434 | skb_reserve(buff, MAX_HEADER + sizeof(struct ipv6hdr) + tot_len); |
3435 | |
3436 | t1 = (struct tcphdr *) skb_push(buff, tot_len); |
3437 | - skb_reset_transport_header(skb); |
3438 | + skb_reset_transport_header(buff); |
3439 | |
3440 | /* Swap the send and the receive. */ |
3441 | memset(t1, 0, sizeof(*t1)); |
3442 | diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c |
3443 | index d9714d2..4f57cd2 100644 |
3444 | --- a/net/ipv6/udp.c |
3445 | +++ b/net/ipv6/udp.c |
3446 | @@ -258,8 +258,8 @@ static struct sock *__udp6_lib_lookup(struct net *net, |
3447 | if (hslot->count < hslot2->count) |
3448 | goto begin; |
3449 | |
3450 | - result = udp6_lib_lookup2(net, &in6addr_any, sport, |
3451 | - daddr, hnum, dif, |
3452 | + result = udp6_lib_lookup2(net, saddr, sport, |
3453 | + &in6addr_any, hnum, dif, |
3454 | hslot2, slot2); |
3455 | } |
3456 | rcu_read_unlock(); |
3457 | diff --git a/net/mac80211/agg-tx.c b/net/mac80211/agg-tx.c |
3458 | index 304b0b6..dfdc138 100644 |
3459 | --- a/net/mac80211/agg-tx.c |
3460 | +++ b/net/mac80211/agg-tx.c |
3461 | @@ -183,7 +183,6 @@ static void sta_addba_resp_timer_expired(unsigned long data) |
3462 | HT_AGG_STATE_REQ_STOP_BA_MSK)) != |
3463 | HT_ADDBA_REQUESTED_MSK) { |
3464 | spin_unlock_bh(&sta->lock); |
3465 | - *state = HT_AGG_STATE_IDLE; |
3466 | #ifdef CONFIG_MAC80211_HT_DEBUG |
3467 | printk(KERN_DEBUG "timer expired on tid %d but we are not " |
3468 | "(or no longer) expecting addBA response there", |
3469 | diff --git a/net/sctp/associola.c b/net/sctp/associola.c |
3470 | index df5abbf..99c93ee 100644 |
3471 | --- a/net/sctp/associola.c |
3472 | +++ b/net/sctp/associola.c |
3473 | @@ -1194,8 +1194,10 @@ void sctp_assoc_update(struct sctp_association *asoc, |
3474 | /* Remove any peer addresses not present in the new association. */ |
3475 | list_for_each_safe(pos, temp, &asoc->peer.transport_addr_list) { |
3476 | trans = list_entry(pos, struct sctp_transport, transports); |
3477 | - if (!sctp_assoc_lookup_paddr(new, &trans->ipaddr)) |
3478 | - sctp_assoc_del_peer(asoc, &trans->ipaddr); |
3479 | + if (!sctp_assoc_lookup_paddr(new, &trans->ipaddr)) { |
3480 | + sctp_assoc_rm_peer(asoc, trans); |
3481 | + continue; |
3482 | + } |
3483 | |
3484 | if (asoc->state >= SCTP_STATE_ESTABLISHED) |
3485 | sctp_transport_reset(trans); |
3486 | diff --git a/net/sctp/endpointola.c b/net/sctp/endpointola.c |
3487 | index 905fda5..7ec09ba 100644 |
3488 | --- a/net/sctp/endpointola.c |
3489 | +++ b/net/sctp/endpointola.c |
3490 | @@ -144,6 +144,7 @@ static struct sctp_endpoint *sctp_endpoint_init(struct sctp_endpoint *ep, |
3491 | /* Use SCTP specific send buffer space queues. */ |
3492 | ep->sndbuf_policy = sctp_sndbuf_policy; |
3493 | |
3494 | + sk->sk_data_ready = sctp_data_ready; |
3495 | sk->sk_write_space = sctp_write_space; |
3496 | sock_set_flag(sk, SOCK_USE_WRITE_QUEUE); |
3497 | |
3498 | diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c |
3499 | index 9e73291..224db01 100644 |
3500 | --- a/net/sctp/sm_make_chunk.c |
3501 | +++ b/net/sctp/sm_make_chunk.c |
3502 | @@ -207,7 +207,8 @@ struct sctp_chunk *sctp_make_init(const struct sctp_association *asoc, |
3503 | sp = sctp_sk(asoc->base.sk); |
3504 | num_types = sp->pf->supported_addrs(sp, types); |
3505 | |
3506 | - chunksize = sizeof(init) + addrs_len + SCTP_SAT_LEN(num_types); |
3507 | + chunksize = sizeof(init) + addrs_len; |
3508 | + chunksize += WORD_ROUND(SCTP_SAT_LEN(num_types)); |
3509 | chunksize += sizeof(ecap_param); |
3510 | |
3511 | if (sctp_prsctp_enable) |
3512 | @@ -237,14 +238,14 @@ struct sctp_chunk *sctp_make_init(const struct sctp_association *asoc, |
3513 | /* Add HMACS parameter length if any were defined */ |
3514 | auth_hmacs = (sctp_paramhdr_t *)asoc->c.auth_hmacs; |
3515 | if (auth_hmacs->length) |
3516 | - chunksize += ntohs(auth_hmacs->length); |
3517 | + chunksize += WORD_ROUND(ntohs(auth_hmacs->length)); |
3518 | else |
3519 | auth_hmacs = NULL; |
3520 | |
3521 | /* Add CHUNKS parameter length */ |
3522 | auth_chunks = (sctp_paramhdr_t *)asoc->c.auth_chunks; |
3523 | if (auth_chunks->length) |
3524 | - chunksize += ntohs(auth_chunks->length); |
3525 | + chunksize += WORD_ROUND(ntohs(auth_chunks->length)); |
3526 | else |
3527 | auth_chunks = NULL; |
3528 | |
3529 | @@ -254,7 +255,8 @@ struct sctp_chunk *sctp_make_init(const struct sctp_association *asoc, |
3530 | |
3531 | /* If we have any extensions to report, account for that */ |
3532 | if (num_ext) |
3533 | - chunksize += sizeof(sctp_supported_ext_param_t) + num_ext; |
3534 | + chunksize += WORD_ROUND(sizeof(sctp_supported_ext_param_t) + |
3535 | + num_ext); |
3536 | |
3537 | /* RFC 2960 3.3.2 Initiation (INIT) (1) |
3538 | * |
3539 | @@ -396,13 +398,13 @@ struct sctp_chunk *sctp_make_init_ack(const struct sctp_association *asoc, |
3540 | |
3541 | auth_hmacs = (sctp_paramhdr_t *)asoc->c.auth_hmacs; |
3542 | if (auth_hmacs->length) |
3543 | - chunksize += ntohs(auth_hmacs->length); |
3544 | + chunksize += WORD_ROUND(ntohs(auth_hmacs->length)); |
3545 | else |
3546 | auth_hmacs = NULL; |
3547 | |
3548 | auth_chunks = (sctp_paramhdr_t *)asoc->c.auth_chunks; |
3549 | if (auth_chunks->length) |
3550 | - chunksize += ntohs(auth_chunks->length); |
3551 | + chunksize += WORD_ROUND(ntohs(auth_chunks->length)); |
3552 | else |
3553 | auth_chunks = NULL; |
3554 | |
3555 | @@ -411,7 +413,8 @@ struct sctp_chunk *sctp_make_init_ack(const struct sctp_association *asoc, |
3556 | } |
3557 | |
3558 | if (num_ext) |
3559 | - chunksize += sizeof(sctp_supported_ext_param_t) + num_ext; |
3560 | + chunksize += WORD_ROUND(sizeof(sctp_supported_ext_param_t) + |
3561 | + num_ext); |
3562 | |
3563 | /* Now allocate and fill out the chunk. */ |
3564 | retval = sctp_make_chunk(asoc, SCTP_CID_INIT_ACK, 0, chunksize); |
3565 | @@ -3314,21 +3317,6 @@ int sctp_process_asconf_ack(struct sctp_association *asoc, |
3566 | sctp_chunk_free(asconf); |
3567 | asoc->addip_last_asconf = NULL; |
3568 | |
3569 | - /* Send the next asconf chunk from the addip chunk queue. */ |
3570 | - if (!list_empty(&asoc->addip_chunk_list)) { |
3571 | - struct list_head *entry = asoc->addip_chunk_list.next; |
3572 | - asconf = list_entry(entry, struct sctp_chunk, list); |
3573 | - |
3574 | - list_del_init(entry); |
3575 | - |
3576 | - /* Hold the chunk until an ASCONF_ACK is received. */ |
3577 | - sctp_chunk_hold(asconf); |
3578 | - if (sctp_primitive_ASCONF(asoc, asconf)) |
3579 | - sctp_chunk_free(asconf); |
3580 | - else |
3581 | - asoc->addip_last_asconf = asconf; |
3582 | - } |
3583 | - |
3584 | return retval; |
3585 | } |
3586 | |
3587 | diff --git a/net/sctp/sm_sideeffect.c b/net/sctp/sm_sideeffect.c |
3588 | index 4e4ca65..42bbb24 100644 |
3589 | --- a/net/sctp/sm_sideeffect.c |
3590 | +++ b/net/sctp/sm_sideeffect.c |
3591 | @@ -961,6 +961,29 @@ static int sctp_cmd_send_msg(struct sctp_association *asoc, |
3592 | } |
3593 | |
3594 | |
3595 | +/* Sent the next ASCONF packet currently stored in the association. |
3596 | + * This happens after the ASCONF_ACK was succeffully processed. |
3597 | + */ |
3598 | +static void sctp_cmd_send_asconf(struct sctp_association *asoc) |
3599 | +{ |
3600 | + /* Send the next asconf chunk from the addip chunk |
3601 | + * queue. |
3602 | + */ |
3603 | + if (!list_empty(&asoc->addip_chunk_list)) { |
3604 | + struct list_head *entry = asoc->addip_chunk_list.next; |
3605 | + struct sctp_chunk *asconf = list_entry(entry, |
3606 | + struct sctp_chunk, list); |
3607 | + list_del_init(entry); |
3608 | + |
3609 | + /* Hold the chunk until an ASCONF_ACK is received. */ |
3610 | + sctp_chunk_hold(asconf); |
3611 | + if (sctp_primitive_ASCONF(asoc, asconf)) |
3612 | + sctp_chunk_free(asconf); |
3613 | + else |
3614 | + asoc->addip_last_asconf = asconf; |
3615 | + } |
3616 | +} |
3617 | + |
3618 | |
3619 | /* These three macros allow us to pull the debugging code out of the |
3620 | * main flow of sctp_do_sm() to keep attention focused on the real |
3621 | @@ -1616,6 +1639,9 @@ static int sctp_cmd_interpreter(sctp_event_t event_type, |
3622 | } |
3623 | error = sctp_cmd_send_msg(asoc, cmd->obj.msg); |
3624 | break; |
3625 | + case SCTP_CMD_SEND_NEXT_ASCONF: |
3626 | + sctp_cmd_send_asconf(asoc); |
3627 | + break; |
3628 | default: |
3629 | printk(KERN_WARNING "Impossible command: %u, %p\n", |
3630 | cmd->verb, cmd->obj.ptr); |
3631 | diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c |
3632 | index 47bc20d..c3f75e7 100644 |
3633 | --- a/net/sctp/sm_statefuns.c |
3634 | +++ b/net/sctp/sm_statefuns.c |
3635 | @@ -3675,8 +3675,14 @@ sctp_disposition_t sctp_sf_do_asconf_ack(const struct sctp_endpoint *ep, |
3636 | SCTP_TO(SCTP_EVENT_TIMEOUT_T4_RTO)); |
3637 | |
3638 | if (!sctp_process_asconf_ack((struct sctp_association *)asoc, |
3639 | - asconf_ack)) |
3640 | + asconf_ack)) { |
3641 | + /* Successfully processed ASCONF_ACK. We can |
3642 | + * release the next asconf if we have one. |
3643 | + */ |
3644 | + sctp_add_cmd_sf(commands, SCTP_CMD_SEND_NEXT_ASCONF, |
3645 | + SCTP_NULL()); |
3646 | return SCTP_DISPOSITION_CONSUME; |
3647 | + } |
3648 | |
3649 | abort = sctp_make_abort(asoc, asconf_ack, |
3650 | sizeof(sctp_errhdr_t)); |
3651 | diff --git a/net/sctp/socket.c b/net/sctp/socket.c |
3652 | index 9bd9d82..aa3ba60 100644 |
3653 | --- a/net/sctp/socket.c |
3654 | +++ b/net/sctp/socket.c |
3655 | @@ -3718,12 +3718,12 @@ SCTP_STATIC int sctp_init_sock(struct sock *sk) |
3656 | sp->hmac = NULL; |
3657 | |
3658 | SCTP_DBG_OBJCNT_INC(sock); |
3659 | - percpu_counter_inc(&sctp_sockets_allocated); |
3660 | |
3661 | /* Set socket backlog limit. */ |
3662 | sk->sk_backlog.limit = sysctl_sctp_rmem[1]; |
3663 | |
3664 | local_bh_disable(); |
3665 | + percpu_counter_inc(&sctp_sockets_allocated); |
3666 | sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1); |
3667 | local_bh_enable(); |
3668 | |
3669 | @@ -3740,8 +3740,8 @@ SCTP_STATIC void sctp_destroy_sock(struct sock *sk) |
3670 | /* Release our hold on the endpoint. */ |
3671 | ep = sctp_sk(sk)->ep; |
3672 | sctp_endpoint_free(ep); |
3673 | - percpu_counter_dec(&sctp_sockets_allocated); |
3674 | local_bh_disable(); |
3675 | + percpu_counter_dec(&sctp_sockets_allocated); |
3676 | sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1); |
3677 | local_bh_enable(); |
3678 | } |
3679 | @@ -6188,6 +6188,16 @@ do_nonblock: |
3680 | goto out; |
3681 | } |
3682 | |
3683 | +void sctp_data_ready(struct sock *sk, int len) |
3684 | +{ |
3685 | + read_lock_bh(&sk->sk_callback_lock); |
3686 | + if (sk_has_sleeper(sk)) |
3687 | + wake_up_interruptible_sync_poll(sk->sk_sleep, POLLIN | |
3688 | + POLLRDNORM | POLLRDBAND); |
3689 | + sk_wake_async(sk, SOCK_WAKE_WAITD, POLL_IN); |
3690 | + read_unlock_bh(&sk->sk_callback_lock); |
3691 | +} |
3692 | + |
3693 | /* If socket sndbuf has changed, wake up all per association waiters. */ |
3694 | void sctp_write_space(struct sock *sk) |
3695 | { |
3696 | diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c |
3697 | index 327011f..7809137 100644 |
3698 | --- a/net/tipc/bearer.c |
3699 | +++ b/net/tipc/bearer.c |
3700 | @@ -45,10 +45,10 @@ |
3701 | |
3702 | #define MAX_ADDR_STR 32 |
3703 | |
3704 | -static struct media *media_list = NULL; |
3705 | +static struct media media_list[MAX_MEDIA]; |
3706 | static u32 media_count = 0; |
3707 | |
3708 | -struct bearer *tipc_bearers = NULL; |
3709 | +struct bearer tipc_bearers[MAX_BEARERS]; |
3710 | |
3711 | /** |
3712 | * media_name_valid - validate media name |
3713 | @@ -108,9 +108,11 @@ int tipc_register_media(u32 media_type, |
3714 | int res = -EINVAL; |
3715 | |
3716 | write_lock_bh(&tipc_net_lock); |
3717 | - if (!media_list) |
3718 | - goto exit; |
3719 | |
3720 | + if (tipc_mode != TIPC_NET_MODE) { |
3721 | + warn("Media <%s> rejected, not in networked mode yet\n", name); |
3722 | + goto exit; |
3723 | + } |
3724 | if (!media_name_valid(name)) { |
3725 | warn("Media <%s> rejected, illegal name\n", name); |
3726 | goto exit; |
3727 | @@ -660,33 +662,10 @@ int tipc_disable_bearer(const char *name) |
3728 | |
3729 | |
3730 | |
3731 | -int tipc_bearer_init(void) |
3732 | -{ |
3733 | - int res; |
3734 | - |
3735 | - write_lock_bh(&tipc_net_lock); |
3736 | - tipc_bearers = kcalloc(MAX_BEARERS, sizeof(struct bearer), GFP_ATOMIC); |
3737 | - media_list = kcalloc(MAX_MEDIA, sizeof(struct media), GFP_ATOMIC); |
3738 | - if (tipc_bearers && media_list) { |
3739 | - res = 0; |
3740 | - } else { |
3741 | - kfree(tipc_bearers); |
3742 | - kfree(media_list); |
3743 | - tipc_bearers = NULL; |
3744 | - media_list = NULL; |
3745 | - res = -ENOMEM; |
3746 | - } |
3747 | - write_unlock_bh(&tipc_net_lock); |
3748 | - return res; |
3749 | -} |
3750 | - |
3751 | void tipc_bearer_stop(void) |
3752 | { |
3753 | u32 i; |
3754 | |
3755 | - if (!tipc_bearers) |
3756 | - return; |
3757 | - |
3758 | for (i = 0; i < MAX_BEARERS; i++) { |
3759 | if (tipc_bearers[i].active) |
3760 | tipc_bearers[i].publ.blocked = 1; |
3761 | @@ -695,10 +674,6 @@ void tipc_bearer_stop(void) |
3762 | if (tipc_bearers[i].active) |
3763 | bearer_disable(tipc_bearers[i].publ.name); |
3764 | } |
3765 | - kfree(tipc_bearers); |
3766 | - kfree(media_list); |
3767 | - tipc_bearers = NULL; |
3768 | - media_list = NULL; |
3769 | media_count = 0; |
3770 | } |
3771 | |
3772 | diff --git a/net/tipc/bearer.h b/net/tipc/bearer.h |
3773 | index ca57348..000228e 100644 |
3774 | --- a/net/tipc/bearer.h |
3775 | +++ b/net/tipc/bearer.h |
3776 | @@ -114,7 +114,7 @@ struct bearer_name { |
3777 | |
3778 | struct link; |
3779 | |
3780 | -extern struct bearer *tipc_bearers; |
3781 | +extern struct bearer tipc_bearers[]; |
3782 | |
3783 | void tipc_media_addr_printf(struct print_buf *pb, struct tipc_media_addr *a); |
3784 | struct sk_buff *tipc_media_get_names(void); |
3785 | diff --git a/net/tipc/net.c b/net/tipc/net.c |
3786 | index 7906608..f25b1cd 100644 |
3787 | --- a/net/tipc/net.c |
3788 | +++ b/net/tipc/net.c |
3789 | @@ -116,7 +116,8 @@ |
3790 | */ |
3791 | |
3792 | DEFINE_RWLOCK(tipc_net_lock); |
3793 | -struct network tipc_net = { NULL }; |
3794 | +struct _zone *tipc_zones[256] = { NULL, }; |
3795 | +struct network tipc_net = { tipc_zones }; |
3796 | |
3797 | struct tipc_node *tipc_net_select_remote_node(u32 addr, u32 ref) |
3798 | { |
3799 | @@ -158,28 +159,12 @@ void tipc_net_send_external_routes(u32 dest) |
3800 | } |
3801 | } |
3802 | |
3803 | -static int net_init(void) |
3804 | -{ |
3805 | - memset(&tipc_net, 0, sizeof(tipc_net)); |
3806 | - tipc_net.zones = kcalloc(tipc_max_zones + 1, sizeof(struct _zone *), GFP_ATOMIC); |
3807 | - if (!tipc_net.zones) { |
3808 | - return -ENOMEM; |
3809 | - } |
3810 | - return 0; |
3811 | -} |
3812 | - |
3813 | static void net_stop(void) |
3814 | { |
3815 | u32 z_num; |
3816 | |
3817 | - if (!tipc_net.zones) |
3818 | - return; |
3819 | - |
3820 | - for (z_num = 1; z_num <= tipc_max_zones; z_num++) { |
3821 | + for (z_num = 1; z_num <= tipc_max_zones; z_num++) |
3822 | tipc_zone_delete(tipc_net.zones[z_num]); |
3823 | - } |
3824 | - kfree(tipc_net.zones); |
3825 | - tipc_net.zones = NULL; |
3826 | } |
3827 | |
3828 | static void net_route_named_msg(struct sk_buff *buf) |
3829 | @@ -282,9 +267,7 @@ int tipc_net_start(u32 addr) |
3830 | tipc_named_reinit(); |
3831 | tipc_port_reinit(); |
3832 | |
3833 | - if ((res = tipc_bearer_init()) || |
3834 | - (res = net_init()) || |
3835 | - (res = tipc_cltr_init()) || |
3836 | + if ((res = tipc_cltr_init()) || |
3837 | (res = tipc_bclink_init())) { |
3838 | return res; |
3839 | } |
3840 | diff --git a/security/inode.c b/security/inode.c |
3841 | index c3a7938..1c812e8 100644 |
3842 | --- a/security/inode.c |
3843 | +++ b/security/inode.c |
3844 | @@ -161,13 +161,13 @@ static int create_by_name(const char *name, mode_t mode, |
3845 | |
3846 | mutex_lock(&parent->d_inode->i_mutex); |
3847 | *dentry = lookup_one_len(name, parent, strlen(name)); |
3848 | - if (!IS_ERR(dentry)) { |
3849 | + if (!IS_ERR(*dentry)) { |
3850 | if ((mode & S_IFMT) == S_IFDIR) |
3851 | error = mkdir(parent->d_inode, *dentry, mode); |
3852 | else |
3853 | error = create(parent->d_inode, *dentry, mode); |
3854 | } else |
3855 | - error = PTR_ERR(dentry); |
3856 | + error = PTR_ERR(*dentry); |
3857 | mutex_unlock(&parent->d_inode->i_mutex); |
3858 | |
3859 | return error; |
3860 | diff --git a/security/keys/request_key.c b/security/keys/request_key.c |
3861 | index 03fe63e..9ac7bfd 100644 |
3862 | --- a/security/keys/request_key.c |
3863 | +++ b/security/keys/request_key.c |
3864 | @@ -336,8 +336,10 @@ static int construct_alloc_key(struct key_type *type, |
3865 | |
3866 | key_already_present: |
3867 | mutex_unlock(&key_construction_mutex); |
3868 | - if (dest_keyring) |
3869 | + if (dest_keyring) { |
3870 | + __key_link(dest_keyring, key_ref_to_ptr(key_ref)); |
3871 | up_write(&dest_keyring->sem); |
3872 | + } |
3873 | mutex_unlock(&user->cons_lock); |
3874 | key_put(key); |
3875 | *_key = key = key_ref_to_ptr(key_ref); |
3876 | @@ -428,6 +430,11 @@ struct key *request_key_and_link(struct key_type *type, |
3877 | |
3878 | if (!IS_ERR(key_ref)) { |
3879 | key = key_ref_to_ptr(key_ref); |
3880 | + if (dest_keyring) { |
3881 | + construct_get_dest_keyring(&dest_keyring); |
3882 | + key_link(dest_keyring, key); |
3883 | + key_put(dest_keyring); |
3884 | + } |
3885 | } else if (PTR_ERR(key_ref) != -EAGAIN) { |
3886 | key = ERR_CAST(key_ref); |
3887 | } else { |
3888 | diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c |
3889 | index 062a8b0..fd831bd 100644 |
3890 | --- a/sound/pci/hda/hda_intel.c |
3891 | +++ b/sound/pci/hda/hda_intel.c |
3892 | @@ -2273,6 +2273,7 @@ static struct snd_pci_quirk position_fix_list[] __devinitdata = { |
3893 | SND_PCI_QUIRK(0x1462, 0x1002, "MSI Wind U115", POS_FIX_LPIB), |
3894 | SND_PCI_QUIRK(0x1565, 0x820f, "Biostar Microtech", POS_FIX_LPIB), |
3895 | SND_PCI_QUIRK(0x1565, 0x8218, "Biostar Microtech", POS_FIX_LPIB), |
3896 | + SND_PCI_QUIRK(0x8086, 0x2503, "DG965OT AAD63733-203", POS_FIX_LPIB), |
3897 | SND_PCI_QUIRK(0x8086, 0xd601, "eMachines T5212", POS_FIX_LPIB), |
3898 | {} |
3899 | }; |
3900 | diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c |
3901 | index 71b7a96..1a97c81 100644 |
3902 | --- a/sound/pci/hda/patch_conexant.c |
3903 | +++ b/sound/pci/hda/patch_conexant.c |
3904 | @@ -1174,9 +1174,10 @@ static int patch_cxt5045(struct hda_codec *codec) |
3905 | |
3906 | switch (codec->subsystem_id >> 16) { |
3907 | case 0x103c: |
3908 | + case 0x1631: |
3909 | case 0x1734: |
3910 | - /* HP & Fujitsu-Siemens laptops have really bad sound over 0dB |
3911 | - * on NID 0x17. Fix max PCM level to 0 dB |
3912 | + /* HP, Packard Bell, & Fujitsu-Siemens laptops have really bad |
3913 | + * sound over 0dB on NID 0x17. Fix max PCM level to 0 dB |
3914 | * (originally it has 0x2b steps with 0dB offset 0x14) |
3915 | */ |
3916 | snd_hda_override_amp_caps(codec, 0x17, HDA_INPUT, |
3917 | @@ -2471,6 +2472,8 @@ static struct snd_pci_quirk cxt5066_cfg_tbl[] = { |
3918 | CXT5066_DELL_LAPTOP), |
3919 | SND_PCI_QUIRK(0x152d, 0x0833, "OLPC XO-1.5", CXT5066_OLPC_XO_1_5), |
3920 | SND_PCI_QUIRK(0x1028, 0x0402, "Dell Vostro", CXT5066_DELL_VOSTO), |
3921 | + SND_PCI_QUIRK(0x1179, 0xff50, "Toshiba Satellite P500-PSPGSC-01800T", CXT5066_OLPC_XO_1_5), |
3922 | + SND_PCI_QUIRK(0x1179, 0xffe0, "Toshiba Satellite Pro T130-15F", CXT5066_OLPC_XO_1_5), |
3923 | {} |
3924 | }; |
3925 | |
3926 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c |
3927 | index bd8a567..b486daa 100644 |
3928 | --- a/sound/pci/hda/patch_realtek.c |
3929 | +++ b/sound/pci/hda/patch_realtek.c |
3930 | @@ -4033,7 +4033,7 @@ static struct snd_pci_quirk alc880_cfg_tbl[] = { |
3931 | SND_PCI_QUIRK(0x1695, 0x4012, "EPox EP-5LDA", ALC880_5ST_DIG), |
3932 | SND_PCI_QUIRK(0x1734, 0x107c, "FSC F1734", ALC880_F1734), |
3933 | SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FUJITSU), |
3934 | - SND_PCI_QUIRK(0x1734, 0x10ac, "FSC", ALC880_UNIWILL), |
3935 | + SND_PCI_QUIRK(0x1734, 0x10ac, "FSC AMILO Xi 1526", ALC880_F1734), |
3936 | SND_PCI_QUIRK(0x1734, 0x10b0, "Fujitsu", ALC880_FUJITSU), |
3937 | SND_PCI_QUIRK(0x1854, 0x0018, "LG LW20", ALC880_LG_LW), |
3938 | SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_LG), |
3939 | diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c |
3940 | index 799ba25..ac2d528 100644 |
3941 | --- a/sound/pci/hda/patch_sigmatel.c |
3942 | +++ b/sound/pci/hda/patch_sigmatel.c |
3943 | @@ -1602,6 +1602,10 @@ static struct snd_pci_quirk stac92hd73xx_cfg_tbl[] = { |
3944 | "Dell Studio 1555", STAC_DELL_M6_DMIC), |
3945 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02bd, |
3946 | "Dell Studio 1557", STAC_DELL_M6_DMIC), |
3947 | + SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02fe, |
3948 | + "Dell Studio XPS 1645", STAC_DELL_M6_BOTH), |
3949 | + SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0413, |
3950 | + "Dell Studio 1558", STAC_DELL_M6_BOTH), |
3951 | {} /* terminator */ |
3952 | }; |
3953 | |
3954 | @@ -1725,6 +1729,8 @@ static struct snd_pci_quirk stac92hd71bxx_cfg_tbl[] = { |
3955 | "HP HDX", STAC_HP_HDX), /* HDX16 */ |
3956 | SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x3620, |
3957 | "HP dv6", STAC_HP_DV5), |
3958 | + SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3061, |
3959 | + "HP dv6", STAC_HP_DV5), /* HP dv6-1110ax */ |
3960 | SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x7010, |
3961 | "HP", STAC_HP_DV5), |
3962 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0233, |
3963 | diff --git a/sound/pci/maestro3.c b/sound/pci/maestro3.c |
3964 | index 75283fb..c2311f8 100644 |
3965 | --- a/sound/pci/maestro3.c |
3966 | +++ b/sound/pci/maestro3.c |
3967 | @@ -849,6 +849,7 @@ struct snd_m3 { |
3968 | struct snd_kcontrol *master_switch; |
3969 | struct snd_kcontrol *master_volume; |
3970 | struct tasklet_struct hwvol_tq; |
3971 | + unsigned int in_suspend; |
3972 | |
3973 | #ifdef CONFIG_PM |
3974 | u16 *suspend_mem; |
3975 | @@ -884,6 +885,7 @@ static struct pci_device_id snd_m3_ids[] = { |
3976 | MODULE_DEVICE_TABLE(pci, snd_m3_ids); |
3977 | |
3978 | static struct snd_pci_quirk m3_amp_quirk_list[] __devinitdata = { |
3979 | + SND_PCI_QUIRK(0x0E11, 0x0094, "Compaq Evo N600c", 0x0c), |
3980 | SND_PCI_QUIRK(0x10f7, 0x833e, "Panasonic CF-28", 0x0d), |
3981 | SND_PCI_QUIRK(0x10f7, 0x833d, "Panasonic CF-72", 0x0d), |
3982 | SND_PCI_QUIRK(0x1033, 0x80f1, "NEC LM800J/7", 0x03), |
3983 | @@ -1613,6 +1615,11 @@ static void snd_m3_update_hw_volume(unsigned long private_data) |
3984 | outb(0x88, chip->iobase + SHADOW_MIX_REG_MASTER); |
3985 | outb(0x88, chip->iobase + HW_VOL_COUNTER_MASTER); |
3986 | |
3987 | + /* Ignore spurious HV interrupts during suspend / resume, this avoids |
3988 | + mistaking them for a mute button press. */ |
3989 | + if (chip->in_suspend) |
3990 | + return; |
3991 | + |
3992 | if (!chip->master_switch || !chip->master_volume) |
3993 | return; |
3994 | |
3995 | @@ -2424,6 +2431,7 @@ static int m3_suspend(struct pci_dev *pci, pm_message_t state) |
3996 | if (chip->suspend_mem == NULL) |
3997 | return 0; |
3998 | |
3999 | + chip->in_suspend = 1; |
4000 | snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); |
4001 | snd_pcm_suspend_all(chip->pcm); |
4002 | snd_ac97_suspend(chip->ac97); |
4003 | @@ -2497,6 +2505,7 @@ static int m3_resume(struct pci_dev *pci) |
4004 | snd_m3_hv_init(chip); |
4005 | |
4006 | snd_power_change_state(card, SNDRV_CTL_POWER_D0); |
4007 | + chip->in_suspend = 0; |
4008 | return 0; |
4009 | } |
4010 | #endif /* CONFIG_PM */ |