[kernel] r10105 - in dists/trunk/linux-2.6/debian/patches: bugfix/all series
Maximilian Attems
maks at alioth.debian.org
Tue Jan 15 10:42:23 UTC 2008
Author: maks
Date: Tue Jan 15 10:42:23 2008
New Revision: 10105
Log:
Add 2.6.24-rc7-git7
quite some fixes went in since 2.6.24,
have snapshot user also pick up those.
Added:
dists/trunk/linux-2.6/debian/patches/bugfix/all/patch-2.6.24-rc7-git7
Modified:
dists/trunk/linux-2.6/debian/patches/series/1~experimental.1
Added: dists/trunk/linux-2.6/debian/patches/bugfix/all/patch-2.6.24-rc7-git7
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/bugfix/all/patch-2.6.24-rc7-git7 Tue Jan 15 10:42:23 2008
@@ -0,0 +1,7722 @@
+diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
+index e5b447a..c417877 100644
+--- a/Documentation/kernel-parameters.txt
++++ b/Documentation/kernel-parameters.txt
+@@ -883,6 +883,14 @@ and is between 256 and 4096 characters. It is defined in the file
+ lapic_timer_c2_ok [X86-32,x86-64,APIC] trust the local apic timer in
+ C2 power state.
+
++ libata.dma= [LIBATA] DMA control
++ libata.dma=0 Disable all PATA and SATA DMA
++ libata.dma=1 PATA and SATA Disk DMA only
++ libata.dma=2 ATAPI (CDROM) DMA only
++ libata.dma=4 Compact Flash DMA only
++ Combinations also work, so libata.dma=3 enables DMA
++ for disks and CDROMs, but not CFs.
++
+ libata.noacpi [LIBATA] Disables use of ACPI in libata suspend/resume
+ when set.
+ Format: <int>
+diff --git a/Documentation/nfsroot.txt b/Documentation/nfsroot.txt
+index c86dd38..31b3291 100644
+--- a/Documentation/nfsroot.txt
++++ b/Documentation/nfsroot.txt
+@@ -145,6 +145,7 @@ ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>
+ this option.
+
+ off or none: don't use autoconfiguration
++ (do static IP assignment instead)
+ on or any: use any protocol available in the kernel
+ (default)
+ dhcp: use DHCP
+diff --git a/MAINTAINERS b/MAINTAINERS
+index 79c711e..2340cfb 100644
+--- a/MAINTAINERS
++++ b/MAINTAINERS
+@@ -665,12 +665,18 @@ S: Maintained
+
+ ATMEL AT91 MCI DRIVER
+ P: Nicolas Ferre
+-M: nicolas.ferre at rfo.atmel.com
++M: nicolas.ferre at atmel.com
+ L: linux-arm-kernel at lists.arm.linux.org.uk (subscribers-only)
+ W: http://www.atmel.com/products/AT91/
+ W: http://www.at91.com/
+ S: Maintained
+
++ATMEL LCDFB DRIVER
++P: Nicolas Ferre
++M: nicolas.ferre at atmel.com
++L: linux-fbdev-devel at lists.sourceforge.net (subscribers-only)
++S: Maintained
++
+ ATMEL MACB ETHERNET DRIVER
+ P: Haavard Skinnemoen
+ M: hskinnemoen at atmel.com
+@@ -1919,7 +1925,7 @@ INFINIBAND SUBSYSTEM
+ P: Roland Dreier
+ M: rolandd at cisco.com
+ P: Sean Hefty
+-M: mshefty at ichips.intel.com
++M: sean.hefty at intel.com
+ P: Hal Rosenstock
+ M: hal.rosenstock at gmail.com
+ L: general at lists.openfabrics.org
+@@ -1984,29 +1990,27 @@ L: netdev at vger.kernel.org
+ S: Maintained
+
+ INTEL PRO/100 ETHERNET SUPPORT
+-P: John Ronciak
+-M: john.ronciak at intel.com
++P: Auke Kok
++M: auke-jan.h.kok at intel.com
+ P: Jesse Brandeburg
+ M: jesse.brandeburg at intel.com
+ P: Jeff Kirsher
+ M: jeffrey.t.kirsher at intel.com
+-P: Auke Kok
+-M: auke-jan.h.kok at intel.com
++P: John Ronciak
++M: john.ronciak at intel.com
+ L: e1000-devel at lists.sourceforge.net
+ W: http://sourceforge.net/projects/e1000/
+ S: Supported
+
+ INTEL PRO/1000 GIGABIT ETHERNET SUPPORT
+-P: Jeb Cramer
+-M: cramerj at intel.com
+-P: John Ronciak
+-M: john.ronciak at intel.com
++P: Auke Kok
++M: auke-jan.h.kok at intel.com
+ P: Jesse Brandeburg
+ M: jesse.brandeburg at intel.com
+ P: Jeff Kirsher
+ M: jeffrey.t.kirsher at intel.com
+-P: Auke Kok
+-M: auke-jan.h.kok at intel.com
++P: John Ronciak
++M: john.ronciak at intel.com
+ L: e1000-devel at lists.sourceforge.net
+ W: http://sourceforge.net/projects/e1000/
+ S: Supported
+@@ -2741,8 +2745,8 @@ T: git kernel.org:/pub/scm/linux/kernel/git/linville/wireless-2.6.git
+ S: Maintained
+
+ NETXEN (1/10) GbE SUPPORT
+-P: Amit S. Kale
+-M: amitkale at netxen.com
++P: Dhananjay Phadke
++M: dhananjay at netxen.com
+ L: netdev at vger.kernel.org
+ W: http://www.netxen.com
+ S: Supported
+@@ -3613,8 +3617,10 @@ L: linux-kernel at vger.kernel.org ?
+ S: Supported
+
+ SPIDERNET NETWORK DRIVER for CELL
+-P: Linas Vepstas
+-M: linas at austin.ibm.com
++P: Ishizaki Kou
++M: kou.ishizaki at toshiba.co.jp
++P: Jens Osterkamp
++M: jens at de.ibm.com
+ L: netdev at vger.kernel.org
+ S: Supported
+
+diff --git a/arch/arm/mach-at91/board-ek.c b/arch/arm/mach-at91/board-ek.c
+index d05b1b2..53a5ef9 100644
+--- a/arch/arm/mach-at91/board-ek.c
++++ b/arch/arm/mach-at91/board-ek.c
+@@ -109,6 +109,15 @@ static struct spi_board_info ek_spi_devices[] = {
+ #endif
+ };
+
++static struct i2c_board_info __initdata ek_i2c_devices[] = {
++ {
++ I2C_BOARD_INFO("ics1523", 0x26),
++ },
++ {
++ I2C_BOARD_INFO("dac3550", 0x4d),
++ }
++};
++
+ #define EK_FLASH_BASE AT91_CHIPSELECT_0
+ #define EK_FLASH_SIZE 0x200000
+
+diff --git a/arch/arm/mach-pxa/pxa25x.c b/arch/arm/mach-pxa/pxa25x.c
+index dcd81f8..9732d5d 100644
+--- a/arch/arm/mach-pxa/pxa25x.c
++++ b/arch/arm/mach-pxa/pxa25x.c
+@@ -178,13 +178,19 @@ static void pxa25x_cpu_pm_save(unsigned long *sleep_save)
+ SAVE(GAFR1_L); SAVE(GAFR1_U);
+ SAVE(GAFR2_L); SAVE(GAFR2_U);
+
+- SAVE(ICMR);
++ SAVE(ICMR); ICMR = 0;
+ SAVE(CKEN);
+ SAVE(PSTR);
++
++ /* Clear GPIO transition detect bits */
++ GEDR0 = GEDR0; GEDR1 = GEDR1; GEDR2 = GEDR2;
+ }
+
+ static void pxa25x_cpu_pm_restore(unsigned long *sleep_save)
+ {
++ /* ensure not to come back here if it wasn't intended */
++ PSPR = 0;
++
+ /* restore registers */
+ RESTORE_GPLEVEL(0); RESTORE_GPLEVEL(1); RESTORE_GPLEVEL(2);
+ RESTORE(GPDR0); RESTORE(GPDR1); RESTORE(GPDR2);
+@@ -195,7 +201,12 @@ static void pxa25x_cpu_pm_restore(unsigned long *sleep_save)
+ RESTORE(GFER0); RESTORE(GFER1); RESTORE(GFER2);
+ RESTORE(PGSR0); RESTORE(PGSR1); RESTORE(PGSR2);
+
++ PSSR = PSSR_RDH | PSSR_PH;
++
+ RESTORE(CKEN);
++
++ ICLR = 0;
++ ICCR = 1;
+ RESTORE(ICMR);
+ RESTORE(PSTR);
+ }
+diff --git a/arch/arm/vfp/vfp.h b/arch/arm/vfp/vfp.h
+index 54a2ad6..791d023 100644
+--- a/arch/arm/vfp/vfp.h
++++ b/arch/arm/vfp/vfp.h
+@@ -361,10 +361,12 @@ u32 vfp_estimate_sqrt_significand(u32 exponent, u32 significand);
+ * OP_SCALAR - this operation always operates in scalar mode
+ * OP_SD - the instruction exceptionally writes to a single precision result.
+ * OP_DD - the instruction exceptionally writes to a double precision result.
++ * OP_SM - the instruction exceptionally reads from a single precision operand.
+ */
+ #define OP_SCALAR (1 << 0)
+ #define OP_SD (1 << 1)
+ #define OP_DD (1 << 1)
++#define OP_SM (1 << 2)
+
+ struct op {
+ u32 (* const fn)(int dd, int dn, int dm, u32 fpscr);
+diff --git a/arch/arm/vfp/vfpdouble.c b/arch/arm/vfp/vfpdouble.c
+index 190a09a..6cac43b 100644
+--- a/arch/arm/vfp/vfpdouble.c
++++ b/arch/arm/vfp/vfpdouble.c
+@@ -668,8 +668,8 @@ static struct op fops_ext[32] = {
+ [FEXT_TO_IDX(FEXT_FCMPZ)] = { vfp_double_fcmpz, OP_SCALAR },
+ [FEXT_TO_IDX(FEXT_FCMPEZ)] = { vfp_double_fcmpez, OP_SCALAR },
+ [FEXT_TO_IDX(FEXT_FCVT)] = { vfp_double_fcvts, OP_SCALAR|OP_SD },
+- [FEXT_TO_IDX(FEXT_FUITO)] = { vfp_double_fuito, OP_SCALAR },
+- [FEXT_TO_IDX(FEXT_FSITO)] = { vfp_double_fsito, OP_SCALAR },
++ [FEXT_TO_IDX(FEXT_FUITO)] = { vfp_double_fuito, OP_SCALAR|OP_SM },
++ [FEXT_TO_IDX(FEXT_FSITO)] = { vfp_double_fsito, OP_SCALAR|OP_SM },
+ [FEXT_TO_IDX(FEXT_FTOUI)] = { vfp_double_ftoui, OP_SCALAR|OP_SD },
+ [FEXT_TO_IDX(FEXT_FTOUIZ)] = { vfp_double_ftouiz, OP_SCALAR|OP_SD },
+ [FEXT_TO_IDX(FEXT_FTOSI)] = { vfp_double_ftosi, OP_SCALAR|OP_SD },
+@@ -1128,7 +1128,7 @@ u32 vfp_double_cpdo(u32 inst, u32 fpscr)
+ u32 exceptions = 0;
+ unsigned int dest;
+ unsigned int dn = vfp_get_dn(inst);
+- unsigned int dm = vfp_get_dm(inst);
++ unsigned int dm;
+ unsigned int vecitr, veclen, vecstride;
+ struct op *fop;
+
+@@ -1146,6 +1146,14 @@ u32 vfp_double_cpdo(u32 inst, u32 fpscr)
+ dest = vfp_get_dd(inst);
+
+ /*
++ * f[us]ito takes a sN operand, not a dN operand.
++ */
++ if (fop->flags & OP_SM)
++ dm = vfp_get_sm(inst);
++ else
++ dm = vfp_get_dm(inst);
++
++ /*
+ * If destination bank is zero, vector length is always '1'.
+ * ARM DDI0100F C5.1.3, C5.3.2.
+ */
+diff --git a/arch/cris/arch-v10/drivers/ds1302.c b/arch/cris/arch-v10/drivers/ds1302.c
+index 88eff7f..1d1936a 100644
+--- a/arch/cris/arch-v10/drivers/ds1302.c
++++ b/arch/cris/arch-v10/drivers/ds1302.c
+@@ -6,136 +6,9 @@
+ *!
+ *! Functions exported: ds1302_readreg, ds1302_writereg, ds1302_init
+ *!
+-*! $Log: ds1302.c,v $
+-*! Revision 1.18 2005/01/24 09:11:26 mikaelam
+-*! Minor changes to get DS1302 RTC chip driver to work
+-*!
+-*! Revision 1.17 2005/01/05 06:11:22 starvik
+-*! No need to do local_irq_disable after local_irq_save.
+-*!
+-*! Revision 1.16 2004/12/13 12:21:52 starvik
+-*! Added I/O and DMA allocators from Linux 2.4
+-*!
+-*! Revision 1.14 2004/08/24 06:48:43 starvik
+-*! Whitespace cleanup
+-*!
+-*! Revision 1.13 2004/05/28 09:26:59 starvik
+-*! Modified I2C initialization to work in 2.6.
+-*!
+-*! Revision 1.12 2004/05/14 07:58:03 starvik
+-*! Merge of changes from 2.4
+-*!
+-*! Revision 1.10 2004/02/04 09:25:12 starvik
+-*! Merge of Linux 2.6.2
+-*!
+-*! Revision 1.9 2003/07/04 08:27:37 starvik
+-*! Merge of Linux 2.5.74
+-*!
+-*! Revision 1.8 2003/04/09 05:20:47 starvik
+-*! Merge of Linux 2.5.67
+-*!
+-*! Revision 1.6 2003/01/09 14:42:51 starvik
+-*! Merge of Linux 2.5.55
+-*!
+-*! Revision 1.4 2002/12/11 13:13:57 starvik
+-*! Added arch/ to v10 specific includes
+-*! Added fix from Linux 2.4 in serial.c (flush_to_flip_buffer)
+-*!
+-*! Revision 1.3 2002/11/20 11:56:10 starvik
+-*! Merge of Linux 2.5.48
+-*!
+-*! Revision 1.2 2002/11/18 13:16:06 starvik
+-*! Linux 2.5 port of latest 2.4 drivers
+-*!
+-*! Revision 1.15 2002/10/11 16:14:33 johana
+-*! Added CONFIG_ETRAX_DS1302_TRICKLE_CHARGE and initial setting of the
+-*! trcklecharge register.
+-*!
+-*! Revision 1.14 2002/10/10 12:15:38 magnusmn
+-*! Added support for having the RST signal on bit g0
+-*!
+-*! Revision 1.13 2002/05/29 15:16:08 johana
+-*! Removed unused variables.
+-*!
+-*! Revision 1.12 2002/04/10 15:35:25 johana
+-*! Moved probe function closer to init function and marked it __init.
+-*!
+-*! Revision 1.11 2001/06/14 12:35:52 jonashg
+-*! The ATA hack is back. It is unfortunately the only way to set g27 to output.
+-*!
+-*! Revision 1.9 2001/06/14 10:00:14 jonashg
+-*! No need for tempudelay to be inline anymore (had to adjust the usec to
+-*! loops conversion because of this to make it slow enough to be a udelay).
+-*!
+-*! Revision 1.8 2001/06/14 08:06:32 jonashg
+-*! Made tempudelay delay usecs (well, just a tad more).
+-*!
+-*! Revision 1.7 2001/06/13 14:18:11 jonashg
+-*! Only allow processes with SYS_TIME capability to set time and charge.
+-*!
+-*! Revision 1.6 2001/06/12 15:22:07 jonashg
+-*! * Made init function __init.
+-*! * Parameter to out_byte() is unsigned char.
+-*! * The magic number 42 has got a name.
+-*! * Removed comment about /proc (nothing is exported there).
+-*!
+-*! Revision 1.5 2001/06/12 14:35:13 jonashg
+-*! Gave the module a name and added it to printk's.
+-*!
+-*! Revision 1.4 2001/05/31 14:53:40 jonashg
+-*! Made tempudelay() inline so that the watchdog doesn't reset (see
+-*! function comment).
+-*!
+-*! Revision 1.3 2001/03/26 16:03:06 bjornw
+-*! Needs linux/config.h
+-*!
+-*! Revision 1.2 2001/03/20 19:42:00 bjornw
+-*! Use the ETRAX prefix on the DS1302 options
+-*!
+-*! Revision 1.1 2001/03/20 09:13:50 magnusmn
+-*! Linux 2.4 port
+-*!
+-*! Revision 1.10 2000/07/05 15:38:23 bjornw
+-*! Dont update kernel time when a RTC_SET_TIME is done
+-*!
+-*! Revision 1.9 2000/03/02 15:42:59 macce
+-*! * Hack to make RTC work on all 2100/2400
+-*!
+-*! Revision 1.8 2000/02/23 16:59:18 torbjore
+-*! added setup of R_GEN_CONFIG when RTC is connected to the generic port.
+-*!
+-*! Revision 1.7 2000/01/17 15:51:43 johana
+-*! Added RTC_SET_CHARGE ioctl to enable trickle charger.
+-*!
+-*! Revision 1.6 1999/10/27 13:19:47 bjornw
+-*! Added update_xtime_from_cmos which reads back the updated RTC into the kernel.
+-*! /dev/rtc calls it now.
+-*!
+-*! Revision 1.5 1999/10/27 12:39:37 bjornw
+-*! Disabled superuser check. Anyone can now set the time.
+-*!
+-*! Revision 1.4 1999/09/02 13:27:46 pkj
+-*! Added shadow for R_PORT_PB_CONFIG.
+-*! Renamed port_g_shadow to port_g_data_shadow.
+-*!
+-*! Revision 1.3 1999/09/02 08:28:06 pkj
+-*! Made it possible to select either port PB or the generic port for the RST
+-*! signal line to the DS1302 RTC.
+-*! Also make sure the RST bit is configured as output on Port PB (if used).
+-*!
+-*! Revision 1.2 1999/09/01 14:47:20 bjornw
+-*! Added support for /dev/rtc operations with ioctl RD_TIME and SET_TIME to read
+-*! and set the date. Register as major 121.
+-*!
+-*! Revision 1.1 1999/09/01 09:45:29 bjornw
+-*! Implemented a DS1302 RTC driver.
+-*!
+-*!
+ *! ---------------------------------------------------------------------------
+ *!
+-*! (C) Copyright 1999, 2000, 2001, 2002, 2003, 2004 Axis Communications AB, LUND, SWEDEN
+-*!
+-*! $Id: ds1302.c,v 1.18 2005/01/24 09:11:26 mikaelam Exp $
++*! (C) Copyright 1999-2007 Axis Communications AB, LUND, SWEDEN
+ *!
+ *!***************************************************************************/
+
+@@ -156,6 +29,8 @@
+ #include <asm/rtc.h>
+ #include <asm/arch/io_interface_mux.h>
+
++#include "i2c.h"
++
+ #define RTC_MAJOR_NR 121 /* local major, change later */
+
+ static const char ds1302_name[] = "ds1302";
+diff --git a/arch/cris/arch-v10/kernel/signal.c b/arch/cris/arch-v10/kernel/signal.c
+index 41d4a5f..b6be705 100644
+--- a/arch/cris/arch-v10/kernel/signal.c
++++ b/arch/cris/arch-v10/kernel/signal.c
+@@ -7,7 +7,7 @@
+ *
+ * Ideas also taken from arch/arm.
+ *
+- * Copyright (C) 2000, 2001 Axis Communications AB
++ * Copyright (C) 2000-2007 Axis Communications AB
+ *
+ * Authors: Bjorn Wesen (bjornw at axis.com)
+ *
+@@ -40,84 +40,30 @@
+ */
+ #define RESTART_CRIS_SYS(regs) regs->r10 = regs->orig_r10; regs->irp -= 2;
+
+-int do_signal(int canrestart, sigset_t *oldset, struct pt_regs *regs);
++void do_signal(int canrestart, struct pt_regs *regs);
+
+ /*
+- * Atomically swap in the new signal mask, and wait for a signal. Define
++ * Atomically swap in the new signal mask, and wait for a signal. Define
+ * dummy arguments to be able to reach the regs argument. (Note that this
+ * arrangement relies on old_sigset_t occupying one register.)
+ */
+-int
+-sys_sigsuspend(old_sigset_t mask, long r11, long r12, long r13, long mof,
+- long srp, struct pt_regs *regs)
++int sys_sigsuspend(old_sigset_t mask, long r11, long r12, long r13, long mof,
++ long srp, struct pt_regs *regs)
+ {
+- sigset_t saveset;
+-
+ mask &= _BLOCKABLE;
+ spin_lock_irq(¤t->sighand->siglock);
+- saveset = current->blocked;
++ current->saved_sigmask = current->blocked;
+ siginitset(¤t->blocked, mask);
+ recalc_sigpending();
+ spin_unlock_irq(¤t->sighand->siglock);
+-
+- regs->r10 = -EINTR;
+- while (1) {
+- current->state = TASK_INTERRUPTIBLE;
+- schedule();
+- if (do_signal(0, &saveset, regs))
+- /* We will get here twice: once to call the signal
+- handler, then again to return from the
+- sigsuspend system call. When calling the
+- signal handler, R10 holds the signal number as
+- set through do_signal. The sigsuspend call
+- will return with the restored value set above;
+- always -EINTR. */
+- return regs->r10;
+- }
++ current->state = TASK_INTERRUPTIBLE;
++ schedule();
++ set_thread_flag(TIF_RESTORE_SIGMASK);
++ return -ERESTARTNOHAND;
+ }
+
+-/* Define dummy arguments to be able to reach the regs argument. (Note that
+- * this arrangement relies on size_t occupying one register.)
+- */
+-int
+-sys_rt_sigsuspend(sigset_t *unewset, size_t sigsetsize, long r12, long r13,
+- long mof, long srp, struct pt_regs *regs)
+-{
+- sigset_t saveset, newset;
+-
+- /* XXX: Don't preclude handling different sized sigset_t's. */
+- if (sigsetsize != sizeof(sigset_t))
+- return -EINVAL;
+-
+- if (copy_from_user(&newset, unewset, sizeof(newset)))
+- return -EFAULT;
+- sigdelsetmask(&newset, ~_BLOCKABLE);
+-
+- spin_lock_irq(¤t->sighand->siglock);
+- saveset = current->blocked;
+- current->blocked = newset;
+- recalc_sigpending();
+- spin_unlock_irq(¤t->sighand->siglock);
+-
+- regs->r10 = -EINTR;
+- while (1) {
+- current->state = TASK_INTERRUPTIBLE;
+- schedule();
+- if (do_signal(0, &saveset, regs))
+- /* We will get here twice: once to call the signal
+- handler, then again to return from the
+- sigsuspend system call. When calling the
+- signal handler, R10 holds the signal number as
+- set through do_signal. The sigsuspend call
+- will return with the restored value set above;
+- always -EINTR. */
+- return regs->r10;
+- }
+-}
+-
+-int
+-sys_sigaction(int sig, const struct old_sigaction __user *act,
+- struct old_sigaction *oact)
++int sys_sigaction(int sig, const struct old_sigaction __user *act,
++ struct old_sigaction *oact)
+ {
+ struct k_sigaction new_ka, old_ka;
+ int ret;
+@@ -147,8 +93,7 @@ sys_sigaction(int sig, const struct old_sigaction __user *act,
+ return ret;
+ }
+
+-int
+-sys_sigaltstack(const stack_t *uss, stack_t __user *uoss)
++int sys_sigaltstack(const stack_t *uss, stack_t __user *uoss)
+ {
+ return do_sigaltstack(uss, uoss, rdusp());
+ }
+@@ -205,7 +150,7 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)
+
+ /* TODO: the other ports use regs->orig_XX to disable syscall checks
+ * after this completes, but we don't use that mechanism. maybe we can
+- * use it now ?
++ * use it now ?
+ */
+
+ return err;
+@@ -216,7 +161,7 @@ badframe:
+
+ /* Define dummy arguments to be able to reach the regs argument. */
+
+-asmlinkage int sys_sigreturn(long r10, long r11, long r12, long r13, long mof,
++asmlinkage int sys_sigreturn(long r10, long r11, long r12, long r13, long mof,
+ long srp, struct pt_regs *regs)
+ {
+ struct sigframe __user *frame = (struct sigframe *)rdusp();
+@@ -243,7 +188,7 @@ asmlinkage int sys_sigreturn(long r10, long r11, long r12, long r13, long mof,
+ current->blocked = set;
+ recalc_sigpending();
+ spin_unlock_irq(¤t->sighand->siglock);
+-
++
+ if (restore_sigcontext(regs, &frame->sc))
+ goto badframe;
+
+@@ -254,11 +199,11 @@ asmlinkage int sys_sigreturn(long r10, long r11, long r12, long r13, long mof,
+ badframe:
+ force_sig(SIGSEGV, current);
+ return 0;
+-}
++}
+
+ /* Define dummy arguments to be able to reach the regs argument. */
+
+-asmlinkage int sys_rt_sigreturn(long r10, long r11, long r12, long r13,
++asmlinkage int sys_rt_sigreturn(long r10, long r11, long r12, long r13,
+ long mof, long srp, struct pt_regs *regs)
+ {
+ struct rt_sigframe __user *frame = (struct rt_sigframe *)rdusp();
+@@ -282,7 +227,7 @@ asmlinkage int sys_rt_sigreturn(long r10, long r11, long r12, long r13,
+ current->blocked = set;
+ recalc_sigpending();
+ spin_unlock_irq(¤t->sighand->siglock);
+-
++
+ if (restore_sigcontext(regs, &frame->uc.uc_mcontext))
+ goto badframe;
+
+@@ -294,14 +239,14 @@ asmlinkage int sys_rt_sigreturn(long r10, long r11, long r12, long r13,
+ badframe:
+ force_sig(SIGSEGV, current);
+ return 0;
+-}
++}
+
+ /*
+ * Set up a signal frame.
+ */
+
+-static int
+-setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs, unsigned long mask)
++static int setup_sigcontext(struct sigcontext __user *sc,
++ struct pt_regs *regs, unsigned long mask)
+ {
+ int err = 0;
+ unsigned long usp = rdusp();
+@@ -324,10 +269,11 @@ setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs, unsigned lo
+ return err;
+ }
+
+-/* figure out where we want to put the new signal frame - usually on the stack */
++/* Figure out where we want to put the new signal frame
++ * - usually on the stack. */
+
+ static inline void __user *
+-get_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
++get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size)
+ {
+ unsigned long sp = rdusp();
+
+@@ -345,15 +291,15 @@ get_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
+ }
+
+ /* grab and setup a signal frame.
+- *
++ *
+ * basically we stack a lot of state info, and arrange for the
+ * user-mode program to return to the kernel using either a
+ * trampoline which performs the syscall sigreturn, or a provided
+ * user-mode trampoline.
+ */
+
+-static void setup_frame(int sig, struct k_sigaction *ka,
+- sigset_t *set, struct pt_regs * regs)
++static int setup_frame(int sig, struct k_sigaction *ka,
++ sigset_t *set, struct pt_regs *regs)
+ {
+ struct sigframe __user *frame;
+ unsigned long return_ip;
+@@ -401,14 +347,15 @@ static void setup_frame(int sig, struct k_sigaction *ka,
+
+ wrusp((unsigned long)frame);
+
+- return;
++ return 0;
+
+ give_sigsegv:
+ force_sigsegv(sig, current);
++ return -EFAULT;
+ }
+
+-static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
+- sigset_t *set, struct pt_regs * regs)
++static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
++ sigset_t *set, struct pt_regs *regs)
+ {
+ struct rt_sigframe __user *frame;
+ unsigned long return_ip;
+@@ -443,9 +390,10 @@ static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
+ /* trampoline - the desired return ip is the retcode itself */
+ return_ip = (unsigned long)&frame->retcode;
+ /* This is movu.w __NR_rt_sigreturn, r9; break 13; */
+- err |= __put_user(0x9c5f, (short __user*)(frame->retcode+0));
+- err |= __put_user(__NR_rt_sigreturn, (short __user*)(frame->retcode+2));
+- err |= __put_user(0xe93d, (short __user*)(frame->retcode+4));
++ err |= __put_user(0x9c5f, (short __user *)(frame->retcode+0));
++ err |= __put_user(__NR_rt_sigreturn,
++ (short __user *)(frame->retcode+2));
++ err |= __put_user(0xe93d, (short __user *)(frame->retcode+4));
+ }
+
+ if (err)
+@@ -455,73 +403,81 @@ static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
+
+ /* Set up registers for signal handler */
+
+- regs->irp = (unsigned long) ka->sa.sa_handler; /* what we enter NOW */
+- regs->srp = return_ip; /* what we enter LATER */
+- regs->r10 = sig; /* first argument is signo */
+- regs->r11 = (unsigned long) &frame->info; /* second argument is (siginfo_t *) */
+- regs->r12 = 0; /* third argument is unused */
+-
+- /* actually move the usp to reflect the stacked frame */
+-
++ /* What we enter NOW */
++ regs->irp = (unsigned long) ka->sa.sa_handler;
++ /* What we enter LATER */
++ regs->srp = return_ip;
++ /* First argument is signo */
++ regs->r10 = sig;
++ /* Second argument is (siginfo_t *) */
++ regs->r11 = (unsigned long)&frame->info;
++ /* Third argument is unused */
++ regs->r12 = 0;
++
++ /* Actually move the usp to reflect the stacked frame */
+ wrusp((unsigned long)frame);
+
+- return;
++ return 0;
+
+ give_sigsegv:
+ force_sigsegv(sig, current);
++ return -EFAULT;
+ }
+
+ /*
+ * OK, we're invoking a handler
+- */
++ */
+
+-static inline void
+-handle_signal(int canrestart, unsigned long sig,
+- siginfo_t *info, struct k_sigaction *ka,
+- sigset_t *oldset, struct pt_regs * regs)
++static inline int handle_signal(int canrestart, unsigned long sig,
++ siginfo_t *info, struct k_sigaction *ka,
++ sigset_t *oldset, struct pt_regs *regs)
+ {
++ int ret;
++
+ /* Are we from a system call? */
+ if (canrestart) {
+ /* If so, check system call restarting.. */
+ switch (regs->r10) {
+- case -ERESTART_RESTARTBLOCK:
+- case -ERESTARTNOHAND:
+- /* ERESTARTNOHAND means that the syscall should only be
+- restarted if there was no handler for the signal, and since
+- we only get here if there is a handler, we don't restart */
++ case -ERESTART_RESTARTBLOCK:
++ case -ERESTARTNOHAND:
++ /* ERESTARTNOHAND means that the syscall should
++ * only be restarted if there was no handler for
++ * the signal, and since we only get here if there
++ * is a handler, we don't restart */
++ regs->r10 = -EINTR;
++ break;
++ case -ERESTARTSYS:
++ /* ERESTARTSYS means to restart the syscall if
++ * there is no handler or the handler was
++ * registered with SA_RESTART */
++ if (!(ka->sa.sa_flags & SA_RESTART)) {
+ regs->r10 = -EINTR;
+ break;
+-
+- case -ERESTARTSYS:
+- /* ERESTARTSYS means to restart the syscall if there is no
+- handler or the handler was registered with SA_RESTART */
+- if (!(ka->sa.sa_flags & SA_RESTART)) {
+- regs->r10 = -EINTR;
+- break;
+- }
+- /* fallthrough */
+- case -ERESTARTNOINTR:
+- /* ERESTARTNOINTR means that the syscall should be called again
+- after the signal handler returns. */
+- RESTART_CRIS_SYS(regs);
++ }
++ /* fallthrough */
++ case -ERESTARTNOINTR:
++ /* ERESTARTNOINTR means that the syscall should
++ * be called again after the signal handler returns. */
++ RESTART_CRIS_SYS(regs);
+ }
+ }
+
+ /* Set up the stack frame */
+ if (ka->sa.sa_flags & SA_SIGINFO)
+- setup_rt_frame(sig, ka, info, oldset, regs);
++ ret = setup_rt_frame(sig, ka, info, oldset, regs);
+ else
+- setup_frame(sig, ka, oldset, regs);
+-
+- if (ka->sa.sa_flags & SA_ONESHOT)
+- ka->sa.sa_handler = SIG_DFL;
+-
+- spin_lock_irq(¤t->sighand->siglock);
+- sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
+- if (!(ka->sa.sa_flags & SA_NODEFER))
+- sigaddset(¤t->blocked,sig);
+- recalc_sigpending();
+- spin_unlock_irq(¤t->sighand->siglock);
++ ret = setup_frame(sig, ka, oldset, regs);
++
++ if (ret == 0) {
++ spin_lock_irq(¤t->sighand->siglock);
++ sigorsets(¤t->blocked, ¤t->blocked,
++ &ka->sa.sa_mask);
++ if (!(ka->sa.sa_flags & SA_NODEFER))
++ sigaddset(¤t->blocked, sig);
++ recalc_sigpending();
++ spin_unlock_irq(¤t->sighand->siglock);
++ }
++ return ret;
+ }
+
+ /*
+@@ -536,11 +492,12 @@ handle_signal(int canrestart, unsigned long sig,
+ * mode below.
+ */
+
+-int do_signal(int canrestart, sigset_t *oldset, struct pt_regs *regs)
++void do_signal(int canrestart, struct pt_regs *regs)
+ {
+ siginfo_t info;
+ int signr;
+ struct k_sigaction ka;
++ sigset_t *oldset;
+
+ /*
+ * We want the common case to go fast, which
+@@ -549,16 +506,26 @@ int do_signal(int canrestart, sigset_t *oldset, struct pt_regs *regs)
+ * if so.
+ */
+ if (!user_mode(regs))
+- return 1;
++ return;
+
+- if (!oldset)
++ if (test_thread_flag(TIF_RESTORE_SIGMASK))
++ oldset = ¤t->saved_sigmask;
++ else
+ oldset = ¤t->blocked;
+
+ signr = get_signal_to_deliver(&info, &ka, regs, NULL);
+ if (signr > 0) {
+ /* Whee! Actually deliver the signal. */
+- handle_signal(canrestart, signr, &info, &ka, oldset, regs);
+- return 1;
++ if (handle_signal(canrestart, signr, &info, &ka,
++ oldset, regs)) {
++ /* a signal was successfully delivered; the saved
++ * sigmask will have been stored in the signal frame,
++ * and will be restored by sigreturn, so we can simply
++ * clear the TIF_RESTORE_SIGMASK flag */
++ if (test_thread_flag(TIF_RESTORE_SIGMASK))
++ clear_thread_flag(TIF_RESTORE_SIGMASK);
++ }
++ return;
+ }
+
+ /* Did we come from a system call? */
+@@ -569,10 +536,16 @@ int do_signal(int canrestart, sigset_t *oldset, struct pt_regs *regs)
+ regs->r10 == -ERESTARTNOINTR) {
+ RESTART_CRIS_SYS(regs);
+ }
+- if (regs->r10 == -ERESTART_RESTARTBLOCK){
++ if (regs->r10 == -ERESTART_RESTARTBLOCK) {
+ regs->r10 = __NR_restart_syscall;
+ regs->irp -= 2;
+ }
+ }
+- return 0;
++
++ /* if there's no signal to deliver, we just put the saved sigmask
++ * back */
++ if (test_thread_flag(TIF_RESTORE_SIGMASK)) {
++ clear_thread_flag(TIF_RESTORE_SIGMASK);
++ sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL);
++ }
+ }
+diff --git a/arch/cris/arch-v10/kernel/time.c b/arch/cris/arch-v10/kernel/time.c
+index 5976f61..9310a7b 100644
+--- a/arch/cris/arch-v10/kernel/time.c
++++ b/arch/cris/arch-v10/kernel/time.c
+@@ -13,6 +13,7 @@
+ #include <linux/swap.h>
+ #include <linux/sched.h>
+ #include <linux/init.h>
++#include <linux/vmstat.h>
+ #include <asm/arch/svinto.h>
+ #include <asm/types.h>
+ #include <asm/signal.h>
+diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
+index c6fc405..b22c043 100644
+--- a/arch/mips/Kconfig
++++ b/arch/mips/Kconfig
+@@ -59,6 +59,8 @@ config BCM47XX
+ select SYS_SUPPORTS_LITTLE_ENDIAN
+ select SSB
+ select SSB_DRIVER_MIPS
++ select SSB_DRIVER_EXTIF
++ select SSB_PCICORE_HOSTMODE if PCI
+ select GENERIC_GPIO
+ select SYS_HAS_EARLY_PRINTK
+ select CFE
+@@ -992,8 +994,6 @@ config BOOT_ELF64
+
+ menu "CPU selection"
+
+-source "kernel/time/Kconfig"
+-
+ choice
+ prompt "CPU type"
+ default CPU_R4X00
+@@ -1768,6 +1768,8 @@ config NR_CPUS
+ performance should round up your number of processors to the next
+ power of two.
+
++source "kernel/time/Kconfig"
++
+ #
+ # Timer Interrupt Frequency Configuration
+ #
+diff --git a/arch/mips/au1000/common/pci.c b/arch/mips/au1000/common/pci.c
+index 6fa70a3..ce77148 100644
+--- a/arch/mips/au1000/common/pci.c
++++ b/arch/mips/au1000/common/pci.c
+@@ -1,8 +1,8 @@
+ /*
+ * BRIEF MODULE DESCRIPTION
+- * Alchemy/AMD Au1x00 pci support.
++ * Alchemy/AMD Au1x00 PCI support.
+ *
+- * Copyright 2001,2002,2003 MontaVista Software Inc.
++ * Copyright 2001-2003, 2007 MontaVista Software Inc.
+ * Author: MontaVista Software, Inc.
+ * ppopov at mvista.com or source at mvista.com
+ *
+@@ -66,6 +66,8 @@ static unsigned long virt_io_addr;
+
+ static int __init au1x_pci_setup(void)
+ {
++ extern void au1x_pci_cfg_init(void);
++
+ #if defined(CONFIG_SOC_AU1500) || defined(CONFIG_SOC_AU1550)
+ virt_io_addr = (unsigned long)ioremap(Au1500_PCI_IO_START,
+ Au1500_PCI_IO_END - Au1500_PCI_IO_START + 1);
+@@ -94,6 +96,8 @@ static int __init au1x_pci_setup(void)
+ set_io_port_base(virt_io_addr);
+ #endif
+
++ au1x_pci_cfg_init();
++
+ register_pci_controller(&au1x_controller);
+ return 0;
+ }
+diff --git a/arch/mips/cobalt/console.c b/arch/mips/cobalt/console.c
+index db330e8..d1ba701 100644
+--- a/arch/mips/cobalt/console.c
++++ b/arch/mips/cobalt/console.c
+@@ -4,10 +4,15 @@
+ #include <linux/io.h>
+ #include <linux/serial_reg.h>
+
++#include <cobalt.h>
++
+ #define UART_BASE ((void __iomem *)CKSEG1ADDR(0x1c800000))
+
+ void prom_putchar(char c)
+ {
++ if (cobalt_board_id <= COBALT_BRD_ID_QUBE1)
++ return;
++
+ while (!(readb(UART_BASE + UART_LSR) & UART_LSR_THRE))
+ ;
+
+diff --git a/arch/mips/kernel/head.S b/arch/mips/kernel/head.S
+index 2367687..50be56c 100644
+--- a/arch/mips/kernel/head.S
++++ b/arch/mips/kernel/head.S
+@@ -136,7 +136,8 @@ EXPORT(_stext)
+ * kernel load address. This is needed because this platform does
+ * not have a ELF loader yet.
+ */
+- __INIT
++FEXPORT(__kernel_entry)
++ j kernel_entry
+ #endif
+
+ __INIT_REFOK
+diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c
+index 7f6ddcb..f8a535a 100644
+--- a/arch/mips/kernel/setup.c
++++ b/arch/mips/kernel/setup.c
+@@ -269,7 +269,7 @@ static void __init bootmem_init(void)
+
+ static void __init bootmem_init(void)
+ {
+- unsigned long init_begin, reserved_end;
++ unsigned long reserved_end;
+ unsigned long mapstart = ~0UL;
+ unsigned long bootmap_size;
+ int i;
+@@ -344,7 +344,6 @@ static void __init bootmem_init(void)
+ min_low_pfn, max_low_pfn);
+
+
+- init_begin = PFN_UP(__pa_symbol(&__init_begin));
+ for (i = 0; i < boot_mem_map.nr_map; i++) {
+ unsigned long start, end;
+
+@@ -352,8 +351,8 @@ static void __init bootmem_init(void)
+ end = PFN_DOWN(boot_mem_map.map[i].addr
+ + boot_mem_map.map[i].size);
+
+- if (start <= init_begin)
+- start = init_begin;
++ if (start <= min_low_pfn)
++ start = min_low_pfn;
+ if (start >= end)
+ continue;
+
+diff --git a/arch/mips/kernel/time.c b/arch/mips/kernel/time.c
+index 1ecfbb7..2995be1 100644
+--- a/arch/mips/kernel/time.c
++++ b/arch/mips/kernel/time.c
+@@ -147,9 +147,9 @@ static __init int cpu_has_mfc0_count_bug(void)
+ return 1;
+
+ /*
+- * I don't have erratas for newer R4400 so be paranoid.
++ * we assume newer revisions are ok
+ */
+- return 1;
++ return 0;
+ }
+
+ return 0;
+diff --git a/arch/mips/lasat/image/Makefile b/arch/mips/lasat/image/Makefile
+index 5332449..460626b 100644
+--- a/arch/mips/lasat/image/Makefile
++++ b/arch/mips/lasat/image/Makefile
+@@ -12,11 +12,11 @@ endif
+
+ MKLASATIMG = mklasatimg
+ MKLASATIMG_ARCH = mq2,mqpro,sp100,sp200
+-KERNEL_IMAGE = $(TOPDIR)/vmlinux
++KERNEL_IMAGE = vmlinux
+ KERNEL_START = $(shell $(NM) $(KERNEL_IMAGE) | grep " _text" | cut -f1 -d\ )
+ KERNEL_ENTRY = $(shell $(NM) $(KERNEL_IMAGE) | grep kernel_entry | cut -f1 -d\ )
+
+-LDSCRIPT= -L$(obj) -Tromscript.normal
++LDSCRIPT= -L$(srctree)/$(src) -Tromscript.normal
+
+ HEAD_DEFINES := -D_kernel_start=0x$(KERNEL_START) \
+ -D_kernel_entry=0x$(KERNEL_ENTRY) \
+@@ -24,7 +24,7 @@ HEAD_DEFINES := -D_kernel_start=0x$(KERNEL_START) \
+ -D TIMESTAMP=$(shell date +%s)
+
+ $(obj)/head.o: $(obj)/head.S $(KERNEL_IMAGE)
+- $(CC) -fno-pic $(HEAD_DEFINES) -I$(TOPDIR)/include -c -o $@ $<
++ $(CC) -fno-pic $(HEAD_DEFINES) $(LINUXINCLUDE) -c -o $@ $<
+
+ OBJECTS = head.o kImage.o
+
+diff --git a/arch/mips/mips-boards/generic/memory.c b/arch/mips/mips-boards/generic/memory.c
+index 2c5c27c..dc272c1 100644
+--- a/arch/mips/mips-boards/generic/memory.c
++++ b/arch/mips/mips-boards/generic/memory.c
+@@ -169,7 +169,6 @@ void __init prom_meminit(void)
+
+ void __init prom_free_prom_memory(void)
+ {
+-#if 0 /* for now ... */
+ unsigned long addr;
+ int i;
+
+@@ -181,5 +180,4 @@ void __init prom_free_prom_memory(void)
+ free_init_pages("prom memory",
+ addr, addr + boot_mem_map.map[i].size);
+ }
+-#endif
+ }
+diff --git a/arch/mips/mips-boards/generic/reset.c b/arch/mips/mips-boards/generic/reset.c
+index 7a1bb51..583d468 100644
+--- a/arch/mips/mips-boards/generic/reset.c
++++ b/arch/mips/mips-boards/generic/reset.c
+@@ -39,16 +39,18 @@ static void atlas_machine_power_off(void);
+
+ static void mips_machine_restart(char *command)
+ {
+- unsigned int __iomem *softres_reg = ioremap(SOFTRES_REG, sizeof(unsigned int));
++ unsigned int __iomem *softres_reg =
++ ioremap(SOFTRES_REG, sizeof(unsigned int));
+
+- writew(GORESET, softres_reg);
++ __raw_writel(GORESET, softres_reg);
+ }
+
+ static void mips_machine_halt(void)
+ {
+- unsigned int __iomem *softres_reg = ioremap(SOFTRES_REG, sizeof(unsigned int));
++ unsigned int __iomem *softres_reg =
++ ioremap(SOFTRES_REG, sizeof(unsigned int));
+
+- writew(GORESET, softres_reg);
++ __raw_writel(GORESET, softres_reg);
+ }
+
+ #if defined(CONFIG_MIPS_ATLAS)
+diff --git a/arch/mips/mm/dma-default.c b/arch/mips/mm/dma-default.c
+index ae76795..810535d 100644
+--- a/arch/mips/mm/dma-default.c
++++ b/arch/mips/mm/dma-default.c
+@@ -45,7 +45,7 @@ static gfp_t massage_gfp_flags(const struct device *dev, gfp_t gfp)
+ /* ignore region specifiers */
+ gfp &= ~(__GFP_DMA | __GFP_DMA32 | __GFP_HIGHMEM);
+
+-#ifdef CONFIG_ZONE_DMA32
++#ifdef CONFIG_ZONE_DMA
+ if (dev == NULL)
+ gfp |= __GFP_DMA;
+ else if (dev->coherent_dma_mask < DMA_BIT_MASK(24))
+diff --git a/arch/mips/pci/fixup-cobalt.c b/arch/mips/pci/fixup-cobalt.c
+index f7df114..9553b14 100644
+--- a/arch/mips/pci/fixup-cobalt.c
++++ b/arch/mips/pci/fixup-cobalt.c
+@@ -177,7 +177,7 @@ static char irq_tab_raq2[] __initdata = {
+
+ int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
+ {
+- if (cobalt_board_id < COBALT_BRD_ID_QUBE2)
++ if (cobalt_board_id <= COBALT_BRD_ID_QUBE1)
+ return irq_tab_qube1[slot];
+
+ if (cobalt_board_id == COBALT_BRD_ID_RAQ2)
+diff --git a/arch/mips/pci/ops-au1000.c b/arch/mips/pci/ops-au1000.c
+index 6b29904..1314bd5 100644
+--- a/arch/mips/pci/ops-au1000.c
++++ b/arch/mips/pci/ops-au1000.c
+@@ -1,8 +1,8 @@
+ /*
+ * BRIEF MODULE DESCRIPTION
+- * Alchemy/AMD Au1x00 pci support.
++ * Alchemy/AMD Au1x00 PCI support.
+ *
+- * Copyright 2001,2002,2003 MontaVista Software Inc.
++ * Copyright 2001-2003, 2007 MontaVista Software Inc.
+ * Author: MontaVista Software, Inc.
+ * ppopov at mvista.com or source at mvista.com
+ *
+@@ -69,10 +69,27 @@ void mod_wired_entry(int entry, unsigned long entrylo0,
+ write_c0_pagemask(old_pagemask);
+ }
+
+-struct vm_struct *pci_cfg_vm;
++static struct vm_struct *pci_cfg_vm;
+ static int pci_cfg_wired_entry;
+-static int first_cfg = 1;
+-unsigned long last_entryLo0, last_entryLo1;
++static unsigned long last_entryLo0, last_entryLo1;
++
++/*
++ * We can't ioremap the entire pci config space because it's too large.
++ * Nor can we call ioremap dynamically because some device drivers use
++ * the PCI config routines from within interrupt handlers and that
++ * becomes a problem in get_vm_area(). We use one wired TLB to handle
++ * all config accesses for all busses.
++ */
++void __init au1x_pci_cfg_init(void)
++{
++ /* Reserve a wired entry for PCI config accesses */
++ pci_cfg_vm = get_vm_area(0x2000, VM_IOREMAP);
++ if (!pci_cfg_vm)
++ panic(KERN_ERR "PCI unable to get vm area\n");
++ pci_cfg_wired_entry = read_c0_wired();
++ add_wired_entry(0, 0, (unsigned long)pci_cfg_vm->addr, PM_4K);
++ last_entryLo0 = last_entryLo1 = 0xffffffff;
++}
+
+ static int config_access(unsigned char access_type, struct pci_bus *bus,
+ unsigned int dev_fn, unsigned char where,
+@@ -97,27 +114,6 @@ static int config_access(unsigned char access_type, struct pci_bus *bus,
+ Au1500_PCI_STATCMD);
+ au_sync_udelay(1);
+
+- /*
+- * We can't ioremap the entire pci config space because it's
+- * too large. Nor can we call ioremap dynamically because some
+- * device drivers use the pci config routines from within
+- * interrupt handlers and that becomes a problem in get_vm_area().
+- * We use one wired tlb to handle all config accesses for all
+- * busses. To improve performance, if the current device
+- * is the same as the last device accessed, we don't touch the
+- * tlb.
+- */
+- if (first_cfg) {
+- /* reserve a wired entry for pci config accesses */
+- first_cfg = 0;
+- pci_cfg_vm = get_vm_area(0x2000, VM_IOREMAP);
+- if (!pci_cfg_vm)
+- panic(KERN_ERR "PCI unable to get vm area\n");
+- pci_cfg_wired_entry = read_c0_wired();
+- add_wired_entry(0, 0, (unsigned long)pci_cfg_vm->addr, PM_4K);
+- last_entryLo0 = last_entryLo1 = 0xffffffff;
+- }
+-
+ /* Allow board vendors to implement their own off-chip idsel.
+ * If it doesn't succeed, may as well bail out at this point.
+ */
+@@ -144,9 +140,12 @@ static int config_access(unsigned char access_type, struct pci_bus *bus,
+ /* page boundary */
+ cfg_base = cfg_base & PAGE_MASK;
+
++ /*
++ * To improve performance, if the current device is the same as
++ * the last device accessed, we don't touch the TLB.
++ */
+ entryLo0 = (6 << 26) | (cfg_base >> 6) | (2 << 3) | 7;
+ entryLo1 = (6 << 26) | (cfg_base >> 6) | (0x1000 >> 6) | (2 << 3) | 7;
+-
+ if ((entryLo0 != last_entryLo0) || (entryLo1 != last_entryLo1)) {
+ mod_wired_entry(pci_cfg_wired_entry, entryLo0, entryLo1,
+ (unsigned long)pci_cfg_vm->addr, PM_4K);
+diff --git a/arch/mips/pci/ops-mace.c b/arch/mips/pci/ops-mace.c
+index fe54514..e958818 100644
+--- a/arch/mips/pci/ops-mace.c
++++ b/arch/mips/pci/ops-mace.c
+@@ -42,6 +42,10 @@ static int
+ mace_pci_read_config(struct pci_bus *bus, unsigned int devfn,
+ int reg, int size, u32 *val)
+ {
++ u32 control = mace->pci.control;
++
++ /* disable master aborts interrupts during config read */
++ mace->pci.control = control & ~MACEPCI_CONTROL_MAR_INT;
+ mace->pci.config_addr = mkaddr(bus, devfn, reg);
+ switch (size) {
+ case 1:
+@@ -54,6 +58,9 @@ mace_pci_read_config(struct pci_bus *bus, unsigned int devfn,
+ *val = mace->pci.config_data.l;
+ break;
+ }
++ /* ack possible master abort */
++ mace->pci.error &= ~MACEPCI_ERROR_MASTER_ABORT;
++ mace->pci.control = control;
+
+ DPRINTK("read%d: reg=%08x,val=%02x\n", size * 8, reg, *val);
+
+diff --git a/arch/mips/pci/pci-ip32.c b/arch/mips/pci/pci-ip32.c
+index 618ea7d..532b561 100644
+--- a/arch/mips/pci/pci-ip32.c
++++ b/arch/mips/pci/pci-ip32.c
+@@ -119,6 +119,7 @@ static struct pci_controller mace_pci_controller = {
+ .iommu = 0,
+ .mem_offset = MACE_PCI_MEM_OFFSET,
+ .io_offset = 0,
++ .io_map_base = CKSEG1ADDR(MACEPCI_LOW_IO),
+ };
+
+ static int __init mace_init(void)
+@@ -135,7 +136,8 @@ static int __init mace_init(void)
+ BUG_ON(request_irq(MACE_PCI_BRIDGE_IRQ, macepci_error, 0,
+ "MACE PCI error", NULL));
+
+- iomem_resource = mace_pci_mem_resource;
++ /* extend memory resources */
++ iomem_resource.end = mace_pci_mem_resource.end;
+ ioport_resource = mace_pci_io_resource;
+
+ register_pci_controller(&mace_pci_controller);
+diff --git a/arch/mips/philips/pnx8550/common/time.c b/arch/mips/philips/pnx8550/common/time.c
+index e818fd0..6d494e0 100644
+--- a/arch/mips/philips/pnx8550/common/time.c
++++ b/arch/mips/philips/pnx8550/common/time.c
+@@ -22,7 +22,6 @@
+ #include <linux/kernel_stat.h>
+ #include <linux/spinlock.h>
+ #include <linux/interrupt.h>
+-#include <linux/module.h>
+
+ #include <asm/bootinfo.h>
+ #include <asm/cpu.h>
+@@ -41,11 +40,60 @@ static cycle_t hpt_read(void)
+ return read_c0_count2();
+ }
+
++static struct clocksource pnx_clocksource = {
++ .name = "pnx8xxx",
++ .rating = 200,
++ .read = hpt_read,
++ .flags = CLOCK_SOURCE_IS_CONTINUOUS,
++};
++
+ static void timer_ack(void)
+ {
+ write_c0_compare(cpj);
+ }
+
++static irqreturn_t pnx8xxx_timer_interrupt(int irq, void *dev_id)
++{
++ struct clock_event_device *c = dev_id;
++
++ /* clear MATCH, signal the event */
++ c->event_handler(c);
++
++ return IRQ_HANDLED;
++}
++
++static struct irqaction pnx8xxx_timer_irq = {
++ .handler = pnx8xxx_timer_interrupt,
++ .flags = IRQF_DISABLED | IRQF_PERCPU,
++ .name = "pnx8xxx_timer",
++};
++
++static irqreturn_t monotonic_interrupt(int irq, void *dev_id)
++{
++ /* Timer 2 clear interrupt */
++ write_c0_compare2(-1);
++ return IRQ_HANDLED;
++}
++
++static struct irqaction monotonic_irqaction = {
++ .handler = monotonic_interrupt,
++ .flags = IRQF_DISABLED,
++ .name = "Monotonic timer",
++};
++
++static int pnx8xxx_set_next_event(unsigned long delta,
++ struct clock_event_device *evt)
++{
++ write_c0_compare(delta);
++ return 0;
++}
++
++static struct clock_event_device pnx8xxx_clockevent = {
++ .name = "pnx8xxx_clockevent",
++ .features = CLOCK_EVT_FEAT_ONESHOT,
++ .set_next_event = pnx8xxx_set_next_event,
++};
++
+ /*
+ * plat_time_init() - it does the following things:
+ *
+@@ -58,11 +106,34 @@ static void timer_ack(void)
+
+ __init void plat_time_init(void)
+ {
++ unsigned int configPR;
+ unsigned int n;
+ unsigned int m;
+ unsigned int p;
+ unsigned int pow2p;
+
++ clockevents_register_device(&pnx8xxx_clockevent);
++ clocksource_register(&pnx_clocksource);
++
++ setup_irq(PNX8550_INT_TIMER1, &pnx8xxx_timer_irq);
++ setup_irq(PNX8550_INT_TIMER2, &monotonic_irqaction);
++
++ /* Timer 1 start */
++ configPR = read_c0_config7();
++ configPR &= ~0x00000008;
++ write_c0_config7(configPR);
++
++ /* Timer 2 start */
++ configPR = read_c0_config7();
++ configPR &= ~0x00000010;
++ write_c0_config7(configPR);
++
++ /* Timer 3 stop */
++ configPR = read_c0_config7();
++ configPR |= 0x00000020;
++ write_c0_config7(configPR);
++
++
+ /* PLL0 sets MIPS clock (PLL1 <=> TM1, PLL6 <=> TM2, PLL5 <=> mem) */
+ /* (but only if CLK_MIPS_CTL select value [bits 3:1] is 1: FIXME) */
+
+@@ -87,42 +158,6 @@ __init void plat_time_init(void)
+ write_c0_count2(0);
+ write_c0_compare2(0xffffffff);
+
+- clocksource_mips.read = hpt_read;
+- mips_timer_ack = timer_ack;
+-}
+-
+-static irqreturn_t monotonic_interrupt(int irq, void *dev_id)
+-{
+- /* Timer 2 clear interrupt */
+- write_c0_compare2(-1);
+- return IRQ_HANDLED;
+ }
+
+-static struct irqaction monotonic_irqaction = {
+- .handler = monotonic_interrupt,
+- .flags = IRQF_DISABLED,
+- .name = "Monotonic timer",
+-};
+
+-void __init plat_timer_setup(struct irqaction *irq)
+-{
+- int configPR;
+-
+- setup_irq(PNX8550_INT_TIMER1, irq);
+- setup_irq(PNX8550_INT_TIMER2, &monotonic_irqaction);
+-
+- /* Timer 1 start */
+- configPR = read_c0_config7();
+- configPR &= ~0x00000008;
+- write_c0_config7(configPR);
+-
+- /* Timer 2 start */
+- configPR = read_c0_config7();
+- configPR &= ~0x00000010;
+- write_c0_config7(configPR);
+-
+- /* Timer 3 stop */
+- configPR = read_c0_config7();
+- configPR |= 0x00000020;
+- write_c0_config7(configPR);
+-}
+diff --git a/arch/mips/sgi-ip32/ip32-irq.c b/arch/mips/sgi-ip32/ip32-irq.c
+index cab7cc2..b0ea0e4 100644
+--- a/arch/mips/sgi-ip32/ip32-irq.c
++++ b/arch/mips/sgi-ip32/ip32-irq.c
+@@ -426,7 +426,6 @@ static void ip32_irq0(void)
+
+ crime_int = crime->istat & crime_mask;
+ irq = MACE_VID_IN1_IRQ + __ffs(crime_int);
+- crime_int = 1 << irq;
+
+ if (crime_int & CRIME_MACEISA_INT_MASK) {
+ unsigned long mace_int = mace->perif.ctrl.istat;
+diff --git a/arch/mips/sgi-ip32/ip32-platform.c b/arch/mips/sgi-ip32/ip32-platform.c
+index 77febd6..89a71f4 100644
+--- a/arch/mips/sgi-ip32/ip32-platform.c
++++ b/arch/mips/sgi-ip32/ip32-platform.c
+@@ -13,21 +13,22 @@
+ #include <asm/ip32/mace.h>
+ #include <asm/ip32/ip32_ints.h>
+
+-/*
+- * .iobase isn't a constant (in the sense of C) so we fill it in at runtime.
+- */
+-#define MACE_PORT(int) \
++#define MACEISA_SERIAL1_OFFS offsetof(struct sgi_mace, isa.serial1)
++#define MACEISA_SERIAL2_OFFS offsetof(struct sgi_mace, isa.serial2)
++
++#define MACE_PORT(offset,_irq) \
+ { \
+- .irq = int, \
++ .mapbase = MACE_BASE + offset, \
++ .irq = _irq, \
+ .uartclk = 1843200, \
+ .iotype = UPIO_MEM, \
+- .flags = UPF_SKIP_TEST, \
++ .flags = UPF_SKIP_TEST|UPF_IOREMAP, \
+ .regshift = 8, \
+ }
+
+ static struct plat_serial8250_port uart8250_data[] = {
+- MACE_PORT(MACEISA_SERIAL1_IRQ),
+- MACE_PORT(MACEISA_SERIAL2_IRQ),
++ MACE_PORT(MACEISA_SERIAL1_OFFS, MACEISA_SERIAL1_IRQ),
++ MACE_PORT(MACEISA_SERIAL2_OFFS, MACEISA_SERIAL2_IRQ),
+ { },
+ };
+
+@@ -41,9 +42,6 @@ static struct platform_device uart8250_device = {
+
+ static int __init uart8250_init(void)
+ {
+- uart8250_data[0].membase = (void __iomem *) &mace->isa.serial1;
+- uart8250_data[1].membase = (void __iomem *) &mace->isa.serial2;
+-
+ return platform_device_register(&uart8250_device);
+ }
+
+diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c
+index 1add6ef..5d89a21 100644
+--- a/arch/powerpc/kernel/prom_init.c
++++ b/arch/powerpc/kernel/prom_init.c
+@@ -2216,6 +2216,45 @@ static void __init fixup_device_tree_efika(void)
+ prom_printf("fixup_device_tree_efika: ",
+ "skipped entry %x - setprop error\n", i);
+ }
++
++ /* Make sure ethernet mdio bus node exists */
++ node = call_prom("finddevice", 1, 1, ADDR("/builtin/mdio"));
++ if (!PHANDLE_VALID(node)) {
++ prom_printf("Adding Ethernet MDIO node\n");
++ call_prom("interpret", 1, 1,
++ " s\" /builtin\" find-device"
++ " new-device"
++ " 1 encode-int s\" #address-cells\" property"
++ " 0 encode-int s\" #size-cells\" property"
++ " s\" mdio\" 2dup device-name device-type"
++ " s\" mpc5200b-fec-phy\" encode-string"
++ " s\" compatible\" property"
++ " 0xf0003000 0x400 reg"
++ " 0x2 encode-int"
++ " 0x5 encode-int encode+"
++ " 0x3 encode-int encode+"
++ " s\" interrupts\" property"
++ " finish-device");
++ };
++
++ /* Make sure ethernet phy device node exist */
++ node = call_prom("finddevice", 1, 1, ADDR("/builtin/mdio/ethernet-phy"));
++ if (!PHANDLE_VALID(node)) {
++ prom_printf("Adding Ethernet PHY node\n");
++ call_prom("interpret", 1, 1,
++ " s\" /builtin/mdio\" find-device"
++ " new-device"
++ " s\" ethernet-phy\" device-name"
++ " 0x10 encode-int s\" reg\" property"
++ " my-self"
++ " ihandle>phandle"
++ " finish-device"
++ " s\" /builtin/ethernet\" find-device"
++ " encode-int"
++ " s\" phy-handle\" property"
++ " device-end");
++ }
++
+ }
+ #else
+ #define fixup_device_tree_efika()
+diff --git a/arch/powerpc/mm/slb.c b/arch/powerpc/mm/slb.c
+index 27922df..a282bc2 100644
+--- a/arch/powerpc/mm/slb.c
++++ b/arch/powerpc/mm/slb.c
+@@ -82,6 +82,14 @@ static inline void slb_shadow_clear(unsigned long entry)
+ get_slb_shadow()->save_area[entry].esid = 0;
+ }
+
++void slb_shadow_clear_all(void)
++{
++ int i;
++
++ for (i = 0; i < SLB_NUM_BOLTED; i++)
++ slb_shadow_clear(i);
++}
++
+ static inline void create_shadowed_slbe(unsigned long ea, int ssize,
+ unsigned long flags,
+ unsigned long entry)
+diff --git a/arch/powerpc/platforms/pseries/hotplug-cpu.c b/arch/powerpc/platforms/pseries/hotplug-cpu.c
+index fc48b96..412e6b4 100644
+--- a/arch/powerpc/platforms/pseries/hotplug-cpu.c
++++ b/arch/powerpc/platforms/pseries/hotplug-cpu.c
+@@ -29,6 +29,7 @@
+ #include <asm/vdso_datapage.h>
+ #include <asm/pSeries_reconfig.h>
+ #include "xics.h"
++#include "plpar_wrappers.h"
+
+ /* This version can't take the spinlock, because it never returns */
+ static struct rtas_args rtas_stop_self_args = {
+@@ -58,6 +59,7 @@ static void pseries_mach_cpu_die(void)
+ local_irq_disable();
+ idle_task_exit();
+ xics_teardown_cpu(0);
++ unregister_slb_shadow(hard_smp_processor_id(), __pa(get_slb_shadow()));
+ rtas_stop_self();
+ /* Should never get here... */
+ BUG();
+diff --git a/arch/powerpc/platforms/pseries/lpar.c b/arch/powerpc/platforms/pseries/lpar.c
+index 9a455d4..34317aa 100644
+--- a/arch/powerpc/platforms/pseries/lpar.c
++++ b/arch/powerpc/platforms/pseries/lpar.c
+@@ -272,6 +272,7 @@ void vpa_init(int cpu)
+ */
+ addr = __pa(&slb_shadow[cpu]);
+ if (firmware_has_feature(FW_FEATURE_SPLPAR)) {
++ slb_shadow_clear_all();
+ ret = register_slb_shadow(hwcpu, addr);
+ if (ret)
+ printk(KERN_ERR
+diff --git a/arch/x86/kernel/apm_32.c b/arch/x86/kernel/apm_32.c
+index 17089a0..af045ca 100644
+--- a/arch/x86/kernel/apm_32.c
++++ b/arch/x86/kernel/apm_32.c
+@@ -2256,14 +2256,12 @@ static int __init apm_init(void)
+ apm_info.disabled = 1;
+ return -ENODEV;
+ }
+- if (PM_IS_ACTIVE()) {
++ if (pm_flags & PM_ACPI) {
+ printk(KERN_NOTICE "apm: overridden by ACPI.\n");
+ apm_info.disabled = 1;
+ return -ENODEV;
+ }
+-#ifdef CONFIG_PM_LEGACY
+- pm_active = 1;
+-#endif
++ pm_flags |= PM_APM;
+
+ /*
+ * Set up a segment that references the real mode segment 0x40
+@@ -2366,9 +2364,7 @@ static void __exit apm_exit(void)
+ kthread_stop(kapmd_task);
+ kapmd_task = NULL;
+ }
+-#ifdef CONFIG_PM_LEGACY
+- pm_active = 0;
+-#endif
++ pm_flags &= ~PM_APM;
+ }
+
+ module_init(apm_init);
+diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c
+index 9663c2a..46d391d 100644
+--- a/arch/x86/kernel/process_32.c
++++ b/arch/x86/kernel/process_32.c
+@@ -204,6 +204,10 @@ void cpu_idle(void)
+ }
+ }
+
++static void do_nothing(void *unused)
++{
++}
++
+ void cpu_idle_wait(void)
+ {
+ unsigned int cpu, this_cpu = get_cpu();
+@@ -228,6 +232,13 @@ void cpu_idle_wait(void)
+ cpu_clear(cpu, map);
+ }
+ cpus_and(map, map, cpu_online_map);
++ /*
++ * We waited 1 sec, if a CPU still did not call idle
++ * it may be because it is in idle and not waking up
++ * because it has nothing to do.
++ * Give all the remaining CPUS a kick.
++ */
++ smp_call_function_mask(map, do_nothing, 0, 0);
+ } while (!cpus_empty(map));
+
+ set_cpus_allowed(current, tmp);
+diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c
+index 6309b27..ab79e1d 100644
+--- a/arch/x86/kernel/process_64.c
++++ b/arch/x86/kernel/process_64.c
+@@ -135,6 +135,10 @@ static void poll_idle (void)
+ cpu_relax();
+ }
+
++static void do_nothing(void *unused)
++{
++}
++
+ void cpu_idle_wait(void)
+ {
+ unsigned int cpu, this_cpu = get_cpu();
+@@ -160,6 +164,13 @@ void cpu_idle_wait(void)
+ cpu_clear(cpu, map);
+ }
+ cpus_and(map, map, cpu_online_map);
++ /*
++ * We waited 1 sec, if a CPU still did not call idle
++ * it may be because it is in idle and not waking up
++ * because it has nothing to do.
++ * Give all the remaining CPUS a kick.
++ */
++ smp_call_function_mask(map, do_nothing, 0, 0);
+ } while (!cpus_empty(map));
+
+ set_cpus_allowed(current, tmp);
+diff --git a/arch/x86/kernel/smpboot_64.c b/arch/x86/kernel/smpboot_64.c
+index 500670c..aaf4e12 100644
+--- a/arch/x86/kernel/smpboot_64.c
++++ b/arch/x86/kernel/smpboot_64.c
+@@ -526,7 +526,7 @@ struct create_idle {
+ int cpu;
+ };
+
+-void do_fork_idle(struct work_struct *work)
++static void __cpuinit do_fork_idle(struct work_struct *work)
+ {
+ struct create_idle *c_idle =
+ container_of(work, struct create_idle, work);
+diff --git a/block/blktrace.c b/block/blktrace.c
+index 498a0a5..9b4da4a 100644
+--- a/block/blktrace.c
++++ b/block/blktrace.c
+@@ -25,7 +25,6 @@
+ #include <linux/time.h>
+ #include <asm/uaccess.h>
+
+-static DEFINE_PER_CPU(unsigned long long, blk_trace_cpu_offset) = { 0, };
+ static unsigned int blktrace_seq __read_mostly = 1;
+
+ /*
+@@ -41,7 +40,7 @@ static void trace_note(struct blk_trace *bt, pid_t pid, int action,
+ const int cpu = smp_processor_id();
+
+ t->magic = BLK_IO_TRACE_MAGIC | BLK_IO_TRACE_VERSION;
+- t->time = cpu_clock(cpu) - per_cpu(blk_trace_cpu_offset, cpu);
++ t->time = ktime_to_ns(ktime_get());
+ t->device = bt->dev;
+ t->action = action;
+ t->pid = pid;
+@@ -159,7 +158,7 @@ void __blk_add_trace(struct blk_trace *bt, sector_t sector, int bytes,
+
+ t->magic = BLK_IO_TRACE_MAGIC | BLK_IO_TRACE_VERSION;
+ t->sequence = ++(*sequence);
+- t->time = cpu_clock(cpu) - per_cpu(blk_trace_cpu_offset, cpu);
++ t->time = ktime_to_ns(ktime_get());
+ t->sector = sector;
+ t->bytes = bytes;
+ t->action = what;
+@@ -179,7 +178,7 @@ void __blk_add_trace(struct blk_trace *bt, sector_t sector, int bytes,
+ EXPORT_SYMBOL_GPL(__blk_add_trace);
+
+ static struct dentry *blk_tree_root;
+-static struct mutex blk_tree_mutex;
++static DEFINE_MUTEX(blk_tree_mutex);
+ static unsigned int root_users;
+
+ static inline void blk_remove_root(void)
+@@ -505,77 +504,3 @@ void blk_trace_shutdown(struct request_queue *q)
+ blk_trace_remove(q);
+ }
+ }
+-
+-/*
+- * Average offset over two calls to cpu_clock() with a gettimeofday()
+- * in the middle
+- */
+-static void blk_check_time(unsigned long long *t, int this_cpu)
+-{
+- unsigned long long a, b;
+- struct timeval tv;
+-
+- a = cpu_clock(this_cpu);
+- do_gettimeofday(&tv);
+- b = cpu_clock(this_cpu);
+-
+- *t = tv.tv_sec * 1000000000 + tv.tv_usec * 1000;
+- *t -= (a + b) / 2;
+-}
+-
+-/*
+- * calibrate our inter-CPU timings
+- */
+-static void blk_trace_check_cpu_time(void *data)
+-{
+- unsigned long long *t;
+- int this_cpu = get_cpu();
+-
+- t = &per_cpu(blk_trace_cpu_offset, this_cpu);
+-
+- /*
+- * Just call it twice, hopefully the second call will be cache hot
+- * and a little more precise
+- */
+- blk_check_time(t, this_cpu);
+- blk_check_time(t, this_cpu);
+-
+- put_cpu();
+-}
+-
+-static void blk_trace_set_ht_offsets(void)
+-{
+-#if defined(CONFIG_SCHED_SMT)
+- int cpu, i;
+-
+- /*
+- * now make sure HT siblings have the same time offset
+- */
+- preempt_disable();
+- for_each_online_cpu(cpu) {
+- unsigned long long *cpu_off, *sibling_off;
+-
+- for_each_cpu_mask(i, per_cpu(cpu_sibling_map, cpu)) {
+- if (i == cpu)
+- continue;
+-
+- cpu_off = &per_cpu(blk_trace_cpu_offset, cpu);
+- sibling_off = &per_cpu(blk_trace_cpu_offset, i);
+- *sibling_off = *cpu_off;
+- }
+- }
+- preempt_enable();
+-#endif
+-}
+-
+-static __init int blk_trace_init(void)
+-{
+- mutex_init(&blk_tree_mutex);
+- on_each_cpu(blk_trace_check_cpu_time, NULL, 1, 1);
+- blk_trace_set_ht_offsets();
+-
+- return 0;
+-}
+-
+-module_init(blk_trace_init);
+-
+diff --git a/drivers/acpi/Kconfig b/drivers/acpi/Kconfig
+index b9f923e..ccf6ea9 100644
+--- a/drivers/acpi/Kconfig
++++ b/drivers/acpi/Kconfig
+@@ -82,6 +82,12 @@ config ACPI_PROCFS_POWER
+ and functions, which do not yet exist in /sys
+
+ Say N to delete power /proc/acpi/ folders that have moved to /sys/
++config ACPI_SYSFS_POWER
++ bool "Future power /sys interface"
++ select POWER_SUPPLY
++ default y
++ ---help---
++ Say N to disable power /sys interface
+ config ACPI_PROC_EVENT
+ bool "Deprecated /proc/acpi/event support"
+ depends on PROC_FS
+@@ -103,7 +109,6 @@ config ACPI_PROC_EVENT
+ config ACPI_AC
+ tristate "AC Adapter"
+ depends on X86
+- select POWER_SUPPLY
+ default y
+ help
+ This driver adds support for the AC Adapter object, which indicates
+@@ -113,7 +118,6 @@ config ACPI_AC
+ config ACPI_BATTERY
+ tristate "Battery"
+ depends on X86
+- select POWER_SUPPLY
+ default y
+ help
+ This driver adds support for battery information through
+@@ -368,7 +372,6 @@ config ACPI_HOTPLUG_MEMORY
+ config ACPI_SBS
+ tristate "Smart Battery System"
+ depends on X86
+- select POWER_SUPPLY
+ help
+ This driver adds support for the Smart Battery System, another
+ type of access to battery information, found on some laptops.
+diff --git a/drivers/acpi/ac.c b/drivers/acpi/ac.c
+index 76ed4f5..76b9bea 100644
+--- a/drivers/acpi/ac.c
++++ b/drivers/acpi/ac.c
+@@ -31,7 +31,9 @@
+ #include <linux/proc_fs.h>
+ #include <linux/seq_file.h>
+ #endif
++#ifdef CONFIG_ACPI_SYSFS_POWER
+ #include <linux/power_supply.h>
++#endif
+ #include <acpi/acpi_bus.h>
+ #include <acpi/acpi_drivers.h>
+
+@@ -79,7 +81,9 @@ static struct acpi_driver acpi_ac_driver = {
+ };
+
+ struct acpi_ac {
++#ifdef CONFIG_ACPI_SYSFS_POWER
+ struct power_supply charger;
++#endif
+ struct acpi_device * device;
+ unsigned long state;
+ };
+@@ -94,7 +98,7 @@ static const struct file_operations acpi_ac_fops = {
+ .release = single_release,
+ };
+ #endif
+-
++#ifdef CONFIG_ACPI_SYSFS_POWER
+ static int get_ac_property(struct power_supply *psy,
+ enum power_supply_property psp,
+ union power_supply_propval *val)
+@@ -113,7 +117,7 @@ static int get_ac_property(struct power_supply *psy,
+ static enum power_supply_property ac_props[] = {
+ POWER_SUPPLY_PROP_ONLINE,
+ };
+-
++#endif
+ /* --------------------------------------------------------------------------
+ AC Adapter Management
+ -------------------------------------------------------------------------- */
+@@ -241,7 +245,9 @@ static void acpi_ac_notify(acpi_handle handle, u32 event, void *data)
+ acpi_bus_generate_netlink_event(device->pnp.device_class,
+ device->dev.bus_id, event,
+ (u32) ac->state);
++#ifdef CONFIG_ACPI_SYSFS_POWER
+ kobject_uevent(&ac->charger.dev->kobj, KOBJ_CHANGE);
++#endif
+ break;
+ default:
+ ACPI_DEBUG_PRINT((ACPI_DB_INFO,
+@@ -280,12 +286,14 @@ static int acpi_ac_add(struct acpi_device *device)
+ #endif
+ if (result)
+ goto end;
++#ifdef CONFIG_ACPI_SYSFS_POWER
+ ac->charger.name = acpi_device_bid(device);
+ ac->charger.type = POWER_SUPPLY_TYPE_MAINS;
+ ac->charger.properties = ac_props;
+ ac->charger.num_properties = ARRAY_SIZE(ac_props);
+ ac->charger.get_property = get_ac_property;
+ power_supply_register(&ac->device->dev, &ac->charger);
++#endif
+ status = acpi_install_notify_handler(device->handle,
+ ACPI_ALL_NOTIFY, acpi_ac_notify,
+ ac);
+@@ -319,8 +327,10 @@ static int acpi_ac_resume(struct acpi_device *device)
+ old_state = ac->state;
+ if (acpi_ac_get_state(ac))
+ return 0;
++#ifdef CONFIG_ACPI_SYSFS_POWER
+ if (old_state != ac->state)
+ kobject_uevent(&ac->charger.dev->kobj, KOBJ_CHANGE);
++#endif
+ return 0;
+ }
+
+@@ -337,8 +347,10 @@ static int acpi_ac_remove(struct acpi_device *device, int type)
+
+ status = acpi_remove_notify_handler(device->handle,
+ ACPI_ALL_NOTIFY, acpi_ac_notify);
++#ifdef CONFIG_ACPI_SYSFS_POWER
+ if (ac->charger.dev)
+ power_supply_unregister(&ac->charger);
++#endif
+ #ifdef CONFIG_ACPI_PROCFS_POWER
+ acpi_ac_remove_fs(device);
+ #endif
+diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c
+index 8f7505d..c4a769d 100644
+--- a/drivers/acpi/battery.c
++++ b/drivers/acpi/battery.c
+@@ -40,7 +40,9 @@
+ #include <acpi/acpi_bus.h>
+ #include <acpi/acpi_drivers.h>
+
++#ifdef CONFIG_ACPI_SYSFS_POWER
+ #include <linux/power_supply.h>
++#endif
+
+ #define ACPI_BATTERY_VALUE_UNKNOWN 0xFFFFFFFF
+
+@@ -86,7 +88,9 @@ MODULE_DEVICE_TABLE(acpi, battery_device_ids);
+
+ struct acpi_battery {
+ struct mutex lock;
++#ifdef CONFIG_ACPI_SYSFS_POWER
+ struct power_supply bat;
++#endif
+ struct acpi_device *device;
+ unsigned long update_time;
+ int current_now;
+@@ -117,6 +121,7 @@ inline int acpi_battery_present(struct acpi_battery *battery)
+ return battery->device->status.battery_present;
+ }
+
++#ifdef CONFIG_ACPI_SYSFS_POWER
+ static int acpi_battery_technology(struct acpi_battery *battery)
+ {
+ if (!strcasecmp("NiCd", battery->type))
+@@ -222,6 +227,7 @@ static enum power_supply_property energy_battery_props[] = {
+ POWER_SUPPLY_PROP_MODEL_NAME,
+ POWER_SUPPLY_PROP_MANUFACTURER,
+ };
++#endif
+
+ #ifdef CONFIG_ACPI_PROCFS_POWER
+ inline char *acpi_battery_units(struct acpi_battery *battery)
+@@ -398,6 +404,7 @@ static int acpi_battery_init_alarm(struct acpi_battery *battery)
+ return acpi_battery_set_alarm(battery);
+ }
+
++#ifdef CONFIG_ACPI_SYSFS_POWER
+ static ssize_t acpi_battery_alarm_show(struct device *dev,
+ struct device_attribute *attr,
+ char *buf)
+@@ -429,11 +436,6 @@ static int sysfs_add_battery(struct acpi_battery *battery)
+ {
+ int result;
+
+- battery->update_time = 0;
+- result = acpi_battery_get_info(battery);
+- acpi_battery_init_alarm(battery);
+- if (result)
+- return result;
+ if (battery->power_unit) {
+ battery->bat.properties = charge_battery_props;
+ battery->bat.num_properties =
+@@ -462,18 +464,31 @@ static void sysfs_remove_battery(struct acpi_battery *battery)
+ power_supply_unregister(&battery->bat);
+ battery->bat.dev = NULL;
+ }
++#endif
+
+ static int acpi_battery_update(struct acpi_battery *battery)
+ {
+- int result = acpi_battery_get_status(battery);
++ int result;
++ result = acpi_battery_get_status(battery);
+ if (result)
+ return result;
++#ifdef CONFIG_ACPI_SYSFS_POWER
+ if (!acpi_battery_present(battery)) {
+ sysfs_remove_battery(battery);
++ battery->update_time = 0;
+ return 0;
+ }
++#endif
++ if (!battery->update_time) {
++ result = acpi_battery_get_info(battery);
++ if (result)
++ return result;
++ acpi_battery_init_alarm(battery);
++ }
++#ifdef CONFIG_ACPI_SYSFS_POWER
+ if (!battery->bat.dev)
+ sysfs_add_battery(battery);
++#endif
+ return acpi_battery_get_state(battery);
+ }
+
+@@ -767,9 +782,11 @@ static void acpi_battery_notify(acpi_handle handle, u32 event, void *data)
+ acpi_bus_generate_netlink_event(device->pnp.device_class,
+ device->dev.bus_id, event,
+ acpi_battery_present(battery));
++#ifdef CONFIG_ACPI_SYSFS_POWER
+ /* acpi_batter_update could remove power_supply object */
+ if (battery->bat.dev)
+ kobject_uevent(&battery->bat.dev->kobj, KOBJ_CHANGE);
++#endif
+ }
+
+ static int acpi_battery_add(struct acpi_device *device)
+@@ -828,7 +845,9 @@ static int acpi_battery_remove(struct acpi_device *device, int type)
+ #ifdef CONFIG_ACPI_PROCFS_POWER
+ acpi_battery_remove_fs(device);
+ #endif
++#ifdef CONFIG_ACPI_SYSFS_POWER
+ sysfs_remove_battery(battery);
++#endif
+ mutex_destroy(&battery->lock);
+ kfree(battery);
+ return 0;
+diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c
+index 49d432d..d7a115c 100644
+--- a/drivers/acpi/bus.c
++++ b/drivers/acpi/bus.c
+@@ -29,7 +29,6 @@
+ #include <linux/list.h>
+ #include <linux/sched.h>
+ #include <linux/pm.h>
+-#include <linux/pm_legacy.h>
+ #include <linux/device.h>
+ #include <linux/proc_fs.h>
+ #ifdef CONFIG_X86
+@@ -764,16 +763,14 @@ static int __init acpi_init(void)
+ result = acpi_bus_init();
+
+ if (!result) {
+-#ifdef CONFIG_PM_LEGACY
+- if (!PM_IS_ACTIVE())
+- pm_active = 1;
++ if (!(pm_flags & PM_APM))
++ pm_flags |= PM_ACPI;
+ else {
+ printk(KERN_INFO PREFIX
+ "APM is already active, exiting\n");
+ disable_acpi();
+ result = -ENODEV;
+ }
+-#endif
+ } else
+ disable_acpi();
+
+diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c
+index d411017..97dc161 100644
+--- a/drivers/acpi/ec.c
++++ b/drivers/acpi/ec.c
+@@ -892,6 +892,17 @@ static int acpi_ec_stop(struct acpi_device *device, int type)
+ return 0;
+ }
+
++int __init acpi_boot_ec_enable(void)
++{
++ if (!boot_ec || boot_ec->handlers_installed)
++ return 0;
++ if (!ec_install_handlers(boot_ec)) {
++ first_ec = boot_ec;
++ return 0;
++ }
++ return -EFAULT;
++}
++
+ int __init acpi_ec_ecdt_probe(void)
+ {
+ int ret;
+@@ -924,9 +935,10 @@ int __init acpi_ec_ecdt_probe(void)
+ goto error;
+ /* We really need to limit this workaround, the only ASUS,
+ * which needs it, has fake EC._INI method, so use it as flag.
++ * Keep boot_ec struct as it will be needed soon.
+ */
+ if (ACPI_FAILURE(acpi_get_handle(boot_ec->handle, "_INI", &x)))
+- goto error;
++ return -ENODEV;
+ }
+
+ ret = ec_install_handlers(boot_ec);
+diff --git a/drivers/acpi/events/evregion.c b/drivers/acpi/events/evregion.c
+index e99f0c4..58ad097 100644
+--- a/drivers/acpi/events/evregion.c
++++ b/drivers/acpi/events/evregion.c
+@@ -344,7 +344,7 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
+ * setup will potentially execute control methods
+ * (e.g., _REG method for this region)
+ */
+- acpi_ex_relinquish_interpreter();
++ acpi_ex_exit_interpreter();
+
+ status = region_setup(region_obj, ACPI_REGION_ACTIVATE,
+ handler_desc->address_space.context,
+@@ -352,7 +352,7 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
+
+ /* Re-enter the interpreter */
+
+- acpi_ex_reacquire_interpreter();
++ acpi_ex_enter_interpreter();
+
+ /* Check for failure of the Region Setup */
+
+@@ -405,7 +405,7 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
+ * exit the interpreter because the handler *might* block -- we don't
+ * know what it will do, so we can't hold the lock on the intepreter.
+ */
+- acpi_ex_relinquish_interpreter();
++ acpi_ex_exit_interpreter();
+ }
+
+ /* Call the handler */
+@@ -426,7 +426,7 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
+ * We just returned from a non-default handler, we must re-enter the
+ * interpreter
+ */
+- acpi_ex_reacquire_interpreter();
++ acpi_ex_enter_interpreter();
+ }
+
+ return_ACPI_STATUS(status);
+diff --git a/drivers/acpi/pci_irq.c b/drivers/acpi/pci_irq.c
+index dd3186a..62010c2 100644
+--- a/drivers/acpi/pci_irq.c
++++ b/drivers/acpi/pci_irq.c
+@@ -429,6 +429,15 @@ int acpi_pci_irq_enable(struct pci_dev *dev)
+ &polarity, &link,
+ acpi_pci_allocate_irq);
+
++ if (irq < 0) {
++ /*
++ * IDE legacy mode controller IRQs are magic. Why do compat
++ * extensions always make such a nasty mess.
++ */
++ if (dev->class >> 8 == PCI_CLASS_STORAGE_IDE &&
++ (dev->class & 0x05) == 0)
++ return 0;
++ }
+ /*
+ * No IRQ known to the ACPI subsystem - maybe the BIOS /
+ * driver reported one, then use it. Exit in any case.
+diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c
+index 2fe34cc..2235f4e 100644
+--- a/drivers/acpi/processor_idle.c
++++ b/drivers/acpi/processor_idle.c
+@@ -76,7 +76,11 @@ static void (*pm_idle_save) (void) __read_mostly;
+ #define PM_TIMER_TICKS_TO_US(p) (((p) * 1000)/(PM_TIMER_FREQUENCY/1000))
+
+ static unsigned int max_cstate __read_mostly = ACPI_PROCESSOR_MAX_POWER;
++#ifdef CONFIG_CPU_IDLE
+ module_param(max_cstate, uint, 0000);
++#else
++module_param(max_cstate, uint, 0644);
++#endif
+ static unsigned int nocst __read_mostly;
+ module_param(nocst, uint, 0000);
+
+diff --git a/drivers/acpi/sbs.c b/drivers/acpi/sbs.c
+index 22cb95b..f136c7d 100644
+--- a/drivers/acpi/sbs.c
++++ b/drivers/acpi/sbs.c
+@@ -40,7 +40,9 @@
+ #include <linux/jiffies.h>
+ #include <linux/delay.h>
+
++#ifdef CONFIG_ACPI_SYSFS_POWER
+ #include <linux/power_supply.h>
++#endif
+
+ #include "sbshc.h"
+
+@@ -80,7 +82,9 @@ static const struct acpi_device_id sbs_device_ids[] = {
+ MODULE_DEVICE_TABLE(acpi, sbs_device_ids);
+
+ struct acpi_battery {
++#ifdef CONFIG_ACPI_SYSFS_POWER
+ struct power_supply bat;
++#endif
+ struct acpi_sbs *sbs;
+ #ifdef CONFIG_ACPI_PROCFS_POWER
+ struct proc_dir_entry *proc_entry;
+@@ -113,7 +117,9 @@ struct acpi_battery {
+ #define to_acpi_battery(x) container_of(x, struct acpi_battery, bat);
+
+ struct acpi_sbs {
++#ifdef CONFIG_ACPI_SYSFS_POWER
+ struct power_supply charger;
++#endif
+ struct acpi_device *device;
+ struct acpi_smb_hc *hc;
+ struct mutex lock;
+@@ -157,6 +163,7 @@ static inline int acpi_battery_scale(struct acpi_battery *battery)
+ acpi_battery_ipscale(battery);
+ }
+
++#ifdef CONFIG_ACPI_SYSFS_POWER
+ static int sbs_get_ac_property(struct power_supply *psy,
+ enum power_supply_property psp,
+ union power_supply_propval *val)
+@@ -294,6 +301,7 @@ static enum power_supply_property sbs_energy_battery_props[] = {
+ POWER_SUPPLY_PROP_MODEL_NAME,
+ POWER_SUPPLY_PROP_MANUFACTURER,
+ };
++#endif
+
+ /* --------------------------------------------------------------------------
+ Smart Battery System Management
+@@ -429,6 +437,7 @@ static int acpi_ac_get_present(struct acpi_sbs *sbs)
+ return result;
+ }
+
++#ifdef CONFIG_ACPI_SYSFS_POWER
+ static ssize_t acpi_battery_alarm_show(struct device *dev,
+ struct device_attribute *attr,
+ char *buf)
+@@ -458,6 +467,7 @@ static struct device_attribute alarm_attr = {
+ .show = acpi_battery_alarm_show,
+ .store = acpi_battery_alarm_store,
+ };
++#endif
+
+ /* --------------------------------------------------------------------------
+ FS Interface (/proc/acpi)
+@@ -793,6 +803,7 @@ static int acpi_battery_add(struct acpi_sbs *sbs, int id)
+ &acpi_battery_state_fops, &acpi_battery_alarm_fops,
+ battery);
+ #endif
++#ifdef CONFIG_ACPI_SYSFS_POWER
+ battery->bat.name = battery->name;
+ battery->bat.type = POWER_SUPPLY_TYPE_BATTERY;
+ if (!acpi_battery_mode(battery)) {
+@@ -813,6 +824,7 @@ static int acpi_battery_add(struct acpi_sbs *sbs, int id)
+ goto end;
+ battery->have_sysfs_alarm = 1;
+ end:
++#endif
+ printk(KERN_INFO PREFIX "%s [%s]: Battery Slot [%s] (battery %s)\n",
+ ACPI_SBS_DEVICE_NAME, acpi_device_bid(sbs->device),
+ battery->name, sbs->battery->present ? "present" : "absent");
+@@ -822,12 +834,13 @@ static int acpi_battery_add(struct acpi_sbs *sbs, int id)
+ static void acpi_battery_remove(struct acpi_sbs *sbs, int id)
+ {
+ struct acpi_battery *battery = &sbs->battery[id];
+-
++#ifdef CONFIG_ACPI_SYSFS_POWER
+ if (battery->bat.dev) {
+ if (battery->have_sysfs_alarm)
+ device_remove_file(battery->bat.dev, &alarm_attr);
+ power_supply_unregister(&battery->bat);
+ }
++#endif
+ #ifdef CONFIG_ACPI_PROCFS_POWER
+ if (battery->proc_entry)
+ acpi_sbs_remove_fs(&battery->proc_entry, acpi_battery_dir);
+@@ -848,12 +861,14 @@ static int acpi_charger_add(struct acpi_sbs *sbs)
+ if (result)
+ goto end;
+ #endif
++#ifdef CONFIG_ACPI_SYSFS_POWER
+ sbs->charger.name = "sbs-charger";
+ sbs->charger.type = POWER_SUPPLY_TYPE_MAINS;
+ sbs->charger.properties = sbs_ac_props;
+ sbs->charger.num_properties = ARRAY_SIZE(sbs_ac_props);
+ sbs->charger.get_property = sbs_get_ac_property;
+ power_supply_register(&sbs->device->dev, &sbs->charger);
++#endif
+ printk(KERN_INFO PREFIX "%s [%s]: AC Adapter [%s] (%s)\n",
+ ACPI_SBS_DEVICE_NAME, acpi_device_bid(sbs->device),
+ ACPI_AC_DIR_NAME, sbs->charger_present ? "on-line" : "off-line");
+@@ -863,8 +878,10 @@ static int acpi_charger_add(struct acpi_sbs *sbs)
+
+ static void acpi_charger_remove(struct acpi_sbs *sbs)
+ {
++#ifdef CONFIG_ACPI_SYSFS_POWER
+ if (sbs->charger.dev)
+ power_supply_unregister(&sbs->charger);
++#endif
+ #ifdef CONFIG_ACPI_PROCFS_POWER
+ if (sbs->charger_entry)
+ acpi_sbs_remove_fs(&sbs->charger_entry, acpi_ac_dir);
+@@ -885,7 +902,9 @@ void acpi_sbs_callback(void *context)
+ ACPI_SBS_NOTIFY_STATUS,
+ sbs->charger_present);
+ #endif
++#ifdef CONFIG_ACPI_SYSFS_POWER
+ kobject_uevent(&sbs->charger.dev->kobj, KOBJ_CHANGE);
++#endif
+ }
+ if (sbs->manager_present) {
+ for (id = 0; id < MAX_SBS_BAT; ++id) {
+@@ -902,7 +921,9 @@ void acpi_sbs_callback(void *context)
+ ACPI_SBS_NOTIFY_STATUS,
+ bat->present);
+ #endif
++#ifdef CONFIG_ACPI_SYSFS_POWER
+ kobject_uevent(&bat->bat.dev->kobj, KOBJ_CHANGE);
++#endif
+ }
+ }
+ }
+diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
+index 5b4d462..cbfe9ae 100644
+--- a/drivers/acpi/scan.c
++++ b/drivers/acpi/scan.c
+@@ -1449,6 +1449,8 @@ static int acpi_bus_scan_fixed(struct acpi_device *root)
+ return result;
+ }
+
++int __init acpi_boot_ec_enable(void);
++
+ static int __init acpi_scan_init(void)
+ {
+ int result;
+@@ -1480,6 +1482,10 @@ static int __init acpi_scan_init(void)
+ * Enumerate devices in the ACPI namespace.
+ */
+ result = acpi_bus_scan_fixed(acpi_root);
++
++ /* EC region might be needed at bus_scan, so enable it now */
++ acpi_boot_ec_enable();
++
+ if (!result)
+ result = acpi_bus_scan(acpi_root, &ops);
+
+diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c
+index bb62a58..b406b39 100644
+--- a/drivers/ata/ata_piix.c
++++ b/drivers/ata/ata_piix.c
+@@ -132,6 +132,7 @@ enum {
+ ich8_2port_sata,
+ ich8m_apple_sata_ahci, /* locks up on second port enable */
+ tolapai_sata_ahci,
++ piix_pata_vmw, /* PIIX4 for VMware, spurious DMA_ERR */
+
+ /* constants for mapping table */
+ P0 = 0, /* port 0 */
+@@ -165,6 +166,7 @@ static void piix_set_piomode(struct ata_port *ap, struct ata_device *adev);
+ static void piix_set_dmamode(struct ata_port *ap, struct ata_device *adev);
+ static void ich_set_dmamode(struct ata_port *ap, struct ata_device *adev);
+ static int ich_pata_cable_detect(struct ata_port *ap);
++static u8 piix_vmw_bmdma_status(struct ata_port *ap);
+ #ifdef CONFIG_PM
+ static int piix_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg);
+ static int piix_pci_device_resume(struct pci_dev *pdev);
+@@ -175,6 +177,8 @@ static unsigned int in_module_init = 1;
+ static const struct pci_device_id piix_pci_tbl[] = {
+ /* Intel PIIX3 for the 430HX etc */
+ { 0x8086, 0x7010, PCI_ANY_ID, PCI_ANY_ID, 0, 0, piix_pata_mwdma },
++ /* VMware ICH4 */
++ { 0x8086, 0x7111, 0x15ad, 0x1976, 0, 0, piix_pata_vmw },
+ /* Intel PIIX4 for the 430TX/440BX/MX chipset: UDMA 33 */
+ /* Also PIIX4E (fn3 rev 2) and PIIX4M (fn3 rev 3) */
+ { 0x8086, 0x7111, PCI_ANY_ID, PCI_ANY_ID, 0, 0, piix_pata_33 },
+@@ -383,6 +387,38 @@ static const struct ata_port_operations piix_sata_ops = {
+ .port_start = ata_port_start,
+ };
+
++static const struct ata_port_operations piix_vmw_ops = {
++ .set_piomode = piix_set_piomode,
++ .set_dmamode = piix_set_dmamode,
++ .mode_filter = ata_pci_default_filter,
++
++ .tf_load = ata_tf_load,
++ .tf_read = ata_tf_read,
++ .check_status = ata_check_status,
++ .exec_command = ata_exec_command,
++ .dev_select = ata_std_dev_select,
++
++ .bmdma_setup = ata_bmdma_setup,
++ .bmdma_start = ata_bmdma_start,
++ .bmdma_stop = ata_bmdma_stop,
++ .bmdma_status = piix_vmw_bmdma_status,
++ .qc_prep = ata_qc_prep,
++ .qc_issue = ata_qc_issue_prot,
++ .data_xfer = ata_data_xfer,
++
++ .freeze = ata_bmdma_freeze,
++ .thaw = ata_bmdma_thaw,
++ .error_handler = piix_pata_error_handler,
++ .post_internal_cmd = ata_bmdma_post_internal_cmd,
++ .cable_detect = ata_cable_40wire,
++
++ .irq_handler = ata_interrupt,
++ .irq_clear = ata_bmdma_irq_clear,
++ .irq_on = ata_irq_on,
++
++ .port_start = ata_port_start,
++};
++
+ static const struct piix_map_db ich5_map_db = {
+ .mask = 0x7,
+ .port_enable = 0x3,
+@@ -623,6 +659,16 @@ static struct ata_port_info piix_port_info[] = {
+ .port_ops = &piix_sata_ops,
+ },
+
++ [piix_pata_vmw] =
++ {
++ .sht = &piix_sht,
++ .flags = PIIX_PATA_FLAGS,
++ .pio_mask = 0x1f, /* pio0-4 */
++ .mwdma_mask = 0x06, /* mwdma1-2 ?? CHECK 0 should be ok but slow */
++ .udma_mask = ATA_UDMA_MASK_40C,
++ .port_ops = &piix_vmw_ops,
++ },
++
+ };
+
+ static struct pci_bits piix_enable_bits[] = {
+@@ -1135,6 +1181,11 @@ static int piix_pci_device_resume(struct pci_dev *pdev)
+ }
+ #endif
+
++static u8 piix_vmw_bmdma_status(struct ata_port *ap)
++{
++ return ata_bmdma_status(ap) & ~ATA_DMA_ERR;
++}
++
+ #define AHCI_PCI_BAR 5
+ #define AHCI_GLOBAL_CTL 0x04
+ #define AHCI_ENABLE (1 << 31)
+diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
+index f0124a8..21a81cd 100644
+--- a/drivers/ata/libata-eh.c
++++ b/drivers/ata/libata-eh.c
+@@ -1733,11 +1733,15 @@ static void ata_eh_link_autopsy(struct ata_link *link)
+ ehc->i.action &= ~ATA_EH_PERDEV_MASK;
+ }
+
+- /* consider speeding down */
++ /* propagate timeout to host link */
++ if ((all_err_mask & AC_ERR_TIMEOUT) && !ata_is_host_link(link))
++ ap->link.eh_context.i.err_mask |= AC_ERR_TIMEOUT;
++
++ /* record error and consider speeding down */
+ dev = ehc->i.dev;
+- if (!dev && ata_link_max_devices(link) == 1 &&
+- ata_dev_enabled(link->device))
+- dev = link->device;
++ if (!dev && ((ata_link_max_devices(link) == 1 &&
++ ata_dev_enabled(link->device))))
++ dev = link->device;
+
+ if (dev)
+ ehc->i.action |= ata_eh_speed_down(dev, is_io, all_err_mask);
+@@ -1759,8 +1763,14 @@ void ata_eh_autopsy(struct ata_port *ap)
+ {
+ struct ata_link *link;
+
+- __ata_port_for_each_link(link, ap)
++ ata_port_for_each_link(link, ap)
+ ata_eh_link_autopsy(link);
++
++ /* Autopsy of fanout ports can affect host link autopsy.
++ * Perform host link autopsy last.
++ */
++ if (ap->nr_pmp_links)
++ ata_eh_link_autopsy(&ap->link);
+ }
+
+ /**
+@@ -2157,13 +2167,11 @@ int ata_eh_reset(struct ata_link *link, int classify,
+ if (ata_link_offline(link))
+ continue;
+
+- /* apply class override and convert UNKNOWN to NONE */
++ /* apply class override */
+ if (lflags & ATA_LFLAG_ASSUME_ATA)
+ classes[dev->devno] = ATA_DEV_ATA;
+ else if (lflags & ATA_LFLAG_ASSUME_SEMB)
+ classes[dev->devno] = ATA_DEV_SEMB_UNSUP; /* not yet */
+- else if (classes[dev->devno] == ATA_DEV_UNKNOWN)
+- classes[dev->devno] = ATA_DEV_NONE;
+ }
+
+ /* record current link speed */
+diff --git a/drivers/ata/libata-pmp.c b/drivers/ata/libata-pmp.c
+index c0c4dbc..caef2bb 100644
+--- a/drivers/ata/libata-pmp.c
++++ b/drivers/ata/libata-pmp.c
+@@ -495,14 +495,12 @@ static void sata_pmp_quirks(struct ata_port *ap)
+ /* SError.N need a kick in the ass to get working */
+ link->flags |= ATA_LFLAG_HRST_TO_RESUME;
+
+- /* class code report is unreliable */
+- if (link->pmp < 5)
+- link->flags |= ATA_LFLAG_ASSUME_ATA;
+-
+- /* The config device, which can be either at
+- * port 0 or 5, locks up on SRST.
++ /* Class code report is unreliable and SRST
++ * times out under certain configurations.
++ * Config device can be at port 0 or 5 and
++ * locks up on SRST.
+ */
+- if (link->pmp == 0 || link->pmp == 5)
++ if (link->pmp <= 5)
+ link->flags |= ATA_LFLAG_NO_SRST |
+ ATA_LFLAG_ASSUME_ATA;
+
+diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c
+index a883bb0..14daf48 100644
+--- a/drivers/ata/libata-scsi.c
++++ b/drivers/ata/libata-scsi.c
+@@ -841,6 +841,9 @@ static void ata_scsi_dev_config(struct scsi_device *sdev,
+ blk_queue_max_hw_segments(q, q->max_hw_segments - 1);
+ }
+
++ if (dev->class == ATA_DEV_ATA)
++ sdev->manage_start_stop = 1;
++
+ if (dev->flags & ATA_DFLAG_AN)
+ set_bit(SDEV_EVT_MEDIA_CHANGE, sdev->supported_events);
+
+@@ -872,8 +875,6 @@ int ata_scsi_slave_config(struct scsi_device *sdev)
+
+ ata_scsi_sdev_config(sdev);
+
+- sdev->manage_start_stop = 1;
+-
+ if (dev)
+ ata_scsi_dev_config(sdev, dev);
+
+diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c
+index 48acc09..b7ac80b 100644
+--- a/drivers/ata/libata-sff.c
++++ b/drivers/ata/libata-sff.c
+@@ -806,7 +806,10 @@ int ata_pci_init_one(struct pci_dev *pdev,
+ if (rc)
+ goto err_out;
+
+- if (!legacy_mode) {
++ if (!legacy_mode && pdev->irq) {
++ /* We may have no IRQ assigned in which case we can poll. This
++ shouldn't happen on a sane system but robustness is cheap
++ in this case */
+ rc = devm_request_irq(dev, pdev->irq, pi->port_ops->irq_handler,
+ IRQF_SHARED, DRV_NAME, host);
+ if (rc)
+@@ -814,7 +817,7 @@ int ata_pci_init_one(struct pci_dev *pdev,
+
+ ata_port_desc(host->ports[0], "irq %d", pdev->irq);
+ ata_port_desc(host->ports[1], "irq %d", pdev->irq);
+- } else {
++ } else if (legacy_mode) {
+ if (!ata_port_is_dummy(host->ports[0])) {
+ rc = devm_request_irq(dev, ATA_PRIMARY_IRQ(pdev),
+ pi->port_ops->irq_handler,
+diff --git a/drivers/ata/pata_ixp4xx_cf.c b/drivers/ata/pata_ixp4xx_cf.c
+index fcd532a..120b5bf 100644
+--- a/drivers/ata/pata_ixp4xx_cf.c
++++ b/drivers/ata/pata_ixp4xx_cf.c
+@@ -130,10 +130,11 @@ static struct ata_port_operations ixp4xx_port_ops = {
+ .port_start = ata_port_start,
+ };
+
+-static void ixp4xx_setup_port(struct ata_ioports *ioaddr,
++static void ixp4xx_setup_port(struct ata_port *ap,
+ struct ixp4xx_pata_data *data,
+ unsigned long raw_cs0, unsigned long raw_cs1)
+ {
++ struct ata_ioports *ioaddr = &ap->ioaddr;
+ unsigned long raw_cmd = raw_cs0;
+ unsigned long raw_ctl = raw_cs1 + 0x06;
+
+diff --git a/drivers/ata/pata_pdc202xx_old.c b/drivers/ata/pata_pdc202xx_old.c
+index bc7c2d5..8f28156 100644
+--- a/drivers/ata/pata_pdc202xx_old.c
++++ b/drivers/ata/pata_pdc202xx_old.c
+@@ -215,8 +215,8 @@ static void pdc2026x_bmdma_stop(struct ata_queued_cmd *qc)
+ /* Flip back to 33Mhz for PIO */
+ if (adev->dma_mode >= XFER_UDMA_2)
+ iowrite8(ioread8(clock) & ~sel66, clock);
+-
+ ata_bmdma_stop(qc);
++ pdc202xx_set_piomode(ap, adev);
+ }
+
+ /**
+@@ -233,6 +233,17 @@ static void pdc2026x_dev_config(struct ata_device *adev)
+ adev->max_sectors = 256;
+ }
+
++static int pdc2026x_port_start(struct ata_port *ap)
++{
++ void __iomem *bmdma = ap->ioaddr.bmdma_addr;
++ if (bmdma) {
++ /* Enable burst mode */
++ u8 burst = ioread8(bmdma + 0x1f);
++ iowrite8(burst | 0x01, bmdma + 0x1f);
++ }
++ return ata_sff_port_start(ap);
++}
++
+ static struct scsi_host_template pdc202xx_sht = {
+ .module = THIS_MODULE,
+ .name = DRV_NAME,
+@@ -313,7 +324,7 @@ static struct ata_port_operations pdc2026x_port_ops = {
+ .irq_clear = ata_bmdma_irq_clear,
+ .irq_on = ata_irq_on,
+
+- .port_start = ata_sff_port_start,
++ .port_start = pdc2026x_port_start,
+ };
+
+ static int pdc202xx_init_one(struct pci_dev *dev, const struct pci_device_id *id)
+diff --git a/drivers/ata/sata_qstor.c b/drivers/ata/sata_qstor.c
+index 2f1de6e..c68b241 100644
+--- a/drivers/ata/sata_qstor.c
++++ b/drivers/ata/sata_qstor.c
+@@ -270,7 +270,7 @@ static int qs_scr_read(struct ata_port *ap, unsigned int sc_reg, u32 *val)
+ static void qs_error_handler(struct ata_port *ap)
+ {
+ qs_enter_reg_mode(ap);
+- ata_do_eh(ap, qs_prereset, ata_std_softreset, NULL,
++ ata_do_eh(ap, qs_prereset, NULL, sata_std_hardreset,
+ ata_std_postreset);
+ }
+
+diff --git a/drivers/ata/sata_sil24.c b/drivers/ata/sata_sil24.c
+index 96fd526..864c1c1 100644
+--- a/drivers/ata/sata_sil24.c
++++ b/drivers/ata/sata_sil24.c
+@@ -301,7 +301,7 @@ static struct sil24_cerr_info {
+ [PORT_CERR_PKT_PROT] = { AC_ERR_HSM, ATA_EH_SOFTRESET,
+ "invalid data directon for ATAPI CDB" },
+ [PORT_CERR_SGT_BOUNDARY] = { AC_ERR_SYSTEM, ATA_EH_SOFTRESET,
+- "SGT no on qword boundary" },
++ "SGT not on qword boundary" },
+ [PORT_CERR_SGT_TGTABRT] = { AC_ERR_HOST_BUS, ATA_EH_SOFTRESET,
+ "PCI target abort while fetching SGT" },
+ [PORT_CERR_SGT_MSTABRT] = { AC_ERR_HOST_BUS, ATA_EH_SOFTRESET,
+@@ -832,16 +832,31 @@ static int sil24_qc_defer(struct ata_queued_cmd *qc)
+ struct ata_link *link = qc->dev->link;
+ struct ata_port *ap = link->ap;
+ u8 prot = qc->tf.protocol;
+- int is_atapi = (prot == ATA_PROT_ATAPI ||
+- prot == ATA_PROT_ATAPI_NODATA ||
+- prot == ATA_PROT_ATAPI_DMA);
+-
+- /* ATAPI commands completing with CHECK_SENSE cause various
+- * weird problems if other commands are active. PMP DMA CS
+- * errata doesn't cover all and HSM violation occurs even with
+- * only one other device active. Always run an ATAPI command
+- * by itself.
+- */
++
++ /*
++ * There is a bug in the chip:
++ * Port LRAM Causes the PRB/SGT Data to be Corrupted
++ * If the host issues a read request for LRAM and SActive registers
++ * while active commands are available in the port, PRB/SGT data in
++ * the LRAM can become corrupted. This issue applies only when
++ * reading from, but not writing to, the LRAM.
++ *
++ * Therefore, reading LRAM when there is no particular error [and
++ * other commands may be outstanding] is prohibited.
++ *
++ * To avoid this bug there are two situations where a command must run
++ * exclusive of any other commands on the port:
++ *
++ * - ATAPI commands which check the sense data
++ * - Passthrough ATA commands which always have ATA_QCFLAG_RESULT_TF
++ * set.
++ *
++ */
++ int is_excl = (prot == ATA_PROT_ATAPI ||
++ prot == ATA_PROT_ATAPI_NODATA ||
++ prot == ATA_PROT_ATAPI_DMA ||
++ (qc->flags & ATA_QCFLAG_RESULT_TF));
++
+ if (unlikely(ap->excl_link)) {
+ if (link == ap->excl_link) {
+ if (ap->nr_active_links)
+@@ -849,7 +864,7 @@ static int sil24_qc_defer(struct ata_queued_cmd *qc)
+ qc->flags |= ATA_QCFLAG_CLEAR_EXCL;
+ } else
+ return ATA_DEFER_PORT;
+- } else if (unlikely(is_atapi)) {
++ } else if (unlikely(is_excl)) {
+ ap->excl_link = link;
+ if (ap->nr_active_links)
+ return ATA_DEFER_PORT;
+@@ -1079,10 +1094,13 @@ static void sil24_error_intr(struct ata_port *ap)
+ if (ci && ci->desc) {
+ err_mask |= ci->err_mask;
+ action |= ci->action;
++ if (action & ATA_EH_RESET_MASK)
++ freeze = 1;
+ ata_ehi_push_desc(ehi, "%s", ci->desc);
+ } else {
+ err_mask |= AC_ERR_OTHER;
+ action |= ATA_EH_SOFTRESET;
++ freeze = 1;
+ ata_ehi_push_desc(ehi, "unknown command error %d",
+ cerr);
+ }
+diff --git a/drivers/atm/nicstar.c b/drivers/atm/nicstar.c
+index 14ced85..0c205b0 100644
+--- a/drivers/atm/nicstar.c
++++ b/drivers/atm/nicstar.c
+@@ -625,14 +625,6 @@ static int __devinit ns_init_card(int i, struct pci_dev *pcidev)
+ if (mac[i] == NULL)
+ nicstar_init_eprom(card->membase);
+
+- if (request_irq(pcidev->irq, &ns_irq_handler, IRQF_DISABLED | IRQF_SHARED, "nicstar", card) != 0)
+- {
+- printk("nicstar%d: can't allocate IRQ %d.\n", i, pcidev->irq);
+- error = 9;
+- ns_init_card_error(card, error);
+- return error;
+- }
+-
+ /* Set the VPI/VCI MSb mask to zero so we can receive OAM cells */
+ writel(0x00000000, card->membase + VPM);
+
+@@ -858,8 +850,6 @@ static int __devinit ns_init_card(int i, struct pci_dev *pcidev)
+ card->iovpool.count++;
+ }
+
+- card->intcnt = 0;
+-
+ /* Configure NICStAR */
+ if (card->rct_size == 4096)
+ ns_cfg_rctsize = NS_CFG_RCTSIZE_4096_ENTRIES;
+@@ -868,6 +858,15 @@ static int __devinit ns_init_card(int i, struct pci_dev *pcidev)
+
+ card->efbie = 1;
+
++ card->intcnt = 0;
++ if (request_irq(pcidev->irq, &ns_irq_handler, IRQF_DISABLED | IRQF_SHARED, "nicstar", card) != 0)
++ {
++ printk("nicstar%d: can't allocate IRQ %d.\n", i, pcidev->irq);
++ error = 9;
++ ns_init_card_error(card, error);
++ return error;
++ }
++
+ /* Register device */
+ card->atmdev = atm_dev_register("nicstar", &atm_ops, -1, NULL);
+ if (card->atmdev == NULL)
+diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c
+index 7d70496..509b649 100644
+--- a/drivers/block/cciss.c
++++ b/drivers/block/cciss.c
+@@ -2927,7 +2927,7 @@ default_int_mode:
+ return;
+ }
+
+-static int cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev)
++static int __devinit cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev)
+ {
+ ushort subsystem_vendor_id, subsystem_device_id, command;
+ __u32 board_id, scratchpad = 0;
+diff --git a/drivers/block/loop.c b/drivers/block/loop.c
+index 56e2304..b8af22e 100644
+--- a/drivers/block/loop.c
++++ b/drivers/block/loop.c
+@@ -610,7 +610,7 @@ static int loop_thread(void *data)
+ static int loop_switch(struct loop_device *lo, struct file *file)
+ {
+ struct switch_request w;
+- struct bio *bio = bio_alloc(GFP_KERNEL, 1);
++ struct bio *bio = bio_alloc(GFP_KERNEL, 0);
+ if (!bio)
+ return -ENOMEM;
+ init_completion(&w.wait);
+diff --git a/drivers/char/tpm/tpm.c b/drivers/char/tpm/tpm.c
+index 39564b7..c88424a 100644
+--- a/drivers/char/tpm/tpm.c
++++ b/drivers/char/tpm/tpm.c
+@@ -1046,12 +1046,6 @@ void tpm_remove_hardware(struct device *dev)
+ }
+ EXPORT_SYMBOL_GPL(tpm_remove_hardware);
+
+-static u8 savestate[] = {
+- 0, 193, /* TPM_TAG_RQU_COMMAND */
+- 0, 0, 0, 10, /* blob length (in bytes) */
+- 0, 0, 0, 152 /* TPM_ORD_SaveState */
+-};
+-
+ /*
+ * We are about to suspend. Save the TPM state
+ * so that it can be restored.
+@@ -1059,6 +1053,12 @@ static u8 savestate[] = {
+ int tpm_pm_suspend(struct device *dev, pm_message_t pm_state)
+ {
+ struct tpm_chip *chip = dev_get_drvdata(dev);
++ u8 savestate[] = {
++ 0, 193, /* TPM_TAG_RQU_COMMAND */
++ 0, 0, 0, 10, /* blob length (in bytes) */
++ 0, 0, 0, 152 /* TPM_ORD_SaveState */
++ };
++
+ if (chip == NULL)
+ return -ENODEV;
+
+diff --git a/drivers/char/tty_ioctl.c b/drivers/char/tty_ioctl.c
+index e02d592..d4b6d64 100644
+--- a/drivers/char/tty_ioctl.c
++++ b/drivers/char/tty_ioctl.c
+@@ -365,6 +365,25 @@ void tty_termios_copy_hw(struct ktermios *new, struct ktermios *old)
+ EXPORT_SYMBOL(tty_termios_copy_hw);
+
+ /**
++ * tty_termios_hw_change - check for setting change
++ * @a: termios
++ * @b: termios to compare
++ *
++ * Check if any of the bits that affect a dumb device have changed
++ * between the two termios structures, or a speed change is needed.
++ */
++
++int tty_termios_hw_change(struct ktermios *a, struct ktermios *b)
++{
++ if (a->c_ispeed != b->c_ispeed || a->c_ospeed != b->c_ospeed)
++ return 1;
++ if ((a->c_cflag ^ b->c_cflag) & ~(HUPCL | CREAD | CLOCAL))
++ return 1;
++ return 0;
++}
++EXPORT_SYMBOL(tty_termios_hw_change);
++
++/**
+ * change_termios - update termios values
+ * @tty: tty to update
+ * @new_termios: desired new value
+diff --git a/drivers/connector/cn_queue.c b/drivers/connector/cn_queue.c
+index 296f510..12ceed5 100644
+--- a/drivers/connector/cn_queue.c
++++ b/drivers/connector/cn_queue.c
+@@ -99,8 +99,8 @@ int cn_queue_add_callback(struct cn_queue_dev *dev, char *name, struct cb_id *id
+ spin_unlock_bh(&dev->queue_lock);
+
+ if (found) {
+- atomic_dec(&dev->refcnt);
+ cn_queue_free_callback(cbq);
++ atomic_dec(&dev->refcnt);
+ return -EINVAL;
+ }
+
+diff --git a/drivers/crypto/padlock-aes.c b/drivers/crypto/padlock-aes.c
+index a337b69..5f7e718 100644
+--- a/drivers/crypto/padlock-aes.c
++++ b/drivers/crypto/padlock-aes.c
+@@ -429,8 +429,8 @@ static inline void padlock_xcrypt(const u8 *input, u8 *output, void *key,
+
+ static void aes_crypt_copy(const u8 *in, u8 *out, u32 *key, struct cword *cword)
+ {
+- u8 tmp[AES_BLOCK_SIZE * 2]
+- __attribute__ ((__aligned__(PADLOCK_ALIGNMENT)));
++ u8 buf[AES_BLOCK_SIZE * 2 + PADLOCK_ALIGNMENT - 1];
++ u8 *tmp = PTR_ALIGN(&buf[0], PADLOCK_ALIGNMENT);
+
+ memcpy(tmp, in, AES_BLOCK_SIZE);
+ padlock_xcrypt(tmp, out, key, cword);
+diff --git a/drivers/firmware/dmi-id.c b/drivers/firmware/dmi-id.c
+index b6e1eb7..bc132d8 100644
+--- a/drivers/firmware/dmi-id.c
++++ b/drivers/firmware/dmi-id.c
+@@ -175,12 +175,11 @@ static struct device *dmi_dev;
+
+ extern int dmi_available;
+
+-static int __init dmi_id_init(void)
++/* In a separate function to keep gcc 3.2 happy - do NOT merge this in
++ dmi_id_init! */
++static void __init dmi_id_init_attr_table(void)
+ {
+- int ret, i;
+-
+- if (!dmi_available)
+- return -ENODEV;
++ int i;
+
+ /* Not necessarily all DMI fields are available on all
+ * systems, hence let's built an attribute table of just
+@@ -205,6 +204,16 @@ static int __init dmi_id_init(void)
+ ADD_DMI_ATTR(chassis_serial, DMI_CHASSIS_SERIAL);
+ ADD_DMI_ATTR(chassis_asset_tag, DMI_CHASSIS_ASSET_TAG);
+ sys_dmi_attributes[i++] = &sys_dmi_modalias_attr.attr;
++}
++
++static int __init dmi_id_init(void)
++{
++ int ret;
++
++ if (!dmi_available)
++ return -ENODEV;
++
++ dmi_id_init_attr_table();
+
+ ret = class_register(&dmi_class);
+ if (ret)
+diff --git a/drivers/i2c/busses/i2c-at91.c b/drivers/i2c/busses/i2c-at91.c
+index 9c8b6d5..c09b036 100644
+--- a/drivers/i2c/busses/i2c-at91.c
++++ b/drivers/i2c/busses/i2c-at91.c
+@@ -135,7 +135,7 @@ static int xfer_write(struct i2c_adapter *adap, unsigned char *buf, int length)
+ * Generic i2c master transfer entrypoint.
+ *
+ * Note: We do not use Atmel's feature of storing the "internal device address".
+- * Instead the "internal device address" has to be written using a seperate
++ * Instead the "internal device address" has to be written using a separate
+ * i2c message.
+ * http://lists.arm.linux.org.uk/pipermail/linux-arm-kernel/2004-September/024411.html
+ */
+diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c
+index cb55cf2..f2552b1 100644
+--- a/drivers/i2c/busses/i2c-omap.c
++++ b/drivers/i2c/busses/i2c-omap.c
+@@ -619,13 +619,13 @@ omap_i2c_probe(struct platform_device *pdev)
+ err_free_irq:
+ free_irq(dev->irq, dev);
+ err_unuse_clocks:
++ omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, 0);
+ omap_i2c_disable_clocks(dev);
+ omap_i2c_put_clocks(dev);
+ err_free_mem:
+ platform_set_drvdata(pdev, NULL);
+ kfree(dev);
+ err_release_region:
+- omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, 0);
+ release_mem_region(mem->start, (mem->end - mem->start) + 1);
+
+ return r;
+diff --git a/drivers/i2c/busses/i2c-powermac.c b/drivers/i2c/busses/i2c-powermac.c
+index 0ab4f26..7813127 100644
+--- a/drivers/i2c/busses/i2c-powermac.c
++++ b/drivers/i2c/busses/i2c-powermac.c
+@@ -94,7 +94,7 @@ static s32 i2c_powermac_smbus_xfer( struct i2c_adapter* adap,
+ break;
+
+ /* Note that these are broken vs. the expected smbus API where
+- * on reads, the lenght is actually returned from the function,
++ * on reads, the length is actually returned from the function,
+ * but I think the current API makes no sense and I don't want
+ * any driver that I haven't verified for correctness to go
+ * anywhere near a pmac i2c bus anyway ...
+diff --git a/drivers/i2c/busses/i2c-sibyte.c b/drivers/i2c/busses/i2c-sibyte.c
+index 0ca599d..503a134 100644
+--- a/drivers/i2c/busses/i2c-sibyte.c
++++ b/drivers/i2c/busses/i2c-sibyte.c
+@@ -200,11 +200,14 @@ static struct i2c_adapter sibyte_board_adapter[2] = {
+
+ static int __init i2c_sibyte_init(void)
+ {
+- printk("i2c-swarm.o: i2c SMBus adapter module for SiByte board\n");
++ pr_info("i2c-sibyte: i2c SMBus adapter module for SiByte board\n");
+ if (i2c_sibyte_add_bus(&sibyte_board_adapter[0], K_SMB_FREQ_100KHZ) < 0)
+ return -ENODEV;
+- if (i2c_sibyte_add_bus(&sibyte_board_adapter[1], K_SMB_FREQ_400KHZ) < 0)
++ if (i2c_sibyte_add_bus(&sibyte_board_adapter[1],
++ K_SMB_FREQ_400KHZ) < 0) {
++ i2c_del_adapter(&sibyte_board_adapter[0]);
+ return -ENODEV;
++ }
+ return 0;
+ }
+
+diff --git a/drivers/i2c/i2c-dev.c b/drivers/i2c/i2c-dev.c
+index c21ae20..df540d5 100644
+--- a/drivers/i2c/i2c-dev.c
++++ b/drivers/i2c/i2c-dev.c
+@@ -184,7 +184,7 @@ static ssize_t i2cdev_write (struct file *file, const char __user *buf, size_t c
+
+ /* This address checking function differs from the one in i2c-core
+ in that it considers an address with a registered device, but no
+- bounded driver, as NOT busy. */
++ bound driver, as NOT busy. */
+ static int i2cdev_check_addr(struct i2c_adapter *adapter, unsigned int addr)
+ {
+ struct list_head *item;
+diff --git a/drivers/ide/ide-acpi.c b/drivers/ide/ide-acpi.c
+index 89df48f..899d565 100644
+--- a/drivers/ide/ide-acpi.c
++++ b/drivers/ide/ide-acpi.c
+@@ -16,6 +16,7 @@
+ #include <acpi/acpi.h>
+ #include <linux/ide.h>
+ #include <linux/pci.h>
++#include <linux/dmi.h>
+
+ #include <acpi/acpi_bus.h>
+ #include <acpi/acnames.h>
+@@ -65,6 +66,39 @@ extern int ide_noacpi;
+ extern int ide_noacpitfs;
+ extern int ide_noacpionboot;
+
++static bool ide_noacpi_psx;
++static int no_acpi_psx(const struct dmi_system_id *id)
++{
++ ide_noacpi_psx = true;
++ printk(KERN_NOTICE"%s detected - disable ACPI _PSx.\n", id->ident);
++ return 0;
++}
++
++static const struct dmi_system_id ide_acpi_dmi_table[] = {
++ /* Bug 9673. */
++ /* We should check if this is because ACPI NVS isn't save/restored. */
++ {
++ .callback = no_acpi_psx,
++ .ident = "HP nx9005",
++ .matches = {
++ DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies Ltd."),
++ DMI_MATCH(DMI_BIOS_VERSION, "KAM1.60")
++ },
++ },
++
++ { } /* terminate list */
++};
++
++static int ide_acpi_blacklist(void)
++{
++ static int done;
++ if (done)
++ return 0;
++ done = 1;
++ dmi_check_system(ide_acpi_dmi_table);
++ return 0;
++}
++
+ /**
+ * ide_get_dev_handle - finds acpi_handle and PCI device.function
+ * @dev: device to locate
+@@ -623,7 +657,7 @@ void ide_acpi_set_state(ide_hwif_t *hwif, int on)
+ {
+ int unit;
+
+- if (ide_noacpi)
++ if (ide_noacpi || ide_noacpi_psx)
+ return;
+
+ DEBPRINT("ENTER:\n");
+@@ -668,6 +702,8 @@ void ide_acpi_init(ide_hwif_t *hwif)
+ struct ide_acpi_drive_link *master;
+ struct ide_acpi_drive_link *slave;
+
++ ide_acpi_blacklist();
++
+ hwif->acpidata = kzalloc(sizeof(struct ide_acpi_hwif_link), GFP_KERNEL);
+ if (!hwif->acpidata)
+ return;
+diff --git a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c
+index cef405d..bb9693d 100644
+--- a/drivers/ide/ide-iops.c
++++ b/drivers/ide/ide-iops.c
+@@ -612,12 +612,12 @@ u8 eighty_ninty_three (ide_drive_t *drive)
+ printk(KERN_DEBUG "%s: skipping word 93 validity check\n",
+ drive->name);
+
++ if (ide_dev_is_sata(id) && !ivb)
++ return 1;
++
+ if (hwif->cbl != ATA_CBL_PATA80 && !ivb)
+ goto no_80w;
+
+- if (ide_dev_is_sata(id))
+- return 1;
+-
+ /*
+ * FIXME:
+ * - force bit13 (80c cable present) check also for !ivb devices
+diff --git a/drivers/ide/pci/trm290.c b/drivers/ide/pci/trm290.c
+index 0895e75..0151d7f 100644
+--- a/drivers/ide/pci/trm290.c
++++ b/drivers/ide/pci/trm290.c
+@@ -1,7 +1,8 @@
+ /*
+- * linux/drivers/ide/pci/trm290.c Version 1.02 Mar. 18, 2000
++ * linux/drivers/ide/pci/trm290.c Version 1.05 Dec. 26, 2007
+ *
+ * Copyright (c) 1997-1998 Mark Lord
++ * Copyright (c) 2007 MontaVista Software, Inc. <source at mvista.com>
+ * May be copied or modified under the terms of the GNU General Public License
+ *
+ * June 22, 2004 - get rid of check_region
+@@ -177,7 +178,7 @@ static void trm290_selectproc (ide_drive_t *drive)
+ trm290_prepare_drive(drive, drive->using_dma);
+ }
+
+-static void trm290_ide_dma_exec_cmd(ide_drive_t *drive, u8 command)
++static void trm290_dma_exec_cmd(ide_drive_t *drive, u8 command)
+ {
+ BUG_ON(HWGROUP(drive)->handler != NULL); /* paranoia check */
+ ide_set_handler(drive, &ide_dma_intr, WAIT_CMD, NULL);
+@@ -185,7 +186,7 @@ static void trm290_ide_dma_exec_cmd(ide_drive_t *drive, u8 command)
+ outb(command, IDE_COMMAND_REG);
+ }
+
+-static int trm290_ide_dma_setup(ide_drive_t *drive)
++static int trm290_dma_setup(ide_drive_t *drive)
+ {
+ ide_hwif_t *hwif = drive->hwif;
+ struct request *rq = hwif->hwgroup->rq;
+@@ -215,7 +216,7 @@ static int trm290_ide_dma_setup(ide_drive_t *drive)
+ return 0;
+ }
+
+-static void trm290_ide_dma_start(ide_drive_t *drive)
++static void trm290_dma_start(ide_drive_t *drive)
+ {
+ }
+
+@@ -240,6 +241,14 @@ static int trm290_ide_dma_test_irq (ide_drive_t *drive)
+ return (status == 0x00ff);
+ }
+
++static void trm290_dma_host_on(ide_drive_t *drive)
++{
++}
++
++static void trm290_dma_host_off(ide_drive_t *drive)
++{
++}
++
+ static void __devinit init_hwif_trm290(ide_hwif_t *hwif)
+ {
+ unsigned int cfgbase = 0;
+@@ -280,11 +289,13 @@ static void __devinit init_hwif_trm290(ide_hwif_t *hwif)
+
+ ide_setup_dma(hwif, (hwif->config_data + 4) ^ (hwif->channel ? 0x0080 : 0x0000), 3);
+
+- hwif->dma_setup = &trm290_ide_dma_setup;
+- hwif->dma_exec_cmd = &trm290_ide_dma_exec_cmd;
+- hwif->dma_start = &trm290_ide_dma_start;
+- hwif->ide_dma_end = &trm290_ide_dma_end;
+- hwif->ide_dma_test_irq = &trm290_ide_dma_test_irq;
++ hwif->dma_host_off = &trm290_dma_host_off;
++ hwif->dma_host_on = &trm290_dma_host_on;
++ hwif->dma_setup = &trm290_dma_setup;
++ hwif->dma_exec_cmd = &trm290_dma_exec_cmd;
++ hwif->dma_start = &trm290_dma_start;
++ hwif->ide_dma_end = &trm290_ide_dma_end;
++ hwif->ide_dma_test_irq = &trm290_ide_dma_test_irq;
+
+ hwif->selectproc = &trm290_selectproc;
+ #if 1
+diff --git a/drivers/infiniband/hw/mlx4/cq.c b/drivers/infiniband/hw/mlx4/cq.c
+index 8bf44da..9d32c49 100644
+--- a/drivers/infiniband/hw/mlx4/cq.c
++++ b/drivers/infiniband/hw/mlx4/cq.c
+@@ -430,7 +430,7 @@ static int mlx4_ib_poll_one(struct mlx4_ib_cq *cq,
+ wc->dlid_path_bits = (be32_to_cpu(cqe->g_mlpath_rqpn) >> 24) & 0x7f;
+ wc->wc_flags |= be32_to_cpu(cqe->g_mlpath_rqpn) & 0x80000000 ?
+ IB_WC_GRH : 0;
+- wc->pkey_index = be32_to_cpu(cqe->immed_rss_invalid) >> 16;
++ wc->pkey_index = be32_to_cpu(cqe->immed_rss_invalid) & 0x7f;
+ }
+
+ return 0;
+diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c
+index 77e8b90..bdb6f85 100644
+--- a/drivers/infiniband/ulp/srp/ib_srp.c
++++ b/drivers/infiniband/ulp/srp/ib_srp.c
+@@ -2053,8 +2053,8 @@ static void srp_remove_one(struct ib_device *device)
+
+ list_for_each_entry_safe(target, tmp_target,
+ &host->target_list, list) {
+- scsi_remove_host(target->scsi_host);
+ srp_remove_host(target->scsi_host);
++ scsi_remove_host(target->scsi_host);
+ srp_disconnect_target(target);
+ ib_destroy_cm_id(target->cm_id);
+ srp_free_target_ib(target);
+diff --git a/drivers/input/gameport/gameport.c b/drivers/input/gameport/gameport.c
+index bfc6061..1dc2ac9 100644
+--- a/drivers/input/gameport/gameport.c
++++ b/drivers/input/gameport/gameport.c
+@@ -38,8 +38,6 @@ EXPORT_SYMBOL(gameport_unregister_driver);
+ EXPORT_SYMBOL(gameport_open);
+ EXPORT_SYMBOL(gameport_close);
+ EXPORT_SYMBOL(gameport_rescan);
+-EXPORT_SYMBOL(gameport_cooked_read);
+-EXPORT_SYMBOL(gameport_set_name);
+ EXPORT_SYMBOL(gameport_set_phys);
+ EXPORT_SYMBOL(gameport_start_polling);
+ EXPORT_SYMBOL(gameport_stop_polling);
+diff --git a/drivers/input/input.c b/drivers/input/input.c
+index 307c7b5..a0be978 100644
+--- a/drivers/input/input.c
++++ b/drivers/input/input.c
+@@ -235,6 +235,10 @@ static void input_handle_event(struct input_dev *dev,
+ if (value >= 0)
+ disposition = INPUT_PASS_TO_ALL;
+ break;
++
++ case EV_PWR:
++ disposition = INPUT_PASS_TO_ALL;
++ break;
+ }
+
+ if (type != EV_SYN)
+@@ -1266,6 +1270,10 @@ void input_set_capability(struct input_dev *dev, unsigned int type, unsigned int
+ __set_bit(code, dev->ffbit);
+ break;
+
++ case EV_PWR:
++ /* do nothing */
++ break;
++
+ default:
+ printk(KERN_ERR
+ "input_set_capability: unknown type %u (code %u)\n",
+diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig
+index dfa6592..086d58c 100644
+--- a/drivers/input/keyboard/Kconfig
++++ b/drivers/input/keyboard/Kconfig
+@@ -209,22 +209,22 @@ config KEYBOARD_HIL
+ to your machine, so normally you should say Y here.
+
+ config KEYBOARD_HP6XX
+- tristate "HP Jornada 6XX Keyboard support"
++ tristate "HP Jornada 6xx keyboard"
+ depends on SH_HP6XX
+ select INPUT_POLLDEV
+ help
+- This adds support for the onboard keyboard found on
+- HP Jornada 620/660/680/690.
++ Say Y here if you have a HP Jornada 620/660/680/690 and want to
++ support the built-in keyboard.
+
+ To compile this driver as a module, choose M here: the
+ module will be called jornada680_kbd.
+
+ config KEYBOARD_HP7XX
+- tristate "HP Jornada 7XX Keyboard Driver"
++ tristate "HP Jornada 7xx keyboard"
+ depends on SA1100_JORNADA720_SSP && SA1100_SSP
+ help
+- Say Y here to add support for the HP Jornada 7xx (710/720/728)
+- onboard keyboard.
++ Say Y here if you have a HP Jornada 710/720/728 and want to
++ support the built-in keyboard.
+
+ To compile this driver as a module, choose M here: the
+ module will be called jornada720_kbd.
+diff --git a/drivers/input/keyboard/jornada680_kbd.c b/drivers/input/keyboard/jornada680_kbd.c
+index bec1cf4..a23633a 100644
+--- a/drivers/input/keyboard/jornada680_kbd.c
++++ b/drivers/input/keyboard/jornada680_kbd.c
+@@ -16,14 +16,14 @@
+ * published by the Free Software Foundation.
+ */
+
+-#include <linux/input.h>
+-#include <linux/kernel.h>
+-#include <linux/module.h>
+ #include <linux/init.h>
++#include <linux/input.h>
+ #include <linux/input-polldev.h>
++#include <linux/interrupt.h>
+ #include <linux/jiffies.h>
++#include <linux/kernel.h>
++#include <linux/module.h>
+ #include <linux/platform_device.h>
+-#include <linux/interrupt.h>
+
+ #include <asm/delay.h>
+ #include <asm/io.h>
+@@ -43,22 +43,22 @@
+ #define PLDR 0xa4000134
+
+ static const unsigned short jornada_scancodes[] = {
+-/* PTD1 */ KEY_CAPSLOCK, KEY_MACRO, KEY_LEFTCTRL, 0, KEY_ESC, 0, 0, 0, /* 1 -> 8 */
+- KEY_F1, KEY_F2, KEY_F3, KEY_F8, KEY_F7, KEY_F2, KEY_F4, KEY_F5, /* 9 -> 16 */
+-/* PTD5 */ KEY_SLASH, KEY_APOSTROPHE, KEY_ENTER, 0, KEY_Z, 0, 0, 0, /* 17 -> 24 */
+- KEY_X, KEY_C, KEY_V, KEY_DOT, KEY_COMMA, KEY_M, KEY_B, KEY_N, /* 25 -> 32 */
+-/* PTD7 */ KEY_KP2, KEY_KP6, 0, 0, 0, 0, 0, 0, /* 33 -> 40 */
+- 0, 0, 0, KEY_KP4, 0, 0, KEY_LEFTALT, KEY_HANJA, /* 41 -> 48 */
+-/* PTE0 */ 0, 0, 0, 0, KEY_FINANCE, 0, 0, 0, /* 49 -> 56 */
+- KEY_LEFTCTRL, 0, KEY_SPACE, KEY_KPDOT, KEY_VOLUMEUP, 249, 0, 0, /* 57 -> 64 */
+-/* PTE1 */ KEY_SEMICOLON, KEY_RIGHTBRACE, KEY_BACKSLASH, 0, KEY_A, 0, 0, 0,/* 65 -> 72 */
+- KEY_S, KEY_D, KEY_F, KEY_L, KEY_K, KEY_J, KEY_G, KEY_H, /* 73 -> 80 */
+-/* PTE3 */ KEY_KP8, KEY_LEFTMETA, KEY_RIGHTSHIFT, 0, KEY_TAB, 0, 0,0, /* 81 -> 88 */
+- 0, KEY_LEFTSHIFT, 0, 0, 0, 0, 0, 0, /* 89 -> 96 */
+-/* PTE6 */ KEY_P, KEY_LEFTBRACE, KEY_BACKSPACE, 0, KEY_Q, 0, 0, 0, /* 97 -> 104 */
+- KEY_W, KEY_E, KEY_R, KEY_O, KEY_I, KEY_U, KEY_T, KEY_R, /* 105 -> 112 */
+-/* PTE7 */ KEY_0, KEY_MINUS, KEY_EQUAL, 0, KEY_1, 0, 0, 0, /* 113 -> 120 */
+- KEY_2, KEY_3, KEY_4, KEY_9, KEY_8, KEY_7, KEY_5, KEY_6, /* 121 -> 128 */
++/* PTD1 */ KEY_CAPSLOCK, KEY_MACRO, KEY_LEFTCTRL, 0, KEY_ESC, KEY_KP5, 0, 0, /* 1 -> 8 */
++ KEY_F1, KEY_F2, KEY_F3, KEY_F8, KEY_F7, KEY_F6, KEY_F4, KEY_F5, /* 9 -> 16 */
++/* PTD5 */ KEY_SLASH, KEY_APOSTROPHE, KEY_ENTER, 0, KEY_Z, 0, 0, 0, /* 17 -> 24 */
++ KEY_X, KEY_C, KEY_V, KEY_DOT, KEY_COMMA, KEY_M, KEY_B, KEY_N, /* 25 -> 32 */
++/* PTD7 */ KEY_KP2, KEY_KP6, KEY_KP3, 0, 0, 0, 0, 0, /* 33 -> 40 */
++ KEY_F10, KEY_RO, KEY_F9, KEY_KP4, KEY_NUMLOCK, KEY_SCROLLLOCK, KEY_LEFTALT, KEY_HANJA, /* 41 -> 48 */
++/* PTE0 */ KEY_KATAKANA, KEY_KP0, KEY_GRAVE, 0, KEY_FINANCE, 0, 0, 0, /* 49 -> 56 */
++ KEY_KPMINUS, KEY_HIRAGANA, KEY_SPACE, KEY_KPDOT, KEY_VOLUMEUP, 249, 0, 0, /* 57 -> 64 */
++/* PTE1 */ KEY_SEMICOLON, KEY_RIGHTBRACE, KEY_BACKSLASH, 0, KEY_A, 0, 0, 0, /* 65 -> 72 */
++ KEY_S, KEY_D, KEY_F, KEY_L, KEY_K, KEY_J, KEY_G, KEY_H, /* 73 -> 80 */
++/* PTE3 */ KEY_KP8, KEY_LEFTMETA, KEY_RIGHTSHIFT, 0, KEY_TAB, 0, 0, 0, /* 81 -> 88 */
++ 0, KEY_LEFTSHIFT, KEY_KP7, KEY_KP9, KEY_KP1, KEY_F11, KEY_KPPLUS, KEY_KPASTERISK, /* 89 -> 96 */
++/* PTE6 */ KEY_P, KEY_LEFTBRACE, KEY_BACKSPACE, 0, KEY_Q, 0, 0, 0, /* 97 -> 104 */
++ KEY_W, KEY_E, KEY_R, KEY_O, KEY_I, KEY_U, KEY_T, KEY_Y, /* 105 -> 112 */
++/* PTE7 */ KEY_0, KEY_MINUS, KEY_EQUAL, 0, KEY_1, 0, 0, 0, /* 113 -> 120 */
++ KEY_2, KEY_3, KEY_4, KEY_9, KEY_8, KEY_7, KEY_5, KEY_6, /* 121 -> 128 */
+ /* **** */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0
+ };
+diff --git a/drivers/input/keyboard/spitzkbd.c b/drivers/input/keyboard/spitzkbd.c
+index 410d78a..1d59a2d 100644
+--- a/drivers/input/keyboard/spitzkbd.c
++++ b/drivers/input/keyboard/spitzkbd.c
+@@ -391,6 +391,7 @@ static int __init spitzkbd_probe(struct platform_device *dev)
+ for (i = 0; i < ARRAY_SIZE(spitzkbd_keycode); i++)
+ set_bit(spitzkbd->keycode[i], input_dev->keybit);
+ clear_bit(0, input_dev->keybit);
++ set_bit(KEY_SUSPEND, input_dev->keybit);
+ set_bit(SW_LID, input_dev->swbit);
+ set_bit(SW_TABLET_MODE, input_dev->swbit);
+ set_bit(SW_HEADPHONE_INSERT, input_dev->swbit);
+diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig
+index fa8442b..90e8e92 100644
+--- a/drivers/input/touchscreen/Kconfig
++++ b/drivers/input/touchscreen/Kconfig
+@@ -115,19 +115,17 @@ config TOUCHSCREEN_MK712
+ module will be called mk712.
+
+ config TOUCHSCREEN_HP600
+- tristate "HP Jornada 680/690 touchscreen"
++ tristate "HP Jornada 6xx touchscreen"
+ depends on SH_HP6XX && SH_ADC
+ help
+- Say Y here if you have a HP Jornada 680 or 690 and want to
++ Say Y here if you have a HP Jornada 620/660/680/690 and want to
+ support the built-in touchscreen.
+
+- If unsure, say N.
+-
+ To compile this driver as a module, choose M here: the
+ module will be called hp680_ts_input.
+
+ config TOUCHSCREEN_HP7XX
+- tristate "HP Jornada 710/720/728 touchscreen"
++ tristate "HP Jornada 7xx touchscreen"
+ depends on SA1100_JORNADA720_SSP
+ help
+ Say Y here if you have a HP Jornada 710/720/728 and want
+diff --git a/drivers/macintosh/adbhid.c b/drivers/macintosh/adbhid.c
+index 883da72..ef4c117 100644
+--- a/drivers/macintosh/adbhid.c
++++ b/drivers/macintosh/adbhid.c
+@@ -322,8 +322,9 @@ adbhid_input_keycode(int id, int scancode, int repeat)
+ input_sync(ahid->input);
+ input_report_key(ahid->input, KEY_CAPSLOCK, 0);
+ input_sync(ahid->input);
++ return;
+ }
+- return;
++ break;
+ #ifdef CONFIG_PPC_PMAC
+ case ADB_KEY_POWER_OLD: /* Power key on PBook 3400 needs remapping */
+ switch(pmac_call_feature(PMAC_FTR_GET_MB_INFO,
+diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
+index a5aad8c..e8c8157 100644
+--- a/drivers/md/raid5.c
++++ b/drivers/md/raid5.c
+@@ -2865,7 +2865,8 @@ static void handle_stripe5(struct stripe_head *sh)
+ md_done_sync(conf->mddev, STRIPE_SECTORS, 1);
+ }
+
+- if (s.expanding && s.locked == 0)
++ if (s.expanding && s.locked == 0 &&
++ !test_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.pending))
+ handle_stripe_expansion(conf, sh, NULL);
+
+ if (sh->ops.count)
+@@ -3067,7 +3068,8 @@ static void handle_stripe6(struct stripe_head *sh, struct page *tmp_page)
+ md_done_sync(conf->mddev, STRIPE_SECTORS, 1);
+ }
+
+- if (s.expanding && s.locked == 0)
++ if (s.expanding && s.locked == 0 &&
++ !test_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.pending))
+ handle_stripe_expansion(conf, sh, &r6s);
+
+ spin_unlock(&sh->lock);
+diff --git a/drivers/media/dvb/ttpci/av7110.c b/drivers/media/dvb/ttpci/av7110.c
+index 8b8144f..0d36c15 100644
+--- a/drivers/media/dvb/ttpci/av7110.c
++++ b/drivers/media/dvb/ttpci/av7110.c
+@@ -2800,12 +2800,12 @@ static void av7110_irq(struct saa7146_dev* dev, u32 *isr)
+ }
+
+
+-static struct saa7146_extension av7110_extension;
++static struct saa7146_extension av7110_extension_driver;
+
+ #define MAKE_AV7110_INFO(x_var,x_name) \
+ static struct saa7146_pci_extension_data x_var = { \
+ .ext_priv = x_name, \
+- .ext = &av7110_extension }
++ .ext = &av7110_extension_driver }
+
+ MAKE_AV7110_INFO(tts_1_X_fsc,"Technotrend/Hauppauge WinTV DVB-S rev1.X or Fujitsu Siemens DVB-C");
+ MAKE_AV7110_INFO(ttt_1_X, "Technotrend/Hauppauge WinTV DVB-T rev1.X");
+@@ -2843,7 +2843,7 @@ static struct pci_device_id pci_tbl[] = {
+ MODULE_DEVICE_TABLE(pci, pci_tbl);
+
+
+-static struct saa7146_extension av7110_extension = {
++static struct saa7146_extension av7110_extension_driver = {
+ .name = "dvb",
+ .flags = SAA7146_USE_I2C_IRQ,
+
+@@ -2860,14 +2860,14 @@ static struct saa7146_extension av7110_extension = {
+ static int __init av7110_init(void)
+ {
+ int retval;
+- retval = saa7146_register_extension(&av7110_extension);
++ retval = saa7146_register_extension(&av7110_extension_driver);
+ return retval;
+ }
+
+
+ static void __exit av7110_exit(void)
+ {
+- saa7146_unregister_extension(&av7110_extension);
++ saa7146_unregister_extension(&av7110_extension_driver);
+ }
+
+ module_init(av7110_init);
+diff --git a/drivers/media/video/bt8xx/bttv-driver.c b/drivers/media/video/bt8xx/bttv-driver.c
+index c02d92d..581a3c9 100644
+--- a/drivers/media/video/bt8xx/bttv-driver.c
++++ b/drivers/media/video/bt8xx/bttv-driver.c
+@@ -3063,11 +3063,10 @@ static int bttv_do_ioctl(struct inode *inode, struct file *file,
+ struct video_mbuf *mbuf = arg;
+ unsigned int i;
+
+- mutex_lock(&fh->cap.lock);
+ retval = videobuf_mmap_setup(&fh->cap,gbuffers,gbufsize,
+ V4L2_MEMORY_MMAP);
+ if (retval < 0)
+- goto fh_unlock_and_return;
++ return retval;
+
+ gbuffers = retval;
+ memset(mbuf,0,sizeof(*mbuf));
+@@ -3075,7 +3074,6 @@ static int bttv_do_ioctl(struct inode *inode, struct file *file,
+ mbuf->size = gbuffers * gbufsize;
+ for (i = 0; i < gbuffers; i++)
+ mbuf->offsets[i] = i * gbufsize;
+- mutex_unlock(&fh->cap.lock);
+ return 0;
+ }
+ case VIDIOCMCAPTURE:
+diff --git a/drivers/media/video/ivtv/ivtv-i2c.c b/drivers/media/video/ivtv/ivtv-i2c.c
+index 44678fe..36e54f7 100644
+--- a/drivers/media/video/ivtv/ivtv-i2c.c
++++ b/drivers/media/video/ivtv/ivtv-i2c.c
+@@ -541,7 +541,7 @@ static const struct i2c_algo_bit_data ivtv_i2c_algo_template = {
+ .setscl = ivtv_setscl_old,
+ .getsda = ivtv_getsda_old,
+ .getscl = ivtv_getscl_old,
+- .udelay = 5,
++ .udelay = 10,
+ .timeout = 200,
+ };
+
+@@ -718,9 +718,6 @@ int init_ivtv_i2c(struct ivtv *itv)
+ sizeof(struct i2c_adapter));
+ memcpy(&itv->i2c_algo, &ivtv_i2c_algo_template,
+ sizeof(struct i2c_algo_bit_data));
+- /* The mspx4xx chips need a longer delay for some reason */
+- if (itv->hw_flags & IVTV_HW_MSP34XX)
+- itv->i2c_algo.udelay = 10;
+ itv->i2c_algo.data = itv;
+ itv->i2c_adap.algo_data = &itv->i2c_algo;
+ }
+diff --git a/drivers/mtd/chips/cfi_cmdset_0001.c b/drivers/mtd/chips/cfi_cmdset_0001.c
+index a9eb1c5..1707f98 100644
+--- a/drivers/mtd/chips/cfi_cmdset_0001.c
++++ b/drivers/mtd/chips/cfi_cmdset_0001.c
+@@ -1504,9 +1504,12 @@ static int __xipram do_write_buffer(struct map_info *map, struct flchip *chip,
+ int ret, wbufsize, word_gap, words;
+ const struct kvec *vec;
+ unsigned long vec_seek;
++ unsigned long initial_adr;
++ int initial_len = len;
+
+ wbufsize = cfi_interleave(cfi) << cfi->cfiq->MaxBufWriteSize;
+ adr += chip->start;
++ initial_adr = adr;
+ cmd_adr = adr & ~(wbufsize-1);
+
+ /* Let's determine this according to the interleave only once */
+@@ -1519,7 +1522,7 @@ static int __xipram do_write_buffer(struct map_info *map, struct flchip *chip,
+ return ret;
+ }
+
+- XIP_INVAL_CACHED_RANGE(map, adr, len);
++ XIP_INVAL_CACHED_RANGE(map, initial_adr, initial_len);
+ ENABLE_VPP(map);
+ xip_disable(map, chip, cmd_adr);
+
+@@ -1610,7 +1613,7 @@ static int __xipram do_write_buffer(struct map_info *map, struct flchip *chip,
+ chip->state = FL_WRITING;
+
+ ret = INVAL_CACHE_AND_WAIT(map, chip, cmd_adr,
+- adr, len,
++ initial_adr, initial_len,
+ chip->buffer_write_time);
+ if (ret) {
+ map_write(map, CMD(0x70), cmd_adr);
+diff --git a/drivers/net/3c509.c b/drivers/net/3c509.c
+index edda6e1..8fafac9 100644
+--- a/drivers/net/3c509.c
++++ b/drivers/net/3c509.c
+@@ -385,6 +385,7 @@ static int __init el3_probe(int card_idx)
+ #if defined(__ISAPNP__)
+ static int pnp_cards;
+ struct pnp_dev *idev = NULL;
++ int pnp_found = 0;
+
+ if (nopnp == 1)
+ goto no_pnp;
+@@ -430,6 +431,7 @@ __again:
+ pnp_cards++;
+
+ netdev_boot_setup_check(dev);
++ pnp_found = 1;
+ goto found;
+ }
+ }
+@@ -560,6 +562,8 @@ no_pnp:
+ lp = netdev_priv(dev);
+ #if defined(__ISAPNP__)
+ lp->dev = &idev->dev;
++ if (pnp_found)
++ lp->type = EL3_PNP;
+ #endif
+ err = el3_common_init(dev);
+
+diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
+index d9107e5..114771a 100644
+--- a/drivers/net/Kconfig
++++ b/drivers/net/Kconfig
+@@ -166,16 +166,6 @@ config NET_SB1000
+
+ If you don't have this card, of course say N.
+
+-config IP1000
+- tristate "IP1000 Gigabit Ethernet support"
+- depends on PCI && EXPERIMENTAL
+- select MII
+- ---help---
+- This driver supports IP1000 gigabit Ethernet cards.
+-
+- To compile this driver as a module, choose M here: the module
+- will be called ipg. This is recommended.
+-
+ source "drivers/net/arcnet/Kconfig"
+
+ source "drivers/net/phy/Kconfig"
+@@ -1992,6 +1982,16 @@ config E1000E
+ To compile this driver as a module, choose M here. The module
+ will be called e1000e.
+
++config IP1000
++ tristate "IP1000 Gigabit Ethernet support"
++ depends on PCI && EXPERIMENTAL
++ select MII
++ ---help---
++ This driver supports IP1000 gigabit Ethernet cards.
++
++ To compile this driver as a module, choose M here: the module
++ will be called ipg. This is recommended.
++
+ source "drivers/net/ixp2000/Kconfig"
+
+ config MYRI_SBUS
+diff --git a/drivers/net/e100.c b/drivers/net/e100.c
+index 2b06e4b..b87402b 100644
+--- a/drivers/net/e100.c
++++ b/drivers/net/e100.c
+@@ -1991,13 +1991,12 @@ static int e100_poll(struct napi_struct *napi, int budget)
+ struct nic *nic = container_of(napi, struct nic, napi);
+ struct net_device *netdev = nic->netdev;
+ unsigned int work_done = 0;
+- int tx_cleaned;
+
+ e100_rx_clean(nic, &work_done, budget);
+- tx_cleaned = e100_tx_clean(nic);
++ e100_tx_clean(nic);
+
+- /* If no Rx and Tx cleanup work was done, exit polling mode. */
+- if((!tx_cleaned && (work_done == 0)) || !netif_running(netdev)) {
++ /* If budget not fully consumed, exit the polling mode */
++ if (work_done < budget) {
+ netif_rx_complete(netdev, napi);
+ e100_enable_irq(nic);
+ }
+diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c
+index 4f37506..13d57b0 100644
+--- a/drivers/net/e1000/e1000_main.c
++++ b/drivers/net/e1000/e1000_main.c
+@@ -3919,32 +3919,26 @@ e1000_clean(struct napi_struct *napi, int budget)
+ {
+ struct e1000_adapter *adapter = container_of(napi, struct e1000_adapter, napi);
+ struct net_device *poll_dev = adapter->netdev;
+- int tx_cleaned = 0, work_done = 0;
++ int work_done = 0;
+
+ /* Must NOT use netdev_priv macro here. */
+ adapter = poll_dev->priv;
+
+- /* Keep link state information with original netdev */
+- if (!netif_carrier_ok(poll_dev))
+- goto quit_polling;
+-
+ /* e1000_clean is called per-cpu. This lock protects
+ * tx_ring[0] from being cleaned by multiple cpus
+ * simultaneously. A failure obtaining the lock means
+ * tx_ring[0] is currently being cleaned anyway. */
+ if (spin_trylock(&adapter->tx_queue_lock)) {
+- tx_cleaned = e1000_clean_tx_irq(adapter,
+- &adapter->tx_ring[0]);
++ e1000_clean_tx_irq(adapter,
++ &adapter->tx_ring[0]);
+ spin_unlock(&adapter->tx_queue_lock);
+ }
+
+ adapter->clean_rx(adapter, &adapter->rx_ring[0],
+ &work_done, budget);
+
+- /* If no Tx and not enough Rx work done, exit the polling mode */
+- if ((!tx_cleaned && (work_done == 0)) ||
+- !netif_running(poll_dev)) {
+-quit_polling:
++ /* If budget not fully consumed, exit the polling mode */
++ if (work_done < budget) {
+ if (likely(adapter->itr_setting & 3))
+ e1000_set_itr(adapter);
+ netif_rx_complete(poll_dev, napi);
+diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c
+index 4fd2e23..4a6fc74 100644
+--- a/drivers/net/e1000e/netdev.c
++++ b/drivers/net/e1000e/netdev.c
+@@ -1384,30 +1384,24 @@ static int e1000_clean(struct napi_struct *napi, int budget)
+ {
+ struct e1000_adapter *adapter = container_of(napi, struct e1000_adapter, napi);
+ struct net_device *poll_dev = adapter->netdev;
+- int tx_cleaned = 0, work_done = 0;
++ int work_done = 0;
+
+ /* Must NOT use netdev_priv macro here. */
+ adapter = poll_dev->priv;
+
+- /* Keep link state information with original netdev */
+- if (!netif_carrier_ok(poll_dev))
+- goto quit_polling;
+-
+ /* e1000_clean is called per-cpu. This lock protects
+ * tx_ring from being cleaned by multiple cpus
+ * simultaneously. A failure obtaining the lock means
+ * tx_ring is currently being cleaned anyway. */
+ if (spin_trylock(&adapter->tx_queue_lock)) {
+- tx_cleaned = e1000_clean_tx_irq(adapter);
++ e1000_clean_tx_irq(adapter);
+ spin_unlock(&adapter->tx_queue_lock);
+ }
+
+ adapter->clean_rx(adapter, &work_done, budget);
+
+- /* If no Tx and not enough Rx work done, exit the polling mode */
+- if ((!tx_cleaned && (work_done < budget)) ||
+- !netif_running(poll_dev)) {
+-quit_polling:
++ /* If budget not fully consumed, exit the polling mode */
++ if (work_done < budget) {
+ if (adapter->itr_setting & 3)
+ e1000_set_itr(adapter);
+ netif_rx_complete(poll_dev, napi);
+diff --git a/drivers/net/epic100.c b/drivers/net/epic100.c
+index ecdd3fc..0b365b8 100644
+--- a/drivers/net/epic100.c
++++ b/drivers/net/epic100.c
+@@ -1273,7 +1273,7 @@ rx_action:
+
+ epic_rx_err(dev, ep);
+
+- if (netif_running(dev) && (work_done < budget)) {
++ if (work_done < budget) {
+ unsigned long flags;
+ int more;
+
+diff --git a/drivers/net/fec_8xx/fec_main.c b/drivers/net/fec_8xx/fec_main.c
+index 8d2904f..ab9637a 100644
+--- a/drivers/net/fec_8xx/fec_main.c
++++ b/drivers/net/fec_8xx/fec_main.c
+@@ -476,11 +476,6 @@ static int fec_enet_rx_common(struct fec_enet_private *ep,
+ __u16 pkt_len, sc;
+ int curidx;
+
+- if (fpi->use_napi) {
+- if (!netif_running(dev))
+- return 0;
+- }
+-
+ /*
+ * First, grab all of the stats for the incoming packet.
+ * These get messed up if we get called due to a busy condition.
+diff --git a/drivers/net/forcedeth.c b/drivers/net/forcedeth.c
+index a96583c..f84c752 100644
+--- a/drivers/net/forcedeth.c
++++ b/drivers/net/forcedeth.c
+@@ -5199,10 +5199,6 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
+ dev->dev_addr[3] = (np->orig_mac[0] >> 16) & 0xff;
+ dev->dev_addr[4] = (np->orig_mac[0] >> 8) & 0xff;
+ dev->dev_addr[5] = (np->orig_mac[0] >> 0) & 0xff;
+- /* set permanent address to be correct aswell */
+- np->orig_mac[0] = (dev->dev_addr[0] << 0) + (dev->dev_addr[1] << 8) +
+- (dev->dev_addr[2] << 16) + (dev->dev_addr[3] << 24);
+- np->orig_mac[1] = (dev->dev_addr[4] << 0) + (dev->dev_addr[5] << 8);
+ writel(txreg|NVREG_TRANSMITPOLL_MAC_ADDR_REV, base + NvRegTransmitPoll);
+ }
+ memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
+@@ -5414,6 +5410,8 @@ static void __devexit nv_remove(struct pci_dev *pci_dev)
+ */
+ writel(np->orig_mac[0], base + NvRegMacAddrA);
+ writel(np->orig_mac[1], base + NvRegMacAddrB);
++ writel(readl(base + NvRegTransmitPoll) & ~NVREG_TRANSMITPOLL_MAC_ADDR_REV,
++ base + NvRegTransmitPoll);
+
+ /* free all structures */
+ free_rings(dev);
+diff --git a/drivers/net/fs_enet/fs_enet-main.c b/drivers/net/fs_enet/fs_enet-main.c
+index f2a4d39..c83bd65 100644
+--- a/drivers/net/fs_enet/fs_enet-main.c
++++ b/drivers/net/fs_enet/fs_enet-main.c
+@@ -96,9 +96,6 @@ static int fs_enet_rx_napi(struct napi_struct *napi, int budget)
+ u16 pkt_len, sc;
+ int curidx;
+
+- if (!netif_running(dev))
+- return 0;
+-
+ /*
+ * First, grab all of the stats for the incoming packet.
+ * These get messed up if we get called due to a busy condition.
+@@ -897,14 +894,21 @@ static void fs_get_regs(struct net_device *dev, struct ethtool_regs *regs,
+ static int fs_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+ {
+ struct fs_enet_private *fep = netdev_priv(dev);
++
++ if (!fep->phydev)
++ return -ENODEV;
++
+ return phy_ethtool_gset(fep->phydev, cmd);
+ }
+
+ static int fs_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+ {
+ struct fs_enet_private *fep = netdev_priv(dev);
+- phy_ethtool_sset(fep->phydev, cmd);
+- return 0;
++
++ if (!fep->phydev)
++ return -ENODEV;
++
++ return phy_ethtool_sset(fep->phydev, cmd);
+ }
+
+ static int fs_nway_reset(struct net_device *dev)
+diff --git a/drivers/net/ixgb/ixgb_main.c b/drivers/net/ixgb/ixgb_main.c
+index bf9085f..d2fb88d 100644
+--- a/drivers/net/ixgb/ixgb_main.c
++++ b/drivers/net/ixgb/ixgb_main.c
+@@ -1787,14 +1787,13 @@ ixgb_clean(struct napi_struct *napi, int budget)
+ {
+ struct ixgb_adapter *adapter = container_of(napi, struct ixgb_adapter, napi);
+ struct net_device *netdev = adapter->netdev;
+- int tx_cleaned;
+ int work_done = 0;
+
+- tx_cleaned = ixgb_clean_tx_irq(adapter);
++ ixgb_clean_tx_irq(adapter);
+ ixgb_clean_rx_irq(adapter, &work_done, budget);
+
+- /* if no Tx and not enough Rx work done, exit the polling mode */
+- if((!tx_cleaned && (work_done == 0)) || !netif_running(netdev)) {
++ /* If budget not fully consumed, exit the polling mode */
++ if (work_done < budget) {
+ netif_rx_complete(netdev, napi);
+ ixgb_irq_enable(adapter);
+ }
+diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c
+index 00bc525..a564916 100644
+--- a/drivers/net/ixgbe/ixgbe_main.c
++++ b/drivers/net/ixgbe/ixgbe_main.c
+@@ -1468,21 +1468,15 @@ static int ixgbe_clean(struct napi_struct *napi, int budget)
+ struct ixgbe_adapter *adapter = container_of(napi,
+ struct ixgbe_adapter, napi);
+ struct net_device *netdev = adapter->netdev;
+- int tx_cleaned = 0, work_done = 0;
+-
+- /* Keep link state information with original netdev */
+- if (!netif_carrier_ok(adapter->netdev))
+- goto quit_polling;
++ int work_done = 0;
+
+ /* In non-MSIX case, there is no multi-Tx/Rx queue */
+- tx_cleaned = ixgbe_clean_tx_irq(adapter, adapter->tx_ring);
++ ixgbe_clean_tx_irq(adapter, adapter->tx_ring);
+ ixgbe_clean_rx_irq(adapter, &adapter->rx_ring[0], &work_done,
+ budget);
+
+- /* If no Tx and not enough Rx work done, exit the polling mode */
+- if ((!tx_cleaned && (work_done < budget)) ||
+- !netif_running(adapter->netdev)) {
+-quit_polling:
++ /* If budget not fully consumed, exit the polling mode */
++ if (work_done < budget) {
+ netif_rx_complete(netdev, napi);
+ ixgbe_irq_enable(adapter);
+ }
+diff --git a/drivers/net/ixp2000/ixpdev.c b/drivers/net/ixp2000/ixpdev.c
+index 6c0dd49..484cb2b 100644
+--- a/drivers/net/ixp2000/ixpdev.c
++++ b/drivers/net/ixp2000/ixpdev.c
+@@ -135,8 +135,6 @@ static int ixpdev_poll(struct napi_struct *napi, int budget)
+ struct net_device *dev = ip->dev;
+ int rx;
+
+- /* @@@ Have to stop polling when nds[0] is administratively
+- * downed while we are polling. */
+ rx = 0;
+ do {
+ ixp2000_reg_write(IXP2000_IRQ_THD_RAW_STATUS_A_0, 0x00ff);
+diff --git a/drivers/net/loopback.c b/drivers/net/loopback.c
+index 662b8d1..fa147cd 100644
+--- a/drivers/net/loopback.c
++++ b/drivers/net/loopback.c
+@@ -242,7 +242,7 @@ static void loopback_setup(struct net_device *dev)
+ | NETIF_F_NO_CSUM
+ | NETIF_F_HIGHDMA
+ | NETIF_F_LLTX
+- | NETIF_F_NETNS_LOCAL,
++ | NETIF_F_NETNS_LOCAL;
+ dev->ethtool_ops = &loopback_ethtool_ops;
+ dev->header_ops = ð_header_ops;
+ dev->init = loopback_dev_init;
+diff --git a/drivers/net/meth.c b/drivers/net/meth.c
+index 0c89b02..cdaa8fc 100644
+--- a/drivers/net/meth.c
++++ b/drivers/net/meth.c
+@@ -95,11 +95,14 @@ static inline void load_eaddr(struct net_device *dev)
+ {
+ int i;
+ DECLARE_MAC_BUF(mac);
++ u64 macaddr;
+
+- for (i = 0; i < 6; i++)
+- dev->dev_addr[i] = o2meth_eaddr[i];
+ DPRINTK("Loading MAC Address: %s\n", print_mac(mac, dev->dev_addr));
+- mace->eth.mac_addr = (*(unsigned long*)o2meth_eaddr) >> 16;
++ macaddr = 0;
++ for (i = 0; i < 6; i++)
++ macaddr |= dev->dev_addr[i] << ((5 - i) * 8);
++
++ mace->eth.mac_addr = macaddr;
+ }
+
+ /*
+@@ -794,6 +797,7 @@ static int __init meth_probe(struct platform_device *pdev)
+ #endif
+ dev->irq = MACE_ETHERNET_IRQ;
+ dev->base_addr = (unsigned long)&mace->eth;
++ memcpy(dev->dev_addr, o2meth_eaddr, 6);
+
+ priv = netdev_priv(dev);
+ spin_lock_init(&priv->meth_lock);
+diff --git a/drivers/net/myri10ge/myri10ge.c b/drivers/net/myri10ge/myri10ge.c
+index 8def865..c90958f 100644
+--- a/drivers/net/myri10ge/myri10ge.c
++++ b/drivers/net/myri10ge/myri10ge.c
+@@ -1239,7 +1239,7 @@ static int myri10ge_poll(struct napi_struct *napi, int budget)
+ /* process as many rx events as NAPI will allow */
+ work_done = myri10ge_clean_rx_done(mgp, budget);
+
+- if (work_done < budget || !netif_running(netdev)) {
++ if (work_done < budget) {
+ netif_rx_complete(netdev, napi);
+ put_be32(htonl(3), mgp->irq_claim);
+ }
+diff --git a/drivers/net/natsemi.c b/drivers/net/natsemi.c
+index 87cde06..c329a4f 100644
+--- a/drivers/net/natsemi.c
++++ b/drivers/net/natsemi.c
+@@ -2266,7 +2266,7 @@ static int natsemi_poll(struct napi_struct *napi, int budget)
+ /* Reenable interrupts providing nothing is trying to shut
+ * the chip down. */
+ spin_lock(&np->lock);
+- if (!np->hands_off && netif_running(dev))
++ if (!np->hands_off)
+ natsemi_irq_enable(dev);
+ spin_unlock(&np->lock);
+
+diff --git a/drivers/net/netx-eth.c b/drivers/net/netx-eth.c
+index 5267e03..78d34af 100644
+--- a/drivers/net/netx-eth.c
++++ b/drivers/net/netx-eth.c
+@@ -169,8 +169,8 @@ static void netx_eth_receive(struct net_device *ndev)
+ ndev->last_rx = jiffies;
+ skb->protocol = eth_type_trans(skb, ndev);
+ netif_rx(skb);
+- dev->stats.rx_packets++;
+- dev->stats.rx_bytes += len;
++ ndev->stats.rx_packets++;
++ ndev->stats.rx_bytes += len;
+ }
+
+ static irqreturn_t
+diff --git a/drivers/net/netxen/netxen_nic.h b/drivers/net/netxen/netxen_nic.h
+index fbc2553..a8f63c4 100644
+--- a/drivers/net/netxen/netxen_nic.h
++++ b/drivers/net/netxen/netxen_nic.h
+@@ -65,8 +65,8 @@
+
+ #define _NETXEN_NIC_LINUX_MAJOR 3
+ #define _NETXEN_NIC_LINUX_MINOR 4
+-#define _NETXEN_NIC_LINUX_SUBVERSION 2
+-#define NETXEN_NIC_LINUX_VERSIONID "3.4.2"
++#define _NETXEN_NIC_LINUX_SUBVERSION 18
++#define NETXEN_NIC_LINUX_VERSIONID "3.4.18"
+
+ #define NETXEN_NUM_FLASH_SECTORS (64)
+ #define NETXEN_FLASH_SECTOR_SIZE (64 * 1024)
+@@ -309,23 +309,26 @@ struct netxen_ring_ctx {
+ ((cmd_desc)->port_ctxid |= ((var) & 0xF0))
+
+ #define netxen_set_cmd_desc_flags(cmd_desc, val) \
+- ((cmd_desc)->flags_opcode &= ~cpu_to_le16(0x7f), \
+- (cmd_desc)->flags_opcode |= cpu_to_le16((val) & 0x7f))
++ (cmd_desc)->flags_opcode = ((cmd_desc)->flags_opcode & \
++ ~cpu_to_le16(0x7f)) | cpu_to_le16((val) & 0x7f)
+ #define netxen_set_cmd_desc_opcode(cmd_desc, val) \
+- ((cmd_desc)->flags_opcode &= ~cpu_to_le16(0x3f<<7), \
+- (cmd_desc)->flags_opcode |= cpu_to_le16(((val & 0x3f)<<7)))
++ (cmd_desc)->flags_opcode = ((cmd_desc)->flags_opcode & \
++ ~cpu_to_le16((u16)0x3f << 7)) | cpu_to_le16(((val) & 0x3f) << 7)
+
+ #define netxen_set_cmd_desc_num_of_buff(cmd_desc, val) \
+- ((cmd_desc)->num_of_buffers_total_length &= ~cpu_to_le32(0xff), \
+- (cmd_desc)->num_of_buffers_total_length |= cpu_to_le32((val) & 0xff))
++ (cmd_desc)->num_of_buffers_total_length = \
++ ((cmd_desc)->num_of_buffers_total_length & \
++ ~cpu_to_le32(0xff)) | cpu_to_le32((val) & 0xff)
+ #define netxen_set_cmd_desc_totallength(cmd_desc, val) \
+- ((cmd_desc)->num_of_buffers_total_length &= ~cpu_to_le32(0xffffff00), \
+- (cmd_desc)->num_of_buffers_total_length |= cpu_to_le32(val << 8))
++ (cmd_desc)->num_of_buffers_total_length = \
++ ((cmd_desc)->num_of_buffers_total_length & \
++ ~cpu_to_le32((u32)0xffffff << 8)) | \
++ cpu_to_le32(((val) & 0xffffff) << 8)
+
+ #define netxen_get_cmd_desc_opcode(cmd_desc) \
+- ((le16_to_cpu((cmd_desc)->flags_opcode) >> 7) & 0x003F)
++ ((le16_to_cpu((cmd_desc)->flags_opcode) >> 7) & 0x003f)
+ #define netxen_get_cmd_desc_totallength(cmd_desc) \
+- (le32_to_cpu((cmd_desc)->num_of_buffers_total_length) >> 8)
++ ((le32_to_cpu((cmd_desc)->num_of_buffers_total_length) >> 8) & 0xffffff)
+
+ struct cmd_desc_type0 {
+ u8 tcp_hdr_offset; /* For LSO only */
+@@ -412,29 +415,29 @@ struct rcv_desc {
+ #define netxen_get_sts_desc_lro_last_frag(status_desc) \
+ (((status_desc)->lro & 0x80) >> 7)
+
+-#define netxen_get_sts_port(status_desc) \
+- (le64_to_cpu((status_desc)->status_desc_data) & 0x0F)
+-#define netxen_get_sts_status(status_desc) \
+- ((le64_to_cpu((status_desc)->status_desc_data) >> 4) & 0x0F)
+-#define netxen_get_sts_type(status_desc) \
+- ((le64_to_cpu((status_desc)->status_desc_data) >> 8) & 0x0F)
+-#define netxen_get_sts_totallength(status_desc) \
+- ((le64_to_cpu((status_desc)->status_desc_data) >> 12) & 0xFFFF)
+-#define netxen_get_sts_refhandle(status_desc) \
+- ((le64_to_cpu((status_desc)->status_desc_data) >> 28) & 0xFFFF)
+-#define netxen_get_sts_prot(status_desc) \
+- ((le64_to_cpu((status_desc)->status_desc_data) >> 44) & 0x0F)
++#define netxen_get_sts_port(sts_data) \
++ ((sts_data) & 0x0F)
++#define netxen_get_sts_status(sts_data) \
++ (((sts_data) >> 4) & 0x0F)
++#define netxen_get_sts_type(sts_data) \
++ (((sts_data) >> 8) & 0x0F)
++#define netxen_get_sts_totallength(sts_data) \
++ (((sts_data) >> 12) & 0xFFFF)
++#define netxen_get_sts_refhandle(sts_data) \
++ (((sts_data) >> 28) & 0xFFFF)
++#define netxen_get_sts_prot(sts_data) \
++ (((sts_data) >> 44) & 0x0F)
++#define netxen_get_sts_opcode(sts_data) \
++ (((sts_data) >> 58) & 0x03F)
++
+ #define netxen_get_sts_owner(status_desc) \
+ ((le64_to_cpu((status_desc)->status_desc_data) >> 56) & 0x03)
+-#define netxen_get_sts_opcode(status_desc) \
+- ((le64_to_cpu((status_desc)->status_desc_data) >> 58) & 0x03F)
+-
+-#define netxen_clear_sts_owner(status_desc) \
+- ((status_desc)->status_desc_data &= \
+- ~cpu_to_le64(((unsigned long long)3) << 56 ))
+-#define netxen_set_sts_owner(status_desc, val) \
+- ((status_desc)->status_desc_data |= \
+- cpu_to_le64(((unsigned long long)((val) & 0x3)) << 56 ))
++#define netxen_set_sts_owner(status_desc, val) { \
++ (status_desc)->status_desc_data = \
++ ((status_desc)->status_desc_data & \
++ ~cpu_to_le64(0x3ULL << 56)) | \
++ cpu_to_le64((u64)((val) & 0x3) << 56); \
++}
+
+ struct status_desc {
+ /* Bit pattern: 0-3 port, 4-7 status, 8-11 type, 12-27 total_length
+diff --git a/drivers/net/netxen/netxen_nic_init.c b/drivers/net/netxen/netxen_nic_init.c
+index 3758926..485ff93 100644
+--- a/drivers/net/netxen/netxen_nic_init.c
++++ b/drivers/net/netxen/netxen_nic_init.c
+@@ -1070,16 +1070,17 @@ netxen_process_rcv(struct netxen_adapter *adapter, int ctxid,
+ {
+ struct pci_dev *pdev = adapter->pdev;
+ struct net_device *netdev = adapter->netdev;
+- int index = netxen_get_sts_refhandle(desc);
++ u64 sts_data = le64_to_cpu(desc->status_desc_data);
++ int index = netxen_get_sts_refhandle(sts_data);
+ struct netxen_recv_context *recv_ctx = &(adapter->recv_ctx[ctxid]);
+ struct netxen_rx_buffer *buffer;
+ struct sk_buff *skb;
+- u32 length = netxen_get_sts_totallength(desc);
++ u32 length = netxen_get_sts_totallength(sts_data);
+ u32 desc_ctx;
+ struct netxen_rcv_desc_ctx *rcv_desc;
+ int ret;
+
+- desc_ctx = netxen_get_sts_type(desc);
++ desc_ctx = netxen_get_sts_type(sts_data);
+ if (unlikely(desc_ctx >= NUM_RCV_DESC_RINGS)) {
+ printk("%s: %s Bad Rcv descriptor ring\n",
+ netxen_nic_driver_name, netdev->name);
+@@ -1119,7 +1120,7 @@ netxen_process_rcv(struct netxen_adapter *adapter, int ctxid,
+ skb = (struct sk_buff *)buffer->skb;
+
+ if (likely(adapter->rx_csum &&
+- netxen_get_sts_status(desc) == STATUS_CKSUM_OK)) {
++ netxen_get_sts_status(sts_data) == STATUS_CKSUM_OK)) {
+ adapter->stats.csummed++;
+ skb->ip_summed = CHECKSUM_UNNECESSARY;
+ } else
+@@ -1209,7 +1210,6 @@ u32 netxen_process_rcv_ring(struct netxen_adapter *adapter, int ctxid, int max)
+ break;
+ }
+ netxen_process_rcv(adapter, ctxid, desc);
+- netxen_clear_sts_owner(desc);
+ netxen_set_sts_owner(desc, STATUS_OWNER_PHANTOM);
+ consumer = (consumer + 1) & (adapter->max_rx_desc_count - 1);
+ count++;
+@@ -1248,7 +1248,6 @@ int netxen_process_cmd_ring(unsigned long data)
+ struct pci_dev *pdev;
+ struct netxen_skb_frag *frag;
+ u32 i;
+- struct sk_buff *skb = NULL;
+ int done;
+
+ spin_lock(&adapter->tx_lock);
+@@ -1278,9 +1277,8 @@ int netxen_process_cmd_ring(unsigned long data)
+ while ((last_consumer != consumer) && (count1 < MAX_STATUS_HANDLE)) {
+ buffer = &adapter->cmd_buf_arr[last_consumer];
+ pdev = adapter->pdev;
+- frag = &buffer->frag_array[0];
+- skb = buffer->skb;
+- if (skb && (cmpxchg(&buffer->skb, skb, 0) == skb)) {
++ if (buffer->skb) {
++ frag = &buffer->frag_array[0];
+ pci_unmap_single(pdev, frag->dma, frag->length,
+ PCI_DMA_TODEVICE);
+ frag->dma = 0ULL;
+@@ -1293,8 +1291,8 @@ int netxen_process_cmd_ring(unsigned long data)
+ }
+
+ adapter->stats.skbfreed++;
+- dev_kfree_skb_any(skb);
+- skb = NULL;
++ dev_kfree_skb_any(buffer->skb);
++ buffer->skb = NULL;
+ } else if (adapter->proc_cmd_buf_counter == 1) {
+ adapter->stats.txnullskb++;
+ }
+diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c
+index a80f0cd..263b55e 100644
+--- a/drivers/net/netxen/netxen_nic_main.c
++++ b/drivers/net/netxen/netxen_nic_main.c
+@@ -732,11 +732,6 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev)
+
+ unregister_netdev(netdev);
+
+- if (adapter->stop_port)
+- adapter->stop_port(adapter);
+-
+- netxen_nic_disable_int(adapter);
+-
+ if (adapter->is_up == NETXEN_ADAPTER_UP_MAGIC) {
+ init_firmware_done++;
+ netxen_free_hw_resources(adapter);
+@@ -919,6 +914,9 @@ static int netxen_nic_close(struct net_device *netdev)
+ netif_stop_queue(netdev);
+ napi_disable(&adapter->napi);
+
++ if (adapter->stop_port)
++ adapter->stop_port(adapter);
++
+ netxen_nic_disable_int(adapter);
+
+ cmd_buff = adapter->cmd_buf_arr;
+@@ -996,28 +994,6 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
+ return NETDEV_TX_OK;
+ }
+
+- /*
+- * Everything is set up. Now, we just need to transmit it out.
+- * Note that we have to copy the contents of buffer over to
+- * right place. Later on, this can be optimized out by de-coupling the
+- * producer index from the buffer index.
+- */
+- retry_getting_window:
+- spin_lock_bh(&adapter->tx_lock);
+- if (adapter->total_threads >= MAX_XMIT_PRODUCERS) {
+- spin_unlock_bh(&adapter->tx_lock);
+- /*
+- * Yield CPU
+- */
+- if (!in_atomic())
+- schedule();
+- else {
+- for (i = 0; i < 20; i++)
+- cpu_relax(); /*This a nop instr on i386 */
+- }
+- goto retry_getting_window;
+- }
+- local_producer = adapter->cmd_producer;
+ /* There 4 fragments per descriptor */
+ no_of_desc = (frag_count + 3) >> 2;
+ if (netdev->features & NETIF_F_TSO) {
+@@ -1031,16 +1007,19 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
+ }
+ }
+ }
++
++ spin_lock_bh(&adapter->tx_lock);
++ if (adapter->total_threads >= MAX_XMIT_PRODUCERS) {
++ goto out_requeue;
++ }
++ local_producer = adapter->cmd_producer;
+ k = adapter->cmd_producer;
+ max_tx_desc_count = adapter->max_tx_desc_count;
+ last_cmd_consumer = adapter->last_cmd_consumer;
+ if ((k + no_of_desc) >=
+ ((last_cmd_consumer <= k) ? last_cmd_consumer + max_tx_desc_count :
+ last_cmd_consumer)) {
+- netif_stop_queue(netdev);
+- adapter->flags |= NETXEN_NETDEV_STATUS;
+- spin_unlock_bh(&adapter->tx_lock);
+- return NETDEV_TX_BUSY;
++ goto out_requeue;
+ }
+ k = get_index_range(k, max_tx_desc_count, no_of_desc);
+ adapter->cmd_producer = k;
+@@ -1093,6 +1072,8 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
+ adapter->max_tx_desc_count);
+ hwdesc = &hw->cmd_desc_head[producer];
+ memset(hwdesc, 0, sizeof(struct cmd_desc_type0));
++ pbuf = &adapter->cmd_buf_arr[producer];
++ pbuf->skb = NULL;
+ }
+ frag = &skb_shinfo(skb)->frags[i - 1];
+ len = frag->size;
+@@ -1148,6 +1129,8 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
+ }
+ /* copy the MAC/IP/TCP headers to the cmd descriptor list */
+ hwdesc = &hw->cmd_desc_head[producer];
++ pbuf = &adapter->cmd_buf_arr[producer];
++ pbuf->skb = NULL;
+
+ /* copy the first 64 bytes */
+ memcpy(((void *)hwdesc) + 2,
+@@ -1156,6 +1139,8 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
+
+ if (more_hdr) {
+ hwdesc = &hw->cmd_desc_head[producer];
++ pbuf = &adapter->cmd_buf_arr[producer];
++ pbuf->skb = NULL;
+ /* copy the next 64 bytes - should be enough except
+ * for pathological case
+ */
+@@ -1167,16 +1152,8 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
+ }
+ }
+
+- i = netxen_get_cmd_desc_totallength(&hw->cmd_desc_head[saved_producer]);
+-
+- hw->cmd_desc_head[saved_producer].flags_opcode =
+- cpu_to_le16(hw->cmd_desc_head[saved_producer].flags_opcode);
+- hw->cmd_desc_head[saved_producer].num_of_buffers_total_length =
+- cpu_to_le32(hw->cmd_desc_head[saved_producer].
+- num_of_buffers_total_length);
+-
+ spin_lock_bh(&adapter->tx_lock);
+- adapter->stats.txbytes += i;
++ adapter->stats.txbytes += skb->len;
+
+ /* Code to update the adapter considering how many producer threads
+ are currently working */
+@@ -1189,14 +1166,17 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
+ }
+
+ adapter->stats.xmitfinished++;
+- spin_unlock_bh(&adapter->tx_lock);
+-
+ netdev->trans_start = jiffies;
+
+- DPRINTK(INFO, "wrote CMD producer %x to phantom\n", producer);
+-
+- DPRINTK(INFO, "Done. Send\n");
++ spin_unlock_bh(&adapter->tx_lock);
+ return NETDEV_TX_OK;
++
++out_requeue:
++ netif_stop_queue(netdev);
++ adapter->flags |= NETXEN_NETDEV_STATUS;
++
++ spin_unlock_bh(&adapter->tx_lock);
++ return NETDEV_TX_BUSY;
+ }
+
+ static void netxen_watchdog(unsigned long v)
+@@ -1321,7 +1301,7 @@ static int netxen_nic_poll(struct napi_struct *napi, int budget)
+ budget / MAX_RCV_CTX);
+ }
+
+- if (work_done >= budget && netxen_nic_rx_has_work(adapter) != 0)
++ if (work_done >= budget)
+ done = 0;
+
+ if (netxen_process_cmd_ring((unsigned long)adapter) == 0)
+diff --git a/drivers/net/netxen/netxen_nic_niu.c b/drivers/net/netxen/netxen_nic_niu.c
+index 5b9e1b3..d04ecb7 100644
+--- a/drivers/net/netxen/netxen_nic_niu.c
++++ b/drivers/net/netxen/netxen_nic_niu.c
+@@ -736,12 +736,12 @@ int netxen_niu_disable_xg_port(struct netxen_adapter *adapter)
+ __u32 mac_cfg;
+ u32 port = physical_port[adapter->portnum];
+
+- if (port != 0)
++ if (port > NETXEN_NIU_MAX_XG_PORTS)
+ return -EINVAL;
++
+ mac_cfg = 0;
+- netxen_xg_soft_reset(mac_cfg);
+- if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_XGE_CONFIG_0,
+- &mac_cfg, 4))
++ if (netxen_nic_hw_write_wx(adapter,
++ NETXEN_NIU_XGE_CONFIG_0 + (0x10000 * port), &mac_cfg, 4))
+ return -EIO;
+ return 0;
+ }
+diff --git a/drivers/net/niu.c b/drivers/net/niu.c
+index abfc61c..9a0c6d3 100644
+--- a/drivers/net/niu.c
++++ b/drivers/net/niu.c
+@@ -33,8 +33,8 @@
+
+ #define DRV_MODULE_NAME "niu"
+ #define PFX DRV_MODULE_NAME ": "
+-#define DRV_MODULE_VERSION "0.5"
+-#define DRV_MODULE_RELDATE "October 5, 2007"
++#define DRV_MODULE_VERSION "0.6"
++#define DRV_MODULE_RELDATE "January 5, 2008"
+
+ static char version[] __devinitdata =
+ DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";
+@@ -2241,6 +2241,8 @@ static int niu_process_rx_pkt(struct niu *np, struct rx_ring_info *rp)
+ skb->protocol = eth_type_trans(skb, np->dev);
+ netif_receive_skb(skb);
+
++ np->dev->last_rx = jiffies;
++
+ return num_rcr;
+ }
+
+@@ -2508,15 +2510,19 @@ static int niu_rx_error(struct niu *np, struct rx_ring_info *rp)
+ u64 stat = nr64(RX_DMA_CTL_STAT(rp->rx_channel));
+ int err = 0;
+
+- dev_err(np->device, PFX "%s: RX channel %u error, stat[%llx]\n",
+- np->dev->name, rp->rx_channel, (unsigned long long) stat);
+-
+- niu_log_rxchan_errors(np, rp, stat);
+
+ if (stat & (RX_DMA_CTL_STAT_CHAN_FATAL |
+ RX_DMA_CTL_STAT_PORT_FATAL))
+ err = -EINVAL;
+
++ if (err) {
++ dev_err(np->device, PFX "%s: RX channel %u error, stat[%llx]\n",
++ np->dev->name, rp->rx_channel,
++ (unsigned long long) stat);
++
++ niu_log_rxchan_errors(np, rp, stat);
++ }
++
+ nw64(RX_DMA_CTL_STAT(rp->rx_channel),
+ stat & RX_DMA_CTL_WRITE_CLEAR_ERRS);
+
+@@ -2749,13 +2755,16 @@ static int niu_device_error(struct niu *np)
+ return -ENODEV;
+ }
+
+-static int niu_slowpath_interrupt(struct niu *np, struct niu_ldg *lp)
++static int niu_slowpath_interrupt(struct niu *np, struct niu_ldg *lp,
++ u64 v0, u64 v1, u64 v2)
+ {
+- u64 v0 = lp->v0;
+- u64 v1 = lp->v1;
+- u64 v2 = lp->v2;
++
+ int i, err = 0;
+
++ lp->v0 = v0;
++ lp->v1 = v1;
++ lp->v2 = v2;
++
+ if (v1 & 0x00000000ffffffffULL) {
+ u32 rx_vec = (v1 & 0xffffffff);
+
+@@ -2764,8 +2773,13 @@ static int niu_slowpath_interrupt(struct niu *np, struct niu_ldg *lp)
+
+ if (rx_vec & (1 << rp->rx_channel)) {
+ int r = niu_rx_error(np, rp);
+- if (r)
++ if (r) {
+ err = r;
++ } else {
++ if (!v0)
++ nw64(RX_DMA_CTL_STAT(rp->rx_channel),
++ RX_DMA_CTL_STAT_MEX);
++ }
+ }
+ }
+ }
+@@ -2803,7 +2817,7 @@ static int niu_slowpath_interrupt(struct niu *np, struct niu_ldg *lp)
+ if (err)
+ niu_enable_interrupts(np, 0);
+
+- return -EINVAL;
++ return err;
+ }
+
+ static void niu_rxchan_intr(struct niu *np, struct rx_ring_info *rp,
+@@ -2905,7 +2919,7 @@ static irqreturn_t niu_interrupt(int irq, void *dev_id)
+ }
+
+ if (unlikely((v0 & ((u64)1 << LDN_MIF)) || v1 || v2)) {
+- int err = niu_slowpath_interrupt(np, lp);
++ int err = niu_slowpath_interrupt(np, lp, v0, v1, v2);
+ if (err)
+ goto out;
+ }
+@@ -5194,7 +5208,8 @@ static int niu_start_xmit(struct sk_buff *skb, struct net_device *dev)
+ }
+ kfree_skb(skb);
+ skb = skb_new;
+- }
++ } else
++ skb_orphan(skb);
+
+ align = ((unsigned long) skb->data & (16 - 1));
+ headroom = align + sizeof(struct tx_pkt_hdr);
+diff --git a/drivers/net/pcnet32.c b/drivers/net/pcnet32.c
+index ff92aca..90498ff 100644
+--- a/drivers/net/pcnet32.c
++++ b/drivers/net/pcnet32.c
+@@ -455,9 +455,14 @@ static void pcnet32_netif_start(struct net_device *dev)
+ {
+ #ifdef CONFIG_PCNET32_NAPI
+ struct pcnet32_private *lp = netdev_priv(dev);
++ ulong ioaddr = dev->base_addr;
++ u16 val;
+ #endif
+ netif_wake_queue(dev);
+ #ifdef CONFIG_PCNET32_NAPI
++ val = lp->a.read_csr(ioaddr, CSR3);
++ val &= 0x00ff;
++ lp->a.write_csr(ioaddr, CSR3, val);
+ napi_enable(&lp->napi);
+ #endif
+ }
+diff --git a/drivers/net/qla3xxx.c b/drivers/net/qla3xxx.c
+index a579111..cf0774d 100644
+--- a/drivers/net/qla3xxx.c
++++ b/drivers/net/qla3xxx.c
+@@ -2320,14 +2320,9 @@ static int ql_poll(struct napi_struct *napi, int budget)
+ unsigned long hw_flags;
+ struct ql3xxx_port_registers __iomem *port_regs = qdev->mem_map_registers;
+
+- if (!netif_carrier_ok(ndev))
+- goto quit_polling;
+-
+ ql_tx_rx_clean(qdev, &tx_cleaned, &rx_cleaned, budget);
+
+- if (tx_cleaned + rx_cleaned != budget ||
+- !netif_running(ndev)) {
+-quit_polling:
++ if (tx_cleaned + rx_cleaned != budget) {
+ spin_lock_irqsave(&qdev->hw_lock, hw_flags);
+ __netif_rx_complete(ndev, napi);
+ ql_update_small_bufq_prod_index(qdev);
+diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
+index 5863190..3acfeea 100644
+--- a/drivers/net/r8169.c
++++ b/drivers/net/r8169.c
+@@ -2002,7 +2002,7 @@ static void rtl8169_set_magic_reg(void __iomem *ioaddr, unsigned mac_version)
+ u32 clk;
+
+ clk = RTL_R8(Config2) & PCI_Clock_66MHz;
+- for (i = 0; i < ARRAY_SIZE(cfg2_info); i++) {
++ for (i = 0; i < ARRAY_SIZE(cfg2_info); i++, p++) {
+ if ((p->mac_version == mac_version) && (p->clk == clk)) {
+ RTL_W32(0x7c, p->val);
+ break;
+@@ -2398,6 +2398,8 @@ static void rtl8169_wait_for_quiescence(struct net_device *dev)
+ rtl8169_irq_mask_and_ack(ioaddr);
+
+ #ifdef CONFIG_R8169_NAPI
++ tp->intr_mask = 0xffff;
++ RTL_W16(IntrMask, tp->intr_event);
+ napi_enable(&tp->napi);
+ #endif
+ }
+diff --git a/drivers/net/s2io.c b/drivers/net/s2io.c
+index 9d80f1c..fa57c49 100644
+--- a/drivers/net/s2io.c
++++ b/drivers/net/s2io.c
+@@ -2704,9 +2704,6 @@ static int s2io_poll(struct napi_struct *napi, int budget)
+ struct XENA_dev_config __iomem *bar0 = nic->bar0;
+ int i;
+
+- if (!is_s2io_card_up(nic))
+- return 0;
+-
+ mac_control = &nic->mac_control;
+ config = &nic->config;
+
+diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c
+index a74fc11..7023bbe 100644
+--- a/drivers/net/sky2.c
++++ b/drivers/net/sky2.c
+@@ -944,7 +944,6 @@ static void tx_init(struct sky2_port *sky2)
+ le = get_tx_le(sky2);
+ le->addr = 0;
+ le->opcode = OP_ADDR64 | HW_OWNER;
+- sky2->tx_addr64 = 0;
+ }
+
+ static inline struct tx_ring_info *tx_le_re(struct sky2_port *sky2,
+@@ -978,13 +977,11 @@ static void sky2_rx_add(struct sky2_port *sky2, u8 op,
+ dma_addr_t map, unsigned len)
+ {
+ struct sky2_rx_le *le;
+- u32 hi = upper_32_bits(map);
+
+- if (sky2->rx_addr64 != hi) {
++ if (sizeof(dma_addr_t) > sizeof(u32)) {
+ le = sky2_next_rx(sky2);
+- le->addr = cpu_to_le32(hi);
++ le->addr = cpu_to_le32(upper_32_bits(map));
+ le->opcode = OP_ADDR64 | HW_OWNER;
+- sky2->rx_addr64 = upper_32_bits(map + len);
+ }
+
+ le = sky2_next_rx(sky2);
+@@ -1168,6 +1165,7 @@ static void sky2_vlan_rx_register(struct net_device *dev, struct vlan_group *grp
+ TX_VLAN_TAG_OFF);
+ }
+
++ sky2_read32(hw, B0_Y2_SP_LISR);
+ napi_enable(&hw->napi);
+ netif_tx_unlock_bh(dev);
+ }
+@@ -1479,7 +1477,6 @@ static int sky2_xmit_frame(struct sk_buff *skb, struct net_device *dev)
+ struct tx_ring_info *re;
+ unsigned i, len;
+ dma_addr_t mapping;
+- u32 addr64;
+ u16 mss;
+ u8 ctrl;
+
+@@ -1492,15 +1489,12 @@ static int sky2_xmit_frame(struct sk_buff *skb, struct net_device *dev)
+
+ len = skb_headlen(skb);
+ mapping = pci_map_single(hw->pdev, skb->data, len, PCI_DMA_TODEVICE);
+- addr64 = upper_32_bits(mapping);
+
+- /* Send high bits if changed or crosses boundary */
+- if (addr64 != sky2->tx_addr64 ||
+- upper_32_bits(mapping + len) != sky2->tx_addr64) {
++ /* Send high bits if needed */
++ if (sizeof(dma_addr_t) > sizeof(u32)) {
+ le = get_tx_le(sky2);
+- le->addr = cpu_to_le32(addr64);
++ le->addr = cpu_to_le32(upper_32_bits(mapping));
+ le->opcode = OP_ADDR64 | HW_OWNER;
+- sky2->tx_addr64 = upper_32_bits(mapping + len);
+ }
+
+ /* Check for TCP Segmentation Offload */
+@@ -1581,13 +1575,12 @@ static int sky2_xmit_frame(struct sk_buff *skb, struct net_device *dev)
+
+ mapping = pci_map_page(hw->pdev, frag->page, frag->page_offset,
+ frag->size, PCI_DMA_TODEVICE);
+- addr64 = upper_32_bits(mapping);
+- if (addr64 != sky2->tx_addr64) {
++
++ if (sizeof(dma_addr_t) > sizeof(u32)) {
+ le = get_tx_le(sky2);
+- le->addr = cpu_to_le32(addr64);
++ le->addr = cpu_to_le32(upper_32_bits(mapping));
+ le->ctrl = 0;
+ le->opcode = OP_ADDR64 | HW_OWNER;
+- sky2->tx_addr64 = addr64;
+ }
+
+ le = get_tx_le(sky2);
+@@ -2043,6 +2036,7 @@ static int sky2_change_mtu(struct net_device *dev, int new_mtu)
+ err = sky2_rx_start(sky2);
+ sky2_write32(hw, B0_IMSK, imask);
+
++ sky2_read32(hw, B0_Y2_SP_LISR);
+ napi_enable(&hw->napi);
+
+ if (err)
+@@ -3861,6 +3855,7 @@ static int sky2_debug_show(struct seq_file *seq, void *v)
+ last = sky2_read16(hw, Y2_QADDR(rxqaddr[port], PREF_UNIT_PUT_IDX)),
+ sky2_read16(hw, Y2_QADDR(rxqaddr[port], PREF_UNIT_LAST_IDX)));
+
++ sky2_read32(hw, B0_Y2_SP_LISR);
+ napi_enable(&hw->napi);
+ return 0;
+ }
+@@ -3954,7 +3949,7 @@ static __exit void sky2_debug_cleanup(void)
+ /* Initialize network device */
+ static __devinit struct net_device *sky2_init_netdev(struct sky2_hw *hw,
+ unsigned port,
+- int highmem, int wol)
++ int highmem)
+ {
+ struct sky2_port *sky2;
+ struct net_device *dev = alloc_etherdev(sizeof(*sky2));
+@@ -3994,7 +3989,7 @@ static __devinit struct net_device *sky2_init_netdev(struct sky2_hw *hw,
+ sky2->speed = -1;
+ sky2->advertising = sky2_supported_modes(hw);
+ sky2->rx_csum = (hw->chip_id != CHIP_ID_YUKON_XL);
+- sky2->wol = wol;
++ sky2->wol = sky2_wol_supported(hw) & WAKE_MAGIC;
+
+ spin_lock_init(&sky2->phy_lock);
+ sky2->tx_pending = TX_DEF_PENDING;
+@@ -4091,24 +4086,12 @@ static int __devinit sky2_test_msi(struct sky2_hw *hw)
+ return err;
+ }
+
+-static int __devinit pci_wake_enabled(struct pci_dev *dev)
+-{
+- int pm = pci_find_capability(dev, PCI_CAP_ID_PM);
+- u16 value;
+-
+- if (!pm)
+- return 0;
+- if (pci_read_config_word(dev, pm + PCI_PM_CTRL, &value))
+- return 0;
+- return value & PCI_PM_CTRL_PME_ENABLE;
+-}
+-
+ static int __devinit sky2_probe(struct pci_dev *pdev,
+ const struct pci_device_id *ent)
+ {
+ struct net_device *dev;
+ struct sky2_hw *hw;
+- int err, using_dac = 0, wol_default;
++ int err, using_dac = 0;
+
+ err = pci_enable_device(pdev);
+ if (err) {
+@@ -4141,8 +4124,6 @@ static int __devinit sky2_probe(struct pci_dev *pdev,
+ }
+ }
+
+- wol_default = pci_wake_enabled(pdev) ? WAKE_MAGIC : 0;
+-
+ err = -ENOMEM;
+ hw = kzalloc(sizeof(*hw), GFP_KERNEL);
+ if (!hw) {
+@@ -4186,7 +4167,7 @@ static int __devinit sky2_probe(struct pci_dev *pdev,
+
+ sky2_reset(hw);
+
+- dev = sky2_init_netdev(hw, 0, using_dac, wol_default);
++ dev = sky2_init_netdev(hw, 0, using_dac);
+ if (!dev) {
+ err = -ENOMEM;
+ goto err_out_free_pci;
+@@ -4223,7 +4204,7 @@ static int __devinit sky2_probe(struct pci_dev *pdev,
+ if (hw->ports > 1) {
+ struct net_device *dev1;
+
+- dev1 = sky2_init_netdev(hw, 1, using_dac, wol_default);
++ dev1 = sky2_init_netdev(hw, 1, using_dac);
+ if (!dev1)
+ dev_warn(&pdev->dev, "allocation for second device failed\n");
+ else if ((err = register_netdev(dev1))) {
+diff --git a/drivers/net/sky2.h b/drivers/net/sky2.h
+index bc646a4..ffe9b8a 100644
+--- a/drivers/net/sky2.h
++++ b/drivers/net/sky2.h
+@@ -1991,14 +1991,14 @@ struct sky2_port {
+ u16 tx_cons; /* next le to check */
+ u16 tx_prod; /* next le to use */
+ u16 tx_next; /* debug only */
+- u32 tx_addr64;
++
+ u16 tx_pending;
+ u16 tx_last_mss;
+ u32 tx_tcpsum;
+
+ struct rx_ring_info *rx_ring ____cacheline_aligned_in_smp;
+ struct sky2_rx_le *rx_le;
+- u32 rx_addr64;
++
+ u16 rx_next; /* next re to check */
+ u16 rx_put; /* next le index to use */
+ u16 rx_pending;
+diff --git a/drivers/net/tulip/de4x5.c b/drivers/net/tulip/de4x5.c
+index 41f34bb..6e8b18a 100644
+--- a/drivers/net/tulip/de4x5.c
++++ b/drivers/net/tulip/de4x5.c
+@@ -911,7 +911,7 @@ static int de4x5_init(struct net_device *dev);
+ static int de4x5_sw_reset(struct net_device *dev);
+ static int de4x5_rx(struct net_device *dev);
+ static int de4x5_tx(struct net_device *dev);
+-static int de4x5_ast(struct net_device *dev);
++static void de4x5_ast(struct net_device *dev);
+ static int de4x5_txur(struct net_device *dev);
+ static int de4x5_rx_ovfc(struct net_device *dev);
+
+@@ -984,11 +984,9 @@ static int test_bad_enet(struct net_device *dev, int status);
+ static int an_exception(struct de4x5_private *lp);
+ static char *build_setup_frame(struct net_device *dev, int mode);
+ static void disable_ast(struct net_device *dev);
+-static void enable_ast(struct net_device *dev, u32 time_out);
+ static long de4x5_switch_mac_port(struct net_device *dev);
+ static int gep_rd(struct net_device *dev);
+ static void gep_wr(s32 data, struct net_device *dev);
+-static void timeout(struct net_device *dev, void (*fn)(u_long data), u_long data, u_long msec);
+ static void yawn(struct net_device *dev, int state);
+ static void de4x5_parse_params(struct net_device *dev);
+ static void de4x5_dbg_open(struct net_device *dev);
+@@ -1139,6 +1137,8 @@ de4x5_hw_init(struct net_device *dev, u_long iobase, struct device *gendev)
+ lp->gendev = gendev;
+ spin_lock_init(&lp->lock);
+ init_timer(&lp->timer);
++ lp->timer.function = (void (*)(unsigned long))de4x5_ast;
++ lp->timer.data = (unsigned long)dev;
+ de4x5_parse_params(dev);
+
+ /*
+@@ -1311,7 +1311,7 @@ de4x5_open(struct net_device *dev)
+ lp->state = OPEN;
+ de4x5_dbg_open(dev);
+
+- if (request_irq(dev->irq, (void *)de4x5_interrupt, IRQF_SHARED,
++ if (request_irq(dev->irq, de4x5_interrupt, IRQF_SHARED,
+ lp->adapter_name, dev)) {
+ printk("de4x5_open(): Requested IRQ%d is busy - attemping FAST/SHARE...", dev->irq);
+ if (request_irq(dev->irq, de4x5_interrupt, IRQF_DISABLED | IRQF_SHARED,
+@@ -1737,27 +1737,29 @@ de4x5_tx(struct net_device *dev)
+ return 0;
+ }
+
+-static int
++static void
+ de4x5_ast(struct net_device *dev)
+ {
+- struct de4x5_private *lp = netdev_priv(dev);
+- int next_tick = DE4X5_AUTOSENSE_MS;
++ struct de4x5_private *lp = netdev_priv(dev);
++ int next_tick = DE4X5_AUTOSENSE_MS;
++ int dt;
+
+- disable_ast(dev);
++ if (lp->useSROM)
++ next_tick = srom_autoconf(dev);
++ else if (lp->chipset == DC21140)
++ next_tick = dc21140m_autoconf(dev);
++ else if (lp->chipset == DC21041)
++ next_tick = dc21041_autoconf(dev);
++ else if (lp->chipset == DC21040)
++ next_tick = dc21040_autoconf(dev);
++ lp->linkOK = 0;
+
+- if (lp->useSROM) {
+- next_tick = srom_autoconf(dev);
+- } else if (lp->chipset == DC21140) {
+- next_tick = dc21140m_autoconf(dev);
+- } else if (lp->chipset == DC21041) {
+- next_tick = dc21041_autoconf(dev);
+- } else if (lp->chipset == DC21040) {
+- next_tick = dc21040_autoconf(dev);
+- }
+- lp->linkOK = 0;
+- enable_ast(dev, next_tick);
++ dt = (next_tick * HZ) / 1000;
+
+- return 0;
++ if (!dt)
++ dt = 1;
++
++ mod_timer(&lp->timer, jiffies + dt);
+ }
+
+ static int
+@@ -2174,7 +2176,7 @@ srom_search(struct net_device *dev, struct pci_dev *pdev)
+ for (j=0, i=0; i<ETH_ALEN; i++) {
+ j += (u_char) *((u_char *)&lp->srom + SROM_HWADD + i);
+ }
+- if ((j != 0) && (j != 0x5fa)) {
++ if (j != 0 && j != 6 * 0xff) {
+ last.chipset = device;
+ last.bus = pb;
+ last.irq = irq;
+@@ -2371,30 +2373,19 @@ static struct pci_driver de4x5_pci_driver = {
+ static int
+ autoconf_media(struct net_device *dev)
+ {
+- struct de4x5_private *lp = netdev_priv(dev);
+- u_long iobase = dev->base_addr;
+- int next_tick = DE4X5_AUTOSENSE_MS;
++ struct de4x5_private *lp = netdev_priv(dev);
++ u_long iobase = dev->base_addr;
+
+- lp->linkOK = 0;
+- lp->c_media = AUTO; /* Bogus last media */
+- disable_ast(dev);
+- inl(DE4X5_MFC); /* Zero the lost frames counter */
+- lp->media = INIT;
+- lp->tcount = 0;
++ disable_ast(dev);
+
+- if (lp->useSROM) {
+- next_tick = srom_autoconf(dev);
+- } else if (lp->chipset == DC21040) {
+- next_tick = dc21040_autoconf(dev);
+- } else if (lp->chipset == DC21041) {
+- next_tick = dc21041_autoconf(dev);
+- } else if (lp->chipset == DC21140) {
+- next_tick = dc21140m_autoconf(dev);
+- }
++ lp->c_media = AUTO; /* Bogus last media */
++ inl(DE4X5_MFC); /* Zero the lost frames counter */
++ lp->media = INIT;
++ lp->tcount = 0;
+
+- enable_ast(dev, next_tick);
++ de4x5_ast(dev);
+
+- return (lp->media);
++ return lp->media;
+ }
+
+ /*
+@@ -4018,20 +4009,22 @@ DevicePresent(struct net_device *dev, u_long aprom_addr)
+ outl(0, aprom_addr); /* Reset Ethernet Address ROM Pointer */
+ }
+ } else { /* Read new srom */
+- u_short tmp, *p = (short *)((char *)&lp->srom + SROM_HWADD);
++ u_short tmp;
++ __le16 *p = (__le16 *)((char *)&lp->srom + SROM_HWADD);
+ for (i=0; i<(ETH_ALEN>>1); i++) {
+ tmp = srom_rd(aprom_addr, (SROM_HWADD>>1) + i);
+- *p = le16_to_cpu(tmp);
+- j += *p++;
++ j += tmp; /* for check for 0:0:0:0:0:0 or ff:ff:ff:ff:ff:ff */
++ *p = cpu_to_le16(tmp);
+ }
+- if ((j == 0) || (j == 0x2fffd)) {
+- return;
++ if (j == 0 || j == 3 * 0xffff) {
++ /* could get 0 only from all-0 and 3 * 0xffff only from all-1 */
++ return;
+ }
+
+- p=(short *)&lp->srom;
++ p = (__le16 *)&lp->srom;
+ for (i=0; i<(sizeof(struct de4x5_srom)>>1); i++) {
+ tmp = srom_rd(aprom_addr, i);
+- *p++ = le16_to_cpu(tmp);
++ *p++ = cpu_to_le16(tmp);
+ }
+ de4x5_dbg_srom((struct de4x5_srom *)&lp->srom);
+ }
+@@ -5161,21 +5154,10 @@ build_setup_frame(struct net_device *dev, int mode)
+ }
+
+ static void
+-enable_ast(struct net_device *dev, u32 time_out)
+-{
+- timeout(dev, (void *)&de4x5_ast, (u_long)dev, time_out);
+-
+- return;
+-}
+-
+-static void
+ disable_ast(struct net_device *dev)
+ {
+- struct de4x5_private *lp = netdev_priv(dev);
+-
+- del_timer(&lp->timer);
+-
+- return;
++ struct de4x5_private *lp = netdev_priv(dev);
++ del_timer_sync(&lp->timer);
+ }
+
+ static long
+@@ -5245,29 +5227,6 @@ gep_rd(struct net_device *dev)
+ }
+
+ static void
+-timeout(struct net_device *dev, void (*fn)(u_long data), u_long data, u_long msec)
+-{
+- struct de4x5_private *lp = netdev_priv(dev);
+- int dt;
+-
+- /* First, cancel any pending timer events */
+- del_timer(&lp->timer);
+-
+- /* Convert msec to ticks */
+- dt = (msec * HZ) / 1000;
+- if (dt==0) dt=1;
+-
+- /* Set up timer */
+- init_timer(&lp->timer);
+- lp->timer.expires = jiffies + dt;
+- lp->timer.function = fn;
+- lp->timer.data = data;
+- add_timer(&lp->timer);
+-
+- return;
+-}
+-
+-static void
+ yawn(struct net_device *dev, int state)
+ {
+ struct de4x5_private *lp = netdev_priv(dev);
+diff --git a/drivers/net/tulip/interrupt.c b/drivers/net/tulip/interrupt.c
+index 3653314..6284afd 100644
+--- a/drivers/net/tulip/interrupt.c
++++ b/drivers/net/tulip/interrupt.c
+@@ -117,9 +117,6 @@ int tulip_poll(struct napi_struct *napi, int budget)
+ int received = 0;
+ #endif
+
+- if (!netif_running(dev))
+- goto done;
+-
+ #ifdef CONFIG_TULIP_NAPI_HW_MITIGATION
+
+ /* that one buffer is needed for mit activation; or might be a
+@@ -151,7 +148,8 @@ int tulip_poll(struct napi_struct *napi, int budget)
+ if (tulip_debug > 5)
+ printk(KERN_DEBUG "%s: In tulip_rx(), entry %d %8.8x.\n",
+ dev->name, entry, status);
+- if (work_done++ >= budget)
++
++ if (++work_done >= budget)
+ goto not_done;
+
+ if ((status & 0x38008300) != 0x0300) {
+@@ -260,8 +258,6 @@ int tulip_poll(struct napi_struct *napi, int budget)
+ * finally: amount of IO did not increase at all. */
+ } while ((ioread32(tp->base_addr + CSR5) & RxIntr));
+
+-done:
+-
+ #ifdef CONFIG_TULIP_NAPI_HW_MITIGATION
+
+ /* We use this simplistic scheme for IM. It's proven by
+diff --git a/drivers/net/tulip/tulip_core.c b/drivers/net/tulip/tulip_core.c
+index e5e2c9c..ed600bf 100644
+--- a/drivers/net/tulip/tulip_core.c
++++ b/drivers/net/tulip/tulip_core.c
+@@ -797,7 +797,8 @@ static int tulip_close (struct net_device *dev)
+
+ tp->rx_ring[i].status = 0; /* Not owned by Tulip chip. */
+ tp->rx_ring[i].length = 0;
+- tp->rx_ring[i].buffer1 = 0xBADF00D0; /* An invalid address. */
++ /* An invalid address. */
++ tp->rx_ring[i].buffer1 = cpu_to_le32(0xBADF00D0);
+ if (skb) {
+ pci_unmap_single(tp->pdev, mapping, PKT_BUF_SZ,
+ PCI_DMA_FROMDEVICE);
+diff --git a/drivers/net/tulip/xircom_cb.c b/drivers/net/tulip/xircom_cb.c
+index 70befe3..8fc7274 100644
+--- a/drivers/net/tulip/xircom_cb.c
++++ b/drivers/net/tulip/xircom_cb.c
+@@ -83,8 +83,8 @@ static int bufferoffsets[NUMDESCRIPTORS] = {128,2048,4096,6144};
+ struct xircom_private {
+ /* Send and receive buffers, kernel-addressable and dma addressable forms */
+
+- unsigned int *rx_buffer;
+- unsigned int *tx_buffer;
++ __le32 *rx_buffer;
++ __le32 *tx_buffer;
+
+ dma_addr_t rx_dma_handle;
+ dma_addr_t tx_dma_handle;
+@@ -412,19 +412,20 @@ static int xircom_start_xmit(struct sk_buff *skb, struct net_device *dev)
+ /* FIXME: The specification tells us that the length we send HAS to be a multiple of
+ 4 bytes. */
+
+- card->tx_buffer[4*desc+1] = skb->len;
+- if (desc == NUMDESCRIPTORS-1)
+- card->tx_buffer[4*desc+1] |= (1<<25); /* bit 25: last descriptor of the ring */
++ card->tx_buffer[4*desc+1] = cpu_to_le32(skb->len);
++ if (desc == NUMDESCRIPTORS - 1) /* bit 25: last descriptor of the ring */
++ card->tx_buffer[4*desc+1] |= cpu_to_le32(1<<25);
+
+- card->tx_buffer[4*desc+1] |= 0xF0000000;
++ card->tx_buffer[4*desc+1] |= cpu_to_le32(0xF0000000);
+ /* 0xF0... means want interrupts*/
+ card->tx_skb[desc] = skb;
+
+ wmb();
+ /* This gives the descriptor to the card */
+- card->tx_buffer[4*desc] = 0x80000000;
++ card->tx_buffer[4*desc] = cpu_to_le32(0x80000000);
+ trigger_transmit(card);
+- if (((int)card->tx_buffer[nextdescriptor*4])<0) { /* next descriptor is occupied... */
++ if (card->tx_buffer[nextdescriptor*4] & cpu_to_le32(0x8000000)) {
++ /* next descriptor is occupied... */
+ netif_stop_queue(dev);
+ }
+ card->transmit_used = nextdescriptor;
+@@ -590,8 +591,7 @@ descriptors and programs the addresses into the card.
+ */
+ static void setup_descriptors(struct xircom_private *card)
+ {
+- unsigned int val;
+- unsigned int address;
++ u32 address;
+ int i;
+ enter("setup_descriptors");
+
+@@ -604,16 +604,16 @@ static void setup_descriptors(struct xircom_private *card)
+ for (i=0;i<NUMDESCRIPTORS;i++ ) {
+
+ /* Rx Descr0: It's empty, let the card own it, no errors -> 0x80000000 */
+- card->rx_buffer[i*4 + 0] = 0x80000000;
++ card->rx_buffer[i*4 + 0] = cpu_to_le32(0x80000000);
+ /* Rx Descr1: buffer 1 is 1536 bytes, buffer 2 is 0 bytes */
+- card->rx_buffer[i*4 + 1] = 1536;
+- if (i==NUMDESCRIPTORS-1)
+- card->rx_buffer[i*4 + 1] |= (1 << 25); /* bit 25 is "last descriptor" */
++ card->rx_buffer[i*4 + 1] = cpu_to_le32(1536);
++ if (i == NUMDESCRIPTORS - 1) /* bit 25 is "last descriptor" */
++ card->rx_buffer[i*4 + 1] |= cpu_to_le32(1 << 25);
+
+ /* Rx Descr2: address of the buffer
+ we store the buffer at the 2nd half of the page */
+
+- address = (unsigned long) card->rx_dma_handle;
++ address = card->rx_dma_handle;
+ card->rx_buffer[i*4 + 2] = cpu_to_le32(address + bufferoffsets[i]);
+ /* Rx Desc3: address of 2nd buffer -> 0 */
+ card->rx_buffer[i*4 + 3] = 0;
+@@ -621,9 +621,8 @@ static void setup_descriptors(struct xircom_private *card)
+
+ wmb();
+ /* Write the receive descriptor ring address to the card */
+- address = (unsigned long) card->rx_dma_handle;
+- val = cpu_to_le32(address);
+- outl(val, card->io_port + CSR3); /* Receive descr list address */
++ address = card->rx_dma_handle;
++ outl(address, card->io_port + CSR3); /* Receive descr list address */
+
+
+ /* transmit descriptors */
+@@ -633,13 +632,13 @@ static void setup_descriptors(struct xircom_private *card)
+ /* Tx Descr0: Empty, we own it, no errors -> 0x00000000 */
+ card->tx_buffer[i*4 + 0] = 0x00000000;
+ /* Tx Descr1: buffer 1 is 1536 bytes, buffer 2 is 0 bytes */
+- card->tx_buffer[i*4 + 1] = 1536;
+- if (i==NUMDESCRIPTORS-1)
+- card->tx_buffer[i*4 + 1] |= (1 << 25); /* bit 25 is "last descriptor" */
++ card->tx_buffer[i*4 + 1] = cpu_to_le32(1536);
++ if (i == NUMDESCRIPTORS - 1) /* bit 25 is "last descriptor" */
++ card->tx_buffer[i*4 + 1] |= cpu_to_le32(1 << 25);
+
+ /* Tx Descr2: address of the buffer
+ we store the buffer at the 2nd half of the page */
+- address = (unsigned long) card->tx_dma_handle;
++ address = card->tx_dma_handle;
+ card->tx_buffer[i*4 + 2] = cpu_to_le32(address + bufferoffsets[i]);
+ /* Tx Desc3: address of 2nd buffer -> 0 */
+ card->tx_buffer[i*4 + 3] = 0;
+@@ -647,9 +646,8 @@ static void setup_descriptors(struct xircom_private *card)
+
+ wmb();
+ /* wite the transmit descriptor ring to the card */
+- address = (unsigned long) card->tx_dma_handle;
+- val =cpu_to_le32(address);
+- outl(val, card->io_port + CSR4); /* xmit descr list address */
++ address = card->tx_dma_handle;
++ outl(address, card->io_port + CSR4); /* xmit descr list address */
+
+ leave("setup_descriptors");
+ }
+@@ -1180,7 +1178,7 @@ static void investigate_read_descriptor(struct net_device *dev,struct xircom_pri
+ int status;
+
+ enter("investigate_read_descriptor");
+- status = card->rx_buffer[4*descnr];
++ status = le32_to_cpu(card->rx_buffer[4*descnr]);
+
+ if ((status > 0)) { /* packet received */
+
+@@ -1210,7 +1208,7 @@ static void investigate_read_descriptor(struct net_device *dev,struct xircom_pri
+
+ out:
+ /* give the buffer back to the card */
+- card->rx_buffer[4*descnr] = 0x80000000;
++ card->rx_buffer[4*descnr] = cpu_to_le32(0x80000000);
+ trigger_receive(card);
+ }
+
+@@ -1226,7 +1224,7 @@ static void investigate_write_descriptor(struct net_device *dev, struct xircom_p
+
+ enter("investigate_write_descriptor");
+
+- status = card->tx_buffer[4*descnr];
++ status = le32_to_cpu(card->tx_buffer[4*descnr]);
+ #if 0
+ if (status & 0x8000) { /* Major error */
+ printk(KERN_ERR "Major transmit error status %x \n", status);
+diff --git a/drivers/net/usb/asix.c b/drivers/net/usb/asix.c
+index 1249f44..569028b 100644
+--- a/drivers/net/usb/asix.c
++++ b/drivers/net/usb/asix.c
+@@ -202,10 +202,10 @@ static int asix_read_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index,
+ buf,
+ size,
+ USB_CTRL_GET_TIMEOUT);
+- if (err >= 0 && err < size)
+- err = -EINVAL;
+- if (!err)
++ if (err == size)
+ memcpy(data, buf, size);
++ else if (err >= 0)
++ err = -EINVAL;
+ kfree(buf);
+
+ out:
+diff --git a/drivers/net/usb/kaweth.c b/drivers/net/usb/kaweth.c
+index 58a53a6..569ad8b 100644
+--- a/drivers/net/usb/kaweth.c
++++ b/drivers/net/usb/kaweth.c
+@@ -70,7 +70,7 @@
+ #define KAWETH_TX_TIMEOUT (5 * HZ)
+ #define KAWETH_SCRATCH_SIZE 32
+ #define KAWETH_FIRMWARE_BUF_SIZE 4096
+-#define KAWETH_CONTROL_TIMEOUT (30 * HZ)
++#define KAWETH_CONTROL_TIMEOUT (30000)
+
+ #define KAWETH_STATUS_BROKEN 0x0000001
+ #define KAWETH_STATUS_CLOSING 0x0000002
+diff --git a/drivers/net/usb/mcs7830.c b/drivers/net/usb/mcs7830.c
+index f55a595..5ea7411 100644
+--- a/drivers/net/usb/mcs7830.c
++++ b/drivers/net/usb/mcs7830.c
+@@ -94,7 +94,7 @@ static int mcs7830_get_reg(struct usbnet *dev, u16 index, u16 size, void *data)
+
+ ret = usb_control_msg(xdev, usb_rcvctrlpipe(xdev, 0), MCS7830_RD_BREQ,
+ MCS7830_RD_BMREQ, 0x0000, index, data,
+- size, msecs_to_jiffies(MCS7830_CTRL_TIMEOUT));
++ size, MCS7830_CTRL_TIMEOUT);
+ return ret;
+ }
+
+@@ -105,7 +105,7 @@ static int mcs7830_set_reg(struct usbnet *dev, u16 index, u16 size, void *data)
+
+ ret = usb_control_msg(xdev, usb_sndctrlpipe(xdev, 0), MCS7830_WR_BREQ,
+ MCS7830_WR_BMREQ, 0x0000, index, data,
+- size, msecs_to_jiffies(MCS7830_CTRL_TIMEOUT));
++ size, MCS7830_CTRL_TIMEOUT);
+ return ret;
+ }
+
+diff --git a/drivers/net/wireless/b43/b43.h b/drivers/net/wireless/b43/b43.h
+index a28ad23..7b6fc1a 100644
+--- a/drivers/net/wireless/b43/b43.h
++++ b/drivers/net/wireless/b43/b43.h
+@@ -273,6 +273,8 @@ enum {
+ #define B43_PHYTYPE_A 0x00
+ #define B43_PHYTYPE_B 0x01
+ #define B43_PHYTYPE_G 0x02
++#define B43_PHYTYPE_N 0x04
++#define B43_PHYTYPE_LP 0x05
+
+ /* PHYRegisters */
+ #define B43_PHY_ILT_A_CTRL 0x0072
+diff --git a/drivers/net/wireless/b43/main.h b/drivers/net/wireless/b43/main.h
+index 284d17d..08e2e56 100644
+--- a/drivers/net/wireless/b43/main.h
++++ b/drivers/net/wireless/b43/main.h
+@@ -39,11 +39,11 @@
+ #define PAD_BYTES(nr_bytes) P4D_BYTES( __LINE__ , (nr_bytes))
+
+ /* Lightweight function to convert a frequency (in Mhz) to a channel number. */
+-static inline u8 b43_freq_to_channel_a(int freq)
++static inline u8 b43_freq_to_channel_5ghz(int freq)
+ {
+ return ((freq - 5000) / 5);
+ }
+-static inline u8 b43_freq_to_channel_bg(int freq)
++static inline u8 b43_freq_to_channel_2ghz(int freq)
+ {
+ u8 channel;
+
+@@ -54,19 +54,13 @@ static inline u8 b43_freq_to_channel_bg(int freq)
+
+ return channel;
+ }
+-static inline u8 b43_freq_to_channel(struct b43_wldev *dev, int freq)
+-{
+- if (dev->phy.type == B43_PHYTYPE_A)
+- return b43_freq_to_channel_a(freq);
+- return b43_freq_to_channel_bg(freq);
+-}
+
+ /* Lightweight function to convert a channel number to a frequency (in Mhz). */
+-static inline int b43_channel_to_freq_a(u8 channel)
++static inline int b43_channel_to_freq_5ghz(u8 channel)
+ {
+ return (5000 + (5 * channel));
+ }
+-static inline int b43_channel_to_freq_bg(u8 channel)
++static inline int b43_channel_to_freq_2ghz(u8 channel)
+ {
+ int freq;
+
+@@ -77,12 +71,6 @@ static inline int b43_channel_to_freq_bg(u8 channel)
+
+ return freq;
+ }
+-static inline int b43_channel_to_freq(struct b43_wldev *dev, u8 channel)
+-{
+- if (dev->phy.type == B43_PHYTYPE_A)
+- return b43_channel_to_freq_a(channel);
+- return b43_channel_to_freq_bg(channel);
+-}
+
+ static inline int b43_is_cck_rate(int rate)
+ {
+diff --git a/drivers/net/wireless/b43/xmit.c b/drivers/net/wireless/b43/xmit.c
+index 0bd6f8a..3307ba1 100644
+--- a/drivers/net/wireless/b43/xmit.c
++++ b/drivers/net/wireless/b43/xmit.c
+@@ -531,21 +531,32 @@ void b43_rx(struct b43_wldev *dev, struct sk_buff *skb, const void *_rxhdr)
+ switch (chanstat & B43_RX_CHAN_PHYTYPE) {
+ case B43_PHYTYPE_A:
+ status.phymode = MODE_IEEE80211A;
+- status.freq = chanid;
+- status.channel = b43_freq_to_channel_a(chanid);
+- break;
+- case B43_PHYTYPE_B:
+- status.phymode = MODE_IEEE80211B;
+- status.freq = chanid + 2400;
+- status.channel = b43_freq_to_channel_bg(chanid + 2400);
++ B43_WARN_ON(1);
++ /* FIXME: We don't really know which value the "chanid" contains.
++ * So the following assignment might be wrong. */
++ status.channel = chanid;
++ status.freq = b43_channel_to_freq_5ghz(status.channel);
+ break;
+ case B43_PHYTYPE_G:
+ status.phymode = MODE_IEEE80211G;
++ /* chanid is the radio channel cookie value as used
++ * to tune the radio. */
+ status.freq = chanid + 2400;
+- status.channel = b43_freq_to_channel_bg(chanid + 2400);
++ status.channel = b43_freq_to_channel_2ghz(status.freq);
++ break;
++ case B43_PHYTYPE_N:
++ status.phymode = 0xDEAD /*FIXME MODE_IEEE80211N*/;
++ /* chanid is the SHM channel cookie. Which is the plain
++ * channel number in b43. */
++ status.channel = chanid;
++ if (chanstat & B43_RX_CHAN_5GHZ)
++ status.freq = b43_freq_to_channel_5ghz(status.freq);
++ else
++ status.freq = b43_freq_to_channel_2ghz(status.freq);
+ break;
+ default:
+ B43_WARN_ON(1);
++ goto drop;
+ }
+
+ dev->stats.last_rx = jiffies;
+diff --git a/drivers/net/wireless/b43/xmit.h b/drivers/net/wireless/b43/xmit.h
+index 03bddd2..6dc0793 100644
+--- a/drivers/net/wireless/b43/xmit.h
++++ b/drivers/net/wireless/b43/xmit.h
+@@ -142,49 +142,56 @@ struct b43_rxhdr_fw4 {
+ } __attribute__ ((__packed__));
+
+ /* PHY RX Status 0 */
+-#define B43_RX_PHYST0_GAINCTL 0x4000 /* Gain Control */
+-#define B43_RX_PHYST0_PLCPHCF 0x0200
+-#define B43_RX_PHYST0_PLCPFV 0x0100
+-#define B43_RX_PHYST0_SHORTPRMBL 0x0080 /* Received with Short Preamble */
++#define B43_RX_PHYST0_GAINCTL 0x4000 /* Gain Control */
++#define B43_RX_PHYST0_PLCPHCF 0x0200
++#define B43_RX_PHYST0_PLCPFV 0x0100
++#define B43_RX_PHYST0_SHORTPRMBL 0x0080 /* Received with Short Preamble */
+ #define B43_RX_PHYST0_LCRS 0x0040
+-#define B43_RX_PHYST0_ANT 0x0020 /* Antenna */
+-#define B43_RX_PHYST0_UNSRATE 0x0010
++#define B43_RX_PHYST0_ANT 0x0020 /* Antenna */
++#define B43_RX_PHYST0_UNSRATE 0x0010
+ #define B43_RX_PHYST0_CLIP 0x000C
+ #define B43_RX_PHYST0_CLIP_SHIFT 2
+-#define B43_RX_PHYST0_FTYPE 0x0003 /* Frame type */
+-#define B43_RX_PHYST0_CCK 0x0000 /* Frame type: CCK */
+-#define B43_RX_PHYST0_OFDM 0x0001 /* Frame type: OFDM */
+-#define B43_RX_PHYST0_PRE_N 0x0002 /* Pre-standard N-PHY frame */
+-#define B43_RX_PHYST0_STD_N 0x0003 /* Standard N-PHY frame */
++#define B43_RX_PHYST0_FTYPE 0x0003 /* Frame type */
++#define B43_RX_PHYST0_CCK 0x0000 /* Frame type: CCK */
++#define B43_RX_PHYST0_OFDM 0x0001 /* Frame type: OFDM */
++#define B43_RX_PHYST0_PRE_N 0x0002 /* Pre-standard N-PHY frame */
++#define B43_RX_PHYST0_STD_N 0x0003 /* Standard N-PHY frame */
+
+ /* PHY RX Status 2 */
+-#define B43_RX_PHYST2_LNAG 0xC000 /* LNA Gain */
++#define B43_RX_PHYST2_LNAG 0xC000 /* LNA Gain */
+ #define B43_RX_PHYST2_LNAG_SHIFT 14
+-#define B43_RX_PHYST2_PNAG 0x3C00 /* PNA Gain */
++#define B43_RX_PHYST2_PNAG 0x3C00 /* PNA Gain */
+ #define B43_RX_PHYST2_PNAG_SHIFT 10
+-#define B43_RX_PHYST2_FOFF 0x03FF /* F offset */
++#define B43_RX_PHYST2_FOFF 0x03FF /* F offset */
+
+ /* PHY RX Status 3 */
+-#define B43_RX_PHYST3_DIGG 0x1800 /* DIG Gain */
++#define B43_RX_PHYST3_DIGG 0x1800 /* DIG Gain */
+ #define B43_RX_PHYST3_DIGG_SHIFT 11
+-#define B43_RX_PHYST3_TRSTATE 0x0400 /* TR state */
++#define B43_RX_PHYST3_TRSTATE 0x0400 /* TR state */
+
+ /* MAC RX Status */
+-#define B43_RX_MAC_BEACONSENT 0x00008000 /* Beacon send flag */
+-#define B43_RX_MAC_KEYIDX 0x000007E0 /* Key index */
+-#define B43_RX_MAC_KEYIDX_SHIFT 5
+-#define B43_RX_MAC_DECERR 0x00000010 /* Decrypt error */
+-#define B43_RX_MAC_DEC 0x00000008 /* Decryption attempted */
+-#define B43_RX_MAC_PADDING 0x00000004 /* Pad bytes present */
+-#define B43_RX_MAC_RESP 0x00000002 /* Response frame transmitted */
+-#define B43_RX_MAC_FCSERR 0x00000001 /* FCS error */
++#define B43_RX_MAC_RXST_VALID 0x01000000 /* PHY RXST valid */
++#define B43_RX_MAC_TKIP_MICERR 0x00100000 /* TKIP MIC error */
++#define B43_RX_MAC_TKIP_MICATT 0x00080000 /* TKIP MIC attempted */
++#define B43_RX_MAC_AGGTYPE 0x00060000 /* Aggregation type */
++#define B43_RX_MAC_AGGTYPE_SHIFT 17
++#define B43_RX_MAC_AMSDU 0x00010000 /* A-MSDU mask */
++#define B43_RX_MAC_BEACONSENT 0x00008000 /* Beacon sent flag */
++#define B43_RX_MAC_KEYIDX 0x000007E0 /* Key index */
++#define B43_RX_MAC_KEYIDX_SHIFT 5
++#define B43_RX_MAC_DECERR 0x00000010 /* Decrypt error */
++#define B43_RX_MAC_DEC 0x00000008 /* Decryption attempted */
++#define B43_RX_MAC_PADDING 0x00000004 /* Pad bytes present */
++#define B43_RX_MAC_RESP 0x00000002 /* Response frame transmitted */
++#define B43_RX_MAC_FCSERR 0x00000001 /* FCS error */
+
+ /* RX channel */
+-#define B43_RX_CHAN_GAIN 0xFC00 /* Gain */
+-#define B43_RX_CHAN_GAIN_SHIFT 10
+-#define B43_RX_CHAN_ID 0x03FC /* Channel ID */
+-#define B43_RX_CHAN_ID_SHIFT 2
+-#define B43_RX_CHAN_PHYTYPE 0x0003 /* PHY type */
++#define B43_RX_CHAN_40MHZ 0x1000 /* 40 Mhz channel width */
++#define B43_RX_CHAN_5GHZ 0x0800 /* 5 Ghz band */
++#define B43_RX_CHAN_ID 0x07F8 /* Channel ID */
++#define B43_RX_CHAN_ID_SHIFT 3
++#define B43_RX_CHAN_PHYTYPE 0x0007 /* PHY type */
++
+
+ u8 b43_plcp_get_ratecode_cck(const u8 bitrate);
+ u8 b43_plcp_get_ratecode_ofdm(const u8 bitrate);
+diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c
+index 50775f9..18b1f91 100644
+--- a/drivers/net/wireless/rt2x00/rt2500usb.c
++++ b/drivers/net/wireless/rt2x00/rt2500usb.c
+@@ -257,7 +257,7 @@ static const struct rt2x00debug rt2500usb_rt2x00debug = {
+ static void rt2500usb_config_mac_addr(struct rt2x00_dev *rt2x00dev,
+ __le32 *mac)
+ {
+- rt2500usb_register_multiwrite(rt2x00dev, MAC_CSR2, &mac,
++ rt2500usb_register_multiwrite(rt2x00dev, MAC_CSR2, mac,
+ (3 * sizeof(__le16)));
+ }
+
+diff --git a/drivers/net/wireless/rt2x00/rt2x00pci.c b/drivers/net/wireless/rt2x00/rt2x00pci.c
+index 2780df0..6d5d9ab 100644
+--- a/drivers/net/wireless/rt2x00/rt2x00pci.c
++++ b/drivers/net/wireless/rt2x00/rt2x00pci.c
+@@ -124,7 +124,10 @@ void rt2x00pci_rxdone(struct rt2x00_dev *rt2x00dev)
+ struct data_entry *entry;
+ struct data_desc *rxd;
+ struct sk_buff *skb;
++ struct ieee80211_hdr *hdr;
+ struct rxdata_entry_desc desc;
++ int header_size;
++ int align;
+ u32 word;
+
+ while (1) {
+@@ -138,17 +141,26 @@ void rt2x00pci_rxdone(struct rt2x00_dev *rt2x00dev)
+ memset(&desc, 0x00, sizeof(desc));
+ rt2x00dev->ops->lib->fill_rxdone(entry, &desc);
+
++ hdr = (struct ieee80211_hdr *)entry->data_addr;
++ header_size =
++ ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_control));
++
++ /*
++ * The data behind the ieee80211 header must be
++ * aligned on a 4 byte boundary.
++ */
++ align = NET_IP_ALIGN + (2 * (header_size % 4 == 0));
++
+ /*
+ * Allocate the sk_buffer, initialize it and copy
+ * all data into it.
+ */
+- skb = dev_alloc_skb(desc.size + NET_IP_ALIGN);
++ skb = dev_alloc_skb(desc.size + align);
+ if (!skb)
+ return;
+
+- skb_reserve(skb, NET_IP_ALIGN);
+- skb_put(skb, desc.size);
+- memcpy(skb->data, entry->data_addr, desc.size);
++ skb_reserve(skb, align);
++ memcpy(skb_put(skb, desc.size), entry->data_addr, desc.size);
+
+ /*
+ * Send the frame to rt2x00lib for further processing.
+diff --git a/drivers/net/wireless/rt2x00/rt2x00usb.c b/drivers/net/wireless/rt2x00/rt2x00usb.c
+index 1f5675d..ab4797e 100644
+--- a/drivers/net/wireless/rt2x00/rt2x00usb.c
++++ b/drivers/net/wireless/rt2x00/rt2x00usb.c
+@@ -221,7 +221,9 @@ static void rt2x00usb_interrupt_rxdone(struct urb *urb)
+ struct data_ring *ring = entry->ring;
+ struct rt2x00_dev *rt2x00dev = ring->rt2x00dev;
+ struct sk_buff *skb;
++ struct ieee80211_hdr *hdr;
+ struct rxdata_entry_desc desc;
++ int header_size;
+ int frame_size;
+
+ if (!test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags) ||
+@@ -253,9 +255,20 @@ static void rt2x00usb_interrupt_rxdone(struct urb *urb)
+ skb_put(skb, frame_size);
+
+ /*
+- * Trim the skb_buffer to only contain the valid
+- * frame data (so ignore the device's descriptor).
++ * The data behind the ieee80211 header must be
++ * aligned on a 4 byte boundary.
++ * After that trim the entire buffer down to only
++ * contain the valid frame data excluding the device
++ * descriptor.
+ */
++ hdr = (struct ieee80211_hdr *)entry->skb->data;
++ header_size =
++ ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_control));
++
++ if (header_size % 4 == 0) {
++ skb_push(entry->skb, 2);
++ memmove(entry->skb->data, entry->skb->data + 2, skb->len - 2);
++ }
+ skb_trim(entry->skb, desc.size);
+
+ /*
+diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c
+index 01dbef1..ecae968 100644
+--- a/drivers/net/wireless/rt2x00/rt61pci.c
++++ b/drivers/net/wireless/rt2x00/rt61pci.c
+@@ -1738,6 +1738,7 @@ static void rt61pci_txdone(struct rt2x00_dev *rt2x00dev)
+ {
+ struct data_ring *ring;
+ struct data_entry *entry;
++ struct data_entry *entry_done;
+ struct data_desc *txd;
+ u32 word;
+ u32 reg;
+@@ -1791,6 +1792,17 @@ static void rt61pci_txdone(struct rt2x00_dev *rt2x00dev)
+ !rt2x00_get_field32(word, TXD_W0_VALID))
+ return;
+
++ entry_done = rt2x00_get_data_entry_done(ring);
++ while (entry != entry_done) {
++ /* Catch up. Just report any entries we missed as
++ * failed. */
++ WARNING(rt2x00dev,
++ "TX status report missed for entry %p\n",
++ entry_done);
++ rt2x00lib_txdone(entry_done, TX_FAIL_OTHER, 0);
++ entry_done = rt2x00_get_data_entry_done(ring);
++ }
++
+ /*
+ * Obtain the status about this packet.
+ */
+diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c
+index 2a8fc43..bca37bf 100644
+--- a/drivers/net/xen-netfront.c
++++ b/drivers/net/xen-netfront.c
+@@ -852,11 +852,6 @@ static int xennet_poll(struct napi_struct *napi, int budget)
+
+ spin_lock(&np->rx_lock);
+
+- if (unlikely(!netif_carrier_ok(dev))) {
+- spin_unlock(&np->rx_lock);
+- return 0;
+- }
+-
+ skb_queue_head_init(&rxq);
+ skb_queue_head_init(&errq);
+ skb_queue_head_init(&tmpq);
+diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
+index 26cc4dc..72e0bd5 100644
+--- a/drivers/pci/quirks.c
++++ b/drivers/pci/quirks.c
+@@ -465,6 +465,12 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_31, quirk
+ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH8_0, quirk_ich6_lpc_acpi );
+ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH8_2, quirk_ich6_lpc_acpi );
+ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH8_3, quirk_ich6_lpc_acpi );
++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH8_1, quirk_ich6_lpc_acpi );
++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH8_4, quirk_ich6_lpc_acpi );
++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH9_2, quirk_ich6_lpc_acpi );
++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH9_4, quirk_ich6_lpc_acpi );
++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH9_7, quirk_ich6_lpc_acpi );
++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH9_8, quirk_ich6_lpc_acpi );
+
+ /*
+ * VIA ACPI: One IO region pointed to by longword at
+diff --git a/drivers/pnp/pnpacpi/rsparser.c b/drivers/pnp/pnpacpi/rsparser.c
+index 3c5eb37..f7b8648 100644
+--- a/drivers/pnp/pnpacpi/rsparser.c
++++ b/drivers/pnp/pnpacpi/rsparser.c
+@@ -76,6 +76,7 @@ static void pnpacpi_parse_allocated_irqresource(struct pnp_resource_table *res,
+ int i = 0;
+ int irq;
+ int p, t;
++ static unsigned char warned;
+
+ if (!valid_IRQ(gsi))
+ return;
+@@ -83,9 +84,10 @@ static void pnpacpi_parse_allocated_irqresource(struct pnp_resource_table *res,
+ while (!(res->irq_resource[i].flags & IORESOURCE_UNSET) &&
+ i < PNP_MAX_IRQ)
+ i++;
+- if (i >= PNP_MAX_IRQ) {
++ if (i >= PNP_MAX_IRQ && !warned) {
+ printk(KERN_ERR "pnpacpi: exceeded the max number of IRQ "
+ "resources: %d \n", PNP_MAX_IRQ);
++ warned = 1;
+ return;
+ }
+ /*
+@@ -169,6 +171,7 @@ static void pnpacpi_parse_allocated_dmaresource(struct pnp_resource_table *res,
+ int bus_master, int transfer)
+ {
+ int i = 0;
++ static unsigned char warned;
+
+ while (i < PNP_MAX_DMA &&
+ !(res->dma_resource[i].flags & IORESOURCE_UNSET))
+@@ -183,9 +186,10 @@ static void pnpacpi_parse_allocated_dmaresource(struct pnp_resource_table *res,
+ }
+ res->dma_resource[i].start = dma;
+ res->dma_resource[i].end = dma;
+- } else {
++ } else if (!warned) {
+ printk(KERN_ERR "pnpacpi: exceeded the max number of DMA "
+ "resources: %d \n", PNP_MAX_DMA);
++ warned = 1;
+ }
+ }
+
+@@ -193,6 +197,7 @@ static void pnpacpi_parse_allocated_ioresource(struct pnp_resource_table *res,
+ u64 io, u64 len, int io_decode)
+ {
+ int i = 0;
++ static unsigned char warned;
+
+ while (!(res->port_resource[i].flags & IORESOURCE_UNSET) &&
+ i < PNP_MAX_PORT)
+@@ -207,7 +212,7 @@ static void pnpacpi_parse_allocated_ioresource(struct pnp_resource_table *res,
+ }
+ res->port_resource[i].start = io;
+ res->port_resource[i].end = io + len - 1;
+- } else {
++ } else if (!warned) {
+ printk(KERN_ERR "pnpacpi: exceeded the max number of IO "
+ "resources: %d \n", PNP_MAX_PORT);
+ }
+@@ -218,6 +223,7 @@ static void pnpacpi_parse_allocated_memresource(struct pnp_resource_table *res,
+ int write_protect)
+ {
+ int i = 0;
++ static unsigned char warned;
+
+ while (!(res->mem_resource[i].flags & IORESOURCE_UNSET) &&
+ (i < PNP_MAX_MEM))
+@@ -233,7 +239,7 @@ static void pnpacpi_parse_allocated_memresource(struct pnp_resource_table *res,
+
+ res->mem_resource[i].start = mem;
+ res->mem_resource[i].end = mem + len - 1;
+- } else {
++ } else if (!warned) {
+ printk(KERN_ERR "pnpacpi: exceeded the max number of mem "
+ "resources: %d\n", PNP_MAX_MEM);
+ }
+diff --git a/drivers/scsi/advansys.c b/drivers/scsi/advansys.c
+index 9dd3952..38a1ee2 100644
+--- a/drivers/scsi/advansys.c
++++ b/drivers/scsi/advansys.c
+@@ -13906,7 +13906,7 @@ static int advansys_release(struct Scsi_Host *shost)
+
+ #define ASC_IOADR_TABLE_MAX_IX 11
+
+-static PortAddr _asc_def_iop_base[ASC_IOADR_TABLE_MAX_IX] __devinitdata = {
++static PortAddr _asc_def_iop_base[ASC_IOADR_TABLE_MAX_IX] = {
+ 0x100, 0x0110, 0x120, 0x0130, 0x140, 0x0150, 0x0190,
+ 0x0210, 0x0230, 0x0250, 0x0330
+ };
+diff --git a/drivers/scsi/qla1280.c b/drivers/scsi/qla1280.c
+index 146d540..2886407 100644
+--- a/drivers/scsi/qla1280.c
++++ b/drivers/scsi/qla1280.c
+@@ -3041,7 +3041,6 @@ qla1280_32bit_start_scsi(struct scsi_qla_host *ha, struct srb * sp)
+ int cnt;
+ int req_cnt;
+ int seg_cnt;
+- dma_addr_t dma_handle;
+ u8 dir;
+
+ ENTER("qla1280_32bit_start_scsi");
+@@ -3050,6 +3049,7 @@ qla1280_32bit_start_scsi(struct scsi_qla_host *ha, struct srb * sp)
+ cmd->cmnd[0]);
+
+ /* Calculate number of entries and segments required. */
++ req_cnt = 1;
+ seg_cnt = scsi_dma_map(cmd);
+ if (seg_cnt) {
+ /*
+diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
+index a5bcf1f..8ecc047 100644
+--- a/drivers/scsi/qla2xxx/qla_os.c
++++ b/drivers/scsi/qla2xxx/qla_os.c
+@@ -1831,7 +1831,7 @@ probe_out:
+ return ret;
+ }
+
+-static void __devexit
++static void
+ qla2x00_remove_one(struct pci_dev *pdev)
+ {
+ scsi_qla_host_t *ha;
+@@ -2965,7 +2965,7 @@ static struct pci_driver qla2xxx_pci_driver = {
+ },
+ .id_table = qla2xxx_pci_tbl,
+ .probe = qla2x00_probe_one,
+- .remove = __devexit_p(qla2x00_remove_one),
++ .remove = qla2x00_remove_one,
+ .err_handler = &qla2xxx_err_handler,
+ };
+
+diff --git a/drivers/spi/spi_bitbang.c b/drivers/spi/spi_bitbang.c
+index 81639c6..f7f8580 100644
+--- a/drivers/spi/spi_bitbang.c
++++ b/drivers/spi/spi_bitbang.c
+@@ -184,6 +184,7 @@ int spi_bitbang_setup(struct spi_device *spi)
+ struct spi_bitbang_cs *cs = spi->controller_state;
+ struct spi_bitbang *bitbang;
+ int retval;
++ unsigned long flags;
+
+ bitbang = spi_master_get_devdata(spi->master);
+
+@@ -222,12 +223,12 @@ int spi_bitbang_setup(struct spi_device *spi)
+ */
+
+ /* deselect chip (low or high) */
+- spin_lock(&bitbang->lock);
++ spin_lock_irqsave(&bitbang->lock, flags);
+ if (!bitbang->busy) {
+ bitbang->chipselect(spi, BITBANG_CS_INACTIVE);
+ ndelay(cs->nsecs);
+ }
+- spin_unlock(&bitbang->lock);
++ spin_unlock_irqrestore(&bitbang->lock, flags);
+
+ return 0;
+ }
+diff --git a/drivers/ssb/scan.c b/drivers/ssb/scan.c
+index 96258c6..63ee5cf 100644
+--- a/drivers/ssb/scan.c
++++ b/drivers/ssb/scan.c
+@@ -388,6 +388,17 @@ int ssb_bus_scan(struct ssb_bus *bus,
+ case SSB_DEV_PCI:
+ case SSB_DEV_PCIE:
+ #ifdef CONFIG_SSB_DRIVER_PCICORE
++ if (bus->bustype == SSB_BUSTYPE_PCI) {
++ /* Ignore PCI cores on PCI-E cards.
++ * Ignore PCI-E cores on PCI cards. */
++ if (dev->id.coreid == SSB_DEV_PCI) {
++ if (bus->host_pci->is_pcie)
++ continue;
++ } else {
++ if (!bus->host_pci->is_pcie)
++ continue;
++ }
++ }
+ if (bus->pcicore.dev) {
+ ssb_printk(KERN_WARNING PFX
+ "WARNING: Multiple PCI(E) cores found\n");
+diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c
+index cf8add9..0da1df9 100644
+--- a/drivers/usb/serial/pl2303.c
++++ b/drivers/usb/serial/pl2303.c
+@@ -483,6 +483,13 @@ static void pl2303_set_termios(struct usb_serial_port *port,
+ }
+ spin_unlock_irqrestore(&priv->lock, flags);
+
++ /* The PL2303 is reported to lose bytes if you change
++ serial settings even to the same values as before. Thus
++ we actually need to filter in this specific case */
++
++ if (!tty_termios_hw_change(port->tty->termios, old_termios))
++ return;
++
+ cflag = port->tty->termios->c_cflag;
+
+ buf = kzalloc(7, GFP_KERNEL);
+diff --git a/drivers/video/atmel_lcdfb.c b/drivers/video/atmel_lcdfb.c
+index 11a3a22..7c30cc8 100644
+--- a/drivers/video/atmel_lcdfb.c
++++ b/drivers/video/atmel_lcdfb.c
+@@ -801,5 +801,5 @@ module_init(atmel_lcdfb_init);
+ module_exit(atmel_lcdfb_exit);
+
+ MODULE_DESCRIPTION("AT91/AT32 LCD Controller framebuffer driver");
+-MODULE_AUTHOR("Nicolas Ferre <nicolas.ferre at rfo.atmel.com>");
++MODULE_AUTHOR("Nicolas Ferre <nicolas.ferre at atmel.com>");
+ MODULE_LICENSE("GPL");
+diff --git a/drivers/video/ps3fb.c b/drivers/video/ps3fb.c
+index b312890..044a423 100644
+--- a/drivers/video/ps3fb.c
++++ b/drivers/video/ps3fb.c
+@@ -443,8 +443,6 @@ static int ps3fb_sync(struct fb_info *info, u32 frame)
+ u32 ddr_line_length, xdr_line_length;
+ u64 ddr_base, xdr_base;
+
+- acquire_console_sem();
+-
+ if (frame > par->num_frames - 1) {
+ dev_dbg(info->device, "%s: invalid frame number (%u)\n",
+ __func__, frame);
+@@ -464,7 +462,6 @@ static int ps3fb_sync(struct fb_info *info, u32 frame)
+ xdr_line_length);
+
+ out:
+- release_console_sem();
+ return error;
+ }
+
+@@ -479,7 +476,10 @@ static int ps3fb_release(struct fb_info *info, int user)
+ if (atomic_dec_and_test(&ps3fb.f_count)) {
+ if (atomic_read(&ps3fb.ext_flip)) {
+ atomic_set(&ps3fb.ext_flip, 0);
+- ps3fb_sync(info, 0); /* single buffer */
++ if (!try_acquire_console_sem()) {
++ ps3fb_sync(info, 0); /* single buffer */
++ release_console_sem();
++ }
+ }
+ }
+ return 0;
+@@ -865,7 +865,9 @@ static int ps3fb_ioctl(struct fb_info *info, unsigned int cmd,
+ break;
+
+ dev_dbg(info->device, "PS3FB_IOCTL_FSEL:%d\n", val);
++ acquire_console_sem();
+ retval = ps3fb_sync(info, val);
++ release_console_sem();
+ break;
+
+ default:
+@@ -885,7 +887,9 @@ static int ps3fbd(void *arg)
+ set_current_state(TASK_INTERRUPTIBLE);
+ if (ps3fb.is_kicked) {
+ ps3fb.is_kicked = 0;
++ acquire_console_sem();
+ ps3fb_sync(info, 0); /* single buffer */
++ release_console_sem();
+ }
+ schedule();
+ }
+@@ -1234,12 +1238,6 @@ static int ps3fb_shutdown(struct ps3_system_bus_device *dev)
+ ps3fb_flip_ctl(0, &ps3fb); /* flip off */
+ ps3fb.dinfo->irq.mask = 0;
+
+- if (info) {
+- unregister_framebuffer(info);
+- fb_dealloc_cmap(&info->cmap);
+- framebuffer_release(info);
+- }
+-
+ ps3av_register_flip_ctl(NULL, NULL);
+ if (ps3fb.task) {
+ struct task_struct *task = ps3fb.task;
+@@ -1250,6 +1248,12 @@ static int ps3fb_shutdown(struct ps3_system_bus_device *dev)
+ free_irq(ps3fb.irq_no, &dev->core);
+ ps3_irq_plug_destroy(ps3fb.irq_no);
+ }
++ if (info) {
++ unregister_framebuffer(info);
++ fb_dealloc_cmap(&info->cmap);
++ framebuffer_release(info);
++ info = dev->core.driver_data = NULL;
++ }
+ iounmap((u8 __iomem *)ps3fb.dinfo);
+
+ status = lv1_gpu_context_free(ps3fb.context_handle);
+diff --git a/drivers/video/s3c2410fb.c b/drivers/video/s3c2410fb.c
+index 5857ccf..ad35033 100644
+--- a/drivers/video/s3c2410fb.c
++++ b/drivers/video/s3c2410fb.c
+@@ -1026,7 +1026,7 @@ static int s3c2410fb_resume(struct platform_device *dev)
+ clk_enable(info->clk);
+ msleep(1);
+
+- s3c2410fb_init_registers(info);
++ s3c2410fb_init_registers(fbinfo);
+
+ return 0;
+ }
+diff --git a/drivers/video/uvesafb.c b/drivers/video/uvesafb.c
+index d1d6c0f..a14ef89 100644
+--- a/drivers/video/uvesafb.c
++++ b/drivers/video/uvesafb.c
+@@ -43,7 +43,7 @@ static struct fb_fix_screeninfo uvesafb_fix __devinitdata = {
+ };
+
+ static int mtrr __devinitdata = 3; /* enable mtrr by default */
+-static int blank __devinitdata = 1; /* enable blanking by default */
++static int blank = 1; /* enable blanking by default */
+ static int ypan __devinitdata = 1; /* 0: scroll, 1: ypan, 2: ywrap */
+ static int pmi_setpal __devinitdata = 1; /* use PMI for palette changes */
+ static int nocrtc __devinitdata; /* ignore CRTC settings */
+@@ -1549,7 +1549,7 @@ static void __devinit uvesafb_init_info(struct fb_info *info,
+ info->fbops->fb_pan_display = NULL;
+ }
+
+-static void uvesafb_init_mtrr(struct fb_info *info)
++static void __devinit uvesafb_init_mtrr(struct fb_info *info)
+ {
+ #ifdef CONFIG_MTRR
+ if (mtrr && !(info->fix.smem_start & (PAGE_SIZE - 1))) {
+diff --git a/drivers/w1/w1.c b/drivers/w1/w1.c
+index 0702173..33e5031 100644
+--- a/drivers/w1/w1.c
++++ b/drivers/w1/w1.c
+@@ -869,11 +869,9 @@ void w1_search_process(struct w1_master *dev, u8 search_type)
+ w1_search_devices(dev, search_type, w1_slave_found);
+
+ list_for_each_entry_safe(sl, sln, &dev->slist, w1_slave_entry) {
+- if (!test_bit(W1_SLAVE_ACTIVE, (unsigned long *)&sl->flags) && !--sl->ttl) {
++ if (!test_bit(W1_SLAVE_ACTIVE, (unsigned long *)&sl->flags) && !--sl->ttl)
+ w1_slave_detach(sl);
+-
+- dev->slave_count--;
+- } else if (test_bit(W1_SLAVE_ACTIVE, (unsigned long *)&sl->flags))
++ else if (test_bit(W1_SLAVE_ACTIVE, (unsigned long *)&sl->flags))
+ sl->ttl = dev->slave_ttl;
+ }
+
+diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c
+index ba8de7c..f0b3171 100644
+--- a/fs/binfmt_elf.c
++++ b/fs/binfmt_elf.c
+@@ -1384,7 +1384,7 @@ static void fill_prstatus(struct elf_prstatus *prstatus,
+ prstatus->pr_sigpend = p->pending.signal.sig[0];
+ prstatus->pr_sighold = p->blocked.sig[0];
+ prstatus->pr_pid = task_pid_vnr(p);
+- prstatus->pr_ppid = task_pid_vnr(p->parent);
++ prstatus->pr_ppid = task_pid_vnr(p->real_parent);
+ prstatus->pr_pgrp = task_pgrp_vnr(p);
+ prstatus->pr_sid = task_session_vnr(p);
+ if (thread_group_leader(p)) {
+@@ -1430,7 +1430,7 @@ static int fill_psinfo(struct elf_prpsinfo *psinfo, struct task_struct *p,
+ psinfo->pr_psargs[len] = 0;
+
+ psinfo->pr_pid = task_pid_vnr(p);
+- psinfo->pr_ppid = task_pid_vnr(p->parent);
++ psinfo->pr_ppid = task_pid_vnr(p->real_parent);
+ psinfo->pr_pgrp = task_pgrp_vnr(p);
+ psinfo->pr_sid = task_session_vnr(p);
+
+diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c
+index 0b1ab01..5a71918 100644
+--- a/fs/ecryptfs/inode.c
++++ b/fs/ecryptfs/inode.c
+@@ -120,22 +120,9 @@ ecryptfs_do_create(struct inode *directory_inode,
+ rc = ecryptfs_create_underlying_file(lower_dir_dentry->d_inode,
+ ecryptfs_dentry, mode, nd);
+ if (rc) {
+- struct inode *ecryptfs_inode = ecryptfs_dentry->d_inode;
+- struct ecryptfs_inode_info *inode_info =
+- ecryptfs_inode_to_private(ecryptfs_inode);
+-
+- printk(KERN_WARNING "%s: Error creating underlying file; "
+- "rc = [%d]; checking for existing\n", __FUNCTION__, rc);
+- if (inode_info) {
+- mutex_lock(&inode_info->lower_file_mutex);
+- if (!inode_info->lower_file) {
+- mutex_unlock(&inode_info->lower_file_mutex);
+- printk(KERN_ERR "%s: Failure to set underlying "
+- "file; rc = [%d]\n", __FUNCTION__, rc);
+- goto out_lock;
+- }
+- mutex_unlock(&inode_info->lower_file_mutex);
+- }
++ printk(KERN_ERR "%s: Failure to create dentry in lower fs; "
++ "rc = [%d]\n", __FUNCTION__, rc);
++ goto out_lock;
+ }
+ rc = ecryptfs_interpose(lower_dentry, ecryptfs_dentry,
+ directory_inode->i_sb, 0);
+@@ -451,6 +438,7 @@ static int ecryptfs_unlink(struct inode *dir, struct dentry *dentry)
+ dentry->d_inode->i_nlink =
+ ecryptfs_inode_to_lower(dentry->d_inode)->i_nlink;
+ dentry->d_inode->i_ctime = dir->i_ctime;
++ d_drop(dentry);
+ out_unlock:
+ unlock_parent(lower_dentry);
+ return rc;
+diff --git a/fs/ecryptfs/super.c b/fs/ecryptfs/super.c
+index f8cdab2..4859c4e 100644
+--- a/fs/ecryptfs/super.c
++++ b/fs/ecryptfs/super.c
+@@ -86,7 +86,6 @@ static void ecryptfs_destroy_inode(struct inode *inode)
+ fput(inode_info->lower_file);
+ inode_info->lower_file = NULL;
+ d_drop(lower_dentry);
+- d_delete(lower_dentry);
+ }
+ }
+ mutex_unlock(&inode_info->lower_file_mutex);
+diff --git a/fs/fat/fatent.c b/fs/fat/fatent.c
+index 2c1b73f..5fb3669 100644
+--- a/fs/fat/fatent.c
++++ b/fs/fat/fatent.c
+@@ -590,21 +590,49 @@ error:
+
+ EXPORT_SYMBOL_GPL(fat_free_clusters);
+
++/* 128kb is the whole sectors for FAT12 and FAT16 */
++#define FAT_READA_SIZE (128 * 1024)
++
++static void fat_ent_reada(struct super_block *sb, struct fat_entry *fatent,
++ unsigned long reada_blocks)
++{
++ struct fatent_operations *ops = MSDOS_SB(sb)->fatent_ops;
++ sector_t blocknr;
++ int i, offset;
++
++ ops->ent_blocknr(sb, fatent->entry, &offset, &blocknr);
++
++ for (i = 0; i < reada_blocks; i++)
++ sb_breadahead(sb, blocknr + i);
++}
++
+ int fat_count_free_clusters(struct super_block *sb)
+ {
+ struct msdos_sb_info *sbi = MSDOS_SB(sb);
+ struct fatent_operations *ops = sbi->fatent_ops;
+ struct fat_entry fatent;
++ unsigned long reada_blocks, reada_mask, cur_block;
+ int err = 0, free;
+
+ lock_fat(sbi);
+ if (sbi->free_clusters != -1)
+ goto out;
+
++ reada_blocks = FAT_READA_SIZE >> sb->s_blocksize_bits;
++ reada_mask = reada_blocks - 1;
++ cur_block = 0;
++
+ free = 0;
+ fatent_init(&fatent);
+ fatent_set_entry(&fatent, FAT_START_ENT);
+ while (fatent.entry < sbi->max_cluster) {
++ /* readahead of fat blocks */
++ if ((cur_block & reada_mask) == 0) {
++ unsigned long rest = sbi->fat_length - cur_block;
++ fat_ent_reada(sb, &fatent, min(reada_blocks, rest));
++ }
++ cur_block++;
++
+ err = fat_ent_read_block(sb, &fatent);
+ if (err)
+ goto out;
+diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c
+index 0fca820..300324b 100644
+--- a/fs/fs-writeback.c
++++ b/fs/fs-writeback.c
+@@ -482,8 +482,6 @@ sync_sb_inodes(struct super_block *sb, struct writeback_control *wbc)
+ if (wbc->nr_to_write <= 0)
+ break;
+ }
+- if (!list_empty(&sb->s_more_io))
+- wbc->more_io = 1;
+ return; /* Leave any unwritten inodes on s_io */
+ }
+
+diff --git a/fs/hfs/bfind.c b/fs/hfs/bfind.c
+index f13f149..f8452a0 100644
+--- a/fs/hfs/bfind.c
++++ b/fs/hfs/bfind.c
+@@ -52,6 +52,10 @@ int __hfs_brec_find(struct hfs_bnode *bnode, struct hfs_find_data *fd)
+ rec = (e + b) / 2;
+ len = hfs_brec_lenoff(bnode, rec, &off);
+ keylen = hfs_brec_keylen(bnode, rec);
++ if (keylen == HFS_BAD_KEYLEN) {
++ res = -EINVAL;
++ goto done;
++ }
+ hfs_bnode_read(bnode, fd->key, off, keylen);
+ cmpval = bnode->tree->keycmp(fd->key, fd->search_key);
+ if (!cmpval) {
+@@ -67,6 +71,10 @@ int __hfs_brec_find(struct hfs_bnode *bnode, struct hfs_find_data *fd)
+ if (rec != e && e >= 0) {
+ len = hfs_brec_lenoff(bnode, e, &off);
+ keylen = hfs_brec_keylen(bnode, e);
++ if (keylen == HFS_BAD_KEYLEN) {
++ res = -EINVAL;
++ goto done;
++ }
+ hfs_bnode_read(bnode, fd->key, off, keylen);
+ }
+ done:
+@@ -198,6 +206,10 @@ int hfs_brec_goto(struct hfs_find_data *fd, int cnt)
+
+ len = hfs_brec_lenoff(bnode, fd->record, &off);
+ keylen = hfs_brec_keylen(bnode, fd->record);
++ if (keylen == HFS_BAD_KEYLEN) {
++ res = -EINVAL;
++ goto out;
++ }
+ fd->keyoffset = off;
+ fd->keylength = keylen;
+ fd->entryoffset = off + keylen;
+diff --git a/fs/hfs/brec.c b/fs/hfs/brec.c
+index 5c87cf4..8626ee3 100644
+--- a/fs/hfs/brec.c
++++ b/fs/hfs/brec.c
+@@ -44,10 +44,21 @@ u16 hfs_brec_keylen(struct hfs_bnode *node, u16 rec)
+ recoff = hfs_bnode_read_u16(node, node->tree->node_size - (rec + 1) * 2);
+ if (!recoff)
+ return 0;
+- if (node->tree->attributes & HFS_TREE_BIGKEYS)
++ if (node->tree->attributes & HFS_TREE_BIGKEYS) {
+ retval = hfs_bnode_read_u16(node, recoff) + 2;
+- else
++ if (retval > node->tree->max_key_len + 2) {
++ printk(KERN_ERR "hfs: keylen %d too large\n",
++ retval);
++ retval = HFS_BAD_KEYLEN;
++ }
++ } else {
+ retval = (hfs_bnode_read_u8(node, recoff) | 1) + 1;
++ if (retval > node->tree->max_key_len + 1) {
++ printk(KERN_ERR "hfs: keylen %d too large\n",
++ retval);
++ retval = HFS_BAD_KEYLEN;
++ }
++ }
+ }
+ return retval;
+ }
+diff --git a/fs/hfs/btree.c b/fs/hfs/btree.c
+index 8a3a650..31284c7 100644
+--- a/fs/hfs/btree.c
++++ b/fs/hfs/btree.c
+@@ -81,6 +81,17 @@ struct hfs_btree *hfs_btree_open(struct super_block *sb, u32 id, btree_keycmp ke
+ goto fail_page;
+ if (!tree->node_count)
+ goto fail_page;
++ if ((id == HFS_EXT_CNID) && (tree->max_key_len != HFS_MAX_EXT_KEYLEN)) {
++ printk(KERN_ERR "hfs: invalid extent max_key_len %d\n",
++ tree->max_key_len);
++ goto fail_page;
++ }
++ if ((id == HFS_CAT_CNID) && (tree->max_key_len != HFS_MAX_CAT_KEYLEN)) {
++ printk(KERN_ERR "hfs: invalid catalog max_key_len %d\n",
++ tree->max_key_len);
++ goto fail_page;
++ }
++
+ tree->node_size_shift = ffs(size) - 1;
+ tree->pages_per_bnode = (tree->node_size + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
+
+@@ -89,9 +100,9 @@ struct hfs_btree *hfs_btree_open(struct super_block *sb, u32 id, btree_keycmp ke
+ return tree;
+
+ fail_page:
+- tree->inode->i_mapping->a_ops = &hfs_aops;
+ page_cache_release(page);
+ free_tree:
++ tree->inode->i_mapping->a_ops = &hfs_aops;
+ iput(tree->inode);
+ kfree(tree);
+ return NULL;
+diff --git a/fs/hfs/hfs.h b/fs/hfs/hfs.h
+index 1445e3a..c6aae61 100644
+--- a/fs/hfs/hfs.h
++++ b/fs/hfs/hfs.h
+@@ -28,6 +28,8 @@
+ #define HFS_MAX_NAMELEN 128
+ #define HFS_MAX_VALENCE 32767U
+
++#define HFS_BAD_KEYLEN 0xFF
++
+ /* Meanings of the drAtrb field of the MDB,
+ * Reference: _Inside Macintosh: Files_ p. 2-61
+ */
+@@ -167,6 +169,9 @@ typedef union hfs_btree_key {
+ struct hfs_ext_key ext;
+ } hfs_btree_key;
+
++#define HFS_MAX_CAT_KEYLEN (sizeof(struct hfs_cat_key) - sizeof(u8))
++#define HFS_MAX_EXT_KEYLEN (sizeof(struct hfs_ext_key) - sizeof(u8))
++
+ typedef union hfs_btree_key btree_key;
+
+ struct hfs_extent {
+diff --git a/fs/namei.c b/fs/namei.c
+index 3b993db..73e2e66 100644
+--- a/fs/namei.c
++++ b/fs/namei.c
+@@ -1605,7 +1605,7 @@ int may_open(struct nameidata *nd, int acc_mode, int flag)
+ if (S_ISLNK(inode->i_mode))
+ return -ELOOP;
+
+- if (S_ISDIR(inode->i_mode) && (flag & FMODE_WRITE))
++ if (S_ISDIR(inode->i_mode) && (acc_mode & MAY_WRITE))
+ return -EISDIR;
+
+ /*
+@@ -1620,7 +1620,7 @@ int may_open(struct nameidata *nd, int acc_mode, int flag)
+ return -EACCES;
+
+ flag &= ~O_TRUNC;
+- } else if (IS_RDONLY(inode) && (flag & FMODE_WRITE))
++ } else if (IS_RDONLY(inode) && (acc_mode & MAY_WRITE))
+ return -EROFS;
+
+ error = vfs_permission(nd, acc_mode);
+diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h
+index b35069a..bd1b9d6 100644
+--- a/fs/nfs/nfs4_fs.h
++++ b/fs/nfs/nfs4_fs.h
+@@ -115,6 +115,7 @@ struct nfs4_lock_state {
+ #define NFS_LOCK_INITIALIZED 1
+ int ls_flags;
+ struct nfs_seqid_counter ls_seqid;
++ struct rpc_sequence ls_sequence;
+ struct nfs_unique_id ls_id;
+ nfs4_stateid ls_stateid;
+ atomic_t ls_count;
+diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
+index 23a9a36..5a39c6f 100644
+--- a/fs/nfs/nfs4state.c
++++ b/fs/nfs/nfs4state.c
+@@ -509,7 +509,10 @@ static struct nfs4_lock_state *nfs4_alloc_lock_state(struct nfs4_state *state, f
+ lsp = kzalloc(sizeof(*lsp), GFP_KERNEL);
+ if (lsp == NULL)
+ return NULL;
+- lsp->ls_seqid.sequence = &state->owner->so_sequence;
++ rpc_init_wait_queue(&lsp->ls_sequence.wait, "lock_seqid_waitqueue");
++ spin_lock_init(&lsp->ls_sequence.lock);
++ INIT_LIST_HEAD(&lsp->ls_sequence.list);
++ lsp->ls_seqid.sequence = &lsp->ls_sequence;
+ atomic_set(&lsp->ls_count, 1);
+ lsp->ls_owner = fl_owner;
+ spin_lock(&clp->cl_lock);
+diff --git a/fs/nfsd/nfs3xdr.c b/fs/nfsd/nfs3xdr.c
+index 2d116d2..f917fd2 100644
+--- a/fs/nfsd/nfs3xdr.c
++++ b/fs/nfsd/nfs3xdr.c
+@@ -388,8 +388,11 @@ nfs3svc_decode_writeargs(struct svc_rqst *rqstp, __be32 *p,
+ * Round the length of the data which was specified up to
+ * the next multiple of XDR units and then compare that
+ * against the length which was actually received.
++ * Note that when RPCSEC/GSS (for example) is used, the
++ * data buffer can be padded so dlen might be larger
++ * than required. It must never be smaller.
+ */
+- if (dlen != XDR_QUADLEN(len)*4)
++ if (dlen < XDR_QUADLEN(len)*4)
+ return 0;
+
+ if (args->count > max_blocksize) {
+diff --git a/fs/nfsd/nfsxdr.c b/fs/nfsd/nfsxdr.c
+index 986f9b3..b86e365 100644
+--- a/fs/nfsd/nfsxdr.c
++++ b/fs/nfsd/nfsxdr.c
+@@ -313,8 +313,11 @@ nfssvc_decode_writeargs(struct svc_rqst *rqstp, __be32 *p,
+ * Round the length of the data which was specified up to
+ * the next multiple of XDR units and then compare that
+ * against the length which was actually received.
++ * Note that when RPCSEC/GSS (for example) is used, the
++ * data buffer can be padded so dlen might be larger
++ * than required. It must never be smaller.
+ */
+- if (dlen != XDR_QUADLEN(len)*4)
++ if (dlen < XDR_QUADLEN(len)*4)
+ return 0;
+
+ rqstp->rq_vec[0].iov_base = (void*)p;
+diff --git a/fs/proc/array.c b/fs/proc/array.c
+index 65c62e1..eb97f28 100644
+--- a/fs/proc/array.c
++++ b/fs/proc/array.c
+@@ -169,7 +169,7 @@ static inline char *task_state(struct task_struct *p, char *buffer)
+ ppid = pid_alive(p) ?
+ task_tgid_nr_ns(rcu_dereference(p->real_parent), ns) : 0;
+ tpid = pid_alive(p) && p->ptrace ?
+- task_ppid_nr_ns(rcu_dereference(p->parent), ns) : 0;
++ task_pid_nr_ns(rcu_dereference(p->parent), ns) : 0;
+ buffer += sprintf(buffer,
+ "State:\t%s\n"
+ "Tgid:\t%d\n"
+@@ -464,8 +464,8 @@ static int do_task_stat(struct task_struct *task, char *buffer, int whole)
+ }
+
+ sid = task_session_nr_ns(task, ns);
++ ppid = task_tgid_nr_ns(task->real_parent, ns);
+ pgid = task_pgrp_nr_ns(task, ns);
+- ppid = task_ppid_nr_ns(task, ns);
+
+ unlock_task_sighand(task, &flags);
+ }
+diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c
+index 4847eb8..21a1c2b 100644
+--- a/fs/xfs/linux-2.6/xfs_file.c
++++ b/fs/xfs/linux-2.6/xfs_file.c
+@@ -261,9 +261,9 @@ xfs_file_readdir(
+ #else
+
+ struct hack_dirent {
+- int namlen;
+- loff_t offset;
+ u64 ino;
++ loff_t offset;
++ int namlen;
+ unsigned int d_type;
+ char name[];
+ };
+@@ -285,8 +285,10 @@ xfs_hack_filldir(
+ {
+ struct hack_callback *buf = __buf;
+ struct hack_dirent *de = (struct hack_dirent *)(buf->dirent + buf->used);
++ unsigned int reclen;
+
+- if (buf->used + sizeof(struct hack_dirent) + namlen > buf->len)
++ reclen = ALIGN(sizeof(struct hack_dirent) + namlen, sizeof(u64));
++ if (buf->used + reclen > buf->len)
+ return -EINVAL;
+
+ de->namlen = namlen;
+@@ -294,7 +296,7 @@ xfs_hack_filldir(
+ de->ino = ino;
+ de->d_type = d_type;
+ memcpy(de->name, name, namlen);
+- buf->used += sizeof(struct hack_dirent) + namlen;
++ buf->used += reclen;
+ return 0;
+ }
+
+@@ -334,7 +336,8 @@ xfs_file_readdir(
+ offset = filp->f_pos;
+
+ while (!eof) {
+- int reclen;
++ unsigned int reclen;
++
+ start_offset = offset;
+
+ buf.used = 0;
+@@ -355,7 +358,8 @@ xfs_file_readdir(
+ goto done;
+ }
+
+- reclen = sizeof(struct hack_dirent) + de->namlen;
++ reclen = ALIGN(sizeof(struct hack_dirent) + de->namlen,
++ sizeof(u64));
+ size -= reclen;
+ de = (struct hack_dirent *)((char *)de + reclen);
+ curr_offset = de->offset /* & 0x7fffffff */;
+diff --git a/include/asm-arm/arch-pxa/hardware.h b/include/asm-arm/arch-pxa/hardware.h
+index ab2d963..e25558f 100644
+--- a/include/asm-arm/arch-pxa/hardware.h
++++ b/include/asm-arm/arch-pxa/hardware.h
+@@ -121,38 +121,32 @@
+
+ #define cpu_is_pxa21x() \
+ ({ \
+- unsigned int id = read_cpuid(CPUID_ID); \
+- __cpu_is_pxa21x(id); \
++ __cpu_is_pxa21x(read_cpuid_id()); \
+ })
+
+ #define cpu_is_pxa25x() \
+ ({ \
+- unsigned int id = read_cpuid(CPUID_ID); \
+- __cpu_is_pxa25x(id); \
++ __cpu_is_pxa25x(read_cpuid_id()); \
+ })
+
+ #define cpu_is_pxa27x() \
+ ({ \
+- unsigned int id = read_cpuid(CPUID_ID); \
+- __cpu_is_pxa27x(id); \
++ __cpu_is_pxa27x(read_cpuid_id()); \
+ })
+
+ #define cpu_is_pxa300() \
+ ({ \
+- unsigned int id = read_cpuid(CPUID_ID); \
+- __cpu_is_pxa300(id); \
++ __cpu_is_pxa300(read_cpuid_id()); \
+ })
+
+ #define cpu_is_pxa310() \
+ ({ \
+- unsigned int id = read_cpuid(CPUID_ID); \
+- __cpu_is_pxa310(id); \
++ __cpu_is_pxa310(read_cpuid_id()); \
+ })
+
+ #define cpu_is_pxa320() \
+ ({ \
+- unsigned int id = read_cpuid(CPUID_ID); \
+- __cpu_is_pxa320(id); \
++ __cpu_is_pxa320(read_cpuid_id()); \
+ })
+
+ /*
+@@ -174,14 +168,12 @@
+
+ #define cpu_is_pxa2xx() \
+ ({ \
+- unsigned int id = read_cpuid(CPUID_ID); \
+- __cpu_is_pxa2xx(id); \
++ __cpu_is_pxa2xx(read_cpuid_id()); \
+ })
+
+ #define cpu_is_pxa3xx() \
+ ({ \
+- unsigned int id = read_cpuid(CPUID_ID); \
+- __cpu_is_pxa3xx(id); \
++ __cpu_is_pxa3xx(read_cpuid_id()); \
+ })
+
+ /*
+diff --git a/include/asm-arm/system.h b/include/asm-arm/system.h
+index 94ea8c6..28425c4 100644
+--- a/include/asm-arm/system.h
++++ b/include/asm-arm/system.h
+@@ -75,8 +75,21 @@
+ #ifndef __ASSEMBLY__
+
+ #include <linux/linkage.h>
++#include <linux/stringify.h>
+ #include <linux/irqflags.h>
+
++/*
++ * The CPU ID never changes at run time, so we might as well tell the
++ * compiler that it's constant. Use this function to read the CPU ID
++ * rather than directly reading processor_id or read_cpuid() directly.
++ */
++static inline unsigned int read_cpuid_id(void) __attribute_const__;
++
++static inline unsigned int read_cpuid_id(void)
++{
++ return read_cpuid(CPUID_ID);
++}
++
+ #define __exception __attribute__((section(".exception.text")))
+
+ struct thread_info;
+diff --git a/include/asm-cris/unistd.h b/include/asm-cris/unistd.h
+index 6f2d924..bd57a79 100644
+--- a/include/asm-cris/unistd.h
++++ b/include/asm-cris/unistd.h
+@@ -358,6 +358,7 @@
+ #define __ARCH_WANT_SYS_SIGPENDING
+ #define __ARCH_WANT_SYS_SIGPROCMASK
+ #define __ARCH_WANT_SYS_RT_SIGACTION
++#define __ARCH_WANT_SYS_RT_SIGSUSPEND
+
+ /*
+ * "Conditional" syscalls
+diff --git a/include/asm-mips/cacheops.h b/include/asm-mips/cacheops.h
+index df7f2de..256ad2c 100644
+--- a/include/asm-mips/cacheops.h
++++ b/include/asm-mips/cacheops.h
+@@ -64,7 +64,7 @@
+ #define Page_Invalidate_T 0x16
+
+ /*
+- * R1000-specific cacheops
++ * R10000-specific cacheops
+ *
+ * Cacheops 0x02, 0x06, 0x0a, 0x0c-0x0e, 0x16, 0x1a and 0x1e are unused.
+ * Most of the _S cacheops are identical to the R4000SC _SD cacheops.
+diff --git a/include/asm-powerpc/mmu-hash64.h b/include/asm-powerpc/mmu-hash64.h
+index 82328de..951e248 100644
+--- a/include/asm-powerpc/mmu-hash64.h
++++ b/include/asm-powerpc/mmu-hash64.h
+@@ -286,6 +286,7 @@ extern void hpte_init_iSeries(void);
+ extern void hpte_init_beat(void);
+ extern void hpte_init_beat_v3(void);
+
++extern void slb_shadow_clear_all(void);
+ extern void stabs_alloc(void);
+ extern void slb_initialize(void);
+ extern void slb_flush_and_rebolt(void);
+diff --git a/include/asm-sh/cacheflush.h b/include/asm-sh/cacheflush.h
+index 9d528ad..e034c36 100644
+--- a/include/asm-sh/cacheflush.h
++++ b/include/asm-sh/cacheflush.h
+@@ -43,6 +43,12 @@ extern void __flush_purge_region(void *start, int size);
+ extern void __flush_invalidate_region(void *start, int size);
+ #endif
+
++#define ARCH_HAS_FLUSH_KERNEL_DCACHE_PAGE
++static inline void flush_kernel_dcache_page(struct page *page)
++{
++ flush_dcache_page(page);
++}
++
+ #if defined(CONFIG_CPU_SH4) && !defined(CONFIG_CACHE_OFF)
+ extern void copy_to_user_page(struct vm_area_struct *vma,
+ struct page *page, unsigned long vaddr, void *dst, const void *src,
+diff --git a/include/asm-sh/uaccess.h b/include/asm-sh/uaccess.h
+index f18a1a5..77c391f 100644
+--- a/include/asm-sh/uaccess.h
++++ b/include/asm-sh/uaccess.h
+@@ -73,38 +73,26 @@ static inline int __access_ok(unsigned long addr, unsigned long size)
+ /*
+ * __access_ok: Check if address with size is OK or not.
+ *
+- * We do three checks:
+- * (1) is it user space?
+- * (2) addr + size --> carry?
+- * (3) addr + size >= 0x80000000 (PAGE_OFFSET)
++ * Uhhuh, this needs 33-bit arithmetic. We have a carry..
+ *
+- * (1) (2) (3) | RESULT
+- * 0 0 0 | ok
+- * 0 0 1 | ok
+- * 0 1 0 | bad
+- * 0 1 1 | bad
+- * 1 0 0 | ok
+- * 1 0 1 | bad
+- * 1 1 0 | bad
+- * 1 1 1 | bad
++ * sum := addr + size; carry? --> flag = true;
++ * if (sum >= addr_limit) flag = true;
+ */
+ static inline int __access_ok(unsigned long addr, unsigned long size)
+ {
+- unsigned long flag, tmp;
+-
+- __asm__("stc r7_bank, %0\n\t"
+- "mov.l @(8,%0), %0\n\t"
+- "clrt\n\t"
+- "addc %2, %1\n\t"
+- "and %1, %0\n\t"
+- "rotcl %0\n\t"
+- "rotcl %0\n\t"
+- "and #3, %0"
+- : "=&z" (flag), "=r" (tmp)
+- : "r" (addr), "1" (size)
+- : "t");
+-
++ unsigned long flag, sum;
++
++ __asm__("clrt\n\t"
++ "addc %3, %1\n\t"
++ "movt %0\n\t"
++ "cmp/hi %4, %1\n\t"
++ "rotcl %0"
++ :"=&r" (flag), "=r" (sum)
++ :"1" (addr), "r" (size),
++ "r" (current_thread_info()->addr_limit.seg)
++ :"t");
+ return flag == 0;
++
+ }
+ #endif /* CONFIG_MMU */
+
+diff --git a/include/linux/i2c-id.h b/include/linux/i2c-id.h
+index 88c8140..e18017d 100644
+--- a/include/linux/i2c-id.h
++++ b/include/linux/i2c-id.h
+@@ -23,6 +23,10 @@
+ #ifndef LINUX_I2C_ID_H
+ #define LINUX_I2C_ID_H
+
++/* Please note that I2C driver IDs are optional. They are only needed if a
++ legacy chip driver needs to identify a bus or a bus driver needs to
++ identify a legacy client. If you don't need them, just don't set them. */
++
+ /*
+ * ---- Driver types -----------------------------------------------------
+ */
+diff --git a/include/linux/key.h b/include/linux/key.h
+index fcdbd5e..a70b8a8 100644
+--- a/include/linux/key.h
++++ b/include/linux/key.h
+@@ -290,7 +290,7 @@ extern void key_init(void);
+ #define key_get(k) ({ NULL; })
+ #define key_put(k) do { } while(0)
+ #define key_ref_put(k) do { } while(0)
+-#define make_key_ref(k) ({ NULL; })
++#define make_key_ref(k, p) ({ NULL; })
+ #define key_ref_to_ptr(k) ({ NULL; })
+ #define is_key_possessed(k) 0
+ #define alloc_uid_keyring(u,c) 0
+diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
+index 1e6af4f..b0813c3 100644
+--- a/include/linux/netdevice.h
++++ b/include/linux/netdevice.h
+@@ -319,21 +319,29 @@ struct napi_struct {
+ enum
+ {
+ NAPI_STATE_SCHED, /* Poll is scheduled */
++ NAPI_STATE_DISABLE, /* Disable pending */
+ };
+
+ extern void FASTCALL(__napi_schedule(struct napi_struct *n));
+
++static inline int napi_disable_pending(struct napi_struct *n)
++{
++ return test_bit(NAPI_STATE_DISABLE, &n->state);
++}
++
+ /**
+ * napi_schedule_prep - check if napi can be scheduled
+ * @n: napi context
+ *
+ * Test if NAPI routine is already running, and if not mark
+ * it as running. This is used as a condition variable
+- * insure only one NAPI poll instance runs
++ * insure only one NAPI poll instance runs. We also make
++ * sure there is no pending NAPI disable.
+ */
+ static inline int napi_schedule_prep(struct napi_struct *n)
+ {
+- return !test_and_set_bit(NAPI_STATE_SCHED, &n->state);
++ return !napi_disable_pending(n) &&
++ !test_and_set_bit(NAPI_STATE_SCHED, &n->state);
+ }
+
+ /**
+@@ -389,8 +397,10 @@ static inline void napi_complete(struct napi_struct *n)
+ */
+ static inline void napi_disable(struct napi_struct *n)
+ {
++ set_bit(NAPI_STATE_DISABLE, &n->state);
+ while (test_and_set_bit(NAPI_STATE_SCHED, &n->state))
+ msleep(1);
++ clear_bit(NAPI_STATE_DISABLE, &n->state);
+ }
+
+ /**
+@@ -1268,7 +1278,7 @@ static inline u32 netif_msg_init(int debug_value, int default_msg_enable_bits)
+ static inline int netif_rx_schedule_prep(struct net_device *dev,
+ struct napi_struct *napi)
+ {
+- return netif_running(dev) && napi_schedule_prep(napi);
++ return napi_schedule_prep(napi);
+ }
+
+ /* Add interface to tail of rx poll list. This assumes that _prep has
+@@ -1277,7 +1287,6 @@ static inline int netif_rx_schedule_prep(struct net_device *dev,
+ static inline void __netif_rx_schedule(struct net_device *dev,
+ struct napi_struct *napi)
+ {
+- dev_hold(dev);
+ __napi_schedule(napi);
+ }
+
+@@ -1308,7 +1317,6 @@ static inline void __netif_rx_complete(struct net_device *dev,
+ struct napi_struct *napi)
+ {
+ __napi_complete(napi);
+- dev_put(dev);
+ }
+
+ /* Remove interface from poll list: it must be in the poll list
+diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
+index 023656d..7f22151 100644
+--- a/include/linux/pci_ids.h
++++ b/include/linux/pci_ids.h
+@@ -2322,6 +2322,8 @@
+ #define PCI_DEVICE_ID_INTEL_ICH9_4 0x2914
+ #define PCI_DEVICE_ID_INTEL_ICH9_5 0x2919
+ #define PCI_DEVICE_ID_INTEL_ICH9_6 0x2930
++#define PCI_DEVICE_ID_INTEL_ICH9_7 0x2916
++#define PCI_DEVICE_ID_INTEL_ICH9_8 0x2918
+ #define PCI_DEVICE_ID_INTEL_82855PM_HB 0x3340
+ #define PCI_DEVICE_ID_INTEL_82830_HB 0x3575
+ #define PCI_DEVICE_ID_INTEL_82830_CGC 0x3577
+diff --git a/include/linux/pm.h b/include/linux/pm.h
+index 09a309b..b78e029 100644
+--- a/include/linux/pm.h
++++ b/include/linux/pm.h
+@@ -246,6 +246,15 @@ static inline int call_platform_enable_wakeup(struct device *dev, int is_on)
+ device_set_wakeup_enable(dev,val); \
+ } while(0)
+
++/*
++ * Global Power Management flags
++ * Used to keep APM and ACPI from both being active
++ */
++extern unsigned int pm_flags;
++
++#define PM_APM 1
++#define PM_ACPI 2
++
+ #endif /* __KERNEL__ */
+
+ #endif /* _LINUX_PM_H */
+diff --git a/include/linux/pm_legacy.h b/include/linux/pm_legacy.h
+index 514729a..446f4f4 100644
+--- a/include/linux/pm_legacy.h
++++ b/include/linux/pm_legacy.h
+@@ -4,10 +4,6 @@
+
+ #ifdef CONFIG_PM_LEGACY
+
+-extern int pm_active;
+-
+-#define PM_IS_ACTIVE() (pm_active != 0)
+-
+ /*
+ * Register a device with power management
+ */
+@@ -21,8 +17,6 @@ int __deprecated pm_send_all(pm_request_t rqst, void *data);
+
+ #else /* CONFIG_PM_LEGACY */
+
+-#define PM_IS_ACTIVE() 0
+-
+ static inline struct pm_dev *pm_register(pm_dev_t type,
+ unsigned long id,
+ pm_callback callback)
+diff --git a/include/linux/pnp.h b/include/linux/pnp.h
+index 0a0426c..2a6d62c 100644
+--- a/include/linux/pnp.h
++++ b/include/linux/pnp.h
+@@ -13,7 +13,7 @@
+ #include <linux/errno.h>
+ #include <linux/mod_devicetable.h>
+
+-#define PNP_MAX_PORT 24
++#define PNP_MAX_PORT 40
+ #define PNP_MAX_MEM 12
+ #define PNP_MAX_IRQ 2
+ #define PNP_MAX_DMA 2
+diff --git a/include/linux/scatterlist.h b/include/linux/scatterlist.h
+index 416e000..e3ff21d 100644
+--- a/include/linux/scatterlist.h
++++ b/include/linux/scatterlist.h
+@@ -191,8 +191,8 @@ static inline void sg_chain(struct scatterlist *prv, unsigned int prv_nents,
+ /*
+ * offset and length are unused for chain entry. Clear them.
+ */
+- prv->offset = 0;
+- prv->length = 0;
++ prv[prv_nents - 1].offset = 0;
++ prv[prv_nents - 1].length = 0;
+
+ /*
+ * Set lowest bit to indicate a link pointer, and make sure to clear
+diff --git a/include/linux/sched.h b/include/linux/sched.h
+index ac3d496..cc14656 100644
+--- a/include/linux/sched.h
++++ b/include/linux/sched.h
+@@ -1255,13 +1255,6 @@ struct pid_namespace;
+ *
+ * set_task_vxid() : assigns a virtual id to a task;
+ *
+- * task_ppid_nr_ns() : the parent's id as seen from the namespace specified.
+- * the result depends on the namespace and whether the
+- * task in question is the namespace's init. e.g. for the
+- * namespace's init this will return 0 when called from
+- * the namespace of this init, or appropriate id otherwise.
+- *
+- *
+ * see also pid_nr() etc in include/linux/pid.h
+ */
+
+@@ -1317,12 +1310,6 @@ static inline pid_t task_session_vnr(struct task_struct *tsk)
+ }
+
+
+-static inline pid_t task_ppid_nr_ns(struct task_struct *tsk,
+- struct pid_namespace *ns)
+-{
+- return pid_nr_ns(task_pid(rcu_dereference(tsk->real_parent)), ns);
+-}
+-
+ /**
+ * pid_alive - check that a task structure is not stale
+ * @p: Task structure to be checked.
+diff --git a/include/linux/tty.h b/include/linux/tty.h
+index c555f54..defd2ab 100644
+--- a/include/linux/tty.h
++++ b/include/linux/tty.h
+@@ -319,6 +319,7 @@ extern speed_t tty_termios_input_baud_rate(struct ktermios *termios);
+ extern void tty_termios_encode_baud_rate(struct ktermios *termios, speed_t ibaud, speed_t obaud);
+ extern void tty_encode_baud_rate(struct tty_struct *tty, speed_t ibaud, speed_t obaud);
+ extern void tty_termios_copy_hw(struct ktermios *new, struct ktermios *old);
++extern int tty_termios_hw_change(struct ktermios *a, struct ktermios *b);
+
+ extern struct tty_ldisc *tty_ldisc_ref(struct tty_struct *);
+ extern void tty_ldisc_deref(struct tty_ldisc *);
+diff --git a/include/linux/writeback.h b/include/linux/writeback.h
+index bef7d66..c6148bb 100644
+--- a/include/linux/writeback.h
++++ b/include/linux/writeback.h
+@@ -62,7 +62,6 @@ struct writeback_control {
+ unsigned for_reclaim:1; /* Invoked from the page allocator */
+ unsigned for_writepages:1; /* This is a writepages() call */
+ unsigned range_cyclic:1; /* range_start is cyclic */
+- unsigned more_io:1; /* more io to be dispatched */
+ };
+
+ /*
+diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h
+index c926551..4c3b351 100644
+--- a/include/net/sch_generic.h
++++ b/include/net/sch_generic.h
+@@ -325,7 +325,6 @@ static inline struct sk_buff *skb_act_clone(struct sk_buff *skb, gfp_t gfp_mask)
+ n->tc_verd = SET_TC_VERD(n->tc_verd, 0);
+ n->tc_verd = CLR_TC_OK2MUNGE(n->tc_verd);
+ n->tc_verd = CLR_TC_MUNGED(n->tc_verd);
+- n->iif = skb->iif;
+ }
+ return n;
+ }
+diff --git a/include/net/sctp/user.h b/include/net/sctp/user.h
+index 00848b6..954090b 100644
+--- a/include/net/sctp/user.h
++++ b/include/net/sctp/user.h
+@@ -450,7 +450,7 @@ enum sctp_sn_type {
+ SCTP_SHUTDOWN_EVENT,
+ SCTP_PARTIAL_DELIVERY_EVENT,
+ SCTP_ADAPTATION_INDICATION,
+- SCTP_AUTHENTICATION_EVENT,
++ SCTP_AUTHENTICATION_INDICATION,
+ };
+
+ /* Notification error codes used to fill up the error fields in some
+diff --git a/include/net/sock.h b/include/net/sock.h
+index 67e35c7..6e1542d 100644
+--- a/include/net/sock.h
++++ b/include/net/sock.h
+@@ -944,7 +944,7 @@ static inline int sk_filter(struct sock *sk, struct sk_buff *skb)
+ return err;
+
+ rcu_read_lock_bh();
+- filter = sk->sk_filter;
++ filter = rcu_dereference(sk->sk_filter);
+ if (filter) {
+ unsigned int pkt_len = sk_run_filter(skb, filter->insns,
+ filter->len);
+diff --git a/include/net/xfrm.h b/include/net/xfrm.h
+index 58dfa82..1dd20cf 100644
+--- a/include/net/xfrm.h
++++ b/include/net/xfrm.h
+@@ -1188,10 +1188,15 @@ static inline int xfrm_aevent_is_on(void)
+ return ret;
+ }
+
++static inline int xfrm_alg_len(struct xfrm_algo *alg)
++{
++ return sizeof(*alg) + ((alg->alg_key_len + 7) / 8);
++}
++
+ #ifdef CONFIG_XFRM_MIGRATE
+ static inline struct xfrm_algo *xfrm_algo_clone(struct xfrm_algo *orig)
+ {
+- return (struct xfrm_algo *)kmemdup(orig, sizeof(*orig) + orig->alg_key_len, GFP_KERNEL);
++ return kmemdup(orig, xfrm_alg_len(orig), GFP_KERNEL);
+ }
+
+ static inline void xfrm_states_put(struct xfrm_state **states, int n)
+diff --git a/kernel/acct.c b/kernel/acct.c
+index cf19547..521dfa5 100644
+--- a/kernel/acct.c
++++ b/kernel/acct.c
+@@ -482,7 +482,7 @@ static void do_acct_process(struct file *file)
+ #endif
+ #if ACCT_VERSION==3
+ ac.ac_pid = current->tgid;
+- ac.ac_ppid = current->parent->tgid;
++ ac.ac_ppid = current->real_parent->tgid;
+ #endif
+
+ spin_lock_irq(¤t->sighand->siglock);
+diff --git a/kernel/futex.c b/kernel/futex.c
+index 172a1ae..db9824d 100644
+--- a/kernel/futex.c
++++ b/kernel/futex.c
+@@ -1097,15 +1097,15 @@ static void unqueue_me_pi(struct futex_q *q)
+ }
+
+ /*
+- * Fixup the pi_state owner with current.
++ * Fixup the pi_state owner with the new owner.
+ *
+ * Must be called with hash bucket lock held and mm->sem held for non
+ * private futexes.
+ */
+ static int fixup_pi_state_owner(u32 __user *uaddr, struct futex_q *q,
+- struct task_struct *curr)
++ struct task_struct *newowner)
+ {
+- u32 newtid = task_pid_vnr(curr) | FUTEX_WAITERS;
++ u32 newtid = task_pid_vnr(newowner) | FUTEX_WAITERS;
+ struct futex_pi_state *pi_state = q->pi_state;
+ u32 uval, curval, newval;
+ int ret;
+@@ -1119,12 +1119,12 @@ static int fixup_pi_state_owner(u32 __user *uaddr, struct futex_q *q,
+ } else
+ newtid |= FUTEX_OWNER_DIED;
+
+- pi_state->owner = curr;
++ pi_state->owner = newowner;
+
+- spin_lock_irq(&curr->pi_lock);
++ spin_lock_irq(&newowner->pi_lock);
+ WARN_ON(!list_empty(&pi_state->list));
+- list_add(&pi_state->list, &curr->pi_state_list);
+- spin_unlock_irq(&curr->pi_lock);
++ list_add(&pi_state->list, &newowner->pi_state_list);
++ spin_unlock_irq(&newowner->pi_lock);
+
+ /*
+ * We own it, so we have to replace the pending owner
+@@ -1508,9 +1508,40 @@ static int futex_lock_pi(u32 __user *uaddr, struct rw_semaphore *fshared,
+ * when we were on the way back before we locked the
+ * hash bucket.
+ */
+- if (q.pi_state->owner == curr &&
+- rt_mutex_trylock(&q.pi_state->pi_mutex)) {
+- ret = 0;
++ if (q.pi_state->owner == curr) {
++ /*
++ * Try to get the rt_mutex now. This might
++ * fail as some other task acquired the
++ * rt_mutex after we removed ourself from the
++ * rt_mutex waiters list.
++ */
++ if (rt_mutex_trylock(&q.pi_state->pi_mutex))
++ ret = 0;
++ else {
++ /*
++ * pi_state is incorrect, some other
++ * task did a lock steal and we
++ * returned due to timeout or signal
++ * without taking the rt_mutex. Too
++ * late. We can access the
++ * rt_mutex_owner without locking, as
++ * the other task is now blocked on
++ * the hash bucket lock. Fix the state
++ * up.
++ */
++ struct task_struct *owner;
++ int res;
++
++ owner = rt_mutex_owner(&q.pi_state->pi_mutex);
++ res = fixup_pi_state_owner(uaddr, &q, owner);
++
++ WARN_ON(rt_mutex_owner(&q.pi_state->pi_mutex) !=
++ owner);
++
++ /* propagate -EFAULT, if the fixup failed */
++ if (res)
++ ret = res;
++ }
+ } else {
+ /*
+ * Paranoia check. If we did not take the lock
+diff --git a/kernel/kexec.c b/kernel/kexec.c
+index aa74a1e..9a26eec 100644
+--- a/kernel/kexec.c
++++ b/kernel/kexec.c
+@@ -1404,6 +1404,7 @@ static int __init crash_save_vmcoreinfo_init(void)
+ VMCOREINFO_OFFSET(list_head, next);
+ VMCOREINFO_OFFSET(list_head, prev);
+ VMCOREINFO_LENGTH(zone.free_area, MAX_ORDER);
++ VMCOREINFO_LENGTH(free_area.free_list, MIGRATE_TYPES);
+ VMCOREINFO_NUMBER(NR_FREE_PAGES);
+
+ arch_crash_save_vmcoreinfo();
+diff --git a/kernel/module.c b/kernel/module.c
+index 91fe695..c2e3e2e 100644
+--- a/kernel/module.c
++++ b/kernel/module.c
+@@ -2214,29 +2214,34 @@ static const char *get_ksymbol(struct module *mod,
+ /* For kallsyms to ask for address resolution. NULL means not found.
+ We don't lock, as this is used for oops resolution and races are a
+ lesser concern. */
++/* FIXME: Risky: returns a pointer into a module w/o lock */
+ const char *module_address_lookup(unsigned long addr,
+ unsigned long *size,
+ unsigned long *offset,
+ char **modname)
+ {
+ struct module *mod;
++ const char *ret = NULL;
+
++ preempt_disable();
+ list_for_each_entry(mod, &modules, list) {
+ if (within(addr, mod->module_init, mod->init_size)
+ || within(addr, mod->module_core, mod->core_size)) {
+ if (modname)
+ *modname = mod->name;
+- return get_ksymbol(mod, addr, size, offset);
++ ret = get_ksymbol(mod, addr, size, offset);
++ break;
+ }
+ }
+- return NULL;
++ preempt_enable();
++ return ret;
+ }
+
+ int lookup_module_symbol_name(unsigned long addr, char *symname)
+ {
+ struct module *mod;
+
+- mutex_lock(&module_mutex);
++ preempt_disable();
+ list_for_each_entry(mod, &modules, list) {
+ if (within(addr, mod->module_init, mod->init_size) ||
+ within(addr, mod->module_core, mod->core_size)) {
+@@ -2246,12 +2251,12 @@ int lookup_module_symbol_name(unsigned long addr, char *symname)
+ if (!sym)
+ goto out;
+ strlcpy(symname, sym, KSYM_NAME_LEN);
+- mutex_unlock(&module_mutex);
++ preempt_enable();
+ return 0;
+ }
+ }
+ out:
+- mutex_unlock(&module_mutex);
++ preempt_enable();
+ return -ERANGE;
+ }
+
+@@ -2260,7 +2265,7 @@ int lookup_module_symbol_attrs(unsigned long addr, unsigned long *size,
+ {
+ struct module *mod;
+
+- mutex_lock(&module_mutex);
++ preempt_disable();
+ list_for_each_entry(mod, &modules, list) {
+ if (within(addr, mod->module_init, mod->init_size) ||
+ within(addr, mod->module_core, mod->core_size)) {
+@@ -2273,12 +2278,12 @@ int lookup_module_symbol_attrs(unsigned long addr, unsigned long *size,
+ strlcpy(modname, mod->name, MODULE_NAME_LEN);
+ if (name)
+ strlcpy(name, sym, KSYM_NAME_LEN);
+- mutex_unlock(&module_mutex);
++ preempt_enable();
+ return 0;
+ }
+ }
+ out:
+- mutex_unlock(&module_mutex);
++ preempt_enable();
+ return -ERANGE;
+ }
+
+@@ -2287,7 +2292,7 @@ int module_get_kallsym(unsigned int symnum, unsigned long *value, char *type,
+ {
+ struct module *mod;
+
+- mutex_lock(&module_mutex);
++ preempt_disable();
+ list_for_each_entry(mod, &modules, list) {
+ if (symnum < mod->num_symtab) {
+ *value = mod->symtab[symnum].st_value;
+@@ -2296,12 +2301,12 @@ int module_get_kallsym(unsigned int symnum, unsigned long *value, char *type,
+ KSYM_NAME_LEN);
+ strlcpy(module_name, mod->name, MODULE_NAME_LEN);
+ *exported = is_exported(name, mod);
+- mutex_unlock(&module_mutex);
++ preempt_enable();
+ return 0;
+ }
+ symnum -= mod->num_symtab;
+ }
+- mutex_unlock(&module_mutex);
++ preempt_enable();
+ return -ERANGE;
+ }
+
+@@ -2324,6 +2329,7 @@ unsigned long module_kallsyms_lookup_name(const char *name)
+ unsigned long ret = 0;
+
+ /* Don't lock: we're in enough trouble already. */
++ preempt_disable();
+ if ((colon = strchr(name, ':')) != NULL) {
+ *colon = '\0';
+ if ((mod = find_module(name)) != NULL)
+@@ -2334,6 +2340,7 @@ unsigned long module_kallsyms_lookup_name(const char *name)
+ if ((ret = mod_find_symname(mod, name)) != 0)
+ break;
+ }
++ preempt_enable();
+ return ret;
+ }
+ #endif /* CONFIG_KALLSYMS */
+diff --git a/kernel/power/main.c b/kernel/power/main.c
+index 3cdf95b..f71c950 100644
+--- a/kernel/power/main.c
++++ b/kernel/power/main.c
+@@ -28,6 +28,9 @@ BLOCKING_NOTIFIER_HEAD(pm_chain_head);
+
+ DEFINE_MUTEX(pm_mutex);
+
++unsigned int pm_flags;
++EXPORT_SYMBOL(pm_flags);
++
+ #ifdef CONFIG_SUSPEND
+
+ /* This is just an arbitrary number */
+diff --git a/kernel/power/pm.c b/kernel/power/pm.c
+index c50d152..60c73fa 100644
+--- a/kernel/power/pm.c
++++ b/kernel/power/pm.c
+@@ -27,8 +27,6 @@
+ #include <linux/interrupt.h>
+ #include <linux/mutex.h>
+
+-int pm_active;
+-
+ /*
+ * Locking notes:
+ * pm_devs_lock can be a semaphore providing pm ops are not called
+@@ -204,6 +202,4 @@ int pm_send_all(pm_request_t rqst, void *data)
+
+ EXPORT_SYMBOL(pm_register);
+ EXPORT_SYMBOL(pm_send_all);
+-EXPORT_SYMBOL(pm_active);
+-
+
+diff --git a/kernel/sched.c b/kernel/sched.c
+index 3df84ea..37cf07a 100644
+--- a/kernel/sched.c
++++ b/kernel/sched.c
+@@ -4918,7 +4918,7 @@ static void show_task(struct task_struct *p)
+ }
+ #endif
+ printk(KERN_CONT "%5lu %5d %6d\n", free,
+- task_pid_nr(p), task_pid_nr(p->parent));
++ task_pid_nr(p), task_pid_nr(p->real_parent));
+
+ if (state != TASK_RUNNING)
+ show_stack(p, NULL);
+diff --git a/kernel/timer.c b/kernel/timer.c
+index d4527dc..26671f4 100644
+--- a/kernel/timer.c
++++ b/kernel/timer.c
+@@ -978,7 +978,7 @@ asmlinkage long sys_getppid(void)
+ int pid;
+
+ rcu_read_lock();
+- pid = task_ppid_nr_ns(current, current->nsproxy->pid_ns);
++ pid = task_tgid_nr_ns(current->real_parent, current->nsproxy->pid_ns);
+ rcu_read_unlock();
+
+ return pid;
+diff --git a/mm/filemap_xip.c b/mm/filemap_xip.c
+index e233fff..f874ae8 100644
+--- a/mm/filemap_xip.c
++++ b/mm/filemap_xip.c
+@@ -25,14 +25,15 @@ static struct page *__xip_sparse_page;
+ static struct page *xip_sparse_page(void)
+ {
+ if (!__xip_sparse_page) {
+- unsigned long zeroes = get_zeroed_page(GFP_HIGHUSER);
+- if (zeroes) {
++ struct page *page = alloc_page(GFP_HIGHUSER | __GFP_ZERO);
++
++ if (page) {
+ static DEFINE_SPINLOCK(xip_alloc_lock);
+ spin_lock(&xip_alloc_lock);
+ if (!__xip_sparse_page)
+- __xip_sparse_page = virt_to_page(zeroes);
++ __xip_sparse_page = page;
+ else
+- free_page(zeroes);
++ __free_page(page);
+ spin_unlock(&xip_alloc_lock);
+ }
+ }
+diff --git a/mm/hugetlb.c b/mm/hugetlb.c
+index 7224a4f..e0fda15 100644
+--- a/mm/hugetlb.c
++++ b/mm/hugetlb.c
+@@ -418,9 +418,14 @@ static struct page *alloc_huge_page_private(struct vm_area_struct *vma,
+ if (free_huge_pages > resv_huge_pages)
+ page = dequeue_huge_page(vma, addr);
+ spin_unlock(&hugetlb_lock);
+- if (!page)
++ if (!page) {
+ page = alloc_buddy_huge_page(vma, addr);
+- return page ? page : ERR_PTR(-VM_FAULT_OOM);
++ if (!page) {
++ hugetlb_put_quota(vma->vm_file->f_mapping, 1);
++ return ERR_PTR(-VM_FAULT_OOM);
++ }
++ }
++ return page;
+ }
+
+ static struct page *alloc_huge_page(struct vm_area_struct *vma,
+@@ -1206,8 +1211,10 @@ int hugetlb_reserve_pages(struct inode *inode, long from, long to)
+ if (hugetlb_get_quota(inode->i_mapping, chg))
+ return -ENOSPC;
+ ret = hugetlb_acct_memory(chg);
+- if (ret < 0)
++ if (ret < 0) {
++ hugetlb_put_quota(inode->i_mapping, chg);
+ return ret;
++ }
+ region_add(&inode->i_mapping->private_list, from, to);
+ return 0;
+ }
+diff --git a/mm/page-writeback.c b/mm/page-writeback.c
+index d55cfca..3d3848f 100644
+--- a/mm/page-writeback.c
++++ b/mm/page-writeback.c
+@@ -558,7 +558,6 @@ static void background_writeout(unsigned long _min_pages)
+ global_page_state(NR_UNSTABLE_NFS) < background_thresh
+ && min_pages <= 0)
+ break;
+- wbc.more_io = 0;
+ wbc.encountered_congestion = 0;
+ wbc.nr_to_write = MAX_WRITEBACK_PAGES;
+ wbc.pages_skipped = 0;
+@@ -566,9 +565,8 @@ static void background_writeout(unsigned long _min_pages)
+ min_pages -= MAX_WRITEBACK_PAGES - wbc.nr_to_write;
+ if (wbc.nr_to_write > 0 || wbc.pages_skipped > 0) {
+ /* Wrote less than expected */
+- if (wbc.encountered_congestion || wbc.more_io)
+- congestion_wait(WRITE, HZ/10);
+- else
++ congestion_wait(WRITE, HZ/10);
++ if (!wbc.encountered_congestion)
+ break;
+ }
+ }
+@@ -633,12 +631,11 @@ static void wb_kupdate(unsigned long arg)
+ global_page_state(NR_UNSTABLE_NFS) +
+ (inodes_stat.nr_inodes - inodes_stat.nr_unused);
+ while (nr_to_write > 0) {
+- wbc.more_io = 0;
+ wbc.encountered_congestion = 0;
+ wbc.nr_to_write = MAX_WRITEBACK_PAGES;
+ writeback_inodes(&wbc);
+ if (wbc.nr_to_write > 0) {
+- if (wbc.encountered_congestion || wbc.more_io)
++ if (wbc.encountered_congestion)
+ congestion_wait(WRITE, HZ/10);
+ else
+ break; /* All the old data is written */
+diff --git a/mm/page_alloc.c b/mm/page_alloc.c
+index d73bfad..e1028fa 100644
+--- a/mm/page_alloc.c
++++ b/mm/page_alloc.c
+@@ -3438,7 +3438,7 @@ static void __init_refok alloc_node_mem_map(struct pglist_data *pgdat)
+ mem_map = NODE_DATA(0)->node_mem_map;
+ #ifdef CONFIG_ARCH_POPULATES_NODE_MAP
+ if (page_to_pfn(mem_map) != pgdat->node_start_pfn)
+- mem_map -= pgdat->node_start_pfn;
++ mem_map -= (pgdat->node_start_pfn - ARCH_PFN_OFFSET);
+ #endif /* CONFIG_ARCH_POPULATES_NODE_MAP */
+ }
+ #endif
+diff --git a/mm/quicklist.c b/mm/quicklist.c
+index ae8189c..3f703f7 100644
+--- a/mm/quicklist.c
++++ b/mm/quicklist.c
+@@ -26,9 +26,17 @@ DEFINE_PER_CPU(struct quicklist, quicklist)[CONFIG_NR_QUICK];
+ static unsigned long max_pages(unsigned long min_pages)
+ {
+ unsigned long node_free_pages, max;
++ struct zone *zones = NODE_DATA(numa_node_id())->node_zones;
++
++ node_free_pages =
++#ifdef CONFIG_ZONE_DMA
++ zone_page_state(&zones[ZONE_DMA], NR_FREE_PAGES) +
++#endif
++#ifdef CONFIG_ZONE_DMA32
++ zone_page_state(&zones[ZONE_DMA32], NR_FREE_PAGES) +
++#endif
++ zone_page_state(&zones[ZONE_NORMAL], NR_FREE_PAGES);
+
+- node_free_pages = node_page_state(numa_node_id(),
+- NR_FREE_PAGES);
+ max = node_free_pages / FRACTION_OF_NODE_MEM;
+ return max(max, min_pages);
+ }
+diff --git a/net/atm/mpc.c b/net/atm/mpc.c
+index 2086396..9c7f712 100644
+--- a/net/atm/mpc.c
++++ b/net/atm/mpc.c
+@@ -542,6 +542,13 @@ static int mpc_send_packet(struct sk_buff *skb, struct net_device *dev)
+ if (eth->h_proto != htons(ETH_P_IP))
+ goto non_ip; /* Multi-Protocol Over ATM :-) */
+
++ /* Weed out funny packets (e.g., AF_PACKET or raw). */
++ if (skb->len < ETH_HLEN + sizeof(struct iphdr))
++ goto non_ip;
++ skb_set_network_header(skb, ETH_HLEN);
++ if (skb->len < ETH_HLEN + ip_hdr(skb)->ihl * 4 || ip_hdr(skb)->ihl < 5)
++ goto non_ip;
++
+ while (i < mpc->number_of_mps_macs) {
+ if (!compare_ether_addr(eth->h_dest, (mpc->mps_macs + i*ETH_ALEN)))
+ if ( send_via_shortcut(skb, mpc) == 0 ) /* try shortcut */
+diff --git a/net/core/dev.c b/net/core/dev.c
+index be9d301..0879f52 100644
+--- a/net/core/dev.c
++++ b/net/core/dev.c
+@@ -2207,8 +2207,12 @@ static void net_rx_action(struct softirq_action *h)
+ * still "owns" the NAPI instance and therefore can
+ * move the instance around on the list at-will.
+ */
+- if (unlikely(work == weight))
+- list_move_tail(&n->poll_list, list);
++ if (unlikely(work == weight)) {
++ if (unlikely(napi_disable_pending(n)))
++ __napi_complete(n);
++ else
++ list_move_tail(&n->poll_list, list);
++ }
+
+ netpoll_poll_unlock(have);
+ }
+diff --git a/net/core/skbuff.c b/net/core/skbuff.c
+index 5b4ce9b..b628377 100644
+--- a/net/core/skbuff.c
++++ b/net/core/skbuff.c
+@@ -416,16 +416,17 @@ static struct sk_buff *__skb_clone(struct sk_buff *n, struct sk_buff *skb)
+ C(len);
+ C(data_len);
+ C(mac_len);
+- n->cloned = 1;
+ n->hdr_len = skb->nohdr ? skb_headroom(skb) : skb->hdr_len;
++ n->cloned = 1;
+ n->nohdr = 0;
+ n->destructor = NULL;
+- C(truesize);
+- atomic_set(&n->users, 1);
+- C(head);
+- C(data);
++ C(iif);
+ C(tail);
+ C(end);
++ C(head);
++ C(data);
++ C(truesize);
++ atomic_set(&n->users, 1);
+
+ atomic_inc(&(skb_shinfo(skb)->dataref));
+ skb->cloned = 1;
+diff --git a/net/ipv4/inet_lro.c b/net/ipv4/inet_lro.c
+index 9a96c27..4a4d49f 100644
+--- a/net/ipv4/inet_lro.c
++++ b/net/ipv4/inet_lro.c
+@@ -310,7 +310,7 @@ static void lro_flush(struct net_lro_mgr *lro_mgr,
+ skb_shinfo(lro_desc->parent)->gso_size = lro_desc->mss;
+
+ if (lro_desc->vgrp) {
+- if (test_bit(LRO_F_NAPI, &lro_mgr->features))
++ if (lro_mgr->features & LRO_F_NAPI)
+ vlan_hwaccel_receive_skb(lro_desc->parent,
+ lro_desc->vgrp,
+ lro_desc->vlan_tag);
+@@ -320,7 +320,7 @@ static void lro_flush(struct net_lro_mgr *lro_mgr,
+ lro_desc->vlan_tag);
+
+ } else {
+- if (test_bit(LRO_F_NAPI, &lro_mgr->features))
++ if (lro_mgr->features & LRO_F_NAPI)
+ netif_receive_skb(lro_desc->parent);
+ else
+ netif_rx(lro_desc->parent);
+@@ -352,7 +352,7 @@ static int __lro_proc_skb(struct net_lro_mgr *lro_mgr, struct sk_buff *skb,
+ goto out;
+
+ if ((skb->protocol == htons(ETH_P_8021Q))
+- && !test_bit(LRO_F_EXTRACT_VLAN_ID, &lro_mgr->features))
++ && !(lro_mgr->features & LRO_F_EXTRACT_VLAN_ID))
+ vlan_hdr_len = VLAN_HLEN;
+
+ if (!lro_desc->active) { /* start new lro session */
+@@ -474,7 +474,7 @@ static struct sk_buff *__lro_proc_segment(struct net_lro_mgr *lro_mgr,
+ goto out;
+
+ if ((skb->protocol == htons(ETH_P_8021Q))
+- && !test_bit(LRO_F_EXTRACT_VLAN_ID, &lro_mgr->features))
++ && !(lro_mgr->features & LRO_F_EXTRACT_VLAN_ID))
+ vlan_hdr_len = VLAN_HLEN;
+
+ iph = (void *)(skb->data + vlan_hdr_len);
+@@ -516,7 +516,7 @@ void lro_receive_skb(struct net_lro_mgr *lro_mgr,
+ void *priv)
+ {
+ if (__lro_proc_skb(lro_mgr, skb, NULL, 0, priv)) {
+- if (test_bit(LRO_F_NAPI, &lro_mgr->features))
++ if (lro_mgr->features & LRO_F_NAPI)
+ netif_receive_skb(skb);
+ else
+ netif_rx(skb);
+@@ -531,7 +531,7 @@ void lro_vlan_hwaccel_receive_skb(struct net_lro_mgr *lro_mgr,
+ void *priv)
+ {
+ if (__lro_proc_skb(lro_mgr, skb, vgrp, vlan_tag, priv)) {
+- if (test_bit(LRO_F_NAPI, &lro_mgr->features))
++ if (lro_mgr->features & LRO_F_NAPI)
+ vlan_hwaccel_receive_skb(skb, vgrp, vlan_tag);
+ else
+ vlan_hwaccel_rx(skb, vgrp, vlan_tag);
+@@ -550,7 +550,7 @@ void lro_receive_frags(struct net_lro_mgr *lro_mgr,
+ if (!skb)
+ return;
+
+- if (test_bit(LRO_F_NAPI, &lro_mgr->features))
++ if (lro_mgr->features & LRO_F_NAPI)
+ netif_receive_skb(skb);
+ else
+ netif_rx(skb);
+@@ -570,7 +570,7 @@ void lro_vlan_hwaccel_receive_frags(struct net_lro_mgr *lro_mgr,
+ if (!skb)
+ return;
+
+- if (test_bit(LRO_F_NAPI, &lro_mgr->features))
++ if (lro_mgr->features & LRO_F_NAPI)
+ vlan_hwaccel_receive_skb(skb, vgrp, vlan_tag);
+ else
+ vlan_hwaccel_rx(skb, vgrp, vlan_tag);
+diff --git a/net/ipv4/ipconfig.c b/net/ipv4/ipconfig.c
+index 56a6757..b8f7763 100644
+--- a/net/ipv4/ipconfig.c
++++ b/net/ipv4/ipconfig.c
+@@ -1404,8 +1404,7 @@ static int __init ic_proto_name(char *name)
+ return 1;
+ }
+ if (!strcmp(name, "off") || !strcmp(name, "none")) {
+- ic_enable = 0;
+- return 1;
++ return 0;
+ }
+ #ifdef CONFIG_IP_PNP_DHCP
+ else if (!strcmp(name, "dhcp")) {
+@@ -1442,10 +1441,22 @@ static int __init ip_auto_config_setup(char *addrs)
+ ic_set_manually = 1;
+ ic_enable = 1;
+
++ /*
++ * If any dhcp, bootp etc options are set, leave autoconfig on
++ * and skip the below static IP processing.
++ */
+ if (ic_proto_name(addrs))
+ return 1;
+
+- /* Parse the whole string */
++ /* If no static IP is given, turn off autoconfig and bail. */
++ if (*addrs == 0 ||
++ strcmp(addrs, "off") == 0 ||
++ strcmp(addrs, "none") == 0) {
++ ic_enable = 0;
++ return 1;
++ }
++
++ /* Parse string for static IP assignment. */
+ ip = addrs;
+ while (ip && *ip) {
+ if ((cp = strchr(ip, ':')))
+@@ -1483,7 +1494,10 @@ static int __init ip_auto_config_setup(char *addrs)
+ strlcpy(user_dev_name, ip, sizeof(user_dev_name));
+ break;
+ case 6:
+- ic_proto_name(ip);
++ if (ic_proto_name(ip) == 0 &&
++ ic_myaddr == NONE) {
++ ic_enable = 0;
++ }
+ break;
+ }
+ }
+diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c
+index 66b42f5..e7050f8 100644
+--- a/net/ipv4/raw.c
++++ b/net/ipv4/raw.c
+@@ -271,6 +271,7 @@ static int raw_send_hdrinc(struct sock *sk, void *from, size_t length,
+ int hh_len;
+ struct iphdr *iph;
+ struct sk_buff *skb;
++ unsigned int iphlen;
+ int err;
+
+ if (length > rt->u.dst.dev->mtu) {
+@@ -304,7 +305,8 @@ static int raw_send_hdrinc(struct sock *sk, void *from, size_t length,
+ goto error_fault;
+
+ /* We don't modify invalid header */
+- if (length >= sizeof(*iph) && iph->ihl * 4U <= length) {
++ iphlen = iph->ihl * 4;
++ if (iphlen >= sizeof(*iph) && iphlen <= length) {
+ if (!iph->saddr)
+ iph->saddr = rt->rt_src;
+ iph->check = 0;
+diff --git a/net/ipv4/route.c b/net/ipv4/route.c
+index d2bc614..d337706 100644
+--- a/net/ipv4/route.c
++++ b/net/ipv4/route.c
+@@ -2626,11 +2626,10 @@ int ip_rt_dump(struct sk_buff *skb, struct netlink_callback *cb)
+ int idx, s_idx;
+
+ s_h = cb->args[0];
++ if (s_h < 0)
++ s_h = 0;
+ s_idx = idx = cb->args[1];
+- for (h = 0; h <= rt_hash_mask; h++) {
+- if (h < s_h) continue;
+- if (h > s_h)
+- s_idx = 0;
++ for (h = s_h; h <= rt_hash_mask; h++) {
+ rcu_read_lock_bh();
+ for (rt = rcu_dereference(rt_hash_table[h].chain), idx = 0; rt;
+ rt = rcu_dereference(rt->u.dst.rt_next), idx++) {
+@@ -2647,6 +2646,7 @@ int ip_rt_dump(struct sk_buff *skb, struct netlink_callback *cb)
+ dst_release(xchg(&skb->dst, NULL));
+ }
+ rcu_read_unlock_bh();
++ s_idx = 0;
+ }
+
+ done:
+diff --git a/net/ipv6/datagram.c b/net/ipv6/datagram.c
+index 2ed689a..5d4245a 100644
+--- a/net/ipv6/datagram.c
++++ b/net/ipv6/datagram.c
+@@ -123,11 +123,11 @@ ipv4_connected:
+ goto out;
+ }
+ sk->sk_bound_dev_if = usin->sin6_scope_id;
+- if (!sk->sk_bound_dev_if &&
+- (addr_type & IPV6_ADDR_MULTICAST))
+- fl.oif = np->mcast_oif;
+ }
+
++ if (!sk->sk_bound_dev_if && (addr_type & IPV6_ADDR_MULTICAST))
++ sk->sk_bound_dev_if = np->mcast_oif;
++
+ /* Connect to link-local address requires an interface */
+ if (!sk->sk_bound_dev_if) {
+ err = -EINVAL;
+diff --git a/net/irda/af_irda.c b/net/irda/af_irda.c
+index 48ce59a..d5e4dd7 100644
+--- a/net/irda/af_irda.c
++++ b/net/irda/af_irda.c
+@@ -1118,8 +1118,6 @@ static int irda_create(struct net *net, struct socket *sock, int protocol)
+ self->max_sdu_size_rx = TTP_SAR_UNBOUND;
+ break;
+ default:
+- IRDA_ERROR("%s: protocol not supported!\n",
+- __FUNCTION__);
+ return -ESOCKTNOSUPPORT;
+ }
+ break;
+diff --git a/net/mac80211/ieee80211_ioctl.c b/net/mac80211/ieee80211_ioctl.c
+index 7027eed..308bbe4 100644
+--- a/net/mac80211/ieee80211_ioctl.c
++++ b/net/mac80211/ieee80211_ioctl.c
+@@ -591,7 +591,7 @@ static int ieee80211_ioctl_siwrate(struct net_device *dev,
+ sdata->bss->force_unicast_rateidx = -1;
+ if (rate->value < 0)
+ return 0;
+- for (i=0; i< mode->num_rates; i++) {
++ for (i=0; i < mode->num_rates; i++) {
+ struct ieee80211_rate *rates = &mode->rates[i];
+ int this_rate = rates->rate;
+
+@@ -599,10 +599,10 @@ static int ieee80211_ioctl_siwrate(struct net_device *dev,
+ sdata->bss->max_ratectrl_rateidx = i;
+ if (rate->fixed)
+ sdata->bss->force_unicast_rateidx = i;
+- break;
++ return 0;
+ }
+ }
+- return 0;
++ return -EINVAL;
+ }
+
+ static int ieee80211_ioctl_giwrate(struct net_device *dev,
+diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c
+index ed7c9e3..3cc629d 100644
+--- a/net/sctp/sm_make_chunk.c
++++ b/net/sctp/sm_make_chunk.c
+@@ -210,6 +210,9 @@ struct sctp_chunk *sctp_make_init(const struct sctp_association *asoc,
+ chunksize = sizeof(init) + addrs_len + SCTP_SAT_LEN(num_types);
+ chunksize += sizeof(ecap_param);
+
++ if (sctp_prsctp_enable)
++ chunksize += sizeof(prsctp_param);
++
+ /* ADDIP: Section 4.2.7:
+ * An implementation supporting this extension [ADDIP] MUST list
+ * the ASCONF,the ASCONF-ACK, and the AUTH chunks in its INIT and
+@@ -369,6 +372,9 @@ struct sctp_chunk *sctp_make_init_ack(const struct sctp_association *asoc,
+ if (asoc->peer.ecn_capable)
+ chunksize += sizeof(ecap_param);
+
++ if (sctp_prsctp_enable)
++ chunksize += sizeof(prsctp_param);
++
+ if (sctp_addip_enable) {
+ extensions[num_ext] = SCTP_CID_ASCONF;
+ extensions[num_ext+1] = SCTP_CID_ASCONF_ACK;
+diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c
+index 5fb8477..d247ed4 100644
+--- a/net/sctp/sm_statefuns.c
++++ b/net/sctp/sm_statefuns.c
+@@ -1309,26 +1309,6 @@ static void sctp_tietags_populate(struct sctp_association *new_asoc,
+ new_asoc->c.initial_tsn = asoc->c.initial_tsn;
+ }
+
+-static void sctp_auth_params_populate(struct sctp_association *new_asoc,
+- const struct sctp_association *asoc)
+-{
+- /* Only perform this if AUTH extension is enabled */
+- if (!sctp_auth_enable)
+- return;
+-
+- /* We need to provide the same parameter information as
+- * was in the original INIT. This means that we need to copy
+- * the HMACS, CHUNKS, and RANDOM parameter from the original
+- * assocaition.
+- */
+- memcpy(new_asoc->c.auth_random, asoc->c.auth_random,
+- sizeof(asoc->c.auth_random));
+- memcpy(new_asoc->c.auth_hmacs, asoc->c.auth_hmacs,
+- sizeof(asoc->c.auth_hmacs));
+- memcpy(new_asoc->c.auth_chunks, asoc->c.auth_chunks,
+- sizeof(asoc->c.auth_chunks));
+-}
+-
+ /*
+ * Compare vtag/tietag values to determine unexpected COOKIE-ECHO
+ * handling action.
+@@ -1486,8 +1466,6 @@ static sctp_disposition_t sctp_sf_do_unexpected_init(
+
+ sctp_tietags_populate(new_asoc, asoc);
+
+- sctp_auth_params_populate(new_asoc, asoc);
+-
+ /* B) "Z" shall respond immediately with an INIT ACK chunk. */
+
+ /* If there are errors need to be reported for unknown parameters,
+diff --git a/net/sctp/ulpevent.c b/net/sctp/ulpevent.c
+index 2c17c7e..3073143 100644
+--- a/net/sctp/ulpevent.c
++++ b/net/sctp/ulpevent.c
+@@ -830,7 +830,7 @@ struct sctp_ulpevent *sctp_ulpevent_make_authkey(
+ ak = (struct sctp_authkey_event *)
+ skb_put(skb, sizeof(struct sctp_authkey_event));
+
+- ak->auth_type = SCTP_AUTHENTICATION_EVENT;
++ ak->auth_type = SCTP_AUTHENTICATION_INDICATION;
+ ak->auth_flags = 0;
+ ak->auth_length = sizeof(struct sctp_authkey_event);
+
+diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c
+index e75dbdc..c4f6419 100644
+--- a/net/xfrm/xfrm_user.c
++++ b/net/xfrm/xfrm_user.c
+@@ -31,11 +31,6 @@
+ #include <linux/in6.h>
+ #endif
+
+-static inline int alg_len(struct xfrm_algo *alg)
+-{
+- return sizeof(*alg) + ((alg->alg_key_len + 7) / 8);
+-}
+-
+ static int verify_one_alg(struct nlattr **attrs, enum xfrm_attr_type_t type)
+ {
+ struct nlattr *rt = attrs[type];
+@@ -45,7 +40,7 @@ static int verify_one_alg(struct nlattr **attrs, enum xfrm_attr_type_t type)
+ return 0;
+
+ algp = nla_data(rt);
+- if (nla_len(rt) < alg_len(algp))
++ if (nla_len(rt) < xfrm_alg_len(algp))
+ return -EINVAL;
+
+ switch (type) {
+@@ -204,7 +199,7 @@ static int attach_one_algo(struct xfrm_algo **algpp, u8 *props,
+ return -ENOSYS;
+ *props = algo->desc.sadb_alg_id;
+
+- p = kmemdup(ualg, alg_len(ualg), GFP_KERNEL);
++ p = kmemdup(ualg, xfrm_alg_len(ualg), GFP_KERNEL);
+ if (!p)
+ return -ENOMEM;
+
+@@ -516,9 +511,9 @@ static int copy_to_user_state_extra(struct xfrm_state *x,
+ NLA_PUT_U64(skb, XFRMA_LASTUSED, x->lastused);
+
+ if (x->aalg)
+- NLA_PUT(skb, XFRMA_ALG_AUTH, alg_len(x->aalg), x->aalg);
++ NLA_PUT(skb, XFRMA_ALG_AUTH, xfrm_alg_len(x->aalg), x->aalg);
+ if (x->ealg)
+- NLA_PUT(skb, XFRMA_ALG_CRYPT, alg_len(x->ealg), x->ealg);
++ NLA_PUT(skb, XFRMA_ALG_CRYPT, xfrm_alg_len(x->ealg), x->ealg);
+ if (x->calg)
+ NLA_PUT(skb, XFRMA_ALG_COMP, sizeof(*(x->calg)), x->calg);
+
+@@ -1978,9 +1973,9 @@ static inline size_t xfrm_sa_len(struct xfrm_state *x)
+ {
+ size_t l = 0;
+ if (x->aalg)
+- l += nla_total_size(alg_len(x->aalg));
++ l += nla_total_size(xfrm_alg_len(x->aalg));
+ if (x->ealg)
+- l += nla_total_size(alg_len(x->ealg));
++ l += nla_total_size(xfrm_alg_len(x->ealg));
+ if (x->calg)
+ l += nla_total_size(sizeof(*x->calg));
+ if (x->encap)
+diff --git a/sound/core/oss/mixer_oss.c b/sound/core/oss/mixer_oss.c
+index 3ace4a5..c5a5ab9 100644
+--- a/sound/core/oss/mixer_oss.c
++++ b/sound/core/oss/mixer_oss.c
+@@ -925,6 +925,68 @@ static void mixer_slot_clear(struct snd_mixer_oss_slot *rslot)
+ rslot->number = idx;
+ }
+
++/* In a separate function to keep gcc 3.2 happy - do NOT merge this in
++ snd_mixer_oss_build_input! */
++static int snd_mixer_oss_build_test_all(struct snd_mixer_oss *mixer,
++ struct snd_mixer_oss_assign_table *ptr,
++ struct slot *slot)
++{
++ char str[64];
++ int err;
++
++ err = snd_mixer_oss_build_test(mixer, slot, ptr->name, ptr->index,
++ SNDRV_MIXER_OSS_ITEM_GLOBAL);
++ if (err)
++ return err;
++ sprintf(str, "%s Switch", ptr->name);
++ err = snd_mixer_oss_build_test(mixer, slot, str, ptr->index,
++ SNDRV_MIXER_OSS_ITEM_GSWITCH);
++ if (err)
++ return err;
++ sprintf(str, "%s Route", ptr->name);
++ err = snd_mixer_oss_build_test(mixer, slot, str, ptr->index,
++ SNDRV_MIXER_OSS_ITEM_GROUTE);
++ if (err)
++ return err;
++ sprintf(str, "%s Volume", ptr->name);
++ err = snd_mixer_oss_build_test(mixer, slot, str, ptr->index,
++ SNDRV_MIXER_OSS_ITEM_GVOLUME);
++ if (err)
++ return err;
++ sprintf(str, "%s Playback Switch", ptr->name);
++ err = snd_mixer_oss_build_test(mixer, slot, str, ptr->index,
++ SNDRV_MIXER_OSS_ITEM_PSWITCH);
++ if (err)
++ return err;
++ sprintf(str, "%s Playback Route", ptr->name);
++ err = snd_mixer_oss_build_test(mixer, slot, str, ptr->index,
++ SNDRV_MIXER_OSS_ITEM_PROUTE);
++ if (err)
++ return err;
++ sprintf(str, "%s Playback Volume", ptr->name);
++ err = snd_mixer_oss_build_test(mixer, slot, str, ptr->index,
++ SNDRV_MIXER_OSS_ITEM_PVOLUME);
++ if (err)
++ return err;
++ sprintf(str, "%s Capture Switch", ptr->name);
++ err = snd_mixer_oss_build_test(mixer, slot, str, ptr->index,
++ SNDRV_MIXER_OSS_ITEM_CSWITCH);
++ if (err)
++ return err;
++ sprintf(str, "%s Capture Route", ptr->name);
++ err = snd_mixer_oss_build_test(mixer, slot, str, ptr->index,
++ SNDRV_MIXER_OSS_ITEM_CROUTE);
++ if (err)
++ return err;
++ sprintf(str, "%s Capture Volume", ptr->name);
++ err = snd_mixer_oss_build_test(mixer, slot, str, ptr->index,
++ SNDRV_MIXER_OSS_ITEM_CVOLUME);
++ if (err)
++ return err;
++
++ return 0;
++}
++
+ /*
+ * build an OSS mixer element.
+ * ptr_allocated means the entry is dynamically allocated (change via proc file).
+@@ -944,44 +1006,7 @@ static int snd_mixer_oss_build_input(struct snd_mixer_oss *mixer, struct snd_mix
+
+ memset(&slot, 0, sizeof(slot));
+ memset(slot.numid, 0xff, sizeof(slot.numid)); /* ID_UNKNOWN */
+- if (snd_mixer_oss_build_test(mixer, &slot, ptr->name, ptr->index,
+- SNDRV_MIXER_OSS_ITEM_GLOBAL))
+- return 0;
+- sprintf(str, "%s Switch", ptr->name);
+- if (snd_mixer_oss_build_test(mixer, &slot, str, ptr->index,
+- SNDRV_MIXER_OSS_ITEM_GSWITCH))
+- return 0;
+- sprintf(str, "%s Route", ptr->name);
+- if (snd_mixer_oss_build_test(mixer, &slot, str, ptr->index,
+- SNDRV_MIXER_OSS_ITEM_GROUTE))
+- return 0;
+- sprintf(str, "%s Volume", ptr->name);
+- if (snd_mixer_oss_build_test(mixer, &slot, str, ptr->index,
+- SNDRV_MIXER_OSS_ITEM_GVOLUME))
+- return 0;
+- sprintf(str, "%s Playback Switch", ptr->name);
+- if (snd_mixer_oss_build_test(mixer, &slot, str, ptr->index,
+- SNDRV_MIXER_OSS_ITEM_PSWITCH))
+- return 0;
+- sprintf(str, "%s Playback Route", ptr->name);
+- if (snd_mixer_oss_build_test(mixer, &slot, str, ptr->index,
+- SNDRV_MIXER_OSS_ITEM_PROUTE))
+- return 0;
+- sprintf(str, "%s Playback Volume", ptr->name);
+- if (snd_mixer_oss_build_test(mixer, &slot, str, ptr->index,
+- SNDRV_MIXER_OSS_ITEM_PVOLUME))
+- return 0;
+- sprintf(str, "%s Capture Switch", ptr->name);
+- if (snd_mixer_oss_build_test(mixer, &slot, str, ptr->index,
+- SNDRV_MIXER_OSS_ITEM_CSWITCH))
+- return 0;
+- sprintf(str, "%s Capture Route", ptr->name);
+- if (snd_mixer_oss_build_test(mixer, &slot, str, ptr->index,
+- SNDRV_MIXER_OSS_ITEM_CROUTE))
+- return 0;
+- sprintf(str, "%s Capture Volume", ptr->name);
+- if (snd_mixer_oss_build_test(mixer, &slot, str, ptr->index,
+- SNDRV_MIXER_OSS_ITEM_CVOLUME))
++ if (snd_mixer_oss_build_test_all(mixer, ptr, &slot))
+ return 0;
+ down_read(&mixer->card->controls_rwsem);
+ if (ptr->index == 0 && (kctl = snd_mixer_oss_test_id(mixer, "Capture Source", 0)) != NULL) {
+diff --git a/sound/oss/msnd.h b/sound/oss/msnd.h
+index 05cf786..d0ca582 100644
+--- a/sound/oss/msnd.h
++++ b/sound/oss/msnd.h
+@@ -233,8 +233,8 @@ typedef struct multisound_dev {
+ spinlock_t lock;
+ int nresets;
+ unsigned long recsrc;
+- int left_levels[16];
+- int right_levels[16];
++ int left_levels[32];
++ int right_levels[32];
+ int mixer_mod_count;
+ int calibrate_signal;
+ int play_sample_size, play_sample_rate, play_channels;
+diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
+index 62b9fb3..3fa0f97 100644
+--- a/sound/pci/hda/hda_intel.c
++++ b/sound/pci/hda/hda_intel.c
+@@ -555,8 +555,7 @@ static unsigned int azx_rirb_get_response(struct hda_codec *codec)
+ }
+ if (!chip->rirb.cmds)
+ return chip->rirb.res; /* the last value */
+- udelay(10);
+- cond_resched();
++ schedule_timeout_uninterruptible(1);
+ } while (time_after_eq(timeout, jiffies));
+
+ if (chip->msi) {
Modified: dists/trunk/linux-2.6/debian/patches/series/1~experimental.1
==============================================================================
--- dists/trunk/linux-2.6/debian/patches/series/1~experimental.1 (original)
+++ dists/trunk/linux-2.6/debian/patches/series/1~experimental.1 Tue Jan 15 10:42:23 2008
@@ -42,3 +42,4 @@
+ bugfix/all/fw-ohci-dyn-buffers-dma-descriptors.patch
+ features/at76.patch
+ features/ath5k.patch
++ bugfix/all/patch-2.6.24-rc7-git7
More information about the Kernel-svn-changes
mailing list