Contents of /trunk/kernel26-alx/patches-2.6.20-r5/0101-2.6.20.2-all-fixes.patch
Parent Directory | Revision Log
Revision 199 -
(show annotations)
(download)
Fri May 18 11:04:36 2007 UTC (17 years, 4 months ago) by niro
File size: 151744 byte(s)
Fri May 18 11:04:36 2007 UTC (17 years, 4 months ago) by niro
File size: 151744 byte(s)
-import
1 | diff --git a/arch/i386/kernel/cpu/mtrr/if.c b/arch/i386/kernel/cpu/mtrr/if.c |
2 | index 5ae1705..590d99e 100644 |
3 | --- a/arch/i386/kernel/cpu/mtrr/if.c |
4 | +++ b/arch/i386/kernel/cpu/mtrr/if.c |
5 | @@ -158,8 +158,9 @@ mtrr_ioctl(struct file *file, unsigned int cmd, unsigned long __arg) |
6 | struct mtrr_sentry sentry; |
7 | struct mtrr_gentry gentry; |
8 | void __user *arg = (void __user *) __arg; |
9 | + unsigned int compat_cmd = cmd; |
10 | |
11 | - switch (cmd) { |
12 | + switch (compat_cmd) { |
13 | case MTRRIOC_ADD_ENTRY: |
14 | case MTRRIOC_SET_ENTRY: |
15 | case MTRRIOC_DEL_ENTRY: |
16 | @@ -177,14 +178,20 @@ mtrr_ioctl(struct file *file, unsigned int cmd, unsigned long __arg) |
17 | return -EFAULT; |
18 | break; |
19 | #ifdef CONFIG_COMPAT |
20 | - case MTRRIOC32_ADD_ENTRY: |
21 | - case MTRRIOC32_SET_ENTRY: |
22 | - case MTRRIOC32_DEL_ENTRY: |
23 | - case MTRRIOC32_KILL_ENTRY: |
24 | - case MTRRIOC32_ADD_PAGE_ENTRY: |
25 | - case MTRRIOC32_SET_PAGE_ENTRY: |
26 | - case MTRRIOC32_DEL_PAGE_ENTRY: |
27 | - case MTRRIOC32_KILL_PAGE_ENTRY: { |
28 | +#define MTRR_COMPAT_OP(op, type)\ |
29 | + case MTRRIOC32_##op: \ |
30 | + cmd = MTRRIOC_##op; \ |
31 | + goto compat_get_##type |
32 | + |
33 | + MTRR_COMPAT_OP(ADD_ENTRY, sentry); |
34 | + MTRR_COMPAT_OP(SET_ENTRY, sentry); |
35 | + MTRR_COMPAT_OP(DEL_ENTRY, sentry); |
36 | + MTRR_COMPAT_OP(KILL_ENTRY, sentry); |
37 | + MTRR_COMPAT_OP(ADD_PAGE_ENTRY, sentry); |
38 | + MTRR_COMPAT_OP(SET_PAGE_ENTRY, sentry); |
39 | + MTRR_COMPAT_OP(DEL_PAGE_ENTRY, sentry); |
40 | + MTRR_COMPAT_OP(KILL_PAGE_ENTRY, sentry); |
41 | +compat_get_sentry: { |
42 | struct mtrr_sentry32 __user *s32 = (struct mtrr_sentry32 __user *)__arg; |
43 | err = get_user(sentry.base, &s32->base); |
44 | err |= get_user(sentry.size, &s32->size); |
45 | @@ -193,8 +200,9 @@ mtrr_ioctl(struct file *file, unsigned int cmd, unsigned long __arg) |
46 | return err; |
47 | break; |
48 | } |
49 | - case MTRRIOC32_GET_ENTRY: |
50 | - case MTRRIOC32_GET_PAGE_ENTRY: { |
51 | + MTRR_COMPAT_OP(GET_ENTRY, gentry); |
52 | + MTRR_COMPAT_OP(GET_PAGE_ENTRY, gentry); |
53 | +compat_get_gentry: { |
54 | struct mtrr_gentry32 __user *g32 = (struct mtrr_gentry32 __user *)__arg; |
55 | err = get_user(gentry.regnum, &g32->regnum); |
56 | err |= get_user(gentry.base, &g32->base); |
57 | @@ -204,6 +212,7 @@ mtrr_ioctl(struct file *file, unsigned int cmd, unsigned long __arg) |
58 | return err; |
59 | break; |
60 | } |
61 | +#undef MTRR_COMPAT_OP |
62 | #endif |
63 | } |
64 | |
65 | @@ -287,7 +296,7 @@ mtrr_ioctl(struct file *file, unsigned int cmd, unsigned long __arg) |
66 | if (err) |
67 | return err; |
68 | |
69 | - switch(cmd) { |
70 | + switch(compat_cmd) { |
71 | case MTRRIOC_GET_ENTRY: |
72 | case MTRRIOC_GET_PAGE_ENTRY: |
73 | if (copy_to_user(arg, &gentry, sizeof gentry)) |
74 | diff --git a/arch/i386/kernel/signal.c b/arch/i386/kernel/signal.c |
75 | index 65d7620..f654505 100644 |
76 | --- a/arch/i386/kernel/signal.c |
77 | +++ b/arch/i386/kernel/signal.c |
78 | @@ -21,6 +21,7 @@ |
79 | #include <linux/suspend.h> |
80 | #include <linux/ptrace.h> |
81 | #include <linux/elf.h> |
82 | +#include <linux/binfmts.h> |
83 | #include <asm/processor.h> |
84 | #include <asm/ucontext.h> |
85 | #include <asm/uaccess.h> |
86 | @@ -349,7 +350,10 @@ static int setup_frame(int sig, struct k_sigaction *ka, |
87 | goto give_sigsegv; |
88 | } |
89 | |
90 | - restorer = (void *)VDSO_SYM(&__kernel_sigreturn); |
91 | + if (current->binfmt->hasvdso) |
92 | + restorer = (void *)VDSO_SYM(&__kernel_sigreturn); |
93 | + else |
94 | + restorer = (void *)&frame->retcode; |
95 | if (ka->sa.sa_flags & SA_RESTORER) |
96 | restorer = ka->sa.sa_restorer; |
97 | |
98 | diff --git a/arch/i386/kernel/sysenter.c b/arch/i386/kernel/sysenter.c |
99 | index 5da7442..666f70d 100644 |
100 | --- a/arch/i386/kernel/sysenter.c |
101 | +++ b/arch/i386/kernel/sysenter.c |
102 | @@ -77,7 +77,7 @@ int __init sysenter_setup(void) |
103 | syscall_page = (void *)get_zeroed_page(GFP_ATOMIC); |
104 | |
105 | #ifdef CONFIG_COMPAT_VDSO |
106 | - __set_fixmap(FIX_VDSO, __pa(syscall_page), PAGE_READONLY); |
107 | + __set_fixmap(FIX_VDSO, __pa(syscall_page), PAGE_READONLY_EXEC); |
108 | printk("Compat vDSO mapped to %08lx.\n", __fix_to_virt(FIX_VDSO)); |
109 | #endif |
110 | |
111 | diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig |
112 | index fcacfe2..c085199 100644 |
113 | --- a/arch/ia64/Kconfig |
114 | +++ b/arch/ia64/Kconfig |
115 | @@ -11,6 +11,7 @@ menu "Processor type and features" |
116 | |
117 | config IA64 |
118 | bool |
119 | + select ATA_NONSTANDARD if ATA |
120 | default y |
121 | help |
122 | The Itanium Processor Family is Intel's 64-bit successor to |
123 | diff --git a/arch/ia64/kernel/crash.c b/arch/ia64/kernel/crash.c |
124 | index bc2f64d..2018e62 100644 |
125 | --- a/arch/ia64/kernel/crash.c |
126 | +++ b/arch/ia64/kernel/crash.c |
127 | @@ -79,6 +79,7 @@ crash_save_this_cpu() |
128 | final_note(buf); |
129 | } |
130 | |
131 | +#ifdef CONFIG_SMP |
132 | static int |
133 | kdump_wait_cpu_freeze(void) |
134 | { |
135 | @@ -91,6 +92,7 @@ kdump_wait_cpu_freeze(void) |
136 | } |
137 | return 1; |
138 | } |
139 | +#endif |
140 | |
141 | void |
142 | machine_crash_shutdown(struct pt_regs *pt) |
143 | @@ -132,11 +134,12 @@ kdump_cpu_freeze(struct unw_frame_info *info, void *arg) |
144 | atomic_inc(&kdump_cpu_freezed); |
145 | kdump_status[cpuid] = 1; |
146 | mb(); |
147 | - if (cpuid == 0) { |
148 | - for (;;) |
149 | - cpu_relax(); |
150 | - } else |
151 | +#ifdef CONFIG_HOTPLUG_CPU |
152 | + if (cpuid != 0) |
153 | ia64_jump_to_sal(&sal_boot_rendez_state[cpuid]); |
154 | +#endif |
155 | + for (;;) |
156 | + cpu_relax(); |
157 | } |
158 | |
159 | static int |
160 | diff --git a/arch/ia64/kernel/machine_kexec.c b/arch/ia64/kernel/machine_kexec.c |
161 | index e2ccc9f..7141795 100644 |
162 | --- a/arch/ia64/kernel/machine_kexec.c |
163 | +++ b/arch/ia64/kernel/machine_kexec.c |
164 | @@ -70,12 +70,14 @@ void machine_kexec_cleanup(struct kimage *image) |
165 | |
166 | void machine_shutdown(void) |
167 | { |
168 | +#ifdef CONFIG_HOTPLUG_CPU |
169 | int cpu; |
170 | |
171 | for_each_online_cpu(cpu) { |
172 | if (cpu != smp_processor_id()) |
173 | cpu_down(cpu); |
174 | } |
175 | +#endif |
176 | kexec_disable_iosapic(); |
177 | } |
178 | |
179 | diff --git a/arch/m32r/kernel/process.c b/arch/m32r/kernel/process.c |
180 | index 44cbe0c..a689e29 100644 |
181 | --- a/arch/m32r/kernel/process.c |
182 | +++ b/arch/m32r/kernel/process.c |
183 | @@ -174,7 +174,7 @@ void show_regs(struct pt_regs * regs) |
184 | regs->acc1h, regs->acc1l); |
185 | #elif defined(CONFIG_ISA_M32R2) || defined(CONFIG_ISA_M32R) |
186 | printk("ACCH[%08lx]:ACCL[%08lx]\n", \ |
187 | - regs->acch, regs->accl); |
188 | + regs->acc0h, regs->acc0l); |
189 | #else |
190 | #error unknown isa configuration |
191 | #endif |
192 | diff --git a/arch/m32r/kernel/signal.c b/arch/m32r/kernel/signal.c |
193 | index 092ea86..4b15605 100644 |
194 | --- a/arch/m32r/kernel/signal.c |
195 | +++ b/arch/m32r/kernel/signal.c |
196 | @@ -109,19 +109,10 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, |
197 | COPY(r10); |
198 | COPY(r11); |
199 | COPY(r12); |
200 | -#if defined(CONFIG_ISA_M32R2) && defined(CONFIG_ISA_DSP_LEVEL2) |
201 | COPY(acc0h); |
202 | COPY(acc0l); |
203 | - COPY(acc1h); |
204 | - COPY(acc1l); |
205 | -#elif defined(CONFIG_ISA_M32R2) || defined(CONFIG_ISA_M32R) |
206 | - COPY(acch); |
207 | - COPY(accl); |
208 | - COPY(dummy_acc1h); |
209 | - COPY(dummy_acc1l); |
210 | -#else |
211 | -#error unknown isa configuration |
212 | -#endif |
213 | + COPY(acc1h); /* ISA_DSP_LEVEL2 only */ |
214 | + COPY(acc1l); /* ISA_DSP_LEVEL2 only */ |
215 | COPY(psw); |
216 | COPY(bpc); |
217 | COPY(bbpsw); |
218 | @@ -196,19 +187,10 @@ setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs, |
219 | COPY(r10); |
220 | COPY(r11); |
221 | COPY(r12); |
222 | -#if defined(CONFIG_ISA_M32R2) && defined(CONFIG_ISA_DSP_LEVEL2) |
223 | COPY(acc0h); |
224 | COPY(acc0l); |
225 | - COPY(acc1h); |
226 | - COPY(acc1l); |
227 | -#elif defined(CONFIG_ISA_M32R2) || defined(CONFIG_ISA_M32R) |
228 | - COPY(acch); |
229 | - COPY(accl); |
230 | - COPY(dummy_acc1h); |
231 | - COPY(dummy_acc1l); |
232 | -#else |
233 | -#error unknown isa configuration |
234 | -#endif |
235 | + COPY(acc1h); /* ISA_DSP_LEVEL2 only */ |
236 | + COPY(acc1l); /* ISA_DSP_LEVEL2 only */ |
237 | COPY(psw); |
238 | COPY(bpc); |
239 | COPY(bbpsw); |
240 | diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S |
241 | index 71b1fe5..97cedcd 100644 |
242 | --- a/arch/powerpc/kernel/head_64.S |
243 | +++ b/arch/powerpc/kernel/head_64.S |
244 | @@ -613,7 +613,7 @@ system_call_pSeries: |
245 | /*** pSeries interrupt support ***/ |
246 | |
247 | /* moved from 0xf00 */ |
248 | - MASKABLE_EXCEPTION_PSERIES(., performance_monitor) |
249 | + STD_EXCEPTION_PSERIES(., performance_monitor) |
250 | |
251 | /* |
252 | * An interrupt came in while soft-disabled; clear EE in SRR1, |
253 | diff --git a/arch/ppc/kernel/ppc_ksyms.c b/arch/ppc/kernel/ppc_ksyms.c |
254 | index c8b65ca..6d9857c 100644 |
255 | --- a/arch/ppc/kernel/ppc_ksyms.c |
256 | +++ b/arch/ppc/kernel/ppc_ksyms.c |
257 | @@ -270,7 +270,7 @@ EXPORT_SYMBOL(mmu_hash_lock); /* For MOL */ |
258 | extern long *intercept_table; |
259 | EXPORT_SYMBOL(intercept_table); |
260 | #endif /* CONFIG_PPC_STD_MMU */ |
261 | -#if defined(CONFIG_40x) || defined(CONFIG_BOOKE) |
262 | +#ifdef CONFIG_PPC_DCR_NATIVE |
263 | EXPORT_SYMBOL(__mtdcr); |
264 | EXPORT_SYMBOL(__mfdcr); |
265 | #endif |
266 | diff --git a/arch/sparc64/kernel/of_device.c b/arch/sparc64/kernel/of_device.c |
267 | index b0f3e00..ad74e5e 100644 |
268 | --- a/arch/sparc64/kernel/of_device.c |
269 | +++ b/arch/sparc64/kernel/of_device.c |
270 | @@ -708,7 +708,7 @@ static unsigned int __init pci_irq_swizzle(struct device_node *dp, |
271 | unsigned int irq) |
272 | { |
273 | struct linux_prom_pci_registers *regs; |
274 | - unsigned int devfn, slot, ret; |
275 | + unsigned int bus, devfn, slot, ret; |
276 | |
277 | if (irq < 1 || irq > 4) |
278 | return irq; |
279 | @@ -717,10 +717,46 @@ static unsigned int __init pci_irq_swizzle(struct device_node *dp, |
280 | if (!regs) |
281 | return irq; |
282 | |
283 | + bus = (regs->phys_hi >> 16) & 0xff; |
284 | devfn = (regs->phys_hi >> 8) & 0xff; |
285 | slot = (devfn >> 3) & 0x1f; |
286 | |
287 | - ret = ((irq - 1 + (slot & 3)) & 3) + 1; |
288 | + if (pp->irq_trans) { |
289 | + /* Derived from Table 8-3, U2P User's Manual. This branch |
290 | + * is handling a PCI controller that lacks a proper set of |
291 | + * interrupt-map and interrupt-map-mask properties. The |
292 | + * Ultra-E450 is one example. |
293 | + * |
294 | + * The bit layout is BSSLL, where: |
295 | + * B: 0 on bus A, 1 on bus B |
296 | + * D: 2-bit slot number, derived from PCI device number as |
297 | + * (dev - 1) for bus A, or (dev - 2) for bus B |
298 | + * L: 2-bit line number |
299 | + * |
300 | + * Actually, more "portable" way to calculate the funky |
301 | + * slot number is to subtract pbm->pci_first_slot from the |
302 | + * device number, and that's exactly what the pre-OF |
303 | + * sparc64 code did, but we're building this stuff generically |
304 | + * using the OBP tree, not in the PCI controller layer. |
305 | + */ |
306 | + if (bus & 0x80) { |
307 | + /* PBM-A */ |
308 | + bus = 0x00; |
309 | + slot = (slot - 1) << 2; |
310 | + } else { |
311 | + /* PBM-B */ |
312 | + bus = 0x10; |
313 | + slot = (slot - 2) << 2; |
314 | + } |
315 | + irq -= 1; |
316 | + |
317 | + ret = (bus | slot | irq); |
318 | + } else { |
319 | + /* Going through a PCI-PCI bridge that lacks a set of |
320 | + * interrupt-map and interrupt-map-mask properties. |
321 | + */ |
322 | + ret = ((irq - 1 + (slot & 3)) & 3) + 1; |
323 | + } |
324 | |
325 | return ret; |
326 | } |
327 | diff --git a/arch/um/os-Linux/sigio.c b/arch/um/os-Linux/sigio.c |
328 | index 925a652..b2e1fd8 100644 |
329 | --- a/arch/um/os-Linux/sigio.c |
330 | +++ b/arch/um/os-Linux/sigio.c |
331 | @@ -97,20 +97,22 @@ static int write_sigio_thread(void *unused) |
332 | |
333 | static int need_poll(struct pollfds *polls, int n) |
334 | { |
335 | - if(n <= polls->size){ |
336 | - polls->used = n; |
337 | + struct pollfd *new; |
338 | + |
339 | + if(n <= polls->size) |
340 | return 0; |
341 | - } |
342 | - kfree(polls->poll); |
343 | - polls->poll = um_kmalloc_atomic(n * sizeof(struct pollfd)); |
344 | - if(polls->poll == NULL){ |
345 | + |
346 | + new = um_kmalloc_atomic(n * sizeof(struct pollfd)); |
347 | + if(new == NULL){ |
348 | printk("need_poll : failed to allocate new pollfds\n"); |
349 | - polls->size = 0; |
350 | - polls->used = 0; |
351 | return -ENOMEM; |
352 | } |
353 | + |
354 | + memcpy(new, polls->poll, polls->used * sizeof(struct pollfd)); |
355 | + kfree(polls->poll); |
356 | + |
357 | + polls->poll = new; |
358 | polls->size = n; |
359 | - polls->used = n; |
360 | return 0; |
361 | } |
362 | |
363 | @@ -171,15 +173,15 @@ int add_sigio_fd(int fd) |
364 | goto out; |
365 | } |
366 | |
367 | - n = current_poll.used + 1; |
368 | - err = need_poll(&next_poll, n); |
369 | + n = current_poll.used; |
370 | + err = need_poll(&next_poll, n + 1); |
371 | if(err) |
372 | goto out; |
373 | |
374 | - for(i = 0; i < current_poll.used; i++) |
375 | - next_poll.poll[i] = current_poll.poll[i]; |
376 | - |
377 | - next_poll.poll[n - 1] = *p; |
378 | + memcpy(next_poll.poll, current_poll.poll, |
379 | + current_poll.used * sizeof(struct pollfd)); |
380 | + next_poll.poll[n] = *p; |
381 | + next_poll.used = n + 1; |
382 | update_thread(); |
383 | out: |
384 | sigio_unlock(); |
385 | @@ -214,6 +216,7 @@ int ignore_sigio_fd(int fd) |
386 | if(p->fd != fd) |
387 | next_poll.poll[n++] = *p; |
388 | } |
389 | + next_poll.used = current_poll.used - 1; |
390 | |
391 | update_thread(); |
392 | out: |
393 | @@ -331,10 +334,9 @@ void maybe_sigio_broken(int fd, int read) |
394 | |
395 | sigio_lock(); |
396 | err = need_poll(&all_sigio_fds, all_sigio_fds.used + 1); |
397 | - if(err){ |
398 | - printk("maybe_sigio_broken - failed to add pollfd\n"); |
399 | + if(err) |
400 | goto out; |
401 | - } |
402 | + |
403 | all_sigio_fds.poll[all_sigio_fds.used++] = |
404 | ((struct pollfd) { .fd = fd, |
405 | .events = read ? POLLIN : POLLOUT, |
406 | diff --git a/arch/x86_64/ia32/ia32_signal.c b/arch/x86_64/ia32/ia32_signal.c |
407 | index ff499ef..c7beadf 100644 |
408 | --- a/arch/x86_64/ia32/ia32_signal.c |
409 | +++ b/arch/x86_64/ia32/ia32_signal.c |
410 | @@ -21,6 +21,7 @@ |
411 | #include <linux/stddef.h> |
412 | #include <linux/personality.h> |
413 | #include <linux/compat.h> |
414 | +#include <linux/binfmts.h> |
415 | #include <asm/ucontext.h> |
416 | #include <asm/uaccess.h> |
417 | #include <asm/i387.h> |
418 | @@ -449,7 +450,11 @@ int ia32_setup_frame(int sig, struct k_sigaction *ka, |
419 | |
420 | /* Return stub is in 32bit vsyscall page */ |
421 | { |
422 | - void __user *restorer = VSYSCALL32_SIGRETURN; |
423 | + void __user *restorer; |
424 | + if (current->binfmt->hasvdso) |
425 | + restorer = VSYSCALL32_SIGRETURN; |
426 | + else |
427 | + restorer = (void *)&frame->retcode; |
428 | if (ka->sa.sa_flags & SA_RESTORER) |
429 | restorer = ka->sa.sa_restorer; |
430 | err |= __put_user(ptr_to_compat(restorer), &frame->pretcode); |
431 | diff --git a/arch/x86_64/ia32/ptrace32.c b/arch/x86_64/ia32/ptrace32.c |
432 | index 04566fe..4de3a54 100644 |
433 | --- a/arch/x86_64/ia32/ptrace32.c |
434 | +++ b/arch/x86_64/ia32/ptrace32.c |
435 | @@ -243,6 +243,7 @@ asmlinkage long sys32_ptrace(long request, u32 pid, u32 addr, u32 data) |
436 | case PTRACE_SINGLESTEP: |
437 | case PTRACE_DETACH: |
438 | case PTRACE_SYSCALL: |
439 | + case PTRACE_OLDSETOPTIONS: |
440 | case PTRACE_SETOPTIONS: |
441 | case PTRACE_SET_THREAD_AREA: |
442 | case PTRACE_GET_THREAD_AREA: |
443 | diff --git a/arch/x86_64/kernel/irq.c b/arch/x86_64/kernel/irq.c |
444 | index 0c06af6..3bc30d2 100644 |
445 | --- a/arch/x86_64/kernel/irq.c |
446 | +++ b/arch/x86_64/kernel/irq.c |
447 | @@ -18,6 +18,7 @@ |
448 | #include <asm/uaccess.h> |
449 | #include <asm/io_apic.h> |
450 | #include <asm/idle.h> |
451 | +#include <asm/smp.h> |
452 | |
453 | atomic_t irq_err_count; |
454 | |
455 | @@ -120,9 +121,14 @@ asmlinkage unsigned int do_IRQ(struct pt_regs *regs) |
456 | |
457 | if (likely(irq < NR_IRQS)) |
458 | generic_handle_irq(irq); |
459 | - else if (printk_ratelimit()) |
460 | - printk(KERN_EMERG "%s: %d.%d No irq handler for vector\n", |
461 | - __func__, smp_processor_id(), vector); |
462 | + else { |
463 | + if (!disable_apic) |
464 | + ack_APIC_irq(); |
465 | + |
466 | + if (printk_ratelimit()) |
467 | + printk(KERN_EMERG "%s: %d.%d No irq handler for vector\n", |
468 | + __func__, smp_processor_id(), vector); |
469 | + } |
470 | |
471 | irq_exit(); |
472 | |
473 | diff --git a/block/ll_rw_blk.c b/block/ll_rw_blk.c |
474 | index fb67897..38c293b 100644 |
475 | --- a/block/ll_rw_blk.c |
476 | +++ b/block/ll_rw_blk.c |
477 | @@ -1264,7 +1264,7 @@ new_hw_segment: |
478 | bio->bi_hw_segments = nr_hw_segs; |
479 | bio->bi_flags |= (1 << BIO_SEG_VALID); |
480 | } |
481 | - |
482 | +EXPORT_SYMBOL(blk_recount_segments); |
483 | |
484 | static int blk_phys_contig_segment(request_queue_t *q, struct bio *bio, |
485 | struct bio *nxt) |
486 | diff --git a/drivers/Makefile b/drivers/Makefile |
487 | index 0dd96d1..f28dcb4 100644 |
488 | --- a/drivers/Makefile |
489 | +++ b/drivers/Makefile |
490 | @@ -30,7 +30,7 @@ obj-$(CONFIG_PARPORT) += parport/ |
491 | obj-y += base/ block/ misc/ mfd/ net/ media/ |
492 | obj-$(CONFIG_NUBUS) += nubus/ |
493 | obj-$(CONFIG_ATM) += atm/ |
494 | -obj-$(CONFIG_PPC_PMAC) += macintosh/ |
495 | +obj-y += macintosh/ |
496 | obj-$(CONFIG_IDE) += ide/ |
497 | obj-$(CONFIG_FC4) += fc4/ |
498 | obj-$(CONFIG_SCSI) += scsi/ |
499 | diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c |
500 | index 48616c6..dc2c082 100644 |
501 | --- a/drivers/ata/ahci.c |
502 | +++ b/drivers/ata/ahci.c |
503 | @@ -225,10 +225,12 @@ static void ahci_thaw(struct ata_port *ap); |
504 | static void ahci_error_handler(struct ata_port *ap); |
505 | static void ahci_vt8251_error_handler(struct ata_port *ap); |
506 | static void ahci_post_internal_cmd(struct ata_queued_cmd *qc); |
507 | +#ifdef CONFIG_PM |
508 | static int ahci_port_suspend(struct ata_port *ap, pm_message_t mesg); |
509 | static int ahci_port_resume(struct ata_port *ap); |
510 | static int ahci_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg); |
511 | static int ahci_pci_device_resume(struct pci_dev *pdev); |
512 | +#endif |
513 | static void ahci_remove_one (struct pci_dev *pdev); |
514 | |
515 | static struct scsi_host_template ahci_sht = { |
516 | @@ -248,8 +250,10 @@ static struct scsi_host_template ahci_sht = { |
517 | .slave_configure = ata_scsi_slave_config, |
518 | .slave_destroy = ata_scsi_slave_destroy, |
519 | .bios_param = ata_std_bios_param, |
520 | +#ifdef CONFIG_PM |
521 | .suspend = ata_scsi_device_suspend, |
522 | .resume = ata_scsi_device_resume, |
523 | +#endif |
524 | }; |
525 | |
526 | static const struct ata_port_operations ahci_ops = { |
527 | @@ -276,8 +280,10 @@ static const struct ata_port_operations ahci_ops = { |
528 | .error_handler = ahci_error_handler, |
529 | .post_internal_cmd = ahci_post_internal_cmd, |
530 | |
531 | +#ifdef CONFIG_PM |
532 | .port_suspend = ahci_port_suspend, |
533 | .port_resume = ahci_port_resume, |
534 | +#endif |
535 | |
536 | .port_start = ahci_port_start, |
537 | .port_stop = ahci_port_stop, |
538 | @@ -307,8 +313,10 @@ static const struct ata_port_operations ahci_vt8251_ops = { |
539 | .error_handler = ahci_vt8251_error_handler, |
540 | .post_internal_cmd = ahci_post_internal_cmd, |
541 | |
542 | +#ifdef CONFIG_PM |
543 | .port_suspend = ahci_port_suspend, |
544 | .port_resume = ahci_port_resume, |
545 | +#endif |
546 | |
547 | .port_start = ahci_port_start, |
548 | .port_stop = ahci_port_stop, |
549 | @@ -441,8 +449,10 @@ static struct pci_driver ahci_pci_driver = { |
550 | .name = DRV_NAME, |
551 | .id_table = ahci_pci_tbl, |
552 | .probe = ahci_init_one, |
553 | +#ifdef CONFIG_PM |
554 | .suspend = ahci_pci_device_suspend, |
555 | .resume = ahci_pci_device_resume, |
556 | +#endif |
557 | .remove = ahci_remove_one, |
558 | }; |
559 | |
560 | @@ -587,6 +597,7 @@ static void ahci_power_up(void __iomem *port_mmio, u32 cap) |
561 | writel(cmd | PORT_CMD_ICC_ACTIVE, port_mmio + PORT_CMD); |
562 | } |
563 | |
564 | +#ifdef CONFIG_PM |
565 | static void ahci_power_down(void __iomem *port_mmio, u32 cap) |
566 | { |
567 | u32 cmd, scontrol; |
568 | @@ -604,6 +615,7 @@ static void ahci_power_down(void __iomem *port_mmio, u32 cap) |
569 | cmd &= ~PORT_CMD_SPIN_UP; |
570 | writel(cmd, port_mmio + PORT_CMD); |
571 | } |
572 | +#endif |
573 | |
574 | static void ahci_init_port(void __iomem *port_mmio, u32 cap, |
575 | dma_addr_t cmd_slot_dma, dma_addr_t rx_fis_dma) |
576 | @@ -1336,6 +1348,7 @@ static void ahci_post_internal_cmd(struct ata_queued_cmd *qc) |
577 | } |
578 | } |
579 | |
580 | +#ifdef CONFIG_PM |
581 | static int ahci_port_suspend(struct ata_port *ap, pm_message_t mesg) |
582 | { |
583 | struct ahci_host_priv *hpriv = ap->host->private_data; |
584 | @@ -1412,6 +1425,7 @@ static int ahci_pci_device_resume(struct pci_dev *pdev) |
585 | |
586 | return 0; |
587 | } |
588 | +#endif |
589 | |
590 | static int ahci_port_start(struct ata_port *ap) |
591 | { |
592 | diff --git a/drivers/ata/ata_generic.c b/drivers/ata/ata_generic.c |
593 | index 24af560..91ccc20 100644 |
594 | --- a/drivers/ata/ata_generic.c |
595 | +++ b/drivers/ata/ata_generic.c |
596 | @@ -119,8 +119,10 @@ static struct scsi_host_template generic_sht = { |
597 | .slave_configure = ata_scsi_slave_config, |
598 | .slave_destroy = ata_scsi_slave_destroy, |
599 | .bios_param = ata_std_bios_param, |
600 | +#ifdef CONFIG_PM |
601 | .resume = ata_scsi_device_resume, |
602 | .suspend = ata_scsi_device_suspend, |
603 | +#endif |
604 | }; |
605 | |
606 | static struct ata_port_operations generic_port_ops = { |
607 | @@ -230,8 +232,10 @@ static struct pci_driver ata_generic_pci_driver = { |
608 | .id_table = ata_generic, |
609 | .probe = ata_generic_init_one, |
610 | .remove = ata_pci_remove_one, |
611 | +#ifdef CONFIG_PM |
612 | .suspend = ata_pci_device_suspend, |
613 | .resume = ata_pci_device_resume, |
614 | +#endif |
615 | }; |
616 | |
617 | static int __init ata_generic_init(void) |
618 | diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c |
619 | index 47701b2..57c0db3 100644 |
620 | --- a/drivers/ata/ata_piix.c |
621 | +++ b/drivers/ata/ata_piix.c |
622 | @@ -255,8 +255,10 @@ static struct pci_driver piix_pci_driver = { |
623 | .id_table = piix_pci_tbl, |
624 | .probe = piix_init_one, |
625 | .remove = ata_pci_remove_one, |
626 | +#ifdef CONFIG_PM |
627 | .suspend = ata_pci_device_suspend, |
628 | .resume = ata_pci_device_resume, |
629 | +#endif |
630 | }; |
631 | |
632 | static struct scsi_host_template piix_sht = { |
633 | @@ -275,8 +277,10 @@ static struct scsi_host_template piix_sht = { |
634 | .slave_configure = ata_scsi_slave_config, |
635 | .slave_destroy = ata_scsi_slave_destroy, |
636 | .bios_param = ata_std_bios_param, |
637 | +#ifdef CONFIG_PM |
638 | .resume = ata_scsi_device_resume, |
639 | .suspend = ata_scsi_device_suspend, |
640 | +#endif |
641 | }; |
642 | |
643 | static const struct ata_port_operations piix_pata_ops = { |
644 | diff --git a/drivers/ata/pata_ali.c b/drivers/ata/pata_ali.c |
645 | index c5d61d1..765c932 100644 |
646 | --- a/drivers/ata/pata_ali.c |
647 | +++ b/drivers/ata/pata_ali.c |
648 | @@ -345,8 +345,10 @@ static struct scsi_host_template ali_sht = { |
649 | .slave_configure = ata_scsi_slave_config, |
650 | .slave_destroy = ata_scsi_slave_destroy, |
651 | .bios_param = ata_std_bios_param, |
652 | +#ifdef CONFIG_PM |
653 | .resume = ata_scsi_device_resume, |
654 | .suspend = ata_scsi_device_suspend, |
655 | +#endif |
656 | }; |
657 | |
658 | /* |
659 | @@ -667,11 +669,13 @@ static int ali_init_one(struct pci_dev *pdev, const struct pci_device_id *id) |
660 | return ata_pci_init_one(pdev, port_info, 2); |
661 | } |
662 | |
663 | +#ifdef CONFIG_PM |
664 | static int ali_reinit_one(struct pci_dev *pdev) |
665 | { |
666 | ali_init_chipset(pdev); |
667 | return ata_pci_device_resume(pdev); |
668 | } |
669 | +#endif |
670 | |
671 | static const struct pci_device_id ali[] = { |
672 | { PCI_VDEVICE(AL, PCI_DEVICE_ID_AL_M5228), }, |
673 | @@ -685,8 +689,10 @@ static struct pci_driver ali_pci_driver = { |
674 | .id_table = ali, |
675 | .probe = ali_init_one, |
676 | .remove = ata_pci_remove_one, |
677 | +#ifdef CONFIG_PM |
678 | .suspend = ata_pci_device_suspend, |
679 | .resume = ali_reinit_one, |
680 | +#endif |
681 | }; |
682 | |
683 | static int __init ali_init(void) |
684 | diff --git a/drivers/ata/pata_amd.c b/drivers/ata/pata_amd.c |
685 | index a6b3300..f7c493b 100644 |
686 | --- a/drivers/ata/pata_amd.c |
687 | +++ b/drivers/ata/pata_amd.c |
688 | @@ -128,7 +128,7 @@ static void timing_setup(struct ata_port *ap, struct ata_device *adev, int offse |
689 | |
690 | static int amd_pre_reset(struct ata_port *ap) |
691 | { |
692 | - static const u32 bitmask[2] = {0x03, 0xC0}; |
693 | + static const u32 bitmask[2] = {0x03, 0x0C}; |
694 | static const struct pci_bits amd_enable_bits[] = { |
695 | { 0x40, 1, 0x02, 0x02 }, |
696 | { 0x40, 1, 0x01, 0x01 } |
697 | @@ -247,7 +247,7 @@ static void amd133_set_dmamode(struct ata_port *ap, struct ata_device *adev) |
698 | */ |
699 | |
700 | static int nv_pre_reset(struct ata_port *ap) { |
701 | - static const u8 bitmask[2] = {0x03, 0xC0}; |
702 | + static const u8 bitmask[2] = {0x03, 0x0C}; |
703 | static const struct pci_bits nv_enable_bits[] = { |
704 | { 0x50, 1, 0x02, 0x02 }, |
705 | { 0x50, 1, 0x01, 0x01 } |
706 | @@ -334,8 +334,10 @@ static struct scsi_host_template amd_sht = { |
707 | .slave_configure = ata_scsi_slave_config, |
708 | .slave_destroy = ata_scsi_slave_destroy, |
709 | .bios_param = ata_std_bios_param, |
710 | +#ifdef CONFIG_PM |
711 | .resume = ata_scsi_device_resume, |
712 | .suspend = ata_scsi_device_suspend, |
713 | +#endif |
714 | }; |
715 | |
716 | static struct ata_port_operations amd33_port_ops = { |
717 | @@ -663,6 +665,7 @@ static int amd_init_one(struct pci_dev *pdev, const struct pci_device_id *id) |
718 | return ata_pci_init_one(pdev, port_info, 2); |
719 | } |
720 | |
721 | +#ifdef CONFIG_PM |
722 | static int amd_reinit_one(struct pci_dev *pdev) |
723 | { |
724 | if (pdev->vendor == PCI_VENDOR_ID_AMD) { |
725 | @@ -679,6 +682,7 @@ static int amd_reinit_one(struct pci_dev *pdev) |
726 | } |
727 | return ata_pci_device_resume(pdev); |
728 | } |
729 | +#endif |
730 | |
731 | static const struct pci_device_id amd[] = { |
732 | { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_COBRA_7401), 0 }, |
733 | @@ -708,8 +712,10 @@ static struct pci_driver amd_pci_driver = { |
734 | .id_table = amd, |
735 | .probe = amd_init_one, |
736 | .remove = ata_pci_remove_one, |
737 | +#ifdef CONFIG_PM |
738 | .suspend = ata_pci_device_suspend, |
739 | .resume = amd_reinit_one, |
740 | +#endif |
741 | }; |
742 | |
743 | static int __init amd_init(void) |
744 | diff --git a/drivers/ata/pata_atiixp.c b/drivers/ata/pata_atiixp.c |
745 | index 504e1db..b50ebb6 100644 |
746 | --- a/drivers/ata/pata_atiixp.c |
747 | +++ b/drivers/ata/pata_atiixp.c |
748 | @@ -224,8 +224,10 @@ static struct scsi_host_template atiixp_sht = { |
749 | .slave_configure = ata_scsi_slave_config, |
750 | .slave_destroy = ata_scsi_slave_destroy, |
751 | .bios_param = ata_std_bios_param, |
752 | +#ifdef CONFIG_PM |
753 | .resume = ata_scsi_device_resume, |
754 | .suspend = ata_scsi_device_suspend, |
755 | +#endif |
756 | }; |
757 | |
758 | static struct ata_port_operations atiixp_port_ops = { |
759 | @@ -290,8 +292,10 @@ static struct pci_driver atiixp_pci_driver = { |
760 | .id_table = atiixp, |
761 | .probe = atiixp_init_one, |
762 | .remove = ata_pci_remove_one, |
763 | +#ifdef CONFIG_PM |
764 | .resume = ata_pci_device_resume, |
765 | .suspend = ata_pci_device_suspend, |
766 | +#endif |
767 | }; |
768 | |
769 | static int __init atiixp_init(void) |
770 | diff --git a/drivers/ata/pata_cmd64x.c b/drivers/ata/pata_cmd64x.c |
771 | index 449162c..90ff580 100644 |
772 | --- a/drivers/ata/pata_cmd64x.c |
773 | +++ b/drivers/ata/pata_cmd64x.c |
774 | @@ -285,8 +285,10 @@ static struct scsi_host_template cmd64x_sht = { |
775 | .slave_configure = ata_scsi_slave_config, |
776 | .slave_destroy = ata_scsi_slave_destroy, |
777 | .bios_param = ata_std_bios_param, |
778 | +#ifdef CONFIG_PM |
779 | .resume = ata_scsi_device_resume, |
780 | .suspend = ata_scsi_device_suspend, |
781 | +#endif |
782 | }; |
783 | |
784 | static struct ata_port_operations cmd64x_port_ops = { |
785 | @@ -479,6 +481,7 @@ static int cmd64x_init_one(struct pci_dev *pdev, const struct pci_device_id *id) |
786 | return ata_pci_init_one(pdev, port_info, 2); |
787 | } |
788 | |
789 | +#ifdef CONFIG_PM |
790 | static int cmd64x_reinit_one(struct pci_dev *pdev) |
791 | { |
792 | u8 mrdmode; |
793 | @@ -492,6 +495,7 @@ static int cmd64x_reinit_one(struct pci_dev *pdev) |
794 | #endif |
795 | return ata_pci_device_resume(pdev); |
796 | } |
797 | +#endif |
798 | |
799 | static const struct pci_device_id cmd64x[] = { |
800 | { PCI_VDEVICE(CMD, PCI_DEVICE_ID_CMD_643), 0 }, |
801 | @@ -507,8 +511,10 @@ static struct pci_driver cmd64x_pci_driver = { |
802 | .id_table = cmd64x, |
803 | .probe = cmd64x_init_one, |
804 | .remove = ata_pci_remove_one, |
805 | +#ifdef CONFIG_PM |
806 | .suspend = ata_pci_device_suspend, |
807 | .resume = cmd64x_reinit_one, |
808 | +#endif |
809 | }; |
810 | |
811 | static int __init cmd64x_init(void) |
812 | diff --git a/drivers/ata/pata_cs5520.c b/drivers/ata/pata_cs5520.c |
813 | index 9f165a8..383975c 100644 |
814 | --- a/drivers/ata/pata_cs5520.c |
815 | +++ b/drivers/ata/pata_cs5520.c |
816 | @@ -167,8 +167,10 @@ static struct scsi_host_template cs5520_sht = { |
817 | .slave_configure = ata_scsi_slave_config, |
818 | .slave_destroy = ata_scsi_slave_destroy, |
819 | .bios_param = ata_std_bios_param, |
820 | +#ifdef CONFIG_PM |
821 | .resume = ata_scsi_device_resume, |
822 | .suspend = ata_scsi_device_suspend, |
823 | +#endif |
824 | }; |
825 | |
826 | static struct ata_port_operations cs5520_port_ops = { |
827 | @@ -298,6 +300,7 @@ static void __devexit cs5520_remove_one(struct pci_dev *pdev) |
828 | dev_set_drvdata(dev, NULL); |
829 | } |
830 | |
831 | +#ifdef CONFIG_PM |
832 | /** |
833 | * cs5520_reinit_one - device resume |
834 | * @pdev: PCI device |
835 | @@ -314,6 +317,8 @@ static int cs5520_reinit_one(struct pci_dev *pdev) |
836 | pci_write_config_byte(pdev, 0x60, pcicfg | 0x40); |
837 | return ata_pci_device_resume(pdev); |
838 | } |
839 | +#endif |
840 | + |
841 | /* For now keep DMA off. We can set it for all but A rev CS5510 once the |
842 | core ATA code can handle it */ |
843 | |
844 | @@ -329,8 +334,10 @@ static struct pci_driver cs5520_pci_driver = { |
845 | .id_table = pata_cs5520, |
846 | .probe = cs5520_init_one, |
847 | .remove = cs5520_remove_one, |
848 | +#ifdef CONFIG_PM |
849 | .suspend = ata_pci_device_suspend, |
850 | .resume = cs5520_reinit_one, |
851 | +#endif |
852 | }; |
853 | |
854 | static int __init cs5520_init(void) |
855 | diff --git a/drivers/ata/pata_cs5530.c b/drivers/ata/pata_cs5530.c |
856 | index b1ca207..fddef81 100644 |
857 | --- a/drivers/ata/pata_cs5530.c |
858 | +++ b/drivers/ata/pata_cs5530.c |
859 | @@ -181,8 +181,10 @@ static struct scsi_host_template cs5530_sht = { |
860 | .slave_configure = ata_scsi_slave_config, |
861 | .slave_destroy = ata_scsi_slave_destroy, |
862 | .bios_param = ata_std_bios_param, |
863 | +#ifdef CONFIG_PM |
864 | .resume = ata_scsi_device_resume, |
865 | .suspend = ata_scsi_device_suspend, |
866 | +#endif |
867 | }; |
868 | |
869 | static struct ata_port_operations cs5530_port_ops = { |
870 | @@ -369,6 +371,7 @@ static int cs5530_init_one(struct pci_dev *pdev, const struct pci_device_id *id) |
871 | return ata_pci_init_one(pdev, port_info, 2); |
872 | } |
873 | |
874 | +#ifdef CONFIG_PM |
875 | static int cs5530_reinit_one(struct pci_dev *pdev) |
876 | { |
877 | /* If we fail on resume we are doomed */ |
878 | @@ -376,6 +379,7 @@ static int cs5530_reinit_one(struct pci_dev *pdev) |
879 | BUG(); |
880 | return ata_pci_device_resume(pdev); |
881 | } |
882 | +#endif |
883 | |
884 | static const struct pci_device_id cs5530[] = { |
885 | { PCI_VDEVICE(CYRIX, PCI_DEVICE_ID_CYRIX_5530_IDE), }, |
886 | @@ -388,8 +392,10 @@ static struct pci_driver cs5530_pci_driver = { |
887 | .id_table = cs5530, |
888 | .probe = cs5530_init_one, |
889 | .remove = ata_pci_remove_one, |
890 | +#ifdef CONFIG_PM |
891 | .suspend = ata_pci_device_suspend, |
892 | .resume = cs5530_reinit_one, |
893 | +#endif |
894 | }; |
895 | |
896 | static int __init cs5530_init(void) |
897 | diff --git a/drivers/ata/pata_cs5535.c b/drivers/ata/pata_cs5535.c |
898 | index e3efec4..80d0ed1 100644 |
899 | --- a/drivers/ata/pata_cs5535.c |
900 | +++ b/drivers/ata/pata_cs5535.c |
901 | @@ -185,8 +185,10 @@ static struct scsi_host_template cs5535_sht = { |
902 | .slave_configure = ata_scsi_slave_config, |
903 | .slave_destroy = ata_scsi_slave_destroy, |
904 | .bios_param = ata_std_bios_param, |
905 | +#ifdef CONFIG_PM |
906 | .resume = ata_scsi_device_resume, |
907 | .suspend = ata_scsi_device_suspend, |
908 | +#endif |
909 | }; |
910 | |
911 | static struct ata_port_operations cs5535_port_ops = { |
912 | @@ -270,8 +272,10 @@ static struct pci_driver cs5535_pci_driver = { |
913 | .id_table = cs5535, |
914 | .probe = cs5535_init_one, |
915 | .remove = ata_pci_remove_one, |
916 | +#ifdef CONFIG_PM |
917 | .suspend = ata_pci_device_suspend, |
918 | .resume = ata_pci_device_resume, |
919 | +#endif |
920 | }; |
921 | |
922 | static int __init cs5535_init(void) |
923 | diff --git a/drivers/ata/pata_cypress.c b/drivers/ata/pata_cypress.c |
924 | index e2a9569..0da1715 100644 |
925 | --- a/drivers/ata/pata_cypress.c |
926 | +++ b/drivers/ata/pata_cypress.c |
927 | @@ -136,8 +136,10 @@ static struct scsi_host_template cy82c693_sht = { |
928 | .slave_configure = ata_scsi_slave_config, |
929 | .slave_destroy = ata_scsi_slave_destroy, |
930 | .bios_param = ata_std_bios_param, |
931 | +#ifdef CONFIG_PM |
932 | .resume = ata_scsi_device_resume, |
933 | .suspend = ata_scsi_device_suspend, |
934 | +#endif |
935 | }; |
936 | |
937 | static struct ata_port_operations cy82c693_port_ops = { |
938 | @@ -206,8 +208,10 @@ static struct pci_driver cy82c693_pci_driver = { |
939 | .id_table = cy82c693, |
940 | .probe = cy82c693_init_one, |
941 | .remove = ata_pci_remove_one, |
942 | +#ifdef CONFIG_PM |
943 | .suspend = ata_pci_device_suspend, |
944 | .resume = ata_pci_device_resume, |
945 | +#endif |
946 | }; |
947 | |
948 | static int __init cy82c693_init(void) |
949 | diff --git a/drivers/ata/pata_efar.c b/drivers/ata/pata_efar.c |
950 | index edf8a63..4d4575e 100644 |
951 | --- a/drivers/ata/pata_efar.c |
952 | +++ b/drivers/ata/pata_efar.c |
953 | @@ -234,8 +234,10 @@ static struct scsi_host_template efar_sht = { |
954 | .slave_configure = ata_scsi_slave_config, |
955 | .slave_destroy = ata_scsi_slave_destroy, |
956 | .bios_param = ata_std_bios_param, |
957 | +#ifdef CONFIG_PM |
958 | .resume = ata_scsi_device_resume, |
959 | .suspend = ata_scsi_device_suspend, |
960 | +#endif |
961 | }; |
962 | |
963 | static const struct ata_port_operations efar_ops = { |
964 | @@ -317,8 +319,10 @@ static struct pci_driver efar_pci_driver = { |
965 | .id_table = efar_pci_tbl, |
966 | .probe = efar_init_one, |
967 | .remove = ata_pci_remove_one, |
968 | +#ifdef CONFIG_PM |
969 | .suspend = ata_pci_device_suspend, |
970 | .resume = ata_pci_device_resume, |
971 | +#endif |
972 | }; |
973 | |
974 | static int __init efar_init(void) |
975 | diff --git a/drivers/ata/pata_hpt366.c b/drivers/ata/pata_hpt366.c |
976 | index 2663599..878696a 100644 |
977 | --- a/drivers/ata/pata_hpt366.c |
978 | +++ b/drivers/ata/pata_hpt366.c |
979 | @@ -338,8 +338,10 @@ static struct scsi_host_template hpt36x_sht = { |
980 | .slave_configure = ata_scsi_slave_config, |
981 | .slave_destroy = ata_scsi_slave_destroy, |
982 | .bios_param = ata_std_bios_param, |
983 | +#ifdef CONFIG_PM |
984 | .resume = ata_scsi_device_resume, |
985 | .suspend = ata_scsi_device_suspend, |
986 | +#endif |
987 | }; |
988 | |
989 | /* |
990 | @@ -467,12 +469,13 @@ static int hpt36x_init_one(struct pci_dev *dev, const struct pci_device_id *id) |
991 | return ata_pci_init_one(dev, port_info, 2); |
992 | } |
993 | |
994 | +#ifdef CONFIG_PM |
995 | static int hpt36x_reinit_one(struct pci_dev *dev) |
996 | { |
997 | hpt36x_init_chipset(dev); |
998 | return ata_pci_device_resume(dev); |
999 | } |
1000 | - |
1001 | +#endif |
1002 | |
1003 | static const struct pci_device_id hpt36x[] = { |
1004 | { PCI_VDEVICE(TTI, PCI_DEVICE_ID_TTI_HPT366), }, |
1005 | @@ -484,8 +487,10 @@ static struct pci_driver hpt36x_pci_driver = { |
1006 | .id_table = hpt36x, |
1007 | .probe = hpt36x_init_one, |
1008 | .remove = ata_pci_remove_one, |
1009 | +#ifdef CONFIG_PM |
1010 | .suspend = ata_pci_device_suspend, |
1011 | .resume = hpt36x_reinit_one, |
1012 | +#endif |
1013 | }; |
1014 | |
1015 | static int __init hpt36x_init(void) |
1016 | diff --git a/drivers/ata/pata_hpt3x3.c b/drivers/ata/pata_hpt3x3.c |
1017 | index 5f1d385..f99c77c 100644 |
1018 | --- a/drivers/ata/pata_hpt3x3.c |
1019 | +++ b/drivers/ata/pata_hpt3x3.c |
1020 | @@ -119,8 +119,10 @@ static struct scsi_host_template hpt3x3_sht = { |
1021 | .slave_configure = ata_scsi_slave_config, |
1022 | .slave_destroy = ata_scsi_slave_destroy, |
1023 | .bios_param = ata_std_bios_param, |
1024 | +#ifdef CONFIG_PM |
1025 | .resume = ata_scsi_device_resume, |
1026 | .suspend = ata_scsi_device_suspend, |
1027 | +#endif |
1028 | }; |
1029 | |
1030 | static struct ata_port_operations hpt3x3_port_ops = { |
1031 | @@ -206,11 +208,13 @@ static int hpt3x3_init_one(struct pci_dev *dev, const struct pci_device_id *id) |
1032 | return ata_pci_init_one(dev, port_info, 2); |
1033 | } |
1034 | |
1035 | +#ifdef CONFIG_PM |
1036 | static int hpt3x3_reinit_one(struct pci_dev *dev) |
1037 | { |
1038 | hpt3x3_init_chipset(dev); |
1039 | return ata_pci_device_resume(dev); |
1040 | } |
1041 | +#endif |
1042 | |
1043 | static const struct pci_device_id hpt3x3[] = { |
1044 | { PCI_VDEVICE(TTI, PCI_DEVICE_ID_TTI_HPT343), }, |
1045 | @@ -223,8 +227,10 @@ static struct pci_driver hpt3x3_pci_driver = { |
1046 | .id_table = hpt3x3, |
1047 | .probe = hpt3x3_init_one, |
1048 | .remove = ata_pci_remove_one, |
1049 | +#ifdef CONFIG_PM |
1050 | .suspend = ata_pci_device_suspend, |
1051 | .resume = hpt3x3_reinit_one, |
1052 | +#endif |
1053 | }; |
1054 | |
1055 | static int __init hpt3x3_init(void) |
1056 | diff --git a/drivers/ata/pata_it821x.c b/drivers/ata/pata_it821x.c |
1057 | index e8afd48..7958177 100644 |
1058 | --- a/drivers/ata/pata_it821x.c |
1059 | +++ b/drivers/ata/pata_it821x.c |
1060 | @@ -676,8 +676,10 @@ static struct scsi_host_template it821x_sht = { |
1061 | .slave_configure = ata_scsi_slave_config, |
1062 | .slave_destroy = ata_scsi_slave_destroy, |
1063 | .bios_param = ata_std_bios_param, |
1064 | +#ifdef CONFIG_PM |
1065 | .resume = ata_scsi_device_resume, |
1066 | .suspend = ata_scsi_device_suspend, |
1067 | +#endif |
1068 | }; |
1069 | |
1070 | static struct ata_port_operations it821x_smart_port_ops = { |
1071 | @@ -810,6 +812,7 @@ static int it821x_init_one(struct pci_dev *pdev, const struct pci_device_id *id) |
1072 | return ata_pci_init_one(pdev, port_info, 2); |
1073 | } |
1074 | |
1075 | +#ifdef CONFIG_PM |
1076 | static int it821x_reinit_one(struct pci_dev *pdev) |
1077 | { |
1078 | /* Resume - turn raid back off if need be */ |
1079 | @@ -817,6 +820,7 @@ static int it821x_reinit_one(struct pci_dev *pdev) |
1080 | it821x_disable_raid(pdev); |
1081 | return ata_pci_device_resume(pdev); |
1082 | } |
1083 | +#endif |
1084 | |
1085 | static const struct pci_device_id it821x[] = { |
1086 | { PCI_VDEVICE(ITE, PCI_DEVICE_ID_ITE_8211), }, |
1087 | @@ -830,8 +834,10 @@ static struct pci_driver it821x_pci_driver = { |
1088 | .id_table = it821x, |
1089 | .probe = it821x_init_one, |
1090 | .remove = ata_pci_remove_one, |
1091 | +#ifdef CONFIG_PM |
1092 | .suspend = ata_pci_device_suspend, |
1093 | .resume = it821x_reinit_one, |
1094 | +#endif |
1095 | }; |
1096 | |
1097 | static int __init it821x_init(void) |
1098 | diff --git a/drivers/ata/pata_jmicron.c b/drivers/ata/pata_jmicron.c |
1099 | index d50264a..9e4558a 100644 |
1100 | --- a/drivers/ata/pata_jmicron.c |
1101 | +++ b/drivers/ata/pata_jmicron.c |
1102 | @@ -137,6 +137,10 @@ static struct scsi_host_template jmicron_sht = { |
1103 | .slave_destroy = ata_scsi_slave_destroy, |
1104 | /* Use standard CHS mapping rules */ |
1105 | .bios_param = ata_std_bios_param, |
1106 | +#ifdef CONFIG_PM |
1107 | + .suspend = ata_scsi_device_suspend, |
1108 | + .resume = ata_scsi_device_resume, |
1109 | +#endif |
1110 | }; |
1111 | |
1112 | static const struct ata_port_operations jmicron_ops = { |
1113 | @@ -218,6 +222,7 @@ static int jmicron_init_one (struct pci_dev *pdev, const struct pci_device_id *i |
1114 | return ata_pci_init_one(pdev, port_info, 2); |
1115 | } |
1116 | |
1117 | +#ifdef CONFIG_PM |
1118 | static int jmicron_reinit_one(struct pci_dev *pdev) |
1119 | { |
1120 | u32 reg; |
1121 | @@ -238,6 +243,7 @@ static int jmicron_reinit_one(struct pci_dev *pdev) |
1122 | } |
1123 | return ata_pci_device_resume(pdev); |
1124 | } |
1125 | +#endif |
1126 | |
1127 | static const struct pci_device_id jmicron_pci_tbl[] = { |
1128 | { PCI_VDEVICE(JMICRON, PCI_DEVICE_ID_JMICRON_JMB361), 361}, |
1129 | @@ -254,8 +260,10 @@ static struct pci_driver jmicron_pci_driver = { |
1130 | .id_table = jmicron_pci_tbl, |
1131 | .probe = jmicron_init_one, |
1132 | .remove = ata_pci_remove_one, |
1133 | +#ifdef CONFIG_PM |
1134 | .suspend = ata_pci_device_suspend, |
1135 | .resume = jmicron_reinit_one, |
1136 | +#endif |
1137 | }; |
1138 | |
1139 | static int __init jmicron_init(void) |
1140 | diff --git a/drivers/ata/pata_marvell.c b/drivers/ata/pata_marvell.c |
1141 | index 1c810ea..3d76e06 100644 |
1142 | --- a/drivers/ata/pata_marvell.c |
1143 | +++ b/drivers/ata/pata_marvell.c |
1144 | @@ -103,8 +103,10 @@ static struct scsi_host_template marvell_sht = { |
1145 | .slave_destroy = ata_scsi_slave_destroy, |
1146 | /* Use standard CHS mapping rules */ |
1147 | .bios_param = ata_std_bios_param, |
1148 | +#ifdef CONFIG_PM |
1149 | .resume = ata_scsi_device_resume, |
1150 | .suspend = ata_scsi_device_suspend, |
1151 | +#endif |
1152 | }; |
1153 | |
1154 | static const struct ata_port_operations marvell_ops = { |
1155 | @@ -199,8 +201,10 @@ static struct pci_driver marvell_pci_driver = { |
1156 | .id_table = marvell_pci_tbl, |
1157 | .probe = marvell_init_one, |
1158 | .remove = ata_pci_remove_one, |
1159 | +#ifdef CONFIG_PM |
1160 | .suspend = ata_pci_device_suspend, |
1161 | .resume = ata_pci_device_resume, |
1162 | +#endif |
1163 | }; |
1164 | |
1165 | static int __init marvell_init(void) |
1166 | diff --git a/drivers/ata/pata_mpiix.c b/drivers/ata/pata_mpiix.c |
1167 | index 4ccca93..c707320 100644 |
1168 | --- a/drivers/ata/pata_mpiix.c |
1169 | +++ b/drivers/ata/pata_mpiix.c |
1170 | @@ -167,8 +167,10 @@ static struct scsi_host_template mpiix_sht = { |
1171 | .slave_configure = ata_scsi_slave_config, |
1172 | .slave_destroy = ata_scsi_slave_destroy, |
1173 | .bios_param = ata_std_bios_param, |
1174 | +#ifdef CONFIG_PM |
1175 | .resume = ata_scsi_device_resume, |
1176 | .suspend = ata_scsi_device_suspend, |
1177 | +#endif |
1178 | }; |
1179 | |
1180 | static struct ata_port_operations mpiix_port_ops = { |
1181 | @@ -287,8 +289,10 @@ static struct pci_driver mpiix_pci_driver = { |
1182 | .id_table = mpiix, |
1183 | .probe = mpiix_init_one, |
1184 | .remove = mpiix_remove_one, |
1185 | +#ifdef CONFIG_PM |
1186 | .suspend = ata_pci_device_suspend, |
1187 | .resume = ata_pci_device_resume, |
1188 | +#endif |
1189 | }; |
1190 | |
1191 | static int __init mpiix_init(void) |
1192 | diff --git a/drivers/ata/pata_netcell.c b/drivers/ata/pata_netcell.c |
1193 | index cf7fe03..d0e7ac3 100644 |
1194 | --- a/drivers/ata/pata_netcell.c |
1195 | +++ b/drivers/ata/pata_netcell.c |
1196 | @@ -63,8 +63,10 @@ static struct scsi_host_template netcell_sht = { |
1197 | .slave_destroy = ata_scsi_slave_destroy, |
1198 | /* Use standard CHS mapping rules */ |
1199 | .bios_param = ata_std_bios_param, |
1200 | +#ifdef CONFIG_PM |
1201 | .resume = ata_scsi_device_resume, |
1202 | .suspend = ata_scsi_device_suspend, |
1203 | +#endif |
1204 | }; |
1205 | |
1206 | static const struct ata_port_operations netcell_ops = { |
1207 | @@ -153,8 +155,10 @@ static struct pci_driver netcell_pci_driver = { |
1208 | .id_table = netcell_pci_tbl, |
1209 | .probe = netcell_init_one, |
1210 | .remove = ata_pci_remove_one, |
1211 | +#ifdef CONFIG_PM |
1212 | .suspend = ata_pci_device_suspend, |
1213 | .resume = ata_pci_device_resume, |
1214 | +#endif |
1215 | }; |
1216 | |
1217 | static int __init netcell_init(void) |
1218 | diff --git a/drivers/ata/pata_ns87410.c b/drivers/ata/pata_ns87410.c |
1219 | index c3032eb..a4d4eb6 100644 |
1220 | --- a/drivers/ata/pata_ns87410.c |
1221 | +++ b/drivers/ata/pata_ns87410.c |
1222 | @@ -157,8 +157,10 @@ static struct scsi_host_template ns87410_sht = { |
1223 | .slave_configure = ata_scsi_slave_config, |
1224 | .slave_destroy = ata_scsi_slave_destroy, |
1225 | .bios_param = ata_std_bios_param, |
1226 | +#ifdef CONFIG_PM |
1227 | .resume = ata_scsi_device_resume, |
1228 | .suspend = ata_scsi_device_suspend, |
1229 | +#endif |
1230 | }; |
1231 | |
1232 | static struct ata_port_operations ns87410_port_ops = { |
1233 | @@ -212,8 +214,10 @@ static struct pci_driver ns87410_pci_driver = { |
1234 | .id_table = ns87410, |
1235 | .probe = ns87410_init_one, |
1236 | .remove = ata_pci_remove_one, |
1237 | +#ifdef CONFIG_PM |
1238 | .suspend = ata_pci_device_suspend, |
1239 | .resume = ata_pci_device_resume, |
1240 | +#endif |
1241 | }; |
1242 | |
1243 | static int __init ns87410_init(void) |
1244 | diff --git a/drivers/ata/pata_oldpiix.c b/drivers/ata/pata_oldpiix.c |
1245 | index 10ac3cc..ad84c51 100644 |
1246 | --- a/drivers/ata/pata_oldpiix.c |
1247 | +++ b/drivers/ata/pata_oldpiix.c |
1248 | @@ -232,8 +232,10 @@ static struct scsi_host_template oldpiix_sht = { |
1249 | .slave_configure = ata_scsi_slave_config, |
1250 | .slave_destroy = ata_scsi_slave_destroy, |
1251 | .bios_param = ata_std_bios_param, |
1252 | +#ifdef CONFIG_PM |
1253 | .resume = ata_scsi_device_resume, |
1254 | .suspend = ata_scsi_device_suspend, |
1255 | +#endif |
1256 | }; |
1257 | |
1258 | static const struct ata_port_operations oldpiix_pata_ops = { |
1259 | @@ -315,8 +317,10 @@ static struct pci_driver oldpiix_pci_driver = { |
1260 | .id_table = oldpiix_pci_tbl, |
1261 | .probe = oldpiix_init_one, |
1262 | .remove = ata_pci_remove_one, |
1263 | +#ifdef CONFIG_PM |
1264 | .suspend = ata_pci_device_suspend, |
1265 | .resume = ata_pci_device_resume, |
1266 | +#endif |
1267 | }; |
1268 | |
1269 | static int __init oldpiix_init(void) |
1270 | diff --git a/drivers/ata/pata_opti.c b/drivers/ata/pata_opti.c |
1271 | index c2988b0..0a023b8 100644 |
1272 | --- a/drivers/ata/pata_opti.c |
1273 | +++ b/drivers/ata/pata_opti.c |
1274 | @@ -179,8 +179,10 @@ static struct scsi_host_template opti_sht = { |
1275 | .slave_configure = ata_scsi_slave_config, |
1276 | .slave_destroy = ata_scsi_slave_destroy, |
1277 | .bios_param = ata_std_bios_param, |
1278 | +#ifdef CONFIG_PM |
1279 | .resume = ata_scsi_device_resume, |
1280 | .suspend = ata_scsi_device_suspend, |
1281 | +#endif |
1282 | }; |
1283 | |
1284 | static struct ata_port_operations opti_port_ops = { |
1285 | @@ -244,8 +246,10 @@ static struct pci_driver opti_pci_driver = { |
1286 | .id_table = opti, |
1287 | .probe = opti_init_one, |
1288 | .remove = ata_pci_remove_one, |
1289 | +#ifdef CONFIG_PM |
1290 | .suspend = ata_pci_device_suspend, |
1291 | .resume = ata_pci_device_resume, |
1292 | +#endif |
1293 | }; |
1294 | |
1295 | static int __init opti_init(void) |
1296 | diff --git a/drivers/ata/pata_optidma.c b/drivers/ata/pata_optidma.c |
1297 | index 80d111c..6797ffa 100644 |
1298 | --- a/drivers/ata/pata_optidma.c |
1299 | +++ b/drivers/ata/pata_optidma.c |
1300 | @@ -360,8 +360,10 @@ static struct scsi_host_template optidma_sht = { |
1301 | .slave_configure = ata_scsi_slave_config, |
1302 | .slave_destroy = ata_scsi_slave_destroy, |
1303 | .bios_param = ata_std_bios_param, |
1304 | +#ifdef CONFIG_PM |
1305 | .resume = ata_scsi_device_resume, |
1306 | .suspend = ata_scsi_device_suspend, |
1307 | +#endif |
1308 | }; |
1309 | |
1310 | static struct ata_port_operations optidma_port_ops = { |
1311 | @@ -524,8 +526,10 @@ static struct pci_driver optidma_pci_driver = { |
1312 | .id_table = optidma, |
1313 | .probe = optidma_init_one, |
1314 | .remove = ata_pci_remove_one, |
1315 | +#ifdef CONFIG_PM |
1316 | .suspend = ata_pci_device_suspend, |
1317 | .resume = ata_pci_device_resume, |
1318 | +#endif |
1319 | }; |
1320 | |
1321 | static int __init optidma_init(void) |
1322 | diff --git a/drivers/ata/pata_pdc202xx_old.c b/drivers/ata/pata_pdc202xx_old.c |
1323 | index ad691b9..f18b67e 100644 |
1324 | --- a/drivers/ata/pata_pdc202xx_old.c |
1325 | +++ b/drivers/ata/pata_pdc202xx_old.c |
1326 | @@ -270,8 +270,10 @@ static struct scsi_host_template pdc202xx_sht = { |
1327 | .slave_configure = ata_scsi_slave_config, |
1328 | .slave_destroy = ata_scsi_slave_destroy, |
1329 | .bios_param = ata_std_bios_param, |
1330 | +#ifdef CONFIG_PM |
1331 | .resume = ata_scsi_device_resume, |
1332 | .suspend = ata_scsi_device_suspend, |
1333 | +#endif |
1334 | }; |
1335 | |
1336 | static struct ata_port_operations pdc2024x_port_ops = { |
1337 | @@ -402,8 +404,10 @@ static struct pci_driver pdc202xx_pci_driver = { |
1338 | .id_table = pdc202xx, |
1339 | .probe = pdc202xx_init_one, |
1340 | .remove = ata_pci_remove_one, |
1341 | +#ifdef CONFIG_PM |
1342 | .suspend = ata_pci_device_suspend, |
1343 | .resume = ata_pci_device_resume, |
1344 | +#endif |
1345 | }; |
1346 | |
1347 | static int __init pdc202xx_init(void) |
1348 | diff --git a/drivers/ata/pata_radisys.c b/drivers/ata/pata_radisys.c |
1349 | index 065541d..45c5d50 100644 |
1350 | --- a/drivers/ata/pata_radisys.c |
1351 | +++ b/drivers/ata/pata_radisys.c |
1352 | @@ -228,8 +228,10 @@ static struct scsi_host_template radisys_sht = { |
1353 | .slave_configure = ata_scsi_slave_config, |
1354 | .slave_destroy = ata_scsi_slave_destroy, |
1355 | .bios_param = ata_std_bios_param, |
1356 | +#ifdef CONFIG_PM |
1357 | .resume = ata_scsi_device_resume, |
1358 | .suspend = ata_scsi_device_suspend, |
1359 | +#endif |
1360 | }; |
1361 | |
1362 | static const struct ata_port_operations radisys_pata_ops = { |
1363 | @@ -312,8 +314,10 @@ static struct pci_driver radisys_pci_driver = { |
1364 | .id_table = radisys_pci_tbl, |
1365 | .probe = radisys_init_one, |
1366 | .remove = ata_pci_remove_one, |
1367 | +#ifdef CONFIG_PM |
1368 | .suspend = ata_pci_device_suspend, |
1369 | .resume = ata_pci_device_resume, |
1370 | +#endif |
1371 | }; |
1372 | |
1373 | static int __init radisys_init(void) |
1374 | diff --git a/drivers/ata/pata_rz1000.c b/drivers/ata/pata_rz1000.c |
1375 | index cec0729..8fcddfb 100644 |
1376 | --- a/drivers/ata/pata_rz1000.c |
1377 | +++ b/drivers/ata/pata_rz1000.c |
1378 | @@ -93,8 +93,10 @@ static struct scsi_host_template rz1000_sht = { |
1379 | .slave_configure = ata_scsi_slave_config, |
1380 | .slave_destroy = ata_scsi_slave_destroy, |
1381 | .bios_param = ata_std_bios_param, |
1382 | +#ifdef CONFIG_PM |
1383 | .resume = ata_scsi_device_resume, |
1384 | .suspend = ata_scsi_device_suspend, |
1385 | +#endif |
1386 | }; |
1387 | |
1388 | static struct ata_port_operations rz1000_port_ops = { |
1389 | @@ -177,6 +179,7 @@ static int rz1000_init_one (struct pci_dev *pdev, const struct pci_device_id *en |
1390 | return -ENODEV; |
1391 | } |
1392 | |
1393 | +#ifdef CONFIG_PM |
1394 | static int rz1000_reinit_one(struct pci_dev *pdev) |
1395 | { |
1396 | /* If this fails on resume (which is a "cant happen" case), we |
1397 | @@ -185,6 +188,7 @@ static int rz1000_reinit_one(struct pci_dev *pdev) |
1398 | panic("rz1000 fifo"); |
1399 | return ata_pci_device_resume(pdev); |
1400 | } |
1401 | +#endif |
1402 | |
1403 | static const struct pci_device_id pata_rz1000[] = { |
1404 | { PCI_VDEVICE(PCTECH, PCI_DEVICE_ID_PCTECH_RZ1000), }, |
1405 | @@ -198,8 +202,10 @@ static struct pci_driver rz1000_pci_driver = { |
1406 | .id_table = pata_rz1000, |
1407 | .probe = rz1000_init_one, |
1408 | .remove = ata_pci_remove_one, |
1409 | +#ifdef CONFIG_PM |
1410 | .suspend = ata_pci_device_suspend, |
1411 | .resume = rz1000_reinit_one, |
1412 | +#endif |
1413 | }; |
1414 | |
1415 | static int __init rz1000_init(void) |
1416 | diff --git a/drivers/ata/pata_sc1200.c b/drivers/ata/pata_sc1200.c |
1417 | index a3b35bc..19328a8 100644 |
1418 | --- a/drivers/ata/pata_sc1200.c |
1419 | +++ b/drivers/ata/pata_sc1200.c |
1420 | @@ -194,8 +194,10 @@ static struct scsi_host_template sc1200_sht = { |
1421 | .slave_configure = ata_scsi_slave_config, |
1422 | .slave_destroy = ata_scsi_slave_destroy, |
1423 | .bios_param = ata_std_bios_param, |
1424 | +#ifdef CONFIG_PM |
1425 | .resume = ata_scsi_device_resume, |
1426 | .suspend = ata_scsi_device_suspend, |
1427 | +#endif |
1428 | }; |
1429 | |
1430 | static struct ata_port_operations sc1200_port_ops = { |
1431 | @@ -266,8 +268,10 @@ static struct pci_driver sc1200_pci_driver = { |
1432 | .id_table = sc1200, |
1433 | .probe = sc1200_init_one, |
1434 | .remove = ata_pci_remove_one, |
1435 | +#ifdef CONFIG_PM |
1436 | .suspend = ata_pci_device_suspend, |
1437 | .resume = ata_pci_device_resume, |
1438 | +#endif |
1439 | }; |
1440 | |
1441 | static int __init sc1200_init(void) |
1442 | diff --git a/drivers/ata/pata_serverworks.c b/drivers/ata/pata_serverworks.c |
1443 | index f02b6a3..95f5202 100644 |
1444 | --- a/drivers/ata/pata_serverworks.c |
1445 | +++ b/drivers/ata/pata_serverworks.c |
1446 | @@ -326,8 +326,10 @@ static struct scsi_host_template serverworks_sht = { |
1447 | .slave_configure = ata_scsi_slave_config, |
1448 | .slave_destroy = ata_scsi_slave_destroy, |
1449 | .bios_param = ata_std_bios_param, |
1450 | +#ifdef CONFIG_PM |
1451 | .resume = ata_scsi_device_resume, |
1452 | .suspend = ata_scsi_device_suspend, |
1453 | +#endif |
1454 | }; |
1455 | |
1456 | static struct ata_port_operations serverworks_osb4_port_ops = { |
1457 | @@ -555,6 +557,7 @@ static int serverworks_init_one(struct pci_dev *pdev, const struct pci_device_id |
1458 | return ata_pci_init_one(pdev, port_info, ports); |
1459 | } |
1460 | |
1461 | +#ifdef CONFIG_PM |
1462 | static int serverworks_reinit_one(struct pci_dev *pdev) |
1463 | { |
1464 | /* Force master latency timer to 64 PCI clocks */ |
1465 | @@ -578,6 +581,7 @@ static int serverworks_reinit_one(struct pci_dev *pdev) |
1466 | } |
1467 | return ata_pci_device_resume(pdev); |
1468 | } |
1469 | +#endif |
1470 | |
1471 | static const struct pci_device_id serverworks[] = { |
1472 | { PCI_VDEVICE(SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_OSB4IDE), 0}, |
1473 | @@ -594,8 +598,10 @@ static struct pci_driver serverworks_pci_driver = { |
1474 | .id_table = serverworks, |
1475 | .probe = serverworks_init_one, |
1476 | .remove = ata_pci_remove_one, |
1477 | +#ifdef CONFIG_PM |
1478 | .suspend = ata_pci_device_suspend, |
1479 | .resume = serverworks_reinit_one, |
1480 | +#endif |
1481 | }; |
1482 | |
1483 | static int __init serverworks_init(void) |
1484 | diff --git a/drivers/ata/pata_sil680.c b/drivers/ata/pata_sil680.c |
1485 | index e8dfd8f..653fe34 100644 |
1486 | --- a/drivers/ata/pata_sil680.c |
1487 | +++ b/drivers/ata/pata_sil680.c |
1488 | @@ -226,6 +226,10 @@ static struct scsi_host_template sil680_sht = { |
1489 | .slave_configure = ata_scsi_slave_config, |
1490 | .slave_destroy = ata_scsi_slave_destroy, |
1491 | .bios_param = ata_std_bios_param, |
1492 | +#ifdef CONFIG_PM |
1493 | + .suspend = ata_scsi_device_suspend, |
1494 | + .resume = ata_scsi_device_resume, |
1495 | +#endif |
1496 | }; |
1497 | |
1498 | static struct ata_port_operations sil680_port_ops = { |
1499 | @@ -367,11 +371,13 @@ static int sil680_init_one(struct pci_dev *pdev, const struct pci_device_id *id) |
1500 | return ata_pci_init_one(pdev, port_info, 2); |
1501 | } |
1502 | |
1503 | +#ifdef CONFIG_PM |
1504 | static int sil680_reinit_one(struct pci_dev *pdev) |
1505 | { |
1506 | sil680_init_chip(pdev); |
1507 | return ata_pci_device_resume(pdev); |
1508 | } |
1509 | +#endif |
1510 | |
1511 | static const struct pci_device_id sil680[] = { |
1512 | { PCI_VDEVICE(CMD, PCI_DEVICE_ID_SII_680), }, |
1513 | @@ -384,8 +390,10 @@ static struct pci_driver sil680_pci_driver = { |
1514 | .id_table = sil680, |
1515 | .probe = sil680_init_one, |
1516 | .remove = ata_pci_remove_one, |
1517 | +#ifdef CONFIG_PM |
1518 | .suspend = ata_pci_device_suspend, |
1519 | .resume = sil680_reinit_one, |
1520 | +#endif |
1521 | }; |
1522 | |
1523 | static int __init sil680_init(void) |
1524 | diff --git a/drivers/ata/pata_sis.c b/drivers/ata/pata_sis.c |
1525 | index 916cedb..e1fdea6 100644 |
1526 | --- a/drivers/ata/pata_sis.c |
1527 | +++ b/drivers/ata/pata_sis.c |
1528 | @@ -546,8 +546,10 @@ static struct scsi_host_template sis_sht = { |
1529 | .slave_configure = ata_scsi_slave_config, |
1530 | .slave_destroy = ata_scsi_slave_destroy, |
1531 | .bios_param = ata_std_bios_param, |
1532 | +#ifdef CONFIG_PM |
1533 | .resume = ata_scsi_device_resume, |
1534 | .suspend = ata_scsi_device_suspend, |
1535 | +#endif |
1536 | }; |
1537 | |
1538 | static const struct ata_port_operations sis_133_ops = { |
1539 | @@ -1001,8 +1003,10 @@ static struct pci_driver sis_pci_driver = { |
1540 | .id_table = sis_pci_tbl, |
1541 | .probe = sis_init_one, |
1542 | .remove = ata_pci_remove_one, |
1543 | +#ifdef CONFIG_PM |
1544 | .suspend = ata_pci_device_suspend, |
1545 | .resume = ata_pci_device_resume, |
1546 | +#endif |
1547 | }; |
1548 | |
1549 | static int __init sis_init(void) |
1550 | diff --git a/drivers/ata/pata_triflex.c b/drivers/ata/pata_triflex.c |
1551 | index a142971..02c84a1 100644 |
1552 | --- a/drivers/ata/pata_triflex.c |
1553 | +++ b/drivers/ata/pata_triflex.c |
1554 | @@ -193,8 +193,10 @@ static struct scsi_host_template triflex_sht = { |
1555 | .slave_configure = ata_scsi_slave_config, |
1556 | .slave_destroy = ata_scsi_slave_destroy, |
1557 | .bios_param = ata_std_bios_param, |
1558 | +#ifdef CONFIG_PM |
1559 | .resume = ata_scsi_device_resume, |
1560 | .suspend = ata_scsi_device_suspend, |
1561 | +#endif |
1562 | }; |
1563 | |
1564 | static struct ata_port_operations triflex_port_ops = { |
1565 | @@ -260,8 +262,10 @@ static struct pci_driver triflex_pci_driver = { |
1566 | .id_table = triflex, |
1567 | .probe = triflex_init_one, |
1568 | .remove = ata_pci_remove_one, |
1569 | +#ifdef CONFIG_PM |
1570 | .suspend = ata_pci_device_suspend, |
1571 | .resume = ata_pci_device_resume, |
1572 | +#endif |
1573 | }; |
1574 | |
1575 | static int __init triflex_init(void) |
1576 | diff --git a/drivers/ata/pata_via.c b/drivers/ata/pata_via.c |
1577 | index f0b6c3b..ee3b36a 100644 |
1578 | --- a/drivers/ata/pata_via.c |
1579 | +++ b/drivers/ata/pata_via.c |
1580 | @@ -305,8 +305,10 @@ static struct scsi_host_template via_sht = { |
1581 | .slave_configure = ata_scsi_slave_config, |
1582 | .slave_destroy = ata_scsi_slave_destroy, |
1583 | .bios_param = ata_std_bios_param, |
1584 | +#ifdef CONFIG_PM |
1585 | .resume = ata_scsi_device_resume, |
1586 | .suspend = ata_scsi_device_suspend, |
1587 | +#endif |
1588 | }; |
1589 | |
1590 | static struct ata_port_operations via_port_ops = { |
1591 | @@ -560,6 +562,7 @@ static int via_init_one(struct pci_dev *pdev, const struct pci_device_id *id) |
1592 | return ata_pci_init_one(pdev, port_info, 2); |
1593 | } |
1594 | |
1595 | +#ifdef CONFIG_PM |
1596 | /** |
1597 | * via_reinit_one - reinit after resume |
1598 | * @pdev; PCI device |
1599 | @@ -592,6 +595,7 @@ static int via_reinit_one(struct pci_dev *pdev) |
1600 | } |
1601 | return ata_pci_device_resume(pdev); |
1602 | } |
1603 | +#endif |
1604 | |
1605 | static const struct pci_device_id via[] = { |
1606 | { PCI_VDEVICE(VIA, PCI_DEVICE_ID_VIA_82C576_1), }, |
1607 | @@ -607,8 +611,10 @@ static struct pci_driver via_pci_driver = { |
1608 | .id_table = via, |
1609 | .probe = via_init_one, |
1610 | .remove = ata_pci_remove_one, |
1611 | +#ifdef CONFIG_PM |
1612 | .suspend = ata_pci_device_suspend, |
1613 | .resume = via_reinit_one, |
1614 | +#endif |
1615 | }; |
1616 | |
1617 | static int __init via_init(void) |
1618 | diff --git a/drivers/ata/sata_sil.c b/drivers/ata/sata_sil.c |
1619 | index 7808d03..a12d638 100644 |
1620 | --- a/drivers/ata/sata_sil.c |
1621 | +++ b/drivers/ata/sata_sil.c |
1622 | @@ -181,8 +181,10 @@ static struct scsi_host_template sil_sht = { |
1623 | .slave_configure = ata_scsi_slave_config, |
1624 | .slave_destroy = ata_scsi_slave_destroy, |
1625 | .bios_param = ata_std_bios_param, |
1626 | +#ifdef CONFIG_PM |
1627 | .suspend = ata_scsi_device_suspend, |
1628 | .resume = ata_scsi_device_resume, |
1629 | +#endif |
1630 | }; |
1631 | |
1632 | static const struct ata_port_operations sil_ops = { |
1633 | @@ -383,9 +385,15 @@ static void sil_host_intr(struct ata_port *ap, u32 bmdma2) |
1634 | goto freeze; |
1635 | } |
1636 | |
1637 | - if (unlikely(!qc || qc->tf.ctl & ATA_NIEN)) |
1638 | + if (unlikely(!qc)) |
1639 | goto freeze; |
1640 | |
1641 | + if (unlikely(qc->tf.flags & ATA_TFLAG_POLLING)) { |
1642 | + /* this sometimes happens, just clear IRQ */ |
1643 | + ata_chk_status(ap); |
1644 | + return; |
1645 | + } |
1646 | + |
1647 | /* Check whether we are expecting interrupt in this state */ |
1648 | switch (ap->hsm_task_state) { |
1649 | case HSM_ST_FIRST: |
1650 | diff --git a/drivers/ata/sata_sil24.c b/drivers/ata/sata_sil24.c |
1651 | index 5aa288d..c159bae 100644 |
1652 | --- a/drivers/ata/sata_sil24.c |
1653 | +++ b/drivers/ata/sata_sil24.c |
1654 | @@ -386,8 +386,10 @@ static struct scsi_host_template sil24_sht = { |
1655 | .slave_configure = ata_scsi_slave_config, |
1656 | .slave_destroy = ata_scsi_slave_destroy, |
1657 | .bios_param = ata_std_bios_param, |
1658 | +#ifdef CONFIG_PM |
1659 | .suspend = ata_scsi_device_suspend, |
1660 | .resume = ata_scsi_device_resume, |
1661 | +#endif |
1662 | }; |
1663 | |
1664 | static const struct ata_port_operations sil24_ops = { |
1665 | diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c |
1666 | index 6246219..dd38c30 100644 |
1667 | --- a/drivers/block/pktcdvd.c |
1668 | +++ b/drivers/block/pktcdvd.c |
1669 | @@ -777,7 +777,7 @@ static int pkt_generic_packet(struct pktcdvd_device *pd, struct packet_command * |
1670 | goto out; |
1671 | } |
1672 | |
1673 | - rq->cmd_len = COMMAND_SIZE(rq->cmd[0]); |
1674 | + rq->cmd_len = COMMAND_SIZE(cgc->cmd[0]); |
1675 | memcpy(rq->cmd, cgc->cmd, CDROM_PACKET_SIZE); |
1676 | if (sizeof(rq->cmd) > CDROM_PACKET_SIZE) |
1677 | memset(rq->cmd + CDROM_PACKET_SIZE, 0, sizeof(rq->cmd) - CDROM_PACKET_SIZE); |
1678 | diff --git a/drivers/char/agp/intel-agp.c b/drivers/char/agp/intel-agp.c |
1679 | index a3011de..84787ce 100644 |
1680 | --- a/drivers/char/agp/intel-agp.c |
1681 | +++ b/drivers/char/agp/intel-agp.c |
1682 | @@ -117,13 +117,15 @@ static int intel_i810_configure(void) |
1683 | |
1684 | current_size = A_SIZE_FIX(agp_bridge->current_size); |
1685 | |
1686 | - pci_read_config_dword(intel_i810_private.i810_dev, I810_MMADDR, &temp); |
1687 | - temp &= 0xfff80000; |
1688 | - |
1689 | - intel_i810_private.registers = ioremap(temp, 128 * 4096); |
1690 | if (!intel_i810_private.registers) { |
1691 | - printk(KERN_ERR PFX "Unable to remap memory.\n"); |
1692 | - return -ENOMEM; |
1693 | + pci_read_config_dword(intel_i810_private.i810_dev, I810_MMADDR, &temp); |
1694 | + temp &= 0xfff80000; |
1695 | + |
1696 | + intel_i810_private.registers = ioremap(temp, 128 * 4096); |
1697 | + if (!intel_i810_private.registers) { |
1698 | + printk(KERN_ERR PFX "Unable to remap memory.\n"); |
1699 | + return -ENOMEM; |
1700 | + } |
1701 | } |
1702 | |
1703 | if ((readl(intel_i810_private.registers+I810_DRAM_CTL) |
1704 | diff --git a/drivers/char/pcmcia/cm4040_cs.c b/drivers/char/pcmcia/cm4040_cs.c |
1705 | index 9b1ff7e..3a6d05b 100644 |
1706 | --- a/drivers/char/pcmcia/cm4040_cs.c |
1707 | +++ b/drivers/char/pcmcia/cm4040_cs.c |
1708 | @@ -273,6 +273,7 @@ static ssize_t cm4040_read(struct file *filp, char __user *buf, |
1709 | DEBUGP(6, dev, "BytesToRead=%lu\n", bytes_to_read); |
1710 | |
1711 | min_bytes_to_read = min(count, bytes_to_read + 5); |
1712 | + min_bytes_to_read = min_t(size_t, min_bytes_to_read, READ_WRITE_BUFFER_SIZE); |
1713 | |
1714 | DEBUGP(6, dev, "Min=%lu\n", min_bytes_to_read); |
1715 | |
1716 | @@ -340,7 +341,7 @@ static ssize_t cm4040_write(struct file *filp, const char __user *buf, |
1717 | return 0; |
1718 | } |
1719 | |
1720 | - if (count < 5) { |
1721 | + if ((count < 5) || (count > READ_WRITE_BUFFER_SIZE)) { |
1722 | DEBUGP(2, dev, "<- cm4040_write buffersize=%Zd < 5\n", count); |
1723 | return -EIO; |
1724 | } |
1725 | diff --git a/drivers/char/specialix.c b/drivers/char/specialix.c |
1726 | index 20946f5..0b3044d 100644 |
1727 | --- a/drivers/char/specialix.c |
1728 | +++ b/drivers/char/specialix.c |
1729 | @@ -459,7 +459,7 @@ void missed_irq (unsigned long data) |
1730 | if (irq) { |
1731 | printk (KERN_INFO "Missed interrupt... Calling int from timer. \n"); |
1732 | sx_interrupt (((struct specialix_board *)data)->irq, |
1733 | - (void*)data, NULL); |
1734 | + (void*)data); |
1735 | } |
1736 | missed_irq_timer.expires = jiffies + sx_poll; |
1737 | add_timer (&missed_irq_timer); |
1738 | diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c |
1739 | index 47a6eac..2370908 100644 |
1740 | --- a/drivers/char/tty_io.c |
1741 | +++ b/drivers/char/tty_io.c |
1742 | @@ -1891,6 +1891,20 @@ static int init_dev(struct tty_driver *driver, int idx, |
1743 | /* check whether we're reopening an existing tty */ |
1744 | if (driver->flags & TTY_DRIVER_DEVPTS_MEM) { |
1745 | tty = devpts_get_tty(idx); |
1746 | + /* |
1747 | + * If we don't have a tty here on a slave open, it's because |
1748 | + * the master already started the close process and there's |
1749 | + * no relation between devpts file and tty anymore. |
1750 | + */ |
1751 | + if (!tty && driver->subtype == PTY_TYPE_SLAVE) { |
1752 | + retval = -EIO; |
1753 | + goto end_init; |
1754 | + } |
1755 | + /* |
1756 | + * It's safe from now on because init_dev() is called with |
1757 | + * tty_mutex held and release_dev() won't change tty->count |
1758 | + * or tty->flags without having to grab tty_mutex |
1759 | + */ |
1760 | if (tty && driver->subtype == PTY_TYPE_MASTER) |
1761 | tty = tty->link; |
1762 | } else { |
1763 | diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c |
1764 | index 49f18f5..5cb2500 100644 |
1765 | --- a/drivers/hid/hid-core.c |
1766 | +++ b/drivers/hid/hid-core.c |
1767 | @@ -670,7 +670,6 @@ struct hid_device *hid_parse_report(__u8 *start, unsigned size) |
1768 | |
1769 | if (item.format != HID_ITEM_FORMAT_SHORT) { |
1770 | dbg("unexpected long global item"); |
1771 | - kfree(device->collection); |
1772 | hid_free_device(device); |
1773 | kfree(parser); |
1774 | return NULL; |
1775 | @@ -679,7 +678,6 @@ struct hid_device *hid_parse_report(__u8 *start, unsigned size) |
1776 | if (dispatch_type[item.type](parser, &item)) { |
1777 | dbg("item %u %u %u %u parsing failed\n", |
1778 | item.format, (unsigned)item.size, (unsigned)item.type, (unsigned)item.tag); |
1779 | - kfree(device->collection); |
1780 | hid_free_device(device); |
1781 | kfree(parser); |
1782 | return NULL; |
1783 | @@ -688,14 +686,12 @@ struct hid_device *hid_parse_report(__u8 *start, unsigned size) |
1784 | if (start == end) { |
1785 | if (parser->collection_stack_ptr) { |
1786 | dbg("unbalanced collection at end of report description"); |
1787 | - kfree(device->collection); |
1788 | hid_free_device(device); |
1789 | kfree(parser); |
1790 | return NULL; |
1791 | } |
1792 | if (parser->local.delimiter_depth) { |
1793 | dbg("unbalanced delimiter at end of report description"); |
1794 | - kfree(device->collection); |
1795 | hid_free_device(device); |
1796 | kfree(parser); |
1797 | return NULL; |
1798 | @@ -706,7 +702,6 @@ struct hid_device *hid_parse_report(__u8 *start, unsigned size) |
1799 | } |
1800 | |
1801 | dbg("item fetching failed at offset %d\n", (int)(end - start)); |
1802 | - kfree(device->collection); |
1803 | hid_free_device(device); |
1804 | kfree(parser); |
1805 | return NULL; |
1806 | diff --git a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c |
1807 | index badde63..6558055 100644 |
1808 | --- a/drivers/ide/ide-iops.c |
1809 | +++ b/drivers/ide/ide-iops.c |
1810 | @@ -607,6 +607,8 @@ u8 eighty_ninty_three (ide_drive_t *drive) |
1811 | if(!(drive->id->hw_config & 0x4000)) |
1812 | return 0; |
1813 | #endif /* CONFIG_IDEDMA_IVB */ |
1814 | + if (!(drive->id->hw_config & 0x2000)) |
1815 | + return 0; |
1816 | return 1; |
1817 | } |
1818 | |
1819 | diff --git a/drivers/ieee1394/nodemgr.c b/drivers/ieee1394/nodemgr.c |
1820 | index 61307ca..e2e0771 100644 |
1821 | --- a/drivers/ieee1394/nodemgr.c |
1822 | +++ b/drivers/ieee1394/nodemgr.c |
1823 | @@ -274,7 +274,6 @@ static struct device_driver nodemgr_mid_layer_driver = { |
1824 | struct device nodemgr_dev_template_host = { |
1825 | .bus = &ieee1394_bus_type, |
1826 | .release = nodemgr_release_host, |
1827 | - .driver = &nodemgr_mid_layer_driver, |
1828 | }; |
1829 | |
1830 | |
1831 | @@ -1889,22 +1888,31 @@ int init_ieee1394_nodemgr(void) |
1832 | |
1833 | error = class_register(&nodemgr_ne_class); |
1834 | if (error) |
1835 | - return error; |
1836 | - |
1837 | + goto fail_ne; |
1838 | error = class_register(&nodemgr_ud_class); |
1839 | - if (error) { |
1840 | - class_unregister(&nodemgr_ne_class); |
1841 | - return error; |
1842 | - } |
1843 | + if (error) |
1844 | + goto fail_ud; |
1845 | error = driver_register(&nodemgr_mid_layer_driver); |
1846 | + if (error) |
1847 | + goto fail_ml; |
1848 | + /* This driver is not used if nodemgr is off (disable_nodemgr=1). */ |
1849 | + nodemgr_dev_template_host.driver = &nodemgr_mid_layer_driver; |
1850 | + |
1851 | hpsb_register_highlevel(&nodemgr_highlevel); |
1852 | return 0; |
1853 | + |
1854 | +fail_ml: |
1855 | + class_unregister(&nodemgr_ud_class); |
1856 | +fail_ud: |
1857 | + class_unregister(&nodemgr_ne_class); |
1858 | +fail_ne: |
1859 | + return error; |
1860 | } |
1861 | |
1862 | void cleanup_ieee1394_nodemgr(void) |
1863 | { |
1864 | hpsb_unregister_highlevel(&nodemgr_highlevel); |
1865 | - |
1866 | + driver_unregister(&nodemgr_mid_layer_driver); |
1867 | class_unregister(&nodemgr_ud_class); |
1868 | class_unregister(&nodemgr_ne_class); |
1869 | } |
1870 | diff --git a/drivers/ieee1394/video1394.c b/drivers/ieee1394/video1394.c |
1871 | index 598b19f..f4d1ec0 100644 |
1872 | --- a/drivers/ieee1394/video1394.c |
1873 | +++ b/drivers/ieee1394/video1394.c |
1874 | @@ -489,6 +489,9 @@ static void wakeup_dma_ir_ctx(unsigned long l) |
1875 | reset_ir_status(d, i); |
1876 | d->buffer_status[d->buffer_prg_assignment[i]] = VIDEO1394_BUFFER_READY; |
1877 | do_gettimeofday(&d->buffer_time[d->buffer_prg_assignment[i]]); |
1878 | + dma_region_sync_for_cpu(&d->dma, |
1879 | + d->buffer_prg_assignment[i] * d->buf_size, |
1880 | + d->buf_size); |
1881 | } |
1882 | } |
1883 | |
1884 | @@ -1096,6 +1099,8 @@ static long video1394_ioctl(struct file *file, |
1885 | DBGMSG(ohci->host->id, "Starting iso transmit DMA ctx=%d", |
1886 | d->ctx); |
1887 | put_timestamp(ohci, d, d->last_buffer); |
1888 | + dma_region_sync_for_device(&d->dma, |
1889 | + v.buffer * d->buf_size, d->buf_size); |
1890 | |
1891 | /* Tell the controller where the first program is */ |
1892 | reg_write(ohci, d->cmdPtr, |
1893 | @@ -1111,6 +1116,9 @@ static long video1394_ioctl(struct file *file, |
1894 | "Waking up iso transmit dma ctx=%d", |
1895 | d->ctx); |
1896 | put_timestamp(ohci, d, d->last_buffer); |
1897 | + dma_region_sync_for_device(&d->dma, |
1898 | + v.buffer * d->buf_size, d->buf_size); |
1899 | + |
1900 | reg_write(ohci, d->ctrlSet, 0x1000); |
1901 | } |
1902 | } |
1903 | diff --git a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c |
1904 | index a0e4a03..9a6e4b6 100644 |
1905 | --- a/drivers/input/mouse/psmouse-base.c |
1906 | +++ b/drivers/input/mouse/psmouse-base.c |
1907 | @@ -987,8 +987,36 @@ static void psmouse_resync(struct work_struct *work) |
1908 | static void psmouse_cleanup(struct serio *serio) |
1909 | { |
1910 | struct psmouse *psmouse = serio_get_drvdata(serio); |
1911 | + struct psmouse *parent = NULL; |
1912 | + |
1913 | + mutex_lock(&psmouse_mutex); |
1914 | + |
1915 | + if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) { |
1916 | + parent = serio_get_drvdata(serio->parent); |
1917 | + psmouse_deactivate(parent); |
1918 | + } |
1919 | + |
1920 | + psmouse_deactivate(psmouse); |
1921 | + |
1922 | + if (psmouse->cleanup) |
1923 | + psmouse->cleanup(psmouse); |
1924 | |
1925 | psmouse_reset(psmouse); |
1926 | + |
1927 | +/* |
1928 | + * Some boxes, such as HP nx7400, get terribly confused if mouse |
1929 | + * is not fully enabled before suspending/shutting down. |
1930 | + */ |
1931 | + ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_ENABLE); |
1932 | + |
1933 | + if (parent) { |
1934 | + if (parent->pt_deactivate) |
1935 | + parent->pt_deactivate(parent); |
1936 | + |
1937 | + psmouse_activate(parent); |
1938 | + } |
1939 | + |
1940 | + mutex_unlock(&psmouse_mutex); |
1941 | } |
1942 | |
1943 | /* |
1944 | diff --git a/drivers/input/mouse/psmouse.h b/drivers/input/mouse/psmouse.h |
1945 | index 1b74cae..cf1de95 100644 |
1946 | --- a/drivers/input/mouse/psmouse.h |
1947 | +++ b/drivers/input/mouse/psmouse.h |
1948 | @@ -68,6 +68,7 @@ struct psmouse { |
1949 | |
1950 | int (*reconnect)(struct psmouse *psmouse); |
1951 | void (*disconnect)(struct psmouse *psmouse); |
1952 | + void (*cleanup)(struct psmouse *psmouse); |
1953 | int (*poll)(struct psmouse *psmouse); |
1954 | |
1955 | void (*pt_activate)(struct psmouse *psmouse); |
1956 | diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c |
1957 | index 49ac696..f0f9413 100644 |
1958 | --- a/drivers/input/mouse/synaptics.c |
1959 | +++ b/drivers/input/mouse/synaptics.c |
1960 | @@ -652,6 +652,7 @@ int synaptics_init(struct psmouse *psmouse) |
1961 | psmouse->set_rate = synaptics_set_rate; |
1962 | psmouse->disconnect = synaptics_disconnect; |
1963 | psmouse->reconnect = synaptics_reconnect; |
1964 | + psmouse->cleanup = synaptics_reset; |
1965 | psmouse->pktsize = 6; |
1966 | /* Synaptics can usually stay in sync without extra help */ |
1967 | psmouse->resync_time = 0; |
1968 | diff --git a/drivers/kvm/kvm.h b/drivers/kvm/kvm.h |
1969 | index 2db1ca4..4ccb343 100644 |
1970 | --- a/drivers/kvm/kvm.h |
1971 | +++ b/drivers/kvm/kvm.h |
1972 | @@ -558,7 +558,7 @@ static inline void load_gs(u16 sel) |
1973 | #ifndef load_ldt |
1974 | static inline void load_ldt(u16 sel) |
1975 | { |
1976 | - asm ("lldt %0" : : "g"(sel)); |
1977 | + asm ("lldt %0" : : "rm"(sel)); |
1978 | } |
1979 | #endif |
1980 | |
1981 | diff --git a/drivers/macintosh/Kconfig b/drivers/macintosh/Kconfig |
1982 | index a9e747c..1a86387 100644 |
1983 | --- a/drivers/macintosh/Kconfig |
1984 | +++ b/drivers/macintosh/Kconfig |
1985 | @@ -1,6 +1,6 @@ |
1986 | |
1987 | menu "Macintosh device drivers" |
1988 | - depends on PPC || MAC |
1989 | + depends on PPC || MAC || X86 |
1990 | |
1991 | config ADB |
1992 | bool "Apple Desktop Bus (ADB) support" |
1993 | diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c |
1994 | index 1110816..059704f 100644 |
1995 | --- a/drivers/md/bitmap.c |
1996 | +++ b/drivers/md/bitmap.c |
1997 | @@ -1160,6 +1160,22 @@ int bitmap_startwrite(struct bitmap *bitmap, sector_t offset, unsigned long sect |
1998 | return 0; |
1999 | } |
2000 | |
2001 | + if (unlikely((*bmc & COUNTER_MAX) == COUNTER_MAX)) { |
2002 | + DEFINE_WAIT(__wait); |
2003 | + /* note that it is safe to do the prepare_to_wait |
2004 | + * after the test as long as we do it before dropping |
2005 | + * the spinlock. |
2006 | + */ |
2007 | + prepare_to_wait(&bitmap->overflow_wait, &__wait, |
2008 | + TASK_UNINTERRUPTIBLE); |
2009 | + spin_unlock_irq(&bitmap->lock); |
2010 | + bitmap->mddev->queue |
2011 | + ->unplug_fn(bitmap->mddev->queue); |
2012 | + schedule(); |
2013 | + finish_wait(&bitmap->overflow_wait, &__wait); |
2014 | + continue; |
2015 | + } |
2016 | + |
2017 | switch(*bmc) { |
2018 | case 0: |
2019 | bitmap_file_set_bit(bitmap, offset); |
2020 | @@ -1169,7 +1185,7 @@ int bitmap_startwrite(struct bitmap *bitmap, sector_t offset, unsigned long sect |
2021 | case 1: |
2022 | *bmc = 2; |
2023 | } |
2024 | - BUG_ON((*bmc & COUNTER_MAX) == COUNTER_MAX); |
2025 | + |
2026 | (*bmc)++; |
2027 | |
2028 | spin_unlock_irq(&bitmap->lock); |
2029 | @@ -1207,6 +1223,9 @@ void bitmap_endwrite(struct bitmap *bitmap, sector_t offset, unsigned long secto |
2030 | if (!success && ! (*bmc & NEEDED_MASK)) |
2031 | *bmc |= NEEDED_MASK; |
2032 | |
2033 | + if ((*bmc & COUNTER_MAX) == COUNTER_MAX) |
2034 | + wake_up(&bitmap->overflow_wait); |
2035 | + |
2036 | (*bmc)--; |
2037 | if (*bmc <= 2) { |
2038 | set_page_attr(bitmap, |
2039 | @@ -1431,6 +1450,7 @@ int bitmap_create(mddev_t *mddev) |
2040 | spin_lock_init(&bitmap->lock); |
2041 | atomic_set(&bitmap->pending_writes, 0); |
2042 | init_waitqueue_head(&bitmap->write_wait); |
2043 | + init_waitqueue_head(&bitmap->overflow_wait); |
2044 | |
2045 | bitmap->mddev = mddev; |
2046 | |
2047 | diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c |
2048 | index a9401c0..82249a6 100644 |
2049 | --- a/drivers/md/raid10.c |
2050 | +++ b/drivers/md/raid10.c |
2051 | @@ -429,7 +429,7 @@ static sector_t raid10_find_virt(conf_t *conf, sector_t sector, int dev) |
2052 | if (dev < 0) |
2053 | dev += conf->raid_disks; |
2054 | } else { |
2055 | - while (sector > conf->stride) { |
2056 | + while (sector >= conf->stride) { |
2057 | sector -= conf->stride; |
2058 | if (dev < conf->near_copies) |
2059 | dev += conf->raid_disks - conf->near_copies; |
2060 | @@ -1801,6 +1801,7 @@ static sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *skipped, i |
2061 | for (k=0; k<conf->copies; k++) |
2062 | if (r10_bio->devs[k].devnum == i) |
2063 | break; |
2064 | + BUG_ON(k == conf->copies); |
2065 | bio = r10_bio->devs[1].bio; |
2066 | bio->bi_next = biolist; |
2067 | biolist = bio; |
2068 | @@ -2021,19 +2022,30 @@ static int run(mddev_t *mddev) |
2069 | if (!conf->tmppage) |
2070 | goto out_free_conf; |
2071 | |
2072 | + conf->mddev = mddev; |
2073 | + conf->raid_disks = mddev->raid_disks; |
2074 | conf->near_copies = nc; |
2075 | conf->far_copies = fc; |
2076 | conf->copies = nc*fc; |
2077 | conf->far_offset = fo; |
2078 | conf->chunk_mask = (sector_t)(mddev->chunk_size>>9)-1; |
2079 | conf->chunk_shift = ffz(~mddev->chunk_size) - 9; |
2080 | + size = mddev->size >> (conf->chunk_shift-1); |
2081 | + sector_div(size, fc); |
2082 | + size = size * conf->raid_disks; |
2083 | + sector_div(size, nc); |
2084 | + /* 'size' is now the number of chunks in the array */ |
2085 | + /* calculate "used chunks per device" in 'stride' */ |
2086 | + stride = size * conf->copies; |
2087 | + sector_div(stride, conf->raid_disks); |
2088 | + mddev->size = stride << (conf->chunk_shift-1); |
2089 | + |
2090 | if (fo) |
2091 | - conf->stride = 1 << conf->chunk_shift; |
2092 | - else { |
2093 | - stride = mddev->size >> (conf->chunk_shift-1); |
2094 | + stride = 1; |
2095 | + else |
2096 | sector_div(stride, fc); |
2097 | - conf->stride = stride << conf->chunk_shift; |
2098 | - } |
2099 | + conf->stride = stride << conf->chunk_shift; |
2100 | + |
2101 | conf->r10bio_pool = mempool_create(NR_RAID10_BIOS, r10bio_pool_alloc, |
2102 | r10bio_pool_free, conf); |
2103 | if (!conf->r10bio_pool) { |
2104 | @@ -2063,8 +2075,6 @@ static int run(mddev_t *mddev) |
2105 | |
2106 | disk->head_position = 0; |
2107 | } |
2108 | - conf->raid_disks = mddev->raid_disks; |
2109 | - conf->mddev = mddev; |
2110 | spin_lock_init(&conf->device_lock); |
2111 | INIT_LIST_HEAD(&conf->retry_list); |
2112 | |
2113 | @@ -2106,16 +2116,8 @@ static int run(mddev_t *mddev) |
2114 | /* |
2115 | * Ok, everything is just fine now |
2116 | */ |
2117 | - if (conf->far_offset) { |
2118 | - size = mddev->size >> (conf->chunk_shift-1); |
2119 | - size *= conf->raid_disks; |
2120 | - size <<= conf->chunk_shift; |
2121 | - sector_div(size, conf->far_copies); |
2122 | - } else |
2123 | - size = conf->stride * conf->raid_disks; |
2124 | - sector_div(size, conf->near_copies); |
2125 | - mddev->array_size = size/2; |
2126 | - mddev->resync_max_sectors = size; |
2127 | + mddev->array_size = size << (conf->chunk_shift-1); |
2128 | + mddev->resync_max_sectors = size << conf->chunk_shift; |
2129 | |
2130 | mddev->queue->unplug_fn = raid10_unplug; |
2131 | mddev->queue->issue_flush_fn = raid10_issue_flush; |
2132 | diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c |
2133 | index 467c169..11c3d7b 100644 |
2134 | --- a/drivers/md/raid5.c |
2135 | +++ b/drivers/md/raid5.c |
2136 | @@ -2620,7 +2620,7 @@ static struct bio *remove_bio_from_retry(raid5_conf_t *conf) |
2137 | } |
2138 | bi = conf->retry_read_aligned_list; |
2139 | if(bi) { |
2140 | - conf->retry_read_aligned = bi->bi_next; |
2141 | + conf->retry_read_aligned_list = bi->bi_next; |
2142 | bi->bi_next = NULL; |
2143 | bi->bi_phys_segments = 1; /* biased count of active stripes */ |
2144 | bi->bi_hw_segments = 0; /* count of processed stripes */ |
2145 | @@ -2669,6 +2669,27 @@ static int raid5_align_endio(struct bio *bi, unsigned int bytes, int error) |
2146 | return 0; |
2147 | } |
2148 | |
2149 | +static int bio_fits_rdev(struct bio *bi) |
2150 | +{ |
2151 | + request_queue_t *q = bdev_get_queue(bi->bi_bdev); |
2152 | + |
2153 | + if ((bi->bi_size>>9) > q->max_sectors) |
2154 | + return 0; |
2155 | + blk_recount_segments(q, bi); |
2156 | + if (bi->bi_phys_segments > q->max_phys_segments || |
2157 | + bi->bi_hw_segments > q->max_hw_segments) |
2158 | + return 0; |
2159 | + |
2160 | + if (q->merge_bvec_fn) |
2161 | + /* it's too hard to apply the merge_bvec_fn at this stage, |
2162 | + * just just give up |
2163 | + */ |
2164 | + return 0; |
2165 | + |
2166 | + return 1; |
2167 | +} |
2168 | + |
2169 | + |
2170 | static int chunk_aligned_read(request_queue_t *q, struct bio * raid_bio) |
2171 | { |
2172 | mddev_t *mddev = q->queuedata; |
2173 | @@ -2715,6 +2736,13 @@ static int chunk_aligned_read(request_queue_t *q, struct bio * raid_bio) |
2174 | align_bi->bi_flags &= ~(1 << BIO_SEG_VALID); |
2175 | align_bi->bi_sector += rdev->data_offset; |
2176 | |
2177 | + if (!bio_fits_rdev(align_bi)) { |
2178 | + /* too big in some way */ |
2179 | + bio_put(align_bi); |
2180 | + rdev_dec_pending(rdev, mddev); |
2181 | + return 0; |
2182 | + } |
2183 | + |
2184 | spin_lock_irq(&conf->device_lock); |
2185 | wait_event_lock_irq(conf->wait_for_stripe, |
2186 | conf->quiesce == 0, |
2187 | @@ -3107,7 +3135,9 @@ static int retry_aligned_read(raid5_conf_t *conf, struct bio *raid_bio) |
2188 | last_sector = raid_bio->bi_sector + (raid_bio->bi_size>>9); |
2189 | |
2190 | for (; logical_sector < last_sector; |
2191 | - logical_sector += STRIPE_SECTORS, scnt++) { |
2192 | + logical_sector += STRIPE_SECTORS, |
2193 | + sector += STRIPE_SECTORS, |
2194 | + scnt++) { |
2195 | |
2196 | if (scnt < raid_bio->bi_hw_segments) |
2197 | /* already done this stripe */ |
2198 | @@ -3123,7 +3153,13 @@ static int retry_aligned_read(raid5_conf_t *conf, struct bio *raid_bio) |
2199 | } |
2200 | |
2201 | set_bit(R5_ReadError, &sh->dev[dd_idx].flags); |
2202 | - add_stripe_bio(sh, raid_bio, dd_idx, 0); |
2203 | + if (!add_stripe_bio(sh, raid_bio, dd_idx, 0)) { |
2204 | + release_stripe(sh); |
2205 | + raid_bio->bi_hw_segments = scnt; |
2206 | + conf->retry_read_aligned = raid_bio; |
2207 | + return handled; |
2208 | + } |
2209 | + |
2210 | handle_stripe(sh, NULL); |
2211 | release_stripe(sh); |
2212 | handled++; |
2213 | diff --git a/drivers/media/dvb/dvb-core/dvbdev.c b/drivers/media/dvb/dvb-core/dvbdev.c |
2214 | index 40774fe..af35f30 100644 |
2215 | --- a/drivers/media/dvb/dvb-core/dvbdev.c |
2216 | +++ b/drivers/media/dvb/dvb-core/dvbdev.c |
2217 | @@ -200,6 +200,8 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev, |
2218 | const struct dvb_device *template, void *priv, int type) |
2219 | { |
2220 | struct dvb_device *dvbdev; |
2221 | + struct file_operations *dvbdevfops; |
2222 | + |
2223 | int id; |
2224 | |
2225 | if (mutex_lock_interruptible(&dvbdev_register_lock)) |
2226 | @@ -219,12 +221,22 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev, |
2227 | return -ENOMEM; |
2228 | } |
2229 | |
2230 | + dvbdevfops = kzalloc(sizeof(struct file_operations), GFP_KERNEL); |
2231 | + |
2232 | + if (!dvbdevfops) { |
2233 | + kfree (dvbdev); |
2234 | + mutex_unlock(&dvbdev_register_lock); |
2235 | + return -ENOMEM; |
2236 | + } |
2237 | + |
2238 | memcpy(dvbdev, template, sizeof(struct dvb_device)); |
2239 | dvbdev->type = type; |
2240 | dvbdev->id = id; |
2241 | dvbdev->adapter = adap; |
2242 | dvbdev->priv = priv; |
2243 | + dvbdev->fops = dvbdevfops; |
2244 | |
2245 | + memcpy(dvbdev->fops, template->fops, sizeof(struct file_operations)); |
2246 | dvbdev->fops->owner = adap->module; |
2247 | |
2248 | list_add_tail (&dvbdev->list_head, &adap->device_list); |
2249 | @@ -252,6 +264,7 @@ void dvb_unregister_device(struct dvb_device *dvbdev) |
2250 | dvbdev->type, dvbdev->id))); |
2251 | |
2252 | list_del (&dvbdev->list_head); |
2253 | + kfree (dvbdev->fops); |
2254 | kfree (dvbdev); |
2255 | } |
2256 | EXPORT_SYMBOL(dvb_unregister_device); |
2257 | diff --git a/drivers/media/dvb/dvb-usb/cxusb.c b/drivers/media/dvb/dvb-usb/cxusb.c |
2258 | index 15d12fc..127a94b 100644 |
2259 | --- a/drivers/media/dvb/dvb-usb/cxusb.c |
2260 | +++ b/drivers/media/dvb/dvb-usb/cxusb.c |
2261 | @@ -469,9 +469,9 @@ static int bluebird_patch_dvico_firmware_download(struct usb_device *udev, |
2262 | fw->data[BLUEBIRD_01_ID_OFFSET + 1] == USB_VID_DVICO >> 8) { |
2263 | |
2264 | fw->data[BLUEBIRD_01_ID_OFFSET + 2] = |
2265 | - udev->descriptor.idProduct + 1; |
2266 | + le16_to_cpu(udev->descriptor.idProduct) + 1; |
2267 | fw->data[BLUEBIRD_01_ID_OFFSET + 3] = |
2268 | - udev->descriptor.idProduct >> 8; |
2269 | + le16_to_cpu(udev->descriptor.idProduct) >> 8; |
2270 | |
2271 | return usb_cypress_load_firmware(udev, fw, CYPRESS_FX2); |
2272 | } |
2273 | diff --git a/drivers/media/dvb/dvb-usb/digitv.c b/drivers/media/dvb/dvb-usb/digitv.c |
2274 | index 4a198d4..b5acb11 100644 |
2275 | --- a/drivers/media/dvb/dvb-usb/digitv.c |
2276 | +++ b/drivers/media/dvb/dvb-usb/digitv.c |
2277 | @@ -119,6 +119,8 @@ static int digitv_nxt6000_tuner_set_params(struct dvb_frontend *fe, struct dvb_f |
2278 | struct dvb_usb_adapter *adap = fe->dvb->priv; |
2279 | u8 b[5]; |
2280 | dvb_usb_tuner_calc_regs(fe,fep,b, 5); |
2281 | + if (fe->ops.i2c_gate_ctrl) |
2282 | + fe->ops.i2c_gate_ctrl(fe, 1); |
2283 | return digitv_ctrl_msg(adap->dev, USB_WRITE_TUNER, 0, &b[1], 4, NULL, 0); |
2284 | } |
2285 | |
2286 | diff --git a/drivers/media/video/cx25840/cx25840-core.c b/drivers/media/video/cx25840/cx25840-core.c |
2287 | index 7bb7589..2f29ba4 100644 |
2288 | --- a/drivers/media/video/cx25840/cx25840-core.c |
2289 | +++ b/drivers/media/video/cx25840/cx25840-core.c |
2290 | @@ -907,13 +907,13 @@ static int cx25840_detect_client(struct i2c_adapter *adapter, int address, |
2291 | state->vbi_line_offset = 8; |
2292 | state->id = id; |
2293 | |
2294 | + i2c_attach_client(client); |
2295 | + |
2296 | if (state->is_cx25836) |
2297 | cx25836_initialize(client); |
2298 | else |
2299 | cx25840_initialize(client, 1); |
2300 | |
2301 | - i2c_attach_client(client); |
2302 | - |
2303 | return 0; |
2304 | } |
2305 | |
2306 | diff --git a/drivers/media/video/cx25840/cx25840-firmware.c b/drivers/media/video/cx25840/cx25840-firmware.c |
2307 | index 1958d40..0e86b9d 100644 |
2308 | --- a/drivers/media/video/cx25840/cx25840-firmware.c |
2309 | +++ b/drivers/media/video/cx25840/cx25840-firmware.c |
2310 | @@ -37,7 +37,7 @@ |
2311 | */ |
2312 | #define FWSEND 48 |
2313 | |
2314 | -#define FWDEV(x) &((x)->adapter->dev) |
2315 | +#define FWDEV(x) &((x)->dev) |
2316 | |
2317 | static char *firmware = FWFILE; |
2318 | |
2319 | diff --git a/drivers/media/video/cx88/cx88-blackbird.c b/drivers/media/video/cx88/cx88-blackbird.c |
2320 | index 0cf0360..1c04516 100644 |
2321 | --- a/drivers/media/video/cx88/cx88-blackbird.c |
2322 | +++ b/drivers/media/video/cx88/cx88-blackbird.c |
2323 | @@ -53,7 +53,8 @@ MODULE_PARM_DESC(debug,"enable debug messages [blackbird]"); |
2324 | |
2325 | /* ------------------------------------------------------------------ */ |
2326 | |
2327 | -#define BLACKBIRD_FIRM_IMAGE_SIZE 256*1024 |
2328 | +#define OLD_BLACKBIRD_FIRM_IMAGE_SIZE 262144 |
2329 | +#define BLACKBIRD_FIRM_IMAGE_SIZE 376836 |
2330 | |
2331 | /* defines below are from ivtv-driver.h */ |
2332 | |
2333 | @@ -401,7 +402,7 @@ static int blackbird_find_mailbox(struct cx8802_dev *dev) |
2334 | u32 value; |
2335 | int i; |
2336 | |
2337 | - for (i = 0; i < BLACKBIRD_FIRM_IMAGE_SIZE; i++) { |
2338 | + for (i = 0; i < dev->fw_size; i++) { |
2339 | memory_read(dev->core, i, &value); |
2340 | if (value == signature[signaturecnt]) |
2341 | signaturecnt++; |
2342 | @@ -449,12 +450,15 @@ static int blackbird_load_firmware(struct cx8802_dev *dev) |
2343 | return -1; |
2344 | } |
2345 | |
2346 | - if (firmware->size != BLACKBIRD_FIRM_IMAGE_SIZE) { |
2347 | - dprintk(0, "ERROR: Firmware size mismatch (have %zd, expected %d)\n", |
2348 | - firmware->size, BLACKBIRD_FIRM_IMAGE_SIZE); |
2349 | + if ((firmware->size != BLACKBIRD_FIRM_IMAGE_SIZE) && |
2350 | + (firmware->size != OLD_BLACKBIRD_FIRM_IMAGE_SIZE)) { |
2351 | + dprintk(0, "ERROR: Firmware size mismatch (have %zd, expected %d or %d)\n", |
2352 | + firmware->size, BLACKBIRD_FIRM_IMAGE_SIZE, |
2353 | + OLD_BLACKBIRD_FIRM_IMAGE_SIZE); |
2354 | release_firmware(firmware); |
2355 | return -1; |
2356 | } |
2357 | + dev->fw_size = firmware->size; |
2358 | |
2359 | if (0 != memcmp(firmware->data, magic, 8)) { |
2360 | dprintk(0, "ERROR: Firmware magic mismatch, wrong file?\n"); |
2361 | diff --git a/drivers/media/video/cx88/cx88.h b/drivers/media/video/cx88/cx88.h |
2362 | index a9575ad..e775b4b 100644 |
2363 | --- a/drivers/media/video/cx88/cx88.h |
2364 | +++ b/drivers/media/video/cx88/cx88.h |
2365 | @@ -459,6 +459,7 @@ struct cx8802_dev { |
2366 | u32 mailbox; |
2367 | int width; |
2368 | int height; |
2369 | + int fw_size; |
2370 | |
2371 | /* for dvb only */ |
2372 | struct videobuf_dvb dvb; |
2373 | diff --git a/drivers/media/video/pvrusb2/pvrusb2-encoder.c b/drivers/media/video/pvrusb2/pvrusb2-encoder.c |
2374 | index c94f97b..aec1a00 100644 |
2375 | --- a/drivers/media/video/pvrusb2/pvrusb2-encoder.c |
2376 | +++ b/drivers/media/video/pvrusb2/pvrusb2-encoder.c |
2377 | @@ -288,6 +288,44 @@ static int pvr2_encoder_vcmd(struct pvr2_hdw *hdw, int cmd, |
2378 | return pvr2_encoder_cmd(hdw,cmd,args,0,data); |
2379 | } |
2380 | |
2381 | + |
2382 | +/* This implements some extra setup for the encoder that seems to be |
2383 | + specific to the PVR USB2 hardware. */ |
2384 | +int pvr2_encoder_prep_config(struct pvr2_hdw *hdw) |
2385 | +{ |
2386 | + int ret = 0; |
2387 | + int encMisc3Arg = 0; |
2388 | + |
2389 | + /* Mike Isely <isely@pobox.com> 22-Feb-2007 The windows driver |
2390 | + sends the following list of ENC_MISC commands (for both |
2391 | + 24xxx and 29xxx devices). Meanings are not entirely clear, |
2392 | + however without the ENC_MISC(3,encMisc3Arg) command then we risk |
2393 | + random perpetual video corruption whenever the video input |
2394 | + breaks up for a moment (like when switching channels). */ |
2395 | + |
2396 | + |
2397 | + /* This ENC_MISC(3,encMisc3Arg) command is critical - without |
2398 | + it there will eventually be video corruption. Also, the |
2399 | + 29xxx case is strange - the Windows driver is passing 1 |
2400 | + regardless of device type but if we have 1 for 29xxx device |
2401 | + the video turns sluggish. */ |
2402 | + switch (hdw->hdw_type) { |
2403 | + case PVR2_HDW_TYPE_24XXX: encMisc3Arg = 1; break; |
2404 | + case PVR2_HDW_TYPE_29XXX: encMisc3Arg = 0; break; |
2405 | + default: break; |
2406 | + } |
2407 | + ret |= pvr2_encoder_vcmd(hdw, CX2341X_ENC_MISC,4, 3, |
2408 | + encMisc3Arg,0,0); |
2409 | + |
2410 | + ret |= pvr2_encoder_vcmd(hdw, CX2341X_ENC_MISC,4, 8,0,0,0); |
2411 | + |
2412 | + ret |= pvr2_encoder_vcmd(hdw, CX2341X_ENC_MISC,4, 0,3,0,0); |
2413 | + ret |= pvr2_encoder_vcmd(hdw, CX2341X_ENC_MISC,4,15,0,0,0); |
2414 | + |
2415 | + return ret; |
2416 | +} |
2417 | + |
2418 | + |
2419 | int pvr2_encoder_configure(struct pvr2_hdw *hdw) |
2420 | { |
2421 | int ret; |
2422 | @@ -302,6 +340,8 @@ int pvr2_encoder_configure(struct pvr2_hdw *hdw) |
2423 | |
2424 | ret = 0; |
2425 | |
2426 | + ret |= pvr2_encoder_prep_config(hdw); |
2427 | + |
2428 | if (!ret) ret = pvr2_encoder_vcmd( |
2429 | hdw,CX2341X_ENC_SET_NUM_VSYNC_LINES, 2, |
2430 | 0xf0, 0xf0); |
2431 | diff --git a/drivers/media/video/pvrusb2/pvrusb2-hdw.c b/drivers/media/video/pvrusb2/pvrusb2-hdw.c |
2432 | index d200496..2fbd24c 100644 |
2433 | --- a/drivers/media/video/pvrusb2/pvrusb2-hdw.c |
2434 | +++ b/drivers/media/video/pvrusb2/pvrusb2-hdw.c |
2435 | @@ -1041,7 +1041,7 @@ int pvr2_upload_firmware2(struct pvr2_hdw *hdw) |
2436 | { |
2437 | const struct firmware *fw_entry = NULL; |
2438 | void *fw_ptr; |
2439 | - unsigned int pipe, fw_len, fw_done; |
2440 | + unsigned int pipe, fw_len, fw_done, bcnt, icnt; |
2441 | int actual_length; |
2442 | int ret = 0; |
2443 | int fwidx; |
2444 | @@ -1093,11 +1093,11 @@ int pvr2_upload_firmware2(struct pvr2_hdw *hdw) |
2445 | |
2446 | fw_len = fw_entry->size; |
2447 | |
2448 | - if (fw_len % FIRMWARE_CHUNK_SIZE) { |
2449 | + if (fw_len % sizeof(u32)) { |
2450 | pvr2_trace(PVR2_TRACE_ERROR_LEGS, |
2451 | "size of %s firmware" |
2452 | - " must be a multiple of 8192B", |
2453 | - fw_files[fwidx]); |
2454 | + " must be a multiple of %zu bytes", |
2455 | + fw_files[fwidx],sizeof(u32)); |
2456 | release_firmware(fw_entry); |
2457 | return -1; |
2458 | } |
2459 | @@ -1112,18 +1112,21 @@ int pvr2_upload_firmware2(struct pvr2_hdw *hdw) |
2460 | |
2461 | pipe = usb_sndbulkpipe(hdw->usb_dev, PVR2_FIRMWARE_ENDPOINT); |
2462 | |
2463 | - for (fw_done = 0 ; (fw_done < fw_len) && !ret ; |
2464 | - fw_done += FIRMWARE_CHUNK_SIZE ) { |
2465 | - int i; |
2466 | - memcpy(fw_ptr, fw_entry->data + fw_done, FIRMWARE_CHUNK_SIZE); |
2467 | - /* Usbsnoop log shows that we must swap bytes... */ |
2468 | - for (i = 0; i < FIRMWARE_CHUNK_SIZE/4 ; i++) |
2469 | - ((u32 *)fw_ptr)[i] = ___swab32(((u32 *)fw_ptr)[i]); |
2470 | - |
2471 | - ret |= usb_bulk_msg(hdw->usb_dev, pipe, fw_ptr, |
2472 | - FIRMWARE_CHUNK_SIZE, |
2473 | + fw_done = 0; |
2474 | + for (fw_done = 0; fw_done < fw_len;) { |
2475 | + bcnt = fw_len - fw_done; |
2476 | + if (bcnt > FIRMWARE_CHUNK_SIZE) bcnt = FIRMWARE_CHUNK_SIZE; |
2477 | + memcpy(fw_ptr, fw_entry->data + fw_done, bcnt); |
2478 | + /* Usbsnoop log shows that we must swap bytes... */ |
2479 | + for (icnt = 0; icnt < bcnt/4 ; icnt++) |
2480 | + ((u32 *)fw_ptr)[icnt] = |
2481 | + ___swab32(((u32 *)fw_ptr)[icnt]); |
2482 | + |
2483 | + ret |= usb_bulk_msg(hdw->usb_dev, pipe, fw_ptr,bcnt, |
2484 | &actual_length, HZ); |
2485 | - ret |= (actual_length != FIRMWARE_CHUNK_SIZE); |
2486 | + ret |= (actual_length != bcnt); |
2487 | + if (ret) break; |
2488 | + fw_done += bcnt; |
2489 | } |
2490 | |
2491 | trace_firmware("upload of %s : %i / %i ", |
2492 | diff --git a/drivers/mmc/sdhci.c b/drivers/mmc/sdhci.c |
2493 | index c2d13d7..175a942 100644 |
2494 | --- a/drivers/mmc/sdhci.c |
2495 | +++ b/drivers/mmc/sdhci.c |
2496 | @@ -37,6 +37,7 @@ static unsigned int debug_quirks = 0; |
2497 | #define SDHCI_QUIRK_FORCE_DMA (1<<1) |
2498 | /* Controller doesn't like some resets when there is no card inserted. */ |
2499 | #define SDHCI_QUIRK_NO_CARD_NO_RESET (1<<2) |
2500 | +#define SDHCI_QUIRK_SINGLE_POWER_WRITE (1<<3) |
2501 | |
2502 | static const struct pci_device_id pci_ids[] __devinitdata = { |
2503 | { |
2504 | @@ -65,6 +66,14 @@ static const struct pci_device_id pci_ids[] __devinitdata = { |
2505 | .driver_data = SDHCI_QUIRK_FORCE_DMA, |
2506 | }, |
2507 | |
2508 | + { |
2509 | + .vendor = PCI_VENDOR_ID_ENE, |
2510 | + .device = PCI_DEVICE_ID_ENE_CB712_SD, |
2511 | + .subvendor = PCI_ANY_ID, |
2512 | + .subdevice = PCI_ANY_ID, |
2513 | + .driver_data = SDHCI_QUIRK_SINGLE_POWER_WRITE, |
2514 | + }, |
2515 | + |
2516 | { /* Generic SD host controller */ |
2517 | PCI_DEVICE_CLASS((PCI_CLASS_SYSTEM_SDHCI << 8), 0xFFFF00) |
2518 | }, |
2519 | @@ -674,10 +683,17 @@ static void sdhci_set_power(struct sdhci_host *host, unsigned short power) |
2520 | if (host->power == power) |
2521 | return; |
2522 | |
2523 | - writeb(0, host->ioaddr + SDHCI_POWER_CONTROL); |
2524 | - |
2525 | - if (power == (unsigned short)-1) |
2526 | + if (power == (unsigned short)-1) { |
2527 | + writeb(0, host->ioaddr + SDHCI_POWER_CONTROL); |
2528 | goto out; |
2529 | + } |
2530 | + |
2531 | + /* |
2532 | + * Spec says that we should clear the power reg before setting |
2533 | + * a new value. Some controllers don't seem to like this though. |
2534 | + */ |
2535 | + if (!(host->chip->quirks & SDHCI_QUIRK_SINGLE_POWER_WRITE)) |
2536 | + writeb(0, host->ioaddr + SDHCI_POWER_CONTROL); |
2537 | |
2538 | pwr = SDHCI_POWER_ON; |
2539 | |
2540 | diff --git a/drivers/mtd/redboot.c b/drivers/mtd/redboot.c |
2541 | index 035cd9b..a61351f 100644 |
2542 | --- a/drivers/mtd/redboot.c |
2543 | +++ b/drivers/mtd/redboot.c |
2544 | @@ -94,8 +94,19 @@ static int parse_redboot_partitions(struct mtd_info *master, |
2545 | * (NOTE: this is 'size' not 'data_length'; size is |
2546 | * the full size of the entry.) |
2547 | */ |
2548 | - if (swab32(buf[i].size) == master->erasesize) { |
2549 | + |
2550 | + /* RedBoot can combine the FIS directory and |
2551 | + config partitions into a single eraseblock; |
2552 | + we assume wrong-endian if either the swapped |
2553 | + 'size' matches the eraseblock size precisely, |
2554 | + or if the swapped size actually fits in an |
2555 | + eraseblock while the unswapped size doesn't. */ |
2556 | + if (swab32(buf[i].size) == master->erasesize || |
2557 | + (buf[i].size > master->erasesize |
2558 | + && swab32(buf[i].size) < master->erasesize)) { |
2559 | int j; |
2560 | + /* Update numslots based on actual FIS directory size */ |
2561 | + numslots = swab32(buf[i].size) / sizeof (struct fis_image_desc); |
2562 | for (j = 0; j < numslots; ++j) { |
2563 | |
2564 | /* A single 0xff denotes a deleted entry. |
2565 | @@ -120,11 +131,11 @@ static int parse_redboot_partitions(struct mtd_info *master, |
2566 | swab32s(&buf[j].desc_cksum); |
2567 | swab32s(&buf[j].file_cksum); |
2568 | } |
2569 | + } else if (buf[i].size < master->erasesize) { |
2570 | + /* Update numslots based on actual FIS directory size */ |
2571 | + numslots = buf[i].size / sizeof(struct fis_image_desc); |
2572 | } |
2573 | break; |
2574 | - } else { |
2575 | - /* re-calculate of real numslots */ |
2576 | - numslots = buf[i].size / sizeof(struct fis_image_desc); |
2577 | } |
2578 | } |
2579 | if (i == numslots) { |
2580 | diff --git a/drivers/net/forcedeth.c b/drivers/net/forcedeth.c |
2581 | index 93f2b7a..952a6bd 100644 |
2582 | --- a/drivers/net/forcedeth.c |
2583 | +++ b/drivers/net/forcedeth.c |
2584 | @@ -825,7 +825,7 @@ enum { |
2585 | NV_MSIX_INT_DISABLED, |
2586 | NV_MSIX_INT_ENABLED |
2587 | }; |
2588 | -static int msix = NV_MSIX_INT_ENABLED; |
2589 | +static int msix = NV_MSIX_INT_DISABLED; |
2590 | |
2591 | /* |
2592 | * DMA 64bit |
2593 | diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c |
2594 | index 822dd0b..f44c397 100644 |
2595 | --- a/drivers/net/sky2.c |
2596 | +++ b/drivers/net/sky2.c |
2597 | @@ -1796,6 +1796,7 @@ out: |
2598 | |
2599 | /* Transmit timeout is only called if we are running, carries is up |
2600 | * and tx queue is full (stopped). |
2601 | + * Called with netif_tx_lock held. |
2602 | */ |
2603 | static void sky2_tx_timeout(struct net_device *dev) |
2604 | { |
2605 | @@ -1821,17 +1822,14 @@ static void sky2_tx_timeout(struct net_device *dev) |
2606 | sky2_write8(hw, STAT_TX_TIMER_CTRL, TIM_START); |
2607 | } else if (report != sky2->tx_cons) { |
2608 | printk(KERN_INFO PFX "status report lost?\n"); |
2609 | - |
2610 | - netif_tx_lock_bh(dev); |
2611 | sky2_tx_complete(sky2, report); |
2612 | - netif_tx_unlock_bh(dev); |
2613 | } else { |
2614 | printk(KERN_INFO PFX "hardware hung? flushing\n"); |
2615 | |
2616 | sky2_write32(hw, Q_ADDR(txq, Q_CSR), BMU_STOP); |
2617 | sky2_write32(hw, Y2_QADDR(txq, PREF_UNIT_CTRL), PREF_UNIT_RST_SET); |
2618 | |
2619 | - sky2_tx_clean(dev); |
2620 | + sky2_tx_complete(sky2, sky2->tx_prod); |
2621 | |
2622 | sky2_qset(hw, txq); |
2623 | sky2_prefetch_init(hw, txq, sky2->tx_le_map, TX_RING_SIZE - 1); |
2624 | diff --git a/drivers/net/sky2.h b/drivers/net/sky2.h |
2625 | index 6ed1d47..148aab2 100644 |
2626 | --- a/drivers/net/sky2.h |
2627 | +++ b/drivers/net/sky2.h |
2628 | @@ -1579,7 +1579,7 @@ enum { |
2629 | |
2630 | GMR_FS_ANY_ERR = GMR_FS_RX_FF_OV | GMR_FS_CRC_ERR | |
2631 | GMR_FS_FRAGMENT | GMR_FS_LONG_ERR | |
2632 | - GMR_FS_MII_ERR | GMR_FS_GOOD_FC | GMR_FS_BAD_FC | |
2633 | + GMR_FS_MII_ERR | GMR_FS_BAD_FC | |
2634 | GMR_FS_UN_SIZE | GMR_FS_JABBER, |
2635 | }; |
2636 | |
2637 | diff --git a/drivers/net/tulip/dmfe.c b/drivers/net/tulip/dmfe.c |
2638 | index 7f59a3d..4dd8a0b 100644 |
2639 | --- a/drivers/net/tulip/dmfe.c |
2640 | +++ b/drivers/net/tulip/dmfe.c |
2641 | @@ -187,7 +187,7 @@ struct rx_desc { |
2642 | struct dmfe_board_info { |
2643 | u32 chip_id; /* Chip vendor/Device ID */ |
2644 | u32 chip_revision; /* Chip revision */ |
2645 | - struct DEVICE *dev; /* net device */ |
2646 | + struct DEVICE *next_dev; /* next device */ |
2647 | struct pci_dev *pdev; /* PCI device */ |
2648 | spinlock_t lock; |
2649 | |
2650 | @@ -399,8 +399,6 @@ static int __devinit dmfe_init_one (struct pci_dev *pdev, |
2651 | /* Init system & device */ |
2652 | db = netdev_priv(dev); |
2653 | |
2654 | - db->dev = dev; |
2655 | - |
2656 | /* Allocate Tx/Rx descriptor memory */ |
2657 | db->desc_pool_ptr = pci_alloc_consistent(pdev, sizeof(struct tx_desc) * DESC_ALL_CNT + 0x20, &db->desc_pool_dma_ptr); |
2658 | db->buf_pool_ptr = pci_alloc_consistent(pdev, TX_BUF_ALLOC * TX_DESC_CNT + 4, &db->buf_pool_dma_ptr); |
2659 | @@ -428,7 +426,6 @@ static int __devinit dmfe_init_one (struct pci_dev *pdev, |
2660 | dev->poll_controller = &poll_dmfe; |
2661 | #endif |
2662 | dev->ethtool_ops = &netdev_ethtool_ops; |
2663 | - netif_carrier_off(db->dev); |
2664 | spin_lock_init(&db->lock); |
2665 | |
2666 | pci_read_config_dword(pdev, 0x50, &pci_pmr); |
2667 | @@ -1053,7 +1050,6 @@ static void netdev_get_drvinfo(struct net_device *dev, |
2668 | |
2669 | static const struct ethtool_ops netdev_ethtool_ops = { |
2670 | .get_drvinfo = netdev_get_drvinfo, |
2671 | - .get_link = ethtool_op_get_link, |
2672 | }; |
2673 | |
2674 | /* |
2675 | @@ -1148,7 +1144,6 @@ static void dmfe_timer(unsigned long data) |
2676 | /* Link Failed */ |
2677 | DMFE_DBUG(0, "Link Failed", tmp_cr12); |
2678 | db->link_failed = 1; |
2679 | - netif_carrier_off(db->dev); |
2680 | |
2681 | /* For Force 10/100M Half/Full mode: Enable Auto-Nego mode */ |
2682 | /* AUTO or force 1M Homerun/Longrun don't need */ |
2683 | @@ -1171,8 +1166,6 @@ static void dmfe_timer(unsigned long data) |
2684 | if ( (db->media_mode & DMFE_AUTO) && |
2685 | dmfe_sense_speed(db) ) |
2686 | db->link_failed = 1; |
2687 | - else |
2688 | - netif_carrier_on(db->dev); |
2689 | dmfe_process_mode(db); |
2690 | /* SHOW_MEDIA_TYPE(db->op_mode); */ |
2691 | } |
2692 | diff --git a/drivers/net/wireless/bcm43xx/bcm43xx.h b/drivers/net/wireless/bcm43xx/bcm43xx.h |
2693 | index 8286678..02ad9b1 100644 |
2694 | --- a/drivers/net/wireless/bcm43xx/bcm43xx.h |
2695 | +++ b/drivers/net/wireless/bcm43xx/bcm43xx.h |
2696 | @@ -21,7 +21,7 @@ |
2697 | #define PFX KBUILD_MODNAME ": " |
2698 | |
2699 | #define BCM43xx_SWITCH_CORE_MAX_RETRIES 50 |
2700 | -#define BCM43xx_IRQWAIT_MAX_RETRIES 50 |
2701 | +#define BCM43xx_IRQWAIT_MAX_RETRIES 100 |
2702 | |
2703 | #define BCM43xx_IO_SIZE 8192 |
2704 | |
2705 | diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_main.c b/drivers/net/wireless/bcm43xx/bcm43xx_main.c |
2706 | index 91b752e..629ba91 100644 |
2707 | --- a/drivers/net/wireless/bcm43xx/bcm43xx_main.c |
2708 | +++ b/drivers/net/wireless/bcm43xx/bcm43xx_main.c |
2709 | @@ -1453,12 +1453,10 @@ static void handle_irq_transmit_status(struct bcm43xx_private *bcm) |
2710 | |
2711 | bcm43xx_debugfs_log_txstat(bcm, &stat); |
2712 | |
2713 | - if (stat.flags & BCM43xx_TXSTAT_FLAG_IGNORE) |
2714 | + if (stat.flags & BCM43xx_TXSTAT_FLAG_AMPDU) |
2715 | + continue; |
2716 | + if (stat.flags & BCM43xx_TXSTAT_FLAG_INTER) |
2717 | continue; |
2718 | - if (!(stat.flags & BCM43xx_TXSTAT_FLAG_ACK)) { |
2719 | - //TODO: packet was not acked (was lost) |
2720 | - } |
2721 | - //TODO: There are more (unknown) flags to test. see bcm43xx_main.h |
2722 | |
2723 | if (bcm43xx_using_pio(bcm)) |
2724 | bcm43xx_pio_handle_xmitstatus(bcm, &stat); |
2725 | @@ -1866,9 +1864,6 @@ static irqreturn_t bcm43xx_interrupt_handler(int irq, void *dev_id) |
2726 | |
2727 | spin_lock(&bcm->irq_lock); |
2728 | |
2729 | - assert(bcm43xx_status(bcm) == BCM43xx_STAT_INITIALIZED); |
2730 | - assert(bcm->current_core->id == BCM43xx_COREID_80211); |
2731 | - |
2732 | reason = bcm43xx_read32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON); |
2733 | if (reason == 0xffffffff) { |
2734 | /* irq not for us (shared irq) */ |
2735 | @@ -1879,6 +1874,9 @@ static irqreturn_t bcm43xx_interrupt_handler(int irq, void *dev_id) |
2736 | if (!reason) |
2737 | goto out; |
2738 | |
2739 | + assert(bcm43xx_status(bcm) == BCM43xx_STAT_INITIALIZED); |
2740 | + assert(bcm->current_core->id == BCM43xx_COREID_80211); |
2741 | + |
2742 | bcm->dma_reason[0] = bcm43xx_read32(bcm, BCM43xx_MMIO_DMA0_REASON) |
2743 | & 0x0001DC00; |
2744 | bcm->dma_reason[1] = bcm43xx_read32(bcm, BCM43xx_MMIO_DMA1_REASON) |
2745 | @@ -2738,8 +2736,9 @@ static int bcm43xx_probe_cores(struct bcm43xx_private *bcm) |
2746 | * dangling pins on the second core. Be careful |
2747 | * and ignore these cores here. |
2748 | */ |
2749 | - if (bcm->pci_dev->device != 0x4324) { |
2750 | - dprintk(KERN_INFO PFX "Ignoring additional 802.11 core.\n"); |
2751 | + if (1 /*bcm->pci_dev->device != 0x4324*/ ) { |
2752 | + /* TODO: A PHY */ |
2753 | + dprintk(KERN_INFO PFX "Ignoring additional 802.11a core.\n"); |
2754 | continue; |
2755 | } |
2756 | } |
2757 | diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_xmit.h b/drivers/net/wireless/bcm43xx/bcm43xx_xmit.h |
2758 | index 2aed19e..9ecf2bf 100644 |
2759 | --- a/drivers/net/wireless/bcm43xx/bcm43xx_xmit.h |
2760 | +++ b/drivers/net/wireless/bcm43xx/bcm43xx_xmit.h |
2761 | @@ -137,14 +137,8 @@ struct bcm43xx_xmitstatus { |
2762 | u16 unknown; //FIXME |
2763 | }; |
2764 | |
2765 | -#define BCM43xx_TXSTAT_FLAG_ACK 0x01 |
2766 | -//TODO #define BCM43xx_TXSTAT_FLAG_??? 0x02 |
2767 | -//TODO #define BCM43xx_TXSTAT_FLAG_??? 0x04 |
2768 | -//TODO #define BCM43xx_TXSTAT_FLAG_??? 0x08 |
2769 | -//TODO #define BCM43xx_TXSTAT_FLAG_??? 0x10 |
2770 | -#define BCM43xx_TXSTAT_FLAG_IGNORE 0x20 |
2771 | -//TODO #define BCM43xx_TXSTAT_FLAG_??? 0x40 |
2772 | -//TODO #define BCM43xx_TXSTAT_FLAG_??? 0x80 |
2773 | +#define BCM43xx_TXSTAT_FLAG_AMPDU 0x10 |
2774 | +#define BCM43xx_TXSTAT_FLAG_INTER 0x20 |
2775 | |
2776 | u8 bcm43xx_plcp_get_ratecode_cck(const u8 bitrate); |
2777 | u8 bcm43xx_plcp_get_ratecode_ofdm(const u8 bitrate); |
2778 | diff --git a/drivers/net/wireless/prism54/isl_ioctl.c b/drivers/net/wireless/prism54/isl_ioctl.c |
2779 | index 838d510..a5396c1 100644 |
2780 | --- a/drivers/net/wireless/prism54/isl_ioctl.c |
2781 | +++ b/drivers/net/wireless/prism54/isl_ioctl.c |
2782 | @@ -1395,11 +1395,16 @@ static int prism54_set_auth(struct net_device *ndev, |
2783 | break; |
2784 | |
2785 | case IW_AUTH_RX_UNENCRYPTED_EAPOL: |
2786 | - dot1x = param->value ? 1 : 0; |
2787 | + /* dot1x should be the opposite of RX_UNENCRYPTED_EAPOL; |
2788 | + * turn off dot1x when allowing recepit of unencrypted eapol |
2789 | + * frames, turn on dot1x when we disallow receipt |
2790 | + */ |
2791 | + dot1x = param->value ? 0x00 : 0x01; |
2792 | break; |
2793 | |
2794 | case IW_AUTH_PRIVACY_INVOKED: |
2795 | privinvoked = param->value ? 1 : 0; |
2796 | + break; |
2797 | |
2798 | case IW_AUTH_DROP_UNENCRYPTED: |
2799 | exunencrypt = param->value ? 1 : 0; |
2800 | @@ -1589,6 +1594,7 @@ static int prism54_set_encodeext(struct net_device *ndev, |
2801 | } |
2802 | key.type = DOT11_PRIV_TKIP; |
2803 | key.length = KEY_SIZE_TKIP; |
2804 | + break; |
2805 | default: |
2806 | return -EINVAL; |
2807 | } |
2808 | diff --git a/drivers/rtc/rtc-pcf8563.c b/drivers/rtc/rtc-pcf8563.c |
2809 | index 4b72b8e..038118b 100644 |
2810 | --- a/drivers/rtc/rtc-pcf8563.c |
2811 | +++ b/drivers/rtc/rtc-pcf8563.c |
2812 | @@ -53,6 +53,25 @@ I2C_CLIENT_INSMOD; |
2813 | #define PCF8563_SC_LV 0x80 /* low voltage */ |
2814 | #define PCF8563_MO_C 0x80 /* century */ |
2815 | |
2816 | +struct pcf8563 { |
2817 | + struct i2c_client client; |
2818 | + /* |
2819 | + * The meaning of MO_C bit varies by the chip type. |
2820 | + * From PCF8563 datasheet: this bit is toggled when the years |
2821 | + * register overflows from 99 to 00 |
2822 | + * 0 indicates the century is 20xx |
2823 | + * 1 indicates the century is 19xx |
2824 | + * From RTC8564 datasheet: this bit indicates change of |
2825 | + * century. When the year digit data overflows from 99 to 00, |
2826 | + * this bit is set. By presetting it to 0 while still in the |
2827 | + * 20th century, it will be set in year 2000, ... |
2828 | + * There seems no reliable way to know how the system use this |
2829 | + * bit. So let's do it heuristically, assuming we are live in |
2830 | + * 1970...2069. |
2831 | + */ |
2832 | + int c_polarity; /* 0: MO_C=1 means 19xx, otherwise MO_C=1 means 20xx */ |
2833 | +}; |
2834 | + |
2835 | static int pcf8563_probe(struct i2c_adapter *adapter, int address, int kind); |
2836 | static int pcf8563_detach(struct i2c_client *client); |
2837 | |
2838 | @@ -62,6 +81,7 @@ static int pcf8563_detach(struct i2c_client *client); |
2839 | */ |
2840 | static int pcf8563_get_datetime(struct i2c_client *client, struct rtc_time *tm) |
2841 | { |
2842 | + struct pcf8563 *pcf8563 = container_of(client, struct pcf8563, client); |
2843 | unsigned char buf[13] = { PCF8563_REG_ST1 }; |
2844 | |
2845 | struct i2c_msg msgs[] = { |
2846 | @@ -94,8 +114,12 @@ static int pcf8563_get_datetime(struct i2c_client *client, struct rtc_time *tm) |
2847 | tm->tm_mday = BCD2BIN(buf[PCF8563_REG_DM] & 0x3F); |
2848 | tm->tm_wday = buf[PCF8563_REG_DW] & 0x07; |
2849 | tm->tm_mon = BCD2BIN(buf[PCF8563_REG_MO] & 0x1F) - 1; /* rtc mn 1-12 */ |
2850 | - tm->tm_year = BCD2BIN(buf[PCF8563_REG_YR]) |
2851 | - + (buf[PCF8563_REG_MO] & PCF8563_MO_C ? 0 : 100); |
2852 | + tm->tm_year = BCD2BIN(buf[PCF8563_REG_YR]); |
2853 | + if (tm->tm_year < 70) |
2854 | + tm->tm_year += 100; /* assume we are in 1970...2069 */ |
2855 | + /* detect the polarity heuristically. see note above. */ |
2856 | + pcf8563->c_polarity = (buf[PCF8563_REG_MO] & PCF8563_MO_C) ? |
2857 | + (tm->tm_year >= 100) : (tm->tm_year < 100); |
2858 | |
2859 | dev_dbg(&client->dev, "%s: tm is secs=%d, mins=%d, hours=%d, " |
2860 | "mday=%d, mon=%d, year=%d, wday=%d\n", |
2861 | @@ -114,6 +138,7 @@ static int pcf8563_get_datetime(struct i2c_client *client, struct rtc_time *tm) |
2862 | |
2863 | static int pcf8563_set_datetime(struct i2c_client *client, struct rtc_time *tm) |
2864 | { |
2865 | + struct pcf8563 *pcf8563 = container_of(client, struct pcf8563, client); |
2866 | int i, err; |
2867 | unsigned char buf[9]; |
2868 | |
2869 | @@ -135,7 +160,7 @@ static int pcf8563_set_datetime(struct i2c_client *client, struct rtc_time *tm) |
2870 | |
2871 | /* year and century */ |
2872 | buf[PCF8563_REG_YR] = BIN2BCD(tm->tm_year % 100); |
2873 | - if (tm->tm_year < 100) |
2874 | + if (pcf8563->c_polarity ? (tm->tm_year >= 100) : (tm->tm_year < 100)) |
2875 | buf[PCF8563_REG_MO] |= PCF8563_MO_C; |
2876 | |
2877 | buf[PCF8563_REG_DW] = tm->tm_wday & 0x07; |
2878 | @@ -248,6 +273,7 @@ static struct i2c_driver pcf8563_driver = { |
2879 | |
2880 | static int pcf8563_probe(struct i2c_adapter *adapter, int address, int kind) |
2881 | { |
2882 | + struct pcf8563 *pcf8563; |
2883 | struct i2c_client *client; |
2884 | struct rtc_device *rtc; |
2885 | |
2886 | @@ -260,11 +286,12 @@ static int pcf8563_probe(struct i2c_adapter *adapter, int address, int kind) |
2887 | goto exit; |
2888 | } |
2889 | |
2890 | - if (!(client = kzalloc(sizeof(struct i2c_client), GFP_KERNEL))) { |
2891 | + if (!(pcf8563 = kzalloc(sizeof(struct pcf8563), GFP_KERNEL))) { |
2892 | err = -ENOMEM; |
2893 | goto exit; |
2894 | } |
2895 | |
2896 | + client = &pcf8563->client; |
2897 | client->addr = address; |
2898 | client->driver = &pcf8563_driver; |
2899 | client->adapter = adapter; |
2900 | @@ -301,7 +328,7 @@ exit_detach: |
2901 | i2c_detach_client(client); |
2902 | |
2903 | exit_kfree: |
2904 | - kfree(client); |
2905 | + kfree(pcf8563); |
2906 | |
2907 | exit: |
2908 | return err; |
2909 | @@ -309,6 +336,7 @@ exit: |
2910 | |
2911 | static int pcf8563_detach(struct i2c_client *client) |
2912 | { |
2913 | + struct pcf8563 *pcf8563 = container_of(client, struct pcf8563, client); |
2914 | int err; |
2915 | struct rtc_device *rtc = i2c_get_clientdata(client); |
2916 | |
2917 | @@ -318,7 +346,7 @@ static int pcf8563_detach(struct i2c_client *client) |
2918 | if ((err = i2c_detach_client(client))) |
2919 | return err; |
2920 | |
2921 | - kfree(client); |
2922 | + kfree(pcf8563); |
2923 | |
2924 | return 0; |
2925 | } |
2926 | diff --git a/drivers/sbus/char/bbc_i2c.c b/drivers/sbus/char/bbc_i2c.c |
2927 | index 22631f8..8410587 100644 |
2928 | --- a/drivers/sbus/char/bbc_i2c.c |
2929 | +++ b/drivers/sbus/char/bbc_i2c.c |
2930 | @@ -187,19 +187,20 @@ static int wait_for_pin(struct bbc_i2c_bus *bp, u8 *status) |
2931 | bp->waiting = 1; |
2932 | add_wait_queue(&bp->wq, &wait); |
2933 | while (limit-- > 0) { |
2934 | - u8 val; |
2935 | - |
2936 | - set_current_state(TASK_INTERRUPTIBLE); |
2937 | - *status = val = readb(bp->i2c_control_regs + 0); |
2938 | - if ((val & I2C_PCF_PIN) == 0) { |
2939 | + unsigned long val; |
2940 | + |
2941 | + val = wait_event_interruptible_timeout( |
2942 | + bp->wq, |
2943 | + (((*status = readb(bp->i2c_control_regs + 0)) |
2944 | + & I2C_PCF_PIN) == 0), |
2945 | + msecs_to_jiffies(250)); |
2946 | + if (val > 0) { |
2947 | ret = 0; |
2948 | break; |
2949 | } |
2950 | - msleep_interruptible(250); |
2951 | } |
2952 | remove_wait_queue(&bp->wq, &wait); |
2953 | bp->waiting = 0; |
2954 | - current->state = TASK_RUNNING; |
2955 | |
2956 | return ret; |
2957 | } |
2958 | @@ -340,7 +341,7 @@ static irqreturn_t bbc_i2c_interrupt(int irq, void *dev_id) |
2959 | */ |
2960 | if (bp->waiting && |
2961 | !(readb(bp->i2c_control_regs + 0x0) & I2C_PCF_PIN)) |
2962 | - wake_up(&bp->wq); |
2963 | + wake_up_interruptible(&bp->wq); |
2964 | |
2965 | return IRQ_HANDLED; |
2966 | } |
2967 | diff --git a/drivers/usb/atm/ueagle-atm.c b/drivers/usb/atm/ueagle-atm.c |
2968 | index dae4ef1..4973e14 100644 |
2969 | --- a/drivers/usb/atm/ueagle-atm.c |
2970 | +++ b/drivers/usb/atm/ueagle-atm.c |
2971 | @@ -61,6 +61,7 @@ |
2972 | #include <linux/usb.h> |
2973 | #include <linux/firmware.h> |
2974 | #include <linux/ctype.h> |
2975 | +#include <linux/sched.h> |
2976 | #include <linux/kthread.h> |
2977 | #include <linux/version.h> |
2978 | #include <linux/mutex.h> |
2979 | diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c |
2980 | index 1988224..8ddeed3 100644 |
2981 | --- a/drivers/usb/core/hub.c |
2982 | +++ b/drivers/usb/core/hub.c |
2983 | @@ -44,6 +44,7 @@ struct usb_hub { |
2984 | struct usb_hub_status hub; |
2985 | struct usb_port_status port; |
2986 | } *status; /* buffer for status reports */ |
2987 | + struct mutex status_mutex; /* for the status buffer */ |
2988 | |
2989 | int error; /* last reported error */ |
2990 | int nerrors; /* track consecutive errors */ |
2991 | @@ -538,6 +539,7 @@ static int hub_hub_status(struct usb_hub *hub, |
2992 | { |
2993 | int ret; |
2994 | |
2995 | + mutex_lock(&hub->status_mutex); |
2996 | ret = get_hub_status(hub->hdev, &hub->status->hub); |
2997 | if (ret < 0) |
2998 | dev_err (hub->intfdev, |
2999 | @@ -547,6 +549,7 @@ static int hub_hub_status(struct usb_hub *hub, |
3000 | *change = le16_to_cpu(hub->status->hub.wHubChange); |
3001 | ret = 0; |
3002 | } |
3003 | + mutex_unlock(&hub->status_mutex); |
3004 | return ret; |
3005 | } |
3006 | |
3007 | @@ -620,6 +623,7 @@ static int hub_configure(struct usb_hub *hub, |
3008 | ret = -ENOMEM; |
3009 | goto fail; |
3010 | } |
3011 | + mutex_init(&hub->status_mutex); |
3012 | |
3013 | hub->descriptor = kmalloc(sizeof(*hub->descriptor), GFP_KERNEL); |
3014 | if (!hub->descriptor) { |
3015 | @@ -1418,6 +1422,7 @@ static int hub_port_status(struct usb_hub *hub, int port1, |
3016 | { |
3017 | int ret; |
3018 | |
3019 | + mutex_lock(&hub->status_mutex); |
3020 | ret = get_port_status(hub->hdev, port1, &hub->status->port); |
3021 | if (ret < 4) { |
3022 | dev_err (hub->intfdev, |
3023 | @@ -1429,6 +1434,7 @@ static int hub_port_status(struct usb_hub *hub, int port1, |
3024 | *change = le16_to_cpu(hub->status->port.wPortChange); |
3025 | ret = 0; |
3026 | } |
3027 | + mutex_unlock(&hub->status_mutex); |
3028 | return ret; |
3029 | } |
3030 | |
3031 | diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c |
3032 | index 025d333..6e9fdd6 100644 |
3033 | --- a/drivers/usb/host/ehci-hcd.c |
3034 | +++ b/drivers/usb/host/ehci-hcd.c |
3035 | @@ -296,6 +296,18 @@ static void ehci_watchdog (unsigned long param) |
3036 | spin_unlock_irqrestore (&ehci->lock, flags); |
3037 | } |
3038 | |
3039 | +/* On some systems, leaving remote wakeup enabled prevents system shutdown. |
3040 | + * The firmware seems to think that powering off is a wakeup event! |
3041 | + * This routine turns off remote wakeup and everything else, on all ports. |
3042 | + */ |
3043 | +static void ehci_turn_off_all_ports(struct ehci_hcd *ehci) |
3044 | +{ |
3045 | + int port = HCS_N_PORTS(ehci->hcs_params); |
3046 | + |
3047 | + while (port--) |
3048 | + writel(PORT_RWC_BITS, &ehci->regs->port_status[port]); |
3049 | +} |
3050 | + |
3051 | /* ehci_shutdown kick in for silicon on any bus (not just pci, etc). |
3052 | * This forcibly disables dma and IRQs, helping kexec and other cases |
3053 | * where the next system software may expect clean state. |
3054 | @@ -307,9 +319,13 @@ ehci_shutdown (struct usb_hcd *hcd) |
3055 | |
3056 | ehci = hcd_to_ehci (hcd); |
3057 | (void) ehci_halt (ehci); |
3058 | + ehci_turn_off_all_ports(ehci); |
3059 | |
3060 | /* make BIOS/etc use companion controller during reboot */ |
3061 | writel (0, &ehci->regs->configured_flag); |
3062 | + |
3063 | + /* unblock posted writes */ |
3064 | + readl(&ehci->regs->configured_flag); |
3065 | } |
3066 | |
3067 | static void ehci_port_power (struct ehci_hcd *ehci, int is_on) |
3068 | diff --git a/drivers/usb/host/uhci-hub.c b/drivers/usb/host/uhci-hub.c |
3069 | index bacc25c..8e4427a 100644 |
3070 | --- a/drivers/usb/host/uhci-hub.c |
3071 | +++ b/drivers/usb/host/uhci-hub.c |
3072 | @@ -33,6 +33,9 @@ static __u8 root_hub_hub_des[] = |
3073 | /* status change bits: nonzero writes will clear */ |
3074 | #define RWC_BITS (USBPORTSC_OCC | USBPORTSC_PEC | USBPORTSC_CSC) |
3075 | |
3076 | +/* suspend/resume bits: port suspended or port resuming */ |
3077 | +#define SUSPEND_BITS (USBPORTSC_SUSP | USBPORTSC_RD) |
3078 | + |
3079 | /* A port that either is connected or has a changed-bit set will prevent |
3080 | * us from AUTO_STOPPING. |
3081 | */ |
3082 | @@ -96,8 +99,8 @@ static void uhci_finish_suspend(struct uhci_hcd *uhci, int port, |
3083 | int status; |
3084 | int i; |
3085 | |
3086 | - if (inw(port_addr) & (USBPORTSC_SUSP | USBPORTSC_RD)) { |
3087 | - CLR_RH_PORTSTAT(USBPORTSC_SUSP | USBPORTSC_RD); |
3088 | + if (inw(port_addr) & SUSPEND_BITS) { |
3089 | + CLR_RH_PORTSTAT(SUSPEND_BITS); |
3090 | if (test_bit(port, &uhci->resuming_ports)) |
3091 | set_bit(port, &uhci->port_c_suspend); |
3092 | |
3093 | @@ -107,7 +110,7 @@ static void uhci_finish_suspend(struct uhci_hcd *uhci, int port, |
3094 | * Experiments show that some controllers take longer, so |
3095 | * we'll poll for completion. */ |
3096 | for (i = 0; i < 10; ++i) { |
3097 | - if (!(inw(port_addr) & USBPORTSC_RD)) |
3098 | + if (!(inw(port_addr) & SUSPEND_BITS)) |
3099 | break; |
3100 | udelay(1); |
3101 | } |
3102 | @@ -289,7 +292,7 @@ static int uhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, |
3103 | wPortStatus |= USB_PORT_STAT_CONNECTION; |
3104 | if (status & USBPORTSC_PE) { |
3105 | wPortStatus |= USB_PORT_STAT_ENABLE; |
3106 | - if (status & (USBPORTSC_SUSP | USBPORTSC_RD)) |
3107 | + if (status & SUSPEND_BITS) |
3108 | wPortStatus |= USB_PORT_STAT_SUSPEND; |
3109 | } |
3110 | if (status & USBPORTSC_OC) |
3111 | diff --git a/drivers/usb/input/hid-core.c b/drivers/usb/input/hid-core.c |
3112 | index c6c9e72..dd9e546 100644 |
3113 | --- a/drivers/usb/input/hid-core.c |
3114 | +++ b/drivers/usb/input/hid-core.c |
3115 | @@ -1212,8 +1212,8 @@ static struct hid_device *usb_hid_configure(struct usb_interface *intf) |
3116 | le16_to_cpu(dev->descriptor.idProduct)); |
3117 | |
3118 | hid->bus = BUS_USB; |
3119 | - hid->vendor = dev->descriptor.idVendor; |
3120 | - hid->product = dev->descriptor.idProduct; |
3121 | + hid->vendor = le16_to_cpu(dev->descriptor.idVendor); |
3122 | + hid->product = le16_to_cpu(dev->descriptor.idProduct); |
3123 | |
3124 | usb_make_path(dev, hid->phys, sizeof(hid->phys)); |
3125 | strlcat(hid->phys, "/input", sizeof(hid->phys)); |
3126 | diff --git a/drivers/usb/misc/appledisplay.c b/drivers/usb/misc/appledisplay.c |
3127 | index a7932a7..32f0e3a 100644 |
3128 | --- a/drivers/usb/misc/appledisplay.c |
3129 | +++ b/drivers/usb/misc/appledisplay.c |
3130 | @@ -281,8 +281,8 @@ static int appledisplay_probe(struct usb_interface *iface, |
3131 | /* Register backlight device */ |
3132 | snprintf(bl_name, sizeof(bl_name), "appledisplay%d", |
3133 | atomic_inc_return(&count_displays) - 1); |
3134 | - pdata->bd = backlight_device_register(bl_name, NULL, NULL, |
3135 | - &appledisplay_bl_data); |
3136 | + pdata->bd = backlight_device_register(bl_name, NULL, |
3137 | + pdata, &appledisplay_bl_data); |
3138 | if (IS_ERR(pdata->bd)) { |
3139 | err("appledisplay: Backlight registration failed"); |
3140 | goto error; |
3141 | diff --git a/drivers/usb/net/usbnet.c b/drivers/usb/net/usbnet.c |
3142 | index 6e39e99..d2acc15 100644 |
3143 | --- a/drivers/usb/net/usbnet.c |
3144 | +++ b/drivers/usb/net/usbnet.c |
3145 | @@ -1182,6 +1182,9 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod) |
3146 | // NOTE net->name still not usable ... |
3147 | if (info->bind) { |
3148 | status = info->bind (dev, udev); |
3149 | + if (status < 0) |
3150 | + goto out1; |
3151 | + |
3152 | // heuristic: "usb%d" for links we know are two-host, |
3153 | // else "eth%d" when there's reasonable doubt. userspace |
3154 | // can rename the link if it knows better. |
3155 | @@ -1208,12 +1211,12 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod) |
3156 | if (status == 0 && dev->status) |
3157 | status = init_status (dev, udev); |
3158 | if (status < 0) |
3159 | - goto out1; |
3160 | + goto out3; |
3161 | |
3162 | if (!dev->rx_urb_size) |
3163 | dev->rx_urb_size = dev->hard_mtu; |
3164 | dev->maxpacket = usb_maxpacket (dev->udev, dev->out, 1); |
3165 | - |
3166 | + |
3167 | SET_NETDEV_DEV(net, &udev->dev); |
3168 | status = register_netdev (net); |
3169 | if (status) |
3170 | diff --git a/drivers/video/aty/mach64_ct.c b/drivers/video/aty/mach64_ct.c |
3171 | index f3b487b..1fdcfdb 100644 |
3172 | --- a/drivers/video/aty/mach64_ct.c |
3173 | +++ b/drivers/video/aty/mach64_ct.c |
3174 | @@ -598,7 +598,6 @@ static void aty_resume_pll_ct(const struct fb_info *info, |
3175 | struct atyfb_par *par = info->par; |
3176 | |
3177 | if (par->mclk_per != par->xclk_per) { |
3178 | - int i; |
3179 | /* |
3180 | * This disables the sclk, crashes the computer as reported: |
3181 | * aty_st_pll_ct(SPLL_CNTL2, 3, info); |
3182 | @@ -614,7 +613,7 @@ static void aty_resume_pll_ct(const struct fb_info *info, |
3183 | * helps for Rage Mobilities that sometimes crash when |
3184 | * we switch to sclk. (Daniel Mantione, 13-05-2003) |
3185 | */ |
3186 | - for (i=0;i<=0x1ffff;i++); |
3187 | + udelay(500); |
3188 | } |
3189 | |
3190 | aty_st_pll_ct(PLL_REF_DIV, pll->ct.pll_ref_div, par); |
3191 | diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c |
3192 | index 9109ba1..378767c 100644 |
3193 | --- a/fs/9p/vfs_inode.c |
3194 | +++ b/fs/9p/vfs_inode.c |
3195 | @@ -585,17 +585,14 @@ static int v9fs_vfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) |
3196 | if (IS_ERR(inode)) { |
3197 | err = PTR_ERR(inode); |
3198 | inode = NULL; |
3199 | - goto clean_up_fids; |
3200 | + v9fs_fid_destroy(vfid); |
3201 | + goto error; |
3202 | } |
3203 | |
3204 | dentry->d_op = &v9fs_dentry_operations; |
3205 | d_instantiate(dentry, inode); |
3206 | return 0; |
3207 | |
3208 | -clean_up_fids: |
3209 | - if (vfid) |
3210 | - v9fs_fid_destroy(vfid); |
3211 | - |
3212 | clean_up_dfid: |
3213 | v9fs_fid_clunk(v9ses, dfid); |
3214 | |
3215 | diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c |
3216 | index 669dbe5..51db118 100644 |
3217 | --- a/fs/binfmt_elf.c |
3218 | +++ b/fs/binfmt_elf.c |
3219 | @@ -76,7 +76,8 @@ static struct linux_binfmt elf_format = { |
3220 | .load_binary = load_elf_binary, |
3221 | .load_shlib = load_elf_library, |
3222 | .core_dump = elf_core_dump, |
3223 | - .min_coredump = ELF_EXEC_PAGESIZE |
3224 | + .min_coredump = ELF_EXEC_PAGESIZE, |
3225 | + .hasvdso = 1 |
3226 | }; |
3227 | |
3228 | #define BAD_ADDR(x) ((unsigned long)(x) >= TASK_SIZE) |
3229 | diff --git a/fs/buffer.c b/fs/buffer.c |
3230 | index 1ad674f..05c5d02 100644 |
3231 | --- a/fs/buffer.c |
3232 | +++ b/fs/buffer.c |
3233 | @@ -78,6 +78,7 @@ EXPORT_SYMBOL(__lock_buffer); |
3234 | |
3235 | void fastcall unlock_buffer(struct buffer_head *bh) |
3236 | { |
3237 | + smp_mb__before_clear_bit(); |
3238 | clear_buffer_locked(bh); |
3239 | smp_mb__after_clear_bit(); |
3240 | wake_up_bit(&bh->b_state, BH_Lock); |
3241 | diff --git a/fs/ext2/super.c b/fs/ext2/super.c |
3242 | index 6347c2d..daaa243 100644 |
3243 | --- a/fs/ext2/super.c |
3244 | +++ b/fs/ext2/super.c |
3245 | @@ -708,10 +708,14 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent) |
3246 | set_opt(sbi->s_mount_opt, GRPID); |
3247 | if (def_mount_opts & EXT2_DEFM_UID16) |
3248 | set_opt(sbi->s_mount_opt, NO_UID32); |
3249 | +#ifdef CONFIG_EXT2_FS_XATTR |
3250 | if (def_mount_opts & EXT2_DEFM_XATTR_USER) |
3251 | set_opt(sbi->s_mount_opt, XATTR_USER); |
3252 | +#endif |
3253 | +#ifdef CONFIG_EXT2_FS_POSIX_ACL |
3254 | if (def_mount_opts & EXT2_DEFM_ACL) |
3255 | set_opt(sbi->s_mount_opt, POSIX_ACL); |
3256 | +#endif |
3257 | |
3258 | if (le16_to_cpu(sbi->s_es->s_errors) == EXT2_ERRORS_PANIC) |
3259 | set_opt(sbi->s_mount_opt, ERRORS_PANIC); |
3260 | diff --git a/fs/ext3/super.c b/fs/ext3/super.c |
3261 | index b348867..1c0a51b 100644 |
3262 | --- a/fs/ext3/super.c |
3263 | +++ b/fs/ext3/super.c |
3264 | @@ -1459,10 +1459,14 @@ static int ext3_fill_super (struct super_block *sb, void *data, int silent) |
3265 | set_opt(sbi->s_mount_opt, GRPID); |
3266 | if (def_mount_opts & EXT3_DEFM_UID16) |
3267 | set_opt(sbi->s_mount_opt, NO_UID32); |
3268 | +#ifdef CONFIG_EXT3_FS_XATTR |
3269 | if (def_mount_opts & EXT3_DEFM_XATTR_USER) |
3270 | set_opt(sbi->s_mount_opt, XATTR_USER); |
3271 | +#endif |
3272 | +#ifdef CONFIG_EXT3_FS_POSIX_ACL |
3273 | if (def_mount_opts & EXT3_DEFM_ACL) |
3274 | set_opt(sbi->s_mount_opt, POSIX_ACL); |
3275 | +#endif |
3276 | if ((def_mount_opts & EXT3_DEFM_JMODE) == EXT3_DEFM_JMODE_DATA) |
3277 | sbi->s_mount_opt |= EXT3_MOUNT_JOURNAL_DATA; |
3278 | else if ((def_mount_opts & EXT3_DEFM_JMODE) == EXT3_DEFM_JMODE_ORDERED) |
3279 | diff --git a/fs/ext4/super.c b/fs/ext4/super.c |
3280 | index 486a641..fa1d1f3 100644 |
3281 | --- a/fs/ext4/super.c |
3282 | +++ b/fs/ext4/super.c |
3283 | @@ -1518,10 +1518,14 @@ static int ext4_fill_super (struct super_block *sb, void *data, int silent) |
3284 | set_opt(sbi->s_mount_opt, GRPID); |
3285 | if (def_mount_opts & EXT4_DEFM_UID16) |
3286 | set_opt(sbi->s_mount_opt, NO_UID32); |
3287 | +#ifdef CONFIG_EXT4DEV_FS_XATTR |
3288 | if (def_mount_opts & EXT4_DEFM_XATTR_USER) |
3289 | set_opt(sbi->s_mount_opt, XATTR_USER); |
3290 | +#endif |
3291 | +#ifdef CONFIG_EXT4DEV_FS_POSIX_ACL |
3292 | if (def_mount_opts & EXT4_DEFM_ACL) |
3293 | set_opt(sbi->s_mount_opt, POSIX_ACL); |
3294 | +#endif |
3295 | if ((def_mount_opts & EXT4_DEFM_JMODE) == EXT4_DEFM_JMODE_DATA) |
3296 | sbi->s_mount_opt |= EXT4_MOUNT_JOURNAL_DATA; |
3297 | else if ((def_mount_opts & EXT4_DEFM_JMODE) == EXT4_DEFM_JMODE_ORDERED) |
3298 | diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c |
3299 | index d0db881..c186857 100644 |
3300 | --- a/fs/gfs2/quota.c |
3301 | +++ b/fs/gfs2/quota.c |
3302 | @@ -279,7 +279,7 @@ static int bh_get(struct gfs2_quota_data *qd) |
3303 | (bh->b_data + sizeof(struct gfs2_meta_header) + |
3304 | offset * sizeof(struct gfs2_quota_change)); |
3305 | |
3306 | - mutex_lock(&sdp->sd_quota_mutex); |
3307 | + mutex_unlock(&sdp->sd_quota_mutex); |
3308 | |
3309 | return 0; |
3310 | |
3311 | diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c |
3312 | index 4f4cd13..e6bd553 100644 |
3313 | --- a/fs/hugetlbfs/inode.c |
3314 | +++ b/fs/hugetlbfs/inode.c |
3315 | @@ -449,10 +449,13 @@ static int hugetlbfs_symlink(struct inode *dir, |
3316 | } |
3317 | |
3318 | /* |
3319 | - * For direct-IO reads into hugetlb pages |
3320 | + * mark the head page dirty |
3321 | */ |
3322 | static int hugetlbfs_set_page_dirty(struct page *page) |
3323 | { |
3324 | + struct page *head = (struct page *)page_private(page); |
3325 | + |
3326 | + SetPageDirty(head); |
3327 | return 0; |
3328 | } |
3329 | |
3330 | diff --git a/fs/lockd/clntproc.c b/fs/lockd/clntproc.c |
3331 | index 0b4acc1..a5c019e 100644 |
3332 | --- a/fs/lockd/clntproc.c |
3333 | +++ b/fs/lockd/clntproc.c |
3334 | @@ -361,7 +361,6 @@ static int __nlm_async_call(struct nlm_rqst *req, u32 proc, struct rpc_message * |
3335 | { |
3336 | struct nlm_host *host = req->a_host; |
3337 | struct rpc_clnt *clnt; |
3338 | - int status = -ENOLCK; |
3339 | |
3340 | dprintk("lockd: call procedure %d on %s (async)\n", |
3341 | (int)proc, host->h_name); |
3342 | @@ -373,12 +372,10 @@ static int __nlm_async_call(struct nlm_rqst *req, u32 proc, struct rpc_message * |
3343 | msg->rpc_proc = &clnt->cl_procinfo[proc]; |
3344 | |
3345 | /* bootstrap and kick off the async RPC call */ |
3346 | - status = rpc_call_async(clnt, msg, RPC_TASK_ASYNC, tk_ops, req); |
3347 | - if (status == 0) |
3348 | - return 0; |
3349 | + return rpc_call_async(clnt, msg, RPC_TASK_ASYNC, tk_ops, req); |
3350 | out_err: |
3351 | - nlm_release_call(req); |
3352 | - return status; |
3353 | + tk_ops->rpc_release(req); |
3354 | + return -ENOLCK; |
3355 | } |
3356 | |
3357 | int nlm_async_call(struct nlm_rqst *req, u32 proc, const struct rpc_call_ops *tk_ops) |
3358 | diff --git a/fs/lockd/svclock.c b/fs/lockd/svclock.c |
3359 | index c7db0a5..cf51f84 100644 |
3360 | --- a/fs/lockd/svclock.c |
3361 | +++ b/fs/lockd/svclock.c |
3362 | @@ -593,9 +593,7 @@ callback: |
3363 | |
3364 | /* Call the client */ |
3365 | kref_get(&block->b_count); |
3366 | - if (nlm_async_call(block->b_call, NLMPROC_GRANTED_MSG, |
3367 | - &nlmsvc_grant_ops) < 0) |
3368 | - nlmsvc_release_block(block); |
3369 | + nlm_async_call(block->b_call, NLMPROC_GRANTED_MSG, &nlmsvc_grant_ops); |
3370 | } |
3371 | |
3372 | /* |
3373 | diff --git a/fs/ocfs2/journal.h b/fs/ocfs2/journal.h |
3374 | index e121636..d026b4f 100644 |
3375 | --- a/fs/ocfs2/journal.h |
3376 | +++ b/fs/ocfs2/journal.h |
3377 | @@ -306,8 +306,8 @@ int ocfs2_journal_dirty_data(handle_t *handle, |
3378 | * for the dinode, one for the new block. */ |
3379 | #define OCFS2_SIMPLE_DIR_EXTEND_CREDITS (2) |
3380 | |
3381 | -/* file update (nlink, etc) + dir entry block */ |
3382 | -#define OCFS2_LINK_CREDITS (OCFS2_INODE_UPDATE_CREDITS + 1) |
3383 | +/* file update (nlink, etc) + directory mtime/ctime + dir entry block */ |
3384 | +#define OCFS2_LINK_CREDITS (2*OCFS2_INODE_UPDATE_CREDITS + 1) |
3385 | |
3386 | /* inode + dir inode (if we unlink a dir), + dir entry block + orphan |
3387 | * dir inode link */ |
3388 | diff --git a/fs/ufs/dir.c b/fs/ufs/dir.c |
3389 | index 433b6f6..a6c0ca9 100644 |
3390 | --- a/fs/ufs/dir.c |
3391 | +++ b/fs/ufs/dir.c |
3392 | @@ -106,12 +106,13 @@ static void ufs_check_page(struct page *page) |
3393 | char *kaddr = page_address(page); |
3394 | unsigned offs, rec_len; |
3395 | unsigned limit = PAGE_CACHE_SIZE; |
3396 | + const unsigned chunk_mask = UFS_SB(sb)->s_uspi->s_dirblksize - 1; |
3397 | struct ufs_dir_entry *p; |
3398 | char *error; |
3399 | |
3400 | if ((dir->i_size >> PAGE_CACHE_SHIFT) == page->index) { |
3401 | limit = dir->i_size & ~PAGE_CACHE_MASK; |
3402 | - if (limit & (UFS_SECTOR_SIZE - 1)) |
3403 | + if (limit & chunk_mask) |
3404 | goto Ebadsize; |
3405 | if (!limit) |
3406 | goto out; |
3407 | @@ -126,7 +127,7 @@ static void ufs_check_page(struct page *page) |
3408 | goto Ealign; |
3409 | if (rec_len < UFS_DIR_REC_LEN(ufs_get_de_namlen(sb, p))) |
3410 | goto Enamelen; |
3411 | - if (((offs + rec_len - 1) ^ offs) & ~(UFS_SECTOR_SIZE-1)) |
3412 | + if (((offs + rec_len - 1) ^ offs) & ~chunk_mask) |
3413 | goto Espan; |
3414 | if (fs32_to_cpu(sb, p->d_ino) > (UFS_SB(sb)->s_uspi->s_ipg * |
3415 | UFS_SB(sb)->s_uspi->s_ncg)) |
3416 | @@ -310,6 +311,7 @@ int ufs_add_link(struct dentry *dentry, struct inode *inode) |
3417 | int namelen = dentry->d_name.len; |
3418 | struct super_block *sb = dir->i_sb; |
3419 | unsigned reclen = UFS_DIR_REC_LEN(namelen); |
3420 | + const unsigned int chunk_size = UFS_SB(sb)->s_uspi->s_dirblksize; |
3421 | unsigned short rec_len, name_len; |
3422 | struct page *page = NULL; |
3423 | struct ufs_dir_entry *de; |
3424 | @@ -342,8 +344,8 @@ int ufs_add_link(struct dentry *dentry, struct inode *inode) |
3425 | if ((char *)de == dir_end) { |
3426 | /* We hit i_size */ |
3427 | name_len = 0; |
3428 | - rec_len = UFS_SECTOR_SIZE; |
3429 | - de->d_reclen = cpu_to_fs16(sb, UFS_SECTOR_SIZE); |
3430 | + rec_len = chunk_size; |
3431 | + de->d_reclen = cpu_to_fs16(sb, chunk_size); |
3432 | de->d_ino = 0; |
3433 | goto got_it; |
3434 | } |
3435 | @@ -431,7 +433,7 @@ ufs_readdir(struct file *filp, void *dirent, filldir_t filldir) |
3436 | unsigned int offset = pos & ~PAGE_CACHE_MASK; |
3437 | unsigned long n = pos >> PAGE_CACHE_SHIFT; |
3438 | unsigned long npages = ufs_dir_pages(inode); |
3439 | - unsigned chunk_mask = ~(UFS_SECTOR_SIZE - 1); |
3440 | + unsigned chunk_mask = ~(UFS_SB(sb)->s_uspi->s_dirblksize - 1); |
3441 | int need_revalidate = filp->f_version != inode->i_version; |
3442 | unsigned flags = UFS_SB(sb)->s_flags; |
3443 | |
3444 | @@ -511,7 +513,7 @@ int ufs_delete_entry(struct inode *inode, struct ufs_dir_entry *dir, |
3445 | struct super_block *sb = inode->i_sb; |
3446 | struct address_space *mapping = page->mapping; |
3447 | char *kaddr = page_address(page); |
3448 | - unsigned from = ((char*)dir - kaddr) & ~(UFS_SECTOR_SIZE - 1); |
3449 | + unsigned from = ((char*)dir - kaddr) & ~(UFS_SB(sb)->s_uspi->s_dirblksize - 1); |
3450 | unsigned to = ((char*)dir - kaddr) + fs16_to_cpu(sb, dir->d_reclen); |
3451 | struct ufs_dir_entry *pde = NULL; |
3452 | struct ufs_dir_entry *de = (struct ufs_dir_entry *) (kaddr + from); |
3453 | @@ -556,6 +558,7 @@ int ufs_make_empty(struct inode * inode, struct inode *dir) |
3454 | struct super_block * sb = dir->i_sb; |
3455 | struct address_space *mapping = inode->i_mapping; |
3456 | struct page *page = grab_cache_page(mapping, 0); |
3457 | + const unsigned int chunk_size = UFS_SB(sb)->s_uspi->s_dirblksize; |
3458 | struct ufs_dir_entry * de; |
3459 | char *base; |
3460 | int err; |
3461 | @@ -563,7 +566,7 @@ int ufs_make_empty(struct inode * inode, struct inode *dir) |
3462 | if (!page) |
3463 | return -ENOMEM; |
3464 | kmap(page); |
3465 | - err = mapping->a_ops->prepare_write(NULL, page, 0, UFS_SECTOR_SIZE); |
3466 | + err = mapping->a_ops->prepare_write(NULL, page, 0, chunk_size); |
3467 | if (err) { |
3468 | unlock_page(page); |
3469 | goto fail; |
3470 | @@ -584,11 +587,11 @@ int ufs_make_empty(struct inode * inode, struct inode *dir) |
3471 | ((char *)de + fs16_to_cpu(sb, de->d_reclen)); |
3472 | de->d_ino = cpu_to_fs32(sb, dir->i_ino); |
3473 | ufs_set_de_type(sb, de, dir->i_mode); |
3474 | - de->d_reclen = cpu_to_fs16(sb, UFS_SECTOR_SIZE - UFS_DIR_REC_LEN(1)); |
3475 | + de->d_reclen = cpu_to_fs16(sb, chunk_size - UFS_DIR_REC_LEN(1)); |
3476 | ufs_set_de_namlen(sb, de, 2); |
3477 | strcpy (de->d_name, ".."); |
3478 | |
3479 | - err = ufs_commit_chunk(page, 0, UFS_SECTOR_SIZE); |
3480 | + err = ufs_commit_chunk(page, 0, chunk_size); |
3481 | fail: |
3482 | kunmap(page); |
3483 | page_cache_release(page); |
3484 | diff --git a/fs/ufs/super.c b/fs/ufs/super.c |
3485 | index 8a8e938..209be95 100644 |
3486 | --- a/fs/ufs/super.c |
3487 | +++ b/fs/ufs/super.c |
3488 | @@ -649,7 +649,7 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent) |
3489 | kmalloc (sizeof(struct ufs_sb_private_info), GFP_KERNEL); |
3490 | if (!uspi) |
3491 | goto failed; |
3492 | - |
3493 | + uspi->s_dirblksize = UFS_SECTOR_SIZE; |
3494 | super_block_offset=UFS_SBLOCK; |
3495 | |
3496 | /* Keep 2Gig file limit. Some UFS variants need to override |
3497 | @@ -718,6 +718,7 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent) |
3498 | break; |
3499 | |
3500 | case UFS_MOUNT_UFSTYPE_NEXTSTEP: |
3501 | + /*TODO: check may be we need set special dir block size?*/ |
3502 | UFSD("ufstype=nextstep\n"); |
3503 | uspi->s_fsize = block_size = 1024; |
3504 | uspi->s_fmask = ~(1024 - 1); |
3505 | @@ -733,6 +734,7 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent) |
3506 | break; |
3507 | |
3508 | case UFS_MOUNT_UFSTYPE_NEXTSTEP_CD: |
3509 | + /*TODO: check may be we need set special dir block size?*/ |
3510 | UFSD("ufstype=nextstep-cd\n"); |
3511 | uspi->s_fsize = block_size = 2048; |
3512 | uspi->s_fmask = ~(2048 - 1); |
3513 | @@ -754,6 +756,7 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent) |
3514 | uspi->s_fshift = 10; |
3515 | uspi->s_sbsize = super_block_size = 2048; |
3516 | uspi->s_sbbase = 0; |
3517 | + uspi->s_dirblksize = 1024; |
3518 | flags |= UFS_DE_44BSD | UFS_UID_44BSD | UFS_ST_44BSD | UFS_CG_44BSD; |
3519 | if (!(sb->s_flags & MS_RDONLY)) { |
3520 | if (!silent) |
3521 | diff --git a/include/asm-generic/page.h b/include/asm-generic/page.h |
3522 | index b55052c..a96b5d9 100644 |
3523 | --- a/include/asm-generic/page.h |
3524 | +++ b/include/asm-generic/page.h |
3525 | @@ -4,51 +4,21 @@ |
3526 | #ifdef __KERNEL__ |
3527 | #ifndef __ASSEMBLY__ |
3528 | |
3529 | -#include <linux/log2.h> |
3530 | +#include <linux/compiler.h> |
3531 | |
3532 | -/* |
3533 | - * non-const pure 2^n version of get_order |
3534 | - * - the arch may override these in asm/bitops.h if they can be implemented |
3535 | - * more efficiently than using the arch log2 routines |
3536 | - * - we use the non-const log2() instead if the arch has defined one suitable |
3537 | - */ |
3538 | -#ifndef ARCH_HAS_GET_ORDER |
3539 | -static inline __attribute__((const)) |
3540 | -int __get_order(unsigned long size, int page_shift) |
3541 | +/* Pure 2^n version of get_order */ |
3542 | +static __inline__ __attribute_const__ int get_order(unsigned long size) |
3543 | { |
3544 | -#if BITS_PER_LONG == 32 && defined(ARCH_HAS_ILOG2_U32) |
3545 | - int order = __ilog2_u32(size) - page_shift; |
3546 | - return order >= 0 ? order : 0; |
3547 | -#elif BITS_PER_LONG == 64 && defined(ARCH_HAS_ILOG2_U64) |
3548 | - int order = __ilog2_u64(size) - page_shift; |
3549 | - return order >= 0 ? order : 0; |
3550 | -#else |
3551 | int order; |
3552 | |
3553 | - size = (size - 1) >> (page_shift - 1); |
3554 | + size = (size - 1) >> (PAGE_SHIFT - 1); |
3555 | order = -1; |
3556 | do { |
3557 | size >>= 1; |
3558 | order++; |
3559 | } while (size); |
3560 | return order; |
3561 | -#endif |
3562 | } |
3563 | -#endif |
3564 | - |
3565 | -/** |
3566 | - * get_order - calculate log2(pages) to hold a block of the specified size |
3567 | - * @n - size |
3568 | - * |
3569 | - * calculate allocation order based on the current page size |
3570 | - * - this can be used to initialise global variables from constant data |
3571 | - */ |
3572 | -#define get_order(n) \ |
3573 | -( \ |
3574 | - __builtin_constant_p(n) ? \ |
3575 | - ((n < (1UL << PAGE_SHIFT)) ? 0 : ilog2(n) - PAGE_SHIFT) : \ |
3576 | - __get_order(n, PAGE_SHIFT) \ |
3577 | - ) |
3578 | |
3579 | #endif /* __ASSEMBLY__ */ |
3580 | #endif /* __KERNEL__ */ |
3581 | diff --git a/include/asm-ia64/libata-portmap.h b/include/asm-ia64/libata-portmap.h |
3582 | new file mode 100644 |
3583 | index 0000000..0e00c9a |
3584 | --- /dev/null |
3585 | +++ b/include/asm-ia64/libata-portmap.h |
3586 | @@ -0,0 +1,12 @@ |
3587 | +#ifndef __ASM_IA64_LIBATA_PORTMAP_H |
3588 | +#define __ASM_IA64_LIBATA_PORTMAP_H |
3589 | + |
3590 | +#define ATA_PRIMARY_CMD 0x1F0 |
3591 | +#define ATA_PRIMARY_CTL 0x3F6 |
3592 | +#define ATA_PRIMARY_IRQ(dev) isa_irq_to_vector(14) |
3593 | + |
3594 | +#define ATA_SECONDARY_CMD 0x170 |
3595 | +#define ATA_SECONDARY_CTL 0x376 |
3596 | +#define ATA_SECONDARY_IRQ(dev) isa_irq_to_vector(15) |
3597 | + |
3598 | +#endif |
3599 | diff --git a/include/asm-x86_64/bitops.h b/include/asm-x86_64/bitops.h |
3600 | index 8da9609..d4dbbe5 100644 |
3601 | --- a/include/asm-x86_64/bitops.h |
3602 | +++ b/include/asm-x86_64/bitops.h |
3603 | @@ -7,7 +7,7 @@ |
3604 | |
3605 | #include <asm/alternative.h> |
3606 | |
3607 | -#if __GNUC__ < 4 || __GNUC_MINOR__ < 1 |
3608 | +#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 1) |
3609 | /* Technically wrong, but this avoids compilation errors on some gcc |
3610 | versions. */ |
3611 | #define ADDR "=m" (*(volatile long *) addr) |
3612 | diff --git a/include/linux/atmarp.h b/include/linux/atmarp.h |
3613 | index ee108f9..231f4bd 100644 |
3614 | --- a/include/linux/atmarp.h |
3615 | +++ b/include/linux/atmarp.h |
3616 | @@ -6,9 +6,7 @@ |
3617 | #ifndef _LINUX_ATMARP_H |
3618 | #define _LINUX_ATMARP_H |
3619 | |
3620 | -#ifdef __KERNEL__ |
3621 | #include <linux/types.h> |
3622 | -#endif |
3623 | #include <linux/atmapi.h> |
3624 | #include <linux/atmioc.h> |
3625 | |
3626 | diff --git a/include/linux/binfmts.h b/include/linux/binfmts.h |
3627 | index c1e82c5..2d956cd 100644 |
3628 | --- a/include/linux/binfmts.h |
3629 | +++ b/include/linux/binfmts.h |
3630 | @@ -59,6 +59,7 @@ struct linux_binfmt { |
3631 | int (*load_shlib)(struct file *); |
3632 | int (*core_dump)(long signr, struct pt_regs * regs, struct file * file); |
3633 | unsigned long min_coredump; /* minimal dump size */ |
3634 | + int hasvdso; |
3635 | }; |
3636 | |
3637 | extern int register_binfmt(struct linux_binfmt *); |
3638 | diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h |
3639 | index ea097dd..782abaf 100644 |
3640 | --- a/include/linux/lockdep.h |
3641 | +++ b/include/linux/lockdep.h |
3642 | @@ -8,6 +8,8 @@ |
3643 | #ifndef __LINUX_LOCKDEP_H |
3644 | #define __LINUX_LOCKDEP_H |
3645 | |
3646 | +struct task_struct; |
3647 | + |
3648 | #ifdef CONFIG_LOCKDEP |
3649 | |
3650 | #include <linux/linkage.h> |
3651 | diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h |
3652 | index 3d1d210..d37f46a 100644 |
3653 | --- a/include/linux/pci_ids.h |
3654 | +++ b/include/linux/pci_ids.h |
3655 | @@ -1971,6 +1971,7 @@ |
3656 | #define PCI_DEVICE_ID_TOPIC_TP560 0x0000 |
3657 | |
3658 | #define PCI_VENDOR_ID_ENE 0x1524 |
3659 | +#define PCI_DEVICE_ID_ENE_CB712_SD 0x0550 |
3660 | #define PCI_DEVICE_ID_ENE_1211 0x1211 |
3661 | #define PCI_DEVICE_ID_ENE_1225 0x1225 |
3662 | #define PCI_DEVICE_ID_ENE_1410 0x1410 |
3663 | diff --git a/include/linux/raid/bitmap.h b/include/linux/raid/bitmap.h |
3664 | index ebd42a3..6db9a4c 100644 |
3665 | --- a/include/linux/raid/bitmap.h |
3666 | +++ b/include/linux/raid/bitmap.h |
3667 | @@ -247,6 +247,7 @@ struct bitmap { |
3668 | |
3669 | atomic_t pending_writes; /* pending writes to the bitmap file */ |
3670 | wait_queue_head_t write_wait; |
3671 | + wait_queue_head_t overflow_wait; |
3672 | |
3673 | }; |
3674 | |
3675 | diff --git a/include/linux/sunrpc/svcsock.h b/include/linux/sunrpc/svcsock.h |
3676 | index 98b21ad..523fb3a 100644 |
3677 | --- a/include/linux/sunrpc/svcsock.h |
3678 | +++ b/include/linux/sunrpc/svcsock.h |
3679 | @@ -63,7 +63,7 @@ struct svc_sock { |
3680 | * Function prototypes. |
3681 | */ |
3682 | int svc_makesock(struct svc_serv *, int, unsigned short); |
3683 | -void svc_delete_socket(struct svc_sock *); |
3684 | +void svc_force_close_socket(struct svc_sock *); |
3685 | int svc_recv(struct svc_rqst *, long); |
3686 | int svc_send(struct svc_rqst *); |
3687 | void svc_drop(struct svc_rqst *); |
3688 | diff --git a/include/linux/ufs_fs.h b/include/linux/ufs_fs.h |
3689 | index 28967ed..d3a4f99 100644 |
3690 | --- a/include/linux/ufs_fs.h |
3691 | +++ b/include/linux/ufs_fs.h |
3692 | @@ -789,6 +789,7 @@ struct ufs_sb_private_info { |
3693 | |
3694 | __u32 s_maxsymlinklen;/* upper limit on fast symlinks' size */ |
3695 | __s32 fs_magic; /* filesystem magic */ |
3696 | + unsigned int s_dirblksize; |
3697 | }; |
3698 | |
3699 | /* |
3700 | diff --git a/include/linux/writeback.h b/include/linux/writeback.h |
3701 | index fc35e6b..0c78f7f 100644 |
3702 | --- a/include/linux/writeback.h |
3703 | +++ b/include/linux/writeback.h |
3704 | @@ -84,7 +84,7 @@ static inline void wait_on_inode(struct inode *inode) |
3705 | int wakeup_pdflush(long nr_pages); |
3706 | void laptop_io_completion(void); |
3707 | void laptop_sync_completion(void); |
3708 | -void throttle_vm_writeout(void); |
3709 | +void throttle_vm_writeout(gfp_t gfp_mask); |
3710 | |
3711 | /* These are exported to sysctl. */ |
3712 | extern int dirty_background_ratio; |
3713 | diff --git a/kernel/lockdep.c b/kernel/lockdep.c |
3714 | index 509efd4..33c9eeb 100644 |
3715 | --- a/kernel/lockdep.c |
3716 | +++ b/kernel/lockdep.c |
3717 | @@ -2577,7 +2577,7 @@ out_restore: |
3718 | raw_local_irq_restore(flags); |
3719 | } |
3720 | |
3721 | -void __init lockdep_init(void) |
3722 | +void lockdep_init(void) |
3723 | { |
3724 | int i; |
3725 | |
3726 | diff --git a/kernel/power/user.c b/kernel/power/user.c |
3727 | index f7b7a78..38418cd 100644 |
3728 | --- a/kernel/power/user.c |
3729 | +++ b/kernel/power/user.c |
3730 | @@ -292,7 +292,7 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp, |
3731 | break; |
3732 | } |
3733 | |
3734 | - if (pm_ops->prepare) { |
3735 | + if (pm_ops && pm_ops->prepare) { |
3736 | error = pm_ops->prepare(PM_SUSPEND_MEM); |
3737 | if (error) |
3738 | goto OutS3; |
3739 | @@ -311,7 +311,7 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp, |
3740 | device_resume(); |
3741 | } |
3742 | resume_console(); |
3743 | - if (pm_ops->finish) |
3744 | + if (pm_ops && pm_ops->finish) |
3745 | pm_ops->finish(PM_SUSPEND_MEM); |
3746 | |
3747 | OutS3: |
3748 | @@ -322,20 +322,25 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp, |
3749 | switch (arg) { |
3750 | |
3751 | case PMOPS_PREPARE: |
3752 | - if (pm_ops->prepare) { |
3753 | + if (pm_ops && pm_ops->prepare) |
3754 | error = pm_ops->prepare(PM_SUSPEND_DISK); |
3755 | - } |
3756 | + else |
3757 | + error = -ENOSYS; |
3758 | break; |
3759 | |
3760 | case PMOPS_ENTER: |
3761 | kernel_shutdown_prepare(SYSTEM_SUSPEND_DISK); |
3762 | - error = pm_ops->enter(PM_SUSPEND_DISK); |
3763 | + if (pm_ops && pm_ops->enter) |
3764 | + error = pm_ops->enter(PM_SUSPEND_DISK); |
3765 | + else |
3766 | + error = -ENOSYS; |
3767 | break; |
3768 | |
3769 | case PMOPS_FINISH: |
3770 | - if (pm_ops && pm_ops->finish) { |
3771 | + if (pm_ops && pm_ops->finish) |
3772 | pm_ops->finish(PM_SUSPEND_DISK); |
3773 | - } |
3774 | + else |
3775 | + error = -ENOSYS; |
3776 | break; |
3777 | |
3778 | default: |
3779 | diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c |
3780 | index 22504af..d9ef176 100644 |
3781 | --- a/kernel/time/clocksource.c |
3782 | +++ b/kernel/time/clocksource.c |
3783 | @@ -28,6 +28,7 @@ |
3784 | #include <linux/sysdev.h> |
3785 | #include <linux/init.h> |
3786 | #include <linux/module.h> |
3787 | +#include <linux/sched.h> /* for spin_unlock_irq() using preempt_count() m68k */ |
3788 | |
3789 | /* XXX - Would like a better way for initializing curr_clocksource */ |
3790 | extern struct clocksource clocksource_jiffies; |
3791 | diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug |
3792 | index 5c26818..330bff8 100644 |
3793 | --- a/lib/Kconfig.debug |
3794 | +++ b/lib/Kconfig.debug |
3795 | @@ -399,8 +399,8 @@ config LKDTM |
3796 | |
3797 | config FAULT_INJECTION |
3798 | bool "Fault-injection framework" |
3799 | - depends on DEBUG_KERNEL |
3800 | - depends on STACKTRACE |
3801 | + depends on DEBUG_KERNEL && STACKTRACE_SUPPORT |
3802 | + select STACKTRACE |
3803 | select FRAME_POINTER |
3804 | help |
3805 | Provide fault-injection framework. |
3806 | diff --git a/lib/swiotlb.c b/lib/swiotlb.c |
3807 | index 1062578..d6d57fb 100644 |
3808 | --- a/lib/swiotlb.c |
3809 | +++ b/lib/swiotlb.c |
3810 | @@ -750,7 +750,7 @@ swiotlb_sync_sg(struct device *hwdev, struct scatterlist *sg, |
3811 | |
3812 | for (i = 0; i < nelems; i++, sg++) |
3813 | if (sg->dma_address != SG_ENT_PHYS_ADDRESS(sg)) |
3814 | - sync_single(hwdev, (void *) sg->dma_address, |
3815 | + sync_single(hwdev, phys_to_virt(sg->dma_address), |
3816 | sg->dma_length, dir, target); |
3817 | } |
3818 | |
3819 | diff --git a/mm/hugetlb.c b/mm/hugetlb.c |
3820 | index cb362f7..36db012 100644 |
3821 | --- a/mm/hugetlb.c |
3822 | +++ b/mm/hugetlb.c |
3823 | @@ -389,6 +389,8 @@ void __unmap_hugepage_range(struct vm_area_struct *vma, unsigned long start, |
3824 | continue; |
3825 | |
3826 | page = pte_page(pte); |
3827 | + if (pte_dirty(pte)) |
3828 | + set_page_dirty(page); |
3829 | list_add(&page->lru, &page_list); |
3830 | } |
3831 | spin_unlock(&mm->page_table_lock); |
3832 | diff --git a/mm/page-writeback.c b/mm/page-writeback.c |
3833 | index be0efbd..17255ab 100644 |
3834 | --- a/mm/page-writeback.c |
3835 | +++ b/mm/page-writeback.c |
3836 | @@ -296,11 +296,21 @@ void balance_dirty_pages_ratelimited_nr(struct address_space *mapping, |
3837 | } |
3838 | EXPORT_SYMBOL(balance_dirty_pages_ratelimited_nr); |
3839 | |
3840 | -void throttle_vm_writeout(void) |
3841 | +void throttle_vm_writeout(gfp_t gfp_mask) |
3842 | { |
3843 | long background_thresh; |
3844 | long dirty_thresh; |
3845 | |
3846 | + if ((gfp_mask & (__GFP_FS|__GFP_IO)) != (__GFP_FS|__GFP_IO)) { |
3847 | + /* |
3848 | + * The caller might hold locks which can prevent IO completion |
3849 | + * or progress in the filesystem. So we cannot just sit here |
3850 | + * waiting for IO to complete. |
3851 | + */ |
3852 | + congestion_wait(WRITE, HZ/10); |
3853 | + return; |
3854 | + } |
3855 | + |
3856 | for ( ; ; ) { |
3857 | get_dirty_limits(&background_thresh, &dirty_thresh, NULL); |
3858 | |
3859 | @@ -317,7 +327,6 @@ void throttle_vm_writeout(void) |
3860 | } |
3861 | } |
3862 | |
3863 | - |
3864 | /* |
3865 | * writeback at least _min_pages, and keep writing until the amount of dirty |
3866 | * memory is less than the background threshold, or until we're all clean. |
3867 | diff --git a/mm/vmscan.c b/mm/vmscan.c |
3868 | index 7430df6..5b4528a 100644 |
3869 | --- a/mm/vmscan.c |
3870 | +++ b/mm/vmscan.c |
3871 | @@ -949,7 +949,7 @@ static unsigned long shrink_zone(int priority, struct zone *zone, |
3872 | } |
3873 | } |
3874 | |
3875 | - throttle_vm_writeout(); |
3876 | + throttle_vm_writeout(sc->gfp_mask); |
3877 | |
3878 | atomic_dec(&zone->reclaim_in_progress); |
3879 | return nr_reclaimed; |
3880 | diff --git a/net/atm/common.c b/net/atm/common.c |
3881 | index fbabff4..a2878e9 100644 |
3882 | --- a/net/atm/common.c |
3883 | +++ b/net/atm/common.c |
3884 | @@ -816,7 +816,8 @@ static void __exit atm_exit(void) |
3885 | proto_unregister(&vcc_proto); |
3886 | } |
3887 | |
3888 | -module_init(atm_init); |
3889 | +subsys_initcall(atm_init); |
3890 | + |
3891 | module_exit(atm_exit); |
3892 | |
3893 | MODULE_LICENSE("GPL"); |
3894 | diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c |
3895 | index 0017ccb..024ae56 100644 |
3896 | --- a/net/ipv4/igmp.c |
3897 | +++ b/net/ipv4/igmp.c |
3898 | @@ -455,6 +455,8 @@ static struct sk_buff *add_grec(struct sk_buff *skb, struct ip_mc_list *pmc, |
3899 | skb = add_grhead(skb, pmc, type, &pgr); |
3900 | first = 0; |
3901 | } |
3902 | + if (!skb) |
3903 | + return NULL; |
3904 | psrc = (__be32 *)skb_put(skb, sizeof(__be32)); |
3905 | *psrc = psf->sf_inaddr; |
3906 | scount++; stotal++; |
3907 | diff --git a/net/ipv4/netfilter/ipt_REJECT.c b/net/ipv4/netfilter/ipt_REJECT.c |
3908 | index f0319e5..6714bd1 100644 |
3909 | --- a/net/ipv4/netfilter/ipt_REJECT.c |
3910 | +++ b/net/ipv4/netfilter/ipt_REJECT.c |
3911 | @@ -79,6 +79,10 @@ static void send_reset(struct sk_buff *oldskb, int hook) |
3912 | nskb->mark = 0; |
3913 | skb_init_secmark(nskb); |
3914 | |
3915 | + skb_shinfo(nskb)->gso_size = 0; |
3916 | + skb_shinfo(nskb)->gso_segs = 0; |
3917 | + skb_shinfo(nskb)->gso_type = 0; |
3918 | + |
3919 | tcph = (struct tcphdr *)((u_int32_t*)nskb->nh.iph + nskb->nh.iph->ihl); |
3920 | |
3921 | /* Swap source and dest */ |
3922 | diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c |
3923 | index b67e0dd..ebe9d0d 100644 |
3924 | --- a/net/ipv4/tcp.c |
3925 | +++ b/net/ipv4/tcp.c |
3926 | @@ -2266,12 +2266,12 @@ void tcp_free_md5sig_pool(void) |
3927 | { |
3928 | struct tcp_md5sig_pool **pool = NULL; |
3929 | |
3930 | - spin_lock(&tcp_md5sig_pool_lock); |
3931 | + spin_lock_bh(&tcp_md5sig_pool_lock); |
3932 | if (--tcp_md5sig_users == 0) { |
3933 | pool = tcp_md5sig_pool; |
3934 | tcp_md5sig_pool = NULL; |
3935 | } |
3936 | - spin_unlock(&tcp_md5sig_pool_lock); |
3937 | + spin_unlock_bh(&tcp_md5sig_pool_lock); |
3938 | if (pool) |
3939 | __tcp_free_md5sig_pool(pool); |
3940 | } |
3941 | @@ -2314,36 +2314,36 @@ struct tcp_md5sig_pool **tcp_alloc_md5sig_pool(void) |
3942 | int alloc = 0; |
3943 | |
3944 | retry: |
3945 | - spin_lock(&tcp_md5sig_pool_lock); |
3946 | + spin_lock_bh(&tcp_md5sig_pool_lock); |
3947 | pool = tcp_md5sig_pool; |
3948 | if (tcp_md5sig_users++ == 0) { |
3949 | alloc = 1; |
3950 | - spin_unlock(&tcp_md5sig_pool_lock); |
3951 | + spin_unlock_bh(&tcp_md5sig_pool_lock); |
3952 | } else if (!pool) { |
3953 | tcp_md5sig_users--; |
3954 | - spin_unlock(&tcp_md5sig_pool_lock); |
3955 | + spin_unlock_bh(&tcp_md5sig_pool_lock); |
3956 | cpu_relax(); |
3957 | goto retry; |
3958 | } else |
3959 | - spin_unlock(&tcp_md5sig_pool_lock); |
3960 | + spin_unlock_bh(&tcp_md5sig_pool_lock); |
3961 | |
3962 | if (alloc) { |
3963 | /* we cannot hold spinlock here because this may sleep. */ |
3964 | struct tcp_md5sig_pool **p = __tcp_alloc_md5sig_pool(); |
3965 | - spin_lock(&tcp_md5sig_pool_lock); |
3966 | + spin_lock_bh(&tcp_md5sig_pool_lock); |
3967 | if (!p) { |
3968 | tcp_md5sig_users--; |
3969 | - spin_unlock(&tcp_md5sig_pool_lock); |
3970 | + spin_unlock_bh(&tcp_md5sig_pool_lock); |
3971 | return NULL; |
3972 | } |
3973 | pool = tcp_md5sig_pool; |
3974 | if (pool) { |
3975 | /* oops, it has already been assigned. */ |
3976 | - spin_unlock(&tcp_md5sig_pool_lock); |
3977 | + spin_unlock_bh(&tcp_md5sig_pool_lock); |
3978 | __tcp_free_md5sig_pool(p); |
3979 | } else { |
3980 | tcp_md5sig_pool = pool = p; |
3981 | - spin_unlock(&tcp_md5sig_pool_lock); |
3982 | + spin_unlock_bh(&tcp_md5sig_pool_lock); |
3983 | } |
3984 | } |
3985 | return pool; |
3986 | @@ -2354,11 +2354,11 @@ EXPORT_SYMBOL(tcp_alloc_md5sig_pool); |
3987 | struct tcp_md5sig_pool *__tcp_get_md5sig_pool(int cpu) |
3988 | { |
3989 | struct tcp_md5sig_pool **p; |
3990 | - spin_lock(&tcp_md5sig_pool_lock); |
3991 | + spin_lock_bh(&tcp_md5sig_pool_lock); |
3992 | p = tcp_md5sig_pool; |
3993 | if (p) |
3994 | tcp_md5sig_users++; |
3995 | - spin_unlock(&tcp_md5sig_pool_lock); |
3996 | + spin_unlock_bh(&tcp_md5sig_pool_lock); |
3997 | return (p ? *per_cpu_ptr(p, cpu) : NULL); |
3998 | } |
3999 | |
4000 | diff --git a/net/ipv4/tcp_minisocks.c b/net/ipv4/tcp_minisocks.c |
4001 | index 4a3889d..aa54ad4 100644 |
4002 | --- a/net/ipv4/tcp_minisocks.c |
4003 | +++ b/net/ipv4/tcp_minisocks.c |
4004 | @@ -381,7 +381,7 @@ struct sock *tcp_create_openreq_child(struct sock *sk, struct request_sock *req, |
4005 | if (newsk != NULL) { |
4006 | const struct inet_request_sock *ireq = inet_rsk(req); |
4007 | struct tcp_request_sock *treq = tcp_rsk(req); |
4008 | - struct inet_connection_sock *newicsk = inet_csk(sk); |
4009 | + struct inet_connection_sock *newicsk = inet_csk(newsk); |
4010 | struct tcp_sock *newtp; |
4011 | |
4012 | /* Now setup tcp_sock */ |
4013 | diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c |
4014 | index 975f447..1951eaa 100644 |
4015 | --- a/net/ipv4/tcp_output.c |
4016 | +++ b/net/ipv4/tcp_output.c |
4017 | @@ -481,7 +481,7 @@ static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it, |
4018 | /* RFC1323: The window in SYN & SYN/ACK segments |
4019 | * is never scaled. |
4020 | */ |
4021 | - th->window = htons(tp->rcv_wnd); |
4022 | + th->window = htons(min(tp->rcv_wnd, 65535U)); |
4023 | } else { |
4024 | th->window = htons(tcp_select_window(sk)); |
4025 | } |
4026 | @@ -965,7 +965,8 @@ static inline unsigned int tcp_cwnd_test(struct tcp_sock *tp, struct sk_buff *sk |
4027 | u32 in_flight, cwnd; |
4028 | |
4029 | /* Don't be strict about the congestion window for the final FIN. */ |
4030 | - if (TCP_SKB_CB(skb)->flags & TCPCB_FLAG_FIN) |
4031 | + if ((TCP_SKB_CB(skb)->flags & TCPCB_FLAG_FIN) && |
4032 | + tcp_skb_pcount(skb) == 1) |
4033 | return 1; |
4034 | |
4035 | in_flight = tcp_packets_in_flight(tp); |
4036 | @@ -2159,7 +2160,7 @@ struct sk_buff * tcp_make_synack(struct sock *sk, struct dst_entry *dst, |
4037 | } |
4038 | |
4039 | /* RFC1323: The window in SYN & SYN/ACK segments is never scaled. */ |
4040 | - th->window = htons(req->rcv_wnd); |
4041 | + th->window = htons(min(req->rcv_wnd, 65535U)); |
4042 | |
4043 | TCP_SKB_CB(skb)->when = tcp_time_stamp; |
4044 | tcp_syn_build_options((__be32 *)(th + 1), dst_metric(dst, RTAX_ADVMSS), ireq->tstamp_ok, |
4045 | diff --git a/net/ipv4/xfrm4_mode_tunnel.c b/net/ipv4/xfrm4_mode_tunnel.c |
4046 | index e23c21d..21ed667 100644 |
4047 | --- a/net/ipv4/xfrm4_mode_tunnel.c |
4048 | +++ b/net/ipv4/xfrm4_mode_tunnel.c |
4049 | @@ -84,6 +84,7 @@ static int xfrm4_tunnel_input(struct xfrm_state *x, struct sk_buff *skb) |
4050 | (err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC))) |
4051 | goto out; |
4052 | |
4053 | + iph = skb->nh.iph; |
4054 | if (x->props.flags & XFRM_STATE_DECAP_DSCP) |
4055 | ipv4_copy_dscp(iph, skb->h.ipiph); |
4056 | if (!(x->props.flags & XFRM_STATE_NOECN)) |
4057 | diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c |
4058 | index e385469..58cb669 100644 |
4059 | --- a/net/ipv6/addrconf.c |
4060 | +++ b/net/ipv6/addrconf.c |
4061 | @@ -469,6 +469,8 @@ static void dev_forward_change(struct inet6_dev *idev) |
4062 | ipv6_dev_mc_dec(dev, &addr); |
4063 | } |
4064 | for (ifa=idev->addr_list; ifa; ifa=ifa->if_next) { |
4065 | + if (ifa->flags&IFA_F_TENTATIVE) |
4066 | + continue; |
4067 | if (idev->cnf.forwarding) |
4068 | addrconf_join_anycast(ifa); |
4069 | else |
4070 | diff --git a/net/ipv6/anycast.c b/net/ipv6/anycast.c |
4071 | index a960476..fe0c895 100644 |
4072 | --- a/net/ipv6/anycast.c |
4073 | +++ b/net/ipv6/anycast.c |
4074 | @@ -462,6 +462,7 @@ static inline struct ifacaddr6 *ac6_get_first(struct seq_file *seq) |
4075 | break; |
4076 | } |
4077 | read_unlock_bh(&idev->lock); |
4078 | + in6_dev_put(idev); |
4079 | } |
4080 | return im; |
4081 | } |
4082 | diff --git a/net/ipv6/inet6_hashtables.c b/net/ipv6/inet6_hashtables.c |
4083 | index b7e5bae..ba13f74 100644 |
4084 | --- a/net/ipv6/inet6_hashtables.c |
4085 | +++ b/net/ipv6/inet6_hashtables.c |
4086 | @@ -172,7 +172,7 @@ static int __inet6_check_established(struct inet_timewait_death_row *death_row, |
4087 | const struct in6_addr *saddr = &np->daddr; |
4088 | const int dif = sk->sk_bound_dev_if; |
4089 | const __portpair ports = INET_COMBINED_PORTS(inet->dport, lport); |
4090 | - const unsigned int hash = inet6_ehashfn(daddr, inet->num, saddr, |
4091 | + const unsigned int hash = inet6_ehashfn(daddr, lport, saddr, |
4092 | inet->dport); |
4093 | struct inet_ehash_bucket *head = inet_ehash_bucket(hinfo, hash); |
4094 | struct sock *sk2; |
4095 | diff --git a/net/ipv6/ipv6_sockglue.c b/net/ipv6/ipv6_sockglue.c |
4096 | index 352690e..23db88e 100644 |
4097 | --- a/net/ipv6/ipv6_sockglue.c |
4098 | +++ b/net/ipv6/ipv6_sockglue.c |
4099 | @@ -796,11 +796,15 @@ int compat_ipv6_setsockopt(struct sock *sk, int level, int optname, |
4100 | EXPORT_SYMBOL(compat_ipv6_setsockopt); |
4101 | #endif |
4102 | |
4103 | -static int ipv6_getsockopt_sticky(struct sock *sk, struct ipv6_opt_hdr *hdr, |
4104 | +static int ipv6_getsockopt_sticky(struct sock *sk, struct ipv6_txoptions *opt, |
4105 | char __user *optval, int len) |
4106 | { |
4107 | - if (!hdr) |
4108 | + struct ipv6_opt_hdr *hdr; |
4109 | + |
4110 | + if (!opt || !opt->hopopt) |
4111 | return 0; |
4112 | + hdr = opt->hopopt; |
4113 | + |
4114 | len = min_t(int, len, ipv6_optlen(hdr)); |
4115 | if (copy_to_user(optval, hdr, ipv6_optlen(hdr))) |
4116 | return -EFAULT; |
4117 | @@ -941,7 +945,7 @@ static int do_ipv6_getsockopt(struct sock *sk, int level, int optname, |
4118 | { |
4119 | |
4120 | lock_sock(sk); |
4121 | - len = ipv6_getsockopt_sticky(sk, np->opt->hopopt, |
4122 | + len = ipv6_getsockopt_sticky(sk, np->opt, |
4123 | optval, len); |
4124 | release_sock(sk); |
4125 | return put_user(len, optlen); |
4126 | diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c |
4127 | index 882cde4..e3ec216 100644 |
4128 | --- a/net/ipv6/mcast.c |
4129 | +++ b/net/ipv6/mcast.c |
4130 | @@ -1582,6 +1582,8 @@ static struct sk_buff *add_grec(struct sk_buff *skb, struct ifmcaddr6 *pmc, |
4131 | skb = add_grhead(skb, pmc, type, &pgr); |
4132 | first = 0; |
4133 | } |
4134 | + if (!skb) |
4135 | + return NULL; |
4136 | psrc = (struct in6_addr *)skb_put(skb, sizeof(*psrc)); |
4137 | *psrc = psf->sf_addr; |
4138 | scount++; stotal++; |
4139 | diff --git a/net/ipx/af_ipx.c b/net/ipx/af_ipx.c |
4140 | index 76c6615..89f283c 100644 |
4141 | --- a/net/ipx/af_ipx.c |
4142 | +++ b/net/ipx/af_ipx.c |
4143 | @@ -2035,19 +2035,27 @@ static void __exit ipx_proto_finito(void) |
4144 | |
4145 | ipxitf_cleanup(); |
4146 | |
4147 | - unregister_snap_client(pSNAP_datalink); |
4148 | - pSNAP_datalink = NULL; |
4149 | + if (pSNAP_datalink) { |
4150 | + unregister_snap_client(pSNAP_datalink); |
4151 | + pSNAP_datalink = NULL; |
4152 | + } |
4153 | |
4154 | - unregister_8022_client(p8022_datalink); |
4155 | - p8022_datalink = NULL; |
4156 | + if (p8022_datalink) { |
4157 | + unregister_8022_client(p8022_datalink); |
4158 | + p8022_datalink = NULL; |
4159 | + } |
4160 | |
4161 | dev_remove_pack(&ipx_8023_packet_type); |
4162 | - destroy_8023_client(p8023_datalink); |
4163 | - p8023_datalink = NULL; |
4164 | + if (p8023_datalink) { |
4165 | + destroy_8023_client(p8023_datalink); |
4166 | + p8023_datalink = NULL; |
4167 | + } |
4168 | |
4169 | dev_remove_pack(&ipx_dix_packet_type); |
4170 | - destroy_EII_client(pEII_datalink); |
4171 | - pEII_datalink = NULL; |
4172 | + if (pEII_datalink) { |
4173 | + destroy_EII_client(pEII_datalink); |
4174 | + pEII_datalink = NULL; |
4175 | + } |
4176 | |
4177 | proto_unregister(&ipx_proto); |
4178 | sock_unregister(ipx_family_ops.family); |
4179 | diff --git a/net/key/af_key.c b/net/key/af_key.c |
4180 | index 5dd5094..3b4a1f4 100644 |
4181 | --- a/net/key/af_key.c |
4182 | +++ b/net/key/af_key.c |
4183 | @@ -2297,16 +2297,17 @@ static int pfkey_spddelete(struct sock *sk, struct sk_buff *skb, struct sadb_msg |
4184 | &sel, tmp.security, 1); |
4185 | security_xfrm_policy_free(&tmp); |
4186 | |
4187 | - xfrm_audit_log(audit_get_loginuid(current->audit_context), 0, |
4188 | - AUDIT_MAC_IPSEC_DELSPD, (xp) ? 1 : 0, xp, NULL); |
4189 | - |
4190 | if (xp == NULL) |
4191 | return -ENOENT; |
4192 | |
4193 | - err = 0; |
4194 | + err = security_xfrm_policy_delete(xp); |
4195 | |
4196 | - if ((err = security_xfrm_policy_delete(xp))) |
4197 | + xfrm_audit_log(audit_get_loginuid(current->audit_context), 0, |
4198 | + AUDIT_MAC_IPSEC_DELSPD, err ? 0 : 1, xp, NULL); |
4199 | + |
4200 | + if (err) |
4201 | goto out; |
4202 | + |
4203 | c.seq = hdr->sadb_msg_seq; |
4204 | c.pid = hdr->sadb_msg_pid; |
4205 | c.event = XFRM_MSG_DELPOLICY; |
4206 | diff --git a/net/netfilter/nfnetlink_log.c b/net/netfilter/nfnetlink_log.c |
4207 | index d1505dd..24c1d29 100644 |
4208 | --- a/net/netfilter/nfnetlink_log.c |
4209 | +++ b/net/netfilter/nfnetlink_log.c |
4210 | @@ -217,6 +217,11 @@ _instance_destroy2(struct nfulnl_instance *inst, int lock) |
4211 | |
4212 | spin_lock_bh(&inst->lock); |
4213 | if (inst->skb) { |
4214 | + /* timer "holds" one reference (we have one more) */ |
4215 | + if (timer_pending(&inst->timer)) { |
4216 | + del_timer(&inst->timer); |
4217 | + instance_put(inst); |
4218 | + } |
4219 | if (inst->qlen) |
4220 | __nfulnl_send(inst); |
4221 | if (inst->skb) { |
4222 | @@ -363,9 +368,6 @@ __nfulnl_send(struct nfulnl_instance *inst) |
4223 | { |
4224 | int status; |
4225 | |
4226 | - if (timer_pending(&inst->timer)) |
4227 | - del_timer(&inst->timer); |
4228 | - |
4229 | if (!inst->skb) |
4230 | return 0; |
4231 | |
4232 | @@ -392,6 +394,8 @@ static void nfulnl_timer(unsigned long data) |
4233 | UDEBUG("timer function called, flushing buffer\n"); |
4234 | |
4235 | spin_lock_bh(&inst->lock); |
4236 | + if (timer_pending(&inst->timer)) /* is it always true or false here? */ |
4237 | + del_timer(&inst->timer); |
4238 | __nfulnl_send(inst); |
4239 | instance_put(inst); |
4240 | spin_unlock_bh(&inst->lock); |
4241 | @@ -689,6 +693,11 @@ nfulnl_log_packet(unsigned int pf, |
4242 | * enough room in the skb left. flush to userspace. */ |
4243 | UDEBUG("flushing old skb\n"); |
4244 | |
4245 | + /* timer "holds" one reference (we have another one) */ |
4246 | + if (timer_pending(&inst->timer)) { |
4247 | + del_timer(&inst->timer); |
4248 | + instance_put(inst); |
4249 | + } |
4250 | __nfulnl_send(inst); |
4251 | |
4252 | if (!(inst->skb = nfulnl_alloc_skb(nlbufsiz, size))) { |
4253 | diff --git a/net/sunrpc/pmap_clnt.c b/net/sunrpc/pmap_clnt.c |
4254 | index 3946ec3..76e59e9 100644 |
4255 | --- a/net/sunrpc/pmap_clnt.c |
4256 | +++ b/net/sunrpc/pmap_clnt.c |
4257 | @@ -62,7 +62,10 @@ static inline void pmap_map_free(struct portmap_args *map) |
4258 | |
4259 | static void pmap_map_release(void *data) |
4260 | { |
4261 | - pmap_map_free(data); |
4262 | + struct portmap_args *map = data; |
4263 | + |
4264 | + xprt_put(map->pm_xprt); |
4265 | + pmap_map_free(map); |
4266 | } |
4267 | |
4268 | static const struct rpc_call_ops pmap_getport_ops = { |
4269 | @@ -133,7 +136,7 @@ void rpc_getport(struct rpc_task *task) |
4270 | status = -EIO; |
4271 | child = rpc_run_task(pmap_clnt, RPC_TASK_ASYNC, &pmap_getport_ops, map); |
4272 | if (IS_ERR(child)) |
4273 | - goto bailout; |
4274 | + goto bailout_nofree; |
4275 | rpc_put_task(child); |
4276 | |
4277 | task->tk_xprt->stat.bind_count++; |
4278 | @@ -222,7 +225,6 @@ static void pmap_getport_done(struct rpc_task *child, void *data) |
4279 | child->tk_pid, status, map->pm_port); |
4280 | |
4281 | pmap_wake_portmap_waiters(xprt, status); |
4282 | - xprt_put(xprt); |
4283 | } |
4284 | |
4285 | /** |
4286 | diff --git a/net/sunrpc/svc.c b/net/sunrpc/svc.c |
4287 | index 4c16112..baf27a9 100644 |
4288 | --- a/net/sunrpc/svc.c |
4289 | +++ b/net/sunrpc/svc.c |
4290 | @@ -79,7 +79,11 @@ svc_pool_map_choose_mode(void) |
4291 | * x86_64 kernel on Xeons. In this case we |
4292 | * want to divide the pools on cpu boundaries. |
4293 | */ |
4294 | - return SVC_POOL_PERCPU; |
4295 | + /* actually, unless your IRQs round-robin nicely, |
4296 | + * this turns out to be really bad, so just |
4297 | + * go GLOBAL for now until a better fix can be developped |
4298 | + */ |
4299 | + return SVC_POOL_GLOBAL; |
4300 | } |
4301 | |
4302 | /* default: one global pool */ |
4303 | @@ -367,6 +371,7 @@ void |
4304 | svc_destroy(struct svc_serv *serv) |
4305 | { |
4306 | struct svc_sock *svsk; |
4307 | + struct svc_sock *tmp; |
4308 | |
4309 | dprintk("RPC: svc_destroy(%s, %d)\n", |
4310 | serv->sv_program->pg_name, |
4311 | @@ -382,22 +387,18 @@ svc_destroy(struct svc_serv *serv) |
4312 | |
4313 | del_timer_sync(&serv->sv_temptimer); |
4314 | |
4315 | - while (!list_empty(&serv->sv_tempsocks)) { |
4316 | - svsk = list_entry(serv->sv_tempsocks.next, |
4317 | - struct svc_sock, |
4318 | - sk_list); |
4319 | - svc_delete_socket(svsk); |
4320 | - } |
4321 | + list_for_each_entry_safe(svsk, tmp, &serv->sv_tempsocks, sk_list) |
4322 | + svc_force_close_socket(svsk); |
4323 | + |
4324 | if (serv->sv_shutdown) |
4325 | serv->sv_shutdown(serv); |
4326 | |
4327 | - while (!list_empty(&serv->sv_permsocks)) { |
4328 | - svsk = list_entry(serv->sv_permsocks.next, |
4329 | - struct svc_sock, |
4330 | - sk_list); |
4331 | - svc_delete_socket(svsk); |
4332 | - } |
4333 | - |
4334 | + list_for_each_entry_safe(svsk, tmp, &serv->sv_permsocks, sk_list) |
4335 | + svc_force_close_socket(svsk); |
4336 | + |
4337 | + BUG_ON(!list_empty(&serv->sv_permsocks)); |
4338 | + BUG_ON(!list_empty(&serv->sv_tempsocks)); |
4339 | + |
4340 | cache_clean_deferred(serv); |
4341 | |
4342 | /* Unregister service with the portmapper */ |
4343 | diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c |
4344 | index ff1f8bf..cd296a5 100644 |
4345 | --- a/net/sunrpc/svcsock.c |
4346 | +++ b/net/sunrpc/svcsock.c |
4347 | @@ -62,6 +62,12 @@ |
4348 | * after a clear, the socket must be read/accepted |
4349 | * if this succeeds, it must be set again. |
4350 | * SK_CLOSE can set at any time. It is never cleared. |
4351 | + * sk_inuse contains a bias of '1' until SK_DEAD is set. |
4352 | + * so when sk_inuse hits zero, we know the socket is dead |
4353 | + * and no-one is using it. |
4354 | + * SK_DEAD can only be set while SK_BUSY is held which ensures |
4355 | + * no other thread will be using the socket or will try to |
4356 | + * set SK_DEAD. |
4357 | * |
4358 | */ |
4359 | |
4360 | @@ -70,9 +76,11 @@ |
4361 | |
4362 | static struct svc_sock *svc_setup_socket(struct svc_serv *, struct socket *, |
4363 | int *errp, int pmap_reg); |
4364 | +static void svc_delete_socket(struct svc_sock *svsk); |
4365 | static void svc_udp_data_ready(struct sock *, int); |
4366 | static int svc_udp_recvfrom(struct svc_rqst *); |
4367 | static int svc_udp_sendto(struct svc_rqst *); |
4368 | +static void svc_close_socket(struct svc_sock *svsk); |
4369 | |
4370 | static struct svc_deferred_req *svc_deferred_dequeue(struct svc_sock *svsk); |
4371 | static int svc_deferred_recv(struct svc_rqst *rqstp); |
4372 | @@ -329,8 +337,9 @@ void svc_reserve(struct svc_rqst *rqstp, int space) |
4373 | static inline void |
4374 | svc_sock_put(struct svc_sock *svsk) |
4375 | { |
4376 | - if (atomic_dec_and_test(&svsk->sk_inuse) && |
4377 | - test_bit(SK_DEAD, &svsk->sk_flags)) { |
4378 | + if (atomic_dec_and_test(&svsk->sk_inuse)) { |
4379 | + BUG_ON(! test_bit(SK_DEAD, &svsk->sk_flags)); |
4380 | + |
4381 | dprintk("svc: releasing dead socket\n"); |
4382 | if (svsk->sk_sock->file) |
4383 | sockfd_put(svsk->sk_sock); |
4384 | @@ -520,7 +529,7 @@ svc_sock_names(char *buf, struct svc_serv *serv, char *toclose) |
4385 | |
4386 | if (!serv) |
4387 | return 0; |
4388 | - spin_lock(&serv->sv_lock); |
4389 | + spin_lock_bh(&serv->sv_lock); |
4390 | list_for_each_entry(svsk, &serv->sv_permsocks, sk_list) { |
4391 | int onelen = one_sock_name(buf+len, svsk); |
4392 | if (toclose && strcmp(toclose, buf+len) == 0) |
4393 | @@ -528,12 +537,12 @@ svc_sock_names(char *buf, struct svc_serv *serv, char *toclose) |
4394 | else |
4395 | len += onelen; |
4396 | } |
4397 | - spin_unlock(&serv->sv_lock); |
4398 | + spin_unlock_bh(&serv->sv_lock); |
4399 | if (closesk) |
4400 | /* Should unregister with portmap, but you cannot |
4401 | * unregister just one protocol... |
4402 | */ |
4403 | - svc_delete_socket(closesk); |
4404 | + svc_close_socket(closesk); |
4405 | else if (toclose) |
4406 | return -ENOENT; |
4407 | return len; |
4408 | @@ -683,6 +692,11 @@ svc_udp_recvfrom(struct svc_rqst *rqstp) |
4409 | return svc_deferred_recv(rqstp); |
4410 | } |
4411 | |
4412 | + if (test_bit(SK_CLOSE, &svsk->sk_flags)) { |
4413 | + svc_delete_socket(svsk); |
4414 | + return 0; |
4415 | + } |
4416 | + |
4417 | clear_bit(SK_DATA, &svsk->sk_flags); |
4418 | while ((skb = skb_recv_datagram(svsk->sk_sk, 0, 1, &err)) == NULL) { |
4419 | if (err == -EAGAIN) { |
4420 | @@ -1176,7 +1190,8 @@ svc_tcp_sendto(struct svc_rqst *rqstp) |
4421 | rqstp->rq_sock->sk_server->sv_name, |
4422 | (sent<0)?"got error":"sent only", |
4423 | sent, xbufp->len); |
4424 | - svc_delete_socket(rqstp->rq_sock); |
4425 | + set_bit(SK_CLOSE, &rqstp->rq_sock->sk_flags); |
4426 | + svc_sock_enqueue(rqstp->rq_sock); |
4427 | sent = -EAGAIN; |
4428 | } |
4429 | return sent; |
4430 | @@ -1495,7 +1510,7 @@ svc_setup_socket(struct svc_serv *serv, struct socket *sock, |
4431 | svsk->sk_odata = inet->sk_data_ready; |
4432 | svsk->sk_owspace = inet->sk_write_space; |
4433 | svsk->sk_server = serv; |
4434 | - atomic_set(&svsk->sk_inuse, 0); |
4435 | + atomic_set(&svsk->sk_inuse, 1); |
4436 | svsk->sk_lastrecv = get_seconds(); |
4437 | spin_lock_init(&svsk->sk_defer_lock); |
4438 | INIT_LIST_HEAD(&svsk->sk_deferred); |
4439 | @@ -1618,7 +1633,7 @@ bummer: |
4440 | /* |
4441 | * Remove a dead socket |
4442 | */ |
4443 | -void |
4444 | +static void |
4445 | svc_delete_socket(struct svc_sock *svsk) |
4446 | { |
4447 | struct svc_serv *serv; |
4448 | @@ -1644,19 +1659,42 @@ svc_delete_socket(struct svc_sock *svsk) |
4449 | * while still attached to a queue, the queue itself |
4450 | * is about to be destroyed (in svc_destroy). |
4451 | */ |
4452 | - if (!test_and_set_bit(SK_DEAD, &svsk->sk_flags)) |
4453 | + if (!test_and_set_bit(SK_DEAD, &svsk->sk_flags)) { |
4454 | + BUG_ON(atomic_read(&svsk->sk_inuse)<2); |
4455 | + atomic_dec(&svsk->sk_inuse); |
4456 | if (test_bit(SK_TEMP, &svsk->sk_flags)) |
4457 | serv->sv_tmpcnt--; |
4458 | + } |
4459 | |
4460 | - /* This atomic_inc should be needed - svc_delete_socket |
4461 | - * should have the semantic of dropping a reference. |
4462 | - * But it doesn't yet.... |
4463 | - */ |
4464 | - atomic_inc(&svsk->sk_inuse); |
4465 | spin_unlock_bh(&serv->sv_lock); |
4466 | +} |
4467 | + |
4468 | +static void svc_close_socket(struct svc_sock *svsk) |
4469 | +{ |
4470 | + set_bit(SK_CLOSE, &svsk->sk_flags); |
4471 | + if (test_and_set_bit(SK_BUSY, &svsk->sk_flags)) |
4472 | + /* someone else will have to effect the close */ |
4473 | + return; |
4474 | + |
4475 | + atomic_inc(&svsk->sk_inuse); |
4476 | + svc_delete_socket(svsk); |
4477 | + clear_bit(SK_BUSY, &svsk->sk_flags); |
4478 | svc_sock_put(svsk); |
4479 | } |
4480 | |
4481 | +void svc_force_close_socket(struct svc_sock *svsk) |
4482 | +{ |
4483 | + set_bit(SK_CLOSE, &svsk->sk_flags); |
4484 | + if (test_bit(SK_BUSY, &svsk->sk_flags)) { |
4485 | + /* Waiting to be processed, but no threads left, |
4486 | + * So just remove it from the waiting list |
4487 | + */ |
4488 | + list_del_init(&svsk->sk_ready); |
4489 | + clear_bit(SK_BUSY, &svsk->sk_flags); |
4490 | + } |
4491 | + svc_close_socket(svsk); |
4492 | +} |
4493 | + |
4494 | /* |
4495 | * Make a socket for nfsd and lockd |
4496 | */ |
4497 | diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c |
4498 | index b7e537f..9704e05 100644 |
4499 | --- a/net/xfrm/xfrm_policy.c |
4500 | +++ b/net/xfrm/xfrm_policy.c |
4501 | @@ -1997,9 +1997,14 @@ void xfrm_audit_log(uid_t auid, u32 sid, int type, int result, |
4502 | if (audit_enabled == 0) |
4503 | return; |
4504 | |
4505 | + BUG_ON((type == AUDIT_MAC_IPSEC_ADDSA || |
4506 | + type == AUDIT_MAC_IPSEC_DELSA) && !x); |
4507 | + BUG_ON((type == AUDIT_MAC_IPSEC_ADDSPD || |
4508 | + type == AUDIT_MAC_IPSEC_DELSPD) && !xp); |
4509 | + |
4510 | audit_buf = audit_log_start(current->audit_context, GFP_ATOMIC, type); |
4511 | if (audit_buf == NULL) |
4512 | - return; |
4513 | + return; |
4514 | |
4515 | switch(type) { |
4516 | case AUDIT_MAC_IPSEC_ADDSA: |
4517 | diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c |
4518 | index 82f36d3..24d15f2 100644 |
4519 | --- a/net/xfrm/xfrm_user.c |
4520 | +++ b/net/xfrm/xfrm_user.c |
4521 | @@ -1273,10 +1273,6 @@ static int xfrm_get_policy(struct sk_buff *skb, struct nlmsghdr *nlh, |
4522 | xp = xfrm_policy_bysel_ctx(type, p->dir, &p->sel, tmp.security, delete); |
4523 | security_xfrm_policy_free(&tmp); |
4524 | } |
4525 | - if (delete) |
4526 | - xfrm_audit_log(NETLINK_CB(skb).loginuid, NETLINK_CB(skb).sid, |
4527 | - AUDIT_MAC_IPSEC_DELSPD, (xp) ? 1 : 0, xp, NULL); |
4528 | - |
4529 | if (xp == NULL) |
4530 | return -ENOENT; |
4531 | |
4532 | @@ -1292,8 +1288,14 @@ static int xfrm_get_policy(struct sk_buff *skb, struct nlmsghdr *nlh, |
4533 | MSG_DONTWAIT); |
4534 | } |
4535 | } else { |
4536 | - if ((err = security_xfrm_policy_delete(xp)) != 0) |
4537 | + err = security_xfrm_policy_delete(xp); |
4538 | + |
4539 | + xfrm_audit_log(NETLINK_CB(skb).loginuid, NETLINK_CB(skb).sid, |
4540 | + AUDIT_MAC_IPSEC_DELSPD, err ? 0 : 1, xp, NULL); |
4541 | + |
4542 | + if (err != 0) |
4543 | goto out; |
4544 | + |
4545 | c.data.byid = p->index; |
4546 | c.event = nlh->nlmsg_type; |
4547 | c.seq = nlh->nlmsg_seq; |
4548 | @@ -1555,14 +1557,13 @@ static int xfrm_add_sa_expire(struct sk_buff *skb, struct nlmsghdr *nlh, |
4549 | struct xfrm_usersa_info *p = &ue->state; |
4550 | |
4551 | x = xfrm_state_lookup(&p->id.daddr, p->id.spi, p->id.proto, p->family); |
4552 | - err = -ENOENT; |
4553 | |
4554 | + err = -ENOENT; |
4555 | if (x == NULL) |
4556 | return err; |
4557 | |
4558 | - err = -EINVAL; |
4559 | - |
4560 | spin_lock_bh(&x->lock); |
4561 | + err = -EINVAL; |
4562 | if (x->km.state != XFRM_STATE_VALID) |
4563 | goto out; |
4564 | km_state_expired(x, ue->hard, current->pid); |
4565 | @@ -1572,6 +1573,7 @@ static int xfrm_add_sa_expire(struct sk_buff *skb, struct nlmsghdr *nlh, |
4566 | xfrm_audit_log(NETLINK_CB(skb).loginuid, NETLINK_CB(skb).sid, |
4567 | AUDIT_MAC_IPSEC_DELSA, 1, NULL, x); |
4568 | } |
4569 | + err = 0; |
4570 | out: |
4571 | spin_unlock_bh(&x->lock); |
4572 | xfrm_state_put(x); |
4573 | diff --git a/security/keys/key.c b/security/keys/key.c |
4574 | index ac9326c..700400d 100644 |
4575 | --- a/security/keys/key.c |
4576 | +++ b/security/keys/key.c |
4577 | @@ -188,6 +188,7 @@ static inline void key_alloc_serial(struct key *key) |
4578 | |
4579 | spin_lock(&key_serial_lock); |
4580 | |
4581 | +attempt_insertion: |
4582 | parent = NULL; |
4583 | p = &key_serial_tree.rb_node; |
4584 | |
4585 | @@ -202,39 +203,33 @@ static inline void key_alloc_serial(struct key *key) |
4586 | else |
4587 | goto serial_exists; |
4588 | } |
4589 | - goto insert_here; |
4590 | + |
4591 | + /* we've found a suitable hole - arrange for this key to occupy it */ |
4592 | + rb_link_node(&key->serial_node, parent, p); |
4593 | + rb_insert_color(&key->serial_node, &key_serial_tree); |
4594 | + |
4595 | + spin_unlock(&key_serial_lock); |
4596 | + return; |
4597 | |
4598 | /* we found a key with the proposed serial number - walk the tree from |
4599 | * that point looking for the next unused serial number */ |
4600 | serial_exists: |
4601 | for (;;) { |
4602 | key->serial++; |
4603 | - if (key->serial < 2) |
4604 | - key->serial = 2; |
4605 | - |
4606 | - if (!rb_parent(parent)) |
4607 | - p = &key_serial_tree.rb_node; |
4608 | - else if (rb_parent(parent)->rb_left == parent) |
4609 | - p = &(rb_parent(parent)->rb_left); |
4610 | - else |
4611 | - p = &(rb_parent(parent)->rb_right); |
4612 | + if (key->serial < 3) { |
4613 | + key->serial = 3; |
4614 | + goto attempt_insertion; |
4615 | + } |
4616 | |
4617 | parent = rb_next(parent); |
4618 | if (!parent) |
4619 | - break; |
4620 | + goto attempt_insertion; |
4621 | |
4622 | xkey = rb_entry(parent, struct key, serial_node); |
4623 | if (key->serial < xkey->serial) |
4624 | - goto insert_here; |
4625 | + goto attempt_insertion; |
4626 | } |
4627 | |
4628 | - /* we've found a suitable hole - arrange for this key to occupy it */ |
4629 | -insert_here: |
4630 | - rb_link_node(&key->serial_node, parent, p); |
4631 | - rb_insert_color(&key->serial_node, &key_serial_tree); |
4632 | - |
4633 | - spin_unlock(&key_serial_lock); |
4634 | - |
4635 | } /* end key_alloc_serial() */ |
4636 | |
4637 | /*****************************************************************************/ |
4638 | diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c |
4639 | index 1a7e821..77f8ec7 100644 |
4640 | --- a/sound/pci/hda/hda_intel.c |
4641 | +++ b/sound/pci/hda/hda_intel.c |
4642 | @@ -199,7 +199,7 @@ enum { SDI0, SDI1, SDI2, SDI3, SDO0, SDO1, SDO2, SDO3 }; |
4643 | |
4644 | /* STATESTS int mask: SD2,SD1,SD0 */ |
4645 | #define STATESTS_INT_MASK 0x07 |
4646 | -#define AZX_MAX_CODECS 4 |
4647 | +#define AZX_MAX_CODECS 3 |
4648 | |
4649 | /* SD_CTL bits */ |
4650 | #define SD_CTL_STREAM_RESET 0x01 /* stream reset bit */ |
4651 | diff --git a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c |
4652 | index 19bdcc7..1bd9af6 100644 |
4653 | --- a/sound/usb/usbaudio.c |
4654 | +++ b/sound/usb/usbaudio.c |
4655 | @@ -186,6 +186,7 @@ struct snd_usb_substream { |
4656 | u64 formats; /* format bitmasks (all or'ed) */ |
4657 | unsigned int num_formats; /* number of supported audio formats (list) */ |
4658 | struct list_head fmt_list; /* format list */ |
4659 | + struct snd_pcm_hw_constraint_list rate_list; /* limited rates */ |
4660 | spinlock_t lock; |
4661 | |
4662 | struct snd_urb_ops ops; /* callbacks (must be filled at init) */ |
4663 | @@ -1810,28 +1811,33 @@ static int check_hw_params_convention(struct snd_usb_substream *subs) |
4664 | static int snd_usb_pcm_check_knot(struct snd_pcm_runtime *runtime, |
4665 | struct snd_usb_substream *subs) |
4666 | { |
4667 | - struct list_head *p; |
4668 | - struct snd_pcm_hw_constraint_list constraints_rates; |
4669 | + struct audioformat *fp; |
4670 | + int count = 0, needs_knot = 0; |
4671 | int err; |
4672 | |
4673 | - list_for_each(p, &subs->fmt_list) { |
4674 | - struct audioformat *fp; |
4675 | - fp = list_entry(p, struct audioformat, list); |
4676 | - |
4677 | - if (!fp->needs_knot) |
4678 | - continue; |
4679 | - |
4680 | - constraints_rates.count = fp->nr_rates; |
4681 | - constraints_rates.list = fp->rate_table; |
4682 | - constraints_rates.mask = 0; |
4683 | - |
4684 | - err = snd_pcm_hw_constraint_list(runtime, 0, |
4685 | - SNDRV_PCM_HW_PARAM_RATE, |
4686 | - &constraints_rates); |
4687 | - |
4688 | - if (err < 0) |
4689 | - return err; |
4690 | + list_for_each_entry(fp, &subs->fmt_list, list) { |
4691 | + if (fp->rates & SNDRV_PCM_RATE_CONTINUOUS) |
4692 | + return 0; |
4693 | + count += fp->nr_rates; |
4694 | + if (fp->needs_knot) |
4695 | + needs_knot = 1; |
4696 | } |
4697 | + if (!needs_knot) |
4698 | + return 0; |
4699 | + |
4700 | + subs->rate_list.count = count; |
4701 | + subs->rate_list.list = kmalloc(sizeof(int) * count, GFP_KERNEL); |
4702 | + subs->rate_list.mask = 0; |
4703 | + count = 0; |
4704 | + list_for_each_entry(fp, &subs->fmt_list, list) { |
4705 | + int i; |
4706 | + for (i = 0; i < fp->nr_rates; i++) |
4707 | + subs->rate_list.list[count++] = fp->rate_table[i]; |
4708 | + } |
4709 | + err = snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE, |
4710 | + &subs->rate_list); |
4711 | + if (err < 0) |
4712 | + return err; |
4713 | |
4714 | return 0; |
4715 | } |
4716 | @@ -2231,6 +2237,7 @@ static void free_substream(struct snd_usb_substream *subs) |
4717 | kfree(fp->rate_table); |
4718 | kfree(fp); |
4719 | } |
4720 | + kfree(subs->rate_list.list); |
4721 | } |
4722 | |
4723 | |
4724 | @@ -2456,6 +2463,7 @@ static int parse_audio_format_rates(struct snd_usb_audio *chip, struct audioform |
4725 | * build the rate table and bitmap flags |
4726 | */ |
4727 | int r, idx, c; |
4728 | + unsigned int nonzero_rates = 0; |
4729 | /* this table corresponds to the SNDRV_PCM_RATE_XXX bit */ |
4730 | static unsigned int conv_rates[] = { |
4731 | 5512, 8000, 11025, 16000, 22050, 32000, 44100, 48000, |
4732 | @@ -2478,6 +2486,7 @@ static int parse_audio_format_rates(struct snd_usb_audio *chip, struct audioform |
4733 | fp->altsetting == 5 && fp->maxpacksize == 392) |
4734 | rate = 96000; |
4735 | fp->rate_table[r] = rate; |
4736 | + nonzero_rates |= rate; |
4737 | if (rate < fp->rate_min) |
4738 | fp->rate_min = rate; |
4739 | else if (rate > fp->rate_max) |
4740 | @@ -2493,6 +2502,10 @@ static int parse_audio_format_rates(struct snd_usb_audio *chip, struct audioform |
4741 | if (!found) |
4742 | fp->needs_knot = 1; |
4743 | } |
4744 | + if (!nonzero_rates) { |
4745 | + hwc_debug("All rates were zero. Skipping format!\n"); |
4746 | + return -1; |
4747 | + } |
4748 | if (fp->needs_knot) |
4749 | fp->rates |= SNDRV_PCM_RATE_KNOT; |
4750 | } else { |