Annotation of /trunk/kernel26-alx/patches-2.6.20-r6/0101-2.6.20.2-all-fixes.patch
Parent Directory | Revision Log
Revision 1175 -
(hide annotations)
(download)
Thu Oct 14 12:15:46 2010 UTC (13 years, 11 months ago) by niro
File size: 151744 byte(s)
Thu Oct 14 12:15:46 2010 UTC (13 years, 11 months ago) by niro
File size: 151744 byte(s)
-2.6.20-alx-r6 new magellan 0.5.2 kernel
1 | niro | 1175 | 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 { |