[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(&current->sighand->siglock);
+-	saveset = current->blocked;
++	current->saved_sigmask = current->blocked;
+ 	siginitset(&current->blocked, mask);
+ 	recalc_sigpending();
+ 	spin_unlock_irq(&current->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(&current->sighand->siglock);
+-	saveset = current->blocked;
+-	current->blocked = newset;
+-	recalc_sigpending();
+-	spin_unlock_irq(&current->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(&current->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(&current->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(&current->sighand->siglock);
+-	sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
+-	if (!(ka->sa.sa_flags & SA_NODEFER))
+-		sigaddset(&current->blocked,sig);
+-	recalc_sigpending();
+-	spin_unlock_irq(&current->sighand->siglock);
++		ret = setup_frame(sig, ka, oldset, regs);
++
++	if (ret == 0) {
++		spin_lock_irq(&current->sighand->siglock);
++		sigorsets(&current->blocked, &current->blocked,
++			&ka->sa.sa_mask);
++		if (!(ka->sa.sa_flags & SA_NODEFER))
++			sigaddset(&current->blocked, sig);
++		recalc_sigpending();
++		spin_unlock_irq(&current->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 = &current->saved_sigmask;
++	else
+ 		oldset = &current->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, &current->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		= &eth_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(&current->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