[kernel] r11432 - in dists/trunk/linux-2.6/debian/patches: bugfix/all series

Maximilian Attems maks at alioth.debian.org
Wed May 21 11:03:49 UTC 2008


Author: maks
Date: Wed May 21 11:03:47 2008
New Revision: 11432

Log:
update to 2.6.26-rc3-git3

conflicting patch in fore200e_mkfirm
disable powerpc serial hack patch that need refresh


Added:
   dists/trunk/linux-2.6/debian/patches/bugfix/all/patch-2.6.26-rc3-git3
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.26-rc3-git3
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/bugfix/all/patch-2.6.26-rc3-git3	Wed May 21 11:03:47 2008
@@ -0,0 +1,21871 @@
+diff --git a/.gitignore b/.gitignore
+index 090b293..9c0d650 100644
+--- a/.gitignore
++++ b/.gitignore
+@@ -54,6 +54,5 @@ series
+ cscope.*
+ 
+ *.orig
+-*.rej
+ *~
+ \#*#
+diff --git a/Kbuild b/Kbuild
+index 32f19c5..e750e9c 100644
+--- a/Kbuild
++++ b/Kbuild
+@@ -96,5 +96,4 @@ missing-syscalls: scripts/checksyscalls.sh FORCE
+ 	$(call cmd,syscalls)
+ 
+ # Delete all targets during make clean
+-clean-files := $(addprefix $(objtree)/,$(targets))
+-
++clean-files := $(addprefix $(objtree)/,$(filter-out $(bounds-file) $(offsets-file),$(targets)))
+diff --git a/MAINTAINERS b/MAINTAINERS
+index c68a118..b42dcfc 100644
+--- a/MAINTAINERS
++++ b/MAINTAINERS
+@@ -982,13 +982,6 @@ L:	bonding-devel at lists.sourceforge.net
+ W:	http://sourceforge.net/projects/bonding/
+ S:	Supported
+ 
+-BROADBAND PROCESSOR ARCHITECTURE
+-P:	Arnd Bergmann
+-M:	arnd at arndb.de
+-L:	linuxppc-dev at ozlabs.org
+-W:	http://www.penguinppc.org/ppc64/
+-S:	Supported
+-
+ BROADCOM B44 10/100 ETHERNET DRIVER
+ P:	Gary Zambrano
+ M:	zambrano at broadcom.com
+@@ -1052,6 +1045,14 @@ L:	linux-kernel at vger.kernel.org
+ L:	discuss at x86-64.org
+ S:	Maintained
+ 
++CELL BROADBAND ENGINE ARCHITECTURE
++P:	Arnd Bergmann
++M:	arnd at arndb.de
++L:	linuxppc-dev at ozlabs.org
++L:	cbe-oss-dev at ozlabs.org
++W:	http://www.ibm.com/developerworks/power/cell/
++S:	Supported
++
+ CFAG12864B LCD DRIVER
+ P:	Miguel Ojeda Sandonis
+ M:	maxextreme at gmail.com
+@@ -1645,8 +1646,10 @@ W:	http://linux-fbdev.sourceforge.net/
+ S:	Maintained
+ 
+ FREESCALE DMA DRIVER
+-P;	Zhang Wei
+-M:	wei.zhang at freescale.com
++P:	Li Yang
++M:	leoli at freescale.com
++P:	Zhang Wei
++M:	zw at zh-kernel.org
+ L:	linuxppc-embedded at ozlabs.org
+ L:	linux-kernel at vger.kernel.org
+ S:	Maintained
+@@ -2329,7 +2332,8 @@ S:	Maintained
+ KERNEL BUILD (kbuild: Makefile, scripts/Makefile.*)
+ P:	Sam Ravnborg
+ M:	sam at ravnborg.org
+-T:	git kernel.org:/pub/scm/linux/kernel/git/sam/kbuild.git
++T:	git kernel.org:/pub/scm/linux/kernel/git/sam/kbuild-next.git
++T:	git kernel.org:/pub/scm/linux/kernel/git/sam/kbuild-fixes.git
+ L:	linux-kbuild at vger.kernel.org
+ S:	Maintained
+ 
+@@ -2351,24 +2355,24 @@ S:	Supported
+ KERNEL VIRTUAL MACHINE (KVM)
+ P:	Avi Kivity
+ M:	avi at qumranet.com
+-L:	kvm-devel at lists.sourceforge.net
+-W:	kvm.sourceforge.net
++L:	kvm at vger.kernel.org
++W:	http://kvm.qumranet.com
+ S:	Supported
+ 
+ KERNEL VIRTUAL MACHINE (KVM) FOR POWERPC
+ P:	Hollis Blanchard
+ M:	hollisb at us.ibm.com
+-L:	kvm-ppc-devel at lists.sourceforge.net
+-W:	kvm.sourceforge.net
++L:	kvm-ppc at vger.kernel.org
++W:	http://kvm.qumranet.com
+ S:	Supported
+ 
+-KERNEL VIRTUAL MACHINE For Itanium(KVM/IA64)
++KERNEL VIRTUAL MACHINE For Itanium (KVM/IA64)
+ P:	Anthony Xu
+ M:	anthony.xu at intel.com
+ P:	Xiantao Zhang
+ M:	xiantao.zhang at intel.com
+-L:	kvm-ia64-devel at lists.sourceforge.net
+-W:	kvm.sourceforge.net
++L:	kvm-ia64 at vger.kernel.org
++W:	http://kvm.qumranet.com
+ S:	Supported
+ 
+ KERNEL VIRTUAL MACHINE for s390 (KVM/s390)
+@@ -2819,6 +2823,15 @@ M:	jirislaby at gmail.com
+ L:	linux-kernel at vger.kernel.org
+ S:	Maintained
+ 
++MYRICOM MYRI-10G 10GbE DRIVER (MYRI10GE)
++P:	Andrew Gallatin
++M:	gallatin at myri.com
++P:	Brice Goglin
++M:	brice at myri.com
++L:	netdev at vger.kernel.org
++W:	http://www.myri.com/scs/download-Myri10GE.html
++S:	Supported
++
+ NATSEMI ETHERNET DRIVER (DP8381x)
+ P: 	Tim Hockin
+ M:	thockin at hockin.org
+@@ -3132,7 +3145,7 @@ PCI ERROR RECOVERY
+ P:	Linas Vepstas
+ M:	linas at austin.ibm.com
+ L:	linux-kernel at vger.kernel.org
+-L:	linux-pci at atrey.karlin.mff.cuni.cz
++L:	linux-pci at vger.kernel.org
+ S:	Supported
+ 
+ PCI SUBSYSTEM
+@@ -3766,6 +3779,14 @@ M:	dbrownell at users.sourceforge.net
+ L:	spi-devel-general at lists.sourceforge.net
+ S:	Maintained
+ 
++SPU FILE SYSTEM
++P:	Jeremy Kerr
++M:	jk at ozlabs.org
++L:	linuxppc-dev at ozlabs.org
++L:	cbe-oss-dev at ozlabs.org
++W:	http://www.ibm.com/developerworks/power/cell/
++S:	Supported
++
+ STABLE BRANCH:
+ P:	Greg Kroah-Hartman
+ M:	greg at kroah.com
+@@ -4021,12 +4042,41 @@ M:	ballabio_dario at emc.com
+ L:	linux-scsi at vger.kernel.org
+ S:	Maintained
+ 
++UCLINUX (AND M68KNOMMU)
++P:	Greg Ungerer
++M:	gerg at uclinux.org
++W:	http://www.uclinux.org/
++L:	uclinux-dev at uclinux.org  (subscribers-only)
++S:	Maintained
++
++UCLINUX FOR NEC V850
++P:	Miles Bader
++
++UCLINUX FOR RENESAS H8/300
++P:	Yoshinori Sato
++M:	ysato at users.sourceforge.jp
++W:	http://uclinux-h8.sourceforge.jp/
++S:	Supported
++
+ UDF FILESYSTEM
+ P:	Jan Kara
+ M:	jack at suse.cz
+ W:	http://linux-udf.sourceforge.net
+ S:	Maintained
+ 
++UFS FILESYSTEM
++P:	Evgeniy Dushistov
++M:	dushistov at mail.ru
++L:	linux-kernel at vger.kernel.org
++S:	Maintained
++
++UltraSPARC (sparc64):
++P:	David S. Miller
++M:	davem at davemloft.net
++L:	sparclinux at vger.kernel.org
++T:	git kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6.git
++S:	Maintained
++
+ UNIFORM CDROM DRIVER
+ P:	Jens Axboe
+ M:	axboe at kernel.dk
+@@ -4073,6 +4123,13 @@ L:	netdev at vger.kernel.org
+ W:	http://www.linux-usb.org/usbnet
+ S:	Maintained
+ 
++USB DIAMOND RIO500 DRIVER
++P:	Cesar Miquel
++M:	miquel at df.uba.ar
++L:	rio500-users at lists.sourceforge.net
++W:	http://rio500.sourceforge.net
++S:	Maintained
++
+ USB EHCI DRIVER
+ P:	David Brownell
+ M:	dbrownell at users.sourceforge.net
+@@ -4327,42 +4384,6 @@ M:	romieu at fr.zoreil.com
+ L:	netdev at vger.kernel.org
+ S:	Maintained
+ 
+-UCLINUX (AND M68KNOMMU)
+-P:	Greg Ungerer
+-M:	gerg at uclinux.org
+-W:	http://www.uclinux.org/
+-L:	uclinux-dev at uclinux.org  (subscribers-only)
+-S:	Maintained
+-
+-UCLINUX FOR NEC V850
+-P:	Miles Bader
+-
+-UCLINUX FOR RENESAS H8/300
+-P:	Yoshinori Sato
+-M:	ysato at users.sourceforge.jp
+-W:	http://uclinux-h8.sourceforge.jp/
+-S:	Supported
+-
+-UFS FILESYSTEM
+-P:	Evgeniy Dushistov
+-M:	dushistov at mail.ru
+-L:	linux-kernel at vger.kernel.org
+-S:	Maintained
+-
+-UltraSPARC (sparc64):
+-P:	David S. Miller
+-M:	davem at davemloft.net
+-L:	sparclinux at vger.kernel.org
+-T:	git kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6.git
+-S:	Maintained
+-
+-USB DIAMOND RIO500 DRIVER
+-P:	Cesar Miquel
+-M:	miquel at df.uba.ar
+-L:	rio500-users at lists.sourceforge.net
+-W:	http://rio500.sourceforge.net
+-S:	Maintained
+-
+ VIDEO FOR LINUX
+ P:	Mauro Carvalho Chehab
+ M:	mchehab at infradead.org
+diff --git a/Makefile b/Makefile
+index f638842..ee7c97f 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1114,6 +1114,7 @@ MRPROPER_DIRS  += include/config include2 usr/include
+ MRPROPER_FILES += .config .config.old include/asm .version .old_version \
+                   include/linux/autoconf.h include/linux/version.h      \
+                   include/linux/utsrelease.h                            \
++                  include/linux/bounds.h include/asm*/asm-offsets.h     \
+ 		  Module.symvers tags TAGS cscope*
+ 
+ # clean - Delete most, but leave enough to build external modules
+@@ -1431,7 +1432,7 @@ define xtags
+ 	elif $1 --version 2>&1 | grep -iq emacs; then \
+ 	    $(all-sources) | xargs $1 -a; \
+ 	    $(all-kconfigs) | xargs $1 -a \
+-		--regex='/^[ \t]*(menu|)config[ \t]+\([a-zA-Z0-9_]+\)/\2/'; \
++		--regex='/^[ \t]*\(\(menu\)*config\)[ \t]+\([a-zA-Z0-9_]+\)/\3/'; \
+ 	    $(all-defconfigs) | xargs -r $1 -a \
+ 		--regex='/^#?[ \t]?\(CONFIG_[a-zA-Z0-9_]+\)/\1/'; \
+ 	else \
+diff --git a/arch/alpha/kernel/init_task.c b/arch/alpha/kernel/init_task.c
+index 835d09a..1f76218 100644
+--- a/arch/alpha/kernel/init_task.c
++++ b/arch/alpha/kernel/init_task.c
+@@ -9,7 +9,6 @@
+ 
+ 
+ static struct fs_struct init_fs = INIT_FS;
+-static struct files_struct init_files = INIT_FILES;
+ static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
+ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
+ struct mm_struct init_mm = INIT_MM(init_mm);
+diff --git a/arch/arm/kernel/init_task.c b/arch/arm/kernel/init_task.c
+index bd4ef53..8b8c9d3 100644
+--- a/arch/arm/kernel/init_task.c
++++ b/arch/arm/kernel/init_task.c
+@@ -13,7 +13,6 @@
+ #include <asm/pgtable.h>
+ 
+ static struct fs_struct init_fs = INIT_FS;
+-static struct files_struct init_files = INIT_FILES;
+ static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
+ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
+ struct mm_struct init_mm = INIT_MM(init_mm);
+diff --git a/arch/avr32/kernel/init_task.c b/arch/avr32/kernel/init_task.c
+index effcacf..4405846 100644
+--- a/arch/avr32/kernel/init_task.c
++++ b/arch/avr32/kernel/init_task.c
+@@ -14,7 +14,6 @@
+ #include <asm/pgtable.h>
+ 
+ static struct fs_struct init_fs = INIT_FS;
+-static struct files_struct init_files = INIT_FILES;
+ static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
+ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
+ struct mm_struct init_mm = INIT_MM(init_mm);
+diff --git a/arch/blackfin/Kconfig b/arch/blackfin/Kconfig
+index fd57085..b87634e 100644
+--- a/arch/blackfin/Kconfig
++++ b/arch/blackfin/Kconfig
+@@ -479,16 +479,6 @@ comment "Memory Setup"
+ 
+ comment "Misc"
+ 
+-config ENET_FLASH_PIN
+-	int "PF port/pin used for flash and ethernet sharing"
+-	depends on (BFIN533_STAMP)
+-	default  0
+-	help
+-	  PF port/pin used for flash and ethernet sharing to allow other PF
+-	  pins to be used on other platforms without having to touch common
+-	  code.
+-	  For example: PF0 --> 0,PF1 --> 1,PF2 --> 2, etc.
+-
+ choice
+ 	prompt "Blackfin Exception Scratch Register"
+ 	default BFIN_SCRATCH_REG_RETN
+@@ -695,6 +685,8 @@ choice
+ 	prompt "Uncached SDRAM region"
+ 	default DMA_UNCACHED_1M
+ 	depends on BFIN_DMA_5XX
++config DMA_UNCACHED_4M
++	bool "Enable 4M DMA region"
+ config DMA_UNCACHED_2M
+ 	bool "Enable 2M DMA region"
+ config DMA_UNCACHED_1M
+diff --git a/arch/blackfin/configs/BF527-EZKIT_defconfig b/arch/blackfin/configs/BF527-EZKIT_defconfig
+index 64876df..5e6fb9d 100644
+--- a/arch/blackfin/configs/BF527-EZKIT_defconfig
++++ b/arch/blackfin/configs/BF527-EZKIT_defconfig
+@@ -1,6 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.22.16
++# Linux kernel version: 2.6.24.7
++# Fri May 16 10:02:29 2008
+ #
+ # CONFIG_MMU is not set
+ # CONFIG_FPU is not set
+@@ -13,35 +14,34 @@ CONFIG_GENERIC_FIND_NEXT_BIT=y
+ CONFIG_GENERIC_HWEIGHT=y
+ CONFIG_GENERIC_HARDIRQS=y
+ CONFIG_GENERIC_IRQ_PROBE=y
+-CONFIG_GENERIC_TIME=y
+ CONFIG_GENERIC_GPIO=y
+ CONFIG_FORCE_MAX_ZONEORDER=14
+ CONFIG_GENERIC_CALIBRATE_DELAY=y
+ CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+ 
+ #
+-# Code maturity level options
++# General setup
+ #
+ CONFIG_EXPERIMENTAL=y
+ CONFIG_BROKEN_ON_SMP=y
+ CONFIG_INIT_ENV_ARG_LIMIT=32
+-
+-#
+-# General setup
+-#
+ CONFIG_LOCALVERSION=""
+ CONFIG_LOCALVERSION_AUTO=y
+ CONFIG_SYSVIPC=y
+-# CONFIG_IPC_NS is not set
+ CONFIG_SYSVIPC_SYSCTL=y
+ # CONFIG_POSIX_MQUEUE is not set
+ # CONFIG_BSD_PROCESS_ACCT is not set
+ # CONFIG_TASKSTATS is not set
+-# CONFIG_UTS_NS is not set
++# CONFIG_USER_NS is not set
++# CONFIG_PID_NS is not set
+ # CONFIG_AUDIT is not set
+ CONFIG_IKCONFIG=y
+ CONFIG_IKCONFIG_PROC=y
+ CONFIG_LOG_BUF_SHIFT=14
++# CONFIG_CGROUPS is not set
++CONFIG_FAIR_GROUP_SCHED=y
++CONFIG_FAIR_USER_SCHED=y
++# CONFIG_FAIR_CGROUP_SCHED is not set
+ CONFIG_SYSFS_DEPRECATED=y
+ # CONFIG_RELAY is not set
+ CONFIG_BLK_DEV_INITRD=y
+@@ -64,32 +64,24 @@ CONFIG_EPOLL=y
+ CONFIG_SIGNALFD=y
+ CONFIG_EVENTFD=y
+ CONFIG_VM_EVENT_COUNTERS=y
+-CONFIG_BIG_ORDER_ALLOC_NOFAIL_MAGIC=3
+-# CONFIG_NP2 is not set
+ CONFIG_SLAB=y
+ # CONFIG_SLUB is not set
+ # CONFIG_SLOB is not set
++CONFIG_SLABINFO=y
+ CONFIG_RT_MUTEXES=y
+ CONFIG_TINY_SHMEM=y
+ CONFIG_BASE_SMALL=0
+-
+-#
+-# Loadable module support
+-#
+ CONFIG_MODULES=y
+ CONFIG_MODULE_UNLOAD=y
+ # CONFIG_MODULE_FORCE_UNLOAD is not set
+ # CONFIG_MODVERSIONS is not set
+ # CONFIG_MODULE_SRCVERSION_ALL is not set
+ CONFIG_KMOD=y
+-
+-#
+-# Block layer
+-#
+ CONFIG_BLOCK=y
+ # CONFIG_LBD is not set
+ # CONFIG_BLK_DEV_IO_TRACE is not set
+ # CONFIG_LSF is not set
++# CONFIG_BLK_DEV_BSG is not set
+ 
+ #
+ # IO Schedulers
+@@ -141,7 +133,6 @@ CONFIG_BF_REV_0_0=y
+ # CONFIG_BF_REV_ANY is not set
+ # CONFIG_BF_REV_NONE is not set
+ CONFIG_BF52x=y
+-CONFIG_BFIN_SINGLE_CORE=y
+ CONFIG_MEM_MT48LC32M16A2TG_75=y
+ CONFIG_BFIN527_EZKIT=y
+ 
+@@ -227,12 +218,14 @@ CONFIG_IRQ_USB_DMA=11
+ # Board customizations
+ #
+ # CONFIG_CMDLINE_BOOL is not set
++CONFIG_BOOT_LOAD=0x1000
+ 
+ #
+ # Clock/PLL Setup
+ #
+ CONFIG_CLKIN_HZ=25000000
+ # CONFIG_BFIN_KERNEL_CLOCK is not set
++CONFIG_MAX_MEM_SIZE=512
+ CONFIG_MAX_VCO_HZ=600000000
+ CONFIG_MIN_VCO_HZ=50000000
+ CONFIG_MAX_SCLK_HZ=133333333
+@@ -246,13 +239,17 @@ CONFIG_HZ_250=y
+ # CONFIG_HZ_300 is not set
+ # CONFIG_HZ_1000 is not set
+ CONFIG_HZ=250
++CONFIG_GENERIC_TIME=y
++CONFIG_GENERIC_CLOCKEVENTS=y
++# CONFIG_CYCLES_CLOCKSOURCE is not set
++# CONFIG_TICK_ONESHOT is not set
++# CONFIG_NO_HZ is not set
++# CONFIG_HIGH_RES_TIMERS is not set
++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
+ 
+ #
+-# Memory Setup
++# Misc
+ #
+-CONFIG_MAX_MEM_SIZE=512
+-CONFIG_MEM_ADD_WIDTH=10
+-CONFIG_BOOT_LOAD=0x1000
+ CONFIG_BFIN_SCRATCH_REG_RETN=y
+ # CONFIG_BFIN_SCRATCH_REG_RETE is not set
+ # CONFIG_BFIN_SCRATCH_REG_CYCLES is not set
+@@ -288,12 +285,14 @@ CONFIG_FLATMEM_MANUAL=y
+ CONFIG_FLATMEM=y
+ CONFIG_FLAT_NODE_MEM_MAP=y
+ # CONFIG_SPARSEMEM_STATIC is not set
++# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
+ CONFIG_SPLIT_PTLOCK_CPUS=4
+ # CONFIG_RESOURCES_64BIT is not set
+ CONFIG_ZONE_DMA_FLAG=1
+-CONFIG_LARGE_ALLOCS=y
++CONFIG_VIRT_TO_BUS=y
+ # CONFIG_BFIN_GPTIMERS is not set
+ CONFIG_BFIN_DMA_5XX=y
++# CONFIG_DMA_UNCACHED_4M is not set
+ # CONFIG_DMA_UNCACHED_2M is not set
+ CONFIG_DMA_UNCACHED_1M=y
+ # CONFIG_DMA_UNCACHED_NONE is not set
+@@ -338,10 +337,6 @@ CONFIG_BANK_3=0xFFC0
+ #
+ # CONFIG_PCI is not set
+ # CONFIG_ARCH_SUPPORTS_MSI is not set
+-
+-#
+-# PCCARD (PCMCIA/CardBus) support
+-#
+ # CONFIG_PCCARD is not set
+ 
+ #
+@@ -357,9 +352,15 @@ CONFIG_BINFMT_ZFLAT=y
+ # Power management options
+ #
+ # CONFIG_PM is not set
++CONFIG_SUSPEND_UP_POSSIBLE=y
+ # CONFIG_PM_WAKEUP_BY_GPIO is not set
+ 
+ #
++# CPU Frequency scaling
++#
++# CONFIG_CPU_FREQ is not set
++
++#
+ # Networking
+ #
+ CONFIG_NET=y
+@@ -395,6 +396,7 @@ CONFIG_SYN_COOKIES=y
+ CONFIG_INET_XFRM_MODE_TRANSPORT=y
+ CONFIG_INET_XFRM_MODE_TUNNEL=y
+ CONFIG_INET_XFRM_MODE_BEET=y
++# CONFIG_INET_LRO is not set
+ CONFIG_INET_DIAG=y
+ CONFIG_INET_TCP_DIAG=y
+ # CONFIG_TCP_CONG_ADVANCED is not set
+@@ -421,10 +423,6 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
+ # CONFIG_LAPB is not set
+ # CONFIG_ECONET is not set
+ # CONFIG_WAN_ROUTER is not set
+-
+-#
+-# QoS and/or fair queueing
+-#
+ # CONFIG_NET_SCHED is not set
+ 
+ #
+@@ -444,6 +442,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
+ # CONFIG_MAC80211 is not set
+ # CONFIG_IEEE80211 is not set
+ # CONFIG_RFKILL is not set
++# CONFIG_NET_9P is not set
+ 
+ #
+ # Device Drivers
+@@ -452,14 +451,11 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
+ #
+ # Generic Driver Options
+ #
++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+ CONFIG_STANDALONE=y
+ CONFIG_PREVENT_FIRMWARE_BUILD=y
+ # CONFIG_FW_LOADER is not set
+ # CONFIG_SYS_HYPERVISOR is not set
+-
+-#
+-# Connector - unified userspace <-> kernelspace linker
+-#
+ # CONFIG_CONNECTOR is not set
+ CONFIG_MTD=y
+ # CONFIG_MTD_DEBUG is not set
+@@ -479,6 +475,7 @@ CONFIG_MTD_BLOCK=y
+ # CONFIG_INFTL is not set
+ # CONFIG_RFD_FTL is not set
+ # CONFIG_SSFDC is not set
++# CONFIG_MTD_OOPS is not set
+ 
+ #
+ # RAM/ROM/Flash chip drivers
+@@ -542,39 +539,27 @@ CONFIG_MTD_NAND_IDS=m
+ # CONFIG_MTD_NAND_DISKONCHIP is not set
+ # CONFIG_MTD_NAND_NANDSIM is not set
+ # CONFIG_MTD_NAND_PLATFORM is not set
++# CONFIG_MTD_ALAUDA is not set
+ # CONFIG_MTD_ONENAND is not set
+ 
+ #
+ # UBI - Unsorted block images
+ #
+ # CONFIG_MTD_UBI is not set
+-
+-#
+-# Parallel port support
+-#
+ # CONFIG_PARPORT is not set
+-
+-#
+-# Plug and Play support
+-#
+-# CONFIG_PNPACPI is not set
+-
+-#
+-# Block devices
+-#
++CONFIG_BLK_DEV=y
+ # CONFIG_BLK_DEV_COW_COMMON is not set
+ # CONFIG_BLK_DEV_LOOP is not set
+ # CONFIG_BLK_DEV_NBD is not set
++# CONFIG_BLK_DEV_UB is not set
+ CONFIG_BLK_DEV_RAM=y
+ CONFIG_BLK_DEV_RAM_COUNT=16
+ CONFIG_BLK_DEV_RAM_SIZE=4096
+ CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
+ # CONFIG_CDROM_PKTCDVD is not set
+ # CONFIG_ATA_OVER_ETH is not set
+-
+-#
+-# Misc devices
+-#
++CONFIG_MISC_DEVICES=y
++# CONFIG_EEPROM_93CX6 is not set
+ # CONFIG_IDE is not set
+ 
+ #
+@@ -582,22 +567,18 @@ CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
+ #
+ # CONFIG_RAID_ATTRS is not set
+ # CONFIG_SCSI is not set
++# CONFIG_SCSI_DMA is not set
+ # CONFIG_SCSI_NETLINK is not set
+ # CONFIG_ATA is not set
+-
+-#
+-# Multi-device support (RAID and LVM)
+-#
+ # CONFIG_MD is not set
+-
+-#
+-# Network device support
+-#
+ CONFIG_NETDEVICES=y
++# CONFIG_NETDEVICES_MULTIQUEUE is not set
+ # CONFIG_DUMMY is not set
+ # CONFIG_BONDING is not set
++# CONFIG_MACVLAN is not set
+ # CONFIG_EQUALIZER is not set
+ # CONFIG_TUN is not set
++# CONFIG_VETH is not set
+ CONFIG_PHYLIB=y
+ 
+ #
+@@ -611,21 +592,24 @@ CONFIG_PHYLIB=y
+ # CONFIG_VITESSE_PHY is not set
+ # CONFIG_SMSC_PHY is not set
+ # CONFIG_BROADCOM_PHY is not set
++# CONFIG_ICPLUS_PHY is not set
+ # CONFIG_FIXED_PHY is not set
+-
+-#
+-# Ethernet (10 or 100Mbit)
+-#
++# CONFIG_MDIO_BITBANG is not set
+ CONFIG_NET_ETHERNET=y
+ CONFIG_MII=y
+-# CONFIG_SMC91X is not set
+ CONFIG_BFIN_MAC=y
+ CONFIG_BFIN_MAC_USE_L1=y
+ CONFIG_BFIN_TX_DESC_NUM=10
+ CONFIG_BFIN_RX_DESC_NUM=20
+ CONFIG_BFIN_MAC_RMII=y
++# CONFIG_SMC91X is not set
+ # CONFIG_SMSC911X is not set
+ # CONFIG_DM9000 is not set
++# CONFIG_IBM_NEW_EMAC_ZMII is not set
++# CONFIG_IBM_NEW_EMAC_RGMII is not set
++# CONFIG_IBM_NEW_EMAC_TAH is not set
++# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
++# CONFIG_B44 is not set
+ CONFIG_NETDEV_1000=y
+ # CONFIG_AX88180 is not set
+ CONFIG_NETDEV_10000=y
+@@ -635,6 +619,15 @@ CONFIG_NETDEV_10000=y
+ #
+ # CONFIG_WLAN_PRE80211 is not set
+ # CONFIG_WLAN_80211 is not set
++
++#
++# USB Network Adapters
++#
++# CONFIG_USB_CATC is not set
++# CONFIG_USB_KAWETH is not set
++# CONFIG_USB_PEGASUS is not set
++# CONFIG_USB_RTL8150 is not set
++# CONFIG_USB_USBNET is not set
+ # CONFIG_WAN is not set
+ # CONFIG_PPP is not set
+ # CONFIG_SLIP is not set
+@@ -642,15 +635,7 @@ CONFIG_NETDEV_10000=y
+ # CONFIG_NETCONSOLE is not set
+ # CONFIG_NETPOLL is not set
+ # CONFIG_NET_POLL_CONTROLLER is not set
+-
+-#
+-# ISDN subsystem
+-#
+ # CONFIG_ISDN is not set
+-
+-#
+-# Telephony Support
+-#
+ # CONFIG_PHONE is not set
+ 
+ #
+@@ -665,7 +650,6 @@ CONFIG_INPUT=y
+ #
+ # CONFIG_INPUT_MOUSEDEV is not set
+ # CONFIG_INPUT_JOYDEV is not set
+-# CONFIG_INPUT_TSDEV is not set
+ # CONFIG_INPUT_EVDEV is not set
+ # CONFIG_INPUT_EVBUG is not set
+ 
+@@ -697,7 +681,6 @@ CONFIG_INPUT_MISC=y
+ #
+ # CONFIG_AD9960 is not set
+ # CONFIG_SPI_ADC_BF533 is not set
+-# CONFIG_BF5xx_PFLAGS is not set
+ # CONFIG_BF5xx_PPIFCD is not set
+ # CONFIG_BFIN_SIMPLE_TIMER is not set
+ # CONFIG_BF5xx_PPI is not set
+@@ -706,7 +689,7 @@ CONFIG_BFIN_OTP=y
+ # CONFIG_BFIN_SPORT is not set
+ # CONFIG_BFIN_TIMER_LATENCY is not set
+ # CONFIG_TWI_LCD is not set
+-# CONFIG_AD5304 is not set
++# CONFIG_SIMPLE_GPIO is not set
+ # CONFIG_VT is not set
+ # CONFIG_SERIAL_NONSTANDARD is not set
+ 
+@@ -735,27 +718,11 @@ CONFIG_UNIX98_PTYS=y
+ # CAN, the car bus and industrial fieldbus
+ #
+ # CONFIG_CAN4LINUX is not set
+-
+-#
+-# IPMI
+-#
+ # CONFIG_IPMI_HANDLER is not set
+-CONFIG_WATCHDOG=y
+-# CONFIG_WATCHDOG_NOWAYOUT is not set
+-
+-#
+-# Watchdog Device Drivers
+-#
+-# CONFIG_SOFT_WATCHDOG is not set
+-CONFIG_BFIN_WDT=y
+ CONFIG_HW_RANDOM=y
+ # CONFIG_GEN_RTC is not set
+ # CONFIG_R3964 is not set
+ # CONFIG_RAW_DRIVER is not set
+-
+-#
+-# TPM devices
+-#
+ # CONFIG_TCG_TPM is not set
+ CONFIG_I2C=y
+ CONFIG_I2C_BOARDINFO=y
+@@ -777,21 +744,24 @@ CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ=50
+ # CONFIG_I2C_OCORES is not set
+ # CONFIG_I2C_PARPORT_LIGHT is not set
+ # CONFIG_I2C_SIMTEC is not set
++# CONFIG_I2C_TAOS_EVM is not set
+ # CONFIG_I2C_STUB is not set
++# CONFIG_I2C_TINY_USB is not set
+ 
+ #
+ # Miscellaneous I2C Chip support
+ #
+ # CONFIG_SENSORS_DS1337 is not set
+ # CONFIG_SENSORS_DS1374 is not set
++# CONFIG_DS1682 is not set
+ # CONFIG_SENSORS_AD5252 is not set
+ # CONFIG_SENSORS_EEPROM is not set
+ # CONFIG_SENSORS_PCF8574 is not set
+ # CONFIG_SENSORS_PCF8575 is not set
+-# CONFIG_SENSORS_PCA9543 is not set
+ # CONFIG_SENSORS_PCA9539 is not set
+ # CONFIG_SENSORS_PCF8591 is not set
+ # CONFIG_SENSORS_MAX6875 is not set
++# CONFIG_SENSORS_TSL2550 is not set
+ # CONFIG_I2C_DEBUG_CORE is not set
+ # CONFIG_I2C_DEBUG_ALGO is not set
+ # CONFIG_I2C_DEBUG_BUS is not set
+@@ -814,14 +784,11 @@ CONFIG_SPI_BFIN=y
+ #
+ # CONFIG_SPI_AT25 is not set
+ # CONFIG_SPI_SPIDEV is not set
+-
+-#
+-# Dallas's 1-wire bus
+-#
++# CONFIG_SPI_TLE62X0 is not set
+ # CONFIG_W1 is not set
++# CONFIG_POWER_SUPPLY is not set
+ CONFIG_HWMON=y
+ # CONFIG_HWMON_VID is not set
+-# CONFIG_SENSORS_ABITUGURU is not set
+ # CONFIG_SENSORS_AD7418 is not set
+ # CONFIG_SENSORS_ADM1021 is not set
+ # CONFIG_SENSORS_ADM1025 is not set
+@@ -829,12 +796,12 @@ CONFIG_HWMON=y
+ # CONFIG_SENSORS_ADM1029 is not set
+ # CONFIG_SENSORS_ADM1031 is not set
+ # CONFIG_SENSORS_ADM9240 is not set
+-# CONFIG_SENSORS_ASB100 is not set
++# CONFIG_SENSORS_ADT7470 is not set
+ # CONFIG_SENSORS_ATXP1 is not set
+ # CONFIG_SENSORS_DS1621 is not set
+ # CONFIG_SENSORS_F71805F is not set
+-# CONFIG_SENSORS_FSCHER is not set
+-# CONFIG_SENSORS_FSCPOS is not set
++# CONFIG_SENSORS_F71882FG is not set
++# CONFIG_SENSORS_F75375S is not set
+ # CONFIG_SENSORS_GL518SM is not set
+ # CONFIG_SENSORS_GL520SM is not set
+ # CONFIG_SENSORS_IT87 is not set
+@@ -849,13 +816,16 @@ CONFIG_HWMON=y
+ # CONFIG_SENSORS_LM87 is not set
+ # CONFIG_SENSORS_LM90 is not set
+ # CONFIG_SENSORS_LM92 is not set
++# CONFIG_SENSORS_LM93 is not set
+ # CONFIG_SENSORS_MAX1619 is not set
+ # CONFIG_SENSORS_MAX6650 is not set
+ # CONFIG_SENSORS_PC87360 is not set
+ # CONFIG_SENSORS_PC87427 is not set
++# CONFIG_SENSORS_DME1737 is not set
+ # CONFIG_SENSORS_SMSC47M1 is not set
+ # CONFIG_SENSORS_SMSC47M192 is not set
+ # CONFIG_SENSORS_SMSC47B397 is not set
++# CONFIG_SENSORS_THMC50 is not set
+ # CONFIG_SENSORS_VT1211 is not set
+ # CONFIG_SENSORS_W83781D is not set
+ # CONFIG_SENSORS_W83791D is not set
+@@ -865,6 +835,25 @@ CONFIG_HWMON=y
+ # CONFIG_SENSORS_W83627HF is not set
+ # CONFIG_SENSORS_W83627EHF is not set
+ # CONFIG_HWMON_DEBUG_CHIP is not set
++CONFIG_WATCHDOG=y
++# CONFIG_WATCHDOG_NOWAYOUT is not set
++
++#
++# Watchdog Device Drivers
++#
++# CONFIG_SOFT_WATCHDOG is not set
++CONFIG_BFIN_WDT=y
++
++#
++# USB-based Watchdog Cards
++#
++# CONFIG_USBPCWATCHDOG is not set
++
++#
++# Sonics Silicon Backplane
++#
++CONFIG_SSB_POSSIBLE=y
++# CONFIG_SSB is not set
+ 
+ #
+ # Multifunction device drivers
+@@ -881,72 +870,133 @@ CONFIG_HWMON=y
+ #
+ # Graphics support
+ #
++# CONFIG_VGASTATE is not set
++# CONFIG_VIDEO_OUTPUT_CONTROL is not set
++# CONFIG_FB is not set
+ # CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+ 
+ #
+ # Display device support
+ #
+ # CONFIG_DISPLAY_SUPPORT is not set
+-# CONFIG_VGASTATE is not set
+-# CONFIG_FB is not set
+ 
+ #
+ # Sound
+ #
+ # CONFIG_SOUND is not set
+-
+-#
+-# HID Devices
+-#
++CONFIG_HID_SUPPORT=y
+ CONFIG_HID=y
+ # CONFIG_HID_DEBUG is not set
++# CONFIG_HIDRAW is not set
+ 
+ #
+-# USB support
++# USB Input Devices
+ #
++CONFIG_USB_HID=y
++# CONFIG_USB_HIDINPUT_POWERBOOK is not set
++# CONFIG_HID_FF is not set
++# CONFIG_USB_HIDDEV is not set
++CONFIG_USB_SUPPORT=y
+ CONFIG_USB_ARCH_HAS_HCD=y
+ # CONFIG_USB_ARCH_HAS_OHCI is not set
+ # CONFIG_USB_ARCH_HAS_EHCI is not set
+-# CONFIG_USB is not set
++CONFIG_USB=y
++# CONFIG_USB_DEBUG is not set
++
++#
++# Miscellaneous USB options
++#
++# CONFIG_USB_DEVICEFS is not set
++CONFIG_USB_DEVICE_CLASS=y
++# CONFIG_USB_DYNAMIC_MINORS is not set
++# CONFIG_USB_OTG is not set
++# CONFIG_USB_OTG_WHITELIST is not set
++CONFIG_USB_OTG_BLACKLIST_HUB=y
++
++#
++# USB Host Controller Drivers
++#
++# CONFIG_USB_ISP116X_HCD is not set
++# CONFIG_USB_ISP1362_HCD is not set
++# CONFIG_USB_ISP1760_HCD is not set
++# CONFIG_USB_SL811_HCD is not set
++# CONFIG_USB_R8A66597_HCD is not set
++CONFIG_USB_MUSB_HDRC=y
++CONFIG_USB_MUSB_SOC=y
+ 
+ #
+-# Enable Host or Gadget support to see Inventra options
++# Blackfin high speed USB support
+ #
++CONFIG_USB_MUSB_HOST=y
++# CONFIG_USB_MUSB_PERIPHERAL is not set
++# CONFIG_USB_MUSB_OTG is not set
++CONFIG_USB_MUSB_HDRC_HCD=y
++CONFIG_MUSB_PIO_ONLY=y
++CONFIG_USB_MUSB_LOGLEVEL=0
++
++#
++# USB Device Class drivers
++#
++# CONFIG_USB_ACM is not set
++# CONFIG_USB_PRINTER is not set
+ 
+ #
+ # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+ #
+ 
+ #
+-# USB Gadget Support
++# may also be needed; see USB_STORAGE Help for more information
+ #
+-# CONFIG_USB_GADGET is not set
+-# CONFIG_MMC is not set
++# CONFIG_USB_LIBUSUAL is not set
+ 
+ #
+-# LED devices
++# USB Imaging devices
+ #
+-# CONFIG_NEW_LEDS is not set
++# CONFIG_USB_MDC800 is not set
++CONFIG_USB_MON=y
+ 
+ #
+-# LED drivers
++# USB port drivers
+ #
+ 
+ #
+-# LED Triggers
++# USB Serial Converter support
+ #
++# CONFIG_USB_SERIAL is not set
+ 
+ #
+-# InfiniBand support
++# USB Miscellaneous drivers
+ #
++# CONFIG_USB_EMI62 is not set
++# CONFIG_USB_EMI26 is not set
++# CONFIG_USB_ADUTUX is not set
++# CONFIG_USB_AUERSWALD is not set
++# CONFIG_USB_RIO500 is not set
++# CONFIG_USB_LEGOTOWER is not set
++# CONFIG_USB_LCD is not set
++# CONFIG_USB_BERRY_CHARGE is not set
++# CONFIG_USB_LED is not set
++# CONFIG_USB_CYPRESS_CY7C63 is not set
++# CONFIG_USB_CYTHERM is not set
++# CONFIG_USB_PHIDGET is not set
++# CONFIG_USB_IDMOUSE is not set
++# CONFIG_USB_FTDI_ELAN is not set
++# CONFIG_USB_APPLEDISPLAY is not set
++# CONFIG_USB_SISUSBVGA is not set
++# CONFIG_USB_LD is not set
++# CONFIG_USB_TRANCEVIBRATOR is not set
++# CONFIG_USB_IOWARRIOR is not set
+ 
+ #
+-# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
++# USB DSL modem support
+ #
+ 
+ #
+-# Real Time Clock
++# USB Gadget Support
+ #
++# CONFIG_USB_GADGET is not set
++# CONFIG_MMC is not set
++# CONFIG_NEW_LEDS is not set
+ CONFIG_RTC_LIB=y
+ CONFIG_RTC_CLASS=y
+ CONFIG_RTC_HCTOSYS=y
+@@ -966,6 +1016,7 @@ CONFIG_RTC_INTF_DEV=y
+ # I2C RTC drivers
+ #
+ # CONFIG_RTC_DRV_DS1307 is not set
++# CONFIG_RTC_DRV_DS1374 is not set
+ # CONFIG_RTC_DRV_DS1672 is not set
+ # CONFIG_RTC_DRV_MAX6900 is not set
+ # CONFIG_RTC_DRV_RS5C372 is not set
+@@ -973,6 +1024,7 @@ CONFIG_RTC_INTF_DEV=y
+ # CONFIG_RTC_DRV_X1205 is not set
+ # CONFIG_RTC_DRV_PCF8563 is not set
+ # CONFIG_RTC_DRV_PCF8583 is not set
++# CONFIG_RTC_DRV_M41T80 is not set
+ 
+ #
+ # SPI RTC drivers
+@@ -984,8 +1036,10 @@ CONFIG_RTC_INTF_DEV=y
+ # Platform RTC drivers
+ #
+ # CONFIG_RTC_DRV_DS1553 is not set
++# CONFIG_RTC_DRV_STK17TA8 is not set
+ # CONFIG_RTC_DRV_DS1742 is not set
+ # CONFIG_RTC_DRV_M48T86 is not set
++# CONFIG_RTC_DRV_M48T59 is not set
+ # CONFIG_RTC_DRV_V3020 is not set
+ 
+ #
+@@ -994,22 +1048,9 @@ CONFIG_RTC_INTF_DEV=y
+ CONFIG_RTC_DRV_BFIN=y
+ 
+ #
+-# DMA Engine support
+-#
+-# CONFIG_DMA_ENGINE is not set
+-
+-#
+-# DMA Clients
++# Userspace I/O
+ #
+-
+-#
+-# DMA Devices
+-#
+-
+-#
+-# PBX support
+-#
+-# CONFIG_PBX is not set
++# CONFIG_UIO is not set
+ 
+ #
+ # File systems
+@@ -1054,7 +1095,6 @@ CONFIG_PROC_SYSCTL=y
+ CONFIG_SYSFS=y
+ # CONFIG_TMPFS is not set
+ # CONFIG_HUGETLB_PAGE is not set
+-CONFIG_RAMFS=y
+ # CONFIG_CONFIGFS_FS is not set
+ 
+ #
+@@ -1080,10 +1120,12 @@ CONFIG_YAFFS_SHORT_NAMES_IN_RAM=y
+ CONFIG_JFFS2_FS=m
+ CONFIG_JFFS2_FS_DEBUG=0
+ CONFIG_JFFS2_FS_WRITEBUFFER=y
++# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
+ # CONFIG_JFFS2_SUMMARY is not set
+ # CONFIG_JFFS2_FS_XATTR is not set
+ # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
+ CONFIG_JFFS2_ZLIB=y
++# CONFIG_JFFS2_LZO is not set
+ CONFIG_JFFS2_RTIME=y
+ # CONFIG_JFFS2_RUBIN is not set
+ # CONFIG_CRAMFS is not set
+@@ -1092,10 +1134,7 @@ CONFIG_JFFS2_RTIME=y
+ # CONFIG_QNX4FS_FS is not set
+ # CONFIG_SYSV_FS is not set
+ # CONFIG_UFS_FS is not set
+-
+-#
+-# Network File Systems
+-#
++CONFIG_NETWORK_FILESYSTEMS=y
+ CONFIG_NFS_FS=m
+ CONFIG_NFS_V3=y
+ # CONFIG_NFS_V3_ACL is not set
+@@ -1115,17 +1154,12 @@ CONFIG_SMB_FS=m
+ # CONFIG_NCP_FS is not set
+ # CONFIG_CODA_FS is not set
+ # CONFIG_AFS_FS is not set
+-# CONFIG_9P_FS is not set
+ 
+ #
+ # Partition Types
+ #
+ # CONFIG_PARTITION_ADVANCED is not set
+ CONFIG_MSDOS_PARTITION=y
+-
+-#
+-# Native Language Support
+-#
+ CONFIG_NLS=m
+ CONFIG_NLS_DEFAULT="iso8859-1"
+ # CONFIG_NLS_CODEPAGE_437 is not set
+@@ -1166,21 +1200,16 @@ CONFIG_NLS_DEFAULT="iso8859-1"
+ # CONFIG_NLS_KOI8_R is not set
+ # CONFIG_NLS_KOI8_U is not set
+ # CONFIG_NLS_UTF8 is not set
+-
+-#
+-# Distributed Lock Manager
+-#
+ # CONFIG_DLM is not set
+-
+-#
+-# Profiling support
+-#
++CONFIG_INSTRUMENTATION=y
+ # CONFIG_PROFILING is not set
++# CONFIG_MARKERS is not set
+ 
+ #
+ # Kernel hacking
+ #
+ # CONFIG_PRINTK_TIME is not set
++CONFIG_ENABLE_WARN_DEPRECATED=y
+ CONFIG_ENABLE_MUST_CHECK=y
+ # CONFIG_MAGIC_SYSRQ is not set
+ # CONFIG_UNUSED_SYMBOLS is not set
+@@ -1188,6 +1217,7 @@ CONFIG_DEBUG_FS=y
+ # CONFIG_HEADERS_CHECK is not set
+ # CONFIG_DEBUG_KERNEL is not set
+ # CONFIG_DEBUG_BUGVERBOSE is not set
++# CONFIG_SAMPLES is not set
+ CONFIG_DEBUG_MMRS=y
+ CONFIG_DEBUG_HUNT_FOR_ZERO=y
+ CONFIG_DEBUG_BFIN_HWTRACE_ON=y
+@@ -1207,11 +1237,8 @@ CONFIG_ACCESS_CHECK=y
+ # CONFIG_KEYS is not set
+ CONFIG_SECURITY=y
+ # CONFIG_SECURITY_NETWORK is not set
+-CONFIG_SECURITY_CAPABILITIES=m
+-
+-#
+-# Cryptographic options
+-#
++# CONFIG_SECURITY_CAPABILITIES is not set
++# CONFIG_SECURITY_ROOTPLUG is not set
+ # CONFIG_CRYPTO is not set
+ 
+ #
+@@ -1222,6 +1249,7 @@ CONFIG_CRC_CCITT=m
+ # CONFIG_CRC16 is not set
+ # CONFIG_CRC_ITU_T is not set
+ CONFIG_CRC32=y
++# CONFIG_CRC7 is not set
+ # CONFIG_LIBCRC32C is not set
+ CONFIG_ZLIB_INFLATE=y
+ CONFIG_ZLIB_DEFLATE=m
+diff --git a/arch/blackfin/configs/BF548-EZKIT_defconfig b/arch/blackfin/configs/BF548-EZKIT_defconfig
+index 5bfdfb2..1ff2ff4 100644
+--- a/arch/blackfin/configs/BF548-EZKIT_defconfig
++++ b/arch/blackfin/configs/BF548-EZKIT_defconfig
+@@ -1,6 +1,6 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.22.16
++# Linux kernel version: 2.6.24.7
+ #
+ # CONFIG_MMU is not set
+ # CONFIG_FPU is not set
+@@ -13,35 +13,34 @@ CONFIG_GENERIC_FIND_NEXT_BIT=y
+ CONFIG_GENERIC_HWEIGHT=y
+ CONFIG_GENERIC_HARDIRQS=y
+ CONFIG_GENERIC_IRQ_PROBE=y
+-CONFIG_GENERIC_TIME=y
+ CONFIG_GENERIC_GPIO=y
+ CONFIG_FORCE_MAX_ZONEORDER=14
+ CONFIG_GENERIC_CALIBRATE_DELAY=y
+ CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+ 
+ #
+-# Code maturity level options
++# General setup
+ #
+ CONFIG_EXPERIMENTAL=y
+ CONFIG_BROKEN_ON_SMP=y
+ CONFIG_INIT_ENV_ARG_LIMIT=32
+-
+-#
+-# General setup
+-#
+ CONFIG_LOCALVERSION=""
+ CONFIG_LOCALVERSION_AUTO=y
+ CONFIG_SYSVIPC=y
+-# CONFIG_IPC_NS is not set
+ CONFIG_SYSVIPC_SYSCTL=y
+ # CONFIG_POSIX_MQUEUE is not set
+ # CONFIG_BSD_PROCESS_ACCT is not set
+ # CONFIG_TASKSTATS is not set
+-# CONFIG_UTS_NS is not set
++# CONFIG_USER_NS is not set
++# CONFIG_PID_NS is not set
+ # CONFIG_AUDIT is not set
+ CONFIG_IKCONFIG=y
+ CONFIG_IKCONFIG_PROC=y
+ CONFIG_LOG_BUF_SHIFT=14
++# CONFIG_CGROUPS is not set
++CONFIG_FAIR_GROUP_SCHED=y
++CONFIG_FAIR_USER_SCHED=y
++# CONFIG_FAIR_CGROUP_SCHED is not set
+ CONFIG_SYSFS_DEPRECATED=y
+ # CONFIG_RELAY is not set
+ CONFIG_BLK_DEV_INITRD=y
+@@ -64,32 +63,24 @@ CONFIG_EPOLL=y
+ CONFIG_SIGNALFD=y
+ CONFIG_EVENTFD=y
+ CONFIG_VM_EVENT_COUNTERS=y
+-CONFIG_BIG_ORDER_ALLOC_NOFAIL_MAGIC=3
+-# CONFIG_NP2 is not set
+ CONFIG_SLAB=y
+ # CONFIG_SLUB is not set
+ # CONFIG_SLOB is not set
++CONFIG_SLABINFO=y
+ CONFIG_RT_MUTEXES=y
+ CONFIG_TINY_SHMEM=y
+ CONFIG_BASE_SMALL=0
+-
+-#
+-# Loadable module support
+-#
+ CONFIG_MODULES=y
+ CONFIG_MODULE_UNLOAD=y
+ # CONFIG_MODULE_FORCE_UNLOAD is not set
+ # CONFIG_MODVERSIONS is not set
+ # CONFIG_MODULE_SRCVERSION_ALL is not set
+ CONFIG_KMOD=y
+-
+-#
+-# Block layer
+-#
+ CONFIG_BLOCK=y
+ # CONFIG_LBD is not set
+ # CONFIG_BLK_DEV_IO_TRACE is not set
+ # CONFIG_LSF is not set
++# CONFIG_BLK_DEV_BSG is not set
+ 
+ #
+ # IO Schedulers
+@@ -141,7 +132,6 @@ CONFIG_BF_REV_0_0=y
+ # CONFIG_BF_REV_ANY is not set
+ # CONFIG_BF_REV_NONE is not set
+ CONFIG_BF54x=y
+-CONFIG_BFIN_SINGLE_CORE=y
+ CONFIG_IRQ_PLL_WAKEUP=7
+ CONFIG_IRQ_RTC=8
+ CONFIG_IRQ_SPORT0_RX=9
+@@ -169,6 +159,7 @@ CONFIG_IRQ_TIMER8=11
+ CONFIG_IRQ_TIMER9=11
+ CONFIG_IRQ_TIMER10=11
+ CONFIG_BFIN548_EZKIT=y
++# CONFIG_BFIN548_BLUETECHNIX_CM is not set
+ 
+ #
+ # BF548 Specific Configuration
+@@ -262,12 +253,14 @@ CONFIG_PINT3_ASSIGN=0x02020303
+ # Board customizations
+ #
+ # CONFIG_CMDLINE_BOOL is not set
++CONFIG_BOOT_LOAD=0x1000
+ 
+ #
+ # Clock/PLL Setup
+ #
+ CONFIG_CLKIN_HZ=25000000
+ # CONFIG_BFIN_KERNEL_CLOCK is not set
++CONFIG_MAX_MEM_SIZE=512
+ CONFIG_MAX_VCO_HZ=600000000
+ CONFIG_MIN_VCO_HZ=50000000
+ CONFIG_MAX_SCLK_HZ=133333333
+@@ -281,14 +274,17 @@ CONFIG_HZ_250=y
+ # CONFIG_HZ_300 is not set
+ # CONFIG_HZ_1000 is not set
+ CONFIG_HZ=250
++CONFIG_GENERIC_TIME=y
++CONFIG_GENERIC_CLOCKEVENTS=y
++# CONFIG_CYCLES_CLOCKSOURCE is not set
++# CONFIG_TICK_ONESHOT is not set
++# CONFIG_NO_HZ is not set
++# CONFIG_HIGH_RES_TIMERS is not set
++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
+ 
+ #
+-# Memory Setup
++# Misc
+ #
+-CONFIG_MAX_MEM_SIZE=512
+-# CONFIG_MEM_MT46V32M16_6T is not set
+-CONFIG_MEM_MT46V32M16_5B=y
+-CONFIG_BOOT_LOAD=0x1000
+ CONFIG_BFIN_SCRATCH_REG_RETN=y
+ # CONFIG_BFIN_SCRATCH_REG_RETE is not set
+ # CONFIG_BFIN_SCRATCH_REG_CYCLES is not set
+@@ -324,12 +320,14 @@ CONFIG_FLATMEM_MANUAL=y
+ CONFIG_FLATMEM=y
+ CONFIG_FLAT_NODE_MEM_MAP=y
+ # CONFIG_SPARSEMEM_STATIC is not set
++# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
+ CONFIG_SPLIT_PTLOCK_CPUS=4
+ # CONFIG_RESOURCES_64BIT is not set
+ CONFIG_ZONE_DMA_FLAG=1
+-CONFIG_LARGE_ALLOCS=y
++CONFIG_VIRT_TO_BUS=y
+ # CONFIG_BFIN_GPTIMERS is not set
+ CONFIG_BFIN_DMA_5XX=y
++# CONFIG_DMA_UNCACHED_4M is not set
+ CONFIG_DMA_UNCACHED_2M=y
+ # CONFIG_DMA_UNCACHED_1M is not set
+ # CONFIG_DMA_UNCACHED_NONE is not set
+@@ -377,10 +375,6 @@ CONFIG_EBIU_FCTLVAL=0x6
+ #
+ # CONFIG_PCI is not set
+ # CONFIG_ARCH_SUPPORTS_MSI is not set
+-
+-#
+-# PCCARD (PCMCIA/CardBus) support
+-#
+ # CONFIG_PCCARD is not set
+ 
+ #
+@@ -396,6 +390,7 @@ CONFIG_BINFMT_ZFLAT=y
+ # Power management options
+ #
+ # CONFIG_PM is not set
++CONFIG_SUSPEND_UP_POSSIBLE=y
+ # CONFIG_PM_WAKEUP_BY_GPIO is not set
+ 
+ #
+@@ -439,6 +434,7 @@ CONFIG_SYN_COOKIES=y
+ CONFIG_INET_XFRM_MODE_TRANSPORT=y
+ CONFIG_INET_XFRM_MODE_TUNNEL=y
+ CONFIG_INET_XFRM_MODE_BEET=y
++# CONFIG_INET_LRO is not set
+ CONFIG_INET_DIAG=y
+ CONFIG_INET_TCP_DIAG=y
+ # CONFIG_TCP_CONG_ADVANCED is not set
+@@ -465,10 +461,6 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
+ # CONFIG_LAPB is not set
+ # CONFIG_ECONET is not set
+ # CONFIG_WAN_ROUTER is not set
+-
+-#
+-# QoS and/or fair queueing
+-#
+ # CONFIG_NET_SCHED is not set
+ 
+ #
+@@ -488,6 +480,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
+ # CONFIG_MAC80211 is not set
+ # CONFIG_IEEE80211 is not set
+ # CONFIG_RFKILL is not set
++# CONFIG_NET_9P is not set
+ 
+ #
+ # Device Drivers
+@@ -496,14 +489,11 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
+ #
+ # Generic Driver Options
+ #
++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+ CONFIG_STANDALONE=y
+ CONFIG_PREVENT_FIRMWARE_BUILD=y
+ # CONFIG_FW_LOADER is not set
+ # CONFIG_SYS_HYPERVISOR is not set
+-
+-#
+-# Connector - unified userspace <-> kernelspace linker
+-#
+ # CONFIG_CONNECTOR is not set
+ CONFIG_MTD=y
+ # CONFIG_MTD_DEBUG is not set
+@@ -523,6 +513,7 @@ CONFIG_MTD_BLOCK=y
+ # CONFIG_INFTL is not set
+ # CONFIG_RFD_FTL is not set
+ # CONFIG_SSFDC is not set
++# CONFIG_MTD_OOPS is not set
+ 
+ #
+ # RAM/ROM/Flash chip drivers
+@@ -587,39 +578,27 @@ CONFIG_MTD_NAND_BF5XX_HWECC=y
+ # CONFIG_MTD_NAND_DISKONCHIP is not set
+ # CONFIG_MTD_NAND_NANDSIM is not set
+ # CONFIG_MTD_NAND_PLATFORM is not set
++# CONFIG_MTD_ALAUDA is not set
+ # CONFIG_MTD_ONENAND is not set
+ 
+ #
+ # UBI - Unsorted block images
+ #
+ # CONFIG_MTD_UBI is not set
+-
+-#
+-# Parallel port support
+-#
+ # CONFIG_PARPORT is not set
+-
+-#
+-# Plug and Play support
+-#
+-# CONFIG_PNPACPI is not set
+-
+-#
+-# Block devices
+-#
++CONFIG_BLK_DEV=y
+ # CONFIG_BLK_DEV_COW_COMMON is not set
+ # CONFIG_BLK_DEV_LOOP is not set
+ # CONFIG_BLK_DEV_NBD is not set
++# CONFIG_BLK_DEV_UB is not set
+ CONFIG_BLK_DEV_RAM=y
+ CONFIG_BLK_DEV_RAM_COUNT=16
+ CONFIG_BLK_DEV_RAM_SIZE=4096
+ CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
+ # CONFIG_CDROM_PKTCDVD is not set
+ # CONFIG_ATA_OVER_ETH is not set
+-
+-#
+-# Misc devices
+-#
++CONFIG_MISC_DEVICES=y
++# CONFIG_EEPROM_93CX6 is not set
+ # CONFIG_IDE is not set
+ 
+ #
+@@ -627,6 +606,7 @@ CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
+ #
+ # CONFIG_RAID_ATTRS is not set
+ CONFIG_SCSI=y
++CONFIG_SCSI_DMA=y
+ # CONFIG_SCSI_TGT is not set
+ # CONFIG_SCSI_NETLINK is not set
+ CONFIG_SCSI_PROC_FS=y
+@@ -657,43 +637,35 @@ CONFIG_SCSI_WAIT_SCAN=m
+ # CONFIG_SCSI_SPI_ATTRS is not set
+ # CONFIG_SCSI_FC_ATTRS is not set
+ # CONFIG_SCSI_ISCSI_ATTRS is not set
+-# CONFIG_SCSI_SAS_ATTRS is not set
+ # CONFIG_SCSI_SAS_LIBSAS is not set
+-
+-#
+-# SCSI low-level drivers
+-#
++# CONFIG_SCSI_SRP_ATTRS is not set
++CONFIG_SCSI_LOWLEVEL=y
+ # CONFIG_ISCSI_TCP is not set
+ # CONFIG_SCSI_DEBUG is not set
+ CONFIG_ATA=y
+ # CONFIG_ATA_NONSTANDARD is not set
+ # CONFIG_PATA_PLATFORM is not set
+ CONFIG_PATA_BF54X=y
+-CONFIG_PATA_BF54X_DMA=y
+-
+-#
+-# Multi-device support (RAID and LVM)
+-#
+ # CONFIG_MD is not set
+-
+-#
+-# Network device support
+-#
+ CONFIG_NETDEVICES=y
++# CONFIG_NETDEVICES_MULTIQUEUE is not set
+ # CONFIG_DUMMY is not set
+ # CONFIG_BONDING is not set
++# CONFIG_MACVLAN is not set
+ # CONFIG_EQUALIZER is not set
+ # CONFIG_TUN is not set
++# CONFIG_VETH is not set
+ # CONFIG_PHYLIB is not set
+-
+-#
+-# Ethernet (10 or 100Mbit)
+-#
+ CONFIG_NET_ETHERNET=y
+ CONFIG_MII=y
+ # CONFIG_SMC91X is not set
+ CONFIG_SMSC911X=y
+ # CONFIG_DM9000 is not set
++# CONFIG_IBM_NEW_EMAC_ZMII is not set
++# CONFIG_IBM_NEW_EMAC_RGMII is not set
++# CONFIG_IBM_NEW_EMAC_TAH is not set
++# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
++# CONFIG_B44 is not set
+ CONFIG_NETDEV_1000=y
+ # CONFIG_AX88180 is not set
+ CONFIG_NETDEV_10000=y
+@@ -703,6 +675,15 @@ CONFIG_NETDEV_10000=y
+ #
+ # CONFIG_WLAN_PRE80211 is not set
+ # CONFIG_WLAN_80211 is not set
++
++#
++# USB Network Adapters
++#
++# CONFIG_USB_CATC is not set
++# CONFIG_USB_KAWETH is not set
++# CONFIG_USB_PEGASUS is not set
++# CONFIG_USB_RTL8150 is not set
++# CONFIG_USB_USBNET is not set
+ # CONFIG_WAN is not set
+ # CONFIG_PPP is not set
+ # CONFIG_SLIP is not set
+@@ -710,15 +691,7 @@ CONFIG_NETDEV_10000=y
+ # CONFIG_NETCONSOLE is not set
+ # CONFIG_NETPOLL is not set
+ # CONFIG_NET_POLL_CONTROLLER is not set
+-
+-#
+-# ISDN subsystem
+-#
+ # CONFIG_ISDN is not set
+-
+-#
+-# Telephony Support
+-#
+ # CONFIG_PHONE is not set
+ 
+ #
+@@ -733,9 +706,6 @@ CONFIG_INPUT=y
+ #
+ # CONFIG_INPUT_MOUSEDEV is not set
+ # CONFIG_INPUT_JOYDEV is not set
+-CONFIG_INPUT_TSDEV=m
+-CONFIG_INPUT_TSDEV_SCREEN_X=240
+-CONFIG_INPUT_TSDEV_SCREEN_Y=320
+ CONFIG_INPUT_EVDEV=m
+ CONFIG_INPUT_EVBUG=m
+ 
+@@ -758,6 +728,7 @@ CONFIG_KEYBOARD_BFIN=y
+ CONFIG_INPUT_TOUCHSCREEN=y
+ # CONFIG_TOUCHSCREEN_ADS7846 is not set
+ CONFIG_TOUCHSCREEN_AD7877=m
++# CONFIG_TOUCHSCREEN_FUJITSU is not set
+ # CONFIG_TOUCHSCREEN_GUNZE is not set
+ # CONFIG_TOUCHSCREEN_ELO is not set
+ # CONFIG_TOUCHSCREEN_MTOUCH is not set
+@@ -787,7 +758,6 @@ CONFIG_INPUT_MISC=y
+ #
+ # CONFIG_AD9960 is not set
+ # CONFIG_SPI_ADC_BF533 is not set
+-# CONFIG_BF5xx_PFLAGS is not set
+ # CONFIG_BF5xx_PPIFCD is not set
+ # CONFIG_BFIN_SIMPLE_TIMER is not set
+ # CONFIG_BF5xx_PPI is not set
+@@ -796,7 +766,7 @@ CONFIG_BFIN_OTP=y
+ # CONFIG_BFIN_SPORT is not set
+ # CONFIG_BFIN_TIMER_LATENCY is not set
+ # CONFIG_TWI_LCD is not set
+-# CONFIG_AD5304 is not set
++# CONFIG_SIMPLE_GPIO is not set
+ CONFIG_VT=y
+ CONFIG_VT_CONSOLE=y
+ CONFIG_HW_CONSOLE=y
+@@ -830,27 +800,11 @@ CONFIG_UNIX98_PTYS=y
+ # CAN, the car bus and industrial fieldbus
+ #
+ # CONFIG_CAN4LINUX is not set
+-
+-#
+-# IPMI
+-#
+ # CONFIG_IPMI_HANDLER is not set
+-CONFIG_WATCHDOG=y
+-# CONFIG_WATCHDOG_NOWAYOUT is not set
+-
+-#
+-# Watchdog Device Drivers
+-#
+-# CONFIG_SOFT_WATCHDOG is not set
+-CONFIG_BFIN_WDT=y
+ CONFIG_HW_RANDOM=y
+ # CONFIG_GEN_RTC is not set
+ # CONFIG_R3964 is not set
+ # CONFIG_RAW_DRIVER is not set
+-
+-#
+-# TPM devices
+-#
+ # CONFIG_TCG_TPM is not set
+ CONFIG_I2C=y
+ CONFIG_I2C_BOARDINFO=y
+@@ -872,21 +826,24 @@ CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ=50
+ # CONFIG_I2C_OCORES is not set
+ # CONFIG_I2C_PARPORT_LIGHT is not set
+ # CONFIG_I2C_SIMTEC is not set
++# CONFIG_I2C_TAOS_EVM is not set
+ # CONFIG_I2C_STUB is not set
++# CONFIG_I2C_TINY_USB is not set
+ 
+ #
+ # Miscellaneous I2C Chip support
+ #
+ # CONFIG_SENSORS_DS1337 is not set
+ # CONFIG_SENSORS_DS1374 is not set
++# CONFIG_DS1682 is not set
+ # CONFIG_SENSORS_AD5252 is not set
+ # CONFIG_SENSORS_EEPROM is not set
+ # CONFIG_SENSORS_PCF8574 is not set
+ # CONFIG_SENSORS_PCF8575 is not set
+-# CONFIG_SENSORS_PCA9543 is not set
+ # CONFIG_SENSORS_PCA9539 is not set
+ # CONFIG_SENSORS_PCF8591 is not set
+ # CONFIG_SENSORS_MAX6875 is not set
++# CONFIG_SENSORS_TSL2550 is not set
+ # CONFIG_I2C_DEBUG_CORE is not set
+ # CONFIG_I2C_DEBUG_ALGO is not set
+ # CONFIG_I2C_DEBUG_BUS is not set
+@@ -909,14 +866,11 @@ CONFIG_SPI_BFIN=y
+ #
+ # CONFIG_SPI_AT25 is not set
+ # CONFIG_SPI_SPIDEV is not set
+-
+-#
+-# Dallas's 1-wire bus
+-#
++# CONFIG_SPI_TLE62X0 is not set
+ # CONFIG_W1 is not set
++# CONFIG_POWER_SUPPLY is not set
+ CONFIG_HWMON=y
+ # CONFIG_HWMON_VID is not set
+-# CONFIG_SENSORS_ABITUGURU is not set
+ # CONFIG_SENSORS_AD7418 is not set
+ # CONFIG_SENSORS_ADM1021 is not set
+ # CONFIG_SENSORS_ADM1025 is not set
+@@ -924,12 +878,12 @@ CONFIG_HWMON=y
+ # CONFIG_SENSORS_ADM1029 is not set
+ # CONFIG_SENSORS_ADM1031 is not set
+ # CONFIG_SENSORS_ADM9240 is not set
+-# CONFIG_SENSORS_ASB100 is not set
++# CONFIG_SENSORS_ADT7470 is not set
+ # CONFIG_SENSORS_ATXP1 is not set
+ # CONFIG_SENSORS_DS1621 is not set
+ # CONFIG_SENSORS_F71805F is not set
+-# CONFIG_SENSORS_FSCHER is not set
+-# CONFIG_SENSORS_FSCPOS is not set
++# CONFIG_SENSORS_F71882FG is not set
++# CONFIG_SENSORS_F75375S is not set
+ # CONFIG_SENSORS_GL518SM is not set
+ # CONFIG_SENSORS_GL520SM is not set
+ # CONFIG_SENSORS_IT87 is not set
+@@ -944,13 +898,16 @@ CONFIG_HWMON=y
+ # CONFIG_SENSORS_LM87 is not set
+ # CONFIG_SENSORS_LM90 is not set
+ # CONFIG_SENSORS_LM92 is not set
++# CONFIG_SENSORS_LM93 is not set
+ # CONFIG_SENSORS_MAX1619 is not set
+ # CONFIG_SENSORS_MAX6650 is not set
+ # CONFIG_SENSORS_PC87360 is not set
+ # CONFIG_SENSORS_PC87427 is not set
++# CONFIG_SENSORS_DME1737 is not set
+ # CONFIG_SENSORS_SMSC47M1 is not set
+ # CONFIG_SENSORS_SMSC47M192 is not set
+ # CONFIG_SENSORS_SMSC47B397 is not set
++# CONFIG_SENSORS_THMC50 is not set
+ # CONFIG_SENSORS_VT1211 is not set
+ # CONFIG_SENSORS_W83781D is not set
+ # CONFIG_SENSORS_W83791D is not set
+@@ -960,6 +917,25 @@ CONFIG_HWMON=y
+ # CONFIG_SENSORS_W83627HF is not set
+ # CONFIG_SENSORS_W83627EHF is not set
+ # CONFIG_HWMON_DEBUG_CHIP is not set
++CONFIG_WATCHDOG=y
++# CONFIG_WATCHDOG_NOWAYOUT is not set
++
++#
++# Watchdog Device Drivers
++#
++# CONFIG_SOFT_WATCHDOG is not set
++CONFIG_BFIN_WDT=y
++
++#
++# USB-based Watchdog Cards
++#
++# CONFIG_USBPCWATCHDOG is not set
++
++#
++# Sonics Silicon Backplane
++#
++CONFIG_SSB_POSSIBLE=y
++# CONFIG_SSB is not set
+ 
+ #
+ # Multifunction device drivers
+@@ -972,23 +948,20 @@ CONFIG_HWMON=y
+ # CONFIG_VIDEO_DEV is not set
+ # CONFIG_DVB_CORE is not set
+ CONFIG_DAB=y
++# CONFIG_USB_DABUSB is not set
+ 
+ #
+ # Graphics support
+ #
+-# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+-
+-#
+-# Display device support
+-#
+-# CONFIG_DISPLAY_SUPPORT is not set
+ # CONFIG_VGASTATE is not set
++# CONFIG_VIDEO_OUTPUT_CONTROL is not set
+ CONFIG_FB=y
+ CONFIG_FIRMWARE_EDID=y
+ # CONFIG_FB_DDC is not set
+ CONFIG_FB_CFB_FILLRECT=y
+ CONFIG_FB_CFB_COPYAREA=y
+ CONFIG_FB_CFB_IMAGEBLIT=y
++# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
+ # CONFIG_FB_SYS_FILLRECT is not set
+ # CONFIG_FB_SYS_COPYAREA is not set
+ # CONFIG_FB_SYS_IMAGEBLIT is not set
+@@ -1003,18 +976,24 @@ CONFIG_FB_DEFERRED_IO=y
+ #
+ # Frame buffer hardware drivers
+ #
+-# CONFIG_FB_BFIN_7171 is not set
+-# CONFIG_FB_BFIN_7393 is not set
+ CONFIG_FB_BF54X_LQ043=y
+ # CONFIG_FB_BFIN_T350MCQB is not set
++# CONFIG_FB_BFIN_7393 is not set
+ # CONFIG_FB_S1D13XXX is not set
+ # CONFIG_FB_VIRTUAL is not set
++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
++
++#
++# Display device support
++#
++# CONFIG_DISPLAY_SUPPORT is not set
+ 
+ #
+ # Console display driver support
+ #
+ CONFIG_DUMMY_CONSOLE=y
+ CONFIG_FRAMEBUFFER_CONSOLE=y
++# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set
+ # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
+ CONFIG_FONTS=y
+ # CONFIG_FONT_8x8 is not set
+@@ -1065,10 +1044,21 @@ CONFIG_SND_VERBOSE_PROCFS=y
+ # CONFIG_SND_MPU401 is not set
+ 
+ #
++# SPI devices
++#
++
++#
+ # ALSA Blackfin devices
+ #
+ # CONFIG_SND_BLACKFIN_AD1836 is not set
+ # CONFIG_SND_BFIN_AD73311 is not set
++# CONFIG_SND_BFIN_AD73322 is not set
++
++#
++# USB devices
++#
++# CONFIG_SND_USB_AUDIO is not set
++# CONFIG_SND_USB_CAIAQ is not set
+ 
+ #
+ # System on Chip audio support
+@@ -1084,6 +1074,10 @@ CONFIG_SND_BF5XX_SOC_BF548_EZKIT=y
+ CONFIG_SND_BF5XX_SPORT_NUM=0
+ CONFIG_SND_BF5XX_HAVE_COLD_RESET=y
+ CONFIG_SND_BF5XX_RESET_GPIO_NUM=19
++
++#
++# SoC Audio support for SuperH
++#
+ CONFIG_SND_SOC_AD1980=y
+ 
+ #
+@@ -1091,72 +1085,152 @@ CONFIG_SND_SOC_AD1980=y
+ #
+ # CONFIG_SOUND_PRIME is not set
+ CONFIG_AC97_BUS=y
+-
+-#
+-# HID Devices
+-#
+-CONFIG_HID=m
++CONFIG_HID_SUPPORT=y
++CONFIG_HID=y
+ # CONFIG_HID_DEBUG is not set
++# CONFIG_HIDRAW is not set
+ 
+ #
+-# USB support
++# USB Input Devices
+ #
++CONFIG_USB_HID=y
++# CONFIG_USB_HIDINPUT_POWERBOOK is not set
++# CONFIG_HID_FF is not set
++# CONFIG_USB_HIDDEV is not set
++CONFIG_USB_SUPPORT=y
+ CONFIG_USB_ARCH_HAS_HCD=y
+ # CONFIG_USB_ARCH_HAS_OHCI is not set
+ # CONFIG_USB_ARCH_HAS_EHCI is not set
+-# CONFIG_USB is not set
++CONFIG_USB=y
++# CONFIG_USB_DEBUG is not set
++
++#
++# Miscellaneous USB options
++#
++# CONFIG_USB_DEVICEFS is not set
++CONFIG_USB_DEVICE_CLASS=y
++# CONFIG_USB_DYNAMIC_MINORS is not set
++# CONFIG_USB_OTG is not set
++# CONFIG_USB_OTG_WHITELIST is not set
++CONFIG_USB_OTG_BLACKLIST_HUB=y
+ 
+ #
+-# Enable Host or Gadget support to see Inventra options
++# USB Host Controller Drivers
+ #
++# CONFIG_USB_ISP116X_HCD is not set
++# CONFIG_USB_ISP1362_HCD is not set
++# CONFIG_USB_ISP1760_HCD is not set
++# CONFIG_USB_SL811_HCD is not set
++# CONFIG_USB_R8A66597_HCD is not set
++CONFIG_USB_MUSB_HDRC=y
++CONFIG_USB_MUSB_SOC=y
++
++#
++# Blackfin high speed USB support
++#
++CONFIG_USB_MUSB_HOST=y
++# CONFIG_USB_MUSB_PERIPHERAL is not set
++# CONFIG_USB_MUSB_OTG is not set
++CONFIG_USB_MUSB_HDRC_HCD=y
++# CONFIG_MUSB_PIO_ONLY is not set
++# CONFIG_USB_INVENTRA_DMA is not set
++# CONFIG_USB_TI_CPPI_DMA is not set
++CONFIG_USB_MUSB_LOGLEVEL=0
++
++#
++# USB Device Class drivers
++#
++# CONFIG_USB_ACM is not set
++# CONFIG_USB_PRINTER is not set
+ 
+ #
+ # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+ #
+ 
+ #
+-# USB Gadget Support
++# may also be needed; see USB_STORAGE Help for more information
+ #
+-# CONFIG_USB_GADGET is not set
+-CONFIG_MMC=m
+-# CONFIG_MMC_DEBUG is not set
+-# CONFIG_MMC_UNSAFE_RESUME is not set
++CONFIG_USB_STORAGE=m
++# CONFIG_USB_STORAGE_DEBUG is not set
++# CONFIG_USB_STORAGE_DATAFAB is not set
++# CONFIG_USB_STORAGE_FREECOM is not set
++# CONFIG_USB_STORAGE_ISD200 is not set
++# CONFIG_USB_STORAGE_DPCM is not set
++# CONFIG_USB_STORAGE_USBAT is not set
++# CONFIG_USB_STORAGE_SDDR09 is not set
++# CONFIG_USB_STORAGE_SDDR55 is not set
++# CONFIG_USB_STORAGE_JUMPSHOT is not set
++# CONFIG_USB_STORAGE_ALAUDA is not set
++# CONFIG_USB_STORAGE_ONETOUCH is not set
++# CONFIG_USB_STORAGE_KARMA is not set
++# CONFIG_USB_LIBUSUAL is not set
+ 
+ #
+-# MMC/SD Card Drivers
++# USB Imaging devices
+ #
+-CONFIG_MMC_BLOCK=m
++# CONFIG_USB_MDC800 is not set
++# CONFIG_USB_MICROTEK is not set
++CONFIG_USB_MON=y
+ 
+ #
+-# MMC/SD Host Controller Drivers
++# USB port drivers
+ #
+-CONFIG_SDH_BFIN=m
+-# CONFIG_SPI_MMC is not set
+ 
+ #
+-# LED devices
++# USB Serial Converter support
+ #
+-# CONFIG_NEW_LEDS is not set
++# CONFIG_USB_SERIAL is not set
+ 
+ #
+-# LED drivers
++# USB Miscellaneous drivers
+ #
++# CONFIG_USB_EMI62 is not set
++# CONFIG_USB_EMI26 is not set
++# CONFIG_USB_ADUTUX is not set
++# CONFIG_USB_AUERSWALD is not set
++# CONFIG_USB_RIO500 is not set
++# CONFIG_USB_LEGOTOWER is not set
++# CONFIG_USB_LCD is not set
++# CONFIG_USB_BERRY_CHARGE is not set
++# CONFIG_USB_LED is not set
++# CONFIG_USB_CYPRESS_CY7C63 is not set
++# CONFIG_USB_CYTHERM is not set
++# CONFIG_USB_PHIDGET is not set
++# CONFIG_USB_IDMOUSE is not set
++# CONFIG_USB_FTDI_ELAN is not set
++# CONFIG_USB_APPLEDISPLAY is not set
++# CONFIG_USB_SISUSBVGA is not set
++# CONFIG_USB_LD is not set
++# CONFIG_USB_TRANCEVIBRATOR is not set
++# CONFIG_USB_IOWARRIOR is not set
+ 
+ #
+-# LED Triggers
++# USB DSL modem support
+ #
+ 
+ #
+-# InfiniBand support
++# USB Gadget Support
+ #
++# CONFIG_USB_GADGET is not set
++CONFIG_MMC=m
++# CONFIG_MMC_DEBUG is not set
++# CONFIG_MMC_UNSAFE_RESUME is not set
+ 
+ #
+-# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
++# MMC/SD Card Drivers
+ #
++CONFIG_MMC_BLOCK=m
++CONFIG_MMC_BLOCK_BOUNCE=y
++# CONFIG_SDIO_UART is not set
+ 
+ #
+-# Real Time Clock
++# MMC/SD Host Controller Drivers
+ #
++CONFIG_SDH_BFIN=m
++# CONFIG_SDH_BFIN_MISSING_CMD_PULLUP_WORKAROUND is not set
++# CONFIG_MMC_SPI is not set
++# CONFIG_SPI_MMC is not set
++# CONFIG_NEW_LEDS is not set
+ CONFIG_RTC_LIB=y
+ CONFIG_RTC_CLASS=y
+ CONFIG_RTC_HCTOSYS=y
+@@ -1176,6 +1250,7 @@ CONFIG_RTC_INTF_DEV=y
+ # I2C RTC drivers
+ #
+ # CONFIG_RTC_DRV_DS1307 is not set
++# CONFIG_RTC_DRV_DS1374 is not set
+ # CONFIG_RTC_DRV_DS1672 is not set
+ # CONFIG_RTC_DRV_MAX6900 is not set
+ # CONFIG_RTC_DRV_RS5C372 is not set
+@@ -1183,6 +1258,7 @@ CONFIG_RTC_INTF_DEV=y
+ # CONFIG_RTC_DRV_X1205 is not set
+ # CONFIG_RTC_DRV_PCF8563 is not set
+ # CONFIG_RTC_DRV_PCF8583 is not set
++# CONFIG_RTC_DRV_M41T80 is not set
+ 
+ #
+ # SPI RTC drivers
+@@ -1194,8 +1270,10 @@ CONFIG_RTC_INTF_DEV=y
+ # Platform RTC drivers
+ #
+ # CONFIG_RTC_DRV_DS1553 is not set
++# CONFIG_RTC_DRV_STK17TA8 is not set
+ # CONFIG_RTC_DRV_DS1742 is not set
+ # CONFIG_RTC_DRV_M48T86 is not set
++# CONFIG_RTC_DRV_M48T59 is not set
+ # CONFIG_RTC_DRV_V3020 is not set
+ 
+ #
+@@ -1204,22 +1282,9 @@ CONFIG_RTC_INTF_DEV=y
+ CONFIG_RTC_DRV_BFIN=y
+ 
+ #
+-# DMA Engine support
+-#
+-# CONFIG_DMA_ENGINE is not set
+-
+-#
+-# DMA Clients
++# Userspace I/O
+ #
+-
+-#
+-# DMA Devices
+-#
+-
+-#
+-# PBX support
+-#
+-# CONFIG_PBX is not set
++# CONFIG_UIO is not set
+ 
+ #
+ # File systems
+@@ -1280,7 +1345,6 @@ CONFIG_PROC_SYSCTL=y
+ CONFIG_SYSFS=y
+ # CONFIG_TMPFS is not set
+ # CONFIG_HUGETLB_PAGE is not set
+-CONFIG_RAMFS=y
+ # CONFIG_CONFIGFS_FS is not set
+ 
+ #
+@@ -1306,10 +1370,12 @@ CONFIG_YAFFS_SHORT_NAMES_IN_RAM=y
+ CONFIG_JFFS2_FS=m
+ CONFIG_JFFS2_FS_DEBUG=0
+ CONFIG_JFFS2_FS_WRITEBUFFER=y
++# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
+ # CONFIG_JFFS2_SUMMARY is not set
+ # CONFIG_JFFS2_FS_XATTR is not set
+ # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
+ CONFIG_JFFS2_ZLIB=y
++# CONFIG_JFFS2_LZO is not set
+ CONFIG_JFFS2_RTIME=y
+ # CONFIG_JFFS2_RUBIN is not set
+ # CONFIG_CRAMFS is not set
+@@ -1318,10 +1384,7 @@ CONFIG_JFFS2_RTIME=y
+ # CONFIG_QNX4FS_FS is not set
+ # CONFIG_SYSV_FS is not set
+ # CONFIG_UFS_FS is not set
+-
+-#
+-# Network File Systems
+-#
++CONFIG_NETWORK_FILESYSTEMS=y
+ CONFIG_NFS_FS=m
+ CONFIG_NFS_V3=y
+ # CONFIG_NFS_V3_ACL is not set
+@@ -1352,7 +1415,6 @@ CONFIG_CIFS=y
+ # CONFIG_NCP_FS is not set
+ # CONFIG_CODA_FS is not set
+ # CONFIG_AFS_FS is not set
+-# CONFIG_9P_FS is not set
+ 
+ #
+ # Partition Types
+@@ -1375,10 +1437,6 @@ CONFIG_MSDOS_PARTITION=y
+ # CONFIG_KARMA_PARTITION is not set
+ # CONFIG_EFI_PARTITION is not set
+ # CONFIG_SYSV68_PARTITION is not set
+-
+-#
+-# Native Language Support
+-#
+ CONFIG_NLS=y
+ CONFIG_NLS_DEFAULT="iso8859-1"
+ CONFIG_NLS_CODEPAGE_437=m
+@@ -1419,21 +1477,16 @@ CONFIG_NLS_ISO8859_15=m
+ CONFIG_NLS_KOI8_R=m
+ CONFIG_NLS_KOI8_U=m
+ CONFIG_NLS_UTF8=m
+-
+-#
+-# Distributed Lock Manager
+-#
+ # CONFIG_DLM is not set
+-
+-#
+-# Profiling support
+-#
++CONFIG_INSTRUMENTATION=y
+ # CONFIG_PROFILING is not set
++# CONFIG_MARKERS is not set
+ 
+ #
+ # Kernel hacking
+ #
+ # CONFIG_PRINTK_TIME is not set
++CONFIG_ENABLE_WARN_DEPRECATED=y
+ CONFIG_ENABLE_MUST_CHECK=y
+ # CONFIG_MAGIC_SYSRQ is not set
+ # CONFIG_UNUSED_SYMBOLS is not set
+@@ -1441,6 +1494,7 @@ CONFIG_DEBUG_FS=y
+ # CONFIG_HEADERS_CHECK is not set
+ # CONFIG_DEBUG_KERNEL is not set
+ # CONFIG_DEBUG_BUGVERBOSE is not set
++# CONFIG_SAMPLES is not set
+ CONFIG_DEBUG_MMRS=y
+ CONFIG_DEBUG_HUNT_FOR_ZERO=y
+ CONFIG_DEBUG_BFIN_HWTRACE_ON=y
+@@ -1460,11 +1514,8 @@ CONFIG_ACCESS_CHECK=y
+ # CONFIG_KEYS is not set
+ CONFIG_SECURITY=y
+ # CONFIG_SECURITY_NETWORK is not set
+-CONFIG_SECURITY_CAPABILITIES=m
+-
+-#
+-# Cryptographic options
+-#
++# CONFIG_SECURITY_CAPABILITIES is not set
++# CONFIG_SECURITY_ROOTPLUG is not set
+ # CONFIG_CRYPTO is not set
+ 
+ #
+@@ -1475,6 +1526,7 @@ CONFIG_CRC_CCITT=m
+ # CONFIG_CRC16 is not set
+ # CONFIG_CRC_ITU_T is not set
+ CONFIG_CRC32=y
++# CONFIG_CRC7 is not set
+ # CONFIG_LIBCRC32C is not set
+ CONFIG_ZLIB_INFLATE=y
+ CONFIG_ZLIB_DEFLATE=m
+diff --git a/arch/blackfin/configs/IP0X_defconfig b/arch/blackfin/configs/IP0X_defconfig
+index 5f6ff04..4384a67 100644
+--- a/arch/blackfin/configs/IP0X_defconfig
++++ b/arch/blackfin/configs/IP0X_defconfig
+@@ -212,7 +212,7 @@ CONFIG_HZ=250
+ #
+ # Memory Setup
+ #
+-CONFIG_MEM_SIZE=64
++CONFIG_MAX_MEM_SIZE=64
+ CONFIG_MEM_ADD_WIDTH=10
+ 
+ #
+diff --git a/arch/blackfin/kernel/bfin_dma_5xx.c b/arch/blackfin/kernel/bfin_dma_5xx.c
+index fd5448d..d54f190 100644
+--- a/arch/blackfin/kernel/bfin_dma_5xx.c
++++ b/arch/blackfin/kernel/bfin_dma_5xx.c
+@@ -90,6 +90,17 @@ int request_dma(unsigned int channel, char *device_id)
+ {
+ 
+ 	pr_debug("request_dma() : BEGIN \n");
++
++#if defined(CONFIG_BF561) && ANOMALY_05000182
++	if (channel >= CH_IMEM_STREAM0_DEST && channel <= CH_IMEM_STREAM1_DEST) {
++		if (get_cclk() > 500000000) {
++			printk(KERN_WARNING
++			       "Request IMDMA failed due to ANOMALY 05000182\n");
++			return -EFAULT;
++		}
++	}
++#endif
++
+ 	mutex_lock(&(dma_ch[channel].dmalock));
+ 
+ 	if ((dma_ch[channel].chan_status == DMA_CHANNEL_REQUESTED)
+diff --git a/arch/blackfin/kernel/bfin_gpio.c b/arch/blackfin/kernel/bfin_gpio.c
+index 7e8eaf4..b6d89d1 100644
+--- a/arch/blackfin/kernel/bfin_gpio.c
++++ b/arch/blackfin/kernel/bfin_gpio.c
+@@ -1130,6 +1130,25 @@ void bfin_gpio_irq_prepare(unsigned gpio)
+ 
+ #else
+ 
++int gpio_get_value(unsigned gpio)
++{
++	unsigned long flags;
++	int ret;
++
++	if (unlikely(get_gpio_edge(gpio))) {
++		local_irq_save(flags);
++		set_gpio_edge(gpio, 0);
++		ret = get_gpio_data(gpio);
++		set_gpio_edge(gpio, 1);
++		local_irq_restore(flags);
++
++		return ret;
++	} else
++		return get_gpio_data(gpio);
++}
++EXPORT_SYMBOL(gpio_get_value);
++
++
+ int gpio_direction_input(unsigned gpio)
+ {
+ 	unsigned long flags;
+diff --git a/arch/blackfin/kernel/bfin_ksyms.c b/arch/blackfin/kernel/bfin_ksyms.c
+index 053edff..4367330 100644
+--- a/arch/blackfin/kernel/bfin_ksyms.c
++++ b/arch/blackfin/kernel/bfin_ksyms.c
+@@ -90,7 +90,9 @@ EXPORT_SYMBOL(__umodsi3);
+ EXPORT_SYMBOL(outsb);
+ EXPORT_SYMBOL(insb);
+ EXPORT_SYMBOL(outsw);
++EXPORT_SYMBOL(outsw_8);
+ EXPORT_SYMBOL(insw);
++EXPORT_SYMBOL(insw_8);
+ EXPORT_SYMBOL(outsl);
+ EXPORT_SYMBOL(insl);
+ EXPORT_SYMBOL(insl_16);
+diff --git a/arch/blackfin/kernel/init_task.c b/arch/blackfin/kernel/init_task.c
+index c640154..6bdba7b 100644
+--- a/arch/blackfin/kernel/init_task.c
++++ b/arch/blackfin/kernel/init_task.c
+@@ -34,7 +34,6 @@
+ #include <linux/fs.h>
+ 
+ static struct fs_struct init_fs = INIT_FS;
+-static struct files_struct init_files = INIT_FILES;
+ static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
+ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
+ 
+diff --git a/arch/blackfin/kernel/traps.c b/arch/blackfin/kernel/traps.c
+index 5b84707..7bfbd95 100644
+--- a/arch/blackfin/kernel/traps.c
++++ b/arch/blackfin/kernel/traps.c
+@@ -364,13 +364,13 @@ asmlinkage void trap_c(struct pt_regs *fp)
+ 	/* 0x27 - Data CPLB Multiple Hits - Linux Trap Zero, handled here */
+ 	case VEC_CPLB_MHIT:
+ 		info.si_code = ILL_CPLB_MULHIT;
+-#ifdef CONFIG_DEBUG_HUNT_FOR_ZERO
+ 		sig = SIGSEGV;
+-		printk(KERN_NOTICE "NULL pointer access (probably)\n");
+-#else
+-		sig = SIGILL;
+-		printk(KERN_NOTICE EXC_0x27(KERN_NOTICE));
++#ifdef CONFIG_DEBUG_HUNT_FOR_ZERO
++		if (saved_dcplb_fault_addr < (void *)FIXED_CODE_START)
++			printk(KERN_NOTICE "NULL pointer access\n");
++		else
+ #endif
++			printk(KERN_NOTICE EXC_0x27(KERN_NOTICE));
+ 		CHK_DEBUGGER_TRAP();
+ 		break;
+ 	/* 0x28 - Emulation Watchpoint, handled here */
+@@ -419,13 +419,13 @@ asmlinkage void trap_c(struct pt_regs *fp)
+ 	/* 0x2D - Instruction CPLB Multiple Hits, handled here */
+ 	case VEC_CPLB_I_MHIT:
+ 		info.si_code = ILL_CPLB_MULHIT;
+-#ifdef CONFIG_DEBUG_HUNT_FOR_ZERO
+ 		sig = SIGSEGV;
+-		printk(KERN_NOTICE "Jump to address 0 - 0x0fff\n");
+-#else
+-		sig = SIGILL;
+-		printk(KERN_NOTICE EXC_0x2D(KERN_NOTICE));
++#ifdef CONFIG_DEBUG_HUNT_FOR_ZERO
++		if (saved_icplb_fault_addr < (void *)FIXED_CODE_START)
++			printk(KERN_NOTICE "Jump to NULL address\n");
++		else
+ #endif
++			printk(KERN_NOTICE EXC_0x2D(KERN_NOTICE));
+ 		CHK_DEBUGGER_TRAP();
+ 		break;
+ 	/* 0x2E - Illegal use of Supervisor Resource, handled here */
+diff --git a/arch/blackfin/lib/checksum.c b/arch/blackfin/lib/checksum.c
+index 42768e0..5c87505 100644
+--- a/arch/blackfin/lib/checksum.c
++++ b/arch/blackfin/lib/checksum.c
+@@ -72,9 +72,9 @@ static unsigned short do_csum(const unsigned char *buff, int len)
+  *	This is a version of ip_compute_csum() optimized for IP headers,
+  *	which always checksum on 4 octet boundaries.
+  */
+-unsigned short ip_fast_csum(unsigned char *iph, unsigned int ihl)
++__sum16 ip_fast_csum(unsigned char *iph, unsigned int ihl)
+ {
+-	return ~do_csum(iph, ihl * 4);
++	return (__force __sum16)~do_csum(iph, ihl * 4);
+ }
+ 
+ /*
+@@ -89,7 +89,7 @@ unsigned short ip_fast_csum(unsigned char *iph, unsigned int ihl)
+  *
+  * it's best to have buff aligned on a 32-bit boundary
+  */
+-unsigned int csum_partial(const unsigned char *buff, int len, unsigned int sum)
++__wsum csum_partial(const void *buff, int len, __wsum sum)
+ {
+ 	/*
+ 	 * Just in case we get nasty checksum data...
+@@ -109,22 +109,22 @@ unsigned int csum_partial(const unsigned char *buff, int len, unsigned int sum)
+  * this routine is used for miscellaneous IP-like checksums, mainly
+  * in icmp.c
+  */
+-unsigned short ip_compute_csum(const unsigned char *buff, int len)
++__sum16 ip_compute_csum(const void *buff, int len)
+ {
+-	return ~do_csum(buff, len);
++	return (__force __sum16)~do_csum(buff, len);
+ }
+ 
+ /*
+  * copy from fs while checksumming, otherwise like csum_partial
+  */
+ 
+-unsigned int
+-csum_partial_copy_from_user(const unsigned char *src, unsigned char *dst,
+-			    int len, int sum, int *csum_err)
++__wsum
++csum_partial_copy_from_user(const void __user *src, void *dst,
++			    int len, __wsum sum, int *csum_err)
+ {
+ 	if (csum_err)
+ 		*csum_err = 0;
+-	memcpy(dst, src, len);
++	memcpy(dst, (__force void *)src, len);
+ 	return csum_partial(dst, len, sum);
+ }
+ 
+@@ -132,8 +132,7 @@ csum_partial_copy_from_user(const unsigned char *src, unsigned char *dst,
+  * copy from ds while checksumming, otherwise like csum_partial
+  */
+ 
+-unsigned int csum_partial_copy(const unsigned char *src, unsigned char *dst,
+-			       int len, int sum)
++__wsum csum_partial_copy(const void *src, void *dst, int len, __wsum sum)
+ {
+ 	memcpy(dst, src, len);
+ 	return csum_partial(dst, len, sum);
+diff --git a/arch/blackfin/lib/ins.S b/arch/blackfin/lib/ins.S
+index df7b883..eba2343 100644
+--- a/arch/blackfin/lib/ins.S
++++ b/arch/blackfin/lib/ins.S
+@@ -7,7 +7,7 @@
+  * Description:  Implementation of ins{bwl} for BlackFin processors using zero overhead loops.
+  *
+  * Modified:
+- *               Copyright 2004-2006 Analog Devices Inc.
++ *               Copyright 2004-2008 Analog Devices Inc.
+  *               Copyright (C) 2005 Bas Vermeulen, BuyWays BV <bas at buyways.nl>
+  *
+  * Bugs:         Enter bugs at http://blackfin.uclinux.org/
+@@ -63,6 +63,23 @@ ENTRY(_insw)
+ 	RTS;
+ ENDPROC(_insw)
+ 
++ENTRY(_insw_8)
++	P0 = R0;	/* P0 = port */
++	cli R3;
++	P1 = R1;	/* P1 = address */
++	P2 = R2;	/* P2 = count */
++	SSYNC;
++	LSETUP( .Lword8_loop_s, .Lword8_loop_e) LC0 = P2;
++.Lword8_loop_s:  R0 = W[P0];
++		B[P1++] = R0;
++		R0 = R0 >> 8;
++		B[P1++] = R0;
++		NOP;
++.Lword8_loop_e: NOP;
++	sti R3;
++	RTS;
++ENDPROC(_insw_8)
++
+ ENTRY(_insb)
+ 	P0 = R0;	/* P0 = port */
+ 	cli R3;
+@@ -78,8 +95,6 @@ ENTRY(_insb)
+ 	RTS;
+ ENDPROC(_insb)
+ 
+-
+-
+ ENTRY(_insl_16)
+ 	P0 = R0;	/* P0 = port */
+ 	cli R3;
+diff --git a/arch/blackfin/lib/outs.S b/arch/blackfin/lib/outs.S
+index 4c3da8a..3daf960 100644
+--- a/arch/blackfin/lib/outs.S
++++ b/arch/blackfin/lib/outs.S
+@@ -7,7 +7,7 @@
+  * Description:  Implementation of outs{bwl} for BlackFin processors using zero overhead loops.
+  *
+  * Modified:     Copyright (C) 2005 Bas Vermeulen, BuyWays BV <bas at buyways.nl>
+- *               Copyright 2004-2006 Analog Devices Inc.
++ *               Copyright 2004-2008 Analog Devices Inc.
+  *
+  * Bugs:         Enter bugs at http://blackfin.uclinux.org/
+  *
+@@ -63,3 +63,17 @@ ENTRY(_outsb)
+ .Lbyte_loop_e: B[P0] = R0;
+ 	RTS;
+ ENDPROC(_outsb)
++
++ENTRY(_outsw_8)
++	P0 = R0;	/* P0 = port */
++	P1 = R1;	/* P1 = address */
++	P2 = R2;	/* P2 = count */
++
++	LSETUP( .Lword8_loop_s, .Lword8_loop_e) LC0 = P2;
++.Lword8_loop_s: R1 = B[P1++];
++		R0 = B[P1++];
++		R0 = R0 << 8;
++		R0 = R0 + R1;
++.Lword8_loop_e: W[P0] = R0;
++	RTS;
++ENDPROC(_outsw)
+diff --git a/arch/blackfin/mach-bf533/boards/stamp.c b/arch/blackfin/mach-bf533/boards/stamp.c
+index 7fd35fb..ec05b23 100644
+--- a/arch/blackfin/mach-bf533/boards/stamp.c
++++ b/arch/blackfin/mach-bf533/boards/stamp.c
+@@ -111,7 +111,7 @@ static struct platform_device net2272_bfin_device = {
+ };
+ #endif
+ 
+-#if defined(CONFIG_MTD_BF5xx) || defined(CONFIG_MTD_BF5xx_MODULE)
++#if defined(CONFIG_MTD_BFIN_ASYNC) || defined(CONFIG_MTD_BFIN_ASYNC_MODULE)
+ static struct mtd_partition stamp_partitions[] = {
+ 	{
+ 		.name   = "Bootloader",
+@@ -141,13 +141,17 @@ static struct resource stamp_flash_resource[] = {
+ 		.end   = 0x203fffff,
+ 		.flags = IORESOURCE_MEM,
+ 	}, {
+-		.start = CONFIG_ENET_FLASH_PIN,
++		.start = 0x7BB07BB0,	/* AMBCTL0 setting when accessing flash */
++		.end   = 0x7BB07BB0,	/* AMBCTL1 setting when accessing flash */
++		.flags = IORESOURCE_MEM,
++	}, {
++		.start = GPIO_PF0,
+ 		.flags = IORESOURCE_IRQ,
+ 	}
+ };
+ 
+ static struct platform_device stamp_flash_device = {
+-	.name          = "BF5xx-Flash",
++	.name          = "bfin-async-flash",
+ 	.id            = 0,
+ 	.dev = {
+ 		.platform_data = &stamp_flash_data,
+@@ -595,7 +599,7 @@ static struct platform_device *stamp_devices[] __initdata = {
+ 
+ 	&bfin_gpios_device,
+ 
+-#if defined(CONFIG_MTD_BF5xx) || defined(CONFIG_MTD_BF5xx_MODULE)
++#if defined(CONFIG_MTD_BFIN_ASYNC) || defined(CONFIG_MTD_BFIN_ASYNC_MODULE)
+ 	&stamp_flash_device,
+ #endif
+ };
+@@ -617,8 +621,8 @@ static int __init stamp_init(void)
+ 
+ #if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
+ 	/* setup BF533_STAMP CPLD to route AMS3 to Ethernet MAC */
+-	bfin_write_FIO_DIR(bfin_read_FIO_DIR() | (1 << CONFIG_ENET_FLASH_PIN));
+-	bfin_write_FIO_FLAG_S(1 << CONFIG_ENET_FLASH_PIN);
++	bfin_write_FIO_DIR(bfin_read_FIO_DIR() | PF0);
++	bfin_write_FIO_FLAG_S(PF0);
+ 	SSYNC();
+ #endif
+ 
+@@ -636,8 +640,8 @@ arch_initcall(stamp_init);
+ 
+ void native_machine_restart(char *cmd)
+ {
+-#define BIT_TO_SET (1 << CONFIG_ENET_FLASH_PIN)
+-	bfin_write_FIO_INEN(~BIT_TO_SET);
+-	bfin_write_FIO_DIR(BIT_TO_SET);
+-	bfin_write_FIO_FLAG_C(BIT_TO_SET);
++	/* workaround pull up on cpld / flash pin not being strong enough */
++	bfin_write_FIO_INEN(~PF0);
++	bfin_write_FIO_DIR(PF0);
++	bfin_write_FIO_FLAG_C(PF0);
+ }
+diff --git a/arch/cris/kernel/process.c b/arch/cris/kernel/process.c
+index ef2db8f..5933656 100644
+--- a/arch/cris/kernel/process.c
++++ b/arch/cris/kernel/process.c
+@@ -38,7 +38,6 @@
+  */
+ 
+ static struct fs_struct init_fs = INIT_FS;
+-static struct files_struct init_files = INIT_FILES;
+ static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
+ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
+ struct mm_struct init_mm = INIT_MM(init_mm);
+diff --git a/arch/frv/kernel/init_task.c b/arch/frv/kernel/init_task.c
+index 2299393..e219881 100644
+--- a/arch/frv/kernel/init_task.c
++++ b/arch/frv/kernel/init_task.c
+@@ -11,7 +11,6 @@
+ 
+ 
+ static struct fs_struct init_fs = INIT_FS;
+-static struct files_struct init_files = INIT_FILES;
+ static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
+ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
+ struct mm_struct init_mm = INIT_MM(init_mm);
+diff --git a/arch/h8300/kernel/init_task.c b/arch/h8300/kernel/init_task.c
+index 19272c2..93a4899 100644
+--- a/arch/h8300/kernel/init_task.c
++++ b/arch/h8300/kernel/init_task.c
+@@ -13,7 +13,6 @@
+ #include <asm/pgtable.h>
+ 
+ static struct fs_struct init_fs = INIT_FS;
+-static struct files_struct init_files = INIT_FILES;
+ static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
+ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
+ struct mm_struct init_mm = INIT_MM(init_mm);
+diff --git a/arch/ia64/kernel/init_task.c b/arch/ia64/kernel/init_task.c
+index bc8efca..9d7e1c6 100644
+--- a/arch/ia64/kernel/init_task.c
++++ b/arch/ia64/kernel/init_task.c
+@@ -18,7 +18,6 @@
+ #include <asm/pgtable.h>
+ 
+ static struct fs_struct init_fs = INIT_FS;
+-static struct files_struct init_files = INIT_FILES;
+ static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
+ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
+ struct mm_struct init_mm = INIT_MM(init_mm);
+diff --git a/arch/ia64/kvm/Makefile b/arch/ia64/kvm/Makefile
+index 5235339..112791d 100644
+--- a/arch/ia64/kvm/Makefile
++++ b/arch/ia64/kvm/Makefile
+@@ -7,7 +7,6 @@ offsets-file := asm-offsets.h
+ always  := $(offsets-file)
+ targets := $(offsets-file)
+ targets += arch/ia64/kvm/asm-offsets.s
+-clean-files := $(addprefix $(objtree)/,$(targets) $(obj)/memcpy.S $(obj)/memset.S)
+ 
+ # Default sed regexp - multiline due to syntax constraints
+ define sed-y
+@@ -54,5 +53,5 @@ EXTRA_CFLAGS_vcpu.o += -mfixed-range=f2-f5,f12-f127
+ kvm-intel-objs = vmm.o vmm_ivt.o trampoline.o vcpu.o optvfault.o mmio.o \
+ 	vtlb.o process.o
+ #Add link memcpy and memset to avoid possible structure assignment error
+-kvm-intel-objs += ../lib/memset.o ../lib/memcpy.o
++kvm-intel-objs += memcpy.o memset.o
+ obj-$(CONFIG_KVM_INTEL) += kvm-intel.o
+diff --git a/arch/ia64/kvm/memcpy.S b/arch/ia64/kvm/memcpy.S
+new file mode 100644
+index 0000000..c04cdbe
+--- /dev/null
++++ b/arch/ia64/kvm/memcpy.S
+@@ -0,0 +1 @@
++#include "../lib/memcpy.S"
+diff --git a/arch/ia64/kvm/memset.S b/arch/ia64/kvm/memset.S
+new file mode 100644
+index 0000000..83c3066
+--- /dev/null
++++ b/arch/ia64/kvm/memset.S
+@@ -0,0 +1 @@
++#include "../lib/memset.S"
+diff --git a/arch/m32r/kernel/init_task.c b/arch/m32r/kernel/init_task.c
+index 9e508fd..0d658db 100644
+--- a/arch/m32r/kernel/init_task.c
++++ b/arch/m32r/kernel/init_task.c
+@@ -12,7 +12,6 @@
+ #include <asm/pgtable.h>
+ 
+ static struct fs_struct init_fs = INIT_FS;
+-static struct files_struct init_files = INIT_FILES;
+ static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
+ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
+ struct mm_struct init_mm = INIT_MM(init_mm);
+diff --git a/arch/m68k/kernel/process.c b/arch/m68k/kernel/process.c
+index 5de4e4e..7888cdf 100644
+--- a/arch/m68k/kernel/process.c
++++ b/arch/m68k/kernel/process.c
+@@ -41,7 +41,6 @@
+  * setup.
+  */
+ static struct fs_struct init_fs = INIT_FS;
+-static struct files_struct init_files = INIT_FILES;
+ static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
+ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
+ struct mm_struct init_mm = INIT_MM(init_mm);
+diff --git a/arch/m68knommu/kernel/init_task.c b/arch/m68knommu/kernel/init_task.c
+index 3897043..344c01a 100644
+--- a/arch/m68knommu/kernel/init_task.c
++++ b/arch/m68knommu/kernel/init_task.c
+@@ -13,7 +13,6 @@
+ #include <asm/pgtable.h>
+ 
+ static struct fs_struct init_fs = INIT_FS;
+-static struct files_struct init_files = INIT_FILES;
+ static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
+ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
+ struct mm_struct init_mm = INIT_MM(init_mm);
+diff --git a/arch/mips/kernel/init_task.c b/arch/mips/kernel/init_task.c
+index aeda7f5..d72487a 100644
+--- a/arch/mips/kernel/init_task.c
++++ b/arch/mips/kernel/init_task.c
+@@ -10,7 +10,6 @@
+ #include <asm/pgtable.h>
+ 
+ static struct fs_struct init_fs = INIT_FS;
+-static struct files_struct init_files = INIT_FILES;
+ static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
+ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
+ struct mm_struct init_mm = INIT_MM(init_mm);
+diff --git a/arch/mn10300/kernel/init_task.c b/arch/mn10300/kernel/init_task.c
+index 39fe688..af16f6e 100644
+--- a/arch/mn10300/kernel/init_task.c
++++ b/arch/mn10300/kernel/init_task.c
+@@ -19,7 +19,6 @@
+ #include <asm/pgtable.h>
+ 
+ static struct fs_struct init_fs = INIT_FS;
+-static struct files_struct init_files = INIT_FILES;
+ static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
+ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
+ struct mm_struct init_mm = INIT_MM(init_mm);
+diff --git a/arch/parisc/kernel/init_task.c b/arch/parisc/kernel/init_task.c
+index 26198a0..f5941c0 100644
+--- a/arch/parisc/kernel/init_task.c
++++ b/arch/parisc/kernel/init_task.c
+@@ -35,7 +35,6 @@
+ #include <asm/pgalloc.h>
+ 
+ static struct fs_struct init_fs = INIT_FS;
+-static struct files_struct init_files = INIT_FILES;
+ static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
+ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
+ struct mm_struct init_mm = INIT_MM(init_mm);
+diff --git a/arch/powerpc/boot/.gitignore b/arch/powerpc/boot/.gitignore
+index 2347294..2f50acd 100644
+--- a/arch/powerpc/boot/.gitignore
++++ b/arch/powerpc/boot/.gitignore
+@@ -20,21 +20,19 @@ kernel-vmlinux.strip.gz
+ mktree
+ uImage
+ cuImage.*
++dtbImage.*
+ treeImage.*
+ zImage
++zImage.initrd
+ zImage.bin.*
+ zImage.chrp
+ zImage.coff
+-zImage.coff.lds
+-zImage.ep*
++zImage.holly
+ zImage.iseries
+ zImage.*lds
+ zImage.miboot
+ zImage.pmac
+ zImage.pseries
+-zImage.redboot*
+-zImage.sandpoint
+-zImage.vmode
+ zconf.h
+ zlib.h
+ zutil.h
+diff --git a/arch/powerpc/boot/4xx.c b/arch/powerpc/boot/4xx.c
+index 758edf1..5c87843 100644
+--- a/arch/powerpc/boot/4xx.c
++++ b/arch/powerpc/boot/4xx.c
+@@ -21,6 +21,25 @@
+ #include "reg.h"
+ #include "dcr.h"
+ 
++static unsigned long chip_11_errata(unsigned long memsize)
++{
++	unsigned long pvr;
++
++	pvr = mfpvr();
++
++	switch (pvr & 0xf0000ff0) {
++		case 0x40000850:
++		case 0x400008d0:
++		case 0x200008d0:
++			memsize -= 4096;
++			break;
++		default:
++			break;
++	}
++
++	return memsize;
++}
++
+ /* Read the 4xx SDRAM controller to get size of system memory. */
+ void ibm4xx_sdram_fixup_memsize(void)
+ {
+@@ -34,6 +53,7 @@ void ibm4xx_sdram_fixup_memsize(void)
+ 			memsize += SDRAM_CONFIG_BANK_SIZE(bank_config);
+ 	}
+ 
++	memsize = chip_11_errata(memsize);
+ 	dt_fixup_memory(0, memsize);
+ }
+ 
+@@ -199,6 +219,7 @@ void ibm4xx_denali_fixup_memsize(void)
+ 		bank = 4; /* 4 banks */
+ 
+ 	memsize = cs * (1 << (col+row)) * bank * dpath;
++	memsize = chip_11_errata(memsize);
+ 	dt_fixup_memory(0, memsize);
+ }
+ 
+diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile
+index 7822d25..f5e0b2a 100644
+--- a/arch/powerpc/boot/Makefile
++++ b/arch/powerpc/boot/Makefile
+@@ -99,7 +99,7 @@ $(obj)/zImage.lds $(obj)/zImage.coff.lds $(obj)/zImage.ps3.lds: $(obj)/%: $(srct
+ 	@cp $< $@
+ 
+ clean-files := $(zlib) $(zlibheader) $(zliblinuxheader) \
+-		empty.c zImage zImage.coff.lds zImage.ps3.lds zImage.lds
++		empty.c zImage.coff.lds zImage.ps3.lds zImage.lds
+ 
+ quiet_cmd_bootcc = BOOTCC  $@
+       cmd_bootcc = $(CROSS32CC) -Wp,-MD,$(depfile) $(BOOTCFLAGS) -c -o $@ $<
+@@ -339,7 +339,9 @@ install: $(CONFIGURE) $(addprefix $(obj)/, $(image-y))
+ 	sh -x $(srctree)/$(src)/install.sh "$(KERNELRELEASE)" vmlinux System.map "$(INSTALL_PATH)" $<
+ 
+ # anything not in $(targets)
+-clean-files += $(image-) $(initrd-) zImage zImage.initrd cuImage.* treeImage.* \
++clean-files += $(image-) $(initrd-) cuImage.* dtbImage.* treeImage.* \
++	zImage zImage.initrd zImage.chrp zImage.coff zImage.holly \
++	zImage.iseries zImage.miboot zImage.pmac zImage.pseries \
+ 	otheros.bld *.dtb
+ 
+ # clean up files cached by wrapper
+diff --git a/arch/powerpc/boot/dts/mpc8377_mds.dts b/arch/powerpc/boot/dts/mpc8377_mds.dts
+index 1e7802c..fea5925 100644
+--- a/arch/powerpc/boot/dts/mpc8377_mds.dts
++++ b/arch/powerpc/boot/dts/mpc8377_mds.dts
+@@ -271,27 +271,35 @@
+ 		dma at 82a8 {
+ 			#address-cells = <1>;
+ 			#size-cells = <1>;
+-			compatible = "fsl,mpc8349-dma";
++			compatible = "fsl,mpc8377-dma", "fsl,elo-dma";
+ 			reg = <0x82a8 4>;
+ 			ranges = <0 0x8100 0x1a8>;
+ 			interrupt-parent = <&ipic>;
+ 			interrupts = <0x47 8>;
+ 			cell-index = <0>;
+ 			dma-channel at 0 {
+-				compatible = "fsl,mpc8349-dma-channel";
++				compatible = "fsl,mpc8377-dma-channel", "fsl,elo-dma-channel";
+ 				reg = <0 0x80>;
++				interrupt-parent = <&ipic>;
++				interrupts = <0x47 8>;
+ 			};
+ 			dma-channel at 80 {
+-				compatible = "fsl,mpc8349-dma-channel";
++				compatible = "fsl,mpc8377-dma-channel", "fsl,elo-dma-channel";
+ 				reg = <0x80 0x80>;
++				interrupt-parent = <&ipic>;
++				interrupts = <0x47 8>;
+ 			};
+ 			dma-channel at 100 {
+-				compatible = "fsl,mpc8349-dma-channel";
++				compatible = "fsl,mpc8377-dma-channel", "fsl,elo-dma-channel";
+ 				reg = <0x100 0x80>;
++				interrupt-parent = <&ipic>;
++				interrupts = <0x47 8>;
+ 			};
+ 			dma-channel at 180 {
+-				compatible = "fsl,mpc8349-dma-channel";
++				compatible = "fsl,mpc8377-dma-channel", "fsl,elo-dma-channel";
+ 				reg = <0x180 0x28>;
++				interrupt-parent = <&ipic>;
++				interrupts = <0x47 8>;
+ 			};
+ 		};
+ 
+diff --git a/arch/powerpc/configs/chrp32_defconfig b/arch/powerpc/configs/chrp32_defconfig
+index d7fd298..05360d4 100644
+--- a/arch/powerpc/configs/chrp32_defconfig
++++ b/arch/powerpc/configs/chrp32_defconfig
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.25-rc6
+-# Thu Mar 27 13:55:37 2008
++# Linux kernel version: 2.6.26-rc3
++# Tue May 20 20:00:44 2008
+ #
+ # CONFIG_PPC64 is not set
+ 
+@@ -32,6 +32,8 @@ CONFIG_GENERIC_CLOCKEVENTS=y
+ CONFIG_GENERIC_HARDIRQS=y
+ # CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
+ CONFIG_IRQ_PER_CPU=y
++CONFIG_STACKTRACE_SUPPORT=y
++CONFIG_LOCKDEP_SUPPORT=y
+ CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+ CONFIG_ARCH_HAS_ILOG2_U32=y
+ CONFIG_GENERIC_HWEIGHT=y
+@@ -88,6 +90,7 @@ CONFIG_INITRAMFS_SOURCE=""
+ CONFIG_SYSCTL=y
+ # CONFIG_EMBEDDED is not set
+ CONFIG_SYSCTL_SYSCALL=y
++CONFIG_SYSCTL_SYSCALL_CHECK=y
+ CONFIG_KALLSYMS=y
+ # CONFIG_KALLSYMS_ALL is not set
+ # CONFIG_KALLSYMS_EXTRA_PASS is not set
+@@ -95,6 +98,7 @@ CONFIG_HOTPLUG=y
+ CONFIG_PRINTK=y
+ CONFIG_BUG=y
+ CONFIG_ELF_CORE=y
++CONFIG_PCSPKR_PLATFORM=y
+ # CONFIG_COMPAT_BRK is not set
+ CONFIG_BASE_FULL=y
+ CONFIG_FUTEX=y
+@@ -115,12 +119,14 @@ CONFIG_HAVE_OPROFILE=y
+ # CONFIG_KPROBES is not set
+ CONFIG_HAVE_KPROBES=y
+ CONFIG_HAVE_KRETPROBES=y
++# CONFIG_HAVE_DMA_ATTRS is not set
+ CONFIG_PROC_PAGE_MONITOR=y
+ CONFIG_SLABINFO=y
+ CONFIG_RT_MUTEXES=y
+ # CONFIG_TINY_SHMEM is not set
+ CONFIG_BASE_SMALL=0
+ CONFIG_MODULES=y
++# CONFIG_MODULE_FORCE_LOAD is not set
+ CONFIG_MODULE_UNLOAD=y
+ CONFIG_MODULE_FORCE_UNLOAD=y
+ # CONFIG_MODVERSIONS is not set
+@@ -217,11 +223,13 @@ CONFIG_FLATMEM=y
+ CONFIG_FLAT_NODE_MEM_MAP=y
+ # CONFIG_SPARSEMEM_STATIC is not set
+ # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
++CONFIG_PAGEFLAGS_EXTENDED=y
+ CONFIG_SPLIT_PTLOCK_CPUS=4
+ # CONFIG_RESOURCES_64BIT is not set
+ CONFIG_ZONE_DMA_FLAG=1
+ CONFIG_BOUNCE=y
+ CONFIG_VIRT_TO_BUS=y
++CONFIG_FORCE_MAX_ZONEORDER=11
+ CONFIG_PROC_DEVICETREE=y
+ # CONFIG_CMDLINE_BOOL is not set
+ # CONFIG_PM is not set
+@@ -245,6 +253,7 @@ CONFIG_ARCH_SUPPORTS_MSI=y
+ # CONFIG_PCI_DEBUG is not set
+ # CONFIG_PCCARD is not set
+ # CONFIG_HOTPLUG_PCI is not set
++# CONFIG_HAS_RAPIDIO is not set
+ 
+ #
+ # Advanced setup
+@@ -254,11 +263,11 @@ CONFIG_ARCH_SUPPORTS_MSI=y
+ #
+ # Default settings for advanced configuration options are used
+ #
+-CONFIG_HIGHMEM_START=0xfe000000
+ CONFIG_LOWMEM_SIZE=0x30000000
++CONFIG_PAGE_OFFSET=0xc0000000
+ CONFIG_KERNEL_START=0xc0000000
++CONFIG_PHYSICAL_START=0x00000000
+ CONFIG_TASK_SIZE=0xc0000000
+-CONFIG_BOOT_LOAD=0x00800000
+ 
+ #
+ # Networking
+@@ -299,8 +308,6 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
+ # CONFIG_TCP_MD5SIG is not set
+ # CONFIG_IP_VS is not set
+ # CONFIG_IPV6 is not set
+-# CONFIG_INET6_XFRM_TUNNEL is not set
+-# CONFIG_INET6_TUNNEL is not set
+ # CONFIG_NETWORK_SECMARK is not set
+ CONFIG_NETFILTER=y
+ # CONFIG_NETFILTER_DEBUG is not set
+@@ -398,6 +405,7 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y
+ # CONFIG_CONNECTOR is not set
+ # CONFIG_MTD is not set
+ CONFIG_OF_DEVICE=y
++CONFIG_OF_I2C=y
+ # CONFIG_PARPORT is not set
+ # CONFIG_PNP is not set
+ CONFIG_BLK_DEV=y
+@@ -484,22 +492,8 @@ CONFIG_BLK_DEV_SL82C105=y
+ # CONFIG_BLK_DEV_TRM290 is not set
+ CONFIG_BLK_DEV_VIA82CXXX=y
+ # CONFIG_BLK_DEV_TC86C001 is not set
+-
+-#
+-# Other IDE chipsets support
+-#
+-
+-#
+-# Note: most of these also require special kernel boot parameters
+-#
+-# CONFIG_BLK_DEV_4DRIVES is not set
+-# CONFIG_BLK_DEV_ALI14XX is not set
+-# CONFIG_BLK_DEV_DTC2278 is not set
+-# CONFIG_BLK_DEV_HT6560B is not set
+-# CONFIG_BLK_DEV_QD65XX is not set
+-# CONFIG_BLK_DEV_UMC8672 is not set
+ CONFIG_BLK_DEV_IDEDMA=y
+-CONFIG_IDE_ARCH_OBSOLETE_INIT=y
++# CONFIG_BLK_DEV_HD_ONLY is not set
+ # CONFIG_BLK_DEV_HD is not set
+ 
+ #
+@@ -641,7 +635,6 @@ CONFIG_DE4X5=y
+ # CONFIG_IBM_NEW_EMAC_EMAC4 is not set
+ CONFIG_NET_PCI=y
+ CONFIG_PCNET32=y
+-# CONFIG_PCNET32_NAPI is not set
+ # CONFIG_AMD8111_ETH is not set
+ # CONFIG_ADAPTEC_STARFIRE is not set
+ # CONFIG_AC3200 is not set
+@@ -684,7 +677,6 @@ CONFIG_NETDEV_1000=y
+ # CONFIG_SIS190 is not set
+ # CONFIG_SKGE is not set
+ # CONFIG_SKY2 is not set
+-# CONFIG_SK98LIN is not set
+ # CONFIG_VIA_VELOCITY is not set
+ # CONFIG_TIGON3 is not set
+ # CONFIG_BNX2 is not set
+@@ -703,6 +695,7 @@ CONFIG_NETDEV_10000=y
+ # CONFIG_MLX4_CORE is not set
+ # CONFIG_TEHUTI is not set
+ # CONFIG_BNX2X is not set
++# CONFIG_SFC is not set
+ # CONFIG_TR is not set
+ 
+ #
+@@ -710,6 +703,7 @@ CONFIG_NETDEV_10000=y
+ #
+ # CONFIG_WLAN_PRE80211 is not set
+ # CONFIG_WLAN_80211 is not set
++# CONFIG_IWLWIFI_LEDS is not set
+ 
+ #
+ # USB Network Adapters
+@@ -813,6 +807,7 @@ CONFIG_VT=y
+ CONFIG_VT_CONSOLE=y
+ CONFIG_HW_CONSOLE=y
+ # CONFIG_VT_HW_CONSOLE_BINDING is not set
++CONFIG_DEVKMEM=y
+ # CONFIG_SERIAL_NONSTANDARD is not set
+ # CONFIG_NOZOMI is not set
+ 
+@@ -853,13 +848,7 @@ CONFIG_DEVPORT=y
+ CONFIG_I2C=y
+ CONFIG_I2C_BOARDINFO=y
+ # CONFIG_I2C_CHARDEV is not set
+-
+-#
+-# I2C Algorithms
+-#
+ CONFIG_I2C_ALGOBIT=y
+-# CONFIG_I2C_ALGOPCF is not set
+-# CONFIG_I2C_ALGOPCA is not set
+ 
+ #
+ # I2C Hardware Bus support
+@@ -890,6 +879,7 @@ CONFIG_I2C_ALGOBIT=y
+ # CONFIG_I2C_VIAPRO is not set
+ # CONFIG_I2C_VOODOO3 is not set
+ # CONFIG_I2C_PCA_ISA is not set
++# CONFIG_I2C_PCA_PLATFORM is not set
+ 
+ #
+ # Miscellaneous I2C Chip support
+@@ -899,19 +889,13 @@ CONFIG_I2C_ALGOBIT=y
+ # CONFIG_SENSORS_PCF8574 is not set
+ # CONFIG_PCF8575 is not set
+ # CONFIG_SENSORS_PCF8591 is not set
+-# CONFIG_TPS65010 is not set
+ # CONFIG_SENSORS_MAX6875 is not set
+ # CONFIG_SENSORS_TSL2550 is not set
+ # CONFIG_I2C_DEBUG_CORE is not set
+ # CONFIG_I2C_DEBUG_ALGO is not set
+ # CONFIG_I2C_DEBUG_BUS is not set
+ # CONFIG_I2C_DEBUG_CHIP is not set
+-
+-#
+-# SPI support
+-#
+ # CONFIG_SPI is not set
+-# CONFIG_SPI_MASTER is not set
+ # CONFIG_W1 is not set
+ # CONFIG_POWER_SUPPLY is not set
+ # CONFIG_HWMON is not set
+@@ -928,12 +912,22 @@ CONFIG_SSB_POSSIBLE=y
+ # Multifunction device drivers
+ #
+ # CONFIG_MFD_SM501 is not set
++# CONFIG_HTC_PASIC3 is not set
+ 
+ #
+ # Multimedia devices
+ #
++
++#
++# Multimedia core support
++#
+ # CONFIG_VIDEO_DEV is not set
+ # CONFIG_DVB_CORE is not set
++# CONFIG_VIDEO_MEDIA is not set
++
++#
++# Multimedia drivers
++#
+ # CONFIG_DAB is not set
+ 
+ #
+@@ -953,8 +947,8 @@ CONFIG_FB_CFB_IMAGEBLIT=y
+ # CONFIG_FB_SYS_FILLRECT is not set
+ # CONFIG_FB_SYS_COPYAREA is not set
+ # CONFIG_FB_SYS_IMAGEBLIT is not set
++# CONFIG_FB_FOREIGN_ENDIAN is not set
+ # CONFIG_FB_SYS_FOPS is not set
+-CONFIG_FB_DEFERRED_IO=y
+ # CONFIG_FB_SVGALIB is not set
+ CONFIG_FB_MACMODES=y
+ CONFIG_FB_BACKLIGHT=y
+@@ -1072,11 +1066,13 @@ CONFIG_USB_DEVICE_CLASS=y
+ #
+ # USB Host Controller Drivers
+ #
++# CONFIG_USB_C67X00_HCD is not set
+ CONFIG_USB_EHCI_HCD=m
+ # CONFIG_USB_EHCI_ROOT_HUB_TT is not set
+ # CONFIG_USB_EHCI_TT_NEWSCHED is not set
+ # CONFIG_USB_EHCI_HCD_PPC_OF is not set
+ # CONFIG_USB_ISP116X_HCD is not set
++# CONFIG_USB_ISP1760_HCD is not set
+ CONFIG_USB_OHCI_HCD=y
+ # CONFIG_USB_OHCI_HCD_PPC_OF is not set
+ # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
+@@ -1112,6 +1108,7 @@ CONFIG_USB_STORAGE=m
+ # CONFIG_USB_STORAGE_ALAUDA is not set
+ # CONFIG_USB_STORAGE_ONETOUCH is not set
+ # CONFIG_USB_STORAGE_KARMA is not set
++# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
+ # CONFIG_USB_LIBUSUAL is not set
+ 
+ #
+@@ -1153,14 +1150,11 @@ CONFIG_USB_MON=y
+ # CONFIG_MMC is not set
+ # CONFIG_MEMSTICK is not set
+ # CONFIG_NEW_LEDS is not set
++# CONFIG_ACCESSIBILITY is not set
+ # CONFIG_INFINIBAND is not set
+ # CONFIG_EDAC is not set
+ # CONFIG_RTC_CLASS is not set
+ # CONFIG_DMADEVICES is not set
+-
+-#
+-# Userspace I/O
+-#
+ # CONFIG_UIO is not set
+ 
+ #
+@@ -1180,7 +1174,6 @@ CONFIG_FS_MBCACHE=y
+ # CONFIG_JFS_FS is not set
+ # CONFIG_FS_POSIX_ACL is not set
+ # CONFIG_XFS_FS is not set
+-# CONFIG_GFS2_FS is not set
+ # CONFIG_OCFS2_FS is not set
+ CONFIG_DNOTIFY=y
+ CONFIG_INOTIFY=y
+@@ -1314,6 +1307,7 @@ CONFIG_NLS_ISO8859_1=m
+ # Library routines
+ #
+ CONFIG_BITREVERSE=y
++# CONFIG_GENERIC_FIND_FIRST_BIT is not set
+ CONFIG_CRC_CCITT=m
+ # CONFIG_CRC16 is not set
+ # CONFIG_CRC_ITU_T is not set
+@@ -1334,6 +1328,7 @@ CONFIG_HAVE_LMB=y
+ # CONFIG_PRINTK_TIME is not set
+ CONFIG_ENABLE_WARN_DEPRECATED=y
+ CONFIG_ENABLE_MUST_CHECK=y
++CONFIG_FRAME_WARN=1024
+ CONFIG_MAGIC_SYSRQ=y
+ # CONFIG_UNUSED_SYMBOLS is not set
+ # CONFIG_DEBUG_FS is not set
+@@ -1344,6 +1339,7 @@ CONFIG_DETECT_SOFTLOCKUP=y
+ CONFIG_SCHED_DEBUG=y
+ # CONFIG_SCHEDSTATS is not set
+ # CONFIG_TIMER_STATS is not set
++# CONFIG_DEBUG_OBJECTS is not set
+ # CONFIG_SLUB_DEBUG_ON is not set
+ # CONFIG_SLUB_STATS is not set
+ # CONFIG_DEBUG_RT_MUTEXES is not set
+@@ -1357,6 +1353,7 @@ CONFIG_DEBUG_SPINLOCK_SLEEP=y
+ CONFIG_DEBUG_BUGVERBOSE=y
+ # CONFIG_DEBUG_INFO is not set
+ # CONFIG_DEBUG_VM is not set
++# CONFIG_DEBUG_WRITECOUNT is not set
+ # CONFIG_DEBUG_LIST is not set
+ # CONFIG_DEBUG_SG is not set
+ # CONFIG_BOOT_PRINTK_DELAY is not set
+@@ -1371,6 +1368,7 @@ CONFIG_DEBUGGER=y
+ CONFIG_XMON=y
+ CONFIG_XMON_DEFAULT=y
+ CONFIG_XMON_DISASSEMBLY=y
++CONFIG_IRQSTACKS=y
+ # CONFIG_BDI_SWITCH is not set
+ # CONFIG_BOOTX_TEXT is not set
+ # CONFIG_PPC_EARLY_DEBUG is not set
+@@ -1382,50 +1380,80 @@ CONFIG_XMON_DISASSEMBLY=y
+ # CONFIG_SECURITY is not set
+ # CONFIG_SECURITY_FILE_CAPABILITIES is not set
+ CONFIG_CRYPTO=y
++
++#
++# Crypto core or helper
++#
+ CONFIG_CRYPTO_ALGAPI=m
+ CONFIG_CRYPTO_BLKCIPHER=m
+-# CONFIG_CRYPTO_SEQIV is not set
+ CONFIG_CRYPTO_MANAGER=m
++# CONFIG_CRYPTO_GF128MUL is not set
++# CONFIG_CRYPTO_NULL is not set
++# CONFIG_CRYPTO_CRYPTD is not set
++# CONFIG_CRYPTO_AUTHENC is not set
++# CONFIG_CRYPTO_TEST is not set
++
++#
++# Authenticated Encryption with Associated Data
++#
++# CONFIG_CRYPTO_CCM is not set
++# CONFIG_CRYPTO_GCM is not set
++# CONFIG_CRYPTO_SEQIV is not set
++
++#
++# Block modes
++#
++CONFIG_CRYPTO_CBC=m
++# CONFIG_CRYPTO_CTR is not set
++# CONFIG_CRYPTO_CTS is not set
++CONFIG_CRYPTO_ECB=m
++# CONFIG_CRYPTO_LRW is not set
++CONFIG_CRYPTO_PCBC=m
++# CONFIG_CRYPTO_XTS is not set
++
++#
++# Hash modes
++#
+ # CONFIG_CRYPTO_HMAC is not set
+ # CONFIG_CRYPTO_XCBC is not set
+-# CONFIG_CRYPTO_NULL is not set
++
++#
++# Digest
++#
++# CONFIG_CRYPTO_CRC32C is not set
+ # CONFIG_CRYPTO_MD4 is not set
+ # CONFIG_CRYPTO_MD5 is not set
++# CONFIG_CRYPTO_MICHAEL_MIC is not set
+ CONFIG_CRYPTO_SHA1=m
+ # CONFIG_CRYPTO_SHA256 is not set
+ # CONFIG_CRYPTO_SHA512 is not set
+-# CONFIG_CRYPTO_WP512 is not set
+ # CONFIG_CRYPTO_TGR192 is not set
+-# CONFIG_CRYPTO_GF128MUL is not set
+-CONFIG_CRYPTO_ECB=m
+-CONFIG_CRYPTO_CBC=m
+-CONFIG_CRYPTO_PCBC=m
+-# CONFIG_CRYPTO_LRW is not set
+-# CONFIG_CRYPTO_XTS is not set
+-# CONFIG_CRYPTO_CTR is not set
+-# CONFIG_CRYPTO_GCM is not set
+-# CONFIG_CRYPTO_CCM is not set
+-# CONFIG_CRYPTO_CRYPTD is not set
+-# CONFIG_CRYPTO_DES is not set
+-# CONFIG_CRYPTO_FCRYPT is not set
+-# CONFIG_CRYPTO_BLOWFISH is not set
+-# CONFIG_CRYPTO_TWOFISH is not set
+-# CONFIG_CRYPTO_SERPENT is not set
++# CONFIG_CRYPTO_WP512 is not set
++
++#
++# Ciphers
++#
+ # CONFIG_CRYPTO_AES is not set
++# CONFIG_CRYPTO_ANUBIS is not set
++CONFIG_CRYPTO_ARC4=m
++# CONFIG_CRYPTO_BLOWFISH is not set
++# CONFIG_CRYPTO_CAMELLIA is not set
+ # CONFIG_CRYPTO_CAST5 is not set
+ # CONFIG_CRYPTO_CAST6 is not set
+-# CONFIG_CRYPTO_TEA is not set
+-CONFIG_CRYPTO_ARC4=m
++# CONFIG_CRYPTO_DES is not set
++# CONFIG_CRYPTO_FCRYPT is not set
+ # CONFIG_CRYPTO_KHAZAD is not set
+-# CONFIG_CRYPTO_ANUBIS is not set
+-# CONFIG_CRYPTO_SEED is not set
+ # CONFIG_CRYPTO_SALSA20 is not set
++# CONFIG_CRYPTO_SEED is not set
++# CONFIG_CRYPTO_SERPENT is not set
++# CONFIG_CRYPTO_TEA is not set
++# CONFIG_CRYPTO_TWOFISH is not set
++
++#
++# Compression
++#
+ # CONFIG_CRYPTO_DEFLATE is not set
+-# CONFIG_CRYPTO_MICHAEL_MIC is not set
+-# CONFIG_CRYPTO_CRC32C is not set
+-# CONFIG_CRYPTO_CAMELLIA is not set
+-# CONFIG_CRYPTO_TEST is not set
+-# CONFIG_CRYPTO_AUTHENC is not set
+ # CONFIG_CRYPTO_LZO is not set
+ # CONFIG_CRYPTO_HW is not set
+ # CONFIG_PPC_CLOCK is not set
++# CONFIG_VIRTUALIZATION is not set
+diff --git a/arch/powerpc/configs/g5_defconfig b/arch/powerpc/configs/g5_defconfig
+index 88338a9..db34909 100644
+--- a/arch/powerpc/configs/g5_defconfig
++++ b/arch/powerpc/configs/g5_defconfig
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.25-rc6
+-# Thu Mar 27 13:55:43 2008
++# Linux kernel version: 2.6.26-rc3
++# Tue May 20 20:01:18 2008
+ #
+ CONFIG_PPC64=y
+ 
+@@ -29,6 +29,9 @@ CONFIG_GENERIC_CLOCKEVENTS=y
+ CONFIG_GENERIC_HARDIRQS=y
+ CONFIG_HAVE_SETUP_PER_CPU_AREA=y
+ CONFIG_IRQ_PER_CPU=y
++CONFIG_STACKTRACE_SUPPORT=y
++CONFIG_TRACE_IRQFLAGS_SUPPORT=y
++CONFIG_LOCKDEP_SUPPORT=y
+ CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+ CONFIG_ARCH_HAS_ILOG2_U32=y
+ CONFIG_ARCH_HAS_ILOG2_U64=y
+@@ -91,6 +94,7 @@ CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+ CONFIG_SYSCTL=y
+ # CONFIG_EMBEDDED is not set
+ CONFIG_SYSCTL_SYSCALL=y
++CONFIG_SYSCTL_SYSCALL_CHECK=y
+ CONFIG_KALLSYMS=y
+ # CONFIG_KALLSYMS_ALL is not set
+ # CONFIG_KALLSYMS_EXTRA_PASS is not set
+@@ -119,12 +123,14 @@ CONFIG_HAVE_OPROFILE=y
+ # CONFIG_KPROBES is not set
+ CONFIG_HAVE_KPROBES=y
+ CONFIG_HAVE_KRETPROBES=y
++# CONFIG_HAVE_DMA_ATTRS is not set
+ CONFIG_PROC_PAGE_MONITOR=y
+ CONFIG_SLABINFO=y
+ CONFIG_RT_MUTEXES=y
+ # CONFIG_TINY_SHMEM is not set
+ CONFIG_BASE_SMALL=0
+ CONFIG_MODULES=y
++# CONFIG_MODULE_FORCE_LOAD is not set
+ CONFIG_MODULE_UNLOAD=y
+ # CONFIG_MODULE_FORCE_UNLOAD is not set
+ CONFIG_MODVERSIONS=y
+@@ -165,11 +171,11 @@ CONFIG_PPC_PMAC=y
+ CONFIG_PPC_PMAC64=y
+ # CONFIG_PPC_MAPLE is not set
+ # CONFIG_PPC_PASEMI is not set
+-# CONFIG_PPC_CELLEB is not set
+ # CONFIG_PPC_PS3 is not set
+ # CONFIG_PPC_CELL is not set
+ # CONFIG_PPC_CELL_NATIVE is not set
+ # CONFIG_PPC_IBM_CELL_BLADE is not set
++# CONFIG_PPC_CELLEB is not set
+ # CONFIG_PQ2ADS is not set
+ CONFIG_PPC_NATIVE=y
+ # CONFIG_IPIC is not set
+@@ -190,6 +196,7 @@ CONFIG_CPU_FREQ_TABLE=y
+ CONFIG_CPU_FREQ_STAT=y
+ # CONFIG_CPU_FREQ_STAT_DETAILS is not set
+ CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
++# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set
+ # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
+ # CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
+ # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
+@@ -224,7 +231,6 @@ CONFIG_PREEMPT_NONE=y
+ CONFIG_BINFMT_ELF=y
+ CONFIG_COMPAT_BINFMT_ELF=y
+ # CONFIG_BINFMT_MISC is not set
+-CONFIG_FORCE_MAX_ZONEORDER=13
+ CONFIG_HUGETLB_PAGE_SIZE_VARIABLE=y
+ CONFIG_IOMMU_VMERGE=y
+ CONFIG_IOMMU_HELPER=y
+@@ -248,12 +254,14 @@ CONFIG_FLATMEM=y
+ CONFIG_FLAT_NODE_MEM_MAP=y
+ # CONFIG_SPARSEMEM_STATIC is not set
+ CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
++CONFIG_PAGEFLAGS_EXTENDED=y
+ CONFIG_SPLIT_PTLOCK_CPUS=4
+ CONFIG_RESOURCES_64BIT=y
+ CONFIG_ZONE_DMA_FLAG=1
+ CONFIG_BOUNCE=y
+ # CONFIG_PPC_HAS_HASH_64K is not set
+ # CONFIG_PPC_64K_PAGES is not set
++CONFIG_FORCE_MAX_ZONEORDER=13
+ # CONFIG_SCHED_SMT is not set
+ CONFIG_PROC_DEVICETREE=y
+ # CONFIG_CMDLINE_BOOL is not set
+@@ -278,7 +286,10 @@ CONFIG_PCI_MSI=y
+ # CONFIG_PCI_DEBUG is not set
+ # CONFIG_PCCARD is not set
+ # CONFIG_HOTPLUG_PCI is not set
++# CONFIG_HAS_RAPIDIO is not set
++CONFIG_PAGE_OFFSET=0xc000000000000000
+ CONFIG_KERNEL_START=0xc000000000000000
++CONFIG_PHYSICAL_START=0x00000000
+ 
+ #
+ # Networking
+@@ -325,8 +336,6 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
+ # CONFIG_TCP_MD5SIG is not set
+ # CONFIG_IP_VS is not set
+ # CONFIG_IPV6 is not set
+-# CONFIG_INET6_XFRM_TUNNEL is not set
+-# CONFIG_INET6_TUNNEL is not set
+ # CONFIG_NETWORK_SECMARK is not set
+ CONFIG_NETFILTER=y
+ # CONFIG_NETFILTER_DEBUG is not set
+@@ -342,6 +351,7 @@ CONFIG_NF_CONNTRACK=m
+ # CONFIG_NF_CT_ACCT is not set
+ CONFIG_NF_CONNTRACK_MARK=y
+ CONFIG_NF_CONNTRACK_EVENTS=y
++# CONFIG_NF_CT_PROTO_DCCP is not set
+ # CONFIG_NF_CT_PROTO_SCTP is not set
+ # CONFIG_NF_CT_PROTO_UDPLITE is not set
+ # CONFIG_NF_CONNTRACK_AMANDA is not set
+@@ -418,6 +428,7 @@ CONFIG_FW_LOADER=y
+ # CONFIG_CONNECTOR is not set
+ # CONFIG_MTD is not set
+ CONFIG_OF_DEVICE=y
++CONFIG_OF_I2C=y
+ # CONFIG_PARPORT is not set
+ CONFIG_BLK_DEV=y
+ # CONFIG_BLK_DEV_FD is not set
+@@ -465,7 +476,6 @@ CONFIG_IDE_PROC_FS=y
+ #
+ # IDE chipset support/bugfixes
+ #
+-CONFIG_IDE_GENERIC=y
+ # CONFIG_BLK_DEV_PLATFORM is not set
+ CONFIG_BLK_DEV_IDEDMA_SFF=y
+ 
+@@ -506,7 +516,7 @@ CONFIG_BLK_DEV_IDE_PMAC=y
+ CONFIG_BLK_DEV_IDE_PMAC_ATA100FIRST=y
+ CONFIG_BLK_DEV_IDEDMA_PMAC=y
+ CONFIG_BLK_DEV_IDEDMA=y
+-CONFIG_IDE_ARCH_OBSOLETE_INIT=y
++# CONFIG_BLK_DEV_HD_ONLY is not set
+ # CONFIG_BLK_DEV_HD is not set
+ 
+ #
+@@ -584,61 +594,10 @@ CONFIG_SCSI_LOWLEVEL=y
+ # CONFIG_SCSI_SRP is not set
+ CONFIG_ATA=y
+ # CONFIG_ATA_NONSTANDARD is not set
++CONFIG_SATA_PMP=y
+ # CONFIG_SATA_AHCI is not set
+-CONFIG_SATA_SVW=y
+-# CONFIG_ATA_PIIX is not set
+-# CONFIG_SATA_MV is not set
+-# CONFIG_SATA_NV is not set
+-# CONFIG_PDC_ADMA is not set
+-# CONFIG_SATA_QSTOR is not set
+-# CONFIG_SATA_PROMISE is not set
+-# CONFIG_SATA_SX4 is not set
+-# CONFIG_SATA_SIL is not set
+ # CONFIG_SATA_SIL24 is not set
+-# CONFIG_SATA_SIS is not set
+-# CONFIG_SATA_ULI is not set
+-# CONFIG_SATA_VIA is not set
+-# CONFIG_SATA_VITESSE is not set
+-# CONFIG_SATA_INIC162X is not set
+-# CONFIG_PATA_ALI is not set
+-# CONFIG_PATA_AMD is not set
+-# CONFIG_PATA_ARTOP is not set
+-# CONFIG_PATA_ATIIXP is not set
+-# CONFIG_PATA_CMD640_PCI is not set
+-# CONFIG_PATA_CMD64X is not set
+-# CONFIG_PATA_CS5520 is not set
+-# CONFIG_PATA_CS5530 is not set
+-# CONFIG_PATA_CYPRESS is not set
+-# CONFIG_PATA_EFAR is not set
+-# CONFIG_ATA_GENERIC is not set
+-# CONFIG_PATA_HPT366 is not set
+-# CONFIG_PATA_HPT37X is not set
+-# CONFIG_PATA_HPT3X2N is not set
+-# CONFIG_PATA_HPT3X3 is not set
+-# CONFIG_PATA_IT821X is not set
+-# CONFIG_PATA_IT8213 is not set
+-# CONFIG_PATA_JMICRON is not set
+-# CONFIG_PATA_TRIFLEX is not set
+-# CONFIG_PATA_MARVELL is not set
+-# CONFIG_PATA_MPIIX is not set
+-# CONFIG_PATA_OLDPIIX is not set
+-# CONFIG_PATA_NETCELL is not set
+-# CONFIG_PATA_NINJA32 is not set
+-# CONFIG_PATA_NS87410 is not set
+-# CONFIG_PATA_NS87415 is not set
+-# CONFIG_PATA_OPTI is not set
+-# CONFIG_PATA_OPTIDMA is not set
+-# CONFIG_PATA_PDC_OLD is not set
+-# CONFIG_PATA_RADISYS is not set
+-# CONFIG_PATA_RZ1000 is not set
+-# CONFIG_PATA_SC1200 is not set
+-# CONFIG_PATA_SERVERWORKS is not set
+-# CONFIG_PATA_PDC2027X is not set
+-# CONFIG_PATA_SIL680 is not set
+-# CONFIG_PATA_SIS is not set
+-# CONFIG_PATA_VIA is not set
+-# CONFIG_PATA_WINBOND is not set
+-# CONFIG_PATA_PLATFORM is not set
++# CONFIG_ATA_SFF is not set
+ CONFIG_MD=y
+ CONFIG_BLK_DEV_MD=y
+ CONFIG_MD_LINEAR=y
+@@ -740,7 +699,6 @@ CONFIG_E1000=y
+ # CONFIG_SIS190 is not set
+ # CONFIG_SKGE is not set
+ # CONFIG_SKY2 is not set
+-# CONFIG_SK98LIN is not set
+ # CONFIG_VIA_VELOCITY is not set
+ CONFIG_TIGON3=y
+ # CONFIG_BNX2 is not set
+@@ -755,10 +713,10 @@ CONFIG_NETDEV_10000=y
+ # CONFIG_MYRI10GE is not set
+ # CONFIG_NETXEN_NIC is not set
+ # CONFIG_NIU is not set
+-# CONFIG_PASEMI_MAC is not set
+ # CONFIG_MLX4_CORE is not set
+ # CONFIG_TEHUTI is not set
+ # CONFIG_BNX2X is not set
++# CONFIG_SFC is not set
+ CONFIG_TR=y
+ CONFIG_IBMOL=y
+ # CONFIG_3C359 is not set
+@@ -769,6 +727,7 @@ CONFIG_IBMOL=y
+ #
+ # CONFIG_WLAN_PRE80211 is not set
+ # CONFIG_WLAN_80211 is not set
++# CONFIG_IWLWIFI_LEDS is not set
+ 
+ #
+ # USB Network Adapters
+@@ -865,6 +824,7 @@ CONFIG_VT=y
+ CONFIG_VT_CONSOLE=y
+ CONFIG_HW_CONSOLE=y
+ # CONFIG_VT_HW_CONSOLE_BINDING is not set
++CONFIG_DEVKMEM=y
+ # CONFIG_SERIAL_NONSTANDARD is not set
+ # CONFIG_NOZOMI is not set
+ 
+@@ -895,13 +855,7 @@ CONFIG_DEVPORT=y
+ CONFIG_I2C=y
+ CONFIG_I2C_BOARDINFO=y
+ CONFIG_I2C_CHARDEV=y
+-
+-#
+-# I2C Algorithms
+-#
+ CONFIG_I2C_ALGOBIT=y
+-# CONFIG_I2C_ALGOPCF is not set
+-# CONFIG_I2C_ALGOPCA is not set
+ 
+ #
+ # I2C Hardware Bus support
+@@ -930,6 +884,7 @@ CONFIG_I2C_POWERMAC=y
+ # CONFIG_I2C_VIA is not set
+ # CONFIG_I2C_VIAPRO is not set
+ # CONFIG_I2C_VOODOO3 is not set
++# CONFIG_I2C_PCA_PLATFORM is not set
+ 
+ #
+ # Miscellaneous I2C Chip support
+@@ -939,19 +894,13 @@ CONFIG_I2C_POWERMAC=y
+ # CONFIG_SENSORS_PCF8574 is not set
+ # CONFIG_PCF8575 is not set
+ # CONFIG_SENSORS_PCF8591 is not set
+-# CONFIG_TPS65010 is not set
+ # CONFIG_SENSORS_MAX6875 is not set
+ # CONFIG_SENSORS_TSL2550 is not set
+ # CONFIG_I2C_DEBUG_CORE is not set
+ # CONFIG_I2C_DEBUG_ALGO is not set
+ # CONFIG_I2C_DEBUG_BUS is not set
+ # CONFIG_I2C_DEBUG_CHIP is not set
+-
+-#
+-# SPI support
+-#
+ # CONFIG_SPI is not set
+-# CONFIG_SPI_MASTER is not set
+ # CONFIG_W1 is not set
+ # CONFIG_POWER_SUPPLY is not set
+ # CONFIG_HWMON is not set
+@@ -968,12 +917,22 @@ CONFIG_SSB_POSSIBLE=y
+ # Multifunction device drivers
+ #
+ # CONFIG_MFD_SM501 is not set
++# CONFIG_HTC_PASIC3 is not set
+ 
+ #
+ # Multimedia devices
+ #
++
++#
++# Multimedia core support
++#
+ # CONFIG_VIDEO_DEV is not set
+ # CONFIG_DVB_CORE is not set
++# CONFIG_VIDEO_MEDIA is not set
++
++#
++# Multimedia drivers
++#
+ CONFIG_DAB=y
+ # CONFIG_USB_DABUSB is not set
+ 
+@@ -995,8 +954,8 @@ CONFIG_FB_CFB_IMAGEBLIT=y
+ # CONFIG_FB_SYS_FILLRECT is not set
+ # CONFIG_FB_SYS_COPYAREA is not set
+ # CONFIG_FB_SYS_IMAGEBLIT is not set
++# CONFIG_FB_FOREIGN_ENDIAN is not set
+ # CONFIG_FB_SYS_FOPS is not set
+-CONFIG_FB_DEFERRED_IO=y
+ # CONFIG_FB_SVGALIB is not set
+ CONFIG_FB_MACMODES=y
+ CONFIG_FB_BACKLIGHT=y
+@@ -1112,6 +1071,7 @@ CONFIG_SND_VERBOSE_PROCFS=y
+ # CONFIG_SND_AU8810 is not set
+ # CONFIG_SND_AU8820 is not set
+ # CONFIG_SND_AU8830 is not set
++# CONFIG_SND_AW2 is not set
+ # CONFIG_SND_AZT3328 is not set
+ # CONFIG_SND_BT87X is not set
+ # CONFIG_SND_CA0106 is not set
+@@ -1198,11 +1158,11 @@ CONFIG_SND_USB_AUDIO=m
+ # CONFIG_SND_SOC is not set
+ 
+ #
+-# SoC Audio support for SuperH
++# ALSA SoC audio for Freescale SOCs
+ #
+ 
+ #
+-# ALSA SoC audio for Freescale SOCs
++# SoC Audio for the Texas Instruments OMAP
+ #
+ 
+ #
+@@ -1222,6 +1182,7 @@ CONFIG_USB_HID=y
+ CONFIG_HID_FF=y
+ CONFIG_HID_PID=y
+ CONFIG_LOGITECH_FF=y
++# CONFIG_LOGIRUMBLEPAD2_FF is not set
+ # CONFIG_PANTHERLORD_FF is not set
+ CONFIG_THRUSTMASTER_FF=y
+ # CONFIG_ZEROPLUS_FF is not set
+@@ -1245,11 +1206,13 @@ CONFIG_USB_DEVICE_CLASS=y
+ #
+ # USB Host Controller Drivers
+ #
++# CONFIG_USB_C67X00_HCD is not set
+ CONFIG_USB_EHCI_HCD=y
+ # CONFIG_USB_EHCI_ROOT_HUB_TT is not set
+ # CONFIG_USB_EHCI_TT_NEWSCHED is not set
+ # CONFIG_USB_EHCI_HCD_PPC_OF is not set
+ # CONFIG_USB_ISP116X_HCD is not set
++# CONFIG_USB_ISP1760_HCD is not set
+ CONFIG_USB_OHCI_HCD=y
+ CONFIG_USB_OHCI_HCD_PPC_OF=y
+ CONFIG_USB_OHCI_HCD_PPC_OF_BE=y
+@@ -1288,6 +1251,7 @@ CONFIG_USB_STORAGE_JUMPSHOT=y
+ # CONFIG_USB_STORAGE_ALAUDA is not set
+ # CONFIG_USB_STORAGE_ONETOUCH is not set
+ # CONFIG_USB_STORAGE_KARMA is not set
++# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
+ # CONFIG_USB_LIBUSUAL is not set
+ 
+ #
+@@ -1342,9 +1306,11 @@ CONFIG_USB_SERIAL_KOBIL_SCT=m
+ CONFIG_USB_SERIAL_MCT_U232=m
+ # CONFIG_USB_SERIAL_MOS7720 is not set
+ # CONFIG_USB_SERIAL_MOS7840 is not set
++# CONFIG_USB_SERIAL_MOTOROLA is not set
+ # CONFIG_USB_SERIAL_NAVMAN is not set
+ CONFIG_USB_SERIAL_PL2303=m
+ # CONFIG_USB_SERIAL_OTI6858 is not set
++# CONFIG_USB_SERIAL_SPCP8X5 is not set
+ # CONFIG_USB_SERIAL_HP4X is not set
+ CONFIG_USB_SERIAL_SAFE=m
+ CONFIG_USB_SERIAL_SAFE_PADDED=y
+@@ -1383,14 +1349,11 @@ CONFIG_USB_APPLEDISPLAY=m
+ # CONFIG_MMC is not set
+ # CONFIG_MEMSTICK is not set
+ # CONFIG_NEW_LEDS is not set
++# CONFIG_ACCESSIBILITY is not set
+ # CONFIG_INFINIBAND is not set
+ # CONFIG_EDAC is not set
+ # CONFIG_RTC_CLASS is not set
+ # CONFIG_DMADEVICES is not set
+-
+-#
+-# Userspace I/O
+-#
+ # CONFIG_UIO is not set
+ 
+ #
+@@ -1420,9 +1383,9 @@ CONFIG_REISERFS_FS_SECURITY=y
+ CONFIG_FS_POSIX_ACL=y
+ CONFIG_XFS_FS=m
+ # CONFIG_XFS_QUOTA is not set
+-CONFIG_XFS_SECURITY=y
+ CONFIG_XFS_POSIX_ACL=y
+ # CONFIG_XFS_RT is not set
++# CONFIG_XFS_DEBUG is not set
+ # CONFIG_GFS2_FS is not set
+ # CONFIG_OCFS2_FS is not set
+ CONFIG_DNOTIFY=y
+@@ -1488,13 +1451,11 @@ CONFIG_NFS_FS=y
+ CONFIG_NFS_V3=y
+ CONFIG_NFS_V3_ACL=y
+ CONFIG_NFS_V4=y
+-# CONFIG_NFS_DIRECTIO is not set
+ CONFIG_NFSD=y
+ CONFIG_NFSD_V2_ACL=y
+ CONFIG_NFSD_V3=y
+ CONFIG_NFSD_V3_ACL=y
+ CONFIG_NFSD_V4=y
+-CONFIG_NFSD_TCP=y
+ CONFIG_LOCKD=y
+ CONFIG_LOCKD_V4=y
+ CONFIG_EXPORTFS=y
+@@ -1583,9 +1544,10 @@ CONFIG_NLS_UTF8=y
+ # Library routines
+ #
+ CONFIG_BITREVERSE=y
++# CONFIG_GENERIC_FIND_FIRST_BIT is not set
+ CONFIG_CRC_CCITT=m
+ # CONFIG_CRC16 is not set
+-# CONFIG_CRC_ITU_T is not set
++CONFIG_CRC_ITU_T=m
+ CONFIG_CRC32=y
+ # CONFIG_CRC7 is not set
+ CONFIG_LIBCRC32C=m
+@@ -1603,6 +1565,7 @@ CONFIG_HAVE_LMB=y
+ # CONFIG_PRINTK_TIME is not set
+ CONFIG_ENABLE_WARN_DEPRECATED=y
+ CONFIG_ENABLE_MUST_CHECK=y
++CONFIG_FRAME_WARN=2048
+ CONFIG_MAGIC_SYSRQ=y
+ # CONFIG_UNUSED_SYMBOLS is not set
+ CONFIG_DEBUG_FS=y
+@@ -1613,18 +1576,23 @@ CONFIG_DETECT_SOFTLOCKUP=y
+ CONFIG_SCHED_DEBUG=y
+ # CONFIG_SCHEDSTATS is not set
+ # CONFIG_TIMER_STATS is not set
++# CONFIG_DEBUG_OBJECTS is not set
+ # CONFIG_SLUB_DEBUG_ON is not set
+ # CONFIG_SLUB_STATS is not set
+ # CONFIG_DEBUG_RT_MUTEXES is not set
+ # CONFIG_RT_MUTEX_TESTER is not set
+ # CONFIG_DEBUG_SPINLOCK is not set
+ CONFIG_DEBUG_MUTEXES=y
++# CONFIG_DEBUG_LOCK_ALLOC is not set
++# CONFIG_PROVE_LOCKING is not set
++# CONFIG_LOCK_STAT is not set
+ # CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+ # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+ # CONFIG_DEBUG_KOBJECT is not set
+ CONFIG_DEBUG_BUGVERBOSE=y
+ # CONFIG_DEBUG_INFO is not set
+ # CONFIG_DEBUG_VM is not set
++# CONFIG_DEBUG_WRITECOUNT is not set
+ # CONFIG_DEBUG_LIST is not set
+ # CONFIG_DEBUG_SG is not set
+ # CONFIG_BOOT_PRINTK_DELAY is not set
+@@ -1648,53 +1616,83 @@ CONFIG_BOOTX_TEXT=y
+ # CONFIG_SECURITY is not set
+ # CONFIG_SECURITY_FILE_CAPABILITIES is not set
+ CONFIG_CRYPTO=y
++
++#
++# Crypto core or helper
++#
+ CONFIG_CRYPTO_ALGAPI=y
+ CONFIG_CRYPTO_AEAD=m
+ CONFIG_CRYPTO_BLKCIPHER=y
+-# CONFIG_CRYPTO_SEQIV is not set
+ CONFIG_CRYPTO_HASH=y
+ CONFIG_CRYPTO_MANAGER=y
++# CONFIG_CRYPTO_GF128MUL is not set
++CONFIG_CRYPTO_NULL=m
++# CONFIG_CRYPTO_CRYPTD is not set
++CONFIG_CRYPTO_AUTHENC=m
++CONFIG_CRYPTO_TEST=m
++
++#
++# Authenticated Encryption with Associated Data
++#
++# CONFIG_CRYPTO_CCM is not set
++# CONFIG_CRYPTO_GCM is not set
++# CONFIG_CRYPTO_SEQIV is not set
++
++#
++# Block modes
++#
++CONFIG_CRYPTO_CBC=y
++# CONFIG_CRYPTO_CTR is not set
++# CONFIG_CRYPTO_CTS is not set
++CONFIG_CRYPTO_ECB=m
++# CONFIG_CRYPTO_LRW is not set
++CONFIG_CRYPTO_PCBC=m
++# CONFIG_CRYPTO_XTS is not set
++
++#
++# Hash modes
++#
+ CONFIG_CRYPTO_HMAC=y
+ # CONFIG_CRYPTO_XCBC is not set
+-CONFIG_CRYPTO_NULL=m
++
++#
++# Digest
++#
++CONFIG_CRYPTO_CRC32C=m
+ CONFIG_CRYPTO_MD4=m
+ CONFIG_CRYPTO_MD5=y
++CONFIG_CRYPTO_MICHAEL_MIC=m
+ CONFIG_CRYPTO_SHA1=m
+ CONFIG_CRYPTO_SHA256=m
+ CONFIG_CRYPTO_SHA512=m
+-CONFIG_CRYPTO_WP512=m
+ # CONFIG_CRYPTO_TGR192 is not set
+-# CONFIG_CRYPTO_GF128MUL is not set
+-CONFIG_CRYPTO_ECB=m
+-CONFIG_CRYPTO_CBC=y
+-CONFIG_CRYPTO_PCBC=m
+-# CONFIG_CRYPTO_LRW is not set
+-# CONFIG_CRYPTO_XTS is not set
+-# CONFIG_CRYPTO_CTR is not set
+-# CONFIG_CRYPTO_GCM is not set
+-# CONFIG_CRYPTO_CCM is not set
+-# CONFIG_CRYPTO_CRYPTD is not set
+-CONFIG_CRYPTO_DES=y
+-# CONFIG_CRYPTO_FCRYPT is not set
+-CONFIG_CRYPTO_BLOWFISH=m
+-CONFIG_CRYPTO_TWOFISH=m
+-CONFIG_CRYPTO_TWOFISH_COMMON=m
+-CONFIG_CRYPTO_SERPENT=m
++CONFIG_CRYPTO_WP512=m
++
++#
++# Ciphers
++#
+ CONFIG_CRYPTO_AES=m
++CONFIG_CRYPTO_ANUBIS=m
++CONFIG_CRYPTO_ARC4=m
++CONFIG_CRYPTO_BLOWFISH=m
++# CONFIG_CRYPTO_CAMELLIA is not set
+ CONFIG_CRYPTO_CAST5=m
+ CONFIG_CRYPTO_CAST6=m
+-CONFIG_CRYPTO_TEA=m
+-CONFIG_CRYPTO_ARC4=m
++CONFIG_CRYPTO_DES=y
++# CONFIG_CRYPTO_FCRYPT is not set
+ CONFIG_CRYPTO_KHAZAD=m
+-CONFIG_CRYPTO_ANUBIS=m
+-# CONFIG_CRYPTO_SEED is not set
+ # CONFIG_CRYPTO_SALSA20 is not set
++# CONFIG_CRYPTO_SEED is not set
++CONFIG_CRYPTO_SERPENT=m
++CONFIG_CRYPTO_TEA=m
++CONFIG_CRYPTO_TWOFISH=m
++CONFIG_CRYPTO_TWOFISH_COMMON=m
++
++#
++# Compression
++#
+ CONFIG_CRYPTO_DEFLATE=m
+-CONFIG_CRYPTO_MICHAEL_MIC=m
+-CONFIG_CRYPTO_CRC32C=m
+-# CONFIG_CRYPTO_CAMELLIA is not set
+-CONFIG_CRYPTO_TEST=m
+-CONFIG_CRYPTO_AUTHENC=m
+ # CONFIG_CRYPTO_LZO is not set
+ # CONFIG_CRYPTO_HW is not set
+ # CONFIG_PPC_CLOCK is not set
++# CONFIG_VIRTUALIZATION is not set
+diff --git a/arch/powerpc/configs/iseries_defconfig b/arch/powerpc/configs/iseries_defconfig
+index b3128fb..63f0bdb 100644
+--- a/arch/powerpc/configs/iseries_defconfig
++++ b/arch/powerpc/configs/iseries_defconfig
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.25-rc6
+-# Thu Mar 27 13:55:45 2008
++# Linux kernel version: 2.6.26-rc3
++# Tue May 20 20:01:36 2008
+ #
+ CONFIG_PPC64=y
+ 
+@@ -30,6 +30,9 @@ CONFIG_GENERIC_CLOCKEVENTS=y
+ CONFIG_GENERIC_HARDIRQS=y
+ CONFIG_HAVE_SETUP_PER_CPU_AREA=y
+ CONFIG_IRQ_PER_CPU=y
++CONFIG_STACKTRACE_SUPPORT=y
++CONFIG_TRACE_IRQFLAGS_SUPPORT=y
++CONFIG_LOCKDEP_SUPPORT=y
+ CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+ CONFIG_ARCH_HAS_ILOG2_U32=y
+ CONFIG_ARCH_HAS_ILOG2_U64=y
+@@ -91,6 +94,7 @@ CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+ CONFIG_SYSCTL=y
+ # CONFIG_EMBEDDED is not set
+ CONFIG_SYSCTL_SYSCALL=y
++CONFIG_SYSCTL_SYSCALL_CHECK=y
+ CONFIG_KALLSYMS=y
+ # CONFIG_KALLSYMS_ALL is not set
+ # CONFIG_KALLSYMS_EXTRA_PASS is not set
+@@ -118,12 +122,14 @@ CONFIG_HAVE_OPROFILE=y
+ # CONFIG_KPROBES is not set
+ CONFIG_HAVE_KPROBES=y
+ CONFIG_HAVE_KRETPROBES=y
++# CONFIG_HAVE_DMA_ATTRS is not set
+ CONFIG_PROC_PAGE_MONITOR=y
+ CONFIG_SLABINFO=y
+ CONFIG_RT_MUTEXES=y
+ # CONFIG_TINY_SHMEM is not set
+ CONFIG_BASE_SMALL=0
+ CONFIG_MODULES=y
++# CONFIG_MODULE_FORCE_LOAD is not set
+ CONFIG_MODULE_UNLOAD=y
+ # CONFIG_MODULE_FORCE_UNLOAD is not set
+ CONFIG_MODVERSIONS=y
+@@ -172,11 +178,11 @@ CONFIG_VIOPATH=y
+ # CONFIG_PPC_PMAC is not set
+ # CONFIG_PPC_MAPLE is not set
+ # CONFIG_PPC_PASEMI is not set
+-# CONFIG_PPC_CELLEB is not set
+ # CONFIG_PPC_PS3 is not set
+ # CONFIG_PPC_CELL is not set
+ # CONFIG_PPC_CELL_NATIVE is not set
+ # CONFIG_PPC_IBM_CELL_BLADE is not set
++# CONFIG_PPC_CELLEB is not set
+ # CONFIG_PQ2ADS is not set
+ # CONFIG_IPIC is not set
+ # CONFIG_MPIC is not set
+@@ -212,7 +218,6 @@ CONFIG_PREEMPT_NONE=y
+ CONFIG_BINFMT_ELF=y
+ CONFIG_COMPAT_BINFMT_ELF=y
+ # CONFIG_BINFMT_MISC is not set
+-CONFIG_FORCE_MAX_ZONEORDER=13
+ CONFIG_IOMMU_VMERGE=y
+ CONFIG_IOMMU_HELPER=y
+ CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
+@@ -234,12 +239,14 @@ CONFIG_FLATMEM=y
+ CONFIG_FLAT_NODE_MEM_MAP=y
+ # CONFIG_SPARSEMEM_STATIC is not set
+ CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
++CONFIG_PAGEFLAGS_EXTENDED=y
+ CONFIG_SPLIT_PTLOCK_CPUS=4
+ CONFIG_RESOURCES_64BIT=y
+ CONFIG_ZONE_DMA_FLAG=1
+ CONFIG_BOUNCE=y
+ # CONFIG_PPC_HAS_HASH_64K is not set
+ # CONFIG_PPC_64K_PAGES is not set
++CONFIG_FORCE_MAX_ZONEORDER=13
+ # CONFIG_SCHED_SMT is not set
+ CONFIG_PROC_DEVICETREE=y
+ # CONFIG_CMDLINE_BOOL is not set
+@@ -263,7 +270,10 @@ CONFIG_ARCH_SUPPORTS_MSI=y
+ # CONFIG_PCI_DEBUG is not set
+ # CONFIG_PCCARD is not set
+ # CONFIG_HOTPLUG_PCI is not set
++# CONFIG_HAS_RAPIDIO is not set
++CONFIG_PAGE_OFFSET=0xc000000000000000
+ CONFIG_KERNEL_START=0xc000000000000000
++CONFIG_PHYSICAL_START=0x00000000
+ 
+ #
+ # Networking
+@@ -310,8 +320,6 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
+ # CONFIG_TCP_MD5SIG is not set
+ # CONFIG_IP_VS is not set
+ # CONFIG_IPV6 is not set
+-# CONFIG_INET6_XFRM_TUNNEL is not set
+-# CONFIG_INET6_TUNNEL is not set
+ # CONFIG_NETWORK_SECMARK is not set
+ CONFIG_NETFILTER=y
+ # CONFIG_NETFILTER_DEBUG is not set
+@@ -327,6 +335,7 @@ CONFIG_NF_CONNTRACK=m
+ # CONFIG_NF_CT_ACCT is not set
+ CONFIG_NF_CONNTRACK_MARK=y
+ CONFIG_NF_CONNTRACK_EVENTS=y
++# CONFIG_NF_CT_PROTO_DCCP is not set
+ # CONFIG_NF_CT_PROTO_SCTP is not set
+ # CONFIG_NF_CT_PROTO_UDPLITE is not set
+ # CONFIG_NF_CONNTRACK_AMANDA is not set
+@@ -631,7 +640,6 @@ CONFIG_MII=y
+ # CONFIG_IBM_NEW_EMAC_EMAC4 is not set
+ CONFIG_NET_PCI=y
+ CONFIG_PCNET32=y
+-CONFIG_PCNET32_NAPI=y
+ # CONFIG_AMD8111_ETH is not set
+ # CONFIG_ADAPTEC_STARFIRE is not set
+ # CONFIG_B44 is not set
+@@ -667,7 +675,6 @@ CONFIG_E1000=m
+ # CONFIG_SIS190 is not set
+ # CONFIG_SKGE is not set
+ # CONFIG_SKY2 is not set
+-# CONFIG_SK98LIN is not set
+ # CONFIG_VIA_VELOCITY is not set
+ # CONFIG_TIGON3 is not set
+ # CONFIG_BNX2 is not set
+@@ -682,10 +689,10 @@ CONFIG_NETDEV_10000=y
+ # CONFIG_MYRI10GE is not set
+ # CONFIG_NETXEN_NIC is not set
+ # CONFIG_NIU is not set
+-# CONFIG_PASEMI_MAC is not set
+ # CONFIG_MLX4_CORE is not set
+ # CONFIG_TEHUTI is not set
+ # CONFIG_BNX2X is not set
++# CONFIG_SFC is not set
+ CONFIG_TR=y
+ CONFIG_IBMOL=y
+ # CONFIG_3C359 is not set
+@@ -696,6 +703,7 @@ CONFIG_IBMOL=y
+ #
+ # CONFIG_WLAN_PRE80211 is not set
+ # CONFIG_WLAN_80211 is not set
++# CONFIG_IWLWIFI_LEDS is not set
+ # CONFIG_WAN is not set
+ CONFIG_ISERIES_VETH=y
+ # CONFIG_FDDI is not set
+@@ -762,6 +770,7 @@ CONFIG_VT=y
+ CONFIG_VT_CONSOLE=y
+ CONFIG_HW_CONSOLE=y
+ # CONFIG_VT_HW_CONSOLE_BINDING is not set
++CONFIG_DEVKMEM=y
+ # CONFIG_SERIAL_NONSTANDARD is not set
+ # CONFIG_NOZOMI is not set
+ 
+@@ -793,12 +802,7 @@ CONFIG_MAX_RAW_DEVS=256
+ # CONFIG_TCG_TPM is not set
+ CONFIG_DEVPORT=y
+ # CONFIG_I2C is not set
+-
+-#
+-# SPI support
+-#
+ # CONFIG_SPI is not set
+-# CONFIG_SPI_MASTER is not set
+ # CONFIG_W1 is not set
+ # CONFIG_POWER_SUPPLY is not set
+ # CONFIG_HWMON is not set
+@@ -815,12 +819,22 @@ CONFIG_SSB_POSSIBLE=y
+ # Multifunction device drivers
+ #
+ # CONFIG_MFD_SM501 is not set
++# CONFIG_HTC_PASIC3 is not set
+ 
+ #
+ # Multimedia devices
+ #
++
++#
++# Multimedia core support
++#
+ # CONFIG_VIDEO_DEV is not set
+ # CONFIG_DVB_CORE is not set
++# CONFIG_VIDEO_MEDIA is not set
++
++#
++# Multimedia drivers
++#
+ # CONFIG_DAB is not set
+ 
+ #
+@@ -854,14 +868,11 @@ CONFIG_DUMMY_CONSOLE=y
+ # CONFIG_MMC is not set
+ # CONFIG_MEMSTICK is not set
+ # CONFIG_NEW_LEDS is not set
++# CONFIG_ACCESSIBILITY is not set
+ # CONFIG_INFINIBAND is not set
+ # CONFIG_EDAC is not set
+ # CONFIG_RTC_CLASS is not set
+ # CONFIG_DMADEVICES is not set
+-
+-#
+-# Userspace I/O
+-#
+ # CONFIG_UIO is not set
+ 
+ #
+@@ -895,9 +906,9 @@ CONFIG_JFS_SECURITY=y
+ CONFIG_FS_POSIX_ACL=y
+ CONFIG_XFS_FS=m
+ # CONFIG_XFS_QUOTA is not set
+-CONFIG_XFS_SECURITY=y
+ CONFIG_XFS_POSIX_ACL=y
+ # CONFIG_XFS_RT is not set
++# CONFIG_XFS_DEBUG is not set
+ CONFIG_GFS2_FS=m
+ CONFIG_GFS2_FS_LOCKING_NOLOCK=m
+ CONFIG_GFS2_FS_LOCKING_DLM=m
+@@ -966,13 +977,11 @@ CONFIG_NFS_FS=y
+ CONFIG_NFS_V3=y
+ CONFIG_NFS_V3_ACL=y
+ CONFIG_NFS_V4=y
+-# CONFIG_NFS_DIRECTIO is not set
+ CONFIG_NFSD=m
+ CONFIG_NFSD_V2_ACL=y
+ CONFIG_NFSD_V3=y
+ CONFIG_NFSD_V3_ACL=y
+ CONFIG_NFSD_V4=y
+-CONFIG_NFSD_TCP=y
+ CONFIG_LOCKD=y
+ CONFIG_LOCKD_V4=y
+ CONFIG_EXPORTFS=m
+@@ -1047,9 +1056,10 @@ CONFIG_DLM=m
+ # Library routines
+ #
+ CONFIG_BITREVERSE=y
++# CONFIG_GENERIC_FIND_FIRST_BIT is not set
+ CONFIG_CRC_CCITT=m
+ # CONFIG_CRC16 is not set
+-# CONFIG_CRC_ITU_T is not set
++CONFIG_CRC_ITU_T=m
+ CONFIG_CRC32=y
+ # CONFIG_CRC7 is not set
+ CONFIG_LIBCRC32C=m
+@@ -1071,6 +1081,7 @@ CONFIG_HAVE_LMB=y
+ # CONFIG_PRINTK_TIME is not set
+ CONFIG_ENABLE_WARN_DEPRECATED=y
+ CONFIG_ENABLE_MUST_CHECK=y
++CONFIG_FRAME_WARN=2048
+ CONFIG_MAGIC_SYSRQ=y
+ # CONFIG_UNUSED_SYMBOLS is not set
+ CONFIG_DEBUG_FS=y
+@@ -1081,18 +1092,23 @@ CONFIG_DETECT_SOFTLOCKUP=y
+ CONFIG_SCHED_DEBUG=y
+ # CONFIG_SCHEDSTATS is not set
+ # CONFIG_TIMER_STATS is not set
++# CONFIG_DEBUG_OBJECTS is not set
+ # CONFIG_SLUB_DEBUG_ON is not set
+ # CONFIG_SLUB_STATS is not set
+ # CONFIG_DEBUG_RT_MUTEXES is not set
+ # CONFIG_RT_MUTEX_TESTER is not set
+ # CONFIG_DEBUG_SPINLOCK is not set
+ # CONFIG_DEBUG_MUTEXES is not set
++# CONFIG_DEBUG_LOCK_ALLOC is not set
++# CONFIG_PROVE_LOCKING is not set
++# CONFIG_LOCK_STAT is not set
+ # CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+ # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+ # CONFIG_DEBUG_KOBJECT is not set
+ CONFIG_DEBUG_BUGVERBOSE=y
+ # CONFIG_DEBUG_INFO is not set
+ # CONFIG_DEBUG_VM is not set
++# CONFIG_DEBUG_WRITECOUNT is not set
+ # CONFIG_DEBUG_LIST is not set
+ # CONFIG_DEBUG_SG is not set
+ # CONFIG_BOOT_PRINTK_DELAY is not set
+@@ -1116,53 +1132,83 @@ CONFIG_IRQSTACKS=y
+ # CONFIG_SECURITY is not set
+ # CONFIG_SECURITY_FILE_CAPABILITIES is not set
+ CONFIG_CRYPTO=y
++
++#
++# Crypto core or helper
++#
+ CONFIG_CRYPTO_ALGAPI=y
+ CONFIG_CRYPTO_AEAD=m
+ CONFIG_CRYPTO_BLKCIPHER=y
+-# CONFIG_CRYPTO_SEQIV is not set
+ CONFIG_CRYPTO_HASH=y
+ CONFIG_CRYPTO_MANAGER=y
++# CONFIG_CRYPTO_GF128MUL is not set
++CONFIG_CRYPTO_NULL=m
++# CONFIG_CRYPTO_CRYPTD is not set
++CONFIG_CRYPTO_AUTHENC=m
++CONFIG_CRYPTO_TEST=m
++
++#
++# Authenticated Encryption with Associated Data
++#
++# CONFIG_CRYPTO_CCM is not set
++# CONFIG_CRYPTO_GCM is not set
++# CONFIG_CRYPTO_SEQIV is not set
++
++#
++# Block modes
++#
++CONFIG_CRYPTO_CBC=y
++# CONFIG_CRYPTO_CTR is not set
++# CONFIG_CRYPTO_CTS is not set
++CONFIG_CRYPTO_ECB=m
++# CONFIG_CRYPTO_LRW is not set
++CONFIG_CRYPTO_PCBC=m
++# CONFIG_CRYPTO_XTS is not set
++
++#
++# Hash modes
++#
+ CONFIG_CRYPTO_HMAC=y
+ # CONFIG_CRYPTO_XCBC is not set
+-CONFIG_CRYPTO_NULL=m
++
++#
++# Digest
++#
++CONFIG_CRYPTO_CRC32C=m
+ CONFIG_CRYPTO_MD4=m
+ CONFIG_CRYPTO_MD5=y
++CONFIG_CRYPTO_MICHAEL_MIC=m
+ CONFIG_CRYPTO_SHA1=m
+ CONFIG_CRYPTO_SHA256=m
+ CONFIG_CRYPTO_SHA512=m
+-CONFIG_CRYPTO_WP512=m
+ CONFIG_CRYPTO_TGR192=m
+-# CONFIG_CRYPTO_GF128MUL is not set
+-CONFIG_CRYPTO_ECB=m
+-CONFIG_CRYPTO_CBC=y
+-CONFIG_CRYPTO_PCBC=m
+-# CONFIG_CRYPTO_LRW is not set
+-# CONFIG_CRYPTO_XTS is not set
+-# CONFIG_CRYPTO_CTR is not set
+-# CONFIG_CRYPTO_GCM is not set
+-# CONFIG_CRYPTO_CCM is not set
+-# CONFIG_CRYPTO_CRYPTD is not set
+-CONFIG_CRYPTO_DES=y
+-# CONFIG_CRYPTO_FCRYPT is not set
+-CONFIG_CRYPTO_BLOWFISH=m
+-CONFIG_CRYPTO_TWOFISH=m
+-CONFIG_CRYPTO_TWOFISH_COMMON=m
+-CONFIG_CRYPTO_SERPENT=m
++CONFIG_CRYPTO_WP512=m
++
++#
++# Ciphers
++#
+ CONFIG_CRYPTO_AES=m
++CONFIG_CRYPTO_ANUBIS=m
++CONFIG_CRYPTO_ARC4=m
++CONFIG_CRYPTO_BLOWFISH=m
++# CONFIG_CRYPTO_CAMELLIA is not set
+ CONFIG_CRYPTO_CAST5=m
+ CONFIG_CRYPTO_CAST6=m
+-CONFIG_CRYPTO_TEA=m
+-CONFIG_CRYPTO_ARC4=m
++CONFIG_CRYPTO_DES=y
++# CONFIG_CRYPTO_FCRYPT is not set
+ CONFIG_CRYPTO_KHAZAD=m
+-CONFIG_CRYPTO_ANUBIS=m
+-CONFIG_CRYPTO_SEED=m
+ # CONFIG_CRYPTO_SALSA20 is not set
++CONFIG_CRYPTO_SEED=m
++CONFIG_CRYPTO_SERPENT=m
++CONFIG_CRYPTO_TEA=m
++CONFIG_CRYPTO_TWOFISH=m
++CONFIG_CRYPTO_TWOFISH_COMMON=m
++
++#
++# Compression
++#
+ CONFIG_CRYPTO_DEFLATE=m
+-CONFIG_CRYPTO_MICHAEL_MIC=m
+-CONFIG_CRYPTO_CRC32C=m
+-# CONFIG_CRYPTO_CAMELLIA is not set
+-CONFIG_CRYPTO_TEST=m
+-CONFIG_CRYPTO_AUTHENC=m
+ # CONFIG_CRYPTO_LZO is not set
+ # CONFIG_CRYPTO_HW is not set
+ # CONFIG_PPC_CLOCK is not set
++# CONFIG_VIRTUALIZATION is not set
+diff --git a/arch/powerpc/configs/pmac32_defconfig b/arch/powerpc/configs/pmac32_defconfig
+index fca1142..3688e4b 100644
+--- a/arch/powerpc/configs/pmac32_defconfig
++++ b/arch/powerpc/configs/pmac32_defconfig
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.25-rc6
+-# Thu Mar 27 13:56:21 2008
++# Linux kernel version: 2.6.26-rc3
++# Tue May 20 20:02:24 2008
+ #
+ # CONFIG_PPC64 is not set
+ 
+@@ -31,6 +31,8 @@ CONFIG_GENERIC_CLOCKEVENTS=y
+ CONFIG_GENERIC_HARDIRQS=y
+ # CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
+ CONFIG_IRQ_PER_CPU=y
++CONFIG_STACKTRACE_SUPPORT=y
++CONFIG_LOCKDEP_SUPPORT=y
+ CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+ CONFIG_ARCH_HAS_ILOG2_U32=y
+ CONFIG_GENERIC_HWEIGHT=y
+@@ -91,6 +93,7 @@ CONFIG_INITRAMFS_SOURCE=""
+ CONFIG_SYSCTL=y
+ # CONFIG_EMBEDDED is not set
+ CONFIG_SYSCTL_SYSCALL=y
++CONFIG_SYSCTL_SYSCALL_CHECK=y
+ CONFIG_KALLSYMS=y
+ # CONFIG_KALLSYMS_ALL is not set
+ # CONFIG_KALLSYMS_EXTRA_PASS is not set
+@@ -119,12 +122,14 @@ CONFIG_HAVE_OPROFILE=y
+ # CONFIG_KPROBES is not set
+ CONFIG_HAVE_KPROBES=y
+ CONFIG_HAVE_KRETPROBES=y
++# CONFIG_HAVE_DMA_ATTRS is not set
+ CONFIG_PROC_PAGE_MONITOR=y
+ CONFIG_SLABINFO=y
+ CONFIG_RT_MUTEXES=y
+ # CONFIG_TINY_SHMEM is not set
+ CONFIG_BASE_SMALL=0
+ CONFIG_MODULES=y
++# CONFIG_MODULE_FORCE_LOAD is not set
+ CONFIG_MODULE_UNLOAD=y
+ CONFIG_MODULE_FORCE_UNLOAD=y
+ # CONFIG_MODVERSIONS is not set
+@@ -185,6 +190,7 @@ CONFIG_CPU_FREQ_TABLE=y
+ CONFIG_CPU_FREQ_STAT=y
+ # CONFIG_CPU_FREQ_STAT_DETAILS is not set
+ CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
++# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set
+ # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
+ # CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
+ # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
+@@ -236,16 +242,17 @@ CONFIG_FLATMEM=y
+ CONFIG_FLAT_NODE_MEM_MAP=y
+ # CONFIG_SPARSEMEM_STATIC is not set
+ # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
++CONFIG_PAGEFLAGS_EXTENDED=y
+ CONFIG_SPLIT_PTLOCK_CPUS=4
+ # CONFIG_RESOURCES_64BIT is not set
+ CONFIG_ZONE_DMA_FLAG=1
+ CONFIG_BOUNCE=y
+ CONFIG_VIRT_TO_BUS=y
++CONFIG_FORCE_MAX_ZONEORDER=11
+ CONFIG_PROC_DEVICETREE=y
+ # CONFIG_CMDLINE_BOOL is not set
+ CONFIG_ARCH_WANTS_FREEZER_CONTROL=y
+ CONFIG_PM=y
+-# CONFIG_PM_LEGACY is not set
+ CONFIG_PM_DEBUG=y
+ # CONFIG_PM_VERBOSE is not set
+ CONFIG_CAN_PM_TRACE=y
+@@ -292,6 +299,7 @@ CONFIG_YENTA_TOSHIBA=y
+ # CONFIG_I82092 is not set
+ CONFIG_PCCARD_NONSTATIC=m
+ # CONFIG_HOTPLUG_PCI is not set
++# CONFIG_HAS_RAPIDIO is not set
+ 
+ #
+ # Advanced setup
+@@ -301,11 +309,11 @@ CONFIG_PCCARD_NONSTATIC=m
+ #
+ # Default settings for advanced configuration options are used
+ #
+-CONFIG_HIGHMEM_START=0xfe000000
+ CONFIG_LOWMEM_SIZE=0x30000000
++CONFIG_PAGE_OFFSET=0xc0000000
+ CONFIG_KERNEL_START=0xc0000000
++CONFIG_PHYSICAL_START=0x00000000
+ CONFIG_TASK_SIZE=0xc0000000
+-CONFIG_BOOT_LOAD=0x00800000
+ 
+ #
+ # Networking
+@@ -352,8 +360,6 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
+ # CONFIG_TCP_MD5SIG is not set
+ # CONFIG_IP_VS is not set
+ # CONFIG_IPV6 is not set
+-# CONFIG_INET6_XFRM_TUNNEL is not set
+-# CONFIG_INET6_TUNNEL is not set
+ # CONFIG_NETWORK_SECMARK is not set
+ CONFIG_NETFILTER=y
+ # CONFIG_NETFILTER_DEBUG is not set
+@@ -369,6 +375,7 @@ CONFIG_NF_CONNTRACK=m
+ # CONFIG_NF_CT_ACCT is not set
+ # CONFIG_NF_CONNTRACK_MARK is not set
+ # CONFIG_NF_CONNTRACK_EVENTS is not set
++CONFIG_NF_CT_PROTO_DCCP=m
+ # CONFIG_NF_CT_PROTO_SCTP is not set
+ # CONFIG_NF_CT_PROTO_UDPLITE is not set
+ # CONFIG_NF_CONNTRACK_AMANDA is not set
+@@ -445,6 +452,7 @@ CONFIG_IP_NF_TARGET_MASQUERADE=m
+ CONFIG_IP_NF_TARGET_REDIRECT=m
+ CONFIG_IP_NF_TARGET_NETMAP=m
+ # CONFIG_NF_NAT_SNMP_BASIC is not set
++CONFIG_NF_NAT_PROTO_DCCP=m
+ CONFIG_NF_NAT_FTP=m
+ CONFIG_NF_NAT_IRC=m
+ CONFIG_NF_NAT_TFTP=m
+@@ -586,7 +594,6 @@ CONFIG_MAC80211=m
+ # Rate control algorithm selection
+ #
+ CONFIG_MAC80211_RC_DEFAULT_PID=y
+-# CONFIG_MAC80211_RC_DEFAULT_SIMPLE is not set
+ # CONFIG_MAC80211_RC_DEFAULT_NONE is not set
+ 
+ #
+@@ -598,7 +605,7 @@ CONFIG_MAC80211_RC_DEFAULT_PID=y
+ #
+ CONFIG_MAC80211_RC_DEFAULT="pid"
+ CONFIG_MAC80211_RC_PID=y
+-# CONFIG_MAC80211_RC_SIMPLE is not set
++# CONFIG_MAC80211_MESH is not set
+ CONFIG_MAC80211_LEDS=y
+ # CONFIG_MAC80211_DEBUG_PACKET_ALIGNMENT is not set
+ # CONFIG_MAC80211_DEBUG is not set
+@@ -607,7 +614,6 @@ CONFIG_IEEE80211=m
+ CONFIG_IEEE80211_CRYPT_WEP=m
+ CONFIG_IEEE80211_CRYPT_CCMP=m
+ CONFIG_IEEE80211_CRYPT_TKIP=m
+-# CONFIG_IEEE80211_SOFTMAC is not set
+ # CONFIG_RFKILL is not set
+ # CONFIG_NET_9P is not set
+ 
+@@ -629,6 +635,7 @@ CONFIG_CONNECTOR=y
+ CONFIG_PROC_EVENTS=y
+ # CONFIG_MTD is not set
+ CONFIG_OF_DEVICE=y
++CONFIG_OF_I2C=y
+ # CONFIG_PARPORT is not set
+ CONFIG_BLK_DEV=y
+ # CONFIG_BLK_DEV_FD is not set
+@@ -720,7 +727,7 @@ CONFIG_BLK_DEV_IDE_PMAC=y
+ CONFIG_BLK_DEV_IDE_PMAC_ATA100FIRST=y
+ CONFIG_BLK_DEV_IDEDMA_PMAC=y
+ CONFIG_BLK_DEV_IDEDMA=y
+-CONFIG_IDE_ARCH_OBSOLETE_INIT=y
++# CONFIG_BLK_DEV_HD_ONLY is not set
+ # CONFIG_BLK_DEV_HD is not set
+ 
+ #
+@@ -906,7 +913,6 @@ CONFIG_SUNGEM=y
+ # CONFIG_IBM_NEW_EMAC_EMAC4 is not set
+ CONFIG_NET_PCI=y
+ CONFIG_PCNET32=y
+-# CONFIG_PCNET32_NAPI is not set
+ # CONFIG_AMD8111_ETH is not set
+ # CONFIG_ADAPTEC_STARFIRE is not set
+ # CONFIG_B44 is not set
+@@ -940,7 +946,6 @@ CONFIG_NETDEV_1000=y
+ # CONFIG_SIS190 is not set
+ # CONFIG_SKGE is not set
+ # CONFIG_SKY2 is not set
+-# CONFIG_SK98LIN is not set
+ # CONFIG_VIA_VELOCITY is not set
+ # CONFIG_TIGON3 is not set
+ # CONFIG_BNX2 is not set
+@@ -959,6 +964,7 @@ CONFIG_NETDEV_10000=y
+ # CONFIG_MLX4_CORE is not set
+ # CONFIG_TEHUTI is not set
+ # CONFIG_BNX2X is not set
++# CONFIG_SFC is not set
+ # CONFIG_TR is not set
+ 
+ #
+@@ -992,6 +998,8 @@ CONFIG_P54_COMMON=m
+ # CONFIG_P54_USB is not set
+ # CONFIG_P54_PCI is not set
+ # CONFIG_ATH5K is not set
++# CONFIG_IWLCORE is not set
++# CONFIG_IWLWIFI_LEDS is not set
+ # CONFIG_IWL4965 is not set
+ # CONFIG_IWL3945 is not set
+ # CONFIG_HOSTAP is not set
+@@ -1110,6 +1118,7 @@ CONFIG_VT=y
+ CONFIG_VT_CONSOLE=y
+ CONFIG_HW_CONSOLE=y
+ # CONFIG_VT_HW_CONSOLE_BINDING is not set
++CONFIG_DEVKMEM=y
+ # CONFIG_SERIAL_NONSTANDARD is not set
+ # CONFIG_NOZOMI is not set
+ 
+@@ -1156,13 +1165,7 @@ CONFIG_DEVPORT=y
+ CONFIG_I2C=y
+ CONFIG_I2C_BOARDINFO=y
+ CONFIG_I2C_CHARDEV=m
+-
+-#
+-# I2C Algorithms
+-#
+ CONFIG_I2C_ALGOBIT=y
+-# CONFIG_I2C_ALGOPCF is not set
+-# CONFIG_I2C_ALGOPCA is not set
+ 
+ #
+ # I2C Hardware Bus support
+@@ -1192,6 +1195,7 @@ CONFIG_I2C_POWERMAC=y
+ # CONFIG_I2C_VIA is not set
+ # CONFIG_I2C_VIAPRO is not set
+ # CONFIG_I2C_VOODOO3 is not set
++# CONFIG_I2C_PCA_PLATFORM is not set
+ 
+ #
+ # Miscellaneous I2C Chip support
+@@ -1201,19 +1205,13 @@ CONFIG_I2C_POWERMAC=y
+ # CONFIG_SENSORS_PCF8574 is not set
+ # CONFIG_PCF8575 is not set
+ # CONFIG_SENSORS_PCF8591 is not set
+-# CONFIG_TPS65010 is not set
+ # CONFIG_SENSORS_MAX6875 is not set
+ # CONFIG_SENSORS_TSL2550 is not set
+ # CONFIG_I2C_DEBUG_CORE is not set
+ # CONFIG_I2C_DEBUG_ALGO is not set
+ # CONFIG_I2C_DEBUG_BUS is not set
+ # CONFIG_I2C_DEBUG_CHIP is not set
+-
+-#
+-# SPI support
+-#
+ # CONFIG_SPI is not set
+-# CONFIG_SPI_MASTER is not set
+ # CONFIG_W1 is not set
+ CONFIG_POWER_SUPPLY=y
+ # CONFIG_POWER_SUPPLY_DEBUG is not set
+@@ -1230,6 +1228,7 @@ CONFIG_BATTERY_PMU=y
+ #
+ CONFIG_SSB_POSSIBLE=y
+ CONFIG_SSB=m
++CONFIG_SSB_SPROM=y
+ CONFIG_SSB_PCIHOST_POSSIBLE=y
+ CONFIG_SSB_PCIHOST=y
+ CONFIG_SSB_B43_PCI_BRIDGE=y
+@@ -1243,12 +1242,22 @@ CONFIG_SSB_DRIVER_PCICORE=y
+ # Multifunction device drivers
+ #
+ # CONFIG_MFD_SM501 is not set
++# CONFIG_HTC_PASIC3 is not set
+ 
+ #
+ # Multimedia devices
+ #
++
++#
++# Multimedia core support
++#
+ # CONFIG_VIDEO_DEV is not set
+ # CONFIG_DVB_CORE is not set
++# CONFIG_VIDEO_MEDIA is not set
++
++#
++# Multimedia drivers
++#
+ # CONFIG_DAB is not set
+ 
+ #
+@@ -1276,8 +1285,8 @@ CONFIG_FB_CFB_IMAGEBLIT=y
+ # CONFIG_FB_SYS_FILLRECT is not set
+ # CONFIG_FB_SYS_COPYAREA is not set
+ # CONFIG_FB_SYS_IMAGEBLIT is not set
++# CONFIG_FB_FOREIGN_ENDIAN is not set
+ # CONFIG_FB_SYS_FOPS is not set
+-CONFIG_FB_DEFERRED_IO=y
+ # CONFIG_FB_SVGALIB is not set
+ CONFIG_FB_MACMODES=y
+ CONFIG_FB_BACKLIGHT=y
+@@ -1413,6 +1422,7 @@ CONFIG_SND_DUMMY=m
+ # CONFIG_SND_AU8810 is not set
+ # CONFIG_SND_AU8820 is not set
+ # CONFIG_SND_AU8830 is not set
++# CONFIG_SND_AW2 is not set
+ # CONFIG_SND_AZT3328 is not set
+ # CONFIG_SND_BT87X is not set
+ # CONFIG_SND_CA0106 is not set
+@@ -1505,11 +1515,11 @@ CONFIG_SND_USB_AUDIO=m
+ # CONFIG_SND_SOC is not set
+ 
+ #
+-# SoC Audio support for SuperH
++# ALSA SoC audio for Freescale SOCs
+ #
+ 
+ #
+-# ALSA SoC audio for Freescale SOCs
++# SoC Audio for the Texas Instruments OMAP
+ #
+ 
+ #
+@@ -1543,17 +1553,18 @@ CONFIG_USB_DEVICEFS=y
+ CONFIG_USB_DEVICE_CLASS=y
+ CONFIG_USB_DYNAMIC_MINORS=y
+ # CONFIG_USB_SUSPEND is not set
+-# CONFIG_USB_PERSIST is not set
+ # CONFIG_USB_OTG is not set
+ 
+ #
+ # USB Host Controller Drivers
+ #
++# CONFIG_USB_C67X00_HCD is not set
+ CONFIG_USB_EHCI_HCD=m
+ CONFIG_USB_EHCI_ROOT_HUB_TT=y
+ # CONFIG_USB_EHCI_TT_NEWSCHED is not set
+ # CONFIG_USB_EHCI_HCD_PPC_OF is not set
+ # CONFIG_USB_ISP116X_HCD is not set
++# CONFIG_USB_ISP1760_HCD is not set
+ CONFIG_USB_OHCI_HCD=y
+ # CONFIG_USB_OHCI_HCD_PPC_OF is not set
+ # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
+@@ -1587,7 +1598,9 @@ CONFIG_USB_STORAGE=m
+ # CONFIG_USB_STORAGE_SDDR55 is not set
+ # CONFIG_USB_STORAGE_JUMPSHOT is not set
+ # CONFIG_USB_STORAGE_ALAUDA is not set
++CONFIG_USB_STORAGE_ONETOUCH=y
+ # CONFIG_USB_STORAGE_KARMA is not set
++# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
+ # CONFIG_USB_LIBUSUAL is not set
+ 
+ #
+@@ -1642,9 +1655,11 @@ CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y
+ # CONFIG_USB_SERIAL_MCT_U232 is not set
+ # CONFIG_USB_SERIAL_MOS7720 is not set
+ # CONFIG_USB_SERIAL_MOS7840 is not set
++# CONFIG_USB_SERIAL_MOTOROLA is not set
+ # CONFIG_USB_SERIAL_NAVMAN is not set
+ # CONFIG_USB_SERIAL_PL2303 is not set
+ # CONFIG_USB_SERIAL_OTI6858 is not set
++# CONFIG_USB_SERIAL_SPCP8X5 is not set
+ # CONFIG_USB_SERIAL_HP4X is not set
+ # CONFIG_USB_SERIAL_SAFE is not set
+ # CONFIG_USB_SERIAL_SIERRAWIRELESS is not set
+@@ -1695,14 +1710,12 @@ CONFIG_LEDS_TRIGGERS=y
+ # CONFIG_LEDS_TRIGGER_TIMER is not set
+ CONFIG_LEDS_TRIGGER_IDE_DISK=y
+ # CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
++CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
++# CONFIG_ACCESSIBILITY is not set
+ # CONFIG_INFINIBAND is not set
+ # CONFIG_EDAC is not set
+ # CONFIG_RTC_CLASS is not set
+ # CONFIG_DMADEVICES is not set
+-
+-#
+-# Userspace I/O
+-#
+ # CONFIG_UIO is not set
+ 
+ #
+@@ -1786,13 +1799,11 @@ CONFIG_NFS_FS=y
+ CONFIG_NFS_V3=y
+ CONFIG_NFS_V3_ACL=y
+ CONFIG_NFS_V4=y
+-# CONFIG_NFS_DIRECTIO is not set
+ CONFIG_NFSD=m
+ CONFIG_NFSD_V2_ACL=y
+ CONFIG_NFSD_V3=y
+ CONFIG_NFSD_V3_ACL=y
+ CONFIG_NFSD_V4=y
+-CONFIG_NFSD_TCP=y
+ CONFIG_LOCKD=y
+ CONFIG_LOCKD_V4=y
+ CONFIG_EXPORTFS=m
+@@ -1877,9 +1888,10 @@ CONFIG_NLS_UTF8=m
+ # Library routines
+ #
+ CONFIG_BITREVERSE=y
++# CONFIG_GENERIC_FIND_FIRST_BIT is not set
+ CONFIG_CRC_CCITT=y
+ CONFIG_CRC16=y
+-# CONFIG_CRC_ITU_T is not set
++CONFIG_CRC_ITU_T=m
+ CONFIG_CRC32=y
+ # CONFIG_CRC7 is not set
+ CONFIG_LIBCRC32C=m
+@@ -1901,6 +1913,7 @@ CONFIG_HAVE_LMB=y
+ # CONFIG_PRINTK_TIME is not set
+ CONFIG_ENABLE_WARN_DEPRECATED=y
+ CONFIG_ENABLE_MUST_CHECK=y
++CONFIG_FRAME_WARN=1024
+ CONFIG_MAGIC_SYSRQ=y
+ # CONFIG_UNUSED_SYMBOLS is not set
+ # CONFIG_DEBUG_FS is not set
+@@ -1911,6 +1924,7 @@ CONFIG_DETECT_SOFTLOCKUP=y
+ CONFIG_SCHED_DEBUG=y
+ # CONFIG_SCHEDSTATS is not set
+ # CONFIG_TIMER_STATS is not set
++# CONFIG_DEBUG_OBJECTS is not set
+ # CONFIG_SLUB_DEBUG_ON is not set
+ # CONFIG_SLUB_STATS is not set
+ # CONFIG_DEBUG_RT_MUTEXES is not set
+@@ -1923,6 +1937,7 @@ CONFIG_SCHED_DEBUG=y
+ CONFIG_DEBUG_BUGVERBOSE=y
+ # CONFIG_DEBUG_INFO is not set
+ # CONFIG_DEBUG_VM is not set
++# CONFIG_DEBUG_WRITECOUNT is not set
+ # CONFIG_DEBUG_LIST is not set
+ # CONFIG_DEBUG_SG is not set
+ # CONFIG_BOOT_PRINTK_DELAY is not set
+@@ -1936,6 +1951,7 @@ CONFIG_DEBUGGER=y
+ CONFIG_XMON=y
+ CONFIG_XMON_DEFAULT=y
+ CONFIG_XMON_DISASSEMBLY=y
++CONFIG_IRQSTACKS=y
+ # CONFIG_BDI_SWITCH is not set
+ CONFIG_BOOTX_TEXT=y
+ # CONFIG_PPC_EARLY_DEBUG is not set
+@@ -1947,54 +1963,84 @@ CONFIG_BOOTX_TEXT=y
+ # CONFIG_SECURITY is not set
+ # CONFIG_SECURITY_FILE_CAPABILITIES is not set
+ CONFIG_CRYPTO=y
++
++#
++# Crypto core or helper
++#
+ CONFIG_CRYPTO_ALGAPI=y
+ CONFIG_CRYPTO_AEAD=y
+ CONFIG_CRYPTO_BLKCIPHER=y
+-# CONFIG_CRYPTO_SEQIV is not set
+ CONFIG_CRYPTO_HASH=y
+ CONFIG_CRYPTO_MANAGER=y
++# CONFIG_CRYPTO_GF128MUL is not set
++CONFIG_CRYPTO_NULL=m
++# CONFIG_CRYPTO_CRYPTD is not set
++CONFIG_CRYPTO_AUTHENC=y
++# CONFIG_CRYPTO_TEST is not set
++
++#
++# Authenticated Encryption with Associated Data
++#
++# CONFIG_CRYPTO_CCM is not set
++# CONFIG_CRYPTO_GCM is not set
++# CONFIG_CRYPTO_SEQIV is not set
++
++#
++# Block modes
++#
++CONFIG_CRYPTO_CBC=y
++# CONFIG_CRYPTO_CTR is not set
++# CONFIG_CRYPTO_CTS is not set
++CONFIG_CRYPTO_ECB=m
++# CONFIG_CRYPTO_LRW is not set
++CONFIG_CRYPTO_PCBC=m
++# CONFIG_CRYPTO_XTS is not set
++
++#
++# Hash modes
++#
+ CONFIG_CRYPTO_HMAC=y
+ # CONFIG_CRYPTO_XCBC is not set
+-CONFIG_CRYPTO_NULL=m
++
++#
++# Digest
++#
++CONFIG_CRYPTO_CRC32C=m
+ CONFIG_CRYPTO_MD4=m
+ CONFIG_CRYPTO_MD5=y
++CONFIG_CRYPTO_MICHAEL_MIC=m
+ CONFIG_CRYPTO_SHA1=y
+ CONFIG_CRYPTO_SHA256=m
+ CONFIG_CRYPTO_SHA512=m
+-CONFIG_CRYPTO_WP512=m
+ CONFIG_CRYPTO_TGR192=m
+-# CONFIG_CRYPTO_GF128MUL is not set
+-CONFIG_CRYPTO_ECB=m
+-CONFIG_CRYPTO_CBC=y
+-CONFIG_CRYPTO_PCBC=m
+-# CONFIG_CRYPTO_LRW is not set
+-# CONFIG_CRYPTO_XTS is not set
+-# CONFIG_CRYPTO_CTR is not set
+-# CONFIG_CRYPTO_GCM is not set
+-# CONFIG_CRYPTO_CCM is not set
+-# CONFIG_CRYPTO_CRYPTD is not set
+-CONFIG_CRYPTO_DES=y
+-# CONFIG_CRYPTO_FCRYPT is not set
+-CONFIG_CRYPTO_BLOWFISH=m
+-CONFIG_CRYPTO_TWOFISH=m
+-CONFIG_CRYPTO_TWOFISH_COMMON=m
+-CONFIG_CRYPTO_SERPENT=m
++CONFIG_CRYPTO_WP512=m
++
++#
++# Ciphers
++#
+ CONFIG_CRYPTO_AES=m
++CONFIG_CRYPTO_ANUBIS=m
++CONFIG_CRYPTO_ARC4=m
++CONFIG_CRYPTO_BLOWFISH=m
++# CONFIG_CRYPTO_CAMELLIA is not set
+ CONFIG_CRYPTO_CAST5=m
+ CONFIG_CRYPTO_CAST6=m
+-CONFIG_CRYPTO_TEA=m
+-CONFIG_CRYPTO_ARC4=m
++CONFIG_CRYPTO_DES=y
++# CONFIG_CRYPTO_FCRYPT is not set
+ CONFIG_CRYPTO_KHAZAD=m
+-CONFIG_CRYPTO_ANUBIS=m
+-# CONFIG_CRYPTO_SEED is not set
+ # CONFIG_CRYPTO_SALSA20 is not set
++# CONFIG_CRYPTO_SEED is not set
++CONFIG_CRYPTO_SERPENT=m
++CONFIG_CRYPTO_TEA=m
++CONFIG_CRYPTO_TWOFISH=m
++CONFIG_CRYPTO_TWOFISH_COMMON=m
++
++#
++# Compression
++#
+ CONFIG_CRYPTO_DEFLATE=m
+-CONFIG_CRYPTO_MICHAEL_MIC=m
+-CONFIG_CRYPTO_CRC32C=m
+-# CONFIG_CRYPTO_CAMELLIA is not set
+-# CONFIG_CRYPTO_TEST is not set
+-CONFIG_CRYPTO_AUTHENC=y
+ # CONFIG_CRYPTO_LZO is not set
+ CONFIG_CRYPTO_HW=y
+ # CONFIG_CRYPTO_DEV_HIFN_795X is not set
+ # CONFIG_PPC_CLOCK is not set
++# CONFIG_VIRTUALIZATION is not set
+diff --git a/arch/powerpc/configs/ppc64_defconfig b/arch/powerpc/configs/ppc64_defconfig
+index 970282b..40f84fa 100644
+--- a/arch/powerpc/configs/ppc64_defconfig
++++ b/arch/powerpc/configs/ppc64_defconfig
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.25-rc6
+-# Thu Mar 27 13:56:24 2008
++# Linux kernel version: 2.6.26-rc3
++# Tue May 20 20:03:02 2008
+ #
+ CONFIG_PPC64=y
+ 
+@@ -30,6 +30,9 @@ CONFIG_GENERIC_CLOCKEVENTS=y
+ CONFIG_GENERIC_HARDIRQS=y
+ CONFIG_HAVE_SETUP_PER_CPU_AREA=y
+ CONFIG_IRQ_PER_CPU=y
++CONFIG_STACKTRACE_SUPPORT=y
++CONFIG_TRACE_IRQFLAGS_SUPPORT=y
++CONFIG_LOCKDEP_SUPPORT=y
+ CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+ CONFIG_ARCH_HAS_ILOG2_U32=y
+ CONFIG_ARCH_HAS_ILOG2_U64=y
+@@ -82,6 +85,7 @@ CONFIG_LOG_BUF_SHIFT=17
+ CONFIG_CGROUPS=y
+ # CONFIG_CGROUP_DEBUG is not set
+ # CONFIG_CGROUP_NS is not set
++# CONFIG_CGROUP_DEVICE is not set
+ CONFIG_CPUSETS=y
+ # CONFIG_GROUP_SCHED is not set
+ # CONFIG_CGROUP_CPUACCT is not set
+@@ -101,6 +105,7 @@ CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+ CONFIG_SYSCTL=y
+ # CONFIG_EMBEDDED is not set
+ CONFIG_SYSCTL_SYSCALL=y
++CONFIG_SYSCTL_SYSCALL_CHECK=y
+ CONFIG_KALLSYMS=y
+ CONFIG_KALLSYMS_ALL=y
+ # CONFIG_KALLSYMS_EXTRA_PASS is not set
+@@ -108,6 +113,7 @@ CONFIG_HOTPLUG=y
+ CONFIG_PRINTK=y
+ CONFIG_BUG=y
+ CONFIG_ELF_CORE=y
++CONFIG_PCSPKR_PLATFORM=y
+ # CONFIG_COMPAT_BRK is not set
+ CONFIG_BASE_FULL=y
+ CONFIG_FUTEX=y
+@@ -129,12 +135,14 @@ CONFIG_HAVE_OPROFILE=y
+ # CONFIG_KPROBES is not set
+ CONFIG_HAVE_KPROBES=y
+ CONFIG_HAVE_KRETPROBES=y
++# CONFIG_HAVE_DMA_ATTRS is not set
+ CONFIG_PROC_PAGE_MONITOR=y
+ CONFIG_SLABINFO=y
+ CONFIG_RT_MUTEXES=y
+ # CONFIG_TINY_SHMEM is not set
+ CONFIG_BASE_SMALL=0
+ CONFIG_MODULES=y
++# CONFIG_MODULE_FORCE_LOAD is not set
+ CONFIG_MODULE_UNLOAD=y
+ # CONFIG_MODULE_FORCE_UNLOAD is not set
+ CONFIG_MODVERSIONS=y
+@@ -194,11 +202,11 @@ CONFIG_PPC_PASEMI=y
+ CONFIG_PPC_PASEMI_IOMMU=y
+ # CONFIG_PPC_PASEMI_IOMMU_DMA_FORCE is not set
+ CONFIG_PPC_PASEMI_MDIO=y
+-CONFIG_PPC_CELLEB=y
+ # CONFIG_PPC_PS3 is not set
+ CONFIG_PPC_CELL=y
+ CONFIG_PPC_CELL_NATIVE=y
+ CONFIG_PPC_IBM_CELL_BLADE=y
++CONFIG_PPC_CELLEB=y
+ 
+ #
+ # Cell Broadband Engine options
+@@ -241,6 +249,7 @@ CONFIG_CPU_FREQ_TABLE=y
+ CONFIG_CPU_FREQ_STAT=y
+ # CONFIG_CPU_FREQ_STAT_DETAILS is not set
+ CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
++# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set
+ # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
+ # CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
+ # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
+@@ -277,7 +286,6 @@ CONFIG_PREEMPT_NONE=y
+ CONFIG_BINFMT_ELF=y
+ CONFIG_COMPAT_BINFMT_ELF=y
+ CONFIG_BINFMT_MISC=m
+-CONFIG_FORCE_MAX_ZONEORDER=13
+ CONFIG_HUGETLB_PAGE_SIZE_VARIABLE=y
+ CONFIG_IOMMU_VMERGE=y
+ CONFIG_IOMMU_HELPER=y
+@@ -307,6 +315,7 @@ CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
+ CONFIG_SPARSEMEM_VMEMMAP=y
+ CONFIG_MEMORY_HOTPLUG=y
+ CONFIG_MEMORY_HOTPLUG_SPARSE=y
++CONFIG_PAGEFLAGS_EXTENDED=y
+ CONFIG_SPLIT_PTLOCK_CPUS=4
+ CONFIG_RESOURCES_64BIT=y
+ CONFIG_ZONE_DMA_FLAG=1
+@@ -314,6 +323,7 @@ CONFIG_BOUNCE=y
+ CONFIG_ARCH_MEMORY_PROBE=y
+ CONFIG_PPC_HAS_HASH_64K=y
+ # CONFIG_PPC_64K_PAGES is not set
++CONFIG_FORCE_MAX_ZONEORDER=13
+ # CONFIG_SCHED_SMT is not set
+ CONFIG_PROC_DEVICETREE=y
+ # CONFIG_CMDLINE_BOOL is not set
+@@ -356,7 +366,10 @@ CONFIG_HOTPLUG_PCI=m
+ # CONFIG_HOTPLUG_PCI_SHPC is not set
+ CONFIG_HOTPLUG_PCI_RPA=m
+ CONFIG_HOTPLUG_PCI_RPA_DLPAR=m
++# CONFIG_HAS_RAPIDIO is not set
++CONFIG_PAGE_OFFSET=0xc000000000000000
+ CONFIG_KERNEL_START=0xc000000000000000
++CONFIG_PHYSICAL_START=0x00000000
+ 
+ #
+ # Networking
+@@ -406,8 +419,6 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
+ # CONFIG_TCP_MD5SIG is not set
+ # CONFIG_IP_VS is not set
+ # CONFIG_IPV6 is not set
+-# CONFIG_INET6_XFRM_TUNNEL is not set
+-# CONFIG_INET6_TUNNEL is not set
+ # CONFIG_NETWORK_SECMARK is not set
+ CONFIG_NETFILTER=y
+ # CONFIG_NETFILTER_DEBUG is not set
+@@ -423,6 +434,7 @@ CONFIG_NF_CONNTRACK=m
+ CONFIG_NF_CT_ACCT=y
+ CONFIG_NF_CONNTRACK_MARK=y
+ CONFIG_NF_CONNTRACK_EVENTS=y
++# CONFIG_NF_CT_PROTO_DCCP is not set
+ CONFIG_NF_CT_PROTO_GRE=m
+ CONFIG_NF_CT_PROTO_SCTP=m
+ # CONFIG_NF_CT_PROTO_UDPLITE is not set
+@@ -501,6 +513,7 @@ CONFIG_IP_NF_TARGET_REDIRECT=m
+ CONFIG_IP_NF_TARGET_NETMAP=m
+ CONFIG_NF_NAT_SNMP_BASIC=m
+ CONFIG_NF_NAT_PROTO_GRE=m
++CONFIG_NF_NAT_PROTO_SCTP=m
+ CONFIG_NF_NAT_FTP=m
+ CONFIG_NF_NAT_IRC=m
+ CONFIG_NF_NAT_TFTP=m
+@@ -571,6 +584,7 @@ CONFIG_FW_LOADER=y
+ # CONFIG_CONNECTOR is not set
+ # CONFIG_MTD is not set
+ CONFIG_OF_DEVICE=y
++CONFIG_OF_I2C=y
+ # CONFIG_PARPORT is not set
+ CONFIG_BLK_DEV=y
+ CONFIG_BLK_DEV_FD=y
+@@ -618,7 +632,6 @@ CONFIG_IDE_PROC_FS=y
+ #
+ # IDE chipset support/bugfixes
+ #
+-CONFIG_IDE_GENERIC=y
+ # CONFIG_BLK_DEV_PLATFORM is not set
+ CONFIG_BLK_DEV_IDEDMA_SFF=y
+ 
+@@ -661,7 +674,7 @@ CONFIG_BLK_DEV_IDE_PMAC=y
+ CONFIG_BLK_DEV_IDE_PMAC_ATA100FIRST=y
+ CONFIG_BLK_DEV_IDEDMA_PMAC=y
+ CONFIG_BLK_DEV_IDEDMA=y
+-CONFIG_IDE_ARCH_OBSOLETE_INIT=y
++# CONFIG_BLK_DEV_HD_ONLY is not set
+ # CONFIG_BLK_DEV_HD is not set
+ 
+ #
+@@ -747,64 +760,10 @@ CONFIG_SCSI_DEBUG=m
+ # CONFIG_SCSI_LOWLEVEL_PCMCIA is not set
+ CONFIG_ATA=y
+ CONFIG_ATA_NONSTANDARD=y
++CONFIG_SATA_PMP=y
+ # CONFIG_SATA_AHCI is not set
+-CONFIG_SATA_SVW=y
+-# CONFIG_ATA_PIIX is not set
+-CONFIG_SATA_MV=y
+-# CONFIG_SATA_NV is not set
+-# CONFIG_PDC_ADMA is not set
+-# CONFIG_SATA_QSTOR is not set
+-# CONFIG_SATA_PROMISE is not set
+-# CONFIG_SATA_SX4 is not set
+-# CONFIG_SATA_SIL is not set
+ CONFIG_SATA_SIL24=y
+-# CONFIG_SATA_SIS is not set
+-# CONFIG_SATA_ULI is not set
+-# CONFIG_SATA_VIA is not set
+-# CONFIG_SATA_VITESSE is not set
+-# CONFIG_SATA_INIC162X is not set
+-# CONFIG_PATA_ALI is not set
+-# CONFIG_PATA_AMD is not set
+-# CONFIG_PATA_ARTOP is not set
+-# CONFIG_PATA_ATIIXP is not set
+-# CONFIG_PATA_CMD640_PCI is not set
+-# CONFIG_PATA_CMD64X is not set
+-# CONFIG_PATA_CS5520 is not set
+-# CONFIG_PATA_CS5530 is not set
+-# CONFIG_PATA_CYPRESS is not set
+-# CONFIG_PATA_EFAR is not set
+-# CONFIG_ATA_GENERIC is not set
+-# CONFIG_PATA_HPT366 is not set
+-# CONFIG_PATA_HPT37X is not set
+-# CONFIG_PATA_HPT3X2N is not set
+-# CONFIG_PATA_HPT3X3 is not set
+-# CONFIG_PATA_IT821X is not set
+-# CONFIG_PATA_IT8213 is not set
+-# CONFIG_PATA_JMICRON is not set
+-# CONFIG_PATA_TRIFLEX is not set
+-# CONFIG_PATA_MARVELL is not set
+-# CONFIG_PATA_MPIIX is not set
+-# CONFIG_PATA_OLDPIIX is not set
+-# CONFIG_PATA_NETCELL is not set
+-# CONFIG_PATA_NINJA32 is not set
+-# CONFIG_PATA_NS87410 is not set
+-# CONFIG_PATA_NS87415 is not set
+-# CONFIG_PATA_OPTI is not set
+-# CONFIG_PATA_OPTIDMA is not set
+-CONFIG_PATA_PCMCIA=y
+-# CONFIG_PATA_PDC_OLD is not set
+-# CONFIG_PATA_RADISYS is not set
+-# CONFIG_PATA_RZ1000 is not set
+-# CONFIG_PATA_SC1200 is not set
+-# CONFIG_PATA_SERVERWORKS is not set
+-# CONFIG_PATA_PDC2027X is not set
+-# CONFIG_PATA_SIL680 is not set
+-# CONFIG_PATA_SIS is not set
+-# CONFIG_PATA_VIA is not set
+-CONFIG_PATA_WINBOND=y
+-CONFIG_PATA_PLATFORM=y
+-# CONFIG_PATA_OF_PLATFORM is not set
+-CONFIG_PATA_SCC=y
++# CONFIG_ATA_SFF is not set
+ CONFIG_MD=y
+ CONFIG_BLK_DEV_MD=y
+ CONFIG_MD_LINEAR=y
+@@ -866,6 +825,7 @@ CONFIG_WINDFARM=y
+ CONFIG_WINDFARM_PM81=y
+ CONFIG_WINDFARM_PM91=y
+ CONFIG_WINDFARM_PM112=y
++CONFIG_WINDFARM_PM121=y
+ # CONFIG_PMAC_RACKMETER is not set
+ CONFIG_NETDEVICES=y
+ # CONFIG_NETDEVICES_MULTIQUEUE is not set
+@@ -911,7 +871,6 @@ CONFIG_IBM_NEW_EMAC_TAH=y
+ CONFIG_IBM_NEW_EMAC_EMAC4=y
+ CONFIG_NET_PCI=y
+ CONFIG_PCNET32=y
+-# CONFIG_PCNET32_NAPI is not set
+ # CONFIG_AMD8111_ETH is not set
+ # CONFIG_ADAPTEC_STARFIRE is not set
+ # CONFIG_B44 is not set
+@@ -947,7 +906,6 @@ CONFIG_E1000=y
+ # CONFIG_SIS190 is not set
+ # CONFIG_SKGE is not set
+ # CONFIG_SKY2 is not set
+-# CONFIG_SK98LIN is not set
+ # CONFIG_VIA_VELOCITY is not set
+ CONFIG_TIGON3=y
+ # CONFIG_BNX2 is not set
+@@ -969,6 +927,7 @@ CONFIG_PASEMI_MAC=y
+ # CONFIG_MLX4_CORE is not set
+ # CONFIG_TEHUTI is not set
+ # CONFIG_BNX2X is not set
++# CONFIG_SFC is not set
+ CONFIG_TR=y
+ CONFIG_IBMOL=y
+ # CONFIG_3C359 is not set
+@@ -979,6 +938,7 @@ CONFIG_IBMOL=y
+ #
+ # CONFIG_WLAN_PRE80211 is not set
+ # CONFIG_WLAN_80211 is not set
++# CONFIG_IWLWIFI_LEDS is not set
+ 
+ #
+ # USB Network Adapters
+@@ -1083,6 +1043,7 @@ CONFIG_VT=y
+ CONFIG_VT_CONSOLE=y
+ CONFIG_HW_CONSOLE=y
+ # CONFIG_VT_HW_CONSOLE_BINDING is not set
++CONFIG_DEVKMEM=y
+ # CONFIG_SERIAL_NONSTANDARD is not set
+ # CONFIG_NOZOMI is not set
+ 
+@@ -1121,8 +1082,6 @@ CONFIG_HVC_BEAT=y
+ CONFIG_HVCS=m
+ # CONFIG_IPMI_HANDLER is not set
+ # CONFIG_HW_RANDOM is not set
+-CONFIG_GEN_RTC=y
+-# CONFIG_GEN_RTC_X is not set
+ # CONFIG_R3964 is not set
+ # CONFIG_APPLICOM is not set
+ 
+@@ -1141,13 +1100,7 @@ CONFIG_DEVPORT=y
+ CONFIG_I2C=y
+ CONFIG_I2C_BOARDINFO=y
+ CONFIG_I2C_CHARDEV=y
+-
+-#
+-# I2C Algorithms
+-#
+ CONFIG_I2C_ALGOBIT=y
+-# CONFIG_I2C_ALGOPCF is not set
+-# CONFIG_I2C_ALGOPCA is not set
+ 
+ #
+ # I2C Hardware Bus support
+@@ -1177,6 +1130,7 @@ CONFIG_I2C_PASEMI=y
+ # CONFIG_I2C_VIA is not set
+ # CONFIG_I2C_VIAPRO is not set
+ # CONFIG_I2C_VOODOO3 is not set
++# CONFIG_I2C_PCA_PLATFORM is not set
+ 
+ #
+ # Miscellaneous I2C Chip support
+@@ -1186,19 +1140,13 @@ CONFIG_I2C_PASEMI=y
+ # CONFIG_SENSORS_PCF8574 is not set
+ # CONFIG_PCF8575 is not set
+ # CONFIG_SENSORS_PCF8591 is not set
+-# CONFIG_TPS65010 is not set
+ # CONFIG_SENSORS_MAX6875 is not set
+ # CONFIG_SENSORS_TSL2550 is not set
+ # CONFIG_I2C_DEBUG_CORE is not set
+ # CONFIG_I2C_DEBUG_ALGO is not set
+ # CONFIG_I2C_DEBUG_BUS is not set
+ # CONFIG_I2C_DEBUG_CHIP is not set
+-
+-#
+-# SPI support
+-#
+ # CONFIG_SPI is not set
+-# CONFIG_SPI_MASTER is not set
+ # CONFIG_W1 is not set
+ # CONFIG_POWER_SUPPLY is not set
+ # CONFIG_HWMON is not set
+@@ -1215,12 +1163,22 @@ CONFIG_SSB_POSSIBLE=y
+ # Multifunction device drivers
+ #
+ # CONFIG_MFD_SM501 is not set
++# CONFIG_HTC_PASIC3 is not set
+ 
+ #
+ # Multimedia devices
+ #
++
++#
++# Multimedia core support
++#
+ # CONFIG_VIDEO_DEV is not set
+ # CONFIG_DVB_CORE is not set
++# CONFIG_VIDEO_MEDIA is not set
++
++#
++# Multimedia drivers
++#
+ # CONFIG_DAB is not set
+ 
+ #
+@@ -1240,8 +1198,8 @@ CONFIG_FB_CFB_IMAGEBLIT=y
+ # CONFIG_FB_SYS_FILLRECT is not set
+ # CONFIG_FB_SYS_COPYAREA is not set
+ # CONFIG_FB_SYS_IMAGEBLIT is not set
++# CONFIG_FB_FOREIGN_ENDIAN is not set
+ # CONFIG_FB_SYS_FOPS is not set
+-CONFIG_FB_DEFERRED_IO=y
+ # CONFIG_FB_SVGALIB is not set
+ CONFIG_FB_MACMODES=y
+ CONFIG_FB_BACKLIGHT=y
+@@ -1363,6 +1321,7 @@ CONFIG_SND_VERBOSE_PROCFS=y
+ # CONFIG_SND_AU8810 is not set
+ # CONFIG_SND_AU8820 is not set
+ # CONFIG_SND_AU8830 is not set
++# CONFIG_SND_AW2 is not set
+ # CONFIG_SND_AZT3328 is not set
+ # CONFIG_SND_BT87X is not set
+ # CONFIG_SND_CA0106 is not set
+@@ -1455,11 +1414,11 @@ CONFIG_SND_AOA_SOUNDBUS_I2S=m
+ # CONFIG_SND_SOC is not set
+ 
+ #
+-# SoC Audio support for SuperH
++# ALSA SoC audio for Freescale SOCs
+ #
+ 
+ #
+-# ALSA SoC audio for Freescale SOCs
++# SoC Audio for the Texas Instruments OMAP
+ #
+ 
+ #
+@@ -1497,12 +1456,14 @@ CONFIG_USB_DEVICE_CLASS=y
+ #
+ # USB Host Controller Drivers
+ #
++# CONFIG_USB_C67X00_HCD is not set
+ CONFIG_USB_EHCI_HCD=y
+ # CONFIG_USB_EHCI_ROOT_HUB_TT is not set
+ CONFIG_USB_EHCI_TT_NEWSCHED=y
+ CONFIG_USB_EHCI_BIG_ENDIAN_MMIO=y
+ # CONFIG_USB_EHCI_HCD_PPC_OF is not set
+ # CONFIG_USB_ISP116X_HCD is not set
++# CONFIG_USB_ISP1760_HCD is not set
+ CONFIG_USB_OHCI_HCD=y
+ # CONFIG_USB_OHCI_HCD_PPC_OF is not set
+ # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
+@@ -1538,6 +1499,7 @@ CONFIG_USB_STORAGE=m
+ # CONFIG_USB_STORAGE_ALAUDA is not set
+ # CONFIG_USB_STORAGE_ONETOUCH is not set
+ # CONFIG_USB_STORAGE_KARMA is not set
++# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
+ # CONFIG_USB_LIBUSUAL is not set
+ 
+ #
+@@ -1579,6 +1541,7 @@ CONFIG_USB_APPLEDISPLAY=m
+ # CONFIG_MMC is not set
+ # CONFIG_MEMSTICK is not set
+ # CONFIG_NEW_LEDS is not set
++# CONFIG_ACCESSIBILITY is not set
+ CONFIG_INFINIBAND=m
+ # CONFIG_INFINIBAND_USER_MAD is not set
+ # CONFIG_INFINIBAND_USER_ACCESS is not set
+@@ -1607,10 +1570,6 @@ CONFIG_EDAC_PASEMI=y
+ # CONFIG_EDAC_CELL is not set
+ CONFIG_RTC_LIB=y
+ CONFIG_RTC_CLASS=y
+-
+-#
+-# Conflicting RTC option has been selected, check GEN_RTC and RTC
+-#
+ CONFIG_RTC_HCTOSYS=y
+ CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
+ # CONFIG_RTC_DEBUG is not set
+@@ -1659,10 +1618,6 @@ CONFIG_RTC_DRV_DS1307=y
+ # on-CPU RTC drivers
+ #
+ # CONFIG_DMADEVICES is not set
+-
+-#
+-# Userspace I/O
+-#
+ # CONFIG_UIO is not set
+ 
+ #
+@@ -1696,9 +1651,9 @@ CONFIG_JFS_SECURITY=y
+ CONFIG_FS_POSIX_ACL=y
+ CONFIG_XFS_FS=m
+ # CONFIG_XFS_QUOTA is not set
+-CONFIG_XFS_SECURITY=y
+ CONFIG_XFS_POSIX_ACL=y
+ # CONFIG_XFS_RT is not set
++# CONFIG_XFS_DEBUG is not set
+ # CONFIG_GFS2_FS is not set
+ # CONFIG_OCFS2_FS is not set
+ CONFIG_DNOTIFY=y
+@@ -1764,13 +1719,11 @@ CONFIG_NFS_FS=y
+ CONFIG_NFS_V3=y
+ CONFIG_NFS_V3_ACL=y
+ CONFIG_NFS_V4=y
+-# CONFIG_NFS_DIRECTIO is not set
+ CONFIG_NFSD=m
+ CONFIG_NFSD_V2_ACL=y
+ CONFIG_NFSD_V3=y
+ CONFIG_NFSD_V3_ACL=y
+ CONFIG_NFSD_V4=y
+-CONFIG_NFSD_TCP=y
+ CONFIG_ROOT_NFS=y
+ CONFIG_LOCKD=y
+ CONFIG_LOCKD_V4=y
+@@ -1862,9 +1815,10 @@ CONFIG_NLS_UTF8=m
+ # Library routines
+ #
+ CONFIG_BITREVERSE=y
++# CONFIG_GENERIC_FIND_FIRST_BIT is not set
+ CONFIG_CRC_CCITT=m
+ # CONFIG_CRC16 is not set
+-# CONFIG_CRC_ITU_T is not set
++CONFIG_CRC_ITU_T=m
+ CONFIG_CRC32=y
+ # CONFIG_CRC7 is not set
+ CONFIG_LIBCRC32C=m
+@@ -1888,6 +1842,7 @@ CONFIG_HAVE_LMB=y
+ # CONFIG_PRINTK_TIME is not set
+ CONFIG_ENABLE_WARN_DEPRECATED=y
+ CONFIG_ENABLE_MUST_CHECK=y
++CONFIG_FRAME_WARN=2048
+ CONFIG_MAGIC_SYSRQ=y
+ # CONFIG_UNUSED_SYMBOLS is not set
+ CONFIG_DEBUG_FS=y
+@@ -1898,18 +1853,23 @@ CONFIG_DETECT_SOFTLOCKUP=y
+ CONFIG_SCHED_DEBUG=y
+ # CONFIG_SCHEDSTATS is not set
+ # CONFIG_TIMER_STATS is not set
++# CONFIG_DEBUG_OBJECTS is not set
+ # CONFIG_SLUB_DEBUG_ON is not set
+ # CONFIG_SLUB_STATS is not set
+ # CONFIG_DEBUG_RT_MUTEXES is not set
+ # CONFIG_RT_MUTEX_TESTER is not set
+ # CONFIG_DEBUG_SPINLOCK is not set
+ CONFIG_DEBUG_MUTEXES=y
++# CONFIG_DEBUG_LOCK_ALLOC is not set
++# CONFIG_PROVE_LOCKING is not set
++# CONFIG_LOCK_STAT is not set
+ # CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+ # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+ # CONFIG_DEBUG_KOBJECT is not set
+ CONFIG_DEBUG_BUGVERBOSE=y
+ # CONFIG_DEBUG_INFO is not set
+ # CONFIG_DEBUG_VM is not set
++# CONFIG_DEBUG_WRITECOUNT is not set
+ # CONFIG_DEBUG_LIST is not set
+ # CONFIG_DEBUG_SG is not set
+ # CONFIG_BOOT_PRINTK_DELAY is not set
+@@ -1941,53 +1901,83 @@ CONFIG_ASYNC_CORE=y
+ CONFIG_ASYNC_MEMCPY=y
+ CONFIG_ASYNC_XOR=y
+ CONFIG_CRYPTO=y
++
++#
++# Crypto core or helper
++#
+ CONFIG_CRYPTO_ALGAPI=y
+ CONFIG_CRYPTO_AEAD=m
+ CONFIG_CRYPTO_BLKCIPHER=y
+-CONFIG_CRYPTO_SEQIV=m
+ CONFIG_CRYPTO_HASH=y
+ CONFIG_CRYPTO_MANAGER=y
++CONFIG_CRYPTO_GF128MUL=m
++CONFIG_CRYPTO_NULL=m
++# CONFIG_CRYPTO_CRYPTD is not set
++CONFIG_CRYPTO_AUTHENC=m
++CONFIG_CRYPTO_TEST=m
++
++#
++# Authenticated Encryption with Associated Data
++#
++CONFIG_CRYPTO_CCM=m
++CONFIG_CRYPTO_GCM=m
++CONFIG_CRYPTO_SEQIV=m
++
++#
++# Block modes
++#
++CONFIG_CRYPTO_CBC=y
++CONFIG_CRYPTO_CTR=m
++# CONFIG_CRYPTO_CTS is not set
++CONFIG_CRYPTO_ECB=m
++# CONFIG_CRYPTO_LRW is not set
++CONFIG_CRYPTO_PCBC=m
++# CONFIG_CRYPTO_XTS is not set
++
++#
++# Hash modes
++#
+ CONFIG_CRYPTO_HMAC=y
+ # CONFIG_CRYPTO_XCBC is not set
+-CONFIG_CRYPTO_NULL=m
++
++#
++# Digest
++#
++CONFIG_CRYPTO_CRC32C=m
+ CONFIG_CRYPTO_MD4=m
+ CONFIG_CRYPTO_MD5=y
++CONFIG_CRYPTO_MICHAEL_MIC=m
+ CONFIG_CRYPTO_SHA1=m
+ CONFIG_CRYPTO_SHA256=m
+ CONFIG_CRYPTO_SHA512=m
+-CONFIG_CRYPTO_WP512=m
+ CONFIG_CRYPTO_TGR192=m
+-CONFIG_CRYPTO_GF128MUL=m
+-CONFIG_CRYPTO_ECB=m
+-CONFIG_CRYPTO_CBC=y
+-CONFIG_CRYPTO_PCBC=m
+-# CONFIG_CRYPTO_LRW is not set
+-# CONFIG_CRYPTO_XTS is not set
+-CONFIG_CRYPTO_CTR=m
+-CONFIG_CRYPTO_GCM=m
+-CONFIG_CRYPTO_CCM=m
+-# CONFIG_CRYPTO_CRYPTD is not set
+-CONFIG_CRYPTO_DES=y
+-# CONFIG_CRYPTO_FCRYPT is not set
+-CONFIG_CRYPTO_BLOWFISH=m
+-CONFIG_CRYPTO_TWOFISH=m
+-CONFIG_CRYPTO_TWOFISH_COMMON=m
+-CONFIG_CRYPTO_SERPENT=m
++CONFIG_CRYPTO_WP512=m
++
++#
++# Ciphers
++#
+ CONFIG_CRYPTO_AES=m
++CONFIG_CRYPTO_ANUBIS=m
++CONFIG_CRYPTO_ARC4=m
++CONFIG_CRYPTO_BLOWFISH=m
++# CONFIG_CRYPTO_CAMELLIA is not set
+ CONFIG_CRYPTO_CAST5=m
+ CONFIG_CRYPTO_CAST6=m
+-CONFIG_CRYPTO_TEA=m
+-CONFIG_CRYPTO_ARC4=m
++CONFIG_CRYPTO_DES=y
++# CONFIG_CRYPTO_FCRYPT is not set
+ CONFIG_CRYPTO_KHAZAD=m
+-CONFIG_CRYPTO_ANUBIS=m
+-# CONFIG_CRYPTO_SEED is not set
+ CONFIG_CRYPTO_SALSA20=m
++# CONFIG_CRYPTO_SEED is not set
++CONFIG_CRYPTO_SERPENT=m
++CONFIG_CRYPTO_TEA=m
++CONFIG_CRYPTO_TWOFISH=m
++CONFIG_CRYPTO_TWOFISH_COMMON=m
++
++#
++# Compression
++#
+ CONFIG_CRYPTO_DEFLATE=m
+-CONFIG_CRYPTO_MICHAEL_MIC=m
+-CONFIG_CRYPTO_CRC32C=m
+-# CONFIG_CRYPTO_CAMELLIA is not set
+-CONFIG_CRYPTO_TEST=m
+-CONFIG_CRYPTO_AUTHENC=m
+ CONFIG_CRYPTO_LZO=m
+ # CONFIG_CRYPTO_HW is not set
+ # CONFIG_PPC_CLOCK is not set
++# CONFIG_VIRTUALIZATION is not set
+diff --git a/arch/powerpc/configs/pseries_defconfig b/arch/powerpc/configs/pseries_defconfig
+index 3e2593c..adaa05f 100644
+--- a/arch/powerpc/configs/pseries_defconfig
++++ b/arch/powerpc/configs/pseries_defconfig
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.25-rc6
+-# Thu Mar 27 13:56:28 2008
++# Linux kernel version: 2.6.26-rc3
++# Tue May 20 20:03:28 2008
+ #
+ CONFIG_PPC64=y
+ 
+@@ -30,6 +30,9 @@ CONFIG_GENERIC_CLOCKEVENTS=y
+ CONFIG_GENERIC_HARDIRQS=y
+ CONFIG_HAVE_SETUP_PER_CPU_AREA=y
+ CONFIG_IRQ_PER_CPU=y
++CONFIG_STACKTRACE_SUPPORT=y
++CONFIG_TRACE_IRQFLAGS_SUPPORT=y
++CONFIG_LOCKDEP_SUPPORT=y
+ CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+ CONFIG_ARCH_HAS_ILOG2_U32=y
+ CONFIG_ARCH_HAS_ILOG2_U64=y
+@@ -81,6 +84,7 @@ CONFIG_LOG_BUF_SHIFT=17
+ CONFIG_CGROUPS=y
+ # CONFIG_CGROUP_DEBUG is not set
+ CONFIG_CGROUP_NS=y
++CONFIG_CGROUP_DEVICE=y
+ CONFIG_CPUSETS=y
+ # CONFIG_GROUP_SCHED is not set
+ CONFIG_CGROUP_CPUACCT=y
+@@ -100,6 +104,7 @@ CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+ CONFIG_SYSCTL=y
+ # CONFIG_EMBEDDED is not set
+ CONFIG_SYSCTL_SYSCALL=y
++CONFIG_SYSCTL_SYSCALL_CHECK=y
+ CONFIG_KALLSYMS=y
+ CONFIG_KALLSYMS_ALL=y
+ # CONFIG_KALLSYMS_EXTRA_PASS is not set
+@@ -107,6 +112,7 @@ CONFIG_HOTPLUG=y
+ CONFIG_PRINTK=y
+ CONFIG_BUG=y
+ CONFIG_ELF_CORE=y
++CONFIG_PCSPKR_PLATFORM=y
+ # CONFIG_COMPAT_BRK is not set
+ CONFIG_BASE_FULL=y
+ CONFIG_FUTEX=y
+@@ -129,12 +135,14 @@ CONFIG_KPROBES=y
+ CONFIG_KRETPROBES=y
+ CONFIG_HAVE_KPROBES=y
+ CONFIG_HAVE_KRETPROBES=y
++# CONFIG_HAVE_DMA_ATTRS is not set
+ CONFIG_PROC_PAGE_MONITOR=y
+ CONFIG_SLABINFO=y
+ CONFIG_RT_MUTEXES=y
+ # CONFIG_TINY_SHMEM is not set
+ CONFIG_BASE_SMALL=0
+ CONFIG_MODULES=y
++# CONFIG_MODULE_FORCE_LOAD is not set
+ CONFIG_MODULE_UNLOAD=y
+ # CONFIG_MODULE_FORCE_UNLOAD is not set
+ CONFIG_MODVERSIONS=y
+@@ -178,11 +186,11 @@ CONFIG_LPARCFG=y
+ # CONFIG_PPC_PMAC is not set
+ # CONFIG_PPC_MAPLE is not set
+ # CONFIG_PPC_PASEMI is not set
+-# CONFIG_PPC_CELLEB is not set
+ # CONFIG_PPC_PS3 is not set
+ # CONFIG_PPC_CELL is not set
+ # CONFIG_PPC_CELL_NATIVE is not set
+ # CONFIG_PPC_IBM_CELL_BLADE is not set
++# CONFIG_PPC_CELLEB is not set
+ # CONFIG_PQ2ADS is not set
+ CONFIG_PPC_NATIVE=y
+ # CONFIG_UDBG_RTAS_CONSOLE is not set
+@@ -225,7 +233,6 @@ CONFIG_PREEMPT_NONE=y
+ CONFIG_BINFMT_ELF=y
+ CONFIG_COMPAT_BINFMT_ELF=y
+ CONFIG_BINFMT_MISC=m
+-CONFIG_FORCE_MAX_ZONEORDER=13
+ CONFIG_HUGETLB_PAGE_SIZE_VARIABLE=y
+ CONFIG_IOMMU_VMERGE=y
+ CONFIG_IOMMU_HELPER=y
+@@ -255,6 +262,7 @@ CONFIG_SPARSEMEM_EXTREME=y
+ CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
+ CONFIG_SPARSEMEM_VMEMMAP=y
+ # CONFIG_MEMORY_HOTPLUG is not set
++CONFIG_PAGEFLAGS_EXTENDED=y
+ CONFIG_SPLIT_PTLOCK_CPUS=4
+ CONFIG_MIGRATION=y
+ CONFIG_RESOURCES_64BIT=y
+@@ -263,6 +271,7 @@ CONFIG_BOUNCE=y
+ CONFIG_NODES_SPAN_OTHER_NODES=y
+ # CONFIG_PPC_HAS_HASH_64K is not set
+ # CONFIG_PPC_64K_PAGES is not set
++CONFIG_FORCE_MAX_ZONEORDER=13
+ CONFIG_SCHED_SMT=y
+ CONFIG_PROC_DEVICETREE=y
+ # CONFIG_CMDLINE_BOOL is not set
+@@ -291,7 +300,10 @@ CONFIG_HOTPLUG_PCI=m
+ # CONFIG_HOTPLUG_PCI_SHPC is not set
+ CONFIG_HOTPLUG_PCI_RPA=m
+ CONFIG_HOTPLUG_PCI_RPA_DLPAR=m
++# CONFIG_HAS_RAPIDIO is not set
++CONFIG_PAGE_OFFSET=0xc000000000000000
+ CONFIG_KERNEL_START=0xc000000000000000
++CONFIG_PHYSICAL_START=0x00000000
+ 
+ #
+ # Networking
+@@ -338,8 +350,6 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
+ # CONFIG_TCP_MD5SIG is not set
+ # CONFIG_IP_VS is not set
+ # CONFIG_IPV6 is not set
+-# CONFIG_INET6_XFRM_TUNNEL is not set
+-# CONFIG_INET6_TUNNEL is not set
+ # CONFIG_NETWORK_SECMARK is not set
+ CONFIG_NETFILTER=y
+ # CONFIG_NETFILTER_DEBUG is not set
+@@ -355,6 +365,7 @@ CONFIG_NF_CONNTRACK=m
+ CONFIG_NF_CT_ACCT=y
+ CONFIG_NF_CONNTRACK_MARK=y
+ CONFIG_NF_CONNTRACK_EVENTS=y
++# CONFIG_NF_CT_PROTO_DCCP is not set
+ # CONFIG_NF_CT_PROTO_SCTP is not set
+ CONFIG_NF_CT_PROTO_UDPLITE=m
+ # CONFIG_NF_CONNTRACK_AMANDA is not set
+@@ -426,6 +437,7 @@ CONFIG_IP_NF_TARGET_MASQUERADE=m
+ CONFIG_IP_NF_TARGET_REDIRECT=m
+ CONFIG_IP_NF_TARGET_NETMAP=m
+ CONFIG_NF_NAT_SNMP_BASIC=m
++CONFIG_NF_NAT_PROTO_UDPLITE=m
+ CONFIG_NF_NAT_FTP=m
+ CONFIG_NF_NAT_IRC=m
+ CONFIG_NF_NAT_TFTP=m
+@@ -492,6 +504,7 @@ CONFIG_FW_LOADER=y
+ # CONFIG_CONNECTOR is not set
+ # CONFIG_MTD is not set
+ CONFIG_OF_DEVICE=y
++CONFIG_OF_I2C=y
+ CONFIG_PARPORT=m
+ CONFIG_PARPORT_PC=m
+ # CONFIG_PARPORT_SERIAL is not set
+@@ -545,7 +558,6 @@ CONFIG_IDE_PROC_FS=y
+ #
+ # IDE chipset support/bugfixes
+ #
+-CONFIG_IDE_GENERIC=y
+ # CONFIG_BLK_DEV_PLATFORM is not set
+ CONFIG_BLK_DEV_IDEDMA_SFF=y
+ 
+@@ -584,7 +596,7 @@ CONFIG_BLK_DEV_AMD74XX=y
+ # CONFIG_BLK_DEV_VIA82CXXX is not set
+ # CONFIG_BLK_DEV_TC86C001 is not set
+ CONFIG_BLK_DEV_IDEDMA=y
+-CONFIG_IDE_ARCH_OBSOLETE_INIT=y
++# CONFIG_BLK_DEV_HD_ONLY is not set
+ # CONFIG_BLK_DEV_HD is not set
+ 
+ #
+@@ -671,61 +683,10 @@ CONFIG_SCSI_LPFC=m
+ # CONFIG_SCSI_SRP is not set
+ CONFIG_ATA=y
+ # CONFIG_ATA_NONSTANDARD is not set
++CONFIG_SATA_PMP=y
+ # CONFIG_SATA_AHCI is not set
+-# CONFIG_SATA_SVW is not set
+-# CONFIG_ATA_PIIX is not set
+-# CONFIG_SATA_MV is not set
+-# CONFIG_SATA_NV is not set
+-# CONFIG_PDC_ADMA is not set
+-# CONFIG_SATA_QSTOR is not set
+-# CONFIG_SATA_PROMISE is not set
+-# CONFIG_SATA_SX4 is not set
+-# CONFIG_SATA_SIL is not set
+ # CONFIG_SATA_SIL24 is not set
+-# CONFIG_SATA_SIS is not set
+-# CONFIG_SATA_ULI is not set
+-# CONFIG_SATA_VIA is not set
+-# CONFIG_SATA_VITESSE is not set
+-# CONFIG_SATA_INIC162X is not set
+-# CONFIG_PATA_ALI is not set
+-# CONFIG_PATA_AMD is not set
+-# CONFIG_PATA_ARTOP is not set
+-# CONFIG_PATA_ATIIXP is not set
+-# CONFIG_PATA_CMD640_PCI is not set
+-# CONFIG_PATA_CMD64X is not set
+-# CONFIG_PATA_CS5520 is not set
+-# CONFIG_PATA_CS5530 is not set
+-# CONFIG_PATA_CYPRESS is not set
+-# CONFIG_PATA_EFAR is not set
+-# CONFIG_ATA_GENERIC is not set
+-# CONFIG_PATA_HPT366 is not set
+-# CONFIG_PATA_HPT37X is not set
+-# CONFIG_PATA_HPT3X2N is not set
+-# CONFIG_PATA_HPT3X3 is not set
+-# CONFIG_PATA_IT821X is not set
+-# CONFIG_PATA_IT8213 is not set
+-# CONFIG_PATA_JMICRON is not set
+-# CONFIG_PATA_TRIFLEX is not set
+-# CONFIG_PATA_MARVELL is not set
+-# CONFIG_PATA_MPIIX is not set
+-# CONFIG_PATA_OLDPIIX is not set
+-# CONFIG_PATA_NETCELL is not set
+-# CONFIG_PATA_NINJA32 is not set
+-# CONFIG_PATA_NS87410 is not set
+-# CONFIG_PATA_NS87415 is not set
+-# CONFIG_PATA_OPTI is not set
+-# CONFIG_PATA_OPTIDMA is not set
+-# CONFIG_PATA_PDC_OLD is not set
+-# CONFIG_PATA_RADISYS is not set
+-# CONFIG_PATA_RZ1000 is not set
+-# CONFIG_PATA_SC1200 is not set
+-# CONFIG_PATA_SERVERWORKS is not set
+-# CONFIG_PATA_PDC2027X is not set
+-# CONFIG_PATA_SIL680 is not set
+-# CONFIG_PATA_SIS is not set
+-# CONFIG_PATA_VIA is not set
+-CONFIG_PATA_WINBOND=y
+-# CONFIG_PATA_PLATFORM is not set
++# CONFIG_ATA_SFF is not set
+ CONFIG_MD=y
+ CONFIG_BLK_DEV_MD=y
+ CONFIG_MD_LINEAR=y
+@@ -783,7 +744,6 @@ CONFIG_IBMVETH=y
+ # CONFIG_IBM_NEW_EMAC_EMAC4 is not set
+ CONFIG_NET_PCI=y
+ CONFIG_PCNET32=y
+-# CONFIG_PCNET32_NAPI is not set
+ # CONFIG_AMD8111_ETH is not set
+ # CONFIG_ADAPTEC_STARFIRE is not set
+ # CONFIG_B44 is not set
+@@ -820,7 +780,6 @@ CONFIG_E1000=y
+ # CONFIG_SIS190 is not set
+ # CONFIG_SKGE is not set
+ # CONFIG_SKY2 is not set
+-# CONFIG_SK98LIN is not set
+ # CONFIG_VIA_VELOCITY is not set
+ CONFIG_TIGON3=y
+ # CONFIG_BNX2 is not set
+@@ -829,7 +788,6 @@ CONFIG_TIGON3=y
+ CONFIG_NETDEV_10000=y
+ # CONFIG_CHELSIO_T1 is not set
+ # CONFIG_CHELSIO_T3 is not set
+-CONFIG_EHEA=m
+ # CONFIG_IXGBE is not set
+ CONFIG_IXGB=m
+ # CONFIG_IXGB_NAPI is not set
+@@ -838,10 +796,10 @@ CONFIG_S2IO=m
+ # CONFIG_MYRI10GE is not set
+ # CONFIG_NETXEN_NIC is not set
+ # CONFIG_NIU is not set
+-# CONFIG_PASEMI_MAC is not set
+ # CONFIG_MLX4_CORE is not set
+ # CONFIG_TEHUTI is not set
+ # CONFIG_BNX2X is not set
++# CONFIG_SFC is not set
+ CONFIG_TR=y
+ CONFIG_IBMOL=y
+ # CONFIG_3C359 is not set
+@@ -852,6 +810,7 @@ CONFIG_IBMOL=y
+ #
+ # CONFIG_WLAN_PRE80211 is not set
+ # CONFIG_WLAN_80211 is not set
++# CONFIG_IWLWIFI_LEDS is not set
+ 
+ #
+ # USB Network Adapters
+@@ -956,6 +915,7 @@ CONFIG_VT=y
+ CONFIG_VT_CONSOLE=y
+ CONFIG_HW_CONSOLE=y
+ # CONFIG_VT_HW_CONSOLE_BINDING is not set
++CONFIG_DEVKMEM=y
+ # CONFIG_SERIAL_NONSTANDARD is not set
+ # CONFIG_NOZOMI is not set
+ 
+@@ -1000,13 +960,7 @@ CONFIG_DEVPORT=y
+ CONFIG_I2C=y
+ CONFIG_I2C_BOARDINFO=y
+ # CONFIG_I2C_CHARDEV is not set
+-
+-#
+-# I2C Algorithms
+-#
+ CONFIG_I2C_ALGOBIT=y
+-# CONFIG_I2C_ALGOPCF is not set
+-# CONFIG_I2C_ALGOPCA is not set
+ 
+ #
+ # I2C Hardware Bus support
+@@ -1035,6 +989,7 @@ CONFIG_I2C_ALGOBIT=y
+ # CONFIG_I2C_VIA is not set
+ # CONFIG_I2C_VIAPRO is not set
+ # CONFIG_I2C_VOODOO3 is not set
++# CONFIG_I2C_PCA_PLATFORM is not set
+ 
+ #
+ # Miscellaneous I2C Chip support
+@@ -1044,19 +999,13 @@ CONFIG_I2C_ALGOBIT=y
+ # CONFIG_SENSORS_PCF8574 is not set
+ # CONFIG_PCF8575 is not set
+ # CONFIG_SENSORS_PCF8591 is not set
+-# CONFIG_TPS65010 is not set
+ # CONFIG_SENSORS_MAX6875 is not set
+ # CONFIG_SENSORS_TSL2550 is not set
+ # CONFIG_I2C_DEBUG_CORE is not set
+ # CONFIG_I2C_DEBUG_ALGO is not set
+ # CONFIG_I2C_DEBUG_BUS is not set
+ # CONFIG_I2C_DEBUG_CHIP is not set
+-
+-#
+-# SPI support
+-#
+ # CONFIG_SPI is not set
+-# CONFIG_SPI_MASTER is not set
+ # CONFIG_W1 is not set
+ # CONFIG_POWER_SUPPLY is not set
+ # CONFIG_HWMON is not set
+@@ -1073,12 +1022,22 @@ CONFIG_SSB_POSSIBLE=y
+ # Multifunction device drivers
+ #
+ # CONFIG_MFD_SM501 is not set
++# CONFIG_HTC_PASIC3 is not set
+ 
+ #
+ # Multimedia devices
+ #
++
++#
++# Multimedia core support
++#
+ # CONFIG_VIDEO_DEV is not set
+ # CONFIG_DVB_CORE is not set
++# CONFIG_VIDEO_MEDIA is not set
++
++#
++# Multimedia drivers
++#
+ # CONFIG_DAB is not set
+ 
+ #
+@@ -1098,8 +1057,8 @@ CONFIG_FB_CFB_IMAGEBLIT=y
+ # CONFIG_FB_SYS_FILLRECT is not set
+ # CONFIG_FB_SYS_COPYAREA is not set
+ # CONFIG_FB_SYS_IMAGEBLIT is not set
++# CONFIG_FB_FOREIGN_ENDIAN is not set
+ # CONFIG_FB_SYS_FOPS is not set
+-CONFIG_FB_DEFERRED_IO=y
+ # CONFIG_FB_SVGALIB is not set
+ CONFIG_FB_MACMODES=y
+ CONFIG_FB_BACKLIGHT=y
+@@ -1209,11 +1168,13 @@ CONFIG_USB_DEVICE_CLASS=y
+ #
+ # USB Host Controller Drivers
+ #
++# CONFIG_USB_C67X00_HCD is not set
+ CONFIG_USB_EHCI_HCD=y
+ # CONFIG_USB_EHCI_ROOT_HUB_TT is not set
+ # CONFIG_USB_EHCI_TT_NEWSCHED is not set
+ # CONFIG_USB_EHCI_HCD_PPC_OF is not set
+ # CONFIG_USB_ISP116X_HCD is not set
++# CONFIG_USB_ISP1760_HCD is not set
+ CONFIG_USB_OHCI_HCD=y
+ # CONFIG_USB_OHCI_HCD_PPC_OF is not set
+ # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
+@@ -1247,7 +1208,9 @@ CONFIG_USB_STORAGE=y
+ # CONFIG_USB_STORAGE_SDDR55 is not set
+ # CONFIG_USB_STORAGE_JUMPSHOT is not set
+ # CONFIG_USB_STORAGE_ALAUDA is not set
++CONFIG_USB_STORAGE_ONETOUCH=y
+ # CONFIG_USB_STORAGE_KARMA is not set
++# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
+ # CONFIG_USB_LIBUSUAL is not set
+ 
+ #
+@@ -1290,6 +1253,7 @@ CONFIG_USB_MON=y
+ # CONFIG_MMC is not set
+ # CONFIG_MEMSTICK is not set
+ # CONFIG_NEW_LEDS is not set
++# CONFIG_ACCESSIBILITY is not set
+ CONFIG_INFINIBAND=m
+ CONFIG_INFINIBAND_USER_MAD=m
+ CONFIG_INFINIBAND_USER_ACCESS=m
+@@ -1312,10 +1276,6 @@ CONFIG_INFINIBAND_SRP=m
+ # CONFIG_RTC_CLASS is not set
+ # CONFIG_DMADEVICES is not set
+ # CONFIG_AUXDISPLAY is not set
+-
+-#
+-# Userspace I/O
+-#
+ # CONFIG_UIO is not set
+ 
+ #
+@@ -1349,11 +1309,12 @@ CONFIG_JFS_SECURITY=y
+ CONFIG_FS_POSIX_ACL=y
+ CONFIG_XFS_FS=m
+ # CONFIG_XFS_QUOTA is not set
+-CONFIG_XFS_SECURITY=y
+ CONFIG_XFS_POSIX_ACL=y
+ # CONFIG_XFS_RT is not set
++# CONFIG_XFS_DEBUG is not set
+ # CONFIG_GFS2_FS is not set
+ CONFIG_OCFS2_FS=m
++CONFIG_OCFS2_FS_O2CB=m
+ CONFIG_OCFS2_DEBUG_MASKLOG=y
+ # CONFIG_OCFS2_DEBUG_FS is not set
+ CONFIG_DNOTIFY=y
+@@ -1419,13 +1380,11 @@ CONFIG_NFS_FS=y
+ CONFIG_NFS_V3=y
+ CONFIG_NFS_V3_ACL=y
+ CONFIG_NFS_V4=y
+-# CONFIG_NFS_DIRECTIO is not set
+ CONFIG_NFSD=y
+ CONFIG_NFSD_V2_ACL=y
+ CONFIG_NFSD_V3=y
+ CONFIG_NFSD_V3_ACL=y
+ CONFIG_NFSD_V4=y
+-CONFIG_NFSD_TCP=y
+ CONFIG_LOCKD=y
+ CONFIG_LOCKD_V4=y
+ CONFIG_EXPORTFS=y
+@@ -1500,9 +1459,10 @@ CONFIG_NLS_ISO8859_1=y
+ # Library routines
+ #
+ CONFIG_BITREVERSE=y
++# CONFIG_GENERIC_FIND_FIRST_BIT is not set
+ CONFIG_CRC_CCITT=m
+ # CONFIG_CRC16 is not set
+-# CONFIG_CRC_ITU_T is not set
++CONFIG_CRC_ITU_T=m
+ CONFIG_CRC32=y
+ # CONFIG_CRC7 is not set
+ CONFIG_LIBCRC32C=m
+@@ -1526,6 +1486,7 @@ CONFIG_HAVE_LMB=y
+ # CONFIG_PRINTK_TIME is not set
+ CONFIG_ENABLE_WARN_DEPRECATED=y
+ CONFIG_ENABLE_MUST_CHECK=y
++CONFIG_FRAME_WARN=2048
+ CONFIG_MAGIC_SYSRQ=y
+ # CONFIG_UNUSED_SYMBOLS is not set
+ CONFIG_DEBUG_FS=y
+@@ -1536,18 +1497,23 @@ CONFIG_DETECT_SOFTLOCKUP=y
+ CONFIG_SCHED_DEBUG=y
+ # CONFIG_SCHEDSTATS is not set
+ # CONFIG_TIMER_STATS is not set
++# CONFIG_DEBUG_OBJECTS is not set
+ # CONFIG_SLUB_DEBUG_ON is not set
+ # CONFIG_SLUB_STATS is not set
+ # CONFIG_DEBUG_RT_MUTEXES is not set
+ # CONFIG_RT_MUTEX_TESTER is not set
+ # CONFIG_DEBUG_SPINLOCK is not set
+ # CONFIG_DEBUG_MUTEXES is not set
++# CONFIG_DEBUG_LOCK_ALLOC is not set
++# CONFIG_PROVE_LOCKING is not set
++# CONFIG_LOCK_STAT is not set
+ # CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+ # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+ # CONFIG_DEBUG_KOBJECT is not set
+ CONFIG_DEBUG_BUGVERBOSE=y
+ # CONFIG_DEBUG_INFO is not set
+ # CONFIG_DEBUG_VM is not set
++# CONFIG_DEBUG_WRITECOUNT is not set
+ # CONFIG_DEBUG_LIST is not set
+ # CONFIG_DEBUG_SG is not set
+ # CONFIG_BOOT_PRINTK_DELAY is not set
+@@ -1577,53 +1543,83 @@ CONFIG_VIRQ_DEBUG=y
+ # CONFIG_SECURITY is not set
+ # CONFIG_SECURITY_FILE_CAPABILITIES is not set
+ CONFIG_CRYPTO=y
++
++#
++# Crypto core or helper
++#
+ CONFIG_CRYPTO_ALGAPI=y
+ CONFIG_CRYPTO_AEAD=m
+ CONFIG_CRYPTO_BLKCIPHER=y
+-CONFIG_CRYPTO_SEQIV=m
+ CONFIG_CRYPTO_HASH=y
+ CONFIG_CRYPTO_MANAGER=y
++CONFIG_CRYPTO_GF128MUL=m
++CONFIG_CRYPTO_NULL=m
++# CONFIG_CRYPTO_CRYPTD is not set
++CONFIG_CRYPTO_AUTHENC=m
++CONFIG_CRYPTO_TEST=m
++
++#
++# Authenticated Encryption with Associated Data
++#
++CONFIG_CRYPTO_CCM=m
++CONFIG_CRYPTO_GCM=m
++CONFIG_CRYPTO_SEQIV=m
++
++#
++# Block modes
++#
++CONFIG_CRYPTO_CBC=y
++CONFIG_CRYPTO_CTR=m
++# CONFIG_CRYPTO_CTS is not set
++CONFIG_CRYPTO_ECB=m
++# CONFIG_CRYPTO_LRW is not set
++CONFIG_CRYPTO_PCBC=m
++# CONFIG_CRYPTO_XTS is not set
++
++#
++# Hash modes
++#
+ CONFIG_CRYPTO_HMAC=y
+ # CONFIG_CRYPTO_XCBC is not set
+-CONFIG_CRYPTO_NULL=m
++
++#
++# Digest
++#
++CONFIG_CRYPTO_CRC32C=m
+ CONFIG_CRYPTO_MD4=m
+ CONFIG_CRYPTO_MD5=y
++CONFIG_CRYPTO_MICHAEL_MIC=m
+ CONFIG_CRYPTO_SHA1=m
+ CONFIG_CRYPTO_SHA256=m
+ CONFIG_CRYPTO_SHA512=m
+-CONFIG_CRYPTO_WP512=m
+ CONFIG_CRYPTO_TGR192=m
+-CONFIG_CRYPTO_GF128MUL=m
+-CONFIG_CRYPTO_ECB=m
+-CONFIG_CRYPTO_CBC=y
+-CONFIG_CRYPTO_PCBC=m
+-# CONFIG_CRYPTO_LRW is not set
+-# CONFIG_CRYPTO_XTS is not set
+-CONFIG_CRYPTO_CTR=m
+-CONFIG_CRYPTO_GCM=m
+-CONFIG_CRYPTO_CCM=m
+-# CONFIG_CRYPTO_CRYPTD is not set
+-CONFIG_CRYPTO_DES=y
+-# CONFIG_CRYPTO_FCRYPT is not set
+-CONFIG_CRYPTO_BLOWFISH=m
+-CONFIG_CRYPTO_TWOFISH=m
+-CONFIG_CRYPTO_TWOFISH_COMMON=m
+-CONFIG_CRYPTO_SERPENT=m
++CONFIG_CRYPTO_WP512=m
++
++#
++# Ciphers
++#
+ CONFIG_CRYPTO_AES=m
++CONFIG_CRYPTO_ANUBIS=m
++CONFIG_CRYPTO_ARC4=m
++CONFIG_CRYPTO_BLOWFISH=m
++# CONFIG_CRYPTO_CAMELLIA is not set
+ CONFIG_CRYPTO_CAST5=m
+ CONFIG_CRYPTO_CAST6=m
+-CONFIG_CRYPTO_TEA=m
+-CONFIG_CRYPTO_ARC4=m
++CONFIG_CRYPTO_DES=y
++# CONFIG_CRYPTO_FCRYPT is not set
+ CONFIG_CRYPTO_KHAZAD=m
+-CONFIG_CRYPTO_ANUBIS=m
+-# CONFIG_CRYPTO_SEED is not set
+ CONFIG_CRYPTO_SALSA20=m
++# CONFIG_CRYPTO_SEED is not set
++CONFIG_CRYPTO_SERPENT=m
++CONFIG_CRYPTO_TEA=m
++CONFIG_CRYPTO_TWOFISH=m
++CONFIG_CRYPTO_TWOFISH_COMMON=m
++
++#
++# Compression
++#
+ CONFIG_CRYPTO_DEFLATE=m
+-CONFIG_CRYPTO_MICHAEL_MIC=m
+-CONFIG_CRYPTO_CRC32C=m
+-# CONFIG_CRYPTO_CAMELLIA is not set
+-CONFIG_CRYPTO_TEST=m
+-CONFIG_CRYPTO_AUTHENC=m
+ CONFIG_CRYPTO_LZO=m
+ # CONFIG_CRYPTO_HW is not set
+ # CONFIG_PPC_CLOCK is not set
++# CONFIG_VIRTUALIZATION is not set
+diff --git a/arch/powerpc/kernel/init_task.c b/arch/powerpc/kernel/init_task.c
+index 941043a..4c85b8d 100644
+--- a/arch/powerpc/kernel/init_task.c
++++ b/arch/powerpc/kernel/init_task.c
+@@ -8,7 +8,6 @@
+ #include <asm/uaccess.h>
+ 
+ static struct fs_struct init_fs = INIT_FS;
+-static struct files_struct init_files = INIT_FILES;
+ static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
+ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
+ struct mm_struct init_mm = INIT_MM(init_mm);
+diff --git a/arch/powerpc/mm/hash_low_32.S b/arch/powerpc/mm/hash_low_32.S
+index ddeaf9e..b9ba7d9 100644
+--- a/arch/powerpc/mm/hash_low_32.S
++++ b/arch/powerpc/mm/hash_low_32.S
+@@ -1,6 +1,4 @@
+ /*
+- *  $Id: hashtable.S,v 1.6 1999/10/08 01:56:15 paulus Exp $
+- *
+  *  PowerPC version
+  *    Copyright (C) 1995-1996 Gary Thomas (gdt at linuxppc.org)
+  *  Rewritten by Cort Dougan (cort at cs.nmt.edu) for PReP
+diff --git a/arch/s390/kernel/init_task.c b/arch/s390/kernel/init_task.c
+index d494161..7ad0039 100644
+--- a/arch/s390/kernel/init_task.c
++++ b/arch/s390/kernel/init_task.c
+@@ -17,7 +17,6 @@
+ #include <asm/pgtable.h>
+ 
+ static struct fs_struct init_fs = INIT_FS;
+-static struct files_struct init_files = INIT_FILES;
+ static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
+ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
+ struct mm_struct init_mm = INIT_MM(init_mm);
+diff --git a/arch/sh/kernel/cpu/sh4a/clock-sh7785.c b/arch/sh/kernel/cpu/sh4a/clock-sh7785.c
+index 805535a..27fa81b 100644
+--- a/arch/sh/kernel/cpu/sh4a/clock-sh7785.c
++++ b/arch/sh/kernel/cpu/sh4a/clock-sh7785.c
+@@ -26,7 +26,7 @@ static int pfc_divisors[] = { 1, 1, 1, 1, 1, 1, 1, 18,
+ 
+ static void master_clk_init(struct clk *clk)
+ {
+-	clk->rate *= 36;
++	clk->rate *= pfc_divisors[ctrl_inl(FRQMR1) & 0x000f];
+ }
+ 
+ static struct clk_ops sh7785_master_clk_ops = {
+diff --git a/arch/sh/kernel/entry-common.S b/arch/sh/kernel/entry-common.S
+index 926b2e7..718bd23 100644
+--- a/arch/sh/kernel/entry-common.S
++++ b/arch/sh/kernel/entry-common.S
+@@ -1,9 +1,6 @@
+-/* $Id: entry.S,v 1.37 2004/06/11 13:02:46 doyu Exp $
+- *
+- *  linux/arch/sh/entry.S
+- *
++/* 
+  *  Copyright (C) 1999, 2000, 2002  Niibe Yutaka
+- *  Copyright (C) 2003  Paul Mundt
++ *  Copyright (C) 2003 - 2008  Paul Mundt
+  *
+  * This file is subject to the terms and conditions of the GNU General Public
+  * License.  See the file "COPYING" in the main directory of this archive
+@@ -262,6 +259,7 @@ __restore_all:
+ 
+ 	.align	2
+ syscall_badsys:			! Bad syscall number
++	get_current_thread_info r8, r0
+ 	mov	#-ENOSYS, r0
+ 	bra	resume_userspace
+ 	 mov.l	r0, @(OFF_R0,r15)	! Return value
+@@ -281,7 +279,9 @@ debug_trap:
+ 	mov.l	1f, r8
+ 	add	r0, r8
+ 	mov.l	@r8, r8
+-	jmp	@r8
++	jsr	@r8
++	 nop
++	bra	__restore_all
+ 	 nop
+ 
+ 	.align	2
+diff --git a/arch/sh/kernel/head_32.S b/arch/sh/kernel/head_32.S
+index d67d7ed..ae0a382 100644
+--- a/arch/sh/kernel/head_32.S
++++ b/arch/sh/kernel/head_32.S
+@@ -30,8 +30,8 @@ ENTRY(empty_zero_page)
+ 	.long	0		/* RAMDISK_FLAGS */
+ 	.long	0x0200		/* ORIG_ROOT_DEV */
+ 	.long	1		/* LOADER_TYPE */
+-	.long	0x00360000	/* INITRD_START */
+-	.long	0x000a0000	/* INITRD_SIZE */
++	.long	0x00000000	/* INITRD_START */
++	.long	0x00000000	/* INITRD_SIZE */
+ #ifdef CONFIG_32BIT
+ 	.long	0x53453f00 + 32	/* "SE?" = 32 bit */
+ #else
+diff --git a/arch/sh/kernel/init_task.c b/arch/sh/kernel/init_task.c
+index f9bcc60..b151a25 100644
+--- a/arch/sh/kernel/init_task.c
++++ b/arch/sh/kernel/init_task.c
+@@ -8,7 +8,6 @@
+ #include <asm/pgtable.h>
+ 
+ static struct fs_struct init_fs = INIT_FS;
+-static struct files_struct init_files = INIT_FILES;
+ static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
+ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
+ struct pt_regs fake_swapper_regs;
+diff --git a/arch/sh/kernel/kgdb_stub.c b/arch/sh/kernel/kgdb_stub.c
+index 832641b..bf8ac4c 100644
+--- a/arch/sh/kernel/kgdb_stub.c
++++ b/arch/sh/kernel/kgdb_stub.c
+@@ -274,8 +274,7 @@ static char *mem_to_hex(const char *mem, char *buf, const int count)
+ 	}
+ 	for (i = 0; i < count; i++) {
+ 		ch = *mem++;
+-		*buf++ = highhex(ch);
+-		*buf++ = lowhex(ch);
++		buf = pack_hex_byte(buf, ch);
+ 	}
+ 	*buf = 0;
+ 	return (buf);
+@@ -427,8 +426,8 @@ static void put_packet(char *buffer)
+ 
+ 		/* '#' Separator, put high and low components of checksum */
+ 		put_debug_char('#');
+-		put_debug_char(highhex(checksum));
+-		put_debug_char(lowhex(checksum));
++		put_debug_char(hex_asc_hi(checksum));
++		put_debug_char(hex_asc_lo(checksum));
+ 	}
+ 	while ((get_debug_char()) != '+');	/* While no ack */
+ }
+@@ -650,8 +649,8 @@ static void undo_single_step(void)
+ static void send_signal_msg(const int signum)
+ {
+ 	out_buffer[0] = 'S';
+-	out_buffer[1] = highhex(signum);
+-	out_buffer[2] = lowhex(signum);
++	out_buffer[1] = hex_asc_hi(signum);
++	out_buffer[2] = hex_asc_lo(signum);
+ 	out_buffer[3] = 0;
+ 	put_packet(out_buffer);
+ }
+diff --git a/arch/sh/kernel/setup.c b/arch/sh/kernel/setup.c
+index 516bde9..bca2bbc 100644
+--- a/arch/sh/kernel/setup.c
++++ b/arch/sh/kernel/setup.c
+@@ -292,6 +292,17 @@ void __init setup_arch(char **cmdline_p)
+ 
+ 	ROOT_DEV = old_decode_dev(ORIG_ROOT_DEV);
+ 
++	printk(KERN_NOTICE "Boot params:\n"
++			   "... MOUNT_ROOT_RDONLY - %08lx\n"
++			   "... RAMDISK_FLAGS     - %08lx\n"
++			   "... ORIG_ROOT_DEV     - %08lx\n"
++			   "... LOADER_TYPE       - %08lx\n"
++			   "... INITRD_START      - %08lx\n"
++			   "... INITRD_SIZE       - %08lx\n",
++			   MOUNT_ROOT_RDONLY, RAMDISK_FLAGS,
++			   ORIG_ROOT_DEV, LOADER_TYPE,
++			   INITRD_START, INITRD_SIZE);
++
+ #ifdef CONFIG_BLK_DEV_RAM
+ 	rd_image_start = RAMDISK_FLAGS & RAMDISK_IMAGE_START_MASK;
+ 	rd_prompt = ((RAMDISK_FLAGS & RAMDISK_PROMPT_FLAG) != 0);
+diff --git a/arch/sh/kernel/traps.c b/arch/sh/kernel/traps.c
+index a3bdc68..438f1eb 100644
+--- a/arch/sh/kernel/traps.c
++++ b/arch/sh/kernel/traps.c
+@@ -4,6 +4,7 @@
+ #include <linux/kdebug.h>
+ #include <linux/signal.h>
+ #include <linux/sched.h>
++#include <linux/uaccess.h>
+ #include <asm/system.h>
+ 
+ #ifdef CONFIG_BUG
+@@ -21,7 +22,14 @@ static void handle_BUG(struct pt_regs *regs)
+ 
+ int is_valid_bugaddr(unsigned long addr)
+ {
+-	return addr >= PAGE_OFFSET;
++	unsigned short opcode;
++
++	if (addr < PAGE_OFFSET)
++		return 0;
++	if (probe_kernel_address((u16 *)addr, opcode))
++		return 0;
++
++	return opcode == TRAPA_BUG_OPCODE;
+ }
+ #endif
+ 
+diff --git a/arch/sh/lib/memcpy-sh4.S b/arch/sh/lib/memcpy-sh4.S
+index 560bc17..459fa92 100644
+--- a/arch/sh/lib/memcpy-sh4.S
++++ b/arch/sh/lib/memcpy-sh4.S
+@@ -126,10 +126,10 @@
+ 
+ 	 mov.l	r3, at -r0		!  30 LS
+ #else
+-3:	mov	r1,r3		! OPQR
++3:	mov	r7,r3		! OPQR
+ 	shlr8	r3		! xOPQ
+-	mov.l	@(r0,r5),r1	! KLMN
+-	mov	r1,r6
++	mov.l	@(r0,r5),r7	! KLMN
++	mov	r7,r6
+ 	shll16	r6
+ 	shll8	r6		! Nxxx
+ 	or	r6,r3		! NOPQ
+@@ -733,24 +733,24 @@ ENTRY(memcpy)
+ 	movca.l	r0, at r1		!  40 LS (latency=3-7)
+ 	add	#-0x1c, r1	!  50 EX
+ 
+-	mov.l	r3, @(0x1c,r1)	!  33 LS
++	mov.l	r3, @(0x18,r1)	!  33 LS
+ 	xtrct	r11, r10	!  48 EX
+ 
+-	mov.l	r6, @(0x18,r1)	!  33 LS
++	mov.l	r6, @(0x14,r1)	!  33 LS
+ 	xtrct	r12, r11	!  48 EX
+ 
+-	mov.l	r7, @(0x14,r1)	!  33 LS
++	mov.l	r7, @(0x10,r1)	!  33 LS
+ 
+-	mov.l	r8, @(0x10,r1)	!  33 LS
+-	add	#-0x3e, r5	!  50 EX
++	mov.l	r8, @(0x0c,r1)	!  33 LS
++	add	#-0x1e, r5	!  50 EX
+ 
+-	mov.l	r9, @(0x0c,r1)	!  33 LS
++	mov.l	r9, @(0x08,r1)	!  33 LS
+ 	cmp/eq	r2,r1		!  54 MT
+ 
+-	mov.l	r10, @(0x08,r1)	!  33 LS
++	mov.l	r10, @(0x04,r1)	!  33 LS
+ 	bf/s	2b		! 109 BR
+ 
+-	 mov.l	r11, @(0x04,r1)	!  33 LS
++	 mov.l	r11, @(0x00,r1)	!  33 LS
+ #endif
+ 
+ 	mov.l	@r15+, r12
+diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig
+index d211fdb..789724e 100644
+--- a/arch/sparc/Kconfig
++++ b/arch/sparc/Kconfig
+@@ -1,4 +1,3 @@
+-# $Id: config.in,v 1.113 2002/01/24 22:14:44 davem Exp $
+ # For a description of the syntax of this configuration file,
+ # see Documentation/kbuild/kconfig-language.txt.
+ #
+diff --git a/arch/sparc/boot/Makefile b/arch/sparc/boot/Makefile
+index b365084..22d331e 100644
+--- a/arch/sparc/boot/Makefile
++++ b/arch/sparc/boot/Makefile
+@@ -1,4 +1,3 @@
+-# $Id: Makefile,v 1.10 2000/02/23 08:17:46 jj Exp $
+ # Makefile for the Sparc boot stuff.
+ #
+ # Copyright (C) 1995 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/arch/sparc/boot/btfixupprep.c b/arch/sparc/boot/btfixupprep.c
+index dc7b054..52a4208 100644
+--- a/arch/sparc/boot/btfixupprep.c
++++ b/arch/sparc/boot/btfixupprep.c
+@@ -1,4 +1,4 @@
+-/* $Id: btfixupprep.c,v 1.6 2001/08/22 15:27:47 davem Exp $
++/*
+    Simple utility to prepare vmlinux image for sparc.
+    Resolves all BTFIXUP uses and settings and creates
+    a special .s object to link to the image.
+diff --git a/arch/sparc/boot/piggyback.c b/arch/sparc/boot/piggyback.c
+index 6962cc6..c9f500c 100644
+--- a/arch/sparc/boot/piggyback.c
++++ b/arch/sparc/boot/piggyback.c
+@@ -1,4 +1,4 @@
+-/* $Id: piggyback.c,v 1.4 2000/12/05 00:48:57 anton Exp $
++/*
+    Simple utility to make a single-image install kernel with initial ramdisk
+    for Sparc tftpbooting without need to set up nfs.
+ 
+diff --git a/arch/sparc/kernel/ebus.c b/arch/sparc/kernel/ebus.c
+index 96344ff..92c6fc0 100644
+--- a/arch/sparc/kernel/ebus.c
++++ b/arch/sparc/kernel/ebus.c
+@@ -1,4 +1,4 @@
+-/* $Id: ebus.c,v 1.20 2002/01/05 01:13:43 davem Exp $
++/*
+  * ebus.c: PCI to EBus bridge device.
+  *
+  * Copyright (C) 1997  Eddie C. Dost  (ecd at skynet.be)
+diff --git a/arch/sparc/kernel/etrap.S b/arch/sparc/kernel/etrap.S
+index a8b35be..f37d961 100644
+--- a/arch/sparc/kernel/etrap.S
++++ b/arch/sparc/kernel/etrap.S
+@@ -1,4 +1,4 @@
+-/* $Id: etrap.S,v 1.31 2000/01/08 16:38:18 anton Exp $
++/*
+  * etrap.S: Sparc trap window preparation for entry into the
+  *          Linux kernel.
+  *
+diff --git a/arch/sparc/kernel/head.S b/arch/sparc/kernel/head.S
+index 8bec05f..3bfd608 100644
+--- a/arch/sparc/kernel/head.S
++++ b/arch/sparc/kernel/head.S
+@@ -1,4 +1,4 @@
+-/* $Id: head.S,v 1.105 2001/08/12 09:08:56 davem Exp $
++/*
+  * head.S: The initial boot code for the Sparc port of Linux.
+  *
+  * Copyright (C) 1995 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/arch/sparc/kernel/idprom.c b/arch/sparc/kernel/idprom.c
+index 3a5bad5..7220562 100644
+--- a/arch/sparc/kernel/idprom.c
++++ b/arch/sparc/kernel/idprom.c
+@@ -1,4 +1,4 @@
+-/* $Id: idprom.c,v 1.24 1999/08/31 06:54:20 davem Exp $
++/*
+  * idprom.c: Routines to load the idprom into kernel addresses and
+  *           interpret the data contained within.
+  *
+diff --git a/arch/sparc/kernel/init_task.c b/arch/sparc/kernel/init_task.c
+index d9d4f96..8e64ebc 100644
+--- a/arch/sparc/kernel/init_task.c
++++ b/arch/sparc/kernel/init_task.c
+@@ -9,7 +9,6 @@
+ #include <asm/uaccess.h>
+ 
+ static struct fs_struct init_fs = INIT_FS;
+-static struct files_struct init_files = INIT_FILES;
+ static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
+ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
+ struct mm_struct init_mm = INIT_MM(init_mm);
+diff --git a/arch/sparc/kernel/ioport.c b/arch/sparc/kernel/ioport.c
+index ad0ede2..7b17522 100644
+--- a/arch/sparc/kernel/ioport.c
++++ b/arch/sparc/kernel/ioport.c
+@@ -1,4 +1,4 @@
+-/* $Id: ioport.c,v 1.45 2001/10/30 04:54:21 davem Exp $
++/*
+  * ioport.c:  Simple io mapping allocator.
+  *
+  * Copyright (C) 1995 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/arch/sparc/kernel/irq.c b/arch/sparc/kernel/irq.c
+index 01a6756..087390b 100644
+--- a/arch/sparc/kernel/irq.c
++++ b/arch/sparc/kernel/irq.c
+@@ -1,4 +1,4 @@
+-/*  $Id: irq.c,v 1.114 2001/12/11 04:55:51 davem Exp $
++/*
+  *  arch/sparc/kernel/irq.c:  Interrupt request handling routines. On the
+  *                            Sparc the IRQs are basically 'cast in stone'
+  *                            and you are supposed to probe the prom's device
+diff --git a/arch/sparc/kernel/muldiv.c b/arch/sparc/kernel/muldiv.c
+index 37b9a49..e352239 100644
+--- a/arch/sparc/kernel/muldiv.c
++++ b/arch/sparc/kernel/muldiv.c
+@@ -1,4 +1,4 @@
+-/* $Id: muldiv.c,v 1.5 1997/12/15 20:07:20 ecd Exp $
++/*
+  * muldiv.c: Hardware multiply/division illegal instruction trap
+  *		for sun4c/sun4 (which do not have those instructions)
+  *
+diff --git a/arch/sparc/kernel/rtrap.S b/arch/sparc/kernel/rtrap.S
+index ab818cd..ce30082 100644
+--- a/arch/sparc/kernel/rtrap.S
++++ b/arch/sparc/kernel/rtrap.S
+@@ -1,4 +1,4 @@
+-/* $Id: rtrap.S,v 1.58 2002/01/31 03:30:05 davem Exp $
++/*
+  * rtrap.S: Return from Sparc trap low-level code.
+  *
+  * Copyright (C) 1995 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/arch/sparc/kernel/setup.c b/arch/sparc/kernel/setup.c
+index 8a55c4f..a0ea0bc 100644
+--- a/arch/sparc/kernel/setup.c
++++ b/arch/sparc/kernel/setup.c
+@@ -1,4 +1,4 @@
+-/*  $Id: setup.c,v 1.126 2001/11/13 00:49:27 davem Exp $
++/*
+  *  linux/arch/sparc/kernel/setup.c
+  *
+  *  Copyright (C) 1995  David S. Miller (davem at caip.rutgers.edu)
+diff --git a/arch/sparc/kernel/sparc_ksyms.c b/arch/sparc/kernel/sparc_ksyms.c
+index aa8ee06..b23cea5 100644
+--- a/arch/sparc/kernel/sparc_ksyms.c
++++ b/arch/sparc/kernel/sparc_ksyms.c
+@@ -1,4 +1,4 @@
+-/* $Id: sparc_ksyms.c,v 1.107 2001/07/17 16:17:33 anton Exp $
++/*
+  * arch/sparc/kernel/ksyms.c: Sparc specific ksyms support.
+  *
+  * Copyright (C) 1996 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/arch/sparc/kernel/sun4d_irq.c b/arch/sparc/kernel/sun4d_irq.c
+index e0efab2..8ac5661 100644
+--- a/arch/sparc/kernel/sun4d_irq.c
++++ b/arch/sparc/kernel/sun4d_irq.c
+@@ -1,4 +1,4 @@
+-/*  $Id: sun4d_irq.c,v 1.29 2001/12/11 04:55:51 davem Exp $
++/*
+  *  arch/sparc/kernel/sun4d_irq.c:
+  *			SS1000/SC2000 interrupt handling.
+  *
+diff --git a/arch/sparc/kernel/trampoline.S b/arch/sparc/kernel/trampoline.S
+index 2dcdaa1..356c56a 100644
+--- a/arch/sparc/kernel/trampoline.S
++++ b/arch/sparc/kernel/trampoline.S
+@@ -1,4 +1,4 @@
+-/* $Id: trampoline.S,v 1.14 2002/01/11 08:45:38 davem Exp $
++/*
+  * trampoline.S: SMP cpu boot-up trampoline code.
+  *
+  * Copyright (C) 1995 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/arch/sparc/kernel/traps.c b/arch/sparc/kernel/traps.c
+index d404e79..978e9d8 100644
+--- a/arch/sparc/kernel/traps.c
++++ b/arch/sparc/kernel/traps.c
+@@ -1,4 +1,4 @@
+-/* $Id: traps.c,v 1.64 2000/09/03 15:00:49 anton Exp $
++/*
+  * arch/sparc/kernel/traps.c
+  *
+  * Copyright 1995 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/arch/sparc/kernel/unaligned.c b/arch/sparc/kernel/unaligned.c
+index 33857be..c2a28c5 100644
+--- a/arch/sparc/kernel/unaligned.c
++++ b/arch/sparc/kernel/unaligned.c
+@@ -1,4 +1,4 @@
+-/* $Id: unaligned.c,v 1.23 2001/12/21 00:54:31 davem Exp $
++/*
+  * unaligned.c: Unaligned load/store trap handling with special
+  *              cases for the kernel to do them more quickly.
+  *
+diff --git a/arch/sparc/kernel/wof.S b/arch/sparc/kernel/wof.S
+index 083b121..4bce38d 100644
+--- a/arch/sparc/kernel/wof.S
++++ b/arch/sparc/kernel/wof.S
+@@ -1,4 +1,4 @@
+-/* $Id: wof.S,v 1.40 2000/01/08 16:38:18 anton Exp $
++/*
+  * wof.S: Sparc window overflow handler.
+  *
+  * Copyright (C) 1995 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/arch/sparc/kernel/wuf.S b/arch/sparc/kernel/wuf.S
+index d1a266b..82e5145 100644
+--- a/arch/sparc/kernel/wuf.S
++++ b/arch/sparc/kernel/wuf.S
+@@ -1,4 +1,4 @@
+-/* $Id: wuf.S,v 1.39 2000/01/08 16:38:18 anton Exp $
++/*
+  * wuf.S: Window underflow trap handler for the Sparc.
+  *
+  * Copyright (C) 1995 David S. Miller
+diff --git a/arch/sparc/lib/Makefile b/arch/sparc/lib/Makefile
+index 76effdb..6e303e1 100644
+--- a/arch/sparc/lib/Makefile
++++ b/arch/sparc/lib/Makefile
+@@ -1,4 +1,3 @@
+-# $Id: Makefile,v 1.35 2000/12/15 00:41:18 davem Exp $
+ # Makefile for Sparc library files..
+ #
+ 
+diff --git a/arch/sparc/lib/ashldi3.S b/arch/sparc/lib/ashldi3.S
+index 52418a0..17912e6 100644
+--- a/arch/sparc/lib/ashldi3.S
++++ b/arch/sparc/lib/ashldi3.S
+@@ -1,4 +1,4 @@
+-/* $Id: ashldi3.S,v 1.2 1999/11/19 04:11:46 davem Exp $
++/*
+  * ashldi3.S:	GCC emits these for certain drivers playing
+  *		with long longs.
+  *
+diff --git a/arch/sparc/lib/ashrdi3.S b/arch/sparc/lib/ashrdi3.S
+index 2848237..85398fd 100644
+--- a/arch/sparc/lib/ashrdi3.S
++++ b/arch/sparc/lib/ashrdi3.S
+@@ -1,4 +1,4 @@
+-/* $Id: ashrdi3.S,v 1.4 1999/11/19 04:11:49 davem Exp $
++/*
+  * ashrdi3.S:	The filesystem code creates all kinds of references to
+  *              this little routine on the sparc with gcc.
+  *
+diff --git a/arch/sparc/lib/blockops.S b/arch/sparc/lib/blockops.S
+index a7c7ffa..804be87 100644
+--- a/arch/sparc/lib/blockops.S
++++ b/arch/sparc/lib/blockops.S
+@@ -1,4 +1,4 @@
+-/* $Id: blockops.S,v 1.8 1998/01/30 10:58:44 jj Exp $
++/*
+  * blockops.S: Common block zero optimized routines.
+  *
+  * Copyright (C) 1996 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/arch/sparc/lib/locks.S b/arch/sparc/lib/locks.S
+index b1df55c..64f53f2 100644
+--- a/arch/sparc/lib/locks.S
++++ b/arch/sparc/lib/locks.S
+@@ -1,4 +1,4 @@
+-/* $Id: locks.S,v 1.16 2000/02/26 11:02:47 anton Exp $
++/*
+  * locks.S: SMP low-level lock primitives on Sparc.
+  *
+  * Copyright (C) 1996 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/arch/sparc/lib/lshrdi3.S b/arch/sparc/lib/lshrdi3.S
+index 35abf5b..47a1354 100644
+--- a/arch/sparc/lib/lshrdi3.S
++++ b/arch/sparc/lib/lshrdi3.S
+@@ -1,4 +1,3 @@
+-/* $Id: lshrdi3.S,v 1.1 1999/03/21 06:37:45 davem Exp $ */
+ 
+ 	.globl	__lshrdi3
+ __lshrdi3:
+diff --git a/arch/sparc/lib/memscan.S b/arch/sparc/lib/memscan.S
+index 28e78ff..4ff1657 100644
+--- a/arch/sparc/lib/memscan.S
++++ b/arch/sparc/lib/memscan.S
+@@ -1,4 +1,4 @@
+-/* $Id: memscan.S,v 1.4 1996/09/08 02:01:20 davem Exp $
++/*
+  * memscan.S: Optimized memscan for the Sparc.
+  *
+  * Copyright (C) 1996 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/arch/sparc/lib/mul.S b/arch/sparc/lib/mul.S
+index da69356..c45470d 100644
+--- a/arch/sparc/lib/mul.S
++++ b/arch/sparc/lib/mul.S
+@@ -1,4 +1,4 @@
+-/* $Id: mul.S,v 1.4 1996/09/30 02:22:32 davem Exp $
++/*
+  * mul.S:       This routine was taken from glibc-1.09 and is covered
+  *              by the GNU Library General Public License Version 2.
+  */
+diff --git a/arch/sparc/lib/rem.S b/arch/sparc/lib/rem.S
+index bf015a9..42fb862 100644
+--- a/arch/sparc/lib/rem.S
++++ b/arch/sparc/lib/rem.S
+@@ -1,4 +1,4 @@
+-/* $Id: rem.S,v 1.7 1996/09/30 02:22:34 davem Exp $
++/*
+  * rem.S:       This routine was taken from glibc-1.09 and is covered
+  *              by the GNU Library General Public License Version 2.
+  */
+diff --git a/arch/sparc/lib/rwsem.S b/arch/sparc/lib/rwsem.S
+index f406b1f..9675268 100644
+--- a/arch/sparc/lib/rwsem.S
++++ b/arch/sparc/lib/rwsem.S
+@@ -1,4 +1,4 @@
+-/* $Id: rwsem.S,v 1.5 2000/05/09 17:40:13 davem Exp $
++/*
+  * Assembly part of rw semaphores.
+  *
+  * Copyright (C) 1999 Jakub Jelinek (jakub at redhat.com)
+diff --git a/arch/sparc/lib/sdiv.S b/arch/sparc/lib/sdiv.S
+index af94516..f0a0d4e 100644
+--- a/arch/sparc/lib/sdiv.S
++++ b/arch/sparc/lib/sdiv.S
+@@ -1,4 +1,4 @@
+-/* $Id: sdiv.S,v 1.6 1996/10/02 17:37:00 davem Exp $
++/*
+  * sdiv.S:      This routine was taken from glibc-1.09 and is covered
+  *              by the GNU Library General Public License Version 2.
+  */
+diff --git a/arch/sparc/lib/strncmp.S b/arch/sparc/lib/strncmp.S
+index 6156268..494ec66 100644
+--- a/arch/sparc/lib/strncmp.S
++++ b/arch/sparc/lib/strncmp.S
+@@ -1,4 +1,4 @@
+-/* $Id: strncmp.S,v 1.2 1996/09/09 02:47:20 davem Exp $
++/*
+  * strncmp.S: Hand optimized Sparc assembly of GCC output from GNU libc
+  *            generic strncmp routine.
+  */
+diff --git a/arch/sparc/lib/udiv.S b/arch/sparc/lib/udiv.S
+index 169e01d..2101405 100644
+--- a/arch/sparc/lib/udiv.S
++++ b/arch/sparc/lib/udiv.S
+@@ -1,4 +1,4 @@
+-/* $Id: udiv.S,v 1.4 1996/09/30 02:22:38 davem Exp $
++/*
+  * udiv.S:      This routine was taken from glibc-1.09 and is covered
+  *              by the GNU Library General Public License Version 2.
+  */
+diff --git a/arch/sparc/lib/umul.S b/arch/sparc/lib/umul.S
+index f0e5b20..1f36ae6 100644
+--- a/arch/sparc/lib/umul.S
++++ b/arch/sparc/lib/umul.S
+@@ -1,4 +1,4 @@
+-/* $Id: umul.S,v 1.4 1996/09/30 02:22:39 davem Exp $
++/*
+  * umul.S:      This routine was taken from glibc-1.09 and is covered
+  *              by the GNU Library General Public License Version 2.
+  */
+diff --git a/arch/sparc/lib/urem.S b/arch/sparc/lib/urem.S
+index 6b92bdc..77123eb 100644
+--- a/arch/sparc/lib/urem.S
++++ b/arch/sparc/lib/urem.S
+@@ -1,4 +1,4 @@
+-/* $Id: urem.S,v 1.4 1996/09/30 02:22:42 davem Exp $
++/*
+  * urem.S:      This routine was taken from glibc-1.09 and is covered
+  *              by the GNU Library General Public License Version 2.
+  */
+diff --git a/arch/sparc/math-emu/ashldi3.S b/arch/sparc/math-emu/ashldi3.S
+index eab1d09..7230ff5 100644
+--- a/arch/sparc/math-emu/ashldi3.S
++++ b/arch/sparc/math-emu/ashldi3.S
+@@ -1,4 +1,4 @@
+-/* $Id: ashldi3.S,v 1.1 1998/04/06 16:09:28 jj Exp $
++/*
+  * ashldi3.S:	Math-emu code creates all kinds of references to
+  *              this little routine on the sparc with gcc.
+  *
+diff --git a/arch/sparc/mm/Makefile b/arch/sparc/mm/Makefile
+index 16eeba4..109c8b2 100644
+--- a/arch/sparc/mm/Makefile
++++ b/arch/sparc/mm/Makefile
+@@ -1,4 +1,3 @@
+-# $Id: Makefile,v 1.38 2000/12/15 00:41:22 davem Exp $
+ # Makefile for the linux Sparc-specific parts of the memory manager.
+ #
+ 
+diff --git a/arch/sparc/mm/fault.c b/arch/sparc/mm/fault.c
+index abd5079..0a3cd8f 100644
+--- a/arch/sparc/mm/fault.c
++++ b/arch/sparc/mm/fault.c
+@@ -1,4 +1,4 @@
+-/* $Id: fault.c,v 1.122 2001/11/17 07:19:26 davem Exp $
++/*
+  * fault.c:  Page fault handlers for the Sparc.
+  *
+  * Copyright (C) 1995 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/arch/sparc/mm/generic.c b/arch/sparc/mm/generic.c
+index 1ef7fa0..a289261 100644
+--- a/arch/sparc/mm/generic.c
++++ b/arch/sparc/mm/generic.c
+@@ -1,4 +1,4 @@
+-/* $Id: generic.c,v 1.14 2001/12/21 04:56:15 davem Exp $
++/*
+  * generic.c: Generic Sparc mm routines that are not dependent upon
+  *            MMU type but are Sparc specific.
+  *
+diff --git a/arch/sparc/mm/hypersparc.S b/arch/sparc/mm/hypersparc.S
+index d29cc24..44aad32 100644
+--- a/arch/sparc/mm/hypersparc.S
++++ b/arch/sparc/mm/hypersparc.S
+@@ -1,4 +1,4 @@
+-/* $Id: hypersparc.S,v 1.18 2001/12/21 04:56:15 davem Exp $
++/*
+  * hypersparc.S: High speed Hypersparc mmu/cache operations.
+  *
+  * Copyright (C) 1997 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/arch/sparc/mm/init.c b/arch/sparc/mm/init.c
+index b89837a..7794ecb 100644
+--- a/arch/sparc/mm/init.c
++++ b/arch/sparc/mm/init.c
+@@ -1,4 +1,4 @@
+-/*  $Id: init.c,v 1.103 2001/11/19 19:03:08 davem Exp $
++/*
+  *  linux/arch/sparc/mm/init.c
+  *
+  *  Copyright (C) 1995 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/arch/sparc/mm/io-unit.c b/arch/sparc/mm/io-unit.c
+index b86dfce..f167835 100644
+--- a/arch/sparc/mm/io-unit.c
++++ b/arch/sparc/mm/io-unit.c
+@@ -1,4 +1,4 @@
+-/* $Id: io-unit.c,v 1.24 2001/12/17 07:05:09 davem Exp $
++/*
+  * io-unit.c:  IO-UNIT specific routines for memory management.
+  *
+  * Copyright (C) 1997,1998 Jakub Jelinek    (jj at sunsite.mff.cuni.cz)
+diff --git a/arch/sparc/mm/loadmmu.c b/arch/sparc/mm/loadmmu.c
+index 2d9cd65..652be05 100644
+--- a/arch/sparc/mm/loadmmu.c
++++ b/arch/sparc/mm/loadmmu.c
+@@ -1,4 +1,4 @@
+-/* $Id: loadmmu.c,v 1.56 2000/02/08 20:24:21 davem Exp $
++/*
+  * loadmmu.c:  This code loads up all the mm function pointers once the
+  *             machine type has been determined.  It also sets the static
+  *             mmu values such as PAGE_NONE, etc.
+diff --git a/arch/sparc/mm/nosrmmu.c b/arch/sparc/mm/nosrmmu.c
+index 9e21565..3701f70 100644
+--- a/arch/sparc/mm/nosrmmu.c
++++ b/arch/sparc/mm/nosrmmu.c
+@@ -1,4 +1,4 @@
+-/* $Id: nosrmmu.c,v 1.5 1999/11/19 04:11:54 davem Exp $
++/*
+  * nosrmmu.c: This file is a bunch of dummies for sun4 compiles, 
+  *         so that it does not need srmmu and avoid ifdefs.
+  *
+diff --git a/arch/sparc/mm/nosun4c.c b/arch/sparc/mm/nosun4c.c
+index ea2e210..196263f 100644
+--- a/arch/sparc/mm/nosun4c.c
++++ b/arch/sparc/mm/nosun4c.c
+@@ -1,4 +1,4 @@
+-/* $Id: nosun4c.c,v 1.3 2000/02/14 04:52:36 jj Exp $
++/*
+  * nosun4c.c: This file is a bunch of dummies for SMP compiles, 
+  *         so that it does not need sun4c and avoid ifdefs.
+  *
+diff --git a/arch/sparc/mm/swift.S b/arch/sparc/mm/swift.S
+index 9f4cd39..c801c39 100644
+--- a/arch/sparc/mm/swift.S
++++ b/arch/sparc/mm/swift.S
+@@ -1,4 +1,4 @@
+-/* $Id: swift.S,v 1.9 2002/01/08 11:11:59 davem Exp $
++/*
+  * swift.S: MicroSparc-II mmu/cache operations.
+  *
+  * Copyright (C) 1999 David S. Miller (davem at redhat.com)
+diff --git a/arch/sparc/mm/tsunami.S b/arch/sparc/mm/tsunami.S
+index 4988e6a..db0d6de 100644
+--- a/arch/sparc/mm/tsunami.S
++++ b/arch/sparc/mm/tsunami.S
+@@ -1,4 +1,4 @@
+-/* $Id: tsunami.S,v 1.7 2001/12/21 04:56:15 davem Exp $
++/*
+  * tsunami.S: High speed MicroSparc-I mmu/cache operations.
+  *
+  * Copyright (C) 1997 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/arch/sparc/mm/viking.S b/arch/sparc/mm/viking.S
+index 754c622..6dfcc13 100644
+--- a/arch/sparc/mm/viking.S
++++ b/arch/sparc/mm/viking.S
+@@ -1,4 +1,4 @@
+-/* $Id: viking.S,v 1.19 2001/12/21 04:56:15 davem Exp $
++/*
+  * viking.S: High speed Viking cache/mmu operations
+  *
+  * Copyright (C) 1997  Eddie C. Dost  (ecd at skynet.be)
+diff --git a/arch/sparc/prom/Makefile b/arch/sparc/prom/Makefile
+index 2b217ee..7f5eacf 100644
+--- a/arch/sparc/prom/Makefile
++++ b/arch/sparc/prom/Makefile
+@@ -1,4 +1,3 @@
+-# $Id: Makefile,v 1.8 2000/12/15 00:41:22 davem Exp $
+ # Makefile for the Sun Boot PROM interface library under
+ # Linux.
+ #
+diff --git a/arch/sparc/prom/bootstr.c b/arch/sparc/prom/bootstr.c
+index cfdeac2..5a35c76 100644
+--- a/arch/sparc/prom/bootstr.c
++++ b/arch/sparc/prom/bootstr.c
+@@ -1,4 +1,4 @@
+-/* $Id: bootstr.c,v 1.20 2000/02/08 20:24:23 davem Exp $
++/*
+  * bootstr.c:  Boot string/argument acquisition from the PROM.
+  *
+  * Copyright(C) 1995 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/arch/sparc/prom/console.c b/arch/sparc/prom/console.c
+index 2a007a7..790057a 100644
+--- a/arch/sparc/prom/console.c
++++ b/arch/sparc/prom/console.c
+@@ -1,4 +1,4 @@
+-/* $Id: console.c,v 1.25 2001/10/30 04:54:22 davem Exp $
++/*
+  * console.c: Routines that deal with sending and receiving IO
+  *            to/from the current console device using the PROM.
+  *
+diff --git a/arch/sparc/prom/devmap.c b/arch/sparc/prom/devmap.c
+index eb12073..1e51791 100644
+--- a/arch/sparc/prom/devmap.c
++++ b/arch/sparc/prom/devmap.c
+@@ -1,4 +1,4 @@
+-/* $Id: devmap.c,v 1.7 2000/08/26 02:38:03 anton Exp $
++/*
+  * promdevmap.c:  Map device/IO areas to virtual addresses.
+  *
+  * Copyright (C) 1995 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/arch/sparc/prom/devops.c b/arch/sparc/prom/devops.c
+index 61919b5..9f1a95c 100644
+--- a/arch/sparc/prom/devops.c
++++ b/arch/sparc/prom/devops.c
+@@ -1,4 +1,4 @@
+-/* $Id: devops.c,v 1.13 2000/08/26 02:38:03 anton Exp $
++/*
+  * devops.c:  Device operations using the PROM.
+  *
+  * Copyright (C) 1995 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/arch/sparc/prom/init.c b/arch/sparc/prom/init.c
+index 2fa3a47..729f870 100644
+--- a/arch/sparc/prom/init.c
++++ b/arch/sparc/prom/init.c
+@@ -1,4 +1,4 @@
+-/* $Id: init.c,v 1.14 2000/01/29 01:09:12 anton Exp $
++/*
+  * init.c:  Initialize internal variables used by the PROM
+  *          library functions.
+  *
+diff --git a/arch/sparc/prom/misc.c b/arch/sparc/prom/misc.c
+index d9fb3af..49b5057 100644
+--- a/arch/sparc/prom/misc.c
++++ b/arch/sparc/prom/misc.c
+@@ -1,4 +1,4 @@
+-/* $Id: misc.c,v 1.18 2000/08/26 02:38:03 anton Exp $
++/*
+  * misc.c:  Miscellaneous prom functions that don't belong
+  *          anywhere else.
+  *
+diff --git a/arch/sparc/prom/mp.c b/arch/sparc/prom/mp.c
+index 92fe373..4c4dc79 100644
+--- a/arch/sparc/prom/mp.c
++++ b/arch/sparc/prom/mp.c
+@@ -1,4 +1,4 @@
+-/* $Id: mp.c,v 1.12 2000/08/26 02:38:03 anton Exp $
++/*
+  * mp.c:  OpenBoot Prom Multiprocessor support routines.  Don't call
+  *        these on a UP or else you will halt and catch fire. ;)
+  *
+diff --git a/arch/sparc/prom/palloc.c b/arch/sparc/prom/palloc.c
+index 84ce8bc..20be339 100644
+--- a/arch/sparc/prom/palloc.c
++++ b/arch/sparc/prom/palloc.c
+@@ -1,4 +1,4 @@
+-/* $Id: palloc.c,v 1.4 1996/04/25 06:09:48 davem Exp $
++/*
+  * palloc.c:  Memory allocation from the Sun PROM.
+  *
+  * Copyright (C) 1995 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/arch/sparc/prom/ranges.c b/arch/sparc/prom/ranges.c
+index a292032..f9b7def 100644
+--- a/arch/sparc/prom/ranges.c
++++ b/arch/sparc/prom/ranges.c
+@@ -1,4 +1,4 @@
+-/* $Id: ranges.c,v 1.15 2001/12/19 00:29:51 davem Exp $
++/*
+  * ranges.c: Handle ranges in newer proms for obio/sbus.
+  *
+  * Copyright (C) 1995 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/arch/sparc/prom/segment.c b/arch/sparc/prom/segment.c
+index 09d6460..04fd03a 100644
+--- a/arch/sparc/prom/segment.c
++++ b/arch/sparc/prom/segment.c
+@@ -1,4 +1,4 @@
+-/* $Id: segment.c,v 1.7 2000/08/26 02:38:03 anton Exp $
++/*
+  * segment.c:  Prom routine to map segments in other contexts before
+  *             a standalone is completely mapped.  This is for sun4 and
+  *             sun4c architectures only.
+diff --git a/arch/sparc/prom/tree.c b/arch/sparc/prom/tree.c
+index 5ec2465..f228fe0 100644
+--- a/arch/sparc/prom/tree.c
++++ b/arch/sparc/prom/tree.c
+@@ -1,4 +1,4 @@
+-/* $Id: tree.c,v 1.26 2000/08/26 02:38:03 anton Exp $
++/*
+  * tree.c: Basic device tree traversal/scanning for the Linux
+  *         prom library.
+  *
+diff --git a/arch/sparc64/Makefile b/arch/sparc64/Makefile
+index 9cb75c8..4b8f2b0 100644
+--- a/arch/sparc64/Makefile
++++ b/arch/sparc64/Makefile
+@@ -1,4 +1,3 @@
+-# $Id: Makefile,v 1.52 2002/02/09 19:49:31 davem Exp $
+ # sparc64/Makefile
+ #
+ # Makefile for the architecture dependent flags and dependencies on the
+diff --git a/arch/sparc64/boot/Makefile b/arch/sparc64/boot/Makefile
+index 6968a6d..0458b52 100644
+--- a/arch/sparc64/boot/Makefile
++++ b/arch/sparc64/boot/Makefile
+@@ -1,4 +1,3 @@
+-# $Id: Makefile,v 1.4 1997/12/15 20:08:56 ecd Exp $
+ # Makefile for the Sparc64 boot stuff.
+ #
+ # Copyright (C) 1995 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/arch/sparc64/boot/piggyback.c b/arch/sparc64/boot/piggyback.c
+index 36f9074..de364bf 100644
+--- a/arch/sparc64/boot/piggyback.c
++++ b/arch/sparc64/boot/piggyback.c
+@@ -1,4 +1,4 @@
+-/* $Id: piggyback.c,v 1.2 2000/09/19 14:34:39 anton Exp $
++/*
+    Simple utility to make a single-image install kernel with initial ramdisk
+    for Sparc64 tftpbooting without need to set up nfs.
+    
+diff --git a/arch/sparc64/kernel/dtlb_prot.S b/arch/sparc64/kernel/dtlb_prot.S
+index e0a9201..b2c2c5b 100644
+--- a/arch/sparc64/kernel/dtlb_prot.S
++++ b/arch/sparc64/kernel/dtlb_prot.S
+@@ -1,4 +1,4 @@
+-/* $Id: dtlb_prot.S,v 1.22 2001/04/11 23:40:32 davem Exp $
++/*
+  * dtlb_prot.S: DTLB protection trap strategy.
+  *              This is included directly into the trap table.
+  *
+diff --git a/arch/sparc64/kernel/ebus.c b/arch/sparc64/kernel/ebus.c
+index bc26322..c49d038 100644
+--- a/arch/sparc64/kernel/ebus.c
++++ b/arch/sparc64/kernel/ebus.c
+@@ -1,4 +1,4 @@
+-/* $Id: ebus.c,v 1.64 2001/11/08 04:41:33 davem Exp $
++/*
+  * ebus.c: PCI to EBus bridge device.
+  *
+  * Copyright (C) 1997  Eddie C. Dost  (ecd at skynet.be)
+diff --git a/arch/sparc64/kernel/etrap.S b/arch/sparc64/kernel/etrap.S
+index f25e1da..29ce489 100644
+--- a/arch/sparc64/kernel/etrap.S
++++ b/arch/sparc64/kernel/etrap.S
+@@ -1,4 +1,4 @@
+-/* $Id: etrap.S,v 1.46 2002/02/09 19:49:30 davem Exp $
++/*
+  * etrap.S: Preparing for entry into the kernel on Sparc V9.
+  *
+  * Copyright (C) 1996, 1997 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/arch/sparc64/kernel/idprom.c b/arch/sparc64/kernel/idprom.c
+index 3b6789e..5b45a80 100644
+--- a/arch/sparc64/kernel/idprom.c
++++ b/arch/sparc64/kernel/idprom.c
+@@ -1,4 +1,4 @@
+-/* $Id: idprom.c,v 1.3 1999/08/31 06:54:53 davem Exp $
++/*
+  * idprom.c: Routines to load the idprom into kernel addresses and
+  *           interpret the data contained within.
+  *
+diff --git a/arch/sparc64/kernel/init_task.c b/arch/sparc64/kernel/init_task.c
+index 90007cf..d2b3123 100644
+--- a/arch/sparc64/kernel/init_task.c
++++ b/arch/sparc64/kernel/init_task.c
+@@ -10,7 +10,6 @@
+ #include <asm/processor.h>
+ 
+ static struct fs_struct init_fs = INIT_FS;
+-static struct files_struct init_files = INIT_FILES;
+ static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
+ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
+ struct mm_struct init_mm = INIT_MM(init_mm);
+diff --git a/arch/sparc64/kernel/process.c b/arch/sparc64/kernel/process.c
+index 4129c04..0a0c05f 100644
+--- a/arch/sparc64/kernel/process.c
++++ b/arch/sparc64/kernel/process.c
+@@ -1,6 +1,6 @@
+ /*  arch/sparc64/kernel/process.c
+  *
+- *  Copyright (C) 1995, 1996 David S. Miller (davem at caip.rutgers.edu)
++ *  Copyright (C) 1995, 1996, 2008 David S. Miller (davem at davemloft.net)
+  *  Copyright (C) 1996       Eddie C. Dost   (ecd at skynet.be)
+  *  Copyright (C) 1997, 1998 Jakub Jelinek   (jj at sunsite.mff.cuni.cz)
+  */
+@@ -30,6 +30,7 @@
+ #include <linux/init.h>
+ #include <linux/cpu.h>
+ #include <linux/elfcore.h>
++#include <linux/sysrq.h>
+ 
+ #include <asm/oplib.h>
+ #include <asm/uaccess.h>
+@@ -49,6 +50,8 @@
+ #include <asm/sstate.h>
+ #include <asm/reboot.h>
+ #include <asm/syscalls.h>
++#include <asm/irq_regs.h>
++#include <asm/smp.h>
+ 
+ /* #define VERBOSE_SHOWREGS */
+ 
+@@ -298,6 +301,118 @@ void show_regs(struct pt_regs *regs)
+ #endif
+ }
+ 
++#ifdef CONFIG_MAGIC_SYSRQ
++struct global_reg_snapshot global_reg_snapshot[NR_CPUS];
++static DEFINE_SPINLOCK(global_reg_snapshot_lock);
++
++static void __global_reg_self(struct thread_info *tp, struct pt_regs *regs,
++			      int this_cpu)
++{
++	flushw_all();
++
++	global_reg_snapshot[this_cpu].tstate = regs->tstate;
++	global_reg_snapshot[this_cpu].tpc = regs->tpc;
++	global_reg_snapshot[this_cpu].tnpc = regs->tnpc;
++	global_reg_snapshot[this_cpu].o7 = regs->u_regs[UREG_I7];
++
++	if (regs->tstate & TSTATE_PRIV) {
++		struct reg_window *rw;
++
++		rw = (struct reg_window *)
++			(regs->u_regs[UREG_FP] + STACK_BIAS);
++		global_reg_snapshot[this_cpu].i7 = rw->ins[6];
++	} else
++		global_reg_snapshot[this_cpu].i7 = 0;
++
++	global_reg_snapshot[this_cpu].thread = tp;
++}
++
++/* In order to avoid hangs we do not try to synchronize with the
++ * global register dump client cpus.  The last store they make is to
++ * the thread pointer, so do a short poll waiting for that to become
++ * non-NULL.
++ */
++static void __global_reg_poll(struct global_reg_snapshot *gp)
++{
++	int limit = 0;
++
++	while (!gp->thread && ++limit < 100) {
++		barrier();
++		udelay(1);
++	}
++}
++
++static void sysrq_handle_globreg(int key, struct tty_struct *tty)
++{
++	struct thread_info *tp = current_thread_info();
++	struct pt_regs *regs = get_irq_regs();
++#ifdef CONFIG_KALLSYMS
++	char buffer[KSYM_SYMBOL_LEN];
++#endif
++	unsigned long flags;
++	int this_cpu, cpu;
++
++	if (!regs)
++		regs = tp->kregs;
++
++	spin_lock_irqsave(&global_reg_snapshot_lock, flags);
++
++	memset(global_reg_snapshot, 0, sizeof(global_reg_snapshot));
++
++	this_cpu = raw_smp_processor_id();
++
++	__global_reg_self(tp, regs, this_cpu);
++
++	smp_fetch_global_regs();
++
++	for_each_online_cpu(cpu) {
++		struct global_reg_snapshot *gp = &global_reg_snapshot[cpu];
++		struct thread_info *tp;
++
++		__global_reg_poll(gp);
++
++		tp = gp->thread;
++		printk("%c CPU[%3d]: TSTATE[%016lx] TPC[%016lx] TNPC[%016lx] TASK[%s:%d]\n",
++		       (cpu == this_cpu ? '*' : ' '), cpu,
++		       gp->tstate, gp->tpc, gp->tnpc,
++		       ((tp && tp->task) ? tp->task->comm : "NULL"),
++		       ((tp && tp->task) ? tp->task->pid : -1));
++#ifdef CONFIG_KALLSYMS
++		if (gp->tstate & TSTATE_PRIV) {
++			sprint_symbol(buffer, gp->tpc);
++			printk("             TPC[%s] ", buffer);
++			sprint_symbol(buffer, gp->o7);
++			printk("O7[%s] ", buffer);
++			sprint_symbol(buffer, gp->i7);
++			printk("I7[%s]\n", buffer);
++		} else
++#endif
++		{
++			printk("             TPC[%lx] O7[%lx] I7[%lx]\n",
++			       gp->tpc, gp->o7, gp->i7);
++		}
++	}
++
++	memset(global_reg_snapshot, 0, sizeof(global_reg_snapshot));
++
++	spin_unlock_irqrestore(&global_reg_snapshot_lock, flags);
++}
++
++static struct sysrq_key_op sparc_globalreg_op = {
++	.handler	= sysrq_handle_globreg,
++	.help_msg	= "Globalregs",
++	.action_msg	= "Show Global CPU Regs",
++};
++
++static int __init sparc_globreg_init(void)
++{
++	return register_sysrq_key('y', &sparc_globalreg_op);
++}
++
++core_initcall(sparc_globreg_init);
++
++#endif
++
+ unsigned long thread_saved_pc(struct task_struct *tsk)
+ {
+ 	struct thread_info *ti = task_thread_info(tsk);
+diff --git a/arch/sparc64/kernel/rtrap.S b/arch/sparc64/kernel/rtrap.S
+index 16689b2..3afacbb 100644
+--- a/arch/sparc64/kernel/rtrap.S
++++ b/arch/sparc64/kernel/rtrap.S
+@@ -1,4 +1,4 @@
+-/* $Id: rtrap.S,v 1.61 2002/02/09 19:49:31 davem Exp $
++/*
+  * rtrap.S: Preparing for return from trap on Sparc V9.
+  *
+  * Copyright (C) 1997,1998 Jakub Jelinek (jj at sunsite.mff.cuni.cz)
+diff --git a/arch/sparc64/kernel/sbus.c b/arch/sparc64/kernel/sbus.c
+index fa2827c..e33a8a6 100644
+--- a/arch/sparc64/kernel/sbus.c
++++ b/arch/sparc64/kernel/sbus.c
+@@ -1,4 +1,4 @@
+-/* $Id: sbus.c,v 1.19 2002/01/23 11:27:32 davem Exp $
++/*
+  * sbus.c: UltraSparc SBUS controller support.
+  *
+  * Copyright (C) 1999 David S. Miller (davem at redhat.com)
+diff --git a/arch/sparc64/kernel/setup.c b/arch/sparc64/kernel/setup.c
+index da5e6ee..c8b03a4 100644
+--- a/arch/sparc64/kernel/setup.c
++++ b/arch/sparc64/kernel/setup.c
+@@ -1,4 +1,4 @@
+-/*  $Id: setup.c,v 1.72 2002/02/09 19:49:30 davem Exp $
++/*
+  *  linux/arch/sparc64/kernel/setup.c
+  *
+  *  Copyright (C) 1995,1996  David S. Miller (davem at caip.rutgers.edu)
+diff --git a/arch/sparc64/kernel/signal.c b/arch/sparc64/kernel/signal.c
+index 6e4dc67..9667e96 100644
+--- a/arch/sparc64/kernel/signal.c
++++ b/arch/sparc64/kernel/signal.c
+@@ -1,4 +1,4 @@
+-/*  $Id: signal.c,v 1.60 2002/02/09 19:49:31 davem Exp $
++/*
+  *  arch/sparc64/kernel/signal.c
+  *
+  *  Copyright (C) 1991, 1992  Linus Torvalds
+diff --git a/arch/sparc64/kernel/smp.c b/arch/sparc64/kernel/smp.c
+index 0d6403a..fa63c68 100644
+--- a/arch/sparc64/kernel/smp.c
++++ b/arch/sparc64/kernel/smp.c
+@@ -900,6 +900,9 @@ extern unsigned long xcall_flush_tlb_mm;
+ extern unsigned long xcall_flush_tlb_pending;
+ extern unsigned long xcall_flush_tlb_kernel_range;
+ extern unsigned long xcall_report_regs;
++#ifdef CONFIG_MAGIC_SYSRQ
++extern unsigned long xcall_fetch_glob_regs;
++#endif
+ extern unsigned long xcall_receive_signal;
+ extern unsigned long xcall_new_mmu_context_version;
+ #ifdef CONFIG_KGDB
+@@ -1080,6 +1083,13 @@ void smp_report_regs(void)
+ 	smp_cross_call(&xcall_report_regs, 0, 0, 0);
+ }
+ 
++#ifdef CONFIG_MAGIC_SYSRQ
++void smp_fetch_global_regs(void)
++{
++	smp_cross_call(&xcall_fetch_glob_regs, 0, 0, 0);
++}
++#endif
++
+ /* We know that the window frames of the user have been flushed
+  * to the stack before we get here because all callers of us
+  * are flush_tlb_*() routines, and these run after flush_cache_*()
+diff --git a/arch/sparc64/kernel/starfire.c b/arch/sparc64/kernel/starfire.c
+index b930fee..7461581 100644
+--- a/arch/sparc64/kernel/starfire.c
++++ b/arch/sparc64/kernel/starfire.c
+@@ -1,4 +1,4 @@
+-/* $Id: starfire.c,v 1.10 2001/04/14 21:13:45 davem Exp $
++/*
+  * starfire.c: Starfire/E10000 support.
+  *
+  * Copyright (C) 1998 David S. Miller (davem at redhat.com)
+diff --git a/arch/sparc64/kernel/sys32.S b/arch/sparc64/kernel/sys32.S
+index 010a737..ade18ba 100644
+--- a/arch/sparc64/kernel/sys32.S
++++ b/arch/sparc64/kernel/sys32.S
+@@ -1,4 +1,4 @@
+-/* $Id: sys32.S,v 1.12 2000/03/24 04:17:37 davem Exp $
++/*
+  * sys32.S: I-cache tricks for 32-bit compatibility layer simple
+  *          conversions.
+  *
+diff --git a/arch/sparc64/kernel/trampoline.S b/arch/sparc64/kernel/trampoline.S
+index 56ff552..704a3af 100644
+--- a/arch/sparc64/kernel/trampoline.S
++++ b/arch/sparc64/kernel/trampoline.S
+@@ -1,4 +1,4 @@
+-/* $Id: trampoline.S,v 1.26 2002/02/09 19:49:30 davem Exp $
++/*
+  * trampoline.S: Jump start slave processors on sparc64.
+  *
+  * Copyright (C) 1997 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/arch/sparc64/kernel/unaligned.c b/arch/sparc64/kernel/unaligned.c
+index 1a511e9..afa7fc4 100644
+--- a/arch/sparc64/kernel/unaligned.c
++++ b/arch/sparc64/kernel/unaligned.c
+@@ -1,4 +1,4 @@
+-/* $Id: unaligned.c,v 1.24 2002/02/09 19:49:31 davem Exp $
++/*
+  * unaligned.c: Unaligned load/store trap handling with special
+  *              cases for the kernel to do them more quickly.
+  *
+diff --git a/arch/sparc64/lib/PeeCeeI.c b/arch/sparc64/lib/PeeCeeI.c
+index 3c6cfbb..8b313f1 100644
+--- a/arch/sparc64/lib/PeeCeeI.c
++++ b/arch/sparc64/lib/PeeCeeI.c
+@@ -1,4 +1,4 @@
+-/* $Id: PeeCeeI.c,v 1.4 1999/09/06 01:17:35 davem Exp $
++/*
+  * PeeCeeI.c: The emerging standard...
+  *
+  * Copyright (C) 1997 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/arch/sparc64/lib/VISsave.S b/arch/sparc64/lib/VISsave.S
+index a0ded5c..b320ae9 100644
+--- a/arch/sparc64/lib/VISsave.S
++++ b/arch/sparc64/lib/VISsave.S
+@@ -1,4 +1,4 @@
+-/* $Id: VISsave.S,v 1.6 2002/02/09 19:49:30 davem Exp $
++/*
+  * VISsave.S: Code for saving FPU register state for
+  *            VIS routines. One should not call this directly,
+  *            but use macros provided in <asm/visasm.h>.
+diff --git a/arch/sparc64/lib/memcmp.S b/arch/sparc64/lib/memcmp.S
+index c90ad96..d3fdaa8 100644
+--- a/arch/sparc64/lib/memcmp.S
++++ b/arch/sparc64/lib/memcmp.S
+@@ -1,4 +1,4 @@
+-/* $Id: memcmp.S,v 1.3 2000/03/23 07:51:08 davem Exp $
++/*
+  * Sparc64 optimized memcmp code.
+  *
+  * Copyright (C) 1997 Jakub Jelinek (jj at sunsite.mff.cuni.cz)
+diff --git a/arch/sparc64/lib/memscan.S b/arch/sparc64/lib/memscan.S
+index 5e72d49..5686dfa 100644
+--- a/arch/sparc64/lib/memscan.S
++++ b/arch/sparc64/lib/memscan.S
+@@ -1,4 +1,4 @@
+-/* $Id: memscan.S,v 1.3 2000/01/31 04:59:10 davem Exp $
++/*
+  * memscan.S: Optimized memscan for Sparc64.
+  *
+  * Copyright (C) 1997,1998 Jakub Jelinek (jj at ultra.linux.cz)
+diff --git a/arch/sparc64/lib/strncmp.S b/arch/sparc64/lib/strncmp.S
+index 6f14f53..980e837 100644
+--- a/arch/sparc64/lib/strncmp.S
++++ b/arch/sparc64/lib/strncmp.S
+@@ -1,4 +1,4 @@
+-/* $Id: strncmp.S,v 1.2 1997/03/11 17:51:44 jj Exp $
++/*
+  * Sparc64 optimized strncmp code.
+  *
+  * Copyright (C) 1997 Jakub Jelinek (jj at sunsite.mff.cuni.cz)
+diff --git a/arch/sparc64/lib/strncpy_from_user.S b/arch/sparc64/lib/strncpy_from_user.S
+index b2f499f..511c8f1 100644
+--- a/arch/sparc64/lib/strncpy_from_user.S
++++ b/arch/sparc64/lib/strncpy_from_user.S
+@@ -1,4 +1,4 @@
+-/* $Id: strncpy_from_user.S,v 1.6 1999/05/25 16:53:05 jj Exp $
++/*
+  * strncpy_from_user.S: Sparc64 strncpy from userspace.
+  *
+  *  Copyright (C) 1997, 1999 Jakub Jelinek (jj at ultra.linux.cz)
+diff --git a/arch/sparc64/math-emu/math.c b/arch/sparc64/math-emu/math.c
+index 6ee496c..add053e 100644
+--- a/arch/sparc64/math-emu/math.c
++++ b/arch/sparc64/math-emu/math.c
+@@ -1,4 +1,4 @@
+-/* $Id: math.c,v 1.11 1999/12/20 05:02:25 davem Exp $
++/*
+  * arch/sparc64/math-emu/math.c
+  *
+  * Copyright (C) 1997,1999 Jakub Jelinek (jj at ultra.linux.cz)
+diff --git a/arch/sparc64/math-emu/sfp-util.h b/arch/sparc64/math-emu/sfp-util.h
+index 31e4747..425d3cf 100644
+--- a/arch/sparc64/math-emu/sfp-util.h
++++ b/arch/sparc64/math-emu/sfp-util.h
+@@ -1,4 +1,4 @@
+-/* $Id: sfp-util.h,v 1.5 2001/06/10 06:48:46 davem Exp $
++/*
+  * arch/sparc64/math-emu/sfp-util.h
+  *
+  * Copyright (C) 1999 Jakub Jelinek (jj at ultra.linux.cz)
+diff --git a/arch/sparc64/mm/Makefile b/arch/sparc64/mm/Makefile
+index e415bf9..68d04c0 100644
+--- a/arch/sparc64/mm/Makefile
++++ b/arch/sparc64/mm/Makefile
+@@ -1,4 +1,3 @@
+-# $Id: Makefile,v 1.8 2000/12/14 22:57:25 davem Exp $
+ # Makefile for the linux Sparc64-specific parts of the memory manager.
+ #
+ 
+diff --git a/arch/sparc64/mm/fault.c b/arch/sparc64/mm/fault.c
+index 2650d0d..236f4d2 100644
+--- a/arch/sparc64/mm/fault.c
++++ b/arch/sparc64/mm/fault.c
+@@ -1,4 +1,4 @@
+-/* $Id: fault.c,v 1.59 2002/02/09 19:49:31 davem Exp $
++/*
+  * arch/sparc64/mm/fault.c: Page fault handlers for the 64-bit Sparc.
+  *
+  * Copyright (C) 1996 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/arch/sparc64/mm/generic.c b/arch/sparc64/mm/generic.c
+index af9d81d..f362c20 100644
+--- a/arch/sparc64/mm/generic.c
++++ b/arch/sparc64/mm/generic.c
+@@ -1,4 +1,4 @@
+-/* $Id: generic.c,v 1.18 2001/12/21 04:56:15 davem Exp $
++/*
+  * generic.c: Generic Sparc mm routines that are not dependent upon
+  *            MMU type but are Sparc specific.
+  *
+diff --git a/arch/sparc64/mm/init.c b/arch/sparc64/mm/init.c
+index 3c7b947..84898c4 100644
+--- a/arch/sparc64/mm/init.c
++++ b/arch/sparc64/mm/init.c
+@@ -1,4 +1,4 @@
+-/*  $Id: init.c,v 1.209 2002/02/09 19:49:31 davem Exp $
++/*
+  *  arch/sparc64/mm/init.c
+  *
+  *  Copyright (C) 1996-1999 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/arch/sparc64/mm/ultra.S b/arch/sparc64/mm/ultra.S
+index 796e005..9bb2d90 100644
+--- a/arch/sparc64/mm/ultra.S
++++ b/arch/sparc64/mm/ultra.S
+@@ -1,7 +1,7 @@
+-/* $Id: ultra.S,v 1.72 2002/02/09 19:49:31 davem Exp $
++/*
+  * ultra.S: Don't expand these all over the place...
+  *
+- * Copyright (C) 1997, 2000 David S. Miller (davem at redhat.com)
++ * Copyright (C) 1997, 2000, 2008 David S. Miller (davem at davemloft.net)
+  */
+ 
+ #include <asm/asi.h>
+@@ -15,6 +15,7 @@
+ #include <asm/thread_info.h>
+ #include <asm/cacheflush.h>
+ #include <asm/hypervisor.h>
++#include <asm/cpudata.h>
+ 
+ 	/* Basically, most of the Spitfire vs. Cheetah madness
+ 	 * has to do with the fact that Cheetah does not support
+@@ -514,6 +515,32 @@ xcall_report_regs:
+ 	b		rtrap_xcall
+ 	 ldx		[%sp + PTREGS_OFF + PT_V9_TSTATE], %l1
+ 
++#ifdef CONFIG_MAGIC_SYSRQ
++	.globl		xcall_fetch_glob_regs
++xcall_fetch_glob_regs:
++	sethi		%hi(global_reg_snapshot), %g1
++	or		%g1, %lo(global_reg_snapshot), %g1
++	__GET_CPUID(%g2)
++	sllx		%g2, 6, %g3
++	add		%g1, %g3, %g1
++	rdpr		%tstate, %g7
++	stx		%g7, [%g1 + GR_SNAP_TSTATE]
++	rdpr		%tpc, %g7
++	stx		%g7, [%g1 + GR_SNAP_TPC]
++	rdpr		%tnpc, %g7
++	stx		%g7, [%g1 + GR_SNAP_TNPC]
++	stx		%o7, [%g1 + GR_SNAP_O7]
++	stx		%i7, [%g1 + GR_SNAP_I7]
++	sethi		%hi(trap_block), %g7
++	or		%g7, %lo(trap_block), %g7
++	sllx		%g2, TRAP_BLOCK_SZ_SHIFT, %g2
++	add		%g7, %g2, %g7
++	ldx		[%g7 + TRAP_PER_CPU_THREAD], %g3
++	membar		#StoreStore
++	stx		%g3, [%g1 + GR_SNAP_THREAD]
++	retry
++#endif /* CONFIG_MAGIC_SYSRQ */
++
+ #ifdef DCACHE_ALIASING_POSSIBLE
+ 	.align		32
+ 	.globl		xcall_flush_dcache_page_cheetah
+diff --git a/arch/sparc64/prom/Makefile b/arch/sparc64/prom/Makefile
+index 3d33ed2..8c94483 100644
+--- a/arch/sparc64/prom/Makefile
++++ b/arch/sparc64/prom/Makefile
+@@ -1,4 +1,3 @@
+-# $Id: Makefile,v 1.7 2000/12/14 22:57:25 davem Exp $
+ # Makefile for the Sun Boot PROM interface library under
+ # Linux.
+ #
+diff --git a/arch/sparc64/prom/bootstr.c b/arch/sparc64/prom/bootstr.c
+index a727861..ab9ccc6 100644
+--- a/arch/sparc64/prom/bootstr.c
++++ b/arch/sparc64/prom/bootstr.c
+@@ -1,4 +1,4 @@
+-/* $Id: bootstr.c,v 1.6 1999/08/31 06:55:01 davem Exp $
++/*
+  * bootstr.c:  Boot string/argument acquisition from the PROM.
+  *
+  * Copyright(C) 1995 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/arch/sparc64/prom/devops.c b/arch/sparc64/prom/devops.c
+index 4641839..9dbd803 100644
+--- a/arch/sparc64/prom/devops.c
++++ b/arch/sparc64/prom/devops.c
+@@ -1,4 +1,4 @@
+-/* $Id: devops.c,v 1.3 1997/10/29 07:43:28 ecd Exp $
++/*
+  * devops.c:  Device operations using the PROM.
+  *
+  * Copyright (C) 1995 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/arch/sparc64/prom/init.c b/arch/sparc64/prom/init.c
+index 87e7c7e..7b00f89 100644
+--- a/arch/sparc64/prom/init.c
++++ b/arch/sparc64/prom/init.c
+@@ -1,4 +1,4 @@
+-/* $Id: init.c,v 1.10 1999/09/21 14:35:59 davem Exp $
++/*
+  * init.c:  Initialize internal variables used by the PROM
+  *          library functions.
+  *
+diff --git a/arch/sparc64/prom/misc.c b/arch/sparc64/prom/misc.c
+index 47a877a..9b0c076 100644
+--- a/arch/sparc64/prom/misc.c
++++ b/arch/sparc64/prom/misc.c
+@@ -1,4 +1,4 @@
+-/* $Id: misc.c,v 1.20 2001/09/21 03:17:07 kanoj Exp $
++/*
+  * misc.c:  Miscellaneous prom functions that don't belong
+  *          anywhere else.
+  *
+diff --git a/arch/sparc64/prom/p1275.c b/arch/sparc64/prom/p1275.c
+index 7fcccc0..4b7c937 100644
+--- a/arch/sparc64/prom/p1275.c
++++ b/arch/sparc64/prom/p1275.c
+@@ -1,4 +1,4 @@
+-/* $Id: p1275.c,v 1.22 2001/10/18 09:40:00 davem Exp $
++/*
+  * p1275.c: Sun IEEE 1275 PROM low level interface routines
+  *
+  * Copyright (C) 1996,1997 Jakub Jelinek (jj at sunsite.mff.cuni.cz)
+diff --git a/arch/sparc64/prom/tree.c b/arch/sparc64/prom/tree.c
+index a99ccd7..281aea4 100644
+--- a/arch/sparc64/prom/tree.c
++++ b/arch/sparc64/prom/tree.c
+@@ -1,4 +1,4 @@
+-/* $Id: tree.c,v 1.10 1998/01/10 22:39:00 ecd Exp $
++/*
+  * tree.c: Basic device tree traversal/scanning for the Linux
+  *         prom library.
+  *
+diff --git a/arch/um/kernel/init_task.c b/arch/um/kernel/init_task.c
+index dcfceca..910eda8 100644
+--- a/arch/um/kernel/init_task.c
++++ b/arch/um/kernel/init_task.c
+@@ -12,7 +12,6 @@
+ 
+ static struct fs_struct init_fs = INIT_FS;
+ struct mm_struct init_mm = INIT_MM(init_mm);
+-static struct files_struct init_files = INIT_FILES;
+ static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
+ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
+ EXPORT_SYMBOL(init_mm);
+diff --git a/arch/v850/kernel/init_task.c b/arch/v850/kernel/init_task.c
+index ed2f93c..44b274d 100644
+--- a/arch/v850/kernel/init_task.c
++++ b/arch/v850/kernel/init_task.c
+@@ -21,7 +21,6 @@
+ #include <asm/pgtable.h>
+ 
+ static struct fs_struct init_fs = INIT_FS;
+-static struct files_struct init_files = INIT_FILES;
+ static struct signal_struct init_signals = INIT_SIGNALS (init_signals);
+ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
+ struct mm_struct init_mm = INIT_MM (init_mm);
+diff --git a/arch/x86/kernel/init_task.c b/arch/x86/kernel/init_task.c
+index 3d01e47..a4f93b4 100644
+--- a/arch/x86/kernel/init_task.c
++++ b/arch/x86/kernel/init_task.c
+@@ -11,7 +11,6 @@
+ #include <asm/desc.h>
+ 
+ static struct fs_struct init_fs = INIT_FS;
+-static struct files_struct init_files = INIT_FILES;
+ static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
+ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
+ struct mm_struct init_mm = INIT_MM(init_mm);
+diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c
+index 3324d90..7c077a9 100644
+--- a/arch/x86/kvm/i8254.c
++++ b/arch/x86/kvm/i8254.c
+@@ -216,7 +216,7 @@ int pit_has_pending_timer(struct kvm_vcpu *vcpu)
+ {
+ 	struct kvm_pit *pit = vcpu->kvm->arch.vpit;
+ 
+-	if (pit && vcpu->vcpu_id == 0)
++	if (pit && vcpu->vcpu_id == 0 && pit->pit_state.inject_pending)
+ 		return atomic_read(&pit->pit_state.pit_timer.pending);
+ 
+ 	return 0;
+diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
+index 36809d7..c297c50 100644
+--- a/arch/x86/kvm/lapic.c
++++ b/arch/x86/kvm/lapic.c
+@@ -957,7 +957,7 @@ int apic_has_pending_timer(struct kvm_vcpu *vcpu)
+ {
+ 	struct kvm_lapic *lapic = vcpu->arch.apic;
+ 
+-	if (lapic)
++	if (lapic && apic_enabled(lapic) && apic_lvt_enabled(lapic, APIC_LVTT))
+ 		return atomic_read(&lapic->timer.pending);
+ 
+ 	return 0;
+diff --git a/arch/x86/kvm/x86_emulate.c b/arch/x86/kvm/x86_emulate.c
+index f2a696d..8a96320 100644
+--- a/arch/x86/kvm/x86_emulate.c
++++ b/arch/x86/kvm/x86_emulate.c
+@@ -677,8 +677,9 @@ static int decode_modrm(struct x86_emulate_ctxt *ctxt,
+ 	c->use_modrm_ea = 1;
+ 
+ 	if (c->modrm_mod == 3) {
+-		c->modrm_val = *(unsigned long *)
+-			decode_register(c->modrm_rm, c->regs, c->d & ByteOp);
++		c->modrm_ptr = decode_register(c->modrm_rm,
++					       c->regs, c->d & ByteOp);
++		c->modrm_val = *(unsigned long *)c->modrm_ptr;
+ 		return rc;
+ 	}
+ 
+@@ -1005,6 +1006,7 @@ done_prefixes:
+ 		if ((c->d & ModRM) && c->modrm_mod == 3) {
+ 			c->src.type = OP_REG;
+ 			c->src.val = c->modrm_val;
++			c->src.ptr = c->modrm_ptr;
+ 			break;
+ 		}
+ 		c->src.type = OP_MEM;
+@@ -1049,6 +1051,7 @@ done_prefixes:
+ 		if ((c->d & ModRM) && c->modrm_mod == 3) {
+ 			c->dst.type = OP_REG;
+ 			c->dst.val = c->dst.orig_val = c->modrm_val;
++			c->dst.ptr = c->modrm_ptr;
+ 			break;
+ 		}
+ 		c->dst.type = OP_MEM;
+diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c
+index 8545c8a..6e64aaf 100644
+--- a/arch/x86/pci/common.c
++++ b/arch/x86/pci/common.c
+@@ -302,18 +302,18 @@ static struct dmi_system_id __devinitdata pciprobe_dmi_table[] = {
+ 	},
+ 	{
+ 		.callback = set_bf_sort,
+-		.ident = "HP ProLiant DL385 G2",
++		.ident = "HP ProLiant DL360",
+ 		.matches = {
+ 			DMI_MATCH(DMI_SYS_VENDOR, "HP"),
+-			DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant DL385 G2"),
++			DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant DL360"),
+ 		},
+ 	},
+ 	{
+ 		.callback = set_bf_sort,
+-		.ident = "HP ProLiant DL585 G2",
++		.ident = "HP ProLiant DL380",
+ 		.matches = {
+ 			DMI_MATCH(DMI_SYS_VENDOR, "HP"),
+-			DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant DL585 G2"),
++			DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant DL380"),
+ 		},
+ 	},
+ #ifdef __i386__
+diff --git a/arch/xtensa/kernel/init_task.c b/arch/xtensa/kernel/init_task.c
+index 021b4f4..3df469d 100644
+--- a/arch/xtensa/kernel/init_task.c
++++ b/arch/xtensa/kernel/init_task.c
+@@ -22,7 +22,6 @@
+ #include <asm/uaccess.h>
+ 
+ static struct fs_struct init_fs = INIT_FS;
+-static struct files_struct init_files = INIT_FILES;
+ static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
+ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
+ struct mm_struct init_mm = INIT_MM(init_mm);
+diff --git a/drivers/ata/libata-acpi.c b/drivers/ata/libata-acpi.c
+index 70b77e0..dbf6ca7 100644
+--- a/drivers/ata/libata-acpi.c
++++ b/drivers/ata/libata-acpi.c
+@@ -118,8 +118,8 @@ static void ata_acpi_associate_ide_port(struct ata_port *ap)
+ 		ap->pflags |= ATA_PFLAG_INIT_GTM_VALID;
+ }
+ 
+-static void ata_acpi_handle_hotplug(struct ata_port *ap, struct ata_device *dev,
+-				    u32 event)
++static void ata_acpi_handle_hotplug(struct ata_port *ap, struct ata_device
++				    *dev, u32 event)
+ {
+ 	char event_string[12];
+ 	char *envp[] = { event_string, NULL };
+@@ -127,6 +127,9 @@ static void ata_acpi_handle_hotplug(struct ata_port *ap, struct ata_device *dev,
+ 	struct kobject *kobj = NULL;
+ 	int wait = 0;
+ 	unsigned long flags;
++	acpi_handle handle, tmphandle;
++	unsigned long sta;
++	acpi_status status;
+ 
+ 	if (!ap)
+ 		ap = dev->link->ap;
+@@ -134,32 +137,57 @@ static void ata_acpi_handle_hotplug(struct ata_port *ap, struct ata_device *dev,
+ 
+ 	spin_lock_irqsave(ap->lock, flags);
+ 
++	if (dev)
++		handle = dev->acpi_handle;
++	else
++		handle = ap->acpi_handle;
++
++	status = acpi_get_handle(handle, "_EJ0", &tmphandle);
++	if (ACPI_FAILURE(status)) {
++		/* This device is not ejectable */
++		spin_unlock_irqrestore(ap->lock, flags);
++		return;
++	}
++
++	status = acpi_evaluate_integer(handle, "_STA", NULL, &sta);
++	if (ACPI_FAILURE(status)) {
++		printk ("Unable to determine bay status\n");
++		spin_unlock_irqrestore(ap->lock, flags);
++		return;
++	}
++
+ 	switch (event) {
+ 	case ACPI_NOTIFY_BUS_CHECK:
+ 	case ACPI_NOTIFY_DEVICE_CHECK:
+ 		ata_ehi_push_desc(ehi, "ACPI event");
+-		ata_ehi_hotplugged(ehi);
+-		ata_port_freeze(ap);
+-		break;
+-
+-	case ACPI_NOTIFY_EJECT_REQUEST:
+-		ata_ehi_push_desc(ehi, "ACPI event");
+-		if (dev)
+-			dev->flags |= ATA_DFLAG_DETACH;
+-		else {
+-			struct ata_link *tlink;
+-			struct ata_device *tdev;
+-
+-			ata_port_for_each_link(tlink, ap)
+-				ata_link_for_each_dev(tdev, tlink)
+-					tdev->flags |= ATA_DFLAG_DETACH;
++		if (!sta) {
++                /* Device has been unplugged */
++			if (dev)
++				dev->flags |= ATA_DFLAG_DETACH;
++			else {
++				struct ata_link *tlink;
++				struct ata_device *tdev;
++
++				ata_port_for_each_link(tlink, ap) {
++					ata_link_for_each_dev(tdev, tlink) {
++						tdev->flags |=
++							ATA_DFLAG_DETACH;
++					}
++				}
++			}
++			ata_port_schedule_eh(ap);
++			wait = 1;
++		} else {
++			ata_ehi_hotplugged(ehi);
++			ata_port_freeze(ap);
+ 		}
+-
+-		ata_port_schedule_eh(ap);
+-		wait = 1;
+-		break;
+ 	}
+ 
++	spin_unlock_irqrestore(ap->lock, flags);
++
++	if (wait)
++		ata_port_wait_eh(ap);
++
+ 	if (dev) {
+ 		if (dev->sdev)
+ 			kobj = &dev->sdev->sdev_gendev.kobj;
+@@ -170,11 +198,6 @@ static void ata_acpi_handle_hotplug(struct ata_port *ap, struct ata_device *dev,
+ 		sprintf(event_string, "BAY_EVENT=%d", event);
+ 		kobject_uevent_env(kobj, KOBJ_CHANGE, envp);
+ 	}
+-
+-	spin_unlock_irqrestore(ap->lock, flags);
+-
+-	if (wait)
+-		ata_port_wait_eh(ap);
+ }
+ 
+ static void ata_acpi_dev_notify(acpi_handle handle, u32 event, void *data)
+diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
+index 927b692..3c89f20 100644
+--- a/drivers/ata/libata-core.c
++++ b/drivers/ata/libata-core.c
+@@ -2126,6 +2126,13 @@ int ata_dev_configure(struct ata_device *dev)
+ 	dev->horkage |= ata_dev_blacklisted(dev);
+ 	ata_force_horkage(dev);
+ 
++	if (dev->horkage & ATA_HORKAGE_DISABLE) {
++		ata_dev_printk(dev, KERN_INFO,
++			       "unsupported device, disabling\n");
++		ata_dev_disable(dev);
++		return 0;
++	}
++
+ 	/* let ACPI work its magic */
+ 	rc = ata_acpi_on_devcfg(dev);
+ 	if (rc)
+@@ -3490,22 +3497,11 @@ int sata_link_resume(struct ata_link *link, const unsigned long *params,
+ 	if ((rc = sata_link_debounce(link, params, deadline)))
+ 		return rc;
+ 
+-	/* Clear SError.  PMP and some host PHYs require this to
+-	 * operate and clearing should be done before checking PHY
+-	 * online status to avoid race condition (hotplugging between
+-	 * link resume and status check).
+-	 */
++	/* clear SError, some PHYs require this even for SRST to work */
+ 	if (!(rc = sata_scr_read(link, SCR_ERROR, &serror)))
+ 		rc = sata_scr_write(link, SCR_ERROR, serror);
+-	if (rc == 0 || rc == -EINVAL) {
+-		unsigned long flags;
+ 
+-		spin_lock_irqsave(link->ap->lock, flags);
+-		link->eh_info.serror = 0;
+-		spin_unlock_irqrestore(link->ap->lock, flags);
+-		rc = 0;
+-	}
+-	return rc;
++	return rc != -EINVAL ? rc : 0;
+ }
+ 
+ /**
+@@ -3653,9 +3649,13 @@ int sata_link_hardreset(struct ata_link *link, const unsigned long *timing,
+ 	if (check_ready)
+ 		rc = ata_wait_ready(link, deadline, check_ready);
+  out:
+-	if (rc && rc != -EAGAIN)
++	if (rc && rc != -EAGAIN) {
++		/* online is set iff link is online && reset succeeded */
++		if (online)
++			*online = false;
+ 		ata_link_printk(link, KERN_ERR,
+ 				"COMRESET failed (errno=%d)\n", rc);
++	}
+ 	DPRINTK("EXIT, rc=%d\n", rc);
+ 	return rc;
+ }
+@@ -3700,8 +3700,14 @@ int sata_std_hardreset(struct ata_link *link, unsigned int *class,
+  */
+ void ata_std_postreset(struct ata_link *link, unsigned int *classes)
+ {
++	u32 serror;
++
+ 	DPRINTK("ENTER\n");
+ 
++	/* reset complete, clear SError */
++	if (!sata_scr_read(link, SCR_ERROR, &serror))
++		sata_scr_write(link, SCR_ERROR, serror);
++
+ 	/* print link status */
+ 	sata_print_link_status(link);
+ 
+@@ -3894,8 +3900,7 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
+ 	{ "SAMSUNG CD-ROM SN-124", "N001",	ATA_HORKAGE_NODMA },
+ 	{ "Seagate STT20000A", NULL,		ATA_HORKAGE_NODMA },
+ 	/* Odd clown on sil3726/4726 PMPs */
+-	{ "Config  Disk",	NULL,		ATA_HORKAGE_NODMA |
+-						ATA_HORKAGE_SKIP_PM },
++	{ "Config  Disk",	NULL,		ATA_HORKAGE_DISABLE },
+ 
+ 	/* Weird ATAPI devices */
+ 	{ "TORiSAN DVD-ROM DRD-N216", NULL,	ATA_HORKAGE_MAX_SEC_128 },
+@@ -5616,7 +5621,7 @@ int ata_host_register(struct ata_host *host, struct scsi_host_template *sht)
+ 			spin_lock_irqsave(ap->lock, flags);
+ 
+ 			ehi->probe_mask |= ATA_ALL_DEVICES;
+-			ehi->action |= ATA_EH_RESET;
++			ehi->action |= ATA_EH_RESET | ATA_EH_LPM;
+ 			ehi->flags |= ATA_EHI_NO_AUTOPSY | ATA_EHI_QUIET;
+ 
+ 			ap->pflags &= ~ATA_PFLAG_INITIALIZING;
+@@ -5649,7 +5654,6 @@ int ata_host_register(struct ata_host *host, struct scsi_host_template *sht)
+ 		struct ata_port *ap = host->ports[i];
+ 
+ 		ata_scsi_scan_host(ap, 1);
+-		ata_lpm_schedule(ap, ap->pm_policy);
+ 	}
+ 
+ 	return 0;
+diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
+index 62e0331..7894d83 100644
+--- a/drivers/ata/libata-eh.c
++++ b/drivers/ata/libata-eh.c
+@@ -1308,12 +1308,7 @@ static void ata_eh_analyze_serror(struct ata_link *link)
+ 	unsigned int err_mask = 0, action = 0;
+ 	u32 hotplug_mask;
+ 
+-	if (serror & SERR_PERSISTENT) {
+-		err_mask |= AC_ERR_ATA_BUS;
+-		action |= ATA_EH_RESET;
+-	}
+-	if (serror &
+-	    (SERR_DATA_RECOVERED | SERR_COMM_RECOVERED | SERR_DATA)) {
++	if (serror & (SERR_PERSISTENT | SERR_DATA)) {
+ 		err_mask |= AC_ERR_ATA_BUS;
+ 		action |= ATA_EH_RESET;
+ 	}
+@@ -2047,19 +2042,11 @@ static int ata_do_reset(struct ata_link *link, ata_reset_fn_t reset,
+ 			unsigned int *classes, unsigned long deadline)
+ {
+ 	struct ata_device *dev;
+-	int rc;
+ 
+ 	ata_link_for_each_dev(dev, link)
+ 		classes[dev->devno] = ATA_DEV_UNKNOWN;
+ 
+-	rc = reset(link, classes, deadline);
+-
+-	/* convert all ATA_DEV_UNKNOWN to ATA_DEV_NONE */
+-	ata_link_for_each_dev(dev, link)
+-		if (classes[dev->devno] == ATA_DEV_UNKNOWN)
+-			classes[dev->devno] = ATA_DEV_NONE;
+-
+-	return rc;
++	return reset(link, classes, deadline);
+ }
+ 
+ static int ata_eh_followup_srst_needed(struct ata_link *link,
+@@ -2096,9 +2083,11 @@ int ata_eh_reset(struct ata_link *link, int classify,
+ 	ata_reset_fn_t reset;
+ 	unsigned long flags;
+ 	u32 sstatus;
+-	int rc;
++	int nr_known, rc;
+ 
+-	/* about to reset */
++	/*
++	 * Prepare to reset
++	 */
+ 	spin_lock_irqsave(ap->lock, flags);
+ 	ap->pflags |= ATA_PFLAG_RESETTING;
+ 	spin_unlock_irqrestore(ap->lock, flags);
+@@ -2124,16 +2113,8 @@ int ata_eh_reset(struct ata_link *link, int classify,
+ 			ap->ops->set_piomode(ap, dev);
+ 	}
+ 
+-	if (!softreset && !hardreset) {
+-		if (verbose)
+-			ata_link_printk(link, KERN_INFO, "no reset method "
+-					"available, skipping reset\n");
+-		if (!(lflags & ATA_LFLAG_ASSUME_CLASS))
+-			lflags |= ATA_LFLAG_ASSUME_ATA;
+-		goto done;
+-	}
+-
+ 	/* prefer hardreset */
++	reset = NULL;
+ 	ehc->i.action &= ~ATA_EH_RESET;
+ 	if (hardreset) {
+ 		reset = hardreset;
+@@ -2141,11 +2122,6 @@ int ata_eh_reset(struct ata_link *link, int classify,
+ 	} else if (softreset) {
+ 		reset = softreset;
+ 		ehc->i.action = ATA_EH_SOFTRESET;
+-	} else {
+-		ata_link_printk(link, KERN_ERR, "BUG: no reset method, "
+-				"please report to linux-ide at vger.kernel.org\n");
+-		dump_stack();
+-		return -EINVAL;
+ 	}
+ 
+ 	if (prereset) {
+@@ -2165,55 +2141,71 @@ int ata_eh_reset(struct ata_link *link, int classify,
+ 					"prereset failed (errno=%d)\n", rc);
+ 			goto out;
+ 		}
+-	}
+ 
+-	/* prereset() might have cleared ATA_EH_RESET */
+-	if (!(ehc->i.action & ATA_EH_RESET)) {
+-		/* prereset told us not to reset, bang classes and return */
+-		ata_link_for_each_dev(dev, link)
+-			classes[dev->devno] = ATA_DEV_NONE;
+-		rc = 0;
+-		goto out;
++		/* prereset() might have cleared ATA_EH_RESET.  If so,
++		 * bang classes and return.
++		 */
++		if (reset && !(ehc->i.action & ATA_EH_RESET)) {
++			ata_link_for_each_dev(dev, link)
++				classes[dev->devno] = ATA_DEV_NONE;
++			rc = 0;
++			goto out;
++		}
+ 	}
+ 
+  retry:
++	/*
++	 * Perform reset
++	 */
++	if (ata_is_host_link(link))
++		ata_eh_freeze_port(ap);
++
+ 	deadline = jiffies + ata_eh_reset_timeouts[try++];
+ 
+-	/* shut up during boot probing */
+-	if (verbose)
+-		ata_link_printk(link, KERN_INFO, "%s resetting link\n",
+-				reset == softreset ? "soft" : "hard");
++	if (reset) {
++		if (verbose)
++			ata_link_printk(link, KERN_INFO, "%s resetting link\n",
++					reset == softreset ? "soft" : "hard");
+ 
+-	/* mark that this EH session started with reset */
+-	if (reset == hardreset)
+-		ehc->i.flags |= ATA_EHI_DID_HARDRESET;
+-	else
+-		ehc->i.flags |= ATA_EHI_DID_SOFTRESET;
++		/* mark that this EH session started with reset */
++		if (reset == hardreset)
++			ehc->i.flags |= ATA_EHI_DID_HARDRESET;
++		else
++			ehc->i.flags |= ATA_EHI_DID_SOFTRESET;
+ 
+-	rc = ata_do_reset(link, reset, classes, deadline);
++		rc = ata_do_reset(link, reset, classes, deadline);
+ 
+-	if (reset == hardreset &&
+-	    ata_eh_followup_srst_needed(link, rc, classify, classes)) {
+-		/* okay, let's do follow-up softreset */
+-		reset = softreset;
++		if (reset == hardreset &&
++		    ata_eh_followup_srst_needed(link, rc, classify, classes)) {
++			/* okay, let's do follow-up softreset */
++			reset = softreset;
+ 
+-		if (!reset) {
+-			ata_link_printk(link, KERN_ERR,
+-					"follow-up softreset required "
+-					"but no softreset avaliable\n");
+-			rc = -EINVAL;
+-			goto fail;
++			if (!reset) {
++				ata_link_printk(link, KERN_ERR,
++						"follow-up softreset required "
++						"but no softreset avaliable\n");
++				rc = -EINVAL;
++				goto fail;
++			}
++
++			ata_eh_about_to_do(link, NULL, ATA_EH_RESET);
++			rc = ata_do_reset(link, reset, classes, deadline);
+ 		}
+ 
+-		ata_eh_about_to_do(link, NULL, ATA_EH_RESET);
+-		rc = ata_do_reset(link, reset, classes, deadline);
++		/* -EAGAIN can happen if we skipped followup SRST */
++		if (rc && rc != -EAGAIN)
++			goto fail;
++	} else {
++		if (verbose)
++			ata_link_printk(link, KERN_INFO, "no reset method "
++					"available, skipping reset\n");
++		if (!(lflags & ATA_LFLAG_ASSUME_CLASS))
++			lflags |= ATA_LFLAG_ASSUME_ATA;
+ 	}
+ 
+-	/* -EAGAIN can happen if we skipped followup SRST */
+-	if (rc && rc != -EAGAIN)
+-		goto fail;
+-
+- done:
++	/*
++	 * Post-reset processing
++	 */
+ 	ata_link_for_each_dev(dev, link) {
+ 		/* After the reset, the device state is PIO 0 and the
+ 		 * controller state is undefined.  Reset also wakes up
+@@ -2236,9 +2228,53 @@ int ata_eh_reset(struct ata_link *link, int classify,
+ 	if (sata_scr_read(link, SCR_STATUS, &sstatus) == 0)
+ 		link->sata_spd = (sstatus >> 4) & 0xf;
+ 
++	/* thaw the port */
++	if (ata_is_host_link(link))
++		ata_eh_thaw_port(ap);
++
++	/* postreset() should clear hardware SError.  Although SError
++	 * is cleared during link resume, clearing SError here is
++	 * necessary as some PHYs raise hotplug events after SRST.
++	 * This introduces race condition where hotplug occurs between
++	 * reset and here.  This race is mediated by cross checking
++	 * link onlineness and classification result later.
++	 */
+ 	if (postreset)
+ 		postreset(link, classes);
+ 
++	/* clear cached SError */
++	spin_lock_irqsave(link->ap->lock, flags);
++	link->eh_info.serror = 0;
++	spin_unlock_irqrestore(link->ap->lock, flags);
++
++	/* Make sure onlineness and classification result correspond.
++	 * Hotplug could have happened during reset and some
++	 * controllers fail to wait while a drive is spinning up after
++	 * being hotplugged causing misdetection.  By cross checking
++	 * link onlineness and classification result, those conditions
++	 * can be reliably detected and retried.
++	 */
++	nr_known = 0;
++	ata_link_for_each_dev(dev, link) {
++		/* convert all ATA_DEV_UNKNOWN to ATA_DEV_NONE */
++		if (classes[dev->devno] == ATA_DEV_UNKNOWN)
++			classes[dev->devno] = ATA_DEV_NONE;
++		else
++			nr_known++;
++	}
++
++	if (classify && !nr_known && ata_link_online(link)) {
++		if (try < max_tries) {
++			ata_link_printk(link, KERN_WARNING, "link online but "
++				       "device misclassified, retrying\n");
++			rc = -EAGAIN;
++			goto fail;
++		}
++		ata_link_printk(link, KERN_WARNING,
++			       "link online but device misclassified, "
++			       "device detection might fail\n");
++	}
++
+ 	/* reset successful, schedule revalidation */
+ 	ata_eh_done(link, NULL, ATA_EH_RESET);
+ 	ehc->i.action |= ATA_EH_REVALIDATE;
+@@ -2587,7 +2623,7 @@ int ata_eh_recover(struct ata_port *ap, ata_prereset_fn_t prereset,
+ 	struct ata_link *link;
+ 	struct ata_device *dev;
+ 	int nr_failed_devs, nr_disabled_devs;
+-	int reset, rc;
++	int rc;
+ 	unsigned long flags;
+ 
+ 	DPRINTK("ENTER\n");
+@@ -2630,7 +2666,6 @@ int ata_eh_recover(struct ata_port *ap, ata_prereset_fn_t prereset,
+ 	rc = 0;
+ 	nr_failed_devs = 0;
+ 	nr_disabled_devs = 0;
+-	reset = 0;
+ 
+ 	/* if UNLOADING, finish immediately */
+ 	if (ap->pflags & ATA_PFLAG_UNLOADING)
+@@ -2644,40 +2679,24 @@ int ata_eh_recover(struct ata_port *ap, ata_prereset_fn_t prereset,
+ 		if (ata_eh_skip_recovery(link))
+ 			ehc->i.action = 0;
+ 
+-		/* do we need to reset? */
+-		if (ehc->i.action & ATA_EH_RESET)
+-			reset = 1;
+-
+ 		ata_link_for_each_dev(dev, link)
+ 			ehc->classes[dev->devno] = ATA_DEV_UNKNOWN;
+ 	}
+ 
+ 	/* reset */
+-	if (reset) {
+-		/* if PMP is attached, this function only deals with
+-		 * downstream links, port should stay thawed.
+-		 */
+-		if (!sata_pmp_attached(ap))
+-			ata_eh_freeze_port(ap);
+-
+-		ata_port_for_each_link(link, ap) {
+-			struct ata_eh_context *ehc = &link->eh_context;
++	ata_port_for_each_link(link, ap) {
++		struct ata_eh_context *ehc = &link->eh_context;
+ 
+-			if (!(ehc->i.action & ATA_EH_RESET))
+-				continue;
++		if (!(ehc->i.action & ATA_EH_RESET))
++			continue;
+ 
+-			rc = ata_eh_reset(link, ata_link_nr_vacant(link),
+-					  prereset, softreset, hardreset,
+-					  postreset);
+-			if (rc) {
+-				ata_link_printk(link, KERN_ERR,
+-						"reset failed, giving up\n");
+-				goto out;
+-			}
++		rc = ata_eh_reset(link, ata_link_nr_vacant(link),
++				  prereset, softreset, hardreset, postreset);
++		if (rc) {
++			ata_link_printk(link, KERN_ERR,
++					"reset failed, giving up\n");
++			goto out;
+ 		}
+-
+-		if (!sata_pmp_attached(ap))
+-			ata_eh_thaw_port(ap);
+ 	}
+ 
+ 	/* the rest */
+diff --git a/drivers/ata/libata-pmp.c b/drivers/ata/libata-pmp.c
+index ff1822a..0f9386d 100644
+--- a/drivers/ata/libata-pmp.c
++++ b/drivers/ata/libata-pmp.c
+@@ -48,7 +48,7 @@ static unsigned int sata_pmp_read(struct ata_link *link, int reg, u32 *r_val)
+ 	tf.device = link->pmp;
+ 
+ 	err_mask = ata_exec_internal(pmp_dev, &tf, NULL, DMA_NONE, NULL, 0,
+-				     SATA_PMP_SCR_TIMEOUT);
++				     SATA_PMP_RW_TIMEOUT);
+ 	if (err_mask)
+ 		return err_mask;
+ 
+@@ -88,7 +88,7 @@ static unsigned int sata_pmp_write(struct ata_link *link, int reg, u32 val)
+ 	tf.lbah = (val >> 24) & 0xff;
+ 
+ 	return ata_exec_internal(pmp_dev, &tf, NULL, DMA_NONE, NULL, 0,
+-				 SATA_PMP_SCR_TIMEOUT);
++				 SATA_PMP_RW_TIMEOUT);
+ }
+ 
+ /**
+@@ -257,19 +257,6 @@ static int sata_pmp_configure(struct ata_device *dev, int print_info)
+ 		goto fail;
+ 	}
+ 
+-	/* turn off notification till fan-out ports are reset and configured */
+-	if (gscr[SATA_PMP_GSCR_FEAT_EN] & SATA_PMP_FEAT_NOTIFY) {
+-		gscr[SATA_PMP_GSCR_FEAT_EN] &= ~SATA_PMP_FEAT_NOTIFY;
+-
+-		err_mask = sata_pmp_write(dev->link, SATA_PMP_GSCR_FEAT_EN,
+-					  gscr[SATA_PMP_GSCR_FEAT_EN]);
+-		if (err_mask) {
+-			rc = -EIO;
+-			reason = "failed to write GSCR_FEAT_EN";
+-			goto fail;
+-		}
+-	}
+-
+ 	if (print_info) {
+ 		ata_dev_printk(dev, KERN_INFO, "Port Multiplier %s, "
+ 			       "0x%04x:0x%04x r%d, %d ports, feat 0x%x/0x%x\n",
+@@ -700,8 +687,6 @@ static int sata_pmp_eh_recover_pmp(struct ata_port *ap,
+ 	if (ehc->i.action & ATA_EH_RESET) {
+ 		struct ata_link *tlink;
+ 
+-		ata_eh_freeze_port(ap);
+-
+ 		/* reset */
+ 		rc = ata_eh_reset(link, 0, prereset, softreset, hardreset,
+ 				  postreset);
+@@ -711,8 +696,6 @@ static int sata_pmp_eh_recover_pmp(struct ata_port *ap,
+ 			goto fail;
+ 		}
+ 
+-		ata_eh_thaw_port(ap);
+-
+ 		/* PMP is reset, SErrors cannot be trusted, scan all */
+ 		ata_port_for_each_link(tlink, ap) {
+ 			struct ata_eh_context *ehc = &tlink->eh_context;
+@@ -864,6 +847,7 @@ static int sata_pmp_eh_recover(struct ata_port *ap)
+ 	struct ata_link *pmp_link = &ap->link;
+ 	struct ata_device *pmp_dev = pmp_link->device;
+ 	struct ata_eh_context *pmp_ehc = &pmp_link->eh_context;
++	u32 *gscr = pmp_dev->gscr;
+ 	struct ata_link *link;
+ 	struct ata_device *dev;
+ 	unsigned int err_mask;
+@@ -901,6 +885,22 @@ static int sata_pmp_eh_recover(struct ata_port *ap)
+ 	if (rc)
+ 		goto pmp_fail;
+ 
++	/* PHY event notification can disturb reset and other recovery
++	 * operations.  Turn it off.
++	 */
++	if (gscr[SATA_PMP_GSCR_FEAT_EN] & SATA_PMP_FEAT_NOTIFY) {
++		gscr[SATA_PMP_GSCR_FEAT_EN] &= ~SATA_PMP_FEAT_NOTIFY;
++
++		err_mask = sata_pmp_write(pmp_link, SATA_PMP_GSCR_FEAT_EN,
++					  gscr[SATA_PMP_GSCR_FEAT_EN]);
++		if (err_mask) {
++			ata_link_printk(pmp_link, KERN_WARNING,
++				"failed to disable NOTIFY (err_mask=0x%x)\n",
++				err_mask);
++			goto pmp_fail;
++		}
++	}
++
+ 	/* handle disabled links */
+ 	rc = sata_pmp_eh_handle_disabled_links(ap);
+ 	if (rc)
+@@ -923,10 +923,10 @@ static int sata_pmp_eh_recover(struct ata_port *ap)
+ 
+ 	/* enable notification */
+ 	if (pmp_dev->flags & ATA_DFLAG_AN) {
+-		pmp_dev->gscr[SATA_PMP_GSCR_FEAT_EN] |= SATA_PMP_FEAT_NOTIFY;
++		gscr[SATA_PMP_GSCR_FEAT_EN] |= SATA_PMP_FEAT_NOTIFY;
+ 
+-		err_mask = sata_pmp_write(pmp_dev->link, SATA_PMP_GSCR_FEAT_EN,
+-					  pmp_dev->gscr[SATA_PMP_GSCR_FEAT_EN]);
++		err_mask = sata_pmp_write(pmp_link, SATA_PMP_GSCR_FEAT_EN,
++					  gscr[SATA_PMP_GSCR_FEAT_EN]);
+ 		if (err_mask) {
+ 			ata_dev_printk(pmp_dev, KERN_ERR, "failed to write "
+ 				       "PMP_FEAT_EN (Emask=0x%x)\n", err_mask);
+diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c
+index 3ce4392..aeb6e01 100644
+--- a/drivers/ata/libata-scsi.c
++++ b/drivers/ata/libata-scsi.c
+@@ -1082,12 +1082,6 @@ static unsigned int ata_scsi_start_stop_xlat(struct ata_queued_cmd *qc)
+ 	if (((cdb[4] >> 4) & 0xf) != 0)
+ 		goto invalid_fld;       /* power conditions not supported */
+ 
+-	if (qc->dev->horkage & ATA_HORKAGE_SKIP_PM) {
+-		/* the device lacks PM support, finish without doing anything */
+-		scmd->result = SAM_STAT_GOOD;
+-		return 1;
+-	}
+-
+ 	if (cdb[4] & 0x1) {
+ 		tf->nsect = 1;	/* 1 sector, lba=0 */
+ 
+diff --git a/drivers/ata/pata_ali.c b/drivers/ata/pata_ali.c
+index fcabe46..0f3e659 100644
+--- a/drivers/ata/pata_ali.c
++++ b/drivers/ata/pata_ali.c
+@@ -177,11 +177,11 @@ static void ali_program_modes(struct ata_port *ap, struct ata_device *adev, stru
+ 	u8 udma;
+ 
+ 	if (t != NULL) {
+-		t->setup = FIT(t->setup, 1, 8) & 7;
+-		t->act8b = FIT(t->act8b, 1, 8) & 7;
+-		t->rec8b = FIT(t->rec8b, 1, 16) & 15;
+-		t->active = FIT(t->active, 1, 8) & 7;
+-		t->recover = FIT(t->recover, 1, 16) & 15;
++		t->setup = clamp_val(t->setup, 1, 8) & 7;
++		t->act8b = clamp_val(t->act8b, 1, 8) & 7;
++		t->rec8b = clamp_val(t->rec8b, 1, 16) & 15;
++		t->active = clamp_val(t->active, 1, 8) & 7;
++		t->recover = clamp_val(t->recover, 1, 16) & 15;
+ 
+ 		pci_write_config_byte(pdev, cas, t->setup);
+ 		pci_write_config_byte(pdev, cbt, (t->act8b << 4) | t->rec8b);
+diff --git a/drivers/ata/pata_amd.c b/drivers/ata/pata_amd.c
+index 26665c3..57dd00f 100644
+--- a/drivers/ata/pata_amd.c
++++ b/drivers/ata/pata_amd.c
+@@ -84,32 +84,32 @@ static void timing_setup(struct ata_port *ap, struct ata_device *adev, int offse
+ 
+ 	/* Configure the address set up timing */
+ 	pci_read_config_byte(pdev, offset + 0x0C, &t);
+-	t = (t & ~(3 << ((3 - dn) << 1))) | ((FIT(at.setup, 1, 4) - 1) << ((3 - dn) << 1));
++	t = (t & ~(3 << ((3 - dn) << 1))) | ((clamp_val(at.setup, 1, 4) - 1) << ((3 - dn) << 1));
+ 	pci_write_config_byte(pdev, offset + 0x0C , t);
+ 
+ 	/* Configure the 8bit I/O timing */
+ 	pci_write_config_byte(pdev, offset + 0x0E + (1 - (dn >> 1)),
+-		((FIT(at.act8b, 1, 16) - 1) << 4) | (FIT(at.rec8b, 1, 16) - 1));
++		((clamp_val(at.act8b, 1, 16) - 1) << 4) | (clamp_val(at.rec8b, 1, 16) - 1));
+ 
+ 	/* Drive timing */
+ 	pci_write_config_byte(pdev, offset + 0x08 + (3 - dn),
+-		((FIT(at.active, 1, 16) - 1) << 4) | (FIT(at.recover, 1, 16) - 1));
++		((clamp_val(at.active, 1, 16) - 1) << 4) | (clamp_val(at.recover, 1, 16) - 1));
+ 
+ 	switch (clock) {
+ 		case 1:
+-		t = at.udma ? (0xc0 | (FIT(at.udma, 2, 5) - 2)) : 0x03;
++		t = at.udma ? (0xc0 | (clamp_val(at.udma, 2, 5) - 2)) : 0x03;
+ 		break;
+ 
+ 		case 2:
+-		t = at.udma ? (0xc0 | amd_cyc2udma[FIT(at.udma, 2, 10)]) : 0x03;
++		t = at.udma ? (0xc0 | amd_cyc2udma[clamp_val(at.udma, 2, 10)]) : 0x03;
+ 		break;
+ 
+ 		case 3:
+-		t = at.udma ? (0xc0 | amd_cyc2udma[FIT(at.udma, 1, 10)]) : 0x03;
++		t = at.udma ? (0xc0 | amd_cyc2udma[clamp_val(at.udma, 1, 10)]) : 0x03;
+ 		break;
+ 
+ 		case 4:
+-		t = at.udma ? (0xc0 | amd_cyc2udma[FIT(at.udma, 1, 15)]) : 0x03;
++		t = at.udma ? (0xc0 | amd_cyc2udma[clamp_val(at.udma, 1, 15)]) : 0x03;
+ 		break;
+ 
+ 		default:
+diff --git a/drivers/ata/pata_at32.c b/drivers/ata/pata_at32.c
+index 5e10438..82fb6e2 100644
+--- a/drivers/ata/pata_at32.c
++++ b/drivers/ata/pata_at32.c
+@@ -291,8 +291,6 @@ static int __init pata_at32_probe(struct platform_device *pdev)
+ 	if (!info)
+ 		return -ENOMEM;
+ 
+-	memset(info, 0, sizeof(struct at32_ide_info));
+-
+ 	info->irq = irq;
+ 	info->cs  = board->cs;
+ 
+diff --git a/drivers/ata/pata_bf54x.c b/drivers/ata/pata_bf54x.c
+index 9ab8973..5551610 100644
+--- a/drivers/ata/pata_bf54x.c
++++ b/drivers/ata/pata_bf54x.c
+@@ -911,7 +911,10 @@ static void bfin_bmdma_start(struct ata_queued_cmd *qc)
+ 	/* Reset all transfer count */
+ 	ATAPI_SET_CONTROL(base, ATAPI_GET_CONTROL(base) | TFRCNT_RST);
+ 
+-		/* Set transfer length to buffer len */
++	/* Set ATAPI state machine contorl in terminate sequence */
++	ATAPI_SET_CONTROL(base, ATAPI_GET_CONTROL(base) | END_ON_TERM);
++
++	/* Set transfer length to buffer len */
+ 	for_each_sg(qc->sg, sg, qc->n_elem, si) {
+ 		ATAPI_SET_XFER_LEN(base, (sg_dma_len(sg) >> 1));
+ 	}
+diff --git a/drivers/ata/pata_cypress.c b/drivers/ata/pata_cypress.c
+index a9c3218..2ff6260 100644
+--- a/drivers/ata/pata_cypress.c
++++ b/drivers/ata/pata_cypress.c
+@@ -62,14 +62,14 @@ static void cy82c693_set_piomode(struct ata_port *ap, struct ata_device *adev)
+ 		return;
+ 	}
+ 
+-	time_16 = FIT(t.recover, 0, 15) | (FIT(t.active, 0, 15) << 4);
+-	time_8 = FIT(t.act8b, 0, 15) | (FIT(t.rec8b, 0, 15) << 4);
++	time_16 = clamp_val(t.recover, 0, 15) | (clamp_val(t.active, 0, 15) << 4);
++	time_8 = clamp_val(t.act8b, 0, 15) | (clamp_val(t.rec8b, 0, 15) << 4);
+ 
+ 	if (adev->devno == 0) {
+ 		pci_read_config_dword(pdev, CY82_IDE_ADDRSETUP, &addr);
+ 
+ 		addr &= ~0x0F;	/* Mask bits */
+-		addr |= FIT(t.setup, 0, 15);
++		addr |= clamp_val(t.setup, 0, 15);
+ 
+ 		pci_write_config_dword(pdev, CY82_IDE_ADDRSETUP, addr);
+ 		pci_write_config_byte(pdev, CY82_IDE_MASTER_IOR, time_16);
+@@ -79,7 +79,7 @@ static void cy82c693_set_piomode(struct ata_port *ap, struct ata_device *adev)
+ 		pci_read_config_dword(pdev, CY82_IDE_ADDRSETUP, &addr);
+ 
+ 		addr &= ~0xF0;	/* Mask bits */
+-		addr |= (FIT(t.setup, 0, 15) << 4);
++		addr |= (clamp_val(t.setup, 0, 15) << 4);
+ 
+ 		pci_write_config_dword(pdev, CY82_IDE_ADDRSETUP, addr);
+ 		pci_write_config_byte(pdev, CY82_IDE_SLAVE_IOR, time_16);
+diff --git a/drivers/ata/pata_legacy.c b/drivers/ata/pata_legacy.c
+index 7af4b29..fe7cc8e 100644
+--- a/drivers/ata/pata_legacy.c
++++ b/drivers/ata/pata_legacy.c
+@@ -343,8 +343,8 @@ static void ht6560a_set_piomode(struct ata_port *ap, struct ata_device *adev)
+ 	/* Get the timing data in cycles. For now play safe at 50Mhz */
+ 	ata_timing_compute(adev, adev->pio_mode, &t, 20000, 1000);
+ 
+-	active = FIT(t.active, 2, 15);
+-	recover = FIT(t.recover, 4, 15);
++	active = clamp_val(t.active, 2, 15);
++	recover = clamp_val(t.recover, 4, 15);
+ 
+ 	inb(0x3E6);
+ 	inb(0x3E6);
+@@ -377,8 +377,8 @@ static void ht6560b_set_piomode(struct ata_port *ap, struct ata_device *adev)
+ 	/* Get the timing data in cycles. For now play safe at 50Mhz */
+ 	ata_timing_compute(adev, adev->pio_mode, &t, 20000, 1000);
+ 
+-	active = FIT(t.active, 2, 15);
+-	recover = FIT(t.recover, 2, 16);
++	active = clamp_val(t.active, 2, 15);
++	recover = clamp_val(t.recover, 2, 16);
+ 	recover &= 0x15;
+ 
+ 	inb(0x3E6);
+@@ -462,9 +462,9 @@ static void opti82c611a_set_piomode(struct ata_port *ap,
+ 		ata_timing_merge(&t, &tp, &t, ATA_TIMING_SETUP);
+ 	}
+ 
+-	active = FIT(t.active, 2, 17) - 2;
+-	recover = FIT(t.recover, 1, 16) - 1;
+-	setup = FIT(t.setup, 1, 4) - 1;
++	active = clamp_val(t.active, 2, 17) - 2;
++	recover = clamp_val(t.recover, 1, 16) - 1;
++	setup = clamp_val(t.setup, 1, 4) - 1;
+ 
+ 	/* Select the right timing bank for write timing */
+ 	rc = ioread8(ap->ioaddr.lbal_addr);
+@@ -541,9 +541,9 @@ static void opti82c46x_set_piomode(struct ata_port *ap, struct ata_device *adev)
+ 		ata_timing_merge(&t, &tp, &t, ATA_TIMING_SETUP);
+ 	}
+ 
+-	active = FIT(t.active, 2, 17) - 2;
+-	recover = FIT(t.recover, 1, 16) - 1;
+-	setup = FIT(t.setup, 1, 4) - 1;
++	active = clamp_val(t.active, 2, 17) - 2;
++	recover = clamp_val(t.recover, 1, 16) - 1;
++	setup = clamp_val(t.setup, 1, 4) - 1;
+ 
+ 	/* Select the right timing bank for write timing */
+ 	rc = ioread8(ap->ioaddr.lbal_addr);
+@@ -624,11 +624,11 @@ static void qdi6500_set_piomode(struct ata_port *ap, struct ata_device *adev)
+ 	ata_timing_compute(adev, adev->pio_mode, &t, 30303, 1000);
+ 
+ 	if (ld_qdi->fast) {
+-		active = 8 - FIT(t.active, 1, 8);
+-		recovery = 18 - FIT(t.recover, 3, 18);
++		active = 8 - clamp_val(t.active, 1, 8);
++		recovery = 18 - clamp_val(t.recover, 3, 18);
+ 	} else {
+-		active = 9 - FIT(t.active, 2, 9);
+-		recovery = 15 - FIT(t.recover, 0, 15);
++		active = 9 - clamp_val(t.active, 2, 9);
++		recovery = 15 - clamp_val(t.recover, 0, 15);
+ 	}
+ 	timing = (recovery << 4) | active | 0x08;
+ 
+@@ -658,11 +658,11 @@ static void qdi6580dp_set_piomode(struct ata_port *ap, struct ata_device *adev)
+ 	ata_timing_compute(adev, adev->pio_mode, &t, 30303, 1000);
+ 
+ 	if (ld_qdi->fast) {
+-		active = 8 - FIT(t.active, 1, 8);
+-		recovery = 18 - FIT(t.recover, 3, 18);
++		active = 8 - clamp_val(t.active, 1, 8);
++		recovery = 18 - clamp_val(t.recover, 3, 18);
+ 	} else {
+-		active = 9 - FIT(t.active, 2, 9);
+-		recovery = 15 - FIT(t.recover, 0, 15);
++		active = 9 - clamp_val(t.active, 2, 9);
++		recovery = 15 - clamp_val(t.recover, 0, 15);
+ 	}
+ 	timing = (recovery << 4) | active | 0x08;
+ 
+@@ -695,11 +695,11 @@ static void qdi6580_set_piomode(struct ata_port *ap, struct ata_device *adev)
+ 	ata_timing_compute(adev, adev->pio_mode, &t, 30303, 1000);
+ 
+ 	if (ld_qdi->fast) {
+-		active = 8 - FIT(t.active, 1, 8);
+-		recovery = 18 - FIT(t.recover, 3, 18);
++		active = 8 - clamp_val(t.active, 1, 8);
++		recovery = 18 - clamp_val(t.recover, 3, 18);
+ 	} else {
+-		active = 9 - FIT(t.active, 2, 9);
+-		recovery = 15 - FIT(t.recover, 0, 15);
++		active = 9 - clamp_val(t.active, 2, 9);
++		recovery = 15 - clamp_val(t.recover, 0, 15);
+ 	}
+ 	timing = (recovery << 4) | active | 0x08;
+ 	ld_qdi->clock[adev->devno] = timing;
+@@ -830,8 +830,8 @@ static void winbond_set_piomode(struct ata_port *ap, struct ata_device *adev)
+ 	else
+ 		ata_timing_compute(adev, adev->pio_mode, &t, 30303, 1000);
+ 
+-	active = (FIT(t.active, 3, 17) - 1) & 0x0F;
+-	recovery = (FIT(t.recover, 1, 15) + 1) & 0x0F;
++	active = (clamp_val(t.active, 3, 17) - 1) & 0x0F;
++	recovery = (clamp_val(t.recover, 1, 15) + 1) & 0x0F;
+ 	timing = (active << 4) | recovery;
+ 	winbond_writecfg(ld_winbond->timing, timing, reg);
+ 
+@@ -842,7 +842,7 @@ static void winbond_set_piomode(struct ata_port *ap, struct ata_device *adev)
+ 		reg |= 0x08;	/* FIFO off */
+ 	if (!ata_pio_need_iordy(adev))
+ 		reg |= 0x02;	/* IORDY off */
+-	reg |= (FIT(t.setup, 0, 3) << 6);
++	reg |= (clamp_val(t.setup, 0, 3) << 6);
+ 	winbond_writecfg(ld_winbond->timing, timing + 1, reg);
+ }
+ 
+diff --git a/drivers/ata/pata_ns87410.c b/drivers/ata/pata_ns87410.c
+index 76d2455..be756b7 100644
+--- a/drivers/ata/pata_ns87410.c
++++ b/drivers/ata/pata_ns87410.c
+@@ -91,9 +91,9 @@ static void ns87410_set_piomode(struct ata_port *ap, struct ata_device *adev)
+ 		return;
+ 	}
+ 
+-	at.active = FIT(at.active, 2, 16) - 2;
+-	at.setup = FIT(at.setup, 1, 4) - 1;
+-	at.recover = FIT(at.recover, 1, 12) - 1;
++	at.active = clamp_val(at.active, 2, 16) - 2;
++	at.setup = clamp_val(at.setup, 1, 4) - 1;
++	at.recover = clamp_val(at.recover, 1, 12) - 1;
+ 
+ 	idetcr = (at.setup << 6) | (recoverbits[at.recover] << 3) | activebits[at.active];
+ 
+diff --git a/drivers/ata/pata_ns87415.c b/drivers/ata/pata_ns87415.c
+index ae92b00..e0aa7ea 100644
+--- a/drivers/ata/pata_ns87415.c
++++ b/drivers/ata/pata_ns87415.c
+@@ -66,8 +66,8 @@ static void ns87415_set_mode(struct ata_port *ap, struct ata_device *adev, u8 mo
+ 
+ 	ata_timing_compute(adev, adev->pio_mode, &t, T, 0);
+ 
+-	clocking = 17 - FIT(t.active, 2, 17);
+-	clocking |= (16 - FIT(t.recover, 1, 16)) << 4;
++	clocking = 17 - clamp_val(t.active, 2, 17);
++	clocking |= (16 - clamp_val(t.recover, 1, 16)) << 4;
+  	/* Use the same timing for read and write bytes */
+ 	clocking |= (clocking << 8);
+ 	pci_write_config_word(dev, timing, clocking);
+diff --git a/drivers/ata/pata_qdi.c b/drivers/ata/pata_qdi.c
+index bf45cf0..97e5b09 100644
+--- a/drivers/ata/pata_qdi.c
++++ b/drivers/ata/pata_qdi.c
+@@ -60,11 +60,11 @@ static void qdi6500_set_piomode(struct ata_port *ap, struct ata_device *adev)
+ 	ata_timing_compute(adev, adev->pio_mode, &t, 30303, 1000);
+ 
+ 	if (qdi->fast) {
+-		active = 8 - FIT(t.active, 1, 8);
+-		recovery = 18 - FIT(t.recover, 3, 18);
++		active = 8 - clamp_val(t.active, 1, 8);
++		recovery = 18 - clamp_val(t.recover, 3, 18);
+ 	} else {
+-		active = 9 - FIT(t.active, 2, 9);
+-		recovery = 15 - FIT(t.recover, 0, 15);
++		active = 9 - clamp_val(t.active, 2, 9);
++		recovery = 15 - clamp_val(t.recover, 0, 15);
+ 	}
+ 	timing = (recovery << 4) | active | 0x08;
+ 
+@@ -84,11 +84,11 @@ static void qdi6580_set_piomode(struct ata_port *ap, struct ata_device *adev)
+ 	ata_timing_compute(adev, adev->pio_mode, &t, 30303, 1000);
+ 
+ 	if (qdi->fast) {
+-		active = 8 - FIT(t.active, 1, 8);
+-		recovery = 18 - FIT(t.recover, 3, 18);
++		active = 8 - clamp_val(t.active, 1, 8);
++		recovery = 18 - clamp_val(t.recover, 3, 18);
+ 	} else {
+-		active = 9 - FIT(t.active, 2, 9);
+-		recovery = 15 - FIT(t.recover, 0, 15);
++		active = 9 - clamp_val(t.active, 2, 9);
++		recovery = 15 - clamp_val(t.recover, 0, 15);
+ 	}
+ 	timing = (recovery << 4) | active | 0x08;
+ 
+diff --git a/drivers/ata/pata_sl82c105.c b/drivers/ata/pata_sl82c105.c
+index 70d94fb..69877bd 100644
+--- a/drivers/ata/pata_sl82c105.c
++++ b/drivers/ata/pata_sl82c105.c
+@@ -216,7 +216,7 @@ static int sl82c105_qc_defer(struct ata_queued_cmd *qc)
+ 	struct ata_port *alt = host->ports[1 ^ qc->ap->port_no];
+ 	int rc;
+ 
+-	/* First apply the usual rules */	
++	/* First apply the usual rules */
+ 	rc = ata_std_qc_defer(qc);
+ 	if (rc != 0)
+ 		return rc;
+diff --git a/drivers/ata/pata_via.c b/drivers/ata/pata_via.c
+index 2fea6cb..708ed14 100644
+--- a/drivers/ata/pata_via.c
++++ b/drivers/ata/pata_via.c
+@@ -259,15 +259,15 @@ static void via_do_set_mode(struct ata_port *ap, struct ata_device *adev, int mo
+ 
+ 		pci_read_config_byte(pdev, 0x4C, &setup);
+ 		setup &= ~(3 << shift);
+-		setup |= FIT(t.setup, 1, 4) << shift;	/* 1,4 or 1,4 - 1  FIXME */
++		setup |= clamp_val(t.setup, 1, 4) << shift;	/* 1,4 or 1,4 - 1  FIXME */
+ 		pci_write_config_byte(pdev, 0x4C, setup);
+ 	}
+ 
+ 	/* Load the PIO mode bits */
+ 	pci_write_config_byte(pdev, 0x4F - ap->port_no,
+-		((FIT(t.act8b, 1, 16) - 1) << 4) | (FIT(t.rec8b, 1, 16) - 1));
++		((clamp_val(t.act8b, 1, 16) - 1) << 4) | (clamp_val(t.rec8b, 1, 16) - 1));
+ 	pci_write_config_byte(pdev, 0x48 + offset,
+-		((FIT(t.active, 1, 16) - 1) << 4) | (FIT(t.recover, 1, 16) - 1));
++		((clamp_val(t.active, 1, 16) - 1) << 4) | (clamp_val(t.recover, 1, 16) - 1));
+ 
+ 	/* Load the UDMA bits according to type */
+ 	switch(udma_type) {
+@@ -275,16 +275,16 @@ static void via_do_set_mode(struct ata_port *ap, struct ata_device *adev, int mo
+ 			/* BUG() ? */
+ 			/* fall through */
+ 		case 33:
+-			ut = t.udma ? (0xe0 | (FIT(t.udma, 2, 5) - 2)) : 0x03;
++			ut = t.udma ? (0xe0 | (clamp_val(t.udma, 2, 5) - 2)) : 0x03;
+ 			break;
+ 		case 66:
+-			ut = t.udma ? (0xe8 | (FIT(t.udma, 2, 9) - 2)) : 0x0f;
++			ut = t.udma ? (0xe8 | (clamp_val(t.udma, 2, 9) - 2)) : 0x0f;
+ 			break;
+ 		case 100:
+-			ut = t.udma ? (0xe0 | (FIT(t.udma, 2, 9) - 2)) : 0x07;
++			ut = t.udma ? (0xe0 | (clamp_val(t.udma, 2, 9) - 2)) : 0x07;
+ 			break;
+ 		case 133:
+-			ut = t.udma ? (0xe0 | (FIT(t.udma, 2, 9) - 2)) : 0x07;
++			ut = t.udma ? (0xe0 | (clamp_val(t.udma, 2, 9) - 2)) : 0x07;
+ 			break;
+ 	}
+ 
+diff --git a/drivers/ata/pata_winbond.c b/drivers/ata/pata_winbond.c
+index 6e52a35..474528f 100644
+--- a/drivers/ata/pata_winbond.c
++++ b/drivers/ata/pata_winbond.c
+@@ -75,8 +75,8 @@ static void winbond_set_piomode(struct ata_port *ap, struct ata_device *adev)
+ 	else
+ 		ata_timing_compute(adev, adev->pio_mode, &t, 30303, 1000);
+ 
+-	active = (FIT(t.active, 3, 17) - 1) & 0x0F;
+-	recovery = (FIT(t.recover, 1, 15) + 1) & 0x0F;
++	active = (clamp_val(t.active, 3, 17) - 1) & 0x0F;
++	recovery = (clamp_val(t.recover, 1, 15) + 1) & 0x0F;
+ 	timing = (active << 4) | recovery;
+ 	winbond_writecfg(winbond->config, timing, reg);
+ 
+@@ -87,7 +87,7 @@ static void winbond_set_piomode(struct ata_port *ap, struct ata_device *adev)
+ 		reg |= 0x08;	/* FIFO off */
+ 	if (!ata_pio_need_iordy(adev))
+ 		reg |= 0x02;	/* IORDY off */
+-	reg |= (FIT(t.setup, 0, 3) << 6);
++	reg |= (clamp_val(t.setup, 0, 3) << 6);
+ 	winbond_writecfg(winbond->config, timing + 1, reg);
+ }
+ 
+diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c
+index bb73b22..fb81f0c 100644
+--- a/drivers/ata/sata_mv.c
++++ b/drivers/ata/sata_mv.c
+@@ -72,7 +72,7 @@
+ #include <linux/libata.h>
+ 
+ #define DRV_NAME	"sata_mv"
+-#define DRV_VERSION	"1.20"
++#define DRV_VERSION	"1.21"
+ 
+ enum {
+ 	/* BAR's are enumerated in terms of pci_resource_start() terms */
+@@ -128,8 +128,13 @@ enum {
+ 	MV_COMMON_FLAGS		= ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
+ 				  ATA_FLAG_MMIO | ATA_FLAG_NO_ATAPI |
+ 				  ATA_FLAG_PIO_POLLING,
++
+ 	MV_6XXX_FLAGS		= MV_FLAG_IRQ_COALESCE,
+ 
++	MV_GENIIE_FLAGS		= MV_COMMON_FLAGS | MV_6XXX_FLAGS |
++				  ATA_FLAG_PMP | ATA_FLAG_ACPI_SATA |
++				  ATA_FLAG_NCQ | ATA_FLAG_AN,
++
+ 	CRQB_FLAG_READ		= (1 << 0),
+ 	CRQB_TAG_SHIFT		= 1,
+ 	CRQB_IOID_SHIFT		= 6,	/* CRQB Gen-II/IIE IO Id shift */
+@@ -197,13 +202,6 @@ enum {
+ 	HC_MAIN_RSVD		= (0x7f << 25),	/* bits 31-25 */
+ 	HC_MAIN_RSVD_5		= (0x1fff << 19), /* bits 31-19 */
+ 	HC_MAIN_RSVD_SOC	= (0x3fffffb << 6),     /* bits 31-9, 7-6 */
+-	HC_MAIN_MASKED_IRQS	= (TRAN_LO_DONE | TRAN_HI_DONE |
+-				   PORTS_0_3_COAL_DONE | PORTS_4_7_COAL_DONE |
+-				   PORTS_0_7_COAL_DONE | GPIO_INT | TWSI_INT |
+-				   HC_MAIN_RSVD),
+-	HC_MAIN_MASKED_IRQS_5	= (PORTS_0_3_COAL_DONE | PORTS_4_7_COAL_DONE |
+-				   HC_MAIN_RSVD_5),
+-	HC_MAIN_MASKED_IRQS_SOC = (PORTS_0_3_COAL_DONE | HC_MAIN_RSVD_SOC),
+ 
+ 	/* SATAHC registers */
+ 	HC_CFG_OFS		= 0,
+@@ -221,6 +219,7 @@ enum {
+ 	SATA_STATUS_OFS		= 0x300,  /* ctrl, err regs follow status */
+ 	SATA_ACTIVE_OFS		= 0x350,
+ 	SATA_FIS_IRQ_CAUSE_OFS	= 0x364,
++	SATA_FIS_IRQ_AN		= (1 << 9),	/* async notification */
+ 
+ 	LTMODE_OFS		= 0x30c,
+ 	LTMODE_BIT8		= (1 << 8),	/* unknown, but necessary */
+@@ -459,6 +458,7 @@ struct mv_port_signal {
+ 
+ struct mv_host_priv {
+ 	u32			hp_flags;
++	u32			main_irq_mask;
+ 	struct mv_port_signal	signal[8];
+ 	const struct mv_hw_ops	*ops;
+ 	int			n_ports;
+@@ -640,25 +640,19 @@ static const struct ata_port_info mv_port_info[] = {
+ 		.port_ops	= &mv6_ops,
+ 	},
+ 	{  /* chip_6042 */
+-		.flags		= MV_COMMON_FLAGS | MV_6XXX_FLAGS |
+-				  ATA_FLAG_PMP | ATA_FLAG_ACPI_SATA |
+-				  ATA_FLAG_NCQ,
++		.flags		= MV_GENIIE_FLAGS,
+ 		.pio_mask	= 0x1f,	/* pio0-4 */
+ 		.udma_mask	= ATA_UDMA6,
+ 		.port_ops	= &mv_iie_ops,
+ 	},
+ 	{  /* chip_7042 */
+-		.flags		= MV_COMMON_FLAGS | MV_6XXX_FLAGS |
+-				  ATA_FLAG_PMP | ATA_FLAG_ACPI_SATA |
+-				  ATA_FLAG_NCQ,
++		.flags		= MV_GENIIE_FLAGS,
+ 		.pio_mask	= 0x1f,	/* pio0-4 */
+ 		.udma_mask	= ATA_UDMA6,
+ 		.port_ops	= &mv_iie_ops,
+ 	},
+ 	{  /* chip_soc */
+-		.flags		= MV_COMMON_FLAGS | MV_6XXX_FLAGS |
+-				  ATA_FLAG_PMP | ATA_FLAG_ACPI_SATA |
+-				  ATA_FLAG_NCQ | MV_FLAG_SOC,
++		.flags		= MV_GENIIE_FLAGS | MV_FLAG_SOC,
+ 		.pio_mask	= 0x1f,	/* pio0-4 */
+ 		.udma_mask	= ATA_UDMA6,
+ 		.port_ops	= &mv_iie_ops,
+@@ -844,6 +838,33 @@ static void mv_set_edma_ptrs(void __iomem *port_mmio,
+ 		 port_mmio + EDMA_RSP_Q_OUT_PTR_OFS);
+ }
+ 
++static void mv_set_main_irq_mask(struct ata_host *host,
++				 u32 disable_bits, u32 enable_bits)
++{
++	struct mv_host_priv *hpriv = host->private_data;
++	u32 old_mask, new_mask;
++
++	old_mask = hpriv->main_irq_mask;
++	new_mask = (old_mask & ~disable_bits) | enable_bits;
++	if (new_mask != old_mask) {
++		hpriv->main_irq_mask = new_mask;
++		writelfl(new_mask, hpriv->main_irq_mask_addr);
++	}
++}
++
++static void mv_enable_port_irqs(struct ata_port *ap,
++				     unsigned int port_bits)
++{
++	unsigned int shift, hardport, port = ap->port_no;
++	u32 disable_bits, enable_bits;
++
++	MV_PORT_TO_SHIFT_AND_HARDPORT(port, shift, hardport);
++
++	disable_bits = (DONE_IRQ | ERR_IRQ) << shift;
++	enable_bits  = port_bits << shift;
++	mv_set_main_irq_mask(ap->host, disable_bits, enable_bits);
++}
++
+ /**
+  *      mv_start_dma - Enable eDMA engine
+  *      @base: port base address
+@@ -886,9 +907,11 @@ static void mv_start_dma(struct ata_port *ap, void __iomem *port_mmio,
+ 		mv_edma_cfg(ap, want_ncq);
+ 
+ 		/* clear FIS IRQ Cause */
+-		writelfl(0, port_mmio + SATA_FIS_IRQ_CAUSE_OFS);
++		if (IS_GEN_IIE(hpriv))
++			writelfl(0, port_mmio + SATA_FIS_IRQ_CAUSE_OFS);
+ 
+ 		mv_set_edma_ptrs(port_mmio, hpriv, pp);
++		mv_enable_port_irqs(ap, DONE_IRQ|ERR_IRQ);
+ 
+ 		writelfl(EDMA_EN, port_mmio + EDMA_CMD_OFS);
+ 		pp->pp_flags |= MV_PP_FLAG_EDMA_EN;
+@@ -1341,6 +1364,7 @@ out_port_free_dma_mem:
+ static void mv_port_stop(struct ata_port *ap)
+ {
+ 	mv_stop_edma(ap);
++	mv_enable_port_irqs(ap, 0);
+ 	mv_port_free_dma_mem(ap);
+ }
+ 
+@@ -1582,6 +1606,7 @@ static unsigned int mv_qc_issue(struct ata_queued_cmd *qc)
+ 		 * shadow block, etc registers.
+ 		 */
+ 		mv_stop_edma(ap);
++		mv_enable_port_irqs(ap, ERR_IRQ);
+ 		mv_pmp_select(ap, qc->dev->link->pmp);
+ 		return ata_sff_qc_issue(qc);
+ 	}
+@@ -1670,6 +1695,18 @@ static void mv_pmp_eh_prep(struct ata_port *ap, unsigned int pmp_map)
+ 	}
+ }
+ 
++static int mv_req_q_empty(struct ata_port *ap)
++{
++	void __iomem *port_mmio = mv_ap_base(ap);
++	u32 in_ptr, out_ptr;
++
++	in_ptr  = (readl(port_mmio + EDMA_REQ_Q_IN_PTR_OFS)
++			>> EDMA_REQ_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK;
++	out_ptr = (readl(port_mmio + EDMA_REQ_Q_OUT_PTR_OFS)
++			>> EDMA_REQ_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK;
++	return (in_ptr == out_ptr);	/* 1 == queue_is_empty */
++}
++
+ static int mv_handle_fbs_ncq_dev_err(struct ata_port *ap)
+ {
+ 	struct mv_port_priv *pp = ap->private_data;
+@@ -1703,7 +1740,7 @@ static int mv_handle_fbs_ncq_dev_err(struct ata_port *ap)
+ 			ap->qc_active, failed_links,
+ 			ap->nr_active_links);
+ 
+-	if (ap->nr_active_links <= failed_links) {
++	if (ap->nr_active_links <= failed_links && mv_req_q_empty(ap)) {
+ 		mv_process_crpb_entries(ap, pp);
+ 		mv_stop_edma(ap);
+ 		mv_eh_freeze(ap);
+@@ -1812,6 +1849,7 @@ static void mv_err_intr(struct ata_port *ap)
+ {
+ 	void __iomem *port_mmio = mv_ap_base(ap);
+ 	u32 edma_err_cause, eh_freeze_mask, serr = 0;
++	u32 fis_cause = 0;
+ 	struct mv_port_priv *pp = ap->private_data;
+ 	struct mv_host_priv *hpriv = ap->host->private_data;
+ 	unsigned int action = 0, err_mask = 0;
+@@ -1821,16 +1859,19 @@ static void mv_err_intr(struct ata_port *ap)
+ 
+ 	/*
+ 	 * Read and clear the SError and err_cause bits.
++	 * For GenIIe, if EDMA_ERR_TRANS_IRQ_7 is set, we also must read/clear
++	 * the FIS_IRQ_CAUSE register before clearing edma_err_cause.
+ 	 */
+ 	sata_scr_read(&ap->link, SCR_ERROR, &serr);
+ 	sata_scr_write_flush(&ap->link, SCR_ERROR, serr);
+ 
+ 	edma_err_cause = readl(port_mmio + EDMA_ERR_IRQ_CAUSE_OFS);
++	if (IS_GEN_IIE(hpriv) && (edma_err_cause & EDMA_ERR_TRANS_IRQ_7)) {
++		fis_cause = readl(port_mmio + SATA_FIS_IRQ_CAUSE_OFS);
++		writelfl(~fis_cause, port_mmio + SATA_FIS_IRQ_CAUSE_OFS);
++	}
+ 	writelfl(~edma_err_cause, port_mmio + EDMA_ERR_IRQ_CAUSE_OFS);
+ 
+-	ata_port_printk(ap, KERN_INFO, "%s: err_cause=%08x pp_flags=0x%x\n",
+-			__func__, edma_err_cause, pp->pp_flags);
+-
+ 	if (edma_err_cause & EDMA_ERR_DEV) {
+ 		/*
+ 		 * Device errors during FIS-based switching operation
+@@ -1844,6 +1885,18 @@ static void mv_err_intr(struct ata_port *ap)
+ 	ata_ehi_clear_desc(ehi);
+ 	ata_ehi_push_desc(ehi, "edma_err_cause=%08x pp_flags=%08x",
+ 			  edma_err_cause, pp->pp_flags);
++
++	if (IS_GEN_IIE(hpriv) && (edma_err_cause & EDMA_ERR_TRANS_IRQ_7)) {
++		ata_ehi_push_desc(ehi, "fis_cause=%08x", fis_cause);
++		if (fis_cause & SATA_FIS_IRQ_AN) {
++			u32 ec = edma_err_cause &
++			       ~(EDMA_ERR_TRANS_IRQ_7 | EDMA_ERR_IRQ_TRANSIENT);
++			sata_async_notification(ap);
++			if (!ec)
++				return; /* Just an AN; no need for the nukes */
++			ata_ehi_push_desc(ehi, "SDB notify");
++		}
++	}
+ 	/*
+ 	 * All generations share these EDMA error cause bits:
+ 	 */
+@@ -2162,20 +2215,20 @@ static irqreturn_t mv_interrupt(int irq, void *dev_instance)
+ 	struct ata_host *host = dev_instance;
+ 	struct mv_host_priv *hpriv = host->private_data;
+ 	unsigned int handled = 0;
+-	u32 main_irq_cause, main_irq_mask;
++	u32 main_irq_cause, pending_irqs;
+ 
+ 	spin_lock(&host->lock);
+ 	main_irq_cause = readl(hpriv->main_irq_cause_addr);
+-	main_irq_mask  = readl(hpriv->main_irq_mask_addr);
++	pending_irqs   = main_irq_cause & hpriv->main_irq_mask;
+ 	/*
+ 	 * Deal with cases where we either have nothing pending, or have read
+ 	 * a bogus register value which can indicate HW removal or PCI fault.
+ 	 */
+-	if ((main_irq_cause & main_irq_mask) && (main_irq_cause != 0xffffffffU)) {
+-		if (unlikely((main_irq_cause & PCI_ERR) && HAS_PCI(host)))
++	if (pending_irqs && main_irq_cause != 0xffffffffU) {
++		if (unlikely((pending_irqs & PCI_ERR) && HAS_PCI(host)))
+ 			handled = mv_pci_error(host, hpriv->base);
+ 		else
+-			handled = mv_host_intr(host, main_irq_cause);
++			handled = mv_host_intr(host, pending_irqs);
+ 	}
+ 	spin_unlock(&host->lock);
+ 	return IRQ_RETVAL(handled);
+@@ -2373,7 +2426,6 @@ static void mv_reset_pci_bus(struct ata_host *host, void __iomem *mmio)
+ 	ZERO(MV_PCI_DISC_TIMER);
+ 	ZERO(MV_PCI_MSI_TRIGGER);
+ 	writel(0x000100ff, mmio + MV_PCI_XBAR_TMOUT_OFS);
+-	ZERO(PCI_HC_MAIN_IRQ_MASK_OFS);
+ 	ZERO(MV_PCI_SERR_MASK);
+ 	ZERO(hpriv->irq_cause_ofs);
+ 	ZERO(hpriv->irq_mask_ofs);
+@@ -2728,6 +2780,7 @@ static int mv_hardreset(struct ata_link *link, unsigned int *class,
+ 
+ 		rc = sata_link_hardreset(link, timing, deadline + extra,
+ 					 &online, NULL);
++		rc = online ? -EAGAIN : rc;
+ 		if (rc)
+ 			return rc;
+ 		sata_scr_read(link, SCR_STATUS, &sstatus);
+@@ -2744,32 +2797,18 @@ static int mv_hardreset(struct ata_link *link, unsigned int *class,
+ 
+ static void mv_eh_freeze(struct ata_port *ap)
+ {
+-	struct mv_host_priv *hpriv = ap->host->private_data;
+-	unsigned int shift, hardport, port = ap->port_no;
+-	u32 main_irq_mask;
+-
+-	/* FIXME: handle coalescing completion events properly */
+-
+ 	mv_stop_edma(ap);
+-	MV_PORT_TO_SHIFT_AND_HARDPORT(port, shift, hardport);
+-
+-	/* disable assertion of portN err, done events */
+-	main_irq_mask = readl(hpriv->main_irq_mask_addr);
+-	main_irq_mask &= ~((DONE_IRQ | ERR_IRQ) << shift);
+-	writelfl(main_irq_mask, hpriv->main_irq_mask_addr);
++	mv_enable_port_irqs(ap, 0);
+ }
+ 
+ static void mv_eh_thaw(struct ata_port *ap)
+ {
+ 	struct mv_host_priv *hpriv = ap->host->private_data;
+-	unsigned int shift, hardport, port = ap->port_no;
++	unsigned int port = ap->port_no;
++	unsigned int hardport = mv_hardport_from_port(port);
+ 	void __iomem *hc_mmio = mv_hc_base_from_port(hpriv->base, port);
+ 	void __iomem *port_mmio = mv_ap_base(ap);
+-	u32 main_irq_mask, hc_irq_cause;
+-
+-	/* FIXME: handle coalescing completion events properly */
+-
+-	MV_PORT_TO_SHIFT_AND_HARDPORT(port, shift, hardport);
++	u32 hc_irq_cause;
+ 
+ 	/* clear EDMA errors on this port */
+ 	writel(0, port_mmio + EDMA_ERR_IRQ_CAUSE_OFS);
+@@ -2779,10 +2818,7 @@ static void mv_eh_thaw(struct ata_port *ap)
+ 	hc_irq_cause &= ~((DEV_IRQ | DMA_IRQ) << hardport);
+ 	writelfl(hc_irq_cause, hc_mmio + HC_IRQ_CAUSE_OFS);
+ 
+-	/* enable assertion of portN err, done events */
+-	main_irq_mask = readl(hpriv->main_irq_mask_addr);
+-	main_irq_mask |= ((DONE_IRQ | ERR_IRQ) << shift);
+-	writelfl(main_irq_mask, hpriv->main_irq_mask_addr);
++	mv_enable_port_irqs(ap, ERR_IRQ);
+ }
+ 
+ /**
+@@ -3035,7 +3071,7 @@ static int mv_init_host(struct ata_host *host, unsigned int board_idx)
+ 	}
+ 
+ 	/* global interrupt mask: 0 == mask everything */
+-	writel(0, hpriv->main_irq_mask_addr);
++	mv_set_main_irq_mask(host, ~0, 0);
+ 
+ 	n_hc = mv_get_hc_count(host->ports[0]->flags);
+ 
+@@ -3083,25 +3119,12 @@ static int mv_init_host(struct ata_host *host, unsigned int board_idx)
+ 
+ 		/* and unmask interrupt generation for host regs */
+ 		writelfl(hpriv->unmask_all_irqs, mmio + hpriv->irq_mask_ofs);
+-		if (IS_GEN_I(hpriv))
+-			writelfl(~HC_MAIN_MASKED_IRQS_5,
+-				 hpriv->main_irq_mask_addr);
+-		else
+-			writelfl(~HC_MAIN_MASKED_IRQS,
+-				 hpriv->main_irq_mask_addr);
+-
+-		VPRINTK("HC MAIN IRQ cause/mask=0x%08x/0x%08x "
+-			"PCI int cause/mask=0x%08x/0x%08x\n",
+-			readl(hpriv->main_irq_cause_addr),
+-			readl(hpriv->main_irq_mask_addr),
+-			readl(mmio + hpriv->irq_cause_ofs),
+-			readl(mmio + hpriv->irq_mask_ofs));
+-	} else {
+-		writelfl(~HC_MAIN_MASKED_IRQS_SOC,
+-			 hpriv->main_irq_mask_addr);
+-		VPRINTK("HC MAIN IRQ cause/mask=0x%08x/0x%08x\n",
+-			readl(hpriv->main_irq_cause_addr),
+-			readl(hpriv->main_irq_mask_addr));
++
++		/*
++		 * enable only global host interrupts for now.
++		 * The per-port interrupts get done later as ports are set up.
++		 */
++		mv_set_main_irq_mask(host, 0, PCI_ERR);
+ 	}
+ done:
+ 	return rc;
+diff --git a/drivers/ata/sata_promise.c b/drivers/ata/sata_promise.c
+index 5a10dc5..030665b 100644
+--- a/drivers/ata/sata_promise.c
++++ b/drivers/ata/sata_promise.c
+@@ -53,7 +53,15 @@ enum {
+ 	PDC_MMIO_BAR		= 3,
+ 	PDC_MAX_PRD		= LIBATA_MAX_PRD - 1, /* -1 for ASIC PRD bug workaround */
+ 
+-	/* register offsets */
++	/* host register offsets (from host->iomap[PDC_MMIO_BAR]) */
++	PDC_INT_SEQMASK		= 0x40,	/* Mask of asserted SEQ INTs */
++	PDC_FLASH_CTL		= 0x44, /* Flash control register */
++	PDC_SATA_PLUG_CSR	= 0x6C, /* SATA Plug control/status reg */
++	PDC2_SATA_PLUG_CSR	= 0x60, /* SATAII Plug control/status reg */
++	PDC_TBG_MODE		= 0x41C, /* TBG mode (not SATAII) */
++	PDC_SLEW_CTL		= 0x470, /* slew rate control reg (not SATAII) */
++
++	/* per-port ATA register offsets (from ap->ioaddr.cmd_addr) */
+ 	PDC_FEATURE		= 0x04, /* Feature/Error reg (per port) */
+ 	PDC_SECTOR_COUNT	= 0x08, /* Sector count reg (per port) */
+ 	PDC_SECTOR_NUMBER	= 0x0C, /* Sector number reg (per port) */
+@@ -63,14 +71,11 @@ enum {
+ 	PDC_COMMAND		= 0x1C, /* Command/status reg (per port) */
+ 	PDC_ALTSTATUS		= 0x38, /* Alternate-status/device-control reg (per port) */
+ 	PDC_PKT_SUBMIT		= 0x40, /* Command packet pointer addr */
+-	PDC_INT_SEQMASK		= 0x40,	/* Mask of asserted SEQ INTs */
+-	PDC_FLASH_CTL		= 0x44, /* Flash control register */
+ 	PDC_GLOBAL_CTL		= 0x48, /* Global control/status (per port) */
+ 	PDC_CTLSTAT		= 0x60,	/* IDE control and status (per port) */
+-	PDC_SATA_PLUG_CSR	= 0x6C, /* SATA Plug control/status reg */
+-	PDC2_SATA_PLUG_CSR	= 0x60, /* SATAII Plug control/status reg */
+-	PDC_TBG_MODE		= 0x41C, /* TBG mode (not SATAII) */
+-	PDC_SLEW_CTL		= 0x470, /* slew rate control reg (not SATAII) */
++
++	/* per-port SATA register offsets (from ap->ioaddr.scr_addr) */
++	PDC_PHYMODE4		= 0x14,
+ 
+ 	/* PDC_GLOBAL_CTL bit definitions */
+ 	PDC_PH_ERR		= (1 <<  8), /* PCI error while loading packet */
+@@ -134,7 +139,7 @@ struct pdc_port_priv {
+ 
+ static int pdc_sata_scr_read(struct ata_port *ap, unsigned int sc_reg, u32 *val);
+ static int pdc_sata_scr_write(struct ata_port *ap, unsigned int sc_reg, u32 val);
+-static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *ent);
++static int pdc_ata_init_one(struct pci_dev *pdev, const struct pci_device_id *ent);
+ static int pdc_common_port_start(struct ata_port *ap);
+ static int pdc_sata_port_start(struct ata_port *ap);
+ static void pdc_qc_prep(struct ata_queued_cmd *qc);
+@@ -332,12 +337,12 @@ static int pdc_sata_port_start(struct ata_port *ap)
+ 
+ 	/* fix up PHYMODE4 align timing */
+ 	if (ap->flags & PDC_FLAG_GEN_II) {
+-		void __iomem *mmio = ap->ioaddr.scr_addr;
++		void __iomem *sata_mmio = ap->ioaddr.scr_addr;
+ 		unsigned int tmp;
+ 
+-		tmp = readl(mmio + 0x014);
++		tmp = readl(sata_mmio + PDC_PHYMODE4);
+ 		tmp = (tmp & ~3) | 1;	/* set bits 1:0 = 0:1 */
+-		writel(tmp, mmio + 0x014);
++		writel(tmp, sata_mmio + PDC_PHYMODE4);
+ 	}
+ 
+ 	return 0;
+@@ -345,32 +350,32 @@ static int pdc_sata_port_start(struct ata_port *ap)
+ 
+ static void pdc_reset_port(struct ata_port *ap)
+ {
+-	void __iomem *mmio = ap->ioaddr.cmd_addr + PDC_CTLSTAT;
++	void __iomem *ata_ctlstat_mmio = ap->ioaddr.cmd_addr + PDC_CTLSTAT;
+ 	unsigned int i;
+ 	u32 tmp;
+ 
+ 	for (i = 11; i > 0; i--) {
+-		tmp = readl(mmio);
++		tmp = readl(ata_ctlstat_mmio);
+ 		if (tmp & PDC_RESET)
+ 			break;
+ 
+ 		udelay(100);
+ 
+ 		tmp |= PDC_RESET;
+-		writel(tmp, mmio);
++		writel(tmp, ata_ctlstat_mmio);
+ 	}
+ 
+ 	tmp &= ~PDC_RESET;
+-	writel(tmp, mmio);
+-	readl(mmio);	/* flush */
++	writel(tmp, ata_ctlstat_mmio);
++	readl(ata_ctlstat_mmio);	/* flush */
+ }
+ 
+ static int pdc_pata_cable_detect(struct ata_port *ap)
+ {
+ 	u8 tmp;
+-	void __iomem *mmio = ap->ioaddr.cmd_addr + PDC_CTLSTAT + 0x03;
++	void __iomem *ata_mmio = ap->ioaddr.cmd_addr;
+ 
+-	tmp = readb(mmio);
++	tmp = readb(ata_mmio + PDC_CTLSTAT + 3);
+ 	if (tmp & 0x01)
+ 		return ATA_CBL_PATA40;
+ 	return ATA_CBL_PATA80;
+@@ -557,31 +562,25 @@ static void pdc_qc_prep(struct ata_queued_cmd *qc)
+ 	switch (qc->tf.protocol) {
+ 	case ATA_PROT_DMA:
+ 		pdc_fill_sg(qc);
+-		/* fall through */
+-
++		/*FALLTHROUGH*/
+ 	case ATA_PROT_NODATA:
+ 		i = pdc_pkt_header(&qc->tf, qc->ap->prd_dma,
+ 				   qc->dev->devno, pp->pkt);
+-
+ 		if (qc->tf.flags & ATA_TFLAG_LBA48)
+ 			i = pdc_prep_lba48(&qc->tf, pp->pkt, i);
+ 		else
+ 			i = pdc_prep_lba28(&qc->tf, pp->pkt, i);
+-
+ 		pdc_pkt_footer(&qc->tf, pp->pkt, i);
+ 		break;
+-
+ 	case ATAPI_PROT_PIO:
+ 		pdc_fill_sg(qc);
+ 		break;
+-
+ 	case ATAPI_PROT_DMA:
+ 		pdc_fill_sg(qc);
+ 		/*FALLTHROUGH*/
+ 	case ATAPI_PROT_NODATA:
+ 		pdc_atapi_pkt(qc);
+ 		break;
+-
+ 	default:
+ 		break;
+ 	}
+@@ -611,7 +610,7 @@ static unsigned int pdc_sata_ata_port_to_ata_no(const struct ata_port *ap)
+ 	unsigned int nr_ports = pdc_sata_nr_ports(ap);
+ 	unsigned int i;
+ 
+-	for(i = 0; i < nr_ports && host->ports[i] != ap; ++i)
++	for (i = 0; i < nr_ports && host->ports[i] != ap; ++i)
+ 		;
+ 	BUG_ON(i >= nr_ports);
+ 	return pdc_port_no_to_ata_no(i, pdc_is_sataii_tx4(ap->flags));
+@@ -624,14 +623,14 @@ static unsigned int pdc_sata_hotplug_offset(const struct ata_port *ap)
+ 
+ static void pdc_freeze(struct ata_port *ap)
+ {
+-	void __iomem *mmio = ap->ioaddr.cmd_addr;
++	void __iomem *ata_mmio = ap->ioaddr.cmd_addr;
+ 	u32 tmp;
+ 
+-	tmp = readl(mmio + PDC_CTLSTAT);
++	tmp = readl(ata_mmio + PDC_CTLSTAT);
+ 	tmp |= PDC_IRQ_DISABLE;
+ 	tmp &= ~PDC_DMA_ENABLE;
+-	writel(tmp, mmio + PDC_CTLSTAT);
+-	readl(mmio + PDC_CTLSTAT); /* flush */
++	writel(tmp, ata_mmio + PDC_CTLSTAT);
++	readl(ata_mmio + PDC_CTLSTAT); /* flush */
+ }
+ 
+ static void pdc_sata_freeze(struct ata_port *ap)
+@@ -659,17 +658,17 @@ static void pdc_sata_freeze(struct ata_port *ap)
+ 
+ static void pdc_thaw(struct ata_port *ap)
+ {
+-	void __iomem *mmio = ap->ioaddr.cmd_addr;
++	void __iomem *ata_mmio = ap->ioaddr.cmd_addr;
+ 	u32 tmp;
+ 
+ 	/* clear IRQ */
+-	readl(mmio + PDC_INT_SEQMASK);
++	readl(ata_mmio + PDC_COMMAND);
+ 
+ 	/* turn IRQ back on */
+-	tmp = readl(mmio + PDC_CTLSTAT);
++	tmp = readl(ata_mmio + PDC_CTLSTAT);
+ 	tmp &= ~PDC_IRQ_DISABLE;
+-	writel(tmp, mmio + PDC_CTLSTAT);
+-	readl(mmio + PDC_CTLSTAT); /* flush */
++	writel(tmp, ata_mmio + PDC_CTLSTAT);
++	readl(ata_mmio + PDC_CTLSTAT); /* flush */
+ }
+ 
+ static void pdc_sata_thaw(struct ata_port *ap)
+@@ -743,11 +742,11 @@ static void pdc_error_intr(struct ata_port *ap, struct ata_queued_cmd *qc,
+ 	ata_port_abort(ap);
+ }
+ 
+-static inline unsigned int pdc_host_intr(struct ata_port *ap,
+-					 struct ata_queued_cmd *qc)
++static unsigned int pdc_host_intr(struct ata_port *ap,
++				  struct ata_queued_cmd *qc)
+ {
+ 	unsigned int handled = 0;
+-	void __iomem *port_mmio = ap->ioaddr.cmd_addr;
++	void __iomem *ata_mmio = ap->ioaddr.cmd_addr;
+ 	u32 port_status, err_mask;
+ 
+ 	err_mask = PDC_ERR_MASK;
+@@ -755,7 +754,7 @@ static inline unsigned int pdc_host_intr(struct ata_port *ap,
+ 		err_mask &= ~PDC1_ERR_MASK;
+ 	else
+ 		err_mask &= ~PDC2_ERR_MASK;
+-	port_status = readl(port_mmio + PDC_GLOBAL_CTL);
++	port_status = readl(ata_mmio + PDC_GLOBAL_CTL);
+ 	if (unlikely(port_status & err_mask)) {
+ 		pdc_error_intr(ap, qc, port_status, err_mask);
+ 		return 1;
+@@ -770,7 +769,6 @@ static inline unsigned int pdc_host_intr(struct ata_port *ap,
+ 		ata_qc_complete(qc);
+ 		handled = 1;
+ 		break;
+-
+ 	default:
+ 		ap->stats.idle_irq++;
+ 		break;
+@@ -781,10 +779,9 @@ static inline unsigned int pdc_host_intr(struct ata_port *ap,
+ 
+ static void pdc_irq_clear(struct ata_port *ap)
+ {
+-	struct ata_host *host = ap->host;
+-	void __iomem *mmio = host->iomap[PDC_MMIO_BAR];
++	void __iomem *ata_mmio = ap->ioaddr.cmd_addr;
+ 
+-	readl(mmio + PDC_INT_SEQMASK);
++	readl(ata_mmio + PDC_COMMAND);
+ }
+ 
+ static irqreturn_t pdc_interrupt(int irq, void *dev_instance)
+@@ -794,7 +791,7 @@ static irqreturn_t pdc_interrupt(int irq, void *dev_instance)
+ 	u32 mask = 0;
+ 	unsigned int i, tmp;
+ 	unsigned int handled = 0;
+-	void __iomem *mmio_base;
++	void __iomem *host_mmio;
+ 	unsigned int hotplug_offset, ata_no;
+ 	u32 hotplug_status;
+ 	int is_sataii_tx4;
+@@ -806,7 +803,7 @@ static irqreturn_t pdc_interrupt(int irq, void *dev_instance)
+ 		return IRQ_NONE;
+ 	}
+ 
+-	mmio_base = host->iomap[PDC_MMIO_BAR];
++	host_mmio = host->iomap[PDC_MMIO_BAR];
+ 
+ 	spin_lock(&host->lock);
+ 
+@@ -815,26 +812,26 @@ static irqreturn_t pdc_interrupt(int irq, void *dev_instance)
+ 		hotplug_offset = PDC2_SATA_PLUG_CSR;
+ 	else
+ 		hotplug_offset = PDC_SATA_PLUG_CSR;
+-	hotplug_status = readl(mmio_base + hotplug_offset);
++	hotplug_status = readl(host_mmio + hotplug_offset);
+ 	if (hotplug_status & 0xff)
+-		writel(hotplug_status | 0xff, mmio_base + hotplug_offset);
++		writel(hotplug_status | 0xff, host_mmio + hotplug_offset);
+ 	hotplug_status &= 0xff;	/* clear uninteresting bits */
+ 
+ 	/* reading should also clear interrupts */
+-	mask = readl(mmio_base + PDC_INT_SEQMASK);
++	mask = readl(host_mmio + PDC_INT_SEQMASK);
+ 
+ 	if (mask == 0xffffffff && hotplug_status == 0) {
+ 		VPRINTK("QUICK EXIT 2\n");
+ 		goto done_irq;
+ 	}
+ 
+-	mask &= 0xffff;		/* only 16 tags possible */
++	mask &= 0xffff;		/* only 16 SEQIDs possible */
+ 	if (mask == 0 && hotplug_status == 0) {
+ 		VPRINTK("QUICK EXIT 3\n");
+ 		goto done_irq;
+ 	}
+ 
+-	writel(mask, mmio_base + PDC_INT_SEQMASK);
++	writel(mask, host_mmio + PDC_INT_SEQMASK);
+ 
+ 	is_sataii_tx4 = pdc_is_sataii_tx4(host->ports[0]->flags);
+ 
+@@ -875,23 +872,24 @@ done_irq:
+ 	return IRQ_RETVAL(handled);
+ }
+ 
+-static inline void pdc_packet_start(struct ata_queued_cmd *qc)
++static void pdc_packet_start(struct ata_queued_cmd *qc)
+ {
+ 	struct ata_port *ap = qc->ap;
+ 	struct pdc_port_priv *pp = ap->private_data;
+-	void __iomem *mmio = ap->host->iomap[PDC_MMIO_BAR];
++	void __iomem *host_mmio = ap->host->iomap[PDC_MMIO_BAR];
++	void __iomem *ata_mmio = ap->ioaddr.cmd_addr;
+ 	unsigned int port_no = ap->port_no;
+ 	u8 seq = (u8) (port_no + 1);
+ 
+ 	VPRINTK("ENTER, ap %p\n", ap);
+ 
+-	writel(0x00000001, mmio + (seq * 4));
+-	readl(mmio + (seq * 4));	/* flush */
++	writel(0x00000001, host_mmio + (seq * 4));
++	readl(host_mmio + (seq * 4));	/* flush */
+ 
+ 	pp->pkt[2] = seq;
+ 	wmb();			/* flush PRD, pkt writes */
+-	writel(pp->pkt_dma, ap->ioaddr.cmd_addr + PDC_PKT_SUBMIT);
+-	readl(ap->ioaddr.cmd_addr + PDC_PKT_SUBMIT); /* flush */
++	writel(pp->pkt_dma, ata_mmio + PDC_PKT_SUBMIT);
++	readl(ata_mmio + PDC_PKT_SUBMIT); /* flush */
+ }
+ 
+ static unsigned int pdc_qc_issue(struct ata_queued_cmd *qc)
+@@ -909,11 +907,9 @@ static unsigned int pdc_qc_issue(struct ata_queued_cmd *qc)
+ 	case ATA_PROT_DMA:
+ 		pdc_packet_start(qc);
+ 		return 0;
+-
+ 	default:
+ 		break;
+ 	}
+-
+ 	return ata_sff_qc_issue(qc);
+ }
+ 
+@@ -987,7 +983,7 @@ static void pdc_ata_setup_port(struct ata_port *ap,
+ 
+ static void pdc_host_init(struct ata_host *host)
+ {
+-	void __iomem *mmio = host->iomap[PDC_MMIO_BAR];
++	void __iomem *host_mmio = host->iomap[PDC_MMIO_BAR];
+ 	int is_gen2 = host->ports[0]->flags & PDC_FLAG_GEN_II;
+ 	int hotplug_offset;
+ 	u32 tmp;
+@@ -1004,38 +1000,38 @@ static void pdc_host_init(struct ata_host *host)
+ 	 */
+ 
+ 	/* enable BMR_BURST, maybe change FIFO_SHD to 8 dwords */
+-	tmp = readl(mmio + PDC_FLASH_CTL);
++	tmp = readl(host_mmio + PDC_FLASH_CTL);
+ 	tmp |= 0x02000;	/* bit 13 (enable bmr burst) */
+ 	if (!is_gen2)
+ 		tmp |= 0x10000;	/* bit 16 (fifo threshold at 8 dw) */
+-	writel(tmp, mmio + PDC_FLASH_CTL);
++	writel(tmp, host_mmio + PDC_FLASH_CTL);
+ 
+ 	/* clear plug/unplug flags for all ports */
+-	tmp = readl(mmio + hotplug_offset);
+-	writel(tmp | 0xff, mmio + hotplug_offset);
++	tmp = readl(host_mmio + hotplug_offset);
++	writel(tmp | 0xff, host_mmio + hotplug_offset);
+ 
+ 	/* unmask plug/unplug ints */
+-	tmp = readl(mmio + hotplug_offset);
+-	writel(tmp & ~0xff0000, mmio + hotplug_offset);
++	tmp = readl(host_mmio + hotplug_offset);
++	writel(tmp & ~0xff0000, host_mmio + hotplug_offset);
+ 
+ 	/* don't initialise TBG or SLEW on 2nd generation chips */
+ 	if (is_gen2)
+ 		return;
+ 
+ 	/* reduce TBG clock to 133 Mhz. */
+-	tmp = readl(mmio + PDC_TBG_MODE);
++	tmp = readl(host_mmio + PDC_TBG_MODE);
+ 	tmp &= ~0x30000; /* clear bit 17, 16*/
+ 	tmp |= 0x10000;  /* set bit 17:16 = 0:1 */
+-	writel(tmp, mmio + PDC_TBG_MODE);
++	writel(tmp, host_mmio + PDC_TBG_MODE);
+ 
+-	readl(mmio + PDC_TBG_MODE);	/* flush */
++	readl(host_mmio + PDC_TBG_MODE);	/* flush */
+ 	msleep(10);
+ 
+ 	/* adjust slew rate control register. */
+-	tmp = readl(mmio + PDC_SLEW_CTL);
++	tmp = readl(host_mmio + PDC_SLEW_CTL);
+ 	tmp &= 0xFFFFF03F; /* clear bit 11 ~ 6 */
+ 	tmp  |= 0x00000900; /* set bit 11-9 = 100b , bit 8-6 = 100 */
+-	writel(tmp, mmio + PDC_SLEW_CTL);
++	writel(tmp, host_mmio + PDC_SLEW_CTL);
+ }
+ 
+ static int pdc_ata_init_one(struct pci_dev *pdev,
+@@ -1045,7 +1041,7 @@ static int pdc_ata_init_one(struct pci_dev *pdev,
+ 	const struct ata_port_info *pi = &pdc_port_info[ent->driver_data];
+ 	const struct ata_port_info *ppi[PDC_MAX_PORTS];
+ 	struct ata_host *host;
+-	void __iomem *base;
++	void __iomem *host_mmio;
+ 	int n_ports, i, rc;
+ 	int is_sataii_tx4;
+ 
+@@ -1062,7 +1058,7 @@ static int pdc_ata_init_one(struct pci_dev *pdev,
+ 		pcim_pin_device(pdev);
+ 	if (rc)
+ 		return rc;
+-	base = pcim_iomap_table(pdev)[PDC_MMIO_BAR];
++	host_mmio = pcim_iomap_table(pdev)[PDC_MMIO_BAR];
+ 
+ 	/* determine port configuration and setup host */
+ 	n_ports = 2;
+@@ -1072,7 +1068,7 @@ static int pdc_ata_init_one(struct pci_dev *pdev,
+ 		ppi[i] = pi;
+ 
+ 	if (pi->flags & PDC_FLAG_SATA_PATA) {
+-		u8 tmp = readb(base + PDC_FLASH_CTL+1);
++		u8 tmp = readb(host_mmio + PDC_FLASH_CTL + 1);
+ 		if (!(tmp & 0x80))
+ 			ppi[n_ports++] = pi + 1;
+ 	}
+@@ -1088,13 +1084,13 @@ static int pdc_ata_init_one(struct pci_dev *pdev,
+ 	for (i = 0; i < host->n_ports; i++) {
+ 		struct ata_port *ap = host->ports[i];
+ 		unsigned int ata_no = pdc_port_no_to_ata_no(i, is_sataii_tx4);
+-		unsigned int port_offset = 0x200 + ata_no * 0x80;
++		unsigned int ata_offset = 0x200 + ata_no * 0x80;
+ 		unsigned int scr_offset = 0x400 + ata_no * 0x100;
+ 
+-		pdc_ata_setup_port(ap, base + port_offset, base + scr_offset);
++		pdc_ata_setup_port(ap, host_mmio + ata_offset, host_mmio + scr_offset);
+ 
+ 		ata_port_pbar_desc(ap, PDC_MMIO_BAR, -1, "mmio");
+-		ata_port_pbar_desc(ap, PDC_MMIO_BAR, port_offset, "port");
++		ata_port_pbar_desc(ap, PDC_MMIO_BAR, ata_offset, "ata");
+ 	}
+ 
+ 	/* initialize adapter */
+diff --git a/drivers/ata/sata_sil24.c b/drivers/ata/sata_sil24.c
+index 27a1101..8ee6b5b 100644
+--- a/drivers/ata/sata_sil24.c
++++ b/drivers/ata/sata_sil24.c
+@@ -899,14 +899,25 @@ static bool sil24_qc_fill_rtf(struct ata_queued_cmd *qc)
+ 
+ static void sil24_pmp_attach(struct ata_port *ap)
+ {
++	u32 *gscr = ap->link.device->gscr;
++
+ 	sil24_config_pmp(ap, 1);
+ 	sil24_init_port(ap);
++
++	if (sata_pmp_gscr_vendor(gscr) == 0x11ab &&
++	    sata_pmp_gscr_devid(gscr) == 0x4140) {
++		ata_port_printk(ap, KERN_INFO,
++			"disabling NCQ support due to sil24-mv4140 quirk\n");
++		ap->flags &= ~ATA_FLAG_NCQ;
++	}
+ }
+ 
+ static void sil24_pmp_detach(struct ata_port *ap)
+ {
+ 	sil24_init_port(ap);
+ 	sil24_config_pmp(ap, 0);
++
++	ap->flags |= ATA_FLAG_NCQ;
+ }
+ 
+ static int sil24_pmp_hardreset(struct ata_link *link, unsigned int *class,
+diff --git a/drivers/atm/fore200e.h b/drivers/atm/fore200e.h
+index 183841c..8dd4aa7 100644
+--- a/drivers/atm/fore200e.h
++++ b/drivers/atm/fore200e.h
+@@ -1,4 +1,3 @@
+-/* $Id: fore200e.h,v 1.4 2000/04/14 10:10:34 davem Exp $ */
+ #ifndef _FORE200E_H
+ #define _FORE200E_H
+ 
+diff --git a/drivers/atm/he.h b/drivers/atm/he.h
+index 1dc2775..fe6cd15 100644
+--- a/drivers/atm/he.h
++++ b/drivers/atm/he.h
+@@ -1,5 +1,3 @@
+-/* $Id: he.h,v 1.4 2003/05/06 22:48:00 chas Exp $ */
+-
+ /*
+ 
+   he.h
+diff --git a/drivers/atm/idt77252.c b/drivers/atm/idt77252.c
+index 28d77b5..3a504e9 100644
+--- a/drivers/atm/idt77252.c
++++ b/drivers/atm/idt77252.c
+@@ -1,8 +1,4 @@
+ /******************************************************************* 
+- * ident "$Id: idt77252.c,v 1.2 2001/11/11 08:13:54 ecd Exp $"
+- *
+- * $Author: ecd $
+- * $Date: 2001/11/11 08:13:54 $
+  *
+  * Copyright (c) 2000 ATecoM GmbH 
+  *
+@@ -29,9 +25,6 @@
+  * 675 Mass Ave, Cambridge, MA 02139, USA.
+  *
+  *******************************************************************/
+-static char const rcsid[] =
+-"$Id: idt77252.c,v 1.2 2001/11/11 08:13:54 ecd Exp $";
+-
+ 
+ #include <linux/module.h>
+ #include <linux/pci.h>
+diff --git a/drivers/atm/idt77252.h b/drivers/atm/idt77252.h
+index 6f2b4a5..e83eaf1 100644
+--- a/drivers/atm/idt77252.h
++++ b/drivers/atm/idt77252.h
+@@ -1,8 +1,4 @@
+ /******************************************************************* 
+- * ident "$Id: idt77252.h,v 1.2 2001/11/11 08:13:54 ecd Exp $"
+- *
+- * $Author: ecd $
+- * $Date: 2001/11/11 08:13:54 $
+  *
+  * Copyright (c) 2000 ATecoM GmbH 
+  *
+diff --git a/drivers/atm/iphase.h b/drivers/atm/iphase.h
+index 133eefc..b2cd20f 100644
+--- a/drivers/atm/iphase.h
++++ b/drivers/atm/iphase.h
+@@ -1025,7 +1025,8 @@ typedef struct iadev_t {
+         spinlock_t rx_lock, misc_lock;
+ 	struct atm_vcc **rx_open;	/* list of all open VCs */  
+         u16 num_rx_desc, rx_buf_sz, rxing;
+-        u32 rx_pkt_ram, rx_tmp_cnt, rx_tmp_jif;
++        u32 rx_pkt_ram, rx_tmp_cnt;
++        unsigned long rx_tmp_jif;
+         void __iomem *RX_DESC_BASE_ADDR;
+         u32 drop_rxpkt, drop_rxcell, rx_cell_cnt, rx_pkt_cnt;
+ 	struct atm_dev *next_board;	/* other iphase devices */  
+diff --git a/drivers/atm/nicstarmac.copyright b/drivers/atm/nicstarmac.copyright
+index 2e15b39..180531a 100644
+--- a/drivers/atm/nicstarmac.copyright
++++ b/drivers/atm/nicstarmac.copyright
+@@ -13,7 +13,7 @@
+  *
+  *   Modified to work with the IDT7721 nicstar -- AAL5 (tested) only.
+  *
+- * R. D. Rechenmacher <ron at fnal.gov>, Aug. 6, 1997 $Revision: 1.1 $ $Date: 1999/08/20 11:00:11 $
++ * R. D. Rechenmacher <ron at fnal.gov>, Aug. 6, 1997
+  *
+  * Linux driver for the IDT77201 NICStAR PCI ATM controller.
+  * PHY component is expected to be 155 Mbps S/UNI-Lite or IDT 77155;
+diff --git a/drivers/base/core.c b/drivers/base/core.c
+index be288b5..72eccae 100644
+--- a/drivers/base/core.c
++++ b/drivers/base/core.c
+@@ -1084,11 +1084,13 @@ static void device_create_release(struct device *dev)
+ }
+ 
+ /**
+- * device_create - creates a device and registers it with sysfs
++ * device_create_vargs - creates a device and registers it with sysfs
+  * @class: pointer to the struct class that this device should be registered to
+  * @parent: pointer to the parent struct device of this new device, if any
+  * @devt: the dev_t for the char device to be added
++ * @drvdata: the data to be added to the device for callbacks
+  * @fmt: string for the device's name
++ * @args: va_list for the device's name
+  *
+  * This function can be used by char device classes.  A struct device
+  * will be created in sysfs, registered to the specified class.
+@@ -1104,10 +1106,10 @@ static void device_create_release(struct device *dev)
+  * Note: the struct class passed to this function must have previously
+  * been created with a call to class_create().
+  */
+-struct device *device_create(struct class *class, struct device *parent,
+-			     dev_t devt, const char *fmt, ...)
++struct device *device_create_vargs(struct class *class, struct device *parent,
++				   dev_t devt, void *drvdata, const char *fmt,
++				   va_list args)
+ {
+-	va_list args;
+ 	struct device *dev = NULL;
+ 	int retval = -ENODEV;
+ 
+@@ -1124,10 +1126,9 @@ struct device *device_create(struct class *class, struct device *parent,
+ 	dev->class = class;
+ 	dev->parent = parent;
+ 	dev->release = device_create_release;
++	dev_set_drvdata(dev, drvdata);
+ 
+-	va_start(args, fmt);
+ 	vsnprintf(dev->bus_id, BUS_ID_SIZE, fmt, args);
+-	va_end(args);
+ 	retval = device_register(dev);
+ 	if (retval)
+ 		goto error;
+@@ -1138,6 +1139,78 @@ error:
+ 	kfree(dev);
+ 	return ERR_PTR(retval);
+ }
++EXPORT_SYMBOL_GPL(device_create_vargs);
++
++/**
++ * device_create_drvdata - creates a device and registers it with sysfs
++ * @class: pointer to the struct class that this device should be registered to
++ * @parent: pointer to the parent struct device of this new device, if any
++ * @devt: the dev_t for the char device to be added
++ * @drvdata: the data to be added to the device for callbacks
++ * @fmt: string for the device's name
++ *
++ * This function can be used by char device classes.  A struct device
++ * will be created in sysfs, registered to the specified class.
++ *
++ * A "dev" file will be created, showing the dev_t for the device, if
++ * the dev_t is not 0,0.
++ * If a pointer to a parent struct device is passed in, the newly created
++ * struct device will be a child of that device in sysfs.
++ * The pointer to the struct device will be returned from the call.
++ * Any further sysfs files that might be required can be created using this
++ * pointer.
++ *
++ * Note: the struct class passed to this function must have previously
++ * been created with a call to class_create().
++ */
++struct device *device_create_drvdata(struct class *class,
++				     struct device *parent,
++				     dev_t devt,
++				     void *drvdata,
++				     const char *fmt, ...)
++{
++	va_list vargs;
++	struct device *dev;
++
++	va_start(vargs, fmt);
++	dev = device_create_vargs(class, parent, devt, drvdata, fmt, vargs);
++	va_end(vargs);
++	return dev;
++}
++EXPORT_SYMBOL_GPL(device_create_drvdata);
++
++/**
++ * device_create - creates a device and registers it with sysfs
++ * @class: pointer to the struct class that this device should be registered to
++ * @parent: pointer to the parent struct device of this new device, if any
++ * @devt: the dev_t for the char device to be added
++ * @fmt: string for the device's name
++ *
++ * This function can be used by char device classes.  A struct device
++ * will be created in sysfs, registered to the specified class.
++ *
++ * A "dev" file will be created, showing the dev_t for the device, if
++ * the dev_t is not 0,0.
++ * If a pointer to a parent struct device is passed in, the newly created
++ * struct device will be a child of that device in sysfs.
++ * The pointer to the struct device will be returned from the call.
++ * Any further sysfs files that might be required can be created using this
++ * pointer.
++ *
++ * Note: the struct class passed to this function must have previously
++ * been created with a call to class_create().
++ */
++struct device *device_create(struct class *class, struct device *parent,
++			     dev_t devt, const char *fmt, ...)
++{
++	va_list vargs;
++	struct device *dev;
++
++	va_start(vargs, fmt);
++	dev = device_create_vargs(class, parent, devt, NULL, fmt, vargs);
++	va_end(vargs);
++	return dev;
++}
+ EXPORT_SYMBOL_GPL(device_create);
+ 
+ static int __match_devt(struct device *dev, void *data)
+@@ -1218,13 +1291,11 @@ int device_rename(struct device *dev, char *new_name)
+ 	}
+ #else
+ 	if (dev->class) {
+-		sysfs_remove_link(&dev->class->subsys.kobj, old_device_name);
+ 		error = sysfs_create_link(&dev->class->subsys.kobj, &dev->kobj,
+ 					  dev->bus_id);
+-		if (error) {
+-			dev_err(dev, "%s: sysfs_create_symlink failed (%d)\n",
+-				__func__, error);
+-		}
++		if (error)
++			goto out;
++		sysfs_remove_link(&dev->class->subsys.kobj, old_device_name);
+ 	}
+ #endif
+ 
+diff --git a/drivers/char/drm/drm.h b/drivers/char/drm/drm.h
+index 6874f31..3a05c6d 100644
+--- a/drivers/char/drm/drm.h
++++ b/drivers/char/drm/drm.h
+@@ -471,7 +471,6 @@ struct drm_irq_busid {
+ enum drm_vblank_seq_type {
+ 	_DRM_VBLANK_ABSOLUTE = 0x0,	/**< Wait for specific vblank sequence number */
+ 	_DRM_VBLANK_RELATIVE = 0x1,	/**< Wait for given number of vblanks */
+-	_DRM_VBLANK_FLIP = 0x8000000,	/**< Scheduled buffer swap should flip */
+ 	_DRM_VBLANK_NEXTONMISS = 0x10000000,	/**< If missed, wait for next vblank */
+ 	_DRM_VBLANK_SECONDARY = 0x20000000,	/**< Secondary display controller */
+ 	_DRM_VBLANK_SIGNAL = 0x40000000	/**< Send signal instead of blocking */
+@@ -504,21 +503,6 @@ union drm_wait_vblank {
+ 	struct drm_wait_vblank_reply reply;
+ };
+ 
+-enum drm_modeset_ctl_cmd {
+-	_DRM_PRE_MODESET = 1,
+-	_DRM_POST_MODESET = 2,
+-};
+-
+-/**
+- * DRM_IOCTL_MODESET_CTL ioctl argument type
+- *
+- * \sa drmModesetCtl().
+- */
+-struct drm_modeset_ctl {
+-	unsigned long arg;
+-	enum drm_modeset_ctl_cmd cmd;
+-};
+-
+ /**
+  * DRM_IOCTL_AGP_ENABLE ioctl argument type.
+  *
+@@ -603,7 +587,6 @@ struct drm_set_version {
+ #define DRM_IOCTL_GET_CLIENT            DRM_IOWR(0x05, struct drm_client)
+ #define DRM_IOCTL_GET_STATS             DRM_IOR( 0x06, struct drm_stats)
+ #define DRM_IOCTL_SET_VERSION		DRM_IOWR(0x07, struct drm_set_version)
+-#define DRM_IOCTL_MODESET_CTL           DRM_IOW(0x08, struct drm_modeset_ctl)
+ 
+ #define DRM_IOCTL_SET_UNIQUE		DRM_IOW( 0x10, struct drm_unique)
+ #define DRM_IOCTL_AUTH_MAGIC		DRM_IOW( 0x11, struct drm_auth)
+diff --git a/drivers/char/drm/drmP.h b/drivers/char/drm/drmP.h
+index 213b3ca..0764b66 100644
+--- a/drivers/char/drm/drmP.h
++++ b/drivers/char/drm/drmP.h
+@@ -100,8 +100,10 @@ struct drm_device;
+ #define DRIVER_HAVE_DMA    0x20
+ #define DRIVER_HAVE_IRQ    0x40
+ #define DRIVER_IRQ_SHARED  0x80
++#define DRIVER_IRQ_VBL     0x100
+ #define DRIVER_DMA_QUEUE   0x200
+ #define DRIVER_FB_DMA      0x400
++#define DRIVER_IRQ_VBL2    0x800
+ 
+ /***********************************************************************/
+ /** \name Begin the DRM... */
+@@ -577,52 +579,10 @@ struct drm_driver {
+ 	int (*context_dtor) (struct drm_device *dev, int context);
+ 	int (*kernel_context_switch) (struct drm_device *dev, int old,
+ 				      int new);
+-	void (*kernel_context_switch_unlock) (struct drm_device * dev);
+-	/**
+-	 * get_vblank_counter - get raw hardware vblank counter
+-	 * @dev: DRM device
+-	 * @crtc: counter to fetch
+-	 *
+-	 * Driver callback for fetching a raw hardware vblank counter
+-	 * for @crtc.  If a device doesn't have a hardware counter, the
+-	 * driver can simply return the value of drm_vblank_count and
+-	 * make the enable_vblank() and disable_vblank() hooks into no-ops,
+-	 * leaving interrupts enabled at all times.
+-	 *
+-	 * Wraparound handling and loss of events due to modesetting is dealt
+-	 * with in the DRM core code.
+-	 *
+-	 * RETURNS
+-	 * Raw vblank counter value.
+-	 */
+-	u32 (*get_vblank_counter) (struct drm_device *dev, int crtc);
+-
+-	/**
+-	 * enable_vblank - enable vblank interrupt events
+-	 * @dev: DRM device
+-	 * @crtc: which irq to enable
+-	 *
+-	 * Enable vblank interrupts for @crtc.  If the device doesn't have
+-	 * a hardware vblank counter, this routine should be a no-op, since
+-	 * interrupts will have to stay on to keep the count accurate.
+-	 *
+-	 * RETURNS
+-	 * Zero on success, appropriate errno if the given @crtc's vblank
+-	 * interrupt cannot be enabled.
+-	 */
+-	int (*enable_vblank) (struct drm_device *dev, int crtc);
+-
+-	/**
+-	 * disable_vblank - disable vblank interrupt events
+-	 * @dev: DRM device
+-	 * @crtc: which irq to enable
+-	 *
+-	 * Disable vblank interrupts for @crtc.  If the device doesn't have
+-	 * a hardware vblank counter, this routine should be a no-op, since
+-	 * interrupts will have to stay on to keep the count accurate.
+-	 */
+-	void (*disable_vblank) (struct drm_device *dev, int crtc);
+-	int (*dri_library_name) (struct drm_device *dev, char * buf);
++	void (*kernel_context_switch_unlock) (struct drm_device *dev);
++	int (*vblank_wait) (struct drm_device *dev, unsigned int *sequence);
++	int (*vblank_wait2) (struct drm_device *dev, unsigned int *sequence);
++	int (*dri_library_name) (struct drm_device *dev, char *buf);
+ 
+ 	/**
+ 	 * Called by \c drm_device_is_agp.  Typically used to determine if a
+@@ -641,7 +601,7 @@ struct drm_driver {
+ 
+ 	irqreturn_t(*irq_handler) (DRM_IRQ_ARGS);
+ 	void (*irq_preinstall) (struct drm_device *dev);
+-	int (*irq_postinstall) (struct drm_device *dev);
++	void (*irq_postinstall) (struct drm_device *dev);
+ 	void (*irq_uninstall) (struct drm_device *dev);
+ 	void (*reclaim_buffers) (struct drm_device *dev,
+ 				 struct drm_file * file_priv);
+@@ -770,21 +730,13 @@ struct drm_device {
+ 	/** \name VBLANK IRQ support */
+ 	/*@{ */
+ 
+-	wait_queue_head_t *vbl_queue;	/**< VBLANK wait queue */
+-	atomic_t *_vblank_count;	/**< number of VBLANK interrupts (driver must alloc the right number of counters) */
++	wait_queue_head_t vbl_queue;	/**< VBLANK wait queue */
++	atomic_t vbl_received;
++	atomic_t vbl_received2;		/**< number of secondary VBLANK interrupts */
+ 	spinlock_t vbl_lock;
+-	struct list_head *vbl_sigs;		/**< signal list to send on VBLANK */
+-	atomic_t vbl_signal_pending;	/* number of signals pending on all crtcs*/
+-	atomic_t *vblank_refcount;	/* number of users of vblank interrupts per crtc */
+-	u32 *last_vblank;		/* protected by dev->vbl_lock, used */
+-					/* for wraparound handling */
+-	u32 *vblank_offset;		/* used to track how many vblanks */
+-	int *vblank_enabled;		/* so we don't call enable more than
+-					   once per disable */
+-	u32 *vblank_premodeset;		/*  were lost during modeset */
+-	struct timer_list vblank_disable_timer;
+-
+-	unsigned long max_vblank_count; /**< size of vblank counter register */
++	struct list_head vbl_sigs;		/**< signal list to send on VBLANK */
++	struct list_head vbl_sigs2;	/**< signals to send on secondary VBLANK */
++	unsigned int vbl_pending;
+ 	spinlock_t tasklet_lock;	/**< For drm_locked_tasklet */
+ 	void (*locked_tasklet_func)(struct drm_device *dev);
+ 
+@@ -804,7 +756,6 @@ struct drm_device {
+ #ifdef __alpha__
+ 	struct pci_controller *hose;
+ #endif
+-	int num_crtcs;			/**< Number of CRTCs on this device */
+ 	struct drm_sg_mem *sg;	/**< Scatter gather memory */
+ 	void *dev_private;		/**< device private data */
+ 	struct drm_sigdata sigdata;	   /**< For block_all_signals */
+@@ -1039,19 +990,11 @@ extern void drm_driver_irq_preinstall(struct drm_device *dev);
+ extern void drm_driver_irq_postinstall(struct drm_device *dev);
+ extern void drm_driver_irq_uninstall(struct drm_device *dev);
+ 
+-extern int drm_vblank_init(struct drm_device *dev, int num_crtcs);
+-extern int drm_wait_vblank(struct drm_device *dev, void *data, struct drm_file *filp);
+-extern int drm_vblank_wait(struct drm_device * dev, unsigned int *vbl_seq);
+-extern void drm_locked_tasklet(struct drm_device *dev, void(*func)(struct drm_device*));
+-extern u32 drm_vblank_count(struct drm_device *dev, int crtc);
+-extern void drm_update_vblank_count(struct drm_device *dev, int crtc);
+-extern void drm_handle_vblank(struct drm_device *dev, int crtc);
+-extern int drm_vblank_get(struct drm_device *dev, int crtc);
+-extern void drm_vblank_put(struct drm_device *dev, int crtc);
+-
+-				/* Modesetting support */
+-extern int drm_modeset_ctl(struct drm_device *dev, void *data,
++extern int drm_wait_vblank(struct drm_device *dev, void *data,
+ 			   struct drm_file *file_priv);
++extern int drm_vblank_wait(struct drm_device *dev, unsigned int *vbl_seq);
++extern void drm_vbl_send_signals(struct drm_device *dev);
++extern void drm_locked_tasklet(struct drm_device *dev, void(*func)(struct drm_device*));
+ 
+ 				/* AGP/GART support (drm_agpsupport.h) */
+ extern struct drm_agp_head *drm_agp_init(struct drm_device *dev);
+diff --git a/drivers/char/drm/drm_fops.c b/drivers/char/drm/drm_fops.c
+index 68f0da8..d2e6da8 100644
+--- a/drivers/char/drm/drm_fops.c
++++ b/drivers/char/drm/drm_fops.c
+@@ -323,7 +323,6 @@ int drm_release(struct inode *inode, struct file *filp)
+ 	struct drm_file *file_priv = filp->private_data;
+ 	struct drm_device *dev = file_priv->minor->dev;
+ 	int retcode = 0;
+-	unsigned long irqflags;
+ 
+ 	lock_kernel();
+ 
+@@ -355,11 +354,9 @@ int drm_release(struct inode *inode, struct file *filp)
+ 			 */
+ 
+ 			do{
+-				spin_lock_irqsave(&dev->lock.spinlock,
+-						  irqflags);
++				spin_lock_bh(&dev->lock.spinlock);
+ 				locked = dev->lock.idle_has_lock;
+-				spin_unlock_irqrestore(&dev->lock.spinlock,
+-						       irqflags);
++				spin_unlock_bh(&dev->lock.spinlock);
+ 				if (locked)
+ 					break;
+ 				schedule();
+diff --git a/drivers/char/drm/drm_irq.c b/drivers/char/drm/drm_irq.c
+index 286f9d6..089c015 100644
+--- a/drivers/char/drm/drm_irq.c
++++ b/drivers/char/drm/drm_irq.c
+@@ -71,117 +71,6 @@ int drm_irq_by_busid(struct drm_device *dev, void *data,
+ 	return 0;
+ }
+ 
+-static void vblank_disable_fn(unsigned long arg)
+-{
+-	struct drm_device *dev = (struct drm_device *)arg;
+-	unsigned long irqflags;
+-	int i;
+-
+-	for (i = 0; i < dev->num_crtcs; i++) {
+-		spin_lock_irqsave(&dev->vbl_lock, irqflags);
+-		if (atomic_read(&dev->vblank_refcount[i]) == 0 &&
+-		    dev->vblank_enabled[i]) {
+-			dev->driver->disable_vblank(dev, i);
+-			dev->vblank_enabled[i] = 0;
+-		}
+-		spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
+-	}
+-}
+-
+-static void drm_vblank_cleanup(struct drm_device *dev)
+-{
+-	/* Bail if the driver didn't call drm_vblank_init() */
+-	if (dev->num_crtcs == 0)
+-		return;
+-
+-	del_timer(&dev->vblank_disable_timer);
+-
+-	vblank_disable_fn((unsigned long)dev);
+-
+-	drm_free(dev->vbl_queue, sizeof(*dev->vbl_queue) * dev->num_crtcs,
+-		 DRM_MEM_DRIVER);
+-	drm_free(dev->vbl_sigs, sizeof(*dev->vbl_sigs) * dev->num_crtcs,
+-		 DRM_MEM_DRIVER);
+-	drm_free(dev->_vblank_count, sizeof(*dev->_vblank_count) *
+-		 dev->num_crtcs, DRM_MEM_DRIVER);
+-	drm_free(dev->vblank_refcount, sizeof(*dev->vblank_refcount) *
+-		 dev->num_crtcs, DRM_MEM_DRIVER);
+-	drm_free(dev->vblank_enabled, sizeof(*dev->vblank_enabled) *
+-		 dev->num_crtcs, DRM_MEM_DRIVER);
+-	drm_free(dev->last_vblank, sizeof(*dev->last_vblank) * dev->num_crtcs,
+-		 DRM_MEM_DRIVER);
+-	drm_free(dev->vblank_premodeset, sizeof(*dev->vblank_premodeset) *
+-		 dev->num_crtcs, DRM_MEM_DRIVER);
+-	drm_free(dev->vblank_offset, sizeof(*dev->vblank_offset) * dev->num_crtcs,
+-		 DRM_MEM_DRIVER);
+-
+-	dev->num_crtcs = 0;
+-}
+-
+-int drm_vblank_init(struct drm_device *dev, int num_crtcs)
+-{
+-	int i, ret = -ENOMEM;
+-
+-	setup_timer(&dev->vblank_disable_timer, vblank_disable_fn,
+-		    (unsigned long)dev);
+-	spin_lock_init(&dev->vbl_lock);
+-	atomic_set(&dev->vbl_signal_pending, 0);
+-	dev->num_crtcs = num_crtcs;
+-
+-	dev->vbl_queue = drm_alloc(sizeof(wait_queue_head_t) * num_crtcs,
+-				   DRM_MEM_DRIVER);
+-	if (!dev->vbl_queue)
+-		goto err;
+-
+-	dev->vbl_sigs = drm_alloc(sizeof(struct list_head) * num_crtcs,
+-				  DRM_MEM_DRIVER);
+-	if (!dev->vbl_sigs)
+-		goto err;
+-
+-	dev->_vblank_count = drm_alloc(sizeof(atomic_t) * num_crtcs,
+-				      DRM_MEM_DRIVER);
+-	if (!dev->_vblank_count)
+-		goto err;
+-
+-	dev->vblank_refcount = drm_alloc(sizeof(atomic_t) * num_crtcs,
+-					 DRM_MEM_DRIVER);
+-	if (!dev->vblank_refcount)
+-		goto err;
+-
+-	dev->vblank_enabled = drm_calloc(num_crtcs, sizeof(int),
+-					 DRM_MEM_DRIVER);
+-	if (!dev->vblank_enabled)
+-		goto err;
+-
+-	dev->last_vblank = drm_calloc(num_crtcs, sizeof(u32), DRM_MEM_DRIVER);
+-	if (!dev->last_vblank)
+-		goto err;
+-
+-	dev->vblank_premodeset = drm_calloc(num_crtcs, sizeof(u32),
+-					    DRM_MEM_DRIVER);
+-	if (!dev->vblank_premodeset)
+-		goto err;
+-
+-	dev->vblank_offset = drm_calloc(num_crtcs, sizeof(u32), DRM_MEM_DRIVER);
+-	if (!dev->vblank_offset)
+-		goto err;
+-
+-	/* Zero per-crtc vblank stuff */
+-	for (i = 0; i < num_crtcs; i++) {
+-		init_waitqueue_head(&dev->vbl_queue[i]);
+-		INIT_LIST_HEAD(&dev->vbl_sigs[i]);
+-		atomic_set(&dev->_vblank_count[i], 0);
+-		atomic_set(&dev->vblank_refcount[i], 0);
+-	}
+-
+-	return 0;
+-
+-err:
+-	drm_vblank_cleanup(dev);
+-	return ret;
+-}
+-EXPORT_SYMBOL(drm_vblank_init);
+-
+ /**
+  * Install IRQ handler.
+  *
+@@ -220,6 +109,17 @@ static int drm_irq_install(struct drm_device * dev)
+ 
+ 	DRM_DEBUG("irq=%d\n", dev->irq);
+ 
++	if (drm_core_check_feature(dev, DRIVER_IRQ_VBL)) {
++		init_waitqueue_head(&dev->vbl_queue);
++
++		spin_lock_init(&dev->vbl_lock);
++
++		INIT_LIST_HEAD(&dev->vbl_sigs);
++		INIT_LIST_HEAD(&dev->vbl_sigs2);
++
++		dev->vbl_pending = 0;
++	}
++
+ 	/* Before installing handler */
+ 	dev->driver->irq_preinstall(dev);
+ 
+@@ -237,14 +137,9 @@ static int drm_irq_install(struct drm_device * dev)
+ 	}
+ 
+ 	/* After installing handler */
+-	ret = dev->driver->irq_postinstall(dev);
+-	if (ret < 0) {
+-		mutex_lock(&dev->struct_mutex);
+-		dev->irq_enabled = 0;
+-		mutex_unlock(&dev->struct_mutex);
+-	}
++	dev->driver->irq_postinstall(dev);
+ 
+-	return ret;
++	return 0;
+ }
+ 
+ /**
+@@ -275,8 +170,6 @@ int drm_irq_uninstall(struct drm_device * dev)
+ 
+ 	free_irq(dev->irq, dev);
+ 
+-	drm_vblank_cleanup(dev);
+-
+ 	dev->locked_tasklet_func = NULL;
+ 
+ 	return 0;
+@@ -321,148 +214,6 @@ int drm_control(struct drm_device *dev, void *data,
+ }
+ 
+ /**
+- * drm_vblank_count - retrieve "cooked" vblank counter value
+- * @dev: DRM device
+- * @crtc: which counter to retrieve
+- *
+- * Fetches the "cooked" vblank count value that represents the number of
+- * vblank events since the system was booted, including lost events due to
+- * modesetting activity.
+- */
+-u32 drm_vblank_count(struct drm_device *dev, int crtc)
+-{
+-	return atomic_read(&dev->_vblank_count[crtc]) +
+-		dev->vblank_offset[crtc];
+-}
+-EXPORT_SYMBOL(drm_vblank_count);
+-
+-/**
+- * drm_update_vblank_count - update the master vblank counter
+- * @dev: DRM device
+- * @crtc: counter to update
+- *
+- * Call back into the driver to update the appropriate vblank counter
+- * (specified by @crtc).  Deal with wraparound, if it occurred, and
+- * update the last read value so we can deal with wraparound on the next
+- * call if necessary.
+- */
+-void drm_update_vblank_count(struct drm_device *dev, int crtc)
+-{
+-	unsigned long irqflags;
+-	u32 cur_vblank, diff;
+-
+-	/*
+-	 * Interrupts were disabled prior to this call, so deal with counter
+-	 * wrap if needed.
+-	 * NOTE!  It's possible we lost a full dev->max_vblank_count events
+-	 * here if the register is small or we had vblank interrupts off for
+-	 * a long time.
+-	 */
+-	cur_vblank = dev->driver->get_vblank_counter(dev, crtc);
+-	spin_lock_irqsave(&dev->vbl_lock, irqflags);
+-	if (cur_vblank < dev->last_vblank[crtc]) {
+-		diff = dev->max_vblank_count -
+-			dev->last_vblank[crtc];
+-		diff += cur_vblank;
+-	} else {
+-		diff = cur_vblank - dev->last_vblank[crtc];
+-	}
+-	dev->last_vblank[crtc] = cur_vblank;
+-	spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
+-
+-	atomic_add(diff, &dev->_vblank_count[crtc]);
+-}
+-EXPORT_SYMBOL(drm_update_vblank_count);
+-
+-/**
+- * drm_vblank_get - get a reference count on vblank events
+- * @dev: DRM device
+- * @crtc: which CRTC to own
+- *
+- * Acquire a reference count on vblank events to avoid having them disabled
+- * while in use.  Note callers will probably want to update the master counter
+- * using drm_update_vblank_count() above before calling this routine so that
+- * wakeups occur on the right vblank event.
+- *
+- * RETURNS
+- * Zero on success, nonzero on failure.
+- */
+-int drm_vblank_get(struct drm_device *dev, int crtc)
+-{
+-	unsigned long irqflags;
+-	int ret = 0;
+-
+-	spin_lock_irqsave(&dev->vbl_lock, irqflags);
+-	/* Going from 0->1 means we have to enable interrupts again */
+-	if (atomic_add_return(1, &dev->vblank_refcount[crtc]) == 1 &&
+-	    !dev->vblank_enabled[crtc]) {
+-		ret = dev->driver->enable_vblank(dev, crtc);
+-		if (ret)
+-			atomic_dec(&dev->vblank_refcount[crtc]);
+-		else
+-			dev->vblank_enabled[crtc] = 1;
+-	}
+-	spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
+-
+-	return ret;
+-}
+-EXPORT_SYMBOL(drm_vblank_get);
+-
+-/**
+- * drm_vblank_put - give up ownership of vblank events
+- * @dev: DRM device
+- * @crtc: which counter to give up
+- *
+- * Release ownership of a given vblank counter, turning off interrupts
+- * if possible.
+- */
+-void drm_vblank_put(struct drm_device *dev, int crtc)
+-{
+-	/* Last user schedules interrupt disable */
+-	if (atomic_dec_and_test(&dev->vblank_refcount[crtc]))
+-	    mod_timer(&dev->vblank_disable_timer, jiffies + 5*DRM_HZ);
+-}
+-EXPORT_SYMBOL(drm_vblank_put);
+-
+-/**
+- * drm_modeset_ctl - handle vblank event counter changes across mode switch
+- * @DRM_IOCTL_ARGS: standard ioctl arguments
+- *
+- * Applications should call the %_DRM_PRE_MODESET and %_DRM_POST_MODESET
+- * ioctls around modesetting so that any lost vblank events are accounted for.
+- */
+-int drm_modeset_ctl(struct drm_device *dev, void *data,
+-		    struct drm_file *file_priv)
+-{
+-	struct drm_modeset_ctl *modeset = data;
+-	int crtc, ret = 0;
+-	u32 new;
+-
+-	crtc = modeset->arg;
+-	if (crtc >= dev->num_crtcs) {
+-		ret = -EINVAL;
+-		goto out;
+-	}
+-
+-	switch (modeset->cmd) {
+-	case _DRM_PRE_MODESET:
+-		dev->vblank_premodeset[crtc] =
+-			dev->driver->get_vblank_counter(dev, crtc);
+-		break;
+-	case _DRM_POST_MODESET:
+-		new = dev->driver->get_vblank_counter(dev, crtc);
+-		dev->vblank_offset[crtc] = dev->vblank_premodeset[crtc] - new;
+-		break;
+-	default:
+-		ret = -EINVAL;
+-		break;
+-	}
+-
+-out:
+-	return ret;
+-}
+-
+-/**
+  * Wait for VBLANK.
+  *
+  * \param inode device inode.
+@@ -481,13 +232,12 @@ out:
+  *
+  * If a signal is not requested, then calls vblank_wait().
+  */
+-int drm_wait_vblank(struct drm_device *dev, void *data,
+-		    struct drm_file *file_priv)
++int drm_wait_vblank(struct drm_device *dev, void *data, struct drm_file *file_priv)
+ {
+ 	union drm_wait_vblank *vblwait = data;
+ 	struct timeval now;
+ 	int ret = 0;
+-	unsigned int flags, seq, crtc;
++	unsigned int flags, seq;
+ 
+ 	if ((!dev->irq) || (!dev->irq_enabled))
+ 		return -EINVAL;
+@@ -501,13 +251,13 @@ int drm_wait_vblank(struct drm_device *dev, void *data,
+ 	}
+ 
+ 	flags = vblwait->request.type & _DRM_VBLANK_FLAGS_MASK;
+-	crtc = flags & _DRM_VBLANK_SECONDARY ? 1 : 0;
+ 
+-	if (crtc >= dev->num_crtcs)
++	if (!drm_core_check_feature(dev, (flags & _DRM_VBLANK_SECONDARY) ?
++				    DRIVER_IRQ_VBL2 : DRIVER_IRQ_VBL))
+ 		return -EINVAL;
+ 
+-	drm_update_vblank_count(dev, crtc);
+-	seq = drm_vblank_count(dev, crtc);
++	seq = atomic_read((flags & _DRM_VBLANK_SECONDARY) ? &dev->vbl_received2
++			  : &dev->vbl_received);
+ 
+ 	switch (vblwait->request.type & _DRM_VBLANK_TYPES_MASK) {
+ 	case _DRM_VBLANK_RELATIVE:
+@@ -526,7 +276,8 @@ int drm_wait_vblank(struct drm_device *dev, void *data,
+ 
+ 	if (flags & _DRM_VBLANK_SIGNAL) {
+ 		unsigned long irqflags;
+-		struct list_head *vbl_sigs = &dev->vbl_sigs[crtc];
++		struct list_head *vbl_sigs = (flags & _DRM_VBLANK_SECONDARY)
++				      ? &dev->vbl_sigs2 : &dev->vbl_sigs;
+ 		struct drm_vbl_sig *vbl_sig;
+ 
+ 		spin_lock_irqsave(&dev->vbl_lock, irqflags);
+@@ -547,26 +298,22 @@ int drm_wait_vblank(struct drm_device *dev, void *data,
+ 			}
+ 		}
+ 
+-		if (atomic_read(&dev->vbl_signal_pending) >= 100) {
++		if (dev->vbl_pending >= 100) {
+ 			spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
+ 			return -EBUSY;
+ 		}
+ 
++		dev->vbl_pending++;
++
+ 		spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
+ 
+-		vbl_sig = drm_calloc(1, sizeof(struct drm_vbl_sig),
+-				     DRM_MEM_DRIVER);
+-		if (!vbl_sig)
++		if (!
++		    (vbl_sig =
++		     drm_alloc(sizeof(struct drm_vbl_sig), DRM_MEM_DRIVER))) {
+ 			return -ENOMEM;
+-
+-		ret = drm_vblank_get(dev, crtc);
+-		if (ret) {
+-			drm_free(vbl_sig, sizeof(struct drm_vbl_sig),
+-				 DRM_MEM_DRIVER);
+-			return ret;
+ 		}
+ 
+-		atomic_inc(&dev->vbl_signal_pending);
++		memset((void *)vbl_sig, 0, sizeof(*vbl_sig));
+ 
+ 		vbl_sig->sequence = vblwait->request.sequence;
+ 		vbl_sig->info.si_signo = vblwait->request.signal;
+@@ -580,20 +327,17 @@ int drm_wait_vblank(struct drm_device *dev, void *data,
+ 
+ 		vblwait->reply.sequence = seq;
+ 	} else {
+-		unsigned long cur_vblank;
+-
+-		ret = drm_vblank_get(dev, crtc);
+-		if (ret)
+-			return ret;
+-		DRM_WAIT_ON(ret, dev->vbl_queue[crtc], 3 * DRM_HZ,
+-			    (((cur_vblank = drm_vblank_count(dev, crtc))
+-			      - vblwait->request.sequence) <= (1 << 23)));
+-		drm_vblank_put(dev, crtc);
+-		do_gettimeofday(&now);
++		if (flags & _DRM_VBLANK_SECONDARY) {
++			if (dev->driver->vblank_wait2)
++				ret = dev->driver->vblank_wait2(dev, &vblwait->request.sequence);
++		} else if (dev->driver->vblank_wait)
++			ret =
++			    dev->driver->vblank_wait(dev,
++						     &vblwait->request.sequence);
+ 
++		do_gettimeofday(&now);
+ 		vblwait->reply.tval_sec = now.tv_sec;
+ 		vblwait->reply.tval_usec = now.tv_usec;
+-		vblwait->reply.sequence = cur_vblank;
+ 	}
+ 
+       done:
+@@ -604,57 +348,44 @@ int drm_wait_vblank(struct drm_device *dev, void *data,
+  * Send the VBLANK signals.
+  *
+  * \param dev DRM device.
+- * \param crtc CRTC where the vblank event occurred
+  *
+  * Sends a signal for each task in drm_device::vbl_sigs and empties the list.
+  *
+  * If a signal is not requested, then calls vblank_wait().
+  */
+-static void drm_vbl_send_signals(struct drm_device * dev, int crtc)
++void drm_vbl_send_signals(struct drm_device * dev)
+ {
+-	struct drm_vbl_sig *vbl_sig, *tmp;
+-	struct list_head *vbl_sigs;
+-	unsigned int vbl_seq;
+ 	unsigned long flags;
++	int i;
+ 
+ 	spin_lock_irqsave(&dev->vbl_lock, flags);
+ 
+-	vbl_sigs = &dev->vbl_sigs[crtc];
+-	vbl_seq = drm_vblank_count(dev, crtc);
++	for (i = 0; i < 2; i++) {
++		struct drm_vbl_sig *vbl_sig, *tmp;
++		struct list_head *vbl_sigs = i ? &dev->vbl_sigs2 : &dev->vbl_sigs;
++		unsigned int vbl_seq = atomic_read(i ? &dev->vbl_received2 :
++						   &dev->vbl_received);
+ 
+-	list_for_each_entry_safe(vbl_sig, tmp, vbl_sigs, head) {
+-	    if ((vbl_seq - vbl_sig->sequence) <= (1 << 23)) {
+-		vbl_sig->info.si_code = vbl_seq;
+-		send_sig_info(vbl_sig->info.si_signo,
+-			      &vbl_sig->info, vbl_sig->task);
++		list_for_each_entry_safe(vbl_sig, tmp, vbl_sigs, head) {
++			if ((vbl_seq - vbl_sig->sequence) <= (1 << 23)) {
++				vbl_sig->info.si_code = vbl_seq;
++				send_sig_info(vbl_sig->info.si_signo,
++					      &vbl_sig->info, vbl_sig->task);
+ 
+-		list_del(&vbl_sig->head);
++				list_del(&vbl_sig->head);
+ 
+-		drm_free(vbl_sig, sizeof(*vbl_sig),
+-			 DRM_MEM_DRIVER);
+-		atomic_dec(&dev->vbl_signal_pending);
+-		drm_vblank_put(dev, crtc);
+-	    }
++				drm_free(vbl_sig, sizeof(*vbl_sig),
++					 DRM_MEM_DRIVER);
++
++				dev->vbl_pending--;
++			}
++		}
+ 	}
+ 
+ 	spin_unlock_irqrestore(&dev->vbl_lock, flags);
+ }
+ 
+-/**
+- * drm_handle_vblank - handle a vblank event
+- * @dev: DRM device
+- * @crtc: where this event occurred
+- *
+- * Drivers should call this routine in their vblank interrupt handlers to
+- * update the vblank counter and send any signals that may be pending.
+- */
+-void drm_handle_vblank(struct drm_device *dev, int crtc)
+-{
+-	drm_update_vblank_count(dev, crtc);
+-	DRM_WAKEUP(&dev->vbl_queue[crtc]);
+-	drm_vbl_send_signals(dev, crtc);
+-}
+-EXPORT_SYMBOL(drm_handle_vblank);
++EXPORT_SYMBOL(drm_vbl_send_signals);
+ 
+ /**
+  * Tasklet wrapper function.
+diff --git a/drivers/char/drm/drm_lock.c b/drivers/char/drm/drm_lock.c
+index 12dcdd1..0998723 100644
+--- a/drivers/char/drm/drm_lock.c
++++ b/drivers/char/drm/drm_lock.c
+@@ -53,7 +53,6 @@ int drm_lock(struct drm_device *dev, void *data, struct drm_file *file_priv)
+ 	DECLARE_WAITQUEUE(entry, current);
+ 	struct drm_lock *lock = data;
+ 	int ret = 0;
+-	unsigned long irqflags;
+ 
+ 	++file_priv->lock_count;
+ 
+@@ -72,9 +71,9 @@ int drm_lock(struct drm_device *dev, void *data, struct drm_file *file_priv)
+ 			return -EINVAL;
+ 
+ 	add_wait_queue(&dev->lock.lock_queue, &entry);
+-	spin_lock_irqsave(&dev->lock.spinlock, irqflags);
++	spin_lock_bh(&dev->lock.spinlock);
+ 	dev->lock.user_waiters++;
+-	spin_unlock_irqrestore(&dev->lock.spinlock, irqflags);
++	spin_unlock_bh(&dev->lock.spinlock);
+ 	for (;;) {
+ 		__set_current_state(TASK_INTERRUPTIBLE);
+ 		if (!dev->lock.hw_lock) {
+@@ -96,9 +95,9 @@ int drm_lock(struct drm_device *dev, void *data, struct drm_file *file_priv)
+ 			break;
+ 		}
+ 	}
+-	spin_lock_irqsave(&dev->lock.spinlock, irqflags);
++	spin_lock_bh(&dev->lock.spinlock);
+ 	dev->lock.user_waiters--;
+-	spin_unlock_irqrestore(&dev->lock.spinlock, irqflags);
++	spin_unlock_bh(&dev->lock.spinlock);
+ 	__set_current_state(TASK_RUNNING);
+ 	remove_wait_queue(&dev->lock.lock_queue, &entry);
+ 
+@@ -199,9 +198,8 @@ int drm_lock_take(struct drm_lock_data *lock_data,
+ {
+ 	unsigned int old, new, prev;
+ 	volatile unsigned int *lock = &lock_data->hw_lock->lock;
+-	unsigned long irqflags;
+ 
+-	spin_lock_irqsave(&lock_data->spinlock, irqflags);
++	spin_lock_bh(&lock_data->spinlock);
+ 	do {
+ 		old = *lock;
+ 		if (old & _DRM_LOCK_HELD)
+@@ -213,7 +211,7 @@ int drm_lock_take(struct drm_lock_data *lock_data,
+ 		}
+ 		prev = cmpxchg(lock, old, new);
+ 	} while (prev != old);
+-	spin_unlock_irqrestore(&lock_data->spinlock, irqflags);
++	spin_unlock_bh(&lock_data->spinlock);
+ 
+ 	if (_DRM_LOCKING_CONTEXT(old) == context) {
+ 		if (old & _DRM_LOCK_HELD) {
+@@ -274,16 +272,15 @@ int drm_lock_free(struct drm_lock_data *lock_data, unsigned int context)
+ {
+ 	unsigned int old, new, prev;
+ 	volatile unsigned int *lock = &lock_data->hw_lock->lock;
+-	unsigned long irqflags;
+ 
+-	spin_lock_irqsave(&lock_data->spinlock, irqflags);
++	spin_lock_bh(&lock_data->spinlock);
+ 	if (lock_data->kernel_waiters != 0) {
+ 		drm_lock_transfer(lock_data, 0);
+ 		lock_data->idle_has_lock = 1;
+-		spin_unlock_irqrestore(&lock_data->spinlock, irqflags);
++		spin_unlock_bh(&lock_data->spinlock);
+ 		return 1;
+ 	}
+-	spin_unlock_irqrestore(&lock_data->spinlock, irqflags);
++	spin_unlock_bh(&lock_data->spinlock);
+ 
+ 	do {
+ 		old = *lock;
+@@ -347,20 +344,19 @@ static int drm_notifier(void *priv)
+ void drm_idlelock_take(struct drm_lock_data *lock_data)
+ {
+ 	int ret = 0;
+-	unsigned long irqflags;
+ 
+-	spin_lock_irqsave(&lock_data->spinlock, irqflags);
++	spin_lock_bh(&lock_data->spinlock);
+ 	lock_data->kernel_waiters++;
+ 	if (!lock_data->idle_has_lock) {
+ 
+-		spin_unlock_irqrestore(&lock_data->spinlock, irqflags);
++		spin_unlock_bh(&lock_data->spinlock);
+ 		ret = drm_lock_take(lock_data, DRM_KERNEL_CONTEXT);
+-		spin_lock_irqsave(&lock_data->spinlock, irqflags);
++		spin_lock_bh(&lock_data->spinlock);
+ 
+ 		if (ret == 1)
+ 			lock_data->idle_has_lock = 1;
+ 	}
+-	spin_unlock_irqrestore(&lock_data->spinlock, irqflags);
++	spin_unlock_bh(&lock_data->spinlock);
+ }
+ EXPORT_SYMBOL(drm_idlelock_take);
+ 
+@@ -368,9 +364,8 @@ void drm_idlelock_release(struct drm_lock_data *lock_data)
+ {
+ 	unsigned int old, prev;
+ 	volatile unsigned int *lock = &lock_data->hw_lock->lock;
+-	unsigned long irqflags;
+ 
+-	spin_lock_irqsave(&lock_data->spinlock, irqflags);
++	spin_lock_bh(&lock_data->spinlock);
+ 	if (--lock_data->kernel_waiters == 0) {
+ 		if (lock_data->idle_has_lock) {
+ 			do {
+@@ -381,7 +376,7 @@ void drm_idlelock_release(struct drm_lock_data *lock_data)
+ 			lock_data->idle_has_lock = 0;
+ 		}
+ 	}
+-	spin_unlock_irqrestore(&lock_data->spinlock, irqflags);
++	spin_unlock_bh(&lock_data->spinlock);
+ }
+ EXPORT_SYMBOL(drm_idlelock_release);
+ 
+diff --git a/drivers/char/drm/i915_dma.c b/drivers/char/drm/i915_dma.c
+index f47e46e..8897434 100644
+--- a/drivers/char/drm/i915_dma.c
++++ b/drivers/char/drm/i915_dma.c
+@@ -415,13 +415,10 @@ static void i915_emit_breadcrumb(struct drm_device *dev)
+ 	drm_i915_private_t *dev_priv = dev->dev_private;
+ 	RING_LOCALS;
+ 
+-	if (++dev_priv->counter > BREADCRUMB_MASK) {
+-		 dev_priv->counter = 1;
+-		 DRM_DEBUG("Breadcrumb counter wrapped around\n");
+-	}
++	dev_priv->sarea_priv->last_enqueue = ++dev_priv->counter;
+ 
+-	if (dev_priv->sarea_priv)
+-		dev_priv->sarea_priv->last_enqueue = dev_priv->counter;
++	if (dev_priv->counter > 0x7FFFFFFFUL)
++		dev_priv->sarea_priv->last_enqueue = dev_priv->counter = 1;
+ 
+ 	BEGIN_LP_RING(4);
+ 	OUT_RING(CMD_STORE_DWORD_IDX);
+@@ -431,26 +428,6 @@ static void i915_emit_breadcrumb(struct drm_device *dev)
+ 	ADVANCE_LP_RING();
+ }
+ 
+-int i915_emit_mi_flush(struct drm_device *dev, uint32_t flush)
+-{
+-	drm_i915_private_t *dev_priv = dev->dev_private;
+-	uint32_t flush_cmd = CMD_MI_FLUSH;
+-	RING_LOCALS;
+-
+-	flush_cmd |= flush;
+-
+-	i915_kernel_lost_context(dev);
+-
+-	BEGIN_LP_RING(4);
+-	OUT_RING(flush_cmd);
+-	OUT_RING(0);
+-	OUT_RING(0);
+-	OUT_RING(0);
+-	ADVANCE_LP_RING();
+-
+-	return 0;
+-}
+-
+ static int i915_dispatch_cmdbuffer(struct drm_device * dev,
+ 				   drm_i915_cmdbuffer_t * cmd)
+ {
+@@ -534,74 +511,52 @@ static int i915_dispatch_batchbuffer(struct drm_device * dev,
+ 	return 0;
+ }
+ 
+-static void i915_do_dispatch_flip(struct drm_device * dev, int plane, int sync)
++static int i915_dispatch_flip(struct drm_device * dev)
+ {
+ 	drm_i915_private_t *dev_priv = dev->dev_private;
+-	u32 num_pages, current_page, next_page, dspbase;
+-	int shift = 2 * plane, x, y;
+ 	RING_LOCALS;
+ 
+-	/* Calculate display base offset */
+-	num_pages = dev_priv->sarea_priv->third_handle ? 3 : 2;
+-	current_page = (dev_priv->sarea_priv->pf_current_page >> shift) & 0x3;
+-	next_page = (current_page + 1) % num_pages;
++	DRM_DEBUG("%s: page=%d pfCurrentPage=%d\n",
++		  __FUNCTION__,
++		  dev_priv->current_page,
++		  dev_priv->sarea_priv->pf_current_page);
+ 
+-	switch (next_page) {
+-	default:
+-	case 0:
+-		dspbase = dev_priv->sarea_priv->front_offset;
+-		break;
+-	case 1:
+-		dspbase = dev_priv->sarea_priv->back_offset;
+-		break;
+-	case 2:
+-		dspbase = dev_priv->sarea_priv->third_offset;
+-		break;
+-	}
++	i915_kernel_lost_context(dev);
++
++	BEGIN_LP_RING(2);
++	OUT_RING(INST_PARSER_CLIENT | INST_OP_FLUSH | INST_FLUSH_MAP_CACHE);
++	OUT_RING(0);
++	ADVANCE_LP_RING();
+ 
+-	if (plane == 0) {
+-		x = dev_priv->sarea_priv->planeA_x;
+-		y = dev_priv->sarea_priv->planeA_y;
++	BEGIN_LP_RING(6);
++	OUT_RING(CMD_OP_DISPLAYBUFFER_INFO | ASYNC_FLIP);
++	OUT_RING(0);
++	if (dev_priv->current_page == 0) {
++		OUT_RING(dev_priv->back_offset);
++		dev_priv->current_page = 1;
+ 	} else {
+-		x = dev_priv->sarea_priv->planeB_x;
+-		y = dev_priv->sarea_priv->planeB_y;
++		OUT_RING(dev_priv->front_offset);
++		dev_priv->current_page = 0;
+ 	}
++	OUT_RING(0);
++	ADVANCE_LP_RING();
+ 
+-	dspbase += (y * dev_priv->sarea_priv->pitch + x) * dev_priv->cpp;
++	BEGIN_LP_RING(2);
++	OUT_RING(MI_WAIT_FOR_EVENT | MI_WAIT_FOR_PLANE_A_FLIP);
++	OUT_RING(0);
++	ADVANCE_LP_RING();
+ 
+-	DRM_DEBUG("plane=%d current_page=%d dspbase=0x%x\n", plane, current_page,
+-		  dspbase);
++	dev_priv->sarea_priv->last_enqueue = dev_priv->counter++;
+ 
+ 	BEGIN_LP_RING(4);
+-	OUT_RING(sync ? 0 :
+-		 (MI_WAIT_FOR_EVENT | (plane ? MI_WAIT_FOR_PLANE_B_FLIP :
+-				       MI_WAIT_FOR_PLANE_A_FLIP)));
+-	OUT_RING(CMD_OP_DISPLAYBUFFER_INFO | (sync ? 0 : ASYNC_FLIP) |
+-		 (plane ? DISPLAY_PLANE_B : DISPLAY_PLANE_A));
+-	OUT_RING(dev_priv->sarea_priv->pitch * dev_priv->cpp);
+-	OUT_RING(dspbase);
++	OUT_RING(CMD_STORE_DWORD_IDX);
++	OUT_RING(20);
++	OUT_RING(dev_priv->counter);
++	OUT_RING(0);
+ 	ADVANCE_LP_RING();
+ 
+-	dev_priv->sarea_priv->pf_current_page &= ~(0x3 << shift);
+-	dev_priv->sarea_priv->pf_current_page |= next_page << shift;
+-}
+-
+-void i915_dispatch_flip(struct drm_device * dev, int planes, int sync)
+-{
+-	drm_i915_private_t *dev_priv = dev->dev_private;
+-	int i;
+-
+-	DRM_DEBUG("planes=0x%x pfCurrentPage=%d\n",
+-		  planes, dev_priv->sarea_priv->pf_current_page);
+-
+-	i915_emit_mi_flush(dev, MI_READ_FLUSH | MI_EXE_FLUSH);
+-
+-	for (i = 0; i < 2; i++)
+-		if (planes & (1 << i))
+-			i915_do_dispatch_flip(dev, i, sync);
+-
+-	i915_emit_breadcrumb(dev);
+-
++	dev_priv->sarea_priv->pf_current_page = dev_priv->current_page;
++	return 0;
+ }
+ 
+ static int i915_quiescent(struct drm_device * dev)
+@@ -624,6 +579,7 @@ static int i915_batchbuffer(struct drm_device *dev, void *data,
+ 			    struct drm_file *file_priv)
+ {
+ 	drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
++	u32 *hw_status = dev_priv->hw_status_page;
+ 	drm_i915_sarea_t *sarea_priv = (drm_i915_sarea_t *)
+ 	    dev_priv->sarea_priv;
+ 	drm_i915_batchbuffer_t *batch = data;
+@@ -646,7 +602,7 @@ static int i915_batchbuffer(struct drm_device *dev, void *data,
+ 
+ 	ret = i915_dispatch_batchbuffer(dev, batch);
+ 
+-	sarea_priv->last_dispatch = READ_BREADCRUMB(dev_priv);
++	sarea_priv->last_dispatch = (int)hw_status[5];
+ 	return ret;
+ }
+ 
+@@ -654,6 +610,7 @@ static int i915_cmdbuffer(struct drm_device *dev, void *data,
+ 			  struct drm_file *file_priv)
+ {
+ 	drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
++	u32 *hw_status = dev_priv->hw_status_page;
+ 	drm_i915_sarea_t *sarea_priv = (drm_i915_sarea_t *)
+ 	    dev_priv->sarea_priv;
+ 	drm_i915_cmdbuffer_t *cmdbuf = data;
+@@ -678,51 +635,18 @@ static int i915_cmdbuffer(struct drm_device *dev, void *data,
+ 		return ret;
+ 	}
+ 
+-	sarea_priv->last_dispatch = READ_BREADCRUMB(dev_priv);
+-	return 0;
+-}
+-
+-static int i915_do_cleanup_pageflip(struct drm_device * dev)
+-{
+-	drm_i915_private_t *dev_priv = dev->dev_private;
+-	int i, planes, num_pages = dev_priv->sarea_priv->third_handle ? 3 : 2;
+-
+-	DRM_DEBUG("\n");
+-
+-	for (i = 0, planes = 0; i < 2; i++)
+-		if (dev_priv->sarea_priv->pf_current_page & (0x3 << (2 * i))) {
+-			dev_priv->sarea_priv->pf_current_page =
+-				(dev_priv->sarea_priv->pf_current_page &
+-				 ~(0x3 << (2 * i))) | ((num_pages - 1) << (2 * i));
+-
+-			planes |= 1 << i;
+-		}
+-
+-	if (planes)
+-		i915_dispatch_flip(dev, planes, 0);
+-
++	sarea_priv->last_dispatch = (int)hw_status[5];
+ 	return 0;
+ }
+ 
+ static int i915_flip_bufs(struct drm_device *dev, void *data,
+ 			  struct drm_file *file_priv)
+ {
+-	drm_i915_flip_t *param = data;
+-
+-	DRM_DEBUG("\n");
++	DRM_DEBUG("%s\n", __FUNCTION__);
+ 
+ 	LOCK_TEST_WITH_RETURN(dev, file_priv);
+ 
+-	/* This is really planes */
+-	if (param->pipes & ~0x3) {
+-		DRM_ERROR("Invalid planes 0x%x, only <= 0x3 is valid\n",
+-			  param->pipes);
+-		return -EINVAL;
+-	}
+-
+-	i915_dispatch_flip(dev, param->pipes, 0);
+-
+-	return 0;
++	return i915_dispatch_flip(dev);
+ }
+ 
+ static int i915_getparam(struct drm_device *dev, void *data,
+@@ -883,8 +807,6 @@ void i915_driver_lastclose(struct drm_device * dev)
+ 	if (!dev_priv)
+ 		return;
+ 
+-	if (drm_getsarea(dev) && dev_priv->sarea_priv)
+-		i915_do_cleanup_pageflip(dev);
+ 	if (dev_priv->agp_heap)
+ 		i915_mem_takedown(&(dev_priv->agp_heap));
+ 
+diff --git a/drivers/char/drm/i915_drm.h b/drivers/char/drm/i915_drm.h
+index 0431c00..05c66cf 100644
+--- a/drivers/char/drm/i915_drm.h
++++ b/drivers/char/drm/i915_drm.h
+@@ -105,29 +105,14 @@ typedef struct _drm_i915_sarea {
+ 	unsigned int rotated_tiled;
+ 	unsigned int rotated2_tiled;
+ 
+-	int planeA_x;
+-	int planeA_y;
+-	int planeA_w;
+-	int planeA_h;
+-	int planeB_x;
+-	int planeB_y;
+-	int planeB_w;
+-	int planeB_h;
+-
+-	/* Triple buffering */
+-	drm_handle_t third_handle;
+-	int third_offset;
+-	int third_size;
+-	unsigned int third_tiled;
+-
+-	/* buffer object handles for the static buffers.  May change
+-	 * over the lifetime of the client, though it doesn't in our current
+-	 * implementation.
+-	 */
+-	unsigned int front_bo_handle;
+-	unsigned int back_bo_handle;
+-	unsigned int third_bo_handle;
+-	unsigned int depth_bo_handle;
++	int pipeA_x;
++	int pipeA_y;
++	int pipeA_w;
++	int pipeA_h;
++	int pipeB_x;
++	int pipeB_y;
++	int pipeB_w;
++	int pipeB_h;
+ } drm_i915_sarea_t;
+ 
+ /* Flags for perf_boxes
+@@ -161,7 +146,7 @@ typedef struct _drm_i915_sarea {
+ 
+ #define DRM_IOCTL_I915_INIT		DRM_IOW( DRM_COMMAND_BASE + DRM_I915_INIT, drm_i915_init_t)
+ #define DRM_IOCTL_I915_FLUSH		DRM_IO ( DRM_COMMAND_BASE + DRM_I915_FLUSH)
+-#define DRM_IOCTL_I915_FLIP		DRM_IOW( DRM_COMMAND_BASE + DRM_I915_FLIP, drm_i915_flip_t)
++#define DRM_IOCTL_I915_FLIP		DRM_IO ( DRM_COMMAND_BASE + DRM_I915_FLIP)
+ #define DRM_IOCTL_I915_BATCHBUFFER	DRM_IOW( DRM_COMMAND_BASE + DRM_I915_BATCHBUFFER, drm_i915_batchbuffer_t)
+ #define DRM_IOCTL_I915_IRQ_EMIT         DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_IRQ_EMIT, drm_i915_irq_emit_t)
+ #define DRM_IOCTL_I915_IRQ_WAIT         DRM_IOW( DRM_COMMAND_BASE + DRM_I915_IRQ_WAIT, drm_i915_irq_wait_t)
+@@ -176,18 +161,6 @@ typedef struct _drm_i915_sarea {
+ #define DRM_IOCTL_I915_GET_VBLANK_PIPE	DRM_IOR( DRM_COMMAND_BASE + DRM_I915_GET_VBLANK_PIPE, drm_i915_vblank_pipe_t)
+ #define DRM_IOCTL_I915_VBLANK_SWAP	DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_VBLANK_SWAP, drm_i915_vblank_swap_t)
+ 
+-/* Asynchronous page flipping:
+- */
+-typedef struct drm_i915_flip {
+-	/*
+-	 * This is really talking about planes, and we could rename it
+-	 * except for the fact that some of the duplicated i915_drm.h files
+-	 * out there check for HAVE_I915_FLIP and so might pick up this
+-	 * version.
+-	 */
+-	int pipes;
+-} drm_i915_flip_t;
+-
+ /* Allow drivers to submit batchbuffers directly to hardware, relying
+  * on the security mechanisms provided by hardware.
+  */
+diff --git a/drivers/char/drm/i915_drv.c b/drivers/char/drm/i915_drv.c
+index bb8f1b2..e8f3d68 100644
+--- a/drivers/char/drm/i915_drv.c
++++ b/drivers/char/drm/i915_drv.c
+@@ -147,7 +147,7 @@ static void i915_save_vga(struct drm_device *dev)
+ 	i915_write_indexed(cr_index, cr_data, 0x11,
+ 			   i915_read_indexed(cr_index, cr_data, 0x11) &
+ 			   (~0x80));
+-	for (i = 0; i < 0x24; i++)
++	for (i = 0; i <= 0x24; i++)
+ 		dev_priv->saveCR[i] =
+ 			i915_read_indexed(cr_index, cr_data, i);
+ 	/* Make sure we don't turn off CR group 0 writes */
+@@ -156,7 +156,7 @@ static void i915_save_vga(struct drm_device *dev)
+ 	/* Attribute controller registers */
+ 	inb(st01);
+ 	dev_priv->saveAR_INDEX = inb(VGA_AR_INDEX);
+-	for (i = 0; i < 20; i++)
++	for (i = 0; i <= 0x14; i++)
+ 		dev_priv->saveAR[i] = i915_read_ar(st01, i, 0);
+ 	inb(st01);
+ 	outb(dev_priv->saveAR_INDEX, VGA_AR_INDEX);
+@@ -206,7 +206,7 @@ static void i915_restore_vga(struct drm_device *dev)
+ 	/* CRT controller regs */
+ 	/* Enable CR group 0 writes */
+ 	i915_write_indexed(cr_index, cr_data, 0x11, dev_priv->saveCR[0x11]);
+-	for (i = 0; i < 0x24; i++)
++	for (i = 0; i <= 0x24; i++)
+ 		i915_write_indexed(cr_index, cr_data, i, dev_priv->saveCR[i]);
+ 
+ 	/* Graphics controller regs */
+@@ -223,7 +223,7 @@ static void i915_restore_vga(struct drm_device *dev)
+ 
+ 	/* Attribute controller registers */
+ 	inb(st01);
+-	for (i = 0; i < 20; i++)
++	for (i = 0; i <= 0x14; i++)
+ 		i915_write_ar(st01, i, dev_priv->saveAR[i], 0);
+ 	inb(st01); /* switch back to index mode */
+ 	outb(dev_priv->saveAR_INDEX | 0x20, VGA_AR_INDEX);
+@@ -256,6 +256,9 @@ static int i915_suspend(struct drm_device *dev, pm_message_t state)
+ 	pci_save_state(dev->pdev);
+ 	pci_read_config_byte(dev->pdev, LBB, &dev_priv->saveLBB);
+ 
++	/* Display arbitration control */
++	dev_priv->saveDSPARB = I915_READ(DSPARB);
++
+ 	/* Pipe & plane A info */
+ 	dev_priv->savePIPEACONF = I915_READ(PIPEACONF);
+ 	dev_priv->savePIPEASRC = I915_READ(PIPEASRC);
+@@ -349,6 +352,7 @@ static int i915_suspend(struct drm_device *dev, pm_message_t state)
+ 	dev_priv->saveVGACNTRL = I915_READ(VGACNTRL);
+ 
+ 	/* Clock gating state */
++	dev_priv->saveD_STATE = I915_READ(D_STATE);
+ 	dev_priv->saveDSPCLK_GATE_D = I915_READ(DSPCLK_GATE_D);
+ 
+ 	/* Cache mode state */
+@@ -388,6 +392,8 @@ static int i915_resume(struct drm_device *dev)
+ 
+ 	pci_write_config_byte(dev->pdev, LBB, dev_priv->saveLBB);
+ 
++	I915_WRITE(DSPARB, dev_priv->saveDSPARB);
++
+ 	/* Pipe & plane A info */
+ 	/* Prime the clock */
+ 	if (dev_priv->saveDPLL_A & DPLL_VCO_ENABLE) {
+@@ -507,6 +513,7 @@ static int i915_resume(struct drm_device *dev)
+ 	udelay(150);
+ 
+ 	/* Clock gating state */
++	I915_WRITE (D_STATE, dev_priv->saveD_STATE);
+ 	I915_WRITE (DSPCLK_GATE_D, dev_priv->saveDSPCLK_GATE_D);
+ 
+ 	/* Cache mode state */
+@@ -533,7 +540,8 @@ static struct drm_driver driver = {
+ 	 */
+ 	.driver_features =
+ 	    DRIVER_USE_AGP | DRIVER_REQUIRE_AGP | /* DRIVER_USE_MTRR |*/
+-	    DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED,
++	    DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED | DRIVER_IRQ_VBL |
++	    DRIVER_IRQ_VBL2,
+ 	.load = i915_driver_load,
+ 	.unload = i915_driver_unload,
+ 	.lastclose = i915_driver_lastclose,
+@@ -541,9 +549,8 @@ static struct drm_driver driver = {
+ 	.suspend = i915_suspend,
+ 	.resume = i915_resume,
+ 	.device_is_agp = i915_driver_device_is_agp,
+-	.get_vblank_counter = i915_get_vblank_counter,
+-	.enable_vblank = i915_enable_vblank,
+-	.disable_vblank = i915_disable_vblank,
++	.vblank_wait = i915_driver_vblank_wait,
++	.vblank_wait2 = i915_driver_vblank_wait2,
+ 	.irq_preinstall = i915_driver_irq_preinstall,
+ 	.irq_postinstall = i915_driver_irq_postinstall,
+ 	.irq_uninstall = i915_driver_irq_uninstall,
+diff --git a/drivers/char/drm/i915_drv.h b/drivers/char/drm/i915_drv.h
+index db7001f..1b20f7c 100644
+--- a/drivers/char/drm/i915_drv.h
++++ b/drivers/char/drm/i915_drv.h
+@@ -76,9 +76,8 @@ struct mem_block {
+ typedef struct _drm_i915_vbl_swap {
+ 	struct list_head head;
+ 	drm_drawable_t drw_id;
+-	unsigned int plane;
++	unsigned int pipe;
+ 	unsigned int sequence;
+-	int flip;
+ } drm_i915_vbl_swap_t;
+ 
+ typedef struct drm_i915_private {
+@@ -91,7 +90,7 @@ typedef struct drm_i915_private {
+ 	drm_dma_handle_t *status_page_dmah;
+ 	void *hw_status_page;
+ 	dma_addr_t dma_status_page;
+-	uint32_t counter;
++	unsigned long counter;
+ 	unsigned int status_gfx_addr;
+ 	drm_local_map_t hws_map;
+ 
+@@ -104,18 +103,13 @@ typedef struct drm_i915_private {
+ 
+ 	wait_queue_head_t irq_queue;
+ 	atomic_t irq_received;
+-	atomic_t irq_emited;
++	atomic_t irq_emitted;
+ 
+ 	int tex_lru_log_granularity;
+ 	int allow_batchbuffer;
+ 	struct mem_block *agp_heap;
+ 	unsigned int sr01, adpa, ppcr, dvob, dvoc, lvds;
+ 	int vblank_pipe;
+-	spinlock_t user_irq_lock;
+-	int user_irq_refcount;
+-	int fence_irq_on;
+-	uint32_t irq_enable_reg;
+-	int irq_enabled;
+ 
+ 	spinlock_t swaps_lock;
+ 	drm_i915_vbl_swap_t vbl_swaps;
+@@ -125,6 +119,7 @@ typedef struct drm_i915_private {
+ 	u8 saveLBB;
+ 	u32 saveDSPACNTR;
+ 	u32 saveDSPBCNTR;
++	u32 saveDSPARB;
+ 	u32 savePIPEACONF;
+ 	u32 savePIPEBCONF;
+ 	u32 savePIPEASRC;
+@@ -194,6 +189,7 @@ typedef struct drm_i915_private {
+ 	u32 saveIIR;
+ 	u32 saveIMR;
+ 	u32 saveCACHE_MODE_0;
++	u32 saveD_STATE;
+ 	u32 saveDSPCLK_GATE_D;
+ 	u32 saveMI_ARB_STATE;
+ 	u32 saveSWF0[16];
+@@ -203,10 +199,10 @@ typedef struct drm_i915_private {
+ 	u8 saveSR[8];
+ 	u8 saveGR[25];
+ 	u8 saveAR_INDEX;
+-	u8 saveAR[20];
++	u8 saveAR[21];
+ 	u8 saveDACMASK;
+ 	u8 saveDACDATA[256*3]; /* 256 3-byte colors */
+-	u8 saveCR[36];
++	u8 saveCR[37];
+ } drm_i915_private_t;
+ 
+ extern struct drm_ioctl_desc i915_ioctls[];
+@@ -222,7 +218,7 @@ extern void i915_driver_preclose(struct drm_device *dev,
+ extern int i915_driver_device_is_agp(struct drm_device * dev);
+ extern long i915_compat_ioctl(struct file *filp, unsigned int cmd,
+ 			      unsigned long arg);
+-extern void i915_dispatch_flip(struct drm_device * dev, int pipes, int sync);
++
+ /* i915_irq.c */
+ extern int i915_irq_emit(struct drm_device *dev, void *data,
+ 			 struct drm_file *file_priv);
+@@ -233,7 +229,7 @@ extern int i915_driver_vblank_wait(struct drm_device *dev, unsigned int *sequenc
+ extern int i915_driver_vblank_wait2(struct drm_device *dev, unsigned int *sequence);
+ extern irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS);
+ extern void i915_driver_irq_preinstall(struct drm_device * dev);
+-extern int i915_driver_irq_postinstall(struct drm_device * dev);
++extern void i915_driver_irq_postinstall(struct drm_device * dev);
+ extern void i915_driver_irq_uninstall(struct drm_device * dev);
+ extern int i915_vblank_pipe_set(struct drm_device *dev, void *data,
+ 				struct drm_file *file_priv);
+@@ -241,9 +237,6 @@ extern int i915_vblank_pipe_get(struct drm_device *dev, void *data,
+ 				struct drm_file *file_priv);
+ extern int i915_vblank_swap(struct drm_device *dev, void *data,
+ 			    struct drm_file *file_priv);
+-extern int i915_enable_vblank(struct drm_device *dev, int crtc);
+-extern void i915_disable_vblank(struct drm_device *dev, int crtc);
+-extern u32 i915_get_vblank_counter(struct drm_device *dev, int crtc);
+ 
+ /* i915_mem.c */
+ extern int i915_mem_alloc(struct drm_device *dev, void *data,
+@@ -388,91 +381,21 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);
+ 
+ /* Interrupt bits:
+  */
+-#define I915_PIPE_CONTROL_NOTIFY_INTERRUPT		(1<<18)
+-#define I915_DISPLAY_PORT_INTERRUPT			(1<<17)
+-#define I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT	(1<<15)
+-#define I915_GMCH_THERMAL_SENSOR_EVENT_INTERRUPT	(1<<14)
+-#define I915_HWB_OOM_INTERRUPT				(1<<13) /* binner out of memory */
+-#define I915_SYNC_STATUS_INTERRUPT			(1<<12)
+-#define I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT	(1<<11)
+-#define I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT	(1<<10)
+-#define I915_OVERLAY_PLANE_FLIP_PENDING_INTERRUPT	(1<<9)
+-#define I915_DISPLAY_PLANE_C_FLIP_PENDING_INTERRUPT	(1<<8)
+-#define I915_DISPLAY_PIPE_A_VBLANK_INTERRUPT		(1<<7)
+-#define I915_DISPLAY_PIPE_A_EVENT_INTERRUPT		(1<<6)
+-#define I915_DISPLAY_PIPE_B_VBLANK_INTERRUPT		(1<<5)
+-#define I915_DISPLAY_PIPE_B_EVENT_INTERRUPT		(1<<4)
+-#define I915_DEBUG_INTERRUPT				(1<<2)
+-#define I915_USER_INTERRUPT				(1<<1)
+-
++#define USER_INT_FLAG    (1<<1)
++#define VSYNC_PIPEB_FLAG (1<<5)
++#define VSYNC_PIPEA_FLAG (1<<7)
++#define HWB_OOM_FLAG     (1<<13) /* binner out of memory */
+ 
+ #define I915REG_HWSTAM		0x02098
+ #define I915REG_INT_IDENTITY_R	0x020a4
+ #define I915REG_INT_MASK_R	0x020a8
+ #define I915REG_INT_ENABLE_R	0x020a0
+-#define I915REG_INSTPM	        0x020c0
+-
+-#define PIPEADSL		0x70000
+-#define PIPEBDSL		0x71000
+ 
+ #define I915REG_PIPEASTAT	0x70024
+ #define I915REG_PIPEBSTAT	0x71024
+-/*
+- * The two pipe frame counter registers are not synchronized, so
+- * reading a stable value is somewhat tricky. The following code
+- * should work:
+- *
+- *  do {
+- *    high1 = ((INREG(PIPEAFRAMEHIGH) & PIPE_FRAME_HIGH_MASK) >>
+- *             PIPE_FRAME_HIGH_SHIFT;
+- *    low1 =  ((INREG(PIPEAFRAMEPIXEL) & PIPE_FRAME_LOW_MASK) >>
+- *             PIPE_FRAME_LOW_SHIFT);
+- *    high2 = ((INREG(PIPEAFRAMEHIGH) & PIPE_FRAME_HIGH_MASK) >>
+- *             PIPE_FRAME_HIGH_SHIFT);
+- *  } while (high1 != high2);
+- *  frame = (high1 << 8) | low1;
+- */
+-#define PIPEAFRAMEHIGH          0x70040
+-#define PIPEBFRAMEHIGH		0x71040
+-#define PIPE_FRAME_HIGH_MASK    0x0000ffff
+-#define PIPE_FRAME_HIGH_SHIFT   0
+-#define PIPEAFRAMEPIXEL         0x70044
+-#define PIPEBFRAMEPIXEL		0x71044
+ 
+-#define PIPE_FRAME_LOW_MASK     0xff000000
+-#define PIPE_FRAME_LOW_SHIFT    24
+-/*
+- * Pixel within the current frame is counted in the PIPEAFRAMEPIXEL register
+- * and is 24 bits wide.
+- */
+-#define PIPE_PIXEL_MASK         0x00ffffff
+-#define PIPE_PIXEL_SHIFT        0
+-
+-#define I915_FIFO_UNDERRUN_STATUS		(1UL<<31)
+-#define I915_CRC_ERROR_ENABLE			(1UL<<29)
+-#define I915_CRC_DONE_ENABLE			(1UL<<28)
+-#define I915_GMBUS_EVENT_ENABLE			(1UL<<27)
+-#define I915_VSYNC_INTERRUPT_ENABLE		(1UL<<25)
+-#define I915_DISPLAY_LINE_COMPARE_ENABLE	(1UL<<24)
+-#define I915_DPST_EVENT_ENABLE			(1UL<<23)
+-#define I915_LEGACY_BLC_EVENT_ENABLE		(1UL<<22)
+-#define I915_ODD_FIELD_INTERRUPT_ENABLE		(1UL<<21)
+-#define I915_EVEN_FIELD_INTERRUPT_ENABLE	(1UL<<20)
+-#define I915_START_VBLANK_INTERRUPT_ENABLE	(1UL<<18)	/* 965 or later */
+-#define I915_VBLANK_INTERRUPT_ENABLE		(1UL<<17)
+-#define I915_OVERLAY_UPDATED_ENABLE		(1UL<<16)
+-#define I915_CRC_ERROR_INTERRUPT_STATUS		(1UL<<13)
+-#define I915_CRC_DONE_INTERRUPT_STATUS		(1UL<<12)
+-#define I915_GMBUS_INTERRUPT_STATUS		(1UL<<11)
+-#define I915_VSYNC_INTERRUPT_STATUS		(1UL<<9)
+-#define I915_DISPLAY_LINE_COMPARE_STATUS	(1UL<<8)
+-#define I915_DPST_EVENT_STATUS			(1UL<<7)
+-#define I915_LEGACY_BLC_EVENT_STATUS		(1UL<<6)
+-#define I915_ODD_FIELD_INTERRUPT_STATUS		(1UL<<5)
+-#define I915_EVEN_FIELD_INTERRUPT_STATUS	(1UL<<4)
+-#define I915_START_VBLANK_INTERRUPT_STATUS	(1UL<<2)	/* 965 or later */
+-#define I915_VBLANK_INTERRUPT_STATUS		(1UL<<1)
+-#define I915_OVERLAY_UPDATED_STATUS		(1UL<<0)
++#define I915_VBLANK_INTERRUPT_ENABLE	(1UL<<17)
++#define I915_VBLANK_CLEAR		(1UL<<1)
+ 
+ #define SRX_INDEX		0x3c4
+ #define SRX_DATA		0x3c5
+@@ -749,6 +672,8 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);
+ /** P1 value is 2 greater than this field */
+ # define VGA0_PD_P1_MASK	(0x1f << 0)
+ 
++/* PCI D state control register */
++#define D_STATE		0x6104
+ #define DSPCLK_GATE_D	0x6200
+ 
+ /* I830 CRTC registers */
+@@ -1059,6 +984,12 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);
+ #define PIPECONF_INTERLACE_W_FIELD_INDICATION	(6 << 21)
+ #define PIPECONF_INTERLACE_FIELD_0_ONLY		(7 << 21)
+ 
++#define DSPARB	  0x70030
++#define DSPARB_CSTART_MASK	(0x7f << 7)
++#define DSPARB_CSTART_SHIFT	7
++#define DSPARB_BSTART_MASK	(0x7f)		 
++#define DSPARB_BSTART_SHIFT	0
++
+ #define PIPEBCONF 0x71008
+ #define PIPEBCONF_ENABLE	(1<<31)
+ #define PIPEBCONF_DISABLE	0
+diff --git a/drivers/char/drm/i915_irq.c b/drivers/char/drm/i915_irq.c
+index 023ce66..f7f16e7 100644
+--- a/drivers/char/drm/i915_irq.c
++++ b/drivers/char/drm/i915_irq.c
+@@ -38,109 +38,6 @@
+ #define MAX_NOPID ((u32)~0)
+ 
+ /**
+- * i915_get_pipe - return the the pipe associated with a given plane
+- * @dev: DRM device
+- * @plane: plane to look for
+- *
+- * The Intel Mesa & 2D drivers call the vblank routines with a plane number
+- * rather than a pipe number, since they may not always be equal.  This routine
+- * maps the given @plane back to a pipe number.
+- */
+-static int
+-i915_get_pipe(struct drm_device *dev, int plane)
+-{
+-	drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
+-	u32 dspcntr;
+-
+-	dspcntr = plane ? I915_READ(DSPBCNTR) : I915_READ(DSPACNTR);
+-
+-	return dspcntr & DISPPLANE_SEL_PIPE_MASK ? 1 : 0;
+-}
+-
+-/**
+- * i915_get_plane - return the the plane associated with a given pipe
+- * @dev: DRM device
+- * @pipe: pipe to look for
+- *
+- * The Intel Mesa & 2D drivers call the vblank routines with a plane number
+- * rather than a plane number, since they may not always be equal.  This routine
+- * maps the given @pipe back to a plane number.
+- */
+-static int
+-i915_get_plane(struct drm_device *dev, int pipe)
+-{
+-	if (i915_get_pipe(dev, 0) == pipe)
+-		return 0;
+-	return 1;
+-}
+-
+-/**
+- * i915_pipe_enabled - check if a pipe is enabled
+- * @dev: DRM device
+- * @pipe: pipe to check
+- *
+- * Reading certain registers when the pipe is disabled can hang the chip.
+- * Use this routine to make sure the PLL is running and the pipe is active
+- * before reading such registers if unsure.
+- */
+-static int
+-i915_pipe_enabled(struct drm_device *dev, int pipe)
+-{
+-	drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
+-	unsigned long pipeconf = pipe ? PIPEBCONF : PIPEACONF;
+-
+-	if (I915_READ(pipeconf) & PIPEACONF_ENABLE)
+-		return 1;
+-
+-	return 0;
+-}
+-
+-/**
+- * Emit a synchronous flip.
+- *
+- * This function must be called with the drawable spinlock held.
+- */
+-static void
+-i915_dispatch_vsync_flip(struct drm_device *dev, struct drm_drawable_info *drw,
+-			 int plane)
+-{
+-	drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
+-	drm_i915_sarea_t *sarea_priv = dev_priv->sarea_priv;
+-	u16 x1, y1, x2, y2;
+-	int pf_planes = 1 << plane;
+-
+-	/* If the window is visible on the other plane, we have to flip on that
+-	 * plane as well.
+-	 */
+-	if (plane == 1) {
+-		x1 = sarea_priv->planeA_x;
+-		y1 = sarea_priv->planeA_y;
+-		x2 = x1 + sarea_priv->planeA_w;
+-		y2 = y1 + sarea_priv->planeA_h;
+-	} else {
+-		x1 = sarea_priv->planeB_x;
+-		y1 = sarea_priv->planeB_y;
+-		x2 = x1 + sarea_priv->planeB_w;
+-		y2 = y1 + sarea_priv->planeB_h;
+-	}
+-
+-	if (x2 > 0 && y2 > 0) {
+-		int i, num_rects = drw->num_rects;
+-		struct drm_clip_rect *rect = drw->rects;
+-
+-		for (i = 0; i < num_rects; i++)
+-			if (!(rect[i].x1 >= x2 || rect[i].y1 >= y2 ||
+-			      rect[i].x2 <= x1 || rect[i].y2 <= y1)) {
+-				pf_planes = 0x3;
+-
+-				break;
+-			}
+-	}
+-
+-	i915_dispatch_flip(dev, pf_planes, 1);
+-}
+-
+-/**
+  * Emit blits for scheduled buffer swaps.
+  *
+  * This function will be called with the HW lock held.
+@@ -148,19 +45,20 @@ i915_dispatch_vsync_flip(struct drm_device *dev, struct drm_drawable_info *drw,
+ static void i915_vblank_tasklet(struct drm_device *dev)
+ {
+ 	drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
++	unsigned long irqflags;
+ 	struct list_head *list, *tmp, hits, *hit;
+-	int nhits, nrects, slice[2], upper[2], lower[2], i, num_pages;
+-	unsigned counter[2];
++	int nhits, nrects, slice[2], upper[2], lower[2], i;
++	unsigned counter[2] = { atomic_read(&dev->vbl_received),
++				atomic_read(&dev->vbl_received2) };
+ 	struct drm_drawable_info *drw;
+ 	drm_i915_sarea_t *sarea_priv = dev_priv->sarea_priv;
+-	u32 cpp = dev_priv->cpp,  offsets[3];
++	u32 cpp = dev_priv->cpp;
+ 	u32 cmd = (cpp == 4) ? (XY_SRC_COPY_BLT_CMD |
+ 				XY_SRC_COPY_BLT_WRITE_ALPHA |
+ 				XY_SRC_COPY_BLT_WRITE_RGB)
+ 			     : XY_SRC_COPY_BLT_CMD;
+ 	u32 src_pitch = sarea_priv->pitch * cpp;
+ 	u32 dst_pitch = sarea_priv->pitch * cpp;
+-	/* COPY rop (0xcc), map cpp to magic color depth constants */
+ 	u32 ropcpp = (0xcc << 16) | ((cpp - 1) << 24);
+ 	RING_LOCALS;
+ 
+@@ -173,34 +71,24 @@ static void i915_vblank_tasklet(struct drm_device *dev)
+ 		src_pitch >>= 2;
+ 	}
+ 
+-	counter[0] = drm_vblank_count(dev, 0);
+-	counter[1] = drm_vblank_count(dev, 1);
+-
+ 	DRM_DEBUG("\n");
+ 
+ 	INIT_LIST_HEAD(&hits);
+ 
+ 	nhits = nrects = 0;
+ 
+-	/* No irqsave/restore necessary.  This tasklet may be run in an
+-	 * interrupt context or normal context, but we don't have to worry
+-	 * about getting interrupted by something acquiring the lock, because
+-	 * we are the interrupt context thing that acquires the lock.
+-	 */
+-	spin_lock(&dev_priv->swaps_lock);
++	spin_lock_irqsave(&dev_priv->swaps_lock, irqflags);
+ 
+ 	/* Find buffer swaps scheduled for this vertical blank */
+ 	list_for_each_safe(list, tmp, &dev_priv->vbl_swaps.head) {
+ 		drm_i915_vbl_swap_t *vbl_swap =
+ 			list_entry(list, drm_i915_vbl_swap_t, head);
+-		int pipe = i915_get_pipe(dev, vbl_swap->plane);
+ 
+-		if ((counter[pipe] - vbl_swap->sequence) > (1<<23))
++		if ((counter[vbl_swap->pipe] - vbl_swap->sequence) > (1<<23))
+ 			continue;
+ 
+ 		list_del(list);
+ 		dev_priv->swaps_pending--;
+-		drm_vblank_put(dev, pipe);
+ 
+ 		spin_unlock(&dev_priv->swaps_lock);
+ 		spin_lock(&dev->drw_lock);
+@@ -238,23 +126,43 @@ static void i915_vblank_tasklet(struct drm_device *dev)
+ 		spin_lock(&dev_priv->swaps_lock);
+ 	}
+ 
+-	spin_unlock(&dev_priv->swaps_lock);
+-
+-	if (nhits == 0)
++	if (nhits == 0) {
++		spin_unlock_irqrestore(&dev_priv->swaps_lock, irqflags);
+ 		return;
++	}
++
++	spin_unlock(&dev_priv->swaps_lock);
+ 
+ 	i915_kernel_lost_context(dev);
+ 
+-	upper[0] = upper[1] = 0;
+-	slice[0] = max(sarea_priv->planeA_h / nhits, 1);
+-	slice[1] = max(sarea_priv->planeB_h / nhits, 1);
+-	lower[0] = sarea_priv->planeA_y + slice[0];
+-	lower[1] = sarea_priv->planeB_y + slice[0];
++	if (IS_I965G(dev)) {
++		BEGIN_LP_RING(4);
++
++		OUT_RING(GFX_OP_DRAWRECT_INFO_I965);
++		OUT_RING(0);
++		OUT_RING(((sarea_priv->width - 1) & 0xffff) | ((sarea_priv->height - 1) << 16));
++		OUT_RING(0);
++		ADVANCE_LP_RING();
++	} else {
++		BEGIN_LP_RING(6);
+ 
+-	offsets[0] = sarea_priv->front_offset;
+-	offsets[1] = sarea_priv->back_offset;
+-	offsets[2] = sarea_priv->third_offset;
+-	num_pages = sarea_priv->third_handle ? 3 : 2;
++		OUT_RING(GFX_OP_DRAWRECT_INFO);
++		OUT_RING(0);
++		OUT_RING(0);
++		OUT_RING(sarea_priv->width | sarea_priv->height << 16);
++		OUT_RING(sarea_priv->width | sarea_priv->height << 16);
++		OUT_RING(0);
++
++		ADVANCE_LP_RING();
++	}
++
++	sarea_priv->ctxOwner = DRM_KERNEL_CONTEXT;
++
++	upper[0] = upper[1] = 0;
++	slice[0] = max(sarea_priv->pipeA_h / nhits, 1);
++	slice[1] = max(sarea_priv->pipeB_h / nhits, 1);
++	lower[0] = sarea_priv->pipeA_y + slice[0];
++	lower[1] = sarea_priv->pipeB_y + slice[0];
+ 
+ 	spin_lock(&dev->drw_lock);
+ 
+@@ -266,8 +174,6 @@ static void i915_vblank_tasklet(struct drm_device *dev)
+ 	for (i = 0; i++ < nhits;
+ 	     upper[0] = lower[0], lower[0] += slice[0],
+ 	     upper[1] = lower[1], lower[1] += slice[1]) {
+-		int init_drawrect = 1;
+-
+ 		if (i == nhits)
+ 			lower[0] = lower[1] = sarea_priv->height;
+ 
+@@ -275,7 +181,7 @@ static void i915_vblank_tasklet(struct drm_device *dev)
+ 			drm_i915_vbl_swap_t *swap_hit =
+ 				list_entry(hit, drm_i915_vbl_swap_t, head);
+ 			struct drm_clip_rect *rect;
+-			int num_rects, plane, front, back;
++			int num_rects, pipe;
+ 			unsigned short top, bottom;
+ 
+ 			drw = drm_get_drawable_info(dev, swap_hit->drw_id);
+@@ -283,50 +189,10 @@ static void i915_vblank_tasklet(struct drm_device *dev)
+ 			if (!drw)
+ 				continue;
+ 
+-			plane = swap_hit->plane;
+-
+-			if (swap_hit->flip) {
+-				i915_dispatch_vsync_flip(dev, drw, plane);
+-				continue;
+-			}
+-
+-			if (init_drawrect) {
+-				int width  = sarea_priv->width;
+-				int height = sarea_priv->height;
+-				if (IS_I965G(dev)) {
+-					BEGIN_LP_RING(4);
+-
+-					OUT_RING(GFX_OP_DRAWRECT_INFO_I965);
+-					OUT_RING(0);
+-					OUT_RING(((width - 1) & 0xffff) | ((height - 1) << 16));
+-					OUT_RING(0);
+-
+-					ADVANCE_LP_RING();
+-				} else {
+-					BEGIN_LP_RING(6);
+-
+-					OUT_RING(GFX_OP_DRAWRECT_INFO);
+-					OUT_RING(0);
+-					OUT_RING(0);
+-					OUT_RING(((width - 1) & 0xffff) | ((height - 1) << 16));
+-					OUT_RING(0);
+-					OUT_RING(0);
+-
+-					ADVANCE_LP_RING();
+-				}
+-
+-				sarea_priv->ctxOwner = DRM_KERNEL_CONTEXT;
+-
+-				init_drawrect = 0;
+-			}
+-
+ 			rect = drw->rects;
+-			top = upper[plane];
+-			bottom = lower[plane];
+-
+-			front = (dev_priv->sarea_priv->pf_current_page >>
+-				 (2 * plane)) & 0x3;
+-			back = (front + 1) % num_pages;
++			pipe = swap_hit->pipe;
++			top = upper[pipe];
++			bottom = lower[pipe];
+ 
+ 			for (num_rects = drw->num_rects; num_rects--; rect++) {
+ 				int y1 = max(rect->y1, top);
+@@ -341,17 +207,17 @@ static void i915_vblank_tasklet(struct drm_device *dev)
+ 				OUT_RING(ropcpp | dst_pitch);
+ 				OUT_RING((y1 << 16) | rect->x1);
+ 				OUT_RING((y2 << 16) | rect->x2);
+-				OUT_RING(offsets[front]);
++				OUT_RING(sarea_priv->front_offset);
+ 				OUT_RING((y1 << 16) | rect->x1);
+ 				OUT_RING(src_pitch);
+-				OUT_RING(offsets[back]);
++				OUT_RING(sarea_priv->back_offset);
+ 
+ 				ADVANCE_LP_RING();
+ 			}
+ 		}
+ 	}
+ 
+-	spin_unlock(&dev->drw_lock);
++	spin_unlock_irqrestore(&dev->drw_lock, irqflags);
+ 
+ 	list_for_each_safe(hit, tmp, &hits) {
+ 		drm_i915_vbl_swap_t *swap_hit =
+@@ -363,112 +229,67 @@ static void i915_vblank_tasklet(struct drm_device *dev)
+ 	}
+ }
+ 
+-u32 i915_get_vblank_counter(struct drm_device *dev, int plane)
+-{
+-	drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
+-	unsigned long high_frame;
+-	unsigned long low_frame;
+-	u32 high1, high2, low, count;
+-	int pipe;
+-
+-	pipe = i915_get_pipe(dev, plane);
+-	high_frame = pipe ? PIPEBFRAMEHIGH : PIPEAFRAMEHIGH;
+-	low_frame = pipe ? PIPEBFRAMEPIXEL : PIPEAFRAMEPIXEL;
+-
+-	if (!i915_pipe_enabled(dev, pipe)) {
+-	    printk(KERN_ERR "trying to get vblank count for disabled "
+-		   "pipe %d\n", pipe);
+-	    return 0;
+-	}
+-
+-	/*
+-	 * High & low register fields aren't synchronized, so make sure
+-	 * we get a low value that's stable across two reads of the high
+-	 * register.
+-	 */
+-	do {
+-		high1 = ((I915_READ(high_frame) & PIPE_FRAME_HIGH_MASK) >>
+-			 PIPE_FRAME_HIGH_SHIFT);
+-		low =  ((I915_READ(low_frame) & PIPE_FRAME_LOW_MASK) >>
+-			PIPE_FRAME_LOW_SHIFT);
+-		high2 = ((I915_READ(high_frame) & PIPE_FRAME_HIGH_MASK) >>
+-			 PIPE_FRAME_HIGH_SHIFT);
+-	} while (high1 != high2);
+-
+-	count = (high1 << 8) | low;
+-
+-	/* count may be reset by other driver(e.g. 2D driver),
+-	   we have no way to know if it is wrapped or resetted
+-	   when count is zero. do a rough guess.
+-	*/
+-	if (count == 0 && dev->last_vblank[pipe] < dev->max_vblank_count/2)
+-		dev->last_vblank[pipe] = 0;
+-
+-	return count;
+-}
+-
+ irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS)
+ {
+ 	struct drm_device *dev = (struct drm_device *) arg;
+ 	drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
+-	u32 iir;
++	u16 temp;
+ 	u32 pipea_stats, pipeb_stats;
+-	int vblank = 0;
+-
+-	iir = I915_READ(I915REG_INT_IDENTITY_R);
+-	if (iir == 0) {
+-		DRM_DEBUG ("iir 0x%08x im 0x%08x ie 0x%08x pipea 0x%08x pipeb 0x%08x\n",
+-			   iir,
+-			   I915_READ(I915REG_INT_MASK_R),
+-			   I915_READ(I915REG_INT_ENABLE_R),
+-			   I915_READ(I915REG_PIPEASTAT),
+-			   I915_READ(I915REG_PIPEBSTAT));
+-		return IRQ_NONE;
+-	}
+ 
+-	/*
+-	 * Clear the PIPE(A|B)STAT regs before the IIR otherwise
+-	 * we may get extra interrupts.
+-	 */
+-	if (iir & I915_DISPLAY_PIPE_A_EVENT_INTERRUPT) {
+-		pipea_stats = I915_READ(I915REG_PIPEASTAT);
+-		if (pipea_stats & (I915_START_VBLANK_INTERRUPT_STATUS|
+-				   I915_VBLANK_INTERRUPT_STATUS))
+-		{
+-			vblank++;
+-			drm_handle_vblank(dev, i915_get_plane(dev, 0));
+-		}
+-		I915_WRITE(I915REG_PIPEASTAT, pipea_stats);
+-	}
+-	if (iir & I915_DISPLAY_PIPE_B_EVENT_INTERRUPT) {
+-		pipeb_stats = I915_READ(I915REG_PIPEBSTAT);
+-		if (pipeb_stats & (I915_START_VBLANK_INTERRUPT_STATUS|
+-				   I915_VBLANK_INTERRUPT_STATUS))
+-		{
+-			vblank++;
+-			drm_handle_vblank(dev, i915_get_plane(dev, 1));
+-		}
+-		I915_WRITE(I915REG_PIPEBSTAT, pipeb_stats);
+-	}
++	pipea_stats = I915_READ(I915REG_PIPEASTAT);
++	pipeb_stats = I915_READ(I915REG_PIPEBSTAT);
+ 
+-	if (dev_priv->sarea_priv)
+-	    dev_priv->sarea_priv->last_dispatch = READ_BREADCRUMB(dev_priv);
++	temp = I915_READ16(I915REG_INT_IDENTITY_R);
+ 
+-	I915_WRITE(I915REG_INT_IDENTITY_R, iir);
+-	(void) I915_READ(I915REG_INT_IDENTITY_R); /* Flush posted write */
++	temp &= (USER_INT_FLAG | VSYNC_PIPEA_FLAG | VSYNC_PIPEB_FLAG);
+ 
+-	if (iir & I915_USER_INTERRUPT) {
++	DRM_DEBUG("%s flag=%08x\n", __FUNCTION__, temp);
++
++	if (temp == 0)
++		return IRQ_NONE;
++
++	I915_WRITE16(I915REG_INT_IDENTITY_R, temp);
++	(void) I915_READ16(I915REG_INT_IDENTITY_R);
++	DRM_READMEMORYBARRIER();
++
++	dev_priv->sarea_priv->last_dispatch = READ_BREADCRUMB(dev_priv);
++
++	if (temp & USER_INT_FLAG)
+ 		DRM_WAKEUP(&dev_priv->irq_queue);
+-	}
+-	if (vblank) {
++
++	if (temp & (VSYNC_PIPEA_FLAG | VSYNC_PIPEB_FLAG)) {
++		int vblank_pipe = dev_priv->vblank_pipe;
++
++		if ((vblank_pipe &
++		     (DRM_I915_VBLANK_PIPE_A | DRM_I915_VBLANK_PIPE_B))
++		    == (DRM_I915_VBLANK_PIPE_A | DRM_I915_VBLANK_PIPE_B)) {
++			if (temp & VSYNC_PIPEA_FLAG)
++				atomic_inc(&dev->vbl_received);
++			if (temp & VSYNC_PIPEB_FLAG)
++				atomic_inc(&dev->vbl_received2);
++		} else if (((temp & VSYNC_PIPEA_FLAG) &&
++			    (vblank_pipe & DRM_I915_VBLANK_PIPE_A)) ||
++			   ((temp & VSYNC_PIPEB_FLAG) &&
++			    (vblank_pipe & DRM_I915_VBLANK_PIPE_B)))
++			atomic_inc(&dev->vbl_received);
++
++		DRM_WAKEUP(&dev->vbl_queue);
++		drm_vbl_send_signals(dev);
++
+ 		if (dev_priv->swaps_pending > 0)
+ 			drm_locked_tasklet(dev, i915_vblank_tasklet);
++		I915_WRITE(I915REG_PIPEASTAT,
++			pipea_stats|I915_VBLANK_INTERRUPT_ENABLE|
++			I915_VBLANK_CLEAR);
++		I915_WRITE(I915REG_PIPEBSTAT,
++			pipeb_stats|I915_VBLANK_INTERRUPT_ENABLE|
++			I915_VBLANK_CLEAR);
+ 	}
+ 
+ 	return IRQ_HANDLED;
+ }
+ 
+-static int i915_emit_irq(struct drm_device *dev)
++static int i915_emit_irq(struct drm_device * dev)
+ {
+ 	drm_i915_private_t *dev_priv = dev->dev_private;
+ 	RING_LOCALS;
+@@ -515,12 +336,42 @@ static int i915_wait_irq(struct drm_device * dev, int irq_nr)
+ 			  READ_BREADCRUMB(dev_priv), (int)dev_priv->counter);
+ 	}
+ 
+-	if (dev_priv->sarea_priv)
+-		dev_priv->sarea_priv->last_dispatch =
+-			READ_BREADCRUMB(dev_priv);
++	dev_priv->sarea_priv->last_dispatch = READ_BREADCRUMB(dev_priv);
+ 	return ret;
+ }
+ 
++static int i915_driver_vblank_do_wait(struct drm_device *dev, unsigned int *sequence,
++				      atomic_t *counter)
++{
++	drm_i915_private_t *dev_priv = dev->dev_private;
++	unsigned int cur_vblank;
++	int ret = 0;
++
++	if (!dev_priv) {
++		DRM_ERROR("called with no initialization\n");
++		return -EINVAL;
++	}
++
++	DRM_WAIT_ON(ret, dev->vbl_queue, 3 * DRM_HZ,
++		    (((cur_vblank = atomic_read(counter))
++			- *sequence) <= (1<<23)));
++
++	*sequence = cur_vblank;
++
++	return ret;
++}
++
++
++int i915_driver_vblank_wait(struct drm_device *dev, unsigned int *sequence)
++{
++	return i915_driver_vblank_do_wait(dev, sequence, &dev->vbl_received);
++}
++
++int i915_driver_vblank_wait2(struct drm_device *dev, unsigned int *sequence)
++{
++	return i915_driver_vblank_do_wait(dev, sequence, &dev->vbl_received2);
++}
++
+ /* Needs the lock as it touches the ring.
+  */
+ int i915_irq_emit(struct drm_device *dev, void *data,
+@@ -563,96 +414,18 @@ int i915_irq_wait(struct drm_device *dev, void *data,
+ 	return i915_wait_irq(dev, irqwait->irq_seq);
+ }
+ 
+-int i915_enable_vblank(struct drm_device *dev, int plane)
+-{
+-	drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
+-	int pipe = i915_get_pipe(dev, plane);
+-	u32	pipestat_reg = 0;
+-	u32	pipestat;
+-
+-	switch (pipe) {
+-	case 0:
+-		pipestat_reg = I915REG_PIPEASTAT;
+-		dev_priv->irq_enable_reg |= I915_DISPLAY_PIPE_A_EVENT_INTERRUPT;
+-		break;
+-	case 1:
+-		pipestat_reg = I915REG_PIPEBSTAT;
+-		dev_priv->irq_enable_reg |= I915_DISPLAY_PIPE_B_EVENT_INTERRUPT;
+-		break;
+-	default:
+-		DRM_ERROR("tried to enable vblank on non-existent pipe %d\n",
+-			  pipe);
+-		break;
+-	}
+-
+-	if (pipestat_reg)
+-	{
+-		pipestat = I915_READ (pipestat_reg);
+-		/*
+-		 * Older chips didn't have the start vblank interrupt,
+-		 * but
+-		 */
+-		if (IS_I965G (dev))
+-			pipestat |= I915_START_VBLANK_INTERRUPT_ENABLE;
+-		else
+-			pipestat |= I915_VBLANK_INTERRUPT_ENABLE;
+-		/*
+-		 * Clear any pending status
+-		 */
+-		pipestat |= (I915_START_VBLANK_INTERRUPT_STATUS |
+-			     I915_VBLANK_INTERRUPT_STATUS);
+-		I915_WRITE(pipestat_reg, pipestat);
+-	}
+-	I915_WRITE(I915REG_INT_ENABLE_R, dev_priv->irq_enable_reg);
+-
+-	return 0;
+-}
+-
+-void i915_disable_vblank(struct drm_device *dev, int plane)
+-{
+-	drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
+-	int pipe = i915_get_pipe(dev, plane);
+-	u32	pipestat_reg = 0;
+-	u32	pipestat;
+-
+-	switch (pipe) {
+-	case 0:
+-		pipestat_reg = I915REG_PIPEASTAT;
+-		dev_priv->irq_enable_reg &= ~I915_DISPLAY_PIPE_A_EVENT_INTERRUPT;
+-		break;
+-	case 1:
+-		pipestat_reg = I915REG_PIPEBSTAT;
+-		dev_priv->irq_enable_reg &= ~I915_DISPLAY_PIPE_B_EVENT_INTERRUPT;
+-		break;
+-	default:
+-		DRM_ERROR("tried to disable vblank on non-existent pipe %d\n",
+-			  pipe);
+-		break;
+-	}
+-
+-	I915_WRITE(I915REG_INT_ENABLE_R, dev_priv->irq_enable_reg);
+-	if (pipestat_reg)
+-	{
+-		pipestat = I915_READ (pipestat_reg);
+-		pipestat &= ~(I915_START_VBLANK_INTERRUPT_ENABLE |
+-			      I915_VBLANK_INTERRUPT_ENABLE);
+-		/*
+-		 * Clear any pending status
+-		 */
+-		pipestat |= (I915_START_VBLANK_INTERRUPT_STATUS |
+-			     I915_VBLANK_INTERRUPT_STATUS);
+-		I915_WRITE(pipestat_reg, pipestat);
+-	}
+-}
+-
+ static void i915_enable_interrupt (struct drm_device *dev)
+ {
+ 	drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
++	u16 flag;
+ 
+-	dev_priv->irq_enable_reg |= I915_USER_INTERRUPT;
++	flag = 0;
++	if (dev_priv->vblank_pipe & DRM_I915_VBLANK_PIPE_A)
++		flag |= VSYNC_PIPEA_FLAG;
++	if (dev_priv->vblank_pipe & DRM_I915_VBLANK_PIPE_B)
++		flag |= VSYNC_PIPEB_FLAG;
+ 
+-	I915_WRITE(I915REG_INT_ENABLE_R, dev_priv->irq_enable_reg);
+-	dev_priv->irq_enabled = 1;
++	I915_WRITE16(I915REG_INT_ENABLE_R, USER_INT_FLAG | flag);
+ }
+ 
+ /* Set the vblank monitor pipe
+@@ -675,6 +448,8 @@ int i915_vblank_pipe_set(struct drm_device *dev, void *data,
+ 
+ 	dev_priv->vblank_pipe = pipe->pipe;
+ 
++	i915_enable_interrupt (dev);
++
+ 	return 0;
+ }
+ 
+@@ -692,9 +467,9 @@ int i915_vblank_pipe_get(struct drm_device *dev, void *data,
+ 
+ 	flag = I915_READ(I915REG_INT_ENABLE_R);
+ 	pipe->pipe = 0;
+-	if (flag & I915_DISPLAY_PIPE_A_EVENT_INTERRUPT)
++	if (flag & VSYNC_PIPEA_FLAG)
+ 		pipe->pipe |= DRM_I915_VBLANK_PIPE_A;
+-	if (flag & I915_DISPLAY_PIPE_B_EVENT_INTERRUPT)
++	if (flag & VSYNC_PIPEB_FLAG)
+ 		pipe->pipe |= DRM_I915_VBLANK_PIPE_B;
+ 
+ 	return 0;
+@@ -709,30 +484,27 @@ int i915_vblank_swap(struct drm_device *dev, void *data,
+ 	drm_i915_private_t *dev_priv = dev->dev_private;
+ 	drm_i915_vblank_swap_t *swap = data;
+ 	drm_i915_vbl_swap_t *vbl_swap;
+-	unsigned int pipe, seqtype, curseq, plane;
++	unsigned int pipe, seqtype, curseq;
+ 	unsigned long irqflags;
+ 	struct list_head *list;
+-	int ret;
+ 
+ 	if (!dev_priv) {
+ 		DRM_ERROR("%s called with no initialization\n", __func__);
+ 		return -EINVAL;
+ 	}
+ 
+-	if (!dev_priv->sarea_priv || dev_priv->sarea_priv->rotation) {
++	if (dev_priv->sarea_priv->rotation) {
+ 		DRM_DEBUG("Rotation not supported\n");
+ 		return -EINVAL;
+ 	}
+ 
+ 	if (swap->seqtype & ~(_DRM_VBLANK_RELATIVE | _DRM_VBLANK_ABSOLUTE |
+-			     _DRM_VBLANK_SECONDARY | _DRM_VBLANK_NEXTONMISS |
+-			     _DRM_VBLANK_FLIP)) {
++			     _DRM_VBLANK_SECONDARY | _DRM_VBLANK_NEXTONMISS)) {
+ 		DRM_ERROR("Invalid sequence type 0x%x\n", swap->seqtype);
+ 		return -EINVAL;
+ 	}
+ 
+-	plane = (swap->seqtype & _DRM_VBLANK_SECONDARY) ? 1 : 0;
+-	pipe = i915_get_pipe(dev, plane);
++	pipe = (swap->seqtype & _DRM_VBLANK_SECONDARY) ? 1 : 0;
+ 
+ 	seqtype = swap->seqtype & (_DRM_VBLANK_RELATIVE | _DRM_VBLANK_ABSOLUTE);
+ 
+@@ -743,11 +515,6 @@ int i915_vblank_swap(struct drm_device *dev, void *data,
+ 
+ 	spin_lock_irqsave(&dev->drw_lock, irqflags);
+ 
+-	/* It makes no sense to schedule a swap for a drawable that doesn't have
+-	 * valid information at this point. E.g. this could mean that the X
+-	 * server is too old to push drawable information to the DRM, in which
+-	 * case all such swaps would become ineffective.
+-	 */
+ 	if (!drm_get_drawable_info(dev, swap->drawable)) {
+ 		spin_unlock_irqrestore(&dev->drw_lock, irqflags);
+ 		DRM_DEBUG("Invalid drawable ID %d\n", swap->drawable);
+@@ -756,8 +523,7 @@ int i915_vblank_swap(struct drm_device *dev, void *data,
+ 
+ 	spin_unlock_irqrestore(&dev->drw_lock, irqflags);
+ 
+-	drm_update_vblank_count(dev, pipe);
+-	curseq = drm_vblank_count(dev, pipe);
++	curseq = atomic_read(pipe ? &dev->vbl_received2 : &dev->vbl_received);
+ 
+ 	if (seqtype == _DRM_VBLANK_RELATIVE)
+ 		swap->sequence += curseq;
+@@ -771,43 +537,14 @@ int i915_vblank_swap(struct drm_device *dev, void *data,
+ 		}
+ 	}
+ 
+-	if (swap->seqtype & _DRM_VBLANK_FLIP) {
+-		swap->sequence--;
+-
+-		if ((curseq - swap->sequence) <= (1<<23)) {
+-			struct drm_drawable_info *drw;
+-
+-			LOCK_TEST_WITH_RETURN(dev, file_priv);
+-
+-			spin_lock_irqsave(&dev->drw_lock, irqflags);
+-
+-			drw = drm_get_drawable_info(dev, swap->drawable);
+-
+-			if (!drw) {
+-				spin_unlock_irqrestore(&dev->drw_lock,
+-				    irqflags);
+-				DRM_DEBUG("Invalid drawable ID %d\n",
+-					  swap->drawable);
+-				return -EINVAL;
+-			}
+-
+-			i915_dispatch_vsync_flip(dev, drw, plane);
+-
+-			spin_unlock_irqrestore(&dev->drw_lock, irqflags);
+-
+-			return 0;
+-		}
+-	}
+-
+ 	spin_lock_irqsave(&dev_priv->swaps_lock, irqflags);
+ 
+ 	list_for_each(list, &dev_priv->vbl_swaps.head) {
+ 		vbl_swap = list_entry(list, drm_i915_vbl_swap_t, head);
+ 
+ 		if (vbl_swap->drw_id == swap->drawable &&
+-		    vbl_swap->plane == plane &&
++		    vbl_swap->pipe == pipe &&
+ 		    vbl_swap->sequence == swap->sequence) {
+-			vbl_swap->flip = (swap->seqtype & _DRM_VBLANK_FLIP);
+ 			spin_unlock_irqrestore(&dev_priv->swaps_lock, irqflags);
+ 			DRM_DEBUG("Already scheduled\n");
+ 			return 0;
+@@ -830,19 +567,9 @@ int i915_vblank_swap(struct drm_device *dev, void *data,
+ 
+ 	DRM_DEBUG("\n");
+ 
+-	ret = drm_vblank_get(dev, pipe);
+-	if (ret) {
+-		drm_free(vbl_swap, sizeof(*vbl_swap), DRM_MEM_DRIVER);
+-		return ret;
+-	}
+-
+ 	vbl_swap->drw_id = swap->drawable;
+-	vbl_swap->plane = plane;
++	vbl_swap->pipe = pipe;
+ 	vbl_swap->sequence = swap->sequence;
+-	vbl_swap->flip = (swap->seqtype & _DRM_VBLANK_FLIP);
+-
+-	if (vbl_swap->flip)
+-		swap->sequence++;
+ 
+ 	spin_lock_irqsave(&dev_priv->swaps_lock, irqflags);
+ 
+@@ -860,57 +587,37 @@ void i915_driver_irq_preinstall(struct drm_device * dev)
+ {
+ 	drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
+ 
+-	I915_WRITE16(I915REG_HWSTAM, 0xeffe);
++	I915_WRITE16(I915REG_HWSTAM, 0xfffe);
+ 	I915_WRITE16(I915REG_INT_MASK_R, 0x0);
+ 	I915_WRITE16(I915REG_INT_ENABLE_R, 0x0);
+ }
+ 
+-int i915_driver_irq_postinstall(struct drm_device * dev)
++void i915_driver_irq_postinstall(struct drm_device * dev)
+ {
+ 	drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
+-	int ret, num_pipes = 2;
+ 
+ 	spin_lock_init(&dev_priv->swaps_lock);
+ 	INIT_LIST_HEAD(&dev_priv->vbl_swaps.head);
+ 	dev_priv->swaps_pending = 0;
+ 
+-	dev_priv->user_irq_refcount = 0;
+-	dev_priv->irq_enable_reg = 0;
+-
+-	ret = drm_vblank_init(dev, num_pipes);
+-	if (ret)
+-		return ret;
+-
+-	dev->max_vblank_count = 0xffffff; /* only 24 bits of frame count */
+-
++	if (!dev_priv->vblank_pipe)
++		dev_priv->vblank_pipe = DRM_I915_VBLANK_PIPE_A;
+ 	i915_enable_interrupt(dev);
+ 	DRM_INIT_WAITQUEUE(&dev_priv->irq_queue);
+-
+-	/*
+-	 * Initialize the hardware status page IRQ location.
+-	 */
+-
+-	I915_WRITE(I915REG_INSTPM, (1 << 5) | (1 << 21));
+-	return 0;
+ }
+ 
+ void i915_driver_irq_uninstall(struct drm_device * dev)
+ {
+ 	drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
+-	u32 temp;
++	u16 temp;
+ 
+ 	if (!dev_priv)
+ 		return;
+ 
+-	dev_priv->irq_enabled = 0;
+-	I915_WRITE(I915REG_HWSTAM, 0xffffffff);
+-	I915_WRITE(I915REG_INT_MASK_R, 0xffffffff);
+-	I915_WRITE(I915REG_INT_ENABLE_R, 0x0);
+-
+-	temp = I915_READ(I915REG_PIPEASTAT);
+-	I915_WRITE(I915REG_PIPEASTAT, temp);
+-	temp = I915_READ(I915REG_PIPEBSTAT);
+-	I915_WRITE(I915REG_PIPEBSTAT, temp);
+-	temp = I915_READ(I915REG_INT_IDENTITY_R);
+-	I915_WRITE(I915REG_INT_IDENTITY_R, temp);
++	I915_WRITE16(I915REG_HWSTAM, 0xffff);
++	I915_WRITE16(I915REG_INT_MASK_R, 0xffff);
++	I915_WRITE16(I915REG_INT_ENABLE_R, 0x0);
++
++	temp = I915_READ16(I915REG_INT_IDENTITY_R);
++	I915_WRITE16(I915REG_INT_IDENTITY_R, temp);
+ }
+diff --git a/drivers/char/drm/mga_drv.c b/drivers/char/drm/mga_drv.c
+index 6b37909..5572939 100644
+--- a/drivers/char/drm/mga_drv.c
++++ b/drivers/char/drm/mga_drv.c
+@@ -45,16 +45,15 @@ static struct pci_device_id pciidlist[] = {
+ static struct drm_driver driver = {
+ 	.driver_features =
+ 	    DRIVER_USE_AGP | DRIVER_USE_MTRR | DRIVER_PCI_DMA |
+-	    DRIVER_HAVE_DMA | DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED,
++	    DRIVER_HAVE_DMA | DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED |
++	    DRIVER_IRQ_VBL,
+ 	.dev_priv_size = sizeof(drm_mga_buf_priv_t),
+ 	.load = mga_driver_load,
+ 	.unload = mga_driver_unload,
+ 	.lastclose = mga_driver_lastclose,
+ 	.dma_quiescent = mga_driver_dma_quiescent,
+ 	.device_is_agp = mga_driver_device_is_agp,
+-	.get_vblank_counter = mga_get_vblank_counter,
+-	.enable_vblank = mga_enable_vblank,
+-	.disable_vblank = mga_disable_vblank,
++	.vblank_wait = mga_driver_vblank_wait,
+ 	.irq_preinstall = mga_driver_irq_preinstall,
+ 	.irq_postinstall = mga_driver_irq_postinstall,
+ 	.irq_uninstall = mga_driver_irq_uninstall,
+diff --git a/drivers/char/drm/mga_drv.h b/drivers/char/drm/mga_drv.h
+index 8f7291f..f6ebd24 100644
+--- a/drivers/char/drm/mga_drv.h
++++ b/drivers/char/drm/mga_drv.h
+@@ -120,7 +120,6 @@ typedef struct drm_mga_private {
+ 	u32 clear_cmd;
+ 	u32 maccess;
+ 
+-	atomic_t vbl_received;		/**< Number of vblanks received. */
+ 	wait_queue_head_t fence_queue;
+ 	atomic_t last_fence_retired;
+ 	u32 next_fence_to_post;
+@@ -182,14 +181,11 @@ extern int mga_warp_install_microcode(drm_mga_private_t * dev_priv);
+ extern int mga_warp_init(drm_mga_private_t * dev_priv);
+ 
+ 				/* mga_irq.c */
+-extern int mga_enable_vblank(struct drm_device *dev, int crtc);
+-extern void mga_disable_vblank(struct drm_device *dev, int crtc);
+-extern u32 mga_get_vblank_counter(struct drm_device *dev, int crtc);
+ extern int mga_driver_fence_wait(struct drm_device * dev, unsigned int *sequence);
+ extern int mga_driver_vblank_wait(struct drm_device * dev, unsigned int *sequence);
+ extern irqreturn_t mga_driver_irq_handler(DRM_IRQ_ARGS);
+ extern void mga_driver_irq_preinstall(struct drm_device * dev);
+-extern int mga_driver_irq_postinstall(struct drm_device * dev);
++extern void mga_driver_irq_postinstall(struct drm_device * dev);
+ extern void mga_driver_irq_uninstall(struct drm_device * dev);
+ extern long mga_compat_ioctl(struct file *filp, unsigned int cmd,
+ 			     unsigned long arg);
+diff --git a/drivers/char/drm/mga_irq.c b/drivers/char/drm/mga_irq.c
+index 06852fb..9302cb8 100644
+--- a/drivers/char/drm/mga_irq.c
++++ b/drivers/char/drm/mga_irq.c
+@@ -35,20 +35,6 @@
+ #include "mga_drm.h"
+ #include "mga_drv.h"
+ 
+-u32 mga_get_vblank_counter(struct drm_device *dev, int crtc)
+-{
+-	const drm_mga_private_t *const dev_priv =
+-		(drm_mga_private_t *) dev->dev_private;
+-
+-	if (crtc != 0) {
+-		return 0;
+-	}
+-
+-
+-	return atomic_read(&dev_priv->vbl_received);
+-}
+-
+-
+ irqreturn_t mga_driver_irq_handler(DRM_IRQ_ARGS)
+ {
+ 	struct drm_device *dev = (struct drm_device *) arg;
+@@ -61,8 +47,9 @@ irqreturn_t mga_driver_irq_handler(DRM_IRQ_ARGS)
+ 	/* VBLANK interrupt */
+ 	if (status & MGA_VLINEPEN) {
+ 		MGA_WRITE(MGA_ICLEAR, MGA_VLINEICLR);
+-		atomic_inc(&dev_priv->vbl_received);
+-		drm_handle_vblank(dev, 0);
++		atomic_inc(&dev->vbl_received);
++		DRM_WAKEUP(&dev->vbl_queue);
++		drm_vbl_send_signals(dev);
+ 		handled = 1;
+ 	}
+ 
+@@ -91,34 +78,22 @@ irqreturn_t mga_driver_irq_handler(DRM_IRQ_ARGS)
+ 	return IRQ_NONE;
+ }
+ 
+-int mga_enable_vblank(struct drm_device *dev, int crtc)
++int mga_driver_vblank_wait(struct drm_device * dev, unsigned int *sequence)
+ {
+-	drm_mga_private_t *dev_priv = (drm_mga_private_t *) dev->dev_private;
+-
+-	if (crtc != 0) {
+-		DRM_ERROR("tried to enable vblank on non-existent crtc %d\n",
+-			  crtc);
+-		return 0;
+-	}
+-
+-	MGA_WRITE(MGA_IEN, MGA_VLINEIEN | MGA_SOFTRAPEN);
+-	return 0;
+-}
++	unsigned int cur_vblank;
++	int ret = 0;
+ 
++	/* Assume that the user has missed the current sequence number
++	 * by about a day rather than she wants to wait for years
++	 * using vertical blanks...
++	 */
++	DRM_WAIT_ON(ret, dev->vbl_queue, 3 * DRM_HZ,
++		    (((cur_vblank = atomic_read(&dev->vbl_received))
++		      - *sequence) <= (1 << 23)));
+ 
+-void mga_disable_vblank(struct drm_device *dev, int crtc)
+-{
+-	if (crtc != 0) {
+-		DRM_ERROR("tried to disable vblank on non-existent crtc %d\n",
+-			  crtc);
+-	}
++	*sequence = cur_vblank;
+ 
+-	/* Do *NOT* disable the vertical refresh interrupt.  MGA doesn't have
+-	 * a nice hardware counter that tracks the number of refreshes when
+-	 * the interrupt is disabled, and the kernel doesn't know the refresh
+-	 * rate to calculate an estimate.
+-	 */
+-	/* MGA_WRITE(MGA_IEN, MGA_VLINEIEN | MGA_SOFTRAPEN); */
++	return ret;
+ }
+ 
+ int mga_driver_fence_wait(struct drm_device * dev, unsigned int *sequence)
+@@ -150,22 +125,14 @@ void mga_driver_irq_preinstall(struct drm_device * dev)
+ 	MGA_WRITE(MGA_ICLEAR, ~0);
+ }
+ 
+-int mga_driver_irq_postinstall(struct drm_device * dev)
++void mga_driver_irq_postinstall(struct drm_device * dev)
+ {
+ 	drm_mga_private_t *dev_priv = (drm_mga_private_t *) dev->dev_private;
+-	int ret;
+-
+-	ret = drm_vblank_init(dev, 1);
+-	if (ret)
+-		return ret;
+ 
+ 	DRM_INIT_WAITQUEUE(&dev_priv->fence_queue);
+ 
+-	/* Turn on soft trap interrupt.  Vertical blank interrupts are enabled
+-	 * in mga_enable_vblank.
+-	 */
+-	MGA_WRITE(MGA_IEN, MGA_SOFTRAPEN);
+-	return 0;
++	/* Turn on vertical blank interrupt and soft trap interrupt. */
++	MGA_WRITE(MGA_IEN, MGA_VLINEIEN | MGA_SOFTRAPEN);
+ }
+ 
+ void mga_driver_irq_uninstall(struct drm_device * dev)
+diff --git a/drivers/char/drm/r128_drv.c b/drivers/char/drm/r128_drv.c
+index 2888aa0..6108e75 100644
+--- a/drivers/char/drm/r128_drv.c
++++ b/drivers/char/drm/r128_drv.c
+@@ -43,13 +43,12 @@ static struct pci_device_id pciidlist[] = {
+ static struct drm_driver driver = {
+ 	.driver_features =
+ 	    DRIVER_USE_AGP | DRIVER_USE_MTRR | DRIVER_PCI_DMA | DRIVER_SG |
+-	    DRIVER_HAVE_DMA | DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED,
++	    DRIVER_HAVE_DMA | DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED |
++	    DRIVER_IRQ_VBL,
+ 	.dev_priv_size = sizeof(drm_r128_buf_priv_t),
+ 	.preclose = r128_driver_preclose,
+ 	.lastclose = r128_driver_lastclose,
+-	.get_vblank_counter = r128_get_vblank_counter,
+-	.enable_vblank = r128_enable_vblank,
+-	.disable_vblank = r128_disable_vblank,
++	.vblank_wait = r128_driver_vblank_wait,
+ 	.irq_preinstall = r128_driver_irq_preinstall,
+ 	.irq_postinstall = r128_driver_irq_postinstall,
+ 	.irq_uninstall = r128_driver_irq_uninstall,
+diff --git a/drivers/char/drm/r128_drv.h b/drivers/char/drm/r128_drv.h
+index 80af9e0..011105e 100644
+--- a/drivers/char/drm/r128_drv.h
++++ b/drivers/char/drm/r128_drv.h
+@@ -97,8 +97,6 @@ typedef struct drm_r128_private {
+ 	u32 crtc_offset;
+ 	u32 crtc_offset_cntl;
+ 
+-	atomic_t vbl_received;
+-
+ 	u32 color_fmt;
+ 	unsigned int front_offset;
+ 	unsigned int front_pitch;
+@@ -151,12 +149,11 @@ extern int r128_wait_ring(drm_r128_private_t * dev_priv, int n);
+ extern int r128_do_cce_idle(drm_r128_private_t * dev_priv);
+ extern int r128_do_cleanup_cce(struct drm_device * dev);
+ 
+-extern int r128_enable_vblank(struct drm_device *dev, int crtc);
+-extern void r128_disable_vblank(struct drm_device *dev, int crtc);
+-extern u32 r128_get_vblank_counter(struct drm_device *dev, int crtc);
++extern int r128_driver_vblank_wait(struct drm_device * dev, unsigned int *sequence);
++
+ extern irqreturn_t r128_driver_irq_handler(DRM_IRQ_ARGS);
+ extern void r128_driver_irq_preinstall(struct drm_device * dev);
+-extern int r128_driver_irq_postinstall(struct drm_device * dev);
++extern void r128_driver_irq_postinstall(struct drm_device * dev);
+ extern void r128_driver_irq_uninstall(struct drm_device * dev);
+ extern void r128_driver_lastclose(struct drm_device * dev);
+ extern void r128_driver_preclose(struct drm_device * dev,
+diff --git a/drivers/char/drm/r128_irq.c b/drivers/char/drm/r128_irq.c
+index 5b95bd8..c76fdca 100644
+--- a/drivers/char/drm/r128_irq.c
++++ b/drivers/char/drm/r128_irq.c
+@@ -35,16 +35,6 @@
+ #include "r128_drm.h"
+ #include "r128_drv.h"
+ 
+-u32 r128_get_vblank_counter(struct drm_device *dev, int crtc)
+-{
+-	const drm_r128_private_t *dev_priv = dev->dev_private;
+-
+-	if (crtc != 0)
+-		return 0;
+-
+-	return atomic_read(&dev_priv->vbl_received);
+-}
+-
+ irqreturn_t r128_driver_irq_handler(DRM_IRQ_ARGS)
+ {
+ 	struct drm_device *dev = (struct drm_device *) arg;
+@@ -56,38 +46,30 @@ irqreturn_t r128_driver_irq_handler(DRM_IRQ_ARGS)
+ 	/* VBLANK interrupt */
+ 	if (status & R128_CRTC_VBLANK_INT) {
+ 		R128_WRITE(R128_GEN_INT_STATUS, R128_CRTC_VBLANK_INT_AK);
+-		atomic_inc(&dev_priv->vbl_received);
+-		drm_handle_vblank(dev, 0);
++		atomic_inc(&dev->vbl_received);
++		DRM_WAKEUP(&dev->vbl_queue);
++		drm_vbl_send_signals(dev);
+ 		return IRQ_HANDLED;
+ 	}
+ 	return IRQ_NONE;
+ }
+ 
+-int r128_enable_vblank(struct drm_device *dev, int crtc)
++int r128_driver_vblank_wait(struct drm_device * dev, unsigned int *sequence)
+ {
+-	drm_r128_private_t *dev_priv = dev->dev_private;
+-
+-	if (crtc != 0) {
+-		DRM_ERROR("%s:  bad crtc %d\n", __FUNCTION__, crtc);
+-		return -EINVAL;
+-	}
++	unsigned int cur_vblank;
++	int ret = 0;
+ 
+-	R128_WRITE(R128_GEN_INT_CNTL, R128_CRTC_VBLANK_INT_EN);
+-	return 0;
+-}
++	/* Assume that the user has missed the current sequence number
++	 * by about a day rather than she wants to wait for years
++	 * using vertical blanks...
++	 */
++	DRM_WAIT_ON(ret, dev->vbl_queue, 3 * DRM_HZ,
++		    (((cur_vblank = atomic_read(&dev->vbl_received))
++		      - *sequence) <= (1 << 23)));
+ 
+-void r128_disable_vblank(struct drm_device *dev, int crtc)
+-{
+-	if (crtc != 0)
+-		DRM_ERROR("%s:  bad crtc %d\n", __FUNCTION__, crtc);
++	*sequence = cur_vblank;
+ 
+-	/*
+-	 * FIXME: implement proper interrupt disable by using the vblank
+-	 * counter register (if available)
+-	 *
+-	 * R128_WRITE(R128_GEN_INT_CNTL,
+-	 *            R128_READ(R128_GEN_INT_CNTL) & ~R128_CRTC_VBLANK_INT_EN);
+-	 */
++	return ret;
+ }
+ 
+ void r128_driver_irq_preinstall(struct drm_device * dev)
+@@ -100,9 +82,12 @@ void r128_driver_irq_preinstall(struct drm_device * dev)
+ 	R128_WRITE(R128_GEN_INT_STATUS, R128_CRTC_VBLANK_INT_AK);
+ }
+ 
+-int r128_driver_irq_postinstall(struct drm_device * dev)
++void r128_driver_irq_postinstall(struct drm_device * dev)
+ {
+-	return drm_vblank_init(dev, 1);
++	drm_r128_private_t *dev_priv = (drm_r128_private_t *) dev->dev_private;
++
++	/* Turn on VBL interrupt */
++	R128_WRITE(R128_GEN_INT_CNTL, R128_CRTC_VBLANK_INT_EN);
+ }
+ 
+ void r128_driver_irq_uninstall(struct drm_device * dev)
+diff --git a/drivers/char/drm/radeon_drv.c b/drivers/char/drm/radeon_drv.c
+index a261031..349ac3d 100644
+--- a/drivers/char/drm/radeon_drv.c
++++ b/drivers/char/drm/radeon_drv.c
+@@ -59,7 +59,8 @@ static struct pci_device_id pciidlist[] = {
+ static struct drm_driver driver = {
+ 	.driver_features =
+ 	    DRIVER_USE_AGP | DRIVER_USE_MTRR | DRIVER_PCI_DMA | DRIVER_SG |
+-	    DRIVER_HAVE_IRQ | DRIVER_HAVE_DMA | DRIVER_IRQ_SHARED,
++	    DRIVER_HAVE_IRQ | DRIVER_HAVE_DMA | DRIVER_IRQ_SHARED |
++	    DRIVER_IRQ_VBL | DRIVER_IRQ_VBL2,
+ 	.dev_priv_size = sizeof(drm_radeon_buf_priv_t),
+ 	.load = radeon_driver_load,
+ 	.firstopen = radeon_driver_firstopen,
+@@ -68,9 +69,8 @@ static struct drm_driver driver = {
+ 	.postclose = radeon_driver_postclose,
+ 	.lastclose = radeon_driver_lastclose,
+ 	.unload = radeon_driver_unload,
+-	.get_vblank_counter = radeon_get_vblank_counter,
+-	.enable_vblank = radeon_enable_vblank,
+-	.disable_vblank = radeon_disable_vblank,
++	.vblank_wait = radeon_driver_vblank_wait,
++	.vblank_wait2 = radeon_driver_vblank_wait2,
+ 	.dri_library_name = dri_library_name,
+ 	.irq_preinstall = radeon_driver_irq_preinstall,
+ 	.irq_postinstall = radeon_driver_irq_postinstall,
+diff --git a/drivers/char/drm/radeon_drv.h b/drivers/char/drm/radeon_drv.h
+index b791420..173ae62 100644
+--- a/drivers/char/drm/radeon_drv.h
++++ b/drivers/char/drm/radeon_drv.h
+@@ -304,9 +304,6 @@ typedef struct drm_radeon_private {
+ 
+ 	u32 scratch_ages[5];
+ 
+-	unsigned int crtc_last_cnt;
+-	unsigned int crtc2_last_cnt;
+-
+ 	/* starting from here on, data is preserved accross an open */
+ 	uint32_t flags;		/* see radeon_chip_flags */
+ 	unsigned long fb_aper_offset;
+@@ -377,13 +374,13 @@ extern int radeon_irq_emit(struct drm_device *dev, void *data, struct drm_file *
+ extern int radeon_irq_wait(struct drm_device *dev, void *data, struct drm_file *file_priv);
+ 
+ extern void radeon_do_release(struct drm_device * dev);
+-extern u32 radeon_get_vblank_counter(struct drm_device *dev, int crtc);
+-extern int radeon_enable_vblank(struct drm_device *dev, int crtc);
+-extern void radeon_disable_vblank(struct drm_device *dev, int crtc);
+-extern void radeon_do_release(struct drm_device * dev);
++extern int radeon_driver_vblank_wait(struct drm_device * dev,
++				     unsigned int *sequence);
++extern int radeon_driver_vblank_wait2(struct drm_device * dev,
++				      unsigned int *sequence);
+ extern irqreturn_t radeon_driver_irq_handler(DRM_IRQ_ARGS);
+ extern void radeon_driver_irq_preinstall(struct drm_device * dev);
+-extern int radeon_driver_irq_postinstall(struct drm_device * dev);
++extern void radeon_driver_irq_postinstall(struct drm_device * dev);
+ extern void radeon_driver_irq_uninstall(struct drm_device * dev);
+ extern int radeon_vblank_crtc_get(struct drm_device *dev);
+ extern int radeon_vblank_crtc_set(struct drm_device *dev, int64_t value);
+@@ -561,12 +558,6 @@ extern int r300_do_cp_cmdbuf(struct drm_device * dev,
+ 				? DRM_READ32( dev_priv->ring_rptr, RADEON_SCRATCHOFF(x) ) \
+ 				: RADEON_READ( RADEON_SCRATCH_REG0 + 4*(x) ) )
+ 
+-#define RADEON_CRTC_CRNT_FRAME 0x0214
+-#define RADEON_CRTC2_CRNT_FRAME 0x0314
+-
+-#define RADEON_CRTC_STATUS		0x005c
+-#define RADEON_CRTC2_STATUS		0x03fc
+-
+ #define RADEON_GEN_INT_CNTL		0x0040
+ #	define RADEON_CRTC_VBLANK_MASK		(1 << 0)
+ #	define RADEON_CRTC2_VBLANK_MASK		(1 << 9)
+diff --git a/drivers/char/drm/radeon_irq.c b/drivers/char/drm/radeon_irq.c
+index 507d6b7..009af38 100644
+--- a/drivers/char/drm/radeon_irq.c
++++ b/drivers/char/drm/radeon_irq.c
+@@ -35,61 +35,12 @@
+ #include "radeon_drm.h"
+ #include "radeon_drv.h"
+ 
+-static void radeon_irq_set_state(struct drm_device *dev, u32 mask, int state)
++static __inline__ u32 radeon_acknowledge_irqs(drm_radeon_private_t * dev_priv,
++					      u32 mask)
+ {
+-	drm_radeon_private_t *dev_priv = dev->dev_private;
+-
+-	if (state)
+-		dev_priv->irq_enable_reg |= mask;
+-	else
+-		dev_priv->irq_enable_reg &= ~mask;
+-
+-	RADEON_WRITE(RADEON_GEN_INT_CNTL, dev_priv->irq_enable_reg);
+-}
+-
+-int radeon_enable_vblank(struct drm_device *dev, int crtc)
+-{
+-	switch (crtc) {
+-	case 0:
+-		radeon_irq_set_state(dev, RADEON_CRTC_VBLANK_MASK, 1);
+-		break;
+-	case 1:
+-		radeon_irq_set_state(dev, RADEON_CRTC2_VBLANK_MASK, 1);
+-		break;
+-	default:
+-		DRM_ERROR("tried to enable vblank on non-existent crtc %d\n",
+-			  crtc);
+-		return EINVAL;
+-	}
+-
+-	return 0;
+-}
+-
+-void radeon_disable_vblank(struct drm_device *dev, int crtc)
+-{
+-	switch (crtc) {
+-	case 0:
+-		radeon_irq_set_state(dev, RADEON_CRTC_VBLANK_MASK, 0);
+-		break;
+-	case 1:
+-		radeon_irq_set_state(dev, RADEON_CRTC2_VBLANK_MASK, 0);
+-		break;
+-	default:
+-		DRM_ERROR("tried to enable vblank on non-existent crtc %d\n",
+-			  crtc);
+-		break;
+-	}
+-}
+-
+-static __inline__ u32 radeon_acknowledge_irqs(drm_radeon_private_t * dev_priv)
+-{
+-	u32 irqs = RADEON_READ(RADEON_GEN_INT_STATUS) &
+-		(RADEON_SW_INT_TEST | RADEON_CRTC_VBLANK_STAT |
+-		 RADEON_CRTC2_VBLANK_STAT);
+-
++	u32 irqs = RADEON_READ(RADEON_GEN_INT_STATUS) & mask;
+ 	if (irqs)
+ 		RADEON_WRITE(RADEON_GEN_INT_STATUS, irqs);
+-
+ 	return irqs;
+ }
+ 
+@@ -121,21 +72,39 @@ irqreturn_t radeon_driver_irq_handler(DRM_IRQ_ARGS)
+ 	/* Only consider the bits we're interested in - others could be used
+ 	 * outside the DRM
+ 	 */
+-	stat = radeon_acknowledge_irqs(dev_priv);
++	stat = radeon_acknowledge_irqs(dev_priv, (RADEON_SW_INT_TEST_ACK |
++						  RADEON_CRTC_VBLANK_STAT |
++						  RADEON_CRTC2_VBLANK_STAT));
+ 	if (!stat)
+ 		return IRQ_NONE;
+ 
+ 	stat &= dev_priv->irq_enable_reg;
+ 
+ 	/* SW interrupt */
+-	if (stat & RADEON_SW_INT_TEST)
++	if (stat & RADEON_SW_INT_TEST) {
+ 		DRM_WAKEUP(&dev_priv->swi_queue);
++	}
+ 
+ 	/* VBLANK interrupt */
+-	if (stat & RADEON_CRTC_VBLANK_STAT)
+-		drm_handle_vblank(dev, 0);
+-	if (stat & RADEON_CRTC2_VBLANK_STAT)
+-		drm_handle_vblank(dev, 1);
++	if (stat & (RADEON_CRTC_VBLANK_STAT|RADEON_CRTC2_VBLANK_STAT)) {
++		int vblank_crtc = dev_priv->vblank_crtc;
++
++		if ((vblank_crtc &
++		     (DRM_RADEON_VBLANK_CRTC1 | DRM_RADEON_VBLANK_CRTC2)) ==
++		    (DRM_RADEON_VBLANK_CRTC1 | DRM_RADEON_VBLANK_CRTC2)) {
++			if (stat & RADEON_CRTC_VBLANK_STAT)
++				atomic_inc(&dev->vbl_received);
++			if (stat & RADEON_CRTC2_VBLANK_STAT)
++				atomic_inc(&dev->vbl_received2);
++		} else if (((stat & RADEON_CRTC_VBLANK_STAT) &&
++			   (vblank_crtc & DRM_RADEON_VBLANK_CRTC1)) ||
++			   ((stat & RADEON_CRTC2_VBLANK_STAT) &&
++			    (vblank_crtc & DRM_RADEON_VBLANK_CRTC2)))
++			atomic_inc(&dev->vbl_received);
++
++		DRM_WAKEUP(&dev->vbl_queue);
++		drm_vbl_send_signals(dev);
++	}
+ 
+ 	return IRQ_HANDLED;
+ }
+@@ -175,27 +144,54 @@ static int radeon_wait_irq(struct drm_device * dev, int swi_nr)
+ 	return ret;
+ }
+ 
+-u32 radeon_get_vblank_counter(struct drm_device *dev, int crtc)
++static int radeon_driver_vblank_do_wait(struct drm_device * dev,
++					unsigned int *sequence, int crtc)
+ {
+-	drm_radeon_private_t *dev_priv = dev->dev_private;
+-	u32 crtc_cnt_reg, crtc_status_reg;
+-
++	drm_radeon_private_t *dev_priv =
++	    (drm_radeon_private_t *) dev->dev_private;
++	unsigned int cur_vblank;
++	int ret = 0;
++	int ack = 0;
++	atomic_t *counter;
+ 	if (!dev_priv) {
+ 		DRM_ERROR("called with no initialization\n");
+ 		return -EINVAL;
+ 	}
+ 
+-	if (crtc == 0) {
+-		crtc_cnt_reg = RADEON_CRTC_CRNT_FRAME;
+-		crtc_status_reg = RADEON_CRTC_STATUS;
+-	} else if (crtc == 1) {
+-		crtc_cnt_reg = RADEON_CRTC2_CRNT_FRAME;
+-		crtc_status_reg = RADEON_CRTC2_STATUS;
+-	} else {
++	if (crtc == DRM_RADEON_VBLANK_CRTC1) {
++		counter = &dev->vbl_received;
++		ack |= RADEON_CRTC_VBLANK_STAT;
++	} else if (crtc == DRM_RADEON_VBLANK_CRTC2) {
++		counter = &dev->vbl_received2;
++		ack |= RADEON_CRTC2_VBLANK_STAT;
++	} else
+ 		return -EINVAL;
+-	}
+ 
+-	return RADEON_READ(crtc_cnt_reg) + (RADEON_READ(crtc_status_reg) & 1);
++	radeon_acknowledge_irqs(dev_priv, ack);
++
++	dev_priv->stats.boxes |= RADEON_BOX_WAIT_IDLE;
++
++	/* Assume that the user has missed the current sequence number
++	 * by about a day rather than she wants to wait for years
++	 * using vertical blanks...
++	 */
++	DRM_WAIT_ON(ret, dev->vbl_queue, 3 * DRM_HZ,
++		    (((cur_vblank = atomic_read(counter))
++		      - *sequence) <= (1 << 23)));
++
++	*sequence = cur_vblank;
++
++	return ret;
++}
++
++int radeon_driver_vblank_wait(struct drm_device *dev, unsigned int *sequence)
++{
++	return radeon_driver_vblank_do_wait(dev, sequence, DRM_RADEON_VBLANK_CRTC1);
++}
++
++int radeon_driver_vblank_wait2(struct drm_device *dev, unsigned int *sequence)
++{
++	return radeon_driver_vblank_do_wait(dev, sequence, DRM_RADEON_VBLANK_CRTC2);
+ }
+ 
+ /* Needs the lock as it touches the ring.
+@@ -238,6 +234,21 @@ int radeon_irq_wait(struct drm_device *dev, void *data, struct drm_file *file_pr
+ 	return radeon_wait_irq(dev, irqwait->irq_seq);
+ }
+ 
++static void radeon_enable_interrupt(struct drm_device *dev)
++{
++	drm_radeon_private_t *dev_priv = (drm_radeon_private_t *) dev->dev_private;
++
++	dev_priv->irq_enable_reg = RADEON_SW_INT_ENABLE;
++	if (dev_priv->vblank_crtc & DRM_RADEON_VBLANK_CRTC1)
++		dev_priv->irq_enable_reg |= RADEON_CRTC_VBLANK_MASK;
++
++	if (dev_priv->vblank_crtc & DRM_RADEON_VBLANK_CRTC2)
++		dev_priv->irq_enable_reg |= RADEON_CRTC2_VBLANK_MASK;
++
++	RADEON_WRITE(RADEON_GEN_INT_CNTL, dev_priv->irq_enable_reg);
++	dev_priv->irq_enabled = 1;
++}
++
+ /* drm_dma.h hooks
+ */
+ void radeon_driver_irq_preinstall(struct drm_device * dev)
+@@ -249,27 +260,20 @@ void radeon_driver_irq_preinstall(struct drm_device * dev)
+ 	RADEON_WRITE(RADEON_GEN_INT_CNTL, 0);
+ 
+ 	/* Clear bits if they're already high */
+-	radeon_acknowledge_irqs(dev_priv);
++	radeon_acknowledge_irqs(dev_priv, (RADEON_SW_INT_TEST_ACK |
++					   RADEON_CRTC_VBLANK_STAT |
++					   RADEON_CRTC2_VBLANK_STAT));
+ }
+ 
+-int radeon_driver_irq_postinstall(struct drm_device * dev)
++void radeon_driver_irq_postinstall(struct drm_device * dev)
+ {
+ 	drm_radeon_private_t *dev_priv =
+ 	    (drm_radeon_private_t *) dev->dev_private;
+-	int ret;
+ 
+ 	atomic_set(&dev_priv->swi_emitted, 0);
+ 	DRM_INIT_WAITQUEUE(&dev_priv->swi_queue);
+ 
+-	ret = drm_vblank_init(dev, 2);
+-	if (ret)
+-		return ret;
+-
+-	dev->max_vblank_count = 0x001fffff;
+-
+-	radeon_irq_set_state(dev, RADEON_SW_INT_ENABLE, 1);
+-
+-	return 0;
++	radeon_enable_interrupt(dev);
+ }
+ 
+ void radeon_driver_irq_uninstall(struct drm_device * dev)
+@@ -311,5 +315,6 @@ int radeon_vblank_crtc_set(struct drm_device *dev, int64_t value)
+ 		return -EINVAL;
+ 	}
+ 	dev_priv->vblank_crtc = (unsigned int)value;
++	radeon_enable_interrupt(dev);
+ 	return 0;
+ }
+diff --git a/drivers/char/drm/via_drv.c b/drivers/char/drm/via_drv.c
+index 37870a4..80c01cd 100644
+--- a/drivers/char/drm/via_drv.c
++++ b/drivers/char/drm/via_drv.c
+@@ -40,13 +40,11 @@ static struct pci_device_id pciidlist[] = {
+ static struct drm_driver driver = {
+ 	.driver_features =
+ 	    DRIVER_USE_AGP | DRIVER_USE_MTRR | DRIVER_HAVE_IRQ |
+-	    DRIVER_IRQ_SHARED,
++	    DRIVER_IRQ_SHARED | DRIVER_IRQ_VBL,
+ 	.load = via_driver_load,
+ 	.unload = via_driver_unload,
+ 	.context_dtor = via_final_context,
+-	.get_vblank_counter = via_get_vblank_counter,
+-	.enable_vblank = via_enable_vblank,
+-	.disable_vblank = via_disable_vblank,
++	.vblank_wait = via_driver_vblank_wait,
+ 	.irq_preinstall = via_driver_irq_preinstall,
+ 	.irq_postinstall = via_driver_irq_postinstall,
+ 	.irq_uninstall = via_driver_irq_uninstall,
+diff --git a/drivers/char/drm/via_drv.h b/drivers/char/drm/via_drv.h
+index fe67030..2daae81 100644
+--- a/drivers/char/drm/via_drv.h
++++ b/drivers/char/drm/via_drv.h
+@@ -75,7 +75,6 @@ typedef struct drm_via_private {
+ 	struct timeval last_vblank;
+ 	int last_vblank_valid;
+ 	unsigned usec_per_vblank;
+-	atomic_t vbl_received;
+ 	drm_via_state_t hc_state;
+ 	char pci_buf[VIA_PCI_BUF_SIZE];
+ 	const uint32_t *fire_offsets[VIA_FIRE_BUF_SIZE];
+@@ -131,13 +130,11 @@ extern int via_init_context(struct drm_device * dev, int context);
+ extern int via_final_context(struct drm_device * dev, int context);
+ 
+ extern int via_do_cleanup_map(struct drm_device * dev);
+-extern u32 via_get_vblank_counter(struct drm_device *dev, int crtc);
+-extern int via_enable_vblank(struct drm_device *dev, int crtc);
+-extern void via_disable_vblank(struct drm_device *dev, int crtc);
++extern int via_driver_vblank_wait(struct drm_device * dev, unsigned int *sequence);
+ 
+ extern irqreturn_t via_driver_irq_handler(DRM_IRQ_ARGS);
+ extern void via_driver_irq_preinstall(struct drm_device * dev);
+-extern int via_driver_irq_postinstall(struct drm_device * dev);
++extern void via_driver_irq_postinstall(struct drm_device * dev);
+ extern void via_driver_irq_uninstall(struct drm_device * dev);
+ 
+ extern int via_dma_cleanup(struct drm_device * dev);
+diff --git a/drivers/char/drm/via_irq.c b/drivers/char/drm/via_irq.c
+index f1ab6fc..c6bb978 100644
+--- a/drivers/char/drm/via_irq.c
++++ b/drivers/char/drm/via_irq.c
+@@ -92,17 +92,8 @@ static int via_irqmap_unichrome[] = {-1, -1, -1, 0, -1, 1};
+ static unsigned time_diff(struct timeval *now, struct timeval *then)
+ {
+ 	return (now->tv_usec >= then->tv_usec) ?
+-		now->tv_usec - then->tv_usec :
+-		1000000 - (then->tv_usec - now->tv_usec);
+-}
+-
+-u32 via_get_vblank_counter(struct drm_device *dev, int crtc)
+-{
+-	drm_via_private_t *dev_priv = dev->dev_private;
+-	if (crtc != 0)
+-		return 0;
+-
+-	return atomic_read(&dev_priv->vbl_received);
++	    now->tv_usec - then->tv_usec :
++	    1000000 - (then->tv_usec - now->tv_usec);
+ }
+ 
+ irqreturn_t via_driver_irq_handler(DRM_IRQ_ARGS)
+@@ -117,8 +108,8 @@ irqreturn_t via_driver_irq_handler(DRM_IRQ_ARGS)
+ 
+ 	status = VIA_READ(VIA_REG_INTERRUPT);
+ 	if (status & VIA_IRQ_VBLANK_PENDING) {
+-		atomic_inc(&dev_priv->vbl_received);
+-		if (!(atomic_read(&dev_priv->vbl_received) & 0x0F)) {
++		atomic_inc(&dev->vbl_received);
++		if (!(atomic_read(&dev->vbl_received) & 0x0F)) {
+ 			do_gettimeofday(&cur_vblank);
+ 			if (dev_priv->last_vblank_valid) {
+ 				dev_priv->usec_per_vblank =
+@@ -128,11 +119,12 @@ irqreturn_t via_driver_irq_handler(DRM_IRQ_ARGS)
+ 			dev_priv->last_vblank = cur_vblank;
+ 			dev_priv->last_vblank_valid = 1;
+ 		}
+-		if (!(atomic_read(&dev_priv->vbl_received) & 0xFF)) {
++		if (!(atomic_read(&dev->vbl_received) & 0xFF)) {
+ 			DRM_DEBUG("US per vblank is: %u\n",
+ 				  dev_priv->usec_per_vblank);
+ 		}
+-		drm_handle_vblank(dev, 0);
++		DRM_WAKEUP(&dev->vbl_queue);
++		drm_vbl_send_signals(dev);
+ 		handled = 1;
+ 	}
+ 
+@@ -171,34 +163,31 @@ static __inline__ void viadrv_acknowledge_irqs(drm_via_private_t * dev_priv)
+ 	}
+ }
+ 
+-int via_enable_vblank(struct drm_device *dev, int crtc)
++int via_driver_vblank_wait(struct drm_device * dev, unsigned int *sequence)
+ {
+-	drm_via_private_t *dev_priv = dev->dev_private;
+-	u32 status;
++	drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private;
++	unsigned int cur_vblank;
++	int ret = 0;
+ 
+-	if (crtc != 0) {
+-		DRM_ERROR("%s:  bad crtc %d\n", __FUNCTION__, crtc);
++	DRM_DEBUG("\n");
++	if (!dev_priv) {
++		DRM_ERROR("called with no initialization\n");
+ 		return -EINVAL;
+ 	}
+ 
+-	status = VIA_READ(VIA_REG_INTERRUPT);
+-	VIA_WRITE(VIA_REG_INTERRUPT, status & VIA_IRQ_VBLANK_ENABLE);
++	viadrv_acknowledge_irqs(dev_priv);
+ 
+-	VIA_WRITE8(0x83d4, 0x11);
+-	VIA_WRITE8(0x83d5, VIA_READ8(0x83d5) | 0x30);
++	/* Assume that the user has missed the current sequence number
++	 * by about a day rather than she wants to wait for years
++	 * using vertical blanks...
++	 */
+ 
+-	return 0;
+-}
++	DRM_WAIT_ON(ret, dev->vbl_queue, 3 * DRM_HZ,
++		    (((cur_vblank = atomic_read(&dev->vbl_received)) -
++		      *sequence) <= (1 << 23)));
+ 
+-void via_disable_vblank(struct drm_device *dev, int crtc)
+-{
+-	drm_via_private_t *dev_priv = dev->dev_private;
+-
+-	VIA_WRITE8(0x83d4, 0x11);
+-	VIA_WRITE8(0x83d5, VIA_READ8(0x83d5) & ~0x30);
+-
+-	if (crtc != 0)
+-		DRM_ERROR("%s:  bad crtc %d\n", __FUNCTION__, crtc);
++	*sequence = cur_vblank;
++	return ret;
+ }
+ 
+ static int
+@@ -303,25 +292,23 @@ void via_driver_irq_preinstall(struct drm_device * dev)
+ 	}
+ }
+ 
+-int via_driver_irq_postinstall(struct drm_device * dev)
++void via_driver_irq_postinstall(struct drm_device * dev)
+ {
+ 	drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private;
+ 	u32 status;
+ 
+-	DRM_DEBUG("via_driver_irq_postinstall\n");
+-	if (!dev_priv)
+-		return -EINVAL;
++	DRM_DEBUG("\n");
++	if (dev_priv) {
++		status = VIA_READ(VIA_REG_INTERRUPT);
++		VIA_WRITE(VIA_REG_INTERRUPT, status | VIA_IRQ_GLOBAL
++			  | dev_priv->irq_enable_mask);
+ 
+-	drm_vblank_init(dev, 1);
+-	status = VIA_READ(VIA_REG_INTERRUPT);
+-	VIA_WRITE(VIA_REG_INTERRUPT, status | VIA_IRQ_GLOBAL
+-		  | dev_priv->irq_enable_mask);
++		/* Some magic, oh for some data sheets ! */
+ 
+-	/* Some magic, oh for some data sheets ! */
+-	VIA_WRITE8(0x83d4, 0x11);
+-	VIA_WRITE8(0x83d5, VIA_READ8(0x83d5) | 0x30);
++		VIA_WRITE8(0x83d4, 0x11);
++		VIA_WRITE8(0x83d5, VIA_READ8(0x83d5) | 0x30);
+ 
+-	return 0;
++	}
+ }
+ 
+ void via_driver_irq_uninstall(struct drm_device * dev)
+diff --git a/drivers/char/sysrq.c b/drivers/char/sysrq.c
+index 9e9bad8..dbce126 100644
+--- a/drivers/char/sysrq.c
++++ b/drivers/char/sysrq.c
+@@ -402,6 +402,7 @@ static struct sysrq_key_op *sysrq_key_table[36] = {
+ 	&sysrq_showstate_blocked_op,	/* w */
+ 	/* x: May be registered on ppc/powerpc for xmon */
+ 	NULL,				/* x */
++	/* y: May be registered on sparc64 for global register dump */
+ 	NULL,				/* y */
+ 	NULL				/* z */
+ };
+diff --git a/drivers/dma/iop-adma.c b/drivers/dma/iop-adma.c
+index 762b729..0ec0f43 100644
+--- a/drivers/dma/iop-adma.c
++++ b/drivers/dma/iop-adma.c
+@@ -821,10 +821,10 @@ static int __devinit iop_adma_memcpy_self_test(struct iop_adma_device *device)
+ 
+ 	dev_dbg(device->common.dev, "%s\n", __func__);
+ 
+-	src = kzalloc(sizeof(u8) * IOP_ADMA_TEST_SIZE, GFP_KERNEL);
++	src = kmalloc(IOP_ADMA_TEST_SIZE, GFP_KERNEL);
+ 	if (!src)
+ 		return -ENOMEM;
+-	dest = kzalloc(sizeof(u8) * IOP_ADMA_TEST_SIZE, GFP_KERNEL);
++	dest = kzalloc(IOP_ADMA_TEST_SIZE, GFP_KERNEL);
+ 	if (!dest) {
+ 		kfree(src);
+ 		return -ENOMEM;
+@@ -834,8 +834,6 @@ static int __devinit iop_adma_memcpy_self_test(struct iop_adma_device *device)
+ 	for (i = 0; i < IOP_ADMA_TEST_SIZE; i++)
+ 		((u8 *) src)[i] = (u8)i;
+ 
+-	memset(dest, 0, IOP_ADMA_TEST_SIZE);
+-
+ 	/* Start copy, using first DMA channel */
+ 	dma_chan = container_of(device->common.channels.next,
+ 				struct dma_chan,
+diff --git a/drivers/firewire/fw-cdev.c b/drivers/firewire/fw-cdev.c
+index 4a54192..dda1401 100644
+--- a/drivers/firewire/fw-cdev.c
++++ b/drivers/firewire/fw-cdev.c
+@@ -113,6 +113,11 @@ static int fw_device_op_open(struct inode *inode, struct file *file)
+ 	if (device == NULL)
+ 		return -ENODEV;
+ 
++	if (fw_device_is_shutdown(device)) {
++		fw_device_put(device);
++		return -ENODEV;
++	}
++
+ 	client = kzalloc(sizeof(*client), GFP_KERNEL);
+ 	if (client == NULL) {
+ 		fw_device_put(device);
+@@ -901,6 +906,9 @@ fw_device_op_ioctl(struct file *file,
+ {
+ 	struct client *client = file->private_data;
+ 
++	if (fw_device_is_shutdown(client->device))
++		return -ENODEV;
++
+ 	return dispatch_ioctl(client, cmd, (void __user *) arg);
+ }
+ 
+@@ -911,6 +919,9 @@ fw_device_op_compat_ioctl(struct file *file,
+ {
+ 	struct client *client = file->private_data;
+ 
++	if (fw_device_is_shutdown(client->device))
++		return -ENODEV;
++
+ 	return dispatch_ioctl(client, cmd, compat_ptr(arg));
+ }
+ #endif
+@@ -922,6 +933,9 @@ static int fw_device_op_mmap(struct file *file, struct vm_area_struct *vma)
+ 	unsigned long size;
+ 	int page_count, retval;
+ 
++	if (fw_device_is_shutdown(client->device))
++		return -ENODEV;
++
+ 	/* FIXME: We could support multiple buffers, but we don't. */
+ 	if (client->buffer.pages != NULL)
+ 		return -EBUSY;
+diff --git a/drivers/hid/hid-debug.c b/drivers/hid/hid-debug.c
+index f88714b..47ac1a7 100644
+--- a/drivers/hid/hid-debug.c
++++ b/drivers/hid/hid-debug.c
+@@ -1,6 +1,4 @@
+ /*
+- * $Id: hid-debug.h,v 1.8 2001/09/25 09:37:57 vojtech Exp $
+- *
+  *  (c) 1999 Andreas Gal		<gal at cs.uni-magdeburg.de>
+  *  (c) 2000-2001 Vojtech Pavlik	<vojtech at ucw.cz>
+  *  (c) 2007 Jiri Kosina
+diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c
+index c3eb3f1..5c52a20 100644
+--- a/drivers/hid/hid-input.c
++++ b/drivers/hid/hid-input.c
+@@ -1,6 +1,4 @@
+ /*
+- * $Id: hid-input.c,v 1.2 2002/04/23 00:59:25 rdamazio Exp $
+- *
+  *  Copyright (c) 2000-2001 Vojtech Pavlik
+  *  Copyright (c) 2006-2007 Jiri Kosina
+  *
+@@ -218,8 +216,9 @@ int hidinput_apple_event(struct hid_device *hid, struct input_dev *input,
+ 			}
+ 		}
+ 
+-		if (test_bit(usage->code, hid->pb_pressed_numlock) ||
+-				test_bit(LED_NUML, input->led)) {
++		if (hid->quirks & HID_QUIRK_APPLE_NUMLOCK_EMULATION && (
++				test_bit(usage->code, hid->pb_pressed_numlock) ||
++				test_bit(LED_NUML, input->led))) {
+ 			trans = find_translation(powerbook_numlock_keys, usage->code);
+ 
+ 			if (trans) {
+diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c
+index d3f8d91..1df832a 100644
+--- a/drivers/hid/usbhid/hid-quirks.c
++++ b/drivers/hid/usbhid/hid-quirks.c
+@@ -325,6 +325,10 @@
+ #define USB_DEVICE_ID_MGE_UPS		0xffff
+ #define USB_DEVICE_ID_MGE_UPS1		0x0001
+ 
++#define USB_VENDOR_ID_MICROCHIP		0x04d8
++#define USB_DEVICE_ID_PICKIT1		0x0032
++#define USB_DEVICE_ID_PICKIT2		0x0033
++
+ #define USB_VENDOR_ID_MICROSOFT		0x045e
+ #define USB_DEVICE_ID_SIDEWINDER_GV	0x003b
+ #define USB_DEVICE_ID_WIRELESS_OPTICAL_DESKTOP_3_0 0x009d
+@@ -371,6 +375,9 @@
+ #define USB_VENDOR_ID_SONY			0x054c
+ #define USB_DEVICE_ID_SONY_PS3_CONTROLLER	0x0268
+ 
++#define USB_VENDOR_ID_SOUNDGRAPH	0x15c2
++#define USB_DEVICE_ID_SOUNDGRAPH_IMON_LCD	0x0038
++
+ #define USB_VENDOR_ID_SUN		0x0430
+ #define USB_DEVICE_ID_RARITAN_KVM_DONGLE	0xcdab
+ 
+@@ -567,6 +574,7 @@ static const struct hid_blacklist {
+ 	{ USB_VENDOR_ID_PANJIT, 0x0002, HID_QUIRK_IGNORE },
+ 	{ USB_VENDOR_ID_PANJIT, 0x0003, HID_QUIRK_IGNORE },
+ 	{ USB_VENDOR_ID_PANJIT, 0x0004, HID_QUIRK_IGNORE },
++	{ USB_VENDOR_ID_SOUNDGRAPH, USB_DEVICE_ID_SOUNDGRAPH_IMON_LCD, HID_QUIRK_IGNORE },
+ 	{ USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_LABPRO, HID_QUIRK_IGNORE },
+ 	{ USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_GOTEMP, HID_QUIRK_IGNORE },
+ 	{ USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_SKIP, HID_QUIRK_IGNORE },
+@@ -580,6 +588,9 @@ static const struct hid_blacklist {
+ 	{ USB_VENDOR_ID_ACECAD, USB_DEVICE_ID_ACECAD_FLAIR, HID_QUIRK_IGNORE },
+ 	{ USB_VENDOR_ID_ACECAD, USB_DEVICE_ID_ACECAD_302, HID_QUIRK_IGNORE },
+ 
++	{ USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICKIT1, HID_QUIRK_IGNORE },
++	{ USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICKIT2, HID_QUIRK_IGNORE },
++
+ 	{ USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_ELITE_KBD, HID_QUIRK_LOGITECH_IGNORE_DOUBLED_WHEEL | HID_QUIRK_LOGITECH_EXPANDED_KEYMAP },
+ 	{ USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_CORDLESS_DESKTOP_LX500, HID_QUIRK_LOGITECH_IGNORE_DOUBLED_WHEEL | HID_QUIRK_LOGITECH_EXPANDED_KEYMAP },
+ 
+@@ -611,28 +622,28 @@ static const struct hid_blacklist {
+ 
+ 	{ USB_VENDOR_ID_WISEGROUP_LTD, USB_DEVICE_ID_SMARTJOY_DUAL_PLUS, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT },
+ 
+-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
+-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ISO, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
+-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ANSI, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
+-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ISO, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_APPLE_ISO_KEYBOARD},
+-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_JIS, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
+-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ANSI, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
+-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ISO, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_APPLE_ISO_KEYBOARD},
+-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_JIS, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
+-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ANSI, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
+-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ISO, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_APPLE_ISO_KEYBOARD},
+-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_JIS, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
++	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
++	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ISO, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
++	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ANSI, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
++	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ISO, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_APPLE_ISO_KEYBOARD},
++	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_JIS, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
++	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ANSI, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
++	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ISO, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_APPLE_ISO_KEYBOARD},
++	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_JIS, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
++	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ANSI, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
++	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ISO, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_APPLE_ISO_KEYBOARD},
++	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_JIS, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
+ 	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_ANSI, HID_QUIRK_APPLE_HAS_FN },
+ 	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_ISO, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_APPLE_ISO_KEYBOARD },
+ 	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_JIS, HID_QUIRK_APPLE_HAS_FN },
+-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ANSI, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
+-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ISO, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
+-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
+-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI, HID_QUIRK_APPLE_HAS_FN },
+-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_APPLE_ISO_KEYBOARD },
+-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS, HID_QUIRK_APPLE_HAS_FN },
+-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
+-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
++	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ANSI, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
++	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ISO, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
++	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
++	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN },
++	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_APPLE_ISO_KEYBOARD },
++	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN },
++	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
++	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
+ 
+ 	{ USB_VENDOR_ID_DELL, USB_DEVICE_ID_DELL_W7658, HID_QUIRK_RESET_LEDS },
+ 	{ USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_KBD, HID_QUIRK_RESET_LEDS },
+diff --git a/drivers/hid/usbhid/usbkbd.c b/drivers/hid/usbhid/usbkbd.c
+index 5d9dbb4..3cd46d2 100644
+--- a/drivers/hid/usbhid/usbkbd.c
++++ b/drivers/hid/usbhid/usbkbd.c
+@@ -1,6 +1,4 @@
+ /*
+- * $Id: usbkbd.c,v 1.27 2001/12/27 10:37:41 vojtech Exp $
+- *
+  *  Copyright (c) 1999-2001 Vojtech Pavlik
+  *
+  *  USB HIDBP Keyboard support
+diff --git a/drivers/hid/usbhid/usbmouse.c b/drivers/hid/usbhid/usbmouse.c
+index df0d96d..703e9d0 100644
+--- a/drivers/hid/usbhid/usbmouse.c
++++ b/drivers/hid/usbhid/usbmouse.c
+@@ -1,6 +1,4 @@
+ /*
+- * $Id: usbmouse.c,v 1.15 2001/12/27 10:37:41 vojtech Exp $
+- *
+  *  Copyright (c) 1999-2001 Vojtech Pavlik
+  *
+  *  USB HIDBP Mouse support
+diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c
+index 34b0d4f..655ec7e 100644
+--- a/drivers/ide/ide-probe.c
++++ b/drivers/ide/ide-probe.c
+@@ -648,13 +648,12 @@ static int ide_register_port(ide_hwif_t *hwif)
+ 
+ 	get_device(&hwif->gendev);
+ 
+-	hwif->portdev = device_create(ide_port_class, &hwif->gendev,
+-				      MKDEV(0, 0), hwif->name);
++	hwif->portdev = device_create_drvdata(ide_port_class, &hwif->gendev,
++					      MKDEV(0, 0), hwif, hwif->name);
+ 	if (IS_ERR(hwif->portdev)) {
+ 		ret = PTR_ERR(hwif->portdev);
+ 		device_unregister(&hwif->gendev);
+ 	}
+-	dev_set_drvdata(hwif->portdev, hwif);
+ out:
+ 	return ret;
+ }
+diff --git a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c
+index 16b9d0a..a5ceff2 100644
+--- a/drivers/ieee1394/sbp2.c
++++ b/drivers/ieee1394/sbp2.c
+@@ -1539,15 +1539,13 @@ static void sbp2_prep_command_orb_sg(struct sbp2_command_orb *orb,
+ 
+ static void sbp2_create_command_orb(struct sbp2_lu *lu,
+ 				    struct sbp2_command_info *cmd,
+-				    unchar *scsi_cmd,
+-				    unsigned int scsi_use_sg,
+-				    unsigned int scsi_request_bufflen,
+-				    struct scatterlist *sg,
+-				    enum dma_data_direction dma_dir)
++				    struct scsi_cmnd *SCpnt)
+ {
+ 	struct sbp2_fwhost_info *hi = lu->hi;
+ 	struct sbp2_command_orb *orb = &cmd->command_orb;
+ 	u32 orb_direction;
++	unsigned int scsi_request_bufflen = scsi_bufflen(SCpnt);
++	enum dma_data_direction dma_dir = SCpnt->sc_data_direction;
+ 
+ 	/*
+ 	 * Set-up our command ORB.
+@@ -1580,13 +1578,14 @@ static void sbp2_create_command_orb(struct sbp2_lu *lu,
+ 		orb->data_descriptor_lo = 0x0;
+ 		orb->misc |= ORB_SET_DIRECTION(1);
+ 	} else
+-		sbp2_prep_command_orb_sg(orb, hi, cmd, scsi_use_sg, sg,
++		sbp2_prep_command_orb_sg(orb, hi, cmd, scsi_sg_count(SCpnt),
++					 scsi_sglist(SCpnt),
+ 					 orb_direction, dma_dir);
+ 
+ 	sbp2util_cpu_to_be32_buffer(orb, sizeof(*orb));
+ 
+-	memset(orb->cdb, 0, 12);
+-	memcpy(orb->cdb, scsi_cmd, COMMAND_SIZE(*scsi_cmd));
++	memset(orb->cdb, 0, sizeof(orb->cdb));
++	memcpy(orb->cdb, SCpnt->cmnd, SCpnt->cmd_len);
+ }
+ 
+ static void sbp2_link_orb_command(struct sbp2_lu *lu,
+@@ -1669,16 +1668,13 @@ static void sbp2_link_orb_command(struct sbp2_lu *lu,
+ static int sbp2_send_command(struct sbp2_lu *lu, struct scsi_cmnd *SCpnt,
+ 			     void (*done)(struct scsi_cmnd *))
+ {
+-	unchar *scsi_cmd = (unchar *)SCpnt->cmnd;
+ 	struct sbp2_command_info *cmd;
+ 
+ 	cmd = sbp2util_allocate_command_orb(lu, SCpnt, done);
+ 	if (!cmd)
+ 		return -EIO;
+ 
+-	sbp2_create_command_orb(lu, cmd, scsi_cmd, scsi_sg_count(SCpnt),
+-				scsi_bufflen(SCpnt), scsi_sglist(SCpnt),
+-				SCpnt->sc_data_direction);
++	sbp2_create_command_orb(lu, cmd, SCpnt);
+ 	sbp2_link_orb_command(lu, cmd);
+ 
+ 	return 0;
+diff --git a/drivers/infiniband/core/user_mad.c b/drivers/infiniband/core/user_mad.c
+index 3aa2db5..840ede9 100644
+--- a/drivers/infiniband/core/user_mad.c
++++ b/drivers/infiniband/core/user_mad.c
+@@ -1005,8 +1005,9 @@ static int ib_umad_init_port(struct ib_device *device, int port_num,
+ 	if (cdev_add(port->cdev, base_dev + port->dev_num, 1))
+ 		goto err_cdev;
+ 
+-	port->dev = device_create(umad_class, device->dma_device,
+-				  port->cdev->dev, "umad%d", port->dev_num);
++	port->dev = device_create_drvdata(umad_class, device->dma_device,
++					  port->cdev->dev, port,
++					  "umad%d", port->dev_num);
+ 	if (IS_ERR(port->dev))
+ 		goto err_cdev;
+ 
+@@ -1024,15 +1025,12 @@ static int ib_umad_init_port(struct ib_device *device, int port_num,
+ 	if (cdev_add(port->sm_cdev, base_dev + port->dev_num + IB_UMAD_MAX_PORTS, 1))
+ 		goto err_sm_cdev;
+ 
+-	port->sm_dev = device_create(umad_class, device->dma_device,
+-				     port->sm_cdev->dev,
+-				     "issm%d", port->dev_num);
++	port->sm_dev = device_create_drvdata(umad_class, device->dma_device,
++					     port->sm_cdev->dev, port,
++					     "issm%d", port->dev_num);
+ 	if (IS_ERR(port->sm_dev))
+ 		goto err_sm_cdev;
+ 
+-	dev_set_drvdata(port->dev,    port);
+-	dev_set_drvdata(port->sm_dev, port);
+-
+ 	if (device_create_file(port->sm_dev, &dev_attr_ibdev))
+ 		goto err_sm_dev;
+ 	if (device_create_file(port->sm_dev, &dev_attr_port))
+diff --git a/drivers/infiniband/core/uverbs_main.c b/drivers/infiniband/core/uverbs_main.c
+index cc1afa2..f806da1 100644
+--- a/drivers/infiniband/core/uverbs_main.c
++++ b/drivers/infiniband/core/uverbs_main.c
+@@ -755,14 +755,15 @@ static void ib_uverbs_add_one(struct ib_device *device)
+ 	if (cdev_add(uverbs_dev->cdev, IB_UVERBS_BASE_DEV + uverbs_dev->devnum, 1))
+ 		goto err_cdev;
+ 
+-	uverbs_dev->dev = device_create(uverbs_class, device->dma_device,
+-					uverbs_dev->cdev->dev,
+-					"uverbs%d", uverbs_dev->devnum);
++	uverbs_dev->dev = device_create_drvdata(uverbs_class,
++						device->dma_device,
++						uverbs_dev->cdev->dev,
++						uverbs_dev,
++						"uverbs%d",
++						uverbs_dev->devnum);
+ 	if (IS_ERR(uverbs_dev->dev))
+ 		goto err_cdev;
+ 
+-	dev_set_drvdata(uverbs_dev->dev, uverbs_dev);
+-
+ 	if (device_create_file(uverbs_dev->dev, &dev_attr_ibdev))
+ 		goto err_class;
+ 	if (device_create_file(uverbs_dev->dev, &dev_attr_abi_version))
+diff --git a/drivers/isdn/capi/capiutil.c b/drivers/isdn/capi/capiutil.c
+index ebef4ce..29419a8 100644
+--- a/drivers/isdn/capi/capiutil.c
++++ b/drivers/isdn/capi/capiutil.c
+@@ -948,17 +948,17 @@ int __init cdebug_init(void)
+ {
+ 	g_cmsg= kmalloc(sizeof(_cmsg), GFP_KERNEL);
+ 	if (!g_cmsg)
+-		return ENOMEM;
++		return -ENOMEM;
+ 	g_debbuf = kmalloc(sizeof(_cdebbuf), GFP_KERNEL);
+ 	if (!g_debbuf) {
+ 		kfree(g_cmsg);
+-		return ENOMEM;
++		return -ENOMEM;
+ 	}
+ 	g_debbuf->buf = kmalloc(CDEBUG_GSIZE, GFP_KERNEL);
+ 	if (!g_debbuf->buf) {
+ 		kfree(g_cmsg);
+ 		kfree(g_debbuf);
+-		return ENOMEM;;
++		return -ENOMEM;;
+ 	}
+ 	g_debbuf->size = CDEBUG_GSIZE;
+ 	g_debbuf->buf[0] = 0;
+diff --git a/drivers/isdn/hysdn/Kconfig b/drivers/isdn/hysdn/Kconfig
+index c6d8a70..c9e4231 100644
+--- a/drivers/isdn/hysdn/Kconfig
++++ b/drivers/isdn/hysdn/Kconfig
+@@ -3,7 +3,7 @@
+ #
+ config HYSDN
+ 	tristate "Hypercope HYSDN cards (Champ, Ergo, Metro) support (module only)"
+-	depends on m && PROC_FS && PCI && BROKEN_ON_SMP
++	depends on m && PROC_FS && PCI
+ 	help
+ 	  Say Y here if you have one of Hypercope's active PCI ISDN cards
+ 	  Champ, Ergo and Metro. You will then get a module called hysdn.
+diff --git a/drivers/isdn/hysdn/boardergo.c b/drivers/isdn/hysdn/boardergo.c
+index 6cdbad3..3eb096f 100644
+--- a/drivers/isdn/hysdn/boardergo.c
++++ b/drivers/isdn/hysdn/boardergo.c
+@@ -64,10 +64,11 @@ ergo_interrupt(int intno, void *dev_id)
+ }				/* ergo_interrupt */
+ 
+ /******************************************************************************/
+-/* ergo_irq_bh is the function called by the immediate kernel task list after */
+-/* being activated with queue_task and no interrupts active. This task is the */
+-/* only one handling data transfer from or to the card after booting. The task */
+-/* may be queued from everywhere (interrupts included).                       */
++/* ergo_irq_bh will be called as part of the kernel clearing its shared work  */
++/* queue sometime after a call to schedule_work has been made passing our     */
++/* work_struct. This task is the only one handling data transfer from or to   */
++/* the card after booting. The task may be queued from everywhere             */
++/* (interrupts included).                                                     */
+ /******************************************************************************/
+ static void
+ ergo_irq_bh(struct work_struct *ugli_api)
+@@ -90,7 +91,6 @@ ergo_irq_bh(struct work_struct *ugli_api)
+ 	card->hw_lock = 1;	/* we now lock the hardware */
+ 
+ 	do {
+-		sti();		/* reenable other ints */
+ 		again = 0;	/* assume loop not to be repeated */
+ 
+ 		if (!dpr->ToHyFlag) {
+@@ -110,7 +110,6 @@ ergo_irq_bh(struct work_struct *ugli_api)
+ 				again = 1;	/* restart loop */
+ 			}
+ 		}		/* a message has arrived for us */
+-		cli();		/* no further ints */
+ 		if (again) {
+ 			dpr->ToHyInt = 1;
+ 			dpr->ToPcInt = 1;	/* interrupt to E1 for all cards */
+@@ -242,7 +241,6 @@ ergo_writebootimg(struct HYSDN_CARD *card, unsigned char *buf,
+ 		byteout(card->iobase + PCI9050_USER_IO, PCI9050_E1_RUN);	/* start E1 processor */
+ 		/* the interrupts are still masked */
+ 
+-		sti();
+ 		msleep_interruptible(20);		/* Timeout 20ms */
+ 
+ 		if (((tDpramBootSpooler *) card->dpram)->Len != DPRAM_SPOOLER_DATA_SIZE) {
+@@ -276,7 +274,6 @@ ergo_writebootseq(struct HYSDN_CARD *card, unsigned char *buf, int len)
+ 	dst = sp->Data;		/* point to data in spool structure */
+ 	buflen = sp->Len;	/* maximum len of spooled data */
+ 	wr_mirror = sp->WrPtr;	/* only once read */
+-	sti();
+ 
+ 	/* try until all bytes written or error */
+ 	i = 0x1000;		/* timeout value */
+@@ -380,7 +377,6 @@ ergo_waitpofready(struct HYSDN_CARD *card)
+ #endif /* CONFIG_HYSDN_CAPI */
+ 			return (0);	/* success */
+ 		}		/* data has arrived */
+-		sti();
+ 		msleep_interruptible(50);		/* Timeout 50ms */
+ 	}			/* wait until timeout */
+ 
+diff --git a/drivers/leds/led-class.c b/drivers/leds/led-class.c
+index b3c54be..559a408 100644
+--- a/drivers/leds/led-class.c
++++ b/drivers/leds/led-class.c
+@@ -103,13 +103,11 @@ int led_classdev_register(struct device *parent, struct led_classdev *led_cdev)
+ {
+ 	int rc;
+ 
+-	led_cdev->dev = device_create(leds_class, parent, 0, "%s",
+-					    led_cdev->name);
++	led_cdev->dev = device_create_drvdata(leds_class, parent, 0, led_cdev,
++					      "%s", led_cdev->name);
+ 	if (IS_ERR(led_cdev->dev))
+ 		return PTR_ERR(led_cdev->dev);
+ 
+-	dev_set_drvdata(led_cdev->dev, led_cdev);
+-
+ 	/* register the attributes */
+ 	rc = device_create_file(led_cdev->dev, &dev_attr_brightness);
+ 	if (rc)
+diff --git a/drivers/media/video/bt8xx/bttv-driver.c b/drivers/media/video/bt8xx/bttv-driver.c
+index 2ca3e9c..0165aac 100644
+--- a/drivers/media/video/bt8xx/bttv-driver.c
++++ b/drivers/media/video/bt8xx/bttv-driver.c
+@@ -2613,7 +2613,7 @@ static int vidiocgmbuf(struct file *file, void *priv, struct video_mbuf *mbuf)
+ 	struct bttv_fh *fh = priv;
+ 
+ 	mutex_lock(&fh->cap.vb_lock);
+-	retval = videobuf_mmap_setup(&fh->cap, gbuffers, gbufsize,
++	retval = __videobuf_mmap_setup(&fh->cap, gbuffers, gbufsize,
+ 				     V4L2_MEMORY_MMAP);
+ 	if (retval < 0) {
+ 		mutex_unlock(&fh->cap.vb_lock);
+diff --git a/drivers/media/video/videobuf-core.c b/drivers/media/video/videobuf-core.c
+index 982f446..0a88c44 100644
+--- a/drivers/media/video/videobuf-core.c
++++ b/drivers/media/video/videobuf-core.c
+@@ -331,7 +331,7 @@ int videobuf_mmap_free(struct videobuf_queue *q)
+ }
+ 
+ /* Locking: Caller holds q->vb_lock */
+-static int __videobuf_mmap_setup(struct videobuf_queue *q,
++int __videobuf_mmap_setup(struct videobuf_queue *q,
+ 			unsigned int bcount, unsigned int bsize,
+ 			enum v4l2_memory memory)
+ {
+@@ -1129,6 +1129,7 @@ EXPORT_SYMBOL_GPL(videobuf_read_stream);
+ EXPORT_SYMBOL_GPL(videobuf_read_one);
+ EXPORT_SYMBOL_GPL(videobuf_poll_stream);
+ 
++EXPORT_SYMBOL_GPL(__videobuf_mmap_setup);
+ EXPORT_SYMBOL_GPL(videobuf_mmap_setup);
+ EXPORT_SYMBOL_GPL(videobuf_mmap_free);
+ EXPORT_SYMBOL_GPL(videobuf_mmap_mapper);
+diff --git a/drivers/mmc/card/Kconfig b/drivers/mmc/card/Kconfig
+index aa8a4e4..dd0f398 100644
+--- a/drivers/mmc/card/Kconfig
++++ b/drivers/mmc/card/Kconfig
+@@ -39,3 +39,15 @@ config SDIO_UART
+ 	  SDIO function driver for SDIO cards that implements the UART
+ 	  class, as well as the GPS class which appears like a UART.
+ 
++config MMC_TEST
++	tristate "MMC host test driver"
++	default n
++	help
++	  Development driver that performs a series of reads and writes
++	  to a memory card in order to expose certain well known bugs
++	  in host controllers. The tests are executed by writing to the
++	  "test" file in sysfs under each card. Note that whatever is
++	  on your card will be overwritten by these tests.
++
++	  This driver is only of interest to those developing or
++	  testing a host driver. Most people should say N here.
+diff --git a/drivers/mmc/card/Makefile b/drivers/mmc/card/Makefile
+index fc5a784..0d40751 100644
+--- a/drivers/mmc/card/Makefile
++++ b/drivers/mmc/card/Makefile
+@@ -8,6 +8,7 @@ endif
+ 
+ obj-$(CONFIG_MMC_BLOCK)		+= mmc_block.o
+ mmc_block-objs			:= block.o queue.o
++obj-$(CONFIG_MMC_TEST)		+= mmc_test.o
+ 
+ obj-$(CONFIG_SDIO_UART)		+= sdio_uart.o
+ 
+diff --git a/drivers/mmc/card/mmc_test.c b/drivers/mmc/card/mmc_test.c
+new file mode 100644
+index 0000000..ffadee5
+--- /dev/null
++++ b/drivers/mmc/card/mmc_test.c
+@@ -0,0 +1,892 @@
++/*
++ *  linux/drivers/mmc/card/mmc_test.c
++ *
++ *  Copyright 2007 Pierre Ossman
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or (at
++ * your option) any later version.
++ */
++
++#include <linux/mmc/core.h>
++#include <linux/mmc/card.h>
++#include <linux/mmc/host.h>
++#include <linux/mmc/mmc.h>
++
++#include <linux/scatterlist.h>
++
++#define RESULT_OK		0
++#define RESULT_FAIL		1
++#define RESULT_UNSUP_HOST	2
++#define RESULT_UNSUP_CARD	3
++
++#define BUFFER_SIZE	(PAGE_SIZE * 4)
++
++struct mmc_test_card {
++	struct mmc_card	*card;
++
++	u8		*buffer;
++};
++
++/*******************************************************************/
++/*  Helper functions                                               */
++/*******************************************************************/
++
++static int mmc_test_set_blksize(struct mmc_test_card *test, unsigned size)
++{
++	struct mmc_command cmd;
++	int ret;
++
++	cmd.opcode = MMC_SET_BLOCKLEN;
++	cmd.arg = size;
++	cmd.flags = MMC_RSP_R1 | MMC_CMD_AC;
++	ret = mmc_wait_for_cmd(test->card->host, &cmd, 0);
++	if (ret)
++		return ret;
++
++	return 0;
++}
++
++static int __mmc_test_transfer(struct mmc_test_card *test, int write,
++	unsigned broken_xfer, u8 *buffer, unsigned addr,
++	unsigned blocks, unsigned blksz)
++{
++	int ret, busy;
++
++	struct mmc_request mrq;
++	struct mmc_command cmd;
++	struct mmc_command stop;
++	struct mmc_data data;
++
++	struct scatterlist sg;
++
++	memset(&mrq, 0, sizeof(struct mmc_request));
++
++	mrq.cmd = &cmd;
++	mrq.data = &data;
++
++	memset(&cmd, 0, sizeof(struct mmc_command));
++
++	if (broken_xfer) {
++		if (blocks > 1) {
++			cmd.opcode = write ?
++				MMC_WRITE_BLOCK : MMC_READ_SINGLE_BLOCK;
++		} else {
++			cmd.opcode = MMC_SEND_STATUS;
++		}
++	} else {
++		if (blocks > 1) {
++			cmd.opcode = write ?
++				MMC_WRITE_MULTIPLE_BLOCK : MMC_READ_MULTIPLE_BLOCK;
++		} else {
++			cmd.opcode = write ?
++				MMC_WRITE_BLOCK : MMC_READ_SINGLE_BLOCK;
++		}
++	}
++
++	if (broken_xfer && blocks == 1)
++		cmd.arg = test->card->rca << 16;
++	else
++		cmd.arg = addr;
++	cmd.flags = MMC_RSP_R1 | MMC_CMD_ADTC;
++
++	memset(&stop, 0, sizeof(struct mmc_command));
++
++	if (!broken_xfer && (blocks > 1)) {
++		stop.opcode = MMC_STOP_TRANSMISSION;
++		stop.arg = 0;
++		stop.flags = MMC_RSP_R1B | MMC_CMD_AC;
++
++		mrq.stop = &stop;
++	}
++
++	memset(&data, 0, sizeof(struct mmc_data));
++
++	data.blksz = blksz;
++	data.blocks = blocks;
++	data.flags = write ? MMC_DATA_WRITE : MMC_DATA_READ;
++	data.sg = &sg;
++	data.sg_len = 1;
++
++	sg_init_one(&sg, buffer, blocks * blksz);
++
++	mmc_set_data_timeout(&data, test->card);
++
++	mmc_wait_for_req(test->card->host, &mrq);
++
++	ret = 0;
++
++	if (broken_xfer) {
++		if (!ret && cmd.error)
++			ret = cmd.error;
++		if (!ret && data.error == 0)
++			ret = RESULT_FAIL;
++		if (!ret && data.error != -ETIMEDOUT)
++			ret = data.error;
++		if (!ret && stop.error)
++			ret = stop.error;
++		if (blocks > 1) {
++			if (!ret && data.bytes_xfered > blksz)
++				ret = RESULT_FAIL;
++		} else {
++			if (!ret && data.bytes_xfered > 0)
++				ret = RESULT_FAIL;
++		}
++	} else {
++		if (!ret && cmd.error)
++			ret = cmd.error;
++		if (!ret && data.error)
++			ret = data.error;
++		if (!ret && stop.error)
++			ret = stop.error;
++		if (!ret && data.bytes_xfered != blocks * blksz)
++			ret = RESULT_FAIL;
++	}
++
++	if (ret == -EINVAL)
++		ret = RESULT_UNSUP_HOST;
++
++	busy = 0;
++	do {
++		int ret2;
++
++		memset(&cmd, 0, sizeof(struct mmc_command));
++
++		cmd.opcode = MMC_SEND_STATUS;
++		cmd.arg = test->card->rca << 16;
++		cmd.flags = MMC_RSP_R1 | MMC_CMD_AC;
++
++		ret2 = mmc_wait_for_cmd(test->card->host, &cmd, 0);
++		if (ret2)
++			break;
++
++		if (!busy && !(cmd.resp[0] & R1_READY_FOR_DATA)) {
++			busy = 1;
++			printk(KERN_INFO "%s: Warning: Host did not "
++				"wait for busy state to end.\n",
++				mmc_hostname(test->card->host));
++		}
++	} while (!(cmd.resp[0] & R1_READY_FOR_DATA));
++
++	return ret;
++}
++
++static int mmc_test_transfer(struct mmc_test_card *test, int write,
++	u8 *buffer, unsigned addr, unsigned blocks, unsigned blksz)
++{
++	return __mmc_test_transfer(test, write, 0, buffer,
++			addr, blocks, blksz);
++}
++
++static int mmc_test_prepare_verify(struct mmc_test_card *test, int write)
++{
++	int ret, i;
++
++	ret = mmc_test_set_blksize(test, 512);
++	if (ret)
++		return ret;
++
++	if (write)
++		memset(test->buffer, 0xDF, BUFFER_SIZE);
++	else {
++		for (i = 0;i < BUFFER_SIZE;i++)
++			test->buffer[i] = i;
++	}
++
++	for (i = 0;i < BUFFER_SIZE / 512;i++) {
++		ret = mmc_test_transfer(test, 1, test->buffer + i * 512,
++			i * 512, 1, 512);
++		if (ret)
++			return ret;
++	}
++
++	return 0;
++}
++
++static int mmc_test_prepare_verify_write(struct mmc_test_card *test)
++{
++	return mmc_test_prepare_verify(test, 1);
++}
++
++static int mmc_test_prepare_verify_read(struct mmc_test_card *test)
++{
++	return mmc_test_prepare_verify(test, 0);
++}
++
++static int mmc_test_verified_transfer(struct mmc_test_card *test, int write,
++	u8 *buffer, unsigned addr, unsigned blocks, unsigned blksz)
++{
++	int ret, i, sectors;
++
++	/*
++	 * It is assumed that the above preparation has been done.
++	 */
++
++	memset(test->buffer, 0, BUFFER_SIZE);
++
++	if (write) {
++		for (i = 0;i < blocks * blksz;i++)
++			buffer[i] = i;
++	}
++
++	ret = mmc_test_set_blksize(test, blksz);
++	if (ret)
++		return ret;
++
++	ret = mmc_test_transfer(test, write, buffer, addr, blocks, blksz);
++	if (ret)
++		return ret;
++
++	if (write) {
++		ret = mmc_test_set_blksize(test, 512);
++		if (ret)
++			return ret;
++
++		sectors = (blocks * blksz + 511) / 512;
++		if ((sectors * 512) == (blocks * blksz))
++			sectors++;
++
++		if ((sectors * 512) > BUFFER_SIZE)
++			return -EINVAL;
++
++		memset(test->buffer, 0, sectors * 512);
++
++		for (i = 0;i < sectors;i++) {
++			ret = mmc_test_transfer(test, 0,
++				test->buffer + i * 512,
++				addr + i * 512, 1, 512);
++			if (ret)
++				return ret;
++		}
++
++		for (i = 0;i < blocks * blksz;i++) {
++			if (test->buffer[i] != (u8)i)
++				return RESULT_FAIL;
++		}
++
++		for (;i < sectors * 512;i++) {
++			if (test->buffer[i] != 0xDF)
++				return RESULT_FAIL;
++		}
++	} else {
++		for (i = 0;i < blocks * blksz;i++) {
++			if (buffer[i] != (u8)i)
++				return RESULT_FAIL;
++		}
++	}
++
++	return 0;
++}
++
++static int mmc_test_cleanup_verify(struct mmc_test_card *test)
++{
++	int ret, i;
++
++	ret = mmc_test_set_blksize(test, 512);
++	if (ret)
++		return ret;
++
++	memset(test->buffer, 0, BUFFER_SIZE);
++
++	for (i = 0;i < BUFFER_SIZE / 512;i++) {
++		ret = mmc_test_transfer(test, 1, test->buffer + i * 512,
++			i * 512, 1, 512);
++		if (ret)
++			return ret;
++	}
++
++	return 0;
++}
++
++/*******************************************************************/
++/*  Tests                                                          */
++/*******************************************************************/
++
++struct mmc_test_case {
++	const char *name;
++
++	int (*prepare)(struct mmc_test_card *);
++	int (*run)(struct mmc_test_card *);
++	int (*cleanup)(struct mmc_test_card *);
++};
++
++static int mmc_test_basic_write(struct mmc_test_card *test)
++{
++	int ret;
++
++	ret = mmc_test_set_blksize(test, 512);
++	if (ret)
++		return ret;
++
++	ret = mmc_test_transfer(test, 1, test->buffer, 0, 1, 512);
++	if (ret)
++		return ret;
++
++	return 0;
++}
++
++static int mmc_test_basic_read(struct mmc_test_card *test)
++{
++	int ret;
++
++	ret = mmc_test_set_blksize(test, 512);
++	if (ret)
++		return ret;
++
++	ret = mmc_test_transfer(test, 0, test->buffer, 0, 1, 512);
++	if (ret)
++		return ret;
++
++	return 0;
++}
++
++static int mmc_test_verify_write(struct mmc_test_card *test)
++{
++	int ret;
++
++	ret = mmc_test_verified_transfer(test, 1, test->buffer, 0, 1, 512);
++	if (ret)
++		return ret;
++
++	return 0;
++}
++
++static int mmc_test_verify_read(struct mmc_test_card *test)
++{
++	int ret;
++
++	ret = mmc_test_verified_transfer(test, 0, test->buffer, 0, 1, 512);
++	if (ret)
++		return ret;
++
++	return 0;
++}
++
++static int mmc_test_multi_write(struct mmc_test_card *test)
++{
++	int ret;
++	unsigned int size;
++
++	if (test->card->host->max_blk_count == 1)
++		return RESULT_UNSUP_HOST;
++
++	size = PAGE_SIZE * 2;
++	size = min(size, test->card->host->max_req_size);
++	size = min(size, test->card->host->max_seg_size);
++	size = min(size, test->card->host->max_blk_count * 512);
++
++	if (size < 1024)
++		return RESULT_UNSUP_HOST;
++
++	ret = mmc_test_verified_transfer(test, 1, test->buffer, 0,
++		size / 512, 512);
++	if (ret)
++		return ret;
++
++	return 0;
++}
++
++static int mmc_test_multi_read(struct mmc_test_card *test)
++{
++	int ret;
++	unsigned int size;
++
++	if (test->card->host->max_blk_count == 1)
++		return RESULT_UNSUP_HOST;
++
++	size = PAGE_SIZE * 2;
++	size = min(size, test->card->host->max_req_size);
++	size = min(size, test->card->host->max_seg_size);
++	size = min(size, test->card->host->max_blk_count * 512);
++
++	if (size < 1024)
++		return RESULT_UNSUP_HOST;
++
++	ret = mmc_test_verified_transfer(test, 0, test->buffer, 0,
++		size / 512, 512);
++	if (ret)
++		return ret;
++
++	return 0;
++}
++
++static int mmc_test_pow2_write(struct mmc_test_card *test)
++{
++	int ret, i;
++
++	if (!test->card->csd.write_partial)
++		return RESULT_UNSUP_CARD;
++
++	for (i = 1; i < 512;i <<= 1) {
++		ret = mmc_test_verified_transfer(test, 1,
++			test->buffer, 0, 1, i);
++		if (ret)
++			return ret;
++	}
++
++	return 0;
++}
++
++static int mmc_test_pow2_read(struct mmc_test_card *test)
++{
++	int ret, i;
++
++	if (!test->card->csd.read_partial)
++		return RESULT_UNSUP_CARD;
++
++	for (i = 1; i < 512;i <<= 1) {
++		ret = mmc_test_verified_transfer(test, 0,
++			test->buffer, 0, 1, i);
++		if (ret)
++			return ret;
++	}
++
++	return 0;
++}
++
++static int mmc_test_weird_write(struct mmc_test_card *test)
++{
++	int ret, i;
++
++	if (!test->card->csd.write_partial)
++		return RESULT_UNSUP_CARD;
++
++	for (i = 3; i < 512;i += 7) {
++		ret = mmc_test_verified_transfer(test, 1,
++			test->buffer, 0, 1, i);
++		if (ret)
++			return ret;
++	}
++
++	return 0;
++}
++
++static int mmc_test_weird_read(struct mmc_test_card *test)
++{
++	int ret, i;
++
++	if (!test->card->csd.read_partial)
++		return RESULT_UNSUP_CARD;
++
++	for (i = 3; i < 512;i += 7) {
++		ret = mmc_test_verified_transfer(test, 0,
++			test->buffer, 0, 1, i);
++		if (ret)
++			return ret;
++	}
++
++	return 0;
++}
++
++static int mmc_test_align_write(struct mmc_test_card *test)
++{
++	int ret, i;
++
++	for (i = 1;i < 4;i++) {
++		ret = mmc_test_verified_transfer(test, 1, test->buffer + i,
++			0, 1, 512);
++		if (ret)
++			return ret;
++	}
++
++	return 0;
++}
++
++static int mmc_test_align_read(struct mmc_test_card *test)
++{
++	int ret, i;
++
++	for (i = 1;i < 4;i++) {
++		ret = mmc_test_verified_transfer(test, 0, test->buffer + i,
++			0, 1, 512);
++		if (ret)
++			return ret;
++	}
++
++	return 0;
++}
++
++static int mmc_test_align_multi_write(struct mmc_test_card *test)
++{
++	int ret, i;
++	unsigned int size;
++
++	if (test->card->host->max_blk_count == 1)
++		return RESULT_UNSUP_HOST;
++
++	size = PAGE_SIZE * 2;
++	size = min(size, test->card->host->max_req_size);
++	size = min(size, test->card->host->max_seg_size);
++	size = min(size, test->card->host->max_blk_count * 512);
++
++	if (size < 1024)
++		return RESULT_UNSUP_HOST;
++
++	for (i = 1;i < 4;i++) {
++		ret = mmc_test_verified_transfer(test, 1, test->buffer + i,
++			0, size / 512, 512);
++		if (ret)
++			return ret;
++	}
++
++	return 0;
++}
++
++static int mmc_test_align_multi_read(struct mmc_test_card *test)
++{
++	int ret, i;
++	unsigned int size;
++
++	if (test->card->host->max_blk_count == 1)
++		return RESULT_UNSUP_HOST;
++
++	size = PAGE_SIZE * 2;
++	size = min(size, test->card->host->max_req_size);
++	size = min(size, test->card->host->max_seg_size);
++	size = min(size, test->card->host->max_blk_count * 512);
++
++	if (size < 1024)
++		return RESULT_UNSUP_HOST;
++
++	for (i = 1;i < 4;i++) {
++		ret = mmc_test_verified_transfer(test, 0, test->buffer + i,
++			0, size / 512, 512);
++		if (ret)
++			return ret;
++	}
++
++	return 0;
++}
++
++static int mmc_test_xfersize_write(struct mmc_test_card *test)
++{
++	int ret;
++
++	ret = mmc_test_set_blksize(test, 512);
++	if (ret)
++		return ret;
++
++	ret = __mmc_test_transfer(test, 1, 1, test->buffer, 0, 1, 512);
++	if (ret)
++		return ret;
++
++	return 0;
++}
++
++static int mmc_test_xfersize_read(struct mmc_test_card *test)
++{
++	int ret;
++
++	ret = mmc_test_set_blksize(test, 512);
++	if (ret)
++		return ret;
++
++	ret = __mmc_test_transfer(test, 0, 1, test->buffer, 0, 1, 512);
++	if (ret)
++		return ret;
++
++	return 0;
++}
++
++static int mmc_test_multi_xfersize_write(struct mmc_test_card *test)
++{
++	int ret;
++
++	if (test->card->host->max_blk_count == 1)
++		return RESULT_UNSUP_HOST;
++
++	ret = mmc_test_set_blksize(test, 512);
++	if (ret)
++		return ret;
++
++	ret = __mmc_test_transfer(test, 1, 1, test->buffer, 0, 2, 512);
++	if (ret)
++		return ret;
++
++	return 0;
++}
++
++static int mmc_test_multi_xfersize_read(struct mmc_test_card *test)
++{
++	int ret;
++
++	if (test->card->host->max_blk_count == 1)
++		return RESULT_UNSUP_HOST;
++
++	ret = mmc_test_set_blksize(test, 512);
++	if (ret)
++		return ret;
++
++	ret = __mmc_test_transfer(test, 0, 1, test->buffer, 0, 2, 512);
++	if (ret)
++		return ret;
++
++	return 0;
++}
++
++static const struct mmc_test_case mmc_test_cases[] = {
++	{
++		.name = "Basic write (no data verification)",
++		.run = mmc_test_basic_write,
++	},
++
++	{
++		.name = "Basic read (no data verification)",
++		.run = mmc_test_basic_read,
++	},
++
++	{
++		.name = "Basic write (with data verification)",
++		.prepare = mmc_test_prepare_verify_write,
++		.run = mmc_test_verify_write,
++		.cleanup = mmc_test_cleanup_verify,
++	},
++
++	{
++		.name = "Basic read (with data verification)",
++		.prepare = mmc_test_prepare_verify_read,
++		.run = mmc_test_verify_read,
++		.cleanup = mmc_test_cleanup_verify,
++	},
++
++	{
++		.name = "Multi-block write",
++		.prepare = mmc_test_prepare_verify_write,
++		.run = mmc_test_multi_write,
++		.cleanup = mmc_test_cleanup_verify,
++	},
++
++	{
++		.name = "Multi-block read",
++		.prepare = mmc_test_prepare_verify_read,
++		.run = mmc_test_multi_read,
++		.cleanup = mmc_test_cleanup_verify,
++	},
++
++	{
++		.name = "Power of two block writes",
++		.prepare = mmc_test_prepare_verify_write,
++		.run = mmc_test_pow2_write,
++		.cleanup = mmc_test_cleanup_verify,
++	},
++
++	{
++		.name = "Power of two block reads",
++		.prepare = mmc_test_prepare_verify_read,
++		.run = mmc_test_pow2_read,
++		.cleanup = mmc_test_cleanup_verify,
++	},
++
++	{
++		.name = "Weird sized block writes",
++		.prepare = mmc_test_prepare_verify_write,
++		.run = mmc_test_weird_write,
++		.cleanup = mmc_test_cleanup_verify,
++	},
++
++	{
++		.name = "Weird sized block reads",
++		.prepare = mmc_test_prepare_verify_read,
++		.run = mmc_test_weird_read,
++		.cleanup = mmc_test_cleanup_verify,
++	},
++
++	{
++		.name = "Badly aligned write",
++		.prepare = mmc_test_prepare_verify_write,
++		.run = mmc_test_align_write,
++		.cleanup = mmc_test_cleanup_verify,
++	},
++
++	{
++		.name = "Badly aligned read",
++		.prepare = mmc_test_prepare_verify_read,
++		.run = mmc_test_align_read,
++		.cleanup = mmc_test_cleanup_verify,
++	},
++
++	{
++		.name = "Badly aligned multi-block write",
++		.prepare = mmc_test_prepare_verify_write,
++		.run = mmc_test_align_multi_write,
++		.cleanup = mmc_test_cleanup_verify,
++	},
++
++	{
++		.name = "Badly aligned multi-block read",
++		.prepare = mmc_test_prepare_verify_read,
++		.run = mmc_test_align_multi_read,
++		.cleanup = mmc_test_cleanup_verify,
++	},
++
++	{
++		.name = "Correct xfer_size at write (start failure)",
++		.run = mmc_test_xfersize_write,
++	},
++
++	{
++		.name = "Correct xfer_size at read (start failure)",
++		.run = mmc_test_xfersize_read,
++	},
++
++	{
++		.name = "Correct xfer_size at write (midway failure)",
++		.run = mmc_test_multi_xfersize_write,
++	},
++
++	{
++		.name = "Correct xfer_size at read (midway failure)",
++		.run = mmc_test_multi_xfersize_read,
++	},
++};
++
++static struct mutex mmc_test_lock;
++
++static void mmc_test_run(struct mmc_test_card *test)
++{
++	int i, ret;
++
++	printk(KERN_INFO "%s: Starting tests of card %s...\n",
++		mmc_hostname(test->card->host), mmc_card_id(test->card));
++
++	mmc_claim_host(test->card->host);
++
++	for (i = 0;i < ARRAY_SIZE(mmc_test_cases);i++) {
++		printk(KERN_INFO "%s: Test case %d. %s...\n",
++			mmc_hostname(test->card->host), i + 1,
++			mmc_test_cases[i].name);
++
++		if (mmc_test_cases[i].prepare) {
++			ret = mmc_test_cases[i].prepare(test);
++			if (ret) {
++				printk(KERN_INFO "%s: Result: Prepare "
++					"stage failed! (%d)\n",
++					mmc_hostname(test->card->host),
++					ret);
++				continue;
++			}
++		}
++
++		ret = mmc_test_cases[i].run(test);
++		switch (ret) {
++		case RESULT_OK:
++			printk(KERN_INFO "%s: Result: OK\n",
++				mmc_hostname(test->card->host));
++			break;
++		case RESULT_FAIL:
++			printk(KERN_INFO "%s: Result: FAILED\n",
++				mmc_hostname(test->card->host));
++			break;
++		case RESULT_UNSUP_HOST:
++			printk(KERN_INFO "%s: Result: UNSUPPORTED "
++				"(by host)\n",
++				mmc_hostname(test->card->host));
++			break;
++		case RESULT_UNSUP_CARD:
++			printk(KERN_INFO "%s: Result: UNSUPPORTED "
++				"(by card)\n",
++				mmc_hostname(test->card->host));
++			break;
++		default:
++			printk(KERN_INFO "%s: Result: ERROR (%d)\n",
++				mmc_hostname(test->card->host), ret);
++		}
++
++		if (mmc_test_cases[i].cleanup) {
++			ret = mmc_test_cases[i].cleanup(test);
++			if (ret) {
++				printk(KERN_INFO "%s: Warning: Cleanup "
++					"stage failed! (%d)\n",
++					mmc_hostname(test->card->host),
++					ret);
++			}
++		}
++	}
++
++	mmc_release_host(test->card->host);
++
++	printk(KERN_INFO "%s: Tests completed.\n",
++		mmc_hostname(test->card->host));
++}
++
++static ssize_t mmc_test_show(struct device *dev,
++	struct device_attribute *attr, char *buf)
++{
++	mutex_lock(&mmc_test_lock);
++	mutex_unlock(&mmc_test_lock);
++
++	return 0;
++}
++
++static ssize_t mmc_test_store(struct device *dev,
++	struct device_attribute *attr, const char *buf, size_t count)
++{
++	struct mmc_card *card;
++	struct mmc_test_card *test;
++
++	card = container_of(dev, struct mmc_card, dev);
++
++	test = kzalloc(sizeof(struct mmc_test_card), GFP_KERNEL);
++	if (!test)
++		return -ENOMEM;
++
++	test->card = card;
++
++	test->buffer = kzalloc(BUFFER_SIZE, GFP_KERNEL);
++	if (test->buffer) {
++		mutex_lock(&mmc_test_lock);
++		mmc_test_run(test);
++		mutex_unlock(&mmc_test_lock);
++	}
++
++	kfree(test->buffer);
++	kfree(test);
++
++	return count;
++}
++
++static DEVICE_ATTR(test, S_IWUSR | S_IRUGO, mmc_test_show, mmc_test_store);
++
++static int mmc_test_probe(struct mmc_card *card)
++{
++	int ret;
++
++	mutex_init(&mmc_test_lock);
++
++	ret = device_create_file(&card->dev, &dev_attr_test);
++	if (ret)
++		return ret;
++
++	return 0;
++}
++
++static void mmc_test_remove(struct mmc_card *card)
++{
++	device_remove_file(&card->dev, &dev_attr_test);
++}
++
++static struct mmc_driver mmc_driver = {
++	.drv		= {
++		.name	= "mmc_test",
++	},
++	.probe		= mmc_test_probe,
++	.remove		= mmc_test_remove,
++};
++
++static int __init mmc_test_init(void)
++{
++	return mmc_register_driver(&mmc_driver);
++}
++
++static void __exit mmc_test_exit(void)
++{
++	mmc_unregister_driver(&mmc_driver);
++}
++
++module_init(mmc_test_init);
++module_exit(mmc_test_exit);
++
++MODULE_LICENSE("GPL");
++MODULE_DESCRIPTION("Multimedia Card (MMC) host test driver");
++MODULE_AUTHOR("Pierre Ossman");
+diff --git a/drivers/mmc/host/at91_mci.c b/drivers/mmc/host/at91_mci.c
+index a28fc2f..8979ad3 100644
+--- a/drivers/mmc/host/at91_mci.c
++++ b/drivers/mmc/host/at91_mci.c
+@@ -663,9 +663,12 @@ static void at91_mci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
+ 				gpio_set_value(host->board->vcc_pin, 0);
+ 				break;
+ 			case MMC_POWER_UP:
+-			case MMC_POWER_ON:
+ 				gpio_set_value(host->board->vcc_pin, 1);
+ 				break;
++			case MMC_POWER_ON:
++				break;
++			default:
++				WARN_ON(1);
+ 		}
+ 	}
+ }
+diff --git a/drivers/mmc/host/omap.c b/drivers/mmc/host/omap.c
+index 14759e9..549517c 100644
+--- a/drivers/mmc/host/omap.c
++++ b/drivers/mmc/host/omap.c
+@@ -1003,7 +1003,7 @@ static void mmc_omap_dma_cb(int lch, u16 ch_status, void *data)
+ 
+ static int mmc_omap_get_dma_channel(struct mmc_omap_host *host, struct mmc_data *data)
+ {
+-	const char *dev_name;
++	const char *dma_dev_name;
+ 	int sync_dev, dma_ch, is_read, r;
+ 
+ 	is_read = !(data->flags & MMC_DATA_WRITE);
+@@ -1018,21 +1018,21 @@ static int mmc_omap_get_dma_channel(struct mmc_omap_host *host, struct mmc_data
+ 	if (is_read) {
+ 		if (host->id == 1) {
+ 			sync_dev = OMAP_DMA_MMC_RX;
+-			dev_name = "MMC1 read";
++			dma_dev_name = "MMC1 read";
+ 		} else {
+ 			sync_dev = OMAP_DMA_MMC2_RX;
+-			dev_name = "MMC2 read";
++			dma_dev_name = "MMC2 read";
+ 		}
+ 	} else {
+ 		if (host->id == 1) {
+ 			sync_dev = OMAP_DMA_MMC_TX;
+-			dev_name = "MMC1 write";
++			dma_dev_name = "MMC1 write";
+ 		} else {
+ 			sync_dev = OMAP_DMA_MMC2_TX;
+-			dev_name = "MMC2 write";
++			dma_dev_name = "MMC2 write";
+ 		}
+ 	}
+-	r = omap_request_dma(sync_dev, dev_name, mmc_omap_dma_cb,
++	r = omap_request_dma(sync_dev, dma_dev_name, mmc_omap_dma_cb,
+ 			     host, &dma_ch);
+ 	if (r != 0) {
+ 		dev_dbg(mmc_dev(host->mmc), "omap_request_dma() failed with %d\n", r);
+diff --git a/drivers/net/bonding/bond_sysfs.c b/drivers/net/bonding/bond_sysfs.c
+index 68c41a0..08f3d39 100644
+--- a/drivers/net/bonding/bond_sysfs.c
++++ b/drivers/net/bonding/bond_sysfs.c
+@@ -1437,8 +1437,16 @@ int bond_create_sysfs(void)
+ 	 * configure multiple bonding devices.
+ 	 */
+ 	if (ret == -EEXIST) {
+-		netdev_class = NULL;
+-		return 0;
++		/* Is someone being kinky and naming a device bonding_master? */
++		if (__dev_get_by_name(&init_net,
++				      class_attr_bonding_masters.attr.name))
++			printk(KERN_ERR
++			       "network device named %s already exists in sysfs",
++			       class_attr_bonding_masters.attr.name);
++		else {
++			netdev_class = NULL;
++			return 0;
++		}
+ 	}
+ 
+ 	return ret;
+diff --git a/drivers/net/pppol2tp.c b/drivers/net/pppol2tp.c
+index 7935991..8db342f 100644
+--- a/drivers/net/pppol2tp.c
++++ b/drivers/net/pppol2tp.c
+@@ -980,6 +980,8 @@ static int pppol2tp_xmit(struct ppp_channel *chan, struct sk_buff *skb)
+ 	__wsum csum = 0;
+ 	struct udphdr *uh;
+ 	unsigned int len;
++	int old_headroom;
++	int new_headroom;
+ 
+ 	if (sock_flag(sk, SOCK_DEAD) || !(sk->sk_state & PPPOX_CONNECTED))
+ 		goto abort;
+@@ -1001,16 +1003,18 @@ static int pppol2tp_xmit(struct ppp_channel *chan, struct sk_buff *skb)
+ 
+ 	/* Check that there's enough headroom in the skb to insert IP,
+ 	 * UDP and L2TP and PPP headers. If not enough, expand it to
+-	 * make room. Note that a new skb (or a clone) is
+-	 * allocated. If we return an error from this point on, make
+-	 * sure we free the new skb but do not free the original skb
+-	 * since that is done by the caller for the error case.
++	 * make room. Adjust truesize.
+ 	 */
+ 	headroom = NET_SKB_PAD + sizeof(struct iphdr) +
+ 		sizeof(struct udphdr) + hdr_len + sizeof(ppph);
++	old_headroom = skb_headroom(skb);
+ 	if (skb_cow_head(skb, headroom))
+ 		goto abort;
+ 
++	new_headroom = skb_headroom(skb);
++	skb_orphan(skb);
++	skb->truesize += new_headroom - old_headroom;
++
+ 	/* Setup PPP header */
+ 	__skb_push(skb, sizeof(ppph));
+ 	skb->data[0] = ppph[0];
+@@ -1065,7 +1069,6 @@ static int pppol2tp_xmit(struct ppp_channel *chan, struct sk_buff *skb)
+ 	/* Get routing info from the tunnel socket */
+ 	dst_release(skb->dst);
+ 	skb->dst = dst_clone(__sk_dst_get(sk_tun));
+-	skb_orphan(skb);
+ 	skb->sk = sk_tun;
+ 
+ 	/* Queue the packet to IP for output */
+diff --git a/drivers/net/usb/cdc_subset.c b/drivers/net/usb/cdc_subset.c
+index 0ec7936..c66b9c3 100644
+--- a/drivers/net/usb/cdc_subset.c
++++ b/drivers/net/usb/cdc_subset.c
+@@ -218,7 +218,7 @@ static const struct driver_info	blob_info = {
+ /*-------------------------------------------------------------------------*/
+ 
+ #ifndef	HAVE_HARDWARE
+-#error You need to configure some hardware for this driver
++#warning You need to configure some hardware for this driver
+ #endif
+ 
+ /*
+diff --git a/drivers/net/wireless/airo.c b/drivers/net/wireless/airo.c
+index 45f47c1..4e1c690 100644
+--- a/drivers/net/wireless/airo.c
++++ b/drivers/net/wireless/airo.c
+@@ -2668,6 +2668,7 @@ static struct net_device *init_wifidev(struct airo_info *ai,
+ 	dev->irq = ethdev->irq;
+ 	dev->base_addr = ethdev->base_addr;
+ 	dev->wireless_data = ethdev->wireless_data;
++	SET_NETDEV_DEV(dev, ethdev->dev.parent);
+ 	memcpy(dev->dev_addr, ethdev->dev_addr, dev->addr_len);
+ 	err = register_netdev(dev);
+ 	if (err<0) {
+@@ -2904,7 +2905,7 @@ EXPORT_SYMBOL(init_airo_card);
+ 
+ static int waitbusy (struct airo_info *ai) {
+ 	int delay = 0;
+-	while ((IN4500 (ai, COMMAND) & COMMAND_BUSY) & (delay < 10000)) {
++	while ((IN4500 (ai, COMMAND) & COMMAND_BUSY) && (delay < 10000)) {
+ 		udelay (10);
+ 		if ((++delay % 20) == 0)
+ 			OUT4500(ai, EVACK, EV_CLEARCOMMANDBUSY);
+diff --git a/drivers/net/wireless/hostap/hostap_hw.c b/drivers/net/wireless/hostap/hostap_hw.c
+index 7be68db..cdf90c4 100644
+--- a/drivers/net/wireless/hostap/hostap_hw.c
++++ b/drivers/net/wireless/hostap/hostap_hw.c
+@@ -3276,11 +3276,6 @@ while (0)
+ 	}
+ 	printk(KERN_INFO "%s: Registered netdevice %s\n", dev_info, dev->name);
+ 
+-#ifndef PRISM2_NO_PROCFS_DEBUG
+-	create_proc_read_entry("registers", 0, local->proc,
+-			       prism2_registers_proc_read, local);
+-#endif /* PRISM2_NO_PROCFS_DEBUG */
+-
+ 	hostap_init_data(local);
+ 	return dev;
+ 
+@@ -3307,6 +3302,10 @@ static int hostap_hw_ready(struct net_device *dev)
+ 			netif_carrier_off(local->ddev);
+ 		}
+ 		hostap_init_proc(local);
++#ifndef PRISM2_NO_PROCFS_DEBUG
++		create_proc_read_entry("registers", 0, local->proc,
++				       prism2_registers_proc_read, local);
++#endif /* PRISM2_NO_PROCFS_DEBUG */
+ 		hostap_init_ap_proc(local);
+ 		return 0;
+ 	}
+diff --git a/drivers/net/wireless/ipw2200.c b/drivers/net/wireless/ipw2200.c
+index fa87c5c..d74c061 100644
+--- a/drivers/net/wireless/ipw2200.c
++++ b/drivers/net/wireless/ipw2200.c
+@@ -11584,6 +11584,7 @@ static int ipw_prom_alloc(struct ipw_priv *priv)
+ 	priv->prom_net_dev->hard_start_xmit = ipw_prom_hard_start_xmit;
+ 
+ 	priv->prom_priv->ieee->iw_mode = IW_MODE_MONITOR;
++	SET_NETDEV_DEV(priv->prom_net_dev, &priv->pci_dev->dev);
+ 
+ 	rc = register_netdev(priv->prom_net_dev);
+ 	if (rc) {
+diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
+index 406f54d..e1f0660 100644
+--- a/drivers/net/wireless/libertas/main.c
++++ b/drivers/net/wireless/libertas/main.c
+@@ -756,6 +756,7 @@ static int lbs_thread(void *data)
+ 				priv->nr_retries = 0;
+ 			} else {
+ 				priv->cur_cmd = NULL;
++				priv->dnld_sent = DNLD_RES_RECEIVED;
+ 				lbs_pr_info("requeueing command %x due to timeout (#%d)\n",
+ 					    le16_to_cpu(cmdnode->cmdbuf->command), priv->nr_retries);
+ 
+@@ -1564,6 +1565,7 @@ static int lbs_add_rtap(struct lbs_private *priv)
+ 	rtap_dev->hard_start_xmit = lbs_rtap_hard_start_xmit;
+ 	rtap_dev->set_multicast_list = lbs_set_multicast_list;
+ 	rtap_dev->priv = priv;
++	SET_NETDEV_DEV(rtap_dev, priv->dev->dev.parent);
+ 
+ 	ret = register_netdev(rtap_dev);
+ 	if (ret) {
+diff --git a/drivers/power/power_supply_core.c b/drivers/power/power_supply_core.c
+index 138dd76..af1633e 100644
+--- a/drivers/power/power_supply_core.c
++++ b/drivers/power/power_supply_core.c
+@@ -91,15 +91,13 @@ int power_supply_register(struct device *parent, struct power_supply *psy)
+ {
+ 	int rc = 0;
+ 
+-	psy->dev = device_create(power_supply_class, parent, 0,
+-				 "%s", psy->name);
++	psy->dev = device_create_drvdata(power_supply_class, parent, 0,
++					 psy, "%s", psy->name);
+ 	if (IS_ERR(psy->dev)) {
+ 		rc = PTR_ERR(psy->dev);
+ 		goto dev_create_failed;
+ 	}
+ 
+-	dev_set_drvdata(psy->dev, psy);
+-
+ 	INIT_WORK(&psy->changed_work, power_supply_changed_work);
+ 
+ 	rc = power_supply_create_attrs(psy);
+diff --git a/drivers/s390/char/vmlogrdr.c b/drivers/s390/char/vmlogrdr.c
+index e848734..2c2428c 100644
+--- a/drivers/s390/char/vmlogrdr.c
++++ b/drivers/s390/char/vmlogrdr.c
+@@ -762,10 +762,10 @@ static int vmlogrdr_register_device(struct vmlogrdr_priv_t *priv)
+ 		device_unregister(dev);
+ 		return ret;
+ 	}
+-	priv->class_device = device_create(vmlogrdr_class, dev,
+-					   MKDEV(vmlogrdr_major,
+-						 priv->minor_num),
+-					   "%s", dev->bus_id);
++	priv->class_device = device_create_drvdata(vmlogrdr_class, dev,
++						   MKDEV(vmlogrdr_major,
++							 priv->minor_num),
++						   priv, "%s", dev->bus_id);
+ 	if (IS_ERR(priv->class_device)) {
+ 		ret = PTR_ERR(priv->class_device);
+ 		priv->class_device=NULL;
+@@ -773,7 +773,6 @@ static int vmlogrdr_register_device(struct vmlogrdr_priv_t *priv)
+ 		device_unregister(dev);
+ 		return ret;
+ 	}
+-	dev->driver_data = priv;
+ 	priv->device = dev;
+ 	return 0;
+ }
+diff --git a/drivers/s390/kvm/kvm_virtio.c b/drivers/s390/kvm/kvm_virtio.c
+index 47a7e62..9f55ce6 100644
+--- a/drivers/s390/kvm/kvm_virtio.c
++++ b/drivers/s390/kvm/kvm_virtio.c
+@@ -78,27 +78,32 @@ static unsigned desc_size(const struct kvm_device_desc *desc)
+ 		+ desc->config_len;
+ }
+ 
+-/*
+- * This tests (and acknowleges) a feature bit.
+- */
+-static bool kvm_feature(struct virtio_device *vdev, unsigned fbit)
++/* This gets the device's feature bits. */
++static u32 kvm_get_features(struct virtio_device *vdev)
+ {
++	unsigned int i;
++	u32 features = 0;
+ 	struct kvm_device_desc *desc = to_kvmdev(vdev)->desc;
+-	u8 *features;
++	u8 *in_features = kvm_vq_features(desc);
+ 
+-	if (fbit / 8 > desc->feature_len)
+-		return false;
++	for (i = 0; i < min(desc->feature_len * 8, 32); i++)
++		if (in_features[i / 8] & (1 << (i % 8)))
++			features |= (1 << i);
++	return features;
++}
+ 
+-	features = kvm_vq_features(desc);
+-	if (!(features[fbit / 8] & (1 << (fbit % 8))))
+-		return false;
++static void kvm_set_features(struct virtio_device *vdev, u32 features)
++{
++	unsigned int i;
++	struct kvm_device_desc *desc = to_kvmdev(vdev)->desc;
++	/* Second half of bitmap is features we accept. */
++	u8 *out_features = kvm_vq_features(desc) + desc->feature_len;
+ 
+-	/*
+-	 * We set the matching bit in the other half of the bitmap to tell the
+-	 * Host we want to use this feature.
+-	 */
+-	features[desc->feature_len + fbit / 8] |= (1 << (fbit % 8));
+-	return true;
++	memset(out_features, 0, desc->feature_len);
++	for (i = 0; i < min(desc->feature_len * 8, 32); i++) {
++		if (features & (1 << i))
++			out_features[i / 8] |= (1 << (i % 8));
++	}
+ }
+ 
+ /*
+@@ -221,7 +226,8 @@ static void kvm_del_vq(struct virtqueue *vq)
+  * The config ops structure as defined by virtio config
+  */
+ static struct virtio_config_ops kvm_vq_configspace_ops = {
+-	.feature = kvm_feature,
++	.get_features = kvm_get_features,
++	.set_features = kvm_set_features,
+ 	.get = kvm_get,
+ 	.set = kvm_set,
+ 	.get_status = kvm_get_status,
+diff --git a/drivers/scsi/ch.c b/drivers/scsi/ch.c
+index 75c84d7..c4b938b 100644
+--- a/drivers/scsi/ch.c
++++ b/drivers/scsi/ch.c
+@@ -910,9 +910,9 @@ static int ch_probe(struct device *dev)
+ 	ch->minor = minor;
+ 	sprintf(ch->name,"ch%d",ch->minor);
+ 
+-	class_dev = device_create(ch_sysfs_class, dev,
+-				  MKDEV(SCSI_CHANGER_MAJOR,ch->minor),
+-				  "s%s", ch->name);
++	class_dev = device_create_drvdata(ch_sysfs_class, dev,
++					  MKDEV(SCSI_CHANGER_MAJOR, ch->minor),
++					  ch, "s%s", ch->name);
+ 	if (IS_ERR(class_dev)) {
+ 		printk(KERN_WARNING "ch%d: device_create failed\n",
+ 		       ch->minor);
+@@ -926,7 +926,6 @@ static int ch_probe(struct device *dev)
+ 	if (init)
+ 		ch_init_elem(ch);
+ 
+-	dev_set_drvdata(dev, ch);
+ 	sdev_printk(KERN_INFO, sd, "Attached scsi changer %s\n", ch->name);
+ 
+ 	return 0;
+diff --git a/drivers/scsi/osst.c b/drivers/scsi/osst.c
+index 31f7aec..243d8be 100644
+--- a/drivers/scsi/osst.c
++++ b/drivers/scsi/osst.c
+@@ -5695,13 +5695,12 @@ static int osst_sysfs_add(dev_t dev, struct device *device, struct osst_tape * S
+ 	struct device *osst_member;
+ 	int err;
+ 
+-	osst_member = device_create(osst_sysfs_class, device, dev, "%s", name);
++	osst_member = device_create_drvdata(osst_sysfs_class, device, dev, STp, "%s", name);
+ 	if (IS_ERR(osst_member)) {
+ 		printk(KERN_WARNING "osst :W: Unable to add sysfs class member %s\n", name);
+ 		return PTR_ERR(osst_member);
+ 	}
+ 
+-	dev_set_drvdata(osst_member, STp);
+ 	err = device_create_file(osst_member, &dev_attr_ADR_rev);
+ 	if (err)
+ 		goto err_out;
+diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c
+index c9d7f72..ea0edd1 100644
+--- a/drivers/scsi/sg.c
++++ b/drivers/scsi/sg.c
+@@ -1441,17 +1441,18 @@ sg_add(struct device *cl_dev, struct class_interface *cl_intf)
+ 	if (sg_sysfs_valid) {
+ 		struct device *sg_class_member;
+ 
+-		sg_class_member = device_create(sg_sysfs_class, cl_dev->parent,
+-						MKDEV(SCSI_GENERIC_MAJOR,
+-						      sdp->index),
+-						"%s", disk->disk_name);
++		sg_class_member = device_create_drvdata(sg_sysfs_class,
++							cl_dev->parent,
++							MKDEV(SCSI_GENERIC_MAJOR,
++							      sdp->index),
++							sdp,
++							"%s", disk->disk_name);
+ 		if (IS_ERR(sg_class_member)) {
+ 			printk(KERN_ERR "sg_add: "
+ 			       "device_create failed\n");
+ 			error = PTR_ERR(sg_class_member);
+ 			goto cdev_add_err;
+ 		}
+-		dev_set_drvdata(sg_class_member, sdp);
+ 		error = sysfs_create_link(&scsidp->sdev_gendev.kobj,
+ 					  &sg_class_member->kobj, "generic");
+ 		if (error)
+diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c
+index e8db66a..6e5a5bb 100644
+--- a/drivers/scsi/st.c
++++ b/drivers/scsi/st.c
+@@ -4424,17 +4424,19 @@ static int do_create_class_files(struct scsi_tape *STp, int dev_num, int mode)
+ 		snprintf(name, 10, "%s%s%s", rew ? "n" : "",
+ 			 STp->disk->disk_name, st_formats[i]);
+ 		st_class_member =
+-			device_create(st_sysfs_class, &STp->device->sdev_gendev,
+-				      MKDEV(SCSI_TAPE_MAJOR,
+-						TAPE_MINOR(dev_num, mode, rew)),
+-				      "%s", name);
++			device_create_drvdata(st_sysfs_class,
++					      &STp->device->sdev_gendev,
++					      MKDEV(SCSI_TAPE_MAJOR,
++						    TAPE_MINOR(dev_num,
++							      mode, rew)),
++					      &STp->modes[mode],
++					      "%s", name);
+ 		if (IS_ERR(st_class_member)) {
+ 			printk(KERN_WARNING "st%d: device_create failed\n",
+ 			       dev_num);
+ 			error = PTR_ERR(st_class_member);
+ 			goto out;
+ 		}
+-		dev_set_drvdata(st_class_member, &STp->modes[mode]);
+ 
+ 		error = device_create_file(st_class_member,
+ 					   &dev_attr_defined);
+diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c
+index a1ca9b7..1400ea6 100644
+--- a/drivers/serial/8250.c
++++ b/drivers/serial/8250.c
+@@ -43,6 +43,7 @@
+ 
+ #include <asm/io.h>
+ #include <asm/irq.h>
++#include <asm/serial.h>
+ 
+ #include "8250.h"
+ 
+@@ -92,8 +93,6 @@ static unsigned int nr_uarts = CONFIG_SERIAL_8250_RUNTIME_UARTS;
+  */
+ #define CONFIG_HUB6 1
+ 
+-#include <asm/serial.h>
+-
+ /*
+  * SERIAL_PORT_DFNS tells us about built-in ports that have no
+  * standard enumeration mechanism.   Platforms that can find all
+@@ -1548,6 +1547,8 @@ static int serial_link_irq_chain(struct uart_8250_port *up)
+ 		i->head = &up->list;
+ 		spin_unlock_irq(&i->lock);
+ 
++		irq_flags |= SERIAL_EXTRA_IRQ_FLAGS;
++
+ 		ret = request_irq(up->port.irq, serial8250_interrupt,
+ 				  irq_flags, "serial", i);
+ 		if (ret < 0)
+diff --git a/drivers/serial/8250.h b/drivers/serial/8250.h
+index 91bd28f..a10a40c 100644
+--- a/drivers/serial/8250.h
++++ b/drivers/serial/8250.h
+@@ -78,3 +78,8 @@ struct serial8250_config {
+ #else
+ #define ALPHA_KLUDGE_MCR 0
+ #endif
++
++#ifndef SERIAL_EXTRA_IRQ_FLAGS
++#define SERIAL_EXTRA_IRQ_FLAGS 0
++#endif
++
+diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig
+index 62e6eb1..9bc4276 100644
+--- a/drivers/serial/Kconfig
++++ b/drivers/serial/Kconfig
+@@ -1361,7 +1361,7 @@ config SERIAL_SC26XX_CONSOLE
+ 
+ config SERIAL_BFIN_SPORT
+ 	tristate "Blackfin SPORT emulate UART (EXPERIMENTAL)"
+-	depends on BFIN && EXPERIMENTAL
++	depends on BLACKFIN && EXPERIMENTAL
+ 	select SERIAL_CORE
+ 	help
+ 	  Enble support SPORT emulate UART on Blackfin series.
+diff --git a/drivers/serial/sh-sci.c b/drivers/serial/sh-sci.c
+index 8fdafc2..ce6ee92 100644
+--- a/drivers/serial/sh-sci.c
++++ b/drivers/serial/sh-sci.c
+@@ -184,15 +184,15 @@ static void put_string(struct sci_port *sci_port, const char *buffer, int count)
+ 			int h, l;
+ 
+ 			c = *p++;
+-			h = highhex(c);
+-			l = lowhex(c);
++			h = hex_asc_hi(c);
++			l = hex_asc_lo(c);
+ 			put_char(port, h);
+ 			put_char(port, l);
+ 			checksum += h + l;
+ 		}
+ 		put_char(port, '#');
+-		put_char(port, highhex(checksum));
+-		put_char(port, lowhex(checksum));
++		put_char(port, hex_asc_hi(checksum));
++		put_char(port, hex_asc_lo(checksum));
+ 	    } while  (get_char(port) != '+');
+ 	} else
+ #endif /* CONFIG_SH_STANDARD_BIOS || CONFIG_SH_KGDB */
+diff --git a/drivers/uio/uio.c b/drivers/uio/uio.c
+index 55cc7b8..0a12e90 100644
+--- a/drivers/uio/uio.c
++++ b/drivers/uio/uio.c
+@@ -649,15 +649,14 @@ int __uio_register_device(struct module *owner,
+ 	if (ret)
+ 		goto err_get_minor;
+ 
+-	idev->dev = device_create(uio_class->class, parent,
+-				  MKDEV(uio_major, idev->minor),
+-				  "uio%d", idev->minor);
++	idev->dev = device_create_drvdata(uio_class->class, parent,
++					  MKDEV(uio_major, idev->minor), idev,
++					  "uio%d", idev->minor);
+ 	if (IS_ERR(idev->dev)) {
+ 		printk(KERN_ERR "UIO: device register failed\n");
+ 		ret = PTR_ERR(idev->dev);
+ 		goto err_device_create;
+ 	}
+-	dev_set_drvdata(idev->dev, idev);
+ 
+ 	ret = uio_dev_add_attributes(idev);
+ 	if (ret)
+diff --git a/drivers/usb/class/Kconfig b/drivers/usb/class/Kconfig
+index 3a9102d..66f17ed 100644
+--- a/drivers/usb/class/Kconfig
++++ b/drivers/usb/class/Kconfig
+@@ -29,3 +29,14 @@ config USB_PRINTER
+ 	  To compile this driver as a module, choose M here: the
+ 	  module will be called usblp.
+ 
++config USB_WDM
++	tristate "USB Wireless Device Management support"
++	depends on USB
++	---help---
++	  This driver supports the WMC Device Management functionality
++	  of cell phones compliant to the CDC WMC specification. You can use
++	  AT commands over this device.
++
++	  To compile this driver as a module, choose M here: the
++	  module will be called cdc-wdm.
++
+diff --git a/drivers/usb/class/Makefile b/drivers/usb/class/Makefile
+index cc391e6..535d59a 100644
+--- a/drivers/usb/class/Makefile
++++ b/drivers/usb/class/Makefile
+@@ -5,3 +5,4 @@
+ 
+ obj-$(CONFIG_USB_ACM)		+= cdc-acm.o
+ obj-$(CONFIG_USB_PRINTER)	+= usblp.o
++obj-$(CONFIG_USB_WDM)		+= cdc-wdm.o
+diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c
+new file mode 100644
+index 0000000..107666d
+--- /dev/null
++++ b/drivers/usb/class/cdc-wdm.c
+@@ -0,0 +1,740 @@
++/*
++ * cdc-wdm.c
++ *
++ * This driver supports USB CDC WCM Device Management.
++ *
++ * Copyright (c) 2007-2008 Oliver Neukum
++ *
++ * Some code taken from cdc-acm.c
++ *
++ * Released under the GPLv2.
++ *
++ * Many thanks to Carl Nordbeck
++ */
++#include <linux/kernel.h>
++#include <linux/errno.h>
++#include <linux/slab.h>
++#include <linux/module.h>
++#include <linux/smp_lock.h>
++#include <linux/mutex.h>
++#include <linux/uaccess.h>
++#include <linux/bitops.h>
++#include <linux/poll.h>
++#include <linux/usb.h>
++#include <linux/usb/cdc.h>
++#include <asm/byteorder.h>
++#include <asm/unaligned.h>
++
++/*
++ * Version Information
++ */
++#define DRIVER_VERSION "v0.02"
++#define DRIVER_AUTHOR "Oliver Neukum"
++
++static struct usb_device_id wdm_ids[] = {
++	{
++		.match_flags = USB_DEVICE_ID_MATCH_INT_CLASS |
++				 USB_DEVICE_ID_MATCH_INT_SUBCLASS,
++		.bInterfaceClass = USB_CLASS_COMM,
++		.bInterfaceSubClass = USB_CDC_SUBCLASS_DMM
++	},
++	{ }
++};
++
++#define WDM_MINOR_BASE	176
++
++
++#define WDM_IN_USE		1
++#define WDM_DISCONNECTING	2
++#define WDM_RESULT		3
++#define WDM_READ		4
++#define WDM_INT_STALL		5
++#define WDM_POLL_RUNNING	6
++
++
++#define WDM_MAX			16
++
++
++static DEFINE_MUTEX(wdm_mutex);
++
++/* --- method tables --- */
++
++struct wdm_device {
++	u8			*inbuf; /* buffer for response */
++	u8			*outbuf; /* buffer for command */
++	u8			*sbuf; /* buffer for status */
++	u8			*ubuf; /* buffer for copy to user space */
++
++	struct urb		*command;
++	struct urb		*response;
++	struct urb		*validity;
++	struct usb_interface	*intf;
++	struct usb_ctrlrequest	*orq;
++	struct usb_ctrlrequest	*irq;
++	spinlock_t		iuspin;
++
++	unsigned long		flags;
++	u16			bufsize;
++	u16			wMaxCommand;
++	u16			wMaxPacketSize;
++	u16			bMaxPacketSize0;
++	__le16			inum;
++	int			reslength;
++	int			length;
++	int			read;
++	int			count;
++	dma_addr_t		shandle;
++	dma_addr_t		ihandle;
++	struct mutex		wlock;
++	struct mutex		rlock;
++	wait_queue_head_t	wait;
++	struct work_struct	rxwork;
++	int			werr;
++	int			rerr;
++};
++
++static struct usb_driver wdm_driver;
++
++/* --- callbacks --- */
++static void wdm_out_callback(struct urb *urb)
++{
++	struct wdm_device *desc;
++	desc = urb->context;
++	spin_lock(&desc->iuspin);
++	desc->werr = urb->status;
++	spin_unlock(&desc->iuspin);
++	clear_bit(WDM_IN_USE, &desc->flags);
++	kfree(desc->outbuf);
++	wake_up(&desc->wait);
++}
++
++static void wdm_in_callback(struct urb *urb)
++{
++	struct wdm_device *desc = urb->context;
++	int status = urb->status;
++
++	spin_lock(&desc->iuspin);
++
++	if (status) {
++		switch (status) {
++		case -ENOENT:
++			dev_dbg(&desc->intf->dev,
++				"nonzero urb status received: -ENOENT");
++			break;
++		case -ECONNRESET:
++			dev_dbg(&desc->intf->dev,
++				"nonzero urb status received: -ECONNRESET");
++			break;
++		case -ESHUTDOWN:
++			dev_dbg(&desc->intf->dev,
++				"nonzero urb status received: -ESHUTDOWN");
++			break;
++		case -EPIPE:
++			err("nonzero urb status received: -EPIPE");
++			break;
++		default:
++			err("Unexpected error %d", status);
++			break;
++		}
++	}
++
++	desc->rerr = status;
++	desc->reslength = urb->actual_length;
++	memmove(desc->ubuf + desc->length, desc->inbuf, desc->reslength);
++	desc->length += desc->reslength;
++	wake_up(&desc->wait);
++
++	set_bit(WDM_READ, &desc->flags);
++	spin_unlock(&desc->iuspin);
++}
++
++static void wdm_int_callback(struct urb *urb)
++{
++	int rv = 0;
++	int status = urb->status;
++	struct wdm_device *desc;
++	struct usb_ctrlrequest *req;
++	struct usb_cdc_notification *dr;
++
++	desc = urb->context;
++	req = desc->irq;
++	dr = (struct usb_cdc_notification *)desc->sbuf;
++
++	if (status) {
++		switch (status) {
++		case -ESHUTDOWN:
++		case -ENOENT:
++		case -ECONNRESET:
++			return; /* unplug */
++		case -EPIPE:
++			set_bit(WDM_INT_STALL, &desc->flags);
++			err("Stall on int endpoint");
++			goto sw; /* halt is cleared in work */
++		default:
++			err("nonzero urb status received: %d", status);
++			break;
++		}
++	}
++
++	if (urb->actual_length < sizeof(struct usb_cdc_notification)) {
++		err("wdm_int_callback - %d bytes", urb->actual_length);
++		goto exit;
++	}
++
++	switch (dr->bNotificationType) {
++	case USB_CDC_NOTIFY_RESPONSE_AVAILABLE:
++		dev_dbg(&desc->intf->dev,
++			"NOTIFY_RESPONSE_AVAILABLE received: index %d len %d",
++			dr->wIndex, dr->wLength);
++		break;
++
++	case USB_CDC_NOTIFY_NETWORK_CONNECTION:
++
++		dev_dbg(&desc->intf->dev,
++			"NOTIFY_NETWORK_CONNECTION %s network",
++			dr->wValue ? "connected to" : "disconnected from");
++		goto exit;
++	default:
++		clear_bit(WDM_POLL_RUNNING, &desc->flags);
++		err("unknown notification %d received: index %d len %d",
++			dr->bNotificationType, dr->wIndex, dr->wLength);
++		goto exit;
++	}
++
++	req->bRequestType = (USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE);
++	req->bRequest = USB_CDC_GET_ENCAPSULATED_RESPONSE;
++	req->wValue = 0;
++	req->wIndex = desc->inum;
++	req->wLength = cpu_to_le16(desc->bMaxPacketSize0);
++
++	usb_fill_control_urb(
++		desc->response,
++		interface_to_usbdev(desc->intf),
++		/* using common endpoint 0 */
++		usb_rcvctrlpipe(interface_to_usbdev(desc->intf), 0),
++		(unsigned char *)req,
++		desc->inbuf,
++		desc->bMaxPacketSize0,
++		wdm_in_callback,
++		desc
++	);
++	desc->response->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
++	spin_lock(&desc->iuspin);
++	clear_bit(WDM_READ, &desc->flags);
++	if (!test_bit(WDM_DISCONNECTING, &desc->flags)) {
++		rv = usb_submit_urb(desc->response, GFP_ATOMIC);
++		dev_dbg(&desc->intf->dev, "%s: usb_submit_urb %d",
++			__func__, rv);
++	}
++	spin_unlock(&desc->iuspin);
++	if (rv < 0) {
++		if (rv == -EPERM)
++			return;
++		if (rv == -ENOMEM) {
++sw:
++			rv = schedule_work(&desc->rxwork);
++			if (rv)
++				err("Cannot schedule work");
++		}
++	}
++exit:
++	rv = usb_submit_urb(urb, GFP_ATOMIC);
++	if (rv)
++		err("%s - usb_submit_urb failed with result %d",
++		     __func__, rv);
++
++}
++
++static void kill_urbs(struct wdm_device *desc)
++{
++	usb_kill_urb(desc->command);
++	usb_kill_urb(desc->validity);
++	usb_kill_urb(desc->response);
++}
++
++static void free_urbs(struct wdm_device *desc)
++{
++	usb_free_urb(desc->validity);
++	usb_free_urb(desc->response);
++	usb_free_urb(desc->command);
++}
++
++static void cleanup(struct wdm_device *desc)
++{
++	usb_buffer_free(interface_to_usbdev(desc->intf),
++			desc->wMaxPacketSize,
++			desc->sbuf,
++			desc->validity->transfer_dma);
++	usb_buffer_free(interface_to_usbdev(desc->intf),
++			desc->wMaxPacketSize,
++			desc->inbuf,
++			desc->response->transfer_dma);
++	kfree(desc->orq);
++	kfree(desc->irq);
++	kfree(desc->ubuf);
++	free_urbs(desc);
++	kfree(desc);
++}
++
++static ssize_t wdm_write
++(struct file *file, const char __user *buffer, size_t count, loff_t *ppos)
++{
++	u8 *buf;
++	int rv = -EMSGSIZE, r, we;
++	struct wdm_device *desc = file->private_data;
++	struct usb_ctrlrequest *req;
++
++	if (count > desc->wMaxCommand)
++		count = desc->wMaxCommand;
++
++	spin_lock_irq(&desc->iuspin);
++	we = desc->werr;
++	desc->werr = 0;
++	spin_unlock_irq(&desc->iuspin);
++	if (we < 0)
++		return -EIO;
++
++	r = mutex_lock_interruptible(&desc->wlock); /* concurrent writes */
++	rv = -ERESTARTSYS;
++	if (r)
++		goto outnl;
++
++	r = wait_event_interruptible(desc->wait, !test_bit(WDM_IN_USE,
++							   &desc->flags));
++	if (r < 0)
++		goto out;
++
++	if (test_bit(WDM_DISCONNECTING, &desc->flags)) {
++		rv = -ENODEV;
++		goto out;
++	}
++
++	desc->outbuf = buf = kmalloc(count, GFP_KERNEL);
++	if (!buf) {
++		rv = -ENOMEM;
++		goto out;
++	}
++
++	r = copy_from_user(buf, buffer, count);
++	if (r > 0) {
++		kfree(buf);
++		rv = -EFAULT;
++		goto out;
++	}
++
++	req = desc->orq;
++	usb_fill_control_urb(
++		desc->command,
++		interface_to_usbdev(desc->intf),
++		/* using common endpoint 0 */
++		usb_sndctrlpipe(interface_to_usbdev(desc->intf), 0),
++		(unsigned char *)req,
++		buf,
++		count,
++		wdm_out_callback,
++		desc
++	);
++
++	req->bRequestType = (USB_DIR_OUT | USB_TYPE_CLASS |
++			     USB_RECIP_INTERFACE);
++	req->bRequest = USB_CDC_SEND_ENCAPSULATED_COMMAND;
++	req->wValue = 0;
++	req->wIndex = desc->inum;
++	req->wLength = cpu_to_le16(count);
++	set_bit(WDM_IN_USE, &desc->flags);
++
++	rv = usb_submit_urb(desc->command, GFP_KERNEL);
++	if (rv < 0) {
++		kfree(buf);
++		clear_bit(WDM_IN_USE, &desc->flags);
++	} else {
++		dev_dbg(&desc->intf->dev, "Tx URB has been submitted index=%d",
++			req->wIndex);
++	}
++out:
++	mutex_unlock(&desc->wlock);
++outnl:
++	return rv < 0 ? rv : count;
++}
++
++static ssize_t wdm_read
++(struct file *file, char __user *buffer, size_t count, loff_t *ppos)
++{
++	int rv, cntr;
++	int i = 0;
++	struct wdm_device *desc = file->private_data;
++
++
++	rv = mutex_lock_interruptible(&desc->rlock); /*concurrent reads */
++	if (rv < 0)
++		return -ERESTARTSYS;
++
++	if (desc->length == 0) {
++		desc->read = 0;
++retry:
++		i++;
++		rv = wait_event_interruptible(desc->wait,
++					      test_bit(WDM_READ, &desc->flags));
++
++		if (rv < 0) {
++			rv = -ERESTARTSYS;
++			goto err;
++		}
++
++		spin_lock_irq(&desc->iuspin);
++
++		if (desc->rerr) { /* read completed, error happened */
++			int t = desc->rerr;
++			desc->rerr = 0;
++			spin_unlock_irq(&desc->iuspin);
++			err("reading had resulted in %d", t);
++			rv = -EIO;
++			goto err;
++		}
++		/*
++		 * recheck whether we've lost the race
++		 * against the completion handler
++		 */
++		if (!test_bit(WDM_READ, &desc->flags)) { /* lost race */
++			spin_unlock_irq(&desc->iuspin);
++			goto retry;
++		}
++		if (!desc->reslength) { /* zero length read */
++			spin_unlock_irq(&desc->iuspin);
++			goto retry;
++		}
++		clear_bit(WDM_READ, &desc->flags);
++		spin_unlock_irq(&desc->iuspin);
++	}
++
++	cntr = count > desc->length ? desc->length : count;
++	rv = copy_to_user(buffer, desc->ubuf, cntr);
++	if (rv > 0) {
++		rv = -EFAULT;
++		goto err;
++	}
++
++	for (i = 0; i < desc->length - cntr; i++)
++		desc->ubuf[i] = desc->ubuf[i + cntr];
++
++	desc->length -= cntr;
++	rv = cntr;
++
++err:
++	mutex_unlock(&desc->rlock);
++	if (rv < 0)
++		err("wdm_read: exit error");
++	return rv;
++}
++
++static int wdm_flush(struct file *file, fl_owner_t id)
++{
++	struct wdm_device *desc = file->private_data;
++
++	wait_event(desc->wait, !test_bit(WDM_IN_USE, &desc->flags));
++	if (desc->werr < 0)
++		err("Error in flush path: %d", desc->werr);
++
++	return desc->werr;
++}
++
++static unsigned int wdm_poll(struct file *file, struct poll_table_struct *wait)
++{
++	struct wdm_device *desc = file->private_data;
++	unsigned long flags;
++	unsigned int mask = 0;
++
++	spin_lock_irqsave(&desc->iuspin, flags);
++	if (test_bit(WDM_DISCONNECTING, &desc->flags)) {
++		mask = POLLERR;
++		spin_unlock_irqrestore(&desc->iuspin, flags);
++		goto desc_out;
++	}
++	if (test_bit(WDM_READ, &desc->flags))
++		mask = POLLIN | POLLRDNORM;
++	if (desc->rerr || desc->werr)
++		mask |= POLLERR;
++	if (!test_bit(WDM_IN_USE, &desc->flags))
++		mask |= POLLOUT | POLLWRNORM;
++	spin_unlock_irqrestore(&desc->iuspin, flags);
++
++	poll_wait(file, &desc->wait, wait);
++
++desc_out:
++	return mask;
++}
++
++static int wdm_open(struct inode *inode, struct file *file)
++{
++	int minor = iminor(inode);
++	int rv = -ENODEV;
++	struct usb_interface *intf;
++	struct wdm_device *desc;
++
++	mutex_lock(&wdm_mutex);
++	intf = usb_find_interface(&wdm_driver, minor);
++	if (!intf)
++		goto out;
++
++	desc = usb_get_intfdata(intf);
++	if (test_bit(WDM_DISCONNECTING, &desc->flags))
++		goto out;
++
++	desc->count++;
++	file->private_data = desc;
++
++	rv = usb_submit_urb(desc->validity, GFP_KERNEL);
++
++	if (rv < 0) {
++		desc->count--;
++		err("Error submitting int urb - %d", rv);
++		goto out;
++	}
++	rv = 0;
++
++out:
++	mutex_unlock(&wdm_mutex);
++	return rv;
++}
++
++static int wdm_release(struct inode *inode, struct file *file)
++{
++	struct wdm_device *desc = file->private_data;
++
++	mutex_lock(&wdm_mutex);
++	desc->count--;
++	if (!desc->count) {
++		dev_dbg(&desc->intf->dev, "wdm_release: cleanup");
++		kill_urbs(desc);
++	}
++	mutex_unlock(&wdm_mutex);
++	return 0;
++}
++
++static const struct file_operations wdm_fops = {
++	.owner =	THIS_MODULE,
++	.read =		wdm_read,
++	.write =	wdm_write,
++	.open =		wdm_open,
++	.flush =	wdm_flush,
++	.release =	wdm_release,
++	.poll =		wdm_poll
++};
++
++static struct usb_class_driver wdm_class = {
++	.name =		"cdc-wdm%d",
++	.fops =		&wdm_fops,
++	.minor_base =	WDM_MINOR_BASE,
++};
++
++/* --- error handling --- */
++static void wdm_rxwork(struct work_struct *work)
++{
++	struct wdm_device *desc = container_of(work, struct wdm_device, rxwork);
++	unsigned long flags;
++	int rv;
++
++	spin_lock_irqsave(&desc->iuspin, flags);
++	if (test_bit(WDM_DISCONNECTING, &desc->flags)) {
++		spin_unlock_irqrestore(&desc->iuspin, flags);
++	} else {
++		spin_unlock_irqrestore(&desc->iuspin, flags);
++		rv = usb_submit_urb(desc->response, GFP_KERNEL);
++		if (rv < 0 && rv != -EPERM) {
++			spin_lock_irqsave(&desc->iuspin, flags);
++			if (!test_bit(WDM_DISCONNECTING, &desc->flags))
++				schedule_work(&desc->rxwork);
++			spin_unlock_irqrestore(&desc->iuspin, flags);
++		}
++	}
++}
++
++/* --- hotplug --- */
++
++static int wdm_probe(struct usb_interface *intf, const struct usb_device_id *id)
++{
++	int rv = -EINVAL;
++	struct usb_device *udev = interface_to_usbdev(intf);
++	struct wdm_device *desc;
++	struct usb_host_interface *iface;
++	struct usb_endpoint_descriptor *ep;
++	struct usb_cdc_dmm_desc *dmhd;
++	u8 *buffer = intf->altsetting->extra;
++	int buflen = intf->altsetting->extralen;
++	u16 maxcom = 0;
++
++	if (!buffer)
++		goto out;
++
++	while (buflen > 0) {
++		if (buffer [1] != USB_DT_CS_INTERFACE) {
++			err("skipping garbage");
++			goto next_desc;
++		}
++
++		switch (buffer [2]) {
++		case USB_CDC_HEADER_TYPE:
++			break;
++		case USB_CDC_DMM_TYPE:
++			dmhd = (struct usb_cdc_dmm_desc *)buffer;
++			maxcom = le16_to_cpu(dmhd->wMaxCommand);
++			dev_dbg(&intf->dev,
++				"Finding maximum buffer length: %d", maxcom);
++			break;
++		default:
++			err("Ignoring extra header, type %d, length %d",
++				buffer[2], buffer[0]);
++			break;
++		}
++next_desc:
++		buflen -= buffer[0];
++		buffer += buffer[0];
++	}
++
++	rv = -ENOMEM;
++	desc = kzalloc(sizeof(struct wdm_device), GFP_KERNEL);
++	if (!desc)
++		goto out;
++	mutex_init(&desc->wlock);
++	mutex_init(&desc->rlock);
++	spin_lock_init(&desc->iuspin);
++	init_waitqueue_head(&desc->wait);
++	desc->wMaxCommand = maxcom;
++	desc->inum = cpu_to_le16((u16)intf->cur_altsetting->desc.bInterfaceNumber);
++	desc->intf = intf;
++	INIT_WORK(&desc->rxwork, wdm_rxwork);
++
++	iface = &intf->altsetting[0];
++	ep = &iface->endpoint[0].desc;
++	if (!usb_endpoint_is_int_in(ep)) {
++		rv = -EINVAL;
++		goto err;
++	}
++
++	desc->wMaxPacketSize = ep->wMaxPacketSize;
++	desc->bMaxPacketSize0 = cpu_to_le16(udev->descriptor.bMaxPacketSize0);
++
++	desc->orq = kmalloc(sizeof(struct usb_ctrlrequest), GFP_KERNEL);
++	if (!desc->orq)
++		goto err;
++	desc->irq = kmalloc(sizeof(struct usb_ctrlrequest), GFP_KERNEL);
++	if (!desc->irq)
++		goto err;
++
++	desc->validity = usb_alloc_urb(0, GFP_KERNEL);
++	if (!desc->validity)
++		goto err;
++
++	desc->response = usb_alloc_urb(0, GFP_KERNEL);
++	if (!desc->response)
++		goto err;
++
++	desc->command = usb_alloc_urb(0, GFP_KERNEL);
++	if (!desc->command)
++		goto err;
++
++	desc->ubuf = kmalloc(desc->wMaxCommand, GFP_KERNEL);
++	if (!desc->ubuf)
++		goto err;
++
++	desc->sbuf = usb_buffer_alloc(interface_to_usbdev(intf),
++					desc->wMaxPacketSize,
++					GFP_KERNEL,
++					&desc->validity->transfer_dma);
++	if (!desc->sbuf)
++		goto err;
++
++	desc->inbuf = usb_buffer_alloc(interface_to_usbdev(intf),
++					desc->bMaxPacketSize0,
++					GFP_KERNEL,
++					&desc->response->transfer_dma);
++	if (!desc->inbuf)
++		goto err2;
++
++	usb_fill_int_urb(
++		desc->validity,
++		interface_to_usbdev(intf),
++		usb_rcvintpipe(interface_to_usbdev(intf), ep->bEndpointAddress),
++		desc->sbuf,
++		desc->wMaxPacketSize,
++		wdm_int_callback,
++		desc,
++		ep->bInterval
++	);
++	desc->validity->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
++
++	usb_set_intfdata(intf, desc);
++	rv = usb_register_dev(intf, &wdm_class);
++	dev_info(&intf->dev, "cdc-wdm%d: USB WDM device\n",
++		 intf->minor - WDM_MINOR_BASE);
++	if (rv < 0)
++		goto err;
++out:
++	return rv;
++err2:
++	usb_buffer_free(interface_to_usbdev(desc->intf),
++			desc->wMaxPacketSize,
++			desc->sbuf,
++			desc->validity->transfer_dma);
++err:
++	free_urbs(desc);
++	kfree(desc->ubuf);
++	kfree(desc->orq);
++	kfree(desc->irq);
++	kfree(desc);
++	return rv;
++}
++
++static void wdm_disconnect(struct usb_interface *intf)
++{
++	struct wdm_device *desc;
++	unsigned long flags;
++
++	usb_deregister_dev(intf, &wdm_class);
++	mutex_lock(&wdm_mutex);
++	desc = usb_get_intfdata(intf);
++
++	/* the spinlock makes sure no new urbs are generated in the callbacks */
++	spin_lock_irqsave(&desc->iuspin, flags);
++	set_bit(WDM_DISCONNECTING, &desc->flags);
++	set_bit(WDM_READ, &desc->flags);
++	clear_bit(WDM_IN_USE, &desc->flags);
++	spin_unlock_irqrestore(&desc->iuspin, flags);
++	cancel_work_sync(&desc->rxwork);
++	kill_urbs(desc);
++	wake_up_all(&desc->wait);
++	if (!desc->count)
++		cleanup(desc);
++	mutex_unlock(&wdm_mutex);
++}
++
++static struct usb_driver wdm_driver = {
++	.name =		"cdc_wdm",
++	.probe =	wdm_probe,
++	.disconnect =	wdm_disconnect,
++	.id_table =	wdm_ids,
++};
++
++/* --- low level module stuff --- */
++
++static int __init wdm_init(void)
++{
++	int rv;
++
++	rv = usb_register(&wdm_driver);
++
++	return rv;
++}
++
++static void __exit wdm_exit(void)
++{
++	usb_deregister(&wdm_driver);
++}
++
++module_init(wdm_init);
++module_exit(wdm_exit);
++
++MODULE_AUTHOR(DRIVER_AUTHOR);
++MODULE_DESCRIPTION("USB Abstract Control Model driver for "
++		   "USB WCM Device Management");
++MODULE_LICENSE("GPL");
+diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
+index bf10e9c..09a53e7 100644
+--- a/drivers/usb/core/hcd.c
++++ b/drivers/usb/core/hcd.c
+@@ -818,12 +818,12 @@ static int usb_register_bus(struct usb_bus *bus)
+ 	set_bit (busnum, busmap.busmap);
+ 	bus->busnum = busnum;
+ 
+-	bus->dev = device_create(usb_host_class, bus->controller, MKDEV(0, 0),
+-				 "usb_host%d", busnum);
++	bus->dev = device_create_drvdata(usb_host_class, bus->controller,
++					 MKDEV(0, 0), bus,
++					 "usb_host%d", busnum);
+ 	result = PTR_ERR(bus->dev);
+ 	if (IS_ERR(bus->dev))
+ 		goto error_create_class_dev;
+-	dev_set_drvdata(bus->dev, bus);
+ 
+ 	/* Add it to the local list of buses */
+ 	list_add (&bus->bus_list, &usb_bus_list);
+diff --git a/drivers/usb/gadget/pxa27x_udc.c b/drivers/usb/gadget/pxa27x_udc.c
+index 499b7a2..e02bfd4 100644
+--- a/drivers/usb/gadget/pxa27x_udc.c
++++ b/drivers/usb/gadget/pxa27x_udc.c
+@@ -1526,7 +1526,8 @@ static void udc_disable(struct pxa_udc *udc)
+ 
+ 	ep0_idle(udc);
+ 	udc->gadget.speed = USB_SPEED_UNKNOWN;
+-	udc->mach->udc_command(PXA2XX_UDC_CMD_DISCONNECT);
++	if (udc->mach->udc_command)
++		udc->mach->udc_command(PXA2XX_UDC_CMD_DISCONNECT);
+ }
+ 
+ /**
+diff --git a/drivers/usb/host/ehci-orion.c b/drivers/usb/host/ehci-orion.c
+index d187d03..3adfda8 100644
+--- a/drivers/usb/host/ehci-orion.c
++++ b/drivers/usb/host/ehci-orion.c
+@@ -115,6 +115,8 @@ static int ehci_orion_setup(struct usb_hcd *hcd)
+ 	if (retval)
+ 		return retval;
+ 
++	hcd->has_tt = 1;
++
+ 	ehci_reset(ehci);
+ 	ehci_port_power(ehci, 0);
+ 
+diff --git a/drivers/usb/misc/phidgetkit.c b/drivers/usb/misc/phidgetkit.c
+index 24230c6..4cfa25b 100644
+--- a/drivers/usb/misc/phidgetkit.c
++++ b/drivers/usb/misc/phidgetkit.c
+@@ -595,14 +595,14 @@ static int interfacekit_probe(struct usb_interface *intf, const struct usb_devic
+         } while(value);
+         kit->dev_no = bit;
+ 
+-        kit->dev = device_create(phidget_class, &kit->udev->dev, 0,
+-               		"interfacekit%d", kit->dev_no);
++	kit->dev = device_create_drvdata(phidget_class, &kit->udev->dev,
++					MKDEV(0, 0), kit,
++					"interfacekit%d", kit->dev_no);
+         if (IS_ERR(kit->dev)) {
+                 rc = PTR_ERR(kit->dev);
+                 kit->dev = NULL;
+                 goto out;
+         }
+-	dev_set_drvdata(kit->dev, kit);
+ 
+ 	if (usb_submit_urb(kit->irq, GFP_KERNEL)) {
+ 		rc = -EIO;
+diff --git a/drivers/usb/misc/phidgetmotorcontrol.c b/drivers/usb/misc/phidgetmotorcontrol.c
+index f0113c1..9b4696f 100644
+--- a/drivers/usb/misc/phidgetmotorcontrol.c
++++ b/drivers/usb/misc/phidgetmotorcontrol.c
+@@ -365,16 +365,15 @@ static int motorcontrol_probe(struct usb_interface *intf, const struct usb_devic
+ 	} while(value);
+ 	mc->dev_no = bit;
+ 
+-	mc->dev = device_create(phidget_class, &mc->udev->dev, 0,
+-				"motorcontrol%d", mc->dev_no);
++	mc->dev = device_create_drvdata(phidget_class, &mc->udev->dev,
++					MKDEV(0, 0), mc,
++					"motorcontrol%d", mc->dev_no);
+ 	if (IS_ERR(mc->dev)) {
+ 		rc = PTR_ERR(mc->dev);
+ 		mc->dev = NULL;
+ 		goto out;
+ 	}
+ 
+-	dev_set_drvdata(mc->dev, mc);
+-
+ 	if (usb_submit_urb(mc->irq, GFP_KERNEL)) {
+ 		rc = -EIO;
+ 		goto out;
+diff --git a/drivers/usb/misc/phidgetservo.c b/drivers/usb/misc/phidgetservo.c
+index 7d590c0..1ca7ddb 100644
+--- a/drivers/usb/misc/phidgetservo.c
++++ b/drivers/usb/misc/phidgetservo.c
+@@ -275,14 +275,14 @@ servo_probe(struct usb_interface *interface, const struct usb_device_id *id)
+         } while (value);
+ 	dev->dev_no = bit;
+ 
+-	dev->dev = device_create(phidget_class, &dev->udev->dev, 0,
+-				 "servo%d", dev->dev_no);
++	dev->dev = device_create_drvdata(phidget_class, &dev->udev->dev,
++					 MKDEV(0, 0), dev,
++					 "servo%d", dev->dev_no);
+ 	if (IS_ERR(dev->dev)) {
+ 		rc = PTR_ERR(dev->dev);
+ 		dev->dev = NULL;
+ 		goto out;
+ 	}
+-	dev_set_drvdata(dev->dev, dev);
+ 
+ 	servo_count = dev->type & SERVO_COUNT_QUAD ? 4 : 1;
+ 
+diff --git a/drivers/usb/serial/ch341.c b/drivers/usb/serial/ch341.c
+index ba28fdc..1f7c86b 100644
+--- a/drivers/usb/serial/ch341.c
++++ b/drivers/usb/serial/ch341.c
+@@ -28,6 +28,7 @@ static int debug;
+ 
+ static struct usb_device_id id_table [] = {
+ 	{ USB_DEVICE(0x4348, 0x5523) },
++	{ USB_DEVICE(0x1a86, 0x7523) },
+ 	{ },
+ };
+ MODULE_DEVICE_TABLE(usb, id_table);
+diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
+index 5b349ec..3cee6fe 100644
+--- a/drivers/usb/serial/ftdi_sio.c
++++ b/drivers/usb/serial/ftdi_sio.c
+@@ -374,6 +374,7 @@ static struct usb_device_id id_table_combined [] = {
+ 		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
+ 	{ USB_DEVICE(FTDI_VID, FTDI_OOCDLINK_PID),
+ 		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
++	{ USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID_USB60F) },
+ 	{ },					/* Optional parameter entry */
+ 	{ }					/* Terminating entry */
+ };
+diff --git a/drivers/usb/serial/ftdi_sio.h b/drivers/usb/serial/ftdi_sio.h
+index 504edf8..a72f2c8 100644
+--- a/drivers/usb/serial/ftdi_sio.h
++++ b/drivers/usb/serial/ftdi_sio.h
+@@ -592,6 +592,12 @@
+ #define	FIC_NEO1973_DEBUG_PID	0x5118
+ 
+ /*
++ * RATOC REX-USB60F
++ */
++#define RATOC_VENDOR_ID		0x0584
++#define RATOC_PRODUCT_ID_USB60F	0xb020
++
++/*
+  *   BmRequestType:  1100 0000b
+  *   bRequest:       FTDI_E2_READ
+  *   wValue:         0
+diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
+index e7e016e..6cecd2c 100644
+--- a/drivers/usb/serial/option.c
++++ b/drivers/usb/serial/option.c
+@@ -183,6 +183,7 @@ static int  option_send_setup(struct usb_serial_port *port);
+ #define AXESSTEL_PRODUCT_MV110H			0x1000
+ 
+ #define ONDA_VENDOR_ID				0x19d2
++#define ONDA_PRODUCT_MSA501HS			0x0001
+ #define ONDA_PRODUCT_ET502HS			0x0002
+ 
+ #define BANDRICH_VENDOR_ID			0x1A8D
+@@ -196,6 +197,9 @@ static int  option_send_setup(struct usb_serial_port *port);
+ 
+ #define MAXON_VENDOR_ID				0x16d8
+ 
++#define TELIT_VENDOR_ID				0x1bc7
++#define TELIT_PRODUCT_UC864E			0x1003
++
+ static struct usb_device_id option_ids[] = {
+ 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) },
+ 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) },
+@@ -297,13 +301,14 @@ static struct usb_device_id option_ids[] = {
+ 	{ USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) },
+ 	{ USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_500A) },
+ 	{ USB_DEVICE(AXESSTEL_VENDOR_ID, AXESSTEL_PRODUCT_MV110H) },
++	{ USB_DEVICE(ONDA_VENDOR_ID, ONDA_PRODUCT_MSA501HS) },
+ 	{ USB_DEVICE(ONDA_VENDOR_ID, ONDA_PRODUCT_ET502HS) },
+ 	{ USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_1) },
+ 	{ USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_2) },
+ 	{ USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC680) },
+ 	{ USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */
+ 	{ USB_DEVICE(MAXON_VENDOR_ID, 0x6280) }, /* BP3-USB & BP3-EXT HSDPA */
+-	{ USB_DEVICE(0x19d2, 0x0001) }, 	/* Telstra NextG CDMA */
++	{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864E) },
+ 	{ } /* Terminating entry */
+ };
+ MODULE_DEVICE_TABLE(usb, option_ids);
+diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c
+index c605fb6..234c5ee 100644
+--- a/drivers/usb/serial/pl2303.c
++++ b/drivers/usb/serial/pl2303.c
+@@ -66,7 +66,6 @@ static struct usb_device_id id_table [] = {
+ 	{ USB_DEVICE(ITEGNO_VENDOR_ID, ITEGNO_PRODUCT_ID_2080) },
+ 	{ USB_DEVICE(MA620_VENDOR_ID, MA620_PRODUCT_ID) },
+ 	{ USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID) },
+-	{ USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID_USB60F) },
+ 	{ USB_DEVICE(TRIPP_VENDOR_ID, TRIPP_PRODUCT_ID) },
+ 	{ USB_DEVICE(RADIOSHACK_VENDOR_ID, RADIOSHACK_PRODUCT_ID) },
+ 	{ USB_DEVICE(DCU10_VENDOR_ID, DCU10_PRODUCT_ID) },
+diff --git a/drivers/usb/serial/pl2303.h b/drivers/usb/serial/pl2303.h
+index 10cf872..3bdefe0 100644
+--- a/drivers/usb/serial/pl2303.h
++++ b/drivers/usb/serial/pl2303.h
+@@ -36,7 +36,6 @@
+ 
+ #define RATOC_VENDOR_ID		0x0584
+ #define RATOC_PRODUCT_ID	0xb000
+-#define RATOC_PRODUCT_ID_USB60F	0xb020
+ 
+ #define TRIPP_VENDOR_ID		0x2478
+ #define TRIPP_PRODUCT_ID	0x2008
+diff --git a/drivers/video/display/display-sysfs.c b/drivers/video/display/display-sysfs.c
+index 3547717..6ef800b 100644
+--- a/drivers/video/display/display-sysfs.c
++++ b/drivers/video/display/display-sysfs.c
+@@ -26,6 +26,7 @@
+ #include <linux/ctype.h>
+ #include <linux/idr.h>
+ #include <linux/err.h>
++#include <linux/kdev_t.h>
+ 
+ static ssize_t display_show_name(struct device *dev,
+ 				struct device_attribute *attr, char *buf)
+@@ -152,10 +153,13 @@ struct display_device *display_device_register(struct display_driver *driver,
+ 		mutex_unlock(&allocated_dsp_lock);
+ 
+ 		if (!ret) {
+-			new_dev->dev = device_create(display_class, parent, 0,
+-						"display%d", new_dev->idx);
++			new_dev->dev = device_create_drvdata(display_class,
++							     parent,
++							     MKDEV(0,0),
++							     new_dev,
++							     "display%d",
++							     new_dev->idx);
+ 			if (!IS_ERR(new_dev->dev)) {
+-				dev_set_drvdata(new_dev->dev, new_dev);
+ 				new_dev->parent = parent;
+ 				new_dev->driver = driver;
+ 				mutex_init(&new_dev->lock);
+diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c
+index b25707f..0fa95b1 100644
+--- a/fs/binfmt_elf.c
++++ b/fs/binfmt_elf.c
+@@ -256,7 +256,7 @@ create_elf_tables(struct linux_binprm *bprm, struct elfhdr *exec,
+ 			return -EFAULT;
+ 		len = strnlen_user((void __user *)p, MAX_ARG_STRLEN);
+ 		if (!len || len > MAX_ARG_STRLEN)
+-			return 0;
++			return -EINVAL;
+ 		p += len;
+ 	}
+ 	if (__put_user(0, argv))
+@@ -268,7 +268,7 @@ create_elf_tables(struct linux_binprm *bprm, struct elfhdr *exec,
+ 			return -EFAULT;
+ 		len = strnlen_user((void __user *)p, MAX_ARG_STRLEN);
+ 		if (!len || len > MAX_ARG_STRLEN)
+-			return 0;
++			return -EINVAL;
+ 		p += len;
+ 	}
+ 	if (__put_user(0, envp))
+@@ -1900,7 +1900,7 @@ static int elf_core_dump(long signr, struct pt_regs *regs, struct file *file, un
+ 	/* alloc memory for large data structures: too large to be on stack */
+ 	elf = kmalloc(sizeof(*elf), GFP_KERNEL);
+ 	if (!elf)
+-		goto cleanup;
++		goto out;
+ 	
+ 	segs = current->mm->map_count;
+ #ifdef ELF_CORE_EXTRA_PHDRS
+@@ -2034,8 +2034,9 @@ end_coredump:
+ 	set_fs(fs);
+ 
+ cleanup:
+-	kfree(elf);
+ 	free_note_info(&info);
++	kfree(elf);
++out:
+ 	return has_dumped;
+ }
+ 
+diff --git a/fs/compat.c b/fs/compat.c
+index 332a869..ed43e17 100644
+--- a/fs/compat.c
++++ b/fs/compat.c
+@@ -1405,7 +1405,7 @@ int compat_do_execve(char * filename,
+ 		/* execve success */
+ 		security_bprm_free(bprm);
+ 		acct_update_integrals(current);
+-		kfree(bprm);
++		free_bprm(bprm);
+ 		return retval;
+ 	}
+ 
+@@ -1424,7 +1424,7 @@ out_file:
+ 	}
+ 
+ out_kfree:
+-	kfree(bprm);
++	free_bprm(bprm);
+ 
+ out_ret:
+ 	return retval;
+diff --git a/fs/dlm/lowcomms.c b/fs/dlm/lowcomms.c
+index 7c1e5e5..637018c 100644
+--- a/fs/dlm/lowcomms.c
++++ b/fs/dlm/lowcomms.c
+@@ -50,6 +50,7 @@
+ #include <linux/pagemap.h>
+ #include <linux/idr.h>
+ #include <linux/file.h>
++#include <linux/mutex.h>
+ #include <linux/sctp.h>
+ #include <net/sctp/user.h>
+ 
+@@ -138,7 +139,7 @@ static struct workqueue_struct *recv_workqueue;
+ static struct workqueue_struct *send_workqueue;
+ 
+ static DEFINE_IDR(connections_idr);
+-static DECLARE_MUTEX(connections_lock);
++static DEFINE_MUTEX(connections_lock);
+ static int max_nodeid;
+ static struct kmem_cache *con_cache;
+ 
+@@ -205,9 +206,9 @@ static struct connection *nodeid2con(int nodeid, gfp_t allocation)
+ {
+ 	struct connection *con;
+ 
+-	down(&connections_lock);
++	mutex_lock(&connections_lock);
+ 	con = __nodeid2con(nodeid, allocation);
+-	up(&connections_lock);
++	mutex_unlock(&connections_lock);
+ 
+ 	return con;
+ }
+@@ -218,15 +219,15 @@ static struct connection *assoc2con(int assoc_id)
+ 	int i;
+ 	struct connection *con;
+ 
+-	down(&connections_lock);
++	mutex_lock(&connections_lock);
+ 	for (i=0; i<=max_nodeid; i++) {
+ 		con = __nodeid2con(i, 0);
+ 		if (con && con->sctp_assoc == assoc_id) {
+-			up(&connections_lock);
++			mutex_unlock(&connections_lock);
+ 			return con;
+ 		}
+ 	}
+-	up(&connections_lock);
++	mutex_unlock(&connections_lock);
+ 	return NULL;
+ }
+ 
+@@ -381,7 +382,7 @@ static void sctp_init_failed(void)
+ 	int i;
+ 	struct connection *con;
+ 
+-	down(&connections_lock);
++	mutex_lock(&connections_lock);
+ 	for (i=1; i<=max_nodeid; i++) {
+ 		con = __nodeid2con(i, 0);
+ 		if (!con)
+@@ -393,7 +394,7 @@ static void sctp_init_failed(void)
+ 			}
+ 		}
+ 	}
+-	up(&connections_lock);
++	mutex_unlock(&connections_lock);
+ }
+ 
+ /* Something happened to an association */
+@@ -930,7 +931,7 @@ out_err:
+ 	 * errors we try again until the max number of retries is reached.
+ 	 */
+ 	if (result != -EHOSTUNREACH && result != -ENETUNREACH &&
+-	    result != -ENETDOWN && result != EINVAL
++	    result != -ENETDOWN && result != -EINVAL
+ 	    && result != -EPROTONOSUPPORT) {
+ 		lowcomms_connect_sock(con);
+ 		result = 0;
+@@ -1417,7 +1418,7 @@ void dlm_lowcomms_stop(void)
+ 	/* Set all the flags to prevent any
+ 	   socket activity.
+ 	*/
+-	down(&connections_lock);
++	mutex_lock(&connections_lock);
+ 	for (i = 0; i <= max_nodeid; i++) {
+ 		con = __nodeid2con(i, 0);
+ 		if (con) {
+@@ -1426,11 +1427,11 @@ void dlm_lowcomms_stop(void)
+ 				con->sock->sk->sk_user_data = NULL;
+ 		}
+ 	}
+-	up(&connections_lock);
++	mutex_unlock(&connections_lock);
+ 
+ 	work_stop();
+ 
+-	down(&connections_lock);
++	mutex_lock(&connections_lock);
+ 	clean_writequeues();
+ 
+ 	for (i = 0; i <= max_nodeid; i++) {
+@@ -1443,7 +1444,7 @@ void dlm_lowcomms_stop(void)
+ 		}
+ 	}
+ 	max_nodeid = 0;
+-	up(&connections_lock);
++	mutex_unlock(&connections_lock);
+ 	kmem_cache_destroy(con_cache);
+ 	idr_init(&connections_idr);
+ }
+diff --git a/fs/dlm/netlink.c b/fs/dlm/netlink.c
+index 7145936..18bda83 100644
+--- a/fs/dlm/netlink.c
++++ b/fs/dlm/netlink.c
+@@ -95,7 +95,7 @@ int __init dlm_netlink_init(void)
+ 	return rv;
+ }
+ 
+-void __exit dlm_netlink_exit(void)
++void dlm_netlink_exit(void)
+ {
+ 	genl_unregister_ops(&family, &dlm_nl_ops);
+ 	genl_unregister_family(&family);
+diff --git a/fs/dlm/plock.c b/fs/dlm/plock.c
+index d6d6e37..78878c5 100644
+--- a/fs/dlm/plock.c
++++ b/fs/dlm/plock.c
+@@ -379,7 +379,7 @@ static ssize_t dev_write(struct file *file, const char __user *u, size_t count,
+ 		struct plock_xop *xop;
+ 		xop = (struct plock_xop *)op;
+ 		if (xop->callback)
+-			count = dlm_plock_callback(op);
++			dlm_plock_callback(op);
+ 		else
+ 			wake_up(&recv_wq);
+ 	} else
+diff --git a/fs/exec.c b/fs/exec.c
+index 1f8a24a..3c2ba7c 100644
+--- a/fs/exec.c
++++ b/fs/exec.c
+@@ -1251,6 +1251,12 @@ int search_binary_handler(struct linux_binprm *bprm,struct pt_regs *regs)
+ 
+ EXPORT_SYMBOL(search_binary_handler);
+ 
++void free_bprm(struct linux_binprm *bprm)
++{
++	free_arg_pages(bprm);
++	kfree(bprm);
++}
++
+ /*
+  * sys_execve() executes a new program.
+  */
+@@ -1320,17 +1326,15 @@ int do_execve(char * filename,
+ 	retval = search_binary_handler(bprm,regs);
+ 	if (retval >= 0) {
+ 		/* execve success */
+-		free_arg_pages(bprm);
+ 		security_bprm_free(bprm);
+ 		acct_update_integrals(current);
+-		kfree(bprm);
++		free_bprm(bprm);
+ 		if (displaced)
+ 			put_files_struct(displaced);
+ 		return retval;
+ 	}
+ 
+ out:
+-	free_arg_pages(bprm);
+ 	if (bprm->security)
+ 		security_bprm_free(bprm);
+ 
+@@ -1344,7 +1348,7 @@ out_file:
+ 		fput(bprm->file);
+ 	}
+ out_kfree:
+-	kfree(bprm);
++	free_bprm(bprm);
+ 
+ out_files:
+ 	if (displaced)
+diff --git a/fs/file.c b/fs/file.c
+index 4c6f0ea..7b3887e 100644
+--- a/fs/file.c
++++ b/fs/file.c
+@@ -26,6 +26,8 @@ struct fdtable_defer {
+ };
+ 
+ int sysctl_nr_open __read_mostly = 1024*1024;
++int sysctl_nr_open_min = BITS_PER_LONG;
++int sysctl_nr_open_max = 1024 * 1024; /* raised later */
+ 
+ /*
+  * We use this list to defer free fdtables that have vmalloced
+@@ -119,8 +121,6 @@ static void copy_fdtable(struct fdtable *nfdt, struct fdtable *ofdt)
+ 	unsigned int cpy, set;
+ 
+ 	BUG_ON(nfdt->max_fds < ofdt->max_fds);
+-	if (ofdt->max_fds == 0)
+-		return;
+ 
+ 	cpy = ofdt->max_fds * sizeof(struct file *);
+ 	set = (nfdt->max_fds - ofdt->max_fds) * sizeof(struct file *);
+@@ -261,6 +261,139 @@ int expand_files(struct files_struct *files, int nr)
+ 	return expand_fdtable(files, nr);
+ }
+ 
++static int count_open_files(struct fdtable *fdt)
++{
++	int size = fdt->max_fds;
++	int i;
++
++	/* Find the last open fd */
++	for (i = size/(8*sizeof(long)); i > 0; ) {
++		if (fdt->open_fds->fds_bits[--i])
++			break;
++	}
++	i = (i+1) * 8 * sizeof(long);
++	return i;
++}
++
++/*
++ * Allocate a new files structure and copy contents from the
++ * passed in files structure.
++ * errorp will be valid only when the returned files_struct is NULL.
++ */
++struct files_struct *dup_fd(struct files_struct *oldf, int *errorp)
++{
++	struct files_struct *newf;
++	struct file **old_fds, **new_fds;
++	int open_files, size, i;
++	struct fdtable *old_fdt, *new_fdt;
++
++	*errorp = -ENOMEM;
++	newf = kmem_cache_alloc(files_cachep, GFP_KERNEL);
++	if (!newf)
++		goto out;
++
++	atomic_set(&newf->count, 1);
++
++	spin_lock_init(&newf->file_lock);
++	newf->next_fd = 0;
++	new_fdt = &newf->fdtab;
++	new_fdt->max_fds = NR_OPEN_DEFAULT;
++	new_fdt->close_on_exec = (fd_set *)&newf->close_on_exec_init;
++	new_fdt->open_fds = (fd_set *)&newf->open_fds_init;
++	new_fdt->fd = &newf->fd_array[0];
++	INIT_RCU_HEAD(&new_fdt->rcu);
++	new_fdt->next = NULL;
++
++	spin_lock(&oldf->file_lock);
++	old_fdt = files_fdtable(oldf);
++	open_files = count_open_files(old_fdt);
++
++	/*
++	 * Check whether we need to allocate a larger fd array and fd set.
++	 */
++	while (unlikely(open_files > new_fdt->max_fds)) {
++		spin_unlock(&oldf->file_lock);
++
++		if (new_fdt != &newf->fdtab) {
++			free_fdarr(new_fdt);
++			free_fdset(new_fdt);
++			kfree(new_fdt);
++		}
++
++		new_fdt = alloc_fdtable(open_files - 1);
++		if (!new_fdt) {
++			*errorp = -ENOMEM;
++			goto out_release;
++		}
++
++		/* beyond sysctl_nr_open; nothing to do */
++		if (unlikely(new_fdt->max_fds < open_files)) {
++			free_fdarr(new_fdt);
++			free_fdset(new_fdt);
++			kfree(new_fdt);
++			*errorp = -EMFILE;
++			goto out_release;
++		}
++
++		/*
++		 * Reacquire the oldf lock and a pointer to its fd table
++		 * who knows it may have a new bigger fd table. We need
++		 * the latest pointer.
++		 */
++		spin_lock(&oldf->file_lock);
++		old_fdt = files_fdtable(oldf);
++		open_files = count_open_files(old_fdt);
++	}
++
++	old_fds = old_fdt->fd;
++	new_fds = new_fdt->fd;
++
++	memcpy(new_fdt->open_fds->fds_bits,
++		old_fdt->open_fds->fds_bits, open_files/8);
++	memcpy(new_fdt->close_on_exec->fds_bits,
++		old_fdt->close_on_exec->fds_bits, open_files/8);
++
++	for (i = open_files; i != 0; i--) {
++		struct file *f = *old_fds++;
++		if (f) {
++			get_file(f);
++		} else {
++			/*
++			 * The fd may be claimed in the fd bitmap but not yet
++			 * instantiated in the files array if a sibling thread
++			 * is partway through open().  So make sure that this
++			 * fd is available to the new process.
++			 */
++			FD_CLR(open_files - i, new_fdt->open_fds);
++		}
++		rcu_assign_pointer(*new_fds++, f);
++	}
++	spin_unlock(&oldf->file_lock);
++
++	/* compute the remainder to be cleared */
++	size = (new_fdt->max_fds - open_files) * sizeof(struct file *);
++
++	/* This is long word aligned thus could use a optimized version */
++	memset(new_fds, 0, size);
++
++	if (new_fdt->max_fds > open_files) {
++		int left = (new_fdt->max_fds-open_files)/8;
++		int start = open_files / (8 * sizeof(unsigned long));
++
++		memset(&new_fdt->open_fds->fds_bits[start], 0, left);
++		memset(&new_fdt->close_on_exec->fds_bits[start], 0, left);
++	}
++
++	rcu_assign_pointer(newf->fdt, new_fdt);
++
++	return newf;
++
++out_release:
++	kmem_cache_free(files_cachep, newf);
++out:
++	return NULL;
++}
++
+ static void __devinit fdtable_defer_list_init(int cpu)
+ {
+ 	struct fdtable_defer *fddef = &per_cpu(fdtable_defer_list, cpu);
+@@ -274,4 +407,19 @@ void __init files_defer_init(void)
+ 	int i;
+ 	for_each_possible_cpu(i)
+ 		fdtable_defer_list_init(i);
++	sysctl_nr_open_max = min((size_t)INT_MAX, ~(size_t)0/sizeof(void *)) &
++			     -BITS_PER_LONG;
+ }
++
++struct files_struct init_files = {
++	.count		= ATOMIC_INIT(1),
++	.fdt		= &init_files.fdtab,
++	.fdtab		= {
++		.max_fds	= NR_OPEN_DEFAULT,
++		.fd		= &init_files.fd_array[0],
++		.close_on_exec	= (fd_set *)&init_files.close_on_exec_init,
++		.open_fds	= (fd_set *)&init_files.open_fds_init,
++		.rcu		= RCU_HEAD_INIT,
++	},
++	.file_lock	= __SPIN_LOCK_UNLOCKED(init_task.file_lock),
++};
+diff --git a/fs/gfs2/glops.c b/fs/gfs2/glops.c
+index d31bada..07d84d1 100644
+--- a/fs/gfs2/glops.c
++++ b/fs/gfs2/glops.c
+@@ -249,7 +249,7 @@ static int inode_go_lock(struct gfs2_holder *gh)
+ 	struct gfs2_inode *ip = gl->gl_object;
+ 	int error = 0;
+ 
+-	if (!ip)
++	if (!ip || (gh->gh_flags & GL_SKIP))
+ 		return 0;
+ 
+ 	if (test_bit(GIF_INVALID, &ip->i_flags)) {
+diff --git a/fs/gfs2/incore.h b/fs/gfs2/incore.h
+index 9c2c0b9..eabe5ea 100644
+--- a/fs/gfs2/incore.h
++++ b/fs/gfs2/incore.h
+@@ -236,6 +236,7 @@ enum {
+ 	GIF_INVALID		= 0,
+ 	GIF_QD_LOCKED		= 1,
+ 	GIF_SW_PAGED		= 3,
++	GIF_USER                = 4, /* user inode, not metadata addr space */
+ };
+ 
+ struct gfs2_dinode_host {
+diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c
+index 3a9ef52..09453d0 100644
+--- a/fs/gfs2/inode.c
++++ b/fs/gfs2/inode.c
+@@ -47,8 +47,7 @@ static int iget_test(struct inode *inode, void *opaque)
+ 	struct gfs2_inode *ip = GFS2_I(inode);
+ 	u64 *no_addr = opaque;
+ 
+-	if (ip->i_no_addr == *no_addr &&
+-	    inode->i_private != NULL)
++	if (ip->i_no_addr == *no_addr && test_bit(GIF_USER, &ip->i_flags))
+ 		return 1;
+ 
+ 	return 0;
+@@ -61,6 +60,7 @@ static int iget_set(struct inode *inode, void *opaque)
+ 
+ 	inode->i_ino = (unsigned long)*no_addr;
+ 	ip->i_no_addr = *no_addr;
++	set_bit(GIF_USER, &ip->i_flags);
+ 	return 0;
+ }
+ 
+@@ -86,7 +86,7 @@ static int iget_skip_test(struct inode *inode, void *opaque)
+ 	struct gfs2_inode *ip = GFS2_I(inode);
+ 	struct gfs2_skip_data *data = opaque;
+ 
+-	if (ip->i_no_addr == data->no_addr && inode->i_private != NULL){
++	if (ip->i_no_addr == data->no_addr && test_bit(GIF_USER, &ip->i_flags)){
+ 		if (inode->i_state & (I_FREEING|I_CLEAR|I_WILL_FREE)){
+ 			data->skipped = 1;
+ 			return 0;
+@@ -105,6 +105,7 @@ static int iget_skip_set(struct inode *inode, void *opaque)
+ 		return 1;
+ 	inode->i_ino = (unsigned long)(data->no_addr);
+ 	ip->i_no_addr = data->no_addr;
++	set_bit(GIF_USER, &ip->i_flags);
+ 	return 0;
+ }
+ 
+@@ -166,7 +167,7 @@ void gfs2_set_iop(struct inode *inode)
+  * Returns: A VFS inode, or an error
+  */
+ 
+-struct inode *gfs2_inode_lookup(struct super_block *sb, 
++struct inode *gfs2_inode_lookup(struct super_block *sb,
+ 				unsigned int type,
+ 				u64 no_addr,
+ 				u64 no_formal_ino, int skip_freeing)
+@@ -187,7 +188,6 @@ struct inode *gfs2_inode_lookup(struct super_block *sb,
+ 
+ 	if (inode->i_state & I_NEW) {
+ 		struct gfs2_sbd *sdp = GFS2_SB(inode);
+-		inode->i_private = ip;
+ 		ip->i_no_formal_ino = no_formal_ino;
+ 
+ 		error = gfs2_glock_get(sdp, no_addr, &gfs2_inode_glops, CREATE, &ip->i_gl);
+diff --git a/fs/gfs2/meta_io.c b/fs/gfs2/meta_io.c
+index 85aea27..78d75f8 100644
+--- a/fs/gfs2/meta_io.c
++++ b/fs/gfs2/meta_io.c
+@@ -1,6 +1,6 @@
+ /*
+  * Copyright (C) Sistina Software, Inc.  1997-2003 All rights reserved.
+- * Copyright (C) 2004-2006 Red Hat, Inc.  All rights reserved.
++ * Copyright (C) 2004-2008 Red Hat, Inc.  All rights reserved.
+  *
+  * This copyrighted material is made available to anyone wishing to use,
+  * modify, copy, or redistribute it subject to the terms and conditions
+@@ -69,13 +69,15 @@ static const struct address_space_operations aspace_aops = {
+ struct inode *gfs2_aspace_get(struct gfs2_sbd *sdp)
+ {
+ 	struct inode *aspace;
++	struct gfs2_inode *ip;
+ 
+ 	aspace = new_inode(sdp->sd_vfs);
+ 	if (aspace) {
+ 		mapping_set_gfp_mask(aspace->i_mapping, GFP_NOFS);
+ 		aspace->i_mapping->a_ops = &aspace_aops;
+ 		aspace->i_size = ~0ULL;
+-		aspace->i_private = NULL;
++		ip = GFS2_I(aspace);
++		clear_bit(GIF_USER, &ip->i_flags);
+ 		insert_inode_hash(aspace);
+ 	}
+ 	return aspace;
+diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c
+index ef9c6c4..b2028c8 100644
+--- a/fs/gfs2/ops_fstype.c
++++ b/fs/gfs2/ops_fstype.c
+@@ -142,8 +142,8 @@ static int init_names(struct gfs2_sbd *sdp, int silent)
+ 	if (!table[0])
+ 		table = sdp->sd_vfs->s_id;
+ 
+-	snprintf(sdp->sd_proto_name, GFS2_FSNAME_LEN, "%s", proto);
+-	snprintf(sdp->sd_table_name, GFS2_FSNAME_LEN, "%s", table);
++	strlcpy(sdp->sd_proto_name, proto, GFS2_FSNAME_LEN);
++	strlcpy(sdp->sd_table_name, table, GFS2_FSNAME_LEN);
+ 
+ 	table = sdp->sd_table_name;
+ 	while ((table = strchr(table, '/')))
+diff --git a/fs/gfs2/ops_super.c b/fs/gfs2/ops_super.c
+index 2278c68..0b7cc92 100644
+--- a/fs/gfs2/ops_super.c
++++ b/fs/gfs2/ops_super.c
+@@ -1,6 +1,6 @@
+ /*
+  * Copyright (C) Sistina Software, Inc.  1997-2003 All rights reserved.
+- * Copyright (C) 2004-2006 Red Hat, Inc.  All rights reserved.
++ * Copyright (C) 2004-2008 Red Hat, Inc.  All rights reserved.
+  *
+  * This copyrighted material is made available to anyone wishing to use,
+  * modify, copy, or redistribute it subject to the terms and conditions
+@@ -52,7 +52,7 @@ static int gfs2_write_inode(struct inode *inode, int sync)
+ 	struct gfs2_inode *ip = GFS2_I(inode);
+ 
+ 	/* Check this is a "normal" inode */
+-	if (inode->i_private) {
++	if (test_bit(GIF_USER, &ip->i_flags)) {
+ 		if (current->flags & PF_MEMALLOC)
+ 			return 0;
+ 		if (sync)
+@@ -297,8 +297,9 @@ static int gfs2_remount_fs(struct super_block *sb, int *flags, char *data)
+  */
+ static void gfs2_drop_inode(struct inode *inode)
+ {
+-	if (inode->i_private && inode->i_nlink) {
+-		struct gfs2_inode *ip = GFS2_I(inode);
++	struct gfs2_inode *ip = GFS2_I(inode);
++
++	if (test_bit(GIF_USER, &ip->i_flags) && inode->i_nlink) {
+ 		struct gfs2_glock *gl = ip->i_iopen_gh.gh_gl;
+ 		if (gl && test_bit(GLF_DEMOTE, &gl->gl_flags))
+ 			clear_nlink(inode);
+@@ -314,12 +315,13 @@ static void gfs2_drop_inode(struct inode *inode)
+ 
+ static void gfs2_clear_inode(struct inode *inode)
+ {
++	struct gfs2_inode *ip = GFS2_I(inode);
++
+ 	/* This tells us its a "real" inode and not one which only
+ 	 * serves to contain an address space (see rgrp.c, meta_io.c)
+ 	 * which therefore doesn't have its own glocks.
+ 	 */
+-	if (inode->i_private) {
+-		struct gfs2_inode *ip = GFS2_I(inode);
++	if (test_bit(GIF_USER, &ip->i_flags)) {
+ 		ip->i_gl->gl_object = NULL;
+ 		gfs2_glock_schedule_for_reclaim(ip->i_gl);
+ 		gfs2_glock_put(ip->i_gl);
+@@ -419,7 +421,7 @@ static void gfs2_delete_inode(struct inode *inode)
+ 	struct gfs2_holder gh;
+ 	int error;
+ 
+-	if (!inode->i_private)
++	if (!test_bit(GIF_USER, &ip->i_flags))
+ 		goto out;
+ 
+ 	error = gfs2_glock_nq_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &gh);
+diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c
+index 7e8f0b1..6387523 100644
+--- a/fs/gfs2/rgrp.c
++++ b/fs/gfs2/rgrp.c
+@@ -1495,7 +1495,7 @@ u64 gfs2_alloc_block(struct gfs2_inode *ip, unsigned int *n)
+ 
+ 	al->al_alloced += *n;
+ 
+-	gfs2_statfs_change(sdp, 0, -*n, 0);
++	gfs2_statfs_change(sdp, 0, -(s64)*n, 0);
+ 	gfs2_quota_change(ip, *n, ip->i_inode.i_uid, ip->i_inode.i_gid);
+ 
+ 	spin_lock(&sdp->sd_rindex_spin);
+diff --git a/fs/namei.c b/fs/namei.c
+index 32fd965..c7e4353 100644
+--- a/fs/namei.c
++++ b/fs/namei.c
+@@ -2003,18 +2003,22 @@ struct dentry *lookup_create(struct nameidata *nd, int is_dir)
+ 	if (IS_ERR(dentry))
+ 		goto fail;
+ 
++	if (dentry->d_inode)
++		goto eexist;
+ 	/*
+ 	 * Special case - lookup gave negative, but... we had foo/bar/
+ 	 * From the vfs_mknod() POV we just have a negative dentry -
+ 	 * all is fine. Let's be bastards - you had / on the end, you've
+ 	 * been asking for (non-existent) directory. -ENOENT for you.
+ 	 */
+-	if (!is_dir && nd->last.name[nd->last.len] && !dentry->d_inode)
+-		goto enoent;
++	if (unlikely(!is_dir && nd->last.name[nd->last.len])) {
++		dput(dentry);
++		dentry = ERR_PTR(-ENOENT);
++	}
+ 	return dentry;
+-enoent:
++eexist:
+ 	dput(dentry);
+-	dentry = ERR_PTR(-ENOENT);
++	dentry = ERR_PTR(-EEXIST);
+ fail:
+ 	return dentry;
+ }
+diff --git a/fs/nfs/callback.c b/fs/nfs/callback.c
+index 5606ae3..c1e7c83 100644
+--- a/fs/nfs/callback.c
++++ b/fs/nfs/callback.c
+@@ -182,7 +182,7 @@ static int nfs_callback_authenticate(struct svc_rqst *rqstp)
+ 	if (clp == NULL)
+ 		return SVC_DROP;
+ 
+-	dprintk("%s: %s NFSv4 callback!\n", __FUNCTION__,
++	dprintk("%s: %s NFSv4 callback!\n", __func__,
+ 			svc_print_addr(rqstp, buf, sizeof(buf)));
+ 	nfs_put_client(clp);
+ 
+diff --git a/fs/nfs/callback_proc.c b/fs/nfs/callback_proc.c
+index 15f7785..f7e83e2 100644
+--- a/fs/nfs/callback_proc.c
++++ b/fs/nfs/callback_proc.c
+@@ -57,7 +57,7 @@ out_iput:
+ out_putclient:
+ 	nfs_put_client(clp);
+ out:
+-	dprintk("%s: exit with status = %d\n", __FUNCTION__, ntohl(res->status));
++	dprintk("%s: exit with status = %d\n", __func__, ntohl(res->status));
+ 	return res->status;
+ }
+ 
+@@ -98,6 +98,6 @@ __be32 nfs4_callback_recall(struct cb_recallargs *args, void *dummy)
+ 		nfs_put_client(prev);
+ 	} while (clp != NULL);
+ out:
+-	dprintk("%s: exit with status = %d\n", __FUNCTION__, ntohl(res));
++	dprintk("%s: exit with status = %d\n", __func__, ntohl(res));
+ 	return res;
+ }
+diff --git a/fs/nfs/callback_xdr.c b/fs/nfs/callback_xdr.c
+index 13619d2..dd0ef34 100644
+--- a/fs/nfs/callback_xdr.c
++++ b/fs/nfs/callback_xdr.c
+@@ -141,7 +141,7 @@ static __be32 decode_compound_hdr_arg(struct xdr_stream *xdr, struct cb_compound
+ 	/* We do not like overly long tags! */
+ 	if (hdr->taglen > CB_OP_TAGLEN_MAXSZ - 12) {
+ 		printk("NFSv4 CALLBACK %s: client sent tag of length %u\n",
+-				__FUNCTION__, hdr->taglen);
++				__func__, hdr->taglen);
+ 		return htonl(NFS4ERR_RESOURCE);
+ 	}
+ 	p = read_buf(xdr, 12);
+@@ -151,7 +151,7 @@ static __be32 decode_compound_hdr_arg(struct xdr_stream *xdr, struct cb_compound
+ 	/* Check minor version is zero. */
+ 	if (minor_version != 0) {
+ 		printk(KERN_WARNING "%s: NFSv4 server callback with illegal minor version %u!\n",
+-				__FUNCTION__, minor_version);
++				__func__, minor_version);
+ 		return htonl(NFS4ERR_MINOR_VERS_MISMATCH);
+ 	}
+ 	hdr->callback_ident = ntohl(*p++);
+@@ -179,7 +179,7 @@ static __be32 decode_getattr_args(struct svc_rqst *rqstp, struct xdr_stream *xdr
+ 	args->addr = svc_addr(rqstp);
+ 	status = decode_bitmap(xdr, args->bitmap);
+ out:
+-	dprintk("%s: exit with status = %d\n", __FUNCTION__, ntohl(status));
++	dprintk("%s: exit with status = %d\n", __func__, ntohl(status));
+ 	return status;
+ }
+ 
+@@ -200,7 +200,7 @@ static __be32 decode_recall_args(struct svc_rqst *rqstp, struct xdr_stream *xdr,
+ 	args->truncate = ntohl(*p);
+ 	status = decode_fh(xdr, &args->fh);
+ out:
+-	dprintk("%s: exit with status = %d\n", __FUNCTION__, ntohl(status));
++	dprintk("%s: exit with status = %d\n", __func__, ntohl(status));
+ 	return status;
+ }
+ 
+@@ -349,7 +349,7 @@ static __be32 encode_getattr_res(struct svc_rqst *rqstp, struct xdr_stream *xdr,
+ 	status = encode_attr_mtime(xdr, res->bitmap, &res->mtime);
+ 	*savep = htonl((unsigned int)((char *)xdr->p - (char *)(savep+1)));
+ out:
+-	dprintk("%s: exit with status = %d\n", __FUNCTION__, ntohl(status));
++	dprintk("%s: exit with status = %d\n", __func__, ntohl(status));
+ 	return status;
+ }
+ 
+@@ -363,7 +363,7 @@ static __be32 process_op(struct svc_rqst *rqstp,
+ 	long maxlen;
+ 	__be32 res;
+ 
+-	dprintk("%s: start\n", __FUNCTION__);
++	dprintk("%s: start\n", __func__);
+ 	status = decode_op_hdr(xdr_in, &op_nr);
+ 	if (likely(status == 0)) {
+ 		switch (op_nr) {
+@@ -392,7 +392,7 @@ static __be32 process_op(struct svc_rqst *rqstp,
+ 		status = res;
+ 	if (op->encode_res != NULL && status == 0)
+ 		status = op->encode_res(rqstp, xdr_out, resp);
+-	dprintk("%s: done, status = %d\n", __FUNCTION__, ntohl(status));
++	dprintk("%s: done, status = %d\n", __func__, ntohl(status));
+ 	return status;
+ }
+ 
+@@ -401,37 +401,37 @@ static __be32 process_op(struct svc_rqst *rqstp,
+  */
+ static __be32 nfs4_callback_compound(struct svc_rqst *rqstp, void *argp, void *resp)
+ {
+-	struct cb_compound_hdr_arg hdr_arg;
+-	struct cb_compound_hdr_res hdr_res;
++	struct cb_compound_hdr_arg hdr_arg = { 0 };
++	struct cb_compound_hdr_res hdr_res = { NULL };
+ 	struct xdr_stream xdr_in, xdr_out;
+ 	__be32 *p;
+ 	__be32 status;
+-	unsigned int nops = 1;
++	unsigned int nops = 0;
+ 
+-	dprintk("%s: start\n", __FUNCTION__);
++	dprintk("%s: start\n", __func__);
+ 
+ 	xdr_init_decode(&xdr_in, &rqstp->rq_arg, rqstp->rq_arg.head[0].iov_base);
+ 
+ 	p = (__be32*)((char *)rqstp->rq_res.head[0].iov_base + rqstp->rq_res.head[0].iov_len);
+ 	xdr_init_encode(&xdr_out, &rqstp->rq_res, p);
+ 
+-	decode_compound_hdr_arg(&xdr_in, &hdr_arg);
++	status = decode_compound_hdr_arg(&xdr_in, &hdr_arg);
++	if (status == __constant_htonl(NFS4ERR_RESOURCE))
++		return rpc_garbage_args;
++
+ 	hdr_res.taglen = hdr_arg.taglen;
+ 	hdr_res.tag = hdr_arg.tag;
+-	hdr_res.nops = NULL;
+-	encode_compound_hdr_res(&xdr_out, &hdr_res);
++	if (encode_compound_hdr_res(&xdr_out, &hdr_res) != 0)
++		return rpc_system_err;
+ 
+-	for (;;) {
++	while (status == 0 && nops != hdr_arg.nops) {
+ 		status = process_op(rqstp, &xdr_in, argp, &xdr_out, resp);
+-		if (status != 0)
+-			break;
+-		if (nops == hdr_arg.nops)
+-			break;
+ 		nops++;
+ 	}
++
+ 	*hdr_res.status = status;
+ 	*hdr_res.nops = htonl(nops);
+-	dprintk("%s: done, status = %u\n", __FUNCTION__, ntohl(status));
++	dprintk("%s: done, status = %u\n", __func__, ntohl(status));
+ 	return rpc_success;
+ }
+ 
+diff --git a/fs/nfs/client.c b/fs/nfs/client.c
+index 89ac5bb..f2a092c 100644
+--- a/fs/nfs/client.c
++++ b/fs/nfs/client.c
+@@ -488,7 +488,7 @@ static int nfs_create_rpc_client(struct nfs_client *clp,
+ 	clnt = rpc_create(&args);
+ 	if (IS_ERR(clnt)) {
+ 		dprintk("%s: cannot create RPC client. Error = %ld\n",
+-				__FUNCTION__, PTR_ERR(clnt));
++				__func__, PTR_ERR(clnt));
+ 		return PTR_ERR(clnt);
+ 	}
+ 
+@@ -576,7 +576,7 @@ static int nfs_init_server_rpcclient(struct nfs_server *server,
+ 
+ 	server->client = rpc_clone_client(clp->cl_rpcclient);
+ 	if (IS_ERR(server->client)) {
+-		dprintk("%s: couldn't create rpc_client!\n", __FUNCTION__);
++		dprintk("%s: couldn't create rpc_client!\n", __func__);
+ 		return PTR_ERR(server->client);
+ 	}
+ 
+@@ -590,7 +590,7 @@ static int nfs_init_server_rpcclient(struct nfs_server *server,
+ 
+ 		auth = rpcauth_create(pseudoflavour, server->client);
+ 		if (IS_ERR(auth)) {
+-			dprintk("%s: couldn't create credcache!\n", __FUNCTION__);
++			dprintk("%s: couldn't create credcache!\n", __func__);
+ 			return PTR_ERR(auth);
+ 		}
+ 	}
+@@ -985,7 +985,7 @@ static int nfs4_init_client(struct nfs_client *clp,
+ 	error = nfs_idmap_new(clp);
+ 	if (error < 0) {
+ 		dprintk("%s: failed to create idmapper. Error = %d\n",
+-			__FUNCTION__, error);
++			__func__, error);
+ 		goto error;
+ 	}
+ 	__set_bit(NFS_CS_IDMAP, &clp->cl_res_state);
+diff --git a/fs/nfs/delegation.c b/fs/nfs/delegation.c
+index 00a5e44..cc563cf 100644
+--- a/fs/nfs/delegation.c
++++ b/fs/nfs/delegation.c
+@@ -60,7 +60,7 @@ static int nfs_delegation_claim_locks(struct nfs_open_context *ctx, struct nfs4_
+ 		switch (status) {
+ 			default:
+ 				printk(KERN_ERR "%s: unhandled error %d.\n",
+-						__FUNCTION__, status);
++						__func__, status);
+ 			case -NFS4ERR_EXPIRED:
+ 				/* kill_proc(fl->fl_pid, SIGLOST, 1); */
+ 			case -NFS4ERR_STALE_CLIENTID:
+@@ -186,7 +186,7 @@ int nfs_inode_set_delegation(struct inode *inode, struct rpc_cred *cred, struct
+ 		 */
+ 		dfprintk(FILE, "%s: server %s handed out "
+ 				"a duplicate delegation!\n",
+-				__FUNCTION__, clp->cl_hostname);
++				__func__, clp->cl_hostname);
+ 		if (delegation->type <= nfsi->delegation->type) {
+ 			freeme = delegation;
+ 			delegation = NULL;
+diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
+index f288b3e..58d43da 100644
+--- a/fs/nfs/dir.c
++++ b/fs/nfs/dir.c
+@@ -180,7 +180,7 @@ int nfs_readdir_filler(nfs_readdir_descriptor_t *desc, struct page *page)
+ 	int		error;
+ 
+ 	dfprintk(DIRCACHE, "NFS: %s: reading cookie %Lu into page %lu\n",
+-			__FUNCTION__, (long long)desc->entry->cookie,
++			__func__, (long long)desc->entry->cookie,
+ 			page->index);
+ 
+  again:
+@@ -256,7 +256,7 @@ int find_dirent(nfs_readdir_descriptor_t *desc)
+ 
+ 	while((status = dir_decode(desc)) == 0) {
+ 		dfprintk(DIRCACHE, "NFS: %s: examining cookie %Lu\n",
+-				__FUNCTION__, (unsigned long long)entry->cookie);
++				__func__, (unsigned long long)entry->cookie);
+ 		if (entry->prev_cookie == *desc->dir_cookie)
+ 			break;
+ 		if (loop_count++ > 200) {
+@@ -315,7 +315,7 @@ int find_dirent_page(nfs_readdir_descriptor_t *desc)
+ 	int		status;
+ 
+ 	dfprintk(DIRCACHE, "NFS: %s: searching page %ld for target %Lu\n",
+-			__FUNCTION__, desc->page_index,
++			__func__, desc->page_index,
+ 			(long long) *desc->dir_cookie);
+ 
+ 	/* If we find the page in the page_cache, we cannot be sure
+@@ -339,7 +339,7 @@ int find_dirent_page(nfs_readdir_descriptor_t *desc)
+ 	if (status < 0)
+ 		dir_page_release(desc);
+  out:
+-	dfprintk(DIRCACHE, "NFS: %s: returns %d\n", __FUNCTION__, status);
++	dfprintk(DIRCACHE, "NFS: %s: returns %d\n", __func__, status);
+ 	return status;
+ }
+ 
+@@ -380,7 +380,7 @@ int readdir_search_pagecache(nfs_readdir_descriptor_t *desc)
+ 		}
+ 	}
+ 
+-	dfprintk(DIRCACHE, "NFS: %s: returns %d\n", __FUNCTION__, res);
++	dfprintk(DIRCACHE, "NFS: %s: returns %d\n", __func__, res);
+ 	return res;
+ }
+ 
+@@ -506,7 +506,7 @@ int uncached_readdir(nfs_readdir_descriptor_t *desc, void *dirent,
+ 	desc->entry->eof = 0;
+  out:
+ 	dfprintk(DIRCACHE, "NFS: %s: returns %d\n",
+-			__FUNCTION__, status);
++			__func__, status);
+ 	return status;
+  out_release:
+ 	dir_page_release(desc);
+@@ -780,7 +780,7 @@ static int nfs_lookup_revalidate(struct dentry * dentry, struct nameidata *nd)
+ 
+ 	if (is_bad_inode(inode)) {
+ 		dfprintk(LOOKUPCACHE, "%s: %s/%s has dud inode\n",
+-				__FUNCTION__, dentry->d_parent->d_name.name,
++				__func__, dentry->d_parent->d_name.name,
+ 				dentry->d_name.name);
+ 		goto out_bad;
+ 	}
+@@ -808,7 +808,7 @@ static int nfs_lookup_revalidate(struct dentry * dentry, struct nameidata *nd)
+ 	unlock_kernel();
+ 	dput(parent);
+ 	dfprintk(LOOKUPCACHE, "NFS: %s(%s/%s) is valid\n",
+-			__FUNCTION__, dentry->d_parent->d_name.name,
++			__func__, dentry->d_parent->d_name.name,
+ 			dentry->d_name.name);
+ 	return 1;
+ out_zap_parent:
+@@ -827,7 +827,7 @@ out_zap_parent:
+ 	unlock_kernel();
+ 	dput(parent);
+ 	dfprintk(LOOKUPCACHE, "NFS: %s(%s/%s) is invalid\n",
+-			__FUNCTION__, dentry->d_parent->d_name.name,
++			__func__, dentry->d_parent->d_name.name,
+ 			dentry->d_name.name);
+ 	return 0;
+ }
+diff --git a/fs/nfs/file.c b/fs/nfs/file.c
+index 3536b01..d84a3d8 100644
+--- a/fs/nfs/file.c
++++ b/fs/nfs/file.c
+@@ -526,7 +526,7 @@ static int do_vfs_lock(struct file *file, struct file_lock *fl)
+ 	if (res < 0)
+ 		dprintk(KERN_WARNING "%s: VFS is out of sync with lock manager"
+ 			" - error %d!\n",
+-				__FUNCTION__, res);
++				__func__, res);
+ 	return res;
+ }
+ 
+diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c
+index 5cb3345..596c5d8 100644
+--- a/fs/nfs/inode.c
++++ b/fs/nfs/inode.c
+@@ -541,8 +541,7 @@ static void __put_nfs_open_context(struct nfs_open_context *ctx, int wait)
+ 	}
+ 	if (ctx->cred != NULL)
+ 		put_rpccred(ctx->cred);
+-	dput(ctx->path.dentry);
+-	mntput(ctx->path.mnt);
++	path_put(&ctx->path);
+ 	kfree(ctx);
+ }
+ 
+@@ -707,6 +706,13 @@ int nfs_attribute_timeout(struct inode *inode)
+ 
+ 	if (nfs_have_delegation(inode, FMODE_READ))
+ 		return 0;
++	/*
++	 * Special case: if the attribute timeout is set to 0, then always
++	 * 		 treat the cache as having expired (unless holding
++	 * 		 a delegation).
++	 */
++	if (nfsi->attrtimeo == 0)
++		return 1;
+ 	return !time_in_range(jiffies, nfsi->read_cache_jiffies, nfsi->read_cache_jiffies + nfsi->attrtimeo);
+ }
+ 
+@@ -995,7 +1001,7 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
+ 	unsigned long now = jiffies;
+ 
+ 	dfprintk(VFS, "NFS: %s(%s/%ld ct=%d info=0x%x)\n",
+-			__FUNCTION__, inode->i_sb->s_id, inode->i_ino,
++			__func__, inode->i_sb->s_id, inode->i_ino,
+ 			atomic_read(&inode->i_count), fattr->valid);
+ 
+ 	if (nfsi->fileid != fattr->fileid)
+@@ -1119,7 +1125,7 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
+ 	 * Big trouble! The inode has become a different object.
+ 	 */
+ 	printk(KERN_DEBUG "%s: inode %ld mode changed, %07o to %07o\n",
+-			__FUNCTION__, inode->i_ino, inode->i_mode, fattr->mode);
++			__func__, inode->i_ino, inode->i_mode, fattr->mode);
+  out_err:
+ 	/*
+ 	 * No need to worry about unhashing the dentry, as the
+diff --git a/fs/nfs/namespace.c b/fs/nfs/namespace.c
+index af4d0f1..2f285ef 100644
+--- a/fs/nfs/namespace.c
++++ b/fs/nfs/namespace.c
+@@ -106,7 +106,7 @@ static void * nfs_follow_mountpoint(struct dentry *dentry, struct nameidata *nd)
+ 	dprintk("--> nfs_follow_mountpoint()\n");
+ 
+ 	BUG_ON(IS_ROOT(dentry));
+-	dprintk("%s: enter\n", __FUNCTION__);
++	dprintk("%s: enter\n", __func__);
+ 	dput(nd->path.dentry);
+ 	nd->path.dentry = dget(dentry);
+ 
+@@ -137,13 +137,12 @@ static void * nfs_follow_mountpoint(struct dentry *dentry, struct nameidata *nd)
+ 			goto out_follow;
+ 		goto out_err;
+ 	}
+-	mntput(nd->path.mnt);
+-	dput(nd->path.dentry);
++	path_put(&nd->path);
+ 	nd->path.mnt = mnt;
+ 	nd->path.dentry = dget(mnt->mnt_root);
+ 	schedule_delayed_work(&nfs_automount_task, nfs_mountpoint_expiry_timeout);
+ out:
+-	dprintk("%s: done, returned %d\n", __FUNCTION__, err);
++	dprintk("%s: done, returned %d\n", __func__, err);
+ 
+ 	dprintk("<-- nfs_follow_mountpoint() = %d\n", err);
+ 	return ERR_PTR(err);
+@@ -230,7 +229,7 @@ static struct vfsmount *nfs_do_submount(const struct vfsmount *mnt_parent,
+ 
+ 	dprintk("--> nfs_do_submount()\n");
+ 
+-	dprintk("%s: submounting on %s/%s\n", __FUNCTION__,
++	dprintk("%s: submounting on %s/%s\n", __func__,
+ 			dentry->d_parent->d_name.name,
+ 			dentry->d_name.name);
+ 	if (page == NULL)
+@@ -243,7 +242,7 @@ static struct vfsmount *nfs_do_submount(const struct vfsmount *mnt_parent,
+ free_page:
+ 	free_page((unsigned long)page);
+ out:
+-	dprintk("%s: done\n", __FUNCTION__);
++	dprintk("%s: done\n", __func__);
+ 
+ 	dprintk("<-- nfs_do_submount() = %p\n", mnt);
+ 	return mnt;
+diff --git a/fs/nfs/nfs3proc.c b/fs/nfs/nfs3proc.c
+index 549dbce..c3523ad 100644
+--- a/fs/nfs/nfs3proc.c
++++ b/fs/nfs/nfs3proc.c
+@@ -63,15 +63,15 @@ do_proc_get_root(struct rpc_clnt *client, struct nfs_fh *fhandle,
+ 	};
+ 	int	status;
+ 
+-	dprintk("%s: call  fsinfo\n", __FUNCTION__);
++	dprintk("%s: call  fsinfo\n", __func__);
+ 	nfs_fattr_init(info->fattr);
+ 	status = rpc_call_sync(client, &msg, 0);
+-	dprintk("%s: reply fsinfo: %d\n", __FUNCTION__, status);
++	dprintk("%s: reply fsinfo: %d\n", __func__, status);
+ 	if (!(info->fattr->valid & NFS_ATTR_FATTR)) {
+ 		msg.rpc_proc = &nfs3_procedures[NFS3PROC_GETATTR];
+ 		msg.rpc_resp = info->fattr;
+ 		status = rpc_call_sync(client, &msg, 0);
+-		dprintk("%s: reply getattr: %d\n", __FUNCTION__, status);
++		dprintk("%s: reply getattr: %d\n", __func__, status);
+ 	}
+ 	return status;
+ }
+diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h
+index bd1b9d6..ea79064 100644
+--- a/fs/nfs/nfs4_fs.h
++++ b/fs/nfs/nfs4_fs.h
+@@ -206,7 +206,6 @@ struct rpc_cred *nfs4_get_renew_cred(struct nfs_client *clp);
+ 
+ extern struct nfs4_state_owner * nfs4_get_state_owner(struct nfs_server *, struct rpc_cred *);
+ extern void nfs4_put_state_owner(struct nfs4_state_owner *);
+-extern void nfs4_drop_state_owner(struct nfs4_state_owner *);
+ extern struct nfs4_state * nfs4_get_open_state(struct inode *, struct nfs4_state_owner *);
+ extern void nfs4_put_open_state(struct nfs4_state *);
+ extern void nfs4_close_state(struct path *, struct nfs4_state *, mode_t);
+diff --git a/fs/nfs/nfs4namespace.c b/fs/nfs/nfs4namespace.c
+index 5f9ba41..b112857 100644
+--- a/fs/nfs/nfs4namespace.c
++++ b/fs/nfs/nfs4namespace.c
+@@ -86,7 +86,7 @@ static int nfs4_validate_fspath(const struct vfsmount *mnt_parent,
+ 
+ 	if (strncmp(path, fs_path, strlen(fs_path)) != 0) {
+ 		dprintk("%s: path %s does not begin with fsroot %s\n",
+-			__FUNCTION__, path, fs_path);
++			__func__, path, fs_path);
+ 		return -ENOENT;
+ 	}
+ 
+@@ -134,7 +134,7 @@ static struct vfsmount *nfs_follow_referral(const struct vfsmount *mnt_parent,
+ 	if (locations == NULL || locations->nlocations <= 0)
+ 		goto out;
+ 
+-	dprintk("%s: referral at %s/%s\n", __FUNCTION__,
++	dprintk("%s: referral at %s/%s\n", __func__,
+ 		dentry->d_parent->d_name.name, dentry->d_name.name);
+ 
+ 	page = (char *) __get_free_page(GFP_USER);
+@@ -204,7 +204,7 @@ static struct vfsmount *nfs_follow_referral(const struct vfsmount *mnt_parent,
+ out:
+ 	free_page((unsigned long) page);
+ 	free_page((unsigned long) page2);
+-	dprintk("%s: done\n", __FUNCTION__);
++	dprintk("%s: done\n", __func__);
+ 	return mnt;
+ }
+ 
+@@ -223,7 +223,7 @@ struct vfsmount *nfs_do_refmount(const struct vfsmount *mnt_parent, struct dentr
+ 	int err;
+ 
+ 	/* BUG_ON(IS_ROOT(dentry)); */
+-	dprintk("%s: enter\n", __FUNCTION__);
++	dprintk("%s: enter\n", __func__);
+ 
+ 	page = alloc_page(GFP_KERNEL);
+ 	if (page == NULL)
+@@ -238,7 +238,7 @@ struct vfsmount *nfs_do_refmount(const struct vfsmount *mnt_parent, struct dentr
+ 
+ 	parent = dget_parent(dentry);
+ 	dprintk("%s: getting locations for %s/%s\n",
+-		__FUNCTION__, parent->d_name.name, dentry->d_name.name);
++		__func__, parent->d_name.name, dentry->d_name.name);
+ 
+ 	err = nfs4_proc_fs_locations(parent->d_inode, &dentry->d_name, fs_locations, page);
+ 	dput(parent);
+@@ -252,6 +252,6 @@ out_free:
+ 	__free_page(page);
+ 	kfree(fs_locations);
+ out:
+-	dprintk("%s: done\n", __FUNCTION__);
++	dprintk("%s: done\n", __func__);
+ 	return mnt;
+ }
+diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
+index dbc0927..1293e0a 100644
+--- a/fs/nfs/nfs4proc.c
++++ b/fs/nfs/nfs4proc.c
+@@ -73,7 +73,7 @@ int nfs4_map_errors(int err)
+ {
+ 	if (err < -1000) {
+ 		dprintk("%s could not handle NFSv4 error %d\n",
+-				__FUNCTION__, -err);
++				__func__, -err);
+ 		return -EIO;
+ 	}
+ 	return err;
+@@ -306,8 +306,7 @@ static void nfs4_opendata_free(struct kref *kref)
+ 		nfs4_put_open_state(p->state);
+ 	nfs4_put_state_owner(p->owner);
+ 	dput(p->dir);
+-	dput(p->path.dentry);
+-	mntput(p->path.mnt);
++	path_put(&p->path);
+ 	kfree(p);
+ }
+ 
+@@ -1210,8 +1209,7 @@ static void nfs4_free_closedata(void *data)
+ 	nfs4_put_open_state(calldata->state);
+ 	nfs_free_seqid(calldata->arg.seqid);
+ 	nfs4_put_state_owner(sp);
+-	dput(calldata->path.dentry);
+-	mntput(calldata->path.mnt);
++	path_put(&calldata->path);
+ 	kfree(calldata);
+ }
+ 
+@@ -1578,7 +1576,7 @@ static int nfs4_get_referral(struct inode *dir, const struct qstr *name, struct
+ 		goto out;
+ 	/* Make sure server returned a different fsid for the referral */
+ 	if (nfs_fsid_equal(&NFS_SERVER(dir)->fsid, &locations->fattr.fsid)) {
+-		dprintk("%s: server did not return a different fsid for a referral at %s\n", __FUNCTION__, name->name);
++		dprintk("%s: server did not return a different fsid for a referral at %s\n", __func__, name->name);
+ 		status = -EIO;
+ 		goto out;
+ 	}
+@@ -2211,7 +2209,7 @@ static int _nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
+ 	};
+ 	int			status;
+ 
+-	dprintk("%s: dentry = %s/%s, cookie = %Lu\n", __FUNCTION__,
++	dprintk("%s: dentry = %s/%s, cookie = %Lu\n", __func__,
+ 			dentry->d_parent->d_name.name,
+ 			dentry->d_name.name,
+ 			(unsigned long long)cookie);
+@@ -2223,7 +2221,7 @@ static int _nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
+ 
+ 	nfs_invalidate_atime(dir);
+ 
+-	dprintk("%s: returns %d\n", __FUNCTION__, status);
++	dprintk("%s: returns %d\n", __func__, status);
+ 	return status;
+ }
+ 
+@@ -3342,7 +3340,7 @@ static void nfs4_lock_prepare(struct rpc_task *task, void *calldata)
+ 	struct nfs4_lockdata *data = calldata;
+ 	struct nfs4_state *state = data->lsp->ls_state;
+ 
+-	dprintk("%s: begin!\n", __FUNCTION__);
++	dprintk("%s: begin!\n", __func__);
+ 	if (nfs_wait_on_sequence(data->arg.lock_seqid, task) != 0)
+ 		return;
+ 	/* Do we need to do an open_to_lock_owner? */
+@@ -3356,14 +3354,14 @@ static void nfs4_lock_prepare(struct rpc_task *task, void *calldata)
+ 		data->arg.new_lock_owner = 0;
+ 	data->timestamp = jiffies;
+ 	rpc_call_start(task);
+-	dprintk("%s: done!, ret = %d\n", __FUNCTION__, data->rpc_status);
++	dprintk("%s: done!, ret = %d\n", __func__, data->rpc_status);
+ }
+ 
+ static void nfs4_lock_done(struct rpc_task *task, void *calldata)
+ {
+ 	struct nfs4_lockdata *data = calldata;
+ 
+-	dprintk("%s: begin!\n", __FUNCTION__);
++	dprintk("%s: begin!\n", __func__);
+ 
+ 	data->rpc_status = task->tk_status;
+ 	if (RPC_ASSASSINATED(task))
+@@ -3381,14 +3379,14 @@ static void nfs4_lock_done(struct rpc_task *task, void *calldata)
+ 		renew_lease(NFS_SERVER(data->ctx->path.dentry->d_inode), data->timestamp);
+ 	}
+ out:
+-	dprintk("%s: done, ret = %d!\n", __FUNCTION__, data->rpc_status);
++	dprintk("%s: done, ret = %d!\n", __func__, data->rpc_status);
+ }
+ 
+ static void nfs4_lock_release(void *calldata)
+ {
+ 	struct nfs4_lockdata *data = calldata;
+ 
+-	dprintk("%s: begin!\n", __FUNCTION__);
++	dprintk("%s: begin!\n", __func__);
+ 	nfs_free_seqid(data->arg.open_seqid);
+ 	if (data->cancelled != 0) {
+ 		struct rpc_task *task;
+@@ -3396,13 +3394,13 @@ static void nfs4_lock_release(void *calldata)
+ 				data->arg.lock_seqid);
+ 		if (!IS_ERR(task))
+ 			rpc_put_task(task);
+-		dprintk("%s: cancelling lock!\n", __FUNCTION__);
++		dprintk("%s: cancelling lock!\n", __func__);
+ 	} else
+ 		nfs_free_seqid(data->arg.lock_seqid);
+ 	nfs4_put_lock_state(data->lsp);
+ 	put_nfs_open_context(data->ctx);
+ 	kfree(data);
+-	dprintk("%s: done!\n", __FUNCTION__);
++	dprintk("%s: done!\n", __func__);
+ }
+ 
+ static const struct rpc_call_ops nfs4_lock_ops = {
+@@ -3428,7 +3426,7 @@ static int _nfs4_do_setlk(struct nfs4_state *state, int cmd, struct file_lock *f
+ 	};
+ 	int ret;
+ 
+-	dprintk("%s: begin!\n", __FUNCTION__);
++	dprintk("%s: begin!\n", __func__);
+ 	data = nfs4_alloc_lockdata(fl, nfs_file_open_context(fl->fl_file),
+ 			fl->fl_u.nfs4_fl.owner);
+ 	if (data == NULL)
+@@ -3451,7 +3449,7 @@ static int _nfs4_do_setlk(struct nfs4_state *state, int cmd, struct file_lock *f
+ 	} else
+ 		data->cancelled = 1;
+ 	rpc_put_task(task);
+-	dprintk("%s: done, ret = %d!\n", __FUNCTION__, ret);
++	dprintk("%s: done, ret = %d!\n", __func__, ret);
+ 	return ret;
+ }
+ 
+@@ -3527,7 +3525,7 @@ static int _nfs4_proc_setlk(struct nfs4_state *state, int cmd, struct file_lock
+ 	/* Note: we always want to sleep here! */
+ 	request->fl_flags = fl_flags | FL_SLEEP;
+ 	if (do_vfs_lock(request->fl_file, request) < 0)
+-		printk(KERN_WARNING "%s: VFS is out of sync with lock manager!\n", __FUNCTION__);
++		printk(KERN_WARNING "%s: VFS is out of sync with lock manager!\n", __func__);
+ out_unlock:
+ 	up_read(&clp->cl_sem);
+ out:
+@@ -3665,12 +3663,12 @@ int nfs4_proc_fs_locations(struct inode *dir, const struct qstr *name,
+ 	};
+ 	int status;
+ 
+-	dprintk("%s: start\n", __FUNCTION__);
++	dprintk("%s: start\n", __func__);
+ 	nfs_fattr_init(&fs_locations->fattr);
+ 	fs_locations->server = server;
+ 	fs_locations->nlocations = 0;
+ 	status = rpc_call_sync(server->client, &msg, 0);
+-	dprintk("%s: returned status = %d\n", __FUNCTION__, status);
++	dprintk("%s: returned status = %d\n", __func__, status);
+ 	return status;
+ }
+ 
+diff --git a/fs/nfs/nfs4renewd.c b/fs/nfs/nfs4renewd.c
+index 5e2e4af..3305acb 100644
+--- a/fs/nfs/nfs4renewd.c
++++ b/fs/nfs/nfs4renewd.c
+@@ -66,7 +66,7 @@ nfs4_renew_state(struct work_struct *work)
+ 	unsigned long last, now;
+ 
+ 	down_read(&clp->cl_sem);
+-	dprintk("%s: start\n", __FUNCTION__);
++	dprintk("%s: start\n", __func__);
+ 	/* Are there any active superblocks? */
+ 	if (list_empty(&clp->cl_superblocks))
+ 		goto out;
+@@ -92,17 +92,17 @@ nfs4_renew_state(struct work_struct *work)
+ 		spin_lock(&clp->cl_lock);
+ 	} else
+ 		dprintk("%s: failed to call renewd. Reason: lease not expired \n",
+-				__FUNCTION__);
++				__func__);
+ 	if (timeout < 5 * HZ)    /* safeguard */
+ 		timeout = 5 * HZ;
+ 	dprintk("%s: requeueing work. Lease period = %ld\n",
+-			__FUNCTION__, (timeout + HZ - 1) / HZ);
++			__func__, (timeout + HZ - 1) / HZ);
+ 	cancel_delayed_work(&clp->cl_renewd);
+ 	schedule_delayed_work(&clp->cl_renewd, timeout);
+ 	spin_unlock(&clp->cl_lock);
+ out:
+ 	up_read(&clp->cl_sem);
+-	dprintk("%s: done\n", __FUNCTION__);
++	dprintk("%s: done\n", __func__);
+ }
+ 
+ /* Must be called with clp->cl_sem locked for writes */
+@@ -117,7 +117,7 @@ nfs4_schedule_state_renewal(struct nfs_client *clp)
+ 	if (timeout < 5 * HZ)
+ 		timeout = 5 * HZ;
+ 	dprintk("%s: requeueing work. Lease period = %ld\n",
+-			__FUNCTION__, (timeout + HZ - 1) / HZ);
++			__func__, (timeout + HZ - 1) / HZ);
+ 	cancel_delayed_work(&clp->cl_renewd);
+ 	schedule_delayed_work(&clp->cl_renewd, timeout);
+ 	set_bit(NFS_CS_RENEWD, &clp->cl_res_state);
+diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
+index 46eb624..856a893 100644
+--- a/fs/nfs/nfs4state.c
++++ b/fs/nfs/nfs4state.c
+@@ -282,7 +282,7 @@ nfs4_alloc_state_owner(void)
+ 	return sp;
+ }
+ 
+-void
++static void
+ nfs4_drop_state_owner(struct nfs4_state_owner *sp)
+ {
+ 	if (!RB_EMPTY_NODE(&sp->so_client_node)) {
+@@ -828,7 +828,7 @@ static int nfs4_reclaim_locks(struct nfs4_state_recovery_ops *ops, struct nfs4_s
+ 		switch (status) {
+ 			default:
+ 				printk(KERN_ERR "%s: unhandled error %d. Zeroing state\n",
+-						__FUNCTION__, status);
++						__func__, status);
+ 			case -NFS4ERR_EXPIRED:
+ 			case -NFS4ERR_NO_GRACE:
+ 			case -NFS4ERR_RECLAIM_BAD:
+@@ -869,14 +869,14 @@ static int nfs4_reclaim_open_state(struct nfs4_state_recovery_ops *ops, struct n
+ 			list_for_each_entry(lock, &state->lock_states, ls_locks) {
+ 				if (!(lock->ls_flags & NFS_LOCK_INITIALIZED))
+ 					printk("%s: Lock reclaim failed!\n",
+-							__FUNCTION__);
++							__func__);
+ 			}
+ 			continue;
+ 		}
+ 		switch (status) {
+ 			default:
+ 				printk(KERN_ERR "%s: unhandled error %d. Zeroing state\n",
+-						__FUNCTION__, status);
++						__func__, status);
+ 			case -ENOENT:
+ 			case -NFS4ERR_RECLAIM_BAD:
+ 			case -NFS4ERR_RECLAIM_CONFLICT:
+diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c
+index 5a2d649..b916297 100644
+--- a/fs/nfs/nfs4xdr.c
++++ b/fs/nfs/nfs4xdr.c
+@@ -1831,7 +1831,7 @@ static int nfs4_xdr_enc_readdir(struct rpc_rqst *req, __be32 *p, const struct nf
+ 	xdr_inline_pages(&req->rq_rcv_buf, replen, args->pages,
+ 			 args->pgbase, args->count);
+ 	dprintk("%s: inlined page args = (%u, %p, %u, %u)\n",
+-			__FUNCTION__, replen, args->pages,
++			__func__, replen, args->pages,
+ 			args->pgbase, args->count);
+ 
+ out:
+@@ -2192,9 +2192,9 @@ out:
+ 	p = xdr_inline_decode(xdr, nbytes); \
+ 	if (unlikely(!p)) { \
+ 		dprintk("nfs: %s: prematurely hit end of receive" \
+-				" buffer\n", __FUNCTION__); \
++				" buffer\n", __func__); \
+ 		dprintk("nfs: %s: xdr->p=%p, bytes=%u, xdr->end=%p\n", \
+-				__FUNCTION__, xdr->p, nbytes, xdr->end); \
++				__func__, xdr->p, nbytes, xdr->end); \
+ 		return -EIO; \
+ 	} \
+ } while (0)
+@@ -2306,12 +2306,12 @@ static int decode_attr_type(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *
+ 		READ_BUF(4);
+ 		READ32(*type);
+ 		if (*type < NF4REG || *type > NF4NAMEDATTR) {
+-			dprintk("%s: bad type %d\n", __FUNCTION__, *type);
++			dprintk("%s: bad type %d\n", __func__, *type);
+ 			return -EIO;
+ 		}
+ 		bitmap[0] &= ~FATTR4_WORD0_TYPE;
+ 	}
+-	dprintk("%s: type=0%o\n", __FUNCTION__, nfs_type2fmt[*type].nfs2type);
++	dprintk("%s: type=0%o\n", __func__, nfs_type2fmt[*type].nfs2type);
+ 	return 0;
+ }
+ 
+@@ -2327,7 +2327,7 @@ static int decode_attr_change(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t
+ 		READ64(*change);
+ 		bitmap[0] &= ~FATTR4_WORD0_CHANGE;
+ 	}
+-	dprintk("%s: change attribute=%Lu\n", __FUNCTION__,
++	dprintk("%s: change attribute=%Lu\n", __func__,
+ 			(unsigned long long)*change);
+ 	return 0;
+ }
+@@ -2344,7 +2344,7 @@ static int decode_attr_size(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *
+ 		READ64(*size);
+ 		bitmap[0] &= ~FATTR4_WORD0_SIZE;
+ 	}
+-	dprintk("%s: file size=%Lu\n", __FUNCTION__, (unsigned long long)*size);
++	dprintk("%s: file size=%Lu\n", __func__, (unsigned long long)*size);
+ 	return 0;
+ }
+ 
+@@ -2360,7 +2360,7 @@ static int decode_attr_link_support(struct xdr_stream *xdr, uint32_t *bitmap, ui
+ 		READ32(*res);
+ 		bitmap[0] &= ~FATTR4_WORD0_LINK_SUPPORT;
+ 	}
+-	dprintk("%s: link support=%s\n", __FUNCTION__, *res == 0 ? "false" : "true");
++	dprintk("%s: link support=%s\n", __func__, *res == 0 ? "false" : "true");
+ 	return 0;
+ }
+ 
+@@ -2376,7 +2376,7 @@ static int decode_attr_symlink_support(struct xdr_stream *xdr, uint32_t *bitmap,
+ 		READ32(*res);
+ 		bitmap[0] &= ~FATTR4_WORD0_SYMLINK_SUPPORT;
+ 	}
+-	dprintk("%s: symlink support=%s\n", __FUNCTION__, *res == 0 ? "false" : "true");
++	dprintk("%s: symlink support=%s\n", __func__, *res == 0 ? "false" : "true");
+ 	return 0;
+ }
+ 
+@@ -2394,7 +2394,7 @@ static int decode_attr_fsid(struct xdr_stream *xdr, uint32_t *bitmap, struct nfs
+ 		READ64(fsid->minor);
+ 		bitmap[0] &= ~FATTR4_WORD0_FSID;
+ 	}
+-	dprintk("%s: fsid=(0x%Lx/0x%Lx)\n", __FUNCTION__,
++	dprintk("%s: fsid=(0x%Lx/0x%Lx)\n", __func__,
+ 			(unsigned long long)fsid->major,
+ 			(unsigned long long)fsid->minor);
+ 	return 0;
+@@ -2412,7 +2412,7 @@ static int decode_attr_lease_time(struct xdr_stream *xdr, uint32_t *bitmap, uint
+ 		READ32(*res);
+ 		bitmap[0] &= ~FATTR4_WORD0_LEASE_TIME;
+ 	}
+-	dprintk("%s: file size=%u\n", __FUNCTION__, (unsigned int)*res);
++	dprintk("%s: file size=%u\n", __func__, (unsigned int)*res);
+ 	return 0;
+ }
+ 
+@@ -2428,7 +2428,7 @@ static int decode_attr_aclsupport(struct xdr_stream *xdr, uint32_t *bitmap, uint
+ 		READ32(*res);
+ 		bitmap[0] &= ~FATTR4_WORD0_ACLSUPPORT;
+ 	}
+-	dprintk("%s: ACLs supported=%u\n", __FUNCTION__, (unsigned int)*res);
++	dprintk("%s: ACLs supported=%u\n", __func__, (unsigned int)*res);
+ 	return 0;
+ }
+ 
+@@ -2444,7 +2444,7 @@ static int decode_attr_fileid(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t
+ 		READ64(*fileid);
+ 		bitmap[0] &= ~FATTR4_WORD0_FILEID;
+ 	}
+-	dprintk("%s: fileid=%Lu\n", __FUNCTION__, (unsigned long long)*fileid);
++	dprintk("%s: fileid=%Lu\n", __func__, (unsigned long long)*fileid);
+ 	return 0;
+ }
+ 
+@@ -2460,7 +2460,7 @@ static int decode_attr_mounted_on_fileid(struct xdr_stream *xdr, uint32_t *bitma
+ 		READ64(*fileid);
+ 		bitmap[1] &= ~FATTR4_WORD1_MOUNTED_ON_FILEID;
+ 	}
+-	dprintk("%s: fileid=%Lu\n", __FUNCTION__, (unsigned long long)*fileid);
++	dprintk("%s: fileid=%Lu\n", __func__, (unsigned long long)*fileid);
+ 	return 0;
+ }
+ 
+@@ -2477,7 +2477,7 @@ static int decode_attr_files_avail(struct xdr_stream *xdr, uint32_t *bitmap, uin
+ 		READ64(*res);
+ 		bitmap[0] &= ~FATTR4_WORD0_FILES_AVAIL;
+ 	}
+-	dprintk("%s: files avail=%Lu\n", __FUNCTION__, (unsigned long long)*res);
++	dprintk("%s: files avail=%Lu\n", __func__, (unsigned long long)*res);
+ 	return status;
+ }
+ 
+@@ -2494,7 +2494,7 @@ static int decode_attr_files_free(struct xdr_stream *xdr, uint32_t *bitmap, uint
+ 		READ64(*res);
+ 		bitmap[0] &= ~FATTR4_WORD0_FILES_FREE;
+ 	}
+-	dprintk("%s: files free=%Lu\n", __FUNCTION__, (unsigned long long)*res);
++	dprintk("%s: files free=%Lu\n", __func__, (unsigned long long)*res);
+ 	return status;
+ }
+ 
+@@ -2511,7 +2511,7 @@ static int decode_attr_files_total(struct xdr_stream *xdr, uint32_t *bitmap, uin
+ 		READ64(*res);
+ 		bitmap[0] &= ~FATTR4_WORD0_FILES_TOTAL;
+ 	}
+-	dprintk("%s: files total=%Lu\n", __FUNCTION__, (unsigned long long)*res);
++	dprintk("%s: files total=%Lu\n", __func__, (unsigned long long)*res);
+ 	return status;
+ }
+ 
+@@ -2569,7 +2569,7 @@ static int decode_attr_fs_locations(struct xdr_stream *xdr, uint32_t *bitmap, st
+ 	status = 0;
+ 	if (unlikely(!(bitmap[0] & FATTR4_WORD0_FS_LOCATIONS)))
+ 		goto out;
+-	dprintk("%s: fsroot ", __FUNCTION__);
++	dprintk("%s: fsroot ", __func__);
+ 	status = decode_pathname(xdr, &res->fs_path);
+ 	if (unlikely(status != 0))
+ 		goto out;
+@@ -2586,7 +2586,7 @@ static int decode_attr_fs_locations(struct xdr_stream *xdr, uint32_t *bitmap, st
+ 		READ32(m);
+ 
+ 		loc->nservers = 0;
+-		dprintk("%s: servers ", __FUNCTION__);
++		dprintk("%s: servers ", __func__);
+ 		while (loc->nservers < m) {
+ 			struct nfs4_string *server = &loc->servers[loc->nservers];
+ 			status = decode_opaque_inline(xdr, &server->len, &server->data);
+@@ -2599,7 +2599,7 @@ static int decode_attr_fs_locations(struct xdr_stream *xdr, uint32_t *bitmap, st
+ 				unsigned int i;
+ 				dprintk("%s: using first %u of %u servers "
+ 					"returned for location %u\n",
+-						__FUNCTION__,
++						__func__,
+ 						NFS4_FS_LOCATION_MAXSERVERS,
+ 						m, res->nlocations);
+ 				for (i = loc->nservers; i < m; i++) {
+@@ -2618,7 +2618,7 @@ static int decode_attr_fs_locations(struct xdr_stream *xdr, uint32_t *bitmap, st
+ 			res->nlocations++;
+ 	}
+ out:
+-	dprintk("%s: fs_locations done, error = %d\n", __FUNCTION__, status);
++	dprintk("%s: fs_locations done, error = %d\n", __func__, status);
+ 	return status;
+ out_eio:
+ 	status = -EIO;
+@@ -2638,7 +2638,7 @@ static int decode_attr_maxfilesize(struct xdr_stream *xdr, uint32_t *bitmap, uin
+ 		READ64(*res);
+ 		bitmap[0] &= ~FATTR4_WORD0_MAXFILESIZE;
+ 	}
+-	dprintk("%s: maxfilesize=%Lu\n", __FUNCTION__, (unsigned long long)*res);
++	dprintk("%s: maxfilesize=%Lu\n", __func__, (unsigned long long)*res);
+ 	return status;
+ }
+ 
+@@ -2655,7 +2655,7 @@ static int decode_attr_maxlink(struct xdr_stream *xdr, uint32_t *bitmap, uint32_
+ 		READ32(*maxlink);
+ 		bitmap[0] &= ~FATTR4_WORD0_MAXLINK;
+ 	}
+-	dprintk("%s: maxlink=%u\n", __FUNCTION__, *maxlink);
++	dprintk("%s: maxlink=%u\n", __func__, *maxlink);
+ 	return status;
+ }
+ 
+@@ -2672,7 +2672,7 @@ static int decode_attr_maxname(struct xdr_stream *xdr, uint32_t *bitmap, uint32_
+ 		READ32(*maxname);
+ 		bitmap[0] &= ~FATTR4_WORD0_MAXNAME;
+ 	}
+-	dprintk("%s: maxname=%u\n", __FUNCTION__, *maxname);
++	dprintk("%s: maxname=%u\n", __func__, *maxname);
+ 	return status;
+ }
+ 
+@@ -2693,7 +2693,7 @@ static int decode_attr_maxread(struct xdr_stream *xdr, uint32_t *bitmap, uint32_
+ 		*res = (uint32_t)maxread;
+ 		bitmap[0] &= ~FATTR4_WORD0_MAXREAD;
+ 	}
+-	dprintk("%s: maxread=%lu\n", __FUNCTION__, (unsigned long)*res);
++	dprintk("%s: maxread=%lu\n", __func__, (unsigned long)*res);
+ 	return status;
+ }
+ 
+@@ -2714,7 +2714,7 @@ static int decode_attr_maxwrite(struct xdr_stream *xdr, uint32_t *bitmap, uint32
+ 		*res = (uint32_t)maxwrite;
+ 		bitmap[0] &= ~FATTR4_WORD0_MAXWRITE;
+ 	}
+-	dprintk("%s: maxwrite=%lu\n", __FUNCTION__, (unsigned long)*res);
++	dprintk("%s: maxwrite=%lu\n", __func__, (unsigned long)*res);
+ 	return status;
+ }
+ 
+@@ -2731,7 +2731,7 @@ static int decode_attr_mode(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *
+ 		*mode &= ~S_IFMT;
+ 		bitmap[1] &= ~FATTR4_WORD1_MODE;
+ 	}
+-	dprintk("%s: file mode=0%o\n", __FUNCTION__, (unsigned int)*mode);
++	dprintk("%s: file mode=0%o\n", __func__, (unsigned int)*mode);
+ 	return 0;
+ }
+ 
+@@ -2747,7 +2747,7 @@ static int decode_attr_nlink(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t
+ 		READ32(*nlink);
+ 		bitmap[1] &= ~FATTR4_WORD1_NUMLINKS;
+ 	}
+-	dprintk("%s: nlink=%u\n", __FUNCTION__, (unsigned int)*nlink);
++	dprintk("%s: nlink=%u\n", __func__, (unsigned int)*nlink);
+ 	return 0;
+ }
+ 
+@@ -2766,13 +2766,13 @@ static int decode_attr_owner(struct xdr_stream *xdr, uint32_t *bitmap, struct nf
+ 		if (len < XDR_MAX_NETOBJ) {
+ 			if (nfs_map_name_to_uid(clp, (char *)p, len, uid) != 0)
+ 				dprintk("%s: nfs_map_name_to_uid failed!\n",
+-						__FUNCTION__);
++						__func__);
+ 		} else
+ 			dprintk("%s: name too long (%u)!\n",
+-					__FUNCTION__, len);
++					__func__, len);
+ 		bitmap[1] &= ~FATTR4_WORD1_OWNER;
+ 	}
+-	dprintk("%s: uid=%d\n", __FUNCTION__, (int)*uid);
++	dprintk("%s: uid=%d\n", __func__, (int)*uid);
+ 	return 0;
+ }
+ 
+@@ -2791,13 +2791,13 @@ static int decode_attr_group(struct xdr_stream *xdr, uint32_t *bitmap, struct nf
+ 		if (len < XDR_MAX_NETOBJ) {
+ 			if (nfs_map_group_to_gid(clp, (char *)p, len, gid) != 0)
+ 				dprintk("%s: nfs_map_group_to_gid failed!\n",
+-						__FUNCTION__);
++						__func__);
+ 		} else
+ 			dprintk("%s: name too long (%u)!\n",
+-					__FUNCTION__, len);
++					__func__, len);
+ 		bitmap[1] &= ~FATTR4_WORD1_OWNER_GROUP;
+ 	}
+-	dprintk("%s: gid=%d\n", __FUNCTION__, (int)*gid);
++	dprintk("%s: gid=%d\n", __func__, (int)*gid);
+ 	return 0;
+ }
+ 
+@@ -2820,7 +2820,7 @@ static int decode_attr_rdev(struct xdr_stream *xdr, uint32_t *bitmap, dev_t *rde
+ 			*rdev = tmp;
+ 		bitmap[1] &= ~ FATTR4_WORD1_RAWDEV;
+ 	}
+-	dprintk("%s: rdev=(0x%x:0x%x)\n", __FUNCTION__, major, minor);
++	dprintk("%s: rdev=(0x%x:0x%x)\n", __func__, major, minor);
+ 	return 0;
+ }
+ 
+@@ -2837,7 +2837,7 @@ static int decode_attr_space_avail(struct xdr_stream *xdr, uint32_t *bitmap, uin
+ 		READ64(*res);
+ 		bitmap[1] &= ~FATTR4_WORD1_SPACE_AVAIL;
+ 	}
+-	dprintk("%s: space avail=%Lu\n", __FUNCTION__, (unsigned long long)*res);
++	dprintk("%s: space avail=%Lu\n", __func__, (unsigned long long)*res);
+ 	return status;
+ }
+ 
+@@ -2854,7 +2854,7 @@ static int decode_attr_space_free(struct xdr_stream *xdr, uint32_t *bitmap, uint
+ 		READ64(*res);
+ 		bitmap[1] &= ~FATTR4_WORD1_SPACE_FREE;
+ 	}
+-	dprintk("%s: space free=%Lu\n", __FUNCTION__, (unsigned long long)*res);
++	dprintk("%s: space free=%Lu\n", __func__, (unsigned long long)*res);
+ 	return status;
+ }
+ 
+@@ -2871,7 +2871,7 @@ static int decode_attr_space_total(struct xdr_stream *xdr, uint32_t *bitmap, uin
+ 		READ64(*res);
+ 		bitmap[1] &= ~FATTR4_WORD1_SPACE_TOTAL;
+ 	}
+-	dprintk("%s: space total=%Lu\n", __FUNCTION__, (unsigned long long)*res);
++	dprintk("%s: space total=%Lu\n", __func__, (unsigned long long)*res);
+ 	return status;
+ }
+ 
+@@ -2887,7 +2887,7 @@ static int decode_attr_space_used(struct xdr_stream *xdr, uint32_t *bitmap, uint
+ 		READ64(*used);
+ 		bitmap[1] &= ~FATTR4_WORD1_SPACE_USED;
+ 	}
+-	dprintk("%s: space used=%Lu\n", __FUNCTION__,
++	dprintk("%s: space used=%Lu\n", __func__,
+ 			(unsigned long long)*used);
+ 	return 0;
+ }
+@@ -2918,7 +2918,7 @@ static int decode_attr_time_access(struct xdr_stream *xdr, uint32_t *bitmap, str
+ 		status = decode_attr_time(xdr, time);
+ 		bitmap[1] &= ~FATTR4_WORD1_TIME_ACCESS;
+ 	}
+-	dprintk("%s: atime=%ld\n", __FUNCTION__, (long)time->tv_sec);
++	dprintk("%s: atime=%ld\n", __func__, (long)time->tv_sec);
+ 	return status;
+ }
+ 
+@@ -2934,7 +2934,7 @@ static int decode_attr_time_metadata(struct xdr_stream *xdr, uint32_t *bitmap, s
+ 		status = decode_attr_time(xdr, time);
+ 		bitmap[1] &= ~FATTR4_WORD1_TIME_METADATA;
+ 	}
+-	dprintk("%s: ctime=%ld\n", __FUNCTION__, (long)time->tv_sec);
++	dprintk("%s: ctime=%ld\n", __func__, (long)time->tv_sec);
+ 	return status;
+ }
+ 
+@@ -2950,7 +2950,7 @@ static int decode_attr_time_modify(struct xdr_stream *xdr, uint32_t *bitmap, str
+ 		status = decode_attr_time(xdr, time);
+ 		bitmap[1] &= ~FATTR4_WORD1_TIME_MODIFY;
+ 	}
+-	dprintk("%s: mtime=%ld\n", __FUNCTION__, (long)time->tv_sec);
++	dprintk("%s: mtime=%ld\n", __func__, (long)time->tv_sec);
+ 	return status;
+ }
+ 
+@@ -2962,7 +2962,7 @@ static int verify_attr_len(struct xdr_stream *xdr, __be32 *savep, uint32_t attrl
+ 	if (unlikely(attrwords != nwords)) {
+ 		dprintk("%s: server returned incorrect attribute length: "
+ 			"%u %c %u\n",
+-				__FUNCTION__,
++				__func__,
+ 				attrwords << 2,
+ 				(attrwords < nwords) ? '<' : '>',
+ 				nwords << 2);
+@@ -3067,7 +3067,7 @@ static int decode_server_caps(struct xdr_stream *xdr, struct nfs4_server_caps_re
+ 		goto xdr_error;
+ 	status = verify_attr_len(xdr, savep, attrlen);
+ xdr_error:
+-	dprintk("%s: xdr returned %d!\n", __FUNCTION__, -status);
++	dprintk("%s: xdr returned %d!\n", __func__, -status);
+ 	return status;
+ }
+ 	
+@@ -3100,7 +3100,7 @@ static int decode_statfs(struct xdr_stream *xdr, struct nfs_fsstat *fsstat)
+ 
+ 	status = verify_attr_len(xdr, savep, attrlen);
+ xdr_error:
+-	dprintk("%s: xdr returned %d!\n", __FUNCTION__, -status);
++	dprintk("%s: xdr returned %d!\n", __func__, -status);
+ 	return status;
+ }
+ 
+@@ -3125,7 +3125,7 @@ static int decode_pathconf(struct xdr_stream *xdr, struct nfs_pathconf *pathconf
+ 
+ 	status = verify_attr_len(xdr, savep, attrlen);
+ xdr_error:
+-	dprintk("%s: xdr returned %d!\n", __FUNCTION__, -status);
++	dprintk("%s: xdr returned %d!\n", __func__, -status);
+ 	return status;
+ }
+ 
+@@ -3193,7 +3193,7 @@ static int decode_getfattr(struct xdr_stream *xdr, struct nfs_fattr *fattr, cons
+ 	if ((status = verify_attr_len(xdr, savep, attrlen)) == 0)
+ 		fattr->valid = NFS_ATTR_FATTR | NFS_ATTR_FATTR_V3 | NFS_ATTR_FATTR_V4;
+ xdr_error:
+-	dprintk("%s: xdr returned %d\n", __FUNCTION__, -status);
++	dprintk("%s: xdr returned %d\n", __func__, -status);
+ 	return status;
+ }
+ 
+@@ -3226,7 +3226,7 @@ static int decode_fsinfo(struct xdr_stream *xdr, struct nfs_fsinfo *fsinfo)
+ 
+ 	status = verify_attr_len(xdr, savep, attrlen);
+ xdr_error:
+-	dprintk("%s: xdr returned %d!\n", __FUNCTION__, -status);
++	dprintk("%s: xdr returned %d!\n", __func__, -status);
+ 	return status;
+ }
+ 
+@@ -3418,7 +3418,7 @@ static int decode_open(struct xdr_stream *xdr, struct nfs_openres *res)
+ 
+ 	return decode_delegation(xdr, res);
+ xdr_error:
+-	dprintk("%s: Bitmap too large! Length = %u\n", __FUNCTION__, bmlen);
++	dprintk("%s: Bitmap too large! Length = %u\n", __func__, bmlen);
+ 	return -EIO;
+ }
+ 
+@@ -3575,7 +3575,7 @@ short_pkt:
+ 	 * the call was successful, but incomplete. The caller can retry the
+ 	 * readdir starting at the last cookie.
+ 	 */
+-	dprintk("%s: short packet at entry %d\n", __FUNCTION__, nr);
++	dprintk("%s: short packet at entry %d\n", __func__, nr);
+ 	entry[0] = entry[1] = 0;
+ 	if (nr)
+ 		goto out;
+diff --git a/fs/nfs/proc.c b/fs/nfs/proc.c
+index 5ccf7fa..03599bf 100644
+--- a/fs/nfs/proc.c
++++ b/fs/nfs/proc.c
+@@ -63,17 +63,17 @@ nfs_proc_get_root(struct nfs_server *server, struct nfs_fh *fhandle,
+ 	};
+ 	int status;
+ 
+-	dprintk("%s: call getattr\n", __FUNCTION__);
++	dprintk("%s: call getattr\n", __func__);
+ 	nfs_fattr_init(fattr);
+ 	status = rpc_call_sync(server->nfs_client->cl_rpcclient, &msg, 0);
+-	dprintk("%s: reply getattr: %d\n", __FUNCTION__, status);
++	dprintk("%s: reply getattr: %d\n", __func__, status);
+ 	if (status)
+ 		return status;
+-	dprintk("%s: call statfs\n", __FUNCTION__);
++	dprintk("%s: call statfs\n", __func__);
+ 	msg.rpc_proc = &nfs_procedures[NFSPROC_STATFS];
+ 	msg.rpc_resp = &fsinfo;
+ 	status = rpc_call_sync(server->nfs_client->cl_rpcclient, &msg, 0);
+-	dprintk("%s: reply statfs: %d\n", __FUNCTION__, status);
++	dprintk("%s: reply statfs: %d\n", __func__, status);
+ 	if (status)
+ 		return status;
+ 	info->rtmax  = NFS_MAXDATA;
+diff --git a/fs/nfs/read.c b/fs/nfs/read.c
+index 16f57e0..40d1798 100644
+--- a/fs/nfs/read.c
++++ b/fs/nfs/read.c
+@@ -329,7 +329,7 @@ int nfs_readpage_result(struct rpc_task *task, struct nfs_read_data *data)
+ {
+ 	int status;
+ 
+-	dprintk("NFS: %s: %5u, (status %d)\n", __FUNCTION__, task->tk_pid,
++	dprintk("NFS: %s: %5u, (status %d)\n", __func__, task->tk_pid,
+ 			task->tk_status);
+ 
+ 	status = NFS_PROTO(data->inode)->read_done(task, data);
+diff --git a/fs/nfs/super.c b/fs/nfs/super.c
+index 7226a50..2a4a024 100644
+--- a/fs/nfs/super.c
++++ b/fs/nfs/super.c
+@@ -405,7 +405,7 @@ static int nfs_statfs(struct dentry *dentry, struct kstatfs *buf)
+ 	return 0;
+ 
+  out_err:
+-	dprintk("%s: statfs error = %d\n", __FUNCTION__, -error);
++	dprintk("%s: statfs error = %d\n", __func__, -error);
+ 	unlock_kernel();
+ 	return error;
+ }
+@@ -2015,6 +2015,10 @@ static int nfs4_get_sb(struct file_system_type *fs_type,
+ 		goto error_splat_super;
+ 	}
+ 
++	error = security_sb_set_mnt_opts(s, &data.lsm_opts);
++	if (error)
++		goto error_splat_root;
++
+ 	s->s_flags |= MS_ACTIVE;
+ 	mnt->mnt_sb = s;
+ 	mnt->mnt_root = mntroot;
+@@ -2031,6 +2035,8 @@ out_free:
+ 	nfs_free_server(server);
+ 	goto out;
+ 
++error_splat_root:
++	dput(mntroot);
+ error_splat_super:
+ 	up_write(&s->s_umount);
+ 	deactivate_super(s);
+@@ -2114,6 +2120,8 @@ static int nfs4_xdev_get_sb(struct file_system_type *fs_type, int flags,
+ 	mnt->mnt_sb = s;
+ 	mnt->mnt_root = mntroot;
+ 
++	security_sb_clone_mnt_opts(data->sb, s);
++
+ 	dprintk("<-- nfs4_xdev_get_sb() = 0\n");
+ 	return 0;
+ 
+@@ -2197,6 +2205,8 @@ static int nfs4_referral_get_sb(struct file_system_type *fs_type, int flags,
+ 	mnt->mnt_sb = s;
+ 	mnt->mnt_root = mntroot;
+ 
++	security_sb_clone_mnt_opts(data->sb, s);
++
+ 	dprintk("<-- nfs4_referral_get_sb() = 0\n");
+ 	return 0;
+ 
+diff --git a/fs/nfs/write.c b/fs/nfs/write.c
+index 1ade11d..6d8ace3 100644
+--- a/fs/nfs/write.c
++++ b/fs/nfs/write.c
+@@ -415,7 +415,7 @@ nfs_dirty_request(struct nfs_page *req)
+ 
+ 	if (page == NULL || test_bit(PG_NEED_COMMIT, &req->wb_flags))
+ 		return 0;
+-	return !PageWriteback(req->wb_page);
++	return !PageWriteback(page);
+ }
+ 
+ #if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4)
+diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c
+index 0b3ffa9..4d4760e 100644
+--- a/fs/nfsd/nfs4callback.c
++++ b/fs/nfsd/nfs4callback.c
+@@ -419,9 +419,9 @@ static int do_probe_callback(void *data)
+ out_release_client:
+ 	rpc_shutdown_client(client);
+ out_err:
+-	put_nfs4_client(clp);
+ 	dprintk("NFSD: warning: no callback path to client %.*s\n",
+ 		(int)clp->cl_name.len, clp->cl_name.data);
++	put_nfs4_client(clp);
+ 	return status;
+ }
+ 
+diff --git a/fs/proc/base.c b/fs/proc/base.c
+index 808cbdc..c447e07 100644
+--- a/fs/proc/base.c
++++ b/fs/proc/base.c
+@@ -2441,7 +2441,7 @@ static const struct pid_entry tgid_base_stuff[] = {
+ 	REG("oom_adj",    S_IRUGO|S_IWUSR, oom_adjust),
+ #ifdef CONFIG_AUDITSYSCALL
+ 	REG("loginuid",   S_IWUSR|S_IRUGO, loginuid),
+-	REG("sessionid",  S_IRUSR, sessionid),
++	REG("sessionid",  S_IRUGO, sessionid),
+ #endif
+ #ifdef CONFIG_FAULT_INJECTION
+ 	REG("make-it-fail", S_IRUGO|S_IWUSR, fault_inject),
+diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c
+index a1c3a1f..8c0e4b9 100644
+--- a/fs/sysfs/dir.c
++++ b/fs/sysfs/dir.c
+@@ -419,12 +419,8 @@ void sysfs_addrm_start(struct sysfs_addrm_cxt *acxt,
+  */
+ int sysfs_add_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd)
+ {
+-	if (sysfs_find_dirent(acxt->parent_sd, sd->s_name)) {
+-		printk(KERN_WARNING "sysfs: duplicate filename '%s' "
+-		       "can not be created\n", sd->s_name);
+-		WARN_ON(1);
++	if (sysfs_find_dirent(acxt->parent_sd, sd->s_name))
+ 		return -EEXIST;
+-	}
+ 
+ 	sd->s_parent = sysfs_get(acxt->parent_sd);
+ 
+diff --git a/include/asm-blackfin/bfin-global.h b/include/asm-blackfin/bfin-global.h
+index 716df7c..a9248d8 100644
+--- a/include/asm-blackfin/bfin-global.h
++++ b/include/asm-blackfin/bfin-global.h
+@@ -37,7 +37,9 @@
+ #include <linux/linkage.h>
+ #include <linux/types.h>
+ 
+-#if defined(CONFIG_DMA_UNCACHED_2M)
++#if defined(CONFIG_DMA_UNCACHED_4M)
++# define DMA_UNCACHED_REGION (4 * 1024 * 1024)
++#elif defined(CONFIG_DMA_UNCACHED_2M)
+ # define DMA_UNCACHED_REGION (2 * 1024 * 1024)
+ #elif defined(CONFIG_DMA_UNCACHED_1M)
+ # define DMA_UNCACHED_REGION (1024 * 1024)
+diff --git a/include/asm-blackfin/checksum.h b/include/asm-blackfin/checksum.h
+index 2638f25..6f6af2b 100644
+--- a/include/asm-blackfin/checksum.h
++++ b/include/asm-blackfin/checksum.h
+@@ -15,7 +15,7 @@
+  *
+  * it's best to have buff aligned on a 32-bit boundary
+  */
+-unsigned int csum_partial(const unsigned char *buff, int len, unsigned int sum);
++__wsum csum_partial(const void *buff, int len, __wsum sum);
+ 
+ /*
+  * the same as csum_partial, but copies from src while it
+@@ -25,8 +25,8 @@ unsigned int csum_partial(const unsigned char *buff, int len, unsigned int sum);
+  * better 64-bit) boundary
+  */
+ 
+-unsigned int csum_partial_copy(const unsigned char *src, unsigned char *dst,
+-			       int len, int sum);
++__wsum csum_partial_copy(const void *src, void *dst,
++			       int len, __wsum sum);
+ 
+ /*
+  * the same as csum_partial_copy, but copies from user space.
+@@ -35,20 +35,19 @@ unsigned int csum_partial_copy(const unsigned char *src, unsigned char *dst,
+  * better 64-bit) boundary
+  */
+ 
+-extern unsigned int csum_partial_copy_from_user(const unsigned char *src,
+-						unsigned char *dst, int len,
+-						int sum, int *csum_err);
++extern __wsum csum_partial_copy_from_user(const void __user *src, void *dst,
++					  int len, __wsum sum, int *csum_err);
+ 
+ #define csum_partial_copy_nocheck(src, dst, len, sum)	\
+ 	csum_partial_copy((src), (dst), (len), (sum))
+ 
+-unsigned short ip_fast_csum(unsigned char *iph, unsigned int ihl);
++__sum16 ip_fast_csum(unsigned char *iph, unsigned int ihl);
+ 
+ /*
+  *	Fold a partial checksum
+  */
+ 
+-static inline unsigned int csum_fold(unsigned int sum)
++static inline __sum16 csum_fold(__wsum sum)
+ {
+ 	while (sum >> 16)
+ 		sum = (sum & 0xffff) + (sum >> 16);
+@@ -60,9 +59,9 @@ static inline unsigned int csum_fold(unsigned int sum)
+  * returns a 16-bit checksum, already complemented
+  */
+ 
+-static inline unsigned int
+-csum_tcpudp_nofold(unsigned long saddr, unsigned long daddr, unsigned short len,
+-		   unsigned short proto, unsigned int sum)
++static inline __wsum
++csum_tcpudp_nofold(__be32 saddr, __be32 daddr, unsigned short len,
++		   unsigned short proto, __wsum sum)
+ {
+ 
+ 	__asm__ ("%0 = %0 + %1;\n\t"
+@@ -84,9 +83,9 @@ csum_tcpudp_nofold(unsigned long saddr, unsigned long daddr, unsigned short len,
+ 	return (sum);
+ }
+ 
+-static inline unsigned short int
+-csum_tcpudp_magic(unsigned long saddr, unsigned long daddr, unsigned short len,
+-		  unsigned short proto, unsigned int sum)
++static inline __sum16
++csum_tcpudp_magic(__be32 saddr, __be32 daddr, unsigned short len,
++		  unsigned short proto, __wsum sum)
+ {
+ 	return csum_fold(csum_tcpudp_nofold(saddr, daddr, len, proto, sum));
+ }
+@@ -96,6 +95,6 @@ csum_tcpudp_magic(unsigned long saddr, unsigned long daddr, unsigned short len,
+  * in icmp.c
+  */
+ 
+-extern unsigned short ip_compute_csum(const unsigned char *buff, int len);
++extern __sum16 ip_compute_csum(const void *buff, int len);
+ 
+ #endif				/* _BFIN_CHECKSUM_H */
+diff --git a/include/asm-blackfin/gpio.h b/include/asm-blackfin/gpio.h
+index 27ff532..ff95e9d 100644
+--- a/include/asm-blackfin/gpio.h
++++ b/include/asm-blackfin/gpio.h
+@@ -437,7 +437,6 @@ void gpio_set_value(unsigned gpio, int arg);
+ int gpio_get_value(unsigned gpio);
+ 
+ #ifndef BF548_FAMILY
+-#define gpio_get_value(gpio) 		get_gpio_data(gpio)
+ #define gpio_set_value(gpio, value)	set_gpio_data(gpio, value)
+ #endif
+ 
+diff --git a/include/asm-blackfin/io.h b/include/asm-blackfin/io.h
+index 574fe56..cbbf7ff 100644
+--- a/include/asm-blackfin/io.h
++++ b/include/asm-blackfin/io.h
+@@ -117,10 +117,12 @@ static inline unsigned int readl(const volatile void __iomem *addr)
+ 
+ extern void outsb(unsigned long port, const void *addr, unsigned long count);
+ extern void outsw(unsigned long port, const void *addr, unsigned long count);
++extern void outsw_8(unsigned long port, const void *addr, unsigned long count);
+ extern void outsl(unsigned long port, const void *addr, unsigned long count);
+ 
+ extern void insb(unsigned long port, void *addr, unsigned long count);
+ extern void insw(unsigned long port, void *addr, unsigned long count);
++extern void insw_8(unsigned long port, void *addr, unsigned long count);
+ extern void insl(unsigned long port, void *addr, unsigned long count);
+ extern void insl_16(unsigned long port, void *addr, unsigned long count);
+ 
+diff --git a/include/asm-blackfin/mach-bf527/blackfin.h b/include/asm-blackfin/mach-bf527/blackfin.h
+index 2891727..297821e 100644
+--- a/include/asm-blackfin/mach-bf527/blackfin.h
++++ b/include/asm-blackfin/mach-bf527/blackfin.h
+@@ -39,22 +39,22 @@
+ #include "defBF522.h"
+ #include "anomaly.h"
+ 
+-#if defined(CONFIG_BF527)
++#if defined(CONFIG_BF527) || defined(CONFIG_BF526)
+ #include "defBF527.h"
+ #endif
+ 
+-#if defined(CONFIG_BF525)
++#if defined(CONFIG_BF525) || defined(CONFIG_BF524)
+ #include "defBF525.h"
+ #endif
+ 
+ #if !defined(__ASSEMBLY__)
+ #include "cdefBF522.h"
+ 
+-#if defined(CONFIG_BF527)
++#if defined(CONFIG_BF527) || defined(CONFIG_BF526)
+ #include "cdefBF527.h"
+ #endif
+ 
+-#if defined(CONFIG_BF525)
++#if defined(CONFIG_BF525) || defined(CONFIG_BF524)
+ #include "cdefBF525.h"
+ #endif
+ #endif
+diff --git a/include/asm-blackfin/mach-bf561/dma.h b/include/asm-blackfin/mach-bf561/dma.h
+index 21d9820..8bc46cd 100644
+--- a/include/asm-blackfin/mach-bf561/dma.h
++++ b/include/asm-blackfin/mach-bf561/dma.h
+@@ -25,11 +25,11 @@
+ #define CH_MEM_STREAM1_SRC      27	 /* RX */
+ #define CH_MEM_STREAM2_DEST	28
+ #define CH_MEM_STREAM2_SRC	29
+-#define CH_MEM_STREAM3_SRC	30
+-#define CH_MEM_STREAM3_DEST	31
++#define CH_MEM_STREAM3_DEST	30
++#define CH_MEM_STREAM3_SRC	31
+ #define CH_IMEM_STREAM0_DEST	32
+ #define CH_IMEM_STREAM0_SRC	33
+-#define CH_IMEM_STREAM1_SRC	34
+-#define CH_IMEM_STREAM1_DEST	35
++#define CH_IMEM_STREAM1_DEST	34
++#define CH_IMEM_STREAM1_SRC	35
+ 
+ #endif
+diff --git a/include/asm-blackfin/serial.h b/include/asm-blackfin/serial.h
+new file mode 100644
+index 0000000..994dd86
+--- /dev/null
++++ b/include/asm-blackfin/serial.h
+@@ -0,0 +1,5 @@
++/*
++ * include/asm-blackfin/serial.h
++ */
++
++#define SERIAL_EXTRA_IRQ_FLAGS IRQF_TRIGGER_HIGH
+diff --git a/include/asm-ia64/kvm.h b/include/asm-ia64/kvm.h
+index eb2d355..3f6a090 100644
+--- a/include/asm-ia64/kvm.h
++++ b/include/asm-ia64/kvm.h
+@@ -22,14 +22,13 @@
+  */
+ 
+ #include <asm/types.h>
+-#include <asm/fpu.h>
+ 
+ #include <linux/ioctl.h>
+ 
+ /* Architectural interrupt line count. */
+ #define KVM_NR_INTERRUPTS 256
+ 
+-#define KVM_IOAPIC_NUM_PINS  24
++#define KVM_IOAPIC_NUM_PINS  48
+ 
+ struct kvm_ioapic_state {
+ 	__u64 base_address;
+@@ -61,6 +60,13 @@ struct kvm_ioapic_state {
+ 
+ #define KVM_CONTEXT_SIZE	8*1024
+ 
++struct kvm_fpreg {
++	union {
++		unsigned long bits[2];
++		long double __dummy;	/* force 16-byte alignment */
++	} u;
++};
++
+ union context {
+ 	/* 8K size */
+ 	char	dummy[KVM_CONTEXT_SIZE];
+@@ -77,7 +83,7 @@ union context {
+ 		unsigned long       ibr[8];
+ 		unsigned long       dbr[8];
+ 		unsigned long       pkr[8];
+-		struct ia64_fpreg   fr[128];
++		struct kvm_fpreg   fr[128];
+ 	};
+ };
+ 
+diff --git a/include/asm-sh/kgdb.h b/include/asm-sh/kgdb.h
+index 4bc8cb1..24e4207 100644
+--- a/include/asm-sh/kgdb.h
++++ b/include/asm-sh/kgdb.h
+@@ -66,18 +66,4 @@ extern int     setjmp(jmp_buf __jmpb);
+ /* Forced breakpoint */
+ #define breakpoint()	__asm__ __volatile__("trapa   #0x3c")
+ 
+-/* Taken from sh-stub.c of GDB 4.18 */
+-static const char hexchars[] = "0123456789abcdef";
+-
+-/* Get high hex bits */
+-static inline char highhex(const int x)
+-{
+-	return hexchars[(x >> 4) & 0xf];
+-}
+-
+-/* Get low hex bits */
+-static inline char lowhex(const int x)
+-{
+-	return hexchars[x & 0xf];
+-}
+ #endif
+diff --git a/include/asm-sparc/asi.h b/include/asm-sparc/asi.h
+index 58c3754..158f9b0 100644
+--- a/include/asm-sparc/asi.h
++++ b/include/asm-sparc/asi.h
+@@ -1,4 +1,3 @@
+-/* $Id: asi.h,v 1.18 1998/03/09 14:04:46 jj Exp $ */
+ #ifndef _SPARC_ASI_H
+ #define _SPARC_ASI_H
+ 
+diff --git a/include/asm-sparc/auxio.h b/include/asm-sparc/auxio.h
+index ee83aef..e552b8d 100644
+--- a/include/asm-sparc/auxio.h
++++ b/include/asm-sparc/auxio.h
+@@ -1,4 +1,4 @@
+-/* $Id: auxio.h,v 1.18 1997/11/07 15:01:45 jj Exp $
++/*
+  * auxio.h:  Definitions and code for the Auxiliary I/O register.
+  *
+  * Copyright (C) 1995 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/include/asm-sparc/bitops.h b/include/asm-sparc/bitops.h
+index cb3cefa..68b98a7 100644
+--- a/include/asm-sparc/bitops.h
++++ b/include/asm-sparc/bitops.h
+@@ -1,4 +1,4 @@
+-/* $Id: bitops.h,v 1.67 2001/11/19 18:36:34 davem Exp $
++/*
+  * bitops.h: Bit string operations on the Sparc.
+  *
+  * Copyright 1995 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/include/asm-sparc/btfixup.h b/include/asm-sparc/btfixup.h
+index c2868d0..08277e6 100644
+--- a/include/asm-sparc/btfixup.h
++++ b/include/asm-sparc/btfixup.h
+@@ -1,4 +1,4 @@
+-/* $Id: btfixup.h,v 1.4 1998/03/09 14:04:43 jj Exp $
++/*
+  *  asm-sparc/btfixup.h:    Macros for boot time linking.
+  *
+  *  Copyright (C) 1998 Jakub Jelinek (jj at sunsite.mff.cuni.cz)
+diff --git a/include/asm-sparc/checksum.h b/include/asm-sparc/checksum.h
+index 34518ea..d044ddb 100644
+--- a/include/asm-sparc/checksum.h
++++ b/include/asm-sparc/checksum.h
+@@ -1,4 +1,3 @@
+-/* $Id: checksum.h,v 1.33 2002/02/01 22:01:05 davem Exp $ */
+ #ifndef __SPARC_CHECKSUM_H
+ #define __SPARC_CHECKSUM_H
+ 
+diff --git a/include/asm-sparc/clock.h b/include/asm-sparc/clock.h
+index e708e6b..2cf99da 100644
+--- a/include/asm-sparc/clock.h
++++ b/include/asm-sparc/clock.h
+@@ -1,4 +1,4 @@
+-/* $Id: clock.h,v 1.3 1995/11/25 02:31:25 davem Exp $
++/*
+  * clock.h:  Definitions for clock operations on the Sparc.
+  *
+  * Copyright (C) 1995 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/include/asm-sparc/contregs.h b/include/asm-sparc/contregs.h
+index 0e05afe..48fa8a4 100644
+--- a/include/asm-sparc/contregs.h
++++ b/include/asm-sparc/contregs.h
+@@ -1,4 +1,3 @@
+-/* $Id: contregs.h,v 1.8 2000/12/28 22:49:11 davem Exp $ */
+ #ifndef _SPARC_CONTREGS_H
+ #define _SPARC_CONTREGS_H
+ 
+diff --git a/include/asm-sparc/cypress.h b/include/asm-sparc/cypress.h
+index 9959953..95e9772 100644
+--- a/include/asm-sparc/cypress.h
++++ b/include/asm-sparc/cypress.h
+@@ -1,4 +1,4 @@
+-/* $Id: cypress.h,v 1.6 1996/08/29 09:48:09 davem Exp $
++/*
+  * cypress.h: Cypress module specific definitions and defines.
+  *
+  * Copyright (C) 1995 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/include/asm-sparc/delay.h b/include/asm-sparc/delay.h
+index 48aa70e..bc9aba2 100644
+--- a/include/asm-sparc/delay.h
++++ b/include/asm-sparc/delay.h
+@@ -1,4 +1,4 @@
+-/* $Id: delay.h,v 1.11 2001/01/01 01:46:15 davem Exp $
++/*
+  * delay.h: Linux delay routines on the Sparc.
+  *
+  * Copyright (C) 1994 David S. Miller (davem at caip.rutgers.edu).
+diff --git a/include/asm-sparc/ebus.h b/include/asm-sparc/ebus.h
+index 5465288..491f85d 100644
+--- a/include/asm-sparc/ebus.h
++++ b/include/asm-sparc/ebus.h
+@@ -1,4 +1,4 @@
+-/* $Id: ebus.h,v 1.2 1999/09/11 23:05:55 zaitcev Exp $
++/*
+  * ebus.h: PCI to Ebus pseudo driver software state.
+  *
+  * Copyright (C) 1997 Eddie C. Dost (ecd at skynet.be) 
+diff --git a/include/asm-sparc/ecc.h b/include/asm-sparc/ecc.h
+index 8e27cec..ccb84b6 100644
+--- a/include/asm-sparc/ecc.h
++++ b/include/asm-sparc/ecc.h
+@@ -1,4 +1,4 @@
+-/* $Id: ecc.h,v 1.3 1996/04/25 06:12:57 davem Exp $
++/*
+  * ecc.h: Definitions and defines for the external cache/memory
+  *        controller on the sun4m.
+  *
+diff --git a/include/asm-sparc/eeprom.h b/include/asm-sparc/eeprom.h
+index a8ff749..e17beec 100644
+--- a/include/asm-sparc/eeprom.h
++++ b/include/asm-sparc/eeprom.h
+@@ -1,4 +1,4 @@
+-/* $Id: eeprom.h,v 1.3 1995/11/25 02:31:38 davem Exp $
++/*
+  * eeprom.h:  Definitions for the Sun eeprom.
+  *
+  * Copyright (C) 1995 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/include/asm-sparc/elf.h b/include/asm-sparc/elf.h
+index d2516ee..d043f80 100644
+--- a/include/asm-sparc/elf.h
++++ b/include/asm-sparc/elf.h
+@@ -1,4 +1,3 @@
+-/* $Id: elf.h,v 1.22 2000/07/12 01:27:08 davem Exp $ */
+ #ifndef __ASMSPARC_ELF_H
+ #define __ASMSPARC_ELF_H
+ 
+diff --git a/include/asm-sparc/fcntl.h b/include/asm-sparc/fcntl.h
+index 5ec5463..07bd2d8 100644
+--- a/include/asm-sparc/fcntl.h
++++ b/include/asm-sparc/fcntl.h
+@@ -1,4 +1,3 @@
+-/* $Id: fcntl.h,v 1.16 2001/09/20 00:35:33 davem Exp $ */
+ #ifndef _SPARC_FCNTL_H
+ #define _SPARC_FCNTL_H
+ 
+diff --git a/include/asm-sparc/head.h b/include/asm-sparc/head.h
+index e6532c3..7c35491 100644
+--- a/include/asm-sparc/head.h
++++ b/include/asm-sparc/head.h
+@@ -1,4 +1,3 @@
+-/* $Id: head.h,v 1.39 2000/05/26 22:18:45 ecd Exp $ */
+ #ifndef __SPARC_HEAD_H
+ #define __SPARC_HEAD_H
+ 
+diff --git a/include/asm-sparc/idprom.h b/include/asm-sparc/idprom.h
+index 59083ed..41adb41 100644
+--- a/include/asm-sparc/idprom.h
++++ b/include/asm-sparc/idprom.h
+@@ -1,4 +1,4 @@
+-/* $Id: idprom.h,v 1.6 1996/08/04 10:35:07 ecd Exp $
++/*
+  * idprom.h: Macros and defines for idprom routines
+  *
+  * Copyright (C) 1995 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/include/asm-sparc/io.h b/include/asm-sparc/io.h
+index 243bf8e..3a3e7bd 100644
+--- a/include/asm-sparc/io.h
++++ b/include/asm-sparc/io.h
+@@ -1,6 +1,3 @@
+-/*
+- * $Id: io.h,v 1.30 2001/12/21 01:23:21 davem Exp $
+- */
+ #ifndef __SPARC_IO_H
+ #define __SPARC_IO_H
+ 
+diff --git a/include/asm-sparc/ioctl.h b/include/asm-sparc/ioctl.h
+index e6fc4de..7d6bd51 100644
+--- a/include/asm-sparc/ioctl.h
++++ b/include/asm-sparc/ioctl.h
+@@ -1,4 +1,3 @@
+-/* $Id: ioctl.h,v 1.6 1999/12/01 23:58:36 davem Exp $ */
+ #ifndef _SPARC_IOCTL_H
+ #define _SPARC_IOCTL_H
+ 
+diff --git a/include/asm-sparc/kdebug.h b/include/asm-sparc/kdebug.h
+index 631f15f..f69fe7d 100644
+--- a/include/asm-sparc/kdebug.h
++++ b/include/asm-sparc/kdebug.h
+@@ -1,4 +1,4 @@
+-/* $Id: kdebug.h,v 1.11 2000/06/04 06:23:53 anton Exp $
++/*
+  * kdebug.h:  Defines and definitions for debugging the Linux kernel
+  *            under various kernel debuggers.
+  *
+diff --git a/include/asm-sparc/machines.h b/include/asm-sparc/machines.h
+index d831350..d6c6bf8 100644
+--- a/include/asm-sparc/machines.h
++++ b/include/asm-sparc/machines.h
+@@ -1,4 +1,4 @@
+-/* $Id: machines.h,v 1.4 1995/11/25 02:31:58 davem Exp $
++/*
+  * machines.h:  Defines for taking apart the machine type value in the
+  *              idprom and determining the kind of machine we are on.
+  *
+diff --git a/include/asm-sparc/mbus.h b/include/asm-sparc/mbus.h
+index ecacdf4..bb5ae61 100644
+--- a/include/asm-sparc/mbus.h
++++ b/include/asm-sparc/mbus.h
+@@ -1,4 +1,4 @@
+-/* $Id: mbus.h,v 1.9 1997/06/24 15:48:12 jj Exp $
++/*
+  * mbus.h:  Various defines for MBUS modules.
+  *
+  * Copyright (C) 1995 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/include/asm-sparc/memreg.h b/include/asm-sparc/memreg.h
+index 5fb95c8..845ad2b 100644
+--- a/include/asm-sparc/memreg.h
++++ b/include/asm-sparc/memreg.h
+@@ -1,4 +1,3 @@
+-/* $Id: memreg.h,v 1.8 1996/08/29 09:48:23 davem Exp $ */
+ #ifndef _SPARC_MEMREG_H
+ #define _SPARC_MEMREG_H
+ /* memreg.h:  Definitions of the values found in the synchronous
+diff --git a/include/asm-sparc/mman.h b/include/asm-sparc/mman.h
+index 3d16b40..fdfbbf0 100644
+--- a/include/asm-sparc/mman.h
++++ b/include/asm-sparc/mman.h
+@@ -1,4 +1,3 @@
+-/* $Id: mman.h,v 1.9 2000/03/15 02:44:23 davem Exp $ */
+ #ifndef __SPARC_MMAN_H__
+ #define __SPARC_MMAN_H__
+ 
+diff --git a/include/asm-sparc/mostek.h b/include/asm-sparc/mostek.h
+index 958d051..29aad11 100644
+--- a/include/asm-sparc/mostek.h
++++ b/include/asm-sparc/mostek.h
+@@ -1,4 +1,4 @@
+-/* $Id: mostek.h,v 1.13 2001/01/11 15:07:09 davem Exp $
++/*
+  * mostek.h:  Describes the various Mostek time of day clock registers.
+  *
+  * Copyright (C) 1995 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/include/asm-sparc/mpmbox.h b/include/asm-sparc/mpmbox.h
+index 0e1bc58..f842303 100644
+--- a/include/asm-sparc/mpmbox.h
++++ b/include/asm-sparc/mpmbox.h
+@@ -1,4 +1,4 @@
+-/* $Id: mpmbox.h,v 1.4 1996/04/25 06:13:19 davem Exp $
++/*
+  * mpmbox.h:  Interface and defines for the OpenProm mailbox
+  *               facilities for MP machines under Linux.
+  *
+diff --git a/include/asm-sparc/msi.h b/include/asm-sparc/msi.h
+index ff72cbd..724ca56 100644
+--- a/include/asm-sparc/msi.h
++++ b/include/asm-sparc/msi.h
+@@ -1,4 +1,4 @@
+-/* $Id: msi.h,v 1.3 1996/08/29 09:48:25 davem Exp $
++/*
+  * msi.h:  Defines specific to the MBus - Sbus - Interface.
+  *
+  * Copyright (C) 1996 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/include/asm-sparc/mxcc.h b/include/asm-sparc/mxcc.h
+index 128fe97..c0517bd 100644
+--- a/include/asm-sparc/mxcc.h
++++ b/include/asm-sparc/mxcc.h
+@@ -1,4 +1,4 @@
+-/* $Id: mxcc.h,v 1.7 1997/04/20 14:11:46 ecd Exp $
++/*
+  * mxcc.h:  Definitions of the Viking MXCC registers
+  *
+  * Copyright (C) 1995 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/include/asm-sparc/namei.h b/include/asm-sparc/namei.h
+index 618344d..0646102 100644
+--- a/include/asm-sparc/namei.h
++++ b/include/asm-sparc/namei.h
+@@ -1,4 +1,4 @@
+-/* $Id: namei.h,v 1.16 2000/04/13 00:55:54 davem Exp $
++/*
+  * linux/include/asm-sparc/namei.h
+  *
+  * Routines to handle famous /usr/gnemul/s*.
+diff --git a/include/asm-sparc/obio.h b/include/asm-sparc/obio.h
+index 47854a2..1a7544c 100644
+--- a/include/asm-sparc/obio.h
++++ b/include/asm-sparc/obio.h
+@@ -1,4 +1,4 @@
+-/* $Id: obio.h,v 1.4 1998/03/09 14:04:55 jj Exp $
++/*
+  * obio.h:  Some useful locations in 0xFXXXXXXXX PA obio space on sun4d.
+  *
+  * Copyright (C) 1997 Jakub Jelinek <jj at sunsite.mff.cuni.cz>
+diff --git a/include/asm-sparc/openprom.h b/include/asm-sparc/openprom.h
+index 12929a2..ed4b6bc 100644
+--- a/include/asm-sparc/openprom.h
++++ b/include/asm-sparc/openprom.h
+@@ -1,4 +1,3 @@
+-/* $Id: openprom.h,v 1.24 2000/06/04 06:23:53 anton Exp $ */
+ #ifndef __SPARC_OPENPROM_H
+ #define __SPARC_OPENPROM_H
+ 
+diff --git a/include/asm-sparc/oplib.h b/include/asm-sparc/oplib.h
+index 7becc84..61c3ca6 100644
+--- a/include/asm-sparc/oplib.h
++++ b/include/asm-sparc/oplib.h
+@@ -1,4 +1,4 @@
+-/* $Id: oplib.h,v 1.23 2001/12/21 00:54:31 davem Exp $
++/*
+  * oplib.h:  Describes the interface and available routines in the
+  *           Linux Prom library.
+  *
+diff --git a/include/asm-sparc/page.h b/include/asm-sparc/page.h
+index 1625a8c..6aa9e4c 100644
+--- a/include/asm-sparc/page.h
++++ b/include/asm-sparc/page.h
+@@ -1,4 +1,4 @@
+-/* $Id: page.h,v 1.55 2000/10/30 21:01:41 davem Exp $
++/*
+  * page.h:  Various defines and such for MMU operations on the Sparc for
+  *          the Linux kernel.
+  *
+diff --git a/include/asm-sparc/param.h b/include/asm-sparc/param.h
+index 86ba59a..9836d9a 100644
+--- a/include/asm-sparc/param.h
++++ b/include/asm-sparc/param.h
+@@ -1,4 +1,3 @@
+-/* $Id: param.h,v 1.4 2000/10/30 21:01:41 davem Exp $ */
+ #ifndef _ASMSPARC_PARAM_H
+ #define _ASMSPARC_PARAM_H
+ 
+diff --git a/include/asm-sparc/pbm.h b/include/asm-sparc/pbm.h
+index fedd9c6..458a491 100644
+--- a/include/asm-sparc/pbm.h
++++ b/include/asm-sparc/pbm.h
+@@ -1,4 +1,4 @@
+-/* $Id: pbm.h,v 1.3 1999/12/20 17:06:35 zaitcev Exp $
++/*
+  *
+  * pbm.h: PCI bus module pseudo driver software state
+  *        Adopted from sparc64 by V. Roganov and G. Raiko
+diff --git a/include/asm-sparc/pcic.h b/include/asm-sparc/pcic.h
+index dedea14..f20ef56 100644
+--- a/include/asm-sparc/pcic.h
++++ b/include/asm-sparc/pcic.h
+@@ -1,4 +1,4 @@
+-/* $Id: pcic.h,v 1.4 1999/11/17 07:34:20 zaitcev Exp $
++/*
+  * pcic.h: JavaEngine 1 specific PCI definitions.
+  *
+  * Copyright (C) 1998 V. Roganov and G. Raiko
+diff --git a/include/asm-sparc/pgalloc.h b/include/asm-sparc/pgalloc.h
+index 6292cd0..681582d 100644
+--- a/include/asm-sparc/pgalloc.h
++++ b/include/asm-sparc/pgalloc.h
+@@ -1,4 +1,3 @@
+-/* $Id: pgalloc.h,v 1.16 2001/12/21 04:56:17 davem Exp $ */
+ #ifndef _SPARC_PGALLOC_H
+ #define _SPARC_PGALLOC_H
+ 
+diff --git a/include/asm-sparc/pgtable.h b/include/asm-sparc/pgtable.h
+index d84af6d..6051229 100644
+--- a/include/asm-sparc/pgtable.h
++++ b/include/asm-sparc/pgtable.h
+@@ -1,4 +1,3 @@
+-/* $Id: pgtable.h,v 1.110 2001/12/21 04:56:17 davem Exp $ */
+ #ifndef _SPARC_PGTABLE_H
+ #define _SPARC_PGTABLE_H
+ 
+diff --git a/include/asm-sparc/pgtsrmmu.h b/include/asm-sparc/pgtsrmmu.h
+index edeb981..808555f 100644
+--- a/include/asm-sparc/pgtsrmmu.h
++++ b/include/asm-sparc/pgtsrmmu.h
+@@ -1,4 +1,4 @@
+-/* $Id: pgtsrmmu.h,v 1.31 2000/07/16 21:48:52 anton Exp $
++/*
+  * pgtsrmmu.h:  SRMMU page table defines and code.
+  *
+  * Copyright (C) 1995 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/include/asm-sparc/pgtsun4.h b/include/asm-sparc/pgtsun4.h
+index 60bda10..5a0d661 100644
+--- a/include/asm-sparc/pgtsun4.h
++++ b/include/asm-sparc/pgtsun4.h
+@@ -1,4 +1,4 @@
+-/* $Id: pgtsun4.h,v 1.5 2000/06/05 06:08:46 anton Exp $
++/*
+  * pgtsun4.h:  Sun4 specific pgtable.h defines and code.
+  *
+  * Copyright (C) 1995 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/include/asm-sparc/pgtsun4c.h b/include/asm-sparc/pgtsun4c.h
+index f53b6db..aeb25e9 100644
+--- a/include/asm-sparc/pgtsun4c.h
++++ b/include/asm-sparc/pgtsun4c.h
+@@ -1,4 +1,4 @@
+-/* $Id: pgtsun4c.h,v 1.37 2000/06/05 06:08:46 anton Exp $
++/*
+  * pgtsun4c.h:  Sun4c specific pgtable.h defines and code.
+  *
+  * Copyright (C) 1995 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/include/asm-sparc/psr.h b/include/asm-sparc/psr.h
+index 2139704..b8c0e5f 100644
+--- a/include/asm-sparc/psr.h
++++ b/include/asm-sparc/psr.h
+@@ -1,4 +1,4 @@
+-/* $Id: psr.h,v 1.15 1997/10/04 08:54:22 ecd Exp $
++/*
+  * psr.h: This file holds the macros for masking off various parts of
+  *        the processor status register on the Sparc. This is valid
+  *        for Version 8. On the V9 this is renamed to the PSTATE
+diff --git a/include/asm-sparc/ptrace.h b/include/asm-sparc/ptrace.h
+index 0afb867..11f3bc2 100644
+--- a/include/asm-sparc/ptrace.h
++++ b/include/asm-sparc/ptrace.h
+@@ -1,4 +1,3 @@
+-/* $Id: ptrace.h,v 1.25 1997/03/04 16:27:25 jj Exp $ */
+ #ifndef _SPARC_PTRACE_H
+ #define _SPARC_PTRACE_H
+ 
+diff --git a/include/asm-sparc/resource.h b/include/asm-sparc/resource.h
+index 0514c30..985948a 100644
+--- a/include/asm-sparc/resource.h
++++ b/include/asm-sparc/resource.h
+@@ -1,4 +1,4 @@
+-/* $Id: resource.h,v 1.12 2000/09/23 02:09:21 davem Exp $
++/*
+  * resource.h: Resource definitions.
+  *
+  * Copyright (C) 1995 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/include/asm-sparc/ross.h b/include/asm-sparc/ross.h
+index f2c14b5..ecb6e81 100644
+--- a/include/asm-sparc/ross.h
++++ b/include/asm-sparc/ross.h
+@@ -1,4 +1,4 @@
+-/* $Id: ross.h,v 1.13 1998/01/07 06:49:11 baccala Exp $
++/*
+  * ross.h: Ross module specific definitions and defines.
+  *
+  * Copyright (C) 1995 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/include/asm-sparc/rtc.h b/include/asm-sparc/rtc.h
+index f4f261d..f9ecb1f 100644
+--- a/include/asm-sparc/rtc.h
++++ b/include/asm-sparc/rtc.h
+@@ -1,5 +1,4 @@
+-/* $Id: rtc.h,v 1.2 1996/08/21 23:17:39 ecd Exp $
+- *
++/*
+  * rtc.h: Definitions for access to the Mostek real time clock
+  *
+  * Copyright (C) 1996 Thomas K. Dyas (tdyas at eden.rutgers.edu)
+diff --git a/include/asm-sparc/sbi.h b/include/asm-sparc/sbi.h
+index 86a603a..5eb7f19 100644
+--- a/include/asm-sparc/sbi.h
++++ b/include/asm-sparc/sbi.h
+@@ -1,4 +1,4 @@
+-/* $Id: sbi.h,v 1.2 1998/03/09 14:04:48 jj Exp $
++/*
+  * sbi.h:  SBI (Sbus Interface on sun4d) definitions
+  *
+  * Copyright (C) 1997 Jakub Jelinek <jj at sunsite.mff.cuni.cz>
+diff --git a/include/asm-sparc/sbus.h b/include/asm-sparc/sbus.h
+index 27d076c..f1d2fe1 100644
+--- a/include/asm-sparc/sbus.h
++++ b/include/asm-sparc/sbus.h
+@@ -1,4 +1,4 @@
+-/* $Id: sbus.h,v 1.22 2000/02/18 13:50:50 davem Exp $
++/*
+  * sbus.h:  Defines for the Sun SBus.
+  *
+  * Copyright (C) 1995 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/include/asm-sparc/scatterlist.h b/include/asm-sparc/scatterlist.h
+index e08d3d7..c82609c 100644
+--- a/include/asm-sparc/scatterlist.h
++++ b/include/asm-sparc/scatterlist.h
+@@ -1,4 +1,3 @@
+-/* $Id: scatterlist.h,v 1.8 2001/12/17 07:05:15 davem Exp $ */
+ #ifndef _SPARC_SCATTERLIST_H
+ #define _SPARC_SCATTERLIST_H
+ 
+diff --git a/include/asm-sparc/shmparam.h b/include/asm-sparc/shmparam.h
+index bb93a6f..59a1243 100644
+--- a/include/asm-sparc/shmparam.h
++++ b/include/asm-sparc/shmparam.h
+@@ -1,4 +1,3 @@
+-/* $Id: shmparam.h,v 1.6 1999/12/09 10:32:41 davem Exp $ */
+ #ifndef _ASMSPARC_SHMPARAM_H
+ #define _ASMSPARC_SHMPARAM_H
+ 
+diff --git a/include/asm-sparc/sigcontext.h b/include/asm-sparc/sigcontext.h
+index 7fa2c7d..c5fb60d 100644
+--- a/include/asm-sparc/sigcontext.h
++++ b/include/asm-sparc/sigcontext.h
+@@ -1,4 +1,3 @@
+-/* $Id: sigcontext.h,v 1.14 1999/09/06 08:22:05 jj Exp $ */
+ #ifndef __SPARC_SIGCONTEXT_H
+ #define __SPARC_SIGCONTEXT_H
+ 
+diff --git a/include/asm-sparc/siginfo.h b/include/asm-sparc/siginfo.h
+index 2c3ea8b..3c71af1 100644
+--- a/include/asm-sparc/siginfo.h
++++ b/include/asm-sparc/siginfo.h
+@@ -1,7 +1,3 @@
+-/* $Id: siginfo.h,v 1.9 2002/02/08 03:57:18 davem Exp $
+- * siginfo.c:
+- */
+-
+ #ifndef _SPARC_SIGINFO_H
+ #define _SPARC_SIGINFO_H
+ 
+diff --git a/include/asm-sparc/signal.h b/include/asm-sparc/signal.h
+index 94071c7..683657d 100644
+--- a/include/asm-sparc/signal.h
++++ b/include/asm-sparc/signal.h
+@@ -1,4 +1,3 @@
+-/* $Id: signal.h,v 1.35 1999/09/06 08:22:04 jj Exp $ */
+ #ifndef _ASMSPARC_SIGNAL_H
+ #define _ASMSPARC_SIGNAL_H
+ 
+diff --git a/include/asm-sparc/smpprim.h b/include/asm-sparc/smpprim.h
+index e7b6d34..eb849d8 100644
+--- a/include/asm-sparc/smpprim.h
++++ b/include/asm-sparc/smpprim.h
+@@ -1,4 +1,4 @@
+-/*  $Id: smpprim.h,v 1.5 1996/08/29 09:48:49 davem Exp $
++/*
+  *  smpprim.h:  SMP locking primitives on the Sparc
+  *
+  *  God knows we won't be actually using this code for some time
+diff --git a/include/asm-sparc/socket.h b/include/asm-sparc/socket.h
+index a00e15d..bf50d0c 100644
+--- a/include/asm-sparc/socket.h
++++ b/include/asm-sparc/socket.h
+@@ -1,4 +1,3 @@
+-/* $Id: socket.h,v 1.17 2001/06/13 16:25:03 davem Exp $ */
+ #ifndef _ASM_SOCKET_H
+ #define _ASM_SOCKET_H
+ 
+diff --git a/include/asm-sparc/stat.h b/include/asm-sparc/stat.h
+index a5b4272..2299e1d 100644
+--- a/include/asm-sparc/stat.h
++++ b/include/asm-sparc/stat.h
+@@ -1,4 +1,3 @@
+-/* $Id: stat.h,v 1.12 2000/08/04 05:35:55 davem Exp $ */
+ #ifndef _SPARC_STAT_H
+ #define _SPARC_STAT_H
+ 
+diff --git a/include/asm-sparc/statfs.h b/include/asm-sparc/statfs.h
+index d623f14..304520f 100644
+--- a/include/asm-sparc/statfs.h
++++ b/include/asm-sparc/statfs.h
+@@ -1,4 +1,3 @@
+-/* $Id: statfs.h,v 1.4 1996/06/07 00:41:05 ecd Exp $ */
+ #ifndef _SPARC_STATFS_H
+ #define _SPARC_STATFS_H
+ 
+diff --git a/include/asm-sparc/string.h b/include/asm-sparc/string.h
+index cb1e923..8d7c0dd 100644
+--- a/include/asm-sparc/string.h
++++ b/include/asm-sparc/string.h
+@@ -1,4 +1,4 @@
+-/* $Id: string.h,v 1.36 2001/12/21 00:54:31 davem Exp $
++/*
+  * string.h: External definitions for optimized assembly string
+  *           routines for the Linux Kernel.
+  *
+diff --git a/include/asm-sparc/sun4paddr.h b/include/asm-sparc/sun4paddr.h
+index d863bfd..d52985f 100644
+--- a/include/asm-sparc/sun4paddr.h
++++ b/include/asm-sparc/sun4paddr.h
+@@ -1,4 +1,4 @@
+-/* $Id: sun4paddr.h,v 1.3 1998/07/28 16:53:27 jj Exp $
++/*
+  * sun4paddr.h:  Various physical addresses on sun4 machines
+  *
+  * Copyright (C) 1997 Anton Blanchard (anton at progsoc.uts.edu.au)
+diff --git a/include/asm-sparc/sunbpp.h b/include/asm-sparc/sunbpp.h
+index 568db79..92ee1a8 100644
+--- a/include/asm-sparc/sunbpp.h
++++ b/include/asm-sparc/sunbpp.h
+@@ -1,4 +1,4 @@
+-/* $Id: sunbpp.h,v 1.1 1999/08/08 14:09:49 shadow Exp $
++/*
+  * include/asm-sparc/sunbpp.h
+  */
+ 
+diff --git a/include/asm-sparc/sysen.h b/include/asm-sparc/sysen.h
+index 692fa6f..6af34ab 100644
+--- a/include/asm-sparc/sysen.h
++++ b/include/asm-sparc/sysen.h
+@@ -1,4 +1,4 @@
+-/* $Id: sysen.h,v 1.3 1995/11/25 02:32:58 davem Exp $
++/*
+  * sysen.h:  Bit fields within the "System Enable" register accessed via
+  *           the ASI_CONTROL address space at address AC_SYSENABLE.
+  *
+diff --git a/include/asm-sparc/termios.h b/include/asm-sparc/termios.h
+index 733d405..f7b4409 100644
+--- a/include/asm-sparc/termios.h
++++ b/include/asm-sparc/termios.h
+@@ -1,4 +1,3 @@
+-/* $Id: termios.h,v 1.32 2001/06/01 08:12:11 davem Exp $ */
+ #ifndef _SPARC_TERMIOS_H
+ #define _SPARC_TERMIOS_H
+ 
+diff --git a/include/asm-sparc/timer.h b/include/asm-sparc/timer.h
+index cb1fa1d..d909565 100644
+--- a/include/asm-sparc/timer.h
++++ b/include/asm-sparc/timer.h
+@@ -1,4 +1,4 @@
+-/* $Id: timer.h,v 1.21 1999/04/20 13:22:51 anton Exp $
++/*
+  * timer.h:  Definitions for the timer chips on the Sparc.
+  *
+  * Copyright (C) 1995 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/include/asm-sparc/traps.h b/include/asm-sparc/traps.h
+index f62c7f8..bebdbf8 100644
+--- a/include/asm-sparc/traps.h
++++ b/include/asm-sparc/traps.h
+@@ -1,4 +1,4 @@
+-/* $Id: traps.h,v 1.9 1998/03/09 14:04:53 jj Exp $
++/*
+  * traps.h:  Format of entries for the Sparc trap table.
+  *
+  * Copyright (C) 1995 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/include/asm-sparc/tsunami.h b/include/asm-sparc/tsunami.h
+index 887add5..5bbd1d5 100644
+--- a/include/asm-sparc/tsunami.h
++++ b/include/asm-sparc/tsunami.h
+@@ -1,4 +1,4 @@
+-/* $Id: tsunami.h,v 1.5 1996/08/29 09:49:03 davem Exp $
++/*
+  * tsunami.h:  Module specific definitions for Tsunami V8 Sparcs
+  *
+  * Copyright (C) 1995 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/include/asm-sparc/turbosparc.h b/include/asm-sparc/turbosparc.h
+index 31d2350..17c7328 100644
+--- a/include/asm-sparc/turbosparc.h
++++ b/include/asm-sparc/turbosparc.h
+@@ -1,4 +1,4 @@
+-/* $Id: turbosparc.h,v 1.4 1998/08/16 16:02:42 ecd Exp $
++/*
+  * turbosparc.h:  Defines specific to the TurboSparc module.
+  *            This is SRMMU stuff.
+  *
+diff --git a/include/asm-sparc/types.h b/include/asm-sparc/types.h
+index 1b08ef8..07734f9 100644
+--- a/include/asm-sparc/types.h
++++ b/include/asm-sparc/types.h
+@@ -1,4 +1,3 @@
+-/* $Id: types.h,v 1.13 2001/12/21 01:22:59 davem Exp $ */
+ #ifndef _SPARC_TYPES_H
+ #define _SPARC_TYPES_H
+ 
+diff --git a/include/asm-sparc/uaccess.h b/include/asm-sparc/uaccess.h
+index 366b116..47d5619 100644
+--- a/include/asm-sparc/uaccess.h
++++ b/include/asm-sparc/uaccess.h
+@@ -1,4 +1,4 @@
+-/* $Id: uaccess.h,v 1.24 2001/10/30 04:32:24 davem Exp $
++/*
+  * uaccess.h: User space memore access functions.
+  *
+  * Copyright (C) 1996 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/include/asm-sparc/vac-ops.h b/include/asm-sparc/vac-ops.h
+index ab6f53b..d105276 100644
+--- a/include/asm-sparc/vac-ops.h
++++ b/include/asm-sparc/vac-ops.h
+@@ -1,4 +1,3 @@
+-/* $Id: vac-ops.h,v 1.13 1998/01/30 10:59:59 jj Exp $ */
+ #ifndef _SPARC_VAC_OPS_H
+ #define _SPARC_VAC_OPS_H
+ 
+diff --git a/include/asm-sparc/vaddrs.h b/include/asm-sparc/vaddrs.h
+index 9109739..f6ca477 100644
+--- a/include/asm-sparc/vaddrs.h
++++ b/include/asm-sparc/vaddrs.h
+@@ -1,4 +1,3 @@
+-/* $Id: vaddrs.h,v 1.27 2001/07/04 00:18:18 davem Exp $ */
+ #ifndef _SPARC_VADDRS_H
+ #define _SPARC_VADDRS_H
+ 
+diff --git a/include/asm-sparc/viking.h b/include/asm-sparc/viking.h
+index 7541da7..989930a 100644
+--- a/include/asm-sparc/viking.h
++++ b/include/asm-sparc/viking.h
+@@ -1,4 +1,4 @@
+-/* $Id: viking.h,v 1.19 1997/04/20 14:11:48 ecd Exp $
++/*
+  * viking.h:  Defines specific to the GNU/Viking MBUS module.
+  *            This is SRMMU stuff.
+  *
+diff --git a/include/asm-sparc/winmacro.h b/include/asm-sparc/winmacro.h
+index 096f3d3..5b0a06d 100644
+--- a/include/asm-sparc/winmacro.h
++++ b/include/asm-sparc/winmacro.h
+@@ -1,4 +1,4 @@
+-/* $Id: winmacro.h,v 1.22 2000/05/09 17:40:15 davem Exp $
++/*
+  * winmacro.h: Window loading-unloading macros.
+  *
+  * Copyright (C) 1995 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/include/asm-sparc64/apb.h b/include/asm-sparc64/apb.h
+index 80f0df2..8f3b57d 100644
+--- a/include/asm-sparc64/apb.h
++++ b/include/asm-sparc64/apb.h
+@@ -1,4 +1,4 @@
+-/* $Id: apb.h,v 1.2 1998/04/01 20:41:49 ecd Exp $
++/*
+  * apb.h: Advanced PCI Bridge Configuration Registers and Bits
+  *
+  * Copyright (C) 1998  Eddie C. Dost  (ecd at skynet.be)
+diff --git a/include/asm-sparc64/asi.h b/include/asm-sparc64/asi.h
+index 662a211..bc57c40 100644
+--- a/include/asm-sparc64/asi.h
++++ b/include/asm-sparc64/asi.h
+@@ -1,4 +1,3 @@
+-/* $Id: asi.h,v 1.5 2001/03/29 11:47:47 davem Exp $ */
+ #ifndef _SPARC64_ASI_H
+ #define _SPARC64_ASI_H
+ 
+diff --git a/include/asm-sparc64/auxio.h b/include/asm-sparc64/auxio.h
+index 81a590a..c410049 100644
+--- a/include/asm-sparc64/auxio.h
++++ b/include/asm-sparc64/auxio.h
+@@ -1,4 +1,4 @@
+-/* $Id: auxio.h,v 1.3 2001/06/05 08:16:34 davem Exp $
++/*
+  * auxio.h:  Definitions and code for the Auxiliary I/O registers.
+  *
+  * Copyright (C) 1995 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/include/asm-sparc64/bbc.h b/include/asm-sparc64/bbc.h
+index 368fce4..423a858 100644
+--- a/include/asm-sparc64/bbc.h
++++ b/include/asm-sparc64/bbc.h
+@@ -1,4 +1,4 @@
+-/* $Id: bbc.h,v 1.2 2001/03/26 23:47:18 davem Exp $
++/*
+  * bbc.h: Defines for BootBus Controller found on UltraSPARC-III
+  *        systems.
+  *
+diff --git a/include/asm-sparc64/bitops.h b/include/asm-sparc64/bitops.h
+index 11f9d81..bb87b80 100644
+--- a/include/asm-sparc64/bitops.h
++++ b/include/asm-sparc64/bitops.h
+@@ -1,4 +1,4 @@
+-/* $Id: bitops.h,v 1.39 2002/01/30 01:40:00 davem Exp $
++/*
+  * bitops.h: Bit string operations on the V9.
+  *
+  * Copyright 1996, 1997 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/include/asm-sparc64/chafsr.h b/include/asm-sparc64/chafsr.h
+index fd16883..85c69b3 100644
+--- a/include/asm-sparc64/chafsr.h
++++ b/include/asm-sparc64/chafsr.h
+@@ -1,4 +1,3 @@
+-/* $Id: chafsr.h,v 1.1 2001/03/28 10:56:34 davem Exp $ */
+ #ifndef _SPARC64_CHAFSR_H
+ #define _SPARC64_CHAFSR_H
+ 
+diff --git a/include/asm-sparc64/checksum.h b/include/asm-sparc64/checksum.h
+index 70a006d..b290564 100644
+--- a/include/asm-sparc64/checksum.h
++++ b/include/asm-sparc64/checksum.h
+@@ -1,4 +1,3 @@
+-/* $Id: checksum.h,v 1.19 2002/02/09 19:49:31 davem Exp $ */
+ #ifndef __SPARC64_CHECKSUM_H
+ #define __SPARC64_CHECKSUM_H
+ 
+diff --git a/include/asm-sparc64/chmctrl.h b/include/asm-sparc64/chmctrl.h
+index 53047f9..859b4a4 100644
+--- a/include/asm-sparc64/chmctrl.h
++++ b/include/asm-sparc64/chmctrl.h
+@@ -1,4 +1,3 @@
+-/* $Id: chmctrl.h,v 1.1 2001/03/29 11:43:28 davem Exp $ */
+ #ifndef _SPARC64_CHMCTRL_H
+ #define _SPARC64_CHMCTRL_H
+ 
+diff --git a/include/asm-sparc64/dcr.h b/include/asm-sparc64/dcr.h
+index e9a3f30..620c9ba 100644
+--- a/include/asm-sparc64/dcr.h
++++ b/include/asm-sparc64/dcr.h
+@@ -1,4 +1,3 @@
+-/* $Id: dcr.h,v 1.4 2001/03/09 17:56:37 davem Exp $ */
+ #ifndef _SPARC64_DCR_H
+ #define _SPARC64_DCR_H
+ 
+diff --git a/include/asm-sparc64/display7seg.h b/include/asm-sparc64/display7seg.h
+index 955a350..c066a89 100644
+--- a/include/asm-sparc64/display7seg.h
++++ b/include/asm-sparc64/display7seg.h
+@@ -1,4 +1,4 @@
+-/* $Id: display7seg.h,v 1.2 2000/08/02 06:22:35 davem Exp $
++/*
+  *
+  * display7seg - Driver interface for the 7-segment display
+  * present on Sun Microsystems CP1400 and CP1500
+diff --git a/include/asm-sparc64/dma.h b/include/asm-sparc64/dma.h
+index a9fd061..9d4c024 100644
+--- a/include/asm-sparc64/dma.h
++++ b/include/asm-sparc64/dma.h
+@@ -1,4 +1,4 @@
+-/* $Id: dma.h,v 1.21 2001/12/13 04:16:52 davem Exp $
++/*
+  * include/asm-sparc64/dma.h
+  *
+  * Copyright 1996 (C) David S. Miller (davem at caip.rutgers.edu)
+diff --git a/include/asm-sparc64/ebus.h b/include/asm-sparc64/ebus.h
+index 9c1c6db..fcc62b9 100644
+--- a/include/asm-sparc64/ebus.h
++++ b/include/asm-sparc64/ebus.h
+@@ -1,4 +1,4 @@
+-/* $Id: ebus.h,v 1.10 2001/03/14 05:00:55 davem Exp $
++/*
+  * ebus.h: PCI to Ebus pseudo driver software state.
+  *
+  * Copyright (C) 1997 Eddie C. Dost (ecd at skynet.be)
+diff --git a/include/asm-sparc64/elf.h b/include/asm-sparc64/elf.h
+index 11c8e68..0818a13 100644
+--- a/include/asm-sparc64/elf.h
++++ b/include/asm-sparc64/elf.h
+@@ -1,4 +1,3 @@
+-/* $Id: elf.h,v 1.32 2002/02/09 19:49:31 davem Exp $ */
+ #ifndef __ASM_SPARC64_ELF_H
+ #define __ASM_SPARC64_ELF_H
+ 
+diff --git a/include/asm-sparc64/envctrl.h b/include/asm-sparc64/envctrl.h
+index 53a6653..a5668a0 100644
+--- a/include/asm-sparc64/envctrl.h
++++ b/include/asm-sparc64/envctrl.h
+@@ -1,4 +1,4 @@
+-/* $Id: envctrl.h,v 1.3 2000/11/03 00:37:40 davem Exp $
++/*
+  *
+  * envctrl.h: Definitions for access to the i2c environment
+  *            monitoring on Ultrasparc systems.
+diff --git a/include/asm-sparc64/estate.h b/include/asm-sparc64/estate.h
+index a719c3d..520c085 100644
+--- a/include/asm-sparc64/estate.h
++++ b/include/asm-sparc64/estate.h
+@@ -1,4 +1,3 @@
+-/* $Id: estate.h,v 1.1 2001/03/28 10:56:34 davem Exp $ */
+ #ifndef _SPARC64_ESTATE_H
+ #define _SPARC64_ESTATE_H
+ 
+diff --git a/include/asm-sparc64/fcntl.h b/include/asm-sparc64/fcntl.h
+index 111f6b3..8a09ca7 100644
+--- a/include/asm-sparc64/fcntl.h
++++ b/include/asm-sparc64/fcntl.h
+@@ -1,4 +1,3 @@
+-/* $Id: fcntl.h,v 1.12 2001/09/20 00:35:34 davem Exp $ */
+ #ifndef _SPARC64_FCNTL_H
+ #define _SPARC64_FCNTL_H
+ 
+diff --git a/include/asm-sparc64/fhc.h b/include/asm-sparc64/fhc.h
+index 9e7f1b0..ddffcdf 100644
+--- a/include/asm-sparc64/fhc.h
++++ b/include/asm-sparc64/fhc.h
+@@ -1,4 +1,4 @@
+-/* $Id: fhc.h,v 1.5 1999/09/21 14:39:29 davem Exp $
++/*
+  * fhc.h: Structures for central/fhc pseudo driver on Sunfire/Starfire/Wildfire.
+  *
+  * Copyright (C) 1997, 1999 David S. Miller (davem at redhat.com)
+diff --git a/include/asm-sparc64/head.h b/include/asm-sparc64/head.h
+index 67960a7..10e9dab 100644
+--- a/include/asm-sparc64/head.h
++++ b/include/asm-sparc64/head.h
+@@ -1,4 +1,3 @@
+-/* $Id: head.h,v 1.30 1997/08/08 08:34:33 jj Exp $ */
+ #ifndef _SPARC64_HEAD_H
+ #define _SPARC64_HEAD_H
+ 
+diff --git a/include/asm-sparc64/ide.h b/include/asm-sparc64/ide.h
+index c5fdabe..1282676 100644
+--- a/include/asm-sparc64/ide.h
++++ b/include/asm-sparc64/ide.h
+@@ -1,4 +1,4 @@
+-/* $Id: ide.h,v 1.21 2001/09/25 20:21:48 kanoj Exp $
++/*
+  * ide.h: Ultra/PCI specific IDE glue.
+  *
+  * Copyright (C) 1997  David S. Miller (davem at caip.rutgers.edu)
+diff --git a/include/asm-sparc64/idprom.h b/include/asm-sparc64/idprom.h
+index 77fbf98..a363fa0 100644
+--- a/include/asm-sparc64/idprom.h
++++ b/include/asm-sparc64/idprom.h
+@@ -1,4 +1,4 @@
+-/* $Id: idprom.h,v 1.2 1997/04/04 00:50:16 davem Exp $
++/*
+  * idprom.h: Macros and defines for idprom routines
+  *
+  * Copyright (C) 1996 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/include/asm-sparc64/ioctl.h b/include/asm-sparc64/ioctl.h
+index 253d0b5..d634c21 100644
+--- a/include/asm-sparc64/ioctl.h
++++ b/include/asm-sparc64/ioctl.h
+@@ -1,4 +1,3 @@
+-/* $Id: ioctl.h,v 1.2 1998/10/15 05:40:38 jj Exp $ */
+ #ifndef _SPARC64_IOCTL_H
+ #define _SPARC64_IOCTL_H
+ 
+diff --git a/include/asm-sparc64/ioctls.h b/include/asm-sparc64/ioctls.h
+index c1be406..94d1b75 100644
+--- a/include/asm-sparc64/ioctls.h
++++ b/include/asm-sparc64/ioctls.h
+@@ -1,4 +1,3 @@
+-/* $Id: ioctls.h,v 1.7 1998/02/23 02:49:41 davem Exp $ */
+ #ifndef _ASM_SPARC64_IOCTLS_H
+ #define _ASM_SPARC64_IOCTLS_H
+ 
+diff --git a/include/asm-sparc64/lsu.h b/include/asm-sparc64/lsu.h
+index 79f1098..7190f8d 100644
+--- a/include/asm-sparc64/lsu.h
++++ b/include/asm-sparc64/lsu.h
+@@ -1,4 +1,3 @@
+-/* $Id: lsu.h,v 1.2 1997/04/04 00:50:22 davem Exp $ */
+ #ifndef _SPARC64_LSU_H
+ #define _SPARC64_LSU_H
+ 
+diff --git a/include/asm-sparc64/mman.h b/include/asm-sparc64/mman.h
+index 625be4d..d2ae67c 100644
+--- a/include/asm-sparc64/mman.h
++++ b/include/asm-sparc64/mman.h
+@@ -1,4 +1,3 @@
+-/* $Id: mman.h,v 1.2 2000/03/15 02:44:26 davem Exp $ */
+ #ifndef __SPARC64_MMAN_H__
+ #define __SPARC64_MMAN_H__
+ 
+diff --git a/include/asm-sparc64/mmu_context.h b/include/asm-sparc64/mmu_context.h
+index 9fc225e..5693ab4 100644
+--- a/include/asm-sparc64/mmu_context.h
++++ b/include/asm-sparc64/mmu_context.h
+@@ -1,4 +1,3 @@
+-/* $Id: mmu_context.h,v 1.54 2002/02/09 19:49:31 davem Exp $ */
+ #ifndef __SPARC64_MMU_CONTEXT_H
+ #define __SPARC64_MMU_CONTEXT_H
+ 
+diff --git a/include/asm-sparc64/namei.h b/include/asm-sparc64/namei.h
+index 275161f..cbc1b4c 100644
+--- a/include/asm-sparc64/namei.h
++++ b/include/asm-sparc64/namei.h
+@@ -1,4 +1,4 @@
+-/* $Id: namei.h,v 1.17 2000/04/13 00:55:54 davem Exp $
++/*
+  * linux/include/asm-sparc64/namei.h
+  *
+  * Routines to handle famous /usr/gnemul/s*.
+diff --git a/include/asm-sparc64/openprom.h b/include/asm-sparc64/openprom.h
+index 26ec046..b69e4a8 100644
+--- a/include/asm-sparc64/openprom.h
++++ b/include/asm-sparc64/openprom.h
+@@ -1,4 +1,3 @@
+-/* $Id: openprom.h,v 1.9 2001/03/16 10:22:02 davem Exp $ */
+ #ifndef __SPARC64_OPENPROM_H
+ #define __SPARC64_OPENPROM_H
+ 
+diff --git a/include/asm-sparc64/page.h b/include/asm-sparc64/page.h
+index 618117d..93f0881 100644
+--- a/include/asm-sparc64/page.h
++++ b/include/asm-sparc64/page.h
+@@ -1,5 +1,3 @@
+-/* $Id: page.h,v 1.39 2002/02/09 19:49:31 davem Exp $ */
+-
+ #ifndef _SPARC64_PAGE_H
+ #define _SPARC64_PAGE_H
+ 
+diff --git a/include/asm-sparc64/pgalloc.h b/include/asm-sparc64/pgalloc.h
+index 3ee2d40..326de10 100644
+--- a/include/asm-sparc64/pgalloc.h
++++ b/include/asm-sparc64/pgalloc.h
+@@ -1,4 +1,3 @@
+-/* $Id: pgalloc.h,v 1.30 2001/12/21 04:56:17 davem Exp $ */
+ #ifndef _SPARC64_PGALLOC_H
+ #define _SPARC64_PGALLOC_H
+ 
+diff --git a/include/asm-sparc64/pgtable.h b/include/asm-sparc64/pgtable.h
+index 0e200e7..b870177 100644
+--- a/include/asm-sparc64/pgtable.h
++++ b/include/asm-sparc64/pgtable.h
+@@ -1,4 +1,4 @@
+-/* $Id: pgtable.h,v 1.156 2002/02/09 19:49:31 davem Exp $
++/*
+  * pgtable.h: SpitFire page table operations.
+  *
+  * Copyright 1996,1997 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/include/asm-sparc64/pil.h b/include/asm-sparc64/pil.h
+index 2f5d126..eaac842 100644
+--- a/include/asm-sparc64/pil.h
++++ b/include/asm-sparc64/pil.h
+@@ -1,4 +1,3 @@
+-/* $Id: pil.h,v 1.1 2002/01/23 11:27:36 davem Exp $ */
+ #ifndef _SPARC64_PIL_H
+ #define _SPARC64_PIL_H
+ 
+diff --git a/include/asm-sparc64/processor.h b/include/asm-sparc64/processor.h
+index 885b6a1..26b4e52 100644
+--- a/include/asm-sparc64/processor.h
++++ b/include/asm-sparc64/processor.h
+@@ -1,4 +1,4 @@
+-/* $Id: processor.h,v 1.83 2002/02/10 06:04:33 davem Exp $
++/*
+  * include/asm-sparc64/processor.h
+  *
+  * Copyright (C) 1996 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/include/asm-sparc64/psrcompat.h b/include/asm-sparc64/psrcompat.h
+index 3614ca0..44b6327 100644
+--- a/include/asm-sparc64/psrcompat.h
++++ b/include/asm-sparc64/psrcompat.h
+@@ -1,4 +1,3 @@
+-/* $Id: psrcompat.h,v 1.5 1998/10/06 09:28:39 jj Exp $ */
+ #ifndef _SPARC64_PSRCOMPAT_H
+ #define _SPARC64_PSRCOMPAT_H
+ 
+diff --git a/include/asm-sparc64/pstate.h b/include/asm-sparc64/pstate.h
+index 949aeba..a26a537 100644
+--- a/include/asm-sparc64/pstate.h
++++ b/include/asm-sparc64/pstate.h
+@@ -1,4 +1,3 @@
+-/* $Id: pstate.h,v 1.6 1997/06/25 07:39:45 jj Exp $ */
+ #ifndef _SPARC64_PSTATE_H
+ #define _SPARC64_PSTATE_H
+ 
+diff --git a/include/asm-sparc64/ptrace.h b/include/asm-sparc64/ptrace.h
+index 90972a5..d8a56cd 100644
+--- a/include/asm-sparc64/ptrace.h
++++ b/include/asm-sparc64/ptrace.h
+@@ -126,6 +126,17 @@ struct sparc_trapf {
+ #define TRACEREG32_SZ	sizeof(struct pt_regs32)
+ #define STACKFRAME32_SZ	sizeof(struct sparc_stackf32)
+ 
++struct global_reg_snapshot {
++	unsigned long		tstate;
++	unsigned long		tpc;
++	unsigned long		tnpc;
++	unsigned long		o7;
++	unsigned long		i7;
++	struct thread_info	*thread;
++	unsigned long		pad1;
++	unsigned long		pad2;
++};
++
+ #ifdef __KERNEL__
+ 
+ #define __ARCH_WANT_COMPAT_SYS_PTRACE
+@@ -295,6 +306,16 @@ extern void __show_regs(struct pt_regs *);
+ #define SF_XARG5  0x58
+ #define SF_XXARG  0x5c
+ 
++/* global_reg_snapshot offsets */
++#define GR_SNAP_TSTATE	0x00
++#define GR_SNAP_TPC	0x08
++#define GR_SNAP_TNPC	0x10
++#define GR_SNAP_O7	0x18
++#define GR_SNAP_I7	0x20
++#define GR_SNAP_THREAD	0x28
++#define GR_SNAP_PAD1	0x30
++#define GR_SNAP_PAD2	0x38
++
+ /* Stuff for the ptrace system call */
+ #define PTRACE_SPARC_DETACH       11
+ #define PTRACE_GETREGS            12
+diff --git a/include/asm-sparc64/reg.h b/include/asm-sparc64/reg.h
+index fc68f90..77aa480 100644
+--- a/include/asm-sparc64/reg.h
++++ b/include/asm-sparc64/reg.h
+@@ -1,4 +1,4 @@
+-/* $Id: reg.h,v 1.6 1999/09/06 08:22:10 jj Exp $
++/*
+  * linux/asm-sparc64/reg.h
+  * Layout of the registers as expected by gdb on the Sparc
+  * we should replace the user.h definitions with those in
+diff --git a/include/asm-sparc64/resource.h b/include/asm-sparc64/resource.h
+index aa46979..4f08fb5 100644
+--- a/include/asm-sparc64/resource.h
++++ b/include/asm-sparc64/resource.h
+@@ -1,4 +1,4 @@
+-/* $Id: resource.h,v 1.8 2000/09/23 02:09:21 davem Exp $
++/*
+  * resource.h: Resource definitions.
+  *
+  * Copyright (C) 1996 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/include/asm-sparc64/rtc.h b/include/asm-sparc64/rtc.h
+index cb17334..f9ecb1f 100644
+--- a/include/asm-sparc64/rtc.h
++++ b/include/asm-sparc64/rtc.h
+@@ -1,5 +1,4 @@
+-/* $Id: rtc.h,v 1.1 1996/12/26 14:22:35 davem Exp $
+- *
++/*
+  * rtc.h: Definitions for access to the Mostek real time clock
+  *
+  * Copyright (C) 1996 Thomas K. Dyas (tdyas at eden.rutgers.edu)
+diff --git a/include/asm-sparc64/rwsem.h b/include/asm-sparc64/rwsem.h
+index 1294b7c..1dc129a 100644
+--- a/include/asm-sparc64/rwsem.h
++++ b/include/asm-sparc64/rwsem.h
+@@ -1,4 +1,4 @@
+-/* $Id: rwsem.h,v 1.5 2001/11/18 00:12:56 davem Exp $
++/*
+  * rwsem.h: R/W semaphores implemented using CAS
+  *
+  * Written by David S. Miller (davem at redhat.com), 2001.
+diff --git a/include/asm-sparc64/scatterlist.h b/include/asm-sparc64/scatterlist.h
+index 6df23f0..81bd058 100644
+--- a/include/asm-sparc64/scatterlist.h
++++ b/include/asm-sparc64/scatterlist.h
+@@ -1,4 +1,3 @@
+-/* $Id: scatterlist.h,v 1.11 2001/12/17 07:05:15 davem Exp $ */
+ #ifndef _SPARC64_SCATTERLIST_H
+ #define _SPARC64_SCATTERLIST_H
+ 
+diff --git a/include/asm-sparc64/shmparam.h b/include/asm-sparc64/shmparam.h
+index 8c66fde..1ed0d67 100644
+--- a/include/asm-sparc64/shmparam.h
++++ b/include/asm-sparc64/shmparam.h
+@@ -1,4 +1,3 @@
+-/* $Id: shmparam.h,v 1.5 2001/09/24 21:17:57 kanoj Exp $ */
+ #ifndef _ASMSPARC64_SHMPARAM_H
+ #define _ASMSPARC64_SHMPARAM_H
+ 
+diff --git a/include/asm-sparc64/sigcontext.h b/include/asm-sparc64/sigcontext.h
+index d807337..1c868d6 100644
+--- a/include/asm-sparc64/sigcontext.h
++++ b/include/asm-sparc64/sigcontext.h
+@@ -1,4 +1,3 @@
+-/* $Id: sigcontext.h,v 1.12 1999/09/06 08:22:09 jj Exp $ */
+ #ifndef __SPARC64_SIGCONTEXT_H
+ #define __SPARC64_SIGCONTEXT_H
+ 
+diff --git a/include/asm-sparc64/signal.h b/include/asm-sparc64/signal.h
+index c49f32d..2a7c793 100644
+--- a/include/asm-sparc64/signal.h
++++ b/include/asm-sparc64/signal.h
+@@ -1,4 +1,3 @@
+-/* $Id: signal.h,v 1.9 1999/09/06 08:22:11 jj Exp $ */
+ #ifndef _ASMSPARC64_SIGNAL_H
+ #define _ASMSPARC64_SIGNAL_H
+ 
+diff --git a/include/asm-sparc64/smp.h b/include/asm-sparc64/smp.h
+index 1c1c5ea..cd0311b 100644
+--- a/include/asm-sparc64/smp.h
++++ b/include/asm-sparc64/smp.h
+@@ -1,6 +1,6 @@
+ /* smp.h: Sparc64 specific SMP stuff.
+  *
+- * Copyright (C) 1996 David S. Miller (davem at caip.rutgers.edu)
++ * Copyright (C) 1996, 2008 David S. Miller (davem at davemloft.net)
+  */
+ 
+ #ifndef _SPARC64_SMP_H
+@@ -44,6 +44,8 @@ extern int hard_smp_processor_id(void);
+ extern void smp_fill_in_sib_core_maps(void);
+ extern void cpu_play_dead(void);
+ 
++extern void smp_fetch_global_regs(void);
++
+ #ifdef CONFIG_HOTPLUG_CPU
+ extern int __cpu_disable(void);
+ extern void __cpu_die(unsigned int cpu);
+@@ -55,6 +57,7 @@ extern void __cpu_die(unsigned int cpu);
+ 
+ #define hard_smp_processor_id()		0
+ #define smp_fill_in_sib_core_maps() do { } while (0)
++#define smp_fetch_global_regs() do { } while (0)
+ 
+ #endif /* !(CONFIG_SMP) */
+ 
+diff --git a/include/asm-sparc64/socket.h b/include/asm-sparc64/socket.h
+index 8cf071f..5af688f 100644
+--- a/include/asm-sparc64/socket.h
++++ b/include/asm-sparc64/socket.h
+@@ -1,4 +1,3 @@
+-/* $Id: socket.h,v 1.10 2001/06/13 16:25:03 davem Exp $ */
+ #ifndef _ASM_SOCKET_H
+ #define _ASM_SOCKET_H
+ 
+diff --git a/include/asm-sparc64/starfire.h b/include/asm-sparc64/starfire.h
+index 48b50b5..07bafd3 100644
+--- a/include/asm-sparc64/starfire.h
++++ b/include/asm-sparc64/starfire.h
+@@ -1,4 +1,4 @@
+-/* $Id: starfire.h,v 1.2 2001/07/04 00:18:18 davem Exp $
++/*
+  * starfire.h: Group all starfire specific code together.
+  *
+  * Copyright (C) 2000 Anton Blanchard (anton at samba.org)
+diff --git a/include/asm-sparc64/stat.h b/include/asm-sparc64/stat.h
+index 128c27e..9650fde 100644
+--- a/include/asm-sparc64/stat.h
++++ b/include/asm-sparc64/stat.h
+@@ -1,4 +1,3 @@
+-/* $Id: stat.h,v 1.7 2000/08/04 05:35:55 davem Exp $ */
+ #ifndef _SPARC64_STAT_H
+ #define _SPARC64_STAT_H
+ 
+diff --git a/include/asm-sparc64/statfs.h b/include/asm-sparc64/statfs.h
+index 185b6c4..79b3c89 100644
+--- a/include/asm-sparc64/statfs.h
++++ b/include/asm-sparc64/statfs.h
+@@ -1,4 +1,3 @@
+-/* $Id: statfs.h,v 1.2 1997/04/14 17:05:22 jj Exp $ */
+ #ifndef _SPARC64_STATFS_H
+ #define _SPARC64_STATFS_H
+ 
+diff --git a/include/asm-sparc64/string.h b/include/asm-sparc64/string.h
+index c7d8862..43161f2 100644
+--- a/include/asm-sparc64/string.h
++++ b/include/asm-sparc64/string.h
+@@ -1,4 +1,4 @@
+-/* $Id: string.h,v 1.20 2001/09/27 04:36:24 kanoj Exp $
++/*
+  * string.h: External definitions for optimized assembly string
+  *           routines for the Linux Kernel.
+  *
+diff --git a/include/asm-sparc64/sunbpp.h b/include/asm-sparc64/sunbpp.h
+index b441cc9..8e171b7 100644
+--- a/include/asm-sparc64/sunbpp.h
++++ b/include/asm-sparc64/sunbpp.h
+@@ -1,4 +1,4 @@
+-/* $Id: sunbpp.h,v 1.1 1999/08/13 06:21:44 shadow Exp $
++/*
+  * include/asm-sparc64/sunbpp.h
+  */
+ 
+diff --git a/include/asm-sparc64/termios.h b/include/asm-sparc64/termios.h
+index cacbea1..1f5dab2 100644
+--- a/include/asm-sparc64/termios.h
++++ b/include/asm-sparc64/termios.h
+@@ -1,4 +1,3 @@
+-/* $Id: termios.h,v 1.11 2001/06/01 08:12:11 davem Exp $ */
+ #ifndef _SPARC64_TERMIOS_H
+ #define _SPARC64_TERMIOS_H
+ 
+diff --git a/include/asm-sparc64/ttable.h b/include/asm-sparc64/ttable.h
+index 52d67d3..0ba1995 100644
+--- a/include/asm-sparc64/ttable.h
++++ b/include/asm-sparc64/ttable.h
+@@ -1,4 +1,3 @@
+-/* $Id: ttable.h,v 1.18 2002/02/09 19:49:32 davem Exp $ */
+ #ifndef _SPARC64_TTABLE_H
+ #define _SPARC64_TTABLE_H
+ 
+diff --git a/include/asm-sparc64/types.h b/include/asm-sparc64/types.h
+index 5dbe04f..b27ccc8 100644
+--- a/include/asm-sparc64/types.h
++++ b/include/asm-sparc64/types.h
+@@ -1,4 +1,3 @@
+-/* $Id: types.h,v 1.4 2001/10/09 02:24:35 davem Exp $ */
+ #ifndef _SPARC64_TYPES_H
+ #define _SPARC64_TYPES_H
+ 
+diff --git a/include/asm-sparc64/uaccess.h b/include/asm-sparc64/uaccess.h
+index d8547b8..5fcbaf6 100644
+--- a/include/asm-sparc64/uaccess.h
++++ b/include/asm-sparc64/uaccess.h
+@@ -1,4 +1,3 @@
+-/* $Id: uaccess.h,v 1.35 2002/02/09 19:49:31 davem Exp $ */
+ #ifndef _ASM_UACCESS_H
+ #define _ASM_UACCESS_H
+ 
+diff --git a/include/asm-sparc64/uctx.h b/include/asm-sparc64/uctx.h
+index 6eaf16e..dc937c7 100644
+--- a/include/asm-sparc64/uctx.h
++++ b/include/asm-sparc64/uctx.h
+@@ -1,4 +1,4 @@
+-/* $Id: uctx.h,v 1.1 1997/06/18 16:51:58 davem Exp $
++/*
+  * uctx.h: Sparc64 {set,get}context() register state layouts.
+  *
+  * Copyright (C) 1997 David S. Miller (davem at caip.rutgers.edu)
+diff --git a/include/asm-sparc64/utrap.h b/include/asm-sparc64/utrap.h
+index 81b0ebf..e49e5c4 100644
+--- a/include/asm-sparc64/utrap.h
++++ b/include/asm-sparc64/utrap.h
+@@ -1,4 +1,4 @@
+-/* $Id: utrap.h,v 1.1 1997/10/14 16:21:31 jj Exp $
++/*
+  * include/asm-sparc64/utrap.h
+  *
+  * Copyright (C) 1997 Jakub Jelinek (jj at sunsite.mff.cuni.cz)
+diff --git a/include/asm-sparc64/watchdog.h b/include/asm-sparc64/watchdog.h
+index 4d5b03b..5baf2d3 100644
+--- a/include/asm-sparc64/watchdog.h
++++ b/include/asm-sparc64/watchdog.h
+@@ -1,4 +1,4 @@
+-/* $Id: watchdog.h,v 1.1 2001/01/18 04:47:44 davem Exp $
++/*
+  *
+  * watchdog - Driver interface for the hardware watchdog timers
+  * present on Sun Microsystems boardsets
+diff --git a/include/asm-x86/kvm_x86_emulate.h b/include/asm-x86/kvm_x86_emulate.h
+index d6337f9..b877bbd 100644
+--- a/include/asm-x86/kvm_x86_emulate.h
++++ b/include/asm-x86/kvm_x86_emulate.h
+@@ -135,6 +135,7 @@ struct decode_cache {
+ 	u8 modrm_rm;
+ 	u8 use_modrm_ea;
+ 	unsigned long modrm_ea;
++	void *modrm_ptr;
+ 	unsigned long modrm_val;
+ 	struct fetch_cache fetch;
+ };
+diff --git a/include/asm-x86/page.h b/include/asm-x86/page.h
+index b381f4a..dc936dd 100644
+--- a/include/asm-x86/page.h
++++ b/include/asm-x86/page.h
+@@ -10,8 +10,16 @@
+ 
+ #ifdef __KERNEL__
+ 
+-#define PHYSICAL_PAGE_MASK	(PAGE_MASK & __PHYSICAL_MASK)
+-#define PTE_MASK		(_AT(long, PHYSICAL_PAGE_MASK))
++#define __PHYSICAL_MASK		((phys_addr_t)(1ULL << __PHYSICAL_MASK_SHIFT) - 1)
++#define __VIRTUAL_MASK		((1UL << __VIRTUAL_MASK_SHIFT) - 1)
++
++/* Cast PAGE_MASK to a signed type so that it is sign-extended if
++   virtual addresses are 32-bits but physical addresses are larger
++   (ie, 32-bit PAE). */
++#define PHYSICAL_PAGE_MASK	(((signed long)PAGE_MASK) & __PHYSICAL_MASK)
++
++/* PTE_MASK extracts the PFN from a (pte|pmd|pud|pgd)val_t */
++#define PTE_MASK		((pteval_t)PHYSICAL_PAGE_MASK)
+ 
+ #define PMD_PAGE_SIZE		(_AC(1, UL) << PMD_SHIFT)
+ #define PMD_PAGE_MASK		(~(PMD_PAGE_SIZE-1))
+@@ -24,9 +32,6 @@
+ /* to align the pointer to the (next) page boundary */
+ #define PAGE_ALIGN(addr)	(((addr)+PAGE_SIZE-1)&PAGE_MASK)
+ 
+-#define __PHYSICAL_MASK		_AT(phys_addr_t, (_AC(1,ULL) << __PHYSICAL_MASK_SHIFT) - 1)
+-#define __VIRTUAL_MASK		((_AC(1,UL) << __VIRTUAL_MASK_SHIFT) - 1)
+-
+ #ifndef __ASSEMBLY__
+ #include <linux/types.h>
+ #endif
+diff --git a/include/asm-x86/pgtable-3level.h b/include/asm-x86/pgtable-3level.h
+index 8b4a9d4..c93dbb6 100644
+--- a/include/asm-x86/pgtable-3level.h
++++ b/include/asm-x86/pgtable-3level.h
+@@ -120,9 +120,9 @@ static inline void pud_clear(pud_t *pudp)
+ 		write_cr3(pgd);
+ }
+ 
+-#define pud_page(pud) ((struct page *) __va(pud_val(pud) & PAGE_MASK))
++#define pud_page(pud) ((struct page *) __va(pud_val(pud) & PTE_MASK))
+ 
+-#define pud_page_vaddr(pud) ((unsigned long) __va(pud_val(pud) & PAGE_MASK))
++#define pud_page_vaddr(pud) ((unsigned long) __va(pud_val(pud) & PTE_MASK))
+ 
+ 
+ /* Find an entry in the second-level page table.. */
+@@ -160,7 +160,7 @@ static inline int pte_none(pte_t pte)
+ 
+ static inline unsigned long pte_pfn(pte_t pte)
+ {
+-	return (pte_val(pte) & ~_PAGE_NX) >> PAGE_SHIFT;
++	return (pte_val(pte) & PTE_MASK) >> PAGE_SHIFT;
+ }
+ 
+ /*
+diff --git a/include/asm-x86/pgtable.h b/include/asm-x86/pgtable.h
+index 55c3a0e..97c271b 100644
+--- a/include/asm-x86/pgtable.h
++++ b/include/asm-x86/pgtable.h
+@@ -57,6 +57,7 @@
+ #define _KERNPG_TABLE	(_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED |	\
+ 			 _PAGE_DIRTY)
+ 
++/* Set of bits not changed in pte_modify */
+ #define _PAGE_CHG_MASK	(PTE_MASK | _PAGE_PCD | _PAGE_PWT |		\
+ 			 _PAGE_ACCESSED | _PAGE_DIRTY)
+ 
+@@ -304,7 +305,7 @@ static inline pgprot_t pgprot_modify(pgprot_t oldprot, pgprot_t newprot)
+ 	return __pgprot(preservebits | addbits);
+ }
+ 
+-#define pte_pgprot(x) __pgprot(pte_val(x) & (0xfff | _PAGE_NX))
++#define pte_pgprot(x) __pgprot(pte_val(x) & ~PTE_MASK)
+ 
+ #define canon_pgprot(p) __pgprot(pgprot_val(p) & __supported_pte_mask)
+ 
+diff --git a/include/asm-x86/pgtable_32.h b/include/asm-x86/pgtable_32.h
+index d7f0403..32ca031 100644
+--- a/include/asm-x86/pgtable_32.h
++++ b/include/asm-x86/pgtable_32.h
+@@ -88,7 +88,7 @@ extern unsigned long pg0[];
+ /* To avoid harmful races, pmd_none(x) should check only the lower when PAE */
+ #define pmd_none(x)	(!(unsigned long)pmd_val((x)))
+ #define pmd_present(x)	(pmd_val((x)) & _PAGE_PRESENT)
+-#define pmd_bad(x) ((pmd_val(x) & (~PAGE_MASK & ~_PAGE_USER)) != _KERNPG_TABLE)
++#define pmd_bad(x) ((pmd_val(x) & (~PTE_MASK & ~_PAGE_USER)) != _KERNPG_TABLE)
+ 
+ #define pages_to_mb(x) ((x) >> (20-PAGE_SHIFT))
+ 
+@@ -159,7 +159,7 @@ static inline int pud_large(pud_t pud) { return 0; }
+ #define pmd_page(pmd) (pfn_to_page(pmd_val((pmd)) >> PAGE_SHIFT))
+ 
+ #define pmd_page_vaddr(pmd)					\
+-	((unsigned long)__va(pmd_val((pmd)) & PAGE_MASK))
++	((unsigned long)__va(pmd_val((pmd)) & PTE_MASK))
+ 
+ #if defined(CONFIG_HIGHPTE)
+ #define pte_offset_map(dir, address)					\
+diff --git a/include/asm-x86/pgtable_64.h b/include/asm-x86/pgtable_64.h
+index efe83dc..1cc50d2 100644
+--- a/include/asm-x86/pgtable_64.h
++++ b/include/asm-x86/pgtable_64.h
+@@ -151,19 +151,19 @@ static inline void native_pgd_clear(pgd_t *pgd)
+ 
+ #ifndef __ASSEMBLY__
+ 
+-static inline unsigned long pgd_bad(pgd_t pgd)
++static inline int pgd_bad(pgd_t pgd)
+ {
+-	return pgd_val(pgd) & ~(PTE_MASK | _KERNPG_TABLE | _PAGE_USER);
++	return (pgd_val(pgd) & ~(PTE_MASK | _PAGE_USER)) != _KERNPG_TABLE;
+ }
+ 
+-static inline unsigned long pud_bad(pud_t pud)
++static inline int pud_bad(pud_t pud)
+ {
+-	return pud_val(pud) & ~(PTE_MASK | _KERNPG_TABLE | _PAGE_USER);
++	return (pud_val(pud) & ~(PTE_MASK | _PAGE_USER)) != _KERNPG_TABLE;
+ }
+ 
+-static inline unsigned long pmd_bad(pmd_t pmd)
++static inline int pmd_bad(pmd_t pmd)
+ {
+-	return pmd_val(pmd) & ~(PTE_MASK | _KERNPG_TABLE | _PAGE_USER);
++	return (pmd_val(pmd) & ~(PTE_MASK | _PAGE_USER)) != _KERNPG_TABLE;
+ }
+ 
+ #define pte_none(x)	(!pte_val((x)))
+diff --git a/include/asm-x86/xen/page.h b/include/asm-x86/xen/page.h
+index 0179930..baf3a4d 100644
+--- a/include/asm-x86/xen/page.h
++++ b/include/asm-x86/xen/page.h
+@@ -127,7 +127,7 @@ static inline void set_phys_to_machine(unsigned long pfn, unsigned long mfn)
+ 
+ static inline unsigned long pte_mfn(pte_t pte)
+ {
+-	return (pte.pte & ~_PAGE_NX) >> PAGE_SHIFT;
++	return (pte.pte & PTE_MASK) >> PAGE_SHIFT;
+ }
+ 
+ static inline pte_t mfn_pte(unsigned long page_nr, pgprot_t pgprot)
+diff --git a/include/linux/Kbuild b/include/linux/Kbuild
+index b7d81b2..93b9885 100644
+--- a/include/linux/Kbuild
++++ b/include/linux/Kbuild
+@@ -92,7 +92,6 @@ header-y += if_slip.h
+ header-y += if_strip.h
+ header-y += if_tun.h
+ header-y += if_tunnel.h
+-header-y += in6.h
+ header-y += in_route.h
+ header-y += ioctl.h
+ header-y += ip6_tunnel.h
+@@ -105,7 +104,6 @@ header-y += ixjuser.h
+ header-y += jffs2.h
+ header-y += keyctl.h
+ header-y += limits.h
+-header-y += dlm_plock.h
+ header-y += magic.h
+ header-y += major.h
+ header-y += matroxfb.h
+@@ -190,6 +188,7 @@ unifdef-y += cyclades.h
+ unifdef-y += dccp.h
+ unifdef-y += dirent.h
+ unifdef-y += dlm.h
++unifdef-y += dlm_plock.h
+ unifdef-y += edd.h
+ unifdef-y += elf.h
+ unifdef-y += elfcore.h
+@@ -236,6 +235,7 @@ unifdef-y += if_vlan.h
+ unifdef-y += igmp.h
+ unifdef-y += inet_diag.h
+ unifdef-y += in.h
++unifdef-y += in6.h
+ unifdef-y += inotify.h
+ unifdef-y += input.h
+ unifdef-y += ip.h
+diff --git a/include/linux/atm.h b/include/linux/atm.h
+index 6013668..c791ddd 100644
+--- a/include/linux/atm.h
++++ b/include/linux/atm.h
+@@ -16,14 +16,11 @@
+  * documentation. Do not change them.
+  */
+ 
+-#ifdef __KERNEL__
+-#include <linux/socket.h>
+-#include <linux/types.h>
+-#endif
+ #include <linux/compiler.h>
+ #include <linux/atmapi.h>
+ #include <linux/atmsap.h>
+ #include <linux/atmioc.h>
++#include <linux/types.h>
+ 
+ 
+ /* general ATM constants */
+@@ -212,7 +209,7 @@ struct sockaddr_atmsvc {
+         char		pub[ATM_E164_LEN+1]; /* public address (E.164) */
+     					/* unused addresses must be bzero'ed */
+ 	char		lij_type;	/* role in LIJ call; one of ATM_LIJ* */
+-	uint32_t	lij_id;		/* LIJ call identifier */
++	__u32	lij_id;		/* LIJ call identifier */
+     } sas_addr __ATM_API_ALIGN;		/* SVC address */
+ };
+ 
+diff --git a/include/linux/atm_tcp.h b/include/linux/atm_tcp.h
+index 18787f9..375638f 100644
+--- a/include/linux/atm_tcp.h
++++ b/include/linux/atm_tcp.h
+@@ -8,11 +8,9 @@
+ #define LINUX_ATM_TCP_H
+ 
+ #include <linux/atmapi.h>
+-
+-#ifdef __KERNEL__
+-#include <linux/types.h>
+-#endif
++#include <linux/atm.h>
+ #include <linux/atmioc.h>
++#include <linux/types.h>
+ 
+ 
+ /*
+@@ -20,9 +18,9 @@
+  */
+ 
+ struct atmtcp_hdr {
+-	uint16_t	vpi;
+-	uint16_t	vci;
+-	uint32_t	length;		/* ... of data part */
++	__u16	vpi;
++	__u16	vci;
++	__u32	length;		/* ... of data part */
+ };
+ 
+ /*
+diff --git a/include/linux/binfmts.h b/include/linux/binfmts.h
+index b512e48..ee0ed48 100644
+--- a/include/linux/binfmts.h
++++ b/include/linux/binfmts.h
+@@ -99,6 +99,7 @@ extern int copy_strings_kernel(int argc,char ** argv,struct linux_binprm *bprm);
+ extern void compute_creds(struct linux_binprm *binprm);
+ extern int do_coredump(long signr, int exit_code, struct pt_regs * regs);
+ extern int set_binfmt(struct linux_binfmt *new);
++extern void free_bprm(struct linux_binprm *);
+ 
+ #endif /* __KERNEL__ */
+ #endif /* _LINUX_BINFMTS_H */
+diff --git a/include/linux/device.h b/include/linux/device.h
+index 15e9fa3..14616e8 100644
+--- a/include/linux/device.h
++++ b/include/linux/device.h
+@@ -449,9 +449,21 @@ extern int __must_check device_reprobe(struct device *dev);
+ /*
+  * Easy functions for dynamically creating devices on the fly
+  */
++extern struct device *device_create_vargs(struct class *cls,
++					  struct device *parent,
++					  dev_t devt,
++					  void *drvdata,
++					  const char *fmt,
++					  va_list vargs);
+ extern struct device *device_create(struct class *cls, struct device *parent,
+ 				    dev_t devt, const char *fmt, ...)
+ 				    __attribute__((format(printf, 4, 5)));
++extern struct device *device_create_drvdata(struct class *cls,
++					    struct device *parent,
++					    dev_t devt,
++					    void *drvdata,
++					    const char *fmt, ...)
++				    __attribute__((format(printf, 5, 6)));
+ extern void device_destroy(struct class *cls, dev_t devt);
+ 
+ /*
+diff --git a/include/linux/fdtable.h b/include/linux/fdtable.h
+index a118f3c..4aab6f1 100644
+--- a/include/linux/fdtable.h
++++ b/include/linux/fdtable.h
+@@ -93,6 +93,7 @@ struct files_struct *get_files_struct(struct task_struct *);
+ void put_files_struct(struct files_struct *fs);
+ void reset_files_struct(struct files_struct *);
+ int unshare_files(struct files_struct **);
++struct files_struct *dup_fd(struct files_struct *, int *);
+ 
+ extern struct kmem_cache *files_cachep;
+ 
+diff --git a/include/linux/hid.h b/include/linux/hid.h
+index 4ce3b7a..fe56b86 100644
+--- a/include/linux/hid.h
++++ b/include/linux/hid.h
+@@ -2,8 +2,6 @@
+ #define __HID_H
+ 
+ /*
+- * $Id: hid.h,v 1.24 2001/12/27 10:37:41 vojtech Exp $
+- *
+  *  Copyright (c) 1999 Andreas Gal
+  *  Copyright (c) 2000-2001 Vojtech Pavlik
+  *  Copyright (c) 2006-2007 Jiri Kosina
+@@ -285,6 +283,7 @@ struct hid_item {
+ #define HID_QUIRK_HWHEEL_WHEEL_INVERT		0x04000000
+ #define HID_QUIRK_MICROSOFT_KEYS		0x08000000
+ #define HID_QUIRK_FULLSPEED_INTERVAL		0x10000000
++#define HID_QUIRK_APPLE_NUMLOCK_EMULATION	0x20000000
+ 
+ /*
+  * Separate quirks for runtime report descriptor fixup
+diff --git a/include/linux/hiddev.h b/include/linux/hiddev.h
+index acbdae6..a416b90 100644
+--- a/include/linux/hiddev.h
++++ b/include/linux/hiddev.h
+@@ -2,8 +2,6 @@
+ #define _HIDDEV_H
+ 
+ /*
+- * $Id: hiddev.h,v 1.2 2001/04/26 11:26:09 vojtech Exp $
+- *
+  *  Copyright (c) 1999-2000 Vojtech Pavlik
+  *
+  *  Sponsored by SuSE
+diff --git a/include/linux/init_task.h b/include/linux/init_task.h
+index b24c287..9927a88 100644
+--- a/include/linux/init_task.h
++++ b/include/linux/init_task.h
+@@ -1,7 +1,6 @@
+ #ifndef _LINUX__INIT_TASK_H
+ #define _LINUX__INIT_TASK_H
+ 
+-#include <linux/fdtable.h>
+ #include <linux/rcupdate.h>
+ #include <linux/irqflags.h>
+ #include <linux/utsname.h>
+@@ -12,27 +11,7 @@
+ #include <linux/securebits.h>
+ #include <net/net_namespace.h>
+ 
+-#define INIT_FDTABLE \
+-{							\
+-	.max_fds	= NR_OPEN_DEFAULT, 		\
+-	.fd		= &init_files.fd_array[0], 	\
+-	.close_on_exec	= (fd_set *)&init_files.close_on_exec_init, \
+-	.open_fds	= (fd_set *)&init_files.open_fds_init, 	\
+-	.rcu		= RCU_HEAD_INIT, 		\
+-	.next		= NULL,		 		\
+-}
+-
+-#define INIT_FILES \
+-{ 							\
+-	.count		= ATOMIC_INIT(1), 		\
+-	.fdt		= &init_files.fdtab, 		\
+-	.fdtab		= INIT_FDTABLE,			\
+-	.file_lock	= __SPIN_LOCK_UNLOCKED(init_task.file_lock), \
+-	.next_fd	= 0, 				\
+-	.close_on_exec_init = { { 0, } }, 		\
+-	.open_fds_init	= { { 0, } }, 			\
+-	.fd_array	= { NULL, } 			\
+-}
++extern struct files_struct init_files;
+ 
+ #define INIT_KIOCTX(name, which_mm) \
+ {							\
+diff --git a/include/linux/libata.h b/include/linux/libata.h
+index 0f17643..4a92fba 100644
+--- a/include/linux/libata.h
++++ b/include/linux/libata.h
+@@ -341,7 +341,7 @@ enum {
+ 	ATA_EH_PMP_TRIES	= 5,
+ 	ATA_EH_PMP_LINK_TRIES	= 3,
+ 
+-	SATA_PMP_SCR_TIMEOUT	= 250,
++	SATA_PMP_RW_TIMEOUT	= 3000,		/* PMP read/write timeout */
+ 
+ 	/* Horkage types. May be set by libata or controller on drives
+ 	   (some horkage may be drive/controller pair dependant */
+@@ -351,7 +351,7 @@ enum {
+ 	ATA_HORKAGE_NONCQ	= (1 << 2),	/* Don't use NCQ */
+ 	ATA_HORKAGE_MAX_SEC_128	= (1 << 3),	/* Limit max sects to 128 */
+ 	ATA_HORKAGE_BROKEN_HPA	= (1 << 4),	/* Broken HPA */
+-	ATA_HORKAGE_SKIP_PM	= (1 << 5),	/* Skip PM operations */
++	ATA_HORKAGE_DISABLE	= (1 << 5),	/* Disable it */
+ 	ATA_HORKAGE_HPA_SIZE	= (1 << 6),	/* native size off by one */
+ 	ATA_HORKAGE_IPM		= (1 << 7),	/* Link PM problems */
+ 	ATA_HORKAGE_IVB		= (1 << 8),	/* cbl det validity bit bugs */
+@@ -821,8 +821,6 @@ struct ata_timing {
+ 	unsigned short udma;		/* t2CYCTYP/2 */
+ };
+ 
+-#define FIT(v, vmin, vmax)	max_t(short, min_t(short, v, vmax), vmin)
+-
+ /*
+  * Core layer - drivers/ata/libata-core.c
+  */
+diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
+index b11e6e1..2b02664 100644
+--- a/include/linux/netdevice.h
++++ b/include/linux/netdevice.h
+@@ -514,10 +514,12 @@ struct net_device
+ #define NETIF_F_NETNS_LOCAL	8192	/* Does not change network namespaces */
+ #define NETIF_F_MULTI_QUEUE	16384	/* Has multiple TX/RX queues */
+ #define NETIF_F_LRO		32768	/* large receive offload */
++#define NETIF_F_VLAN_TSO	65536	/* Supports TSO for VLANs */
++#define NETIF_F_VLAN_CSUM	131072	/* Supports TX checksumming for VLANs */
+ 
+ 	/* Segmentation offload features */
+-#define NETIF_F_GSO_SHIFT	16
+-#define NETIF_F_GSO_MASK	0xffff0000
++#define NETIF_F_GSO_SHIFT	20
++#define NETIF_F_GSO_MASK	0xfff00000
+ #define NETIF_F_TSO		(SKB_GSO_TCPV4 << NETIF_F_GSO_SHIFT)
+ #define NETIF_F_UFO		(SKB_GSO_UDP << NETIF_F_GSO_SHIFT)
+ #define NETIF_F_GSO_ROBUST	(SKB_GSO_DODGY << NETIF_F_GSO_SHIFT)
+diff --git a/include/linux/sunrpc/svc_rdma.h b/include/linux/sunrpc/svc_rdma.h
+index c11bbcc..05eb466 100644
+--- a/include/linux/sunrpc/svc_rdma.h
++++ b/include/linux/sunrpc/svc_rdma.h
+@@ -71,7 +71,8 @@ extern atomic_t rdma_stat_sq_prod;
+  * completes.
+  */
+ struct svc_rdma_op_ctxt {
+-	struct svc_rdma_op_ctxt *next;
++	struct svc_rdma_op_ctxt *read_hdr;
++	struct list_head free_list;
+ 	struct xdr_buf arg;
+ 	struct list_head dto_q;
+ 	enum ib_wr_opcode wr_op;
+@@ -85,7 +86,6 @@ struct svc_rdma_op_ctxt {
+ 	struct page *pages[RPCSVC_MAXPAGES];
+ };
+ 
+-#define RDMACTXT_F_READ_DONE	1
+ #define RDMACTXT_F_LAST_CTXT	2
+ 
+ struct svcxprt_rdma {
+@@ -104,7 +104,8 @@ struct svcxprt_rdma {
+ 
+ 	struct ib_pd         *sc_pd;
+ 
+-	struct svc_rdma_op_ctxt  *sc_ctxt_head;
++	atomic_t	     sc_ctxt_used;
++	struct list_head     sc_ctxt_free;
+ 	int		     sc_ctxt_cnt;
+ 	int		     sc_ctxt_bump;
+ 	int		     sc_ctxt_max;
+@@ -123,6 +124,7 @@ struct svcxprt_rdma {
+ 	struct list_head     sc_dto_q;		/* DTO tasklet I/O pending Q */
+ 	struct list_head     sc_read_complete_q;
+ 	spinlock_t           sc_read_complete_lock;
++	struct work_struct   sc_work;
+ };
+ /* sc_flags */
+ #define RDMAXPRT_RQ_PENDING	1
+@@ -164,8 +166,8 @@ extern int svc_rdma_sendto(struct svc_rqst *);
+ 
+ /* svc_rdma_transport.c */
+ extern int svc_rdma_send(struct svcxprt_rdma *, struct ib_send_wr *);
+-extern int svc_rdma_send_error(struct svcxprt_rdma *, struct rpcrdma_msg *,
+-			       enum rpcrdma_errcode);
++extern void svc_rdma_send_error(struct svcxprt_rdma *, struct rpcrdma_msg *,
++				enum rpcrdma_errcode);
+ struct page *svc_rdma_get_page(void);
+ extern int svc_rdma_post_recv(struct svcxprt_rdma *);
+ extern int svc_rdma_create_listen(struct svc_serv *, int, struct sockaddr *);
+diff --git a/include/linux/usb/cdc.h b/include/linux/usb/cdc.h
+index 71e52f2..ca228bb 100644
+--- a/include/linux/usb/cdc.h
++++ b/include/linux/usb/cdc.h
+@@ -130,6 +130,15 @@ struct usb_cdc_ether_desc {
+ 	__u8	bNumberPowerFilters;
+ } __attribute__ ((packed));
+ 
++/* "Telephone Control Model Functional Descriptor" from CDC WMC spec 6.3..3 */
++struct usb_cdc_dmm_desc {
++	__u8	bFunctionLength;
++	__u8	bDescriptorType;
++	__u8	bDescriptorSubtype;
++	__u16	bcdVersion;
++	__le16	wMaxCommand;
++} __attribute__ ((packed));
++
+ /* "MDLM Functional Descriptor" from CDC WMC spec 6.7.2.3 */
+ struct usb_cdc_mdlm_desc {
+ 	__u8	bLength;
+diff --git a/include/media/videobuf-core.h b/include/media/videobuf-core.h
+index 5b39a22..874f134 100644
+--- a/include/media/videobuf-core.h
++++ b/include/media/videobuf-core.h
+@@ -237,6 +237,9 @@ unsigned int videobuf_poll_stream(struct file *file,
+ int videobuf_mmap_setup(struct videobuf_queue *q,
+ 			unsigned int bcount, unsigned int bsize,
+ 			enum v4l2_memory memory);
++int __videobuf_mmap_setup(struct videobuf_queue *q,
++			unsigned int bcount, unsigned int bsize,
++			enum v4l2_memory memory);
+ int videobuf_mmap_free(struct videobuf_queue *q);
+ int videobuf_mmap_mapper(struct videobuf_queue *q,
+ 			 struct vm_area_struct *vma);
+diff --git a/include/net/mac80211.h b/include/net/mac80211.h
+index 4a80d74..dae3f9e 100644
+--- a/include/net/mac80211.h
++++ b/include/net/mac80211.h
+@@ -1594,13 +1594,16 @@ void ieee80211_wake_queues(struct ieee80211_hw *hw);
+ void ieee80211_scan_completed(struct ieee80211_hw *hw);
+ 
+ /**
+- * ieee80211_iterate_active_interfaces - iterate active interfaces
++ * ieee80211_iterate_active_interfaces- iterate active interfaces
+  *
+  * This function iterates over the interfaces associated with a given
+  * hardware that are currently active and calls the callback for them.
++ * This function allows the iterator function to sleep, when the iterator
++ * function is atomic @ieee80211_iterate_active_interfaces_atomic can
++ * be used.
+  *
+  * @hw: the hardware struct of which the interfaces should be iterated over
+- * @iterator: the iterator function to call, cannot sleep
++ * @iterator: the iterator function to call
+  * @data: first argument of the iterator function
+  */
+ void ieee80211_iterate_active_interfaces(struct ieee80211_hw *hw,
+@@ -1609,6 +1612,24 @@ void ieee80211_iterate_active_interfaces(struct ieee80211_hw *hw,
+ 					 void *data);
+ 
+ /**
++ * ieee80211_iterate_active_interfaces_atomic - iterate active interfaces
++ *
++ * This function iterates over the interfaces associated with a given
++ * hardware that are currently active and calls the callback for them.
++ * This function requires the iterator callback function to be atomic,
++ * if that is not desired, use @ieee80211_iterate_active_interfaces instead.
++ *
++ * @hw: the hardware struct of which the interfaces should be iterated over
++ * @iterator: the iterator function to call, cannot sleep
++ * @data: first argument of the iterator function
++ */
++void ieee80211_iterate_active_interfaces_atomic(struct ieee80211_hw *hw,
++						void (*iterator)(void *data,
++						    u8 *mac,
++						    struct ieee80211_vif *vif),
++						void *data);
++
++/**
+  * ieee80211_start_tx_ba_session - Start a tx Block Ack session.
+  * @hw: pointer as obtained from ieee80211_alloc_hw().
+  * @ra: receiver address of the BA session recipient
+diff --git a/include/net/ndisc.h b/include/net/ndisc.h
+index 9c451ff..a01b7c4 100644
+--- a/include/net/ndisc.h
++++ b/include/net/ndisc.h
+@@ -129,6 +129,10 @@ extern int 			ndisc_ifinfo_sysctl_change(struct ctl_table *ctl,
+ 							   void __user *buffer,
+ 							   size_t *lenp,
+ 							   loff_t *ppos);
++int ndisc_ifinfo_sysctl_strategy(ctl_table *ctl, int __user *name,
++				 int nlen, void __user *oldval,
++				 size_t __user *oldlenp,
++				 void __user *newval, size_t newlen);
+ #endif
+ 
+ extern void 			inet6_ifinfo_notify(int event,
+diff --git a/kernel/audit.c b/kernel/audit.c
+index b7d3709..e8692a5 100644
+--- a/kernel/audit.c
++++ b/kernel/audit.c
+@@ -572,16 +572,17 @@ void audit_send_reply(int pid, int seq, int type, int done, int multi,
+ 
+ 	skb = audit_make_reply(pid, seq, type, done, multi, payload, size);
+ 	if (!skb)
+-		return;
++		goto out;
+ 
+ 	reply->pid = pid;
+ 	reply->skb = skb;
+ 
+ 	tsk = kthread_run(audit_send_reply_thread, reply, "audit_send_reply");
+-	if (IS_ERR(tsk)) {
+-		kfree(reply);
+-		kfree_skb(skb);
+-	}
++	if (!IS_ERR(tsk))
++		return;
++	kfree_skb(skb);
++out:
++	kfree(reply);
+ }
+ 
+ /*
+diff --git a/kernel/audit_tree.c b/kernel/audit_tree.c
+index 9ef5e0a..f7921a2 100644
+--- a/kernel/audit_tree.c
++++ b/kernel/audit_tree.c
+@@ -172,10 +172,9 @@ static void insert_hash(struct audit_chunk *chunk)
+ struct audit_chunk *audit_tree_lookup(const struct inode *inode)
+ {
+ 	struct list_head *list = chunk_hash(inode);
+-	struct list_head *pos;
++	struct audit_chunk *p;
+ 
+-	list_for_each_rcu(pos, list) {
+-		struct audit_chunk *p = container_of(pos, struct audit_chunk, hash);
++	list_for_each_entry_rcu(p, list, hash) {
+ 		if (p->watch.inode == inode) {
+ 			get_inotify_watch(&p->watch);
+ 			return p;
+diff --git a/kernel/fork.c b/kernel/fork.c
+index 933e60e..19908b2 100644
+--- a/kernel/fork.c
++++ b/kernel/fork.c
+@@ -660,136 +660,6 @@ static int copy_fs(unsigned long clone_flags, struct task_struct *tsk)
+ 	return 0;
+ }
+ 
+-static int count_open_files(struct fdtable *fdt)
+-{
+-	int size = fdt->max_fds;
+-	int i;
+-
+-	/* Find the last open fd */
+-	for (i = size/(8*sizeof(long)); i > 0; ) {
+-		if (fdt->open_fds->fds_bits[--i])
+-			break;
+-	}
+-	i = (i+1) * 8 * sizeof(long);
+-	return i;
+-}
+-
+-static struct files_struct *alloc_files(void)
+-{
+-	struct files_struct *newf;
+-	struct fdtable *fdt;
+-
+-	newf = kmem_cache_alloc(files_cachep, GFP_KERNEL);
+-	if (!newf)
+-		goto out;
+-
+-	atomic_set(&newf->count, 1);
+-
+-	spin_lock_init(&newf->file_lock);
+-	newf->next_fd = 0;
+-	fdt = &newf->fdtab;
+-	fdt->max_fds = NR_OPEN_DEFAULT;
+-	fdt->close_on_exec = (fd_set *)&newf->close_on_exec_init;
+-	fdt->open_fds = (fd_set *)&newf->open_fds_init;
+-	fdt->fd = &newf->fd_array[0];
+-	INIT_RCU_HEAD(&fdt->rcu);
+-	fdt->next = NULL;
+-	rcu_assign_pointer(newf->fdt, fdt);
+-out:
+-	return newf;
+-}
+-
+-/*
+- * Allocate a new files structure and copy contents from the
+- * passed in files structure.
+- * errorp will be valid only when the returned files_struct is NULL.
+- */
+-static struct files_struct *dup_fd(struct files_struct *oldf, int *errorp)
+-{
+-	struct files_struct *newf;
+-	struct file **old_fds, **new_fds;
+-	int open_files, size, i;
+-	struct fdtable *old_fdt, *new_fdt;
+-
+-	*errorp = -ENOMEM;
+-	newf = alloc_files();
+-	if (!newf)
+-		goto out;
+-
+-	spin_lock(&oldf->file_lock);
+-	old_fdt = files_fdtable(oldf);
+-	new_fdt = files_fdtable(newf);
+-	open_files = count_open_files(old_fdt);
+-
+-	/*
+-	 * Check whether we need to allocate a larger fd array and fd set.
+-	 * Note: we're not a clone task, so the open count won't change.
+-	 */
+-	if (open_files > new_fdt->max_fds) {
+-		new_fdt->max_fds = 0;
+-		spin_unlock(&oldf->file_lock);
+-		spin_lock(&newf->file_lock);
+-		*errorp = expand_files(newf, open_files-1);
+-		spin_unlock(&newf->file_lock);
+-		if (*errorp < 0)
+-			goto out_release;
+-		new_fdt = files_fdtable(newf);
+-		/*
+-		 * Reacquire the oldf lock and a pointer to its fd table
+-		 * who knows it may have a new bigger fd table. We need
+-		 * the latest pointer.
+-		 */
+-		spin_lock(&oldf->file_lock);
+-		old_fdt = files_fdtable(oldf);
+-	}
+-
+-	old_fds = old_fdt->fd;
+-	new_fds = new_fdt->fd;
+-
+-	memcpy(new_fdt->open_fds->fds_bits,
+-		old_fdt->open_fds->fds_bits, open_files/8);
+-	memcpy(new_fdt->close_on_exec->fds_bits,
+-		old_fdt->close_on_exec->fds_bits, open_files/8);
+-
+-	for (i = open_files; i != 0; i--) {
+-		struct file *f = *old_fds++;
+-		if (f) {
+-			get_file(f);
+-		} else {
+-			/*
+-			 * The fd may be claimed in the fd bitmap but not yet
+-			 * instantiated in the files array if a sibling thread
+-			 * is partway through open().  So make sure that this
+-			 * fd is available to the new process.
+-			 */
+-			FD_CLR(open_files - i, new_fdt->open_fds);
+-		}
+-		rcu_assign_pointer(*new_fds++, f);
+-	}
+-	spin_unlock(&oldf->file_lock);
+-
+-	/* compute the remainder to be cleared */
+-	size = (new_fdt->max_fds - open_files) * sizeof(struct file *);
+-
+-	/* This is long word aligned thus could use a optimized version */
+-	memset(new_fds, 0, size);
+-
+-	if (new_fdt->max_fds > open_files) {
+-		int left = (new_fdt->max_fds-open_files)/8;
+-		int start = open_files / (8 * sizeof(unsigned long));
+-
+-		memset(&new_fdt->open_fds->fds_bits[start], 0, left);
+-		memset(&new_fdt->close_on_exec->fds_bits[start], 0, left);
+-	}
+-
+-	return newf;
+-
+-out_release:
+-	kmem_cache_free(files_cachep, newf);
+-out:
+-	return NULL;
+-}
+-
+ static int copy_files(unsigned long clone_flags, struct task_struct * tsk)
+ {
+ 	struct files_struct *oldf, *newf;
+diff --git a/kernel/sysctl.c b/kernel/sysctl.c
+index d7ffdc5..2911665 100644
+--- a/kernel/sysctl.c
++++ b/kernel/sysctl.c
+@@ -81,6 +81,7 @@ extern int compat_log;
+ extern int maps_protect;
+ extern int sysctl_stat_interval;
+ extern int latencytop_enabled;
++extern int sysctl_nr_open_min, sysctl_nr_open_max;
+ 
+ /* Constants used for minimum and  maximum */
+ #if defined(CONFIG_DETECT_SOFTLOCKUP) || defined(CONFIG_HIGHMEM)
+@@ -1190,7 +1191,9 @@ static struct ctl_table fs_table[] = {
+ 		.data		= &sysctl_nr_open,
+ 		.maxlen		= sizeof(int),
+ 		.mode		= 0644,
+-		.proc_handler	= &proc_dointvec,
++		.proc_handler	= &proc_dointvec_minmax,
++		.extra1		= &sysctl_nr_open_min,
++		.extra2		= &sysctl_nr_open_max,
+ 	},
+ 	{
+ 		.ctl_name	= FS_DENTRY,
+diff --git a/lib/lmb.c b/lib/lmb.c
+index 867f7b5..5d7b928 100644
+--- a/lib/lmb.c
++++ b/lib/lmb.c
+@@ -48,7 +48,8 @@ void lmb_dump_all(void)
+ 	}
+ 
+ 	pr_info("    reserved.cnt	  = 0x%lx\n", lmb.reserved.cnt);
+-	pr_info("    reserved.size	  = 0x%lx\n", lmb.reserved.size);
++	pr_info("    reserved.size	  = 0x%llx\n",
++	    (unsigned long long)lmb.memory.size);
+ 	for (i=0; i < lmb.reserved.cnt ;i++) {
+ 		pr_info("    reserved.region[0x%lx].base       = 0x%llx\n",
+ 		    i, (unsigned long long)lmb.reserved.region[i].base);
+diff --git a/mm/backing-dev.c b/mm/backing-dev.c
+index 7c4f9e0..f2e574d 100644
+--- a/mm/backing-dev.c
++++ b/mm/backing-dev.c
+@@ -172,30 +172,22 @@ postcore_initcall(bdi_class_init);
+ int bdi_register(struct backing_dev_info *bdi, struct device *parent,
+ 		const char *fmt, ...)
+ {
+-	char *name;
+ 	va_list args;
+ 	int ret = 0;
+ 	struct device *dev;
+ 
+ 	va_start(args, fmt);
+-	name = kvasprintf(GFP_KERNEL, fmt, args);
++	dev = device_create_vargs(bdi_class, parent, MKDEV(0, 0), bdi, fmt, args);
+ 	va_end(args);
+-
+-	if (!name)
+-		return -ENOMEM;
+-
+-	dev = device_create(bdi_class, parent, MKDEV(0, 0), name);
+ 	if (IS_ERR(dev)) {
+ 		ret = PTR_ERR(dev);
+ 		goto exit;
+ 	}
+ 
+ 	bdi->dev = dev;
+-	dev_set_drvdata(bdi->dev, bdi);
+-	bdi_debug_register(bdi, name);
++	bdi_debug_register(bdi, dev_name(dev));
+ 
+ exit:
+-	kfree(name);
+ 	return ret;
+ }
+ EXPORT_SYMBOL(bdi_register);
+diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c
+index 2a739ad..5196130 100644
+--- a/net/8021q/vlan.c
++++ b/net/8021q/vlan.c
+@@ -382,6 +382,24 @@ static void vlan_sync_address(struct net_device *dev,
+ 	memcpy(vlan->real_dev_addr, dev->dev_addr, ETH_ALEN);
+ }
+ 
++static void vlan_transfer_features(struct net_device *dev,
++				   struct net_device *vlandev)
++{
++	unsigned long old_features = vlandev->features;
++
++	if (dev->features & NETIF_F_VLAN_TSO) {
++		vlandev->features &= ~VLAN_TSO_FEATURES;
++		vlandev->features |= dev->features & VLAN_TSO_FEATURES;
++	}
++	if (dev->features & NETIF_F_VLAN_CSUM) {
++		vlandev->features &= ~NETIF_F_ALL_CSUM;
++		vlandev->features |= dev->features & NETIF_F_ALL_CSUM;
++	}
++
++	if (old_features != vlandev->features)
++		netdev_features_change(vlandev);
++}
++
+ static void __vlan_device_event(struct net_device *dev, unsigned long event)
+ {
+ 	switch (event) {
+@@ -410,10 +428,8 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event,
+ 	int i, flgs;
+ 	struct net_device *vlandev;
+ 
+-	if (is_vlan_dev(dev)) {
++	if (is_vlan_dev(dev))
+ 		__vlan_device_event(dev, event);
+-		goto out;
+-	}
+ 
+ 	grp = __vlan_find_group(dev);
+ 	if (!grp)
+@@ -450,6 +466,18 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event,
+ 		}
+ 		break;
+ 
++	case NETDEV_FEAT_CHANGE:
++		/* Propagate device features to underlying device */
++		for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) {
++			vlandev = vlan_group_get_device(grp, i);
++			if (!vlandev)
++				continue;
++
++			vlan_transfer_features(dev, vlandev);
++		}
++
++		break;
++
+ 	case NETDEV_DOWN:
+ 		/* Put all VLANs for this dev in the down state too.  */
+ 		for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) {
+diff --git a/net/8021q/vlan.h b/net/8021q/vlan.h
+index 5229a72..7962569 100644
+--- a/net/8021q/vlan.h
++++ b/net/8021q/vlan.h
+@@ -7,6 +7,8 @@
+ #define VLAN_GRP_HASH_SIZE	(1 << VLAN_GRP_HASH_SHIFT)
+ #define VLAN_GRP_HASH_MASK	(VLAN_GRP_HASH_SIZE - 1)
+ 
++#define VLAN_TSO_FEATURES	(NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_SG)
++
+ /*  Find a VLAN device by the MAC address of its Ethernet device, and
+  *  it's VLAN ID.  The default configuration is to have VLAN's scope
+  *  to be box-wide, so the MAC will be ignored.  The mac will only be
+diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c
+index c961f08..b1cfbaa 100644
+--- a/net/8021q/vlan_dev.c
++++ b/net/8021q/vlan_dev.c
+@@ -663,6 +663,11 @@ static int vlan_dev_init(struct net_device *dev)
+ 					  (1<<__LINK_STATE_DORMANT))) |
+ 		      (1<<__LINK_STATE_PRESENT);
+ 
++	if (real_dev->features & NETIF_F_VLAN_TSO)
++		dev->features |= real_dev->features & VLAN_TSO_FEATURES;
++	if (real_dev->features & NETIF_F_VLAN_CSUM)
++		dev->features |= real_dev->features & NETIF_F_ALL_CSUM;
++
+ 	/* ipv6 shared card related stuff */
+ 	dev->dev_id = real_dev->dev_id;
+ 
+diff --git a/net/core/dev.c b/net/core/dev.c
+index a1607bc..5829630 100644
+--- a/net/core/dev.c
++++ b/net/core/dev.c
+@@ -903,7 +903,11 @@ int dev_change_name(struct net_device *dev, char *newname)
+ 		strlcpy(dev->name, newname, IFNAMSIZ);
+ 
+ rollback:
+-	device_rename(&dev->dev, dev->name);
++	err = device_rename(&dev->dev, dev->name);
++	if (err) {
++		memcpy(dev->name, oldname, IFNAMSIZ);
++		return err;
++	}
+ 
+ 	write_lock_bh(&dev_base_lock);
+ 	hlist_del(&dev->name_hlist);
+@@ -3137,7 +3141,7 @@ int dev_change_flags(struct net_device *dev, unsigned flags)
+ 	 *	Load in the correct multicast list now the flags have changed.
+ 	 */
+ 
+-	if (dev->change_rx_flags && (dev->flags ^ flags) & IFF_MULTICAST)
++	if (dev->change_rx_flags && (old_flags ^ flags) & IFF_MULTICAST)
+ 		dev->change_rx_flags(dev, IFF_MULTICAST);
+ 
+ 	dev_set_rx_mode(dev);
+diff --git a/net/core/pktgen.c b/net/core/pktgen.c
+index 8dca211..fdf5377 100644
+--- a/net/core/pktgen.c
++++ b/net/core/pktgen.c
+@@ -390,6 +390,7 @@ struct pktgen_thread {
+ 	int cpu;
+ 
+ 	wait_queue_head_t queue;
++	struct completion start_done;
+ };
+ 
+ #define REMOVE 1
+@@ -3414,6 +3415,7 @@ static int pktgen_thread_worker(void *arg)
+ 	BUG_ON(smp_processor_id() != cpu);
+ 
+ 	init_waitqueue_head(&t->queue);
++	complete(&t->start_done);
+ 
+ 	pr_debug("pktgen: starting pktgen/%d:  pid=%d\n", cpu, task_pid_nr(current));
+ 
+@@ -3615,6 +3617,7 @@ static int __init pktgen_create_thread(int cpu)
+ 	INIT_LIST_HEAD(&t->if_list);
+ 
+ 	list_add_tail(&t->th_list, &pktgen_threads);
++	init_completion(&t->start_done);
+ 
+ 	p = kthread_create(pktgen_thread_worker, t, "kpktgend_%d", cpu);
+ 	if (IS_ERR(p)) {
+@@ -3639,6 +3642,7 @@ static int __init pktgen_create_thread(int cpu)
+ 	}
+ 
+ 	wake_up_process(p);
++	wait_for_completion(&t->start_done);
+ 
+ 	return 0;
+ }
+diff --git a/net/ipv4/route.c b/net/ipv4/route.c
+index 92f90ae..df41026 100644
+--- a/net/ipv4/route.c
++++ b/net/ipv4/route.c
+@@ -160,7 +160,7 @@ static struct dst_ops ipv4_dst_ops = {
+ 	.negative_advice =	ipv4_negative_advice,
+ 	.link_failure =		ipv4_link_failure,
+ 	.update_pmtu =		ip_rt_update_pmtu,
+-	.local_out =		ip_local_out,
++	.local_out =		__ip_local_out,
+ 	.entry_size =		sizeof(struct rtable),
+ 	.entries =		ATOMIC_INIT(0),
+ };
+diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
+index e591e09..3a83557 100644
+--- a/net/ipv6/addrconf.c
++++ b/net/ipv6/addrconf.c
+@@ -1764,14 +1764,16 @@ void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len)
+ 	 *	2) Configure prefixes with the auto flag set
+ 	 */
+ 
+-	/* Avoid arithmetic overflow. Really, we could
+-	   save rt_expires in seconds, likely valid_lft,
+-	   but it would require division in fib gc, that it
+-	   not good.
+-	 */
+-	if (valid_lft >= 0x7FFFFFFF/HZ)
++	if (valid_lft == INFINITY_LIFE_TIME)
++		rt_expires = ~0UL;
++	else if (valid_lft >= 0x7FFFFFFF/HZ) {
++		/* Avoid arithmetic overflow. Really, we could
++		 * save rt_expires in seconds, likely valid_lft,
++		 * but it would require division in fib gc, that it
++		 * not good.
++		 */
+ 		rt_expires = 0x7FFFFFFF - (0x7FFFFFFF % HZ);
+-	else
++	} else
+ 		rt_expires = valid_lft * HZ;
+ 
+ 	/*
+@@ -1779,7 +1781,7 @@ void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len)
+ 	 * Avoid arithmetic overflow there as well.
+ 	 * Overflow can happen only if HZ < USER_HZ.
+ 	 */
+-	if (HZ < USER_HZ && rt_expires > 0x7FFFFFFF / USER_HZ)
++	if (HZ < USER_HZ && ~rt_expires && rt_expires > 0x7FFFFFFF / USER_HZ)
+ 		rt_expires = 0x7FFFFFFF / USER_HZ;
+ 
+ 	if (pinfo->onlink) {
+@@ -1788,17 +1790,28 @@ void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len)
+ 				dev->ifindex, 1);
+ 
+ 		if (rt && ((rt->rt6i_flags & (RTF_GATEWAY | RTF_DEFAULT)) == 0)) {
+-			if (rt->rt6i_flags&RTF_EXPIRES) {
+-				if (valid_lft == 0) {
+-					ip6_del_rt(rt);
+-					rt = NULL;
+-				} else {
+-					rt->rt6i_expires = jiffies + rt_expires;
+-				}
++			/* Autoconf prefix route */
++			if (valid_lft == 0) {
++				ip6_del_rt(rt);
++				rt = NULL;
++			} else if (~rt_expires) {
++				/* not infinity */
++				rt->rt6i_expires = jiffies + rt_expires;
++				rt->rt6i_flags |= RTF_EXPIRES;
++			} else {
++				rt->rt6i_flags &= ~RTF_EXPIRES;
++				rt->rt6i_expires = 0;
+ 			}
+ 		} else if (valid_lft) {
++			int flags = RTF_ADDRCONF | RTF_PREFIX_RT;
++			clock_t expires = 0;
++			if (~rt_expires) {
++				/* not infinity */
++				flags |= RTF_EXPIRES;
++				expires = jiffies_to_clock_t(rt_expires);
++			}
+ 			addrconf_prefix_route(&pinfo->prefix, pinfo->prefix_len,
+-					      dev, jiffies_to_clock_t(rt_expires), RTF_ADDRCONF|RTF_EXPIRES|RTF_PREFIX_RT);
++					      dev, expires, flags);
+ 		}
+ 		if (rt)
+ 			dst_release(&rt->u.dst);
+@@ -2021,7 +2034,8 @@ static int inet6_addr_add(struct net *net, int ifindex, struct in6_addr *pfx,
+ 	struct inet6_dev *idev;
+ 	struct net_device *dev;
+ 	int scope;
+-	u32 flags = RTF_EXPIRES;
++	u32 flags;
++	clock_t expires;
+ 
+ 	ASSERT_RTNL();
+ 
+@@ -2041,8 +2055,13 @@ static int inet6_addr_add(struct net *net, int ifindex, struct in6_addr *pfx,
+ 	if (valid_lft == INFINITY_LIFE_TIME) {
+ 		ifa_flags |= IFA_F_PERMANENT;
+ 		flags = 0;
+-	} else if (valid_lft >= 0x7FFFFFFF/HZ)
+-		valid_lft = 0x7FFFFFFF/HZ;
++		expires = 0;
++	} else {
++		if (valid_lft >= 0x7FFFFFFF/HZ)
++			valid_lft = 0x7FFFFFFF/HZ;
++		flags = RTF_EXPIRES;
++		expires = jiffies_to_clock_t(valid_lft * HZ);
++	}
+ 
+ 	if (prefered_lft == 0)
+ 		ifa_flags |= IFA_F_DEPRECATED;
+@@ -2060,7 +2079,7 @@ static int inet6_addr_add(struct net *net, int ifindex, struct in6_addr *pfx,
+ 		spin_unlock_bh(&ifp->lock);
+ 
+ 		addrconf_prefix_route(&ifp->addr, ifp->prefix_len, dev,
+-				      jiffies_to_clock_t(valid_lft * HZ), flags);
++				      expires, flags);
+ 		/*
+ 		 * Note that section 3.1 of RFC 4429 indicates
+ 		 * that the Optimistic flag should not be set for
+@@ -3148,7 +3167,8 @@ inet6_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
+ static int inet6_addr_modify(struct inet6_ifaddr *ifp, u8 ifa_flags,
+ 			     u32 prefered_lft, u32 valid_lft)
+ {
+-	u32 flags = RTF_EXPIRES;
++	u32 flags;
++	clock_t expires;
+ 
+ 	if (!valid_lft || (prefered_lft > valid_lft))
+ 		return -EINVAL;
+@@ -3156,8 +3176,13 @@ static int inet6_addr_modify(struct inet6_ifaddr *ifp, u8 ifa_flags,
+ 	if (valid_lft == INFINITY_LIFE_TIME) {
+ 		ifa_flags |= IFA_F_PERMANENT;
+ 		flags = 0;
+-	} else if (valid_lft >= 0x7FFFFFFF/HZ)
+-		valid_lft = 0x7FFFFFFF/HZ;
++		expires = 0;
++	} else {
++		if (valid_lft >= 0x7FFFFFFF/HZ)
++			valid_lft = 0x7FFFFFFF/HZ;
++		flags = RTF_EXPIRES;
++		expires = jiffies_to_clock_t(valid_lft * HZ);
++	}
+ 
+ 	if (prefered_lft == 0)
+ 		ifa_flags |= IFA_F_DEPRECATED;
+@@ -3176,7 +3201,7 @@ static int inet6_addr_modify(struct inet6_ifaddr *ifp, u8 ifa_flags,
+ 		ipv6_ifa_notify(0, ifp);
+ 
+ 	addrconf_prefix_route(&ifp->addr, ifp->prefix_len, ifp->idev->dev,
+-			      jiffies_to_clock_t(valid_lft * HZ), flags);
++			      expires, flags);
+ 	addrconf_verify(0);
+ 
+ 	return 0;
+@@ -4242,7 +4267,7 @@ static void addrconf_sysctl_register(struct inet6_dev *idev)
+ 	neigh_sysctl_register(idev->dev, idev->nd_parms, NET_IPV6,
+ 			      NET_IPV6_NEIGH, "ipv6",
+ 			      &ndisc_ifinfo_sysctl_change,
+-			      NULL);
++			      ndisc_ifinfo_sysctl_strategy);
+ 	__addrconf_sysctl_register(dev_net(idev->dev), idev->dev->name,
+ 			idev->dev->ifindex, idev, &idev->cnf);
+ }
+diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c
+index a55fc05..282fdb3 100644
+--- a/net/ipv6/ndisc.c
++++ b/net/ipv6/ndisc.c
+@@ -1727,10 +1727,10 @@ int ndisc_ifinfo_sysctl_change(struct ctl_table *ctl, int write, struct file * f
+ 	return ret;
+ }
+ 
+-static int ndisc_ifinfo_sysctl_strategy(ctl_table *ctl, int __user *name,
+-					int nlen, void __user *oldval,
+-					size_t __user *oldlenp,
+-					void __user *newval, size_t newlen)
++int ndisc_ifinfo_sysctl_strategy(ctl_table *ctl, int __user *name,
++				 int nlen, void __user *oldval,
++				 size_t __user *oldlenp,
++				 void __user *newval, size_t newlen)
+ {
+ 	struct net_device *dev = ctl->extra1;
+ 	struct inet6_dev *idev;
+diff --git a/net/ipv6/route.c b/net/ipv6/route.c
+index 12bba08..48534c6 100644
+--- a/net/ipv6/route.c
++++ b/net/ipv6/route.c
+@@ -109,7 +109,7 @@ static struct dst_ops ip6_dst_ops_template = {
+ 	.negative_advice	=	ip6_negative_advice,
+ 	.link_failure		=	ip6_link_failure,
+ 	.update_pmtu		=	ip6_rt_update_pmtu,
+-	.local_out		=	ip6_local_out,
++	.local_out		=	__ip6_local_out,
+ 	.entry_size		=	sizeof(struct rt6_info),
+ 	.entries		=	ATOMIC_INIT(0),
+ };
+@@ -475,7 +475,7 @@ int rt6_route_rcv(struct net_device *dev, u8 *opt, int len,
+ 	lifetime = ntohl(rinfo->lifetime);
+ 	if (lifetime == 0xffffffff) {
+ 		/* infinity */
+-	} else if (lifetime > 0x7fffffff/HZ) {
++	} else if (lifetime > 0x7fffffff/HZ - 1) {
+ 		/* Avoid arithmetic overflow */
+ 		lifetime = 0x7fffffff/HZ - 1;
+ 	}
+@@ -1106,7 +1106,9 @@ int ip6_route_add(struct fib6_config *cfg)
+ 	}
+ 
+ 	rt->u.dst.obsolete = -1;
+-	rt->rt6i_expires = jiffies + clock_t_to_jiffies(cfg->fc_expires);
++	rt->rt6i_expires = (cfg->fc_flags & RTF_EXPIRES) ?
++				jiffies + clock_t_to_jiffies(cfg->fc_expires) :
++				0;
+ 
+ 	if (cfg->fc_protocol == RTPROT_UNSPEC)
+ 		cfg->fc_protocol = RTPROT_BOOT;
+@@ -2200,7 +2202,9 @@ static int rt6_fill_node(struct sk_buff *skb, struct rt6_info *rt,
+ 
+ 	NLA_PUT_U32(skb, RTA_PRIORITY, rt->rt6i_metric);
+ 
+-	expires = rt->rt6i_expires ? rt->rt6i_expires - jiffies : 0;
++	expires = (rt->rt6i_flags & RTF_EXPIRES) ?
++			rt->rt6i_expires - jiffies : 0;
++
+ 	if (rtnl_put_cacheinfo(skb, &rt->u.dst, 0, 0, 0,
+ 			       expires, rt->u.dst.error) < 0)
+ 		goto nla_put_failure;
+diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
+index 4adba09..e470bf1 100644
+--- a/net/mac80211/mlme.c
++++ b/net/mac80211/mlme.c
+@@ -3446,21 +3446,17 @@ static int ieee80211_sta_config_auth(struct net_device *dev,
+ 	struct ieee80211_sta_bss *bss, *selected = NULL;
+ 	int top_rssi = 0, freq;
+ 
+-	if (!(ifsta->flags & (IEEE80211_STA_AUTO_SSID_SEL |
+-	    IEEE80211_STA_AUTO_BSSID_SEL | IEEE80211_STA_AUTO_CHANNEL_SEL))) {
+-		ifsta->state = IEEE80211_AUTHENTICATE;
+-		ieee80211_sta_reset_auth(dev, ifsta);
+-		return 0;
+-	}
+-
+ 	spin_lock_bh(&local->sta_bss_lock);
+ 	freq = local->oper_channel->center_freq;
+ 	list_for_each_entry(bss, &local->sta_bss_list, list) {
+ 		if (!(bss->capability & WLAN_CAPABILITY_ESS))
+ 			continue;
+ 
+-		if (!!(bss->capability & WLAN_CAPABILITY_PRIVACY) ^
+-		    !!sdata->default_key)
++		if ((ifsta->flags & (IEEE80211_STA_AUTO_SSID_SEL |
++			IEEE80211_STA_AUTO_BSSID_SEL |
++			IEEE80211_STA_AUTO_CHANNEL_SEL)) &&
++		    (!!(bss->capability & WLAN_CAPABILITY_PRIVACY) ^
++		     !!sdata->default_key))
+ 			continue;
+ 
+ 		if (!(ifsta->flags & IEEE80211_STA_AUTO_CHANNEL_SEL) &&
+diff --git a/net/mac80211/util.c b/net/mac80211/util.c
+index 24a465c..131e9e6 100644
+--- a/net/mac80211/util.c
++++ b/net/mac80211/util.c
+@@ -389,6 +389,41 @@ void ieee80211_iterate_active_interfaces(
+ 	struct ieee80211_local *local = hw_to_local(hw);
+ 	struct ieee80211_sub_if_data *sdata;
+ 
++	rtnl_lock();
++
++	list_for_each_entry(sdata, &local->interfaces, list) {
++		switch (sdata->vif.type) {
++		case IEEE80211_IF_TYPE_INVALID:
++		case IEEE80211_IF_TYPE_MNTR:
++		case IEEE80211_IF_TYPE_VLAN:
++			continue;
++		case IEEE80211_IF_TYPE_AP:
++		case IEEE80211_IF_TYPE_STA:
++		case IEEE80211_IF_TYPE_IBSS:
++		case IEEE80211_IF_TYPE_WDS:
++		case IEEE80211_IF_TYPE_MESH_POINT:
++			break;
++		}
++		if (sdata->dev == local->mdev)
++			continue;
++		if (netif_running(sdata->dev))
++			iterator(data, sdata->dev->dev_addr,
++				 &sdata->vif);
++	}
++
++	rtnl_unlock();
++}
++EXPORT_SYMBOL_GPL(ieee80211_iterate_active_interfaces);
++
++void ieee80211_iterate_active_interfaces_atomic(
++	struct ieee80211_hw *hw,
++	void (*iterator)(void *data, u8 *mac,
++			 struct ieee80211_vif *vif),
++	void *data)
++{
++	struct ieee80211_local *local = hw_to_local(hw);
++	struct ieee80211_sub_if_data *sdata;
++
+ 	rcu_read_lock();
+ 
+ 	list_for_each_entry_rcu(sdata, &local->interfaces, list) {
+@@ -413,4 +448,4 @@ void ieee80211_iterate_active_interfaces(
+ 
+ 	rcu_read_unlock();
+ }
+-EXPORT_SYMBOL_GPL(ieee80211_iterate_active_interfaces);
++EXPORT_SYMBOL_GPL(ieee80211_iterate_active_interfaces_atomic);
+diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c
+index 1086df7..9360fc8 100644
+--- a/net/sched/cls_api.c
++++ b/net/sched/cls_api.c
+@@ -220,7 +220,7 @@ replay:
+ 		tp = kzalloc(sizeof(*tp), GFP_KERNEL);
+ 		if (tp == NULL)
+ 			goto errout;
+-		err = -EINVAL;
++		err = -ENOENT;
+ 		tp_ops = tcf_proto_lookup_ops(tca[TCA_KIND]);
+ 		if (tp_ops == NULL) {
+ #ifdef CONFIG_KMOD
+diff --git a/net/sunrpc/auth_generic.c b/net/sunrpc/auth_generic.c
+index d927d9f..744b79f 100644
+--- a/net/sunrpc/auth_generic.c
++++ b/net/sunrpc/auth_generic.c
+@@ -17,8 +17,8 @@
+ # define RPCDBG_FACILITY	RPCDBG_AUTH
+ #endif
+ 
+-#define RPC_ANONYMOUS_USERID	((uid_t)-2)
+-#define RPC_ANONYMOUS_GROUPID	((gid_t)-2)
++#define RPC_MACHINE_CRED_USERID		((uid_t)0)
++#define RPC_MACHINE_CRED_GROUPID	((gid_t)0)
+ 
+ struct generic_cred {
+ 	struct rpc_cred gc_base;
+@@ -44,8 +44,8 @@ EXPORT_SYMBOL_GPL(rpc_lookup_cred);
+ struct rpc_cred *rpc_lookup_machine_cred(void)
+ {
+ 	struct auth_cred acred = {
+-		.uid = RPC_ANONYMOUS_USERID,
+-		.gid = RPC_ANONYMOUS_GROUPID,
++		.uid = RPC_MACHINE_CRED_USERID,
++		.gid = RPC_MACHINE_CRED_GROUPID,
+ 		.machine_cred = 1,
+ 	};
+ 
+diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c
+index d8e8d79..e46c825 100644
+--- a/net/sunrpc/svc_xprt.c
++++ b/net/sunrpc/svc_xprt.c
+@@ -6,30 +6,9 @@
+ 
+ #include <linux/sched.h>
+ #include <linux/errno.h>
+-#include <linux/fcntl.h>
+-#include <linux/net.h>
+-#include <linux/in.h>
+-#include <linux/inet.h>
+-#include <linux/udp.h>
+-#include <linux/tcp.h>
+-#include <linux/unistd.h>
+-#include <linux/slab.h>
+-#include <linux/netdevice.h>
+-#include <linux/skbuff.h>
+-#include <linux/file.h>
+ #include <linux/freezer.h>
+ #include <linux/kthread.h>
+ #include <net/sock.h>
+-#include <net/checksum.h>
+-#include <net/ip.h>
+-#include <net/ipv6.h>
+-#include <net/tcp_states.h>
+-#include <linux/uaccess.h>
+-#include <asm/ioctls.h>
+-
+-#include <linux/sunrpc/types.h>
+-#include <linux/sunrpc/clnt.h>
+-#include <linux/sunrpc/xdr.h>
+ #include <linux/sunrpc/stats.h>
+ #include <linux/sunrpc/svc_xprt.h>
+ 
+@@ -296,8 +275,6 @@ void svc_xprt_enqueue(struct svc_xprt *xprt)
+ 	if (!(xprt->xpt_flags &
+ 	      ((1<<XPT_CONN)|(1<<XPT_DATA)|(1<<XPT_CLOSE)|(1<<XPT_DEFERRED))))
+ 		return;
+-	if (test_bit(XPT_DEAD, &xprt->xpt_flags))
+-		return;
+ 
+ 	cpu = get_cpu();
+ 	pool = svc_pool_for_cpu(xprt->xpt_server, cpu);
+diff --git a/net/sunrpc/svcauth_unix.c b/net/sunrpc/svcauth_unix.c
+index 3f30ee6..f24800f 100644
+--- a/net/sunrpc/svcauth_unix.c
++++ b/net/sunrpc/svcauth_unix.c
+@@ -278,7 +278,7 @@ static int ip_map_show(struct seq_file *m,
+ 		dom = im->m_client->h.name;
+ 
+ 	if (ipv6_addr_v4mapped(&addr)) {
+-		seq_printf(m, "%s" NIPQUAD_FMT "%s\n",
++		seq_printf(m, "%s " NIPQUAD_FMT " %s\n",
+ 			im->m_class,
+ 			ntohl(addr.s6_addr32[3]) >> 24 & 0xff,
+ 			ntohl(addr.s6_addr32[3]) >> 16 & 0xff,
+@@ -286,7 +286,7 @@ static int ip_map_show(struct seq_file *m,
+ 			ntohl(addr.s6_addr32[3]) >>  0 & 0xff,
+ 			dom);
+ 	} else {
+-		seq_printf(m, "%s" NIP6_FMT "%s\n",
++		seq_printf(m, "%s " NIP6_FMT " %s\n",
+ 			im->m_class, NIP6(addr), dom);
+ 	}
+ 	return 0;
+diff --git a/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c b/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c
+index c22d6b6..06ab484 100644
+--- a/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c
++++ b/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c
+@@ -260,11 +260,16 @@ static int rdma_read_max_sge(struct svcxprt_rdma *xprt, int sge_count)
+  * On our side, we need to read into a pagelist. The first page immediately
+  * follows the RPC header.
+  *
+- * This function returns 1 to indicate success. The data is not yet in
++ * This function returns:
++ * 0 - No error and no read-list found.
++ *
++ * 1 - Successful read-list processing. The data is not yet in
+  * the pagelist and therefore the RPC request must be deferred. The
+  * I/O completion will enqueue the transport again and
+  * svc_rdma_recvfrom will complete the request.
+  *
++ * <0 - Error processing/posting read-list.
++ *
+  * NOTE: The ctxt must not be touched after the last WR has been posted
+  * because the I/O completion processing may occur on another
+  * processor and free / modify the context. Ne touche pas!
+@@ -284,7 +289,6 @@ static int rdma_read_xdr(struct svcxprt_rdma *xprt,
+ 	u64 sgl_offset;
+ 	struct rpcrdma_read_chunk *ch;
+ 	struct svc_rdma_op_ctxt *ctxt = NULL;
+-	struct svc_rdma_op_ctxt *head;
+ 	struct svc_rdma_op_ctxt *tmp_sge_ctxt;
+ 	struct svc_rdma_op_ctxt *tmp_ch_ctxt;
+ 	struct chunk_sge *ch_sge_ary;
+@@ -302,25 +306,19 @@ static int rdma_read_xdr(struct svcxprt_rdma *xprt,
+ 	ch_sge_ary = (struct chunk_sge *)tmp_ch_ctxt->sge;
+ 
+ 	svc_rdma_rcl_chunk_counts(ch, &ch_count, &byte_count);
++	if (ch_count > RPCSVC_MAXPAGES)
++		return -EINVAL;
+ 	sge_count = rdma_rcl_to_sge(xprt, rqstp, hdr_ctxt, rmsgp,
+ 				    sge, ch_sge_ary,
+ 				    ch_count, byte_count);
+-	head = svc_rdma_get_context(xprt);
+ 	sgl_offset = 0;
+ 	ch_no = 0;
+ 
+ 	for (ch = (struct rpcrdma_read_chunk *)&rmsgp->rm_body.rm_chunks[0];
+ 	     ch->rc_discrim != 0; ch++, ch_no++) {
+ next_sge:
+-		if (!ctxt)
+-			ctxt = head;
+-		else {
+-			ctxt->next = svc_rdma_get_context(xprt);
+-			ctxt = ctxt->next;
+-		}
+-		ctxt->next = NULL;
++		ctxt = svc_rdma_get_context(xprt);
+ 		ctxt->direction = DMA_FROM_DEVICE;
+-		clear_bit(RDMACTXT_F_READ_DONE, &ctxt->flags);
+ 		clear_bit(RDMACTXT_F_LAST_CTXT, &ctxt->flags);
+ 
+ 		/* Prepare READ WR */
+@@ -347,20 +345,15 @@ next_sge:
+ 			 * the client and the RPC needs to be enqueued.
+ 			 */
+ 			set_bit(RDMACTXT_F_LAST_CTXT, &ctxt->flags);
+-			ctxt->next = hdr_ctxt;
+-			hdr_ctxt->next = head;
++			ctxt->read_hdr = hdr_ctxt;
+ 		}
+ 		/* Post the read */
+ 		err = svc_rdma_send(xprt, &read_wr);
+ 		if (err) {
+-			printk(KERN_ERR "svcrdma: Error posting send = %d\n",
++			printk(KERN_ERR "svcrdma: Error %d posting RDMA_READ\n",
+ 			       err);
+-			/*
+-			 * Break the circular list so free knows when
+-			 * to stop if the error happened to occur on
+-			 * the last read
+-			 */
+-			ctxt->next = NULL;
++			set_bit(XPT_CLOSE, &xprt->sc_xprt.xpt_flags);
++			svc_rdma_put_context(ctxt, 0);
+ 			goto out;
+ 		}
+ 		atomic_inc(&rdma_stat_read);
+@@ -371,7 +364,7 @@ next_sge:
+ 			goto next_sge;
+ 		}
+ 		sgl_offset = 0;
+-		err = 0;
++		err = 1;
+ 	}
+ 
+  out:
+@@ -389,25 +382,12 @@ next_sge:
+ 	while (rqstp->rq_resused)
+ 		rqstp->rq_respages[--rqstp->rq_resused] = NULL;
+ 
+-	if (err) {
+-		printk(KERN_ERR "svcrdma : RDMA_READ error = %d\n", err);
+-		set_bit(XPT_CLOSE, &xprt->sc_xprt.xpt_flags);
+-		/* Free the linked list of read contexts */
+-		while (head != NULL) {
+-			ctxt = head->next;
+-			svc_rdma_put_context(head, 1);
+-			head = ctxt;
+-		}
+-		return 0;
+-	}
+-
+-	return 1;
++	return err;
+ }
+ 
+ static int rdma_read_complete(struct svc_rqst *rqstp,
+-			      struct svc_rdma_op_ctxt *data)
++			      struct svc_rdma_op_ctxt *head)
+ {
+-	struct svc_rdma_op_ctxt *head = data->next;
+ 	int page_no;
+ 	int ret;
+ 
+@@ -433,21 +413,12 @@ static int rdma_read_complete(struct svc_rqst *rqstp,
+ 	rqstp->rq_arg.len = head->arg.len;
+ 	rqstp->rq_arg.buflen = head->arg.buflen;
+ 
++	/* Free the context */
++	svc_rdma_put_context(head, 0);
++
+ 	/* XXX: What should this be? */
+ 	rqstp->rq_prot = IPPROTO_MAX;
+-
+-	/*
+-	 * Free the contexts we used to build the RDMA_READ. We have
+-	 * to be careful here because the context list uses the same
+-	 * next pointer used to chain the contexts associated with the
+-	 * RDMA_READ
+-	 */
+-	data->next = NULL;	/* terminate circular list */
+-	do {
+-		data = head->next;
+-		svc_rdma_put_context(head, 0);
+-		head = data;
+-	} while (head != NULL);
++	svc_xprt_copy_addrs(rqstp, rqstp->rq_xprt);
+ 
+ 	ret = rqstp->rq_arg.head[0].iov_len
+ 		+ rqstp->rq_arg.page_len
+@@ -457,8 +428,6 @@ static int rdma_read_complete(struct svc_rqst *rqstp,
+ 		ret, rqstp->rq_arg.len,	rqstp->rq_arg.head[0].iov_base,
+ 		rqstp->rq_arg.head[0].iov_len);
+ 
+-	/* Indicate that we've consumed an RQ credit */
+-	rqstp->rq_xprt_ctxt = rqstp->rq_xprt;
+ 	svc_xprt_received(rqstp->rq_xprt);
+ 	return ret;
+ }
+@@ -480,13 +449,6 @@ int svc_rdma_recvfrom(struct svc_rqst *rqstp)
+ 
+ 	dprintk("svcrdma: rqstp=%p\n", rqstp);
+ 
+-	/*
+-	 * The rq_xprt_ctxt indicates if we've consumed an RQ credit
+-	 * or not. It is used in the rdma xpo_release_rqst function to
+-	 * determine whether or not to return an RQ WQE to the RQ.
+-	 */
+-	rqstp->rq_xprt_ctxt = NULL;
+-
+ 	spin_lock_bh(&rdma_xprt->sc_read_complete_lock);
+ 	if (!list_empty(&rdma_xprt->sc_read_complete_q)) {
+ 		ctxt = list_entry(rdma_xprt->sc_read_complete_q.next,
+@@ -537,21 +499,22 @@ int svc_rdma_recvfrom(struct svc_rqst *rqstp)
+ 	/* If the request is invalid, reply with an error */
+ 	if (len < 0) {
+ 		if (len == -ENOSYS)
+-			(void)svc_rdma_send_error(rdma_xprt, rmsgp, ERR_VERS);
++			svc_rdma_send_error(rdma_xprt, rmsgp, ERR_VERS);
+ 		goto close_out;
+ 	}
+ 
+-	/* Read read-list data. If we would need to wait, defer
+-	 * it. Not that in this case, we don't return the RQ credit
+-	 * until after the read completes.
+-	 */
+-	if (rdma_read_xdr(rdma_xprt, rmsgp, rqstp, ctxt)) {
++	/* Read read-list data. */
++	ret = rdma_read_xdr(rdma_xprt, rmsgp, rqstp, ctxt);
++	if (ret > 0) {
++		/* read-list posted, defer until data received from client. */
+ 		svc_xprt_received(xprt);
+ 		return 0;
+ 	}
+-
+-	/* Indicate we've consumed an RQ credit */
+-	rqstp->rq_xprt_ctxt = rqstp->rq_xprt;
++	if (ret < 0) {
++		/* Post of read-list failed, free context. */
++		svc_rdma_put_context(ctxt, 1);
++		return 0;
++	}
+ 
+ 	ret = rqstp->rq_arg.head[0].iov_len
+ 		+ rqstp->rq_arg.page_len
+@@ -569,11 +532,8 @@ int svc_rdma_recvfrom(struct svc_rqst *rqstp)
+ 	return ret;
+ 
+  close_out:
+-	if (ctxt) {
++	if (ctxt)
+ 		svc_rdma_put_context(ctxt, 1);
+-		/* Indicate we've consumed an RQ credit */
+-		rqstp->rq_xprt_ctxt = rqstp->rq_xprt;
+-	}
+ 	dprintk("svcrdma: transport %p is closing\n", xprt);
+ 	/*
+ 	 * Set the close bit and enqueue it. svc_recv will see the
+diff --git a/net/sunrpc/xprtrdma/svc_rdma_sendto.c b/net/sunrpc/xprtrdma/svc_rdma_sendto.c
+index 981f190..fb82b1b 100644
+--- a/net/sunrpc/xprtrdma/svc_rdma_sendto.c
++++ b/net/sunrpc/xprtrdma/svc_rdma_sendto.c
+@@ -389,6 +389,17 @@ static int send_reply(struct svcxprt_rdma *rdma,
+ 	int page_no;
+ 	int ret;
+ 
++	/* Post a recv buffer to handle another request. */
++	ret = svc_rdma_post_recv(rdma);
++	if (ret) {
++		printk(KERN_INFO
++		       "svcrdma: could not post a receive buffer, err=%d."
++		       "Closing transport %p.\n", ret, rdma);
++		set_bit(XPT_CLOSE, &rdma->sc_xprt.xpt_flags);
++		svc_rdma_put_context(ctxt, 0);
++		return -ENOTCONN;
++	}
++
+ 	/* Prepare the context */
+ 	ctxt->pages[0] = page;
+ 	ctxt->count = 1;
+diff --git a/net/sunrpc/xprtrdma/svc_rdma_transport.c b/net/sunrpc/xprtrdma/svc_rdma_transport.c
+index af408fc..e132509 100644
+--- a/net/sunrpc/xprtrdma/svc_rdma_transport.c
++++ b/net/sunrpc/xprtrdma/svc_rdma_transport.c
+@@ -103,8 +103,8 @@ static int rdma_bump_context_cache(struct svcxprt_rdma *xprt)
+ 		spin_lock_bh(&xprt->sc_ctxt_lock);
+ 		if (ctxt) {
+ 			at_least_one = 1;
+-			ctxt->next = xprt->sc_ctxt_head;
+-			xprt->sc_ctxt_head = ctxt;
++			INIT_LIST_HEAD(&ctxt->free_list);
++			list_add(&ctxt->free_list, &xprt->sc_ctxt_free);
+ 		} else {
+ 			/* kmalloc failed...give up for now */
+ 			xprt->sc_ctxt_cnt--;
+@@ -123,7 +123,7 @@ struct svc_rdma_op_ctxt *svc_rdma_get_context(struct svcxprt_rdma *xprt)
+ 
+ 	while (1) {
+ 		spin_lock_bh(&xprt->sc_ctxt_lock);
+-		if (unlikely(xprt->sc_ctxt_head == NULL)) {
++		if (unlikely(list_empty(&xprt->sc_ctxt_free))) {
+ 			/* Try to bump my cache. */
+ 			spin_unlock_bh(&xprt->sc_ctxt_lock);
+ 
+@@ -136,12 +136,15 @@ struct svc_rdma_op_ctxt *svc_rdma_get_context(struct svcxprt_rdma *xprt)
+ 			schedule_timeout_uninterruptible(msecs_to_jiffies(500));
+ 			continue;
+ 		}
+-		ctxt = xprt->sc_ctxt_head;
+-		xprt->sc_ctxt_head = ctxt->next;
++		ctxt = list_entry(xprt->sc_ctxt_free.next,
++				  struct svc_rdma_op_ctxt,
++				  free_list);
++		list_del_init(&ctxt->free_list);
+ 		spin_unlock_bh(&xprt->sc_ctxt_lock);
+ 		ctxt->xprt = xprt;
+ 		INIT_LIST_HEAD(&ctxt->dto_q);
+ 		ctxt->count = 0;
++		atomic_inc(&xprt->sc_ctxt_used);
+ 		break;
+ 	}
+ 	return ctxt;
+@@ -159,14 +162,15 @@ void svc_rdma_put_context(struct svc_rdma_op_ctxt *ctxt, int free_pages)
+ 			put_page(ctxt->pages[i]);
+ 
+ 	for (i = 0; i < ctxt->count; i++)
+-		dma_unmap_single(xprt->sc_cm_id->device->dma_device,
+-				 ctxt->sge[i].addr,
+-				 ctxt->sge[i].length,
+-				 ctxt->direction);
++		ib_dma_unmap_single(xprt->sc_cm_id->device,
++				    ctxt->sge[i].addr,
++				    ctxt->sge[i].length,
++				    ctxt->direction);
++
+ 	spin_lock_bh(&xprt->sc_ctxt_lock);
+-	ctxt->next = xprt->sc_ctxt_head;
+-	xprt->sc_ctxt_head = ctxt;
++	list_add(&ctxt->free_list, &xprt->sc_ctxt_free);
+ 	spin_unlock_bh(&xprt->sc_ctxt_lock);
++	atomic_dec(&xprt->sc_ctxt_used);
+ }
+ 
+ /* ib_cq event handler */
+@@ -228,23 +232,8 @@ static void dto_tasklet_func(unsigned long data)
+ 		list_del_init(&xprt->sc_dto_q);
+ 		spin_unlock_irqrestore(&dto_lock, flags);
+ 
+-		if (test_and_clear_bit(RDMAXPRT_RQ_PENDING, &xprt->sc_flags)) {
+-			ib_req_notify_cq(xprt->sc_rq_cq, IB_CQ_NEXT_COMP);
+-			rq_cq_reap(xprt);
+-			set_bit(XPT_DATA, &xprt->sc_xprt.xpt_flags);
+-			/*
+-			 * If data arrived before established event,
+-			 * don't enqueue. This defers RPC I/O until the
+-			 * RDMA connection is complete.
+-			 */
+-			if (!test_bit(RDMAXPRT_CONN_PENDING, &xprt->sc_flags))
+-				svc_xprt_enqueue(&xprt->sc_xprt);
+-		}
+-
+-		if (test_and_clear_bit(RDMAXPRT_SQ_PENDING, &xprt->sc_flags)) {
+-			ib_req_notify_cq(xprt->sc_sq_cq, IB_CQ_NEXT_COMP);
+-			sq_cq_reap(xprt);
+-		}
++		rq_cq_reap(xprt);
++		sq_cq_reap(xprt);
+ 
+ 		svc_xprt_put(&xprt->sc_xprt);
+ 		spin_lock_irqsave(&dto_lock, flags);
+@@ -263,11 +252,15 @@ static void rq_comp_handler(struct ib_cq *cq, void *cq_context)
+ 	struct svcxprt_rdma *xprt = cq_context;
+ 	unsigned long flags;
+ 
++	/* Guard against unconditional flush call for destroyed QP */
++	if (atomic_read(&xprt->sc_xprt.xpt_ref.refcount)==0)
++		return;
++
+ 	/*
+ 	 * Set the bit regardless of whether or not it's on the list
+ 	 * because it may be on the list already due to an SQ
+ 	 * completion.
+-	*/
++	 */
+ 	set_bit(RDMAXPRT_RQ_PENDING, &xprt->sc_flags);
+ 
+ 	/*
+@@ -290,6 +283,8 @@ static void rq_comp_handler(struct ib_cq *cq, void *cq_context)
+  *
+  * Take all completing WC off the CQE and enqueue the associated DTO
+  * context on the dto_q for the transport.
++ *
++ * Note that caller must hold a transport reference.
+  */
+ static void rq_cq_reap(struct svcxprt_rdma *xprt)
+ {
+@@ -297,29 +292,47 @@ static void rq_cq_reap(struct svcxprt_rdma *xprt)
+ 	struct ib_wc wc;
+ 	struct svc_rdma_op_ctxt *ctxt = NULL;
+ 
++	if (!test_and_clear_bit(RDMAXPRT_RQ_PENDING, &xprt->sc_flags))
++		return;
++
++	ib_req_notify_cq(xprt->sc_rq_cq, IB_CQ_NEXT_COMP);
+ 	atomic_inc(&rdma_stat_rq_poll);
+ 
+-	spin_lock_bh(&xprt->sc_rq_dto_lock);
+ 	while ((ret = ib_poll_cq(xprt->sc_rq_cq, 1, &wc)) > 0) {
+ 		ctxt = (struct svc_rdma_op_ctxt *)(unsigned long)wc.wr_id;
+ 		ctxt->wc_status = wc.status;
+ 		ctxt->byte_len = wc.byte_len;
+ 		if (wc.status != IB_WC_SUCCESS) {
+ 			/* Close the transport */
++			dprintk("svcrdma: transport closing putting ctxt %p\n", ctxt);
+ 			set_bit(XPT_CLOSE, &xprt->sc_xprt.xpt_flags);
+ 			svc_rdma_put_context(ctxt, 1);
++			svc_xprt_put(&xprt->sc_xprt);
+ 			continue;
+ 		}
++		spin_lock_bh(&xprt->sc_rq_dto_lock);
+ 		list_add_tail(&ctxt->dto_q, &xprt->sc_rq_dto_q);
++		spin_unlock_bh(&xprt->sc_rq_dto_lock);
++		svc_xprt_put(&xprt->sc_xprt);
+ 	}
+-	spin_unlock_bh(&xprt->sc_rq_dto_lock);
+ 
+ 	if (ctxt)
+ 		atomic_inc(&rdma_stat_rq_prod);
++
++	set_bit(XPT_DATA, &xprt->sc_xprt.xpt_flags);
++	/*
++	 * If data arrived before established event,
++	 * don't enqueue. This defers RPC I/O until the
++	 * RDMA connection is complete.
++	 */
++	if (!test_bit(RDMAXPRT_CONN_PENDING, &xprt->sc_flags))
++		svc_xprt_enqueue(&xprt->sc_xprt);
+ }
+ 
+ /*
+  * Send Queue Completion Handler - potentially called on interrupt context.
++ *
++ * Note that caller must hold a transport reference.
+  */
+ static void sq_cq_reap(struct svcxprt_rdma *xprt)
+ {
+@@ -328,6 +341,11 @@ static void sq_cq_reap(struct svcxprt_rdma *xprt)
+ 	struct ib_cq *cq = xprt->sc_sq_cq;
+ 	int ret;
+ 
++
++	if (!test_and_clear_bit(RDMAXPRT_SQ_PENDING, &xprt->sc_flags))
++		return;
++
++	ib_req_notify_cq(xprt->sc_sq_cq, IB_CQ_NEXT_COMP);
+ 	atomic_inc(&rdma_stat_sq_poll);
+ 	while ((ret = ib_poll_cq(cq, 1, &wc)) > 0) {
+ 		ctxt = (struct svc_rdma_op_ctxt *)(unsigned long)wc.wr_id;
+@@ -349,14 +367,16 @@ static void sq_cq_reap(struct svcxprt_rdma *xprt)
+ 
+ 		case IB_WR_RDMA_READ:
+ 			if (test_bit(RDMACTXT_F_LAST_CTXT, &ctxt->flags)) {
++				struct svc_rdma_op_ctxt *read_hdr = ctxt->read_hdr;
++				BUG_ON(!read_hdr);
+ 				set_bit(XPT_DATA, &xprt->sc_xprt.xpt_flags);
+-				set_bit(RDMACTXT_F_READ_DONE, &ctxt->flags);
+ 				spin_lock_bh(&xprt->sc_read_complete_lock);
+-				list_add_tail(&ctxt->dto_q,
++				list_add_tail(&read_hdr->dto_q,
+ 					      &xprt->sc_read_complete_q);
+ 				spin_unlock_bh(&xprt->sc_read_complete_lock);
+ 				svc_xprt_enqueue(&xprt->sc_xprt);
+ 			}
++			svc_rdma_put_context(ctxt, 0);
+ 			break;
+ 
+ 		default:
+@@ -365,6 +385,7 @@ static void sq_cq_reap(struct svcxprt_rdma *xprt)
+ 			       wc.opcode, wc.status);
+ 			break;
+ 		}
++		svc_xprt_put(&xprt->sc_xprt);
+ 	}
+ 
+ 	if (ctxt)
+@@ -376,11 +397,15 @@ static void sq_comp_handler(struct ib_cq *cq, void *cq_context)
+ 	struct svcxprt_rdma *xprt = cq_context;
+ 	unsigned long flags;
+ 
++	/* Guard against unconditional flush call for destroyed QP */
++	if (atomic_read(&xprt->sc_xprt.xpt_ref.refcount)==0)
++		return;
++
+ 	/*
+ 	 * Set the bit regardless of whether or not it's on the list
+ 	 * because it may be on the list already due to an RQ
+ 	 * completion.
+-	*/
++	 */
+ 	set_bit(RDMAXPRT_SQ_PENDING, &xprt->sc_flags);
+ 
+ 	/*
+@@ -407,28 +432,29 @@ static void create_context_cache(struct svcxprt_rdma *xprt,
+ 	xprt->sc_ctxt_max = ctxt_max;
+ 	xprt->sc_ctxt_bump = ctxt_bump;
+ 	xprt->sc_ctxt_cnt = 0;
+-	xprt->sc_ctxt_head = NULL;
++	atomic_set(&xprt->sc_ctxt_used, 0);
++
++	INIT_LIST_HEAD(&xprt->sc_ctxt_free);
+ 	for (i = 0; i < ctxt_count; i++) {
+ 		ctxt = kmalloc(sizeof(*ctxt), GFP_KERNEL);
+ 		if (ctxt) {
+-			ctxt->next = xprt->sc_ctxt_head;
+-			xprt->sc_ctxt_head = ctxt;
++			INIT_LIST_HEAD(&ctxt->free_list);
++			list_add(&ctxt->free_list, &xprt->sc_ctxt_free);
+ 			xprt->sc_ctxt_cnt++;
+ 		}
+ 	}
+ }
+ 
+-static void destroy_context_cache(struct svc_rdma_op_ctxt *ctxt)
++static void destroy_context_cache(struct svcxprt_rdma *xprt)
+ {
+-	struct svc_rdma_op_ctxt *next;
+-	if (!ctxt)
+-		return;
+-
+-	do {
+-		next = ctxt->next;
++	while (!list_empty(&xprt->sc_ctxt_free)) {
++		struct svc_rdma_op_ctxt *ctxt;
++		ctxt = list_entry(xprt->sc_ctxt_free.next,
++				  struct svc_rdma_op_ctxt,
++				  free_list);
++		list_del_init(&ctxt->free_list);
+ 		kfree(ctxt);
+-		ctxt = next;
+-	} while (next);
++	}
+ }
+ 
+ static struct svcxprt_rdma *rdma_create_xprt(struct svc_serv *serv,
+@@ -465,7 +491,7 @@ static struct svcxprt_rdma *rdma_create_xprt(struct svc_serv *serv,
+ 				     reqs +
+ 				     cma_xprt->sc_sq_depth +
+ 				     RPCRDMA_MAX_THREADS + 1); /* max */
+-		if (!cma_xprt->sc_ctxt_head) {
++		if (list_empty(&cma_xprt->sc_ctxt_free)) {
+ 			kfree(cma_xprt);
+ 			return NULL;
+ 		}
+@@ -520,7 +546,12 @@ int svc_rdma_post_recv(struct svcxprt_rdma *xprt)
+ 	recv_wr.num_sge = ctxt->count;
+ 	recv_wr.wr_id = (u64)(unsigned long)ctxt;
+ 
++	svc_xprt_get(&xprt->sc_xprt);
+ 	ret = ib_post_recv(xprt->sc_qp, &recv_wr, &bad_recv_wr);
++	if (ret) {
++		svc_xprt_put(&xprt->sc_xprt);
++		svc_rdma_put_context(ctxt, 1);
++	}
+ 	return ret;
+ }
+ 
+@@ -539,6 +570,7 @@ static void handle_connect_req(struct rdma_cm_id *new_cma_id)
+ {
+ 	struct svcxprt_rdma *listen_xprt = new_cma_id->context;
+ 	struct svcxprt_rdma *newxprt;
++	struct sockaddr *sa;
+ 
+ 	/* Create a new transport */
+ 	newxprt = rdma_create_xprt(listen_xprt->sc_xprt.xpt_server, 0);
+@@ -551,6 +583,12 @@ static void handle_connect_req(struct rdma_cm_id *new_cma_id)
+ 	dprintk("svcrdma: Creating newxprt=%p, cm_id=%p, listenxprt=%p\n",
+ 		newxprt, newxprt->sc_cm_id, listen_xprt);
+ 
++	/* Set the local and remote addresses in the transport */
++	sa = (struct sockaddr *)&newxprt->sc_cm_id->route.addr.dst_addr;
++	svc_xprt_set_remote(&newxprt->sc_xprt, sa, svc_addr_len(sa));
++	sa = (struct sockaddr *)&newxprt->sc_cm_id->route.addr.src_addr;
++	svc_xprt_set_local(&newxprt->sc_xprt, sa, svc_addr_len(sa));
++
+ 	/*
+ 	 * Enqueue the new transport on the accept queue of the listening
+ 	 * transport
+@@ -627,6 +665,7 @@ static int rdma_cma_handler(struct rdma_cm_id *cma_id,
+ 		if (xprt) {
+ 			set_bit(XPT_CLOSE, &xprt->xpt_flags);
+ 			svc_xprt_enqueue(xprt);
++			svc_xprt_put(xprt);
+ 		}
+ 		break;
+ 	case RDMA_CM_EVENT_DEVICE_REMOVAL:
+@@ -661,31 +700,27 @@ static struct svc_xprt *svc_rdma_create(struct svc_serv *serv,
+ 
+ 	cma_xprt = rdma_create_xprt(serv, 1);
+ 	if (!cma_xprt)
+-		return ERR_PTR(ENOMEM);
++		return ERR_PTR(-ENOMEM);
+ 	xprt = &cma_xprt->sc_xprt;
+ 
+ 	listen_id = rdma_create_id(rdma_listen_handler, cma_xprt, RDMA_PS_TCP);
+ 	if (IS_ERR(listen_id)) {
+-		svc_xprt_put(&cma_xprt->sc_xprt);
+-		dprintk("svcrdma: rdma_create_id failed = %ld\n",
+-			PTR_ERR(listen_id));
+-		return (void *)listen_id;
++		ret = PTR_ERR(listen_id);
++		dprintk("svcrdma: rdma_create_id failed = %d\n", ret);
++		goto err0;
+ 	}
++
+ 	ret = rdma_bind_addr(listen_id, sa);
+ 	if (ret) {
+-		rdma_destroy_id(listen_id);
+-		svc_xprt_put(&cma_xprt->sc_xprt);
+ 		dprintk("svcrdma: rdma_bind_addr failed = %d\n", ret);
+-		return ERR_PTR(ret);
++		goto err1;
+ 	}
+ 	cma_xprt->sc_cm_id = listen_id;
+ 
+ 	ret = rdma_listen(listen_id, RPCRDMA_LISTEN_BACKLOG);
+ 	if (ret) {
+-		rdma_destroy_id(listen_id);
+-		svc_xprt_put(&cma_xprt->sc_xprt);
+ 		dprintk("svcrdma: rdma_listen failed = %d\n", ret);
+-		return ERR_PTR(ret);
++		goto err1;
+ 	}
+ 
+ 	/*
+@@ -696,6 +731,12 @@ static struct svc_xprt *svc_rdma_create(struct svc_serv *serv,
+ 	svc_xprt_set_local(&cma_xprt->sc_xprt, sa, salen);
+ 
+ 	return &cma_xprt->sc_xprt;
++
++ err1:
++	rdma_destroy_id(listen_id);
++ err0:
++	kfree(cma_xprt);
++	return ERR_PTR(ret);
+ }
+ 
+ /*
+@@ -716,7 +757,6 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt)
+ 	struct rdma_conn_param conn_param;
+ 	struct ib_qp_init_attr qp_attr;
+ 	struct ib_device_attr devattr;
+-	struct sockaddr *sa;
+ 	int ret;
+ 	int i;
+ 
+@@ -826,7 +866,6 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt)
+ 		newxprt->sc_sq_depth = qp_attr.cap.max_send_wr;
+ 		newxprt->sc_max_requests = qp_attr.cap.max_recv_wr;
+ 	}
+-	svc_xprt_get(&newxprt->sc_xprt);
+ 	newxprt->sc_qp = newxprt->sc_cm_id->qp;
+ 
+ 	/* Register all of physical memory */
+@@ -850,6 +889,13 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt)
+ 	/* Swap out the handler */
+ 	newxprt->sc_cm_id->event_handler = rdma_cma_handler;
+ 
++	/*
++	 * Arm the CQs for the SQ and RQ before accepting so we can't
++	 * miss the first message
++	 */
++	ib_req_notify_cq(newxprt->sc_sq_cq, IB_CQ_NEXT_COMP);
++	ib_req_notify_cq(newxprt->sc_rq_cq, IB_CQ_NEXT_COMP);
++
+ 	/* Accept Connection */
+ 	set_bit(RDMAXPRT_CONN_PENDING, &newxprt->sc_flags);
+ 	memset(&conn_param, 0, sizeof conn_param);
+@@ -886,58 +932,26 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt)
+ 		newxprt->sc_max_requests,
+ 		newxprt->sc_ord);
+ 
+-	/* Set the local and remote addresses in the transport */
+-	sa = (struct sockaddr *)&newxprt->sc_cm_id->route.addr.dst_addr;
+-	svc_xprt_set_remote(&newxprt->sc_xprt, sa, svc_addr_len(sa));
+-	sa = (struct sockaddr *)&newxprt->sc_cm_id->route.addr.src_addr;
+-	svc_xprt_set_local(&newxprt->sc_xprt, sa, svc_addr_len(sa));
+-
+-	ib_req_notify_cq(newxprt->sc_sq_cq, IB_CQ_NEXT_COMP);
+-	ib_req_notify_cq(newxprt->sc_rq_cq, IB_CQ_NEXT_COMP);
+ 	return &newxprt->sc_xprt;
+ 
+  errout:
+ 	dprintk("svcrdma: failure accepting new connection rc=%d.\n", ret);
+ 	/* Take a reference in case the DTO handler runs */
+ 	svc_xprt_get(&newxprt->sc_xprt);
+-	if (newxprt->sc_qp && !IS_ERR(newxprt->sc_qp)) {
++	if (newxprt->sc_qp && !IS_ERR(newxprt->sc_qp))
+ 		ib_destroy_qp(newxprt->sc_qp);
+-		svc_xprt_put(&newxprt->sc_xprt);
+-	}
+ 	rdma_destroy_id(newxprt->sc_cm_id);
+ 	/* This call to put will destroy the transport */
+ 	svc_xprt_put(&newxprt->sc_xprt);
+ 	return NULL;
+ }
+ 
+-/*
+- * Post an RQ WQE to the RQ when the rqst is being released. This
+- * effectively returns an RQ credit to the client. The rq_xprt_ctxt
+- * will be null if the request is deferred due to an RDMA_READ or the
+- * transport had no data ready (EAGAIN). Note that an RPC deferred in
+- * svc_process will still return the credit, this is because the data
+- * is copied and no longer consume a WQE/WC.
+- */
+ static void svc_rdma_release_rqst(struct svc_rqst *rqstp)
+ {
+-	int err;
+-	struct svcxprt_rdma *rdma =
+-		container_of(rqstp->rq_xprt, struct svcxprt_rdma, sc_xprt);
+-	if (rqstp->rq_xprt_ctxt) {
+-		BUG_ON(rqstp->rq_xprt_ctxt != rdma);
+-		err = svc_rdma_post_recv(rdma);
+-		if (err)
+-			dprintk("svcrdma: failed to post an RQ WQE error=%d\n",
+-				err);
+-	}
+-	rqstp->rq_xprt_ctxt = NULL;
+ }
+ 
+ /*
+- * When connected, an svc_xprt has at least three references:
+- *
+- * - A reference held by the QP. We still hold that here because this
+- *   code deletes the QP and puts the reference.
++ * When connected, an svc_xprt has at least two references:
+  *
+  * - A reference held by the cm_id between the ESTABLISHED and
+  *   DISCONNECTED events. If the remote peer disconnected first, this
+@@ -946,7 +960,7 @@ static void svc_rdma_release_rqst(struct svc_rqst *rqstp)
+  * - A reference held by the svc_recv code that called this function
+  *   as part of close processing.
+  *
+- * At a minimum two references should still be held.
++ * At a minimum one references should still be held.
+  */
+ static void svc_rdma_detach(struct svc_xprt *xprt)
+ {
+@@ -956,23 +970,53 @@ static void svc_rdma_detach(struct svc_xprt *xprt)
+ 
+ 	/* Disconnect and flush posted WQE */
+ 	rdma_disconnect(rdma->sc_cm_id);
+-
+-	/* Destroy the QP if present (not a listener) */
+-	if (rdma->sc_qp && !IS_ERR(rdma->sc_qp)) {
+-		ib_destroy_qp(rdma->sc_qp);
+-		svc_xprt_put(xprt);
+-	}
+-
+-	/* Destroy the CM ID */
+-	rdma_destroy_id(rdma->sc_cm_id);
+ }
+ 
+-static void svc_rdma_free(struct svc_xprt *xprt)
++static void __svc_rdma_free(struct work_struct *work)
+ {
+-	struct svcxprt_rdma *rdma = (struct svcxprt_rdma *)xprt;
++	struct svcxprt_rdma *rdma =
++		container_of(work, struct svcxprt_rdma, sc_work);
+ 	dprintk("svcrdma: svc_rdma_free(%p)\n", rdma);
++
+ 	/* We should only be called from kref_put */
+-	BUG_ON(atomic_read(&xprt->xpt_ref.refcount) != 0);
++	BUG_ON(atomic_read(&rdma->sc_xprt.xpt_ref.refcount) != 0);
++
++	/*
++	 * Destroy queued, but not processed read completions. Note
++	 * that this cleanup has to be done before destroying the
++	 * cm_id because the device ptr is needed to unmap the dma in
++	 * svc_rdma_put_context.
++	 */
++	spin_lock_bh(&rdma->sc_read_complete_lock);
++	while (!list_empty(&rdma->sc_read_complete_q)) {
++		struct svc_rdma_op_ctxt *ctxt;
++		ctxt = list_entry(rdma->sc_read_complete_q.next,
++				  struct svc_rdma_op_ctxt,
++				  dto_q);
++		list_del_init(&ctxt->dto_q);
++		svc_rdma_put_context(ctxt, 1);
++	}
++	spin_unlock_bh(&rdma->sc_read_complete_lock);
++
++	/* Destroy queued, but not processed recv completions */
++	spin_lock_bh(&rdma->sc_rq_dto_lock);
++	while (!list_empty(&rdma->sc_rq_dto_q)) {
++		struct svc_rdma_op_ctxt *ctxt;
++		ctxt = list_entry(rdma->sc_rq_dto_q.next,
++				  struct svc_rdma_op_ctxt,
++				  dto_q);
++		list_del_init(&ctxt->dto_q);
++		svc_rdma_put_context(ctxt, 1);
++	}
++	spin_unlock_bh(&rdma->sc_rq_dto_lock);
++
++	/* Warn if we leaked a resource or under-referenced */
++	WARN_ON(atomic_read(&rdma->sc_ctxt_used) != 0);
++
++	/* Destroy the QP if present (not a listener) */
++	if (rdma->sc_qp && !IS_ERR(rdma->sc_qp))
++		ib_destroy_qp(rdma->sc_qp);
++
+ 	if (rdma->sc_sq_cq && !IS_ERR(rdma->sc_sq_cq))
+ 		ib_destroy_cq(rdma->sc_sq_cq);
+ 
+@@ -985,10 +1029,21 @@ static void svc_rdma_free(struct svc_xprt *xprt)
+ 	if (rdma->sc_pd && !IS_ERR(rdma->sc_pd))
+ 		ib_dealloc_pd(rdma->sc_pd);
+ 
+-	destroy_context_cache(rdma->sc_ctxt_head);
++	/* Destroy the CM ID */
++	rdma_destroy_id(rdma->sc_cm_id);
++
++	destroy_context_cache(rdma);
+ 	kfree(rdma);
+ }
+ 
++static void svc_rdma_free(struct svc_xprt *xprt)
++{
++	struct svcxprt_rdma *rdma =
++		container_of(xprt, struct svcxprt_rdma, sc_xprt);
++	INIT_WORK(&rdma->sc_work, __svc_rdma_free);
++	schedule_work(&rdma->sc_work);
++}
++
+ static int svc_rdma_has_wspace(struct svc_xprt *xprt)
+ {
+ 	struct svcxprt_rdma *rdma =
+@@ -1018,7 +1073,7 @@ int svc_rdma_send(struct svcxprt_rdma *xprt, struct ib_send_wr *wr)
+ 	int ret;
+ 
+ 	if (test_bit(XPT_CLOSE, &xprt->sc_xprt.xpt_flags))
+-		return 0;
++		return -ENOTCONN;
+ 
+ 	BUG_ON(wr->send_flags != IB_SEND_SIGNALED);
+ 	BUG_ON(((struct svc_rdma_op_ctxt *)(unsigned long)wr->wr_id)->wr_op !=
+@@ -1029,7 +1084,8 @@ int svc_rdma_send(struct svcxprt_rdma *xprt, struct ib_send_wr *wr)
+ 		if (xprt->sc_sq_depth == atomic_read(&xprt->sc_sq_count)) {
+ 			spin_unlock_bh(&xprt->sc_lock);
+ 			atomic_inc(&rdma_stat_sq_starve);
+-			/* See if we can reap some SQ WR */
++
++			/* See if we can opportunistically reap SQ WR to make room */
+ 			sq_cq_reap(xprt);
+ 
+ 			/* Wait until SQ WR available if SQ still full */
+@@ -1041,22 +1097,25 @@ int svc_rdma_send(struct svcxprt_rdma *xprt, struct ib_send_wr *wr)
+ 			continue;
+ 		}
+ 		/* Bumped used SQ WR count and post */
++		svc_xprt_get(&xprt->sc_xprt);
+ 		ret = ib_post_send(xprt->sc_qp, wr, &bad_wr);
+ 		if (!ret)
+ 			atomic_inc(&xprt->sc_sq_count);
+-		else
++		else {
++			svc_xprt_put(&xprt->sc_xprt);
+ 			dprintk("svcrdma: failed to post SQ WR rc=%d, "
+ 			       "sc_sq_count=%d, sc_sq_depth=%d\n",
+ 			       ret, atomic_read(&xprt->sc_sq_count),
+ 			       xprt->sc_sq_depth);
++		}
+ 		spin_unlock_bh(&xprt->sc_lock);
+ 		break;
+ 	}
+ 	return ret;
+ }
+ 
+-int svc_rdma_send_error(struct svcxprt_rdma *xprt, struct rpcrdma_msg *rmsgp,
+-			enum rpcrdma_errcode err)
++void svc_rdma_send_error(struct svcxprt_rdma *xprt, struct rpcrdma_msg *rmsgp,
++			 enum rpcrdma_errcode err)
+ {
+ 	struct ib_send_wr err_wr;
+ 	struct ib_sge sge;
+@@ -1094,9 +1153,8 @@ int svc_rdma_send_error(struct svcxprt_rdma *xprt, struct rpcrdma_msg *rmsgp,
+ 	/* Post It */
+ 	ret = svc_rdma_send(xprt, &err_wr);
+ 	if (ret) {
+-		dprintk("svcrdma: Error posting send = %d\n", ret);
++		dprintk("svcrdma: Error %d posting send for protocol error\n",
++			ret);
+ 		svc_rdma_put_context(ctxt, 1);
+ 	}
+-
+-	return ret;
+ }
+diff --git a/scripts/kallsyms.c b/scripts/kallsyms.c
+index 5d20a2e..ad2434b 100644
+--- a/scripts/kallsyms.c
++++ b/scripts/kallsyms.c
+@@ -108,6 +108,9 @@ static int read_symbol(FILE *in, struct sym_entry *s)
+ 	/* exclude also MIPS ELF local symbols ($L123 instead of .L123) */
+ 	else if (str[0] == '$')
+ 		return -1;
++	/* exclude debugging symbols */
++	else if (stype == 'N')
++		return -1;
+ 
+ 	/* include the type field in the symbol name, so that it gets
+ 	 * compressed together */
+diff --git a/scripts/kconfig/util.c b/scripts/kconfig/util.c
+index f8e73c0..3cc9f93 100644
+--- a/scripts/kconfig/util.c
++++ b/scripts/kconfig/util.c
+@@ -77,7 +77,7 @@ struct gstr str_new(void)
+ {
+ 	struct gstr gs;
+ 	gs.s = malloc(sizeof(char) * 64);
+-	gs.len = 16;
++	gs.len = 64;
+ 	strcpy(gs.s, "\0");
+ 	return gs;
+ }
+diff --git a/scripts/kernel-doc b/scripts/kernel-doc
+index 83cee18..88e3934 100755
+--- a/scripts/kernel-doc
++++ b/scripts/kernel-doc
+@@ -1556,7 +1556,9 @@ sub create_parameterlist($$$) {
+ 		    push_parameter($2, "$type $1", $file);
+ 		}
+ 		elsif ($param =~ m/(.*?):(\d+)/) {
+-		    push_parameter($1, "$type:$2", $file)
++		    if ($type ne "") { # skip unnamed bit-fields
++			push_parameter($1, "$type:$2", $file)
++		    }
+ 		}
+ 		else {
+ 		    push_parameter($param, $type, $file);
+diff --git a/scripts/mksysmap b/scripts/mksysmap
+index 4390fab..6e133a0 100644
+--- a/scripts/mksysmap
++++ b/scripts/mksysmap
+@@ -32,6 +32,7 @@
+ # For System.map filter away:
+ #   a - local absolute symbols
+ #   U - undefined global symbols
++#   N - debugging symbols
+ #   w - local weak symbols
+ 
+ # readprofile starts reading symbols when _stext is found, and
+@@ -40,5 +41,5 @@
+ # so we just ignore them to let readprofile continue to work.
+ # (At least sparc64 has __crc_ in the middle).
+ 
+-$NM -n $1 | grep -v '\( [aUw] \)\|\(__crc_\)\|\( \$[adt]\)' > $2
++$NM -n $1 | grep -v '\( [aNUw] \)\|\(__crc_\)\|\( \$[adt]\)' > $2
+ 
+diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
+index 757294b..508c589 100644
+--- a/scripts/mod/modpost.c
++++ b/scripts/mod/modpost.c
+@@ -721,7 +721,7 @@ static int check_section(const char *modname, const char *sec)
+ 		/* consume all digits */
+ 		while (*e && e != sec && isdigit(*e))
+ 			e--;
+-		if (*e == '.') {
++		if (*e == '.' && !strstr(sec, ".linkonce")) {
+ 			warn("%s (%s): unexpected section name.\n"
+ 			     "The (.[number]+) following section name are "
+ 			     "ld generated and not expected.\n"
+diff --git a/sound/Kconfig b/sound/Kconfig
+index b2a2db4..4247406 100644
+--- a/sound/Kconfig
++++ b/sound/Kconfig
+@@ -28,11 +28,6 @@ config SOUND
+ 	  and read <file:Documentation/sound/oss/README.modules>; the module
+ 	  will be called soundcore.
+ 
+-	  I'm told that even without a sound card, you can make your computer
+-	  say more than an occasional beep, by programming the PC speaker.
+-	  Kernel patches and supporting utilities to do that are in the pcsp
+-	  package, available at <ftp://ftp.infradead.org/pub/pcsp/>.
+-
+ source "sound/oss/dmasound/Kconfig"
+ 
+ if !M68K
+diff --git a/sound/core/sound.c b/sound/core/sound.c
+index 812f91b..6c8ab48 100644
+--- a/sound/core/sound.c
++++ b/sound/core/sound.c
+@@ -259,8 +259,9 @@ int snd_register_device_for_dev(int type, struct snd_card *card, int dev,
+ 		return minor;
+ 	}
+ 	snd_minors[minor] = preg;
+-	preg->dev = device_create(sound_class, device, MKDEV(major, minor),
+-				  "%s", name);
++	preg->dev = device_create_drvdata(sound_class, device,
++					  MKDEV(major, minor),
++					  private_data, "%s", name);
+ 	if (IS_ERR(preg->dev)) {
+ 		snd_minors[minor] = NULL;
+ 		mutex_unlock(&sound_mutex);
+@@ -269,9 +270,6 @@ int snd_register_device_for_dev(int type, struct snd_card *card, int dev,
+ 		return minor;
+ 	}
+ 
+-	if (preg->dev)
+-		dev_set_drvdata(preg->dev, private_data);
+-
+ 	mutex_unlock(&sound_mutex);
+ 	return 0;
+ }
+diff --git a/sound/drivers/Kconfig b/sound/drivers/Kconfig
+index 379bcb0..602b58e 100644
+--- a/sound/drivers/Kconfig
++++ b/sound/drivers/Kconfig
+@@ -5,9 +5,10 @@ menu "Generic devices"
+ 
+ 
+ config SND_PCSP
+-	tristate "PC-Speaker support"
++	tristate "PC-Speaker support (READ HELP!)"
+ 	depends on PCSPKR_PLATFORM && X86_PC && HIGH_RES_TIMERS
+ 	depends on INPUT
++	depends on EXPERIMENTAL
+ 	depends on SND
+ 	select SND_PCM
+ 	help
+@@ -18,11 +19,21 @@ config SND_PCSP
+ 
+ 	  You can compile this as a module which will be called snd-pcsp.
+ 
++	  WARNING: if you already have a soundcard, enabling this
++	  driver may lead to a problem. Namely, it may get loaded
++	  before the other sound driver of yours, making the
++	  pc-speaker a default sound device. Which is likely not
++	  what you want. To make this driver play nicely with other
++	  sound driver, you can add this into your /etc/modprobe.conf:
++	  options snd-pcsp index=2
++
+ 	  You don't need this driver if you only want your pc-speaker to beep.
+ 	  You don't need this driver if you have a tablet piezo beeper
+ 	  in your PC instead of the real speaker.
+ 
+-	  It should not hurt to say Y or M here in all other cases.
++	  Say N if you have a sound card.
++	  Say M if you don't.
++	  Say Y only if you really know what you do.
+ 
+ config SND_MPU401_UART
+         tristate
+diff --git a/sound/drivers/pcsp/pcsp.c b/sound/drivers/pcsp/pcsp.c
+index 54a1f90..1899cf0 100644
+--- a/sound/drivers/pcsp/pcsp.c
++++ b/sound/drivers/pcsp/pcsp.c
+@@ -96,7 +96,7 @@ static int __devinit snd_card_pcsp_probe(int devnum, struct device *dev)
+ 		return -EINVAL;
+ 
+ 	hrtimer_init(&pcsp_chip.timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
+-	pcsp_chip.timer.cb_mode = HRTIMER_CB_IRQSAFE;
++	pcsp_chip.timer.cb_mode = HRTIMER_CB_SOFTIRQ;
+ 	pcsp_chip.timer.function = pcsp_do_timer;
+ 
+ 	card = snd_card_new(index, id, THIS_MODULE, 0);
+diff --git a/sound/drivers/pcsp/pcsp_lib.c b/sound/drivers/pcsp/pcsp_lib.c
+index ac6238e..e341f3f 100644
+--- a/sound/drivers/pcsp/pcsp_lib.c
++++ b/sound/drivers/pcsp/pcsp_lib.c
+@@ -9,7 +9,6 @@
+ #include <linux/module.h>
+ #include <linux/moduleparam.h>
+ #include <sound/pcm.h>
+-#include <linux/interrupt.h>
+ #include <asm/io.h>
+ #include "pcsp.h"
+ 
+@@ -18,36 +17,12 @@ module_param(nforce_wa, bool, 0444);
+ MODULE_PARM_DESC(nforce_wa, "Apply NForce chipset workaround "
+ 		"(expect bad sound)");
+ 
+-static void pcsp_start_timer(unsigned long dummy)
+-{
+-	hrtimer_start(&pcsp_chip.timer, ktime_set(0, 0), HRTIMER_MODE_REL);
+-}
+-
+-/*
+- * We need the hrtimer_start as a tasklet to avoid
+- * the nasty locking problem. :(
+- * The problem:
+- * - The timer handler is called with the cpu_base->lock
+- *   already held by hrtimer code.
+- * - snd_pcm_period_elapsed() takes the
+- *   substream->self_group.lock.
+- * So far so good.
+- * But the snd_pcsp_trigger() is called with the
+- * substream->self_group.lock held, and it calls
+- * hrtimer_start(), which takes the cpu_base->lock.
+- * You see the problem. We have the code pathes
+- * which take two locks in a reverse order. This
+- * can deadlock and the lock validator complains.
+- * The only solution I could find was to move the
+- * hrtimer_start() into a tasklet. -stsp
+- */
+-static DECLARE_TASKLET(pcsp_start_timer_tasklet, pcsp_start_timer, 0);
++#define DMIX_WANTS_S16	1
+ 
+ enum hrtimer_restart pcsp_do_timer(struct hrtimer *handle)
+ {
+-	unsigned long flags;
+ 	unsigned char timer_cnt, val;
+-	int periods_elapsed;
++	int fmt_size, periods_elapsed;
+ 	u64 ns;
+ 	size_t period_bytes, buffer_bytes;
+ 	struct snd_pcm_substream *substream;
+@@ -64,9 +39,7 @@ enum hrtimer_restart pcsp_do_timer(struct hrtimer *handle)
+ 		return HRTIMER_RESTART;
+ 	}
+ 
+-	/* hrtimer calls us from both hardirq and softirq contexts,
+-	 * so irqsave :( */
+-	spin_lock_irqsave(&chip->substream_lock, flags);
++	spin_lock_irq(&chip->substream_lock);
+ 	/* Takashi Iwai says regarding this extra lock:
+ 
+ 	If the irq handler handles some data on the DMA buffer, it should
+@@ -92,8 +65,11 @@ enum hrtimer_restart pcsp_do_timer(struct hrtimer *handle)
+ 		goto exit_nr_unlock2;
+ 
+ 	runtime = substream->runtime;
+-	/* assume it is u8 mono */
+-	val = runtime->dma_area[chip->playback_ptr];
++	fmt_size = snd_pcm_format_physical_width(runtime->format) >> 3;
++	/* assume it is mono! */
++	val = runtime->dma_area[chip->playback_ptr + fmt_size - 1];
++	if (snd_pcm_format_signed(runtime->format))
++		val ^= 0x80;
+ 	timer_cnt = val * CUR_DIV() / 256;
+ 
+ 	if (timer_cnt && chip->enable) {
+@@ -111,12 +87,14 @@ enum hrtimer_restart pcsp_do_timer(struct hrtimer *handle)
+ 
+ 	period_bytes = snd_pcm_lib_period_bytes(substream);
+ 	buffer_bytes = snd_pcm_lib_buffer_bytes(substream);
+-	chip->playback_ptr += PCSP_INDEX_INC();
++	chip->playback_ptr += PCSP_INDEX_INC() * fmt_size;
+ 	periods_elapsed = chip->playback_ptr - chip->period_ptr;
+ 	if (periods_elapsed < 0) {
+-		printk(KERN_WARNING "PCSP: playback_ptr inconsistent "
++#if PCSP_DEBUG
++		printk(KERN_INFO "PCSP: buffer_bytes mod period_bytes != 0 ? "
+ 			"(%zi %zi %zi)\n",
+ 			chip->playback_ptr, period_bytes, buffer_bytes);
++#endif
+ 		periods_elapsed += buffer_bytes;
+ 	}
+ 	periods_elapsed /= period_bytes;
+@@ -132,7 +110,7 @@ enum hrtimer_restart pcsp_do_timer(struct hrtimer *handle)
+ 		chip->period_ptr %= buffer_bytes;
+ 	}
+ 
+-	spin_unlock_irqrestore(&chip->substream_lock, flags);
++	spin_unlock_irq(&chip->substream_lock);
+ 
+ 	if (!atomic_read(&chip->timer_active))
+ 		return HRTIMER_NORESTART;
+@@ -146,7 +124,7 @@ enum hrtimer_restart pcsp_do_timer(struct hrtimer *handle)
+ exit_nr_unlock2:
+ 	snd_pcm_stream_unlock(substream);
+ exit_nr_unlock1:
+-	spin_unlock_irqrestore(&chip->substream_lock, flags);
++	spin_unlock_irq(&chip->substream_lock);
+ 	return HRTIMER_NORESTART;
+ }
+ 
+@@ -167,7 +145,7 @@ static void pcsp_start_playing(struct snd_pcsp *chip)
+ 	atomic_set(&chip->timer_active, 1);
+ 	chip->thalf = 0;
+ 
+-	tasklet_schedule(&pcsp_start_timer_tasklet);
++	hrtimer_start(&pcsp_chip.timer, ktime_set(0, 0), HRTIMER_MODE_REL);
+ }
+ 
+ static void pcsp_stop_playing(struct snd_pcsp *chip)
+@@ -270,7 +248,11 @@ static struct snd_pcm_hardware snd_pcsp_playback = {
+ 	.info = (SNDRV_PCM_INFO_INTERLEAVED |
+ 		 SNDRV_PCM_INFO_HALF_DUPLEX |
+ 		 SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_MMAP_VALID),
+-	.formats = SNDRV_PCM_FMTBIT_U8,
++	.formats = (SNDRV_PCM_FMTBIT_U8
++#if DMIX_WANTS_S16
++		    | SNDRV_PCM_FMTBIT_S16_LE
++#endif
++	    ),
+ 	.rates = SNDRV_PCM_RATE_KNOT,
+ 	.rate_min = PCSP_DEFAULT_SRATE,
+ 	.rate_max = PCSP_DEFAULT_SRATE,
+diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
+index 6d4df45..864b2f5 100644
+--- a/sound/pci/hda/patch_realtek.c
++++ b/sound/pci/hda/patch_realtek.c
+@@ -2981,7 +2981,7 @@ static struct snd_pci_quirk alc880_cfg_tbl[] = {
+ 	/* SND_PCI_QUIRK(0x1043, 0x1964, "ASUS", ALC880_ASUS_DIG), */
+ 	SND_PCI_QUIRK(0x1043, 0x1973, "ASUS", ALC880_ASUS_DIG),
+ 	SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS", ALC880_ASUS_DIG),
+-	SND_PCI_QUIRK(0x1043, 0x814e, "ASUS", ALC880_ASUS),
++	SND_PCI_QUIRK(0x1043, 0x814e, "ASUS P5GD1 w/SPDIF", ALC880_6ST_DIG),
+ 	SND_PCI_QUIRK(0x1043, 0x8181, "ASUS P4GPL", ALC880_ASUS_DIG),
+ 	SND_PCI_QUIRK(0x1043, 0x8196, "ASUS P5GD1", ALC880_6ST),
+ 	SND_PCI_QUIRK(0x1043, 0x81b4, "ASUS", ALC880_6ST),
+@@ -8757,35 +8757,39 @@ static struct hda_input_mux alc262_HP_D7000_capture_source = {
+ 	},
+ };
+ 
+-/* mute/unmute internal speaker according to the hp jack and mute state */
++/* mute/unmute internal speaker according to the hp jacks and mute state */
+ static void alc262_fujitsu_automute(struct hda_codec *codec, int force)
+ {
+ 	struct alc_spec *spec = codec->spec;
+ 	unsigned int mute;
+ 
+ 	if (force || !spec->sense_updated) {
+-		unsigned int present_int_hp, present_dock_hp;
++		unsigned int present;
+ 		/* need to execute and sync at first */
+ 		snd_hda_codec_read(codec, 0x14, 0, AC_VERB_SET_PIN_SENSE, 0);
+-		present_int_hp = snd_hda_codec_read(codec, 0x14, 0,
+-					AC_VERB_GET_PIN_SENSE, 0);
+-		snd_hda_codec_read(codec, 0x1B, 0, AC_VERB_SET_PIN_SENSE, 0);
+-		present_dock_hp = snd_hda_codec_read(codec, 0x1b, 0,
+-					AC_VERB_GET_PIN_SENSE, 0);
+-		spec->jack_present = (present_int_hp & 0x80000000) != 0;
+-		spec->jack_present |= (present_dock_hp & 0x80000000) != 0;
++		/* check laptop HP jack */
++		present = snd_hda_codec_read(codec, 0x14, 0,
++					     AC_VERB_GET_PIN_SENSE, 0);
++		/* need to execute and sync at first */
++		snd_hda_codec_read(codec, 0x1b, 0, AC_VERB_SET_PIN_SENSE, 0);
++		/* check docking HP jack */
++		present |= snd_hda_codec_read(codec, 0x1b, 0,
++					      AC_VERB_GET_PIN_SENSE, 0);
++		if (present & AC_PINSENSE_PRESENCE)
++			spec->jack_present = 1;
++		else
++			spec->jack_present = 0;
+ 		spec->sense_updated = 1;
+ 	}
+-	if (spec->jack_present) {
+-		/* mute internal speaker */
+-		snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
+-					 HDA_AMP_MUTE, HDA_AMP_MUTE);
+-	} else {
+-		/* unmute internal speaker if necessary */
++	/* unmute internal speaker only if both HPs are unplugged and
++	 * master switch is on
++	 */
++	if (spec->jack_present)
++		mute = HDA_AMP_MUTE;
++	else
+ 		mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0);
+-		snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
+-					 HDA_AMP_MUTE, mute);
+-	}
++	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
++				 HDA_AMP_MUTE, mute);
+ }
+ 
+ /* unsolicited event for HP jack sensing */
+@@ -8797,6 +8801,11 @@ static void alc262_fujitsu_unsol_event(struct hda_codec *codec,
+ 	alc262_fujitsu_automute(codec, 1);
+ }
+ 
++static void alc262_fujitsu_init_hook(struct hda_codec *codec)
++{
++	alc262_fujitsu_automute(codec, 1);
++}
++
+ /* bind volumes of both NID 0x0c and 0x0d */
+ static struct hda_bind_ctls alc262_fujitsu_bind_master_vol = {
+ 	.ops = &snd_hda_bind_vol,
+@@ -9570,6 +9579,7 @@ static struct alc_config_preset alc262_presets[] = {
+ 		.channel_mode = alc262_modes,
+ 		.input_mux = &alc262_fujitsu_capture_source,
+ 		.unsol_event = alc262_fujitsu_unsol_event,
++		.init_hook = alc262_fujitsu_init_hook,
+ 	},
+ 	[ALC262_HP_BPC] = {
+ 		.mixers = { alc262_HP_BPC_mixer },
+diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
+index f7ba099..2d29e26 100644
+--- a/virt/kvm/kvm_main.c
++++ b/virt/kvm/kvm_main.c
+@@ -758,25 +758,26 @@ void mark_page_dirty(struct kvm *kvm, gfn_t gfn)
+  */
+ void kvm_vcpu_block(struct kvm_vcpu *vcpu)
+ {
+-	DECLARE_WAITQUEUE(wait, current);
+-
+-	add_wait_queue(&vcpu->wq, &wait);
+-
+-	/*
+-	 * We will block until either an interrupt or a signal wakes us up
+-	 */
+-	while (!kvm_cpu_has_interrupt(vcpu)
+-	       && !kvm_cpu_has_pending_timer(vcpu)
+-	       && !signal_pending(current)
+-	       && !kvm_arch_vcpu_runnable(vcpu)) {
+-		set_current_state(TASK_INTERRUPTIBLE);
++	DEFINE_WAIT(wait);
++
++	for (;;) {
++		prepare_to_wait(&vcpu->wq, &wait, TASK_INTERRUPTIBLE);
++
++		if (kvm_cpu_has_interrupt(vcpu))
++			break;
++		if (kvm_cpu_has_pending_timer(vcpu))
++			break;
++		if (kvm_arch_vcpu_runnable(vcpu))
++			break;
++		if (signal_pending(current))
++			break;
++
+ 		vcpu_put(vcpu);
+ 		schedule();
+ 		vcpu_load(vcpu);
+ 	}
+ 
+-	__set_current_state(TASK_RUNNING);
+-	remove_wait_queue(&vcpu->wq, &wait);
++	finish_wait(&vcpu->wq, &wait);
+ }
+ 
+ void kvm_resched(struct kvm_vcpu *vcpu)

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	Wed May 21 11:03:47 2008
@@ -1,4 +1,4 @@
-#+ bugfix/all/patch-2.6.26-rc2-git4
++ bugfix/all/patch-2.6.26-rc3-git3
 + debian/version.patch
 + debian/kernelvariables.patch
 + debian/doc-build-parallel.patch
@@ -15,7 +15,7 @@
 #+ bugfix/powerpc/mv643xx-hotplug-support.patch
 + bugfix/powerpc/oldworld-boot-fix.patch
 + bugfix/powerpc/prep-utah-ide-interrupt.patch
-+ bugfix/powerpc/serial.patch
+#+ bugfix/powerpc/serial.patch
 + bugfix/sparc/drivers_net-broken.patch
 + bugfix/ia64/hardcode-arch-script-output.patch
 + bugfix/mips/disable-advansys.patch



More information about the Kernel-svn-changes mailing list