Magellan Linux

Contents of /trunk/kernel26-magellan/patches-2.6.25-r4/0103-2.6.25.4-all-fixes.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 664 - (show annotations) (download)
Thu Jul 10 13:03:47 2008 UTC (15 years, 9 months ago) by niro
File size: 95407 byte(s)
-2.6.25-magellan-r4; updated to linux-2.6.25.10

1 diff --git a/arch/sparc/kernel/entry.S b/arch/sparc/kernel/entry.S
2 index c2eed8f..1ea92e7 100644
3 --- a/arch/sparc/kernel/entry.S
4 +++ b/arch/sparc/kernel/entry.S
5 @@ -1398,6 +1398,8 @@ ret_from_fork:
6 .align 4
7 .globl linux_sparc_syscall
8 linux_sparc_syscall:
9 + sethi %hi(PSR_SYSCALL), %l4
10 + or %l0, %l4, %l0
11 /* Direct access to user regs, must faster. */
12 cmp %g1, NR_SYSCALLS
13 bgeu linux_sparc_ni_syscall
14 diff --git a/arch/sparc/kernel/process.c b/arch/sparc/kernel/process.c
15 index 70c0dd2..a65aed3 100644
16 --- a/arch/sparc/kernel/process.c
17 +++ b/arch/sparc/kernel/process.c
18 @@ -421,14 +421,26 @@ asmlinkage int sparc_do_fork(unsigned long clone_flags,
19 unsigned long stack_size)
20 {
21 unsigned long parent_tid_ptr, child_tid_ptr;
22 + unsigned long orig_i1 = regs->u_regs[UREG_I1];
23 + long ret;
24
25 parent_tid_ptr = regs->u_regs[UREG_I2];
26 child_tid_ptr = regs->u_regs[UREG_I4];
27
28 - return do_fork(clone_flags, stack_start,
29 - regs, stack_size,
30 - (int __user *) parent_tid_ptr,
31 - (int __user *) child_tid_ptr);
32 + ret = do_fork(clone_flags, stack_start,
33 + regs, stack_size,
34 + (int __user *) parent_tid_ptr,
35 + (int __user *) child_tid_ptr);
36 +
37 + /* If we get an error and potentially restart the system
38 + * call, we're screwed because copy_thread() clobbered
39 + * the parent's %o1. So detect that case and restore it
40 + * here.
41 + */
42 + if ((unsigned long)ret >= -ERESTART_RESTARTBLOCK)
43 + regs->u_regs[UREG_I1] = orig_i1;
44 +
45 + return ret;
46 }
47
48 /* Copy a Sparc thread. The fork() return value conventions
49 @@ -628,11 +640,6 @@ asmlinkage int sparc_execve(struct pt_regs *regs)
50 (char __user * __user *)regs->u_regs[base + UREG_I2],
51 regs);
52 putname(filename);
53 - if (error == 0) {
54 - task_lock(current);
55 - current->ptrace &= ~PT_DTRACE;
56 - task_unlock(current);
57 - }
58 out:
59 return error;
60 }
61 diff --git a/arch/sparc/kernel/ptrace.c b/arch/sparc/kernel/ptrace.c
62 index 7f44ae6..81f3b92 100644
63 --- a/arch/sparc/kernel/ptrace.c
64 +++ b/arch/sparc/kernel/ptrace.c
65 @@ -170,8 +170,8 @@ static int genregs32_set(struct task_struct *target,
66 switch (pos) {
67 case 32: /* PSR */
68 psr = regs->psr;
69 - psr &= ~PSR_ICC;
70 - psr |= (reg & PSR_ICC);
71 + psr &= ~(PSR_ICC | PSR_SYSCALL);
72 + psr |= (reg & (PSR_ICC | PSR_SYSCALL));
73 regs->psr = psr;
74 break;
75 case 33: /* PC */
76 @@ -441,6 +441,8 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
77 break;
78
79 default:
80 + if (request == PTRACE_SPARC_DETACH)
81 + request = PTRACE_DETACH;
82 ret = ptrace_request(child, request, addr, data);
83 break;
84 }
85 diff --git a/arch/sparc/kernel/rtrap.S b/arch/sparc/kernel/rtrap.S
86 index 77ca6fd..ab818cd 100644
87 --- a/arch/sparc/kernel/rtrap.S
88 +++ b/arch/sparc/kernel/rtrap.S
89 @@ -50,8 +50,9 @@ rtrap_7win_patch5: and %g1, 0x7f, %g1
90 ret_trap_entry:
91 ret_trap_lockless_ipi:
92 andcc %t_psr, PSR_PS, %g0
93 + sethi %hi(PSR_SYSCALL), %g1
94 be 1f
95 - nop
96 + andn %t_psr, %g1, %t_psr
97
98 wr %t_psr, 0x0, %psr
99 b ret_trap_kernel
100 @@ -73,7 +74,6 @@ signal_p:
101 ld [%sp + STACKFRAME_SZ + PT_PSR], %t_psr
102
103 mov %l5, %o1
104 - mov %l6, %o2
105 call do_signal
106 add %sp, STACKFRAME_SZ, %o0 ! pt_regs ptr
107
108 @@ -81,6 +81,8 @@ signal_p:
109 ld [%sp + STACKFRAME_SZ + PT_PSR], %t_psr
110 clr %l6
111 ret_trap_continue:
112 + sethi %hi(PSR_SYSCALL), %g1
113 + andn %t_psr, %g1, %t_psr
114 wr %t_psr, 0x0, %psr
115 WRITE_PAUSE
116
117 @@ -137,8 +139,9 @@ ret_trap_userwins_ok:
118 LOAD_PT_PRIV(sp, t_psr, t_pc, t_npc)
119 or %t_pc, %t_npc, %g2
120 andcc %g2, 0x3, %g0
121 + sethi %hi(PSR_SYSCALL), %g2
122 be 1f
123 - nop
124 + andn %t_psr, %g2, %t_psr
125
126 b ret_trap_unaligned_pc
127 add %sp, STACKFRAME_SZ, %o0
128 @@ -201,6 +204,8 @@ rtrap_patch5: and %g1, 0xff, %g1
129 1:
130 LOAD_PT_ALL(sp, t_psr, t_pc, t_npc, g1)
131 2:
132 + sethi %hi(PSR_SYSCALL), %twin_tmp1
133 + andn %t_psr, %twin_tmp1, %t_psr
134 wr %t_psr, 0x0, %psr
135 WRITE_PAUSE
136
137 diff --git a/arch/sparc/kernel/signal.c b/arch/sparc/kernel/signal.c
138 index 9994cac..e85023b 100644
139 --- a/arch/sparc/kernel/signal.c
140 +++ b/arch/sparc/kernel/signal.c
141 @@ -178,6 +178,9 @@ static inline void do_new_sigreturn (struct pt_regs *regs)
142 regs->psr = (up_psr & ~(PSR_ICC | PSR_EF))
143 | (regs->psr & (PSR_ICC | PSR_EF));
144
145 + /* Prevent syscall restart. */
146 + pt_regs_clear_syscall(regs);
147 +
148 err |= __get_user(fpu_save, &sf->fpu_save);
149
150 if (fpu_save)
151 @@ -299,6 +302,9 @@ asmlinkage void do_rt_sigreturn(struct pt_regs *regs)
152
153 regs->psr = (regs->psr & ~PSR_ICC) | (psr & PSR_ICC);
154
155 + /* Prevent syscall restart. */
156 + pt_regs_clear_syscall(regs);
157 +
158 err |= __get_user(fpu_save, &sf->fpu_save);
159
160 if (fpu_save)
161 @@ -345,15 +351,29 @@ static inline int invalid_frame_pointer(void __user *fp, int fplen)
162
163 static inline void __user *get_sigframe(struct sigaction *sa, struct pt_regs *regs, unsigned long framesize)
164 {
165 - unsigned long sp;
166 + unsigned long sp = regs->u_regs[UREG_FP];
167
168 - sp = regs->u_regs[UREG_FP];
169 + /*
170 + * If we are on the alternate signal stack and would overflow it, don't.
171 + * Return an always-bogus address instead so we will die with SIGSEGV.
172 + */
173 + if (on_sig_stack(sp) && !likely(on_sig_stack(sp - framesize)))
174 + return (void __user *) -1L;
175
176 /* This is the X/Open sanctioned signal stack switching. */
177 if (sa->sa_flags & SA_ONSTACK) {
178 - if (!on_sig_stack(sp) && !((current->sas_ss_sp + current->sas_ss_size) & 7))
179 + if (sas_ss_flags(sp) == 0)
180 sp = current->sas_ss_sp + current->sas_ss_size;
181 }
182 +
183 + /* Always align the stack frame. This handles two cases. First,
184 + * sigaltstack need not be mindful of platform specific stack
185 + * alignment. Second, if we took this signal because the stack
186 + * is not aligned properly, we'd like to take the signal cleanly
187 + * and report that.
188 + */
189 + sp &= ~7UL;
190 +
191 return (void __user *)(sp - framesize);
192 }
193
194 @@ -994,13 +1014,13 @@ static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs,
195 * want to handle. Thus you cannot kill init even with a SIGKILL even by
196 * mistake.
197 */
198 -asmlinkage void do_signal(struct pt_regs * regs, unsigned long orig_i0, int restart_syscall)
199 +asmlinkage void do_signal(struct pt_regs * regs, unsigned long orig_i0)
200 {
201 - siginfo_t info;
202 - struct sparc_deliver_cookie cookie;
203 struct k_sigaction ka;
204 - int signr;
205 + int restart_syscall;
206 sigset_t *oldset;
207 + siginfo_t info;
208 + int signr;
209
210 /*
211 * XXX Disable svr4 signal handling until solaris emulation works.
212 @@ -1013,18 +1033,28 @@ asmlinkage void do_signal(struct pt_regs * regs, unsigned long orig_i0, int rest
213 int svr4_signal = current->personality == PER_SVR4;
214 #endif
215
216 - cookie.restart_syscall = restart_syscall;
217 - cookie.orig_i0 = orig_i0;
218 + if (pt_regs_is_syscall(regs) && (regs->psr & PSR_C))
219 + restart_syscall = 1;
220 + else
221 + restart_syscall = 0;
222
223 if (test_thread_flag(TIF_RESTORE_SIGMASK))
224 oldset = &current->saved_sigmask;
225 else
226 oldset = &current->blocked;
227
228 - signr = get_signal_to_deliver(&info, &ka, regs, &cookie);
229 + signr = get_signal_to_deliver(&info, &ka, regs, NULL);
230 +
231 + /* If the debugger messes with the program counter, it clears
232 + * the software "in syscall" bit, directing us to not perform
233 + * a syscall restart.
234 + */
235 + if (restart_syscall && !pt_regs_is_syscall(regs))
236 + restart_syscall = 0;
237 +
238 if (signr > 0) {
239 - if (cookie.restart_syscall)
240 - syscall_restart(cookie.orig_i0, regs, &ka.sa);
241 + if (restart_syscall)
242 + syscall_restart(orig_i0, regs, &ka.sa);
243 handle_signal(signr, &ka, &info, oldset,
244 regs, svr4_signal);
245 /* a signal was successfully delivered; the saved
246 @@ -1036,16 +1066,16 @@ asmlinkage void do_signal(struct pt_regs * regs, unsigned long orig_i0, int rest
247 clear_thread_flag(TIF_RESTORE_SIGMASK);
248 return;
249 }
250 - if (cookie.restart_syscall &&
251 + if (restart_syscall &&
252 (regs->u_regs[UREG_I0] == ERESTARTNOHAND ||
253 regs->u_regs[UREG_I0] == ERESTARTSYS ||
254 regs->u_regs[UREG_I0] == ERESTARTNOINTR)) {
255 /* replay the system call when we are done */
256 - regs->u_regs[UREG_I0] = cookie.orig_i0;
257 + regs->u_regs[UREG_I0] = orig_i0;
258 regs->pc -= 4;
259 regs->npc -= 4;
260 }
261 - if (cookie.restart_syscall &&
262 + if (restart_syscall &&
263 regs->u_regs[UREG_I0] == ERESTART_RESTARTBLOCK) {
264 regs->u_regs[UREG_G1] = __NR_restart_syscall;
265 regs->pc -= 4;
266 @@ -1097,27 +1127,3 @@ do_sys_sigstack(struct sigstack __user *ssptr, struct sigstack __user *ossptr,
267 out:
268 return ret;
269 }
270 -
271 -void ptrace_signal_deliver(struct pt_regs *regs, void *cookie)
272 -{
273 - struct sparc_deliver_cookie *cp = cookie;
274 -
275 - if (cp->restart_syscall &&
276 - (regs->u_regs[UREG_I0] == ERESTARTNOHAND ||
277 - regs->u_regs[UREG_I0] == ERESTARTSYS ||
278 - regs->u_regs[UREG_I0] == ERESTARTNOINTR)) {
279 - /* replay the system call when we are done */
280 - regs->u_regs[UREG_I0] = cp->orig_i0;
281 - regs->pc -= 4;
282 - regs->npc -= 4;
283 - cp->restart_syscall = 0;
284 - }
285 -
286 - if (cp->restart_syscall &&
287 - regs->u_regs[UREG_I0] == ERESTART_RESTARTBLOCK) {
288 - regs->u_regs[UREG_G1] = __NR_restart_syscall;
289 - regs->pc -= 4;
290 - regs->npc -= 4;
291 - cp->restart_syscall = 0;
292 - }
293 -}
294 diff --git a/arch/sparc/kernel/sys_sparc.c b/arch/sparc/kernel/sys_sparc.c
295 index 9f8c8e1..3423d07 100644
296 --- a/arch/sparc/kernel/sys_sparc.c
297 +++ b/arch/sparc/kernel/sys_sparc.c
298 @@ -220,7 +220,7 @@ out:
299 return err;
300 }
301
302 -int sparc_mmap_check(unsigned long addr, unsigned long len, unsigned long flags)
303 +int sparc_mmap_check(unsigned long addr, unsigned long len)
304 {
305 if (ARCH_SUN4C_SUN4 &&
306 (len > 0x20000000 ||
307 @@ -296,52 +296,14 @@ asmlinkage unsigned long sparc_mremap(unsigned long addr,
308 unsigned long old_len, unsigned long new_len,
309 unsigned long flags, unsigned long new_addr)
310 {
311 - struct vm_area_struct *vma;
312 unsigned long ret = -EINVAL;
313 - if (ARCH_SUN4C_SUN4) {
314 - if (old_len > 0x20000000 || new_len > 0x20000000)
315 - goto out;
316 - if (addr < 0xe0000000 && addr + old_len > 0x20000000)
317 - goto out;
318 - }
319 - if (old_len > TASK_SIZE - PAGE_SIZE ||
320 - new_len > TASK_SIZE - PAGE_SIZE)
321 +
322 + if (unlikely(sparc_mmap_check(addr, old_len)))
323 + goto out;
324 + if (unlikely(sparc_mmap_check(new_addr, new_len)))
325 goto out;
326 down_write(&current->mm->mmap_sem);
327 - if (flags & MREMAP_FIXED) {
328 - if (ARCH_SUN4C_SUN4 &&
329 - new_addr < 0xe0000000 &&
330 - new_addr + new_len > 0x20000000)
331 - goto out_sem;
332 - if (new_addr + new_len > TASK_SIZE - PAGE_SIZE)
333 - goto out_sem;
334 - } else if ((ARCH_SUN4C_SUN4 && addr < 0xe0000000 &&
335 - addr + new_len > 0x20000000) ||
336 - addr + new_len > TASK_SIZE - PAGE_SIZE) {
337 - unsigned long map_flags = 0;
338 - struct file *file = NULL;
339 -
340 - ret = -ENOMEM;
341 - if (!(flags & MREMAP_MAYMOVE))
342 - goto out_sem;
343 -
344 - vma = find_vma(current->mm, addr);
345 - if (vma) {
346 - if (vma->vm_flags & VM_SHARED)
347 - map_flags |= MAP_SHARED;
348 - file = vma->vm_file;
349 - }
350 -
351 - new_addr = get_unmapped_area(file, addr, new_len,
352 - vma ? vma->vm_pgoff : 0,
353 - map_flags);
354 - ret = new_addr;
355 - if (new_addr & ~PAGE_MASK)
356 - goto out_sem;
357 - flags |= MREMAP_FIXED;
358 - }
359 ret = do_mremap(addr, old_len, new_len, flags, new_addr);
360 -out_sem:
361 up_write(&current->mm->mmap_sem);
362 out:
363 return ret;
364 diff --git a/arch/sparc64/kernel/etrap.S b/arch/sparc64/kernel/etrap.S
365 index 4b2bf9e..b087e97 100644
366 --- a/arch/sparc64/kernel/etrap.S
367 +++ b/arch/sparc64/kernel/etrap.S
368 @@ -27,11 +27,12 @@
369
370 .text
371 .align 64
372 - .globl etrap, etrap_irq, etraptl1
373 + .globl etrap_syscall, etrap, etrap_irq, etraptl1
374 etrap: rdpr %pil, %g2
375 -etrap_irq:
376 - TRAP_LOAD_THREAD_REG(%g6, %g1)
377 +etrap_irq: clr %g3
378 +etrap_syscall: TRAP_LOAD_THREAD_REG(%g6, %g1)
379 rdpr %tstate, %g1
380 + or %g1, %g3, %g1
381 sllx %g2, 20, %g3
382 andcc %g1, TSTATE_PRIV, %g0
383 or %g1, %g3, %g1
384 diff --git a/arch/sparc64/kernel/irq.c b/arch/sparc64/kernel/irq.c
385 index eb88bd6..b441a26 100644
386 --- a/arch/sparc64/kernel/irq.c
387 +++ b/arch/sparc64/kernel/irq.c
388 @@ -1,6 +1,6 @@
389 /* irq.c: UltraSparc IRQ handling/init/registry.
390 *
391 - * Copyright (C) 1997, 2007 David S. Miller (davem@davemloft.net)
392 + * Copyright (C) 1997, 2007, 2008 David S. Miller (davem@davemloft.net)
393 * Copyright (C) 1998 Eddie C. Dost (ecd@skynet.be)
394 * Copyright (C) 1998 Jakub Jelinek (jj@ultra.linux.cz)
395 */
396 @@ -308,6 +308,7 @@ static void sun4u_irq_enable(unsigned int virt_irq)
397 IMAP_AID_SAFARI | IMAP_NID_SAFARI);
398 val |= tid | IMAP_VALID;
399 upa_writeq(val, imap);
400 + upa_writeq(ICLR_IDLE, data->iclr);
401 }
402 }
403
404 diff --git a/arch/sparc64/kernel/pci.c b/arch/sparc64/kernel/pci.c
405 index 545356b..39f0c46 100644
406 --- a/arch/sparc64/kernel/pci.c
407 +++ b/arch/sparc64/kernel/pci.c
408 @@ -351,8 +351,7 @@ static void pci_parse_of_addrs(struct of_device *op,
409
410 struct pci_dev *of_create_pci_dev(struct pci_pbm_info *pbm,
411 struct device_node *node,
412 - struct pci_bus *bus, int devfn,
413 - int host_controller)
414 + struct pci_bus *bus, int devfn)
415 {
416 struct dev_archdata *sd;
417 struct pci_dev *dev;
418 @@ -389,43 +388,28 @@ struct pci_dev *of_create_pci_dev(struct pci_pbm_info *pbm,
419 dev->devfn = devfn;
420 dev->multifunction = 0; /* maybe a lie? */
421
422 - if (host_controller) {
423 - if (tlb_type != hypervisor) {
424 - pci_read_config_word(dev, PCI_VENDOR_ID,
425 - &dev->vendor);
426 - pci_read_config_word(dev, PCI_DEVICE_ID,
427 - &dev->device);
428 - } else {
429 - dev->vendor = PCI_VENDOR_ID_SUN;
430 - dev->device = 0x80f0;
431 - }
432 - dev->cfg_size = 256;
433 - dev->class = PCI_CLASS_BRIDGE_HOST << 8;
434 - sprintf(pci_name(dev), "%04x:%02x:%02x.%d", pci_domain_nr(bus),
435 - 0x00, PCI_SLOT(devfn), PCI_FUNC(devfn));
436 - } else {
437 - dev->vendor = of_getintprop_default(node, "vendor-id", 0xffff);
438 - dev->device = of_getintprop_default(node, "device-id", 0xffff);
439 - dev->subsystem_vendor =
440 - of_getintprop_default(node, "subsystem-vendor-id", 0);
441 - dev->subsystem_device =
442 - of_getintprop_default(node, "subsystem-id", 0);
443 -
444 - dev->cfg_size = pci_cfg_space_size(dev);
445 -
446 - /* We can't actually use the firmware value, we have
447 - * to read what is in the register right now. One
448 - * reason is that in the case of IDE interfaces the
449 - * firmware can sample the value before the the IDE
450 - * interface is programmed into native mode.
451 - */
452 - pci_read_config_dword(dev, PCI_CLASS_REVISION, &class);
453 - dev->class = class >> 8;
454 - dev->revision = class & 0xff;
455 + dev->vendor = of_getintprop_default(node, "vendor-id", 0xffff);
456 + dev->device = of_getintprop_default(node, "device-id", 0xffff);
457 + dev->subsystem_vendor =
458 + of_getintprop_default(node, "subsystem-vendor-id", 0);
459 + dev->subsystem_device =
460 + of_getintprop_default(node, "subsystem-id", 0);
461 +
462 + dev->cfg_size = pci_cfg_space_size(dev);
463 +
464 + /* We can't actually use the firmware value, we have
465 + * to read what is in the register right now. One
466 + * reason is that in the case of IDE interfaces the
467 + * firmware can sample the value before the the IDE
468 + * interface is programmed into native mode.
469 + */
470 + pci_read_config_dword(dev, PCI_CLASS_REVISION, &class);
471 + dev->class = class >> 8;
472 + dev->revision = class & 0xff;
473 +
474 + sprintf(pci_name(dev), "%04x:%02x:%02x.%d", pci_domain_nr(bus),
475 + dev->bus->number, PCI_SLOT(devfn), PCI_FUNC(devfn));
476
477 - sprintf(pci_name(dev), "%04x:%02x:%02x.%d", pci_domain_nr(bus),
478 - dev->bus->number, PCI_SLOT(devfn), PCI_FUNC(devfn));
479 - }
480 if (ofpci_verbose)
481 printk(" class: 0x%x device name: %s\n",
482 dev->class, pci_name(dev));
483 @@ -440,26 +424,21 @@ struct pci_dev *of_create_pci_dev(struct pci_pbm_info *pbm,
484 dev->current_state = 4; /* unknown power state */
485 dev->error_state = pci_channel_io_normal;
486
487 - if (host_controller) {
488 + if (!strcmp(type, "pci") || !strcmp(type, "pciex")) {
489 + /* a PCI-PCI bridge */
490 dev->hdr_type = PCI_HEADER_TYPE_BRIDGE;
491 dev->rom_base_reg = PCI_ROM_ADDRESS1;
492 - dev->irq = PCI_IRQ_NONE;
493 + } else if (!strcmp(type, "cardbus")) {
494 + dev->hdr_type = PCI_HEADER_TYPE_CARDBUS;
495 } else {
496 - if (!strcmp(type, "pci") || !strcmp(type, "pciex")) {
497 - /* a PCI-PCI bridge */
498 - dev->hdr_type = PCI_HEADER_TYPE_BRIDGE;
499 - dev->rom_base_reg = PCI_ROM_ADDRESS1;
500 - } else if (!strcmp(type, "cardbus")) {
501 - dev->hdr_type = PCI_HEADER_TYPE_CARDBUS;
502 - } else {
503 - dev->hdr_type = PCI_HEADER_TYPE_NORMAL;
504 - dev->rom_base_reg = PCI_ROM_ADDRESS;
505 + dev->hdr_type = PCI_HEADER_TYPE_NORMAL;
506 + dev->rom_base_reg = PCI_ROM_ADDRESS;
507
508 - dev->irq = sd->op->irqs[0];
509 - if (dev->irq == 0xffffffff)
510 - dev->irq = PCI_IRQ_NONE;
511 - }
512 + dev->irq = sd->op->irqs[0];
513 + if (dev->irq == 0xffffffff)
514 + dev->irq = PCI_IRQ_NONE;
515 }
516 +
517 pci_parse_of_addrs(sd->op, node, dev);
518
519 if (ofpci_verbose)
520 @@ -748,7 +727,7 @@ static void __devinit pci_of_scan_bus(struct pci_pbm_info *pbm,
521 prev_devfn = devfn;
522
523 /* create a new pci_dev for this device */
524 - dev = of_create_pci_dev(pbm, child, bus, devfn, 0);
525 + dev = of_create_pci_dev(pbm, child, bus, devfn);
526 if (!dev)
527 continue;
528 if (ofpci_verbose)
529 @@ -795,48 +774,9 @@ static void __devinit pci_bus_register_of_sysfs(struct pci_bus *bus)
530 pci_bus_register_of_sysfs(child_bus);
531 }
532
533 -int pci_host_bridge_read_pci_cfg(struct pci_bus *bus_dev,
534 - unsigned int devfn,
535 - int where, int size,
536 - u32 *value)
537 -{
538 - static u8 fake_pci_config[] = {
539 - 0x8e, 0x10, /* Vendor: 0x108e (Sun) */
540 - 0xf0, 0x80, /* Device: 0x80f0 (Fire) */
541 - 0x46, 0x01, /* Command: 0x0146 (SERR, PARITY, MASTER, MEM) */
542 - 0xa0, 0x22, /* Status: 0x02a0 (DEVSEL_MED, FB2B, 66MHZ) */
543 - 0x00, 0x00, 0x00, 0x06, /* Class: 0x06000000 host bridge */
544 - 0x00, /* Cacheline: 0x00 */
545 - 0x40, /* Latency: 0x40 */
546 - 0x00, /* Header-Type: 0x00 normal */
547 - };
548 -
549 - *value = 0;
550 - if (where >= 0 && where < sizeof(fake_pci_config) &&
551 - (where + size) >= 0 &&
552 - (where + size) < sizeof(fake_pci_config) &&
553 - size <= sizeof(u32)) {
554 - while (size--) {
555 - *value <<= 8;
556 - *value |= fake_pci_config[where + size];
557 - }
558 - }
559 -
560 - return PCIBIOS_SUCCESSFUL;
561 -}
562 -
563 -int pci_host_bridge_write_pci_cfg(struct pci_bus *bus_dev,
564 - unsigned int devfn,
565 - int where, int size,
566 - u32 value)
567 -{
568 - return PCIBIOS_SUCCESSFUL;
569 -}
570 -
571 struct pci_bus * __devinit pci_scan_one_pbm(struct pci_pbm_info *pbm)
572 {
573 struct device_node *node = pbm->prom_node;
574 - struct pci_dev *host_pdev;
575 struct pci_bus *bus;
576
577 printk("PCI: Scanning PBM %s\n", node->full_name);
578 @@ -854,10 +794,6 @@ struct pci_bus * __devinit pci_scan_one_pbm(struct pci_pbm_info *pbm)
579 bus->resource[0] = &pbm->io_space;
580 bus->resource[1] = &pbm->mem_space;
581
582 - /* Create the dummy host bridge and link it in. */
583 - host_pdev = of_create_pci_dev(pbm, node, bus, 0x00, 1);
584 - bus->self = host_pdev;
585 -
586 pci_of_scan_bus(pbm, node, bus);
587 pci_bus_add_devices(bus);
588 pci_bus_register_of_sysfs(bus);
589 diff --git a/arch/sparc64/kernel/pci_common.c b/arch/sparc64/kernel/pci_common.c
590 index 923e0bc..19fa621 100644
591 --- a/arch/sparc64/kernel/pci_common.c
592 +++ b/arch/sparc64/kernel/pci_common.c
593 @@ -264,9 +264,6 @@ static int sun4v_read_pci_cfg(struct pci_bus *bus_dev, unsigned int devfn,
594 unsigned int func = PCI_FUNC(devfn);
595 unsigned long ret;
596
597 - if (!bus && devfn == 0x00)
598 - return pci_host_bridge_read_pci_cfg(bus_dev, devfn, where,
599 - size, value);
600 if (config_out_of_range(pbm, bus, devfn, where)) {
601 ret = ~0UL;
602 } else {
603 @@ -300,9 +297,6 @@ static int sun4v_write_pci_cfg(struct pci_bus *bus_dev, unsigned int devfn,
604 unsigned int func = PCI_FUNC(devfn);
605 unsigned long ret;
606
607 - if (!bus && devfn == 0x00)
608 - return pci_host_bridge_write_pci_cfg(bus_dev, devfn, where,
609 - size, value);
610 if (config_out_of_range(pbm, bus, devfn, where)) {
611 /* Do nothing. */
612 } else {
613 diff --git a/arch/sparc64/kernel/pci_impl.h b/arch/sparc64/kernel/pci_impl.h
614 index 4a50da1..37b4403 100644
615 --- a/arch/sparc64/kernel/pci_impl.h
616 +++ b/arch/sparc64/kernel/pci_impl.h
617 @@ -167,15 +167,6 @@ extern void pci_get_pbm_props(struct pci_pbm_info *pbm);
618 extern struct pci_bus *pci_scan_one_pbm(struct pci_pbm_info *pbm);
619 extern void pci_determine_mem_io_space(struct pci_pbm_info *pbm);
620
621 -extern int pci_host_bridge_read_pci_cfg(struct pci_bus *bus_dev,
622 - unsigned int devfn,
623 - int where, int size,
624 - u32 *value);
625 -extern int pci_host_bridge_write_pci_cfg(struct pci_bus *bus_dev,
626 - unsigned int devfn,
627 - int where, int size,
628 - u32 value);
629 -
630 /* Error reporting support. */
631 extern void pci_scan_for_target_abort(struct pci_pbm_info *, struct pci_bus *);
632 extern void pci_scan_for_master_abort(struct pci_pbm_info *, struct pci_bus *);
633 diff --git a/arch/sparc64/kernel/process.c b/arch/sparc64/kernel/process.c
634 index acf8c52..334e64c 100644
635 --- a/arch/sparc64/kernel/process.c
636 +++ b/arch/sparc64/kernel/process.c
637 @@ -507,6 +507,8 @@ asmlinkage long sparc_do_fork(unsigned long clone_flags,
638 unsigned long stack_size)
639 {
640 int __user *parent_tid_ptr, *child_tid_ptr;
641 + unsigned long orig_i1 = regs->u_regs[UREG_I1];
642 + long ret;
643
644 #ifdef CONFIG_COMPAT
645 if (test_thread_flag(TIF_32BIT)) {
646 @@ -519,9 +521,19 @@ asmlinkage long sparc_do_fork(unsigned long clone_flags,
647 child_tid_ptr = (int __user *) regs->u_regs[UREG_I4];
648 }
649
650 - return do_fork(clone_flags, stack_start,
651 - regs, stack_size,
652 - parent_tid_ptr, child_tid_ptr);
653 + ret = do_fork(clone_flags, stack_start,
654 + regs, stack_size,
655 + parent_tid_ptr, child_tid_ptr);
656 +
657 + /* If we get an error and potentially restart the system
658 + * call, we're screwed because copy_thread() clobbered
659 + * the parent's %o1. So detect that case and restore it
660 + * here.
661 + */
662 + if ((unsigned long)ret >= -ERESTART_RESTARTBLOCK)
663 + regs->u_regs[UREG_I1] = orig_i1;
664 +
665 + return ret;
666 }
667
668 /* Copy a Sparc thread. The fork() return value conventions
669 diff --git a/arch/sparc64/kernel/ptrace.c b/arch/sparc64/kernel/ptrace.c
670 index e9fc0aa..f6c9fc9 100644
671 --- a/arch/sparc64/kernel/ptrace.c
672 +++ b/arch/sparc64/kernel/ptrace.c
673 @@ -287,11 +287,11 @@ static int genregs64_set(struct task_struct *target,
674 32 * sizeof(u64),
675 33 * sizeof(u64));
676 if (!ret) {
677 - /* Only the condition codes can be modified
678 - * in the %tstate register.
679 + /* Only the condition codes and the "in syscall"
680 + * state can be modified in the %tstate register.
681 */
682 - tstate &= (TSTATE_ICC | TSTATE_XCC);
683 - regs->tstate &= ~(TSTATE_ICC | TSTATE_XCC);
684 + tstate &= (TSTATE_ICC | TSTATE_XCC | TSTATE_SYSCALL);
685 + regs->tstate &= ~(TSTATE_ICC | TSTATE_XCC | TSTATE_SYSCALL);
686 regs->tstate |= tstate;
687 }
688 }
689 @@ -657,8 +657,10 @@ static int genregs32_set(struct task_struct *target,
690 switch (pos) {
691 case 32: /* PSR */
692 tstate = regs->tstate;
693 - tstate &= ~(TSTATE_ICC | TSTATE_XCC);
694 + tstate &= ~(TSTATE_ICC | TSTATE_XCC | TSTATE_SYSCALL);
695 tstate |= psr_to_tstate_icc(reg);
696 + if (reg & PSR_SYSCALL)
697 + tstate |= TSTATE_SYSCALL;
698 regs->tstate = tstate;
699 break;
700 case 33: /* PC */
701 @@ -944,6 +946,8 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
702 break;
703
704 default:
705 + if (request == PTRACE_SPARC_DETACH)
706 + request = PTRACE_DETACH;
707 ret = compat_ptrace_request(child, request, addr, data);
708 break;
709 }
710 @@ -1036,6 +1040,8 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
711 break;
712
713 default:
714 + if (request == PTRACE_SPARC_DETACH)
715 + request = PTRACE_DETACH;
716 ret = ptrace_request(child, request, addr, data);
717 break;
718 }
719 diff --git a/arch/sparc64/kernel/rtrap.S b/arch/sparc64/kernel/rtrap.S
720 index 079d18a..5bfa79d 100644
721 --- a/arch/sparc64/kernel/rtrap.S
722 +++ b/arch/sparc64/kernel/rtrap.S
723 @@ -270,6 +270,7 @@ rt_continue: ldx [%sp + PTREGS_OFF + PT_V9_G1], %g1
724 wr %o3, %g0, %y
725 wrpr %l4, 0x0, %pil
726 wrpr %g0, 0x1, %tl
727 + andn %l1, TSTATE_SYSCALL, %l1
728 wrpr %l1, %g0, %tstate
729 wrpr %l2, %g0, %tpc
730 wrpr %o2, %g0, %tnpc
731 diff --git a/arch/sparc64/kernel/signal.c b/arch/sparc64/kernel/signal.c
732 index 9d51956..ec016cb 100644
733 --- a/arch/sparc64/kernel/signal.c
734 +++ b/arch/sparc64/kernel/signal.c
735 @@ -336,6 +336,9 @@ void do_rt_sigreturn(struct pt_regs *regs)
736 regs->tpc = tpc;
737 regs->tnpc = tnpc;
738
739 + /* Prevent syscall restart. */
740 + pt_regs_clear_syscall(regs);
741 +
742 sigdelsetmask(&set, ~_BLOCKABLE);
743 spin_lock_irq(&current->sighand->siglock);
744 current->blocked = set;
745 @@ -377,16 +380,29 @@ save_fpu_state(struct pt_regs *regs, __siginfo_fpu_t __user *fpu)
746
747 static inline void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, unsigned long framesize)
748 {
749 - unsigned long sp;
750 + unsigned long sp = regs->u_regs[UREG_FP] + STACK_BIAS;
751
752 - sp = regs->u_regs[UREG_FP] + STACK_BIAS;
753 + /*
754 + * If we are on the alternate signal stack and would overflow it, don't.
755 + * Return an always-bogus address instead so we will die with SIGSEGV.
756 + */
757 + if (on_sig_stack(sp) && !likely(on_sig_stack(sp - framesize)))
758 + return (void __user *) -1L;
759
760 /* This is the X/Open sanctioned signal stack switching. */
761 if (ka->sa.sa_flags & SA_ONSTACK) {
762 - if (!on_sig_stack(sp) &&
763 - !((current->sas_ss_sp + current->sas_ss_size) & 7))
764 + if (sas_ss_flags(sp) == 0)
765 sp = current->sas_ss_sp + current->sas_ss_size;
766 }
767 +
768 + /* Always align the stack frame. This handles two cases. First,
769 + * sigaltstack need not be mindful of platform specific stack
770 + * alignment. Second, if we took this signal because the stack
771 + * is not aligned properly, we'd like to take the signal cleanly
772 + * and report that.
773 + */
774 + sp &= ~7UL;
775 +
776 return (void __user *)(sp - framesize);
777 }
778
779 @@ -487,7 +503,7 @@ static inline void handle_signal(unsigned long signr, struct k_sigaction *ka,
780 }
781
782 static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs,
783 - struct sigaction *sa)
784 + struct sigaction *sa)
785 {
786 switch (regs->u_regs[UREG_I0]) {
787 case ERESTART_RESTARTBLOCK:
788 @@ -511,16 +527,19 @@ static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs,
789 * want to handle. Thus you cannot kill init even with a SIGKILL even by
790 * mistake.
791 */
792 -static void do_signal(struct pt_regs *regs, unsigned long orig_i0, int restart_syscall)
793 +static void do_signal(struct pt_regs *regs, unsigned long orig_i0, int __ignored)
794 {
795 - siginfo_t info;
796 - struct signal_deliver_cookie cookie;
797 struct k_sigaction ka;
798 - int signr;
799 + int restart_syscall;
800 sigset_t *oldset;
801 + siginfo_t info;
802 + int signr;
803
804 - cookie.restart_syscall = restart_syscall;
805 - cookie.orig_i0 = orig_i0;
806 + if (pt_regs_is_syscall(regs) &&
807 + (regs->tstate & (TSTATE_XCARRY | TSTATE_ICARRY))) {
808 + restart_syscall = 1;
809 + } else
810 + restart_syscall = 0;
811
812 if (test_thread_flag(TIF_RESTORE_SIGMASK))
813 oldset = &current->saved_sigmask;
814 @@ -530,16 +549,24 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0, int restart_s
815 #ifdef CONFIG_SPARC32_COMPAT
816 if (test_thread_flag(TIF_32BIT)) {
817 extern void do_signal32(sigset_t *, struct pt_regs *,
818 - unsigned long, int);
819 - do_signal32(oldset, regs, orig_i0,
820 - cookie.restart_syscall);
821 + int restart_syscall,
822 + unsigned long orig_i0);
823 + do_signal32(oldset, regs, restart_syscall, orig_i0);
824 return;
825 }
826 #endif
827
828 - signr = get_signal_to_deliver(&info, &ka, regs, &cookie);
829 + signr = get_signal_to_deliver(&info, &ka, regs, NULL);
830 +
831 + /* If the debugger messes with the program counter, it clears
832 + * the software "in syscall" bit, directing us to not perform
833 + * a syscall restart.
834 + */
835 + if (restart_syscall && !pt_regs_is_syscall(regs))
836 + restart_syscall = 0;
837 +
838 if (signr > 0) {
839 - if (cookie.restart_syscall)
840 + if (restart_syscall)
841 syscall_restart(orig_i0, regs, &ka.sa);
842 handle_signal(signr, &ka, &info, oldset, regs);
843
844 @@ -552,16 +579,16 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0, int restart_s
845 clear_thread_flag(TIF_RESTORE_SIGMASK);
846 return;
847 }
848 - if (cookie.restart_syscall &&
849 + if (restart_syscall &&
850 (regs->u_regs[UREG_I0] == ERESTARTNOHAND ||
851 regs->u_regs[UREG_I0] == ERESTARTSYS ||
852 regs->u_regs[UREG_I0] == ERESTARTNOINTR)) {
853 /* replay the system call when we are done */
854 - regs->u_regs[UREG_I0] = cookie.orig_i0;
855 + regs->u_regs[UREG_I0] = orig_i0;
856 regs->tpc -= 4;
857 regs->tnpc -= 4;
858 }
859 - if (cookie.restart_syscall &&
860 + if (restart_syscall &&
861 regs->u_regs[UREG_I0] == ERESTART_RESTARTBLOCK) {
862 regs->u_regs[UREG_G1] = __NR_restart_syscall;
863 regs->tpc -= 4;
864 @@ -583,26 +610,3 @@ void do_notify_resume(struct pt_regs *regs, unsigned long orig_i0, int restart_s
865 if (thread_info_flags & (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK))
866 do_signal(regs, orig_i0, restart_syscall);
867 }
868 -
869 -void ptrace_signal_deliver(struct pt_regs *regs, void *cookie)
870 -{
871 - struct signal_deliver_cookie *cp = cookie;
872 -
873 - if (cp->restart_syscall &&
874 - (regs->u_regs[UREG_I0] == ERESTARTNOHAND ||
875 - regs->u_regs[UREG_I0] == ERESTARTSYS ||
876 - regs->u_regs[UREG_I0] == ERESTARTNOINTR)) {
877 - /* replay the system call when we are done */
878 - regs->u_regs[UREG_I0] = cp->orig_i0;
879 - regs->tpc -= 4;
880 - regs->tnpc -= 4;
881 - cp->restart_syscall = 0;
882 - }
883 - if (cp->restart_syscall &&
884 - regs->u_regs[UREG_I0] == ERESTART_RESTARTBLOCK) {
885 - regs->u_regs[UREG_G1] = __NR_restart_syscall;
886 - regs->tpc -= 4;
887 - regs->tnpc -= 4;
888 - cp->restart_syscall = 0;
889 - }
890 -}
891 diff --git a/arch/sparc64/kernel/signal32.c b/arch/sparc64/kernel/signal32.c
892 index 8c1c121..c1b06e2 100644
893 --- a/arch/sparc64/kernel/signal32.c
894 +++ b/arch/sparc64/kernel/signal32.c
895 @@ -295,6 +295,9 @@ void do_new_sigreturn32(struct pt_regs *regs)
896 regs->tstate &= ~(TSTATE_ICC|TSTATE_XCC);
897 regs->tstate |= psr_to_tstate_icc(psr);
898
899 + /* Prevent syscall restart. */
900 + pt_regs_clear_syscall(regs);
901 +
902 err |= __get_user(fpu_save, &sf->fpu_save);
903 if (fpu_save)
904 err |= restore_fpu_state32(regs, &sf->fpu_state);
905 @@ -448,6 +451,9 @@ asmlinkage void do_rt_sigreturn32(struct pt_regs *regs)
906 regs->tstate &= ~(TSTATE_ICC|TSTATE_XCC);
907 regs->tstate |= psr_to_tstate_icc(psr);
908
909 + /* Prevent syscall restart. */
910 + pt_regs_clear_syscall(regs);
911 +
912 err |= __get_user(fpu_save, &sf->fpu_save);
913 if (fpu_save)
914 err |= restore_fpu_state32(regs, &sf->fpu_state);
915 @@ -497,11 +503,27 @@ static void __user *get_sigframe(struct sigaction *sa, struct pt_regs *regs, uns
916 regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL;
917 sp = regs->u_regs[UREG_FP];
918
919 + /*
920 + * If we are on the alternate signal stack and would overflow it, don't.
921 + * Return an always-bogus address instead so we will die with SIGSEGV.
922 + */
923 + if (on_sig_stack(sp) && !likely(on_sig_stack(sp - framesize)))
924 + return (void __user *) -1L;
925 +
926 /* This is the X/Open sanctioned signal stack switching. */
927 if (sa->sa_flags & SA_ONSTACK) {
928 - if (!on_sig_stack(sp) && !((current->sas_ss_sp + current->sas_ss_size) & 7))
929 + if (sas_ss_flags(sp) == 0)
930 sp = current->sas_ss_sp + current->sas_ss_size;
931 }
932 +
933 + /* Always align the stack frame. This handles two cases. First,
934 + * sigaltstack need not be mindful of platform specific stack
935 + * alignment. Second, if we took this signal because the stack
936 + * is not aligned properly, we'd like to take the signal cleanly
937 + * and report that.
938 + */
939 + sp &= ~7UL;
940 +
941 return (void __user *)(sp - framesize);
942 }
943
944 @@ -1264,20 +1286,24 @@ static inline void syscall_restart32(unsigned long orig_i0, struct pt_regs *regs
945 * mistake.
946 */
947 void do_signal32(sigset_t *oldset, struct pt_regs * regs,
948 - unsigned long orig_i0, int restart_syscall)
949 + int restart_syscall, unsigned long orig_i0)
950 {
951 - siginfo_t info;
952 - struct signal_deliver_cookie cookie;
953 struct k_sigaction ka;
954 + siginfo_t info;
955 int signr;
956 int svr4_signal = current->personality == PER_SVR4;
957
958 - cookie.restart_syscall = restart_syscall;
959 - cookie.orig_i0 = orig_i0;
960 + signr = get_signal_to_deliver(&info, &ka, regs, NULL);
961 +
962 + /* If the debugger messes with the program counter, it clears
963 + * the "in syscall" bit, directing us to not perform a syscall
964 + * restart.
965 + */
966 + if (restart_syscall && !pt_regs_is_syscall(regs))
967 + restart_syscall = 0;
968
969 - signr = get_signal_to_deliver(&info, &ka, regs, &cookie);
970 if (signr > 0) {
971 - if (cookie.restart_syscall)
972 + if (restart_syscall)
973 syscall_restart32(orig_i0, regs, &ka.sa);
974 handle_signal32(signr, &ka, &info, oldset,
975 regs, svr4_signal);
976 @@ -1291,16 +1317,16 @@ void do_signal32(sigset_t *oldset, struct pt_regs * regs,
977 clear_thread_flag(TIF_RESTORE_SIGMASK);
978 return;
979 }
980 - if (cookie.restart_syscall &&
981 + if (restart_syscall &&
982 (regs->u_regs[UREG_I0] == ERESTARTNOHAND ||
983 regs->u_regs[UREG_I0] == ERESTARTSYS ||
984 regs->u_regs[UREG_I0] == ERESTARTNOINTR)) {
985 /* replay the system call when we are done */
986 - regs->u_regs[UREG_I0] = cookie.orig_i0;
987 + regs->u_regs[UREG_I0] = orig_i0;
988 regs->tpc -= 4;
989 regs->tnpc -= 4;
990 }
991 - if (cookie.restart_syscall &&
992 + if (restart_syscall &&
993 regs->u_regs[UREG_I0] == ERESTART_RESTARTBLOCK) {
994 regs->u_regs[UREG_G1] = __NR_restart_syscall;
995 regs->tpc -= 4;
996 diff --git a/arch/sparc64/kernel/sys_sparc.c b/arch/sparc64/kernel/sys_sparc.c
997 index cc37936..4b495fe 100644
998 --- a/arch/sparc64/kernel/sys_sparc.c
999 +++ b/arch/sparc64/kernel/sys_sparc.c
1000 @@ -454,8 +454,8 @@ asmlinkage long sys_ipc(unsigned int call, int first, unsigned long second,
1001 err = sys_semget(first, (int)second, (int)third);
1002 goto out;
1003 case SEMCTL: {
1004 - err = sys_semctl(first, third,
1005 - (int)second | IPC_64,
1006 + err = sys_semctl(first, second,
1007 + (int)third | IPC_64,
1008 (union semun) ptr);
1009 goto out;
1010 }
1011 @@ -542,8 +542,7 @@ asmlinkage long sparc64_personality(unsigned long personality)
1012 return ret;
1013 }
1014
1015 -int sparc64_mmap_check(unsigned long addr, unsigned long len,
1016 - unsigned long flags)
1017 +int sparc64_mmap_check(unsigned long addr, unsigned long len)
1018 {
1019 if (test_thread_flag(TIF_32BIT)) {
1020 if (len >= STACK_TOP32)
1021 @@ -609,46 +608,19 @@ asmlinkage unsigned long sys64_mremap(unsigned long addr,
1022 unsigned long old_len, unsigned long new_len,
1023 unsigned long flags, unsigned long new_addr)
1024 {
1025 - struct vm_area_struct *vma;
1026 unsigned long ret = -EINVAL;
1027
1028 if (test_thread_flag(TIF_32BIT))
1029 goto out;
1030 if (unlikely(new_len >= VA_EXCLUDE_START))
1031 goto out;
1032 - if (unlikely(invalid_64bit_range(addr, old_len)))
1033 + if (unlikely(sparc64_mmap_check(addr, old_len)))
1034 + goto out;
1035 + if (unlikely(sparc64_mmap_check(new_addr, new_len)))
1036 goto out;
1037
1038 down_write(&current->mm->mmap_sem);
1039 - if (flags & MREMAP_FIXED) {
1040 - if (invalid_64bit_range(new_addr, new_len))
1041 - goto out_sem;
1042 - } else if (invalid_64bit_range(addr, new_len)) {
1043 - unsigned long map_flags = 0;
1044 - struct file *file = NULL;
1045 -
1046 - ret = -ENOMEM;
1047 - if (!(flags & MREMAP_MAYMOVE))
1048 - goto out_sem;
1049 -
1050 - vma = find_vma(current->mm, addr);
1051 - if (vma) {
1052 - if (vma->vm_flags & VM_SHARED)
1053 - map_flags |= MAP_SHARED;
1054 - file = vma->vm_file;
1055 - }
1056 -
1057 - /* MREMAP_FIXED checked above. */
1058 - new_addr = get_unmapped_area(file, addr, new_len,
1059 - vma ? vma->vm_pgoff : 0,
1060 - map_flags);
1061 - ret = new_addr;
1062 - if (new_addr & ~PAGE_MASK)
1063 - goto out_sem;
1064 - flags |= MREMAP_FIXED;
1065 - }
1066 ret = do_mremap(addr, old_len, new_len, flags, new_addr);
1067 -out_sem:
1068 up_write(&current->mm->mmap_sem);
1069 out:
1070 return ret;
1071 diff --git a/arch/sparc64/kernel/sys_sparc32.c b/arch/sparc64/kernel/sys_sparc32.c
1072 index 2455fa4..54df31a 100644
1073 --- a/arch/sparc64/kernel/sys_sparc32.c
1074 +++ b/arch/sparc64/kernel/sys_sparc32.c
1075 @@ -906,44 +906,15 @@ asmlinkage unsigned long sys32_mremap(unsigned long addr,
1076 unsigned long old_len, unsigned long new_len,
1077 unsigned long flags, u32 __new_addr)
1078 {
1079 - struct vm_area_struct *vma;
1080 unsigned long ret = -EINVAL;
1081 unsigned long new_addr = __new_addr;
1082
1083 - if (old_len > STACK_TOP32 || new_len > STACK_TOP32)
1084 + if (unlikely(sparc64_mmap_check(addr, old_len)))
1085 goto out;
1086 - if (addr > STACK_TOP32 - old_len)
1087 + if (unlikely(sparc64_mmap_check(new_addr, new_len)))
1088 goto out;
1089 down_write(&current->mm->mmap_sem);
1090 - if (flags & MREMAP_FIXED) {
1091 - if (new_addr > STACK_TOP32 - new_len)
1092 - goto out_sem;
1093 - } else if (addr > STACK_TOP32 - new_len) {
1094 - unsigned long map_flags = 0;
1095 - struct file *file = NULL;
1096 -
1097 - ret = -ENOMEM;
1098 - if (!(flags & MREMAP_MAYMOVE))
1099 - goto out_sem;
1100 -
1101 - vma = find_vma(current->mm, addr);
1102 - if (vma) {
1103 - if (vma->vm_flags & VM_SHARED)
1104 - map_flags |= MAP_SHARED;
1105 - file = vma->vm_file;
1106 - }
1107 -
1108 - /* MREMAP_FIXED checked above. */
1109 - new_addr = get_unmapped_area(file, addr, new_len,
1110 - vma ? vma->vm_pgoff : 0,
1111 - map_flags);
1112 - ret = new_addr;
1113 - if (new_addr & ~PAGE_MASK)
1114 - goto out_sem;
1115 - flags |= MREMAP_FIXED;
1116 - }
1117 ret = do_mremap(addr, old_len, new_len, flags, new_addr);
1118 -out_sem:
1119 up_write(&current->mm->mmap_sem);
1120 out:
1121 return ret;
1122 diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
1123 index 6c70fed..99a4ed3 100644
1124 --- a/arch/x86/Kconfig
1125 +++ b/arch/x86/Kconfig
1126 @@ -24,6 +24,18 @@ config X86
1127 select HAVE_KRETPROBES
1128 select HAVE_KVM if ((X86_32 && !X86_VOYAGER && !X86_VISWS && !X86_NUMAQ) || X86_64)
1129
1130 +config DEFCONFIG_LIST
1131 + string
1132 + depends on X86_32
1133 + option defconfig_list
1134 + default "arch/x86/configs/i386_defconfig"
1135 +
1136 +config DEFCONFIG_LIST
1137 + string
1138 + depends on X86_64
1139 + option defconfig_list
1140 + default "arch/x86/configs/x86_64_defconfig"
1141 +
1142
1143 config GENERIC_LOCKBREAK
1144 def_bool n
1145 diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c
1146 index fae8404..815b8c3 100644
1147 --- a/drivers/ata/ata_piix.c
1148 +++ b/drivers/ata/ata_piix.c
1149 @@ -1531,6 +1531,8 @@ static void __devinit piix_init_sidpr(struct ata_host *host)
1150 {
1151 struct pci_dev *pdev = to_pci_dev(host->dev);
1152 struct piix_host_priv *hpriv = host->private_data;
1153 + struct ata_device *dev0 = &host->ports[0]->link.device[0];
1154 + u32 scontrol;
1155 int i;
1156
1157 /* check for availability */
1158 @@ -1549,6 +1551,29 @@ static void __devinit piix_init_sidpr(struct ata_host *host)
1159 return;
1160
1161 hpriv->sidpr = pcim_iomap_table(pdev)[PIIX_SIDPR_BAR];
1162 +
1163 + /* SCR access via SIDPR doesn't work on some configurations.
1164 + * Give it a test drive by inhibiting power save modes which
1165 + * we'll do anyway.
1166 + */
1167 + scontrol = piix_sidpr_read(dev0, SCR_CONTROL);
1168 +
1169 + /* if IPM is already 3, SCR access is probably working. Don't
1170 + * un-inhibit power save modes as BIOS might have inhibited
1171 + * them for a reason.
1172 + */
1173 + if ((scontrol & 0xf00) != 0x300) {
1174 + scontrol |= 0x300;
1175 + piix_sidpr_write(dev0, SCR_CONTROL, scontrol);
1176 + scontrol = piix_sidpr_read(dev0, SCR_CONTROL);
1177 +
1178 + if ((scontrol & 0xf00) != 0x300) {
1179 + dev_printk(KERN_INFO, host->dev, "SCR access via "
1180 + "SIDPR is available but doesn't work\n");
1181 + return;
1182 + }
1183 + }
1184 +
1185 host->ports[0]->ops = &piix_sidpr_sata_ops;
1186 host->ports[1]->ops = &piix_sidpr_sata_ops;
1187 }
1188 diff --git a/drivers/char/vt.c b/drivers/char/vt.c
1189 index 9b58b89..c2e1a83 100644
1190 --- a/drivers/char/vt.c
1191 +++ b/drivers/char/vt.c
1192 @@ -2723,6 +2723,10 @@ static int con_open(struct tty_struct *tty, struct file *filp)
1193 tty->winsize.ws_row = vc_cons[currcons].d->vc_rows;
1194 tty->winsize.ws_col = vc_cons[currcons].d->vc_cols;
1195 }
1196 + if (vc->vc_utf)
1197 + tty->termios->c_iflag |= IUTF8;
1198 + else
1199 + tty->termios->c_iflag &= ~IUTF8;
1200 release_console_sem();
1201 vcs_make_sysfs(tty);
1202 return ret;
1203 @@ -2899,6 +2903,8 @@ int __init vty_init(void)
1204 console_driver->minor_start = 1;
1205 console_driver->type = TTY_DRIVER_TYPE_CONSOLE;
1206 console_driver->init_termios = tty_std_termios;
1207 + if (default_utf8)
1208 + console_driver->init_termios.c_iflag |= IUTF8;
1209 console_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_RESET_TERMIOS;
1210 tty_set_operations(console_driver, &con_ops);
1211 if (tty_register_driver(console_driver))
1212 diff --git a/drivers/i2c/busses/i2c-piix4.c b/drivers/i2c/busses/i2c-piix4.c
1213 index 9bbe96c..f0b4073 100644
1214 --- a/drivers/i2c/busses/i2c-piix4.c
1215 +++ b/drivers/i2c/busses/i2c-piix4.c
1216 @@ -108,7 +108,27 @@ static unsigned short piix4_smba;
1217 static struct pci_driver piix4_driver;
1218 static struct i2c_adapter piix4_adapter;
1219
1220 -static struct dmi_system_id __devinitdata piix4_dmi_table[] = {
1221 +static struct dmi_system_id __devinitdata piix4_dmi_blacklist[] = {
1222 + {
1223 + .ident = "Sapphire AM2RD790",
1224 + .matches = {
1225 + DMI_MATCH(DMI_BOARD_VENDOR, "SAPPHIRE Inc."),
1226 + DMI_MATCH(DMI_BOARD_NAME, "PC-AM2RD790"),
1227 + },
1228 + },
1229 + {
1230 + .ident = "DFI Lanparty UT 790FX",
1231 + .matches = {
1232 + DMI_MATCH(DMI_BOARD_VENDOR, "DFI Inc."),
1233 + DMI_MATCH(DMI_BOARD_NAME, "LP UT 790FX"),
1234 + },
1235 + },
1236 + { }
1237 +};
1238 +
1239 +/* The IBM entry is in a separate table because we only check it
1240 + on Intel-based systems */
1241 +static struct dmi_system_id __devinitdata piix4_dmi_ibm[] = {
1242 {
1243 .ident = "IBM",
1244 .matches = { DMI_MATCH(DMI_SYS_VENDOR, "IBM"), },
1245 @@ -123,8 +143,16 @@ static int __devinit piix4_setup(struct pci_dev *PIIX4_dev,
1246
1247 dev_info(&PIIX4_dev->dev, "Found %s device\n", pci_name(PIIX4_dev));
1248
1249 + /* On some motherboards, it was reported that accessing the SMBus
1250 + caused severe hardware problems */
1251 + if (dmi_check_system(piix4_dmi_blacklist)) {
1252 + dev_err(&PIIX4_dev->dev,
1253 + "Accessing the SMBus on this system is unsafe!\n");
1254 + return -EPERM;
1255 + }
1256 +
1257 /* Don't access SMBus on IBM systems which get corrupted eeproms */
1258 - if (dmi_check_system(piix4_dmi_table) &&
1259 + if (dmi_check_system(piix4_dmi_ibm) &&
1260 PIIX4_dev->vendor == PCI_VENDOR_ID_INTEL) {
1261 dev_err(&PIIX4_dev->dev, "IBM system detected; this module "
1262 "may corrupt your serial eeprom! Refusing to load "
1263 diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
1264 index b162b83..18a1379 100644
1265 --- a/drivers/md/raid5.c
1266 +++ b/drivers/md/raid5.c
1267 @@ -2354,8 +2354,8 @@ static void handle_parity_checks5(raid5_conf_t *conf, struct stripe_head *sh,
1268
1269 /* complete a check operation */
1270 if (test_and_clear_bit(STRIPE_OP_CHECK, &sh->ops.complete)) {
1271 - clear_bit(STRIPE_OP_CHECK, &sh->ops.ack);
1272 - clear_bit(STRIPE_OP_CHECK, &sh->ops.pending);
1273 + clear_bit(STRIPE_OP_CHECK, &sh->ops.ack);
1274 + clear_bit(STRIPE_OP_CHECK, &sh->ops.pending);
1275 if (s->failed == 0) {
1276 if (sh->ops.zero_sum_result == 0)
1277 /* parity is correct (on disc,
1278 @@ -2385,16 +2385,6 @@ static void handle_parity_checks5(raid5_conf_t *conf, struct stripe_head *sh,
1279 canceled_check = 1; /* STRIPE_INSYNC is not set */
1280 }
1281
1282 - /* check if we can clear a parity disk reconstruct */
1283 - if (test_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.complete) &&
1284 - test_bit(STRIPE_OP_MOD_REPAIR_PD, &sh->ops.pending)) {
1285 -
1286 - clear_bit(STRIPE_OP_MOD_REPAIR_PD, &sh->ops.pending);
1287 - clear_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.complete);
1288 - clear_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.ack);
1289 - clear_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.pending);
1290 - }
1291 -
1292 /* start a new check operation if there are no failures, the stripe is
1293 * not insync, and a repair is not in flight
1294 */
1295 @@ -2409,6 +2399,17 @@ static void handle_parity_checks5(raid5_conf_t *conf, struct stripe_head *sh,
1296 }
1297 }
1298
1299 + /* check if we can clear a parity disk reconstruct */
1300 + if (test_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.complete) &&
1301 + test_bit(STRIPE_OP_MOD_REPAIR_PD, &sh->ops.pending)) {
1302 +
1303 + clear_bit(STRIPE_OP_MOD_REPAIR_PD, &sh->ops.pending);
1304 + clear_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.complete);
1305 + clear_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.ack);
1306 + clear_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.pending);
1307 + }
1308 +
1309 +
1310 /* Wait for check parity and compute block operations to complete
1311 * before write-back. If a failure occurred while the check operation
1312 * was in flight we need to cycle this stripe through handle_stripe
1313 diff --git a/drivers/media/dvb/dvb-usb/dib0700_devices.c b/drivers/media/dvb/dvb-usb/dib0700_devices.c
1314 index e709382..9fd8399 100644
1315 --- a/drivers/media/dvb/dvb-usb/dib0700_devices.c
1316 +++ b/drivers/media/dvb/dvb-usb/dib0700_devices.c
1317 @@ -13,6 +13,7 @@
1318 #include "dib7000p.h"
1319 #include "mt2060.h"
1320 #include "mt2266.h"
1321 +#include "tuner-xc2028.h"
1322 #include "dib0070.h"
1323
1324 static int force_lna_activation;
1325 @@ -297,6 +298,149 @@ static int stk7700d_tuner_attach(struct dvb_usb_adapter *adap)
1326 &stk7700d_mt2266_config[adap->id]) == NULL ? -ENODEV : 0;;
1327 }
1328
1329 +/* STK7700-PH: Digital/Analog Hybrid Tuner, e.h. Cinergy HT USB HE */
1330 +struct dibx000_agc_config xc3028_agc_config = {
1331 + BAND_VHF | BAND_UHF, /* band_caps */
1332 +
1333 + /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=0,
1334 + * P_agc_inv_pwm1=0, P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0,
1335 + * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=2, P_agc_write=0 */
1336 + (0 << 15) | (0 << 14) | (0 << 11) | (0 << 10) | (0 << 9) | (0 << 8) |
1337 + (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0), /* setup */
1338 +
1339 + 712, /* inv_gain */
1340 + 21, /* time_stabiliz */
1341 +
1342 + 0, /* alpha_level */
1343 + 118, /* thlock */
1344 +
1345 + 0, /* wbd_inv */
1346 + 2867, /* wbd_ref */
1347 + 0, /* wbd_sel */
1348 + 2, /* wbd_alpha */
1349 +
1350 + 0, /* agc1_max */
1351 + 0, /* agc1_min */
1352 + 39718, /* agc2_max */
1353 + 9930, /* agc2_min */
1354 + 0, /* agc1_pt1 */
1355 + 0, /* agc1_pt2 */
1356 + 0, /* agc1_pt3 */
1357 + 0, /* agc1_slope1 */
1358 + 0, /* agc1_slope2 */
1359 + 0, /* agc2_pt1 */
1360 + 128, /* agc2_pt2 */
1361 + 29, /* agc2_slope1 */
1362 + 29, /* agc2_slope2 */
1363 +
1364 + 17, /* alpha_mant */
1365 + 27, /* alpha_exp */
1366 + 23, /* beta_mant */
1367 + 51, /* beta_exp */
1368 +
1369 + 1, /* perform_agc_softsplit */
1370 +};
1371 +
1372 +/* PLL Configuration for COFDM BW_MHz = 8.00 with external clock = 30.00 */
1373 +struct dibx000_bandwidth_config xc3028_bw_config = {
1374 + 60000, 30000, /* internal, sampling */
1375 + 1, 8, 3, 1, 0, /* pll_cfg: prediv, ratio, range, reset, bypass */
1376 + 0, 0, 1, 1, 0, /* misc: refdiv, bypclk_div, IO_CLK_en_core, ADClkSrc,
1377 + modulo */
1378 + (3 << 14) | (1 << 12) | (524 << 0), /* sad_cfg: refsel, sel, freq_15k */
1379 + (1 << 25) | 5816102, /* ifreq = 5.200000 MHz */
1380 + 20452225, /* timf */
1381 + 30000000, /* xtal_hz */
1382 +};
1383 +
1384 +static struct dib7000p_config stk7700ph_dib7700_xc3028_config = {
1385 + .output_mpeg2_in_188_bytes = 1,
1386 + .tuner_is_baseband = 1,
1387 +
1388 + .agc_config_count = 1,
1389 + .agc = &xc3028_agc_config,
1390 + .bw = &xc3028_bw_config,
1391 +
1392 + .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
1393 + .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
1394 + .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
1395 +};
1396 +
1397 +static int stk7700ph_xc3028_callback(void *ptr, int command, int arg)
1398 +{
1399 + struct dvb_usb_adapter *adap = ptr;
1400 +
1401 + switch (command) {
1402 + case XC2028_TUNER_RESET:
1403 + /* Send the tuner in then out of reset */
1404 + dib7000p_set_gpio(adap->fe, 8, 0, 0); msleep(10);
1405 + dib7000p_set_gpio(adap->fe, 8, 0, 1);
1406 + break;
1407 + case XC2028_RESET_CLK:
1408 + break;
1409 + default:
1410 + err("%s: unknown command %d, arg %d\n", __func__,
1411 + command, arg);
1412 + return -EINVAL;
1413 + }
1414 + return 0;
1415 +}
1416 +
1417 +static struct xc2028_ctrl stk7700ph_xc3028_ctrl = {
1418 + .fname = XC2028_DEFAULT_FIRMWARE,
1419 + .max_len = 64,
1420 + .demod = XC3028_FE_DIBCOM52,
1421 +};
1422 +
1423 +static struct xc2028_config stk7700ph_xc3028_config = {
1424 + .i2c_addr = 0x61,
1425 + .callback = stk7700ph_xc3028_callback,
1426 + .ctrl = &stk7700ph_xc3028_ctrl,
1427 +};
1428 +
1429 +static int stk7700ph_frontend_attach(struct dvb_usb_adapter *adap)
1430 +{
1431 + struct usb_device_descriptor *desc = &adap->dev->udev->descriptor;
1432 +
1433 + if (desc->idVendor == USB_VID_PINNACLE &&
1434 + desc->idProduct == USB_PID_PINNACLE_EXPRESSCARD_320CX)
1435 + dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
1436 + else
1437 + dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1438 + msleep(20);
1439 + dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1440 + dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
1441 + dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
1442 + dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
1443 + msleep(10);
1444 + dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
1445 + msleep(20);
1446 + dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1447 + msleep(10);
1448 +
1449 + dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
1450 + &stk7700ph_dib7700_xc3028_config);
1451 +
1452 + adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80,
1453 + &stk7700ph_dib7700_xc3028_config);
1454 +
1455 + return adap->fe == NULL ? -ENODEV : 0;
1456 +}
1457 +
1458 +static int stk7700ph_tuner_attach(struct dvb_usb_adapter *adap)
1459 +{
1460 + struct i2c_adapter *tun_i2c;
1461 +
1462 + tun_i2c = dib7000p_get_i2c_master(adap->fe,
1463 + DIBX000_I2C_INTERFACE_TUNER, 1);
1464 +
1465 + stk7700ph_xc3028_config.i2c_adap = tun_i2c;
1466 + stk7700ph_xc3028_config.video_dev = adap;
1467 +
1468 + return dvb_attach(xc2028_attach, adap->fe, &stk7700ph_xc3028_config)
1469 + == NULL ? -ENODEV : 0;
1470 +}
1471 +
1472 #define DEFAULT_RC_INTERVAL 150
1473
1474 static u8 rc_request[] = { REQUEST_POLL_RC, 0 };
1475 @@ -794,6 +938,10 @@ static struct dib7000p_config dib7070p_dib7000p_config = {
1476 /* STK7070P */
1477 static int stk7070p_frontend_attach(struct dvb_usb_adapter *adap)
1478 {
1479 + if (adap->dev->udev->descriptor.idVendor == USB_VID_PINNACLE &&
1480 + adap->dev->udev->descriptor.idProduct == USB_PID_PINNACLE_PCTV72E)
1481 + dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
1482 + else
1483 dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
1484 msleep(10);
1485 dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
1486 @@ -808,9 +956,11 @@ static int stk7070p_frontend_attach(struct dvb_usb_adapter *adap)
1487 msleep(10);
1488 dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
1489
1490 - dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 1, 18, &dib7070p_dib7000p_config);
1491 + dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
1492 + &dib7070p_dib7000p_config);
1493
1494 - adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80, &dib7070p_dib7000p_config);
1495 + adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80,
1496 + &dib7070p_dib7000p_config);
1497 return adap->fe == NULL ? -ENODEV : 0;
1498 }
1499
1500 @@ -878,34 +1028,41 @@ static int stk7070pd_frontend_attach1(struct dvb_usb_adapter *adap)
1501 /* DVB-USB and USB stuff follows */
1502 struct usb_device_id dib0700_usb_id_table[] = {
1503 /* 0 */ { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7700P) },
1504 - { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7700P_PC) },
1505 -
1506 - { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500) },
1507 - { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500_2) },
1508 - { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK) },
1509 + { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7700P_PC) },
1510 + { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500) },
1511 + { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500_2) },
1512 + { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK) },
1513 /* 5 */ { USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR) },
1514 - { USB_DEVICE(USB_VID_COMPRO, USB_PID_COMPRO_VIDEOMATE_U500) },
1515 - { USB_DEVICE(USB_VID_UNIWILL, USB_PID_UNIWILL_STK7700P) },
1516 - { USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_STK7700P) },
1517 - { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK_2) },
1518 + { USB_DEVICE(USB_VID_COMPRO, USB_PID_COMPRO_VIDEOMATE_U500) },
1519 + { USB_DEVICE(USB_VID_UNIWILL, USB_PID_UNIWILL_STK7700P) },
1520 + { USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_STK7700P) },
1521 + { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK_2) },
1522 /* 10 */{ USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR_2) },
1523 - { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV2000E) },
1524 - { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY) },
1525 - { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_TD_STICK) },
1526 - { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7700D) },
1527 + { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV2000E) },
1528 + { USB_DEVICE(USB_VID_TERRATEC,
1529 + USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY) },
1530 + { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_TD_STICK) },
1531 + { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7700D) },
1532 /* 15 */{ USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7070P) },
1533 - { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV_DVB_T_FLASH) },
1534 - { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7070PD) },
1535 - { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV_DUAL_DIVERSITY_DVB_T) },
1536 - { USB_DEVICE(USB_VID_COMPRO, USB_PID_COMPRO_VIDEOMATE_U500_PC) },
1537 + { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV_DVB_T_FLASH) },
1538 + { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7070PD) },
1539 + { USB_DEVICE(USB_VID_PINNACLE,
1540 + USB_PID_PINNACLE_PCTV_DUAL_DIVERSITY_DVB_T) },
1541 + { USB_DEVICE(USB_VID_COMPRO, USB_PID_COMPRO_VIDEOMATE_U500_PC) },
1542 /* 20 */{ USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_EXPRESS) },
1543 - { USB_DEVICE(USB_VID_GIGABYTE, USB_PID_GIGABYTE_U7000) },
1544 - { USB_DEVICE(USB_VID_ULTIMA_ELECTRONIC, USB_PID_ARTEC_T14BR) },
1545 - { USB_DEVICE(USB_VID_ASUS, USB_PID_ASUS_U3000) },
1546 - { USB_DEVICE(USB_VID_ASUS, USB_PID_ASUS_U3100) },
1547 -/* 25 */ { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK_3) },
1548 - { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_MYTV_T) },
1549 - { 0 } /* Terminating entry */
1550 + { USB_DEVICE(USB_VID_GIGABYTE, USB_PID_GIGABYTE_U7000) },
1551 + { USB_DEVICE(USB_VID_ULTIMA_ELECTRONIC, USB_PID_ARTEC_T14BR) },
1552 + { USB_DEVICE(USB_VID_ASUS, USB_PID_ASUS_U3000) },
1553 + { USB_DEVICE(USB_VID_ASUS, USB_PID_ASUS_U3100) },
1554 +/* 25 */{ USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK_3) },
1555 + { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_MYTV_T) },
1556 + { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_HT_USB_XE) },
1557 + { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_EXPRESSCARD_320CX) },
1558 + { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV72E) },
1559 +/* 30 */{ USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV73E) },
1560 + { USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_EC372S) },
1561 + { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_HT_EXPRESS) },
1562 + { 0 } /* Terminating entry */
1563 };
1564 MODULE_DEVICE_TABLE(usb, dib0700_usb_id_table);
1565
1566 @@ -1069,12 +1226,16 @@ struct dvb_usb_device_properties dib0700_devices[] = {
1567 },
1568 },
1569
1570 - .num_device_descs = 1,
1571 + .num_device_descs = 2,
1572 .devices = {
1573 { "ASUS My Cinema U3000 Mini DVBT Tuner",
1574 { &dib0700_usb_id_table[23], NULL },
1575 { NULL },
1576 },
1577 + { "Yuan EC372S",
1578 + { &dib0700_usb_id_table[31], NULL },
1579 + { NULL },
1580 + }
1581 }
1582 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
1583
1584 @@ -1090,7 +1251,7 @@ struct dvb_usb_device_properties dib0700_devices[] = {
1585 },
1586 },
1587
1588 - .num_device_descs = 6,
1589 + .num_device_descs = 8,
1590 .devices = {
1591 { "DiBcom STK7070P reference design",
1592 { &dib0700_usb_id_table[15], NULL },
1593 @@ -1116,6 +1277,14 @@ struct dvb_usb_device_properties dib0700_devices[] = {
1594 { &dib0700_usb_id_table[26], NULL },
1595 { NULL },
1596 },
1597 + { "Pinnacle PCTV 72e",
1598 + { &dib0700_usb_id_table[29], NULL },
1599 + { NULL },
1600 + },
1601 + { "Pinnacle PCTV 73e",
1602 + { &dib0700_usb_id_table[30], NULL },
1603 + { NULL },
1604 + },
1605 },
1606
1607 .rc_interval = DEFAULT_RC_INTERVAL,
1608 @@ -1155,6 +1324,40 @@ struct dvb_usb_device_properties dib0700_devices[] = {
1609 { NULL },
1610 }
1611 }
1612 + }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
1613 +
1614 + .num_adapters = 1,
1615 + .adapter = {
1616 + {
1617 + .frontend_attach = stk7700ph_frontend_attach,
1618 + .tuner_attach = stk7700ph_tuner_attach,
1619 +
1620 + DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
1621 +
1622 + .size_of_priv = sizeof(struct
1623 + dib0700_adapter_state),
1624 + },
1625 + },
1626 +
1627 + .num_device_descs = 3,
1628 + .devices = {
1629 + { "Terratec Cinergy HT USB XE",
1630 + { &dib0700_usb_id_table[27], NULL },
1631 + { NULL },
1632 + },
1633 + { "Pinnacle Expresscard 320cx",
1634 + { &dib0700_usb_id_table[28], NULL },
1635 + { NULL },
1636 + },
1637 + { "Terratec Cinergy HT Express",
1638 + { &dib0700_usb_id_table[32], NULL },
1639 + { NULL },
1640 + },
1641 + },
1642 + .rc_interval = DEFAULT_RC_INTERVAL,
1643 + .rc_key_map = dib0700_rc_keys,
1644 + .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
1645 + .rc_query = dib0700_rc_query
1646 },
1647 };
1648
1649 diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
1650 index aa4844e..49a44f2 100644
1651 --- a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
1652 +++ b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
1653 @@ -46,8 +46,8 @@
1654 #define USB_VID_ULTIMA_ELECTRONIC 0x05d8
1655 #define USB_VID_UNIWILL 0x1584
1656 #define USB_VID_WIDEVIEW 0x14aa
1657 -/* dom : pour gigabyte u7000 */
1658 #define USB_VID_GIGABYTE 0x1044
1659 +#define USB_VID_YUAN 0x1164
1660
1661
1662 /* Product IDs */
1663 @@ -135,9 +135,14 @@
1664 #define USB_PID_AVERMEDIA_VOLAR 0xa807
1665 #define USB_PID_AVERMEDIA_VOLAR_2 0xb808
1666 #define USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY 0x005a
1667 +#define USB_PID_TERRATEC_CINERGY_HT_USB_XE 0x0058
1668 +#define USB_PID_TERRATEC_CINERGY_HT_EXPRESS 0x0060
1669 +#define USB_PID_PINNACLE_EXPRESSCARD_320CX 0x022e
1670 #define USB_PID_PINNACLE_PCTV2000E 0x022c
1671 #define USB_PID_PINNACLE_PCTV_DVB_T_FLASH 0x0228
1672 #define USB_PID_PINNACLE_PCTV_DUAL_DIVERSITY_DVB_T 0x0229
1673 +#define USB_PID_PINNACLE_PCTV72E 0x0236
1674 +#define USB_PID_PINNACLE_PCTV73E 0x0237
1675 #define USB_PID_PCTV_200E 0x020e
1676 #define USB_PID_PCTV_400E 0x020f
1677 #define USB_PID_PCTV_450E 0x0222
1678 @@ -183,9 +188,9 @@
1679 #define USB_PID_OPERA1_WARM 0x3829
1680 #define USB_PID_LIFEVIEW_TV_WALKER_TWIN_COLD 0x0514
1681 #define USB_PID_LIFEVIEW_TV_WALKER_TWIN_WARM 0x0513
1682 -/* dom pour gigabyte u7000 */
1683 #define USB_PID_GIGABYTE_U7000 0x7001
1684 #define USB_PID_ASUS_U3000 0x171f
1685 #define USB_PID_ASUS_U3100 0x173f
1686 +#define USB_PID_YUAN_EC372S 0x1edc
1687
1688 #endif
1689 diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c
1690 index f651a81..34c2b98 100644
1691 --- a/drivers/net/macvlan.c
1692 +++ b/drivers/net/macvlan.c
1693 @@ -450,7 +450,7 @@ static void macvlan_dellink(struct net_device *dev)
1694 unregister_netdevice(dev);
1695
1696 if (list_empty(&port->vlans))
1697 - macvlan_port_destroy(dev);
1698 + macvlan_port_destroy(port->dev);
1699 }
1700
1701 static struct rtnl_link_ops macvlan_link_ops __read_mostly = {
1702 diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
1703 index 3acfeea..6572425 100644
1704 --- a/drivers/net/r8169.c
1705 +++ b/drivers/net/r8169.c
1706 @@ -1617,6 +1617,7 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
1707 SET_NETDEV_DEV(dev, &pdev->dev);
1708 tp = netdev_priv(dev);
1709 tp->dev = dev;
1710 + tp->pci_dev = pdev;
1711 tp->msg_enable = netif_msg_init(debug.msg_enable, R8169_MSG_DEFAULT);
1712
1713 /* enable device (incl. PCI PM wakeup and hotplug setup) */
1714 @@ -1705,18 +1706,18 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
1715
1716 rtl8169_print_mac_version(tp);
1717
1718 - for (i = ARRAY_SIZE(rtl_chip_info) - 1; i >= 0; i--) {
1719 + for (i = 0; i < ARRAY_SIZE(rtl_chip_info); i++) {
1720 if (tp->mac_version == rtl_chip_info[i].mac_version)
1721 break;
1722 }
1723 - if (i < 0) {
1724 + if (i == ARRAY_SIZE(rtl_chip_info)) {
1725 /* Unknown chip: assume array element #0, original RTL-8169 */
1726 if (netif_msg_probe(tp)) {
1727 dev_printk(KERN_DEBUG, &pdev->dev,
1728 "unknown chip version, assuming %s\n",
1729 rtl_chip_info[0].name);
1730 }
1731 - i++;
1732 + i = 0;
1733 }
1734 tp->chipset = i;
1735
1736 @@ -1777,7 +1778,6 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
1737 #endif
1738
1739 tp->intr_mask = 0xffff;
1740 - tp->pci_dev = pdev;
1741 tp->mmio_addr = ioaddr;
1742 tp->align = cfg->align;
1743 tp->hw_start = cfg->hw_start;
1744 diff --git a/drivers/rtc/rtc-lib.c b/drivers/rtc/rtc-lib.c
1745 index ba795a4..9f996ec 100644
1746 --- a/drivers/rtc/rtc-lib.c
1747 +++ b/drivers/rtc/rtc-lib.c
1748 @@ -51,7 +51,7 @@ EXPORT_SYMBOL(rtc_year_days);
1749 */
1750 void rtc_time_to_tm(unsigned long time, struct rtc_time *tm)
1751 {
1752 - register int days, month, year;
1753 + unsigned int days, month, year;
1754
1755 days = time / 86400;
1756 time -= days * 86400;
1757 diff --git a/drivers/scsi/aha152x.c b/drivers/scsi/aha152x.c
1758 index 6ccdc96..d9bc859 100644
1759 --- a/drivers/scsi/aha152x.c
1760 +++ b/drivers/scsi/aha152x.c
1761 @@ -3835,7 +3835,7 @@ static int __init aha152x_init(void)
1762 iounmap(p);
1763 }
1764 if (!ok && setup_count == 0)
1765 - return 0;
1766 + return -ENODEV;
1767
1768 printk(KERN_INFO "aha152x: BIOS test: passed, ");
1769 #else
1770 @@ -3914,14 +3914,14 @@ static int __init aha152x_init(void)
1771 #endif
1772 }
1773
1774 - return 1;
1775 + return 0;
1776 }
1777
1778 static void __exit aha152x_exit(void)
1779 {
1780 - struct aha152x_hostdata *hd;
1781 + struct aha152x_hostdata *hd, *tmp;
1782
1783 - list_for_each_entry(hd, &aha152x_host_list, host_list) {
1784 + list_for_each_entry_safe(hd, tmp, &aha152x_host_list, host_list) {
1785 struct Scsi_Host *shost = container_of((void *)hd, struct Scsi_Host, hostdata);
1786
1787 aha152x_release(shost);
1788 diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c
1789 index bdd7de7..9975095 100644
1790 --- a/drivers/scsi/libiscsi.c
1791 +++ b/drivers/scsi/libiscsi.c
1792 @@ -635,7 +635,9 @@ static int __iscsi_complete_pdu(struct iscsi_conn *conn, struct iscsi_hdr *hdr,
1793 if (iscsi_recv_pdu(conn->cls_conn, hdr, data,
1794 datalen))
1795 rc = ISCSI_ERR_CONN_FAILED;
1796 - }
1797 + } else
1798 + mod_timer(&conn->transport_timer,
1799 + jiffies + conn->recv_timeout);
1800 iscsi_free_mgmt_task(conn, mtask);
1801 break;
1802 default:
1803 @@ -1353,19 +1355,20 @@ static void iscsi_check_transport_timeouts(unsigned long data)
1804 {
1805 struct iscsi_conn *conn = (struct iscsi_conn *)data;
1806 struct iscsi_session *session = conn->session;
1807 - unsigned long timeout, next_timeout = 0, last_recv;
1808 + unsigned long recv_timeout, next_timeout = 0, last_recv;
1809
1810 spin_lock(&session->lock);
1811 if (session->state != ISCSI_STATE_LOGGED_IN)
1812 goto done;
1813
1814 - timeout = conn->recv_timeout;
1815 - if (!timeout)
1816 + recv_timeout = conn->recv_timeout;
1817 + if (!recv_timeout)
1818 goto done;
1819
1820 - timeout *= HZ;
1821 + recv_timeout *= HZ;
1822 last_recv = conn->last_recv;
1823 - if (time_before_eq(last_recv + timeout + (conn->ping_timeout * HZ),
1824 + if (conn->ping_mtask &&
1825 + time_before_eq(conn->last_ping + (conn->ping_timeout * HZ),
1826 jiffies)) {
1827 iscsi_conn_printk(KERN_ERR, conn, "ping timeout of %d secs "
1828 "expired, last rx %lu, last ping %lu, "
1829 @@ -1376,15 +1379,13 @@ static void iscsi_check_transport_timeouts(unsigned long data)
1830 return;
1831 }
1832
1833 - if (time_before_eq(last_recv + timeout, jiffies)) {
1834 - if (time_before_eq(conn->last_ping, last_recv)) {
1835 - /* send a ping to try to provoke some traffic */
1836 - debug_scsi("Sending nopout as ping on conn %p\n", conn);
1837 - iscsi_send_nopout(conn, NULL);
1838 - }
1839 - next_timeout = last_recv + timeout + (conn->ping_timeout * HZ);
1840 + if (time_before_eq(last_recv + recv_timeout, jiffies)) {
1841 + /* send a ping to try to provoke some traffic */
1842 + debug_scsi("Sending nopout as ping on conn %p\n", conn);
1843 + iscsi_send_nopout(conn, NULL);
1844 + next_timeout = conn->last_ping + (conn->ping_timeout * HZ);
1845 } else
1846 - next_timeout = last_recv + timeout;
1847 + next_timeout = last_recv + recv_timeout;
1848
1849 debug_scsi("Setting next tmo %lu\n", next_timeout);
1850 mod_timer(&conn->transport_timer, next_timeout);
1851 diff --git a/drivers/scsi/qla1280.c b/drivers/scsi/qla1280.c
1852 index 68c0d09..624e616 100644
1853 --- a/drivers/scsi/qla1280.c
1854 +++ b/drivers/scsi/qla1280.c
1855 @@ -2012,7 +2012,7 @@ qla1280_set_defaults(struct scsi_qla_host *ha)
1856 nv->bus[bus].config_2.req_ack_active_negation = 1;
1857 nv->bus[bus].config_2.data_line_active_negation = 1;
1858 nv->bus[bus].selection_timeout = 250;
1859 - nv->bus[bus].max_queue_depth = 256;
1860 + nv->bus[bus].max_queue_depth = 32;
1861
1862 if (IS_ISP1040(ha)) {
1863 nv->bus[bus].bus_reset_delay = 3;
1864 @@ -2056,7 +2056,7 @@ qla1280_config_target(struct scsi_qla_host *ha, int bus, int target)
1865 status = qla1280_mailbox_command(ha, 0x0f, mb);
1866
1867 /* Save Tag queuing enable flag. */
1868 - flag = (BIT_0 << target) & mb[0];
1869 + flag = (BIT_0 << target);
1870 if (nv->bus[bus].target[target].parameter.tag_queuing)
1871 ha->bus_settings[bus].qtag_enables |= flag;
1872
1873 diff --git a/drivers/serial/serial_core.c b/drivers/serial/serial_core.c
1874 index 0f5a179..3bf9294 100644
1875 --- a/drivers/serial/serial_core.c
1876 +++ b/drivers/serial/serial_core.c
1877 @@ -535,7 +535,7 @@ static int uart_chars_in_buffer(struct tty_struct *tty)
1878 static void uart_flush_buffer(struct tty_struct *tty)
1879 {
1880 struct uart_state *state = tty->driver_data;
1881 - struct uart_port *port = state->port;
1882 + struct uart_port *port;
1883 unsigned long flags;
1884
1885 /*
1886 @@ -547,6 +547,7 @@ static void uart_flush_buffer(struct tty_struct *tty)
1887 return;
1888 }
1889
1890 + port = state->port;
1891 pr_debug("uart_flush_buffer(%d) called\n", tty->index);
1892
1893 spin_lock_irqsave(&port->lock, flags);
1894 diff --git a/drivers/serial/sunhv.c b/drivers/serial/sunhv.c
1895 index be0fe15..145c028 100644
1896 --- a/drivers/serial/sunhv.c
1897 +++ b/drivers/serial/sunhv.c
1898 @@ -392,7 +392,7 @@ static struct uart_ops sunhv_pops = {
1899
1900 static struct uart_driver sunhv_reg = {
1901 .owner = THIS_MODULE,
1902 - .driver_name = "serial",
1903 + .driver_name = "sunhv",
1904 .dev_name = "ttyS",
1905 .major = TTY_MAJOR,
1906 };
1907 diff --git a/drivers/serial/sunsab.c b/drivers/serial/sunsab.c
1908 index 543f937..9ff5b38 100644
1909 --- a/drivers/serial/sunsab.c
1910 +++ b/drivers/serial/sunsab.c
1911 @@ -826,7 +826,7 @@ static struct uart_ops sunsab_pops = {
1912
1913 static struct uart_driver sunsab_reg = {
1914 .owner = THIS_MODULE,
1915 - .driver_name = "serial",
1916 + .driver_name = "sunsab",
1917 .dev_name = "ttyS",
1918 .major = TTY_MAJOR,
1919 };
1920 diff --git a/drivers/serial/sunsu.c b/drivers/serial/sunsu.c
1921 index 4e2302d..03806a9 100644
1922 --- a/drivers/serial/sunsu.c
1923 +++ b/drivers/serial/sunsu.c
1924 @@ -1173,7 +1173,7 @@ out:
1925
1926 static struct uart_driver sunsu_reg = {
1927 .owner = THIS_MODULE,
1928 - .driver_name = "serial",
1929 + .driver_name = "sunsu",
1930 .dev_name = "ttyS",
1931 .major = TTY_MAJOR,
1932 };
1933 diff --git a/drivers/serial/sunzilog.c b/drivers/serial/sunzilog.c
1934 index cb2e405..87210c0 100644
1935 --- a/drivers/serial/sunzilog.c
1936 +++ b/drivers/serial/sunzilog.c
1937 @@ -1015,6 +1015,7 @@ static struct uart_ops sunzilog_pops = {
1938 .verify_port = sunzilog_verify_port,
1939 };
1940
1941 +static int uart_chip_count;
1942 static struct uart_sunzilog_port *sunzilog_port_table;
1943 static struct zilog_layout __iomem **sunzilog_chip_regs;
1944
1945 @@ -1022,7 +1023,7 @@ static struct uart_sunzilog_port *sunzilog_irq_chain;
1946
1947 static struct uart_driver sunzilog_reg = {
1948 .owner = THIS_MODULE,
1949 - .driver_name = "ttyS",
1950 + .driver_name = "sunzilog",
1951 .dev_name = "ttyS",
1952 .major = TTY_MAJOR,
1953 };
1954 @@ -1350,16 +1351,22 @@ static int zilog_irq = -1;
1955
1956 static int __devinit zs_probe(struct of_device *op, const struct of_device_id *match)
1957 {
1958 - static int inst;
1959 + static int kbm_inst, uart_inst;
1960 + int inst;
1961 struct uart_sunzilog_port *up;
1962 struct zilog_layout __iomem *rp;
1963 - int keyboard_mouse;
1964 + int keyboard_mouse = 0;
1965 int err;
1966
1967 - keyboard_mouse = 0;
1968 if (of_find_property(op->node, "keyboard", NULL))
1969 keyboard_mouse = 1;
1970
1971 + /* uarts must come before keyboards/mice */
1972 + if (keyboard_mouse)
1973 + inst = uart_chip_count + kbm_inst;
1974 + else
1975 + inst = uart_inst;
1976 +
1977 sunzilog_chip_regs[inst] = of_ioremap(&op->resource[0], 0,
1978 sizeof(struct zilog_layout),
1979 "zs");
1980 @@ -1427,6 +1434,7 @@ static int __devinit zs_probe(struct of_device *op, const struct of_device_id *m
1981 rp, sizeof(struct zilog_layout));
1982 return err;
1983 }
1984 + uart_inst++;
1985 } else {
1986 printk(KERN_INFO "%s: Keyboard at MMIO 0x%llx (irq = %d) "
1987 "is a %s\n",
1988 @@ -1438,12 +1446,11 @@ static int __devinit zs_probe(struct of_device *op, const struct of_device_id *m
1989 op->dev.bus_id,
1990 (unsigned long long) up[1].port.mapbase,
1991 op->irqs[0], sunzilog_type(&up[1].port));
1992 + kbm_inst++;
1993 }
1994
1995 dev_set_drvdata(&op->dev, &up[0]);
1996
1997 - inst++;
1998 -
1999 return 0;
2000 }
2001
2002 @@ -1491,28 +1498,25 @@ static struct of_platform_driver zs_driver = {
2003 static int __init sunzilog_init(void)
2004 {
2005 struct device_node *dp;
2006 - int err, uart_count;
2007 - int num_keybms;
2008 + int err;
2009 + int num_keybms = 0;
2010 int num_sunzilog = 0;
2011
2012 - num_keybms = 0;
2013 for_each_node_by_name(dp, "zs") {
2014 num_sunzilog++;
2015 if (of_find_property(dp, "keyboard", NULL))
2016 num_keybms++;
2017 }
2018
2019 - uart_count = 0;
2020 if (num_sunzilog) {
2021 - int uart_count;
2022 -
2023 err = sunzilog_alloc_tables(num_sunzilog);
2024 if (err)
2025 goto out;
2026
2027 - uart_count = (num_sunzilog * 2) - (2 * num_keybms);
2028 + uart_chip_count = num_sunzilog - num_keybms;
2029
2030 - err = sunserial_register_minors(&sunzilog_reg, uart_count);
2031 + err = sunserial_register_minors(&sunzilog_reg,
2032 + uart_chip_count * 2);
2033 if (err)
2034 goto out_free_tables;
2035 }
2036 diff --git a/drivers/usb/host/ohci-at91.c b/drivers/usb/host/ohci-at91.c
2037 index d72dc07..e534f9d 100644
2038 --- a/drivers/usb/host/ohci-at91.c
2039 +++ b/drivers/usb/host/ohci-at91.c
2040 @@ -348,6 +348,7 @@ static int ohci_hcd_at91_drv_resume(struct platform_device *pdev)
2041 if (!clocked)
2042 at91_start_clock();
2043
2044 + ohci_finish_controller_resume(hcd);
2045 return 0;
2046 }
2047 #else
2048 diff --git a/drivers/usb/host/ohci-ep93xx.c b/drivers/usb/host/ohci-ep93xx.c
2049 index 156e93a..963ed60 100644
2050 --- a/drivers/usb/host/ohci-ep93xx.c
2051 +++ b/drivers/usb/host/ohci-ep93xx.c
2052 @@ -194,8 +194,8 @@ static int ohci_hcd_ep93xx_drv_resume(struct platform_device *pdev)
2053
2054 ep93xx_start_hc(&pdev->dev);
2055 pdev->dev.power.power_state = PMSG_ON;
2056 - usb_hcd_resume_root_hub(hcd);
2057
2058 + ohci_finish_controller_resume(hcd);
2059 return 0;
2060 }
2061 #endif
2062 diff --git a/drivers/usb/host/ohci-hub.c b/drivers/usb/host/ohci-hub.c
2063 index 48e4b11..9eff2de 100644
2064 --- a/drivers/usb/host/ohci-hub.c
2065 +++ b/drivers/usb/host/ohci-hub.c
2066 @@ -326,6 +326,49 @@ static int ohci_bus_resume (struct usb_hcd *hcd)
2067 return rc;
2068 }
2069
2070 +/* Carry out the final steps of resuming the controller device */
2071 +static void ohci_finish_controller_resume(struct usb_hcd *hcd)
2072 +{
2073 + struct ohci_hcd *ohci = hcd_to_ohci(hcd);
2074 + int port;
2075 + bool need_reinit = false;
2076 +
2077 + /* See if the controller is already running or has been reset */
2078 + ohci->hc_control = ohci_readl(ohci, &ohci->regs->control);
2079 + if (ohci->hc_control & (OHCI_CTRL_IR | OHCI_SCHED_ENABLES)) {
2080 + need_reinit = true;
2081 + } else {
2082 + switch (ohci->hc_control & OHCI_CTRL_HCFS) {
2083 + case OHCI_USB_OPER:
2084 + case OHCI_USB_RESET:
2085 + need_reinit = true;
2086 + }
2087 + }
2088 +
2089 + /* If needed, reinitialize and suspend the root hub */
2090 + if (need_reinit) {
2091 + spin_lock_irq(&ohci->lock);
2092 + hcd->state = HC_STATE_RESUMING;
2093 + ohci_rh_resume(ohci);
2094 + hcd->state = HC_STATE_QUIESCING;
2095 + ohci_rh_suspend(ohci, 0);
2096 + hcd->state = HC_STATE_SUSPENDED;
2097 + spin_unlock_irq(&ohci->lock);
2098 + }
2099 +
2100 + /* Normally just turn on port power and enable interrupts */
2101 + else {
2102 + ohci_dbg(ohci, "powerup ports\n");
2103 + for (port = 0; port < ohci->num_ports; port++)
2104 + ohci_writel(ohci, RH_PS_PPS,
2105 + &ohci->regs->roothub.portstatus[port]);
2106 +
2107 + ohci_writel(ohci, OHCI_INTR_MIE, &ohci->regs->intrenable);
2108 + ohci_readl(ohci, &ohci->regs->intrenable);
2109 + msleep(20);
2110 + }
2111 +}
2112 +
2113 /* Carry out polling-, autostop-, and autoresume-related state changes */
2114 static int ohci_root_hub_state_changes(struct ohci_hcd *ohci, int changed,
2115 int any_connected)
2116 diff --git a/drivers/usb/host/ohci-omap.c b/drivers/usb/host/ohci-omap.c
2117 index 7bfca1e..611bc9f 100644
2118 --- a/drivers/usb/host/ohci-omap.c
2119 +++ b/drivers/usb/host/ohci-omap.c
2120 @@ -519,7 +519,7 @@ static int ohci_omap_resume(struct platform_device *dev)
2121
2122 omap_ohci_clock_power(1);
2123 dev->dev.power.power_state = PMSG_ON;
2124 - usb_hcd_resume_root_hub(platform_get_drvdata(dev));
2125 + ohci_finish_controller_resume(hcd);
2126 return 0;
2127 }
2128
2129 diff --git a/drivers/usb/host/ohci-pci.c b/drivers/usb/host/ohci-pci.c
2130 index b0e2275..b4886e1 100644
2131 --- a/drivers/usb/host/ohci-pci.c
2132 +++ b/drivers/usb/host/ohci-pci.c
2133 @@ -238,42 +238,6 @@ static int __devinit ohci_pci_start (struct usb_hcd *hcd)
2134 return ret;
2135 }
2136
2137 -#if defined(CONFIG_USB_PERSIST) && (defined(CONFIG_USB_EHCI_HCD) || \
2138 - defined(CONFIG_USB_EHCI_HCD_MODULE))
2139 -
2140 -/* Following a power loss, we must prepare to regain control of the ports
2141 - * we used to own. This means turning on the port power before ehci-hcd
2142 - * tries to switch ownership.
2143 - *
2144 - * This isn't a 100% perfect solution. On most systems the OHCI controllers
2145 - * lie at lower PCI addresses than the EHCI controller, so they will be
2146 - * discovered (and hence resumed) first. But there is no guarantee things
2147 - * will always work this way. If the EHCI controller is resumed first and
2148 - * the OHCI ports are unpowered, then the handover will fail.
2149 - */
2150 -static void prepare_for_handover(struct usb_hcd *hcd)
2151 -{
2152 - struct ohci_hcd *ohci = hcd_to_ohci(hcd);
2153 - int port;
2154 -
2155 - /* Here we "know" root ports should always stay powered */
2156 - ohci_dbg(ohci, "powerup ports\n");
2157 - for (port = 0; port < ohci->num_ports; port++)
2158 - ohci_writel(ohci, RH_PS_PPS,
2159 - &ohci->regs->roothub.portstatus[port]);
2160 -
2161 - /* Flush those writes */
2162 - ohci_readl(ohci, &ohci->regs->control);
2163 - msleep(20);
2164 -}
2165 -
2166 -#else
2167 -
2168 -static inline void prepare_for_handover(struct usb_hcd *hcd)
2169 -{ }
2170 -
2171 -#endif /* CONFIG_USB_PERSIST etc. */
2172 -
2173 #ifdef CONFIG_PM
2174
2175 static int ohci_pci_suspend (struct usb_hcd *hcd, pm_message_t message)
2176 @@ -312,13 +276,8 @@ static int ohci_pci_suspend (struct usb_hcd *hcd, pm_message_t message)
2177
2178 static int ohci_pci_resume (struct usb_hcd *hcd)
2179 {
2180 - struct ohci_hcd *ohci = hcd_to_ohci(hcd);
2181 -
2182 set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
2183 -
2184 - /* FIXME: we should try to detect loss of VBUS power here */
2185 - prepare_for_handover(hcd);
2186 - ohci_writel(ohci, OHCI_INTR_MIE, &ohci->regs->intrenable);
2187 + ohci_finish_controller_resume(hcd);
2188 return 0;
2189 }
2190
2191 diff --git a/drivers/usb/host/ohci-pxa27x.c b/drivers/usb/host/ohci-pxa27x.c
2192 index 8ad9b3b..3de3b00 100644
2193 --- a/drivers/usb/host/ohci-pxa27x.c
2194 +++ b/drivers/usb/host/ohci-pxa27x.c
2195 @@ -358,8 +358,7 @@ static int ohci_hcd_pxa27x_drv_resume(struct platform_device *pdev)
2196 return status;
2197
2198 pdev->dev.power.power_state = PMSG_ON;
2199 - usb_hcd_resume_root_hub(hcd);
2200 -
2201 + ohci_finish_controller_resume(hcd);
2202 return 0;
2203 }
2204 #endif
2205 diff --git a/drivers/usb/host/ohci-sm501.c b/drivers/usb/host/ohci-sm501.c
2206 index 4ea9276..c852f03 100644
2207 --- a/drivers/usb/host/ohci-sm501.c
2208 +++ b/drivers/usb/host/ohci-sm501.c
2209 @@ -239,7 +239,7 @@ static int ohci_sm501_resume(struct platform_device *pdev)
2210
2211 sm501_unit_power(dev->parent, SM501_GATE_USB_HOST, 1);
2212 dev->power.power_state = PMSG_ON;
2213 - usb_hcd_resume_root_hub(platform_get_drvdata(pdev));
2214 + ohci_finish_controller_resume(hcd);
2215 return 0;
2216 }
2217 #endif
2218 diff --git a/drivers/usb/host/ohci-ssb.c b/drivers/usb/host/ohci-ssb.c
2219 index 6e9c2d6..1c0867a 100644
2220 --- a/drivers/usb/host/ohci-ssb.c
2221 +++ b/drivers/usb/host/ohci-ssb.c
2222 @@ -224,6 +224,7 @@ static int ssb_ohci_resume(struct ssb_device *dev)
2223
2224 ssb_device_enable(dev, ohcidev->enable_flags);
2225
2226 + ohci_finish_controller_resume(hcd);
2227 return 0;
2228 }
2229
2230 diff --git a/drivers/usb/serial/airprime.c b/drivers/usb/serial/airprime.c
2231 index f156dba..a3482fc 100644
2232 --- a/drivers/usb/serial/airprime.c
2233 +++ b/drivers/usb/serial/airprime.c
2234 @@ -220,7 +220,7 @@ static void airprime_close(struct usb_serial_port *port, struct file * filp)
2235 mutex_lock(&port->serial->disc_mutex);
2236 if (!port->serial->disconnected)
2237 airprime_send_setup(port);
2238 - mutex_lock(&port->serial->disc_mutex);
2239 + mutex_unlock(&port->serial->disc_mutex);
2240
2241 for (i = 0; i < NUM_READ_URBS; ++i) {
2242 usb_kill_urb (priv->read_urbp[i]);
2243 diff --git a/include/asm-sparc/mman.h b/include/asm-sparc/mman.h
2244 index b7dc40b..632cd8a 100644
2245 --- a/include/asm-sparc/mman.h
2246 +++ b/include/asm-sparc/mman.h
2247 @@ -37,9 +37,8 @@
2248
2249 #ifdef __KERNEL__
2250 #ifndef __ASSEMBLY__
2251 -#define arch_mmap_check sparc_mmap_check
2252 -int sparc_mmap_check(unsigned long addr, unsigned long len,
2253 - unsigned long flags);
2254 +#define arch_mmap_check(addr,len,flags) sparc_mmap_check(addr,len)
2255 +int sparc_mmap_check(unsigned long addr, unsigned long len);
2256 #endif
2257 #endif
2258
2259 diff --git a/include/asm-sparc/psr.h b/include/asm-sparc/psr.h
2260 index 19c9780..2139704 100644
2261 --- a/include/asm-sparc/psr.h
2262 +++ b/include/asm-sparc/psr.h
2263 @@ -25,6 +25,7 @@
2264 #define PSR_PIL 0x00000f00 /* processor interrupt level */
2265 #define PSR_EF 0x00001000 /* enable floating point */
2266 #define PSR_EC 0x00002000 /* enable co-processor */
2267 +#define PSR_SYSCALL 0x00004000 /* inside of a syscall */
2268 #define PSR_LE 0x00008000 /* SuperSparcII little-endian */
2269 #define PSR_ICC 0x00f00000 /* integer condition codes */
2270 #define PSR_C 0x00100000 /* carry bit */
2271 diff --git a/include/asm-sparc/ptrace.h b/include/asm-sparc/ptrace.h
2272 index 8201a7b..0afb867 100644
2273 --- a/include/asm-sparc/ptrace.h
2274 +++ b/include/asm-sparc/ptrace.h
2275 @@ -10,6 +10,8 @@
2276
2277 #ifndef __ASSEMBLY__
2278
2279 +#include <linux/types.h>
2280 +
2281 struct pt_regs {
2282 unsigned long psr;
2283 unsigned long pc;
2284 @@ -39,6 +41,16 @@ struct pt_regs {
2285 #define UREG_FP UREG_I6
2286 #define UREG_RETPC UREG_I7
2287
2288 +static inline bool pt_regs_is_syscall(struct pt_regs *regs)
2289 +{
2290 + return (regs->psr & PSR_SYSCALL);
2291 +}
2292 +
2293 +static inline bool pt_regs_clear_syscall(struct pt_regs *regs)
2294 +{
2295 + return (regs->psr &= ~PSR_SYSCALL);
2296 +}
2297 +
2298 /* A register window */
2299 struct reg_window {
2300 unsigned long locals[8];
2301 @@ -149,6 +161,7 @@ extern void show_regs(struct pt_regs *);
2302 #define SF_XXARG 0x5c
2303
2304 /* Stuff for the ptrace system call */
2305 +#define PTRACE_SPARC_DETACH 11
2306 #define PTRACE_GETREGS 12
2307 #define PTRACE_SETREGS 13
2308 #define PTRACE_GETFPREGS 14
2309 diff --git a/include/asm-sparc/signal.h b/include/asm-sparc/signal.h
2310 index d03a21c..94071c7 100644
2311 --- a/include/asm-sparc/signal.h
2312 +++ b/include/asm-sparc/signal.h
2313 @@ -199,13 +199,7 @@ typedef struct sigaltstack {
2314 size_t ss_size;
2315 } stack_t;
2316
2317 -struct sparc_deliver_cookie {
2318 - int restart_syscall;
2319 - unsigned long orig_i0;
2320 -};
2321 -
2322 -struct pt_regs;
2323 -extern void ptrace_signal_deliver(struct pt_regs *regs, void *cookie);
2324 +#define ptrace_signal_deliver(regs, cookie) do { } while (0)
2325
2326 #endif /* !(__KERNEL__) */
2327
2328 diff --git a/include/asm-sparc64/mman.h b/include/asm-sparc64/mman.h
2329 index 8cc1860..e0fcfca 100644
2330 --- a/include/asm-sparc64/mman.h
2331 +++ b/include/asm-sparc64/mman.h
2332 @@ -37,9 +37,8 @@
2333
2334 #ifdef __KERNEL__
2335 #ifndef __ASSEMBLY__
2336 -#define arch_mmap_check sparc64_mmap_check
2337 -int sparc64_mmap_check(unsigned long addr, unsigned long len,
2338 - unsigned long flags);
2339 +#define arch_mmap_check(addr,len,flags) sparc64_mmap_check(addr,len)
2340 +int sparc64_mmap_check(unsigned long addr, unsigned long len);
2341 #endif
2342 #endif
2343
2344 diff --git a/include/asm-sparc64/psrcompat.h b/include/asm-sparc64/psrcompat.h
2345 index 5590ce6..3614ca0 100644
2346 --- a/include/asm-sparc64/psrcompat.h
2347 +++ b/include/asm-sparc64/psrcompat.h
2348 @@ -12,6 +12,7 @@
2349 #define PSR_PIL 0x00000f00 /* processor interrupt level */
2350 #define PSR_EF 0x00001000 /* enable floating point */
2351 #define PSR_EC 0x00002000 /* enable co-processor */
2352 +#define PSR_SYSCALL 0x00004000 /* inside of a syscall */
2353 #define PSR_LE 0x00008000 /* SuperSparcII little-endian */
2354 #define PSR_ICC 0x00f00000 /* integer condition codes */
2355 #define PSR_C 0x00100000 /* carry bit */
2356 @@ -30,6 +31,7 @@ static inline unsigned int tstate_to_psr(unsigned long tstate)
2357 PSR_S |
2358 ((tstate & TSTATE_ICC) >> 12) |
2359 ((tstate & TSTATE_XCC) >> 20) |
2360 + ((tstate & TSTATE_SYSCALL) ? PSR_SYSCALL : 0) |
2361 PSR_V8PLUS);
2362 }
2363
2364 diff --git a/include/asm-sparc64/pstate.h b/include/asm-sparc64/pstate.h
2365 index f3c4548..949aeba 100644
2366 --- a/include/asm-sparc64/pstate.h
2367 +++ b/include/asm-sparc64/pstate.h
2368 @@ -62,6 +62,7 @@
2369 #define TSTATE_PRIV _AC(0x0000000000000400,UL) /* Privilege. */
2370 #define TSTATE_IE _AC(0x0000000000000200,UL) /* Interrupt Enable. */
2371 #define TSTATE_AG _AC(0x0000000000000100,UL) /* Alternate Globals.*/
2372 +#define TSTATE_SYSCALL _AC(0x0000000000000020,UL) /* in syscall trap */
2373 #define TSTATE_CWP _AC(0x000000000000001f,UL) /* Curr Win-Pointer. */
2374
2375 /* Floating-Point Registers State Register.
2376 diff --git a/include/asm-sparc64/ptrace.h b/include/asm-sparc64/ptrace.h
2377 index 6da1978..0093f60 100644
2378 --- a/include/asm-sparc64/ptrace.h
2379 +++ b/include/asm-sparc64/ptrace.h
2380 @@ -10,6 +10,8 @@
2381
2382 #ifndef __ASSEMBLY__
2383
2384 +#include <linux/types.h>
2385 +
2386 struct pt_regs {
2387 unsigned long u_regs[16]; /* globals and ins */
2388 unsigned long tstate;
2389 @@ -27,6 +29,16 @@ struct pt_regs32 {
2390 unsigned int u_regs[16]; /* globals and ins */
2391 };
2392
2393 +static inline bool pt_regs_is_syscall(struct pt_regs *regs)
2394 +{
2395 + return (regs->tstate & TSTATE_SYSCALL);
2396 +}
2397 +
2398 +static inline bool pt_regs_clear_syscall(struct pt_regs *regs)
2399 +{
2400 + return (regs->tstate &= ~TSTATE_SYSCALL);
2401 +}
2402 +
2403 #define UREG_G0 0
2404 #define UREG_G1 1
2405 #define UREG_G2 2
2406 @@ -263,6 +275,7 @@ extern void __show_regs(struct pt_regs *);
2407 #define SF_XXARG 0x5c
2408
2409 /* Stuff for the ptrace system call */
2410 +#define PTRACE_SPARC_DETACH 11
2411 #define PTRACE_GETREGS 12
2412 #define PTRACE_SETREGS 13
2413 #define PTRACE_GETFPREGS 14
2414 diff --git a/include/asm-sparc64/signal.h b/include/asm-sparc64/signal.h
2415 index fa6f467..c49f32d 100644
2416 --- a/include/asm-sparc64/signal.h
2417 +++ b/include/asm-sparc64/signal.h
2418 @@ -186,13 +186,7 @@ struct k_sigaction {
2419 void __user *ka_restorer;
2420 };
2421
2422 -struct signal_deliver_cookie {
2423 - int restart_syscall;
2424 - unsigned long orig_i0;
2425 -};
2426 -
2427 -struct pt_regs;
2428 -extern void ptrace_signal_deliver(struct pt_regs *regs, void *cookie);
2429 +#define ptrace_signal_deliver(regs, cookie) do { } while (0)
2430
2431 #endif /* !(__KERNEL__) */
2432
2433 diff --git a/include/asm-sparc64/ttable.h b/include/asm-sparc64/ttable.h
2434 index bbb9c8f..6ef3d3b 100644
2435 --- a/include/asm-sparc64/ttable.h
2436 +++ b/include/asm-sparc64/ttable.h
2437 @@ -91,13 +91,14 @@
2438 clr %l6;
2439
2440 #define SYSCALL_TRAP(routine, systbl) \
2441 + rdpr %pil, %g2; \
2442 + mov TSTATE_SYSCALL, %g3; \
2443 sethi %hi(109f), %g7; \
2444 - ba,pt %xcc, etrap; \
2445 + ba,pt %xcc, etrap_syscall; \
2446 109: or %g7, %lo(109b), %g7; \
2447 sethi %hi(systbl), %l7; \
2448 ba,pt %xcc, routine; \
2449 - or %l7, %lo(systbl), %l7; \
2450 - nop; nop;
2451 + or %l7, %lo(systbl), %l7;
2452
2453 #define INDIRECT_SOLARIS_SYSCALL(num) \
2454 sethi %hi(109f), %g7; \
2455 diff --git a/include/asm-x86/topology.h b/include/asm-x86/topology.h
2456 index 8af05a9..db684e1 100644
2457 --- a/include/asm-x86/topology.h
2458 +++ b/include/asm-x86/topology.h
2459 @@ -25,6 +25,16 @@
2460 #ifndef _ASM_X86_TOPOLOGY_H
2461 #define _ASM_X86_TOPOLOGY_H
2462
2463 +#ifdef CONFIG_X86_32
2464 +# ifdef CONFIG_X86_HT
2465 +# define ENABLE_TOPO_DEFINES
2466 +# endif
2467 +#else
2468 +# ifdef CONFIG_SMP
2469 +# define ENABLE_TOPO_DEFINES
2470 +# endif
2471 +#endif
2472 +
2473 #ifdef CONFIG_NUMA
2474 #include <linux/cpumask.h>
2475 #include <asm/mpspec.h>
2476 @@ -112,10 +122,6 @@ extern unsigned long node_end_pfn[];
2477 extern unsigned long node_remap_size[];
2478 #define node_has_online_mem(nid) (node_start_pfn[nid] != node_end_pfn[nid])
2479
2480 -# ifdef CONFIG_X86_HT
2481 -# define ENABLE_TOPO_DEFINES
2482 -# endif
2483 -
2484 # define SD_CACHE_NICE_TRIES 1
2485 # define SD_IDLE_IDX 1
2486 # define SD_NEWIDLE_IDX 2
2487 @@ -123,10 +129,6 @@ extern unsigned long node_remap_size[];
2488
2489 #else
2490
2491 -# ifdef CONFIG_SMP
2492 -# define ENABLE_TOPO_DEFINES
2493 -# endif
2494 -
2495 # define SD_CACHE_NICE_TRIES 2
2496 # define SD_IDLE_IDX 2
2497 # define SD_NEWIDLE_IDX 0
2498 diff --git a/include/net/ip_vs.h b/include/net/ip_vs.h
2499 index 56f3c94..9a51eba 100644
2500 --- a/include/net/ip_vs.h
2501 +++ b/include/net/ip_vs.h
2502 @@ -405,7 +405,8 @@ struct sk_buff;
2503 struct ip_vs_protocol {
2504 struct ip_vs_protocol *next;
2505 char *name;
2506 - __u16 protocol;
2507 + u16 protocol;
2508 + u16 num_states;
2509 int dont_defrag;
2510 atomic_t appcnt; /* counter of proto app incs */
2511 int *timeout_table; /* protocol timeout table */
2512 diff --git a/include/net/netfilter/nf_conntrack_tuple.h b/include/net/netfilter/nf_conntrack_tuple.h
2513 index e69ab2e..d9a4f7f 100644
2514 --- a/include/net/netfilter/nf_conntrack_tuple.h
2515 +++ b/include/net/netfilter/nf_conntrack_tuple.h
2516 @@ -101,16 +101,6 @@ struct nf_conntrack_tuple_mask
2517 } src;
2518 };
2519
2520 -/* This is optimized opposed to a memset of the whole structure. Everything we
2521 - * really care about is the source/destination unions */
2522 -#define NF_CT_TUPLE_U_BLANK(tuple) \
2523 - do { \
2524 - (tuple)->src.u.all = 0; \
2525 - (tuple)->dst.u.all = 0; \
2526 - memset(&(tuple)->src.u3, 0, sizeof((tuple)->src.u3)); \
2527 - memset(&(tuple)->dst.u3, 0, sizeof((tuple)->dst.u3)); \
2528 - } while (0)
2529 -
2530 #ifdef __KERNEL__
2531
2532 #define NF_CT_DUMP_TUPLE(tp) \
2533 diff --git a/net/can/af_can.c b/net/can/af_can.c
2534 index 36b9f22..6b956f5 100644
2535 --- a/net/can/af_can.c
2536 +++ b/net/can/af_can.c
2537 @@ -208,6 +208,7 @@ static int can_create(struct net *net, struct socket *sock, int protocol)
2538 */
2539 int can_send(struct sk_buff *skb, int loop)
2540 {
2541 + struct sk_buff *newskb = NULL;
2542 int err;
2543
2544 if (skb->dev->type != ARPHRD_CAN) {
2545 @@ -244,8 +245,7 @@ int can_send(struct sk_buff *skb, int loop)
2546 * If the interface is not capable to do loopback
2547 * itself, we do it here.
2548 */
2549 - struct sk_buff *newskb = skb_clone(skb, GFP_ATOMIC);
2550 -
2551 + newskb = skb_clone(skb, GFP_ATOMIC);
2552 if (!newskb) {
2553 kfree_skb(skb);
2554 return -ENOMEM;
2555 @@ -254,7 +254,6 @@ int can_send(struct sk_buff *skb, int loop)
2556 newskb->sk = skb->sk;
2557 newskb->ip_summed = CHECKSUM_UNNECESSARY;
2558 newskb->pkt_type = PACKET_BROADCAST;
2559 - netif_rx(newskb);
2560 }
2561 } else {
2562 /* indication for the CAN driver: no loopback required */
2563 @@ -266,11 +265,20 @@ int can_send(struct sk_buff *skb, int loop)
2564 if (err > 0)
2565 err = net_xmit_errno(err);
2566
2567 + if (err) {
2568 + if (newskb)
2569 + kfree_skb(newskb);
2570 + return err;
2571 + }
2572 +
2573 + if (newskb)
2574 + netif_rx(newskb);
2575 +
2576 /* update statistics */
2577 can_stats.tx_frames++;
2578 can_stats.tx_frames_delta++;
2579
2580 - return err;
2581 + return 0;
2582 }
2583 EXPORT_SYMBOL(can_send);
2584
2585 diff --git a/net/dccp/feat.c b/net/dccp/feat.c
2586 index 4a4f6ce..933a0ec 100644
2587 --- a/net/dccp/feat.c
2588 +++ b/net/dccp/feat.c
2589 @@ -32,7 +32,7 @@ int dccp_feat_change(struct dccp_minisock *dmsk, u8 type, u8 feature,
2590
2591 if (len > 3) {
2592 DCCP_WARN("invalid length %d\n", len);
2593 - return 1;
2594 + return -EINVAL;
2595 }
2596 /* XXX add further sanity checks */
2597
2598 diff --git a/net/ipv4/ipvs/ip_vs_proto.c b/net/ipv4/ipvs/ip_vs_proto.c
2599 index dde28a2..4b1c16c 100644
2600 --- a/net/ipv4/ipvs/ip_vs_proto.c
2601 +++ b/net/ipv4/ipvs/ip_vs_proto.c
2602 @@ -148,7 +148,7 @@ const char * ip_vs_state_name(__u16 proto, int state)
2603 struct ip_vs_protocol *pp = ip_vs_proto_get(proto);
2604
2605 if (pp == NULL || pp->state_name == NULL)
2606 - return "ERR!";
2607 + return (IPPROTO_IP == proto) ? "NONE" : "ERR!";
2608 return pp->state_name(state);
2609 }
2610
2611 diff --git a/net/ipv4/ipvs/ip_vs_proto_ah.c b/net/ipv4/ipvs/ip_vs_proto_ah.c
2612 index a842676..4bf835e 100644
2613 --- a/net/ipv4/ipvs/ip_vs_proto_ah.c
2614 +++ b/net/ipv4/ipvs/ip_vs_proto_ah.c
2615 @@ -160,6 +160,7 @@ static void ah_exit(struct ip_vs_protocol *pp)
2616 struct ip_vs_protocol ip_vs_protocol_ah = {
2617 .name = "AH",
2618 .protocol = IPPROTO_AH,
2619 + .num_states = 1,
2620 .dont_defrag = 1,
2621 .init = ah_init,
2622 .exit = ah_exit,
2623 diff --git a/net/ipv4/ipvs/ip_vs_proto_esp.c b/net/ipv4/ipvs/ip_vs_proto_esp.c
2624 index aef0d3e..db6a6b7 100644
2625 --- a/net/ipv4/ipvs/ip_vs_proto_esp.c
2626 +++ b/net/ipv4/ipvs/ip_vs_proto_esp.c
2627 @@ -159,6 +159,7 @@ static void esp_exit(struct ip_vs_protocol *pp)
2628 struct ip_vs_protocol ip_vs_protocol_esp = {
2629 .name = "ESP",
2630 .protocol = IPPROTO_ESP,
2631 + .num_states = 1,
2632 .dont_defrag = 1,
2633 .init = esp_init,
2634 .exit = esp_exit,
2635 diff --git a/net/ipv4/ipvs/ip_vs_proto_tcp.c b/net/ipv4/ipvs/ip_vs_proto_tcp.c
2636 index 12dc0d6..480f876 100644
2637 --- a/net/ipv4/ipvs/ip_vs_proto_tcp.c
2638 +++ b/net/ipv4/ipvs/ip_vs_proto_tcp.c
2639 @@ -594,6 +594,7 @@ static void ip_vs_tcp_exit(struct ip_vs_protocol *pp)
2640 struct ip_vs_protocol ip_vs_protocol_tcp = {
2641 .name = "TCP",
2642 .protocol = IPPROTO_TCP,
2643 + .num_states = IP_VS_TCP_S_LAST,
2644 .dont_defrag = 0,
2645 .appcnt = ATOMIC_INIT(0),
2646 .init = ip_vs_tcp_init,
2647 diff --git a/net/ipv4/ipvs/ip_vs_proto_udp.c b/net/ipv4/ipvs/ip_vs_proto_udp.c
2648 index 1fa7b33..8e3b059 100644
2649 --- a/net/ipv4/ipvs/ip_vs_proto_udp.c
2650 +++ b/net/ipv4/ipvs/ip_vs_proto_udp.c
2651 @@ -409,6 +409,7 @@ static void udp_exit(struct ip_vs_protocol *pp)
2652 struct ip_vs_protocol ip_vs_protocol_udp = {
2653 .name = "UDP",
2654 .protocol = IPPROTO_UDP,
2655 + .num_states = IP_VS_UDP_S_LAST,
2656 .dont_defrag = 0,
2657 .init = udp_init,
2658 .exit = udp_exit,
2659 diff --git a/net/ipv4/ipvs/ip_vs_sync.c b/net/ipv4/ipvs/ip_vs_sync.c
2660 index 948378d..a392d6e 100644
2661 --- a/net/ipv4/ipvs/ip_vs_sync.c
2662 +++ b/net/ipv4/ipvs/ip_vs_sync.c
2663 @@ -288,11 +288,16 @@ static void ip_vs_process_message(const char *buffer, const size_t buflen)
2664 char *p;
2665 int i;
2666
2667 + if (buflen < sizeof(struct ip_vs_sync_mesg)) {
2668 + IP_VS_ERR_RL("sync message header too short\n");
2669 + return;
2670 + }
2671 +
2672 /* Convert size back to host byte order */
2673 m->size = ntohs(m->size);
2674
2675 if (buflen != m->size) {
2676 - IP_VS_ERR("bogus message\n");
2677 + IP_VS_ERR_RL("bogus sync message size\n");
2678 return;
2679 }
2680
2681 @@ -307,9 +312,48 @@ static void ip_vs_process_message(const char *buffer, const size_t buflen)
2682 for (i=0; i<m->nr_conns; i++) {
2683 unsigned flags, state;
2684
2685 - s = (struct ip_vs_sync_conn *)p;
2686 + if (p + SIMPLE_CONN_SIZE > buffer+buflen) {
2687 + IP_VS_ERR_RL("bogus conn in sync message\n");
2688 + return;
2689 + }
2690 + s = (struct ip_vs_sync_conn *) p;
2691 flags = ntohs(s->flags) | IP_VS_CONN_F_SYNC;
2692 + flags &= ~IP_VS_CONN_F_HASHED;
2693 + if (flags & IP_VS_CONN_F_SEQ_MASK) {
2694 + opt = (struct ip_vs_sync_conn_options *)&s[1];
2695 + p += FULL_CONN_SIZE;
2696 + if (p > buffer+buflen) {
2697 + IP_VS_ERR_RL("bogus conn options in sync message\n");
2698 + return;
2699 + }
2700 + } else {
2701 + opt = NULL;
2702 + p += SIMPLE_CONN_SIZE;
2703 + }
2704 +
2705 state = ntohs(s->state);
2706 + if (!(flags & IP_VS_CONN_F_TEMPLATE)) {
2707 + pp = ip_vs_proto_get(s->protocol);
2708 + if (!pp) {
2709 + IP_VS_ERR_RL("Unsupported protocol %u in sync msg\n",
2710 + s->protocol);
2711 + continue;
2712 + }
2713 + if (state >= pp->num_states) {
2714 + IP_VS_DBG(2, "Invalid %s state %u in sync msg\n",
2715 + pp->name, state);
2716 + continue;
2717 + }
2718 + } else {
2719 + /* protocol in templates is not used for state/timeout */
2720 + pp = NULL;
2721 + if (state > 0) {
2722 + IP_VS_DBG(2, "Invalid template state %u in sync msg\n",
2723 + state);
2724 + state = 0;
2725 + }
2726 + }
2727 +
2728 if (!(flags & IP_VS_CONN_F_TEMPLATE))
2729 cp = ip_vs_conn_in_get(s->protocol,
2730 s->caddr, s->cport,
2731 @@ -345,14 +389,9 @@ static void ip_vs_process_message(const char *buffer, const size_t buflen)
2732 IP_VS_ERR("ip_vs_conn_new failed\n");
2733 return;
2734 }
2735 - cp->state = state;
2736 } else if (!cp->dest) {
2737 dest = ip_vs_try_bind_dest(cp);
2738 - if (!dest) {
2739 - /* it is an unbound entry created by
2740 - * synchronization */
2741 - cp->flags = flags | IP_VS_CONN_F_HASHED;
2742 - } else
2743 + if (dest)
2744 atomic_dec(&dest->refcnt);
2745 } else if ((cp->dest) && (cp->protocol == IPPROTO_TCP) &&
2746 (cp->state != state)) {
2747 @@ -371,23 +410,22 @@ static void ip_vs_process_message(const char *buffer, const size_t buflen)
2748 }
2749 }
2750
2751 - if (flags & IP_VS_CONN_F_SEQ_MASK) {
2752 - opt = (struct ip_vs_sync_conn_options *)&s[1];
2753 + if (opt)
2754 memcpy(&cp->in_seq, opt, sizeof(*opt));
2755 - p += FULL_CONN_SIZE;
2756 - } else
2757 - p += SIMPLE_CONN_SIZE;
2758 -
2759 atomic_set(&cp->in_pkts, sysctl_ip_vs_sync_threshold[0]);
2760 cp->state = state;
2761 - pp = ip_vs_proto_get(s->protocol);
2762 - cp->timeout = pp->timeout_table[cp->state];
2763 + cp->old_state = cp->state;
2764 + /*
2765 + * We can not recover the right timeout for templates
2766 + * in all cases, we can not find the right fwmark
2767 + * virtual service. If needed, we can do it for
2768 + * non-fwmark persistent services.
2769 + */
2770 + if (!(flags & IP_VS_CONN_F_TEMPLATE) && pp->timeout_table)
2771 + cp->timeout = pp->timeout_table[state];
2772 + else
2773 + cp->timeout = (3*60*HZ);
2774 ip_vs_conn_put(cp);
2775 -
2776 - if (p > buffer+buflen) {
2777 - IP_VS_ERR("bogus message\n");
2778 - return;
2779 - }
2780 }
2781 }
2782
2783 diff --git a/net/ipv4/netfilter/ip_queue.c b/net/ipv4/netfilter/ip_queue.c
2784 index 4dc1628..e46d8fa 100644
2785 --- a/net/ipv4/netfilter/ip_queue.c
2786 +++ b/net/ipv4/netfilter/ip_queue.c
2787 @@ -296,9 +296,8 @@ ipq_mangle_ipv4(ipq_verdict_msg_t *v, struct nf_queue_entry *e)
2788 if (v->data_len > 0xFFFF)
2789 return -EINVAL;
2790 if (diff > skb_tailroom(e->skb)) {
2791 - nskb = skb_copy_expand(e->skb, 0,
2792 - diff - skb_tailroom(e->skb),
2793 - GFP_ATOMIC);
2794 + nskb = skb_copy_expand(e->skb, skb_headroom(e->skb),
2795 + diff, GFP_ATOMIC);
2796 if (!nskb) {
2797 printk(KERN_WARNING "ip_queue: error "
2798 "in mangle, dropping packet\n");
2799 diff --git a/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c b/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c
2800 index a65b845..50ad6ef 100644
2801 --- a/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c
2802 +++ b/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c
2803 @@ -305,7 +305,7 @@ getorigdst(struct sock *sk, int optval, void __user *user, int *len)
2804 const struct nf_conntrack_tuple_hash *h;
2805 struct nf_conntrack_tuple tuple;
2806
2807 - NF_CT_TUPLE_U_BLANK(&tuple);
2808 + memset(&tuple, 0, sizeof(tuple));
2809 tuple.src.u3.ip = inet->rcv_saddr;
2810 tuple.src.u.tcp.port = inet->sport;
2811 tuple.dst.u3.ip = inet->daddr;
2812 diff --git a/net/ipv6/netfilter/ip6_queue.c b/net/ipv6/netfilter/ip6_queue.c
2813 index 8d366f7..12b4dc5 100644
2814 --- a/net/ipv6/netfilter/ip6_queue.c
2815 +++ b/net/ipv6/netfilter/ip6_queue.c
2816 @@ -298,9 +298,8 @@ ipq_mangle_ipv6(ipq_verdict_msg_t *v, struct nf_queue_entry *e)
2817 if (v->data_len > 0xFFFF)
2818 return -EINVAL;
2819 if (diff > skb_tailroom(e->skb)) {
2820 - nskb = skb_copy_expand(e->skb, 0,
2821 - diff - skb_tailroom(e->skb),
2822 - GFP_ATOMIC);
2823 + nskb = skb_copy_expand(e->skb, skb_headroom(e->skb),
2824 + diff, GFP_ATOMIC);
2825 if (!nskb) {
2826 printk(KERN_WARNING "ip6_queue: OOM "
2827 "in mangle, dropping packet\n");
2828 diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c
2829 index b77eb56..4147de6 100644
2830 --- a/net/netfilter/nf_conntrack_core.c
2831 +++ b/net/netfilter/nf_conntrack_core.c
2832 @@ -104,7 +104,7 @@ nf_ct_get_tuple(const struct sk_buff *skb,
2833 const struct nf_conntrack_l3proto *l3proto,
2834 const struct nf_conntrack_l4proto *l4proto)
2835 {
2836 - NF_CT_TUPLE_U_BLANK(tuple);
2837 + memset(tuple, 0, sizeof(*tuple));
2838
2839 tuple->src.l3num = l3num;
2840 if (l3proto->pkt_to_tuple(skb, nhoff, tuple) == 0)
2841 @@ -153,7 +153,7 @@ nf_ct_invert_tuple(struct nf_conntrack_tuple *inverse,
2842 const struct nf_conntrack_l3proto *l3proto,
2843 const struct nf_conntrack_l4proto *l4proto)
2844 {
2845 - NF_CT_TUPLE_U_BLANK(inverse);
2846 + memset(inverse, 0, sizeof(*inverse));
2847
2848 inverse->src.l3num = orig->src.l3num;
2849 if (l3proto->invert_tuple(inverse, orig) == 0)
2850 diff --git a/net/netfilter/nfnetlink_queue.c b/net/netfilter/nfnetlink_queue.c
2851 index 10522c0..bcaf967 100644
2852 --- a/net/netfilter/nfnetlink_queue.c
2853 +++ b/net/netfilter/nfnetlink_queue.c
2854 @@ -454,9 +454,8 @@ nfqnl_mangle(void *data, int data_len, struct nf_queue_entry *e)
2855 if (data_len > 0xFFFF)
2856 return -EINVAL;
2857 if (diff > skb_tailroom(e->skb)) {
2858 - nskb = skb_copy_expand(e->skb, 0,
2859 - diff - skb_tailroom(e->skb),
2860 - GFP_ATOMIC);
2861 + nskb = skb_copy_expand(e->skb, skb_headroom(e->skb),
2862 + diff, GFP_ATOMIC);
2863 if (!nskb) {
2864 printk(KERN_WARNING "nf_queue: OOM "
2865 "in mangle, dropping packet\n");
2866 diff --git a/net/sched/sch_htb.c b/net/sched/sch_htb.c
2867 index 66148cc..5bc1ed4 100644
2868 --- a/net/sched/sch_htb.c
2869 +++ b/net/sched/sch_htb.c
2870 @@ -1197,12 +1197,16 @@ static inline int htb_parent_last_child(struct htb_class *cl)
2871 return 1;
2872 }
2873
2874 -static void htb_parent_to_leaf(struct htb_class *cl, struct Qdisc *new_q)
2875 +static void htb_parent_to_leaf(struct htb_sched *q, struct htb_class *cl,
2876 + struct Qdisc *new_q)
2877 {
2878 struct htb_class *parent = cl->parent;
2879
2880 BUG_TRAP(!cl->level && cl->un.leaf.q && !cl->prio_activity);
2881
2882 + if (parent->cmode != HTB_CAN_SEND)
2883 + htb_safe_rb_erase(&parent->pq_node, q->wait_pq + parent->level);
2884 +
2885 parent->level = 0;
2886 memset(&parent->un.inner, 0, sizeof(parent->un.inner));
2887 INIT_LIST_HEAD(&parent->un.leaf.drop_list);
2888 @@ -1300,7 +1304,7 @@ static int htb_delete(struct Qdisc *sch, unsigned long arg)
2889 htb_deactivate(q, cl);
2890
2891 if (last_child)
2892 - htb_parent_to_leaf(cl, new_q);
2893 + htb_parent_to_leaf(q, cl, new_q);
2894
2895 if (--cl->refcnt == 0)
2896 htb_destroy_class(sch, cl);
2897 diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c
2898 index 58f1f93..413885c 100644
2899 --- a/net/xfrm/xfrm_state.c
2900 +++ b/net/xfrm/xfrm_state.c
2901 @@ -2093,7 +2093,7 @@ static void xfrm_audit_helper_pktinfo(struct sk_buff *skb, u16 family,
2902 iph6 = ipv6_hdr(skb);
2903 audit_log_format(audit_buf,
2904 " src=" NIP6_FMT " dst=" NIP6_FMT
2905 - " flowlbl=0x%x%x%x",
2906 + " flowlbl=0x%x%02x%02x",
2907 NIP6(iph6->saddr),
2908 NIP6(iph6->daddr),
2909 iph6->flow_lbl[0] & 0x0f,