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

Maximilian Attems maks at alioth.debian.org
Thu Mar 20 11:58:34 UTC 2008


Author: maks
Date: Thu Mar 20 11:58:33 2008
New Revision: 10926

Log:
update to 2.6.25-rc6-git4

no conflicts


Added:
   dists/trunk/linux-2.6/debian/patches/bugfix/all/patch-2.6.25-rc6-git4
Removed:
   dists/trunk/linux-2.6/debian/patches/bugfix/all/patch-2.6.25-rc6-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.25-rc6-git4
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/bugfix/all/patch-2.6.25-rc6-git4	Thu Mar 20 11:58:33 2008
@@ -0,0 +1,12795 @@
+diff --git a/Documentation/fb/cmap_xfbdev.txt b/Documentation/fb/cmap_xfbdev.txt
+new file mode 100644
+index 0000000..55e1f0a
+--- /dev/null
++++ b/Documentation/fb/cmap_xfbdev.txt
+@@ -0,0 +1,53 @@
++Understanding fbdev's cmap
++--------------------------
++
++These notes explain how X's dix layer uses fbdev's cmap structures.
++
++*. example of relevant structures in fbdev as used for a 3-bit grayscale cmap
++struct fb_var_screeninfo {
++        .bits_per_pixel = 8,
++        .grayscale      = 1,
++        .red =          { 4, 3, 0 },
++        .green =        { 0, 0, 0 },
++        .blue =         { 0, 0, 0 },
++}
++struct fb_fix_screeninfo {
++        .visual =       FB_VISUAL_STATIC_PSEUDOCOLOR,
++}
++for (i = 0; i < 8; i++)
++	info->cmap.red[i] = (((2*i)+1)*(0xFFFF))/16;
++memcpy(info->cmap.green, info->cmap.red, sizeof(u16)*8);
++memcpy(info->cmap.blue, info->cmap.red, sizeof(u16)*8);
++
++*. X11 apps do something like the following when trying to use grayscale.
++for (i=0; i < 8; i++) {
++	char colorspec[64];
++	memset(colorspec,0,64);
++	sprintf(colorspec, "rgb:%x/%x/%x", i*36,i*36,i*36);
++	if (!XParseColor(outputDisplay, testColormap, colorspec, &wantedColor))
++		printf("Can't get color %s\n",colorspec);
++	XAllocColor(outputDisplay, testColormap, &wantedColor);
++	grays[i] = wantedColor;
++}
++There's also named equivalents like gray1..x provided you have an rgb.txt.
++
++Somewhere in X's callchain, this results in a call to X code that handles the
++colormap. For example, Xfbdev hits the following:
++
++xc-011010/programs/Xserver/dix/colormap.c:
++
++FindBestPixel(pentFirst, size, prgb, channel)
++
++dr = (long) pent->co.local.red - prgb->red;
++dg = (long) pent->co.local.green - prgb->green;
++db = (long) pent->co.local.blue - prgb->blue;
++sq = dr * dr;
++UnsignedToBigNum (sq, &sum);
++BigNumAdd (&sum, &temp, &sum);
++
++co.local.red are entries that were brought in through FBIOGETCMAP which come
++directly from the info->cmap.red that was listed above. The prgb is the rgb
++that the app wants to match to. The above code is doing what looks like a least
++squares matching function. That's why the cmap entries can't be set to the left
++hand side boundaries of a color range.
++
+diff --git a/Documentation/fb/metronomefb.txt b/Documentation/fb/metronomefb.txt
+new file mode 100644
+index 0000000..b9a2e7b
+--- /dev/null
++++ b/Documentation/fb/metronomefb.txt
+@@ -0,0 +1,38 @@
++			Metronomefb
++			-----------
++Maintained by Jaya Kumar <jayakumar.lkml.gmail.com>
++Last revised: Nov 20, 2007
++
++Metronomefb is a driver for the Metronome display controller. The controller
++is from E-Ink Corporation. It is intended to be used to drive the E-Ink
++Vizplex display media. E-Ink hosts some details of this controller and the
++display media here http://www.e-ink.com/products/matrix/metronome.html .
++
++Metronome is interfaced to the host CPU through the AMLCD interface. The
++host CPU generates the control information and the image in a framebuffer
++which is then delivered to the AMLCD interface by a host specific method.
++Currently, that's implemented for the PXA's LCDC controller. The display and
++error status are each pulled through individual GPIOs.
++
++Metronomefb was written for the PXA255/gumstix/lyre combination and
++therefore currently has board set specific code in it. If other boards based on
++other architectures are available, then the host specific code can be separated
++and abstracted out.
++
++Metronomefb requires waveform information which is delivered via the AMLCD
++interface to the metronome controller. The waveform information is expected to
++be delivered from userspace via the firmware class interface. The waveform file
++can be compressed as long as your udev or hotplug script is aware of the need
++to uncompress it before delivering it. metronomefb will ask for waveform.wbf
++which would typically go into /lib/firmware/waveform.wbf depending on your
++udev/hotplug setup. I have only tested with a single waveform file which was
++originally labeled 23P01201_60_WT0107_MTC. I do not know what it stands for.
++Caution should be exercised when manipulating the waveform as there may be
++a possibility that it could have some permanent effects on the display media.
++I neither have access to nor know exactly what the waveform does in terms of
++the physical media.
++
++Metronomefb uses the deferred IO interface so that it can provide a memory
++mappable frame buffer. It has been tested with tinyx (Xfbdev). It is known
++to work at this time with xeyes, xclock, xloadimage, xpdf.
++
+diff --git a/Documentation/input/notifier.txt b/Documentation/input/notifier.txt
+new file mode 100644
+index 0000000..95172ca
+--- /dev/null
++++ b/Documentation/input/notifier.txt
+@@ -0,0 +1,52 @@
++Keyboard notifier
++
++One can use register_keyboard_notifier to get called back on keyboard
++events (see kbd_keycode() function for details).  The passed structure is
++keyboard_notifier_param:
++
++- 'vc' always provide the VC for which the keyboard event applies;
++- 'down' is 1 for a key press event, 0 for a key release;
++- 'shift' is the current modifier state, mask bit indexes are KG_*;
++- 'value' depends on the type of event.
++
++- KBD_KEYCODE events are always sent before other events, value is the keycode.
++- KBD_UNBOUND_KEYCODE events are sent if the keycode is not bound to a keysym.
++  value is the keycode.
++- KBD_UNICODE events are sent if the keycode -> keysym translation produced a
++  unicode character. value is the unicode value.
++- KBD_KEYSYM events are sent if the keycode -> keysym translation produced a
++  non-unicode character. value is the keysym.
++- KBD_POST_KEYSYM events are sent after the treatment of non-unicode keysyms.
++  That permits one to inspect the resulting LEDs for instance.
++
++For each kind of event but the last, the callback may return NOTIFY_STOP in
++order to "eat" the event: the notify loop is stopped and the keyboard event is
++dropped.
++
++In a rough C snippet, we have:
++
++kbd_keycode(keycode) {
++	...
++	params.value = keycode;
++	if (notifier_call_chain(KBD_KEYCODE,&params) == NOTIFY_STOP)
++	    || !bound) {
++		notifier_call_chain(KBD_UNBOUND_KEYCODE,&params);
++		return;
++	}
++
++	if (unicode) {
++		param.value = unicode;
++		if (notifier_call_chain(KBD_UNICODE,&params) == NOTIFY_STOP)
++			return;
++		emit unicode;
++		return;
++	}
++
++	params.value = keysym;
++	if (notifier_call_chain(KBD_KEYSYM,&params) == NOTIFY_STOP)
++		return;
++	apply keysym;
++	notifier_call_chain(KBD_POST_KEYSYM,&params);
++}
++
++NOTE: This notifier is usually called from interrupt context.
+diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
+index 622f784..650b0d8 100644
+--- a/Documentation/kernel-parameters.txt
++++ b/Documentation/kernel-parameters.txt
+@@ -732,6 +732,8 @@ and is between 256 and 4096 characters. It is defined in the file
+ 			     (Don't attempt to blink the leds)
+ 	i8042.noaux	[HW] Don't check for auxiliary (== mouse) port
+ 	i8042.nokbd	[HW] Don't check/create keyboard port
++	i8042.noloop	[HW] Disable the AUX Loopback command while probing
++			     for the AUX port
+ 	i8042.nomux	[HW] Don't check presence of an active multiplexing
+ 			     controller
+ 	i8042.nopnp	[HW] Don't use ACPIPnP / PnPBIOS to discover KBD/AUX
+diff --git a/Documentation/mca.txt b/Documentation/mca.txt
+index aabce4a..510375d 100644
+--- a/Documentation/mca.txt
++++ b/Documentation/mca.txt
+@@ -143,14 +143,7 @@ MCA Device Drivers
+ 
+ Currently, there are a number of MCA-specific device drivers.
+ 
+-1) PS/2 ESDI
+-	drivers/block/ps2esdi.c
+-	include/linux/ps2esdi.h
+-   Uses major number 36, and should use /dev files /dev/eda, /dev/edb.
+-   Supports two drives, but only one controller.  May use the
+-   command-line args "ed=cyl,head,sec" and "tp720".
+-
+-2) PS/2 SCSI
++1) PS/2 SCSI
+ 	drivers/scsi/ibmmca.c
+ 	drivers/scsi/ibmmca.h
+    The driver for the IBM SCSI subsystem.  Includes both integrated
+@@ -159,25 +152,25 @@ Currently, there are a number of MCA-specific device drivers.
+    machine with a front-panel display (i.e. model 95), you can use
+    "ibmmcascsi=display" to enable a drive activity indicator.
+ 
+-3) 3c523
++2) 3c523
+ 	drivers/net/3c523.c
+ 	drivers/net/3c523.h
+    3Com 3c523 Etherlink/MC ethernet driver.
+ 
+-4) SMC Ultra/MCA and IBM Adapter/A
++3) SMC Ultra/MCA and IBM Adapter/A
+ 	drivers/net/smc-mca.c
+ 	drivers/net/smc-mca.h
+ 	Driver for the MCA version of the SMC Ultra and various other
+ 	OEM'ed and work-alike cards (Elite, Adapter/A, etc).
+ 
+-5) NE/2
++4) NE/2
+ 	driver/net/ne2.c
+ 	driver/net/ne2.h
+ 	The NE/2 is the MCA version of the NE2000.  This may not work
+ 	with clones that have a different adapter id than the original
+ 	NE/2.
+ 
+-6) Future Domain MCS-600/700, OEM'd IBM Fast SCSI Adapter/A and
++5) Future Domain MCS-600/700, OEM'd IBM Fast SCSI Adapter/A and
+    Reply Sound Blaster/SCSI (SCSI part)
+ 	Better support for these cards than the driver for ISA.
+    Supports multiple cards with IRQ sharing.
+diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile
+index 4974d9e..1aded8f 100644
+--- a/arch/powerpc/boot/Makefile
++++ b/arch/powerpc/boot/Makefile
+@@ -253,8 +253,8 @@ image-$(CONFIG_TQM8540)			+= cuImage.tqm8540
+ image-$(CONFIG_TQM8541)			+= cuImage.tqm8541
+ image-$(CONFIG_TQM8555)			+= cuImage.tqm8555
+ image-$(CONFIG_TQM8560)			+= cuImage.tqm8560
+-image-$(CONFIG_SBC8548)			+= cuImage.tqm8548
+-image-$(CONFIG_SBC8560)			+= cuImage.tqm8560
++image-$(CONFIG_SBC8548)			+= cuImage.sbc8548
++image-$(CONFIG_SBC8560)			+= cuImage.sbc8560
+ 
+ # Board ports in arch/powerpc/platform/embedded6xx/Kconfig
+ image-$(CONFIG_STORCENTER)		+= cuImage.storcenter
+diff --git a/arch/powerpc/boot/wrapper b/arch/powerpc/boot/wrapper
+index d50e498..8f8b849 100755
+--- a/arch/powerpc/boot/wrapper
++++ b/arch/powerpc/boot/wrapper
+@@ -174,10 +174,10 @@ cuboot*)
+     *-mpc83*)
+         platformo=$object/cuboot-83xx.o
+         ;;
+-    *-tqm8541|*-mpc8560*|*-tqm8560|*-tqm8555*)
++    *-tqm8541|*-mpc8560*|*-tqm8560|*-tqm8555)
+         platformo=$object/cuboot-85xx-cpm2.o
+         ;;
+-    *-mpc85*)
++    *-mpc85*|*-tqm8540|*-sbc85*)
+         platformo=$object/cuboot-85xx.o
+         ;;
+     esac
+diff --git a/arch/powerpc/configs/cell_defconfig b/arch/powerpc/configs/cell_defconfig
+index f3bde8c..c420e47 100644
+--- a/arch/powerpc/configs/cell_defconfig
++++ b/arch/powerpc/configs/cell_defconfig
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.24-rc4
+-# Thu Dec  6 16:48:05 2007
++# Linux kernel version: 2.6.25-rc6
++# Thu Mar 20 10:31:04 2008
+ #
+ CONFIG_PPC64=y
+ 
+@@ -28,6 +28,7 @@ CONFIG_GENERIC_TIME=y
+ CONFIG_GENERIC_TIME_VSYSCALL=y
+ CONFIG_GENERIC_CLOCKEVENTS=y
+ CONFIG_GENERIC_HARDIRQS=y
++CONFIG_HAVE_SETUP_PER_CPU_AREA=y
+ CONFIG_IRQ_PER_CPU=y
+ CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+ CONFIG_ARCH_HAS_ILOG2_U32=y
+@@ -69,8 +70,6 @@ CONFIG_SYSVIPC_SYSCTL=y
+ # CONFIG_POSIX_MQUEUE is not set
+ # CONFIG_BSD_PROCESS_ACCT is not set
+ # CONFIG_TASKSTATS 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
+@@ -79,13 +78,20 @@ CONFIG_CGROUPS=y
+ # CONFIG_CGROUP_DEBUG is not set
+ # CONFIG_CGROUP_NS is not set
+ CONFIG_CPUSETS=y
+-CONFIG_FAIR_GROUP_SCHED=y
+-CONFIG_FAIR_USER_SCHED=y
+-# CONFIG_FAIR_CGROUP_SCHED is not set
++# CONFIG_GROUP_SCHED is not set
++# CONFIG_USER_SCHED is not set
++# CONFIG_CGROUP_SCHED is not set
+ # CONFIG_CGROUP_CPUACCT is not set
++# CONFIG_RESOURCE_COUNTERS is not set
+ CONFIG_SYSFS_DEPRECATED=y
++CONFIG_SYSFS_DEPRECATED_V2=y
+ CONFIG_PROC_PID_CPUSET=y
+ # CONFIG_RELAY is not set
++CONFIG_NAMESPACES=y
++# CONFIG_UTS_NS is not set
++# CONFIG_IPC_NS is not set
++# CONFIG_USER_NS is not set
++# CONFIG_PID_NS is not set
+ CONFIG_BLK_DEV_INITRD=y
+ CONFIG_INITRAMFS_SOURCE=""
+ CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+@@ -99,11 +105,13 @@ CONFIG_HOTPLUG=y
+ CONFIG_PRINTK=y
+ CONFIG_BUG=y
+ CONFIG_ELF_CORE=y
++# CONFIG_COMPAT_BRK is not set
+ CONFIG_BASE_FULL=y
+ CONFIG_FUTEX=y
+ CONFIG_ANON_INODES=y
+ CONFIG_EPOLL=y
+ CONFIG_SIGNALFD=y
++CONFIG_TIMERFD=y
+ CONFIG_EVENTFD=y
+ CONFIG_SHMEM=y
+ CONFIG_VM_EVENT_COUNTERS=y
+@@ -111,6 +119,15 @@ CONFIG_SLUB_DEBUG=y
+ # CONFIG_SLAB is not set
+ CONFIG_SLUB=y
+ # CONFIG_SLOB is not set
++CONFIG_PROFILING=y
++# CONFIG_MARKERS is not set
++CONFIG_OPROFILE=m
++CONFIG_HAVE_OPROFILE=y
++# CONFIG_KPROBES is not set
++CONFIG_HAVE_KPROBES=y
++CONFIG_HAVE_KRETPROBES=y
++CONFIG_PROC_PAGE_MONITOR=y
++CONFIG_SLABINFO=y
+ CONFIG_RT_MUTEXES=y
+ # CONFIG_TINY_SHMEM is not set
+ CONFIG_BASE_SMALL=0
+@@ -138,6 +155,7 @@ CONFIG_DEFAULT_AS=y
+ # CONFIG_DEFAULT_CFQ is not set
+ # CONFIG_DEFAULT_NOOP is not set
+ CONFIG_DEFAULT_IOSCHED="anticipatory"
++CONFIG_CLASSIC_RCU=y
+ 
+ #
+ # Platform support
+@@ -148,8 +166,8 @@ CONFIG_PPC_MULTIPLATFORM=y
+ # CONFIG_PPC_86xx is not set
+ # CONFIG_PPC_PSERIES is not set
+ # CONFIG_PPC_ISERIES is not set
+-# CONFIG_PPC_MPC52xx is not set
+-# CONFIG_PPC_MPC5200 is not set
++# CONFIG_PPC_MPC512x is not set
++# CONFIG_PPC_MPC5121 is not set
+ # CONFIG_PPC_PMAC is not set
+ # CONFIG_PPC_MAPLE is not set
+ # CONFIG_PPC_PASEMI is not set
+@@ -162,14 +180,14 @@ CONFIG_PPC_PS3=y
+ # CONFIG_PS3_ADVANCED is not set
+ CONFIG_PS3_HTAB_SIZE=20
+ # CONFIG_PS3_DYNAMIC_DMA is not set
+-CONFIG_PS3_USE_LPAR_ADDR=y
+ CONFIG_PS3_VUART=y
+ CONFIG_PS3_PS3AV=y
+-CONFIG_PS3_SYS_MANAGER=m
++CONFIG_PS3_SYS_MANAGER=y
+ CONFIG_PS3_STORAGE=y
+ CONFIG_PS3_DISK=y
+ CONFIG_PS3_ROM=m
+ CONFIG_PS3_FLASH=m
++CONFIG_PS3_LPM=m
+ CONFIG_PPC_CELL=y
+ CONFIG_PPC_CELL_NATIVE=y
+ CONFIG_PPC_IBM_CELL_BLADE=y
+@@ -183,10 +201,12 @@ CONFIG_CBE_RAS=y
+ CONFIG_CBE_THERM=m
+ CONFIG_CBE_CPUFREQ=m
+ CONFIG_CBE_CPUFREQ_PMI=m
++CONFIG_OPROFILE_CELL=y
+ # CONFIG_PQ2ADS is not set
+ CONFIG_PPC_NATIVE=y
+ CONFIG_UDBG_RTAS_CONSOLE=y
+ CONFIG_PPC_UDBG_BEAT=y
++# CONFIG_IPIC is not set
+ CONFIG_MPIC=y
+ # CONFIG_MPIC_WEIRD is not set
+ # CONFIG_PPC_I8259 is not set
+@@ -219,7 +239,6 @@ CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
+ #
+ # CPU Frequency drivers
+ #
+-# CONFIG_CPM2 is not set
+ CONFIG_AXON_RAM=m
+ # CONFIG_FSL_ULI1575 is not set
+ 
+@@ -235,16 +254,20 @@ CONFIG_HZ_250=y
+ # CONFIG_HZ_300 is not set
+ # CONFIG_HZ_1000 is not set
+ CONFIG_HZ=250
++# CONFIG_SCHED_HRTICK is not set
+ CONFIG_PREEMPT_NONE=y
+ # CONFIG_PREEMPT_VOLUNTARY is not set
+ # CONFIG_PREEMPT is not set
+-CONFIG_PREEMPT_BKL=y
+ CONFIG_BINFMT_ELF=y
++CONFIG_COMPAT_BINFMT_ELF=y
+ CONFIG_BINFMT_MISC=m
+ CONFIG_FORCE_MAX_ZONEORDER=9
+ CONFIG_HUGETLB_PAGE_SIZE_VARIABLE=y
+ # CONFIG_IOMMU_VMERGE is not set
++CONFIG_IOMMU_HELPER=y
+ CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
++CONFIG_ARCH_HAS_WALK_MEMORY=y
++CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
+ # CONFIG_KEXEC is not set
+ # CONFIG_CRASH_DUMP is not set
+ CONFIG_IRQ_ALL_CPUS=y
+@@ -267,6 +290,7 @@ CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
+ CONFIG_SPARSEMEM_VMEMMAP=y
+ CONFIG_MEMORY_HOTPLUG=y
+ CONFIG_MEMORY_HOTPLUG_SPARSE=y
++CONFIG_MEMORY_HOTREMOVE=y
+ CONFIG_SPLIT_PTLOCK_CPUS=4
+ CONFIG_MIGRATION=y
+ CONFIG_RESOURCES_64BIT=y
+@@ -276,12 +300,12 @@ CONFIG_ARCH_MEMORY_PROBE=y
+ CONFIG_NODES_SPAN_OTHER_NODES=y
+ CONFIG_PPC_HAS_HASH_64K=y
+ CONFIG_PPC_64K_PAGES=y
++# CONFIG_PPC_SUBPAGE_PROT is not set
+ CONFIG_SCHED_SMT=y
+ CONFIG_PROC_DEVICETREE=y
+ # CONFIG_CMDLINE_BOOL is not set
+ # CONFIG_PM is not set
+ CONFIG_SECCOMP=y
+-# CONFIG_WANT_DEVICE_TREE is not set
+ CONFIG_ISA_DMA_API=y
+ 
+ #
+@@ -318,6 +342,7 @@ CONFIG_XFRM=y
+ # CONFIG_XFRM_USER is not set
+ # CONFIG_XFRM_SUB_POLICY is not set
+ # CONFIG_XFRM_MIGRATE is not set
++# CONFIG_XFRM_STATISTICS is not set
+ # CONFIG_NET_KEY is not set
+ CONFIG_INET=y
+ CONFIG_IP_MULTICAST=y
+@@ -368,6 +393,7 @@ CONFIG_IPV6_TUNNEL=m
+ # CONFIG_NETWORK_SECMARK is not set
+ CONFIG_NETFILTER=y
+ # CONFIG_NETFILTER_DEBUG is not set
++CONFIG_NETFILTER_ADVANCED=y
+ 
+ #
+ # Core Netfilter Configuration
+@@ -375,7 +401,6 @@ CONFIG_NETFILTER=y
+ CONFIG_NETFILTER_NETLINK=m
+ CONFIG_NETFILTER_NETLINK_QUEUE=m
+ CONFIG_NETFILTER_NETLINK_LOG=m
+-# CONFIG_NF_CONNTRACK_ENABLED is not set
+ # CONFIG_NF_CONNTRACK is not set
+ CONFIG_NETFILTER_XTABLES=m
+ CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
+@@ -383,20 +408,25 @@ CONFIG_NETFILTER_XT_TARGET_DSCP=m
+ CONFIG_NETFILTER_XT_TARGET_MARK=m
+ CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
+ CONFIG_NETFILTER_XT_TARGET_NFLOG=m
++CONFIG_NETFILTER_XT_TARGET_RATEEST=m
+ # CONFIG_NETFILTER_XT_TARGET_TRACE is not set
+ CONFIG_NETFILTER_XT_TARGET_TCPMSS=m
++CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m
+ CONFIG_NETFILTER_XT_MATCH_COMMENT=m
+ CONFIG_NETFILTER_XT_MATCH_DCCP=m
+ CONFIG_NETFILTER_XT_MATCH_DSCP=m
+ CONFIG_NETFILTER_XT_MATCH_ESP=m
++CONFIG_NETFILTER_XT_MATCH_IPRANGE=m
+ CONFIG_NETFILTER_XT_MATCH_LENGTH=m
+ CONFIG_NETFILTER_XT_MATCH_LIMIT=m
+ CONFIG_NETFILTER_XT_MATCH_MAC=m
+ CONFIG_NETFILTER_XT_MATCH_MARK=m
++CONFIG_NETFILTER_XT_MATCH_OWNER=m
+ CONFIG_NETFILTER_XT_MATCH_POLICY=m
+ CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
+ CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
+ CONFIG_NETFILTER_XT_MATCH_QUOTA=m
++CONFIG_NETFILTER_XT_MATCH_RATEEST=m
+ CONFIG_NETFILTER_XT_MATCH_REALM=m
+ CONFIG_NETFILTER_XT_MATCH_SCTP=m
+ CONFIG_NETFILTER_XT_MATCH_STATISTIC=m
+@@ -411,20 +441,16 @@ CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m
+ #
+ CONFIG_IP_NF_QUEUE=m
+ CONFIG_IP_NF_IPTABLES=m
+-CONFIG_IP_NF_MATCH_IPRANGE=m
+-CONFIG_IP_NF_MATCH_TOS=m
+ CONFIG_IP_NF_MATCH_RECENT=m
+ CONFIG_IP_NF_MATCH_ECN=m
+ CONFIG_IP_NF_MATCH_AH=m
+ CONFIG_IP_NF_MATCH_TTL=m
+-CONFIG_IP_NF_MATCH_OWNER=m
+ CONFIG_IP_NF_MATCH_ADDRTYPE=m
+ CONFIG_IP_NF_FILTER=m
+ CONFIG_IP_NF_TARGET_REJECT=m
+ CONFIG_IP_NF_TARGET_LOG=m
+ CONFIG_IP_NF_TARGET_ULOG=m
+ CONFIG_IP_NF_MANGLE=m
+-CONFIG_IP_NF_TARGET_TOS=m
+ CONFIG_IP_NF_TARGET_ECN=m
+ CONFIG_IP_NF_TARGET_TTL=m
+ CONFIG_IP_NF_RAW=m
+@@ -433,7 +459,7 @@ CONFIG_IP_NF_ARPFILTER=m
+ CONFIG_IP_NF_ARP_MANGLE=m
+ 
+ #
+-# IPv6: Netfilter Configuration (EXPERIMENTAL)
++# IPv6: Netfilter Configuration
+ #
+ # CONFIG_IP6_NF_QUEUE is not set
+ # CONFIG_IP6_NF_IPTABLES is not set
+@@ -459,6 +485,7 @@ CONFIG_NET_CLS_ROUTE=y
+ #
+ # CONFIG_NET_PKTGEN is not set
+ # CONFIG_HAMRADIO is not set
++# CONFIG_CAN is not set
+ # CONFIG_IRDA is not set
+ # CONFIG_BT is not set
+ # CONFIG_AF_RXRPC is not set
+@@ -467,7 +494,7 @@ CONFIG_NET_CLS_ROUTE=y
+ # Wireless
+ #
+ # CONFIG_CFG80211 is not set
+-# CONFIG_WIRELESS_EXT is not set
++CONFIG_WIRELESS_EXT=y
+ # CONFIG_MAC80211 is not set
+ # CONFIG_IEEE80211 is not set
+ # CONFIG_RFKILL is not set
+@@ -505,7 +532,7 @@ CONFIG_BLK_DEV_LOOP=y
+ CONFIG_BLK_DEV_RAM=y
+ CONFIG_BLK_DEV_RAM_COUNT=16
+ CONFIG_BLK_DEV_RAM_SIZE=131072
+-CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
++# CONFIG_BLK_DEV_XIP is not set
+ # CONFIG_CDROM_PKTCDVD is not set
+ # CONFIG_ATA_OVER_ETH is not set
+ CONFIG_MISC_DEVICES=y
+@@ -513,11 +540,13 @@ CONFIG_MISC_DEVICES=y
+ # CONFIG_EEPROM_93CX6 is not set
+ # CONFIG_SGI_IOC4 is not set
+ # CONFIG_TIFM_CORE is not set
++# CONFIG_ENCLOSURE_SERVICES is not set
++CONFIG_HAVE_IDE=y
+ CONFIG_IDE=y
+ CONFIG_BLK_DEV_IDE=y
+ 
+ #
+-# Please see Documentation/ide.txt for help/info on IDE drives
++# Please see Documentation/ide/ide.txt for help/info on IDE drives
+ #
+ # CONFIG_BLK_DEV_IDE_SATA is not set
+ CONFIG_BLK_DEV_IDEDISK=y
+@@ -534,12 +563,12 @@ CONFIG_IDE_PROC_FS=y
+ #
+ CONFIG_IDE_GENERIC=y
+ # CONFIG_BLK_DEV_PLATFORM is not set
++CONFIG_BLK_DEV_IDEDMA_SFF=y
+ 
+ #
+ # PCI IDE chipsets support
+ #
+ CONFIG_BLK_DEV_IDEPCI=y
+-CONFIG_IDEPCI_SHARE_IRQ=y
+ CONFIG_IDEPCI_PCIBUS_ORDER=y
+ # CONFIG_BLK_DEV_OFFBOARD is not set
+ CONFIG_BLK_DEV_GENERIC=y
+@@ -571,7 +600,6 @@ CONFIG_BLK_DEV_SIIMAGE=y
+ # CONFIG_BLK_DEV_VIA82CXXX is not set
+ # CONFIG_BLK_DEV_TC86C001 is not set
+ CONFIG_BLK_DEV_CELLEB=y
+-# CONFIG_IDE_ARM is not set
+ CONFIG_BLK_DEV_IDEDMA=y
+ CONFIG_IDE_ARCH_OBSOLETE_INIT=y
+ # CONFIG_BLK_DEV_HD is not set
+@@ -637,6 +665,7 @@ CONFIG_SCSI_LOWLEVEL=y
+ # CONFIG_SCSI_IPS is not set
+ # CONFIG_SCSI_INITIO is not set
+ # CONFIG_SCSI_INIA100 is not set
++# CONFIG_SCSI_MVSAS is not set
+ # CONFIG_SCSI_STEX is not set
+ # CONFIG_SCSI_SYM53C8XX_2 is not set
+ # CONFIG_SCSI_IPR is not set
+@@ -689,6 +718,7 @@ CONFIG_SATA_PROMISE=y
+ # 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
+@@ -703,6 +733,7 @@ CONFIG_PATA_PDC2027X=m
+ # 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_PATA_SCC is not set
+ CONFIG_MD=y
+ CONFIG_BLK_DEV_MD=m
+@@ -748,7 +779,6 @@ CONFIG_MACVLAN=m
+ # CONFIG_EQUALIZER is not set
+ CONFIG_TUN=y
+ # CONFIG_VETH is not set
+-# CONFIG_IP1000 is not set
+ # CONFIG_ARCNET is not set
+ # CONFIG_PHYLIB is not set
+ CONFIG_NET_ETHERNET=y
+@@ -773,6 +803,9 @@ CONFIG_E1000=m
+ CONFIG_E1000_NAPI=y
+ # CONFIG_E1000_DISABLE_PACKET_SPLIT is not set
+ # CONFIG_E1000E is not set
++# CONFIG_E1000E_ENABLED is not set
++# CONFIG_IP1000 is not set
++# CONFIG_IGB is not set
+ # CONFIG_NS83820 is not set
+ # CONFIG_HAMACHI is not set
+ # CONFIG_YELLOWFIN is not set
+@@ -788,6 +821,7 @@ CONFIG_TIGON3=y
+ # CONFIG_BNX2 is not set
+ CONFIG_SPIDER_NET=y
+ CONFIG_GELIC_NET=m
++CONFIG_GELIC_WIRELESS=y
+ # CONFIG_QLA3XXX is not set
+ # CONFIG_ATL1 is not set
+ CONFIG_NETDEV_10000=y
+@@ -802,6 +836,7 @@ CONFIG_NETDEV_10000=y
+ # CONFIG_PASEMI_MAC is not set
+ # CONFIG_MLX4_CORE is not set
+ # CONFIG_TEHUTI is not set
++# CONFIG_BNX2X is not set
+ # CONFIG_TR is not set
+ 
+ #
+@@ -824,7 +859,6 @@ CONFIG_NETDEV_10000=y
+ # CONFIG_PPP is not set
+ # CONFIG_SLIP is not set
+ # CONFIG_NET_FC is not set
+-# CONFIG_SHAPER is not set
+ # CONFIG_NETCONSOLE is not set
+ # CONFIG_NETPOLL is not set
+ # CONFIG_NET_POLL_CONTROLLER is not set
+@@ -883,16 +917,17 @@ CONFIG_SERIAL_NONSTANDARD=y
+ # CONFIG_DIGIEPCA is not set
+ # CONFIG_MOXA_INTELLIO is not set
+ # CONFIG_MOXA_SMARTIO is not set
+-# CONFIG_MOXA_SMARTIO_NEW is not set
+ # CONFIG_ISI is not set
+ # CONFIG_SYNCLINK is not set
+ # CONFIG_SYNCLINKMP is not set
+ # CONFIG_SYNCLINK_GT is not set
+ # CONFIG_N_HDLC is not set
++# CONFIG_RISCOM8 is not set
+ # CONFIG_SPECIALIX is not set
+ # CONFIG_SX is not set
+ # CONFIG_RIO is not set
+ # CONFIG_STALDRV is not set
++# CONFIG_NOZOMI is not set
+ 
+ #
+ # Serial drivers
+@@ -976,13 +1011,12 @@ CONFIG_I2C_ALGOBIT=y
+ #
+ # Miscellaneous I2C Chip support
+ #
+-# CONFIG_SENSORS_DS1337 is not set
+-# CONFIG_SENSORS_DS1374 is not set
+ # CONFIG_DS1682 is not set
+ # CONFIG_SENSORS_EEPROM is not set
+ # CONFIG_SENSORS_PCF8574 is not set
+-# CONFIG_SENSORS_PCA9539 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
+@@ -998,6 +1032,7 @@ CONFIG_I2C_ALGOBIT=y
+ # CONFIG_W1 is not set
+ # CONFIG_POWER_SUPPLY is not set
+ # CONFIG_HWMON is not set
++# CONFIG_THERMAL is not set
+ CONFIG_WATCHDOG=y
+ # CONFIG_WATCHDOG_NOWAYOUT is not set
+ 
+@@ -1082,6 +1117,7 @@ CONFIG_USB_ARCH_HAS_OHCI=y
+ CONFIG_USB_ARCH_HAS_EHCI=y
+ CONFIG_USB=m
+ # CONFIG_USB_DEBUG is not set
++# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
+ 
+ #
+ # Miscellaneous USB options
+@@ -1095,10 +1131,10 @@ CONFIG_USB_DEVICE_CLASS=y
+ # USB Host Controller Drivers
+ #
+ CONFIG_USB_EHCI_HCD=m
+-# CONFIG_USB_EHCI_SPLIT_ISO is not set
+ # CONFIG_USB_EHCI_ROOT_HUB_TT is not set
+ # CONFIG_USB_EHCI_TT_NEWSCHED is not set
+ 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_OHCI_HCD=m
+ CONFIG_USB_OHCI_HCD_PPC_OF=y
+@@ -1149,10 +1185,6 @@ CONFIG_USB_MON=y
+ #
+ # USB port drivers
+ #
+-
+-#
+-# USB Serial Converter support
+-#
+ # CONFIG_USB_SERIAL is not set
+ 
+ #
+@@ -1178,16 +1210,9 @@ CONFIG_USB_MON=y
+ # CONFIG_USB_TRANCEVIBRATOR is not set
+ # CONFIG_USB_IOWARRIOR is not set
+ # CONFIG_USB_TEST is not set
+-
+-#
+-# USB DSL modem support
+-#
+-
+-#
+-# USB Gadget Support
+-#
+ # CONFIG_USB_GADGET is not set
+ # CONFIG_MMC is not set
++# CONFIG_MEMSTICK is not set
+ # CONFIG_NEW_LEDS is not set
+ CONFIG_INFINIBAND=m
+ CONFIG_INFINIBAND_USER_MAD=m
+@@ -1198,6 +1223,7 @@ CONFIG_INFINIBAND_MTHCA=m
+ CONFIG_INFINIBAND_MTHCA_DEBUG=y
+ # CONFIG_INFINIBAND_AMSO1100 is not set
+ # CONFIG_MLX4_INFINIBAND is not set
++# CONFIG_INFINIBAND_NES is not set
+ CONFIG_INFINIBAND_IPOIB=m
+ # CONFIG_INFINIBAND_IPOIB_CM is not set
+ CONFIG_INFINIBAND_IPOIB_DEBUG=y
+@@ -1211,7 +1237,9 @@ CONFIG_EDAC=y
+ #
+ # CONFIG_EDAC_DEBUG is not set
+ CONFIG_EDAC_MM_EDAC=y
++CONFIG_EDAC_CELL=y
+ # CONFIG_RTC_CLASS is not set
++# CONFIG_DMADEVICES is not set
+ 
+ #
+ # Userspace I/O
+@@ -1239,12 +1267,10 @@ CONFIG_FS_POSIX_ACL=y
+ # CONFIG_XFS_FS is not set
+ # CONFIG_GFS2_FS is not set
+ # CONFIG_OCFS2_FS is not set
+-# CONFIG_MINIX_FS is not set
+-# CONFIG_ROMFS_FS is not set
++CONFIG_DNOTIFY=y
+ CONFIG_INOTIFY=y
+ CONFIG_INOTIFY_USER=y
+ # CONFIG_QUOTA is not set
+-CONFIG_DNOTIFY=y
+ # CONFIG_AUTOFS_FS is not set
+ CONFIG_AUTOFS4_FS=m
+ # CONFIG_FUSE_FS is not set
+@@ -1293,8 +1319,10 @@ CONFIG_HUGETLB_PAGE=y
+ # CONFIG_EFS_FS is not set
+ # CONFIG_CRAMFS is not set
+ # CONFIG_VXFS_FS is not set
++# CONFIG_MINIX_FS is not set
+ # CONFIG_HPFS_FS is not set
+ # CONFIG_QNX4FS_FS is not set
++# CONFIG_ROMFS_FS is not set
+ # CONFIG_SYSV_FS is not set
+ # CONFIG_UFS_FS is not set
+ CONFIG_NETWORK_FILESYSTEMS=y
+@@ -1382,7 +1410,6 @@ CONFIG_NLS_ISO8859_15=m
+ # CONFIG_NLS_KOI8_U is not set
+ # CONFIG_NLS_UTF8 is not set
+ # CONFIG_DLM is not set
+-# CONFIG_UCC_SLOW is not set
+ 
+ #
+ # Library routines
+@@ -1404,11 +1431,6 @@ CONFIG_PLIST=y
+ CONFIG_HAS_IOMEM=y
+ CONFIG_HAS_IOPORT=y
+ CONFIG_HAS_DMA=y
+-CONFIG_INSTRUMENTATION=y
+-CONFIG_PROFILING=y
+-CONFIG_OPROFILE=m
+-# CONFIG_KPROBES is not set
+-# CONFIG_MARKERS is not set
+ 
+ #
+ # Kernel hacking
+@@ -1427,6 +1449,7 @@ CONFIG_SCHED_DEBUG=y
+ # CONFIG_SCHEDSTATS is not set
+ # CONFIG_TIMER_STATS 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
+@@ -1439,9 +1462,9 @@ CONFIG_DEBUG_BUGVERBOSE=y
+ # CONFIG_DEBUG_VM is not set
+ # CONFIG_DEBUG_LIST is not set
+ # CONFIG_DEBUG_SG is not set
+-# CONFIG_FORCED_INLINING is not set
+ # CONFIG_BOOT_PRINTK_DELAY is not set
+ # CONFIG_RCU_TORTURE_TEST is not set
++# CONFIG_BACKTRACE_SELF_TEST is not set
+ # CONFIG_FAULT_INJECTION is not set
+ # CONFIG_SAMPLES is not set
+ # CONFIG_DEBUG_STACKOVERFLOW is not set
+@@ -1464,7 +1487,9 @@ CONFIG_IRQSTACKS=y
+ # CONFIG_SECURITY_FILE_CAPABILITIES is not set
+ CONFIG_CRYPTO=y
+ CONFIG_CRYPTO_ALGAPI=y
++CONFIG_CRYPTO_AEAD=m
+ CONFIG_CRYPTO_BLKCIPHER=m
++# CONFIG_CRYPTO_SEQIV is not set
+ CONFIG_CRYPTO_HASH=y
+ CONFIG_CRYPTO_MANAGER=y
+ CONFIG_CRYPTO_HMAC=y
+@@ -1483,6 +1508,9 @@ 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=m
+ # CONFIG_CRYPTO_FCRYPT is not set
+@@ -1497,11 +1525,14 @@ CONFIG_CRYPTO_DES=m
+ # 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_DEFLATE=m
+ # 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_AUTHENC=m
++# CONFIG_CRYPTO_LZO is not set
+ CONFIG_CRYPTO_HW=y
++# CONFIG_CRYPTO_DEV_HIFN_795X is not set
+ # CONFIG_PPC_CLOCK is not set
+diff --git a/arch/powerpc/configs/celleb_defconfig b/arch/powerpc/configs/celleb_defconfig
+index 9ed2e09..9ba3c6f 100644
+--- a/arch/powerpc/configs/celleb_defconfig
++++ b/arch/powerpc/configs/celleb_defconfig
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.24-rc4
+-# Thu Dec  6 16:48:07 2007
++# Linux kernel version: 2.6.25-rc6
++# Thu Mar 20 10:32:45 2008
+ #
+ CONFIG_PPC64=y
+ 
+@@ -28,6 +28,7 @@ CONFIG_GENERIC_TIME=y
+ CONFIG_GENERIC_TIME_VSYSCALL=y
+ CONFIG_GENERIC_CLOCKEVENTS=y
+ CONFIG_GENERIC_HARDIRQS=y
++CONFIG_HAVE_SETUP_PER_CPU_AREA=y
+ CONFIG_IRQ_PER_CPU=y
+ CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+ CONFIG_ARCH_HAS_ILOG2_U32=y
+@@ -69,16 +70,22 @@ CONFIG_SYSVIPC_SYSCTL=y
+ # CONFIG_POSIX_MQUEUE is not set
+ # CONFIG_BSD_PROCESS_ACCT is not set
+ # CONFIG_TASKSTATS 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=15
+ # CONFIG_CGROUPS is not set
+-# CONFIG_FAIR_GROUP_SCHED is not set
++# CONFIG_GROUP_SCHED is not set
++# CONFIG_USER_SCHED is not set
++# CONFIG_CGROUP_SCHED is not set
+ CONFIG_SYSFS_DEPRECATED=y
++CONFIG_SYSFS_DEPRECATED_V2=y
+ # CONFIG_RELAY is not set
++CONFIG_NAMESPACES=y
++# CONFIG_UTS_NS is not set
++# CONFIG_IPC_NS is not set
++# CONFIG_USER_NS is not set
++# CONFIG_PID_NS is not set
+ CONFIG_BLK_DEV_INITRD=y
+ CONFIG_INITRAMFS_SOURCE=""
+ CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+@@ -92,11 +99,13 @@ CONFIG_HOTPLUG=y
+ CONFIG_PRINTK=y
+ CONFIG_BUG=y
+ CONFIG_ELF_CORE=y
++# CONFIG_COMPAT_BRK is not set
+ CONFIG_BASE_FULL=y
+ CONFIG_FUTEX=y
+ CONFIG_ANON_INODES=y
+ CONFIG_EPOLL=y
+ CONFIG_SIGNALFD=y
++CONFIG_TIMERFD=y
+ CONFIG_EVENTFD=y
+ CONFIG_SHMEM=y
+ CONFIG_VM_EVENT_COUNTERS=y
+@@ -104,6 +113,14 @@ CONFIG_SLUB_DEBUG=y
+ # CONFIG_SLAB is not set
+ CONFIG_SLUB=y
+ # CONFIG_SLOB is not set
++# CONFIG_PROFILING is not set
++# CONFIG_MARKERS is not set
++CONFIG_HAVE_OPROFILE=y
++# CONFIG_KPROBES is not set
++CONFIG_HAVE_KPROBES=y
++CONFIG_HAVE_KRETPROBES=y
++CONFIG_PROC_PAGE_MONITOR=y
++CONFIG_SLABINFO=y
+ CONFIG_RT_MUTEXES=y
+ # CONFIG_TINY_SHMEM is not set
+ CONFIG_BASE_SMALL=0
+@@ -131,6 +148,7 @@ CONFIG_DEFAULT_AS=y
+ # CONFIG_DEFAULT_CFQ is not set
+ # CONFIG_DEFAULT_NOOP is not set
+ CONFIG_DEFAULT_IOSCHED="anticipatory"
++CONFIG_CLASSIC_RCU=y
+ 
+ #
+ # Platform support
+@@ -141,8 +159,8 @@ CONFIG_PPC_MULTIPLATFORM=y
+ # CONFIG_PPC_86xx is not set
+ # CONFIG_PPC_PSERIES is not set
+ # CONFIG_PPC_ISERIES is not set
+-# CONFIG_PPC_MPC52xx is not set
+-# CONFIG_PPC_MPC5200 is not set
++# CONFIG_PPC_MPC512x is not set
++# CONFIG_PPC_MPC5121 is not set
+ # CONFIG_PPC_PMAC is not set
+ # CONFIG_PPC_MAPLE is not set
+ # CONFIG_PPC_PASEMI is not set
+@@ -164,6 +182,7 @@ CONFIG_CBE_RAS=y
+ CONFIG_PPC_NATIVE=y
+ CONFIG_UDBG_RTAS_CONSOLE=y
+ CONFIG_PPC_UDBG_BEAT=y
++# CONFIG_IPIC is not set
+ CONFIG_MPIC=y
+ # CONFIG_MPIC_WEIRD is not set
+ # CONFIG_PPC_I8259 is not set
+@@ -177,7 +196,6 @@ CONFIG_PPC_RTAS=y
+ CONFIG_PPC_INDIRECT_IO=y
+ CONFIG_GENERIC_IOMAP=y
+ # CONFIG_CPU_FREQ is not set
+-# CONFIG_CPM2 is not set
+ # CONFIG_FSL_ULI1575 is not set
+ 
+ #
+@@ -192,16 +210,20 @@ CONFIG_HZ_250=y
+ # CONFIG_HZ_300 is not set
+ # CONFIG_HZ_1000 is not set
+ CONFIG_HZ=250
++# CONFIG_SCHED_HRTICK is not set
+ CONFIG_PREEMPT_NONE=y
+ # CONFIG_PREEMPT_VOLUNTARY is not set
+ # CONFIG_PREEMPT is not set
+-CONFIG_PREEMPT_BKL=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 is not set
++CONFIG_IOMMU_HELPER=y
+ CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
++CONFIG_ARCH_HAS_WALK_MEMORY=y
++CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
+ CONFIG_KEXEC=y
+ # CONFIG_CRASH_DUMP is not set
+ # CONFIG_IRQ_ALL_CPUS is not set
+@@ -223,6 +245,7 @@ CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
+ CONFIG_SPARSEMEM_VMEMMAP=y
+ CONFIG_MEMORY_HOTPLUG=y
+ CONFIG_MEMORY_HOTPLUG_SPARSE=y
++# CONFIG_MEMORY_HOTREMOVE is not set
+ CONFIG_SPLIT_PTLOCK_CPUS=4
+ CONFIG_MIGRATION=y
+ CONFIG_RESOURCES_64BIT=y
+@@ -237,7 +260,6 @@ CONFIG_PROC_DEVICETREE=y
+ # CONFIG_CMDLINE_BOOL is not set
+ # CONFIG_PM is not set
+ CONFIG_SECCOMP=y
+-# CONFIG_WANT_DEVICE_TREE is not set
+ CONFIG_ISA_DMA_API=y
+ 
+ #
+@@ -273,6 +295,7 @@ CONFIG_XFRM=y
+ # CONFIG_XFRM_USER is not set
+ # CONFIG_XFRM_SUB_POLICY is not set
+ # CONFIG_XFRM_MIGRATE is not set
++# CONFIG_XFRM_STATISTICS is not set
+ # CONFIG_NET_KEY is not set
+ CONFIG_INET=y
+ CONFIG_IP_MULTICAST=y
+@@ -320,12 +343,13 @@ CONFIG_IPV6_TUNNEL=m
+ # CONFIG_NETWORK_SECMARK is not set
+ CONFIG_NETFILTER=y
+ # CONFIG_NETFILTER_DEBUG is not set
++CONFIG_NETFILTER_ADVANCED=y
+ 
+ #
+ # Core Netfilter Configuration
+ #
+-# CONFIG_NETFILTER_NETLINK is not set
+-# CONFIG_NF_CONNTRACK_ENABLED is not set
++# CONFIG_NETFILTER_NETLINK_QUEUE is not set
++# CONFIG_NETFILTER_NETLINK_LOG is not set
+ # CONFIG_NF_CONNTRACK is not set
+ # CONFIG_NETFILTER_XTABLES is not set
+ 
+@@ -337,7 +361,7 @@ CONFIG_IP_NF_QUEUE=m
+ # CONFIG_IP_NF_ARPTABLES is not set
+ 
+ #
+-# IPv6: Netfilter Configuration (EXPERIMENTAL)
++# IPv6: Netfilter Configuration
+ #
+ # CONFIG_IP6_NF_QUEUE is not set
+ # CONFIG_IP6_NF_IPTABLES is not set
+@@ -362,6 +386,7 @@ CONFIG_IP_NF_QUEUE=m
+ #
+ # CONFIG_NET_PKTGEN is not set
+ # CONFIG_HAMRADIO is not set
++# CONFIG_CAN is not set
+ # CONFIG_IRDA is not set
+ # CONFIG_BT is not set
+ # CONFIG_AF_RXRPC is not set
+@@ -408,7 +433,7 @@ CONFIG_BLK_DEV_LOOP=y
+ CONFIG_BLK_DEV_RAM=y
+ CONFIG_BLK_DEV_RAM_COUNT=16
+ CONFIG_BLK_DEV_RAM_SIZE=131072
+-CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
++# CONFIG_BLK_DEV_XIP is not set
+ # CONFIG_CDROM_PKTCDVD is not set
+ # CONFIG_ATA_OVER_ETH is not set
+ CONFIG_MISC_DEVICES=y
+@@ -416,16 +441,19 @@ CONFIG_MISC_DEVICES=y
+ # CONFIG_EEPROM_93CX6 is not set
+ # CONFIG_SGI_IOC4 is not set
+ # CONFIG_TIFM_CORE is not set
++# CONFIG_ENCLOSURE_SERVICES is not set
++CONFIG_HAVE_IDE=y
+ CONFIG_IDE=y
+ CONFIG_BLK_DEV_IDE=y
+ 
+ #
+-# Please see Documentation/ide.txt for help/info on IDE drives
++# Please see Documentation/ide/ide.txt for help/info on IDE drives
+ #
+ # CONFIG_BLK_DEV_IDE_SATA is not set
+ CONFIG_BLK_DEV_IDEDISK=y
+ CONFIG_IDEDISK_MULTI_MODE=y
+ CONFIG_BLK_DEV_IDECD=m
++CONFIG_BLK_DEV_IDECD_VERBOSE_ERRORS=y
+ # CONFIG_BLK_DEV_IDETAPE is not set
+ # CONFIG_BLK_DEV_IDEFLOPPY is not set
+ # CONFIG_BLK_DEV_IDESCSI is not set
+@@ -437,12 +465,12 @@ CONFIG_IDE_PROC_FS=y
+ #
+ CONFIG_IDE_GENERIC=y
+ # CONFIG_BLK_DEV_PLATFORM is not set
++CONFIG_BLK_DEV_IDEDMA_SFF=y
+ 
+ #
+ # PCI IDE chipsets support
+ #
+ CONFIG_BLK_DEV_IDEPCI=y
+-CONFIG_IDEPCI_SHARE_IRQ=y
+ CONFIG_IDEPCI_PCIBUS_ORDER=y
+ # CONFIG_BLK_DEV_OFFBOARD is not set
+ CONFIG_BLK_DEV_GENERIC=y
+@@ -474,7 +502,6 @@ CONFIG_BLK_DEV_IDEDMA_PCI=y
+ # CONFIG_BLK_DEV_VIA82CXXX is not set
+ # CONFIG_BLK_DEV_TC86C001 is not set
+ CONFIG_BLK_DEV_CELLEB=y
+-# CONFIG_IDE_ARM is not set
+ CONFIG_BLK_DEV_IDEDMA=y
+ CONFIG_IDE_ARCH_OBSOLETE_INIT=y
+ # CONFIG_BLK_DEV_HD is not set
+@@ -540,6 +567,7 @@ CONFIG_SCSI_LOWLEVEL=y
+ # CONFIG_SCSI_IPS is not set
+ # CONFIG_SCSI_INITIO is not set
+ # CONFIG_SCSI_INIA100 is not set
++# CONFIG_SCSI_MVSAS is not set
+ # CONFIG_SCSI_STEX is not set
+ # CONFIG_SCSI_SYM53C8XX_2 is not set
+ # CONFIG_SCSI_QLOGIC_1280 is not set
+@@ -589,7 +617,6 @@ CONFIG_NETDEVICES=y
+ # CONFIG_EQUALIZER is not set
+ # CONFIG_TUN is not set
+ # CONFIG_VETH is not set
+-# CONFIG_IP1000 is not set
+ # CONFIG_ARCNET is not set
+ # CONFIG_PHYLIB is not set
+ CONFIG_NET_ETHERNET=y
+@@ -612,6 +639,9 @@ CONFIG_NETDEV_1000=y
+ # CONFIG_DL2K is not set
+ # CONFIG_E1000 is not set
+ # CONFIG_E1000E is not set
++# CONFIG_E1000E_ENABLED is not set
++# CONFIG_IP1000 is not set
++# CONFIG_IGB is not set
+ # CONFIG_NS83820 is not set
+ # CONFIG_HAMACHI is not set
+ # CONFIG_YELLOWFIN is not set
+@@ -638,6 +668,7 @@ CONFIG_NETDEV_10000=y
+ # CONFIG_PASEMI_MAC is not set
+ # CONFIG_MLX4_CORE is not set
+ # CONFIG_TEHUTI is not set
++# CONFIG_BNX2X is not set
+ # CONFIG_TR is not set
+ 
+ #
+@@ -660,7 +691,6 @@ CONFIG_NETDEV_10000=y
+ # CONFIG_PPP is not set
+ # CONFIG_SLIP is not set
+ # CONFIG_NET_FC is not set
+-# CONFIG_SHAPER is not set
+ # CONFIG_NETCONSOLE is not set
+ # CONFIG_NETPOLL is not set
+ # CONFIG_NET_POLL_CONTROLLER is not set
+@@ -719,16 +749,17 @@ CONFIG_SERIAL_NONSTANDARD=y
+ # CONFIG_DIGIEPCA is not set
+ # CONFIG_MOXA_INTELLIO is not set
+ # CONFIG_MOXA_SMARTIO is not set
+-# CONFIG_MOXA_SMARTIO_NEW is not set
+ # CONFIG_ISI is not set
+ # CONFIG_SYNCLINK is not set
+ # CONFIG_SYNCLINKMP is not set
+ # CONFIG_SYNCLINK_GT is not set
+ # CONFIG_N_HDLC is not set
++# CONFIG_RISCOM8 is not set
+ # CONFIG_SPECIALIX is not set
+ # CONFIG_SX is not set
+ # CONFIG_RIO is not set
+ # CONFIG_STALDRV is not set
++# CONFIG_NOZOMI is not set
+ 
+ #
+ # Serial drivers
+@@ -802,13 +833,12 @@ CONFIG_I2C_ALGOBIT=y
+ #
+ # Miscellaneous I2C Chip support
+ #
+-# CONFIG_SENSORS_DS1337 is not set
+-# CONFIG_SENSORS_DS1374 is not set
+ # CONFIG_DS1682 is not set
+ # CONFIG_SENSORS_EEPROM is not set
+ # CONFIG_SENSORS_PCF8574 is not set
+-# CONFIG_SENSORS_PCA9539 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
+@@ -824,6 +854,7 @@ CONFIG_I2C_ALGOBIT=y
+ # CONFIG_W1 is not set
+ # CONFIG_POWER_SUPPLY is not set
+ # CONFIG_HWMON is not set
++# CONFIG_THERMAL is not set
+ CONFIG_WATCHDOG=y
+ # CONFIG_WATCHDOG_NOWAYOUT is not set
+ 
+@@ -905,6 +936,7 @@ CONFIG_USB_ARCH_HAS_OHCI=y
+ CONFIG_USB_ARCH_HAS_EHCI=y
+ CONFIG_USB=y
+ # CONFIG_USB_DEBUG is not set
++# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
+ 
+ #
+ # Miscellaneous USB options
+@@ -918,10 +950,10 @@ CONFIG_USB_DEVICEFS=y
+ # USB Host Controller Drivers
+ #
+ CONFIG_USB_EHCI_HCD=m
+-# CONFIG_USB_EHCI_SPLIT_ISO is not set
+ # CONFIG_USB_EHCI_ROOT_HUB_TT is not set
+ # CONFIG_USB_EHCI_TT_NEWSCHED is not set
+ 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_OHCI_HCD=m
+ # CONFIG_USB_OHCI_HCD_PPC_OF is not set
+@@ -969,10 +1001,6 @@ CONFIG_USB_MON=y
+ #
+ # USB port drivers
+ #
+-
+-#
+-# USB Serial Converter support
+-#
+ # CONFIG_USB_SERIAL is not set
+ 
+ #
+@@ -998,20 +1026,14 @@ CONFIG_USB_MON=y
+ # CONFIG_USB_TRANCEVIBRATOR is not set
+ # CONFIG_USB_IOWARRIOR is not set
+ # CONFIG_USB_TEST is not set
+-
+-#
+-# USB DSL modem support
+-#
+-
+-#
+-# USB Gadget Support
+-#
+ # CONFIG_USB_GADGET is not set
+ # CONFIG_MMC is not set
++# CONFIG_MEMSTICK is not set
+ # CONFIG_NEW_LEDS 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
+@@ -1041,12 +1063,10 @@ CONFIG_FS_POSIX_ACL=y
+ # CONFIG_XFS_FS is not set
+ # CONFIG_GFS2_FS is not set
+ # CONFIG_OCFS2_FS is not set
+-# CONFIG_MINIX_FS is not set
+-# CONFIG_ROMFS_FS is not set
++CONFIG_DNOTIFY=y
+ CONFIG_INOTIFY=y
+ CONFIG_INOTIFY_USER=y
+ # CONFIG_QUOTA is not set
+-CONFIG_DNOTIFY=y
+ # CONFIG_AUTOFS_FS is not set
+ # CONFIG_AUTOFS4_FS is not set
+ # CONFIG_FUSE_FS is not set
+@@ -1095,8 +1115,10 @@ CONFIG_HUGETLB_PAGE=y
+ # CONFIG_EFS_FS is not set
+ # CONFIG_CRAMFS is not set
+ # CONFIG_VXFS_FS is not set
++# CONFIG_MINIX_FS is not set
+ # CONFIG_HPFS_FS is not set
+ # CONFIG_QNX4FS_FS is not set
++# CONFIG_ROMFS_FS is not set
+ # CONFIG_SYSV_FS is not set
+ # CONFIG_UFS_FS is not set
+ CONFIG_NETWORK_FILESYSTEMS=y
+@@ -1188,7 +1210,6 @@ CONFIG_NLS_ISO8859_15=m
+ # CONFIG_NLS_KOI8_U is not set
+ # CONFIG_NLS_UTF8 is not set
+ # CONFIG_DLM is not set
+-# CONFIG_UCC_SLOW is not set
+ 
+ #
+ # Library routines
+@@ -1206,10 +1227,6 @@ CONFIG_PLIST=y
+ CONFIG_HAS_IOMEM=y
+ CONFIG_HAS_IOPORT=y
+ CONFIG_HAS_DMA=y
+-CONFIG_INSTRUMENTATION=y
+-# CONFIG_PROFILING is not set
+-# CONFIG_KPROBES is not set
+-# CONFIG_MARKERS is not set
+ 
+ #
+ # Kernel hacking
+@@ -1228,6 +1245,7 @@ CONFIG_SCHED_DEBUG=y
+ # CONFIG_SCHEDSTATS is not set
+ # CONFIG_TIMER_STATS 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
+@@ -1240,9 +1258,9 @@ CONFIG_DEBUG_BUGVERBOSE=y
+ # CONFIG_DEBUG_VM is not set
+ # CONFIG_DEBUG_LIST is not set
+ # CONFIG_DEBUG_SG is not set
+-# CONFIG_FORCED_INLINING is not set
+ # CONFIG_BOOT_PRINTK_DELAY is not set
+ # CONFIG_RCU_TORTURE_TEST is not set
++# CONFIG_BACKTRACE_SELF_TEST is not set
+ # CONFIG_FAULT_INJECTION is not set
+ # CONFIG_SAMPLES is not set
+ # CONFIG_DEBUG_STACKOVERFLOW is not set
+@@ -1265,7 +1283,9 @@ CONFIG_IRQSTACKS=y
+ # CONFIG_SECURITY_FILE_CAPABILITIES is not set
+ CONFIG_CRYPTO=y
+ CONFIG_CRYPTO_ALGAPI=y
++CONFIG_CRYPTO_AEAD=m
+ CONFIG_CRYPTO_BLKCIPHER=m
++# CONFIG_CRYPTO_SEQIV is not set
+ CONFIG_CRYPTO_HASH=y
+ CONFIG_CRYPTO_MANAGER=y
+ CONFIG_CRYPTO_HMAC=y
+@@ -1284,6 +1304,9 @@ 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=m
+ # CONFIG_CRYPTO_FCRYPT is not set
+@@ -1299,11 +1322,13 @@ CONFIG_CRYPTO_ARC4=m
+ CONFIG_CRYPTO_KHAZAD=m
+ CONFIG_CRYPTO_ANUBIS=m
+ # CONFIG_CRYPTO_SEED is not set
++# CONFIG_CRYPTO_SALSA20 is not set
+ 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 is not set
++CONFIG_CRYPTO_AUTHENC=m
++# CONFIG_CRYPTO_LZO is not set
+ # CONFIG_CRYPTO_HW is not set
+ # CONFIG_PPC_CLOCK is not set
+diff --git a/arch/powerpc/configs/chrp32_defconfig b/arch/powerpc/configs/chrp32_defconfig
+index 5989b5d..38b85b2 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.24-rc4
+-# Thu Dec  6 16:48:09 2007
++# Linux kernel version: 2.6.25-rc6
++# Thu Mar 20 10:33:36 2008
+ #
+ # CONFIG_PPC64 is not set
+ 
+@@ -30,6 +30,7 @@ CONFIG_GENERIC_TIME=y
+ CONFIG_GENERIC_TIME_VSYSCALL=y
+ CONFIG_GENERIC_CLOCKEVENTS=y
+ CONFIG_GENERIC_HARDIRQS=y
++# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
+ CONFIG_IRQ_PER_CPU=y
+ CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+ CONFIG_ARCH_HAS_ILOG2_U32=y
+@@ -67,16 +68,22 @@ CONFIG_SYSVIPC_SYSCTL=y
+ CONFIG_POSIX_MQUEUE=y
+ # CONFIG_BSD_PROCESS_ACCT is not set
+ # CONFIG_TASKSTATS 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=15
+ # CONFIG_CGROUPS is not set
+-# CONFIG_FAIR_GROUP_SCHED is not set
++# CONFIG_GROUP_SCHED is not set
++# CONFIG_USER_SCHED is not set
++# CONFIG_CGROUP_SCHED is not set
+ CONFIG_SYSFS_DEPRECATED=y
++CONFIG_SYSFS_DEPRECATED_V2=y
+ # CONFIG_RELAY is not set
++CONFIG_NAMESPACES=y
++# CONFIG_UTS_NS is not set
++# CONFIG_IPC_NS is not set
++# CONFIG_USER_NS is not set
++# CONFIG_PID_NS is not set
+ CONFIG_BLK_DEV_INITRD=y
+ CONFIG_INITRAMFS_SOURCE=""
+ # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+@@ -90,11 +97,13 @@ CONFIG_HOTPLUG=y
+ CONFIG_PRINTK=y
+ CONFIG_BUG=y
+ CONFIG_ELF_CORE=y
++# CONFIG_COMPAT_BRK is not set
+ CONFIG_BASE_FULL=y
+ CONFIG_FUTEX=y
+ CONFIG_ANON_INODES=y
+ CONFIG_EPOLL=y
+ CONFIG_SIGNALFD=y
++CONFIG_TIMERFD=y
+ CONFIG_EVENTFD=y
+ CONFIG_SHMEM=y
+ CONFIG_VM_EVENT_COUNTERS=y
+@@ -102,6 +111,14 @@ CONFIG_SLUB_DEBUG=y
+ # CONFIG_SLAB is not set
+ CONFIG_SLUB=y
+ # CONFIG_SLOB is not set
++# CONFIG_PROFILING is not set
++# CONFIG_MARKERS is not set
++CONFIG_HAVE_OPROFILE=y
++# CONFIG_KPROBES is not set
++CONFIG_HAVE_KPROBES=y
++CONFIG_HAVE_KRETPROBES=y
++CONFIG_PROC_PAGE_MONITOR=y
++CONFIG_SLABINFO=y
+ CONFIG_RT_MUTEXES=y
+ # CONFIG_TINY_SHMEM is not set
+ CONFIG_BASE_SMALL=0
+@@ -130,6 +147,7 @@ CONFIG_DEFAULT_AS=y
+ # CONFIG_DEFAULT_CFQ is not set
+ # CONFIG_DEFAULT_NOOP is not set
+ CONFIG_DEFAULT_IOSCHED="anticipatory"
++CONFIG_CLASSIC_RCU=y
+ 
+ #
+ # Platform support
+@@ -140,16 +158,17 @@ CONFIG_PPC_MULTIPLATFORM=y
+ # CONFIG_PPC_86xx is not set
+ CONFIG_CLASSIC32=y
+ CONFIG_PPC_CHRP=y
++# CONFIG_PPC_MPC512x is not set
++# CONFIG_PPC_MPC5121 is not set
++# CONFIG_MPC5121_ADS is not set
+ # CONFIG_PPC_MPC52xx is not set
+-# CONFIG_PPC_MPC5200 is not set
+-# CONFIG_PPC_EFIKA is not set
+-# CONFIG_PPC_LITE5200 is not set
+ # CONFIG_PPC_PMAC is not set
+ # CONFIG_PPC_CELL is not set
+ # CONFIG_PPC_CELL_NATIVE is not set
+ # CONFIG_PQ2ADS is not set
+ CONFIG_PPC_NATIVE=y
+ # CONFIG_UDBG_RTAS_CONSOLE is not set
++# CONFIG_IPIC is not set
+ CONFIG_MPIC=y
+ # CONFIG_MPIC_WEIRD is not set
+ CONFIG_PPC_I8259=y
+@@ -163,7 +182,6 @@ CONFIG_PPC_MPC106=y
+ # CONFIG_GENERIC_IOMAP is not set
+ # CONFIG_CPU_FREQ is not set
+ # CONFIG_TAU is not set
+-# CONFIG_CPM2 is not set
+ # CONFIG_FSL_ULI1575 is not set
+ 
+ #
+@@ -179,13 +197,16 @@ CONFIG_HZ_250=y
+ # CONFIG_HZ_300 is not set
+ # CONFIG_HZ_1000 is not set
+ CONFIG_HZ=250
++# CONFIG_SCHED_HRTICK is not set
+ CONFIG_PREEMPT_NONE=y
+ # CONFIG_PREEMPT_VOLUNTARY is not set
+ # CONFIG_PREEMPT is not set
+-CONFIG_PREEMPT_BKL=y
+ CONFIG_BINFMT_ELF=y
+ CONFIG_BINFMT_MISC=y
++# CONFIG_IOMMU_HELPER is not set
+ CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
++CONFIG_ARCH_HAS_WALK_MEMORY=y
++CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
+ # CONFIG_KEXEC is not set
+ CONFIG_IRQ_ALL_CPUS=y
+ CONFIG_ARCH_FLATMEM_ENABLE=y
+@@ -207,7 +228,6 @@ CONFIG_PROC_DEVICETREE=y
+ # CONFIG_CMDLINE_BOOL is not set
+ # CONFIG_PM is not set
+ CONFIG_SECCOMP=y
+-# CONFIG_WANT_DEVICE_TREE is not set
+ CONFIG_ISA_DMA_API=y
+ 
+ #
+@@ -286,74 +306,32 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
+ # CONFIG_NETWORK_SECMARK is not set
+ CONFIG_NETFILTER=y
+ # CONFIG_NETFILTER_DEBUG is not set
++# CONFIG_NETFILTER_ADVANCED is not set
+ 
+ #
+ # Core Netfilter Configuration
+ #
+-# CONFIG_NETFILTER_NETLINK is not set
+-CONFIG_NF_CONNTRACK_ENABLED=m
++CONFIG_NETFILTER_NETLINK=m
++CONFIG_NETFILTER_NETLINK_LOG=m
+ 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_SCTP is not set
+-# CONFIG_NF_CT_PROTO_UDPLITE is not set
+-# CONFIG_NF_CONNTRACK_AMANDA is not set
+ CONFIG_NF_CONNTRACK_FTP=m
+-# CONFIG_NF_CONNTRACK_H323 is not set
+ CONFIG_NF_CONNTRACK_IRC=m
+-# CONFIG_NF_CONNTRACK_NETBIOS_NS is not set
+-# CONFIG_NF_CONNTRACK_PPTP is not set
+-# CONFIG_NF_CONNTRACK_SANE is not set
+ CONFIG_NF_CONNTRACK_SIP=m
+-CONFIG_NF_CONNTRACK_TFTP=m
++CONFIG_NF_CT_NETLINK=m
+ CONFIG_NETFILTER_XTABLES=m
+-# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set
+ # CONFIG_NETFILTER_XT_TARGET_MARK is not set
+-# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set
+ # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
+ # CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
+-# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
+-# CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set
+-# CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set
+-# CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set
+ # CONFIG_NETFILTER_XT_MATCH_CONNTRACK is not set
+-# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
+-# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
+-# CONFIG_NETFILTER_XT_MATCH_ESP is not set
+-# CONFIG_NETFILTER_XT_MATCH_HELPER is not set
+-# CONFIG_NETFILTER_XT_MATCH_LENGTH is not set
+-# CONFIG_NETFILTER_XT_MATCH_LIMIT is not set
+-# CONFIG_NETFILTER_XT_MATCH_MAC is not set
+ # CONFIG_NETFILTER_XT_MATCH_MARK is not set
+-# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
+-# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set
+-# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
+-# CONFIG_NETFILTER_XT_MATCH_REALM is not set
+-# CONFIG_NETFILTER_XT_MATCH_SCTP is not set
+ # CONFIG_NETFILTER_XT_MATCH_STATE is not set
+-# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set
+-# CONFIG_NETFILTER_XT_MATCH_STRING is not set
+-# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set
+-# CONFIG_NETFILTER_XT_MATCH_TIME is not set
+-# CONFIG_NETFILTER_XT_MATCH_U32 is not set
+-# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
+ 
+ #
+ # IP: Netfilter Configuration
+ #
+ CONFIG_NF_CONNTRACK_IPV4=m
+ CONFIG_NF_CONNTRACK_PROC_COMPAT=y
+-# CONFIG_IP_NF_QUEUE is not set
+ CONFIG_IP_NF_IPTABLES=m
+-# CONFIG_IP_NF_MATCH_IPRANGE is not set
+-# CONFIG_IP_NF_MATCH_TOS is not set
+-# CONFIG_IP_NF_MATCH_RECENT is not set
+-# CONFIG_IP_NF_MATCH_ECN is not set
+-# CONFIG_IP_NF_MATCH_AH is not set
+-# CONFIG_IP_NF_MATCH_TTL is not set
+-# CONFIG_IP_NF_MATCH_OWNER is not set
+-# CONFIG_IP_NF_MATCH_ADDRTYPE is not set
+ CONFIG_IP_NF_FILTER=m
+ CONFIG_IP_NF_TARGET_REJECT=m
+ CONFIG_IP_NF_TARGET_LOG=m
+@@ -361,20 +339,14 @@ CONFIG_IP_NF_TARGET_LOG=m
+ CONFIG_NF_NAT=m
+ CONFIG_NF_NAT_NEEDED=y
+ CONFIG_IP_NF_TARGET_MASQUERADE=m
+-CONFIG_IP_NF_TARGET_REDIRECT=m
+-# CONFIG_IP_NF_TARGET_NETMAP is not set
+-# CONFIG_IP_NF_TARGET_SAME is not set
+-# CONFIG_NF_NAT_SNMP_BASIC is not set
+ CONFIG_NF_NAT_FTP=m
+ CONFIG_NF_NAT_IRC=m
+-CONFIG_NF_NAT_TFTP=m
++# CONFIG_NF_NAT_TFTP is not set
+ # CONFIG_NF_NAT_AMANDA is not set
+ # CONFIG_NF_NAT_PPTP is not set
+ # CONFIG_NF_NAT_H323 is not set
+ CONFIG_NF_NAT_SIP=m
+ # CONFIG_IP_NF_MANGLE is not set
+-# CONFIG_IP_NF_RAW is not set
+-# CONFIG_IP_NF_ARPTABLES is not set
+ # CONFIG_IP_DCCP is not set
+ # CONFIG_IP_SCTP is not set
+ # CONFIG_TIPC is not set
+@@ -396,6 +368,7 @@ CONFIG_NF_NAT_SIP=m
+ #
+ # CONFIG_NET_PKTGEN is not set
+ # CONFIG_HAMRADIO is not set
++# CONFIG_CAN is not set
+ # CONFIG_IRDA is not set
+ # CONFIG_BT is not set
+ # CONFIG_AF_RXRPC is not set
+@@ -445,7 +418,7 @@ CONFIG_BLK_DEV_LOOP=y
+ CONFIG_BLK_DEV_RAM=y
+ CONFIG_BLK_DEV_RAM_COUNT=16
+ CONFIG_BLK_DEV_RAM_SIZE=4096
+-CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
++# CONFIG_BLK_DEV_XIP is not set
+ # CONFIG_CDROM_PKTCDVD is not set
+ # CONFIG_ATA_OVER_ETH is not set
+ CONFIG_MISC_DEVICES=y
+@@ -453,16 +426,19 @@ CONFIG_MISC_DEVICES=y
+ # CONFIG_EEPROM_93CX6 is not set
+ # CONFIG_SGI_IOC4 is not set
+ # CONFIG_TIFM_CORE is not set
++# CONFIG_ENCLOSURE_SERVICES is not set
++CONFIG_HAVE_IDE=y
+ CONFIG_IDE=y
+ CONFIG_BLK_DEV_IDE=y
+ 
+ #
+-# Please see Documentation/ide.txt for help/info on IDE drives
++# Please see Documentation/ide/ide.txt for help/info on IDE drives
+ #
+ # CONFIG_BLK_DEV_IDE_SATA is not set
+ CONFIG_BLK_DEV_IDEDISK=y
+ CONFIG_IDEDISK_MULTI_MODE=y
+ CONFIG_BLK_DEV_IDECD=y
++CONFIG_BLK_DEV_IDECD_VERBOSE_ERRORS=y
+ # CONFIG_BLK_DEV_IDETAPE is not set
+ # CONFIG_BLK_DEV_IDEFLOPPY is not set
+ # CONFIG_BLK_DEV_IDESCSI is not set
+@@ -474,12 +450,12 @@ CONFIG_IDE_PROC_FS=y
+ #
+ CONFIG_IDE_GENERIC=y
+ # CONFIG_BLK_DEV_PLATFORM is not set
++CONFIG_BLK_DEV_IDEDMA_SFF=y
+ 
+ #
+ # PCI IDE chipsets support
+ #
+ CONFIG_BLK_DEV_IDEPCI=y
+-CONFIG_IDEPCI_SHARE_IRQ=y
+ CONFIG_IDEPCI_PCIBUS_ORDER=y
+ # CONFIG_BLK_DEV_OFFBOARD is not set
+ CONFIG_BLK_DEV_GENERIC=y
+@@ -510,7 +486,6 @@ CONFIG_BLK_DEV_SL82C105=y
+ # CONFIG_BLK_DEV_TRM290 is not set
+ CONFIG_BLK_DEV_VIA82CXXX=y
+ # CONFIG_BLK_DEV_TC86C001 is not set
+-# CONFIG_IDE_ARM is not set
+ 
+ #
+ # Other IDE chipsets support
+@@ -599,6 +574,7 @@ CONFIG_SCSI_LOWLEVEL=y
+ # CONFIG_SCSI_IPS is not set
+ # CONFIG_SCSI_INITIO is not set
+ # CONFIG_SCSI_INIA100 is not set
++# CONFIG_SCSI_MVSAS is not set
+ # CONFIG_SCSI_NCR53C406A is not set
+ # CONFIG_SCSI_STEX is not set
+ CONFIG_SCSI_SYM53C8XX_2=y
+@@ -607,7 +583,6 @@ CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
+ CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
+ CONFIG_SCSI_SYM53C8XX_MMIO=y
+ # CONFIG_SCSI_PAS16 is not set
+-# CONFIG_SCSI_PSI240I is not set
+ # CONFIG_SCSI_QLOGIC_FAS is not set
+ # CONFIG_SCSI_QLOGIC_1280 is not set
+ # CONFIG_SCSI_QLA_FC is not set
+@@ -640,7 +615,6 @@ CONFIG_NETDEVICES=y
+ # CONFIG_EQUALIZER is not set
+ # CONFIG_TUN is not set
+ # CONFIG_VETH is not set
+-# CONFIG_IP1000 is not set
+ # CONFIG_ARCNET is not set
+ # CONFIG_PHYLIB is not set
+ CONFIG_NET_ETHERNET=y
+@@ -688,6 +662,7 @@ CONFIG_8139TOO=y
+ # CONFIG_8139TOO_TUNE_TWISTER is not set
+ # CONFIG_8139TOO_8129 is not set
+ # CONFIG_8139_OLD_RX_RESET is not set
++# CONFIG_R6040 is not set
+ # CONFIG_SIS900 is not set
+ # CONFIG_EPIC100 is not set
+ # CONFIG_SUNDANCE is not set
+@@ -701,6 +676,9 @@ CONFIG_NETDEV_1000=y
+ # CONFIG_DL2K is not set
+ # CONFIG_E1000 is not set
+ # CONFIG_E1000E is not set
++# CONFIG_E1000E_ENABLED is not set
++# CONFIG_IP1000 is not set
++# CONFIG_IGB is not set
+ # CONFIG_NS83820 is not set
+ # CONFIG_HAMACHI is not set
+ # CONFIG_YELLOWFIN is not set
+@@ -726,6 +704,7 @@ CONFIG_NETDEV_10000=y
+ # CONFIG_NIU is not set
+ # CONFIG_MLX4_CORE is not set
+ # CONFIG_TEHUTI is not set
++# CONFIG_BNX2X is not set
+ # CONFIG_TR is not set
+ 
+ #
+@@ -758,7 +737,6 @@ CONFIG_PPPOE=m
+ # CONFIG_SLIP is not set
+ CONFIG_SLHC=m
+ # CONFIG_NET_FC is not set
+-# CONFIG_SHAPER is not set
+ # CONFIG_NETCONSOLE is not set
+ # CONFIG_NETPOLL is not set
+ # CONFIG_NET_POLL_CONTROLLER is not set
+@@ -838,6 +816,7 @@ CONFIG_VT_CONSOLE=y
+ CONFIG_HW_CONSOLE=y
+ # CONFIG_VT_HW_CONSOLE_BINDING is not set
+ # CONFIG_SERIAL_NONSTANDARD is not set
++# CONFIG_NOZOMI is not set
+ 
+ #
+ # Serial drivers
+@@ -917,14 +896,12 @@ CONFIG_I2C_ALGOBIT=y
+ #
+ # Miscellaneous I2C Chip support
+ #
+-# CONFIG_SENSORS_DS1337 is not set
+-# CONFIG_SENSORS_DS1374 is not set
+ # CONFIG_DS1682 is not set
+ # CONFIG_SENSORS_EEPROM is not set
+ # CONFIG_SENSORS_PCF8574 is not set
+-# CONFIG_SENSORS_PCA9539 is not set
++# CONFIG_PCF8575 is not set
+ # CONFIG_SENSORS_PCF8591 is not set
+-# CONFIG_SENSORS_M41T00 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
+@@ -940,6 +917,7 @@ CONFIG_I2C_ALGOBIT=y
+ # CONFIG_W1 is not set
+ # CONFIG_POWER_SUPPLY is not set
+ # CONFIG_HWMON is not set
++# CONFIG_THERMAL is not set
+ # CONFIG_WATCHDOG is not set
+ 
+ #
+@@ -1083,6 +1061,7 @@ CONFIG_USB_ARCH_HAS_OHCI=y
+ CONFIG_USB_ARCH_HAS_EHCI=y
+ CONFIG_USB=y
+ # CONFIG_USB_DEBUG is not set
++# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
+ 
+ #
+ # Miscellaneous USB options
+@@ -1096,9 +1075,9 @@ CONFIG_USB_DEVICE_CLASS=y
+ # USB Host Controller Drivers
+ #
+ CONFIG_USB_EHCI_HCD=m
+-# CONFIG_USB_EHCI_SPLIT_ISO is not set
+ # 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_OHCI_HCD=y
+ # CONFIG_USB_OHCI_HCD_PPC_OF is not set
+@@ -1147,10 +1126,6 @@ CONFIG_USB_MON=y
+ #
+ # USB port drivers
+ #
+-
+-#
+-# USB Serial Converter support
+-#
+ # CONFIG_USB_SERIAL is not set
+ 
+ #
+@@ -1176,20 +1151,14 @@ CONFIG_USB_MON=y
+ # CONFIG_USB_TRANCEVIBRATOR is not set
+ # CONFIG_USB_IOWARRIOR is not set
+ # CONFIG_USB_TEST is not set
+-
+-#
+-# USB DSL modem support
+-#
+-
+-#
+-# USB Gadget Support
+-#
+ # CONFIG_USB_GADGET is not set
+ # CONFIG_MMC is not set
++# CONFIG_MEMSTICK is not set
+ # CONFIG_NEW_LEDS 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
+@@ -1215,12 +1184,10 @@ CONFIG_FS_MBCACHE=y
+ # CONFIG_XFS_FS is not set
+ # CONFIG_GFS2_FS is not set
+ # CONFIG_OCFS2_FS is not set
+-# CONFIG_MINIX_FS is not set
+-# CONFIG_ROMFS_FS is not set
++CONFIG_DNOTIFY=y
+ CONFIG_INOTIFY=y
+ CONFIG_INOTIFY_USER=y
+ # CONFIG_QUOTA is not set
+-CONFIG_DNOTIFY=y
+ # CONFIG_AUTOFS_FS is not set
+ # CONFIG_AUTOFS4_FS is not set
+ # CONFIG_FUSE_FS is not set
+@@ -1267,8 +1234,10 @@ CONFIG_TMPFS=y
+ # CONFIG_EFS_FS is not set
+ # CONFIG_CRAMFS is not set
+ # CONFIG_VXFS_FS is not set
++# CONFIG_MINIX_FS is not set
+ # CONFIG_HPFS_FS is not set
+ # CONFIG_QNX4FS_FS is not set
++# CONFIG_ROMFS_FS is not set
+ # CONFIG_SYSV_FS is not set
+ # CONFIG_UFS_FS is not set
+ CONFIG_NETWORK_FILESYSTEMS=y
+@@ -1342,7 +1311,6 @@ CONFIG_NLS_ISO8859_1=m
+ # CONFIG_NLS_KOI8_U is not set
+ # CONFIG_NLS_UTF8 is not set
+ # CONFIG_DLM is not set
+-# CONFIG_UCC_SLOW is not set
+ 
+ #
+ # Library routines
+@@ -1360,10 +1328,6 @@ CONFIG_PLIST=y
+ CONFIG_HAS_IOMEM=y
+ CONFIG_HAS_IOPORT=y
+ CONFIG_HAS_DMA=y
+-CONFIG_INSTRUMENTATION=y
+-# CONFIG_PROFILING is not set
+-# CONFIG_KPROBES is not set
+-# CONFIG_MARKERS is not set
+ 
+ #
+ # Kernel hacking
+@@ -1382,6 +1346,7 @@ CONFIG_SCHED_DEBUG=y
+ # CONFIG_SCHEDSTATS is not set
+ # CONFIG_TIMER_STATS 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
+@@ -1395,9 +1360,9 @@ CONFIG_DEBUG_BUGVERBOSE=y
+ # CONFIG_DEBUG_VM is not set
+ # CONFIG_DEBUG_LIST is not set
+ # CONFIG_DEBUG_SG is not set
+-CONFIG_FORCED_INLINING=y
+ # CONFIG_BOOT_PRINTK_DELAY is not set
+ # CONFIG_RCU_TORTURE_TEST is not set
++# CONFIG_BACKTRACE_SELF_TEST is not set
+ # CONFIG_FAULT_INJECTION is not set
+ # CONFIG_SAMPLES is not set
+ # CONFIG_DEBUG_STACKOVERFLOW is not set
+@@ -1420,6 +1385,7 @@ CONFIG_XMON_DISASSEMBLY=y
+ CONFIG_CRYPTO=y
+ CONFIG_CRYPTO_ALGAPI=m
+ CONFIG_CRYPTO_BLKCIPHER=m
++# CONFIG_CRYPTO_SEQIV is not set
+ CONFIG_CRYPTO_MANAGER=m
+ # CONFIG_CRYPTO_HMAC is not set
+ # CONFIG_CRYPTO_XCBC is not set
+@@ -1437,6 +1403,9 @@ 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
+@@ -1451,11 +1420,13 @@ CONFIG_CRYPTO_ARC4=m
+ # 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_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
+diff --git a/arch/powerpc/configs/g5_defconfig b/arch/powerpc/configs/g5_defconfig
+index 3673dd2..0f82f66 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.24-rc4
+-# Thu Dec  6 16:48:15 2007
++# Linux kernel version: 2.6.25-rc6
++# Thu Mar 20 10:36:41 2008
+ #
+ CONFIG_PPC64=y
+ 
+@@ -27,6 +27,7 @@ CONFIG_GENERIC_TIME=y
+ CONFIG_GENERIC_TIME_VSYSCALL=y
+ CONFIG_GENERIC_CLOCKEVENTS=y
+ CONFIG_GENERIC_HARDIRQS=y
++CONFIG_HAVE_SETUP_PER_CPU_AREA=y
+ CONFIG_IRQ_PER_CPU=y
+ CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+ CONFIG_ARCH_HAS_ILOG2_U32=y
+@@ -48,7 +49,9 @@ CONFIG_GENERIC_TBSYNC=y
+ CONFIG_AUDIT_ARCH=y
+ CONFIG_GENERIC_BUG=y
+ # CONFIG_DEFAULT_UIMAGE is not set
+-CONFIG_PPC64_SWSUSP=y
++CONFIG_HIBERNATE_64=y
++CONFIG_ARCH_HIBERNATION_POSSIBLE=y
++CONFIG_ARCH_SUSPEND_POSSIBLE=y
+ # CONFIG_PPC_DCR_NATIVE is not set
+ # CONFIG_PPC_DCR_MMIO is not set
+ # CONFIG_PPC_OF_PLATFORM_PCI is not set
+@@ -68,18 +71,22 @@ CONFIG_SYSVIPC_SYSCTL=y
+ CONFIG_POSIX_MQUEUE=y
+ # CONFIG_BSD_PROCESS_ACCT is not set
+ # CONFIG_TASKSTATS 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=17
+ # CONFIG_CGROUPS is not set
+-CONFIG_FAIR_GROUP_SCHED=y
+-CONFIG_FAIR_USER_SCHED=y
+-# CONFIG_FAIR_CGROUP_SCHED is not set
++# CONFIG_GROUP_SCHED is not set
++# CONFIG_USER_SCHED is not set
++# CONFIG_CGROUP_SCHED is not set
+ CONFIG_SYSFS_DEPRECATED=y
++CONFIG_SYSFS_DEPRECATED_V2=y
+ # CONFIG_RELAY is not set
++CONFIG_NAMESPACES=y
++# CONFIG_UTS_NS is not set
++# CONFIG_IPC_NS is not set
++# CONFIG_USER_NS is not set
++# CONFIG_PID_NS is not set
+ CONFIG_BLK_DEV_INITRD=y
+ CONFIG_INITRAMFS_SOURCE=""
+ CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+@@ -93,11 +100,13 @@ CONFIG_HOTPLUG=y
+ CONFIG_PRINTK=y
+ CONFIG_BUG=y
+ CONFIG_ELF_CORE=y
++# CONFIG_COMPAT_BRK is not set
+ CONFIG_BASE_FULL=y
+ CONFIG_FUTEX=y
+ CONFIG_ANON_INODES=y
+ CONFIG_EPOLL=y
+ CONFIG_SIGNALFD=y
++CONFIG_TIMERFD=y
+ CONFIG_EVENTFD=y
+ CONFIG_SHMEM=y
+ CONFIG_VM_EVENT_COUNTERS=y
+@@ -105,6 +114,15 @@ CONFIG_SLUB_DEBUG=y
+ # CONFIG_SLAB is not set
+ CONFIG_SLUB=y
+ # CONFIG_SLOB is not set
++CONFIG_PROFILING=y
++# CONFIG_MARKERS is not set
++CONFIG_OPROFILE=y
++CONFIG_HAVE_OPROFILE=y
++# CONFIG_KPROBES is not set
++CONFIG_HAVE_KPROBES=y
++CONFIG_HAVE_KRETPROBES=y
++CONFIG_PROC_PAGE_MONITOR=y
++CONFIG_SLABINFO=y
+ CONFIG_RT_MUTEXES=y
+ # CONFIG_TINY_SHMEM is not set
+ CONFIG_BASE_SMALL=0
+@@ -132,6 +150,7 @@ CONFIG_DEFAULT_AS=y
+ # CONFIG_DEFAULT_CFQ is not set
+ # CONFIG_DEFAULT_NOOP is not set
+ CONFIG_DEFAULT_IOSCHED="anticipatory"
++CONFIG_CLASSIC_RCU=y
+ 
+ #
+ # Platform support
+@@ -142,8 +161,8 @@ CONFIG_PPC_MULTIPLATFORM=y
+ # CONFIG_PPC_86xx is not set
+ # CONFIG_PPC_PSERIES is not set
+ # CONFIG_PPC_ISERIES is not set
+-# CONFIG_PPC_MPC52xx is not set
+-# CONFIG_PPC_MPC5200 is not set
++# CONFIG_PPC_MPC512x is not set
++# CONFIG_PPC_MPC5121 is not set
+ CONFIG_PPC_PMAC=y
+ CONFIG_PPC_PMAC64=y
+ # CONFIG_PPC_MAPLE is not set
+@@ -155,6 +174,7 @@ CONFIG_PPC_PMAC64=y
+ # CONFIG_PPC_IBM_CELL_BLADE is not set
+ # CONFIG_PQ2ADS is not set
+ CONFIG_PPC_NATIVE=y
++# CONFIG_IPIC is not set
+ CONFIG_MPIC=y
+ # CONFIG_MPIC_WEIRD is not set
+ # CONFIG_PPC_I8259 is not set
+@@ -185,7 +205,6 @@ CONFIG_CPU_FREQ_GOV_USERSPACE=y
+ # CPU Frequency drivers
+ #
+ CONFIG_CPU_FREQ_PMAC64=y
+-# CONFIG_CPM2 is not set
+ # CONFIG_FSL_ULI1575 is not set
+ 
+ #
+@@ -200,17 +219,21 @@ CONFIG_HZ_250=y
+ # CONFIG_HZ_300 is not set
+ # CONFIG_HZ_1000 is not set
+ CONFIG_HZ=250
++# CONFIG_SCHED_HRTICK is not set
+ CONFIG_PREEMPT_NONE=y
+ # CONFIG_PREEMPT_VOLUNTARY is not set
+ # CONFIG_PREEMPT is not set
+-# CONFIG_PREEMPT_BKL is not set
+ 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
+ # CONFIG_HOTPLUG_CPU is not set
+ CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
++CONFIG_ARCH_HAS_WALK_MEMORY=y
++CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
+ CONFIG_KEXEC=y
+ # CONFIG_CRASH_DUMP is not set
+ CONFIG_IRQ_ALL_CPUS=y
+@@ -236,11 +259,9 @@ CONFIG_BOUNCE=y
+ # CONFIG_SCHED_SMT is not set
+ CONFIG_PROC_DEVICETREE=y
+ # CONFIG_CMDLINE_BOOL is not set
++CONFIG_ARCH_WANTS_FREEZER_CONTROL=y
+ # CONFIG_PM is not set
+-CONFIG_SUSPEND_SMP_POSSIBLE=y
+-CONFIG_HIBERNATION_SMP_POSSIBLE=y
+ CONFIG_SECCOMP=y
+-# CONFIG_WANT_DEVICE_TREE is not set
+ CONFIG_ISA_DMA_API=y
+ 
+ #
+@@ -276,6 +297,7 @@ CONFIG_XFRM=y
+ CONFIG_XFRM_USER=m
+ # CONFIG_XFRM_SUB_POLICY is not set
+ # CONFIG_XFRM_MIGRATE is not set
++# CONFIG_XFRM_STATISTICS is not set
+ CONFIG_NET_KEY=m
+ # CONFIG_NET_KEY_MIGRATE is not set
+ CONFIG_INET=y
+@@ -310,12 +332,14 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
+ # CONFIG_NETWORK_SECMARK is not set
+ CONFIG_NETFILTER=y
+ # CONFIG_NETFILTER_DEBUG is not set
++CONFIG_NETFILTER_ADVANCED=y
+ 
+ #
+ # Core Netfilter Configuration
+ #
+-# CONFIG_NETFILTER_NETLINK is not set
+-CONFIG_NF_CONNTRACK_ENABLED=m
++CONFIG_NETFILTER_NETLINK=m
++CONFIG_NETFILTER_NETLINK_QUEUE=m
++CONFIG_NETFILTER_NETLINK_LOG=m
+ CONFIG_NF_CONNTRACK=m
+ # CONFIG_NF_CT_ACCT is not set
+ CONFIG_NF_CONNTRACK_MARK=y
+@@ -331,6 +355,7 @@ CONFIG_NF_CONNTRACK_IRC=m
+ # CONFIG_NF_CONNTRACK_SANE is not set
+ # CONFIG_NF_CONNTRACK_SIP is not set
+ CONFIG_NF_CONNTRACK_TFTP=m
++CONFIG_NF_CT_NETLINK=m
+ # CONFIG_NETFILTER_XTABLES is not set
+ 
+ #
+@@ -363,6 +388,7 @@ CONFIG_LLC=y
+ #
+ # CONFIG_NET_PKTGEN is not set
+ # CONFIG_HAMRADIO is not set
++# CONFIG_CAN is not set
+ # CONFIG_IRDA is not set
+ # CONFIG_BT is not set
+ # CONFIG_AF_RXRPC is not set
+@@ -409,7 +435,7 @@ CONFIG_BLK_DEV_NBD=m
+ CONFIG_BLK_DEV_RAM=y
+ CONFIG_BLK_DEV_RAM_COUNT=16
+ CONFIG_BLK_DEV_RAM_SIZE=65536
+-CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
++# CONFIG_BLK_DEV_XIP is not set
+ CONFIG_CDROM_PKTCDVD=m
+ CONFIG_CDROM_PKTCDVD_BUFFERS=8
+ # CONFIG_CDROM_PKTCDVD_WCACHE is not set
+@@ -419,16 +445,19 @@ CONFIG_MISC_DEVICES=y
+ # CONFIG_EEPROM_93CX6 is not set
+ # CONFIG_SGI_IOC4 is not set
+ # CONFIG_TIFM_CORE is not set
++# CONFIG_ENCLOSURE_SERVICES is not set
++CONFIG_HAVE_IDE=y
+ CONFIG_IDE=y
+ CONFIG_BLK_DEV_IDE=y
+ 
+ #
+-# Please see Documentation/ide.txt for help/info on IDE drives
++# Please see Documentation/ide/ide.txt for help/info on IDE drives
+ #
+ # CONFIG_BLK_DEV_IDE_SATA is not set
+ CONFIG_BLK_DEV_IDEDISK=y
+ # CONFIG_IDEDISK_MULTI_MODE is not set
+ CONFIG_BLK_DEV_IDECD=y
++CONFIG_BLK_DEV_IDECD_VERBOSE_ERRORS=y
+ # CONFIG_BLK_DEV_IDETAPE is not set
+ # CONFIG_BLK_DEV_IDEFLOPPY is not set
+ # CONFIG_BLK_DEV_IDESCSI is not set
+@@ -440,12 +469,12 @@ CONFIG_IDE_PROC_FS=y
+ #
+ CONFIG_IDE_GENERIC=y
+ # CONFIG_BLK_DEV_PLATFORM is not set
++CONFIG_BLK_DEV_IDEDMA_SFF=y
+ 
+ #
+ # PCI IDE chipsets support
+ #
+ CONFIG_BLK_DEV_IDEPCI=y
+-# CONFIG_IDEPCI_SHARE_IRQ is not set
+ CONFIG_IDEPCI_PCIBUS_ORDER=y
+ # CONFIG_BLK_DEV_GENERIC is not set
+ # CONFIG_BLK_DEV_OPTI621 is not set
+@@ -478,7 +507,6 @@ CONFIG_BLK_DEV_IDEDMA_PCI=y
+ CONFIG_BLK_DEV_IDE_PMAC=y
+ CONFIG_BLK_DEV_IDE_PMAC_ATA100FIRST=y
+ CONFIG_BLK_DEV_IDEDMA_PMAC=y
+-# CONFIG_IDE_ARM is not set
+ CONFIG_BLK_DEV_IDEDMA=y
+ CONFIG_IDE_ARCH_OBSOLETE_INIT=y
+ # CONFIG_BLK_DEV_HD is not set
+@@ -544,6 +572,7 @@ CONFIG_SCSI_LOWLEVEL=y
+ # CONFIG_SCSI_IPS is not set
+ # CONFIG_SCSI_INITIO is not set
+ # CONFIG_SCSI_INIA100 is not set
++# CONFIG_SCSI_MVSAS is not set
+ # CONFIG_SCSI_STEX is not set
+ # CONFIG_SCSI_SYM53C8XX_2 is not set
+ # CONFIG_SCSI_IPR is not set
+@@ -596,6 +625,7 @@ CONFIG_SATA_SVW=y
+ # 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
+@@ -610,6 +640,7 @@ CONFIG_SATA_SVW=y
+ # 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_MD=y
+ CONFIG_BLK_DEV_MD=y
+ CONFIG_MD_LINEAR=y
+@@ -676,7 +707,6 @@ CONFIG_BONDING=m
+ # CONFIG_EQUALIZER is not set
+ CONFIG_TUN=m
+ # CONFIG_VETH is not set
+-# CONFIG_IP1000 is not set
+ # CONFIG_ARCNET is not set
+ # CONFIG_PHYLIB is not set
+ CONFIG_NET_ETHERNET=y
+@@ -701,6 +731,9 @@ CONFIG_E1000=y
+ # CONFIG_E1000_NAPI is not set
+ # CONFIG_E1000_DISABLE_PACKET_SPLIT is not set
+ # CONFIG_E1000E is not set
++# CONFIG_E1000E_ENABLED is not set
++# CONFIG_IP1000 is not set
++# CONFIG_IGB is not set
+ # CONFIG_NS83820 is not set
+ # CONFIG_HAMACHI is not set
+ # CONFIG_YELLOWFIN is not set
+@@ -726,6 +759,7 @@ CONFIG_NETDEV_10000=y
+ # CONFIG_PASEMI_MAC is not set
+ # CONFIG_MLX4_CORE is not set
+ # CONFIG_TEHUTI is not set
++# CONFIG_BNX2X is not set
+ CONFIG_TR=y
+ CONFIG_IBMOL=y
+ # CONFIG_3C359 is not set
+@@ -771,7 +805,6 @@ CONFIG_PPPOE=m
+ # CONFIG_SLIP is not set
+ CONFIG_SLHC=m
+ # CONFIG_NET_FC is not set
+-# CONFIG_SHAPER is not set
+ # CONFIG_NETCONSOLE is not set
+ # CONFIG_NETPOLL is not set
+ # CONFIG_NET_POLL_CONTROLLER is not set
+@@ -834,6 +867,7 @@ CONFIG_VT_CONSOLE=y
+ CONFIG_HW_CONSOLE=y
+ # CONFIG_VT_HW_CONSOLE_BINDING is not set
+ # CONFIG_SERIAL_NONSTANDARD is not set
++# CONFIG_NOZOMI is not set
+ 
+ #
+ # Serial drivers
+@@ -901,13 +935,12 @@ CONFIG_I2C_POWERMAC=y
+ #
+ # Miscellaneous I2C Chip support
+ #
+-# CONFIG_SENSORS_DS1337 is not set
+-# CONFIG_SENSORS_DS1374 is not set
+ # CONFIG_DS1682 is not set
+ # CONFIG_SENSORS_EEPROM is not set
+ # CONFIG_SENSORS_PCF8574 is not set
+-# CONFIG_SENSORS_PCA9539 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
+@@ -923,6 +956,7 @@ CONFIG_I2C_POWERMAC=y
+ # CONFIG_W1 is not set
+ # CONFIG_POWER_SUPPLY is not set
+ # CONFIG_HWMON is not set
++# CONFIG_THERMAL is not set
+ # CONFIG_WATCHDOG is not set
+ 
+ #
+@@ -1083,6 +1117,7 @@ CONFIG_SND_VERBOSE_PROCFS=y
+ # CONFIG_SND_BT87X is not set
+ # CONFIG_SND_CA0106 is not set
+ # CONFIG_SND_CMIPCI is not set
++# CONFIG_SND_OXYGEN is not set
+ # CONFIG_SND_CS4281 is not set
+ # CONFIG_SND_CS46XX is not set
+ # CONFIG_SND_CS5530 is not set
+@@ -1108,6 +1143,7 @@ CONFIG_SND_VERBOSE_PROCFS=y
+ # CONFIG_SND_HDA_INTEL is not set
+ # CONFIG_SND_HDSP is not set
+ # CONFIG_SND_HDSPM is not set
++# CONFIG_SND_HIFIER is not set
+ # CONFIG_SND_ICE1712 is not set
+ # CONFIG_SND_ICE1724 is not set
+ # CONFIG_SND_INTEL8X0 is not set
+@@ -1125,6 +1161,7 @@ CONFIG_SND_VERBOSE_PROCFS=y
+ # CONFIG_SND_TRIDENT is not set
+ # CONFIG_SND_VIA82XX is not set
+ # CONFIG_SND_VIA82XX_MODEM is not set
++# CONFIG_SND_VIRTUOSO is not set
+ # CONFIG_SND_VX222 is not set
+ # CONFIG_SND_YMFPCI is not set
+ 
+@@ -1166,6 +1203,10 @@ CONFIG_SND_USB_AUDIO=m
+ #
+ 
+ #
++# ALSA SoC audio for Freescale SOCs
++#
++
++#
+ # Open Sound System
+ #
+ # CONFIG_SOUND_PRIME is not set
+@@ -1192,6 +1233,7 @@ CONFIG_USB_ARCH_HAS_OHCI=y
+ CONFIG_USB_ARCH_HAS_EHCI=y
+ CONFIG_USB=y
+ # CONFIG_USB_DEBUG is not set
++# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
+ 
+ #
+ # Miscellaneous USB options
+@@ -1205,9 +1247,9 @@ CONFIG_USB_DEVICE_CLASS=y
+ # USB Host Controller Drivers
+ #
+ CONFIG_USB_EHCI_HCD=y
+-# CONFIG_USB_EHCI_SPLIT_ISO is not set
+ # 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_OHCI_HCD=y
+ CONFIG_USB_OHCI_HCD_PPC_OF=y
+@@ -1259,11 +1301,8 @@ CONFIG_USB_MON=y
+ #
+ # USB port drivers
+ #
+-
+-#
+-# USB Serial Converter support
+-#
+ CONFIG_USB_SERIAL=m
++CONFIG_USB_EZUSB=y
+ CONFIG_USB_SERIAL_GENERIC=y
+ # CONFIG_USB_SERIAL_AIRCABLE is not set
+ # CONFIG_USB_SERIAL_AIRPRIME is not set
+@@ -1284,6 +1323,7 @@ CONFIG_USB_SERIAL_EDGEPORT=m
+ CONFIG_USB_SERIAL_EDGEPORT_TI=m
+ CONFIG_USB_SERIAL_GARMIN=m
+ CONFIG_USB_SERIAL_IPW=m
++# CONFIG_USB_SERIAL_IUU is not set
+ CONFIG_USB_SERIAL_KEYSPAN_PDA=m
+ CONFIG_USB_SERIAL_KEYSPAN=m
+ CONFIG_USB_SERIAL_KEYSPAN_MPR=y
+@@ -1316,7 +1356,6 @@ CONFIG_USB_SERIAL_XIRCOM=m
+ # CONFIG_USB_SERIAL_OPTION is not set
+ CONFIG_USB_SERIAL_OMNINET=m
+ # CONFIG_USB_SERIAL_DEBUG is not set
+-CONFIG_USB_EZUSB=y
+ 
+ #
+ # USB Miscellaneous drivers
+@@ -1341,20 +1380,14 @@ CONFIG_USB_APPLEDISPLAY=m
+ # CONFIG_USB_TRANCEVIBRATOR is not set
+ # CONFIG_USB_IOWARRIOR is not set
+ # CONFIG_USB_TEST is not set
+-
+-#
+-# USB DSL modem support
+-#
+-
+-#
+-# USB Gadget Support
+-#
+ # CONFIG_USB_GADGET is not set
+ # CONFIG_MMC is not set
++# CONFIG_MEMSTICK is not set
+ # CONFIG_NEW_LEDS 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
+@@ -1393,12 +1426,10 @@ CONFIG_XFS_POSIX_ACL=y
+ # CONFIG_XFS_RT is not set
+ # CONFIG_GFS2_FS is not set
+ # CONFIG_OCFS2_FS is not set
+-# CONFIG_MINIX_FS is not set
+-# CONFIG_ROMFS_FS is not set
++CONFIG_DNOTIFY=y
+ CONFIG_INOTIFY=y
+ CONFIG_INOTIFY_USER=y
+ # CONFIG_QUOTA is not set
+-CONFIG_DNOTIFY=y
+ CONFIG_AUTOFS_FS=m
+ # CONFIG_AUTOFS4_FS is not set
+ # CONFIG_FUSE_FS is not set
+@@ -1447,8 +1478,10 @@ CONFIG_HFSPLUS_FS=m
+ # CONFIG_EFS_FS is not set
+ CONFIG_CRAMFS=y
+ # CONFIG_VXFS_FS is not set
++# CONFIG_MINIX_FS is not set
+ # CONFIG_HPFS_FS is not set
+ # CONFIG_QNX4FS_FS is not set
++# CONFIG_ROMFS_FS is not set
+ # CONFIG_SYSV_FS is not set
+ # CONFIG_UFS_FS is not set
+ CONFIG_NETWORK_FILESYSTEMS=y
+@@ -1546,7 +1579,6 @@ CONFIG_NLS_ISO8859_15=y
+ # CONFIG_NLS_KOI8_U is not set
+ CONFIG_NLS_UTF8=y
+ # CONFIG_DLM is not set
+-# CONFIG_UCC_SLOW is not set
+ 
+ #
+ # Library routines
+@@ -1564,11 +1596,6 @@ CONFIG_PLIST=y
+ CONFIG_HAS_IOMEM=y
+ CONFIG_HAS_IOPORT=y
+ CONFIG_HAS_DMA=y
+-CONFIG_INSTRUMENTATION=y
+-CONFIG_PROFILING=y
+-CONFIG_OPROFILE=y
+-# CONFIG_KPROBES is not set
+-# CONFIG_MARKERS is not set
+ 
+ #
+ # Kernel hacking
+@@ -1587,6 +1614,7 @@ CONFIG_SCHED_DEBUG=y
+ # CONFIG_SCHEDSTATS is not set
+ # CONFIG_TIMER_STATS 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
+@@ -1599,9 +1627,9 @@ CONFIG_DEBUG_BUGVERBOSE=y
+ # CONFIG_DEBUG_VM is not set
+ # CONFIG_DEBUG_LIST is not set
+ # CONFIG_DEBUG_SG is not set
+-CONFIG_FORCED_INLINING=y
+ # CONFIG_BOOT_PRINTK_DELAY is not set
+ # CONFIG_RCU_TORTURE_TEST is not set
++# CONFIG_BACKTRACE_SELF_TEST is not set
+ # CONFIG_FAULT_INJECTION is not set
+ # CONFIG_SAMPLES is not set
+ # CONFIG_DEBUG_STACKOVERFLOW is not set
+@@ -1621,7 +1649,9 @@ CONFIG_BOOTX_TEXT=y
+ # CONFIG_SECURITY_FILE_CAPABILITIES is not set
+ CONFIG_CRYPTO=y
+ 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_HMAC=y
+@@ -1640,6 +1670,9 @@ 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
+@@ -1655,11 +1688,13 @@ CONFIG_CRYPTO_ARC4=m
+ CONFIG_CRYPTO_KHAZAD=m
+ CONFIG_CRYPTO_ANUBIS=m
+ # CONFIG_CRYPTO_SEED is not set
++# CONFIG_CRYPTO_SALSA20 is not set
+ 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 is not set
++CONFIG_CRYPTO_AUTHENC=m
++# CONFIG_CRYPTO_LZO is not set
+ # CONFIG_CRYPTO_HW is not set
+ # CONFIG_PPC_CLOCK is not set
+diff --git a/arch/powerpc/configs/iseries_defconfig b/arch/powerpc/configs/iseries_defconfig
+index 4a87745..8d9a84f 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.24-rc3
+-# Wed Nov 21 11:19:59 2007
++# Linux kernel version: 2.6.25-rc6
++# Thu Mar 20 10:43:46 2008
+ #
+ CONFIG_PPC64=y
+ 
+@@ -28,6 +28,7 @@ CONFIG_GENERIC_TIME=y
+ CONFIG_GENERIC_TIME_VSYSCALL=y
+ CONFIG_GENERIC_CLOCKEVENTS=y
+ CONFIG_GENERIC_HARDIRQS=y
++CONFIG_HAVE_SETUP_PER_CPU_AREA=y
+ CONFIG_IRQ_PER_CPU=y
+ CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+ CONFIG_ARCH_HAS_ILOG2_U32=y
+@@ -68,8 +69,6 @@ CONFIG_SYSVIPC_SYSCTL=y
+ CONFIG_POSIX_MQUEUE=y
+ # CONFIG_BSD_PROCESS_ACCT is not set
+ # CONFIG_TASKSTATS is not set
+-# CONFIG_USER_NS is not set
+-# CONFIG_PID_NS is not set
+ CONFIG_AUDIT=y
+ CONFIG_AUDITSYSCALL=y
+ CONFIG_AUDIT_TREE=y
+@@ -77,11 +76,17 @@ CONFIG_IKCONFIG=y
+ CONFIG_IKCONFIG_PROC=y
+ CONFIG_LOG_BUF_SHIFT=17
+ # CONFIG_CGROUPS is not set
+-CONFIG_FAIR_GROUP_SCHED=y
+-CONFIG_FAIR_USER_SCHED=y
+-# CONFIG_FAIR_CGROUP_SCHED is not set
++# CONFIG_GROUP_SCHED is not set
++# CONFIG_USER_SCHED is not set
++# CONFIG_CGROUP_SCHED is not set
+ CONFIG_SYSFS_DEPRECATED=y
++CONFIG_SYSFS_DEPRECATED_V2=y
+ # CONFIG_RELAY is not set
++CONFIG_NAMESPACES=y
++# CONFIG_UTS_NS is not set
++# CONFIG_IPC_NS is not set
++# CONFIG_USER_NS is not set
++# CONFIG_PID_NS is not set
+ CONFIG_BLK_DEV_INITRD=y
+ CONFIG_INITRAMFS_SOURCE=""
+ CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+@@ -95,11 +100,13 @@ CONFIG_HOTPLUG=y
+ CONFIG_PRINTK=y
+ CONFIG_BUG=y
+ CONFIG_ELF_CORE=y
++# CONFIG_COMPAT_BRK is not set
+ CONFIG_BASE_FULL=y
+ CONFIG_FUTEX=y
+ CONFIG_ANON_INODES=y
+ CONFIG_EPOLL=y
+ CONFIG_SIGNALFD=y
++CONFIG_TIMERFD=y
+ CONFIG_EVENTFD=y
+ CONFIG_SHMEM=y
+ CONFIG_VM_EVENT_COUNTERS=y
+@@ -107,6 +114,14 @@ CONFIG_SLUB_DEBUG=y
+ # CONFIG_SLAB is not set
+ CONFIG_SLUB=y
+ # CONFIG_SLOB is not set
++# CONFIG_PROFILING is not set
++# CONFIG_MARKERS is not set
++CONFIG_HAVE_OPROFILE=y
++# CONFIG_KPROBES is not set
++CONFIG_HAVE_KPROBES=y
++CONFIG_HAVE_KRETPROBES=y
++CONFIG_PROC_PAGE_MONITOR=y
++CONFIG_SLABINFO=y
+ CONFIG_RT_MUTEXES=y
+ # CONFIG_TINY_SHMEM is not set
+ CONFIG_BASE_SMALL=0
+@@ -134,6 +149,7 @@ CONFIG_DEFAULT_AS=y
+ # CONFIG_DEFAULT_CFQ is not set
+ # CONFIG_DEFAULT_NOOP is not set
+ CONFIG_DEFAULT_IOSCHED="anticipatory"
++CONFIG_CLASSIC_RCU=y
+ 
+ #
+ # Platform support
+@@ -153,8 +169,8 @@ CONFIG_VIODASD=y
+ CONFIG_VIOCD=m
+ CONFIG_VIOTAPE=m
+ CONFIG_VIOPATH=y
+-# CONFIG_PPC_MPC52xx is not set
+-# CONFIG_PPC_MPC5200 is not set
++# CONFIG_PPC_MPC512x is not set
++# CONFIG_PPC_MPC5121 is not set
+ # CONFIG_PPC_PMAC is not set
+ # CONFIG_PPC_MAPLE is not set
+ # CONFIG_PPC_PASEMI is not set
+@@ -164,6 +180,7 @@ CONFIG_VIOPATH=y
+ # CONFIG_PPC_CELL_NATIVE is not set
+ # CONFIG_PPC_IBM_CELL_BLADE is not set
+ # CONFIG_PQ2ADS is not set
++# CONFIG_IPIC is not set
+ # CONFIG_MPIC is not set
+ # CONFIG_MPIC_WEIRD is not set
+ # CONFIG_PPC_I8259 is not set
+@@ -176,7 +193,6 @@ CONFIG_IBMVIO=y
+ CONFIG_PPC_INDIRECT_IO=y
+ CONFIG_GENERIC_IOMAP=y
+ # CONFIG_CPU_FREQ is not set
+-# CONFIG_CPM2 is not set
+ # CONFIG_FSL_ULI1575 is not set
+ 
+ #
+@@ -191,15 +207,19 @@ CONFIG_HZ_250=y
+ # CONFIG_HZ_300 is not set
+ # CONFIG_HZ_1000 is not set
+ CONFIG_HZ=250
++# CONFIG_SCHED_HRTICK is not set
+ CONFIG_PREEMPT_NONE=y
+ # CONFIG_PREEMPT_VOLUNTARY is not set
+ # CONFIG_PREEMPT is not set
+-# CONFIG_PREEMPT_BKL is not set
+ 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
++CONFIG_ARCH_HAS_WALK_MEMORY=y
++CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
+ # CONFIG_KEXEC is not set
+ # CONFIG_CRASH_DUMP is not set
+ CONFIG_IRQ_ALL_CPUS=y
+@@ -227,7 +247,6 @@ CONFIG_PROC_DEVICETREE=y
+ # CONFIG_CMDLINE_BOOL is not set
+ # CONFIG_PM is not set
+ CONFIG_SECCOMP=y
+-# CONFIG_WANT_DEVICE_TREE is not set
+ CONFIG_ISA_DMA_API=y
+ 
+ #
+@@ -263,6 +282,7 @@ CONFIG_XFRM=y
+ CONFIG_XFRM_USER=m
+ CONFIG_XFRM_SUB_POLICY=y
+ # CONFIG_XFRM_MIGRATE is not set
++# CONFIG_XFRM_STATISTICS is not set
+ CONFIG_NET_KEY=m
+ # CONFIG_NET_KEY_MIGRATE is not set
+ CONFIG_INET=y
+@@ -297,12 +317,14 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
+ # CONFIG_NETWORK_SECMARK is not set
+ CONFIG_NETFILTER=y
+ # CONFIG_NETFILTER_DEBUG is not set
++CONFIG_NETFILTER_ADVANCED=y
+ 
+ #
+ # Core Netfilter Configuration
+ #
+-# CONFIG_NETFILTER_NETLINK is not set
+-CONFIG_NF_CONNTRACK_ENABLED=m
++CONFIG_NETFILTER_NETLINK=m
++CONFIG_NETFILTER_NETLINK_QUEUE=m
++CONFIG_NETFILTER_NETLINK_LOG=m
+ CONFIG_NF_CONNTRACK=m
+ # CONFIG_NF_CT_ACCT is not set
+ CONFIG_NF_CONNTRACK_MARK=y
+@@ -318,6 +340,7 @@ CONFIG_NF_CONNTRACK_IRC=m
+ # CONFIG_NF_CONNTRACK_SANE is not set
+ # CONFIG_NF_CONNTRACK_SIP is not set
+ CONFIG_NF_CONNTRACK_TFTP=m
++CONFIG_NF_CT_NETLINK=m
+ CONFIG_NETFILTER_XTABLES=m
+ CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
+ CONFIG_NETFILTER_XT_TARGET_CONNMARK=m
+@@ -326,8 +349,10 @@ CONFIG_NETFILTER_XT_TARGET_MARK=m
+ CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
+ # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
+ # CONFIG_NETFILTER_XT_TARGET_NOTRACK is not set
++CONFIG_NETFILTER_XT_TARGET_RATEEST=m
+ # CONFIG_NETFILTER_XT_TARGET_TRACE is not set
+ # CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
++CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m
+ CONFIG_NETFILTER_XT_MATCH_COMMENT=m
+ # CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set
+ # CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set
+@@ -337,14 +362,17 @@ CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
+ CONFIG_NETFILTER_XT_MATCH_DSCP=m
+ # CONFIG_NETFILTER_XT_MATCH_ESP is not set
+ # CONFIG_NETFILTER_XT_MATCH_HELPER is not set
++CONFIG_NETFILTER_XT_MATCH_IPRANGE=m
+ CONFIG_NETFILTER_XT_MATCH_LENGTH=m
+ CONFIG_NETFILTER_XT_MATCH_LIMIT=m
+ CONFIG_NETFILTER_XT_MATCH_MAC=m
+ CONFIG_NETFILTER_XT_MATCH_MARK=m
++CONFIG_NETFILTER_XT_MATCH_OWNER=m
+ # CONFIG_NETFILTER_XT_MATCH_POLICY is not set
+ # CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
+ CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
+ # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
++CONFIG_NETFILTER_XT_MATCH_RATEEST=m
+ CONFIG_NETFILTER_XT_MATCH_REALM=m
+ CONFIG_NETFILTER_XT_MATCH_SCTP=m
+ # CONFIG_NETFILTER_XT_MATCH_STATE is not set
+@@ -362,13 +390,10 @@ CONFIG_NF_CONNTRACK_IPV4=m
+ CONFIG_NF_CONNTRACK_PROC_COMPAT=y
+ CONFIG_IP_NF_QUEUE=m
+ CONFIG_IP_NF_IPTABLES=m
+-CONFIG_IP_NF_MATCH_IPRANGE=m
+-CONFIG_IP_NF_MATCH_TOS=m
+ CONFIG_IP_NF_MATCH_RECENT=m
+ CONFIG_IP_NF_MATCH_ECN=m
+ # CONFIG_IP_NF_MATCH_AH is not set
+ CONFIG_IP_NF_MATCH_TTL=m
+-CONFIG_IP_NF_MATCH_OWNER=m
+ CONFIG_IP_NF_MATCH_ADDRTYPE=m
+ CONFIG_IP_NF_FILTER=m
+ CONFIG_IP_NF_TARGET_REJECT=m
+@@ -379,7 +404,6 @@ CONFIG_NF_NAT_NEEDED=y
+ CONFIG_IP_NF_TARGET_MASQUERADE=m
+ CONFIG_IP_NF_TARGET_REDIRECT=m
+ CONFIG_IP_NF_TARGET_NETMAP=m
+-CONFIG_IP_NF_TARGET_SAME=m
+ # CONFIG_NF_NAT_SNMP_BASIC is not set
+ CONFIG_NF_NAT_FTP=m
+ CONFIG_NF_NAT_IRC=m
+@@ -389,7 +413,6 @@ CONFIG_NF_NAT_TFTP=m
+ # CONFIG_NF_NAT_H323 is not set
+ # CONFIG_NF_NAT_SIP is not set
+ CONFIG_IP_NF_MANGLE=m
+-CONFIG_IP_NF_TARGET_TOS=m
+ CONFIG_IP_NF_TARGET_ECN=m
+ CONFIG_IP_NF_TARGET_TTL=m
+ CONFIG_IP_NF_TARGET_CLUSTERIP=m
+@@ -425,6 +448,7 @@ CONFIG_NET_CLS_ROUTE=y
+ #
+ # CONFIG_NET_PKTGEN is not set
+ # CONFIG_HAMRADIO is not set
++# CONFIG_CAN is not set
+ # CONFIG_IRDA is not set
+ # CONFIG_BT is not set
+ # CONFIG_AF_RXRPC is not set
+@@ -470,7 +494,7 @@ CONFIG_BLK_DEV_NBD=m
+ CONFIG_BLK_DEV_RAM=y
+ CONFIG_BLK_DEV_RAM_COUNT=16
+ CONFIG_BLK_DEV_RAM_SIZE=65536
+-CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
++# CONFIG_BLK_DEV_XIP is not set
+ # CONFIG_CDROM_PKTCDVD is not set
+ # CONFIG_ATA_OVER_ETH is not set
+ CONFIG_MISC_DEVICES=y
+@@ -478,6 +502,8 @@ CONFIG_MISC_DEVICES=y
+ # CONFIG_EEPROM_93CX6 is not set
+ # CONFIG_SGI_IOC4 is not set
+ # CONFIG_TIFM_CORE is not set
++# CONFIG_ENCLOSURE_SERVICES is not set
++CONFIG_HAVE_IDE=y
+ # CONFIG_IDE is not set
+ 
+ #
+@@ -518,6 +544,7 @@ CONFIG_SCSI_FC_ATTRS=y
+ # CONFIG_SCSI_ISCSI_ATTRS is not set
+ CONFIG_SCSI_SAS_ATTRS=m
+ CONFIG_SCSI_SAS_LIBSAS=m
++CONFIG_SCSI_SAS_HOST_SMP=y
+ CONFIG_SCSI_SAS_LIBSAS_DEBUG=y
+ CONFIG_SCSI_SRP_ATTRS=m
+ CONFIG_SCSI_LOWLEVEL=y
+@@ -543,6 +570,7 @@ CONFIG_SCSI_LOWLEVEL=y
+ CONFIG_SCSI_IBMVSCSI=m
+ # CONFIG_SCSI_INITIO is not set
+ # CONFIG_SCSI_INIA100 is not set
++# CONFIG_SCSI_MVSAS is not set
+ # CONFIG_SCSI_STEX is not set
+ # CONFIG_SCSI_SYM53C8XX_2 is not set
+ # CONFIG_SCSI_QLOGIC_1280 is not set
+@@ -589,7 +617,6 @@ CONFIG_BONDING=m
+ # CONFIG_EQUALIZER is not set
+ CONFIG_TUN=m
+ # CONFIG_VETH is not set
+-# CONFIG_IP1000 is not set
+ # CONFIG_ARCNET is not set
+ # CONFIG_PHYLIB is not set
+ CONFIG_NET_ETHERNET=y
+@@ -618,6 +645,7 @@ CONFIG_E100=y
+ # CONFIG_NE2K_PCI is not set
+ # CONFIG_8139CP is not set
+ # CONFIG_8139TOO is not set
++# CONFIG_R6040 is not set
+ # CONFIG_SIS900 is not set
+ # CONFIG_EPIC100 is not set
+ # CONFIG_SUNDANCE is not set
+@@ -631,6 +659,9 @@ CONFIG_E1000=m
+ # CONFIG_E1000_NAPI is not set
+ # CONFIG_E1000_DISABLE_PACKET_SPLIT is not set
+ # CONFIG_E1000E is not set
++# CONFIG_E1000E_ENABLED is not set
++# CONFIG_IP1000 is not set
++# CONFIG_IGB is not set
+ # CONFIG_NS83820 is not set
+ # CONFIG_HAMACHI is not set
+ # CONFIG_YELLOWFIN is not set
+@@ -656,6 +687,7 @@ CONFIG_NETDEV_10000=y
+ # CONFIG_PASEMI_MAC is not set
+ # CONFIG_MLX4_CORE is not set
+ # CONFIG_TEHUTI is not set
++# CONFIG_BNX2X is not set
+ CONFIG_TR=y
+ CONFIG_IBMOL=y
+ # CONFIG_3C359 is not set
+@@ -683,7 +715,6 @@ CONFIG_PPPOE=m
+ # CONFIG_SLIP is not set
+ CONFIG_SLHC=m
+ # CONFIG_NET_FC is not set
+-# CONFIG_SHAPER is not set
+ CONFIG_NETCONSOLE=y
+ # CONFIG_NETCONSOLE_DYNAMIC is not set
+ CONFIG_NETPOLL=y
+@@ -734,6 +765,7 @@ CONFIG_VT_CONSOLE=y
+ CONFIG_HW_CONSOLE=y
+ # CONFIG_VT_HW_CONSOLE_BINDING is not set
+ # CONFIG_SERIAL_NONSTANDARD is not set
++# CONFIG_NOZOMI is not set
+ 
+ #
+ # Serial drivers
+@@ -772,6 +804,7 @@ CONFIG_DEVPORT=y
+ # CONFIG_W1 is not set
+ # CONFIG_POWER_SUPPLY is not set
+ # CONFIG_HWMON is not set
++# CONFIG_THERMAL is not set
+ # CONFIG_WATCHDOG is not set
+ 
+ #
+@@ -821,10 +854,12 @@ CONFIG_DUMMY_CONSOLE=y
+ # CONFIG_HID_SUPPORT is not set
+ # CONFIG_USB_SUPPORT is not set
+ # CONFIG_MMC is not set
++# CONFIG_MEMSTICK is not set
+ # CONFIG_NEW_LEDS 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
+@@ -869,12 +904,10 @@ CONFIG_GFS2_FS=m
+ CONFIG_GFS2_FS_LOCKING_NOLOCK=m
+ CONFIG_GFS2_FS_LOCKING_DLM=m
+ # CONFIG_OCFS2_FS is not set
+-# CONFIG_MINIX_FS is not set
+-# CONFIG_ROMFS_FS is not set
++CONFIG_DNOTIFY=y
+ CONFIG_INOTIFY=y
+ CONFIG_INOTIFY_USER=y
+ # CONFIG_QUOTA is not set
+-CONFIG_DNOTIFY=y
+ CONFIG_AUTOFS_FS=m
+ # CONFIG_AUTOFS4_FS is not set
+ # CONFIG_FUSE_FS is not set
+@@ -924,8 +957,10 @@ CONFIG_CONFIGFS_FS=m
+ # CONFIG_EFS_FS is not set
+ CONFIG_CRAMFS=y
+ # CONFIG_VXFS_FS is not set
++# CONFIG_MINIX_FS is not set
+ # CONFIG_HPFS_FS is not set
+ # CONFIG_QNX4FS_FS is not set
++# CONFIG_ROMFS_FS is not set
+ # CONFIG_SYSV_FS is not set
+ # CONFIG_UFS_FS is not set
+ CONFIG_NETWORK_FILESYSTEMS=y
+@@ -1009,7 +1044,6 @@ CONFIG_NLS_ISO8859_1=y
+ # CONFIG_NLS_UTF8 is not set
+ CONFIG_DLM=m
+ # CONFIG_DLM_DEBUG is not set
+-# CONFIG_UCC_SLOW is not set
+ 
+ #
+ # Library routines
+@@ -1031,10 +1065,6 @@ CONFIG_PLIST=y
+ CONFIG_HAS_IOMEM=y
+ CONFIG_HAS_IOPORT=y
+ CONFIG_HAS_DMA=y
+-CONFIG_INSTRUMENTATION=y
+-# CONFIG_PROFILING is not set
+-# CONFIG_KPROBES is not set
+-# CONFIG_MARKERS is not set
+ 
+ #
+ # Kernel hacking
+@@ -1053,6 +1083,7 @@ CONFIG_SCHED_DEBUG=y
+ # CONFIG_SCHEDSTATS is not set
+ # CONFIG_TIMER_STATS 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
+@@ -1065,9 +1096,9 @@ CONFIG_DEBUG_BUGVERBOSE=y
+ # CONFIG_DEBUG_VM is not set
+ # CONFIG_DEBUG_LIST is not set
+ # CONFIG_DEBUG_SG is not set
+-# CONFIG_FORCED_INLINING is not set
+ # CONFIG_BOOT_PRINTK_DELAY is not set
+ # CONFIG_RCU_TORTURE_TEST is not set
++# CONFIG_BACKTRACE_SELF_TEST is not set
+ # CONFIG_FAULT_INJECTION is not set
+ # CONFIG_SAMPLES is not set
+ CONFIG_DEBUG_STACKOVERFLOW=y
+@@ -1089,6 +1120,7 @@ CONFIG_CRYPTO=y
+ 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_HMAC=y
+@@ -1107,6 +1139,9 @@ 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
+@@ -1122,11 +1157,13 @@ CONFIG_CRYPTO_ARC4=m
+ CONFIG_CRYPTO_KHAZAD=m
+ CONFIG_CRYPTO_ANUBIS=m
+ CONFIG_CRYPTO_SEED=m
++# CONFIG_CRYPTO_SALSA20 is not set
+ 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
+diff --git a/arch/powerpc/configs/pmac32_defconfig b/arch/powerpc/configs/pmac32_defconfig
+index 5416be4..558b0d3 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.24-rc4
+-# Thu Dec  6 16:49:05 2007
++# Linux kernel version: 2.6.25-rc6
++# Thu Mar 20 11:05:14 2008
+ #
+ # CONFIG_PPC64 is not set
+ 
+@@ -29,6 +29,7 @@ CONFIG_GENERIC_TIME=y
+ CONFIG_GENERIC_TIME_VSYSCALL=y
+ CONFIG_GENERIC_CLOCKEVENTS=y
+ CONFIG_GENERIC_HARDIRQS=y
++# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
+ CONFIG_IRQ_PER_CPU=y
+ CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+ CONFIG_ARCH_HAS_ILOG2_U32=y
+@@ -49,6 +50,9 @@ CONFIG_AUDIT_ARCH=y
+ CONFIG_GENERIC_BUG=y
+ CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+ # CONFIG_DEFAULT_UIMAGE is not set
++CONFIG_HIBERNATE_32=y
++CONFIG_ARCH_HIBERNATION_POSSIBLE=y
++CONFIG_ARCH_SUSPEND_POSSIBLE=y
+ # CONFIG_PPC_DCR_NATIVE is not set
+ # CONFIG_PPC_DCR_MMIO is not set
+ CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+@@ -67,18 +71,22 @@ CONFIG_SYSVIPC_SYSCTL=y
+ CONFIG_POSIX_MQUEUE=y
+ # CONFIG_BSD_PROCESS_ACCT is not set
+ # CONFIG_TASKSTATS 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_GROUP_SCHED is not set
++# CONFIG_USER_SCHED is not set
++# CONFIG_CGROUP_SCHED is not set
+ CONFIG_SYSFS_DEPRECATED=y
++CONFIG_SYSFS_DEPRECATED_V2=y
+ # CONFIG_RELAY is not set
++CONFIG_NAMESPACES=y
++# CONFIG_UTS_NS is not set
++# CONFIG_IPC_NS is not set
++# CONFIG_USER_NS is not set
++# CONFIG_PID_NS is not set
+ CONFIG_BLK_DEV_INITRD=y
+ CONFIG_INITRAMFS_SOURCE=""
+ # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+@@ -92,11 +100,13 @@ CONFIG_HOTPLUG=y
+ CONFIG_PRINTK=y
+ CONFIG_BUG=y
+ CONFIG_ELF_CORE=y
++# CONFIG_COMPAT_BRK is not set
+ CONFIG_BASE_FULL=y
+ CONFIG_FUTEX=y
+ CONFIG_ANON_INODES=y
+ CONFIG_EPOLL=y
+ CONFIG_SIGNALFD=y
++CONFIG_TIMERFD=y
+ CONFIG_EVENTFD=y
+ CONFIG_SHMEM=y
+ CONFIG_VM_EVENT_COUNTERS=y
+@@ -104,6 +114,15 @@ CONFIG_SLUB_DEBUG=y
+ # CONFIG_SLAB is not set
+ CONFIG_SLUB=y
+ # CONFIG_SLOB is not set
++CONFIG_PROFILING=y
++# CONFIG_MARKERS is not set
++CONFIG_OPROFILE=y
++CONFIG_HAVE_OPROFILE=y
++# CONFIG_KPROBES is not set
++CONFIG_HAVE_KPROBES=y
++CONFIG_HAVE_KRETPROBES=y
++CONFIG_PROC_PAGE_MONITOR=y
++CONFIG_SLABINFO=y
+ CONFIG_RT_MUTEXES=y
+ # CONFIG_TINY_SHMEM is not set
+ CONFIG_BASE_SMALL=0
+@@ -131,6 +150,7 @@ CONFIG_DEFAULT_AS=y
+ # CONFIG_DEFAULT_CFQ is not set
+ # CONFIG_DEFAULT_NOOP is not set
+ CONFIG_DEFAULT_IOSCHED="anticipatory"
++CONFIG_CLASSIC_RCU=y
+ 
+ #
+ # Platform support
+@@ -141,16 +161,17 @@ CONFIG_PPC_MULTIPLATFORM=y
+ # CONFIG_PPC_86xx is not set
+ CONFIG_CLASSIC32=y
+ # CONFIG_PPC_CHRP is not set
++# CONFIG_PPC_MPC512x is not set
++# CONFIG_PPC_MPC5121 is not set
++# CONFIG_MPC5121_ADS is not set
+ # CONFIG_PPC_MPC52xx is not set
+-# CONFIG_PPC_MPC5200 is not set
+-# CONFIG_PPC_EFIKA is not set
+-# CONFIG_PPC_LITE5200 is not set
+ CONFIG_PPC_PMAC=y
+ # CONFIG_PPC_CELL is not set
+ # CONFIG_PPC_CELL_NATIVE is not set
+ # CONFIG_PQ2ADS is not set
+ # CONFIG_EMBEDDED6xx is not set
+ CONFIG_PPC_NATIVE=y
++# CONFIG_IPIC is not set
+ CONFIG_MPIC=y
+ # CONFIG_MPIC_WEIRD is not set
+ # CONFIG_PPC_I8259 is not set
+@@ -181,7 +202,6 @@ CONFIG_CPU_FREQ_GOV_USERSPACE=y
+ CONFIG_CPU_FREQ_PMAC=y
+ CONFIG_PPC601_SYNC_FIX=y
+ # CONFIG_TAU is not set
+-# CONFIG_CPM2 is not set
+ # CONFIG_FSL_ULI1575 is not set
+ 
+ #
+@@ -197,12 +217,16 @@ CONFIG_HZ_250=y
+ # CONFIG_HZ_300 is not set
+ # CONFIG_HZ_1000 is not set
+ CONFIG_HZ=250
++# CONFIG_SCHED_HRTICK is not set
+ CONFIG_PREEMPT_NONE=y
+ # CONFIG_PREEMPT_VOLUNTARY is not set
+ # CONFIG_PREEMPT is not set
+ CONFIG_BINFMT_ELF=y
+ CONFIG_BINFMT_MISC=m
++# CONFIG_IOMMU_HELPER is not set
+ CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
++CONFIG_ARCH_HAS_WALK_MEMORY=y
++CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
+ # CONFIG_KEXEC is not set
+ CONFIG_ARCH_FLATMEM_ENABLE=y
+ CONFIG_ARCH_POPULATES_NODE_MAP=y
+@@ -221,19 +245,19 @@ CONFIG_BOUNCE=y
+ CONFIG_VIRT_TO_BUS=y
+ 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
+ CONFIG_PM_SLEEP=y
+-CONFIG_SUSPEND_UP_POSSIBLE=y
+ CONFIG_SUSPEND=y
+-CONFIG_HIBERNATION_UP_POSSIBLE=y
++CONFIG_SUSPEND_FREEZER=y
+ CONFIG_HIBERNATION=y
+ CONFIG_PM_STD_PARTITION=""
+ CONFIG_APM_EMULATION=y
+ CONFIG_SECCOMP=y
+-# CONFIG_WANT_DEVICE_TREE is not set
+ CONFIG_ISA_DMA_API=y
+ 
+ #
+@@ -300,6 +324,7 @@ CONFIG_XFRM=y
+ CONFIG_XFRM_USER=y
+ # CONFIG_XFRM_SUB_POLICY is not set
+ # CONFIG_XFRM_MIGRATE is not set
++# CONFIG_XFRM_STATISTICS is not set
+ CONFIG_NET_KEY=y
+ # CONFIG_NET_KEY_MIGRATE is not set
+ CONFIG_INET=y
+@@ -334,12 +359,14 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
+ # CONFIG_NETWORK_SECMARK is not set
+ CONFIG_NETFILTER=y
+ # CONFIG_NETFILTER_DEBUG is not set
++CONFIG_NETFILTER_ADVANCED=y
+ 
+ #
+ # Core Netfilter Configuration
+ #
+-# CONFIG_NETFILTER_NETLINK is not set
+-CONFIG_NF_CONNTRACK_ENABLED=m
++CONFIG_NETFILTER_NETLINK=m
++CONFIG_NETFILTER_NETLINK_QUEUE=m
++CONFIG_NETFILTER_NETLINK_LOG=m
+ CONFIG_NF_CONNTRACK=m
+ # CONFIG_NF_CT_ACCT is not set
+ # CONFIG_NF_CONNTRACK_MARK is not set
+@@ -355,6 +382,7 @@ CONFIG_NF_CONNTRACK_IRC=m
+ # CONFIG_NF_CONNTRACK_SANE is not set
+ # CONFIG_NF_CONNTRACK_SIP is not set
+ CONFIG_NF_CONNTRACK_TFTP=m
++CONFIG_NF_CT_NETLINK=m
+ CONFIG_NETFILTER_XTABLES=m
+ CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
+ # CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set
+@@ -363,8 +391,10 @@ CONFIG_NETFILTER_XT_TARGET_MARK=m
+ CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
+ CONFIG_NETFILTER_XT_TARGET_NFLOG=m
+ CONFIG_NETFILTER_XT_TARGET_NOTRACK=m
++CONFIG_NETFILTER_XT_TARGET_RATEEST=m
+ CONFIG_NETFILTER_XT_TARGET_TRACE=m
+ CONFIG_NETFILTER_XT_TARGET_TCPMSS=m
++CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m
+ CONFIG_NETFILTER_XT_MATCH_COMMENT=m
+ # CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set
+ CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m
+@@ -374,14 +404,17 @@ CONFIG_NETFILTER_XT_MATCH_DCCP=m
+ CONFIG_NETFILTER_XT_MATCH_DSCP=m
+ CONFIG_NETFILTER_XT_MATCH_ESP=m
+ CONFIG_NETFILTER_XT_MATCH_HELPER=m
++CONFIG_NETFILTER_XT_MATCH_IPRANGE=m
+ CONFIG_NETFILTER_XT_MATCH_LENGTH=m
+ CONFIG_NETFILTER_XT_MATCH_LIMIT=m
+ CONFIG_NETFILTER_XT_MATCH_MAC=m
+ CONFIG_NETFILTER_XT_MATCH_MARK=m
++CONFIG_NETFILTER_XT_MATCH_OWNER=m
+ CONFIG_NETFILTER_XT_MATCH_POLICY=m
+ CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
+ CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
+ # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
++CONFIG_NETFILTER_XT_MATCH_RATEEST=m
+ CONFIG_NETFILTER_XT_MATCH_REALM=m
+ CONFIG_NETFILTER_XT_MATCH_SCTP=m
+ # CONFIG_NETFILTER_XT_MATCH_STATE is not set
+@@ -399,13 +432,10 @@ CONFIG_NF_CONNTRACK_IPV4=m
+ CONFIG_NF_CONNTRACK_PROC_COMPAT=y
+ # CONFIG_IP_NF_QUEUE is not set
+ CONFIG_IP_NF_IPTABLES=m
+-CONFIG_IP_NF_MATCH_IPRANGE=m
+-CONFIG_IP_NF_MATCH_TOS=m
+ CONFIG_IP_NF_MATCH_RECENT=m
+ CONFIG_IP_NF_MATCH_ECN=m
+ CONFIG_IP_NF_MATCH_AH=m
+ CONFIG_IP_NF_MATCH_TTL=m
+-CONFIG_IP_NF_MATCH_OWNER=m
+ CONFIG_IP_NF_MATCH_ADDRTYPE=m
+ CONFIG_IP_NF_FILTER=m
+ CONFIG_IP_NF_TARGET_REJECT=m
+@@ -416,7 +446,6 @@ CONFIG_NF_NAT_NEEDED=y
+ CONFIG_IP_NF_TARGET_MASQUERADE=m
+ CONFIG_IP_NF_TARGET_REDIRECT=m
+ CONFIG_IP_NF_TARGET_NETMAP=m
+-CONFIG_IP_NF_TARGET_SAME=m
+ # CONFIG_NF_NAT_SNMP_BASIC is not set
+ CONFIG_NF_NAT_FTP=m
+ CONFIG_NF_NAT_IRC=m
+@@ -426,7 +455,6 @@ CONFIG_NF_NAT_TFTP=m
+ # CONFIG_NF_NAT_H323 is not set
+ # CONFIG_NF_NAT_SIP is not set
+ CONFIG_IP_NF_MANGLE=m
+-CONFIG_IP_NF_TARGET_TOS=m
+ CONFIG_IP_NF_TARGET_ECN=m
+ CONFIG_IP_NF_TARGET_TTL=m
+ # CONFIG_IP_NF_TARGET_CLUSTERIP is not set
+@@ -444,9 +472,9 @@ CONFIG_IP_DCCP_ACKVEC=y
+ CONFIG_IP_DCCP_CCID2=m
+ # CONFIG_IP_DCCP_CCID2_DEBUG is not set
+ CONFIG_IP_DCCP_CCID3=m
+-CONFIG_IP_DCCP_TFRC_LIB=m
+ # CONFIG_IP_DCCP_CCID3_DEBUG is not set
+ CONFIG_IP_DCCP_CCID3_RTO=100
++CONFIG_IP_DCCP_TFRC_LIB=m
+ 
+ #
+ # DCCP Kernel Hacking
+@@ -474,6 +502,7 @@ CONFIG_NET_SCH_FIFO=y
+ #
+ # CONFIG_NET_PKTGEN is not set
+ # CONFIG_HAMRADIO is not set
++# CONFIG_CAN is not set
+ CONFIG_IRDA=m
+ 
+ #
+@@ -509,15 +538,6 @@ CONFIG_IRTTY_SIR=m
+ # CONFIG_KS959_DONGLE is not set
+ 
+ #
+-# Old SIR device drivers
+-#
+-# CONFIG_IRPORT_SIR is not set
+-
+-#
+-# Old Serial dongle support
+-#
+-
+-#
+ # FIR device drivers
+ #
+ # CONFIG_USB_IRDA is not set
+@@ -563,8 +583,26 @@ CONFIG_CFG80211=m
+ CONFIG_NL80211=y
+ CONFIG_WIRELESS_EXT=y
+ CONFIG_MAC80211=m
+-CONFIG_MAC80211_RCSIMPLE=y
++
++#
++# 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
++
++#
++# Selecting 'y' for an algorithm will
++#
++
++#
++# build the algorithm into mac80211.
++#
++CONFIG_MAC80211_RC_DEFAULT="pid"
++CONFIG_MAC80211_RC_PID=y
++# CONFIG_MAC80211_RC_SIMPLE is not set
+ CONFIG_MAC80211_LEDS=y
++# CONFIG_MAC80211_DEBUG_PACKET_ALIGNMENT is not set
+ # CONFIG_MAC80211_DEBUG is not set
+ CONFIG_IEEE80211=m
+ # CONFIG_IEEE80211_DEBUG is not set
+@@ -610,7 +648,7 @@ CONFIG_BLK_DEV_UB=m
+ CONFIG_BLK_DEV_RAM=y
+ CONFIG_BLK_DEV_RAM_COUNT=16
+ CONFIG_BLK_DEV_RAM_SIZE=4096
+-CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
++# CONFIG_BLK_DEV_XIP is not set
+ # CONFIG_CDROM_PKTCDVD is not set
+ # CONFIG_ATA_OVER_ETH is not set
+ CONFIG_MISC_DEVICES=y
+@@ -618,11 +656,13 @@ CONFIG_MISC_DEVICES=y
+ # CONFIG_EEPROM_93CX6 is not set
+ # CONFIG_SGI_IOC4 is not set
+ # CONFIG_TIFM_CORE is not set
++# CONFIG_ENCLOSURE_SERVICES is not set
++CONFIG_HAVE_IDE=y
+ CONFIG_IDE=y
+ CONFIG_BLK_DEV_IDE=y
+ 
+ #
+-# Please see Documentation/ide.txt for help/info on IDE drives
++# Please see Documentation/ide/ide.txt for help/info on IDE drives
+ #
+ # CONFIG_BLK_DEV_IDE_SATA is not set
+ CONFIG_BLK_DEV_IDEDISK=y
+@@ -630,6 +670,7 @@ CONFIG_BLK_DEV_IDEDISK=y
+ CONFIG_BLK_DEV_IDECS=m
+ # CONFIG_BLK_DEV_DELKIN is not set
+ CONFIG_BLK_DEV_IDECD=y
++CONFIG_BLK_DEV_IDECD_VERBOSE_ERRORS=y
+ # CONFIG_BLK_DEV_IDETAPE is not set
+ CONFIG_BLK_DEV_IDEFLOPPY=y
+ CONFIG_BLK_DEV_IDESCSI=y
+@@ -641,12 +682,12 @@ CONFIG_IDE_PROC_FS=y
+ #
+ # CONFIG_IDE_GENERIC is not set
+ # CONFIG_BLK_DEV_PLATFORM is not set
++CONFIG_BLK_DEV_IDEDMA_SFF=y
+ 
+ #
+ # PCI IDE chipsets support
+ #
+ CONFIG_BLK_DEV_IDEPCI=y
+-CONFIG_IDEPCI_SHARE_IRQ=y
+ CONFIG_IDEPCI_PCIBUS_ORDER=y
+ # CONFIG_BLK_DEV_OFFBOARD is not set
+ CONFIG_BLK_DEV_GENERIC=y
+@@ -680,7 +721,6 @@ CONFIG_BLK_DEV_SL82C105=y
+ CONFIG_BLK_DEV_IDE_PMAC=y
+ CONFIG_BLK_DEV_IDE_PMAC_ATA100FIRST=y
+ CONFIG_BLK_DEV_IDEDMA_PMAC=y
+-# CONFIG_IDE_ARM is not set
+ CONFIG_BLK_DEV_IDEDMA=y
+ CONFIG_IDE_ARCH_OBSOLETE_INIT=y
+ # CONFIG_BLK_DEV_HD is not set
+@@ -754,6 +794,7 @@ CONFIG_SCSI_AIC7XXX_OLD=m
+ # CONFIG_SCSI_IPS is not set
+ # CONFIG_SCSI_INITIO is not set
+ # CONFIG_SCSI_INIA100 is not set
++# CONFIG_SCSI_MVSAS is not set
+ # CONFIG_SCSI_STEX is not set
+ CONFIG_SCSI_SYM53C8XX_2=y
+ CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0
+@@ -848,7 +889,6 @@ CONFIG_DUMMY=m
+ # CONFIG_EQUALIZER is not set
+ CONFIG_TUN=m
+ # CONFIG_VETH is not set
+-# CONFIG_IP1000 is not set
+ # CONFIG_ARCNET is not set
+ # CONFIG_PHYLIB is not set
+ CONFIG_NET_ETHERNET=y
+@@ -880,6 +920,7 @@ CONFIG_PCNET32=y
+ # CONFIG_NE2K_PCI is not set
+ # CONFIG_8139CP is not set
+ # CONFIG_8139TOO is not set
++# CONFIG_R6040 is not set
+ # CONFIG_SIS900 is not set
+ # CONFIG_EPIC100 is not set
+ # CONFIG_SUNDANCE is not set
+@@ -891,6 +932,9 @@ CONFIG_NETDEV_1000=y
+ # CONFIG_DL2K is not set
+ # CONFIG_E1000 is not set
+ # CONFIG_E1000E is not set
++# CONFIG_E1000E_ENABLED is not set
++# CONFIG_IP1000 is not set
++# CONFIG_IGB is not set
+ # CONFIG_NS83820 is not set
+ # CONFIG_HAMACHI is not set
+ # CONFIG_YELLOWFIN is not set
+@@ -916,6 +960,7 @@ CONFIG_NETDEV_10000=y
+ # CONFIG_NIU is not set
+ # CONFIG_MLX4_CORE is not set
+ # CONFIG_TEHUTI is not set
++# CONFIG_BNX2X is not set
+ # CONFIG_TR is not set
+ 
+ #
+@@ -941,12 +986,16 @@ CONFIG_PCMCIA_HERMES=m
+ # CONFIG_PCMCIA_WL3501 is not set
+ CONFIG_PRISM54=m
+ # CONFIG_USB_ZD1201 is not set
++# CONFIG_USB_NET_RNDIS_WLAN is not set
++# CONFIG_RTL8180 is not set
+ # CONFIG_RTL8187 is not set
+ # CONFIG_ADM8211 is not set
+ CONFIG_P54_COMMON=m
+ # CONFIG_P54_USB is not set
+ # CONFIG_P54_PCI is not set
+-# CONFIG_IWLWIFI is not set
++# CONFIG_ATH5K is not set
++# CONFIG_IWL4965 is not set
++# CONFIG_IWL3945 is not set
+ # CONFIG_HOSTAP is not set
+ CONFIG_B43=m
+ CONFIG_B43_PCI_AUTOSELECT=y
+@@ -954,20 +1003,17 @@ CONFIG_B43_PCICORE_AUTOSELECT=y
+ # CONFIG_B43_PCMCIA is not set
+ CONFIG_B43_LEDS=y
+ # CONFIG_B43_DEBUG is not set
+-CONFIG_B43_DMA=y
+-CONFIG_B43_PIO=y
+-CONFIG_B43_DMA_AND_PIO_MODE=y
+-# CONFIG_B43_DMA_MODE is not set
+-# CONFIG_B43_PIO_MODE is not set
+ CONFIG_B43LEGACY=m
+ CONFIG_B43LEGACY_PCI_AUTOSELECT=y
+ CONFIG_B43LEGACY_PCICORE_AUTOSELECT=y
++CONFIG_B43LEGACY_LEDS=y
+ CONFIG_B43LEGACY_DEBUG=y
+ CONFIG_B43LEGACY_DMA=y
+ CONFIG_B43LEGACY_PIO=y
+ CONFIG_B43LEGACY_DMA_AND_PIO_MODE=y
+ # CONFIG_B43LEGACY_DMA_MODE is not set
+ # CONFIG_B43LEGACY_PIO_MODE is not set
++# CONFIG_ZD1211RW is not set
+ # CONFIG_RT2X00 is not set
+ 
+ #
+@@ -1005,7 +1051,6 @@ CONFIG_PPP_BSDCOMP=m
+ # CONFIG_SLIP is not set
+ CONFIG_SLHC=y
+ # CONFIG_NET_FC is not set
+-# CONFIG_SHAPER is not set
+ # CONFIG_NETCONSOLE is not set
+ # CONFIG_NETPOLL is not set
+ # CONFIG_NET_POLL_CONTROLLER is not set
+@@ -1068,6 +1113,7 @@ CONFIG_VT_CONSOLE=y
+ CONFIG_HW_CONSOLE=y
+ # CONFIG_VT_HW_CONSOLE_BINDING is not set
+ # CONFIG_SERIAL_NONSTANDARD is not set
++# CONFIG_NOZOMI is not set
+ 
+ #
+ # Serial drivers
+@@ -1105,6 +1151,7 @@ CONFIG_GEN_RTC=y
+ # CONFIG_SYNCLINK_CS is not set
+ # CONFIG_CARDMAN_4000 is not set
+ # CONFIG_CARDMAN_4040 is not set
++# CONFIG_IPWIRELESS is not set
+ # CONFIG_RAW_DRIVER is not set
+ # CONFIG_TCG_TPM is not set
+ CONFIG_DEVPORT=y
+@@ -1151,14 +1198,12 @@ CONFIG_I2C_POWERMAC=y
+ #
+ # Miscellaneous I2C Chip support
+ #
+-# CONFIG_SENSORS_DS1337 is not set
+-# CONFIG_SENSORS_DS1374 is not set
+ # CONFIG_DS1682 is not set
+ # CONFIG_SENSORS_EEPROM is not set
+ # CONFIG_SENSORS_PCF8574 is not set
+-# CONFIG_SENSORS_PCA9539 is not set
++# CONFIG_PCF8575 is not set
+ # CONFIG_SENSORS_PCF8591 is not set
+-# CONFIG_SENSORS_M41T00 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
+@@ -1179,6 +1224,7 @@ CONFIG_APM_POWER=y
+ # CONFIG_BATTERY_DS2760 is not set
+ CONFIG_BATTERY_PMU=y
+ # CONFIG_HWMON is not set
++# CONFIG_THERMAL is not set
+ # CONFIG_WATCHDOG is not set
+ 
+ #
+@@ -1188,6 +1234,7 @@ CONFIG_SSB_POSSIBLE=y
+ CONFIG_SSB=m
+ CONFIG_SSB_PCIHOST_POSSIBLE=y
+ CONFIG_SSB_PCIHOST=y
++CONFIG_SSB_B43_PCI_BRIDGE=y
+ CONFIG_SSB_PCMCIAHOST_POSSIBLE=y
+ # CONFIG_SSB_PCMCIAHOST is not set
+ # CONFIG_SSB_DEBUG is not set
+@@ -1372,6 +1419,7 @@ CONFIG_SND_DUMMY=m
+ # CONFIG_SND_BT87X is not set
+ # CONFIG_SND_CA0106 is not set
+ # CONFIG_SND_CMIPCI is not set
++# CONFIG_SND_OXYGEN is not set
+ # CONFIG_SND_CS4281 is not set
+ # CONFIG_SND_CS46XX is not set
+ # CONFIG_SND_CS5530 is not set
+@@ -1397,6 +1445,7 @@ CONFIG_SND_DUMMY=m
+ # CONFIG_SND_HDA_INTEL is not set
+ # CONFIG_SND_HDSP is not set
+ # CONFIG_SND_HDSPM is not set
++# CONFIG_SND_HIFIER is not set
+ # CONFIG_SND_ICE1712 is not set
+ # CONFIG_SND_ICE1724 is not set
+ # CONFIG_SND_INTEL8X0 is not set
+@@ -1414,6 +1463,7 @@ CONFIG_SND_DUMMY=m
+ # CONFIG_SND_TRIDENT is not set
+ # CONFIG_SND_VIA82XX is not set
+ # CONFIG_SND_VIA82XX_MODEM is not set
++# CONFIG_SND_VIRTUOSO is not set
+ # CONFIG_SND_VX222 is not set
+ # CONFIG_SND_YMFPCI is not set
+ 
+@@ -1461,6 +1511,10 @@ CONFIG_SND_USB_AUDIO=m
+ #
+ 
+ #
++# ALSA SoC audio for Freescale SOCs
++#
++
++#
+ # Open Sound System
+ #
+ # CONFIG_SOUND_PRIME is not set
+@@ -1482,6 +1536,7 @@ CONFIG_USB_ARCH_HAS_OHCI=y
+ CONFIG_USB_ARCH_HAS_EHCI=y
+ CONFIG_USB=y
+ # CONFIG_USB_DEBUG is not set
++# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
+ 
+ #
+ # Miscellaneous USB options
+@@ -1497,9 +1552,9 @@ CONFIG_USB_DYNAMIC_MINORS=y
+ # USB Host Controller Drivers
+ #
+ CONFIG_USB_EHCI_HCD=m
+-CONFIG_USB_EHCI_SPLIT_ISO=y
+ 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_OHCI_HCD=y
+ # CONFIG_USB_OHCI_HCD_PPC_OF is not set
+@@ -1547,11 +1602,8 @@ CONFIG_USB_MON=y
+ #
+ # USB port drivers
+ #
+-
+-#
+-# USB Serial Converter support
+-#
+ CONFIG_USB_SERIAL=m
++CONFIG_USB_EZUSB=y
+ # CONFIG_USB_SERIAL_GENERIC is not set
+ # CONFIG_USB_SERIAL_AIRCABLE is not set
+ # CONFIG_USB_SERIAL_AIRPRIME is not set
+@@ -1572,6 +1624,7 @@ CONFIG_USB_SERIAL_IPAQ=m
+ # CONFIG_USB_SERIAL_EDGEPORT_TI is not set
+ # CONFIG_USB_SERIAL_GARMIN is not set
+ # CONFIG_USB_SERIAL_IPW is not set
++# CONFIG_USB_SERIAL_IUU is not set
+ CONFIG_USB_SERIAL_KEYSPAN_PDA=m
+ CONFIG_USB_SERIAL_KEYSPAN=m
+ CONFIG_USB_SERIAL_KEYSPAN_MPR=y
+@@ -1603,7 +1656,6 @@ CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y
+ # CONFIG_USB_SERIAL_OPTION is not set
+ # CONFIG_USB_SERIAL_OMNINET is not set
+ # CONFIG_USB_SERIAL_DEBUG is not set
+-CONFIG_USB_EZUSB=y
+ 
+ #
+ # USB Miscellaneous drivers
+@@ -1628,16 +1680,9 @@ CONFIG_USB_APPLEDISPLAY=m
+ # CONFIG_USB_TRANCEVIBRATOR is not set
+ # CONFIG_USB_IOWARRIOR is not set
+ # CONFIG_USB_TEST is not set
+-
+-#
+-# USB DSL modem support
+-#
+-
+-#
+-# USB Gadget Support
+-#
+ # CONFIG_USB_GADGET is not set
+ # CONFIG_MMC is not set
++# CONFIG_MEMSTICK is not set
+ CONFIG_NEW_LEDS=y
+ CONFIG_LEDS_CLASS=y
+ 
+@@ -1655,6 +1700,7 @@ CONFIG_LEDS_TRIGGER_IDE_DISK=y
+ # CONFIG_INFINIBAND is not set
+ # CONFIG_EDAC is not set
+ # CONFIG_RTC_CLASS is not set
++# CONFIG_DMADEVICES is not set
+ 
+ #
+ # Userspace I/O
+@@ -1680,12 +1726,10 @@ CONFIG_FS_POSIX_ACL=y
+ # CONFIG_XFS_FS is not set
+ # CONFIG_GFS2_FS is not set
+ # CONFIG_OCFS2_FS is not set
+-# CONFIG_MINIX_FS is not set
+-# CONFIG_ROMFS_FS is not set
++CONFIG_DNOTIFY=y
+ CONFIG_INOTIFY=y
+ CONFIG_INOTIFY_USER=y
+ # CONFIG_QUOTA is not set
+-CONFIG_DNOTIFY=y
+ # CONFIG_AUTOFS_FS is not set
+ CONFIG_AUTOFS4_FS=m
+ CONFIG_FUSE_FS=m
+@@ -1733,8 +1777,10 @@ CONFIG_HFSPLUS_FS=m
+ # CONFIG_EFS_FS is not set
+ # CONFIG_CRAMFS is not set
+ # CONFIG_VXFS_FS is not set
++# CONFIG_MINIX_FS is not set
+ # CONFIG_HPFS_FS is not set
+ # CONFIG_QNX4FS_FS is not set
++# CONFIG_ROMFS_FS is not set
+ # CONFIG_SYSV_FS is not set
+ # CONFIG_UFS_FS is not set
+ CONFIG_NETWORK_FILESYSTEMS=y
+@@ -1828,7 +1874,6 @@ CONFIG_NLS_ISO8859_1=m
+ # CONFIG_NLS_KOI8_U is not set
+ CONFIG_NLS_UTF8=m
+ # CONFIG_DLM is not set
+-# CONFIG_UCC_SLOW is not set
+ 
+ #
+ # Library routines
+@@ -1850,11 +1895,6 @@ CONFIG_PLIST=y
+ CONFIG_HAS_IOMEM=y
+ CONFIG_HAS_IOPORT=y
+ CONFIG_HAS_DMA=y
+-CONFIG_INSTRUMENTATION=y
+-CONFIG_PROFILING=y
+-CONFIG_OPROFILE=y
+-# CONFIG_KPROBES is not set
+-# CONFIG_MARKERS is not set
+ 
+ #
+ # Kernel hacking
+@@ -1873,6 +1913,7 @@ CONFIG_SCHED_DEBUG=y
+ # CONFIG_SCHEDSTATS is not set
+ # CONFIG_TIMER_STATS 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
+@@ -1885,9 +1926,9 @@ CONFIG_DEBUG_BUGVERBOSE=y
+ # CONFIG_DEBUG_VM is not set
+ # CONFIG_DEBUG_LIST is not set
+ # CONFIG_DEBUG_SG is not set
+-# CONFIG_FORCED_INLINING is not set
+ # CONFIG_BOOT_PRINTK_DELAY is not set
+ # CONFIG_RCU_TORTURE_TEST is not set
++# CONFIG_BACKTRACE_SELF_TEST is not set
+ # CONFIG_FAULT_INJECTION is not set
+ # CONFIG_SAMPLES is not set
+ # CONFIG_DEBUG_STACKOVERFLOW is not set
+@@ -1908,7 +1949,9 @@ CONFIG_BOOTX_TEXT=y
+ # CONFIG_SECURITY_FILE_CAPABILITIES is not set
+ CONFIG_CRYPTO=y
+ 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_HMAC=y
+@@ -1927,6 +1970,9 @@ 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
+@@ -1942,11 +1988,14 @@ CONFIG_CRYPTO_ARC4=m
+ CONFIG_CRYPTO_KHAZAD=m
+ CONFIG_CRYPTO_ANUBIS=m
+ # CONFIG_CRYPTO_SEED is not set
++# CONFIG_CRYPTO_SALSA20 is not set
+ 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 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
+diff --git a/arch/powerpc/configs/ppc64_defconfig b/arch/powerpc/configs/ppc64_defconfig
+index 7695a4c..880ab7a 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.24-rc4
+-# Fri Dec 21 14:47:29 2007
++# Linux kernel version: 2.6.25-rc6
++# Thu Mar 20 11:06:28 2008
+ #
+ CONFIG_PPC64=y
+ 
+@@ -28,6 +28,7 @@ CONFIG_GENERIC_TIME=y
+ CONFIG_GENERIC_TIME_VSYSCALL=y
+ CONFIG_GENERIC_CLOCKEVENTS=y
+ CONFIG_GENERIC_HARDIRQS=y
++CONFIG_HAVE_SETUP_PER_CPU_AREA=y
+ CONFIG_IRQ_PER_CPU=y
+ CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+ CONFIG_ARCH_HAS_ILOG2_U32=y
+@@ -49,7 +50,9 @@ CONFIG_GENERIC_TBSYNC=y
+ CONFIG_AUDIT_ARCH=y
+ CONFIG_GENERIC_BUG=y
+ # CONFIG_DEFAULT_UIMAGE is not set
+-CONFIG_PPC64_SWSUSP=y
++CONFIG_HIBERNATE_64=y
++CONFIG_ARCH_HIBERNATION_POSSIBLE=y
++CONFIG_ARCH_SUSPEND_POSSIBLE=y
+ # CONFIG_PPC_DCR_NATIVE is not set
+ CONFIG_PPC_DCR_MMIO=y
+ CONFIG_PPC_DCR=y
+@@ -72,8 +75,6 @@ CONFIG_POSIX_MQUEUE=y
+ CONFIG_TASKSTATS=y
+ CONFIG_TASK_DELAY_ACCT=y
+ # CONFIG_TASK_XACCT 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
+@@ -82,13 +83,20 @@ CONFIG_CGROUPS=y
+ # CONFIG_CGROUP_DEBUG is not set
+ # CONFIG_CGROUP_NS is not set
+ CONFIG_CPUSETS=y
+-CONFIG_FAIR_GROUP_SCHED=y
+-CONFIG_FAIR_USER_SCHED=y
+-# CONFIG_FAIR_CGROUP_SCHED is not set
++# CONFIG_GROUP_SCHED is not set
++# CONFIG_USER_SCHED is not set
++# CONFIG_CGROUP_SCHED is not set
+ # CONFIG_CGROUP_CPUACCT is not set
++# CONFIG_RESOURCE_COUNTERS is not set
+ CONFIG_SYSFS_DEPRECATED=y
++CONFIG_SYSFS_DEPRECATED_V2=y
+ CONFIG_PROC_PID_CPUSET=y
+ CONFIG_RELAY=y
++CONFIG_NAMESPACES=y
++# CONFIG_UTS_NS is not set
++# CONFIG_IPC_NS is not set
++# CONFIG_USER_NS is not set
++# CONFIG_PID_NS is not set
+ CONFIG_BLK_DEV_INITRD=y
+ CONFIG_INITRAMFS_SOURCE=""
+ CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+@@ -102,11 +110,13 @@ CONFIG_HOTPLUG=y
+ CONFIG_PRINTK=y
+ CONFIG_BUG=y
+ CONFIG_ELF_CORE=y
++# CONFIG_COMPAT_BRK is not set
+ CONFIG_BASE_FULL=y
+ CONFIG_FUTEX=y
+ CONFIG_ANON_INODES=y
+ CONFIG_EPOLL=y
+ CONFIG_SIGNALFD=y
++CONFIG_TIMERFD=y
+ CONFIG_EVENTFD=y
+ CONFIG_SHMEM=y
+ CONFIG_VM_EVENT_COUNTERS=y
+@@ -114,6 +124,15 @@ CONFIG_SLUB_DEBUG=y
+ # CONFIG_SLAB is not set
+ CONFIG_SLUB=y
+ # CONFIG_SLOB is not set
++CONFIG_PROFILING=y
++# CONFIG_MARKERS is not set
++CONFIG_OPROFILE=y
++CONFIG_HAVE_OPROFILE=y
++# CONFIG_KPROBES is not set
++CONFIG_HAVE_KPROBES=y
++CONFIG_HAVE_KRETPROBES=y
++CONFIG_PROC_PAGE_MONITOR=y
++CONFIG_SLABINFO=y
+ CONFIG_RT_MUTEXES=y
+ # CONFIG_TINY_SHMEM is not set
+ CONFIG_BASE_SMALL=0
+@@ -141,6 +160,7 @@ CONFIG_DEFAULT_AS=y
+ # CONFIG_DEFAULT_CFQ is not set
+ # CONFIG_DEFAULT_NOOP is not set
+ CONFIG_DEFAULT_IOSCHED="anticipatory"
++CONFIG_CLASSIC_RCU=y
+ 
+ #
+ # Platform support
+@@ -163,8 +183,8 @@ CONFIG_VIODASD=y
+ CONFIG_VIOCD=m
+ CONFIG_VIOTAPE=m
+ CONFIG_VIOPATH=y
+-# CONFIG_PPC_MPC52xx is not set
+-# CONFIG_PPC_MPC5200 is not set
++# CONFIG_PPC_MPC512x is not set
++# CONFIG_PPC_MPC5121 is not set
+ CONFIG_PPC_PMAC=y
+ CONFIG_PPC_PMAC64=y
+ CONFIG_PPC_MAPLE=y
+@@ -176,7 +196,6 @@ CONFIG_PPC_PASEMI=y
+ CONFIG_PPC_PASEMI_IOMMU=y
+ # CONFIG_PPC_PASEMI_IOMMU_DMA_FORCE is not set
+ CONFIG_PPC_PASEMI_MDIO=y
+-CONFIG_ELECTRA_IDE=y
+ CONFIG_PPC_CELLEB=y
+ # CONFIG_PPC_PS3 is not set
+ CONFIG_PPC_CELL=y
+@@ -193,11 +212,13 @@ CONFIG_CBE_RAS=y
+ CONFIG_CBE_THERM=m
+ CONFIG_CBE_CPUFREQ=m
+ CONFIG_CBE_CPUFREQ_PMI=m
++CONFIG_OPROFILE_CELL=y
+ # CONFIG_PQ2ADS is not set
+ CONFIG_PPC_NATIVE=y
+ CONFIG_UDBG_RTAS_CONSOLE=y
+ CONFIG_PPC_UDBG_BEAT=y
+ CONFIG_XICS=y
++# CONFIG_IPIC is not set
+ CONFIG_MPIC=y
+ # CONFIG_MPIC_WEIRD is not set
+ CONFIG_PPC_I8259=y
+@@ -236,7 +257,6 @@ CONFIG_CPU_FREQ_GOV_USERSPACE=y
+ #
+ CONFIG_CPU_FREQ_PMAC64=y
+ CONFIG_PPC_PASEMI_CPUFREQ=y
+-# CONFIG_CPM2 is not set
+ CONFIG_AXON_RAM=m
+ # CONFIG_FSL_ULI1575 is not set
+ 
+@@ -252,17 +272,21 @@ CONFIG_HZ_250=y
+ # CONFIG_HZ_300 is not set
+ # CONFIG_HZ_1000 is not set
+ CONFIG_HZ=250
++# CONFIG_SCHED_HRTICK is not set
+ CONFIG_PREEMPT_NONE=y
+ # CONFIG_PREEMPT_VOLUNTARY is not set
+ # CONFIG_PREEMPT is not set
+-# CONFIG_PREEMPT_BKL is not set
+ 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
+ CONFIG_HOTPLUG_CPU=y
+ CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
++CONFIG_ARCH_HAS_WALK_MEMORY=y
++CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
+ CONFIG_KEXEC=y
+ # CONFIG_CRASH_DUMP is not set
+ CONFIG_IRQ_ALL_CPUS=y
+@@ -294,11 +318,9 @@ CONFIG_PPC_HAS_HASH_64K=y
+ # CONFIG_SCHED_SMT is not set
+ CONFIG_PROC_DEVICETREE=y
+ # CONFIG_CMDLINE_BOOL is not set
++CONFIG_ARCH_WANTS_FREEZER_CONTROL=y
+ # CONFIG_PM is not set
+-CONFIG_SUSPEND_SMP_POSSIBLE=y
+-CONFIG_HIBERNATION_SMP_POSSIBLE=y
+ CONFIG_SECCOMP=y
+-# CONFIG_WANT_DEVICE_TREE is not set
+ CONFIG_ISA_DMA_API=y
+ 
+ #
+@@ -352,6 +374,7 @@ CONFIG_XFRM=y
+ CONFIG_XFRM_USER=m
+ # CONFIG_XFRM_SUB_POLICY is not set
+ # CONFIG_XFRM_MIGRATE is not set
++# CONFIG_XFRM_STATISTICS is not set
+ CONFIG_NET_KEY=m
+ # CONFIG_NET_KEY_MIGRATE is not set
+ CONFIG_INET=y
+@@ -375,7 +398,7 @@ CONFIG_INET_TUNNEL=y
+ CONFIG_INET_XFRM_MODE_TRANSPORT=y
+ CONFIG_INET_XFRM_MODE_TUNNEL=y
+ CONFIG_INET_XFRM_MODE_BEET=y
+-CONFIG_INET_LRO=m
++CONFIG_INET_LRO=y
+ CONFIG_INET_DIAG=y
+ CONFIG_INET_TCP_DIAG=y
+ # CONFIG_TCP_CONG_ADVANCED is not set
+@@ -389,14 +412,14 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
+ # CONFIG_NETWORK_SECMARK is not set
+ CONFIG_NETFILTER=y
+ # CONFIG_NETFILTER_DEBUG is not set
++CONFIG_NETFILTER_ADVANCED=y
+ 
+ #
+ # Core Netfilter Configuration
+ #
+-CONFIG_NETFILTER_NETLINK=y
++CONFIG_NETFILTER_NETLINK=m
+ CONFIG_NETFILTER_NETLINK_QUEUE=m
+ CONFIG_NETFILTER_NETLINK_LOG=m
+-CONFIG_NF_CONNTRACK_ENABLED=m
+ CONFIG_NF_CONNTRACK=m
+ CONFIG_NF_CT_ACCT=y
+ CONFIG_NF_CONNTRACK_MARK=y
+@@ -422,8 +445,10 @@ CONFIG_NETFILTER_XT_TARGET_MARK=m
+ CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
+ CONFIG_NETFILTER_XT_TARGET_NFLOG=m
+ CONFIG_NETFILTER_XT_TARGET_NOTRACK=m
++CONFIG_NETFILTER_XT_TARGET_RATEEST=m
+ CONFIG_NETFILTER_XT_TARGET_TRACE=m
+ CONFIG_NETFILTER_XT_TARGET_TCPMSS=m
++CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m
+ CONFIG_NETFILTER_XT_MATCH_COMMENT=m
+ CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m
+ CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m
+@@ -433,14 +458,17 @@ CONFIG_NETFILTER_XT_MATCH_DCCP=m
+ CONFIG_NETFILTER_XT_MATCH_DSCP=m
+ CONFIG_NETFILTER_XT_MATCH_ESP=m
+ CONFIG_NETFILTER_XT_MATCH_HELPER=m
++CONFIG_NETFILTER_XT_MATCH_IPRANGE=m
+ CONFIG_NETFILTER_XT_MATCH_LENGTH=m
+ CONFIG_NETFILTER_XT_MATCH_LIMIT=m
+ CONFIG_NETFILTER_XT_MATCH_MAC=m
+ CONFIG_NETFILTER_XT_MATCH_MARK=m
++CONFIG_NETFILTER_XT_MATCH_OWNER=m
+ CONFIG_NETFILTER_XT_MATCH_POLICY=m
+ CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
+ CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
+ CONFIG_NETFILTER_XT_MATCH_QUOTA=m
++CONFIG_NETFILTER_XT_MATCH_RATEEST=m
+ CONFIG_NETFILTER_XT_MATCH_REALM=m
+ CONFIG_NETFILTER_XT_MATCH_SCTP=m
+ CONFIG_NETFILTER_XT_MATCH_STATE=m
+@@ -458,13 +486,10 @@ CONFIG_NF_CONNTRACK_IPV4=m
+ CONFIG_NF_CONNTRACK_PROC_COMPAT=y
+ CONFIG_IP_NF_QUEUE=m
+ CONFIG_IP_NF_IPTABLES=m
+-CONFIG_IP_NF_MATCH_IPRANGE=m
+-CONFIG_IP_NF_MATCH_TOS=m
+ CONFIG_IP_NF_MATCH_RECENT=m
+ CONFIG_IP_NF_MATCH_ECN=m
+ CONFIG_IP_NF_MATCH_AH=m
+ CONFIG_IP_NF_MATCH_TTL=m
+-CONFIG_IP_NF_MATCH_OWNER=m
+ CONFIG_IP_NF_MATCH_ADDRTYPE=m
+ CONFIG_IP_NF_FILTER=m
+ CONFIG_IP_NF_TARGET_REJECT=m
+@@ -475,7 +500,6 @@ CONFIG_NF_NAT_NEEDED=y
+ CONFIG_IP_NF_TARGET_MASQUERADE=m
+ CONFIG_IP_NF_TARGET_REDIRECT=m
+ CONFIG_IP_NF_TARGET_NETMAP=m
+-CONFIG_IP_NF_TARGET_SAME=m
+ CONFIG_NF_NAT_SNMP_BASIC=m
+ CONFIG_NF_NAT_PROTO_GRE=m
+ CONFIG_NF_NAT_FTP=m
+@@ -486,7 +510,6 @@ CONFIG_NF_NAT_PPTP=m
+ CONFIG_NF_NAT_H323=m
+ CONFIG_NF_NAT_SIP=m
+ CONFIG_IP_NF_MANGLE=m
+-CONFIG_IP_NF_TARGET_TOS=m
+ CONFIG_IP_NF_TARGET_ECN=m
+ CONFIG_IP_NF_TARGET_TTL=m
+ CONFIG_IP_NF_TARGET_CLUSTERIP=m
+@@ -517,6 +540,7 @@ CONFIG_NET_CLS_ROUTE=y
+ #
+ # CONFIG_NET_PKTGEN is not set
+ # CONFIG_HAMRADIO is not set
++# CONFIG_CAN is not set
+ # CONFIG_IRDA is not set
+ # CONFIG_BT is not set
+ # CONFIG_AF_RXRPC is not set
+@@ -563,7 +587,7 @@ CONFIG_BLK_DEV_NBD=m
+ CONFIG_BLK_DEV_RAM=y
+ CONFIG_BLK_DEV_RAM_COUNT=16
+ CONFIG_BLK_DEV_RAM_SIZE=65536
+-CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
++# CONFIG_BLK_DEV_XIP is not set
+ # CONFIG_CDROM_PKTCDVD is not set
+ # CONFIG_ATA_OVER_ETH is not set
+ CONFIG_MISC_DEVICES=y
+@@ -571,11 +595,13 @@ CONFIG_MISC_DEVICES=y
+ # CONFIG_EEPROM_93CX6 is not set
+ # CONFIG_SGI_IOC4 is not set
+ # CONFIG_TIFM_CORE is not set
++# CONFIG_ENCLOSURE_SERVICES is not set
++CONFIG_HAVE_IDE=y
+ CONFIG_IDE=y
+ CONFIG_BLK_DEV_IDE=y
+ 
+ #
+-# Please see Documentation/ide.txt for help/info on IDE drives
++# Please see Documentation/ide/ide.txt for help/info on IDE drives
+ #
+ # CONFIG_BLK_DEV_IDE_SATA is not set
+ CONFIG_BLK_DEV_IDEDISK=y
+@@ -583,6 +609,7 @@ CONFIG_BLK_DEV_IDEDISK=y
+ # CONFIG_BLK_DEV_IDECS is not set
+ # CONFIG_BLK_DEV_DELKIN is not set
+ CONFIG_BLK_DEV_IDECD=y
++CONFIG_BLK_DEV_IDECD_VERBOSE_ERRORS=y
+ # CONFIG_BLK_DEV_IDETAPE is not set
+ # CONFIG_BLK_DEV_IDEFLOPPY is not set
+ # CONFIG_BLK_DEV_IDESCSI is not set
+@@ -594,12 +621,12 @@ CONFIG_IDE_PROC_FS=y
+ #
+ CONFIG_IDE_GENERIC=y
+ # CONFIG_BLK_DEV_PLATFORM is not set
++CONFIG_BLK_DEV_IDEDMA_SFF=y
+ 
+ #
+ # PCI IDE chipsets support
+ #
+ CONFIG_BLK_DEV_IDEPCI=y
+-CONFIG_IDEPCI_SHARE_IRQ=y
+ CONFIG_IDEPCI_PCIBUS_ORDER=y
+ # CONFIG_BLK_DEV_OFFBOARD is not set
+ CONFIG_BLK_DEV_GENERIC=y
+@@ -634,7 +661,6 @@ CONFIG_BLK_DEV_CELLEB=y
+ CONFIG_BLK_DEV_IDE_PMAC=y
+ CONFIG_BLK_DEV_IDE_PMAC_ATA100FIRST=y
+ CONFIG_BLK_DEV_IDEDMA_PMAC=y
+-# CONFIG_IDE_ARM is not set
+ CONFIG_BLK_DEV_IDEDMA=y
+ CONFIG_IDE_ARCH_OBSOLETE_INIT=y
+ # CONFIG_BLK_DEV_HD is not set
+@@ -701,6 +727,7 @@ CONFIG_SCSI_LOWLEVEL=y
+ CONFIG_SCSI_IBMVSCSI=y
+ # CONFIG_SCSI_INITIO is not set
+ # CONFIG_SCSI_INIA100 is not set
++# CONFIG_SCSI_MVSAS is not set
+ # CONFIG_SCSI_STEX is not set
+ CONFIG_SCSI_SYM53C8XX_2=y
+ CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0
+@@ -760,6 +787,7 @@ CONFIG_SATA_SIL24=y
+ # 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
+@@ -776,6 +804,7 @@ CONFIG_PATA_PCMCIA=y
+ # 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_MD=y
+ CONFIG_BLK_DEV_MD=y
+@@ -847,7 +876,6 @@ CONFIG_BONDING=m
+ # CONFIG_EQUALIZER is not set
+ CONFIG_TUN=m
+ # CONFIG_VETH is not set
+-# CONFIG_IP1000 is not set
+ # CONFIG_ARCNET is not set
+ CONFIG_PHYLIB=y
+ 
+@@ -863,11 +891,8 @@ CONFIG_MARVELL_PHY=y
+ # CONFIG_SMSC_PHY is not set
+ CONFIG_BROADCOM_PHY=m
+ # CONFIG_ICPLUS_PHY is not set
+-CONFIG_FIXED_PHY=m
+-CONFIG_FIXED_MII_10_FDX=y
+-CONFIG_FIXED_MII_100_FDX=y
+-# CONFIG_FIXED_MII_1000_FDX is not set
+-CONFIG_FIXED_MII_AMNT=1
++# CONFIG_REALTEK_PHY is not set
++# CONFIG_FIXED_PHY is not set
+ # CONFIG_MDIO_BITBANG is not set
+ CONFIG_NET_ETHERNET=y
+ CONFIG_MII=y
+@@ -899,6 +924,7 @@ CONFIG_E100=y
+ # CONFIG_NE2K_PCI is not set
+ # CONFIG_8139CP is not set
+ # CONFIG_8139TOO is not set
++# CONFIG_R6040 is not set
+ # CONFIG_SIS900 is not set
+ # CONFIG_EPIC100 is not set
+ # CONFIG_SUNDANCE is not set
+@@ -912,6 +938,9 @@ CONFIG_E1000=y
+ # CONFIG_E1000_NAPI is not set
+ # CONFIG_E1000_DISABLE_PACKET_SPLIT is not set
+ # CONFIG_E1000E is not set
++# CONFIG_E1000E_ENABLED is not set
++# CONFIG_IP1000 is not set
++# CONFIG_IGB is not set
+ # CONFIG_NS83820 is not set
+ # CONFIG_HAMACHI is not set
+ # CONFIG_YELLOWFIN is not set
+@@ -940,6 +969,7 @@ CONFIG_IXGB=m
+ CONFIG_PASEMI_MAC=y
+ # CONFIG_MLX4_CORE is not set
+ # CONFIG_TEHUTI is not set
++# CONFIG_BNX2X is not set
+ CONFIG_TR=y
+ CONFIG_IBMOL=y
+ # CONFIG_3C359 is not set
+@@ -977,7 +1007,6 @@ CONFIG_PPPOE=m
+ # CONFIG_SLIP is not set
+ CONFIG_SLHC=m
+ # CONFIG_NET_FC is not set
+-# CONFIG_SHAPER is not set
+ CONFIG_NETCONSOLE=y
+ # CONFIG_NETCONSOLE_DYNAMIC is not set
+ CONFIG_NETPOLL=y
+@@ -1056,6 +1085,7 @@ CONFIG_VT_CONSOLE=y
+ CONFIG_HW_CONSOLE=y
+ # CONFIG_VT_HW_CONSOLE_BINDING is not set
+ # CONFIG_SERIAL_NONSTANDARD is not set
++# CONFIG_NOZOMI is not set
+ 
+ #
+ # Serial drivers
+@@ -1103,6 +1133,7 @@ CONFIG_GEN_RTC=y
+ # CONFIG_SYNCLINK_CS is not set
+ # CONFIG_CARDMAN_4000 is not set
+ # CONFIG_CARDMAN_4040 is not set
++# CONFIG_IPWIRELESS is not set
+ CONFIG_RAW_DRIVER=y
+ CONFIG_MAX_RAW_DEVS=256
+ # CONFIG_HANGCHECK_TIMER is not set
+@@ -1151,13 +1182,12 @@ CONFIG_I2C_PASEMI=y
+ #
+ # Miscellaneous I2C Chip support
+ #
+-# CONFIG_SENSORS_DS1337 is not set
+-# CONFIG_SENSORS_DS1374 is not set
+ # CONFIG_DS1682 is not set
+ # CONFIG_SENSORS_EEPROM is not set
+ # CONFIG_SENSORS_PCF8574 is not set
+-# CONFIG_SENSORS_PCA9539 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
+@@ -1173,6 +1203,7 @@ CONFIG_I2C_PASEMI=y
+ # CONFIG_W1 is not set
+ # CONFIG_POWER_SUPPLY is not set
+ # CONFIG_HWMON is not set
++# CONFIG_THERMAL is not set
+ # CONFIG_WATCHDOG is not set
+ 
+ #
+@@ -1337,6 +1368,7 @@ CONFIG_SND_VERBOSE_PROCFS=y
+ # CONFIG_SND_BT87X is not set
+ # CONFIG_SND_CA0106 is not set
+ # CONFIG_SND_CMIPCI is not set
++# CONFIG_SND_OXYGEN is not set
+ # CONFIG_SND_CS4281 is not set
+ # CONFIG_SND_CS46XX is not set
+ # CONFIG_SND_CS5530 is not set
+@@ -1362,6 +1394,7 @@ CONFIG_SND_VERBOSE_PROCFS=y
+ # CONFIG_SND_HDA_INTEL is not set
+ # CONFIG_SND_HDSP is not set
+ # CONFIG_SND_HDSPM is not set
++# CONFIG_SND_HIFIER is not set
+ # CONFIG_SND_ICE1712 is not set
+ # CONFIG_SND_ICE1724 is not set
+ # CONFIG_SND_INTEL8X0 is not set
+@@ -1379,6 +1412,7 @@ CONFIG_SND_VERBOSE_PROCFS=y
+ # CONFIG_SND_TRIDENT is not set
+ # CONFIG_SND_VIA82XX is not set
+ # CONFIG_SND_VIA82XX_MODEM is not set
++# CONFIG_SND_VIRTUOSO is not set
+ # CONFIG_SND_VX222 is not set
+ # CONFIG_SND_YMFPCI is not set
+ 
+@@ -1426,6 +1460,10 @@ CONFIG_SND_AOA_SOUNDBUS_I2S=m
+ #
+ 
+ #
++# ALSA SoC audio for Freescale SOCs
++#
++
++#
+ # Open Sound System
+ #
+ # CONFIG_SOUND_PRIME is not set
+@@ -1447,6 +1485,7 @@ CONFIG_USB_ARCH_HAS_OHCI=y
+ CONFIG_USB_ARCH_HAS_EHCI=y
+ CONFIG_USB=y
+ # CONFIG_USB_DEBUG is not set
++# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
+ 
+ #
+ # Miscellaneous USB options
+@@ -1460,10 +1499,10 @@ CONFIG_USB_DEVICE_CLASS=y
+ # USB Host Controller Drivers
+ #
+ CONFIG_USB_EHCI_HCD=y
+-# CONFIG_USB_EHCI_SPLIT_ISO is not set
+ # 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_OHCI_HCD=y
+ # CONFIG_USB_OHCI_HCD_PPC_OF is not set
+@@ -1512,10 +1551,6 @@ CONFIG_USB_STORAGE=m
+ #
+ # USB port drivers
+ #
+-
+-#
+-# USB Serial Converter support
+-#
+ # CONFIG_USB_SERIAL is not set
+ 
+ #
+@@ -1541,16 +1576,9 @@ CONFIG_USB_APPLEDISPLAY=m
+ # CONFIG_USB_TRANCEVIBRATOR is not set
+ # CONFIG_USB_IOWARRIOR is not set
+ # CONFIG_USB_TEST is not set
+-
+-#
+-# USB DSL modem support
+-#
+-
+-#
+-# USB Gadget Support
+-#
+ # CONFIG_USB_GADGET is not set
+ # CONFIG_MMC is not set
++# CONFIG_MEMSTICK is not set
+ # CONFIG_NEW_LEDS is not set
+ CONFIG_INFINIBAND=m
+ # CONFIG_INFINIBAND_USER_MAD is not set
+@@ -1562,6 +1590,7 @@ CONFIG_INFINIBAND_MTHCA_DEBUG=y
+ CONFIG_INFINIBAND_EHCA=m
+ # CONFIG_INFINIBAND_AMSO1100 is not set
+ # CONFIG_MLX4_INFINIBAND is not set
++# CONFIG_INFINIBAND_NES is not set
+ CONFIG_INFINIBAND_IPOIB=m
+ # CONFIG_INFINIBAND_IPOIB_CM is not set
+ CONFIG_INFINIBAND_IPOIB_DEBUG=y
+@@ -1576,8 +1605,13 @@ CONFIG_EDAC=y
+ # CONFIG_EDAC_DEBUG is not set
+ CONFIG_EDAC_MM_EDAC=y
+ 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
+@@ -1604,6 +1638,7 @@ CONFIG_RTC_DRV_DS1307=y
+ # CONFIG_RTC_DRV_PCF8563 is not set
+ # CONFIG_RTC_DRV_PCF8583 is not set
+ # CONFIG_RTC_DRV_M41T80 is not set
++# CONFIG_RTC_DRV_S35390A is not set
+ 
+ #
+ # SPI RTC drivers
+@@ -1613,9 +1648,10 @@ CONFIG_RTC_DRV_DS1307=y
+ # Platform RTC drivers
+ #
+ # CONFIG_RTC_DRV_CMOS is not set
++# CONFIG_RTC_DRV_DS1511 is not set
+ # CONFIG_RTC_DRV_DS1553 is not set
+-# CONFIG_RTC_DRV_STK17TA8 is not set
+ # CONFIG_RTC_DRV_DS1742 is not set
++# CONFIG_RTC_DRV_STK17TA8 is not set
+ # CONFIG_RTC_DRV_M48T86 is not set
+ # CONFIG_RTC_DRV_M48T59 is not set
+ # CONFIG_RTC_DRV_V3020 is not set
+@@ -1623,6 +1659,7 @@ CONFIG_RTC_DRV_DS1307=y
+ #
+ # on-CPU RTC drivers
+ #
++# CONFIG_DMADEVICES is not set
+ 
+ #
+ # Userspace I/O
+@@ -1665,12 +1702,10 @@ CONFIG_XFS_POSIX_ACL=y
+ # CONFIG_XFS_RT is not set
+ # CONFIG_GFS2_FS is not set
+ # CONFIG_OCFS2_FS is not set
+-# CONFIG_MINIX_FS is not set
+-# CONFIG_ROMFS_FS is not set
++CONFIG_DNOTIFY=y
+ CONFIG_INOTIFY=y
+ CONFIG_INOTIFY_USER=y
+ # CONFIG_QUOTA is not set
+-CONFIG_DNOTIFY=y
+ # CONFIG_AUTOFS_FS is not set
+ CONFIG_AUTOFS4_FS=m
+ # CONFIG_FUSE_FS is not set
+@@ -1719,8 +1754,10 @@ CONFIG_HFSPLUS_FS=m
+ # CONFIG_EFS_FS is not set
+ CONFIG_CRAMFS=y
+ # CONFIG_VXFS_FS is not set
++# CONFIG_MINIX_FS is not set
+ # CONFIG_HPFS_FS is not set
+ # CONFIG_QNX4FS_FS is not set
++# CONFIG_ROMFS_FS is not set
+ # CONFIG_SYSV_FS is not set
+ # CONFIG_UFS_FS is not set
+ CONFIG_NETWORK_FILESYSTEMS=y
+@@ -1821,7 +1858,6 @@ CONFIG_NLS_KOI8_R=m
+ CONFIG_NLS_KOI8_U=m
+ CONFIG_NLS_UTF8=m
+ # CONFIG_DLM is not set
+-# CONFIG_UCC_SLOW is not set
+ 
+ #
+ # Library routines
+@@ -1835,6 +1871,8 @@ CONFIG_CRC32=y
+ CONFIG_LIBCRC32C=m
+ CONFIG_ZLIB_INFLATE=y
+ CONFIG_ZLIB_DEFLATE=m
++CONFIG_LZO_COMPRESS=m
++CONFIG_LZO_DECOMPRESS=m
+ CONFIG_TEXTSEARCH=y
+ CONFIG_TEXTSEARCH_KMP=m
+ CONFIG_TEXTSEARCH_BM=m
+@@ -1843,11 +1881,6 @@ CONFIG_PLIST=y
+ CONFIG_HAS_IOMEM=y
+ CONFIG_HAS_IOPORT=y
+ CONFIG_HAS_DMA=y
+-CONFIG_INSTRUMENTATION=y
+-CONFIG_PROFILING=y
+-CONFIG_OPROFILE=y
+-# CONFIG_KPROBES is not set
+-# CONFIG_MARKERS is not set
+ 
+ #
+ # Kernel hacking
+@@ -1866,6 +1899,7 @@ CONFIG_SCHED_DEBUG=y
+ # CONFIG_SCHEDSTATS is not set
+ # CONFIG_TIMER_STATS 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
+@@ -1878,9 +1912,9 @@ CONFIG_DEBUG_BUGVERBOSE=y
+ # CONFIG_DEBUG_VM is not set
+ # CONFIG_DEBUG_LIST is not set
+ # CONFIG_DEBUG_SG is not set
+-CONFIG_FORCED_INLINING=y
+ # CONFIG_BOOT_PRINTK_DELAY is not set
+ # CONFIG_RCU_TORTURE_TEST is not set
++# CONFIG_BACKTRACE_SELF_TEST is not set
+ # CONFIG_FAULT_INJECTION is not set
+ # CONFIG_SAMPLES is not set
+ CONFIG_DEBUG_STACKOVERFLOW=y
+@@ -1908,7 +1942,9 @@ CONFIG_ASYNC_MEMCPY=y
+ CONFIG_ASYNC_XOR=y
+ CONFIG_CRYPTO=y
+ 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_HMAC=y
+@@ -1921,12 +1957,15 @@ CONFIG_CRYPTO_SHA256=m
+ CONFIG_CRYPTO_SHA512=m
+ CONFIG_CRYPTO_WP512=m
+ CONFIG_CRYPTO_TGR192=m
+-# CONFIG_CRYPTO_GF128MUL is not set
++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
+@@ -1942,11 +1981,13 @@ CONFIG_CRYPTO_ARC4=m
+ CONFIG_CRYPTO_KHAZAD=m
+ CONFIG_CRYPTO_ANUBIS=m
+ # CONFIG_CRYPTO_SEED is not set
++CONFIG_CRYPTO_SALSA20=m
+ 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 is not set
++CONFIG_CRYPTO_AUTHENC=m
++CONFIG_CRYPTO_LZO=m
+ # CONFIG_CRYPTO_HW is not set
+ # CONFIG_PPC_CLOCK is not set
+diff --git a/arch/powerpc/configs/ps3_defconfig b/arch/powerpc/configs/ps3_defconfig
+index 7994955..7a64c56 100644
+--- a/arch/powerpc/configs/ps3_defconfig
++++ b/arch/powerpc/configs/ps3_defconfig
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.24-rc8
+-# Wed Jan 16 14:31:21 2008
++# Linux kernel version: 2.6.25-rc6
++# Thu Mar 20 11:07:04 2008
+ #
+ CONFIG_PPC64=y
+ 
+@@ -28,6 +28,7 @@ CONFIG_GENERIC_TIME=y
+ CONFIG_GENERIC_TIME_VSYSCALL=y
+ CONFIG_GENERIC_CLOCKEVENTS=y
+ CONFIG_GENERIC_HARDIRQS=y
++CONFIG_HAVE_SETUP_PER_CPU_AREA=y
+ CONFIG_IRQ_PER_CPU=y
+ CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+ CONFIG_ARCH_HAS_ILOG2_U32=y
+@@ -51,7 +52,6 @@ CONFIG_GENERIC_BUG=y
+ # CONFIG_DEFAULT_UIMAGE is not set
+ # CONFIG_PPC_DCR_NATIVE is not set
+ # CONFIG_PPC_DCR_MMIO is not set
+-# CONFIG_PPC_OF_PLATFORM_PCI is not set
+ CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+ 
+ #
+@@ -68,17 +68,21 @@ CONFIG_SYSVIPC_SYSCTL=y
+ CONFIG_POSIX_MQUEUE=y
+ # CONFIG_BSD_PROCESS_ACCT is not set
+ # CONFIG_TASKSTATS is not set
+-# CONFIG_USER_NS is not set
+-# CONFIG_PID_NS is not set
+ # CONFIG_AUDIT is not set
+ # CONFIG_IKCONFIG is not set
+ CONFIG_LOG_BUF_SHIFT=17
+ # CONFIG_CGROUPS is not set
+-CONFIG_FAIR_GROUP_SCHED=y
+-CONFIG_FAIR_USER_SCHED=y
+-# CONFIG_FAIR_CGROUP_SCHED is not set
++# CONFIG_GROUP_SCHED is not set
++# CONFIG_USER_SCHED is not set
++# CONFIG_CGROUP_SCHED is not set
+ CONFIG_SYSFS_DEPRECATED=y
++CONFIG_SYSFS_DEPRECATED_V2=y
+ # CONFIG_RELAY is not set
++CONFIG_NAMESPACES=y
++# CONFIG_UTS_NS is not set
++# CONFIG_IPC_NS is not set
++# CONFIG_USER_NS is not set
++# CONFIG_PID_NS is not set
+ CONFIG_BLK_DEV_INITRD=y
+ CONFIG_INITRAMFS_SOURCE=""
+ CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+@@ -92,17 +96,27 @@ CONFIG_HOTPLUG=y
+ CONFIG_PRINTK=y
+ CONFIG_BUG=y
+ CONFIG_ELF_CORE=y
++# CONFIG_COMPAT_BRK is not set
+ CONFIG_BASE_FULL=y
+ CONFIG_FUTEX=y
+ CONFIG_ANON_INODES=y
+ CONFIG_EPOLL=y
+ CONFIG_SIGNALFD=y
++CONFIG_TIMERFD=y
+ CONFIG_EVENTFD=y
+ CONFIG_SHMEM=y
+ CONFIG_VM_EVENT_COUNTERS=y
+ CONFIG_SLAB=y
+ # CONFIG_SLUB is not set
+ # CONFIG_SLOB is not set
++CONFIG_PROFILING=y
++# CONFIG_MARKERS is not set
++CONFIG_OPROFILE=m
++CONFIG_HAVE_OPROFILE=y
++# CONFIG_KPROBES is not set
++CONFIG_HAVE_KPROBES=y
++CONFIG_HAVE_KRETPROBES=y
++CONFIG_PROC_PAGE_MONITOR=y
+ CONFIG_SLABINFO=y
+ CONFIG_RT_MUTEXES=y
+ # CONFIG_TINY_SHMEM is not set
+@@ -131,6 +145,7 @@ CONFIG_DEFAULT_AS=y
+ # CONFIG_DEFAULT_CFQ is not set
+ # CONFIG_DEFAULT_NOOP is not set
+ CONFIG_DEFAULT_IOSCHED="anticipatory"
++CONFIG_CLASSIC_RCU=y
+ 
+ #
+ # Platform support
+@@ -141,8 +156,8 @@ CONFIG_PPC_MULTIPLATFORM=y
+ # CONFIG_PPC_86xx is not set
+ # CONFIG_PPC_PSERIES is not set
+ # CONFIG_PPC_ISERIES is not set
+-# CONFIG_PPC_MPC52xx is not set
+-# CONFIG_PPC_MPC5200 is not set
++# CONFIG_PPC_MPC512x is not set
++# CONFIG_PPC_MPC5121 is not set
+ # CONFIG_PPC_PMAC is not set
+ # CONFIG_PPC_MAPLE is not set
+ # CONFIG_PPC_PASEMI is not set
+@@ -173,6 +188,7 @@ CONFIG_PPC_CELL=y
+ CONFIG_SPU_FS=y
+ CONFIG_SPU_BASE=y
+ # CONFIG_PQ2ADS is not set
++# CONFIG_IPIC is not set
+ # CONFIG_MPIC is not set
+ # CONFIG_MPIC_WEIRD is not set
+ # CONFIG_PPC_I8259 is not set
+@@ -184,7 +200,6 @@ CONFIG_SPU_BASE=y
+ # CONFIG_PPC_INDIRECT_IO is not set
+ # CONFIG_GENERIC_IOMAP is not set
+ # CONFIG_CPU_FREQ is not set
+-# CONFIG_CPM2 is not set
+ # CONFIG_FSL_ULI1575 is not set
+ 
+ #
+@@ -199,15 +214,19 @@ CONFIG_HZ_250=y
+ # CONFIG_HZ_300 is not set
+ # CONFIG_HZ_1000 is not set
+ CONFIG_HZ=250
++# CONFIG_SCHED_HRTICK is not set
+ CONFIG_PREEMPT_NONE=y
+ # CONFIG_PREEMPT_VOLUNTARY is not set
+ # CONFIG_PREEMPT is not set
+-# CONFIG_PREEMPT_BKL is not set
+ CONFIG_BINFMT_ELF=y
++CONFIG_COMPAT_BINFMT_ELF=y
+ CONFIG_BINFMT_MISC=y
+ CONFIG_FORCE_MAX_ZONEORDER=13
+ # CONFIG_IOMMU_VMERGE is not set
++CONFIG_IOMMU_HELPER=y
+ CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
++CONFIG_ARCH_HAS_WALK_MEMORY=y
++CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
+ CONFIG_KEXEC=y
+ # CONFIG_CRASH_DUMP is not set
+ # CONFIG_IRQ_ALL_CPUS is not set
+@@ -241,7 +260,6 @@ CONFIG_PROC_DEVICETREE=y
+ # CONFIG_CMDLINE_BOOL is not set
+ # CONFIG_PM is not set
+ # CONFIG_SECCOMP is not set
+-# CONFIG_WANT_DEVICE_TREE is not set
+ CONFIG_ISA_DMA_API=y
+ 
+ #
+@@ -271,6 +289,7 @@ CONFIG_XFRM=y
+ # CONFIG_XFRM_USER is not set
+ # CONFIG_XFRM_SUB_POLICY is not set
+ # CONFIG_XFRM_MIGRATE is not set
++# CONFIG_XFRM_STATISTICS is not set
+ # CONFIG_NET_KEY is not set
+ CONFIG_INET=y
+ # CONFIG_IP_MULTICAST is not set
+@@ -338,6 +357,7 @@ CONFIG_IPV6_SIT=y
+ #
+ # CONFIG_NET_PKTGEN is not set
+ # CONFIG_HAMRADIO is not set
++# CONFIG_CAN is not set
+ # CONFIG_IRDA is not set
+ CONFIG_BT=m
+ CONFIG_BT_L2CAP=m
+@@ -405,11 +425,13 @@ CONFIG_BLK_DEV_LOOP=y
+ CONFIG_BLK_DEV_RAM=y
+ CONFIG_BLK_DEV_RAM_COUNT=16
+ CONFIG_BLK_DEV_RAM_SIZE=65535
+-CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
++# CONFIG_BLK_DEV_XIP is not set
+ # CONFIG_CDROM_PKTCDVD is not set
+ # CONFIG_ATA_OVER_ETH is not set
+ CONFIG_MISC_DEVICES=y
+ # CONFIG_EEPROM_93CX6 is not set
++# CONFIG_ENCLOSURE_SERVICES is not set
++CONFIG_HAVE_IDE=y
+ # CONFIG_IDE is not set
+ 
+ #
+@@ -472,7 +494,9 @@ CONFIG_MII=m
+ # CONFIG_IBM_NEW_EMAC_EMAC4 is not set
+ # CONFIG_B44 is not set
+ CONFIG_NETDEV_1000=y
++# CONFIG_E1000E_ENABLED is not set
+ CONFIG_GELIC_NET=y
++CONFIG_GELIC_WIRELESS=y
+ # CONFIG_NETDEV_10000 is not set
+ 
+ #
+@@ -482,9 +506,8 @@ CONFIG_GELIC_NET=y
+ CONFIG_WLAN_80211=y
+ # CONFIG_LIBERTAS is not set
+ # CONFIG_USB_ZD1201 is not set
++# CONFIG_USB_NET_RNDIS_WLAN is not set
+ # CONFIG_HOSTAP is not set
+-CONFIG_ZD1211RW=m
+-# CONFIG_ZD1211RW_DEBUG is not set
+ 
+ #
+ # USB Network Adapters
+@@ -507,7 +530,6 @@ CONFIG_USB_NET_MCS7830=m
+ # CONFIG_WAN is not set
+ # CONFIG_PPP is not set
+ # CONFIG_SLIP is not set
+-# CONFIG_SHAPER is not set
+ # CONFIG_NETCONSOLE is not set
+ # CONFIG_NETPOLL is not set
+ # CONFIG_NET_POLL_CONTROLLER is not set
+@@ -606,6 +628,7 @@ CONFIG_GEN_RTC=y
+ # CONFIG_W1 is not set
+ # CONFIG_POWER_SUPPLY is not set
+ # CONFIG_HWMON is not set
++# CONFIG_THERMAL is not set
+ # CONFIG_WATCHDOG is not set
+ 
+ #
+@@ -742,6 +765,10 @@ CONFIG_SND_PS3_DEFAULT_START_DELAY=2000
+ #
+ 
+ #
++# ALSA SoC audio for Freescale SOCs
++#
++
++#
+ # Open Sound System
+ #
+ # CONFIG_SOUND_PRIME is not set
+@@ -769,6 +796,7 @@ CONFIG_USB_ARCH_HAS_OHCI=y
+ CONFIG_USB_ARCH_HAS_EHCI=y
+ CONFIG_USB=m
+ # CONFIG_USB_DEBUG is not set
++# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
+ 
+ #
+ # Miscellaneous USB options
+@@ -782,10 +810,10 @@ CONFIG_USB_DEVICEFS=y
+ # USB Host Controller Drivers
+ #
+ CONFIG_USB_EHCI_HCD=m
+-# CONFIG_USB_EHCI_SPLIT_ISO is not set
+ # CONFIG_USB_EHCI_ROOT_HUB_TT is not set
+ # CONFIG_USB_EHCI_TT_NEWSCHED is not set
+ 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_OHCI_HCD=m
+ # CONFIG_USB_OHCI_HCD_PPC_OF is not set
+@@ -833,10 +861,6 @@ CONFIG_USB_MON=y
+ #
+ # USB port drivers
+ #
+-
+-#
+-# USB Serial Converter support
+-#
+ # CONFIG_USB_SERIAL is not set
+ 
+ #
+@@ -862,19 +886,13 @@ CONFIG_USB_MON=y
+ # CONFIG_USB_TRANCEVIBRATOR is not set
+ # CONFIG_USB_IOWARRIOR is not set
+ # CONFIG_USB_TEST is not set
+-
+-#
+-# USB DSL modem support
+-#
+-
+-#
+-# USB Gadget Support
+-#
+ # CONFIG_USB_GADGET is not set
+ # CONFIG_MMC is not set
++# CONFIG_MEMSTICK is not set
+ # CONFIG_NEW_LEDS is not set
+ # CONFIG_EDAC is not set
+ # CONFIG_RTC_CLASS is not set
++# CONFIG_DMADEVICES is not set
+ 
+ #
+ # Userspace I/O
+@@ -900,8 +918,7 @@ CONFIG_FS_MBCACHE=y
+ # CONFIG_XFS_FS is not set
+ # CONFIG_GFS2_FS is not set
+ # CONFIG_OCFS2_FS is not set
+-# CONFIG_MINIX_FS is not set
+-# CONFIG_ROMFS_FS is not set
++CONFIG_DNOTIFY=y
+ CONFIG_INOTIFY=y
+ CONFIG_INOTIFY_USER=y
+ CONFIG_QUOTA=y
+@@ -910,7 +927,6 @@ CONFIG_PRINT_QUOTA_WARNING=y
+ # CONFIG_QFMT_V1 is not set
+ CONFIG_QFMT_V2=y
+ CONFIG_QUOTACTL=y
+-CONFIG_DNOTIFY=y
+ CONFIG_AUTOFS_FS=m
+ CONFIG_AUTOFS4_FS=m
+ # CONFIG_FUSE_FS is not set
+@@ -959,8 +975,10 @@ CONFIG_TMPFS=y
+ # CONFIG_EFS_FS is not set
+ # CONFIG_CRAMFS is not set
+ # CONFIG_VXFS_FS is not set
++# CONFIG_MINIX_FS is not set
+ # CONFIG_HPFS_FS is not set
+ # CONFIG_QNX4FS_FS is not set
++# CONFIG_ROMFS_FS is not set
+ # CONFIG_SYSV_FS is not set
+ # CONFIG_UFS_FS is not set
+ CONFIG_NETWORK_FILESYSTEMS=y
+@@ -1036,7 +1054,6 @@ CONFIG_NLS_ISO8859_1=y
+ # CONFIG_NLS_KOI8_U is not set
+ # CONFIG_NLS_UTF8 is not set
+ # CONFIG_DLM is not set
+-# CONFIG_UCC_SLOW is not set
+ 
+ #
+ # Library routines
+@@ -1048,15 +1065,12 @@ CONFIG_BITREVERSE=y
+ CONFIG_CRC32=y
+ # CONFIG_CRC7 is not set
+ # CONFIG_LIBCRC32C is not set
++CONFIG_LZO_COMPRESS=m
++CONFIG_LZO_DECOMPRESS=m
+ CONFIG_PLIST=y
+ CONFIG_HAS_IOMEM=y
+ CONFIG_HAS_IOPORT=y
+ CONFIG_HAS_DMA=y
+-CONFIG_INSTRUMENTATION=y
+-CONFIG_PROFILING=y
+-CONFIG_OPROFILE=m
+-# CONFIG_KPROBES is not set
+-# CONFIG_MARKERS is not set
+ 
+ #
+ # Kernel hacking
+@@ -1087,9 +1101,9 @@ CONFIG_DEBUG_INFO=y
+ # CONFIG_DEBUG_VM is not set
+ CONFIG_DEBUG_LIST=y
+ # CONFIG_DEBUG_SG is not set
+-CONFIG_FORCED_INLINING=y
+ # CONFIG_BOOT_PRINTK_DELAY is not set
+ # CONFIG_RCU_TORTURE_TEST is not set
++# CONFIG_BACKTRACE_SELF_TEST is not set
+ # CONFIG_FAULT_INJECTION is not set
+ # CONFIG_SAMPLES is not set
+ CONFIG_DEBUG_STACKOVERFLOW=y
+@@ -1108,7 +1122,9 @@ CONFIG_IRQSTACKS=y
+ # CONFIG_SECURITY_FILE_CAPABILITIES is not set
+ CONFIG_CRYPTO=y
+ CONFIG_CRYPTO_ALGAPI=y
++CONFIG_CRYPTO_AEAD=m
+ CONFIG_CRYPTO_BLKCIPHER=y
++CONFIG_CRYPTO_SEQIV=m
+ CONFIG_CRYPTO_MANAGER=y
+ # CONFIG_CRYPTO_HMAC is not set
+ # CONFIG_CRYPTO_XCBC is not set
+@@ -1120,12 +1136,15 @@ CONFIG_CRYPTO_MD5=y
+ # 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_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
+@@ -1140,11 +1159,13 @@ CONFIG_CRYPTO_ARC4=m
+ # CONFIG_CRYPTO_KHAZAD is not set
+ # CONFIG_CRYPTO_ANUBIS is not set
+ # CONFIG_CRYPTO_SEED is not set
++CONFIG_CRYPTO_SALSA20=m
+ # CONFIG_CRYPTO_DEFLATE is not set
+ CONFIG_CRYPTO_MICHAEL_MIC=m
+ # 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=m
+ CONFIG_CRYPTO_HW=y
+ # CONFIG_PPC_CLOCK is not set
+diff --git a/arch/powerpc/configs/pseries_defconfig b/arch/powerpc/configs/pseries_defconfig
+index 92bbf51..755aca7 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.24-rc4
+-# Thu Dec  6 16:49:15 2007
++# Linux kernel version: 2.6.25-rc6
++# Thu Mar 20 11:08:01 2008
+ #
+ CONFIG_PPC64=y
+ 
+@@ -28,6 +28,7 @@ CONFIG_GENERIC_TIME=y
+ CONFIG_GENERIC_TIME_VSYSCALL=y
+ CONFIG_GENERIC_CLOCKEVENTS=y
+ CONFIG_GENERIC_HARDIRQS=y
++CONFIG_HAVE_SETUP_PER_CPU_AREA=y
+ CONFIG_IRQ_PER_CPU=y
+ CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+ CONFIG_ARCH_HAS_ILOG2_U32=y
+@@ -71,8 +72,6 @@ CONFIG_TASKSTATS=y
+ CONFIG_TASK_DELAY_ACCT=y
+ CONFIG_TASK_XACCT=y
+ CONFIG_TASK_IO_ACCOUNTING=y
+-# CONFIG_USER_NS is not set
+-# CONFIG_PID_NS is not set
+ CONFIG_AUDIT=y
+ CONFIG_AUDITSYSCALL=y
+ CONFIG_AUDIT_TREE=y
+@@ -83,13 +82,20 @@ CONFIG_CGROUPS=y
+ # CONFIG_CGROUP_DEBUG is not set
+ CONFIG_CGROUP_NS=y
+ CONFIG_CPUSETS=y
+-CONFIG_FAIR_GROUP_SCHED=y
+-# CONFIG_FAIR_USER_SCHED is not set
+-CONFIG_FAIR_CGROUP_SCHED=y
++# CONFIG_GROUP_SCHED is not set
++# CONFIG_USER_SCHED is not set
++# CONFIG_CGROUP_SCHED is not set
+ CONFIG_CGROUP_CPUACCT=y
++# CONFIG_RESOURCE_COUNTERS is not set
+ CONFIG_SYSFS_DEPRECATED=y
++CONFIG_SYSFS_DEPRECATED_V2=y
+ CONFIG_PROC_PID_CPUSET=y
+ # CONFIG_RELAY is not set
++CONFIG_NAMESPACES=y
++# CONFIG_UTS_NS is not set
++# CONFIG_IPC_NS is not set
++# CONFIG_USER_NS is not set
++# CONFIG_PID_NS is not set
+ CONFIG_BLK_DEV_INITRD=y
+ CONFIG_INITRAMFS_SOURCE=""
+ CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+@@ -103,11 +109,13 @@ CONFIG_HOTPLUG=y
+ CONFIG_PRINTK=y
+ CONFIG_BUG=y
+ CONFIG_ELF_CORE=y
++# CONFIG_COMPAT_BRK is not set
+ CONFIG_BASE_FULL=y
+ CONFIG_FUTEX=y
+ CONFIG_ANON_INODES=y
+ CONFIG_EPOLL=y
+ CONFIG_SIGNALFD=y
++CONFIG_TIMERFD=y
+ CONFIG_EVENTFD=y
+ CONFIG_SHMEM=y
+ CONFIG_VM_EVENT_COUNTERS=y
+@@ -115,6 +123,16 @@ CONFIG_SLUB_DEBUG=y
+ # CONFIG_SLAB is not set
+ CONFIG_SLUB=y
+ # CONFIG_SLOB is not set
++CONFIG_PROFILING=y
++CONFIG_MARKERS=y
++CONFIG_OPROFILE=y
++CONFIG_HAVE_OPROFILE=y
++CONFIG_KPROBES=y
++CONFIG_KRETPROBES=y
++CONFIG_HAVE_KPROBES=y
++CONFIG_HAVE_KRETPROBES=y
++CONFIG_PROC_PAGE_MONITOR=y
++CONFIG_SLABINFO=y
+ CONFIG_RT_MUTEXES=y
+ # CONFIG_TINY_SHMEM is not set
+ CONFIG_BASE_SMALL=0
+@@ -142,6 +160,7 @@ CONFIG_DEFAULT_AS=y
+ # CONFIG_DEFAULT_CFQ is not set
+ # CONFIG_DEFAULT_NOOP is not set
+ CONFIG_DEFAULT_IOSCHED="anticipatory"
++CONFIG_CLASSIC_RCU=y
+ 
+ #
+ # Platform support
+@@ -156,8 +175,8 @@ CONFIG_EEH=y
+ CONFIG_SCANLOG=m
+ CONFIG_LPARCFG=y
+ # CONFIG_PPC_ISERIES is not set
+-# CONFIG_PPC_MPC52xx is not set
+-# CONFIG_PPC_MPC5200 is not set
++# CONFIG_PPC_MPC512x is not set
++# CONFIG_PPC_MPC5121 is not set
+ # CONFIG_PPC_PMAC is not set
+ # CONFIG_PPC_MAPLE is not set
+ # CONFIG_PPC_PASEMI is not set
+@@ -170,6 +189,7 @@ CONFIG_LPARCFG=y
+ CONFIG_PPC_NATIVE=y
+ # CONFIG_UDBG_RTAS_CONSOLE is not set
+ CONFIG_XICS=y
++# CONFIG_IPIC is not set
+ CONFIG_MPIC=y
+ # CONFIG_MPIC_WEIRD is not set
+ CONFIG_PPC_I8259=y
+@@ -186,7 +206,6 @@ CONFIG_IBMEBUS=y
+ # CONFIG_PPC_INDIRECT_IO is not set
+ # CONFIG_GENERIC_IOMAP is not set
+ # CONFIG_CPU_FREQ is not set
+-# CONFIG_CPM2 is not set
+ # CONFIG_FSL_ULI1575 is not set
+ 
+ #
+@@ -201,17 +220,21 @@ CONFIG_HZ_250=y
+ # CONFIG_HZ_300 is not set
+ # CONFIG_HZ_1000 is not set
+ CONFIG_HZ=250
++# CONFIG_SCHED_HRTICK is not set
+ CONFIG_PREEMPT_NONE=y
+ # CONFIG_PREEMPT_VOLUNTARY is not set
+ # CONFIG_PREEMPT is not set
+-# CONFIG_PREEMPT_BKL is not set
+ 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
+ CONFIG_HOTPLUG_CPU=y
+ CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
++CONFIG_ARCH_HAS_WALK_MEMORY=y
++CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
+ CONFIG_KEXEC=y
+ # CONFIG_CRASH_DUMP is not set
+ CONFIG_IRQ_ALL_CPUS=y
+@@ -245,9 +268,7 @@ CONFIG_SCHED_SMT=y
+ CONFIG_PROC_DEVICETREE=y
+ # CONFIG_CMDLINE_BOOL is not set
+ # CONFIG_PM is not set
+-CONFIG_SUSPEND_SMP_POSSIBLE=y
+ CONFIG_SECCOMP=y
+-# CONFIG_WANT_DEVICE_TREE is not set
+ CONFIG_ISA_DMA_API=y
+ 
+ #
+@@ -288,6 +309,7 @@ CONFIG_XFRM=y
+ CONFIG_XFRM_USER=m
+ # CONFIG_XFRM_SUB_POLICY is not set
+ # CONFIG_XFRM_MIGRATE is not set
++# CONFIG_XFRM_STATISTICS is not set
+ CONFIG_NET_KEY=m
+ # CONFIG_NET_KEY_MIGRATE is not set
+ CONFIG_INET=y
+@@ -322,14 +344,14 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
+ # CONFIG_NETWORK_SECMARK is not set
+ CONFIG_NETFILTER=y
+ # CONFIG_NETFILTER_DEBUG is not set
++CONFIG_NETFILTER_ADVANCED=y
+ 
+ #
+ # Core Netfilter Configuration
+ #
+-CONFIG_NETFILTER_NETLINK=y
++CONFIG_NETFILTER_NETLINK=m
+ CONFIG_NETFILTER_NETLINK_QUEUE=m
+ CONFIG_NETFILTER_NETLINK_LOG=m
+-CONFIG_NF_CONNTRACK_ENABLED=m
+ CONFIG_NF_CONNTRACK=m
+ CONFIG_NF_CT_ACCT=y
+ CONFIG_NF_CONNTRACK_MARK=y
+@@ -351,6 +373,7 @@ CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
+ CONFIG_NETFILTER_XT_TARGET_MARK=m
+ CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
+ CONFIG_NETFILTER_XT_TARGET_NFLOG=m
++CONFIG_NETFILTER_XT_TARGET_RATEEST=m
+ CONFIG_NETFILTER_XT_TARGET_TCPMSS=m
+ CONFIG_NETFILTER_XT_MATCH_COMMENT=m
+ CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m
+@@ -361,14 +384,17 @@ CONFIG_NETFILTER_XT_MATCH_DCCP=m
+ CONFIG_NETFILTER_XT_MATCH_DSCP=m
+ CONFIG_NETFILTER_XT_MATCH_ESP=m
+ CONFIG_NETFILTER_XT_MATCH_HELPER=m
++CONFIG_NETFILTER_XT_MATCH_IPRANGE=m
+ CONFIG_NETFILTER_XT_MATCH_LENGTH=m
+ CONFIG_NETFILTER_XT_MATCH_LIMIT=m
+ CONFIG_NETFILTER_XT_MATCH_MAC=m
+ CONFIG_NETFILTER_XT_MATCH_MARK=m
++CONFIG_NETFILTER_XT_MATCH_OWNER=m
+ CONFIG_NETFILTER_XT_MATCH_POLICY=m
+ CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
+ CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
+ CONFIG_NETFILTER_XT_MATCH_QUOTA=m
++CONFIG_NETFILTER_XT_MATCH_RATEEST=m
+ CONFIG_NETFILTER_XT_MATCH_REALM=m
+ CONFIG_NETFILTER_XT_MATCH_SCTP=m
+ CONFIG_NETFILTER_XT_MATCH_STATE=m
+@@ -386,13 +412,10 @@ CONFIG_NF_CONNTRACK_IPV4=m
+ CONFIG_NF_CONNTRACK_PROC_COMPAT=y
+ CONFIG_IP_NF_QUEUE=m
+ CONFIG_IP_NF_IPTABLES=m
+-CONFIG_IP_NF_MATCH_IPRANGE=m
+-CONFIG_IP_NF_MATCH_TOS=m
+ CONFIG_IP_NF_MATCH_RECENT=m
+ CONFIG_IP_NF_MATCH_ECN=m
+ CONFIG_IP_NF_MATCH_AH=m
+ CONFIG_IP_NF_MATCH_TTL=m
+-CONFIG_IP_NF_MATCH_OWNER=m
+ CONFIG_IP_NF_MATCH_ADDRTYPE=m
+ CONFIG_IP_NF_FILTER=m
+ CONFIG_IP_NF_TARGET_REJECT=m
+@@ -403,7 +426,6 @@ CONFIG_NF_NAT_NEEDED=y
+ CONFIG_IP_NF_TARGET_MASQUERADE=m
+ CONFIG_IP_NF_TARGET_REDIRECT=m
+ CONFIG_IP_NF_TARGET_NETMAP=m
+-CONFIG_IP_NF_TARGET_SAME=m
+ CONFIG_NF_NAT_SNMP_BASIC=m
+ CONFIG_NF_NAT_FTP=m
+ CONFIG_NF_NAT_IRC=m
+@@ -439,6 +461,7 @@ CONFIG_NET_CLS_ROUTE=y
+ # CONFIG_NET_PKTGEN is not set
+ # CONFIG_NET_TCPPROBE is not set
+ # CONFIG_HAMRADIO is not set
++# CONFIG_CAN is not set
+ # CONFIG_IRDA is not set
+ # CONFIG_BT is not set
+ # CONFIG_AF_RXRPC is not set
+@@ -493,7 +516,7 @@ CONFIG_BLK_DEV_NBD=m
+ CONFIG_BLK_DEV_RAM=y
+ CONFIG_BLK_DEV_RAM_COUNT=16
+ CONFIG_BLK_DEV_RAM_SIZE=65536
+-CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
++# CONFIG_BLK_DEV_XIP is not set
+ # CONFIG_CDROM_PKTCDVD is not set
+ # CONFIG_ATA_OVER_ETH is not set
+ CONFIG_MISC_DEVICES=y
+@@ -501,16 +524,19 @@ CONFIG_MISC_DEVICES=y
+ # CONFIG_EEPROM_93CX6 is not set
+ # CONFIG_SGI_IOC4 is not set
+ # CONFIG_TIFM_CORE is not set
++# CONFIG_ENCLOSURE_SERVICES is not set
++CONFIG_HAVE_IDE=y
+ CONFIG_IDE=y
+ CONFIG_BLK_DEV_IDE=y
+ 
+ #
+-# Please see Documentation/ide.txt for help/info on IDE drives
++# Please see Documentation/ide/ide.txt for help/info on IDE drives
+ #
+ # CONFIG_BLK_DEV_IDE_SATA is not set
+ CONFIG_BLK_DEV_IDEDISK=y
+ # CONFIG_IDEDISK_MULTI_MODE is not set
+ CONFIG_BLK_DEV_IDECD=y
++CONFIG_BLK_DEV_IDECD_VERBOSE_ERRORS=y
+ # CONFIG_BLK_DEV_IDETAPE is not set
+ # CONFIG_BLK_DEV_IDEFLOPPY is not set
+ # CONFIG_BLK_DEV_IDESCSI is not set
+@@ -522,12 +548,12 @@ CONFIG_IDE_PROC_FS=y
+ #
+ CONFIG_IDE_GENERIC=y
+ # CONFIG_BLK_DEV_PLATFORM is not set
++CONFIG_BLK_DEV_IDEDMA_SFF=y
+ 
+ #
+ # PCI IDE chipsets support
+ #
+ CONFIG_BLK_DEV_IDEPCI=y
+-CONFIG_IDEPCI_SHARE_IRQ=y
+ CONFIG_IDEPCI_PCIBUS_ORDER=y
+ # CONFIG_BLK_DEV_OFFBOARD is not set
+ CONFIG_BLK_DEV_GENERIC=y
+@@ -558,7 +584,6 @@ CONFIG_BLK_DEV_AMD74XX=y
+ # CONFIG_BLK_DEV_TRM290 is not set
+ # CONFIG_BLK_DEV_VIA82CXXX is not set
+ # CONFIG_BLK_DEV_TC86C001 is not set
+-# CONFIG_IDE_ARM is not set
+ CONFIG_BLK_DEV_IDEDMA=y
+ CONFIG_IDE_ARCH_OBSOLETE_INIT=y
+ # CONFIG_BLK_DEV_HD is not set
+@@ -627,6 +652,7 @@ CONFIG_SCSI_IBMVSCSI=y
+ # CONFIG_SCSI_INIA100 is not set
+ # CONFIG_SCSI_PPA is not set
+ # CONFIG_SCSI_IMM is not set
++# CONFIG_SCSI_MVSAS is not set
+ # CONFIG_SCSI_STEX is not set
+ CONFIG_SCSI_SYM53C8XX_2=y
+ CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0
+@@ -685,6 +711,7 @@ CONFIG_ATA=y
+ # 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
+@@ -699,6 +726,7 @@ CONFIG_ATA=y
+ # CONFIG_PATA_SIS is not set
+ # CONFIG_PATA_VIA is not set
+ CONFIG_PATA_WINBOND=y
++# CONFIG_PATA_PLATFORM is not set
+ CONFIG_MD=y
+ CONFIG_BLK_DEV_MD=y
+ CONFIG_MD_LINEAR=y
+@@ -737,7 +765,6 @@ CONFIG_BONDING=m
+ # CONFIG_EQUALIZER is not set
+ CONFIG_TUN=m
+ # CONFIG_VETH is not set
+-# CONFIG_IP1000 is not set
+ # CONFIG_ARCNET is not set
+ # CONFIG_PHYLIB is not set
+ CONFIG_NET_ETHERNET=y
+@@ -769,6 +796,7 @@ CONFIG_E100=y
+ # CONFIG_NE2K_PCI is not set
+ # CONFIG_8139CP is not set
+ # CONFIG_8139TOO is not set
++# CONFIG_R6040 is not set
+ # CONFIG_SIS900 is not set
+ # CONFIG_EPIC100 is not set
+ # CONFIG_SUNDANCE is not set
+@@ -783,6 +811,9 @@ CONFIG_E1000=y
+ # CONFIG_E1000_NAPI is not set
+ # CONFIG_E1000_DISABLE_PACKET_SPLIT is not set
+ # CONFIG_E1000E is not set
++# CONFIG_E1000E_ENABLED is not set
++# CONFIG_IP1000 is not set
++# CONFIG_IGB is not set
+ # CONFIG_NS83820 is not set
+ # CONFIG_HAMACHI is not set
+ # CONFIG_YELLOWFIN is not set
+@@ -811,6 +842,7 @@ CONFIG_S2IO=m
+ # CONFIG_PASEMI_MAC is not set
+ # CONFIG_MLX4_CORE is not set
+ # CONFIG_TEHUTI is not set
++# CONFIG_BNX2X is not set
+ CONFIG_TR=y
+ CONFIG_IBMOL=y
+ # CONFIG_3C359 is not set
+@@ -847,7 +879,6 @@ CONFIG_PPPOE=m
+ # CONFIG_SLIP is not set
+ CONFIG_SLHC=m
+ # CONFIG_NET_FC is not set
+-# CONFIG_SHAPER is not set
+ CONFIG_NETCONSOLE=y
+ # CONFIG_NETCONSOLE_DYNAMIC is not set
+ CONFIG_NETPOLL=y
+@@ -927,6 +958,7 @@ CONFIG_VT_CONSOLE=y
+ CONFIG_HW_CONSOLE=y
+ # CONFIG_VT_HW_CONSOLE_BINDING is not set
+ # CONFIG_SERIAL_NONSTANDARD is not set
++# CONFIG_NOZOMI is not set
+ 
+ #
+ # Serial drivers
+@@ -951,7 +983,6 @@ CONFIG_LEGACY_PTYS=y
+ CONFIG_LEGACY_PTY_COUNT=256
+ # CONFIG_PRINTER is not set
+ # CONFIG_PPDEV is not set
+-# CONFIG_TIPAR is not set
+ CONFIG_HVC_DRIVER=y
+ CONFIG_HVC_CONSOLE=y
+ CONFIG_HVC_RTAS=y
+@@ -1009,13 +1040,12 @@ CONFIG_I2C_ALGOBIT=y
+ #
+ # Miscellaneous I2C Chip support
+ #
+-# CONFIG_SENSORS_DS1337 is not set
+-# CONFIG_SENSORS_DS1374 is not set
+ # CONFIG_DS1682 is not set
+ # CONFIG_SENSORS_EEPROM is not set
+ # CONFIG_SENSORS_PCF8574 is not set
+-# CONFIG_SENSORS_PCA9539 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
+@@ -1031,6 +1061,7 @@ CONFIG_I2C_ALGOBIT=y
+ # CONFIG_W1 is not set
+ # CONFIG_POWER_SUPPLY is not set
+ # CONFIG_HWMON is not set
++# CONFIG_THERMAL is not set
+ # CONFIG_WATCHDOG is not set
+ 
+ #
+@@ -1166,6 +1197,7 @@ CONFIG_USB_ARCH_HAS_OHCI=y
+ CONFIG_USB_ARCH_HAS_EHCI=y
+ CONFIG_USB=y
+ # CONFIG_USB_DEBUG is not set
++# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
+ 
+ #
+ # Miscellaneous USB options
+@@ -1179,9 +1211,9 @@ CONFIG_USB_DEVICE_CLASS=y
+ # USB Host Controller Drivers
+ #
+ CONFIG_USB_EHCI_HCD=y
+-# CONFIG_USB_EHCI_SPLIT_ISO is not set
+ # 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_OHCI_HCD=y
+ # CONFIG_USB_OHCI_HCD_PPC_OF is not set
+@@ -1230,10 +1262,6 @@ CONFIG_USB_MON=y
+ # USB port drivers
+ #
+ # CONFIG_USB_USS720 is not set
+-
+-#
+-# USB Serial Converter support
+-#
+ # CONFIG_USB_SERIAL is not set
+ 
+ #
+@@ -1259,16 +1287,9 @@ CONFIG_USB_MON=y
+ # CONFIG_USB_TRANCEVIBRATOR is not set
+ # CONFIG_USB_IOWARRIOR is not set
+ # CONFIG_USB_TEST is not set
+-
+-#
+-# USB DSL modem support
+-#
+-
+-#
+-# USB Gadget Support
+-#
+ # CONFIG_USB_GADGET is not set
+ # CONFIG_MMC is not set
++# CONFIG_MEMSTICK is not set
+ # CONFIG_NEW_LEDS is not set
+ CONFIG_INFINIBAND=m
+ CONFIG_INFINIBAND_USER_MAD=m
+@@ -1281,6 +1302,7 @@ CONFIG_INFINIBAND_MTHCA_DEBUG=y
+ CONFIG_INFINIBAND_EHCA=m
+ # CONFIG_INFINIBAND_AMSO1100 is not set
+ # CONFIG_MLX4_INFINIBAND is not set
++# CONFIG_INFINIBAND_NES is not set
+ CONFIG_INFINIBAND_IPOIB=m
+ # CONFIG_INFINIBAND_IPOIB_CM is not set
+ CONFIG_INFINIBAND_IPOIB_DEBUG=y
+@@ -1289,6 +1311,7 @@ CONFIG_INFINIBAND_SRP=m
+ # CONFIG_INFINIBAND_ISER is not set
+ # CONFIG_EDAC is not set
+ # CONFIG_RTC_CLASS is not set
++# CONFIG_DMADEVICES is not set
+ # CONFIG_AUXDISPLAY is not set
+ 
+ #
+@@ -1334,12 +1357,10 @@ CONFIG_XFS_POSIX_ACL=y
+ CONFIG_OCFS2_FS=m
+ CONFIG_OCFS2_DEBUG_MASKLOG=y
+ # CONFIG_OCFS2_DEBUG_FS is not set
+-# CONFIG_MINIX_FS is not set
+-# CONFIG_ROMFS_FS is not set
++CONFIG_DNOTIFY=y
+ CONFIG_INOTIFY=y
+ CONFIG_INOTIFY_USER=y
+ # CONFIG_QUOTA is not set
+-CONFIG_DNOTIFY=y
+ # CONFIG_AUTOFS_FS is not set
+ CONFIG_AUTOFS4_FS=m
+ CONFIG_FUSE_FS=m
+@@ -1388,8 +1409,10 @@ CONFIG_CONFIGFS_FS=m
+ # CONFIG_EFS_FS is not set
+ CONFIG_CRAMFS=y
+ # CONFIG_VXFS_FS is not set
++# CONFIG_MINIX_FS is not set
+ # CONFIG_HPFS_FS is not set
+ # CONFIG_QNX4FS_FS is not set
++# CONFIG_ROMFS_FS is not set
+ # CONFIG_SYSV_FS is not set
+ # CONFIG_UFS_FS is not set
+ CONFIG_NETWORK_FILESYSTEMS=y
+@@ -1473,7 +1496,6 @@ CONFIG_NLS_ISO8859_1=y
+ # CONFIG_NLS_KOI8_U is not set
+ # CONFIG_NLS_UTF8 is not set
+ # CONFIG_DLM is not set
+-# CONFIG_UCC_SLOW is not set
+ 
+ #
+ # Library routines
+@@ -1487,6 +1509,8 @@ CONFIG_CRC32=y
+ CONFIG_LIBCRC32C=m
+ CONFIG_ZLIB_INFLATE=y
+ CONFIG_ZLIB_DEFLATE=m
++CONFIG_LZO_COMPRESS=m
++CONFIG_LZO_DECOMPRESS=m
+ CONFIG_TEXTSEARCH=y
+ CONFIG_TEXTSEARCH_KMP=m
+ CONFIG_TEXTSEARCH_BM=m
+@@ -1495,11 +1519,6 @@ CONFIG_PLIST=y
+ CONFIG_HAS_IOMEM=y
+ CONFIG_HAS_IOPORT=y
+ CONFIG_HAS_DMA=y
+-CONFIG_INSTRUMENTATION=y
+-CONFIG_PROFILING=y
+-CONFIG_OPROFILE=y
+-CONFIG_KPROBES=y
+-CONFIG_MARKERS=y
+ 
+ #
+ # Kernel hacking
+@@ -1518,6 +1537,7 @@ CONFIG_SCHED_DEBUG=y
+ # CONFIG_SCHEDSTATS is not set
+ # CONFIG_TIMER_STATS 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
+@@ -1530,9 +1550,10 @@ CONFIG_DEBUG_BUGVERBOSE=y
+ # CONFIG_DEBUG_VM is not set
+ # CONFIG_DEBUG_LIST is not set
+ # CONFIG_DEBUG_SG is not set
+-CONFIG_FORCED_INLINING=y
+ # CONFIG_BOOT_PRINTK_DELAY is not set
+ # CONFIG_RCU_TORTURE_TEST is not set
++# CONFIG_KPROBES_SANITY_TEST is not set
++# CONFIG_BACKTRACE_SELF_TEST is not set
+ # CONFIG_LKDTM is not set
+ # CONFIG_FAULT_INJECTION is not set
+ # CONFIG_SAMPLES is not set
+@@ -1557,7 +1578,9 @@ CONFIG_VIRQ_DEBUG=y
+ # CONFIG_SECURITY_FILE_CAPABILITIES is not set
+ CONFIG_CRYPTO=y
+ 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_HMAC=y
+@@ -1570,12 +1593,15 @@ CONFIG_CRYPTO_SHA256=m
+ CONFIG_CRYPTO_SHA512=m
+ CONFIG_CRYPTO_WP512=m
+ CONFIG_CRYPTO_TGR192=m
+-# CONFIG_CRYPTO_GF128MUL is not set
++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
+@@ -1591,11 +1617,13 @@ CONFIG_CRYPTO_ARC4=m
+ CONFIG_CRYPTO_KHAZAD=m
+ CONFIG_CRYPTO_ANUBIS=m
+ # CONFIG_CRYPTO_SEED is not set
++CONFIG_CRYPTO_SALSA20=m
+ 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 is not set
++CONFIG_CRYPTO_AUTHENC=m
++CONFIG_CRYPTO_LZO=m
+ # CONFIG_CRYPTO_HW is not set
+ # CONFIG_PPC_CLOCK is not set
+diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
+index 4846bf5..59311ec 100644
+--- a/arch/powerpc/kernel/process.c
++++ b/arch/powerpc/kernel/process.c
+@@ -353,6 +353,12 @@ struct task_struct *__switch_to(struct task_struct *prev,
+ 	account_process_vtime(current);
+ 	calculate_steal_time();
+ 
++	/*
++	 * We can't take a PMU exception inside _switch() since there is a
++	 * window where the kernel stack SLB and the kernel stack are out
++	 * of sync. Hard disable here.
++	 */
++	hard_irq_disable();
+ 	last = _switch(old_thread, new_thread);
+ 
+ 	local_irq_restore(flags);
+diff --git a/arch/powerpc/kernel/ptrace.c b/arch/powerpc/kernel/ptrace.c
+index 7673e98..2a9fe97 100644
+--- a/arch/powerpc/kernel/ptrace.c
++++ b/arch/powerpc/kernel/ptrace.c
+@@ -530,15 +530,21 @@ static int gpr32_set(struct task_struct *target,
+ 		--count;
+ 	}
+ 
+-	if (kbuf)
++	if (kbuf) {
+ 		for (; count > 0 && pos <= PT_MAX_PUT_REG; --count)
+ 			regs[pos++] = *k++;
+-	else
++		for (; count > 0 && pos < PT_TRAP; --count, ++pos)
++			++k;
++	} else {
+ 		for (; count > 0 && pos <= PT_MAX_PUT_REG; --count) {
+ 			if (__get_user(reg, u++))
+ 				return -EFAULT;
+ 			regs[pos++] = reg;
+ 		}
++		for (; count > 0 && pos < PT_TRAP; --count, ++pos)
++			if (__get_user(reg, u++))
++				return -EFAULT;
++	}
+ 
+ 	if (count > 0 && pos == PT_TRAP) {
+ 		if (kbuf)
+diff --git a/arch/powerpc/mm/slb.c b/arch/powerpc/mm/slb.c
+index 47b06ba..906daed 100644
+--- a/arch/powerpc/mm/slb.c
++++ b/arch/powerpc/mm/slb.c
+@@ -124,6 +124,12 @@ void slb_flush_and_rebolt(void)
+ 		ksp_vsid_data = get_slb_shadow()->save_area[2].vsid;
+ 	}
+ 
++	/*
++	 * We can't take a PMU exception in the following code, so hard
++	 * disable interrupts.
++	 */
++	hard_irq_disable();
++
+ 	/* We need to do this all in asm, so we're sure we don't touch
+ 	 * the stack between the slbia and rebolting it. */
+ 	asm volatile("isync\n"
+diff --git a/arch/powerpc/platforms/cell/iommu.c b/arch/powerpc/platforms/cell/iommu.c
+index 20ea0e1..d75ccde 100644
+--- a/arch/powerpc/platforms/cell/iommu.c
++++ b/arch/powerpc/platforms/cell/iommu.c
+@@ -802,17 +802,24 @@ static int __init cell_iommu_init_disabled(void)
+ 
+ static u64 cell_iommu_get_fixed_address(struct device *dev)
+ {
+-	u64 cpu_addr, size, best_size, pci_addr = OF_BAD_ADDR;
++	u64 cpu_addr, size, best_size, dev_addr = OF_BAD_ADDR;
+ 	struct device_node *np;
+ 	const u32 *ranges = NULL;
+-	int i, len, best;
++	int i, len, best, naddr, nsize, pna, range_size;
+ 
+ 	np = of_node_get(dev->archdata.of_node);
+-	while (np) {
++	while (1) {
++		naddr = of_n_addr_cells(np);
++		nsize = of_n_size_cells(np);
++		np = of_get_next_parent(np);
++		if (!np)
++			break;
++
+ 		ranges = of_get_property(np, "dma-ranges", &len);
+-		if (ranges)
++
++		/* Ignore empty ranges, they imply no translation required */
++		if (ranges && len > 0)
+ 			break;
+-		np = of_get_next_parent(np);
+ 	}
+ 
+ 	if (!ranges) {
+@@ -822,15 +829,17 @@ static u64 cell_iommu_get_fixed_address(struct device *dev)
+ 
+ 	len /= sizeof(u32);
+ 
++	pna = of_n_addr_cells(np);
++	range_size = naddr + nsize + pna;
++
+ 	/* dma-ranges format:
+-	 * 1 cell:  pci space
+-	 * 2 cells: pci address
+-	 * 2 cells: parent address
+-	 * 2 cells: size
++	 * child addr	: naddr cells
++	 * parent addr	: pna cells
++	 * size		: nsize cells
+ 	 */
+-	for (i = 0, best = -1, best_size = 0; i < len; i += 7) {
+-		cpu_addr = of_translate_dma_address(np, ranges +i + 3);
+-		size = of_read_number(ranges + i + 5, 2);
++	for (i = 0, best = -1, best_size = 0; i < len; i += range_size) {
++		cpu_addr = of_translate_dma_address(np, ranges + i + naddr);
++		size = of_read_number(ranges + i + naddr + pna, nsize);
+ 
+ 		if (cpu_addr == 0 && size > best_size) {
+ 			best = i;
+@@ -838,15 +847,15 @@ static u64 cell_iommu_get_fixed_address(struct device *dev)
+ 		}
+ 	}
+ 
+-	if (best >= 0)
+-		pci_addr = of_read_number(ranges + best + 1, 2);
+-	else
++	if (best >= 0) {
++		dev_addr = of_read_number(ranges + best, naddr);
++	} else
+ 		dev_dbg(dev, "iommu: no suitable range found!\n");
+ 
+ out:
+ 	of_node_put(np);
+ 
+-	return pci_addr;
++	return dev_addr;
+ }
+ 
+ static int dma_set_mask_and_switch(struct device *dev, u64 dma_mask)
+diff --git a/arch/powerpc/platforms/cell/setup.c b/arch/powerpc/platforms/cell/setup.c
+index dda3465..5c531e8 100644
+--- a/arch/powerpc/platforms/cell/setup.c
++++ b/arch/powerpc/platforms/cell/setup.c
+@@ -81,6 +81,42 @@ static void cell_progress(char *s, unsigned short hex)
+ 	printk("*** %04x : %s\n", hex, s ? s : "");
+ }
+ 
++static void cell_fixup_pcie_rootcomplex(struct pci_dev *dev)
++{
++	struct pci_controller *hose;
++	const char *s;
++	int i;
++
++	if (!machine_is(cell))
++		return;
++
++	/* We're searching for a direct child of the PHB */
++	if (dev->bus->self != NULL || dev->devfn != 0)
++		return;
++
++	hose = pci_bus_to_host(dev->bus);
++	if (hose == NULL)
++		return;
++
++	/* Only on PCIE */
++	if (!of_device_is_compatible(hose->dn, "pciex"))
++		return;
++
++	/* And only on axon */
++	s = of_get_property(hose->dn, "model", NULL);
++	if (!s || strcmp(s, "Axon") != 0)
++		return;
++
++	for (i = 0; i < PCI_BRIDGE_RESOURCES; i++) {
++		dev->resource[i].start = dev->resource[i].end = 0;
++		dev->resource[i].flags = 0;
++	}
++
++	printk(KERN_DEBUG "PCI: Hiding resources on Axon PCIE RC %s\n",
++	       pci_name(dev));
++}
++DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, cell_fixup_pcie_rootcomplex);
++
+ static int __init cell_publish_devices(void)
+ {
+ 	int node;
+diff --git a/crypto/async_tx/async_xor.c b/crypto/async_tx/async_xor.c
+index 7a9db35..1c445c7 100644
+--- a/crypto/async_tx/async_xor.c
++++ b/crypto/async_tx/async_xor.c
+@@ -271,7 +271,7 @@ async_xor_zero_sum(struct page *dest, struct page **src_list,
+ 
+ 	BUG_ON(src_cnt <= 1);
+ 
+-	if (device) {
++	if (device && src_cnt <= device->max_xor) {
+ 		dma_addr_t *dma_src = (dma_addr_t *) src_list;
+ 		unsigned long dma_prep_flags = cb_fn ? DMA_PREP_INTERRUPT : 0;
+ 		int i;
+diff --git a/drivers/acpi/asus_acpi.c b/drivers/acpi/asus_acpi.c
+index d25ef96..44ad90c 100644
+--- a/drivers/acpi/asus_acpi.c
++++ b/drivers/acpi/asus_acpi.c
+@@ -610,7 +610,7 @@ write_led(const char __user * buffer, unsigned long count,
+ 	    (led_out) ? (hotk->status | ledmask) : (hotk->status & ~ledmask);
+ 
+ 	if (invert)		/* invert target value */
+-		led_out = !led_out & 0x1;
++		led_out = !led_out;
+ 
+ 	if (!write_acpi_int(hotk->handle, ledname, led_out, NULL))
+ 		printk(KERN_WARNING "Asus ACPI: LED (%s) write failed\n",
+diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c
+index f6215e8..d5729d5 100644
+--- a/drivers/acpi/battery.c
++++ b/drivers/acpi/battery.c
+@@ -293,13 +293,12 @@ static int extract_package(struct acpi_battery *battery,
+ 				strncpy(ptr, (u8 *)&element->integer.value,
+ 					sizeof(acpi_integer));
+ 				ptr[sizeof(acpi_integer)] = 0;
+-			} else return -EFAULT;
++			} else
++				*ptr = 0; /* don't have value */
+ 		} else {
+-			if (element->type == ACPI_TYPE_INTEGER) {
+-				int *x = (int *)((u8 *)battery +
+-						offsets[i].offset);
+-				*x = element->integer.value;
+-			} else return -EFAULT;
++			int *x = (int *)((u8 *)battery + offsets[i].offset);
++			*x = (element->type == ACPI_TYPE_INTEGER) ?
++				element->integer.value : -1;
+ 		}
+ 	}
+ 	return 0;
+diff --git a/drivers/acpi/dock.c b/drivers/acpi/dock.c
+index 307cef6..fa44fb9 100644
+--- a/drivers/acpi/dock.c
++++ b/drivers/acpi/dock.c
+@@ -710,6 +710,7 @@ static ssize_t write_undock(struct device *dev, struct device_attribute *attr,
+ 	if (!count)
+ 		return -EINVAL;
+ 
++	begin_undock(dock_station);
+ 	ret = handle_eject_request(dock_station, ACPI_NOTIFY_EJECT_REQUEST);
+ 	return ret ? ret: count;
+ }
+diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c
+index e7e197e..7222a18 100644
+--- a/drivers/acpi/ec.c
++++ b/drivers/acpi/ec.c
+@@ -129,7 +129,6 @@ static struct acpi_ec {
+ 	struct mutex lock;
+ 	wait_queue_head_t wait;
+ 	struct list_head list;
+-	atomic_t irq_count;
+ 	u8 handlers_installed;
+ } *boot_ec, *first_ec;
+ 
+@@ -182,8 +181,6 @@ static int acpi_ec_wait(struct acpi_ec *ec, enum ec_event event, int force_poll)
+ {
+ 	int ret = 0;
+ 
+-	atomic_set(&ec->irq_count, 0);
+-
+ 	if (unlikely(event == ACPI_EC_EVENT_OBF_1 &&
+ 		     test_bit(EC_FLAGS_NO_OBF1_GPE, &ec->flags)))
+ 		force_poll = 1;
+@@ -230,7 +227,6 @@ static int acpi_ec_wait(struct acpi_ec *ec, enum ec_event event, int force_poll)
+ 		while (time_before(jiffies, delay)) {
+ 			if (acpi_ec_check_status(ec, event))
+ 				goto end;
+-			msleep(5);
+ 		}
+ 	}
+ 	pr_err(PREFIX "acpi_ec_wait timeout,"
+@@ -533,13 +529,6 @@ static u32 acpi_ec_gpe_handler(void *data)
+ 	struct acpi_ec *ec = data;
+ 
+ 	pr_debug(PREFIX "~~~> interrupt\n");
+-	atomic_inc(&ec->irq_count);
+-	if (atomic_read(&ec->irq_count) > 5) {
+-		pr_err(PREFIX "GPE storm detected, disabling EC GPE\n");
+-		acpi_disable_gpe(NULL, ec->gpe, ACPI_ISR);
+-		clear_bit(EC_FLAGS_GPE_MODE, &ec->flags);
+-		return ACPI_INTERRUPT_HANDLED;
+-	}
+ 	clear_bit(EC_FLAGS_WAIT_GPE, &ec->flags);
+ 	if (test_bit(EC_FLAGS_GPE_MODE, &ec->flags))
+ 		wake_up(&ec->wait);
+diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c
+index 6f3b217..e8e2d88 100644
+--- a/drivers/acpi/processor_idle.c
++++ b/drivers/acpi/processor_idle.c
+@@ -216,8 +216,10 @@ static void acpi_safe_halt(void)
+ 	 * test NEED_RESCHED:
+ 	 */
+ 	smp_mb();
+-	if (!need_resched())
++	if (!need_resched()) {
+ 		safe_halt();
++		local_irq_disable();
++	}
+ 	current_thread_info()->status |= TS_POLLING;
+ }
+ 
+@@ -421,7 +423,9 @@ static void acpi_processor_idle(void)
+ 		else
+ 			acpi_safe_halt();
+ 
+-		local_irq_enable();
++		if (irqs_disabled())
++			local_irq_enable();
++
+ 		return;
+ 	}
+ 
+@@ -530,7 +534,9 @@ static void acpi_processor_idle(void)
+ 		 *       skew otherwise.
+ 		 */
+ 		sleep_ticks = 0xFFFFFFFF;
+-		local_irq_enable();
++		if (irqs_disabled())
++			local_irq_enable();
++
+ 		break;
+ 
+ 	case ACPI_STATE_C2:
+diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c
+index 1bc0c74..12fb44f 100644
+--- a/drivers/acpi/video.c
++++ b/drivers/acpi/video.c
+@@ -807,40 +807,11 @@ static void acpi_video_bus_find_cap(struct acpi_video_bus *video)
+ static int acpi_video_bus_check(struct acpi_video_bus *video)
+ {
+ 	acpi_status status = -ENOENT;
+-	long device_id;
+-	struct device *dev;
+-	struct acpi_device *device;
++
+ 
+ 	if (!video)
+ 		return -EINVAL;
+ 
+-	device = video->device;
+-
+-	status =
+-	    acpi_evaluate_integer(device->handle, "_ADR", NULL, &device_id);
+-
+-	if (!ACPI_SUCCESS(status))
+-		return -ENODEV;
+-
+-	/* We need to attempt to determine whether the _ADR refers to a
+-	   PCI device or not. There's no terribly good way to do this,
+-	   so the best we can hope for is to assume that there'll never
+-	   be a video device in the host bridge */
+-	if (device_id >= 0x10000) {
+-		/* It looks like a PCI device. Does it exist? */
+-		dev = acpi_get_physical_device(device->handle);
+-	} else {
+-		/* It doesn't look like a PCI device. Does its parent
+-		   exist? */
+-		acpi_handle phandle;
+-		if (acpi_get_parent(device->handle, &phandle))
+-			return -ENODEV;
+-		dev = acpi_get_physical_device(phandle);
+-	}
+-	if (!dev)
+-		return -ENODEV;
+-	put_device(dev);
+-
+ 	/* Since there is no HID, CID and so on for VGA driver, we have
+ 	 * to check well known required nodes.
+ 	 */
+@@ -1366,37 +1337,8 @@ acpi_video_bus_write_DOS(struct file *file,
+ 
+ static int acpi_video_bus_add_fs(struct acpi_device *device)
+ {
+-	long device_id;
+-	int status;
+ 	struct proc_dir_entry *entry = NULL;
+ 	struct acpi_video_bus *video;
+-	struct device *dev;
+-
+-	status =
+-	    acpi_evaluate_integer(device->handle, "_ADR", NULL, &device_id);
+-
+-	if (!ACPI_SUCCESS(status))
+-		return -ENODEV;
+-
+-	/* We need to attempt to determine whether the _ADR refers to a
+-	   PCI device or not. There's no terribly good way to do this,
+-	   so the best we can hope for is to assume that there'll never
+-	   be a video device in the host bridge */
+-	if (device_id >= 0x10000) {
+-		/* It looks like a PCI device. Does it exist? */
+-		dev = acpi_get_physical_device(device->handle);
+-	} else {
+-		/* It doesn't look like a PCI device. Does its parent
+-		   exist? */
+-		acpi_handle phandle;
+-		if (acpi_get_parent(device->handle, &phandle))
+-			return -ENODEV;
+-		dev = acpi_get_physical_device(phandle);
+-	}
+-	if (!dev)
+-		return -ENODEV;
+-	put_device(dev);
+-
+ 
+ 
+ 	video = acpi_driver_data(device);
+diff --git a/drivers/ata/Kconfig b/drivers/ata/Kconfig
+index e469647..25aba69 100644
+--- a/drivers/ata/Kconfig
++++ b/drivers/ata/Kconfig
+@@ -30,6 +30,7 @@ config ATA_NONSTANDARD
+ config ATA_ACPI
+ 	bool
+ 	depends on ACPI && PCI
++	select ACPI_DOCK
+ 	default y
+ 	help
+ 	  This option adds support for ATA-related ACPI objects.
+diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
+index 6978469..17ee6ed 100644
+--- a/drivers/ata/ahci.c
++++ b/drivers/ata/ahci.c
+@@ -49,6 +49,10 @@
+ #define DRV_NAME	"ahci"
+ #define DRV_VERSION	"3.0"
+ 
++static int ahci_skip_host_reset;
++module_param_named(skip_host_reset, ahci_skip_host_reset, int, 0444);
++MODULE_PARM_DESC(skip_host_reset, "skip global host reset (0=don't skip, 1=skip)");
++
+ static int ahci_enable_alpm(struct ata_port *ap,
+ 		enum link_pm policy);
+ static void ahci_disable_alpm(struct ata_port *ap);
+@@ -587,6 +591,7 @@ static const struct pci_device_id ahci_pci_tbl[] = {
+ 
+ 	/* Marvell */
+ 	{ PCI_VDEVICE(MARVELL, 0x6145), board_ahci_mv },	/* 6145 */
++	{ PCI_VDEVICE(MARVELL, 0x6121), board_ahci_mv },	/* 6121 */
+ 
+ 	/* Generic, PCI class code for AHCI */
+ 	{ PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
+@@ -661,6 +666,7 @@ static void ahci_save_initial_config(struct pci_dev *pdev,
+ 	void __iomem *mmio = pcim_iomap_table(pdev)[AHCI_PCI_BAR];
+ 	u32 cap, port_map;
+ 	int i;
++	int mv;
+ 
+ 	/* make sure AHCI mode is enabled before accessing CAP */
+ 	ahci_enable_ahci(mmio);
+@@ -696,12 +702,16 @@ static void ahci_save_initial_config(struct pci_dev *pdev,
+ 	 * presence register, as bit 4 (counting from 0)
+ 	 */
+ 	if (hpriv->flags & AHCI_HFLAG_MV_PATA) {
++		if (pdev->device == 0x6121)
++			mv = 0x3;
++		else
++			mv = 0xf;
+ 		dev_printk(KERN_ERR, &pdev->dev,
+ 			   "MV_AHCI HACK: port_map %x -> %x\n",
+-			   hpriv->port_map,
+-			   hpriv->port_map & 0xf);
++			   port_map,
++			   port_map & mv);
+ 
+-		port_map &= 0xf;
++		port_map &= mv;
+ 	}
+ 
+ 	/* cross check port_map and cap.n_ports */
+@@ -1088,29 +1098,35 @@ static int ahci_reset_controller(struct ata_host *host)
+ 	ahci_enable_ahci(mmio);
+ 
+ 	/* global controller reset */
+-	tmp = readl(mmio + HOST_CTL);
+-	if ((tmp & HOST_RESET) == 0) {
+-		writel(tmp | HOST_RESET, mmio + HOST_CTL);
+-		readl(mmio + HOST_CTL); /* flush */
+-	}
++	if (!ahci_skip_host_reset) {
++		tmp = readl(mmio + HOST_CTL);
++		if ((tmp & HOST_RESET) == 0) {
++			writel(tmp | HOST_RESET, mmio + HOST_CTL);
++			readl(mmio + HOST_CTL); /* flush */
++		}
+ 
+-	/* reset must complete within 1 second, or
+-	 * the hardware should be considered fried.
+-	 */
+-	ssleep(1);
++		/* reset must complete within 1 second, or
++		 * the hardware should be considered fried.
++		 */
++		ssleep(1);
+ 
+-	tmp = readl(mmio + HOST_CTL);
+-	if (tmp & HOST_RESET) {
+-		dev_printk(KERN_ERR, host->dev,
+-			   "controller reset failed (0x%x)\n", tmp);
+-		return -EIO;
+-	}
++		tmp = readl(mmio + HOST_CTL);
++		if (tmp & HOST_RESET) {
++			dev_printk(KERN_ERR, host->dev,
++				   "controller reset failed (0x%x)\n", tmp);
++			return -EIO;
++		}
+ 
+-	/* turn on AHCI mode */
+-	ahci_enable_ahci(mmio);
++		/* turn on AHCI mode */
++		ahci_enable_ahci(mmio);
+ 
+-	/* some registers might be cleared on reset.  restore initial values */
+-	ahci_restore_initial_config(host);
++		/* Some registers might be cleared on reset.  Restore
++		 * initial values.
++		 */
++		ahci_restore_initial_config(host);
++	} else
++		dev_printk(KERN_INFO, host->dev,
++			   "skipping global host reset\n");
+ 
+ 	if (pdev->vendor == PCI_VENDOR_ID_INTEL) {
+ 		u16 tmp16;
+@@ -1162,9 +1178,14 @@ static void ahci_init_controller(struct ata_host *host)
+ 	int i;
+ 	void __iomem *port_mmio;
+ 	u32 tmp;
++	int mv;
+ 
+ 	if (hpriv->flags & AHCI_HFLAG_MV_PATA) {
+-		port_mmio = __ahci_port_base(host, 4);
++		if (pdev->device == 0x6121)
++			mv = 2;
++		else
++			mv = 4;
++		port_mmio = __ahci_port_base(host, mv);
+ 
+ 		writel(0, port_mmio + PORT_IRQ_MASK);
+ 
+@@ -2241,7 +2262,10 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
+ 	if (rc)
+ 		return rc;
+ 
+-	rc = pcim_iomap_regions(pdev, 1 << AHCI_PCI_BAR, DRV_NAME);
++	/* AHCI controllers often implement SFF compatible interface.
++	 * Grab all PCI BARs just in case.
++	 */
++	rc = pcim_iomap_regions_request_all(pdev, 1 << AHCI_PCI_BAR, DRV_NAME);
+ 	if (rc == -EBUSY)
+ 		pcim_pin_device(pdev);
+ 	if (rc)
+diff --git a/drivers/ata/libata-acpi.c b/drivers/ata/libata-acpi.c
+index 0770cb7..bf98a56 100644
+--- a/drivers/ata/libata-acpi.c
++++ b/drivers/ata/libata-acpi.c
+@@ -118,45 +118,77 @@ 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 kobject *kobj,
++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 };
+-	struct ata_eh_info *ehi = &ap->link.eh_info;
+-
+-	if (event == 0 || event == 1) {
+-	       unsigned long flags;
+-	       spin_lock_irqsave(ap->lock, flags);
+-	       ata_ehi_clear_desc(ehi);
+-	       ata_ehi_push_desc(ehi, "ACPI event");
+-	       ata_ehi_hotplugged(ehi);
+-	       ata_port_freeze(ap);
+-	       spin_unlock_irqrestore(ap->lock, flags);
++	struct ata_eh_info *ehi;
++	struct kobject *kobj = NULL;
++	int wait = 0;
++	unsigned long flags;
++
++	if (!ap)
++		ap = dev->link->ap;
++	ehi = &ap->link.eh_info;
++
++	spin_lock_irqsave(ap->lock, flags);
++
++	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;
++		}
++
++		ata_port_schedule_eh(ap);
++		wait = 1;
++		break;
+ 	}
+ 
++	if (dev) {
++		if (dev->sdev)
++			kobj = &dev->sdev->sdev_gendev.kobj;
++	} else
++		kobj = &ap->dev->kobj;
++
+ 	if (kobj) {
+ 		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)
+ {
+ 	struct ata_device *dev = data;
+-	struct kobject *kobj = NULL;
+ 
+-	if (dev->sdev)
+-		kobj = &dev->sdev->sdev_gendev.kobj;
+-
+-	ata_acpi_handle_hotplug(dev->link->ap, kobj, event);
++	ata_acpi_handle_hotplug(NULL, dev, event);
+ }
+ 
+ static void ata_acpi_ap_notify(acpi_handle handle, u32 event, void *data)
+ {
+ 	struct ata_port *ap = data;
+ 
+-	ata_acpi_handle_hotplug(ap, &ap->dev->kobj, event);
++	ata_acpi_handle_hotplug(ap, NULL, event);
+ }
+ 
+ /**
+@@ -191,20 +223,30 @@ void ata_acpi_associate(struct ata_host *host)
+ 		else
+ 			ata_acpi_associate_ide_port(ap);
+ 
+-		if (ap->acpi_handle)
+-			acpi_install_notify_handler (ap->acpi_handle,
+-						     ACPI_SYSTEM_NOTIFY,
+-						     ata_acpi_ap_notify,
+-						     ap);
++		if (ap->acpi_handle) {
++			acpi_install_notify_handler(ap->acpi_handle,
++						    ACPI_SYSTEM_NOTIFY,
++						    ata_acpi_ap_notify, ap);
++#if defined(CONFIG_ACPI_DOCK) || defined(CONFIG_ACPI_DOCK_MODULE)
++			/* we might be on a docking station */
++			register_hotplug_dock_device(ap->acpi_handle,
++						     ata_acpi_ap_notify, ap);
++#endif
++		}
+ 
+ 		for (j = 0; j < ata_link_max_devices(&ap->link); j++) {
+ 			struct ata_device *dev = &ap->link.device[j];
+ 
+-			if (dev->acpi_handle)
+-				acpi_install_notify_handler (dev->acpi_handle,
+-							     ACPI_SYSTEM_NOTIFY,
+-							     ata_acpi_dev_notify,
+-							     dev);
++			if (dev->acpi_handle) {
++				acpi_install_notify_handler(dev->acpi_handle,
++						ACPI_SYSTEM_NOTIFY,
++						ata_acpi_dev_notify, dev);
++#if defined(CONFIG_ACPI_DOCK) || defined(CONFIG_ACPI_DOCK_MODULE)
++				/* we might be on a docking station */
++				register_hotplug_dock_device(dev->acpi_handle,
++						ata_acpi_dev_notify, dev);
++#endif
++			}
+ 		}
+ 	}
+ }
+diff --git a/drivers/ata/pata_ali.c b/drivers/ata/pata_ali.c
+index 7e68edf..8786455 100644
+--- a/drivers/ata/pata_ali.c
++++ b/drivers/ata/pata_ali.c
+@@ -295,7 +295,7 @@ static void ali_lock_sectors(struct ata_device *adev)
+ static int ali_check_atapi_dma(struct ata_queued_cmd *qc)
+ {
+ 	/* If its not a media command, its not worth it */
+-	if (qc->nbytes < 2048)
++	if (atapi_cmd_type(qc->cdb[0]) == ATAPI_MISC)
+ 		return -EOPNOTSUPP;
+ 	return 0;
+ }
+diff --git a/drivers/block/Kconfig b/drivers/block/Kconfig
+index b6d230b..0d1d213 100644
+--- a/drivers/block/Kconfig
++++ b/drivers/block/Kconfig
+@@ -44,16 +44,6 @@ config MAC_FLOPPY
+ 	  If you have a SWIM-3 (Super Woz Integrated Machine 3; from Apple)
+ 	  floppy controller, say Y here. Most commonly found in PowerMacs.
+ 
+-config BLK_DEV_PS2
+-	tristate "PS/2 ESDI hard disk support"
+-	depends on MCA && MCA_LEGACY && BROKEN
+-	help
+-	  Say Y here if you have a PS/2 machine with a MCA bus and an ESDI
+-	  hard disk.
+-
+-	  To compile this driver as a module, choose M here: the
+-	  module will be called ps2esdi.
+-
+ config AMIGA_Z2RAM
+ 	tristate "Amiga Zorro II ramdisk support"
+ 	depends on ZORRO
+diff --git a/drivers/block/Makefile b/drivers/block/Makefile
+index 01c9724..5e58430 100644
+--- a/drivers/block/Makefile
++++ b/drivers/block/Makefile
+@@ -13,7 +13,6 @@ obj-$(CONFIG_ATARI_FLOPPY)	+= ataflop.o
+ obj-$(CONFIG_AMIGA_Z2RAM)	+= z2ram.o
+ obj-$(CONFIG_BLK_DEV_RAM)	+= brd.o
+ obj-$(CONFIG_BLK_DEV_LOOP)	+= loop.o
+-obj-$(CONFIG_BLK_DEV_PS2)	+= ps2esdi.o
+ obj-$(CONFIG_BLK_DEV_XD)	+= xd.o
+ obj-$(CONFIG_BLK_CPQ_DA)	+= cpqarray.o
+ obj-$(CONFIG_BLK_CPQ_CISS_DA)  += cciss.o
+diff --git a/drivers/block/ps2esdi.c b/drivers/block/ps2esdi.c
+deleted file mode 100644
+index 3c796e2..0000000
+--- a/drivers/block/ps2esdi.c
++++ /dev/null
+@@ -1,1079 +0,0 @@
+-/* ps2esdi driver based on assembler code by Arindam Banerji,
+-   written by Peter De Schrijver */
+-/* Reassuring note to IBM : This driver was NOT developed by vice-versa
+-   engineering the PS/2's BIOS */
+-/* Dedicated to Wannes, Tofke, Ykke, Godot, Killroy and all those 
+-   other lovely fish out there... */
+-/* This code was written during the long and boring WINA 
+-   elections 1994 */
+-/* Thanks to Arindam Banerij for giving me the source of his driver */
+-/* This code may be freely distributed and modified in any way, 
+-   as long as these notes remain intact */
+-
+-/*  Revised: 05/07/94 by Arindam Banerji (axb at cse.nd.edu) */
+-/*  Revised: 09/08/94 by Peter De Schrijver (stud11 at cc4.kuleuven.ac.be)
+-   Thanks to Arindam Banerij for sending me the docs of the adapter */
+-
+-/* BA Modified for ThinkPad 720 by Boris Ashkinazi */
+-/*                    (bash at vnet.ibm.com) 08/08/95 */
+-
+-/* Modified further for ThinkPad-720C by Uri Blumenthal */
+-/*                    (uri at watson.ibm.com) Sep 11, 1995 */
+-
+-/* TODO : 
+-   + Timeouts
+-   + Get disk parameters
+-   + DMA above 16MB
+-   + reset after read/write error
+- */
+-
+-#define DEVICE_NAME "PS/2 ESDI"
+-
+-#include <linux/major.h>
+-#include <linux/errno.h>
+-#include <linux/wait.h>
+-#include <linux/interrupt.h>
+-#include <linux/fs.h>
+-#include <linux/kernel.h>
+-#include <linux/genhd.h>
+-#include <linux/ps2esdi.h>
+-#include <linux/blkdev.h>
+-#include <linux/mca-legacy.h>
+-#include <linux/init.h>
+-#include <linux/ioport.h>
+-#include <linux/module.h>
+-#include <linux/hdreg.h>
+-
+-#include <asm/system.h>
+-#include <asm/io.h>
+-#include <asm/dma.h>
+-#include <asm/mca_dma.h>
+-#include <asm/uaccess.h>
+-
+-#define PS2ESDI_IRQ 14
+-#define MAX_HD 2
+-#define MAX_RETRIES 5
+-#define MAX_16BIT 65536
+-#define ESDI_TIMEOUT   0xf000
+-#define ESDI_STAT_TIMEOUT 4
+-
+-#define TYPE_0_CMD_BLK_LENGTH 2
+-#define TYPE_1_CMD_BLK_LENGTH 4
+-
+-static void reset_ctrl(void);
+-
+-static int ps2esdi_geninit(void);
+-
+-static void do_ps2esdi_request(struct request_queue * q);
+-
+-static void ps2esdi_readwrite(int cmd, struct request *req);
+-
+-static void ps2esdi_fill_cmd_block(u_short * cmd_blk, u_short cmd,
+-u_short cyl, u_short head, u_short sector, u_short length, u_char drive);
+-
+-static int ps2esdi_out_cmd_blk(u_short * cmd_blk);
+-
+-static void ps2esdi_prep_dma(char *buffer, u_short length, u_char dma_xmode);
+-
+-static irqreturn_t ps2esdi_interrupt_handler(int irq, void *dev_id);
+-static void (*current_int_handler) (u_int) = NULL;
+-static void ps2esdi_normal_interrupt_handler(u_int);
+-static void ps2esdi_initial_reset_int_handler(u_int);
+-static void ps2esdi_geometry_int_handler(u_int);
+-static int ps2esdi_getgeo(struct block_device *bdev, struct hd_geometry *geo);
+-
+-static int ps2esdi_read_status_words(int num_words, int max_words, u_short * buffer);
+-
+-static void dump_cmd_complete_status(u_int int_ret_code);
+-
+-static void ps2esdi_get_device_cfg(void);
+-
+-static void ps2esdi_reset_timer(unsigned long unused);
+-
+-static u_int dma_arb_level;		/* DMA arbitration level */
+-
+-static DECLARE_WAIT_QUEUE_HEAD(ps2esdi_int);
+-
+-static int no_int_yet;
+-static int ps2esdi_drives;
+-static u_short io_base;
+-static DEFINE_TIMER(esdi_timer, ps2esdi_reset_timer, 0, 0);
+-static int reset_status;
+-static int ps2esdi_slot = -1;
+-static int tp720esdi = 0;	/* Is it Integrated ESDI of ThinkPad-720? */
+-static int intg_esdi = 0;       /* If integrated adapter */
+-struct ps2esdi_i_struct {
+-	unsigned int head, sect, cyl, wpcom, lzone, ctl;
+-};
+-static DEFINE_SPINLOCK(ps2esdi_lock);
+-static struct request_queue *ps2esdi_queue;
+-static struct request *current_req;
+-
+-#if 0
+-#if 0				/* try both - I don't know which one is better... UB */
+-static struct ps2esdi_i_struct ps2esdi_info[MAX_HD] =
+-{
+-	{4, 48, 1553, 0, 0, 0},
+-	{0, 0, 0, 0, 0, 0}};
+-#else
+-static struct ps2esdi_i_struct ps2esdi_info[MAX_HD] =
+-{
+-	{64, 32, 161, 0, 0, 0},
+-	{0, 0, 0, 0, 0, 0}};
+-#endif
+-#endif
+-static struct ps2esdi_i_struct ps2esdi_info[MAX_HD] =
+-{
+-	{0, 0, 0, 0, 0, 0},
+-	{0, 0, 0, 0, 0, 0}};
+-
+-static struct block_device_operations ps2esdi_fops =
+-{
+-	.owner		= THIS_MODULE,
+-	.getgeo		= ps2esdi_getgeo,
+-};
+-
+-static struct gendisk *ps2esdi_gendisk[2];
+-
+-/* initialization routine called by ll_rw_blk.c   */
+-static int __init ps2esdi_init(void)
+-{
+-
+-	int error = 0;
+-
+-	/* register the device - pass the name and major number */
+-	if (register_blkdev(PS2ESDI_MAJOR, "ed"))
+-		return -EBUSY;
+-
+-	/* set up some global information - indicating device specific info */
+-	ps2esdi_queue = blk_init_queue(do_ps2esdi_request, &ps2esdi_lock);
+-	if (!ps2esdi_queue) {
+-		unregister_blkdev(PS2ESDI_MAJOR, "ed");
+-		return -ENOMEM;
+-	}
+-
+-	/* some minor housekeeping - setup the global gendisk structure */
+-	error = ps2esdi_geninit();
+-	if (error) {
+-		printk(KERN_WARNING "PS2ESDI: error initialising"
+-			" device, releasing resources\n");
+-		unregister_blkdev(PS2ESDI_MAJOR, "ed");
+-		blk_cleanup_queue(ps2esdi_queue);
+-		return error;
+-	}
+-	return 0;
+-}				/* ps2esdi_init */
+-
+-#ifndef MODULE
+-
+-module_init(ps2esdi_init);
+-
+-#else
+-
+-static int cyl[MAX_HD] = {-1,-1};
+-static int head[MAX_HD] = {-1, -1};
+-static int sect[MAX_HD] = {-1, -1};
+-
+-module_param(tp720esdi, bool, 0);
+-module_param_array(cyl, int, NULL, 0);
+-module_param_array(head, int, NULL, 0);
+-module_param_array(sect, int, NULL, 0);
+-MODULE_LICENSE("GPL");
+-
+-int init_module(void) {
+-	int drive;
+-
+-	for(drive = 0; drive < MAX_HD; drive++) {
+-	        struct ps2esdi_i_struct *info = &ps2esdi_info[drive];
+-
+-        	if (cyl[drive] != -1) {
+-		  	info->cyl = info->lzone = cyl[drive];
+-			info->wpcom = 0;
+-		}
+-        	if (head[drive] != -1) {
+-			info->head = head[drive];
+-			info->ctl = (head[drive] > 8 ? 8 : 0);
+-		}
+-        	if (sect[drive] != -1) info->sect = sect[drive];
+-	}
+-	return ps2esdi_init();
+-}
+-
+-void
+-cleanup_module(void) {
+-	int i;
+-	if(ps2esdi_slot) {
+-		mca_mark_as_unused(ps2esdi_slot);
+-		mca_set_adapter_procfn(ps2esdi_slot, NULL, NULL);
+-	}
+-	release_region(io_base, 4);
+-	free_dma(dma_arb_level);
+-	free_irq(PS2ESDI_IRQ, &ps2esdi_gendisk);
+-	unregister_blkdev(PS2ESDI_MAJOR, "ed");
+-	blk_cleanup_queue(ps2esdi_queue);
+-	for (i = 0; i < ps2esdi_drives; i++) {
+-		del_gendisk(ps2esdi_gendisk[i]);
+-		put_disk(ps2esdi_gendisk[i]);
+-	}
+-}
+-#endif /* MODULE */
+-
+-/* handles boot time command line parameters */
+-void __init tp720_setup(char *str, int *ints)
+-{
+-	/* no params, just sets the tp720esdi flag if it exists */
+-
+-	printk("%s: TP 720 ESDI flag set\n", DEVICE_NAME);
+-	tp720esdi = 1;
+-}
+-
+-void __init ed_setup(char *str, int *ints)
+-{
+-	int hdind = 0;
+-
+-	/* handles 3 parameters only - corresponding to
+-	   1. Number of cylinders
+-	   2. Number of heads
+-	   3. Sectors/track
+-	 */
+-
+-	if (ints[0] != 3)
+-		return;
+-
+-	/* print out the information - seen at boot time */
+-	printk("%s: ints[0]=%d ints[1]=%d ints[2]=%d ints[3]=%d\n",
+-	       DEVICE_NAME, ints[0], ints[1], ints[2], ints[3]);
+-
+-	/* set the index into device specific information table */
+-	if (ps2esdi_info[0].head != 0)
+-		hdind = 1;
+-
+-	/* set up all the device information */
+-	ps2esdi_info[hdind].head = ints[2];
+-	ps2esdi_info[hdind].sect = ints[3];
+-	ps2esdi_info[hdind].cyl = ints[1];
+-	ps2esdi_info[hdind].wpcom = 0;
+-	ps2esdi_info[hdind].lzone = ints[1];
+-	ps2esdi_info[hdind].ctl = (ints[2] > 8 ? 8 : 0);
+-#if 0				/* this may be needed for PS2/Mod.80, but it hurts ThinkPad! */
+-	ps2esdi_drives = hdind + 1;	/* increment index for the next time */
+-#endif
+-}				/* ed_setup */
+-
+-static int ps2esdi_getinfo(char *buf, int slot, void *d)
+-{
+-	int len = 0;
+-
+-	len += sprintf(buf + len, "DMA Arbitration Level: %d\n",
+-		       dma_arb_level);
+-	len += sprintf(buf + len, "IO Port: %x\n", io_base);
+-	len += sprintf(buf + len, "IRQ: 14\n");
+-	len += sprintf(buf + len, "Drives: %d\n", ps2esdi_drives);
+-
+-	return len;
+-}
+-
+-/* ps2 esdi specific initialization - called thru the gendisk chain */
+-static int __init ps2esdi_geninit(void)
+-{
+-	/*
+-	   The first part contains the initialization code
+-	   for the ESDI disk subsystem.  All we really do
+-	   is search for the POS registers of the controller
+-	   to do some simple setup operations.  First, we
+-	   must ensure that the controller is installed,
+-	   enabled, and configured as PRIMARY.  Then we must
+-	   determine the DMA arbitration level being used by
+-	   the controller so we can handle data transfer
+-	   operations properly.  If all of this works, then
+-	   we will set the INIT_FLAG to a non-zero value.
+-	 */
+-
+-	int slot = 0, i, reset_start, reset_end;
+-	u_char status;
+-	unsigned short adapterID;
+-	int error = 0;
+-
+-	if ((slot = mca_find_adapter(INTG_ESDI_ID, 0)) != MCA_NOTFOUND) {
+-		adapterID = INTG_ESDI_ID;
+-		printk("%s: integrated ESDI adapter found in slot %d\n",
+-		       DEVICE_NAME, slot+1);
+-#ifndef MODULE
+-		mca_set_adapter_name(slot, "PS/2 Integrated ESDI");
+-#endif
+-	} else if ((slot = mca_find_adapter(NRML_ESDI_ID, 0)) != -1) {
+-		adapterID = NRML_ESDI_ID;
+-		printk("%s: normal ESDI adapter found in slot %d\n",
+-		       DEVICE_NAME, slot+1);
+-		mca_set_adapter_name(slot, "PS/2 ESDI");
+-	} else {
+-		return -ENODEV;
+-	}
+-
+-	ps2esdi_slot = slot;
+-	mca_mark_as_used(slot);
+-	mca_set_adapter_procfn(slot, (MCA_ProcFn) ps2esdi_getinfo, NULL);
+-
+-	/* Found the slot - read the POS register 2 to get the necessary
+-	   configuration and status information.  POS register 2 has the
+-	   following information :
+-	   Bit           Function
+-	   7             reserved = 0
+-	   6             arbitration method
+-	   0 - fairness enabled
+-	   1 - fairness disabled, linear priority assignment
+-	   5-2           arbitration level
+-	   1             alternate address
+-	   1              alternate address
+-	   0 - use addresses 0x3510 - 0x3517
+-	   0             adapter enable
+-	 */
+-
+-	status = mca_read_stored_pos(slot, 2);
+-	/* is it enabled ? */
+-	if (!(status & STATUS_ENABLED)) {
+-		printk("%s: ESDI adapter disabled\n", DEVICE_NAME);
+-		error = -ENODEV;
+-		goto err_out1;
+-	}
+-	/* try to grab IRQ, and try to grab a slow IRQ if it fails, so we can
+-	   share with the SCSI driver */
+-	if (request_irq(PS2ESDI_IRQ, ps2esdi_interrupt_handler,
+-		  IRQF_DISABLED | IRQF_SHARED, "PS/2 ESDI", &ps2esdi_gendisk)
+-	    && request_irq(PS2ESDI_IRQ, ps2esdi_interrupt_handler,
+-			   IRQF_SHARED, "PS/2 ESDI", &ps2esdi_gendisk)
+-	    ) {
+-		printk("%s: Unable to get IRQ %d\n", DEVICE_NAME, PS2ESDI_IRQ);
+-		error = -EBUSY;
+-		goto err_out1;
+-	}
+-	if (status & STATUS_ALTERNATE)
+-		io_base = ALT_IO_BASE;
+-	else
+-		io_base = PRIMARY_IO_BASE;
+-
+-	if (!request_region(io_base, 4, "ed")) {
+-		printk(KERN_WARNING"Unable to request region 0x%x\n", io_base);
+-		error = -EBUSY;
+-		goto err_out2;
+-	}
+-	/* get the dma arbitration level */
+-	dma_arb_level = (status >> 2) & 0xf;
+-
+-	/* BA */
+-	printk("%s: DMA arbitration level : %d\n",
+-	       DEVICE_NAME, dma_arb_level);
+-
+-	LITE_ON;
+-	current_int_handler = ps2esdi_initial_reset_int_handler;
+-	reset_ctrl();
+-	reset_status = 0;
+-	reset_start = jiffies;
+-	while (!reset_status) {
+-		init_timer(&esdi_timer);
+-		esdi_timer.expires = jiffies + HZ;
+-		esdi_timer.data = 0;
+-		add_timer(&esdi_timer);
+-		sleep_on(&ps2esdi_int);
+-	}
+-	reset_end = jiffies;
+-	LITE_OFF;
+-	printk("%s: reset interrupt after %d jiffies,  %u.%02u secs\n",
+-	       DEVICE_NAME, reset_end - reset_start, (reset_end - reset_start) / HZ,
+-	       (reset_end - reset_start) % HZ);
+-
+-
+-	/* Integrated ESDI Disk and Controller has only one drive! */
+-	if (adapterID == INTG_ESDI_ID) {/* if not "normal" PS2 ESDI adapter */
+-		ps2esdi_drives = 1;	/* then we have only one physical disk! */		intg_esdi = 1;
+-	}
+-
+-
+-
+-	/* finally this part sets up some global data structures etc. */
+-
+-	ps2esdi_get_device_cfg();
+-
+-	/* some annoyance in the above routine returns TWO drives?
+-	 Is something else happining in the background?
+-	 Regaurdless we fix the # of drives again. AJK */
+-	/* Integrated ESDI Disk and Controller has only one drive! */
+-	if (adapterID == INTG_ESDI_ID)	/* if not "normal" PS2 ESDI adapter */
+-		ps2esdi_drives = 1;	/* Not three or two, ONE DAMNIT! */
+-
+-	current_int_handler = ps2esdi_normal_interrupt_handler;
+-
+-	if (request_dma(dma_arb_level, "ed") !=0) {
+-		printk(KERN_WARNING "PS2ESDI: Can't request dma-channel %d\n"
+-			,(int) dma_arb_level);
+-		error = -EBUSY;
+-		goto err_out3;
+-	}
+-	blk_queue_max_sectors(ps2esdi_queue, 128);
+-
+-	error = -ENOMEM;
+-	for (i = 0; i < ps2esdi_drives; i++) {
+-		struct gendisk *disk = alloc_disk(64);
+-		if (!disk)
+-			goto err_out4;
+-		disk->major = PS2ESDI_MAJOR;
+-		disk->first_minor = i<<6;
+-		sprintf(disk->disk_name, "ed%c", 'a'+i);
+-		disk->fops = &ps2esdi_fops;
+-		ps2esdi_gendisk[i] = disk;
+-	}
+-
+-	for (i = 0; i < ps2esdi_drives; i++) {
+-		struct gendisk *disk = ps2esdi_gendisk[i];
+-		set_capacity(disk, ps2esdi_info[i].head * ps2esdi_info[i].sect *
+-				ps2esdi_info[i].cyl);
+-		disk->queue = ps2esdi_queue;
+-		disk->private_data = &ps2esdi_info[i];
+-		add_disk(disk);
+-	}
+-	return 0;
+-err_out4:
+-	while (i--)
+-		put_disk(ps2esdi_gendisk[i]);
+-err_out3:
+-	release_region(io_base, 4);
+-err_out2:
+-	free_irq(PS2ESDI_IRQ, &ps2esdi_gendisk);
+-err_out1:
+-	if(ps2esdi_slot) {
+-		mca_mark_as_unused(ps2esdi_slot);
+-		mca_set_adapter_procfn(ps2esdi_slot, NULL, NULL);
+-	}
+-	return error;
+-}
+-
+-static void __init ps2esdi_get_device_cfg(void)
+-{
+-	u_short cmd_blk[TYPE_0_CMD_BLK_LENGTH];
+-
+-	/*BA */ printk("%s: Drive 0\n", DEVICE_NAME);
+-	current_int_handler = ps2esdi_geometry_int_handler;
+-	cmd_blk[0] = CMD_GET_DEV_CONFIG | 0x600;
+-	cmd_blk[1] = 0;
+-	no_int_yet = TRUE;
+-	ps2esdi_out_cmd_blk(cmd_blk);
+-	if (no_int_yet)
+-		sleep_on(&ps2esdi_int);
+-
+-	if (ps2esdi_drives > 1) {
+-		printk("%s: Drive 1\n", DEVICE_NAME);	/*BA */
+-		cmd_blk[0] = CMD_GET_DEV_CONFIG | (1 << 5) | 0x600;
+-		cmd_blk[1] = 0;
+-		no_int_yet = TRUE;
+-		ps2esdi_out_cmd_blk(cmd_blk);
+-		if (no_int_yet)
+-			sleep_on(&ps2esdi_int);
+-	}			/* if second physical drive is present */
+-	return;
+-}
+-
+-/* strategy routine that handles most of the IO requests */
+-static void do_ps2esdi_request(struct request_queue * q)
+-{
+-	struct request *req;
+-	/* since, this routine is called with interrupts cleared - they 
+-	   must be before it finishes  */
+-
+-	req = elv_next_request(q);
+-	if (!req)
+-		return;
+-
+-#if 0
+-	printk("%s:got request. device : %s command : %d  sector : %ld count : %ld, buffer: %p\n",
+-	       DEVICE_NAME,
+-	       req->rq_disk->disk_name,
+-	       req->cmd, req->sector,
+-	       req->current_nr_sectors, req->buffer);
+-#endif
+-
+-	/* check for above 16Mb dmas */
+-	if (isa_virt_to_bus(req->buffer + req->current_nr_sectors * 512) > 16 * MB) {
+-		printk("%s: DMA above 16MB not supported\n", DEVICE_NAME);
+-		end_request(req, FAIL);
+-		return;
+-	}
+-
+-	if (req->sector+req->current_nr_sectors > get_capacity(req->rq_disk)) {
+-		printk("Grrr. error. ps2esdi_drives: %d, %llu %llu\n",
+-		    ps2esdi_drives, req->sector,
+-		    (unsigned long long)get_capacity(req->rq_disk));
+-		end_request(req, FAIL);
+-		return;
+-	}
+-
+-	switch (rq_data_dir(req)) {
+-	case READ:
+-		ps2esdi_readwrite(READ, req);
+-		break;
+-	case WRITE:
+-		ps2esdi_readwrite(WRITE, req);
+-		break;
+-	default:
+-		printk("%s: Unknown command\n", req->rq_disk->disk_name);
+-		end_request(req, FAIL);
+-		break;
+-	}		/* handle different commands */
+-}				/* main strategy routine */
+-
+-/* resets the ESDI adapter */
+-static void reset_ctrl(void)
+-{
+-
+-	u_long expire;
+-	u_short status;
+-
+-	/* enable interrupts on the controller */
+-	status = inb(ESDI_INTRPT);
+-	outb((status & 0xe0) | ATT_EOI, ESDI_ATTN);	/* to be sure we don't have
+-							   any interrupt pending... */
+-	outb_p(CTRL_ENABLE_INTR, ESDI_CONTROL);
+-
+-	/* read the ESDI status port - if the controller is not busy,
+-	   simply do a soft reset (fast) - otherwise we'll have to do a
+-	   hard (slow) reset.  */
+-	if (!(inb_p(ESDI_STATUS) & STATUS_BUSY)) {
+-		/*BA */ printk("%s: soft reset...\n", DEVICE_NAME);
+-		outb_p(CTRL_SOFT_RESET, ESDI_ATTN);
+-	}
+-	/* soft reset */ 
+-	else {
+-		/*BA */
+-		printk("%s: hard reset...\n", DEVICE_NAME);
+-		outb_p(CTRL_HARD_RESET, ESDI_CONTROL);
+-		expire = jiffies + 2*HZ;
+-		while (time_before(jiffies, expire));
+-		outb_p(1, ESDI_CONTROL);
+-	}			/* hard reset */
+-
+-
+-}				/* reset the controller */
+-
+-/* called by the strategy routine to handle read and write requests */
+-static void ps2esdi_readwrite(int cmd, struct request *req)
+-{
+-	struct ps2esdi_i_struct *p = req->rq_disk->private_data;
+-	unsigned block = req->sector;
+-	unsigned count = req->current_nr_sectors;
+-	int drive = p - ps2esdi_info;
+-	u_short track, head, cylinder, sector;
+-	u_short cmd_blk[TYPE_1_CMD_BLK_LENGTH];
+-
+-	/* do some relevant arithmatic */
+-	track = block / p->sect;
+-	head = track % p->head;
+-	cylinder = track / p->head;
+-	sector = block % p->sect;
+-
+-#if 0
+-	printk("%s: cyl=%d head=%d sect=%d\n", DEVICE_NAME, cylinder, head, sector);
+-#endif
+-	/* call the routine that actually fills out a command block */
+-	ps2esdi_fill_cmd_block
+-	    (cmd_blk,
+-	     (cmd == READ) ? CMD_READ : CMD_WRITE,
+-	     cylinder, head, sector, count, drive);
+-
+-	/* send the command block to the controller */
+-	current_req = req;
+-	spin_unlock_irq(&ps2esdi_lock);
+-	if (ps2esdi_out_cmd_blk(cmd_blk)) {
+-		spin_lock_irq(&ps2esdi_lock);
+-		printk("%s: Controller failed\n", DEVICE_NAME);
+-		if ((++req->errors) >= MAX_RETRIES)
+-			end_request(req, FAIL);
+-	}
+-	/* check for failure to put out the command block */ 
+-	else {
+-		spin_lock_irq(&ps2esdi_lock);
+-#if 0
+-		printk("%s: waiting for xfer\n", DEVICE_NAME);
+-#endif
+-		/* turn disk lights on */
+-		LITE_ON;
+-	}
+-
+-}				/* ps2esdi_readwrite */
+-
+-/* fill out the command block */
+-static void ps2esdi_fill_cmd_block(u_short * cmd_blk, u_short cmd,
+- u_short cyl, u_short head, u_short sector, u_short length, u_char drive)
+-{
+-
+-	cmd_blk[0] = (drive << 5) | cmd;
+-	cmd_blk[1] = length;
+-	cmd_blk[2] = ((cyl & 0x1f) << 11) | (head << 5) | sector;
+-	cmd_blk[3] = (cyl & 0x3E0) >> 5;
+-
+-}				/* fill out the command block */
+-
+-/* write a command block to the controller */
+-static int ps2esdi_out_cmd_blk(u_short * cmd_blk)
+-{
+-
+-	int i;
+-	unsigned long jif;
+-	u_char status;
+-
+-	/* enable interrupts */
+-	outb(CTRL_ENABLE_INTR, ESDI_CONTROL);
+-
+-	/* do not write to the controller, if it is busy */
+-	for (jif = jiffies + ESDI_STAT_TIMEOUT;
+-		time_after(jif, jiffies) &&
+-			(inb(ESDI_STATUS) & STATUS_BUSY); )
+-		;
+-
+-#if 0
+-	printk("%s: i(1)=%ld\n", DEVICE_NAME, jif);
+-#endif
+-
+-	/* if device is still busy - then just time out */
+-	if (inb(ESDI_STATUS) & STATUS_BUSY) {
+-		printk("%s: ps2esdi_out_cmd timed out (1)\n", DEVICE_NAME);
+-		return ERROR;
+-	}			/* timeout ??? */
+-	/* Set up the attention register in the controller */
+-	outb(((*cmd_blk) & 0xE0) | 1, ESDI_ATTN);
+-
+-#if 0
+-	printk("%s: sending %d words to controller\n", DEVICE_NAME, (((*cmd_blk) >> 14) + 1) << 1);
+-#endif
+-
+-	/* one by one send each word out */
+-	for (i = (((*cmd_blk) >> 14) + 1) << 1; i; i--) {
+-		status = inb(ESDI_STATUS);
+-		for (jif = jiffies + ESDI_STAT_TIMEOUT;
+-		     time_after(jif, jiffies) && (status & STATUS_BUSY) &&
+-		   (status & STATUS_CMD_INF); status = inb(ESDI_STATUS));
+-		if ((status & (STATUS_BUSY | STATUS_CMD_INF)) == STATUS_BUSY) {
+-#if 0
+-			printk("%s: sending %04X\n", DEVICE_NAME, *cmd_blk);
+-#endif
+-			outw(*cmd_blk++, ESDI_CMD_INT);
+-		} else {
+-			printk("%s: ps2esdi_out_cmd timed out while sending command (status=%02X)\n",
+-			       DEVICE_NAME, status);
+-			return ERROR;
+-		}
+-	}			/* send all words out */
+-	return OK;
+-}				/* send out the commands */
+-
+-
+-/* prepare for dma - do all the necessary setup */
+-static void ps2esdi_prep_dma(char *buffer, u_short length, u_char dma_xmode)
+-{
+-	unsigned long flags = claim_dma_lock();
+-
+-	mca_disable_dma(dma_arb_level);
+-
+-	mca_set_dma_addr(dma_arb_level, isa_virt_to_bus(buffer));
+-
+-	mca_set_dma_count(dma_arb_level, length * 512 / 2);
+-
+-	mca_set_dma_mode(dma_arb_level, dma_xmode);
+-
+-	mca_enable_dma(dma_arb_level);
+-
+-	release_dma_lock(flags);
+-
+-}				/* prepare for dma */
+-
+-
+-
+-static irqreturn_t ps2esdi_interrupt_handler(int irq, void *dev_id)
+-{
+-	u_int int_ret_code;
+-
+-	if (inb(ESDI_STATUS) & STATUS_INTR) {
+-		int_ret_code = inb(ESDI_INTRPT);
+-		if (current_int_handler) {
+-			/* Disable adapter interrupts till processing is finished */
+-			outb(CTRL_DISABLE_INTR, ESDI_CONTROL);
+-			current_int_handler(int_ret_code);
+-		} else
+-			printk("%s: help ! No interrupt handler.\n", DEVICE_NAME);
+-	} else {
+-		return IRQ_NONE;
+-	}
+-	return IRQ_HANDLED;
+-}
+-
+-static void ps2esdi_initial_reset_int_handler(u_int int_ret_code)
+-{
+-
+-	switch (int_ret_code & 0xf) {
+-	case INT_RESET:
+-		/*BA */
+-		printk("%s: initial reset completed.\n", DEVICE_NAME);
+-		outb((int_ret_code & 0xe0) | ATT_EOI, ESDI_ATTN);
+-		wake_up(&ps2esdi_int);
+-		break;
+-	case INT_ATTN_ERROR:
+-		printk("%s: Attention error. interrupt status : %02X\n", DEVICE_NAME,
+-		       int_ret_code);
+-		printk("%s: status: %02x\n", DEVICE_NAME, inb(ESDI_STATUS));
+-		break;
+-	default:
+-		printk("%s: initial reset handler received interrupt: %02X\n",
+-		       DEVICE_NAME, int_ret_code);
+-		outb((int_ret_code & 0xe0) | ATT_EOI, ESDI_ATTN);
+-		break;
+-	}
+-	outb(CTRL_ENABLE_INTR, ESDI_CONTROL);
+-}
+-
+-
+-static void ps2esdi_geometry_int_handler(u_int int_ret_code)
+-{
+-	u_int status, drive_num;
+-	unsigned long rba;
+-	int i;
+-
+-	drive_num = int_ret_code >> 5;
+-	switch (int_ret_code & 0xf) {
+-	case INT_CMD_COMPLETE:
+-		for (i = ESDI_TIMEOUT; i && !(inb(ESDI_STATUS) & STATUS_STAT_AVAIL); i--);
+-		if (!(inb(ESDI_STATUS) & STATUS_STAT_AVAIL)) {
+-			printk("%s: timeout reading status word\n", DEVICE_NAME);
+-			outb((int_ret_code & 0xe0) | ATT_EOI, ESDI_ATTN);
+-			break;
+-		}
+-		status = inw(ESDI_STT_INT);
+-		if ((status & 0x1F) == CMD_GET_DEV_CONFIG) {
+-#define REPLY_WORDS 5		/* we already read word 0 */
+-			u_short reply[REPLY_WORDS];
+-
+-			if (ps2esdi_read_status_words((status >> 8) - 1, REPLY_WORDS, reply)) {
+-				/*BA */
+-				printk("%s: Device Configuration Status for drive %u\n",
+-				       DEVICE_NAME, drive_num);
+-
+-				printk("%s: Spares/cyls: %u", DEVICE_NAME, reply[0] >> 8);
+-
+-				printk
+-				    ("Config bits: %s%s%s%s%s\n",
+-				     (reply[0] & CONFIG_IS) ? "Invalid Secondary, " : "",
+-				     ((reply[0] & CONFIG_ZD) && !(reply[0] & CONFIG_IS))
+-				 ? "Zero Defect, " : "Defects Present, ",
+-				     (reply[0] & CONFIG_SF) ? "Skewed Format, " : "",
+-				     (reply[0] & CONFIG_FR) ? "Removable, " : "Non-Removable, ",
+-				     (reply[0] & CONFIG_RT) ? "No Retries" : "Retries");
+-
+-				rba = reply[1] | ((unsigned long) reply[2] << 16);
+-				printk("%s: Number of RBA's: %lu\n", DEVICE_NAME, rba);
+-
+-				printk("%s: Physical number of cylinders: %u, Sectors/Track: %u, Heads: %u\n",
+-				       DEVICE_NAME, reply[3], reply[4] >> 8, reply[4] & 0xff);
+-
+-				if (!ps2esdi_info[drive_num].head) {
+-					ps2esdi_info[drive_num].head = 64;
+-					ps2esdi_info[drive_num].sect = 32;
+-					ps2esdi_info[drive_num].cyl = rba / (64 * 32);
+-					ps2esdi_info[drive_num].wpcom = 0;
+-					ps2esdi_info[drive_num].lzone = ps2esdi_info[drive_num].cyl;
+-					ps2esdi_info[drive_num].ctl = 8;
+-					if (tp720esdi) {	/* store the retrieved parameters */
+-						ps2esdi_info[0].head = reply[4] & 0Xff;
+-						ps2esdi_info[0].sect = reply[4] >> 8;
+-						ps2esdi_info[0].cyl = reply[3];
+-						ps2esdi_info[0].wpcom = 0;
+-						ps2esdi_info[0].lzone = reply[3];
+-					} else {
+-						if (!intg_esdi)
+-							ps2esdi_drives++;
+-					}
+-				}
+-#ifdef OBSOLETE
+-				if (!ps2esdi_info[drive_num].head) {
+-					ps2esdi_info[drive_num].head = reply[4] & 0Xff;
+-					ps2esdi_info[drive_num].sect = reply[4] >> 8;
+-					ps2esdi_info[drive_num].cyl = reply[3];
+-					ps2esdi_info[drive_num].wpcom = 0;
+-					ps2esdi_info[drive_num].lzone = reply[3];
+-					if (tp720esdi) {	/* store the retrieved parameters */
+-						ps2esdi_info[0].head = reply[4] & 0Xff;
+-						ps2esdi_info[0].sect = reply[4] >> 8;
+-						ps2esdi_info[0].cyl = reply[3];
+-						ps2esdi_info[0].wpcom = 0;
+-						ps2esdi_info[0].lzone = reply[3];
+-					} else {
+-						ps2esdi_drives++;
+-					}
+-				}
+-#endif
+-
+-			} else
+-				printk("%s: failed while getting device config\n", DEVICE_NAME);
+-#undef REPLY_WORDS
+-		} else
+-			printk("%s: command %02X unknown by geometry handler\n",
+-			       DEVICE_NAME, status & 0x1f);
+-
+-		outb((int_ret_code & 0xe0) | ATT_EOI, ESDI_ATTN);
+-		break;
+-
+-	case INT_ATTN_ERROR:
+-		printk("%s: Attention error. interrupt status : %02X\n", DEVICE_NAME,
+-		       int_ret_code);
+-		printk("%s: Device not available\n", DEVICE_NAME);
+-		break;
+-	case INT_CMD_ECC:
+-	case INT_CMD_RETRY:
+-	case INT_CMD_ECC_RETRY:
+-	case INT_CMD_WARNING:
+-	case INT_CMD_ABORT:
+-	case INT_CMD_FAILED:
+-	case INT_DMA_ERR:
+-	case INT_CMD_BLK_ERR:
+-		/*BA */ printk("%s: Whaa. Error occurred...\n", DEVICE_NAME);
+-		dump_cmd_complete_status(int_ret_code);
+-		outb((int_ret_code & 0xe0) | ATT_EOI, ESDI_ATTN);
+-		break;
+-	default:
+-		printk("%s: Unknown interrupt reason: %02X\n",
+-		       DEVICE_NAME, int_ret_code & 0xf);
+-		outb((int_ret_code & 0xe0) | ATT_EOI, ESDI_ATTN);
+-		break;
+-	}
+-
+-	wake_up(&ps2esdi_int);
+-	no_int_yet = FALSE;
+-	outb(CTRL_ENABLE_INTR, ESDI_CONTROL);
+-
+-}
+-
+-static void ps2esdi_normal_interrupt_handler(u_int int_ret_code)
+-{
+-	unsigned long flags;
+-	u_int status;
+-	u_int ending;
+-	int i;
+-
+-	switch (int_ret_code & 0x0f) {
+-	case INT_TRANSFER_REQ:
+-		ps2esdi_prep_dma(current_req->buffer,
+-				 current_req->current_nr_sectors,
+-		    (rq_data_dir(current_req) == READ)
+-		    ? MCA_DMA_MODE_16 | MCA_DMA_MODE_WRITE | MCA_DMA_MODE_XFER
+-		    : MCA_DMA_MODE_16 | MCA_DMA_MODE_READ);
+-		outb(CTRL_ENABLE_DMA | CTRL_ENABLE_INTR, ESDI_CONTROL);
+-		ending = -1;
+-		break;
+-
+-	case INT_ATTN_ERROR:
+-		printk("%s: Attention error. interrupt status : %02X\n", DEVICE_NAME,
+-		       int_ret_code);
+-		outb(CTRL_ENABLE_INTR, ESDI_CONTROL);
+-		ending = FAIL;
+-		break;
+-
+-	case INT_CMD_COMPLETE:
+-		for (i = ESDI_TIMEOUT; i && !(inb(ESDI_STATUS) & STATUS_STAT_AVAIL); i--);
+-		if (!(inb(ESDI_STATUS) & STATUS_STAT_AVAIL)) {
+-			printk("%s: timeout reading status word\n", DEVICE_NAME);
+-			outb((int_ret_code & 0xe0) | ATT_EOI, ESDI_ATTN);
+-			outb(CTRL_ENABLE_INTR, ESDI_CONTROL);
+-			if ((++current_req->errors) >= MAX_RETRIES)
+-				ending = FAIL;
+-			else
+-				ending = -1;
+-			break;
+-		}
+-		status = inw(ESDI_STT_INT);
+-		switch (status & 0x1F) {
+-		case (CMD_READ & 0xff):
+-		case (CMD_WRITE & 0xff):
+-			LITE_OFF;
+-			outb((int_ret_code & 0xe0) | ATT_EOI, ESDI_ATTN);
+-			outb(CTRL_ENABLE_INTR, ESDI_CONTROL);
+-			ending = SUCCES;
+-			break;
+-		default:
+-			printk("%s: interrupt for unknown command %02X\n",
+-			       DEVICE_NAME, status & 0x1f);
+-			outb((int_ret_code & 0xe0) | ATT_EOI, ESDI_ATTN);
+-			outb(CTRL_ENABLE_INTR, ESDI_CONTROL);
+-			ending = -1;
+-			break;
+-		}
+-		break;
+-	case INT_CMD_ECC:
+-	case INT_CMD_RETRY:
+-	case INT_CMD_ECC_RETRY:
+-		LITE_OFF;
+-		dump_cmd_complete_status(int_ret_code);
+-		outb((int_ret_code & 0xe0) | ATT_EOI, ESDI_ATTN);
+-		outb(CTRL_ENABLE_INTR, ESDI_CONTROL);
+-		ending = SUCCES;
+-		break;
+-	case INT_CMD_WARNING:
+-	case INT_CMD_ABORT:
+-	case INT_CMD_FAILED:
+-	case INT_DMA_ERR:
+-		LITE_OFF;
+-		dump_cmd_complete_status(int_ret_code);
+-		outb((int_ret_code & 0xe0) | ATT_EOI, ESDI_ATTN);
+-		outb(CTRL_ENABLE_INTR, ESDI_CONTROL);
+-		if ((++current_req->errors) >= MAX_RETRIES)
+-			ending = FAIL;
+-		else
+-			ending = -1;
+-		break;
+-
+-	case INT_CMD_BLK_ERR:
+-		dump_cmd_complete_status(int_ret_code);
+-		outb((int_ret_code & 0xe0) | ATT_EOI, ESDI_ATTN);
+-		outb(CTRL_ENABLE_INTR, ESDI_CONTROL);
+-		ending = FAIL;
+-		break;
+-
+-	case INT_CMD_FORMAT:
+-		printk("%s: huh ? Who issued this format command ?\n"
+-		       ,DEVICE_NAME);
+-		outb((int_ret_code & 0xe0) | ATT_EOI, ESDI_ATTN);
+-		outb(CTRL_ENABLE_INTR, ESDI_CONTROL);
+-		ending = -1;
+-		break;
+-
+-	case INT_RESET:
+-		/* BA printk("%s: reset completed.\n", DEVICE_NAME) */ ;
+-		outb((int_ret_code & 0xe0) | ATT_EOI, ESDI_ATTN);
+-		outb(CTRL_ENABLE_INTR, ESDI_CONTROL);
+-		ending = -1;
+-		break;
+-
+-	default:
+-		printk("%s: Unknown interrupt reason: %02X\n",
+-		       DEVICE_NAME, int_ret_code & 0xf);
+-		outb((int_ret_code & 0xe0) | ATT_EOI, ESDI_ATTN);
+-		outb(CTRL_ENABLE_INTR, ESDI_CONTROL);
+-		ending = -1;
+-		break;
+-	}
+-	if(ending != -1) {
+-		spin_lock_irqsave(&ps2esdi_lock, flags);
+-		end_request(current_req, ending);
+-		current_req = NULL;
+-		do_ps2esdi_request(ps2esdi_queue);
+-		spin_unlock_irqrestore(&ps2esdi_lock, flags);
+-	}
+-}				/* handle interrupts */
+-
+-
+-
+-static int ps2esdi_read_status_words(int num_words,
+-				     int max_words,
+-				     u_short * buffer)
+-{
+-	int i;
+-
+-	for (; max_words && num_words; max_words--, num_words--, buffer++) {
+-		for (i = ESDI_TIMEOUT; i && !(inb(ESDI_STATUS) & STATUS_STAT_AVAIL); i--);
+-		if (!(inb(ESDI_STATUS) & STATUS_STAT_AVAIL)) {
+-			printk("%s: timeout reading status word\n", DEVICE_NAME);
+-			return FAIL;
+-		}
+-		*buffer = inw(ESDI_STT_INT);
+-	}
+-	return SUCCES;
+-}
+-
+-
+-
+-
+-static void dump_cmd_complete_status(u_int int_ret_code)
+-{
+-#define WAIT_FOR_STATUS \
+-  for(i=ESDI_TIMEOUT;i && !(inb(ESDI_STATUS) & STATUS_STAT_AVAIL);i--); \
+-    if(!(inb(ESDI_STATUS) & STATUS_STAT_AVAIL)) { \
+-    printk("%s: timeout reading status word\n",DEVICE_NAME); \
+-    return; \
+-    }
+-
+-	int i, word_count;
+-	u_short stat_word;
+-	u_long rba;
+-
+-	printk("%s: Device: %u, interrupt ID: %02X\n",
+-	       DEVICE_NAME, int_ret_code >> 5,
+-	       int_ret_code & 0xf);
+-
+-	WAIT_FOR_STATUS;
+-	stat_word = inw(ESDI_STT_INT);
+-	word_count = (stat_word >> 8) - 1;
+-	printk("%s: %u status words, command: %02X\n", DEVICE_NAME, word_count,
+-	       stat_word & 0xff);
+-
+-	if (word_count--) {
+-		WAIT_FOR_STATUS;
+-		stat_word = inw(ESDI_STT_INT);
+-		printk("%s: command status code: %02X, command error code: %02X\n",
+-		       DEVICE_NAME, stat_word >> 8, stat_word & 0xff);
+-	}
+-	if (word_count--) {
+-		WAIT_FOR_STATUS;
+-		stat_word = inw(ESDI_STT_INT);
+-		printk("%s: device error code: %s%s%s%s%s,%02X\n", DEVICE_NAME,
+-		       (stat_word & 0x1000) ? "Ready, " : "Not Ready, ",
+-		  (stat_word & 0x0800) ? "Selected, " : "Not Selected, ",
+-		       (stat_word & 0x0400) ? "Write Fault, " : "",
+-		       (stat_word & 0x0200) ? "Track 0, " : "",
+-		(stat_word & 0x0100) ? "Seek or command complete, " : "",
+-		       stat_word >> 8);
+-	}
+-	if (word_count--) {
+-		WAIT_FOR_STATUS;
+-		stat_word = inw(ESDI_STT_INT);
+-		printk("%s: Blocks to do: %u", DEVICE_NAME, stat_word);
+-	}
+-	if (word_count -= 2) {
+-		WAIT_FOR_STATUS;
+-		rba = inw(ESDI_STT_INT);
+-		WAIT_FOR_STATUS;
+-		rba |= inw(ESDI_STT_INT) << 16;
+-		printk(", Last Cyl: %u Head: %u Sector: %u\n",
+-		       (u_short) ((rba & 0x1ff80000) >> 11),
+-		 (u_short) ((rba & 0x7E0) >> 5), (u_short) (rba & 0x1f));
+-	} else
+-		printk("\n");
+-
+-	if (word_count--) {
+-		WAIT_FOR_STATUS;
+-		stat_word = inw(ESDI_STT_INT);
+-		printk("%s: Blocks required ECC: %u", DEVICE_NAME, stat_word);
+-	}
+-	printk("\n");
+-
+-#undef WAIT_FOR_STATUS
+-
+-}
+-
+-static int ps2esdi_getgeo(struct block_device *bdev, struct hd_geometry *geo)
+-{
+-	struct ps2esdi_i_struct *p = bdev->bd_disk->private_data;
+-
+-	geo->heads = p->head;
+-	geo->sectors = p->sect;
+-	geo->cylinders = p->cyl;
+-	return 0;
+-}
+-
+-static void ps2esdi_reset_timer(unsigned long unused)
+-{
+-
+-	int status;
+-
+-	status = inb(ESDI_INTRPT);
+-	if ((status & 0xf) == INT_RESET) {
+-		outb((status & 0xe0) | ATT_EOI, ESDI_ATTN);
+-		outb(CTRL_ENABLE_INTR, ESDI_CONTROL);
+-		reset_status = 1;
+-	}
+-	wake_up(&ps2esdi_int);
+-}
+diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c
+index 3b1a68d..0cfbe8c 100644
+--- a/drivers/block/virtio_blk.c
++++ b/drivers/block/virtio_blk.c
+@@ -238,6 +238,7 @@ static int virtblk_probe(struct virtio_device *vdev)
+ 	vblk->disk->first_minor = index_to_minor(index);
+ 	vblk->disk->private_data = vblk;
+ 	vblk->disk->fops = &virtblk_fops;
++	vblk->disk->driverfs_dev = &vdev->dev;
+ 	index++;
+ 
+ 	/* If barriers are supported, tell block layer that queue is ordered */
+diff --git a/drivers/char/drm/ati_pcigart.c b/drivers/char/drm/ati_pcigart.c
+index d352dbb..e5a0e97 100644
+--- a/drivers/char/drm/ati_pcigart.c
++++ b/drivers/char/drm/ati_pcigart.c
+@@ -35,42 +35,23 @@
+ 
+ # define ATI_PCIGART_PAGE_SIZE		4096	/**< PCI GART page size */
+ 
+-static void *drm_ati_alloc_pcigart_table(int order)
++static int drm_ati_alloc_pcigart_table(struct drm_device *dev,
++				       struct drm_ati_pcigart_info *gart_info)
+ {
+-	unsigned long address;
+-	struct page *page;
+-	int i;
+-
+-	DRM_DEBUG("%d order\n", order);
+-
+-	address = __get_free_pages(GFP_KERNEL | __GFP_COMP,
+-				   order);
+-	if (address == 0UL) {
+-		return NULL;
+-	}
+-
+-	page = virt_to_page(address);
++	gart_info->table_handle = drm_pci_alloc(dev, gart_info->table_size,
++						PAGE_SIZE,
++						gart_info->table_mask);
++	if (gart_info->table_handle == NULL)
++		return -ENOMEM;
+ 
+-	for (i = 0; i < order; i++, page++)
+-		SetPageReserved(page);
+-
+-	DRM_DEBUG("returning 0x%08lx\n", address);
+-	return (void *)address;
++	return 0;
+ }
+ 
+-static void drm_ati_free_pcigart_table(void *address, int order)
++static void drm_ati_free_pcigart_table(struct drm_device *dev,
++				       struct drm_ati_pcigart_info *gart_info)
+ {
+-	struct page *page;
+-	int i;
+-	int num_pages = 1 << order;
+-	DRM_DEBUG("\n");
+-
+-	page = virt_to_page((unsigned long)address);
+-
+-	for (i = 0; i < num_pages; i++, page++)
+-		ClearPageReserved(page);
+-
+-	free_pages((unsigned long)address, order);
++	drm_pci_free(dev, gart_info->table_handle);
++	gart_info->table_handle = NULL;
+ }
+ 
+ int drm_ati_pcigart_cleanup(struct drm_device *dev, struct drm_ati_pcigart_info *gart_info)
+@@ -78,8 +59,7 @@ int drm_ati_pcigart_cleanup(struct drm_device *dev, struct drm_ati_pcigart_info
+ 	struct drm_sg_mem *entry = dev->sg;
+ 	unsigned long pages;
+ 	int i;
+-	int order;
+-	int num_pages, max_pages;
++	int max_pages;
+ 
+ 	/* we need to support large memory configurations */
+ 	if (!entry) {
+@@ -87,15 +67,7 @@ int drm_ati_pcigart_cleanup(struct drm_device *dev, struct drm_ati_pcigart_info
+ 		return 0;
+ 	}
+ 
+-	order = drm_order((gart_info->table_size + (PAGE_SIZE-1)) / PAGE_SIZE);
+-	num_pages = 1 << order;
+-
+ 	if (gart_info->bus_addr) {
+-		if (gart_info->gart_table_location == DRM_ATI_GART_MAIN) {
+-			pci_unmap_single(dev->pdev, gart_info->bus_addr,
+-					 num_pages * PAGE_SIZE,
+-					 PCI_DMA_TODEVICE);
+-		}
+ 
+ 		max_pages = (gart_info->table_size / sizeof(u32));
+ 		pages = (entry->pages <= max_pages)
+@@ -112,10 +84,9 @@ int drm_ati_pcigart_cleanup(struct drm_device *dev, struct drm_ati_pcigart_info
+ 			gart_info->bus_addr = 0;
+ 	}
+ 
+-	if (gart_info->gart_table_location == DRM_ATI_GART_MAIN
+-	    && gart_info->addr) {
+-		drm_ati_free_pcigart_table(gart_info->addr, order);
+-		gart_info->addr = NULL;
++	if (gart_info->gart_table_location == DRM_ATI_GART_MAIN &&
++	    gart_info->table_handle) {
++		drm_ati_free_pcigart_table(dev, gart_info);
+ 	}
+ 
+ 	return 1;
+@@ -127,11 +98,10 @@ int drm_ati_pcigart_init(struct drm_device *dev, struct drm_ati_pcigart_info *ga
+ 	struct drm_sg_mem *entry = dev->sg;
+ 	void *address = NULL;
+ 	unsigned long pages;
+-	u32 *pci_gart, page_base, bus_address = 0;
++	u32 *pci_gart, page_base;
++	dma_addr_t bus_address = 0;
+ 	int i, j, ret = 0;
+-	int order;
+ 	int max_pages;
+-	int num_pages;
+ 
+ 	if (!entry) {
+ 		DRM_ERROR("no scatter/gather memory!\n");
+@@ -141,31 +111,14 @@ int drm_ati_pcigart_init(struct drm_device *dev, struct drm_ati_pcigart_info *ga
+ 	if (gart_info->gart_table_location == DRM_ATI_GART_MAIN) {
+ 		DRM_DEBUG("PCI: no table in VRAM: using normal RAM\n");
+ 
+-		order = drm_order((gart_info->table_size +
+-				   (PAGE_SIZE-1)) / PAGE_SIZE);
+-		num_pages = 1 << order;
+-		address = drm_ati_alloc_pcigart_table(order);
+-		if (!address) {
++		ret = drm_ati_alloc_pcigart_table(dev, gart_info);
++		if (ret) {
+ 			DRM_ERROR("cannot allocate PCI GART page!\n");
+ 			goto done;
+ 		}
+ 
+-		if (!dev->pdev) {
+-			DRM_ERROR("PCI device unknown!\n");
+-			goto done;
+-		}
+-
+-		bus_address = pci_map_single(dev->pdev, address,
+-					     num_pages * PAGE_SIZE,
+-					     PCI_DMA_TODEVICE);
+-		if (bus_address == 0) {
+-			DRM_ERROR("unable to map PCIGART pages!\n");
+-			order = drm_order((gart_info->table_size +
+-					   (PAGE_SIZE-1)) / PAGE_SIZE);
+-			drm_ati_free_pcigart_table(address, order);
+-			address = NULL;
+-			goto done;
+-		}
++		address = gart_info->table_handle->vaddr;
++		bus_address = gart_info->table_handle->busaddr;
+ 	} else {
+ 		address = gart_info->addr;
+ 		bus_address = gart_info->bus_addr;
+diff --git a/drivers/char/drm/drmP.h b/drivers/char/drm/drmP.h
+index a6789f2..8ea9dd1 100644
+--- a/drivers/char/drm/drmP.h
++++ b/drivers/char/drm/drmP.h
+@@ -54,6 +54,7 @@
+ #include <linux/pci.h>
+ #include <linux/jiffies.h>
+ #include <linux/smp_lock.h>	/* For (un)lock_kernel */
++#include <linux/dma-mapping.h>
+ #include <linux/mm.h>
+ #include <linux/cdev.h>
+ #include <linux/mutex.h>
+@@ -551,6 +552,8 @@ struct drm_ati_pcigart_info {
+ 	int gart_reg_if;
+ 	void *addr;
+ 	dma_addr_t bus_addr;
++	dma_addr_t table_mask;
++	struct drm_dma_handle *table_handle;
+ 	drm_local_map_t mapping;
+ 	int table_size;
+ };
+diff --git a/drivers/char/drm/drm_fops.c b/drivers/char/drm/drm_fops.c
+index 3992f73..f09d4b5 100644
+--- a/drivers/char/drm/drm_fops.c
++++ b/drivers/char/drm/drm_fops.c
+@@ -326,6 +326,7 @@ int drm_release(struct inode *inode, struct file *filp)
+ 	struct drm_file *file_priv = filp->private_data;
+ 	struct drm_device *dev = file_priv->head->dev;
+ 	int retcode = 0;
++	unsigned long irqflags;
+ 
+ 	lock_kernel();
+ 
+@@ -357,9 +358,11 @@ int drm_release(struct inode *inode, struct file *filp)
+ 			 */
+ 
+ 			do{
+-				spin_lock(&dev->lock.spinlock);
++				spin_lock_irqsave(&dev->lock.spinlock,
++						  irqflags);
+ 				locked = dev->lock.idle_has_lock;
+-				spin_unlock(&dev->lock.spinlock);
++				spin_unlock_irqrestore(&dev->lock.spinlock,
++						       irqflags);
+ 				if (locked)
+ 					break;
+ 				schedule();
+diff --git a/drivers/char/drm/drm_lock.c b/drivers/char/drm/drm_lock.c
+index bea2a7d..12dcdd1 100644
+--- a/drivers/char/drm/drm_lock.c
++++ b/drivers/char/drm/drm_lock.c
+@@ -53,6 +53,7 @@ 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;
+ 
+@@ -71,9 +72,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(&dev->lock.spinlock);
++	spin_lock_irqsave(&dev->lock.spinlock, irqflags);
+ 	dev->lock.user_waiters++;
+-	spin_unlock(&dev->lock.spinlock);
++	spin_unlock_irqrestore(&dev->lock.spinlock, irqflags);
+ 	for (;;) {
+ 		__set_current_state(TASK_INTERRUPTIBLE);
+ 		if (!dev->lock.hw_lock) {
+@@ -95,9 +96,9 @@ int drm_lock(struct drm_device *dev, void *data, struct drm_file *file_priv)
+ 			break;
+ 		}
+ 	}
+-	spin_lock(&dev->lock.spinlock);
++	spin_lock_irqsave(&dev->lock.spinlock, irqflags);
+ 	dev->lock.user_waiters--;
+-	spin_unlock(&dev->lock.spinlock);
++	spin_unlock_irqrestore(&dev->lock.spinlock, irqflags);
+ 	__set_current_state(TASK_RUNNING);
+ 	remove_wait_queue(&dev->lock.lock_queue, &entry);
+ 
+@@ -198,8 +199,9 @@ 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(&lock_data->spinlock);
++	spin_lock_irqsave(&lock_data->spinlock, irqflags);
+ 	do {
+ 		old = *lock;
+ 		if (old & _DRM_LOCK_HELD)
+@@ -211,7 +213,7 @@ int drm_lock_take(struct drm_lock_data *lock_data,
+ 		}
+ 		prev = cmpxchg(lock, old, new);
+ 	} while (prev != old);
+-	spin_unlock(&lock_data->spinlock);
++	spin_unlock_irqrestore(&lock_data->spinlock, irqflags);
+ 
+ 	if (_DRM_LOCKING_CONTEXT(old) == context) {
+ 		if (old & _DRM_LOCK_HELD) {
+@@ -272,15 +274,16 @@ 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(&lock_data->spinlock);
++	spin_lock_irqsave(&lock_data->spinlock, irqflags);
+ 	if (lock_data->kernel_waiters != 0) {
+ 		drm_lock_transfer(lock_data, 0);
+ 		lock_data->idle_has_lock = 1;
+-		spin_unlock(&lock_data->spinlock);
++		spin_unlock_irqrestore(&lock_data->spinlock, irqflags);
+ 		return 1;
+ 	}
+-	spin_unlock(&lock_data->spinlock);
++	spin_unlock_irqrestore(&lock_data->spinlock, irqflags);
+ 
+ 	do {
+ 		old = *lock;
+@@ -344,19 +347,20 @@ static int drm_notifier(void *priv)
+ void drm_idlelock_take(struct drm_lock_data *lock_data)
+ {
+ 	int ret = 0;
++	unsigned long irqflags;
+ 
+-	spin_lock(&lock_data->spinlock);
++	spin_lock_irqsave(&lock_data->spinlock, irqflags);
+ 	lock_data->kernel_waiters++;
+ 	if (!lock_data->idle_has_lock) {
+ 
+-		spin_unlock(&lock_data->spinlock);
++		spin_unlock_irqrestore(&lock_data->spinlock, irqflags);
+ 		ret = drm_lock_take(lock_data, DRM_KERNEL_CONTEXT);
+-		spin_lock(&lock_data->spinlock);
++		spin_lock_irqsave(&lock_data->spinlock, irqflags);
+ 
+ 		if (ret == 1)
+ 			lock_data->idle_has_lock = 1;
+ 	}
+-	spin_unlock(&lock_data->spinlock);
++	spin_unlock_irqrestore(&lock_data->spinlock, irqflags);
+ }
+ EXPORT_SYMBOL(drm_idlelock_take);
+ 
+@@ -364,8 +368,9 @@ 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(&lock_data->spinlock);
++	spin_lock_irqsave(&lock_data->spinlock, irqflags);
+ 	if (--lock_data->kernel_waiters == 0) {
+ 		if (lock_data->idle_has_lock) {
+ 			do {
+@@ -376,7 +381,7 @@ void drm_idlelock_release(struct drm_lock_data *lock_data)
+ 			lock_data->idle_has_lock = 0;
+ 		}
+ 	}
+-	spin_unlock(&lock_data->spinlock);
++	spin_unlock_irqrestore(&lock_data->spinlock, irqflags);
+ }
+ EXPORT_SYMBOL(drm_idlelock_release);
+ 
+diff --git a/drivers/char/drm/drm_pciids.h b/drivers/char/drm/drm_pciids.h
+index 715b361..a6a499f 100644
+--- a/drivers/char/drm/drm_pciids.h
++++ b/drivers/char/drm/drm_pciids.h
+@@ -205,9 +205,9 @@
+ 	{0x1002, 0x71D6, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV530|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
+ 	{0x1002, 0x71DA, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV530|RADEON_NEW_MEMMAP}, \
+ 	{0x1002, 0x71DE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV530|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
+-	{0x1002, 0x7200, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV530|RADEON_NEW_MEMMAP}, \
+-	{0x1002, 0x7210, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV530|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
+-	{0x1002, 0x7211, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV530|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
++	{0x1002, 0x7200, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV515|RADEON_NEW_MEMMAP}, \
++	{0x1002, 0x7210, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV515|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
++	{0x1002, 0x7211, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV515|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
+ 	{0x1002, 0x7240, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R580|RADEON_NEW_MEMMAP}, \
+ 	{0x1002, 0x7243, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R580|RADEON_NEW_MEMMAP}, \
+ 	{0x1002, 0x7244, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R580|RADEON_NEW_MEMMAP}, \
+@@ -238,6 +238,7 @@
+ 	{0x1002, 0x7834, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS300|RADEON_IS_IGP|RADEON_NEW_MEMMAP}, \
+ 	{0x1002, 0x7835, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS300|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
+ 	{0x1002, 0x791e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS690|RADEON_IS_IGP|RADEON_NEW_MEMMAP|RADEON_IS_IGPGART}, \
++	{0x1002, 0x791f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS690|RADEON_IS_IGP|RADEON_NEW_MEMMAP|RADEON_IS_IGPGART}, \
+ 	{0, 0, 0}
+ 
+ #define r128_PCI_IDS \
+diff --git a/drivers/char/drm/r128_cce.c b/drivers/char/drm/r128_cce.c
+index 892e0a5..f36adbd 100644
+--- a/drivers/char/drm/r128_cce.c
++++ b/drivers/char/drm/r128_cce.c
+@@ -558,6 +558,7 @@ static int r128_do_init_cce(struct drm_device * dev, drm_r128_init_t * init)
+ #if __OS_HAS_AGP
+ 	if (dev_priv->is_pci) {
+ #endif
++		dev_priv->gart_info.table_mask = DMA_BIT_MASK(32);
+ 		dev_priv->gart_info.gart_table_location = DRM_ATI_GART_MAIN;
+ 		dev_priv->gart_info.table_size = R128_PCIGART_TABLE_SIZE;
+ 		dev_priv->gart_info.addr = NULL;
+diff --git a/drivers/char/drm/radeon_cp.c b/drivers/char/drm/radeon_cp.c
+index 833abc7..9072e4a 100644
+--- a/drivers/char/drm/radeon_cp.c
++++ b/drivers/char/drm/radeon_cp.c
+@@ -1807,6 +1807,7 @@ static int radeon_do_init_cp(struct drm_device * dev, drm_radeon_init_t * init)
+ 	} else
+ #endif
+ 	{
++		dev_priv->gart_info.table_mask = DMA_BIT_MASK(32);
+ 		/* if we have an offset set from userspace */
+ 		if (dev_priv->pcigart_offset_set) {
+ 			dev_priv->gart_info.bus_addr =
+diff --git a/drivers/char/drm/via_dma.c b/drivers/char/drm/via_dma.c
+index 94baec6..7a339db 100644
+--- a/drivers/char/drm/via_dma.c
++++ b/drivers/char/drm/via_dma.c
+@@ -126,6 +126,8 @@ via_cmdbuf_wait(drm_via_private_t * dev_priv, unsigned int size)
+ 			     hw_addr, cur_addr, next_addr);
+ 			return -1;
+ 		}
++		if  ((cur_addr < hw_addr) && (next_addr >= hw_addr))
++			msleep(1);
+ 	} while ((cur_addr < hw_addr) && (next_addr >= hw_addr));
+ 	return 0;
+ }
+@@ -416,27 +418,50 @@ static int via_hook_segment(drm_via_private_t * dev_priv,
+ 	int paused, count;
+ 	volatile uint32_t *paused_at = dev_priv->last_pause_ptr;
+ 	uint32_t reader,ptr;
++	uint32_t diff;
+ 
+ 	paused = 0;
+ 	via_flush_write_combine();
+ 	(void) *(volatile uint32_t *)(via_get_dma(dev_priv) -1);
++
+ 	*paused_at = pause_addr_lo;
+ 	via_flush_write_combine();
+ 	(void) *paused_at;
++
+ 	reader = *(dev_priv->hw_addr_ptr);
+ 	ptr = ((volatile char *)paused_at - dev_priv->dma_ptr) +
+ 		dev_priv->dma_offset + (uint32_t) dev_priv->agpAddr + 4;
++
+ 	dev_priv->last_pause_ptr = via_get_dma(dev_priv) - 1;
+ 
+-	if ((ptr - reader) <= dev_priv->dma_diff ) {
+-		count = 10000000;
+-		while (!(paused = (VIA_READ(0x41c) & 0x80000000)) && count--);
++	/*
++	 * If there is a possibility that the command reader will 
++	 * miss the new pause address and pause on the old one,
++	 * In that case we need to program the new start address
++	 * using PCI.
++	 */
++
++	diff = (uint32_t) (ptr - reader) - dev_priv->dma_diff;
++	count = 10000000;
++	while(diff == 0 && count--) {
++		paused = (VIA_READ(0x41c) & 0x80000000);
++		if (paused) 
++			break;
++		reader = *(dev_priv->hw_addr_ptr);
++		diff = (uint32_t) (ptr - reader) - dev_priv->dma_diff;
+ 	}
+ 
++	paused = VIA_READ(0x41c) & 0x80000000;
++
+ 	if (paused && !no_pci_fire) {
+ 		reader = *(dev_priv->hw_addr_ptr);
+-		if ((ptr - reader) == dev_priv->dma_diff) {
+-
++		diff = (uint32_t) (ptr - reader) - dev_priv->dma_diff;
++		diff &= (dev_priv->dma_high - 1);
++		if (diff != 0 && diff < (dev_priv->dma_high >> 1)) {
++			DRM_ERROR("Paused at incorrect address. "
++				  "0x%08x, 0x%08x 0x%08x\n",
++				  ptr, reader, dev_priv->dma_diff);
++		} else if (diff == 0) {
+ 			/*
+ 			 * There is a concern that these writes may stall the PCI bus
+ 			 * if the GPU is not idle. However, idling the GPU first
+@@ -577,6 +602,7 @@ static void via_cmdbuf_jump(drm_via_private_t * dev_priv)
+ 	uint32_t pause_addr_lo, pause_addr_hi;
+ 	uint32_t jump_addr_lo, jump_addr_hi;
+ 	volatile uint32_t *last_pause_ptr;
++	uint32_t dma_low_save1, dma_low_save2;
+ 
+ 	agp_base = dev_priv->dma_offset + (uint32_t) dev_priv->agpAddr;
+ 	via_align_cmd(dev_priv, HC_HAGPBpID_JUMP, 0, &jump_addr_hi,
+@@ -603,8 +629,29 @@ static void via_cmdbuf_jump(drm_via_private_t * dev_priv)
+ 		      &pause_addr_lo, 0);
+ 
+ 	*last_pause_ptr = pause_addr_lo;
++	dma_low_save1 = dev_priv->dma_low;
+ 
+-	via_hook_segment( dev_priv, jump_addr_hi, jump_addr_lo, 0);
++	/*
++	 * Now, set a trap that will pause the regulator if it tries to rerun the old
++	 * command buffer. (Which may happen if via_hook_segment detecs a command regulator pause
++	 * and reissues the jump command over PCI, while the regulator has already taken the jump
++	 * and actually paused at the current buffer end).
++	 * There appears to be no other way to detect this condition, since the hw_addr_pointer
++	 * does not seem to get updated immediately when a jump occurs.
++	 */
++
++	last_pause_ptr =
++		via_align_cmd(dev_priv, HC_HAGPBpID_PAUSE, 0, &pause_addr_hi,
++			      &pause_addr_lo, 0) - 1;
++	via_align_cmd(dev_priv, HC_HAGPBpID_PAUSE, 0, &pause_addr_hi,
++		      &pause_addr_lo, 0);
++	*last_pause_ptr = pause_addr_lo;
++
++	dma_low_save2 = dev_priv->dma_low;
++	dev_priv->dma_low = dma_low_save1;
++	via_hook_segment(dev_priv, jump_addr_hi, jump_addr_lo, 0);
++	dev_priv->dma_low = dma_low_save2;
++	via_hook_segment(dev_priv, pause_addr_hi, pause_addr_lo, 0);
+ }
+ 
+ 
+diff --git a/drivers/char/drm/via_dmablit.c b/drivers/char/drm/via_dmablit.c
+index 33c5197..409e00a 100644
+--- a/drivers/char/drm/via_dmablit.c
++++ b/drivers/char/drm/via_dmablit.c
+@@ -603,7 +603,7 @@ via_build_sg_info(struct drm_device *dev, drm_via_sg_info_t *vsg, drm_via_dmabli
+ 	 * (Not a big limitation anyway.)
+ 	 */
+ 
+-	if ((xfer->mem_stride - xfer->line_length) >= PAGE_SIZE) {
++	if ((xfer->mem_stride - xfer->line_length) > 2*PAGE_SIZE) {
+ 		DRM_ERROR("Too large system memory stride. Stride: %d, "
+ 			  "Length: %d\n", xfer->mem_stride, xfer->line_length);
+ 		return -EINVAL;
+diff --git a/drivers/char/rocket.c b/drivers/char/rocket.c
+index 72f2892..f585bc8 100644
+--- a/drivers/char/rocket.c
++++ b/drivers/char/rocket.c
+@@ -83,6 +83,7 @@
+ #include <linux/pci.h>
+ #include <asm/uaccess.h>
+ #include <asm/atomic.h>
++#include <asm/unaligned.h>
+ #include <linux/bitops.h>
+ #include <linux/spinlock.h>
+ #include <linux/init.h>
+@@ -1312,7 +1313,7 @@ static int rp_tiocmset(struct tty_struct *tty, struct file *file,
+ 	if (clear & TIOCM_DTR)
+ 		info->channel.TxControl[3] &= ~SET_DTR;
+ 
+-	sOutDW(info->channel.IndexAddr, *(DWord_t *) & (info->channel.TxControl[0]));
++	out32(info->channel.IndexAddr, info->channel.TxControl);
+ 	return 0;
+ }
+ 
+@@ -1748,7 +1749,7 @@ static int rp_write(struct tty_struct *tty,
+ 
+ 	/*  Write remaining data into the port's xmit_buf */
+ 	while (1) {
+-		if (info->tty == 0)	/*   Seemingly obligatory check... */
++		if (!info->tty)	/*   Seemingly obligatory check... */
+ 			goto end;
+ 
+ 		c = min(count, min(XMIT_BUF_SIZE - info->xmit_cnt - 1, XMIT_BUF_SIZE - info->xmit_head));
+@@ -2798,7 +2799,7 @@ static int sReadAiopNumChan(WordIO_t io)
+ 	static Byte_t R[4] = { 0x00, 0x00, 0x34, 0x12 };
+ 
+ 	/* write to chan 0 SRAM */
+-	sOutDW((DWordIO_t) io + _INDX_ADDR, *((DWord_t *) & R[0]));
++	out32((DWordIO_t) io + _INDX_ADDR, R);
+ 	sOutW(io + _INDX_ADDR, 0);	/* read from SRAM, chan 0 */
+ 	x = sInW(io + _INDX_DATA);
+ 	sOutW(io + _INDX_ADDR, 0x4000);	/* read from SRAM, chan 4 */
+@@ -2864,7 +2865,7 @@ static int sInitChan(CONTROLLER_T * CtlP, CHANNEL_T * ChP, int AiopNum,
+ 		R[1] = RData[i + 1] + 0x10 * ChanNum;
+ 		R[2] = RData[i + 2];
+ 		R[3] = RData[i + 3];
+-		sOutDW(ChP->IndexAddr, *((DWord_t *) & R[0]));
++		out32(ChP->IndexAddr, R);
+ 	}
+ 
+ 	ChR = ChP->R;
+@@ -2887,43 +2888,43 @@ static int sInitChan(CONTROLLER_T * CtlP, CHANNEL_T * ChP, int AiopNum,
+ 	ChP->BaudDiv[1] = (Byte_t) ((ChOff + _BAUD) >> 8);
+ 	ChP->BaudDiv[2] = (Byte_t) brd9600;
+ 	ChP->BaudDiv[3] = (Byte_t) (brd9600 >> 8);
+-	sOutDW(ChP->IndexAddr, *(DWord_t *) & ChP->BaudDiv[0]);
++	out32(ChP->IndexAddr, ChP->BaudDiv);
+ 
+ 	ChP->TxControl[0] = (Byte_t) (ChOff + _TX_CTRL);
+ 	ChP->TxControl[1] = (Byte_t) ((ChOff + _TX_CTRL) >> 8);
+ 	ChP->TxControl[2] = 0;
+ 	ChP->TxControl[3] = 0;
+-	sOutDW(ChP->IndexAddr, *(DWord_t *) & ChP->TxControl[0]);
++	out32(ChP->IndexAddr, ChP->TxControl);
+ 
+ 	ChP->RxControl[0] = (Byte_t) (ChOff + _RX_CTRL);
+ 	ChP->RxControl[1] = (Byte_t) ((ChOff + _RX_CTRL) >> 8);
+ 	ChP->RxControl[2] = 0;
+ 	ChP->RxControl[3] = 0;
+-	sOutDW(ChP->IndexAddr, *(DWord_t *) & ChP->RxControl[0]);
++	out32(ChP->IndexAddr, ChP->RxControl);
+ 
+ 	ChP->TxEnables[0] = (Byte_t) (ChOff + _TX_ENBLS);
+ 	ChP->TxEnables[1] = (Byte_t) ((ChOff + _TX_ENBLS) >> 8);
+ 	ChP->TxEnables[2] = 0;
+ 	ChP->TxEnables[3] = 0;
+-	sOutDW(ChP->IndexAddr, *(DWord_t *) & ChP->TxEnables[0]);
++	out32(ChP->IndexAddr, ChP->TxEnables);
+ 
+ 	ChP->TxCompare[0] = (Byte_t) (ChOff + _TXCMP1);
+ 	ChP->TxCompare[1] = (Byte_t) ((ChOff + _TXCMP1) >> 8);
+ 	ChP->TxCompare[2] = 0;
+ 	ChP->TxCompare[3] = 0;
+-	sOutDW(ChP->IndexAddr, *(DWord_t *) & ChP->TxCompare[0]);
++	out32(ChP->IndexAddr, ChP->TxCompare);
+ 
+ 	ChP->TxReplace1[0] = (Byte_t) (ChOff + _TXREP1B1);
+ 	ChP->TxReplace1[1] = (Byte_t) ((ChOff + _TXREP1B1) >> 8);
+ 	ChP->TxReplace1[2] = 0;
+ 	ChP->TxReplace1[3] = 0;
+-	sOutDW(ChP->IndexAddr, *(DWord_t *) & ChP->TxReplace1[0]);
++	out32(ChP->IndexAddr, ChP->TxReplace1);
+ 
+ 	ChP->TxReplace2[0] = (Byte_t) (ChOff + _TXREP2);
+ 	ChP->TxReplace2[1] = (Byte_t) ((ChOff + _TXREP2) >> 8);
+ 	ChP->TxReplace2[2] = 0;
+ 	ChP->TxReplace2[3] = 0;
+-	sOutDW(ChP->IndexAddr, *(DWord_t *) & ChP->TxReplace2[0]);
++	out32(ChP->IndexAddr, ChP->TxReplace2);
+ 
+ 	ChP->TxFIFOPtrs = ChOff + _TXF_OUTP;
+ 	ChP->TxFIFO = ChOff + _TX_FIFO;
+@@ -2979,7 +2980,7 @@ static void sStopRxProcessor(CHANNEL_T * ChP)
+ 	R[1] = ChP->R[1];
+ 	R[2] = 0x0a;
+ 	R[3] = ChP->R[3];
+-	sOutDW(ChP->IndexAddr, *(DWord_t *) & R[0]);
++	out32(ChP->IndexAddr, R);
+ }
+ 
+ /***************************************************************************
+@@ -3094,13 +3095,13 @@ static int sWriteTxPrioByte(CHANNEL_T * ChP, Byte_t Data)
+ 		*WordPtr = ChP->TxPrioBuf;	/* data byte address */
+ 
+ 		DWBuf[2] = Data;	/* data byte value */
+-		sOutDW(IndexAddr, *((DWord_t *) (&DWBuf[0])));	/* write it out */
++		out32(IndexAddr, DWBuf);	/* write it out */
+ 
+ 		*WordPtr = ChP->TxPrioCnt;	/* Tx priority count address */
+ 
+ 		DWBuf[2] = PRI_PEND + 1;	/* indicate 1 byte pending */
+ 		DWBuf[3] = 0;	/* priority buffer pointer */
+-		sOutDW(IndexAddr, *((DWord_t *) (&DWBuf[0])));	/* write it out */
++		out32(IndexAddr, DWBuf);	/* write it out */
+ 	} else {		/* write it to Tx FIFO */
+ 
+ 		sWriteTxByte(sGetTxRxDataIO(ChP), Data);
+@@ -3147,11 +3148,11 @@ static void sEnInterrupts(CHANNEL_T * ChP, Word_t Flags)
+ 	ChP->RxControl[2] |=
+ 	    ((Byte_t) Flags & (RXINT_EN | SRCINT_EN | MCINT_EN));
+ 
+-	sOutDW(ChP->IndexAddr, *(DWord_t *) & ChP->RxControl[0]);
++	out32(ChP->IndexAddr, ChP->RxControl);
+ 
+ 	ChP->TxControl[2] |= ((Byte_t) Flags & TXINT_EN);
+ 
+-	sOutDW(ChP->IndexAddr, *(DWord_t *) & ChP->TxControl[0]);
++	out32(ChP->IndexAddr, ChP->TxControl);
+ 
+ 	if (Flags & CHANINT_EN) {
+ 		Mask = sInB(ChP->IntMask) | sBitMapSetTbl[ChP->ChanNum];
+@@ -3190,9 +3191,9 @@ static void sDisInterrupts(CHANNEL_T * ChP, Word_t Flags)
+ 
+ 	ChP->RxControl[2] &=
+ 	    ~((Byte_t) Flags & (RXINT_EN | SRCINT_EN | MCINT_EN));
+-	sOutDW(ChP->IndexAddr, *(DWord_t *) & ChP->RxControl[0]);
++	out32(ChP->IndexAddr, ChP->RxControl);
+ 	ChP->TxControl[2] &= ~((Byte_t) Flags & TXINT_EN);
+-	sOutDW(ChP->IndexAddr, *(DWord_t *) & ChP->TxControl[0]);
++	out32(ChP->IndexAddr, ChP->TxControl);
+ 
+ 	if (Flags & CHANINT_EN) {
+ 		Mask = sInB(ChP->IntMask) & sBitMapClrTbl[ChP->ChanNum];
+diff --git a/drivers/char/rocket_int.h b/drivers/char/rocket_int.h
+index f3a7579..b01d381 100644
+--- a/drivers/char/rocket_int.h
++++ b/drivers/char/rocket_int.h
+@@ -26,7 +26,6 @@ typedef unsigned int ByteIO_t;
+ typedef unsigned int Word_t;
+ typedef unsigned int WordIO_t;
+ 
+-typedef unsigned long DWord_t;
+ typedef unsigned int DWordIO_t;
+ 
+ /*
+@@ -38,7 +37,6 @@ typedef unsigned int DWordIO_t;
+  * instruction.
+  */
+ 
+-#ifdef ROCKET_DEBUG_IO
+ static inline void sOutB(unsigned short port, unsigned char value)
+ {
+ #ifdef ROCKET_DEBUG_IO
+@@ -55,12 +53,13 @@ static inline void sOutW(unsigned short port, unsigned short value)
+ 	outw_p(value, port);
+ }
+ 
+-static inline void sOutDW(unsigned short port, unsigned long value)
++static inline void out32(unsigned short port, Byte_t *p)
+ {
++	u32 value = le32_to_cpu(get_unaligned((__le32 *)p));
+ #ifdef ROCKET_DEBUG_IO
+-	printk(KERN_DEBUG "sOutDW(%x, %lx)...\n", port, value);
++	printk(KERN_DEBUG "out32(%x, %lx)...\n", port, value);
+ #endif
+-	outl_p(cpu_to_le32(value), port);
++	outl_p(value, port);
+ }
+ 
+ static inline unsigned char sInB(unsigned short port)
+@@ -73,14 +72,6 @@ static inline unsigned short sInW(unsigned short port)
+ 	return inw_p(port);
+ }
+ 
+-#else				/* !ROCKET_DEBUG_IO */
+-#define sOutB(a, b) outb_p(b, a)
+-#define sOutW(a, b) outw_p(b, a)
+-#define sOutDW(port, value) outl_p(cpu_to_le32(value), port)
+-#define sInB(a) (inb_p(a))
+-#define sInW(a) (inw_p(a))
+-#endif				/* ROCKET_DEBUG_IO */
+-
+ /* This is used to move arrays of bytes so byte swapping isn't appropriate. */
+ #define sOutStrW(port, addr, count) if (count) outsw(port, addr, count)
+ #define sInStrW(port, addr, count) if (count) insw(port, addr, count)
+@@ -390,7 +381,7 @@ Call:     sClrBreak(ChP)
+ #define sClrBreak(ChP) \
+ do { \
+    (ChP)->TxControl[3] &= ~SETBREAK; \
+-   sOutDW((ChP)->IndexAddr,*(DWord_t *)&(ChP)->TxControl[0]); \
++   out32((ChP)->IndexAddr,(ChP)->TxControl); \
+ } while (0)
+ 
+ /***************************************************************************
+@@ -402,7 +393,7 @@ Call:     sClrDTR(ChP)
+ #define sClrDTR(ChP) \
+ do { \
+    (ChP)->TxControl[3] &= ~SET_DTR; \
+-   sOutDW((ChP)->IndexAddr,*(DWord_t *)&(ChP)->TxControl[0]); \
++   out32((ChP)->IndexAddr,(ChP)->TxControl); \
+ } while (0)
+ 
+ /***************************************************************************
+@@ -415,7 +406,7 @@ Call:     sClrRTS(ChP)
+ do { \
+    if ((ChP)->rtsToggle) break; \
+    (ChP)->TxControl[3] &= ~SET_RTS; \
+-   sOutDW((ChP)->IndexAddr,*(DWord_t *)&(ChP)->TxControl[0]); \
++   out32((ChP)->IndexAddr,(ChP)->TxControl); \
+ } while (0)
+ 
+ /***************************************************************************
+@@ -489,7 +480,7 @@ Call:     sDisCTSFlowCtl(ChP)
+ #define sDisCTSFlowCtl(ChP) \
+ do { \
+    (ChP)->TxControl[2] &= ~CTSFC_EN; \
+-   sOutDW((ChP)->IndexAddr,*(DWord_t *)&(ChP)->TxControl[0]); \
++   out32((ChP)->IndexAddr,(ChP)->TxControl); \
+ } while (0)
+ 
+ /***************************************************************************
+@@ -501,7 +492,7 @@ Call:     sDisIXANY(ChP)
+ #define sDisIXANY(ChP) \
+ do { \
+    (ChP)->R[0x0e] = 0x86; \
+-   sOutDW((ChP)->IndexAddr,*(DWord_t *)&(ChP)->R[0x0c]); \
++   out32((ChP)->IndexAddr,&(ChP)->R[0x0c]); \
+ } while (0)
+ 
+ /***************************************************************************
+@@ -515,7 +506,7 @@ Comments: Function sSetParity() can be used in place of functions sEnParity(),
+ #define sDisParity(ChP) \
+ do { \
+    (ChP)->TxControl[2] &= ~PARITY_EN; \
+-   sOutDW((ChP)->IndexAddr,*(DWord_t *)&(ChP)->TxControl[0]); \
++   out32((ChP)->IndexAddr,(ChP)->TxControl); \
+ } while (0)
+ 
+ /***************************************************************************
+@@ -527,7 +518,7 @@ Call:     sDisRTSToggle(ChP)
+ #define sDisRTSToggle(ChP) \
+ do { \
+    (ChP)->TxControl[2] &= ~RTSTOG_EN; \
+-   sOutDW((ChP)->IndexAddr,*(DWord_t *)&(ChP)->TxControl[0]); \
++   out32((ChP)->IndexAddr,(ChP)->TxControl); \
+    (ChP)->rtsToggle = 0; \
+ } while (0)
+ 
+@@ -540,7 +531,7 @@ Call:     sDisRxFIFO(ChP)
+ #define sDisRxFIFO(ChP) \
+ do { \
+    (ChP)->R[0x32] = 0x0a; \
+-   sOutDW((ChP)->IndexAddr,*(DWord_t *)&(ChP)->R[0x30]); \
++   out32((ChP)->IndexAddr,&(ChP)->R[0x30]); \
+ } while (0)
+ 
+ /***************************************************************************
+@@ -567,7 +558,7 @@ Call:     sDisTransmit(ChP)
+ #define sDisTransmit(ChP) \
+ do { \
+    (ChP)->TxControl[3] &= ~TX_ENABLE; \
+-   sOutDW((ChP)->IndexAddr,*(DWord_t *)&(ChP)->TxControl[0]); \
++   out32((ChP)->IndexAddr,(ChP)->TxControl); \
+ } while (0)
+ 
+ /***************************************************************************
+@@ -579,7 +570,7 @@ Call:     sDisTxSoftFlowCtl(ChP)
+ #define sDisTxSoftFlowCtl(ChP) \
+ do { \
+    (ChP)->R[0x06] = 0x8a; \
+-   sOutDW((ChP)->IndexAddr,*(DWord_t *)&(ChP)->R[0x04]); \
++   out32((ChP)->IndexAddr,&(ChP)->R[0x04]); \
+ } while (0)
+ 
+ /***************************************************************************
+@@ -604,7 +595,7 @@ Call:     sEnCTSFlowCtl(ChP)
+ #define sEnCTSFlowCtl(ChP) \
+ do { \
+    (ChP)->TxControl[2] |= CTSFC_EN; \
+-   sOutDW((ChP)->IndexAddr,*(DWord_t *)&(ChP)->TxControl[0]); \
++   out32((ChP)->IndexAddr,(ChP)->TxControl); \
+ } while (0)
+ 
+ /***************************************************************************
+@@ -616,7 +607,7 @@ Call:     sEnIXANY(ChP)
+ #define sEnIXANY(ChP) \
+ do { \
+    (ChP)->R[0x0e] = 0x21; \
+-   sOutDW((ChP)->IndexAddr,*(DWord_t *)&(ChP)->R[0x0c]); \
++   out32((ChP)->IndexAddr,&(ChP)->R[0x0c]); \
+ } while (0)
+ 
+ /***************************************************************************
+@@ -633,7 +624,7 @@ Warnings: Before enabling parity odd or even parity should be chosen using
+ #define sEnParity(ChP) \
+ do { \
+    (ChP)->TxControl[2] |= PARITY_EN; \
+-   sOutDW((ChP)->IndexAddr,*(DWord_t *)&(ChP)->TxControl[0]); \
++   out32((ChP)->IndexAddr,(ChP)->TxControl); \
+ } while (0)
+ 
+ /***************************************************************************
+@@ -647,10 +638,10 @@ Comments: This function will disable RTS flow control and clear the RTS
+ #define sEnRTSToggle(ChP) \
+ do { \
+    (ChP)->RxControl[2] &= ~RTSFC_EN; \
+-   sOutDW((ChP)->IndexAddr,*(DWord_t *)&(ChP)->RxControl[0]); \
++   out32((ChP)->IndexAddr,(ChP)->RxControl); \
+    (ChP)->TxControl[2] |= RTSTOG_EN; \
+    (ChP)->TxControl[3] &= ~SET_RTS; \
+-   sOutDW((ChP)->IndexAddr,*(DWord_t *)&(ChP)->TxControl[0]); \
++   out32((ChP)->IndexAddr,(ChP)->TxControl); \
+    (ChP)->rtsToggle = 1; \
+ } while (0)
+ 
+@@ -663,7 +654,7 @@ Call:     sEnRxFIFO(ChP)
+ #define sEnRxFIFO(ChP) \
+ do { \
+    (ChP)->R[0x32] = 0x08; \
+-   sOutDW((ChP)->IndexAddr,*(DWord_t *)&(ChP)->R[0x30]); \
++   out32((ChP)->IndexAddr,&(ChP)->R[0x30]); \
+ } while (0)
+ 
+ /***************************************************************************
+@@ -684,7 +675,7 @@ Warnings: This function must be called after valid microcode has been
+ #define sEnRxProcessor(ChP) \
+ do { \
+    (ChP)->RxControl[2] |= RXPROC_EN; \
+-   sOutDW((ChP)->IndexAddr,*(DWord_t *)&(ChP)->RxControl[0]); \
++   out32((ChP)->IndexAddr,(ChP)->RxControl); \
+ } while (0)
+ 
+ /***************************************************************************
+@@ -708,7 +699,7 @@ Call:     sEnTransmit(ChP)
+ #define sEnTransmit(ChP) \
+ do { \
+    (ChP)->TxControl[3] |= TX_ENABLE; \
+-   sOutDW((ChP)->IndexAddr,*(DWord_t *)&(ChP)->TxControl[0]); \
++   out32((ChP)->IndexAddr,(ChP)->TxControl); \
+ } while (0)
+ 
+ /***************************************************************************
+@@ -720,7 +711,7 @@ Call:     sEnTxSoftFlowCtl(ChP)
+ #define sEnTxSoftFlowCtl(ChP) \
+ do { \
+    (ChP)->R[0x06] = 0xc5; \
+-   sOutDW((ChP)->IndexAddr,*(DWord_t *)&(ChP)->R[0x04]); \
++   out32((ChP)->IndexAddr,&(ChP)->R[0x04]); \
+ } while (0)
+ 
+ /***************************************************************************
+@@ -927,7 +918,7 @@ Call:     sSendBreak(ChP)
+ #define sSendBreak(ChP) \
+ do { \
+    (ChP)->TxControl[3] |= SETBREAK; \
+-   sOutDW((ChP)->IndexAddr,*(DWord_t *)&(ChP)->TxControl[0]); \
++   out32((ChP)->IndexAddr,(ChP)->TxControl); \
+ } while (0)
+ 
+ /***************************************************************************
+@@ -941,7 +932,7 @@ Call:     sSetBaud(ChP,Divisor)
+ do { \
+    (ChP)->BaudDiv[2] = (Byte_t)(DIVISOR); \
+    (ChP)->BaudDiv[3] = (Byte_t)((DIVISOR) >> 8); \
+-   sOutDW((ChP)->IndexAddr,*(DWord_t *)&(ChP)->BaudDiv[0]); \
++   out32((ChP)->IndexAddr,(ChP)->BaudDiv); \
+ } while (0)
+ 
+ /***************************************************************************
+@@ -953,7 +944,7 @@ Call:     sSetData7(ChP)
+ #define sSetData7(ChP) \
+ do { \
+    (ChP)->TxControl[2] &= ~DATA8BIT; \
+-   sOutDW((ChP)->IndexAddr,*(DWord_t *)&(ChP)->TxControl[0]); \
++   out32((ChP)->IndexAddr,(ChP)->TxControl); \
+ } while (0)
+ 
+ /***************************************************************************
+@@ -965,7 +956,7 @@ Call:     sSetData8(ChP)
+ #define sSetData8(ChP) \
+ do { \
+    (ChP)->TxControl[2] |= DATA8BIT; \
+-   sOutDW((ChP)->IndexAddr,*(DWord_t *)&(ChP)->TxControl[0]); \
++   out32((ChP)->IndexAddr,(ChP)->TxControl); \
+ } while (0)
+ 
+ /***************************************************************************
+@@ -977,7 +968,7 @@ Call:     sSetDTR(ChP)
+ #define sSetDTR(ChP) \
+ do { \
+    (ChP)->TxControl[3] |= SET_DTR; \
+-   sOutDW((ChP)->IndexAddr,*(DWord_t *)&(ChP)->TxControl[0]); \
++   out32((ChP)->IndexAddr,(ChP)->TxControl); \
+ } while (0)
+ 
+ /***************************************************************************
+@@ -994,7 +985,7 @@ Warnings: This function has no effect unless parity is enabled with function
+ #define sSetEvenParity(ChP) \
+ do { \
+    (ChP)->TxControl[2] |= EVEN_PAR; \
+-   sOutDW((ChP)->IndexAddr,*(DWord_t *)&(ChP)->TxControl[0]); \
++   out32((ChP)->IndexAddr,(ChP)->TxControl); \
+ } while (0)
+ 
+ /***************************************************************************
+@@ -1011,7 +1002,7 @@ Warnings: This function has no effect unless parity is enabled with function
+ #define sSetOddParity(ChP) \
+ do { \
+    (ChP)->TxControl[2] &= ~EVEN_PAR; \
+-   sOutDW((ChP)->IndexAddr,*(DWord_t *)&(ChP)->TxControl[0]); \
++   out32((ChP)->IndexAddr,(ChP)->TxControl); \
+ } while (0)
+ 
+ /***************************************************************************
+@@ -1024,7 +1015,7 @@ Call:     sSetRTS(ChP)
+ do { \
+    if ((ChP)->rtsToggle) break; \
+    (ChP)->TxControl[3] |= SET_RTS; \
+-   sOutDW((ChP)->IndexAddr,*(DWord_t *)&(ChP)->TxControl[0]); \
++   out32((ChP)->IndexAddr,(ChP)->TxControl); \
+ } while (0)
+ 
+ /***************************************************************************
+@@ -1050,7 +1041,7 @@ Comments: An interrupt will be generated when the trigger level is reached
+ do { \
+    (ChP)->RxControl[2] &= ~TRIG_MASK; \
+    (ChP)->RxControl[2] |= LEVEL; \
+-   sOutDW((ChP)->IndexAddr,*(DWord_t *)&(ChP)->RxControl[0]); \
++   out32((ChP)->IndexAddr,(ChP)->RxControl); \
+ } while (0)
+ 
+ /***************************************************************************
+@@ -1062,7 +1053,7 @@ Call:     sSetStop1(ChP)
+ #define sSetStop1(ChP) \
+ do { \
+    (ChP)->TxControl[2] &= ~STOP2; \
+-   sOutDW((ChP)->IndexAddr,*(DWord_t *)&(ChP)->TxControl[0]); \
++   out32((ChP)->IndexAddr,(ChP)->TxControl); \
+ } while (0)
+ 
+ /***************************************************************************
+@@ -1074,7 +1065,7 @@ Call:     sSetStop2(ChP)
+ #define sSetStop2(ChP) \
+ do { \
+    (ChP)->TxControl[2] |= STOP2; \
+-   sOutDW((ChP)->IndexAddr,*(DWord_t *)&(ChP)->TxControl[0]); \
++   out32((ChP)->IndexAddr,(ChP)->TxControl); \
+ } while (0)
+ 
+ /***************************************************************************
+@@ -1087,7 +1078,7 @@ Call:     sSetTxXOFFChar(ChP,Ch)
+ #define sSetTxXOFFChar(ChP,CH) \
+ do { \
+    (ChP)->R[0x07] = (CH); \
+-   sOutDW((ChP)->IndexAddr,*(DWord_t *)&(ChP)->R[0x04]); \
++   out32((ChP)->IndexAddr,&(ChP)->R[0x04]); \
+ } while (0)
+ 
+ /***************************************************************************
+@@ -1100,7 +1091,7 @@ Call:     sSetTxXONChar(ChP,Ch)
+ #define sSetTxXONChar(ChP,CH) \
+ do { \
+    (ChP)->R[0x0b] = (CH); \
+-   sOutDW((ChP)->IndexAddr,*(DWord_t *)&(ChP)->R[0x08]); \
++   out32((ChP)->IndexAddr,&(ChP)->R[0x08]); \
+ } while (0)
+ 
+ /***************************************************************************
+@@ -1113,7 +1104,7 @@ Comments: This function is used to start a Rx processor after it was
+           will restart both the Rx processor and software input flow control.
+ 
+ */
+-#define sStartRxProcessor(ChP) sOutDW((ChP)->IndexAddr,*(DWord_t *)&(ChP)->R[0])
++#define sStartRxProcessor(ChP) out32((ChP)->IndexAddr,&(ChP)->R[0])
+ 
+ /***************************************************************************
+ Function: sWriteTxByte
+diff --git a/drivers/dma/fsldma.c b/drivers/dma/fsldma.c
+index ad2f938..7269230 100644
+--- a/drivers/dma/fsldma.c
++++ b/drivers/dma/fsldma.c
+@@ -123,6 +123,11 @@ static dma_addr_t get_ndar(struct fsl_dma_chan *fsl_chan)
+ 	return DMA_IN(fsl_chan, &fsl_chan->reg_base->ndar, 64);
+ }
+ 
++static u32 get_bcr(struct fsl_dma_chan *fsl_chan)
++{
++	return DMA_IN(fsl_chan, &fsl_chan->reg_base->bcr, 32);
++}
++
+ static int dma_is_idle(struct fsl_dma_chan *fsl_chan)
+ {
+ 	u32 sr = get_sr(fsl_chan);
+@@ -426,6 +431,9 @@ fsl_dma_prep_interrupt(struct dma_chan *chan)
+ 	new->async_tx.cookie = -EBUSY;
+ 	new->async_tx.ack = 0;
+ 
++	/* Insert the link descriptor to the LD ring */
++	list_add_tail(&new->node, &new->async_tx.tx_list);
++
+ 	/* Set End-of-link to the last link descriptor of new list*/
+ 	set_ld_eol(fsl_chan, new);
+ 
+@@ -701,6 +709,23 @@ static irqreturn_t fsl_dma_chan_do_interrupt(int irq, void *data)
+ 	if (stat & FSL_DMA_SR_TE)
+ 		dev_err(fsl_chan->dev, "Transfer Error!\n");
+ 
++	/* Programming Error
++	 * The DMA_INTERRUPT async_tx is a NULL transfer, which will
++	 * triger a PE interrupt.
++	 */
++	if (stat & FSL_DMA_SR_PE) {
++		dev_dbg(fsl_chan->dev, "event: Programming Error INT\n");
++		if (get_bcr(fsl_chan) == 0) {
++			/* BCR register is 0, this is a DMA_INTERRUPT async_tx.
++			 * Now, update the completed cookie, and continue the
++			 * next uncompleted transfer.
++			 */
++			fsl_dma_update_completed_cookie(fsl_chan);
++			fsl_chan_xfer_ld_queue(fsl_chan);
++		}
++		stat &= ~FSL_DMA_SR_PE;
++	}
++
+ 	/* If the link descriptor segment transfer finishes,
+ 	 * we will recycle the used descriptor.
+ 	 */
+@@ -841,6 +866,11 @@ static int fsl_dma_self_test(struct fsl_dma_chan *fsl_chan)
+ 	tx3 = fsl_dma_prep_memcpy(chan, dma_dest, dma_src, test_size / 4, 0);
+ 	async_tx_ack(tx3);
+ 
++	/* Interrupt tx test */
++	tx1 = fsl_dma_prep_interrupt(chan);
++	async_tx_ack(tx1);
++	cookie = fsl_dma_tx_submit(tx1);
++
+ 	/* Test exchanging the prepared tx sort */
+ 	cookie = fsl_dma_tx_submit(tx3);
+ 	cookie = fsl_dma_tx_submit(tx2);
+diff --git a/drivers/dma/fsldma.h b/drivers/dma/fsldma.h
+index ba78c42..fddd6ae 100644
+--- a/drivers/dma/fsldma.h
++++ b/drivers/dma/fsldma.h
+@@ -40,6 +40,7 @@
+ #define FSL_DMA_MR_EOTIE	0x00000080
+ 
+ #define FSL_DMA_SR_CH		0x00000020
++#define FSL_DMA_SR_PE		0x00000010
+ #define FSL_DMA_SR_CB		0x00000004
+ #define FSL_DMA_SR_TE		0x00000080
+ #define FSL_DMA_SR_EOSI		0x00000002
+diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
+index d73a768..f0b00ec 100644
+--- a/drivers/hid/hid-core.c
++++ b/drivers/hid/hid-core.c
+@@ -968,7 +968,7 @@ int hid_input_report(struct hid_device *hid, int type, u8 *data, int size, int i
+ 		size--;
+ 	}
+ 
+-	/* dump the report descriptor */
++	/* dump the report */
+ 	dbg_hid("report %d (size %u) = ", n, size);
+ 	for (i = 0; i < size; i++)
+ 		dbg_hid_line(" %02x", data[i]);
+diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c
+index 5a38fb2..c3eb3f1 100644
+--- a/drivers/hid/hid-input.c
++++ b/drivers/hid/hid-input.c
+@@ -98,18 +98,16 @@ struct hidinput_key_translation {
+ 
+ static struct hidinput_key_translation apple_fn_keys[] = {
+ 	{ KEY_BACKSPACE, KEY_DELETE },
+-	{ KEY_F1,       KEY_BRIGHTNESSDOWN,     APPLE_FLAG_FKEY },
+-	{ KEY_F2,       KEY_BRIGHTNESSUP,       APPLE_FLAG_FKEY },
+-	{ KEY_F3,       KEY_CYCLEWINDOWS,       APPLE_FLAG_FKEY }, /* Exposé */
+-	{ KEY_F4,       KEY_FN_F4,              APPLE_FLAG_FKEY }, /* Dashboard */
+-	{ KEY_F5,       KEY_FN_F5 },
+-	{ KEY_F6,       KEY_FN_F6 },
+-	{ KEY_F7,       KEY_BACK,               APPLE_FLAG_FKEY },
+-	{ KEY_F8,       KEY_PLAYPAUSE,          APPLE_FLAG_FKEY },
+-	{ KEY_F9,       KEY_FORWARD,            APPLE_FLAG_FKEY },
+-	{ KEY_F10,      KEY_MUTE,               APPLE_FLAG_FKEY },
+-	{ KEY_F11,      KEY_VOLUMEDOWN,         APPLE_FLAG_FKEY },
+-	{ KEY_F12,      KEY_VOLUMEUP,           APPLE_FLAG_FKEY },
++	{ KEY_F1,       KEY_BRIGHTNESSDOWN, APPLE_FLAG_FKEY },
++	{ KEY_F2,       KEY_BRIGHTNESSUP,   APPLE_FLAG_FKEY },
++	{ KEY_F3,       KEY_FN_F5,          APPLE_FLAG_FKEY }, /* Exposé */
++	{ KEY_F4,       KEY_FN_F4,          APPLE_FLAG_FKEY }, /* Dashboard */
++	{ KEY_F7,       KEY_PREVIOUSSONG,   APPLE_FLAG_FKEY },
++	{ KEY_F8,       KEY_PLAYPAUSE,      APPLE_FLAG_FKEY },
++	{ KEY_F9,       KEY_NEXTSONG,       APPLE_FLAG_FKEY },
++	{ KEY_F10,      KEY_MUTE,           APPLE_FLAG_FKEY },
++	{ KEY_F11,      KEY_VOLUMEDOWN,     APPLE_FLAG_FKEY },
++	{ KEY_F12,      KEY_VOLUMEUP,       APPLE_FLAG_FKEY },
+ 	{ KEY_UP,       KEY_PAGEUP },
+ 	{ KEY_DOWN,     KEY_PAGEDOWN },
+ 	{ KEY_LEFT,     KEY_HOME },
+diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c
+index b38e559..d95979f 100644
+--- a/drivers/hid/usbhid/hid-core.c
++++ b/drivers/hid/usbhid/hid-core.c
+@@ -278,7 +278,7 @@ static int hid_submit_ctrl(struct hid_device *hid)
+ 		usbhid->urbctrl->pipe = usb_rcvctrlpipe(hid_to_usb_dev(hid), 0);
+ 		maxpacket = usb_maxpacket(hid_to_usb_dev(hid), usbhid->urbctrl->pipe, 0);
+ 		if (maxpacket > 0) {
+-			padlen = (len + maxpacket - 1) / maxpacket;
++			padlen = DIV_ROUND_UP(len, maxpacket);
+ 			padlen *= maxpacket;
+ 			if (padlen > usbhid->bufsize)
+ 				padlen = usbhid->bufsize;
+diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c
+index e6d05f6..e29a057 100644
+--- a/drivers/hid/usbhid/hid-quirks.c
++++ b/drivers/hid/usbhid/hid-quirks.c
+@@ -345,6 +345,9 @@
+ #define USB_VENDOR_ID_NATIONAL_SEMICONDUCTOR 0x0400
+ #define USB_DEVICE_ID_N_S_HARMONY       0xc359
+ 
++#define USB_VENDOR_ID_NATSU             0x08b7
++#define USB_DEVICE_ID_NATSU_GAMEPAD     0x0001
++
+ #define USB_VENDOR_ID_NEC		0x073e
+ #define USB_DEVICE_ID_NEC_USB_GAME_PAD	0x0301
+ 
+@@ -426,6 +429,7 @@ static const struct hid_blacklist {
+ 	{ USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_DRIVING, HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT },
+ 	{ USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_FLYING, HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT },
+ 	{ USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_FIGHTING, HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT },
++	{ USB_VENDOR_ID_NATSU, USB_DEVICE_ID_NATSU_GAMEPAD, HID_QUIRK_BADPAD },
+ 	{ USB_VENDOR_ID_NEC, USB_DEVICE_ID_NEC_USB_GAME_PAD, HID_QUIRK_BADPAD },
+ 	{ USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_RUMBLEPAD, HID_QUIRK_BADPAD },
+ 	{ USB_VENDOR_ID_TOPMAX, USB_DEVICE_ID_TOPMAX_COBRAPAD, HID_QUIRK_BADPAD },
+@@ -624,7 +628,7 @@ static const struct hid_blacklist {
+ 	{ 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 | HID_QUIRK_APPLE_ISO_KEYBOARD },
++	{ 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 },
+diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig
+index 368879f..4dc76bc 100644
+--- a/drivers/hwmon/Kconfig
++++ b/drivers/hwmon/Kconfig
+@@ -337,8 +337,9 @@ config SENSORS_IBMPEX
+ 	help
+ 	  If you say yes here you get support for the temperature and
+ 	  power sensors in various IBM System X servers that support
+-	  PowerExecutive.  So far this includes the x3550, x3650, x3655,
+-	  x3755, and certain HS20 blades.
++	  PowerExecutive.  So far this includes the x3350, x3550, x3650,
++	  x3655, and x3755; the x3800, x3850, and x3950 models that have
++	  PCI Express; and some of the HS2x, LS2x, and QS2x blades.
+ 
+ 	  This driver can also be built as a module.  If so, the module
+ 	  will be called ibmpex.
+diff --git a/drivers/hwmon/ibmpex.c b/drivers/hwmon/ibmpex.c
+index 9c9cdb0..4e9b19c 100644
+--- a/drivers/hwmon/ibmpex.c
++++ b/drivers/hwmon/ibmpex.c
+@@ -327,10 +327,14 @@ static int is_temp_sensor(const char *sensor_id, int len)
+ 	return 0;
+ }
+ 
+-static int power_sensor_multiplier(const char *sensor_id, int len)
++static int power_sensor_multiplier(struct ibmpex_bmc_data *data,
++				   const char *sensor_id, int len)
+ {
+ 	int i;
+ 
++	if (data->sensor_major == 2)
++		return 1000000;
++
+ 	for (i = PEX_SENSOR_TYPE_LEN; i < len - 1; i++)
+ 		if (!memcmp(&sensor_id[i], watt_sensor_sig, PEX_MULT_LEN))
+ 			return 1000000;
+@@ -398,14 +402,15 @@ static int ibmpex_find_sensors(struct ibmpex_bmc_data *data)
+ 			num_power++;
+ 			sensor_counter = num_power;
+ 			data->sensors[i].multiplier =
+-				power_sensor_multiplier(data->rx_msg_data,
+-						     data->rx_msg_len);
++				power_sensor_multiplier(data,
++							data->rx_msg_data,
++							data->rx_msg_len);
+ 		} else if (is_temp_sensor(data->rx_msg_data,
+ 					  data->rx_msg_len)) {
+ 			sensor_type = TEMP_SENSOR;
+ 			num_temp++;
+ 			sensor_counter = num_temp;
+-			data->sensors[i].multiplier = 1;
++			data->sensors[i].multiplier = 1000;
+ 		} else
+ 			continue;
+ 
+diff --git a/drivers/ide/ide-taskfile.c b/drivers/ide/ide-taskfile.c
+index 0518a2e..4c86a8d 100644
+--- a/drivers/ide/ide-taskfile.c
++++ b/drivers/ide/ide-taskfile.c
+@@ -423,6 +423,25 @@ void task_end_request(ide_drive_t *drive, struct request *rq, u8 stat)
+ }
+ 
+ /*
++ * We got an interrupt on a task_in case, but no errors and no DRQ.
++ *
++ * It might be a spurious irq (shared irq), but it might be a
++ * command that had no output.
++ */
++static ide_startstop_t task_in_unexpected(ide_drive_t *drive, struct request *rq, u8 stat)
++{
++	/* Command all done? */
++	if (OK_STAT(stat, READY_STAT, BUSY_STAT)) {
++		task_end_request(drive, rq, stat);
++		return ide_stopped;
++	}
++
++	/* Assume it was a spurious irq */
++	ide_set_handler(drive, &task_in_intr, WAIT_WORSTCASE, NULL);
++	return ide_started;
++}
++
++/*
+  * Handler for command with PIO data-in phase (Read/Read Multiple).
+  */
+ static ide_startstop_t task_in_intr(ide_drive_t *drive)
+@@ -431,18 +450,17 @@ static ide_startstop_t task_in_intr(ide_drive_t *drive)
+ 	struct request *rq = HWGROUP(drive)->rq;
+ 	u8 stat = ide_read_status(drive);
+ 
+-	/* new way for dealing with premature shared PCI interrupts */
+-	if (!OK_STAT(stat, DRQ_STAT, BAD_R_STAT)) {
+-		if (stat & (ERR_STAT | DRQ_STAT))
+-			return task_error(drive, rq, __FUNCTION__, stat);
+-		/* No data yet, so wait for another IRQ. */
+-		ide_set_handler(drive, &task_in_intr, WAIT_WORSTCASE, NULL);
+-		return ide_started;
+-	}
++	/* Error? */
++	if (stat & ERR_STAT)
++		return task_error(drive, rq, __FUNCTION__, stat);
++
++	/* Didn't want any data? Odd. */
++	if (!(stat & DRQ_STAT))
++		return task_in_unexpected(drive, rq, stat);
+ 
+ 	ide_pio_datablock(drive, rq, 0);
+ 
+-	/* If it was the last datablock check status and finish transfer. */
++	/* Are we done? Check status and finish transfer. */
+ 	if (!hwif->nleft) {
+ 		stat = wait_drive_not_busy(drive);
+ 		if (!OK_STAT(stat, 0, BAD_STAT))
+diff --git a/drivers/input/misc/cobalt_btns.c b/drivers/input/misc/cobalt_btns.c
+index 4833b1a..5511ef0 100644
+--- a/drivers/input/misc/cobalt_btns.c
++++ b/drivers/input/misc/cobalt_btns.c
+@@ -1,7 +1,7 @@
+ /*
+  *  Cobalt button interface driver.
+  *
+- *  Copyright (C) 2007  Yoichi Yuasa <yoichi_yuasa at tripeaks.co.jp>
++ *  Copyright (C) 2007-2008  Yoichi Yuasa <yoichi_yuasa at tripeaks.co.jp>
+  *
+  *  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
+@@ -15,7 +15,7 @@
+  *
+  *  You should have received a copy of the GNU General Public License
+  *  along with this program; if not, write to the Free Software
+- *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
++ *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ #include <linux/init.h>
+ #include <linux/input-polldev.h>
+@@ -55,7 +55,7 @@ static void handle_buttons(struct input_polled_dev *dev)
+ 	status = ~readl(bdev->reg) >> 24;
+ 
+ 	for (i = 0; i < ARRAY_SIZE(bdev->keymap); i++) {
+-		if (status & (1UL << i)) {
++		if (status & (1U << i)) {
+ 			if (++bdev->count[i] == BUTTONS_COUNT_THRESHOLD) {
+ 				input_event(input, EV_MSC, MSC_SCAN, i);
+ 				input_report_key(input, bdev->keymap[i], 1);
+@@ -97,16 +97,16 @@ static int __devinit cobalt_buttons_probe(struct platform_device *pdev)
+ 	input->name = "Cobalt buttons";
+ 	input->phys = "cobalt/input0";
+ 	input->id.bustype = BUS_HOST;
+-	input->cdev.dev = &pdev->dev;
++	input->dev.parent = &pdev->dev;
+ 
+-	input->keycode = pdev->keymap;
+-	input->keycodemax = ARRAY_SIZE(pdev->keymap);
++	input->keycode = bdev->keymap;
++	input->keycodemax = ARRAY_SIZE(bdev->keymap);
+ 	input->keycodesize = sizeof(unsigned short);
+ 
+ 	input_set_capability(input, EV_MSC, MSC_SCAN);
+ 	__set_bit(EV_KEY, input->evbit);
+-	for (i = 0; i < ARRAY_SIZE(buttons_map); i++)
+-		__set_bit(input->keycode[i], input->keybit);
++	for (i = 0; i < ARRAY_SIZE(cobalt_map); i++)
++		__set_bit(bdev->keymap[i], input->keybit);
+ 	__clear_bit(KEY_RESERVED, input->keybit);
+ 
+ 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c
+index b346a3b..385e32b 100644
+--- a/drivers/input/mouse/alps.c
++++ b/drivers/input/mouse/alps.c
+@@ -116,8 +116,8 @@ static void alps_process_packet(struct psmouse *psmouse)
+ 	}
+ 
+ 	if (priv->i->flags & ALPS_FW_BK_1) {
+-		back = packet[2] & 4;
+-		forward = packet[0] & 0x10;
++		back = packet[0] & 0x10;
++		forward = packet[2] & 4;
+ 	}
+ 
+ 	if (priv->i->flags & ALPS_FW_BK_2) {
+@@ -483,6 +483,7 @@ int alps_init(struct psmouse *psmouse)
+ 	dev2->id.vendor  = 0x0002;
+ 	dev2->id.product = PSMOUSE_ALPS;
+ 	dev2->id.version = 0x0000;
++	dev2->dev.parent = &psmouse->ps2dev.serio->dev;
+ 
+ 	dev2->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL);
+ 	dev2->relbit[BIT_WORD(REL_X)] |= BIT_MASK(REL_X) | BIT_MASK(REL_Y);
+diff --git a/drivers/input/serio/i8042-snirm.h b/drivers/input/serio/i8042-snirm.h
+new file mode 100644
+index 0000000..409a934
+--- /dev/null
++++ b/drivers/input/serio/i8042-snirm.h
+@@ -0,0 +1,75 @@
++#ifndef _I8042_SNIRM_H
++#define _I8042_SNIRM_H
++
++#include <asm/sni.h>
++
++/*
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 as published by
++ * the Free Software Foundation.
++ */
++
++/*
++ * Names.
++ */
++
++#define I8042_KBD_PHYS_DESC "onboard/serio0"
++#define I8042_AUX_PHYS_DESC "onboard/serio1"
++#define I8042_MUX_PHYS_DESC "onboard/serio%d"
++
++/*
++ * IRQs.
++ */
++static int i8042_kbd_irq;
++static int i8042_aux_irq;
++#define I8042_KBD_IRQ i8042_kbd_irq
++#define I8042_AUX_IRQ i8042_aux_irq
++
++static void __iomem *kbd_iobase;
++
++#define I8042_COMMAND_REG	(kbd_iobase + 0x64UL)
++#define I8042_DATA_REG		(kbd_iobase + 0x60UL)
++
++static inline int i8042_read_data(void)
++{
++	return readb(kbd_iobase + 0x60UL);
++}
++
++static inline int i8042_read_status(void)
++{
++	return readb(kbd_iobase + 0x64UL);
++}
++
++static inline void i8042_write_data(int val)
++{
++	writeb(val, kbd_iobase + 0x60UL);
++}
++
++static inline void i8042_write_command(int val)
++{
++	writeb(val, kbd_iobase + 0x64UL);
++}
++static inline int i8042_platform_init(void)
++{
++	/* RM200 is strange ... */
++	if (sni_brd_type == SNI_BRD_RM200) {
++		kbd_iobase = ioremap(0x16000000, 4);
++		i8042_kbd_irq = 33;
++		i8042_aux_irq = 44;
++	} else {
++		kbd_iobase = ioremap(0x14000000, 4);
++		i8042_kbd_irq = 1;
++		i8042_aux_irq = 12;
++	}
++	if (!kbd_iobase)
++		return -ENOMEM;
++
++	return 0;
++}
++
++static inline void i8042_platform_exit(void)
++{
++
++}
++
++#endif /* _I8042_SNIRM_H */
+diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h
+index 662e844..60931ac 100644
+--- a/drivers/input/serio/i8042-x86ia64io.h
++++ b/drivers/input/serio/i8042-x86ia64io.h
+@@ -277,6 +277,13 @@ static struct dmi_system_id __initdata i8042_dmi_nomux_table[] = {
+ 			DMI_MATCH(DMI_PRODUCT_NAME, "M636/A737 platform"),
+ 		},
+ 	},
++	{
++		.ident = "Lenovo 3000 n100",
++		.matches = {
++			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
++			DMI_MATCH(DMI_PRODUCT_VERSION, "3000 N100"),
++		},
++	},
+ 	{ }
+ };
+ 
+diff --git a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c
+index 2763394..65a74cf 100644
+--- a/drivers/input/serio/i8042.c
++++ b/drivers/input/serio/i8042.c
+@@ -1151,7 +1151,6 @@ static int __devinit i8042_setup_kbd(void)
+ static int __devinit i8042_probe(struct platform_device *dev)
+ {
+ 	int error;
+-	char param;
+ 
+ 	error = i8042_controller_selftest();
+ 	if (error)
+@@ -1174,7 +1173,7 @@ static int __devinit i8042_probe(struct platform_device *dev)
+ 	}
+ #ifdef CONFIG_X86
+ 	if (i8042_dritek) {
+-		param = 0x90;
++		char param = 0x90;
+ 		error = i8042_command(&param, 0x1059);
+ 		if (error)
+ 			goto out_fail;
+diff --git a/drivers/input/serio/i8042.h b/drivers/input/serio/i8042.h
+index c972e5d..cbc1beb 100644
+--- a/drivers/input/serio/i8042.h
++++ b/drivers/input/serio/i8042.h
+@@ -18,6 +18,8 @@
+ #include "i8042-jazzio.h"
+ #elif defined(CONFIG_SGI_HAS_I8042)
+ #include "i8042-ip22io.h"
++#elif defined(CONFIG_SNI_RM)
++#include "i8042-snirm.h"
+ #elif defined(CONFIG_PPC)
+ #include "i8042-ppcio.h"
+ #elif defined(CONFIG_SPARC)
+diff --git a/drivers/input/tablet/wacom.h b/drivers/input/tablet/wacom.h
+index 6542edb..acf9830 100644
+--- a/drivers/input/tablet/wacom.h
++++ b/drivers/input/tablet/wacom.h
+@@ -11,7 +11,7 @@
+  *  Copyright (c) 2000 Daniel Egger		<egger at suse.de>
+  *  Copyright (c) 2001 Frederic Lepied		<flepied at mandrakesoft.com>
+  *  Copyright (c) 2004 Panagiotis Issaris	<panagiotis.issaris at mech.kuleuven.ac.be>
+- *  Copyright (c) 2002-2007 Ping Cheng		<pingc at wacom.com>
++ *  Copyright (c) 2002-2008 Ping Cheng		<pingc at wacom.com>
+  *
+  *  ChangeLog:
+  *      v0.1 (vp)  - Initial release
+@@ -65,6 +65,7 @@
+  *		   - and wacom_wac.c deals with Wacom specific code
+  *		   - Support Intuos3 4x6
+  *      v1.47 (pc) - Added support for Bamboo
++ *      v1.48 (pc) - Added support for Bamboo1, BambooFun, and Cintiq 12WX
+  */
+ 
+ /*
+@@ -85,7 +86,7 @@
+ /*
+  * Version Information
+  */
+-#define DRIVER_VERSION "v1.47"
++#define DRIVER_VERSION "v1.48"
+ #define DRIVER_AUTHOR "Vojtech Pavlik <vojtech at ucw.cz>"
+ #define DRIVER_DESC "USB Wacom Graphire and Wacom Intuos tablet driver"
+ #define DRIVER_LICENSE "GPL"
+@@ -125,6 +126,7 @@ extern void input_dev_i(struct input_dev *input_dev, struct wacom_wac *wacom_wac
+ extern void input_dev_pl(struct input_dev *input_dev, struct wacom_wac *wacom_wac);
+ extern void input_dev_pt(struct input_dev *input_dev, struct wacom_wac *wacom_wac);
+ extern void input_dev_mo(struct input_dev *input_dev, struct wacom_wac *wacom_wac);
++extern void input_dev_bee(struct input_dev *input_dev, struct wacom_wac *wacom_wac);
+ extern __u16 wacom_le16_to_cpu(unsigned char *data);
+ extern __u16 wacom_be16_to_cpu(unsigned char *data);
+ extern struct wacom_features * get_wacom_feature(const struct usb_device_id *id);
+diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c
+index d64b1ea..41caaef 100644
+--- a/drivers/input/tablet/wacom_sys.c
++++ b/drivers/input/tablet/wacom_sys.c
+@@ -171,6 +171,7 @@ void input_dev_i3s(struct input_dev *input_dev, struct wacom_wac *wacom_wac)
+ 	input_dev->keybit[BIT_WORD(BTN_LEFT)] |= BIT_MASK(BTN_0) |
+ 		BIT_MASK(BTN_1) | BIT_MASK(BTN_2) | BIT_MASK(BTN_3);
+ 	input_set_abs_params(input_dev, ABS_RX, 0, 4096, 0, 0);
++	input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0);
+ }
+ 
+ void input_dev_i3(struct input_dev *input_dev, struct wacom_wac *wacom_wac)
+@@ -180,6 +181,11 @@ void input_dev_i3(struct input_dev *input_dev, struct wacom_wac *wacom_wac)
+ 	input_set_abs_params(input_dev, ABS_RY, 0, 4096, 0, 0);
+ }
+ 
++void input_dev_bee(struct input_dev *input_dev, struct wacom_wac *wacom_wac)
++{
++	input_dev->keybit[BIT_WORD(BTN_LEFT)] |= BIT_MASK(BTN_8) | BIT_MASK(BTN_9);
++}
++
+ void input_dev_i(struct input_dev *input_dev, struct wacom_wac *wacom_wac)
+ {
+ 	input_dev->evbit[0] |= BIT_MASK(EV_MSC) | BIT_MASK(EV_REL);
+diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c
+index fc03ba2..ffe3384 100644
+--- a/drivers/input/tablet/wacom_wac.c
++++ b/drivers/input/tablet/wacom_wac.c
+@@ -163,7 +163,9 @@ static int wacom_graphire_irq(struct wacom_wac *wacom, void *wcombo)
+ 	}
+ 
+ 	id = STYLUS_DEVICE_ID;
+-	if (data[1] & 0x80) { /* in prox */
++	if ((data[1] & 0x80) && ((data[1] & 0x07) || data[2] || data[3] || data[4]
++			|| data[5] || data[6] || (data[7] & 0x07))) {
++		/* in prox and not a pad data */
+ 
+ 		switch ((data[1] >> 5) & 3) {
+ 
+@@ -233,7 +235,6 @@ static int wacom_graphire_irq(struct wacom_wac *wacom, void *wcombo)
+ 		if (data[7] & 0xf8) {
+ 			wacom_input_sync(wcombo); /* sync last event */
+ 			wacom->id[1] = 1;
+-			wacom->serial[1] = (data[7] & 0xf8);
+ 			wacom_report_key(wcombo, BTN_0, (data[7] & 0x40));
+ 			wacom_report_key(wcombo, BTN_4, (data[7] & 0x80));
+ 			rw = ((data[7] & 0x18) >> 3) - ((data[7] & 0x20) >> 3);
+@@ -252,10 +253,9 @@ static int wacom_graphire_irq(struct wacom_wac *wacom, void *wcombo)
+ 		}
+ 		break;
+ 	    case WACOM_MO:
+-		if ((data[7] & 0xf8) || (data[8] & 0x80)) {
++		if ((data[7] & 0xf8) || (data[8] & 0xff)) {
+ 			wacom_input_sync(wcombo); /* sync last event */
+ 			wacom->id[1] = 1;
+-			wacom->serial[1] = (data[7] & 0xf8);
+ 			wacom_report_key(wcombo, BTN_0, (data[7] & 0x08));
+ 			wacom_report_key(wcombo, BTN_1, (data[7] & 0x20));
+ 			wacom_report_key(wcombo, BTN_4, (data[7] & 0x10));
+@@ -434,10 +434,12 @@ static int wacom_intuos_irq(struct wacom_wac *wacom, void *wcombo)
+ 		wacom_report_key(wcombo, BTN_5, (data[6] & 0x02));
+ 		wacom_report_key(wcombo, BTN_6, (data[6] & 0x04));
+ 		wacom_report_key(wcombo, BTN_7, (data[6] & 0x08));
++		wacom_report_key(wcombo, BTN_8, (data[5] & 0x10));
++		wacom_report_key(wcombo, BTN_9, (data[6] & 0x10));
+ 		wacom_report_abs(wcombo, ABS_RX, ((data[1] & 0x1f) << 8) | data[2]);
+ 		wacom_report_abs(wcombo, ABS_RY, ((data[3] & 0x1f) << 8) | data[4]);
+ 
+-		if((data[5] & 0x0f) | (data[6] & 0x0f) | (data[1] & 0x1f) |
++		if ((data[5] & 0x1f) | (data[6] & 0x1f) | (data[1] & 0x1f) |
+ 			data[2] | (data[3] & 0x1f) | data[4])
+ 			wacom_report_key(wcombo, wacom->tool[1], 1);
+ 		else
+@@ -481,13 +483,11 @@ static int wacom_intuos_irq(struct wacom_wac *wacom, void *wcombo)
+ 		if (data[1] & 0x02) {
+ 			/* Rotation packet */
+ 			if (wacom->features->type >= INTUOS3S) {
+-				/* I3 marker pen rotation reported as wheel
+-				 * due to valuator limitation
+-				 */
++				/* I3 marker pen rotation */
+ 				t = (data[6] << 3) | ((data[7] >> 5) & 7);
+ 				t = (data[7] & 0x20) ? ((t > 900) ? ((t-1) / 2 - 1350) :
+ 					((t-1) / 2 + 450)) : (450 - t / 2) ;
+-				wacom_report_abs(wcombo, ABS_WHEEL, t);
++				wacom_report_abs(wcombo, ABS_Z, t);
+ 			} else {
+ 				/* 4D mouse rotation packet */
+ 				t = (data[6] << 3) | ((data[7] >> 5) & 7);
+@@ -558,6 +558,7 @@ int wacom_wac_irq(struct wacom_wac *wacom_wac, void *wcombo)
+ 		case INTUOS3:
+ 		case INTUOS3L:
+ 		case CINTIQ:
++		case WACOM_BEE:
+ 			return (wacom_intuos_irq(wacom_wac, wcombo));
+ 			break;
+ 		default:
+@@ -577,6 +578,8 @@ void wacom_init_input_dev(struct input_dev *input_dev, struct wacom_wac *wacom_w
+ 		case GRAPHIRE:
+ 			input_dev_g(input_dev, wacom_wac);
+ 			break;
++		case WACOM_BEE:
++			input_dev_bee(input_dev, wacom_wac);
+ 		case INTUOS3:
+ 		case INTUOS3L:
+ 		case CINTIQ:
+@@ -607,12 +610,15 @@ static struct wacom_features wacom_features[] = {
+ 	{ "Wacom Graphire3 6x8", 8,  16704, 12064,  511, 63, GRAPHIRE },
+ 	{ "Wacom Graphire4 4x5", 8,  10208,  7424,  511, 63, WACOM_G4 },
+ 	{ "Wacom Graphire4 6x8", 8,  16704, 12064,  511, 63, WACOM_G4 },
++	{ "Wacom BambooFun 4x5", 9,  14760,  9225,  511, 63, WACOM_MO },
++	{ "Wacom BambooFun 6x8", 9,  21648, 13530,  511, 63, WACOM_MO },
+ 	{ "Wacom Volito",        8,   5104,  3712,  511, 63, GRAPHIRE },
+ 	{ "Wacom PenStation2",   8,   3250,  2320,  255, 63, GRAPHIRE },
+ 	{ "Wacom Volito2 4x5",   8,   5104,  3712,  511, 63, GRAPHIRE },
+ 	{ "Wacom Volito2 2x3",   8,   3248,  2320,  511, 63, GRAPHIRE },
+-	{ "Wacom PenPartner2",   8,   3250,  2320,  255, 63, GRAPHIRE },
++	{ "Wacom PenPartner2",   8,   3250,  2320,  511, 63, GRAPHIRE },
+ 	{ "Wacom Bamboo",        9,  14760,  9225,  511, 63, WACOM_MO },
++	{ "Wacom Bamboo1",       8,   5104,  3712,  511, 63, GRAPHIRE },
+ 	{ "Wacom Intuos 4x5",   10,  12700, 10600, 1023, 31, INTUOS },
+ 	{ "Wacom Intuos 6x8",   10,  20320, 16240, 1023, 31, INTUOS },
+ 	{ "Wacom Intuos 9x12",  10,  30480, 24060, 1023, 31, INTUOS },
+@@ -643,6 +649,7 @@ static struct wacom_features wacom_features[] = {
+ 	{ "Wacom Intuos3 6x11",  10, 54204, 31750, 1023, 63, INTUOS3 },
+ 	{ "Wacom Intuos3 4x6",   10, 31496, 19685, 1023, 63, INTUOS3S },
+ 	{ "Wacom Cintiq 21UX",   10, 87200, 65600, 1023, 63, CINTIQ },
++	{ "Wacom Cintiq 12WX",   10, 53020, 33440, 1023, 63, WACOM_BEE },
+ 	{ "Wacom Intuos2 6x8",   10, 20320, 16240, 1023, 31, INTUOS },
+ 	{ }
+ };
+@@ -656,12 +663,15 @@ static struct usb_device_id wacom_ids[] = {
+ 	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x14) },
+ 	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x15) },
+ 	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x16) },
++	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x17) },
++	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x18) },
+ 	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x60) },
+ 	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x61) },
+ 	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x62) },
+ 	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x63) },
+ 	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x64) },
+ 	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x65) },
++	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x69) },
+ 	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x20) },
+ 	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x21) },
+ 	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x22) },
+@@ -692,6 +702,7 @@ static struct usb_device_id wacom_ids[] = {
+ 	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB5) },
+ 	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB7) },
+ 	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x3F) },
++	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0xC6) },
+ 	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x47) },
+ 	{ }
+ };
+diff --git a/drivers/input/tablet/wacom_wac.h b/drivers/input/tablet/wacom_wac.h
+index a302e22..3342bc0 100644
+--- a/drivers/input/tablet/wacom_wac.h
++++ b/drivers/input/tablet/wacom_wac.h
+@@ -25,6 +25,7 @@ enum {
+ 	INTUOS3,
+ 	INTUOS3L,
+ 	CINTIQ,
++	WACOM_BEE,
+ 	WACOM_MO,
+ 	MAX_TYPE
+ };
+diff --git a/drivers/input/touchscreen/ads7846.c b/drivers/input/touchscreen/ads7846.c
+index 58934a4..57a1c28 100644
+--- a/drivers/input/touchscreen/ads7846.c
++++ b/drivers/input/touchscreen/ads7846.c
+@@ -213,7 +213,7 @@ static int ads7846_read12_ser(struct device *dev, unsigned command)
+ 	struct ads7846		*ts = dev_get_drvdata(dev);
+ 	struct ser_req		*req = kzalloc(sizeof *req, GFP_KERNEL);
+ 	int			status;
+-	int			sample;
++	int			uninitialized_var(sample);
+ 	int			use_internal;
+ 
+ 	if (!req)
+diff --git a/drivers/md/md.c b/drivers/md/md.c
+index ccbbf63..61ccbd2 100644
+--- a/drivers/md/md.c
++++ b/drivers/md/md.c
+@@ -1864,17 +1864,6 @@ static struct rdev_sysfs_entry rdev_state =
+ __ATTR(state, S_IRUGO|S_IWUSR, state_show, state_store);
+ 
+ static ssize_t
+-super_show(mdk_rdev_t *rdev, char *page)
+-{
+-	if (rdev->sb_loaded && rdev->sb_size) {
+-		memcpy(page, page_address(rdev->sb_page), rdev->sb_size);
+-		return rdev->sb_size;
+-	} else
+-		return 0;
+-}
+-static struct rdev_sysfs_entry rdev_super = __ATTR_RO(super);
+-
+-static ssize_t
+ errors_show(mdk_rdev_t *rdev, char *page)
+ {
+ 	return sprintf(page, "%d\n", atomic_read(&rdev->corrected_errors));
+@@ -2060,7 +2049,6 @@ __ATTR(size, S_IRUGO|S_IWUSR, rdev_size_show, rdev_size_store);
+ 
+ static struct attribute *rdev_default_attrs[] = {
+ 	&rdev_state.attr,
+-	&rdev_super.attr,
+ 	&rdev_errors.attr,
+ 	&rdev_slot.attr,
+ 	&rdev_offset.attr,
+diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
+index 2d6f1a5..c574cf5 100644
+--- a/drivers/md/raid5.c
++++ b/drivers/md/raid5.c
+@@ -1143,7 +1143,7 @@ static void raid5_end_read_request(struct bio * bi, int error)
+ 			rdev = conf->disks[i].rdev;
+ 			printk(KERN_INFO "raid5:%s: read error corrected (%lu sectors at %llu on %s)\n",
+ 			       mdname(conf->mddev), STRIPE_SECTORS,
+-			       (unsigned long long)sh->sector + rdev->data_offset,
++			       (unsigned long long)(sh->sector + rdev->data_offset),
+ 			       bdevname(rdev->bdev, b));
+ 			clear_bit(R5_ReadError, &sh->dev[i].flags);
+ 			clear_bit(R5_ReWrite, &sh->dev[i].flags);
+@@ -1160,13 +1160,13 @@ static void raid5_end_read_request(struct bio * bi, int error)
+ 		if (conf->mddev->degraded)
+ 			printk(KERN_WARNING "raid5:%s: read error not correctable (sector %llu on %s).\n",
+ 			       mdname(conf->mddev),
+-			       (unsigned long long)sh->sector + rdev->data_offset,
++			       (unsigned long long)(sh->sector + rdev->data_offset),
+ 			       bdn);
+ 		else if (test_bit(R5_ReWrite, &sh->dev[i].flags))
+ 			/* Oh, no!!! */
+ 			printk(KERN_WARNING "raid5:%s: read error NOT corrected!! (sector %llu on %s).\n",
+ 			       mdname(conf->mddev),
+-			       (unsigned long long)sh->sector + rdev->data_offset,
++			       (unsigned long long)(sh->sector + rdev->data_offset),
+ 			       bdn);
+ 		else if (atomic_read(&rdev->read_errors)
+ 			 > conf->max_nr_stripes)
+diff --git a/drivers/memstick/core/memstick.c b/drivers/memstick/core/memstick.c
+index de80dba..946e3d3 100644
+--- a/drivers/memstick/core/memstick.c
++++ b/drivers/memstick/core/memstick.c
+@@ -276,8 +276,6 @@ void memstick_init_req_sg(struct memstick_request *mrq, unsigned char tpc,
+ 		mrq->need_card_int = 1;
+ 	else
+ 		mrq->need_card_int = 0;
+-
+-	mrq->get_int_reg = 0;
+ }
+ EXPORT_SYMBOL(memstick_init_req_sg);
+ 
+@@ -311,8 +309,6 @@ void memstick_init_req(struct memstick_request *mrq, unsigned char tpc,
+ 		mrq->need_card_int = 1;
+ 	else
+ 		mrq->need_card_int = 0;
+-
+-	mrq->get_int_reg = 0;
+ }
+ EXPORT_SYMBOL(memstick_init_req);
+ 
+@@ -342,6 +338,7 @@ static int h_memstick_read_dev_id(struct memstick_dev *card,
+ 			card->id.class = id_reg.class;
+ 		}
+ 		complete(&card->mrq_complete);
++		dev_dbg(&card->dev, "if_mode = %02x\n", id_reg.if_mode);
+ 		return -EAGAIN;
+ 	}
+ }
+@@ -422,7 +419,6 @@ static void memstick_power_on(struct memstick_host *host)
+ {
+ 	host->set_param(host, MEMSTICK_POWER, MEMSTICK_POWER_ON);
+ 	host->set_param(host, MEMSTICK_INTERFACE, MEMSTICK_SERIAL);
+-	msleep(1);
+ }
+ 
+ static void memstick_check(struct work_struct *work)
+@@ -579,7 +575,8 @@ EXPORT_SYMBOL(memstick_suspend_host);
+ void memstick_resume_host(struct memstick_host *host)
+ {
+ 	mutex_lock(&host->lock);
+-	host->set_param(host, MEMSTICK_POWER, MEMSTICK_POWER_ON);
++	if (host->card)
++		memstick_power_on(host);
+ 	mutex_unlock(&host->lock);
+ 	memstick_detect_change(host);
+ }
+diff --git a/drivers/memstick/core/mspro_block.c b/drivers/memstick/core/mspro_block.c
+index 1d637e4..557dbbb 100644
+--- a/drivers/memstick/core/mspro_block.c
++++ b/drivers/memstick/core/mspro_block.c
+@@ -133,6 +133,7 @@ struct mspro_devinfo {
+ struct mspro_block_data {
+ 	struct memstick_dev   *card;
+ 	unsigned int          usage_count;
++	unsigned int          caps;
+ 	struct gendisk        *disk;
+ 	struct request_queue  *queue;
+ 	spinlock_t            q_lock;
+@@ -577,7 +578,6 @@ static int h_mspro_block_wait_for_ced(struct memstick_dev *card,
+ static int h_mspro_block_transfer_data(struct memstick_dev *card,
+ 				       struct memstick_request **mrq)
+ {
+-	struct memstick_host *host = card->host;
+ 	struct mspro_block_data *msb = memstick_get_drvdata(card);
+ 	unsigned char t_val = 0;
+ 	struct scatterlist t_sg = { 0 };
+@@ -591,12 +591,12 @@ static int h_mspro_block_transfer_data(struct memstick_dev *card,
+ 	switch ((*mrq)->tpc) {
+ 	case MS_TPC_WRITE_REG:
+ 		memstick_init_req(*mrq, MS_TPC_SET_CMD, &msb->transfer_cmd, 1);
+-		(*mrq)->get_int_reg = 1;
++		(*mrq)->need_card_int = 1;
+ 		return 0;
+ 	case MS_TPC_SET_CMD:
+ 		t_val = (*mrq)->int_reg;
+ 		memstick_init_req(*mrq, MS_TPC_GET_INT, NULL, 1);
+-		if (host->caps & MEMSTICK_CAP_AUTO_GET_INT)
++		if (msb->caps & MEMSTICK_CAP_AUTO_GET_INT)
+ 			goto has_int_reg;
+ 		return 0;
+ 	case MS_TPC_GET_INT:
+@@ -646,12 +646,12 @@ has_int_reg:
+ 					   ? MS_TPC_READ_LONG_DATA
+ 					   : MS_TPC_WRITE_LONG_DATA,
+ 				     &t_sg);
+-		(*mrq)->get_int_reg = 1;
++		(*mrq)->need_card_int = 1;
+ 		return 0;
+ 	case MS_TPC_READ_LONG_DATA:
+ 	case MS_TPC_WRITE_LONG_DATA:
+ 		msb->current_page++;
+-		if (host->caps & MEMSTICK_CAP_AUTO_GET_INT) {
++		if (msb->caps & MEMSTICK_CAP_AUTO_GET_INT) {
+ 			t_val = (*mrq)->int_reg;
+ 			goto has_int_reg;
+ 		} else {
+@@ -816,12 +816,13 @@ static int mspro_block_wait_for_ced(struct memstick_dev *card)
+ 	return card->current_mrq.error;
+ }
+ 
+-static int mspro_block_switch_to_parallel(struct memstick_dev *card)
++static int mspro_block_set_interface(struct memstick_dev *card,
++				     unsigned char sys_reg)
+ {
+ 	struct memstick_host *host = card->host;
+ 	struct mspro_block_data *msb = memstick_get_drvdata(card);
+ 	struct mspro_param_register param = {
+-		.system = MEMSTICK_SYS_PAR4,
++		.system = sys_reg,
+ 		.data_count = 0,
+ 		.data_address = 0,
+ 		.tpc_param = 0
+@@ -833,41 +834,70 @@ static int mspro_block_switch_to_parallel(struct memstick_dev *card)
+ 			  sizeof(param));
+ 	memstick_new_req(host);
+ 	wait_for_completion(&card->mrq_complete);
+-	if (card->current_mrq.error)
+-		return card->current_mrq.error;
++	return card->current_mrq.error;
++}
++
++static int mspro_block_switch_interface(struct memstick_dev *card)
++{
++	struct memstick_host *host = card->host;
++	struct mspro_block_data *msb = memstick_get_drvdata(card);
++	int rc = 0;
++
++	if (msb->caps & MEMSTICK_CAP_PAR4)
++		rc = mspro_block_set_interface(card, MEMSTICK_SYS_PAR4);
++	else
++		return 0;
++
++	if (rc) {
++		printk(KERN_WARNING
++		       "%s: could not switch to 4-bit mode, error %d\n",
++		       card->dev.bus_id, rc);
++		return 0;
++	}
+ 
+ 	msb->system = MEMSTICK_SYS_PAR4;
+ 	host->set_param(host, MEMSTICK_INTERFACE, MEMSTICK_PAR4);
++	printk(KERN_INFO "%s: switching to 4-bit parallel mode\n",
++	       card->dev.bus_id);
++
++	if (msb->caps & MEMSTICK_CAP_PAR8) {
++		rc = mspro_block_set_interface(card, MEMSTICK_SYS_PAR8);
++
++		if (!rc) {
++			msb->system = MEMSTICK_SYS_PAR8;
++			host->set_param(host, MEMSTICK_INTERFACE,
++					MEMSTICK_PAR8);
++			printk(KERN_INFO
++			       "%s: switching to 8-bit parallel mode\n",
++			       card->dev.bus_id);
++		} else
++			printk(KERN_WARNING
++			       "%s: could not switch to 8-bit mode, error %d\n",
++			       card->dev.bus_id, rc);
++	}
+ 
+ 	card->next_request = h_mspro_block_req_init;
+ 	msb->mrq_handler = h_mspro_block_default;
+ 	memstick_init_req(&card->current_mrq, MS_TPC_GET_INT, NULL, 1);
+ 	memstick_new_req(card->host);
+ 	wait_for_completion(&card->mrq_complete);
++	rc = card->current_mrq.error;
+ 
+-	if (card->current_mrq.error) {
++	if (rc) {
++		printk(KERN_WARNING
++		       "%s: interface error, trying to fall back to serial\n",
++		       card->dev.bus_id);
+ 		msb->system = MEMSTICK_SYS_SERIAL;
+ 		host->set_param(host, MEMSTICK_POWER, MEMSTICK_POWER_OFF);
+-		msleep(1000);
++		msleep(10);
+ 		host->set_param(host, MEMSTICK_POWER, MEMSTICK_POWER_ON);
+ 		host->set_param(host, MEMSTICK_INTERFACE, MEMSTICK_SERIAL);
+ 
+-		if (memstick_set_rw_addr(card))
+-			return card->current_mrq.error;
+-
+-		param.system = msb->system;
+-
+-		card->next_request = h_mspro_block_req_init;
+-		msb->mrq_handler = h_mspro_block_default;
+-		memstick_init_req(&card->current_mrq, MS_TPC_WRITE_REG, &param,
+-				  sizeof(param));
+-		memstick_new_req(host);
+-		wait_for_completion(&card->mrq_complete);
+-
+-		return -EFAULT;
++		rc = memstick_set_rw_addr(card);
++		if (!rc)
++			rc = mspro_block_set_interface(card, msb->system);
+ 	}
+-
+-	return 0;
++	return rc;
+ }
+ 
+ /* Memory allocated for attributes by this function should be freed by
+@@ -1052,16 +1082,18 @@ static int mspro_block_init_card(struct memstick_dev *card)
+ 	if (memstick_set_rw_addr(card))
+ 		return -EIO;
+ 
+-	if (host->caps & MEMSTICK_CAP_PAR4) {
+-		if (mspro_block_switch_to_parallel(card))
+-			printk(KERN_WARNING "%s: could not switch to "
+-			       "parallel interface\n", card->dev.bus_id);
+-	}
++	msb->caps = host->caps;
++	rc = mspro_block_switch_interface(card);
++	if (rc)
++		return rc;
+ 
++	msleep(200);
+ 	rc = mspro_block_wait_for_ced(card);
+ 	if (rc)
+ 		return rc;
+ 	dev_dbg(&card->dev, "card activated\n");
++	if (msb->system != MEMSTICK_SYS_SERIAL)
++		msb->caps |= MEMSTICK_CAP_AUTO_GET_INT;
+ 
+ 	card->next_request = h_mspro_block_req_init;
+ 	msb->mrq_handler = h_mspro_block_get_ro;
+diff --git a/drivers/memstick/host/jmb38x_ms.c b/drivers/memstick/host/jmb38x_ms.c
+index 03fe878..8770a5f 100644
+--- a/drivers/memstick/host/jmb38x_ms.c
++++ b/drivers/memstick/host/jmb38x_ms.c
+@@ -12,6 +12,7 @@
+ #include <linux/spinlock.h>
+ #include <linux/interrupt.h>
+ #include <linux/pci.h>
++#include <linux/dma-mapping.h>
+ #include <linux/delay.h>
+ #include <linux/highmem.h>
+ #include <linux/memstick.h>
+@@ -56,8 +57,6 @@ struct jmb38x_ms_host {
+ 	unsigned long           timeout_jiffies;
+ 	struct timer_list       timer;
+ 	struct memstick_request *req;
+-	unsigned char           eject:1,
+-				use_dma:1;
+ 	unsigned char           cmd_flags;
+ 	unsigned char           io_pos;
+ 	unsigned int            io_word[2];
+@@ -94,9 +93,22 @@ struct jmb38x_ms {
+ #define HOST_CONTROL_IF_PAR4   0x1
+ #define HOST_CONTROL_IF_PAR8   0x3
+ 
++#define STATUS_BUSY             0x00080000
++#define STATUS_MS_DAT7          0x00040000
++#define STATUS_MS_DAT6          0x00020000
++#define STATUS_MS_DAT5          0x00010000
++#define STATUS_MS_DAT4          0x00008000
++#define STATUS_MS_DAT3          0x00004000
++#define STATUS_MS_DAT2          0x00002000
++#define STATUS_MS_DAT1          0x00001000
++#define STATUS_MS_DAT0          0x00000800
+ #define STATUS_HAS_MEDIA        0x00000400
+ #define STATUS_FIFO_EMPTY       0x00000200
+ #define STATUS_FIFO_FULL        0x00000100
++#define STATUS_MS_CED           0x00000080
++#define STATUS_MS_ERR           0x00000040
++#define STATUS_MS_BRQ           0x00000020
++#define STATUS_MS_CNK           0x00000001
+ 
+ #define INT_STATUS_TPC_ERR      0x00080000
+ #define INT_STATUS_CRC_ERR      0x00040000
+@@ -119,11 +131,17 @@ struct jmb38x_ms {
+ #define PAD_PU_PD_ON_MS_SOCK0 0x5f8f0000
+ #define PAD_PU_PD_ON_MS_SOCK1 0x0f0f0000
+ 
++#define CLOCK_CONTROL_40MHZ   0x00000001
++#define CLOCK_CONTROL_50MHZ   0x00000002
++#define CLOCK_CONTROL_60MHZ   0x00000008
++#define CLOCK_CONTROL_62_5MHZ 0x0000000c
++#define CLOCK_CONTROL_OFF     0x00000000
++
+ enum {
+ 	CMD_READY    = 0x01,
+ 	FIFO_READY   = 0x02,
+ 	REG_DATA     = 0x04,
+-	AUTO_GET_INT = 0x08
++	DMA_DATA     = 0x08
+ };
+ 
+ static unsigned int jmb38x_ms_read_data(struct jmb38x_ms_host *host,
+@@ -273,7 +291,7 @@ static int jmb38x_ms_transfer_data(struct jmb38x_ms_host *host)
+ {
+ 	unsigned int length;
+ 	unsigned int off;
+-	unsigned int t_size, p_off, p_cnt;
++	unsigned int t_size, p_cnt;
+ 	unsigned char *buf;
+ 	struct page *pg;
+ 	unsigned long flags = 0;
+@@ -287,6 +305,8 @@ static int jmb38x_ms_transfer_data(struct jmb38x_ms_host *host)
+ 	}
+ 
+ 	while (length) {
++		unsigned int uninitialized_var(p_off);
++
+ 		if (host->req->long_data) {
+ 			pg = nth_page(sg_page(&host->req->sg),
+ 				      off >> PAGE_SHIFT);
+@@ -364,28 +384,27 @@ static int jmb38x_ms_issue_cmd(struct memstick_host *msh)
+ 		cmd |= TPC_DIR;
+ 	if (host->req->need_card_int)
+ 		cmd |= TPC_WAIT_INT;
+-	if (host->req->get_int_reg)
+-		cmd |= TPC_GET_INT;
+ 
+ 	data = host->req->data;
+ 
+-	host->use_dma = !no_dma;
++	if (!no_dma)
++		host->cmd_flags |= DMA_DATA;
+ 
+ 	if (host->req->long_data) {
+ 		data_len = host->req->sg.length;
+ 	} else {
+ 		data_len = host->req->data_len;
+-		host->use_dma = 0;
++		host->cmd_flags &= ~DMA_DATA;
+ 	}
+ 
+ 	if (data_len <= 8) {
+ 		cmd &= ~(TPC_DATA_SEL | 0xf);
+ 		host->cmd_flags |= REG_DATA;
+ 		cmd |= data_len & 0xf;
+-		host->use_dma = 0;
++		host->cmd_flags &= ~DMA_DATA;
+ 	}
+ 
+-	if (host->use_dma) {
++	if (host->cmd_flags & DMA_DATA) {
+ 		if (1 != pci_map_sg(host->chip->pdev, &host->req->sg, 1,
+ 				    host->req->data_dir == READ
+ 				    ? PCI_DMA_FROMDEVICE
+@@ -448,13 +467,12 @@ static void jmb38x_ms_complete_cmd(struct memstick_host *msh, int last)
+ 		readl(host->addr + INT_STATUS));
+ 	dev_dbg(msh->cdev.dev, "c hstatus %08x\n", readl(host->addr + STATUS));
+ 
+-	if (host->req->get_int_reg) {
+-		t_val = readl(host->addr + TPC_P0);
+-		host->req->int_reg = (t_val & 0xff);
+-	}
++	host->req->int_reg = readl(host->addr + STATUS) & 0xff;
++
++	writel(0, host->addr + BLOCK);
++	writel(0, host->addr + DMA_CONTROL);
+ 
+-	if (host->use_dma) {
+-		writel(0, host->addr + DMA_CONTROL);
++	if (host->cmd_flags & DMA_DATA) {
+ 		pci_unmap_sg(host->chip->pdev, &host->req->sg, 1,
+ 			     host->req->data_dir == READ
+ 			     ? PCI_DMA_FROMDEVICE : PCI_DMA_TODEVICE);
+@@ -506,7 +524,7 @@ static irqreturn_t jmb38x_ms_isr(int irq, void *dev_id)
+ 			else
+ 				host->req->error = -ETIME;
+ 		} else {
+-			if (host->use_dma) {
++			if (host->cmd_flags & DMA_DATA) {
+ 				if (irq_status & INT_STATUS_EOTRAN)
+ 					host->cmd_flags |= FIFO_READY;
+ 			} else {
+@@ -595,19 +613,18 @@ static void jmb38x_ms_reset(struct jmb38x_ms_host *host)
+ {
+ 	unsigned int host_ctl = readl(host->addr + HOST_CONTROL);
+ 
+-	writel(host_ctl | HOST_CONTROL_RESET_REQ | HOST_CONTROL_RESET,
+-	       host->addr + HOST_CONTROL);
++	writel(HOST_CONTROL_RESET_REQ, host->addr + HOST_CONTROL);
+ 
+ 	while (HOST_CONTROL_RESET_REQ
+ 	       & (host_ctl = readl(host->addr + HOST_CONTROL))) {
+-		ndelay(100);
+-		dev_dbg(&host->chip->pdev->dev, "reset\n");
++		ndelay(20);
++		dev_dbg(&host->chip->pdev->dev, "reset %08x\n", host_ctl);
+ 	}
+ 
+-	writel(INT_STATUS_ALL, host->addr + INT_STATUS_ENABLE);
++	writel(HOST_CONTROL_RESET, host->addr + HOST_CONTROL);
++	mmiowb();
+ 	writel(INT_STATUS_ALL, host->addr + INT_SIGNAL_ENABLE);
+-
+-	dev_dbg(&host->chip->pdev->dev, "reset\n");
++	writel(INT_STATUS_ALL, host->addr + INT_STATUS_ENABLE);
+ }
+ 
+ static void jmb38x_ms_set_param(struct memstick_host *msh,
+@@ -615,10 +632,8 @@ static void jmb38x_ms_set_param(struct memstick_host *msh,
+ 				int value)
+ {
+ 	struct jmb38x_ms_host *host = memstick_priv(msh);
+-	unsigned int host_ctl;
+-	unsigned long flags;
+-
+-	spin_lock_irqsave(&host->lock, flags);
++	unsigned int host_ctl = readl(host->addr + HOST_CONTROL);
++	unsigned int clock_ctl = CLOCK_CONTROL_40MHZ, clock_delay = 0;
+ 
+ 	switch (param) {
+ 	case MEMSTICK_POWER:
+@@ -626,60 +641,57 @@ static void jmb38x_ms_set_param(struct memstick_host *msh,
+ 			jmb38x_ms_reset(host);
+ 
+ 			writel(host->id ? PAD_PU_PD_ON_MS_SOCK1
+-					  : PAD_PU_PD_ON_MS_SOCK0,
++					: PAD_PU_PD_ON_MS_SOCK0,
+ 			       host->addr + PAD_PU_PD);
+ 
+ 			writel(PAD_OUTPUT_ENABLE_MS,
+ 			       host->addr + PAD_OUTPUT_ENABLE);
+ 
+-			host_ctl = readl(host->addr + HOST_CONTROL);
+-			host_ctl |= 7;
+-			writel(host_ctl | (HOST_CONTROL_POWER_EN
+-					   | HOST_CONTROL_CLOCK_EN),
+-			       host->addr + HOST_CONTROL);
++			host_ctl = 7;
++			host_ctl |= HOST_CONTROL_POWER_EN
++				 | HOST_CONTROL_CLOCK_EN;
++			writel(host_ctl, host->addr + HOST_CONTROL);
+ 
+ 			dev_dbg(&host->chip->pdev->dev, "power on\n");
+ 		} else if (value == MEMSTICK_POWER_OFF) {
+-			writel(readl(host->addr + HOST_CONTROL)
+-			       & ~(HOST_CONTROL_POWER_EN
+-				   | HOST_CONTROL_CLOCK_EN),
+-			       host->addr +  HOST_CONTROL);
++			host_ctl &= ~(HOST_CONTROL_POWER_EN
++				      | HOST_CONTROL_CLOCK_EN);
++			writel(host_ctl, host->addr +  HOST_CONTROL);
+ 			writel(0, host->addr + PAD_OUTPUT_ENABLE);
+ 			writel(PAD_PU_PD_OFF, host->addr + PAD_PU_PD);
+ 			dev_dbg(&host->chip->pdev->dev, "power off\n");
+ 		}
+ 		break;
+ 	case MEMSTICK_INTERFACE:
+-		/* jmb38x_ms_reset(host); */
+-
+-		host_ctl = readl(host->addr + HOST_CONTROL);
+ 		host_ctl &= ~(3 << HOST_CONTROL_IF_SHIFT);
+-		/* host_ctl |= 7; */
+ 
+ 		if (value == MEMSTICK_SERIAL) {
+ 			host_ctl &= ~HOST_CONTROL_FAST_CLK;
+ 			host_ctl |= HOST_CONTROL_IF_SERIAL
+ 				    << HOST_CONTROL_IF_SHIFT;
+ 			host_ctl |= HOST_CONTROL_REI;
+-			writel(0, host->addr + CLOCK_DELAY);
++			clock_ctl = CLOCK_CONTROL_40MHZ;
++			clock_delay = 0;
+ 		} else if (value == MEMSTICK_PAR4) {
+ 			host_ctl |= HOST_CONTROL_FAST_CLK;
+ 			host_ctl |= HOST_CONTROL_IF_PAR4
+ 				    << HOST_CONTROL_IF_SHIFT;
+ 			host_ctl &= ~HOST_CONTROL_REI;
+-			writel(4, host->addr + CLOCK_DELAY);
++			clock_ctl = CLOCK_CONTROL_40MHZ;
++			clock_delay = 4;
+ 		} else if (value == MEMSTICK_PAR8) {
+ 			host_ctl |= HOST_CONTROL_FAST_CLK;
+ 			host_ctl |= HOST_CONTROL_IF_PAR8
+ 				    << HOST_CONTROL_IF_SHIFT;
+ 			host_ctl &= ~HOST_CONTROL_REI;
+-			writel(4, host->addr + CLOCK_DELAY);
++			clock_ctl = CLOCK_CONTROL_60MHZ;
++			clock_delay = 0;
+ 		}
+ 		writel(host_ctl, host->addr + HOST_CONTROL);
++		writel(clock_ctl, host->addr + CLOCK_CONTROL);
++		writel(clock_delay, host->addr + CLOCK_DELAY);
+ 		break;
+ 	};
+-
+-	spin_unlock_irqrestore(&host->lock, flags);
+ }
+ 
+ #ifdef CONFIG_PM
+@@ -772,13 +784,10 @@ static struct memstick_host *jmb38x_ms_alloc_host(struct jmb38x_ms *jm, int cnt)
+ 	snprintf(host->host_id, DEVICE_ID_SIZE, DRIVER_NAME ":slot%d",
+ 		 host->id);
+ 	host->irq = jm->pdev->irq;
+-	host->timeout_jiffies = msecs_to_jiffies(4000);
++	host->timeout_jiffies = msecs_to_jiffies(1000);
+ 	msh->request = jmb38x_ms_request;
+ 	msh->set_param = jmb38x_ms_set_param;
+-	/*
+-	msh->caps = MEMSTICK_CAP_AUTO_GET_INT | MEMSTICK_CAP_PAR4
+-		    | MEMSTICK_CAP_PAR8;
+-	*/
++
+ 	msh->caps = MEMSTICK_CAP_PAR4 | MEMSTICK_CAP_PAR8;
+ 
+ 	setup_timer(&host->timer, jmb38x_ms_abort, (unsigned long)msh);
+diff --git a/drivers/memstick/host/tifm_ms.c b/drivers/memstick/host/tifm_ms.c
+index 2b5bf52..eb150df 100644
+--- a/drivers/memstick/host/tifm_ms.c
++++ b/drivers/memstick/host/tifm_ms.c
+@@ -340,11 +340,20 @@ static void tifm_ms_complete_cmd(struct tifm_ms *host)
+ 
+ 	del_timer(&host->timer);
+ 
+-	if (host->use_dma)
++	host->req->int_reg = readl(sock->addr + SOCK_MS_STATUS) & 0xff;
++	host->req->int_reg = (host->req->int_reg & 1)
++			     | ((host->req->int_reg << 4) & 0xe0);
++
++	writel(TIFM_FIFO_INT_SETALL,
++	       sock->addr + SOCK_DMA_FIFO_INT_ENABLE_CLEAR);
++	writel(TIFM_DMA_RESET, sock->addr + SOCK_DMA_CONTROL);
++
++	if (host->use_dma) {
+ 		tifm_unmap_sg(sock, &host->req->sg, 1,
+ 			      host->req->data_dir == READ
+ 			      ? PCI_DMA_FROMDEVICE
+ 			      : PCI_DMA_TODEVICE);
++	}
+ 
+ 	writel((~TIFM_CTRL_LED) & readl(sock->addr + SOCK_CONTROL),
+ 	       sock->addr + SOCK_CONTROL);
+@@ -424,12 +433,6 @@ static void tifm_ms_card_event(struct tifm_dev *sock)
+ 		else if (host_status & TIFM_MS_STAT_CRC)
+ 			host->req->error = -EILSEQ;
+ 
+-		if (host->req->error) {
+-			writel(TIFM_FIFO_INT_SETALL,
+-			       sock->addr + SOCK_DMA_FIFO_INT_ENABLE_CLEAR);
+-			writel(TIFM_DMA_RESET, sock->addr + SOCK_DMA_CONTROL);
+-		}
+-
+ 		if (host_status & TIFM_MS_STAT_RDY)
+ 			host->cmd_flags |= CMD_READY;
+ 
+diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
+index 19fd4cb..b58472c 100644
+--- a/drivers/net/virtio_net.c
++++ b/drivers/net/virtio_net.c
+@@ -203,8 +203,11 @@ again:
+ 	if (received < budget) {
+ 		netif_rx_complete(vi->dev, napi);
+ 		if (unlikely(!vi->rvq->vq_ops->enable_cb(vi->rvq))
+-		    && netif_rx_reschedule(vi->dev, napi))
++		    && napi_schedule_prep(napi)) {
++			vi->rvq->vq_ops->disable_cb(vi->rvq);
++			__netif_rx_schedule(vi->dev, napi);
+ 			goto again;
++		}
+ 	}
+ 
+ 	return received;
+@@ -278,10 +281,11 @@ again:
+ 		pr_debug("%s: virtio not prepared to send\n", dev->name);
+ 		netif_stop_queue(dev);
+ 
+-		/* Activate callback for using skbs: if this fails it
++		/* Activate callback for using skbs: if this returns false it
+ 		 * means some were used in the meantime. */
+ 		if (unlikely(!vi->svq->vq_ops->enable_cb(vi->svq))) {
+-			printk("Unlikely: restart svq failed\n");
++			printk("Unlikely: restart svq race\n");
++			vi->svq->vq_ops->disable_cb(vi->svq);
+ 			netif_start_queue(dev);
+ 			goto again;
+ 		}
+@@ -294,6 +298,15 @@ again:
+ 	return 0;
+ }
+ 
++#ifdef CONFIG_NET_POLL_CONTROLLER
++static void virtnet_netpoll(struct net_device *dev)
++{
++	struct virtnet_info *vi = netdev_priv(dev);
++
++	napi_schedule(&vi->napi);
++}
++#endif
++
+ static int virtnet_open(struct net_device *dev)
+ {
+ 	struct virtnet_info *vi = netdev_priv(dev);
+@@ -336,6 +349,9 @@ static int virtnet_probe(struct virtio_device *vdev)
+ 	dev->stop = virtnet_close;
+ 	dev->hard_start_xmit = start_xmit;
+ 	dev->features = NETIF_F_HIGHDMA;
++#ifdef CONFIG_NET_POLL_CONTROLLER
++	dev->poll_controller = virtnet_netpoll;
++#endif
+ 	SET_NETDEV_DEV(dev, &vdev->dev);
+ 
+ 	/* Do we support "hardware" checksums? */
+diff --git a/drivers/pci/hotplug/pciehp_core.c b/drivers/pci/hotplug/pciehp_core.c
+index 7f4836b..5fa4ba0 100644
+--- a/drivers/pci/hotplug/pciehp_core.c
++++ b/drivers/pci/hotplug/pciehp_core.c
+@@ -467,7 +467,7 @@ static int pciehp_probe(struct pcie_device *dev, const struct pcie_port_service_
+ 	t_slot = pciehp_find_slot(ctrl, ctrl->slot_device_offset);
+ 
+ 	t_slot->hpc_ops->get_adapter_status(t_slot, &value); /* Check if slot is occupied */
+-	if (value) {
++	if (value && pciehp_force) {
+ 		rc = pciehp_enable_slot(t_slot);
+ 		if (rc)	/* -ENODEV: shouldn't happen, but deal with it */
+ 			value = 0;
+diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig
+index 82f5ad9..9e7de63 100644
+--- a/drivers/rtc/Kconfig
++++ b/drivers/rtc/Kconfig
+@@ -16,7 +16,7 @@ menuconfig RTC_CLASS
+ 	  probably want to enable one or more of the interfaces below.
+ 
+ 	  This driver can also be built as a module. If so, the module
+-	  will be called rtc-class.
++	  will be called rtc-core.
+ 
+ if RTC_CLASS
+ 
+diff --git a/drivers/rtc/rtc-at91sam9.c b/drivers/rtc/rtc-at91sam9.c
+index bbf10ec..56728a2 100644
+--- a/drivers/rtc/rtc-at91sam9.c
++++ b/drivers/rtc/rtc-at91sam9.c
+@@ -274,7 +274,7 @@ static irqreturn_t at91_rtc_interrupt(int irq, void *_rtc)
+ 	 * SR clears it, so we must only read it in this irq handler!
+ 	 */
+ 	mr = rtt_readl(rtc, MR) & (AT91_RTT_ALMIEN | AT91_RTT_RTTINCIEN);
+-	sr = rtt_readl(rtc, SR) & mr;
++	sr = rtt_readl(rtc, SR) & (mr >> 16);
+ 	if (!sr)
+ 		return IRQ_NONE;
+ 
+@@ -321,6 +321,10 @@ static int __init at91_rtc_probe(struct platform_device *pdev)
+ 	if (!rtc)
+ 		return -ENOMEM;
+ 
++	/* platform setup code should have handled this; sigh */
++	if (!device_can_wakeup(&pdev->dev))
++		device_init_wakeup(&pdev->dev, 1);
++
+ 	platform_set_drvdata(pdev, rtc);
+ 	rtc->rtt = (void __force __iomem *) (AT91_VA_BASE_SYS - AT91_BASE_SYS);
+ 	rtc->rtt += r->start;
+diff --git a/drivers/thermal/Kconfig b/drivers/thermal/Kconfig
+index 3ab313e..17e71d5 100644
+--- a/drivers/thermal/Kconfig
++++ b/drivers/thermal/Kconfig
+@@ -4,8 +4,6 @@
+ 
+ menuconfig THERMAL
+ 	bool "Generic Thermal sysfs driver"
+-	select HWMON
+-	default y
+ 	help
+ 	  Generic Thermal Sysfs driver offers a generic mechanism for
+ 	  thermal management. Usually it's made up of one or more thermal
+diff --git a/drivers/thermal/thermal.c b/drivers/thermal/thermal.c
+index 41bd4c8..8b86e53 100644
+--- a/drivers/thermal/thermal.c
++++ b/drivers/thermal/thermal.c
+@@ -30,10 +30,8 @@
+ #include <linux/idr.h>
+ #include <linux/thermal.h>
+ #include <linux/spinlock.h>
+-#include <linux/hwmon.h>
+-#include <linux/hwmon-sysfs.h>
+ 
+-MODULE_AUTHOR("Zhang Rui");
++MODULE_AUTHOR("Zhang Rui")
+ MODULE_DESCRIPTION("Generic thermal management sysfs support");
+ MODULE_LICENSE("GPL");
+ 
+@@ -58,9 +56,6 @@ static LIST_HEAD(thermal_tz_list);
+ static LIST_HEAD(thermal_cdev_list);
+ static DEFINE_MUTEX(thermal_list_lock);
+ 
+-static struct device *thermal_hwmon;
+-#define MAX_THERMAL_ZONES	10
+-
+ static int get_idr(struct idr *idr, struct mutex *lock, int *id)
+ {
+ 	int err;
+@@ -92,67 +87,7 @@ static void release_idr(struct idr *idr, struct mutex *lock, int id)
+ 		mutex_unlock(lock);
+ }
+ 
+-/* hwmon sys I/F*/
+-static ssize_t
+-name_show(struct device *dev, struct device_attribute *attr, char *buf)
+-{
+-	return sprintf(buf, "thermal_sys_class\n");
+-}
+-
+-static ssize_t
+-temp_input_show(struct device *dev, struct device_attribute *attr, char *buf)
+-{
+-	struct thermal_zone_device *tz;
+-	struct sensor_device_attribute *sensor_attr
+-						= to_sensor_dev_attr(attr);
+-
+-	list_for_each_entry(tz, &thermal_tz_list, node)
+-		if (tz->id == sensor_attr->index)
+-			return tz->ops->get_temp(tz, buf);
+-
+-	return -ENODEV;
+-}
+-
+-static ssize_t
+-temp_crit_show(struct device *dev, struct device_attribute *attr,
+-		char *buf)
+-{
+-	struct thermal_zone_device *tz;
+-	struct sensor_device_attribute *sensor_attr
+-						= to_sensor_dev_attr(attr);
+-
+-	list_for_each_entry(tz, &thermal_tz_list, node)
+-		if (tz->id == sensor_attr->index)
+-			return tz->ops->get_trip_temp(tz, 0, buf);
+-
+-	return -ENODEV;
+-}
+-
+-static DEVICE_ATTR(name, 0444, name_show, NULL);
+-static struct sensor_device_attribute sensor_attrs[] = {
+-	SENSOR_ATTR(temp1_input, 0444, temp_input_show, NULL, 0),
+-	SENSOR_ATTR(temp1_crit, 0444, temp_crit_show, NULL, 0),
+-	SENSOR_ATTR(temp2_input, 0444, temp_input_show, NULL, 1),
+-	SENSOR_ATTR(temp2_crit, 0444, temp_crit_show, NULL, 1),
+-	SENSOR_ATTR(temp3_input, 0444, temp_input_show, NULL, 2),
+-	SENSOR_ATTR(temp3_crit, 0444, temp_crit_show, NULL, 2),
+-	SENSOR_ATTR(temp4_input, 0444, temp_input_show, NULL, 3),
+-	SENSOR_ATTR(temp4_crit, 0444, temp_crit_show, NULL, 3),
+-	SENSOR_ATTR(temp5_input, 0444, temp_input_show, NULL, 4),
+-	SENSOR_ATTR(temp5_crit, 0444, temp_crit_show, NULL, 4),
+-	SENSOR_ATTR(temp6_input, 0444, temp_input_show, NULL, 5),
+-	SENSOR_ATTR(temp6_crit, 0444, temp_crit_show, NULL, 5),
+-	SENSOR_ATTR(temp7_input, 0444, temp_input_show, NULL, 6),
+-	SENSOR_ATTR(temp7_crit, 0444, temp_crit_show, NULL, 6),
+-	SENSOR_ATTR(temp8_input, 0444, temp_input_show, NULL, 7),
+-	SENSOR_ATTR(temp8_crit, 0444, temp_crit_show, NULL, 7),
+-	SENSOR_ATTR(temp9_input, 0444, temp_input_show, NULL, 8),
+-	SENSOR_ATTR(temp9_crit, 0444, temp_crit_show, NULL, 8),
+-	SENSOR_ATTR(temp10_input, 0444, temp_input_show, NULL, 9),
+-	SENSOR_ATTR(temp10_crit, 0444, temp_crit_show, NULL, 9),
+-};
+-
+-/* thermal zone sys I/F */
++/* sys I/F for thermal zone */
+ 
+ #define to_thermal_zone(_dev) \
+ 	container_of(_dev, struct thermal_zone_device, device)
+@@ -279,7 +214,7 @@ do {	\
+ 	device_remove_file(_dev, &trip_point_attrs[_index * 2 + 1]);	\
+ } while (0)
+ 
+-/* cooling device sys I/F */
++/* sys I/F for cooling device */
+ #define to_cooling_device(_dev)	\
+ 	container_of(_dev, struct thermal_cooling_device, device)
+ 
+@@ -512,9 +447,6 @@ struct thermal_cooling_device *thermal_cooling_device_register(char *type,
+ 	struct thermal_zone_device *pos;
+ 	int result;
+ 
+-	if (!type)
+-		return ERR_PTR(-EINVAL);
+-
+ 	if (strlen(type) >= THERMAL_NAME_LENGTH)
+ 		return ERR_PTR(-EINVAL);
+ 
+@@ -545,9 +477,11 @@ struct thermal_cooling_device *thermal_cooling_device_register(char *type,
+ 	}
+ 
+ 	/* sys I/F */
+-	result = device_create_file(&cdev->device, &dev_attr_cdev_type);
+-	if (result)
+-		goto unregister;
++	if (type) {
++		result = device_create_file(&cdev->device, &dev_attr_cdev_type);
++		if (result)
++			goto unregister;
++	}
+ 
+ 	result = device_create_file(&cdev->device, &dev_attr_max_state);
+ 	if (result)
+@@ -613,8 +547,8 @@ void thermal_cooling_device_unregister(struct
+ 		tz->ops->unbind(tz, cdev);
+ 	}
+ 	mutex_unlock(&thermal_list_lock);
+-
+-	device_remove_file(&cdev->device, &dev_attr_cdev_type);
++	if (cdev->type[0])
++		device_remove_file(&cdev->device, &dev_attr_cdev_type);
+ 	device_remove_file(&cdev->device, &dev_attr_max_state);
+ 	device_remove_file(&cdev->device, &dev_attr_cur_state);
+ 
+@@ -646,9 +580,6 @@ struct thermal_zone_device *thermal_zone_device_register(char *type,
+ 	int result;
+ 	int count;
+ 
+-	if (!type)
+-		return ERR_PTR(-EINVAL);
+-
+ 	if (strlen(type) >= THERMAL_NAME_LENGTH)
+ 		return ERR_PTR(-EINVAL);
+ 
+@@ -670,13 +601,6 @@ struct thermal_zone_device *thermal_zone_device_register(char *type,
+ 		kfree(tz);
+ 		return ERR_PTR(result);
+ 	}
+-	if (tz->id >= MAX_THERMAL_ZONES) {
+-		printk(KERN_ERR PREFIX
+-			"Too many thermal zones\n");
+-		release_idr(&thermal_tz_idr, &thermal_idr_lock, tz->id);
+-		kfree(tz);
+-		return ERR_PTR(-EINVAL);
+-	}
+ 
+ 	strcpy(tz->type, type);
+ 	tz->ops = ops;
+@@ -691,27 +615,12 @@ struct thermal_zone_device *thermal_zone_device_register(char *type,
+ 		return ERR_PTR(result);
+ 	}
+ 
+-	/* hwmon sys I/F */
+-	result = device_create_file(thermal_hwmon,
+-					&sensor_attrs[tz->id * 2].dev_attr);
+-	if (result)
+-		goto unregister;
+-
+-	if (trips > 0) {
+-		char buf[40];
+-		result = tz->ops->get_trip_type(tz, 0, buf);
+-		if (result > 0 && !strcmp(buf, "critical\n")) {
+-			result = device_create_file(thermal_hwmon,
+-					&sensor_attrs[tz->id * 2 + 1].dev_attr);
+-			if (result)
+-				goto unregister;
+-		}
+-	}
+-
+ 	/* sys I/F */
+-	result = device_create_file(&tz->device, &dev_attr_type);
+-	if (result)
+-		goto unregister;
++	if (type) {
++		result = device_create_file(&tz->device, &dev_attr_type);
++		if (result)
++			goto unregister;
++	}
+ 
+ 	result = device_create_file(&tz->device, &dev_attr_temp);
+ 	if (result)
+@@ -778,17 +687,8 @@ void thermal_zone_device_unregister(struct thermal_zone_device *tz)
+ 		    tz->ops->unbind(tz, cdev);
+ 	mutex_unlock(&thermal_list_lock);
+ 
+-	device_remove_file(thermal_hwmon,
+-				&sensor_attrs[tz->id * 2].dev_attr);
+-	if (tz->trips > 0) {
+-		char buf[40];
+-		if (tz->ops->get_trip_type(tz, 0, buf) > 0)
+-			if (!strcmp(buf, "critical\n"))
+-				device_remove_file(thermal_hwmon,
+-				&sensor_attrs[tz->id * 2 + 1].dev_attr);
+-	}
+-
+-	device_remove_file(&tz->device, &dev_attr_type);
++	if (tz->type[0])
++		device_remove_file(&tz->device, &dev_attr_type);
+ 	device_remove_file(&tz->device, &dev_attr_temp);
+ 	if (tz->ops->get_mode)
+ 		device_remove_file(&tz->device, &dev_attr_mode);
+@@ -805,19 +705,6 @@ void thermal_zone_device_unregister(struct thermal_zone_device *tz)
+ 
+ EXPORT_SYMBOL(thermal_zone_device_unregister);
+ 
+-static void thermal_exit(void)
+-{
+-	if (thermal_hwmon) {
+-		device_remove_file(thermal_hwmon, &dev_attr_name);
+-		hwmon_device_unregister(thermal_hwmon);
+-	}
+-	class_unregister(&thermal_class);
+-	idr_destroy(&thermal_tz_idr);
+-	idr_destroy(&thermal_cdev_idr);
+-	mutex_destroy(&thermal_idr_lock);
+-	mutex_destroy(&thermal_list_lock);
+-}
+-
+ static int __init thermal_init(void)
+ {
+ 	int result = 0;
+@@ -829,21 +716,17 @@ static int __init thermal_init(void)
+ 		mutex_destroy(&thermal_idr_lock);
+ 		mutex_destroy(&thermal_list_lock);
+ 	}
+-
+-	thermal_hwmon = hwmon_device_register(NULL);
+-	if (IS_ERR(thermal_hwmon)) {
+-		result = PTR_ERR(thermal_hwmon);
+-		thermal_hwmon = NULL;
+-		printk(KERN_ERR PREFIX
+-			"unable to register hwmon device\n");
+-		thermal_exit();
+-		return result;
+-	}
+-
+-	result = device_create_file(thermal_hwmon, &dev_attr_name);
+-
+ 	return result;
+ }
+ 
++static void __exit thermal_exit(void)
++{
++	class_unregister(&thermal_class);
++	idr_destroy(&thermal_tz_idr);
++	idr_destroy(&thermal_cdev_idr);
++	mutex_destroy(&thermal_idr_lock);
++	mutex_destroy(&thermal_list_lock);
++}
++
+ subsys_initcall(thermal_init);
+ module_exit(thermal_exit);
+diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig
+index e0b0580..1bd5fb3 100644
+--- a/drivers/video/Kconfig
++++ b/drivers/video/Kconfig
+@@ -1893,6 +1893,20 @@ config FB_XILINX
+ 	  framebuffer. ML300 carries a 640*480 LCD display on the board,
+ 	  ML403 uses a standard DB15 VGA connector.
+ 
++config FB_METRONOME
++       tristate "Metronome display controller support"
++       depends on FB && ARCH_PXA && MMU
++       select FB_SYS_FILLRECT
++       select FB_SYS_COPYAREA
++       select FB_SYS_IMAGEBLIT
++       select FB_SYS_FOPS
++       select FB_DEFERRED_IO
++       help
++         This enables support for the Metronome display controller. Tested
++         with an E-Ink 800x600 display and Gumstix Connex through an AMLCD
++         interface. Please read <file:Documentation/fb/metronomefb.txt>
++         for more information.
++
+ config FB_VIRTUAL
+ 	tristate "Virtual Frame Buffer support (ONLY FOR TESTING!)"
+ 	depends on FB
+diff --git a/drivers/video/Makefile b/drivers/video/Makefile
+index 03371c7..11c0e5e 100644
+--- a/drivers/video/Makefile
++++ b/drivers/video/Makefile
+@@ -103,6 +103,7 @@ obj-$(CONFIG_FB_PMAG_AA)	  += pmag-aa-fb.o
+ obj-$(CONFIG_FB_PMAG_BA)	  += pmag-ba-fb.o
+ obj-$(CONFIG_FB_PMAGB_B)	  += pmagb-b-fb.o
+ obj-$(CONFIG_FB_MAXINE)		  += maxinefb.o
++obj-$(CONFIG_FB_METRONOME)        += metronomefb.o
+ obj-$(CONFIG_FB_S1D13XXX)	  += s1d13xxxfb.o
+ obj-$(CONFIG_FB_IMX)              += imxfb.o
+ obj-$(CONFIG_FB_S3C2410)	  += s3c2410fb.o
+diff --git a/drivers/video/fb_defio.c b/drivers/video/fb_defio.c
+index 0f8cfb9..24843fd 100644
+--- a/drivers/video/fb_defio.c
++++ b/drivers/video/fb_defio.c
+@@ -4,7 +4,7 @@
+  *  Copyright (C) 2006 Jaya Kumar
+  *
+  * 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
++ * License. See the file COPYING in the main directory of this archive
+  * for more details.
+  */
+ 
+@@ -31,7 +31,7 @@ static int fb_deferred_io_fault(struct vm_area_struct *vma,
+ 	unsigned long offset;
+ 	struct page *page;
+ 	struct fb_info *info = vma->vm_private_data;
+-	/* info->screen_base is in System RAM */
++	/* info->screen_base is virtual memory */
+ 	void *screen_base = (void __force *) info->screen_base;
+ 
+ 	offset = vmf->pgoff << PAGE_SHIFT;
+@@ -43,6 +43,15 @@ static int fb_deferred_io_fault(struct vm_area_struct *vma,
+ 		return VM_FAULT_SIGBUS;
+ 
+ 	get_page(page);
++
++	if (vma->vm_file)
++		page->mapping = vma->vm_file->f_mapping;
++	else
++		printk(KERN_ERR "no mapping available\n");
++
++	BUG_ON(!page->mapping);
++	page->index = vmf->pgoff;
++
+ 	vmf->page = page;
+ 	return 0;
+ }
+@@ -138,11 +147,20 @@ EXPORT_SYMBOL_GPL(fb_deferred_io_init);
+ 
+ void fb_deferred_io_cleanup(struct fb_info *info)
+ {
++	void *screen_base = (void __force *) info->screen_base;
+ 	struct fb_deferred_io *fbdefio = info->fbdefio;
++	struct page *page;
++	int i;
+ 
+ 	BUG_ON(!fbdefio);
+ 	cancel_delayed_work(&info->deferred_work);
+ 	flush_scheduled_work();
++
++	/* clear out the mapping that we setup */
++	for (i = 0 ; i < info->fix.smem_len; i += PAGE_SIZE) {
++		page = vmalloc_to_page(screen_base + i);
++		page->mapping = NULL;
++	}
+ }
+ EXPORT_SYMBOL_GPL(fb_deferred_io_cleanup);
+ 
+diff --git a/drivers/video/i810/i810_main.c b/drivers/video/i810/i810_main.c
+index 1d13dd0..a24e680 100644
+--- a/drivers/video/i810/i810_main.c
++++ b/drivers/video/i810/i810_main.c
+@@ -1476,7 +1476,7 @@ static int i810fb_cursor(struct fb_info *info, struct fb_cursor *cursor)
+ 	struct i810fb_par *par = info->par;
+ 	u8 __iomem *mmio = par->mmio_start_virtual;
+ 
+-	if (!(par->dev_flags & LOCKUP))
++	if (par->dev_flags & LOCKUP)
+ 		return -ENXIO;
+ 
+ 	if (cursor->image.width > 64 || cursor->image.height > 64)
+diff --git a/drivers/video/metronomefb.c b/drivers/video/metronomefb.c
+new file mode 100644
+index 0000000..e9a89fd
+--- /dev/null
++++ b/drivers/video/metronomefb.c
+@@ -0,0 +1,999 @@
++/*
++ * linux/drivers/video/metronomefb.c -- FB driver for Metronome controller
++ *
++ * Copyright (C) 2008, Jaya Kumar
++ *
++ * 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 for
++ * more details.
++ *
++ * Layout is based on skeletonfb.c by James Simmons and Geert Uytterhoeven.
++ *
++ * This work was made possible by help and equipment support from E-Ink
++ * Corporation. http://support.eink.com/community
++ *
++ * This driver is written to be used with the Metronome display controller.
++ * It was tested with an E-Ink 800x600 Vizplex EPD on a Gumstix Connex board
++ * using the Lyre interface board.
++ *
++ * General notes:
++ * - User must set metronomefb_enable=1 to enable it.
++ * - See Documentation/fb/metronomefb.txt for how metronome works.
++ */
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/errno.h>
++#include <linux/string.h>
++#include <linux/mm.h>
++#include <linux/slab.h>
++#include <linux/vmalloc.h>
++#include <linux/delay.h>
++#include <linux/interrupt.h>
++#include <linux/fb.h>
++#include <linux/init.h>
++#include <linux/platform_device.h>
++#include <linux/list.h>
++#include <linux/firmware.h>
++#include <linux/dma-mapping.h>
++#include <linux/uaccess.h>
++#include <linux/irq.h>
++
++#include <asm/arch/pxa-regs.h>
++#include <asm/unaligned.h>
++
++#define DEBUG 1
++#ifdef DEBUG
++#define DPRINTK(f, a...) printk(KERN_DEBUG "%s: " f, __func__ , ## a)
++#else
++#define DPRINTK(f, a...)
++#endif
++
++
++/* Display specific information */
++#define DPY_W 832
++#define DPY_H 622
++
++struct metromem_desc {
++	u32 mFDADR0;
++	u32 mFSADR0;
++	u32 mFIDR0;
++	u32 mLDCMD0;
++};
++
++struct metromem_cmd {
++	u16 opcode;
++	u16 args[((64-2)/2)];
++	u16 csum;
++};
++
++struct metronomefb_par {
++	unsigned char *metromem;
++	struct metromem_desc *metromem_desc;
++	struct metromem_cmd *metromem_cmd;
++	unsigned char *metromem_wfm;
++	unsigned char *metromem_img;
++	u16 *metromem_img_csum;
++	u16 *csum_table;
++	int metromemsize;
++	dma_addr_t metromem_dma;
++	dma_addr_t metromem_desc_dma;
++	struct fb_info *info;
++	wait_queue_head_t waitq;
++	u8 frame_count;
++};
++
++/* frame differs from image. frame includes non-visible pixels */
++struct epd_frame {
++	int fw; /* frame width */
++	int fh; /* frame height */
++};
++
++static struct epd_frame epd_frame_table[] = {
++	{
++	.fw = 832,
++	.fh = 622
++	},
++};
++
++static struct fb_fix_screeninfo metronomefb_fix __devinitdata = {
++	.id =		"metronomefb",
++	.type =		FB_TYPE_PACKED_PIXELS,
++	.visual =	FB_VISUAL_STATIC_PSEUDOCOLOR,
++	.xpanstep =	0,
++	.ypanstep =	0,
++	.ywrapstep =	0,
++	.line_length =	DPY_W,
++	.accel =	FB_ACCEL_NONE,
++};
++
++static struct fb_var_screeninfo metronomefb_var __devinitdata = {
++	.xres		= DPY_W,
++	.yres		= DPY_H,
++	.xres_virtual	= DPY_W,
++	.yres_virtual	= DPY_H,
++	.bits_per_pixel	= 8,
++	.grayscale	= 1,
++	.nonstd		= 1,
++	.red =		{ 4, 3, 0 },
++	.green =	{ 0, 0, 0 },
++	.blue =		{ 0, 0, 0 },
++	.transp =	{ 0, 0, 0 },
++};
++
++static unsigned int metronomefb_enable;
++
++struct waveform_hdr {
++	u8 stuff[32];
++
++	u8 wmta[3];
++	u8 fvsn;
++
++	u8 luts;
++	u8 mc;
++	u8 trc;
++	u8 stuff3;
++
++	u8 endb;
++	u8 swtb;
++	u8 stuff2a[2];
++
++	u8 stuff2b[3];
++	u8 wfm_cs;
++} __attribute__ ((packed));
++
++/* main metronomefb functions */
++static u8 calc_cksum(int start, int end, u8 *mem)
++{
++	u8 tmp = 0;
++	int i;
++
++	for (i = start; i < end; i++)
++		tmp += mem[i];
++
++	return tmp;
++}
++
++static u16 calc_img_cksum(u16 *start, int length)
++{
++	u16 tmp = 0;
++
++	while (length--)
++		tmp += *start++;
++
++	return tmp;
++}
++
++/* here we decode the incoming waveform file and populate metromem */
++#define EXP_WFORM_SIZE 47001
++static int load_waveform(u8 *mem, size_t size, u8 *metromem, int m, int t,
++				u8 *frame_count)
++{
++	int tta;
++	int wmta;
++	int trn = 0;
++	int i;
++	unsigned char v;
++	u8 cksum;
++	int cksum_idx;
++	int wfm_idx, owfm_idx;
++	int mem_idx = 0;
++	struct waveform_hdr *wfm_hdr;
++
++	if (size != EXP_WFORM_SIZE) {
++		printk(KERN_ERR "Error: unexpected size %d != %d\n", size,
++					EXP_WFORM_SIZE);
++		return -EINVAL;
++	}
++
++	wfm_hdr = (struct waveform_hdr *) mem;
++
++	if (wfm_hdr->fvsn != 1) {
++		printk(KERN_ERR "Error: bad fvsn %x\n", wfm_hdr->fvsn);
++		return -EINVAL;
++	}
++	if (wfm_hdr->luts != 0) {
++		printk(KERN_ERR "Error: bad luts %x\n", wfm_hdr->luts);
++		return -EINVAL;
++	}
++	cksum = calc_cksum(32, 47, mem);
++	if (cksum != wfm_hdr->wfm_cs) {
++		printk(KERN_ERR "Error: bad cksum %x != %x\n", cksum,
++					wfm_hdr->wfm_cs);
++		return -EINVAL;
++	}
++	wfm_hdr->mc += 1;
++	wfm_hdr->trc += 1;
++	for (i = 0; i < 5; i++) {
++		if (*(wfm_hdr->stuff2a + i) != 0) {
++			printk(KERN_ERR "Error: unexpected value in padding\n");
++			return -EINVAL;
++		}
++	}
++
++	/* calculating trn. trn is something used to index into
++	the waveform. presumably selecting the right one for the
++	desired temperature. it works out the offset of the first
++	v that exceeds the specified temperature */
++	if ((sizeof(*wfm_hdr) + wfm_hdr->trc) > size)
++		return -EINVAL;
++
++	for (i = sizeof(*wfm_hdr); i <= sizeof(*wfm_hdr) + wfm_hdr->trc; i++) {
++		if (mem[i] > t) {
++			trn = i - sizeof(*wfm_hdr) - 1;
++			break;
++		}
++	}
++
++	/* check temperature range table checksum */
++	cksum_idx = sizeof(*wfm_hdr) + wfm_hdr->trc + 1;
++	if (cksum_idx > size)
++		return -EINVAL;
++	cksum = calc_cksum(sizeof(*wfm_hdr), cksum_idx, mem);
++	if (cksum != mem[cksum_idx]) {
++		printk(KERN_ERR "Error: bad temperature range table cksum"
++				" %x != %x\n", cksum, mem[cksum_idx]);
++		return -EINVAL;
++	}
++
++	/* check waveform mode table address checksum */
++	wmta = le32_to_cpu(get_unaligned((__le32 *) wfm_hdr->wmta));
++	wmta &= 0x00FFFFFF;
++	cksum_idx = wmta + m*4 + 3;
++	if (cksum_idx > size)
++		return -EINVAL;
++	cksum = calc_cksum(cksum_idx - 3, cksum_idx, mem);
++	if (cksum != mem[cksum_idx]) {
++		printk(KERN_ERR "Error: bad mode table address cksum"
++				" %x != %x\n", cksum, mem[cksum_idx]);
++		return -EINVAL;
++	}
++
++	/* check waveform temperature table address checksum */
++	tta = le32_to_cpu(get_unaligned((int *) (mem + wmta + m*4)));
++	tta &= 0x00FFFFFF;
++	cksum_idx = tta + trn*4 + 3;
++	if (cksum_idx > size)
++		return -EINVAL;
++	cksum = calc_cksum(cksum_idx - 3, cksum_idx, mem);
++	if (cksum != mem[cksum_idx]) {
++		printk(KERN_ERR "Error: bad temperature table address cksum"
++			" %x != %x\n", cksum, mem[cksum_idx]);
++		return -EINVAL;
++	}
++
++	/* here we do the real work of putting the waveform into the
++	metromem buffer. this does runlength decoding of the waveform */
++	wfm_idx = le32_to_cpu(get_unaligned((__le32 *) (mem + tta + trn*4)));
++	wfm_idx &= 0x00FFFFFF;
++	owfm_idx = wfm_idx;
++	if (wfm_idx > size)
++		return -EINVAL;
++	while (wfm_idx < size) {
++		unsigned char rl;
++		v = mem[wfm_idx++];
++		if (v == wfm_hdr->swtb) {
++			while (((v = mem[wfm_idx++]) != wfm_hdr->swtb) &&
++				wfm_idx < size)
++				metromem[mem_idx++] = v;
++
++			continue;
++		}
++
++		if (v == wfm_hdr->endb)
++			break;
++
++		rl = mem[wfm_idx++];
++		for (i = 0; i <= rl; i++)
++			metromem[mem_idx++] = v;
++	}
++
++	cksum_idx = wfm_idx;
++	if (cksum_idx > size)
++		return -EINVAL;
++	cksum = calc_cksum(owfm_idx, cksum_idx, mem);
++	if (cksum != mem[cksum_idx]) {
++		printk(KERN_ERR "Error: bad waveform data cksum"
++				" %x != %x\n", cksum, mem[cksum_idx]);
++		return -EINVAL;
++	}
++	*frame_count = (mem_idx/64);
++
++	return 0;
++}
++
++/* register offsets for gpio control */
++#define LED_GPIO_PIN 51
++#define STDBY_GPIO_PIN 48
++#define RST_GPIO_PIN 49
++#define RDY_GPIO_PIN 32
++#define ERR_GPIO_PIN 17
++#define PCBPWR_GPIO_PIN 16
++
++#define AF_SEL_GPIO_N 0x3
++#define GAFR0_U_OFFSET(pin) ((pin - 16) * 2)
++#define GAFR1_L_OFFSET(pin) ((pin - 32) * 2)
++#define GAFR1_U_OFFSET(pin) ((pin - 48) * 2)
++#define GPDR1_OFFSET(pin) (pin - 32)
++#define GPCR1_OFFSET(pin) (pin - 32)
++#define GPSR1_OFFSET(pin) (pin - 32)
++#define GPCR0_OFFSET(pin) (pin)
++#define GPSR0_OFFSET(pin) (pin)
++
++static void metronome_set_gpio_output(int pin, int val)
++{
++	u8 index;
++
++	index = pin >> 4;
++
++	switch (index) {
++	case 1:
++		if (val)
++			GPSR0 |= (1 << GPSR0_OFFSET(pin));
++		else
++			GPCR0 |= (1 << GPCR0_OFFSET(pin));
++		break;
++	case 2:
++		break;
++	case 3:
++		if (val)
++			GPSR1 |= (1 << GPSR1_OFFSET(pin));
++		else
++			GPCR1 |= (1 << GPCR1_OFFSET(pin));
++		break;
++	default:
++		printk(KERN_ERR "unimplemented\n");
++	}
++}
++
++static void __devinit metronome_init_gpio_pin(int pin, int dir)
++{
++	u8 index;
++	/* dir 0 is output, 1 is input
++	- do 2 things here:
++	- set gpio alternate function to standard gpio
++	- set gpio direction to input or output  */
++
++	index = pin >> 4;
++	switch (index) {
++	case 1:
++		GAFR0_U &= ~(AF_SEL_GPIO_N << GAFR0_U_OFFSET(pin));
++
++		if (dir)
++			GPDR0 &= ~(1 << pin);
++		else
++			GPDR0 |= (1 << pin);
++		break;
++	case 2:
++		GAFR1_L &= ~(AF_SEL_GPIO_N << GAFR1_L_OFFSET(pin));
++
++		if (dir)
++			GPDR1 &= ~(1 << GPDR1_OFFSET(pin));
++		else
++			GPDR1 |= (1 << GPDR1_OFFSET(pin));
++		break;
++	case 3:
++		GAFR1_U &= ~(AF_SEL_GPIO_N << GAFR1_U_OFFSET(pin));
++
++		if (dir)
++			GPDR1 &= ~(1 << GPDR1_OFFSET(pin));
++		else
++			GPDR1 |= (1 << GPDR1_OFFSET(pin));
++		break;
++	default:
++		printk(KERN_ERR "unimplemented\n");
++	}
++}
++
++static void __devinit metronome_init_gpio_regs(void)
++{
++	metronome_init_gpio_pin(LED_GPIO_PIN, 0);
++	metronome_set_gpio_output(LED_GPIO_PIN, 0);
++
++	metronome_init_gpio_pin(STDBY_GPIO_PIN, 0);
++	metronome_set_gpio_output(STDBY_GPIO_PIN, 0);
++
++	metronome_init_gpio_pin(RST_GPIO_PIN, 0);
++	metronome_set_gpio_output(RST_GPIO_PIN, 0);
++
++	metronome_init_gpio_pin(RDY_GPIO_PIN, 1);
++
++	metronome_init_gpio_pin(ERR_GPIO_PIN, 1);
++
++	metronome_init_gpio_pin(PCBPWR_GPIO_PIN, 0);
++	metronome_set_gpio_output(PCBPWR_GPIO_PIN, 0);
++}
++
++static void metronome_disable_lcd_controller(struct metronomefb_par *par)
++{
++	LCSR = 0xffffffff;	/* Clear LCD Status Register */
++	LCCR0 |= LCCR0_DIS;	/* Disable LCD Controller */
++
++	/* we reset and just wait for things to settle */
++	msleep(200);
++}
++
++static void metronome_enable_lcd_controller(struct metronomefb_par *par)
++{
++	LCSR = 0xffffffff;
++	FDADR0 = par->metromem_desc_dma;
++	LCCR0 |= LCCR0_ENB;
++}
++
++static void __devinit metronome_init_lcdc_regs(struct metronomefb_par *par)
++{
++	/* here we do:
++	- disable the lcd controller
++	- setup lcd control registers
++	- setup dma descriptor
++	- reenable lcd controller
++	*/
++
++	/* disable the lcd controller */
++	metronome_disable_lcd_controller(par);
++
++	/* setup lcd control registers */
++	LCCR0 = LCCR0_LDM | LCCR0_SFM | LCCR0_IUM | LCCR0_EFM | LCCR0_PAS
++		| LCCR0_QDM | LCCR0_BM | LCCR0_OUM;
++
++	LCCR1 = (epd_frame_table[0].fw/2 - 1) /* pixels per line */
++		| (27 << 10) /* hsync pulse width - 1 */
++		| (33 << 16) /* eol pixel count */
++		| (33 << 24); /* bol pixel count */
++
++	LCCR2 = (epd_frame_table[0].fh - 1) /* lines per panel */
++		| (24 << 10) /* vsync pulse width - 1 */
++		| (2 << 16) /* eof pixel count */
++		| (0 << 24); /* bof pixel count */
++
++	LCCR3 = 2 /* pixel clock divisor */
++		| (24 << 8) /* AC Bias pin freq */
++		| LCCR3_16BPP /* BPP */
++		| LCCR3_PCP;  /* PCP falling edge */
++
++	/* setup dma descriptor */
++	par->metromem_desc->mFDADR0 = par->metromem_desc_dma;
++	par->metromem_desc->mFSADR0 = par->metromem_dma;
++	par->metromem_desc->mFIDR0 = 0;
++	par->metromem_desc->mLDCMD0 = epd_frame_table[0].fw
++					* epd_frame_table[0].fh;
++	/* reenable lcd controller */
++	metronome_enable_lcd_controller(par);
++}
++
++static int metronome_display_cmd(struct metronomefb_par *par)
++{
++	int i;
++	u16 cs;
++	u16 opcode;
++	static u8 borderval;
++	u8 *ptr;
++
++	/* setup display command
++	we can't immediately set the opcode since the controller
++	will try parse the command before we've set it all up
++	so we just set cs here and set the opcode at the end */
++
++	ptr = par->metromem;
++
++	if (par->metromem_cmd->opcode == 0xCC40)
++		opcode = cs = 0xCC41;
++	else
++		opcode = cs = 0xCC40;
++
++	/* set the args ( 2 bytes ) for display */
++	i = 0;
++	par->metromem_cmd->args[i] = 	1 << 3 /* border update */
++					| ((borderval++ % 4) & 0x0F) << 4
++					| (par->frame_count - 1) << 8;
++	cs += par->metromem_cmd->args[i++];
++
++	/* the rest are 0 */
++	memset((u8 *) (par->metromem_cmd->args + i), 0, (32-i)*2);
++
++	par->metromem_cmd->csum = cs;
++	par->metromem_cmd->opcode = opcode; /* display cmd */
++
++	i = wait_event_interruptible_timeout(par->waitq, (GPLR1 & 0x01), HZ);
++	return i;
++}
++
++static int __devinit metronome_powerup_cmd(struct metronomefb_par *par)
++{
++	int i;
++	u16 cs;
++
++	/* setup power up command */
++	par->metromem_cmd->opcode = 0x1234; /* pwr up pseudo cmd */
++	cs = par->metromem_cmd->opcode;
++
++	/* set pwr1,2,3 to 1024 */
++	for (i = 0; i < 3; i++) {
++		par->metromem_cmd->args[i] = 1024;
++		cs += par->metromem_cmd->args[i];
++	}
++
++	/* the rest are 0 */
++	memset((u8 *) (par->metromem_cmd->args + i), 0, (32-i)*2);
++
++	par->metromem_cmd->csum = cs;
++
++	msleep(1);
++	metronome_set_gpio_output(RST_GPIO_PIN, 1);
++
++	msleep(1);
++	metronome_set_gpio_output(STDBY_GPIO_PIN, 1);
++
++	i = wait_event_timeout(par->waitq, (GPLR1 & 0x01), HZ);
++	return i;
++}
++
++static int __devinit metronome_config_cmd(struct metronomefb_par *par)
++{
++	int i;
++	u16 cs;
++
++	/* setup config command
++	we can't immediately set the opcode since the controller
++	will try parse the command before we've set it all up
++	so we just set cs here and set the opcode at the end */
++
++	cs = 0xCC10;
++
++	/* set the 12 args ( 8 bytes ) for config. see spec for meanings */
++	i = 0;
++	par->metromem_cmd->args[i] = 	15 /* sdlew */
++					| 2 << 8 /* sdosz */
++					| 0 << 11 /* sdor */
++					| 0 << 12 /* sdces */
++					| 0 << 15; /* sdcer */
++	cs += par->metromem_cmd->args[i++];
++
++	par->metromem_cmd->args[i] = 	42 /* gdspl */
++					| 1 << 8 /* gdr1 */
++					| 1 << 9 /* sdshr */
++					| 0 << 15; /* gdspp */
++	cs += par->metromem_cmd->args[i++];
++
++	par->metromem_cmd->args[i] = 	18 /* gdspw */
++					| 0 << 15; /* dispc */
++	cs += par->metromem_cmd->args[i++];
++
++	par->metromem_cmd->args[i] = 	599 /* vdlc */
++					| 0 << 11 /* dsi */
++					| 0 << 12; /* dsic */
++	cs += par->metromem_cmd->args[i++];
++
++	/* the rest are 0 */
++	memset((u8 *) (par->metromem_cmd->args + i), 0, (32-i)*2);
++
++	par->metromem_cmd->csum = cs;
++	par->metromem_cmd->opcode = 0xCC10; /* config cmd */
++
++	i = wait_event_timeout(par->waitq, (GPLR1 & 0x01), HZ);
++	return i;
++}
++
++static int __devinit metronome_init_cmd(struct metronomefb_par *par)
++{
++	int i;
++	u16 cs;
++
++	/* setup init command
++	we can't immediately set the opcode since the controller
++	will try parse the command before we've set it all up
++	so we just set cs here and set the opcode at the end */
++
++	cs = 0xCC20;
++
++	/* set the args ( 2 bytes ) for init */
++	i = 0;
++	par->metromem_cmd->args[i] = 0;
++	cs += par->metromem_cmd->args[i++];
++
++	/* the rest are 0 */
++	memset((u8 *) (par->metromem_cmd->args + i), 0, (32-i)*2);
++
++	par->metromem_cmd->csum = cs;
++	par->metromem_cmd->opcode = 0xCC20; /* init cmd */
++
++	i = wait_event_timeout(par->waitq, (GPLR1 & 0x01), HZ);
++	return i;
++}
++
++static int __devinit metronome_init_regs(struct metronomefb_par *par)
++{
++	int res;
++
++	metronome_init_gpio_regs();
++	metronome_init_lcdc_regs(par);
++
++	res = metronome_powerup_cmd(par);
++	if (res)
++		return res;
++
++	res = metronome_config_cmd(par);
++	if (res)
++		return res;
++
++	res = metronome_init_cmd(par);
++	if (res)
++		return res;
++
++	return res;
++}
++
++static void metronomefb_dpy_update(struct metronomefb_par *par)
++{
++	u16 cksum;
++	unsigned char *buf = (unsigned char __force *)par->info->screen_base;
++
++	/* copy from vm to metromem */
++	memcpy(par->metromem_img, buf, DPY_W*DPY_H);
++
++	cksum = calc_img_cksum((u16 *) par->metromem_img,
++				(epd_frame_table[0].fw * DPY_H)/2);
++	*((u16 *) (par->metromem_img) +
++			(epd_frame_table[0].fw * DPY_H)/2) = cksum;
++	metronome_display_cmd(par);
++}
++
++static u16 metronomefb_dpy_update_page(struct metronomefb_par *par, int index)
++{
++	int i;
++	u16 csum = 0;
++	u16 *buf = (u16 __force *) (par->info->screen_base + index);
++	u16 *img = (u16 *) (par->metromem_img + index);
++
++	/* swizzle from vm to metromem and recalc cksum at the same time*/
++	for (i = 0; i < PAGE_SIZE/2; i++) {
++		*(img + i) = (buf[i] << 5) & 0xE0E0;
++		csum += *(img + i);
++	}
++	return csum;
++}
++
++/* this is called back from the deferred io workqueue */
++static void metronomefb_dpy_deferred_io(struct fb_info *info,
++				struct list_head *pagelist)
++{
++	u16 cksum;
++	struct page *cur;
++	struct fb_deferred_io *fbdefio = info->fbdefio;
++	struct metronomefb_par *par = info->par;
++
++	/* walk the written page list and swizzle the data */
++	list_for_each_entry(cur, &fbdefio->pagelist, lru) {
++		cksum = metronomefb_dpy_update_page(par,
++					(cur->index << PAGE_SHIFT));
++		par->metromem_img_csum -= par->csum_table[cur->index];
++		par->csum_table[cur->index] = cksum;
++		par->metromem_img_csum += cksum;
++	}
++
++	metronome_display_cmd(par);
++}
++
++static void metronomefb_fillrect(struct fb_info *info,
++				   const struct fb_fillrect *rect)
++{
++	struct metronomefb_par *par = info->par;
++
++	cfb_fillrect(info, rect);
++	metronomefb_dpy_update(par);
++}
++
++static void metronomefb_copyarea(struct fb_info *info,
++				   const struct fb_copyarea *area)
++{
++	struct metronomefb_par *par = info->par;
++
++	cfb_copyarea(info, area);
++	metronomefb_dpy_update(par);
++}
++
++static void metronomefb_imageblit(struct fb_info *info,
++				const struct fb_image *image)
++{
++	struct metronomefb_par *par = info->par;
++
++	cfb_imageblit(info, image);
++	metronomefb_dpy_update(par);
++}
++
++/*
++ * this is the slow path from userspace. they can seek and write to
++ * the fb. it is based on fb_sys_write
++ */
++static ssize_t metronomefb_write(struct fb_info *info, const char __user *buf,
++				size_t count, loff_t *ppos)
++{
++	struct metronomefb_par *par = info->par;
++	unsigned long p = *ppos;
++	void *dst;
++	int err = 0;
++	unsigned long total_size;
++
++	if (info->state != FBINFO_STATE_RUNNING)
++		return -EPERM;
++
++	total_size = info->fix.smem_len;
++
++	if (p > total_size)
++		return -EFBIG;
++
++	if (count > total_size) {
++		err = -EFBIG;
++		count = total_size;
++	}
++
++	if (count + p > total_size) {
++		if (!err)
++			err = -ENOSPC;
++
++		count = total_size - p;
++	}
++
++	dst = (void __force *) (info->screen_base + p);
++
++	if (copy_from_user(dst, buf, count))
++		err = -EFAULT;
++
++	if  (!err)
++		*ppos += count;
++
++	metronomefb_dpy_update(par);
++
++	return (err) ? err : count;
++}
++
++static struct fb_ops metronomefb_ops = {
++	.owner		= THIS_MODULE,
++	.fb_write	= metronomefb_write,
++	.fb_fillrect	= metronomefb_fillrect,
++	.fb_copyarea	= metronomefb_copyarea,
++	.fb_imageblit	= metronomefb_imageblit,
++};
++
++static struct fb_deferred_io metronomefb_defio = {
++	.delay		= HZ,
++	.deferred_io	= metronomefb_dpy_deferred_io,
++};
++
++static irqreturn_t metronome_handle_irq(int irq, void *dev_id)
++{
++	struct fb_info *info = dev_id;
++	struct metronomefb_par *par = info->par;
++
++	wake_up_interruptible(&par->waitq);
++	return IRQ_HANDLED;
++}
++
++static int __devinit metronomefb_probe(struct platform_device *dev)
++{
++	struct fb_info *info;
++	int retval = -ENOMEM;
++	int videomemorysize;
++	unsigned char *videomemory;
++	struct metronomefb_par *par;
++	const struct firmware *fw_entry;
++	int cmd_size, wfm_size, img_size, padding_size, totalsize;
++	int i;
++
++	/* we have two blocks of memory.
++	info->screen_base which is vm, and is the fb used by apps.
++	par->metromem which is physically contiguous memory and
++	contains the display controller commands, waveform,
++	processed image data and padding. this is the data pulled
++	by the pxa255's LCD controller and pushed to Metronome */
++
++	videomemorysize = (DPY_W*DPY_H);
++	videomemory = vmalloc(videomemorysize);
++	if (!videomemory)
++		return retval;
++
++	memset(videomemory, 0, videomemorysize);
++
++	info = framebuffer_alloc(sizeof(struct metronomefb_par), &dev->dev);
++	if (!info)
++		goto err_vfree;
++
++	info->screen_base = (char __iomem *) videomemory;
++	info->fbops = &metronomefb_ops;
++
++	info->var = metronomefb_var;
++	info->fix = metronomefb_fix;
++	info->fix.smem_len = videomemorysize;
++	par = info->par;
++	par->info = info;
++	init_waitqueue_head(&par->waitq);
++
++	/* this table caches per page csum values. */
++	par->csum_table = vmalloc(videomemorysize/PAGE_SIZE);
++	if (!par->csum_table)
++		goto err_csum_table;
++
++	/* the metromem buffer is divided as follows:
++	command | CRC | padding
++	16kb waveform data | CRC | padding
++	image data | CRC
++	and an extra 256 bytes for dma descriptors
++	eg: IW=832 IH=622 WS=128
++	*/
++
++	cmd_size = 1 * epd_frame_table[0].fw;
++	wfm_size = ((16*1024 + 2 + epd_frame_table[0].fw - 1)
++			/ epd_frame_table[0].fw) * epd_frame_table[0].fw;
++	img_size = epd_frame_table[0].fh * epd_frame_table[0].fw;
++	padding_size = 4 * epd_frame_table[0].fw;
++	totalsize = cmd_size + wfm_size + img_size + padding_size;
++	par->metromemsize = PAGE_ALIGN(totalsize + 256);
++	DPRINTK("desired memory size = %d\n", par->metromemsize);
++	dev->dev.coherent_dma_mask = 0xffffffffull;
++	par->metromem = dma_alloc_writecombine(&dev->dev, par->metromemsize,
++						&par->metromem_dma, GFP_KERNEL);
++	if (!par->metromem) {
++		printk(KERN_ERR
++			"metronomefb: unable to allocate dma buffer\n");
++		goto err_vfree;
++	}
++
++	info->fix.smem_start = par->metromem_dma;
++	par->metromem_cmd = (struct metromem_cmd *) par->metromem;
++	par->metromem_wfm = par->metromem + cmd_size;
++	par->metromem_img = par->metromem + cmd_size + wfm_size;
++	par->metromem_img_csum = (u16 *) (par->metromem_img +
++					(epd_frame_table[0].fw * DPY_H));
++	DPRINTK("img offset=0x%x\n", cmd_size + wfm_size);
++	par->metromem_desc = (struct metromem_desc *) (par->metromem + cmd_size
++					+ wfm_size + img_size + padding_size);
++	par->metromem_desc_dma = par->metromem_dma + cmd_size + wfm_size
++				 + img_size + padding_size;
++
++	/* load the waveform in. assume mode 3, temp 31 for now */
++	/* 	a) request the waveform file from userspace
++		b) process waveform and decode into metromem */
++
++	retval = request_firmware(&fw_entry, "waveform.wbf", &dev->dev);
++	if (retval < 0) {
++		printk(KERN_ERR "metronomefb: couldn't get waveform\n");
++		goto err_dma_free;
++	}
++
++	retval = load_waveform((u8 *) fw_entry->data, fw_entry->size,
++				par->metromem_wfm, 3, 31, &par->frame_count);
++	if (retval < 0) {
++		printk(KERN_ERR "metronomefb: couldn't process waveform\n");
++		goto err_ld_wfm;
++	}
++	release_firmware(fw_entry);
++
++	retval = request_irq(IRQ_GPIO(RDY_GPIO_PIN), metronome_handle_irq,
++				IRQF_DISABLED, "Metronome", info);
++	if (retval) {
++		dev_err(&dev->dev, "request_irq failed: %d\n", retval);
++		goto err_ld_wfm;
++	}
++	set_irq_type(IRQ_GPIO(RDY_GPIO_PIN), IRQT_FALLING);
++
++	retval = metronome_init_regs(par);
++	if (retval < 0)
++		goto err_free_irq;
++
++	info->flags = FBINFO_FLAG_DEFAULT;
++
++	info->fbdefio = &metronomefb_defio;
++	fb_deferred_io_init(info);
++
++	retval = fb_alloc_cmap(&info->cmap, 8, 0);
++	if (retval < 0) {
++		printk(KERN_ERR "Failed to allocate colormap\n");
++		goto err_fb_rel;
++	}
++
++	/* set cmap */
++	for (i = 0; i < 8; i++)
++		info->cmap.red[i] = (((2*i)+1)*(0xFFFF))/16;
++	memcpy(info->cmap.green, info->cmap.red, sizeof(u16)*8);
++	memcpy(info->cmap.blue, info->cmap.red, sizeof(u16)*8);
++
++	retval = register_framebuffer(info);
++	if (retval < 0)
++		goto err_cmap;
++
++	platform_set_drvdata(dev, info);
++
++	printk(KERN_INFO
++		"fb%d: Metronome frame buffer device, using %dK of video"
++		" memory\n", info->node, videomemorysize >> 10);
++
++	return 0;
++
++err_cmap:
++	fb_dealloc_cmap(&info->cmap);
++err_fb_rel:
++	framebuffer_release(info);
++err_free_irq:
++	free_irq(IRQ_GPIO(RDY_GPIO_PIN), info);
++err_ld_wfm:
++	release_firmware(fw_entry);
++err_dma_free:
++	dma_free_writecombine(&dev->dev, par->metromemsize, par->metromem,
++				par->metromem_dma);
++err_csum_table:
++	vfree(par->csum_table);
++err_vfree:
++	vfree(videomemory);
++	return retval;
++}
++
++static int __devexit metronomefb_remove(struct platform_device *dev)
++{
++	struct fb_info *info = platform_get_drvdata(dev);
++
++	if (info) {
++		struct metronomefb_par *par = info->par;
++		fb_deferred_io_cleanup(info);
++		dma_free_writecombine(&dev->dev, par->metromemsize,
++					par->metromem, par->metromem_dma);
++		fb_dealloc_cmap(&info->cmap);
++		vfree(par->csum_table);
++		unregister_framebuffer(info);
++		vfree((void __force *)info->screen_base);
++		free_irq(IRQ_GPIO(RDY_GPIO_PIN), info);
++		framebuffer_release(info);
++	}
++	return 0;
++}
++
++static struct platform_driver metronomefb_driver = {
++	.probe	= metronomefb_probe,
++	.remove = metronomefb_remove,
++	.driver	= {
++		.name	= "metronomefb",
++	},
++};
++
++static struct platform_device *metronomefb_device;
++
++static int __init metronomefb_init(void)
++{
++	int ret;
++
++	if (!metronomefb_enable) {
++		printk(KERN_ERR
++			"Use metronomefb_enable to enable the device\n");
++		return -ENXIO;
++	}
++
++	ret = platform_driver_register(&metronomefb_driver);
++	if (!ret) {
++		metronomefb_device = platform_device_alloc("metronomefb", 0);
++		if (metronomefb_device)
++			ret = platform_device_add(metronomefb_device);
++		else
++			ret = -ENOMEM;
++
++		if (ret) {
++			platform_device_put(metronomefb_device);
++			platform_driver_unregister(&metronomefb_driver);
++		}
++	}
++	return ret;
++
++}
++
++static void __exit metronomefb_exit(void)
++{
++	platform_device_unregister(metronomefb_device);
++	platform_driver_unregister(&metronomefb_driver);
++}
++
++module_param(metronomefb_enable, uint, 0);
++MODULE_PARM_DESC(metronomefb_enable, "Enable communication with Metronome");
++
++module_init(metronomefb_init);
++module_exit(metronomefb_exit);
++
++MODULE_DESCRIPTION("fbdev driver for Metronome controller");
++MODULE_AUTHOR("Jaya Kumar");
++MODULE_LICENSE("GPL");
+diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c
+index c8a4332..0b3efc3 100644
+--- a/drivers/virtio/virtio_balloon.c
++++ b/drivers/virtio/virtio_balloon.c
+@@ -152,7 +152,7 @@ static void virtballoon_changed(struct virtio_device *vdev)
+ 	wake_up(&vb->config_change);
+ }
+ 
+-static inline int towards_target(struct virtio_balloon *vb)
++static inline s64 towards_target(struct virtio_balloon *vb)
+ {
+ 	u32 v;
+ 	__virtio_config_val(vb->vdev,
+@@ -176,7 +176,7 @@ static int balloon(void *_vballoon)
+ 
+ 	set_freezable();
+ 	while (!kthread_should_stop()) {
+-		int diff;
++		s64 diff;
+ 
+ 		try_to_freeze();
+ 		wait_event_interruptible(vb->config_change,
+diff --git a/drivers/virtio/virtio_pci.c b/drivers/virtio/virtio_pci.c
+index 26f787d..59a8f73 100644
+--- a/drivers/virtio/virtio_pci.c
++++ b/drivers/virtio/virtio_pci.c
+@@ -177,6 +177,7 @@ static irqreturn_t vp_interrupt(int irq, void *opaque)
+ 	struct virtio_pci_device *vp_dev = opaque;
+ 	struct virtio_pci_vq_info *info;
+ 	irqreturn_t ret = IRQ_NONE;
++	unsigned long flags;
+ 	u8 isr;
+ 
+ 	/* reading the ISR has the effect of also clearing it so it's very
+@@ -197,12 +198,12 @@ static irqreturn_t vp_interrupt(int irq, void *opaque)
+ 			drv->config_changed(&vp_dev->vdev);
+ 	}
+ 
+-	spin_lock(&vp_dev->lock);
++	spin_lock_irqsave(&vp_dev->lock, flags);
+ 	list_for_each_entry(info, &vp_dev->virtqueues, node) {
+ 		if (vring_interrupt(irq, info->vq) == IRQ_HANDLED)
+ 			ret = IRQ_HANDLED;
+ 	}
+-	spin_unlock(&vp_dev->lock);
++	spin_unlock_irqrestore(&vp_dev->lock, flags);
+ 
+ 	return ret;
+ }
+@@ -214,6 +215,7 @@ static struct virtqueue *vp_find_vq(struct virtio_device *vdev, unsigned index,
+ 	struct virtio_pci_device *vp_dev = to_vp_device(vdev);
+ 	struct virtio_pci_vq_info *info;
+ 	struct virtqueue *vq;
++	unsigned long flags;
+ 	u16 num;
+ 	int err;
+ 
+@@ -255,9 +257,9 @@ static struct virtqueue *vp_find_vq(struct virtio_device *vdev, unsigned index,
+ 	vq->priv = info;
+ 	info->vq = vq;
+ 
+-	spin_lock(&vp_dev->lock);
++	spin_lock_irqsave(&vp_dev->lock, flags);
+ 	list_add(&info->node, &vp_dev->virtqueues);
+-	spin_unlock(&vp_dev->lock);
++	spin_unlock_irqrestore(&vp_dev->lock, flags);
+ 
+ 	return vq;
+ 
+@@ -274,10 +276,11 @@ static void vp_del_vq(struct virtqueue *vq)
+ {
+ 	struct virtio_pci_device *vp_dev = to_vp_device(vq->vdev);
+ 	struct virtio_pci_vq_info *info = vq->priv;
++	unsigned long flags;
+ 
+-	spin_lock(&vp_dev->lock);
++	spin_lock_irqsave(&vp_dev->lock, flags);
+ 	list_del(&info->node);
+-	spin_unlock(&vp_dev->lock);
++	spin_unlock_irqrestore(&vp_dev->lock, flags);
+ 
+ 	vring_del_virtqueue(vq);
+ 
+diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
+index 3a28c13..aa71402 100644
+--- a/drivers/virtio/virtio_ring.c
++++ b/drivers/virtio/virtio_ring.c
+@@ -232,7 +232,6 @@ static bool vring_enable_cb(struct virtqueue *_vq)
+ 	vq->vring.avail->flags &= ~VRING_AVAIL_F_NO_INTERRUPT;
+ 	mb();
+ 	if (unlikely(more_used(vq))) {
+-		vq->vring.avail->flags |= VRING_AVAIL_F_NO_INTERRUPT;
+ 		END_USE(vq);
+ 		return false;
+ 	}
+diff --git a/fs/aio.c b/fs/aio.c
+index b74c567..6af9219 100644
+--- a/fs/aio.c
++++ b/fs/aio.c
+@@ -996,6 +996,14 @@ put_rq:
+ 	/* everything turned out well, dispose of the aiocb. */
+ 	ret = __aio_put_req(ctx, iocb);
+ 
++	/*
++	 * We have to order our ring_info tail store above and test
++	 * of the wait list below outside the wait lock.  This is
++	 * like in wake_up_bit() where clearing a bit has to be
++	 * ordered with the unlocked test.
++	 */
++	smp_mb();
++
+ 	if (waitqueue_active(&ctx->wait))
+ 		wake_up(&ctx->wait);
+ 
+diff --git a/fs/bio.c b/fs/bio.c
+index 3312fcc..553b5b7 100644
+--- a/fs/bio.c
++++ b/fs/bio.c
+@@ -1194,6 +1194,8 @@ EXPORT_SYMBOL(bio_hw_segments);
+ EXPORT_SYMBOL(bio_add_page);
+ EXPORT_SYMBOL(bio_add_pc_page);
+ EXPORT_SYMBOL(bio_get_nr_vecs);
++EXPORT_SYMBOL(bio_map_user);
++EXPORT_SYMBOL(bio_unmap_user);
+ EXPORT_SYMBOL(bio_map_kern);
+ EXPORT_SYMBOL(bio_pair_release);
+ EXPORT_SYMBOL(bio_split);
+diff --git a/fs/buffer.c b/fs/buffer.c
+index ddfdd2c..7ba5838 100644
+--- a/fs/buffer.c
++++ b/fs/buffer.c
+@@ -3213,7 +3213,7 @@ static int buffer_cpu_notify(struct notifier_block *self,
+ }
+ 
+ /**
+- * bh_uptodate_or_lock: Test whether the buffer is uptodate
++ * bh_uptodate_or_lock - Test whether the buffer is uptodate
+  * @bh: struct buffer_head
+  *
+  * Return true if the buffer is up-to-date and false,
+@@ -3232,7 +3232,7 @@ int bh_uptodate_or_lock(struct buffer_head *bh)
+ EXPORT_SYMBOL(bh_uptodate_or_lock);
+ 
+ /**
+- * bh_submit_read: Submit a locked buffer for reading
++ * bh_submit_read - Submit a locked buffer for reading
+  * @bh: struct buffer_head
+  *
+  * Returns zero on success and -EIO on error.
+diff --git a/fs/dquot.c b/fs/dquot.c
+index 9c7feb6..41b9dbd 100644
+--- a/fs/dquot.c
++++ b/fs/dquot.c
+@@ -1522,8 +1522,8 @@ int vfs_quota_off(struct super_block *sb, int type)
+ 				truncate_inode_pages(&toputinode[cnt]->i_data, 0);
+ 				mutex_unlock(&toputinode[cnt]->i_mutex);
+ 				mark_inode_dirty(toputinode[cnt]);
+-				iput(toputinode[cnt]);
+ 			}
++			iput(toputinode[cnt]);
+ 			mutex_unlock(&dqopt->dqonoff_mutex);
+ 		}
+ 	if (sb->s_bdev)
+diff --git a/fs/ecryptfs/dentry.c b/fs/ecryptfs/dentry.c
+index 841a032..5e59658 100644
+--- a/fs/ecryptfs/dentry.c
++++ b/fs/ecryptfs/dentry.c
+@@ -80,8 +80,8 @@ static void ecryptfs_d_release(struct dentry *dentry)
+ {
+ 	if (ecryptfs_dentry_to_private(dentry)) {
+ 		if (ecryptfs_dentry_to_lower(dentry)) {
+-			mntput(ecryptfs_dentry_to_lower_mnt(dentry));
+ 			dput(ecryptfs_dentry_to_lower(dentry));
++			mntput(ecryptfs_dentry_to_lower_mnt(dentry));
+ 		}
+ 		kmem_cache_free(ecryptfs_dentry_info_cache,
+ 				ecryptfs_dentry_to_private(dentry));
+diff --git a/fs/ext3/acl.c b/fs/ext3/acl.c
+index d34e996..a754d18 100644
+--- a/fs/ext3/acl.c
++++ b/fs/ext3/acl.c
+@@ -37,7 +37,7 @@ ext3_acl_from_disk(const void *value, size_t size)
+ 		return ERR_PTR(-EINVAL);
+ 	if (count == 0)
+ 		return NULL;
+-	acl = posix_acl_alloc(count, GFP_KERNEL);
++	acl = posix_acl_alloc(count, GFP_NOFS);
+ 	if (!acl)
+ 		return ERR_PTR(-ENOMEM);
+ 	for (n=0; n < count; n++) {
+@@ -91,7 +91,7 @@ ext3_acl_to_disk(const struct posix_acl *acl, size_t *size)
+ 
+ 	*size = ext3_acl_size(acl->a_count);
+ 	ext_acl = kmalloc(sizeof(ext3_acl_header) + acl->a_count *
+-			sizeof(ext3_acl_entry), GFP_KERNEL);
++			sizeof(ext3_acl_entry), GFP_NOFS);
+ 	if (!ext_acl)
+ 		return ERR_PTR(-ENOMEM);
+ 	ext_acl->a_version = cpu_to_le32(EXT3_ACL_VERSION);
+@@ -187,7 +187,7 @@ ext3_get_acl(struct inode *inode, int type)
+ 	}
+ 	retval = ext3_xattr_get(inode, name_index, "", NULL, 0);
+ 	if (retval > 0) {
+-		value = kmalloc(retval, GFP_KERNEL);
++		value = kmalloc(retval, GFP_NOFS);
+ 		if (!value)
+ 			return ERR_PTR(-ENOMEM);
+ 		retval = ext3_xattr_get(inode, name_index, "", value, retval);
+@@ -335,7 +335,7 @@ ext3_init_acl(handle_t *handle, struct inode *inode, struct inode *dir)
+ 			if (error)
+ 				goto cleanup;
+ 		}
+-		clone = posix_acl_clone(acl, GFP_KERNEL);
++		clone = posix_acl_clone(acl, GFP_NOFS);
+ 		error = -ENOMEM;
+ 		if (!clone)
+ 			goto cleanup;
+diff --git a/fs/ext3/resize.c b/fs/ext3/resize.c
+index 9397d77..0e97b6e 100644
+--- a/fs/ext3/resize.c
++++ b/fs/ext3/resize.c
+@@ -485,7 +485,7 @@ static int add_new_gdb(handle_t *handle, struct inode *inode,
+ 		goto exit_dindj;
+ 
+ 	n_group_desc = kmalloc((gdb_num + 1) * sizeof(struct buffer_head *),
+-			GFP_KERNEL);
++			GFP_NOFS);
+ 	if (!n_group_desc) {
+ 		err = -ENOMEM;
+ 		ext3_warning (sb, __FUNCTION__,
+@@ -568,7 +568,7 @@ static int reserve_backup_gdb(handle_t *handle, struct inode *inode,
+ 	int res, i;
+ 	int err;
+ 
+-	primary = kmalloc(reserved_gdb * sizeof(*primary), GFP_KERNEL);
++	primary = kmalloc(reserved_gdb * sizeof(*primary), GFP_NOFS);
+ 	if (!primary)
+ 		return -ENOMEM;
+ 
+diff --git a/fs/ext3/xattr.c b/fs/ext3/xattr.c
+index fb89c29..a6ea4d6 100644
+--- a/fs/ext3/xattr.c
++++ b/fs/ext3/xattr.c
+@@ -728,7 +728,7 @@ ext3_xattr_block_set(handle_t *handle, struct inode *inode,
+ 				ce = NULL;
+ 			}
+ 			ea_bdebug(bs->bh, "cloning");
+-			s->base = kmalloc(bs->bh->b_size, GFP_KERNEL);
++			s->base = kmalloc(bs->bh->b_size, GFP_NOFS);
+ 			error = -ENOMEM;
+ 			if (s->base == NULL)
+ 				goto cleanup;
+@@ -740,7 +740,7 @@ ext3_xattr_block_set(handle_t *handle, struct inode *inode,
+ 		}
+ 	} else {
+ 		/* Allocate a buffer where we construct the new block. */
+-		s->base = kzalloc(sb->s_blocksize, GFP_KERNEL);
++		s->base = kzalloc(sb->s_blocksize, GFP_NOFS);
+ 		/* assert(header == s->base) */
+ 		error = -ENOMEM;
+ 		if (s->base == NULL)
+diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c
+index c007607..0655767 100644
+--- a/fs/fs-writeback.c
++++ b/fs/fs-writeback.c
+@@ -751,7 +751,7 @@ int generic_osync_inode(struct inode *inode, struct address_space *mapping, int
+ EXPORT_SYMBOL(generic_osync_inode);
+ 
+ /**
+- * writeback_acquire: attempt to get exclusive writeback access to a device
++ * writeback_acquire - attempt to get exclusive writeback access to a device
+  * @bdi: the device's backing_dev_info structure
+  *
+  * It is a waste of resources to have more than one pdflush thread blocked on
+@@ -768,7 +768,7 @@ int writeback_acquire(struct backing_dev_info *bdi)
+ }
+ 
+ /**
+- * writeback_in_progress: determine whether there is writeback in progress
++ * writeback_in_progress - determine whether there is writeback in progress
+  * @bdi: the device's backing_dev_info structure.
+  *
+  * Determine whether there is writeback in progress against a backing device.
+@@ -779,7 +779,7 @@ int writeback_in_progress(struct backing_dev_info *bdi)
+ }
+ 
+ /**
+- * writeback_release: relinquish exclusive writeback access against a device.
++ * writeback_release - relinquish exclusive writeback access against a device.
+  * @bdi: the device's backing_dev_info structure
+  */
+ void writeback_release(struct backing_dev_info *bdi)
+diff --git a/fs/hfs/brec.c b/fs/hfs/brec.c
+index 878bf25..92fb358 100644
+--- a/fs/hfs/brec.c
++++ b/fs/hfs/brec.c
+@@ -229,7 +229,7 @@ skip:
+ static struct hfs_bnode *hfs_bnode_split(struct hfs_find_data *fd)
+ {
+ 	struct hfs_btree *tree;
+-	struct hfs_bnode *node, *new_node;
++	struct hfs_bnode *node, *new_node, *next_node;
+ 	struct hfs_bnode_desc node_desc;
+ 	int num_recs, new_rec_off, new_off, old_rec_off;
+ 	int data_start, data_end, size;
+@@ -248,6 +248,17 @@ static struct hfs_bnode *hfs_bnode_split(struct hfs_find_data *fd)
+ 	new_node->type = node->type;
+ 	new_node->height = node->height;
+ 
++	if (node->next)
++		next_node = hfs_bnode_find(tree, node->next);
++	else
++		next_node = NULL;
++
++	if (IS_ERR(next_node)) {
++		hfs_bnode_put(node);
++		hfs_bnode_put(new_node);
++		return next_node;
++	}
++
+ 	size = tree->node_size / 2 - node->num_recs * 2 - 14;
+ 	old_rec_off = tree->node_size - 4;
+ 	num_recs = 1;
+@@ -261,6 +272,8 @@ static struct hfs_bnode *hfs_bnode_split(struct hfs_find_data *fd)
+ 		/* panic? */
+ 		hfs_bnode_put(node);
+ 		hfs_bnode_put(new_node);
++		if (next_node)
++			hfs_bnode_put(next_node);
+ 		return ERR_PTR(-ENOSPC);
+ 	}
+ 
+@@ -315,8 +328,7 @@ static struct hfs_bnode *hfs_bnode_split(struct hfs_find_data *fd)
+ 	hfs_bnode_write(node, &node_desc, 0, sizeof(node_desc));
+ 
+ 	/* update next bnode header */
+-	if (new_node->next) {
+-		struct hfs_bnode *next_node = hfs_bnode_find(tree, new_node->next);
++	if (next_node) {
+ 		next_node->prev = new_node->this;
+ 		hfs_bnode_read(next_node, &node_desc, 0, sizeof(node_desc));
+ 		node_desc.prev = cpu_to_be32(next_node->prev);
+diff --git a/fs/isofs/compress.c b/fs/isofs/compress.c
+index 37dbd64..defb932 100644
+--- a/fs/isofs/compress.c
++++ b/fs/isofs/compress.c
+@@ -72,6 +72,17 @@ static int zisofs_readpage(struct file *file, struct page *page)
+ 	offset = index & ~zisofs_block_page_mask;
+ 	blockindex = offset >> zisofs_block_page_shift;
+ 	maxpage = (inode->i_size + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
++
++	/*
++	 * If this page is wholly outside i_size we just return zero;
++	 * do_generic_file_read() will handle this for us
++	 */
++	if (page->index >= maxpage) {
++		SetPageUptodate(page);
++		unlock_page(page);
++		return 0;
++	}
++
+ 	maxpage = min(zisofs_block_pages, maxpage-offset);
+ 
+ 	for ( i = 0 ; i < maxpage ; i++, offset++ ) {
+diff --git a/fs/jbd/journal.c b/fs/jbd/journal.c
+index 3943a89..9816293 100644
+--- a/fs/jbd/journal.c
++++ b/fs/jbd/journal.c
+@@ -697,13 +697,14 @@ fail:
+  */
+ 
+ /**
+- *  journal_t * journal_init_dev() - creates an initialises a journal structure
++ *  journal_t * journal_init_dev() - creates and initialises a journal structure
+  *  @bdev: Block device on which to create the journal
+  *  @fs_dev: Device which hold journalled filesystem for this journal.
+  *  @start: Block nr Start of journal.
+  *  @len:  Length of the journal in blocks.
+  *  @blocksize: blocksize of journalling device
+- *  @returns: a newly created journal_t *
++ *
++ *  Returns: a newly created journal_t *
+  *
+  *  journal_init_dev creates a journal which maps a fixed contiguous
+  *  range of blocks on an arbitrary block device.
+diff --git a/fs/jbd/recovery.c b/fs/jbd/recovery.c
+index 2b8edf4..43bc5e5 100644
+--- a/fs/jbd/recovery.c
++++ b/fs/jbd/recovery.c
+@@ -478,7 +478,7 @@ static int do_one_pass(journal_t *journal,
+ 					memcpy(nbh->b_data, obh->b_data,
+ 							journal->j_blocksize);
+ 					if (flags & JFS_FLAG_ESCAPE) {
+-						*((__be32 *)bh->b_data) =
++						*((__be32 *)nbh->b_data) =
+ 						cpu_to_be32(JFS_MAGIC_NUMBER);
+ 					}
+ 
+diff --git a/fs/jbd/transaction.c b/fs/jbd/transaction.c
+index c6cbb6c..2c9e8f5 100644
+--- a/fs/jbd/transaction.c
++++ b/fs/jbd/transaction.c
+@@ -1426,7 +1426,8 @@ int journal_stop(handle_t *handle)
+ 	return err;
+ }
+ 
+-/**int journal_force_commit() - force any uncommitted transactions
++/**
++ * int journal_force_commit() - force any uncommitted transactions
+  * @journal: journal to force
+  *
+  * For synchronous operations: force any uncommitted transactions
+@@ -1903,13 +1904,12 @@ zap_buffer_unlocked:
+ }
+ 
+ /**
+- * void journal_invalidatepage()
+- * @journal: journal to use for flush...
++ * void journal_invalidatepage() - invalidate a journal page
++ * @journal: journal to use for flush
+  * @page:    page to flush
+  * @offset:  length of page to invalidate.
+  *
+  * Reap page buffers containing data after offset in page.
+- *
+  */
+ void journal_invalidatepage(journal_t *journal,
+ 		      struct page *page,
+diff --git a/fs/jbd2/recovery.c b/fs/jbd2/recovery.c
+index 1464113..5d0405a 100644
+--- a/fs/jbd2/recovery.c
++++ b/fs/jbd2/recovery.c
+@@ -535,7 +535,7 @@ static int do_one_pass(journal_t *journal,
+ 					memcpy(nbh->b_data, obh->b_data,
+ 							journal->j_blocksize);
+ 					if (flags & JBD2_FLAG_ESCAPE) {
+-						*((__be32 *)bh->b_data) =
++						*((__be32 *)nbh->b_data) =
+ 						cpu_to_be32(JBD2_MAGIC_NUMBER);
+ 					}
+ 
+diff --git a/fs/locks.c b/fs/locks.c
+index f36f0e6..d83fab1 100644
+--- a/fs/locks.c
++++ b/fs/locks.c
+@@ -1275,13 +1275,13 @@ out:
+ EXPORT_SYMBOL(__break_lease);
+ 
+ /**
+- *	lease_get_mtime
++ *	lease_get_mtime - get the last modified time of an inode
+  *	@inode: the inode
+  *      @time:  pointer to a timespec which will contain the last modified time
+  *
+  * This is to force NFS clients to flush their caches for files with
+  * exclusive leases.  The justification is that if someone has an
+- * exclusive lease, then they could be modifiying it.
++ * exclusive lease, then they could be modifying it.
+  */
+ void lease_get_mtime(struct inode *inode, struct timespec *time)
+ {
+diff --git a/fs/namei.c b/fs/namei.c
+index 941c8e8..6b7a0ee 100644
+--- a/fs/namei.c
++++ b/fs/namei.c
+@@ -1364,13 +1364,13 @@ static int __lookup_one_len(const char *name, struct qstr *this,
+ }
+ 
+ /**
+- * lookup_one_len:  filesystem helper to lookup single pathname component
++ * lookup_one_len - filesystem helper to lookup single pathname component
+  * @name:	pathname component to lookup
+  * @base:	base directory to lookup from
+  * @len:	maximum length @len should be interpreted to
+  *
+- * Note that this routine is purely a helper for filesystem useage and should
+- * not be called by generic code.  Also note that by using this function to
++ * Note that this routine is purely a helper for filesystem usage and should
++ * not be called by generic code.  Also note that by using this function the
+  * nameidata argument is passed to the filesystem methods and a filesystem
+  * using this helper needs to be prepared for that.
+  */
+diff --git a/fs/proc/base.c b/fs/proc/base.c
+index 9a4da0a..8a10f6f 100644
+--- a/fs/proc/base.c
++++ b/fs/proc/base.c
+@@ -1036,6 +1036,26 @@ static const struct file_operations proc_loginuid_operations = {
+ 	.read		= proc_loginuid_read,
+ 	.write		= proc_loginuid_write,
+ };
++
++static ssize_t proc_sessionid_read(struct file * file, char __user * buf,
++				  size_t count, loff_t *ppos)
++{
++	struct inode * inode = file->f_path.dentry->d_inode;
++	struct task_struct *task = get_proc_task(inode);
++	ssize_t length;
++	char tmpbuf[TMPBUFLEN];
++
++	if (!task)
++		return -ESRCH;
++	length = scnprintf(tmpbuf, TMPBUFLEN, "%u",
++				audit_get_sessionid(task));
++	put_task_struct(task);
++	return simple_read_from_buffer(buf, count, ppos, tmpbuf, length);
++}
++
++static const struct file_operations proc_sessionid_operations = {
++	.read		= proc_sessionid_read,
++};
+ #endif
+ 
+ #ifdef CONFIG_FAULT_INJECTION
+@@ -2319,6 +2339,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),
+ #endif
+ #ifdef CONFIG_FAULT_INJECTION
+ 	REG("make-it-fail", S_IRUGO|S_IWUSR, fault_inject),
+@@ -2649,6 +2670,7 @@ static const struct pid_entry tid_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),
+ #endif
+ #ifdef CONFIG_FAULT_INJECTION
+ 	REG("make-it-fail", S_IRUGO|S_IWUSR, fault_inject),
+diff --git a/fs/romfs/inode.c b/fs/romfs/inode.c
+index 00b6f0a..3f13d49 100644
+--- a/fs/romfs/inode.c
++++ b/fs/romfs/inode.c
+@@ -340,8 +340,9 @@ static struct dentry *
+ romfs_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd)
+ {
+ 	unsigned long offset, maxoff;
+-	int fslen, res;
+-	struct inode *inode;
++	long res;
++	int fslen;
++	struct inode *inode = NULL;
+ 	char fsname[ROMFS_MAXFN];	/* XXX dynamic? */
+ 	struct romfs_inode ri;
+ 	const char *name;		/* got from dentry */
+@@ -351,7 +352,7 @@ romfs_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd)
+ 	offset = dir->i_ino & ROMFH_MASK;
+ 	lock_kernel();
+ 	if (romfs_copyfrom(dir, &ri, offset, ROMFH_SIZE) <= 0)
+-		goto out;
++		goto error;
+ 
+ 	maxoff = romfs_maxsize(dir->i_sb);
+ 	offset = be32_to_cpu(ri.spec) & ROMFH_MASK;
+@@ -364,9 +365,9 @@ romfs_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd)
+ 
+ 	for(;;) {
+ 		if (!offset || offset >= maxoff)
+-			goto out0;
++			goto success; /* negative success */
+ 		if (romfs_copyfrom(dir, &ri, offset, ROMFH_SIZE) <= 0)
+-			goto out;
++			goto error;
+ 
+ 		/* try to match the first 16 bytes of name */
+ 		fslen = romfs_strnlen(dir, offset+ROMFH_SIZE, ROMFH_SIZE);
+@@ -397,23 +398,14 @@ romfs_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd)
+ 	inode = romfs_iget(dir->i_sb, offset);
+ 	if (IS_ERR(inode)) {
+ 		res = PTR_ERR(inode);
+-		goto out;
++		goto error;
+ 	}
+ 
+-	/*
+-	 * it's a bit funky, _lookup needs to return an error code
+-	 * (negative) or a NULL, both as a dentry.  ENOENT should not
+-	 * be returned, instead we need to create a negative dentry by
+-	 * d_add(dentry, NULL); and return 0 as no error.
+-	 * (Although as I see, it only matters on writable file
+-	 * systems).
+-	 */
+-
+-out0:	inode = NULL;
++success:
++	d_add(dentry, inode);
+ 	res = 0;
+-	d_add (dentry, inode);
+-
+-out:	unlock_kernel();
++error:
++	unlock_kernel();
+ 	return ERR_PTR(res);
+ }
+ 
+diff --git a/fs/super.c b/fs/super.c
+index 010446d..d0a941a 100644
+--- a/fs/super.c
++++ b/fs/super.c
+@@ -556,11 +556,11 @@ out:
+ }
+ 
+ /**
+- *	mark_files_ro
++ *	mark_files_ro - mark all files read-only
+  *	@sb: superblock in question
+  *
+- *	All files are marked read/only.  We don't care about pending
+- *	delete files so this should be used in 'force' mode only
++ *	All files are marked read-only.  We don't care about pending
++ *	delete files so this should be used in 'force' mode only.
+  */
+ 
+ static void mark_files_ro(struct super_block *sb)
+diff --git a/fs/ufs/balloc.c b/fs/ufs/balloc.c
+index 1fca381..1e7598f 100644
+--- a/fs/ufs/balloc.c
++++ b/fs/ufs/balloc.c
+@@ -315,8 +315,8 @@ static void ufs_change_blocknr(struct inode *inode, sector_t beg,
+ 			}
+ 
+ 			UFSD(" change from %llu to %llu, pos %u\n",
+-			     (unsigned long long)pos + oldb,
+-			     (unsigned long long)pos + newb, pos);
++			     (unsigned long long)(pos + oldb),
++			     (unsigned long long)(pos + newb), pos);
+ 
+ 			bh->b_blocknr = newb + pos;
+ 			unmap_underlying_metadata(bh->b_bdev,
+diff --git a/include/linux/Kbuild b/include/linux/Kbuild
+index 0fac822..4108b38 100644
+--- a/include/linux/Kbuild
++++ b/include/linux/Kbuild
+@@ -127,7 +127,6 @@ header-y += pkt_sched.h
+ header-y += posix_types.h
+ header-y += ppdev.h
+ header-y += prctl.h
+-header-y += ps2esdi.h
+ header-y += qnxtypes.h
+ header-y += quotaio_v1.h
+ header-y += quotaio_v2.h
+diff --git a/include/linux/jbd.h b/include/linux/jbd.h
+index b18fd3b..423f582 100644
+--- a/include/linux/jbd.h
++++ b/include/linux/jbd.h
+@@ -348,8 +348,7 @@ static inline void jbd_unlock_bh_journal_head(struct buffer_head *bh)
+ struct jbd_revoke_table_s;
+ 
+ /**
+- * struct handle_s - The handle_s type is the concrete type associated with
+- *     handle_t.
++ * struct handle_s - this is the concrete type associated with handle_t.
+  * @h_transaction: Which compound transaction is this update a part of?
+  * @h_buffer_credits: Number of remaining buffers we are allowed to dirty.
+  * @h_ref: Reference count on this handle
+@@ -358,12 +357,7 @@ struct jbd_revoke_table_s;
+  * @h_jdata: flag to force data journaling
+  * @h_aborted: flag indicating fatal error on handle
+  * @h_lockdep_map: lockdep info for debugging lock problems
+- **/
+-
+-/* Docbook can't yet cope with the bit fields, but will leave the documentation
+- * in so it can be fixed later.
+  */
+-
+ struct handle_s
+ {
+ 	/* Which compound transaction is this update a part of? */
+@@ -558,8 +552,7 @@ struct transaction_s
+ };
+ 
+ /**
+- * struct journal_s - The journal_s type is the concrete type associated with
+- *     journal_t.
++ * struct journal_s - this is the concrete type associated with journal_t.
+  * @j_flags:  General journaling state flags
+  * @j_errno:  Is there an outstanding uncleared error on the journal (from a
+  *     prior abort)?
+diff --git a/include/linux/memstick.h b/include/linux/memstick.h
+index b7ee258..3e686ec 100644
+--- a/include/linux/memstick.h
++++ b/include/linux/memstick.h
+@@ -239,7 +239,6 @@ struct memstick_request {
+ 	unsigned char tpc;
+ 	unsigned char data_dir:1,
+ 		      need_card_int:1,
+-		      get_int_reg:1,
+ 		      long_data:1;
+ 	unsigned char int_reg;
+ 	int           error;
+diff --git a/include/linux/pci.h b/include/linux/pci.h
+index 9010f54..b7e4b63 100644
+--- a/include/linux/pci.h
++++ b/include/linux/pci.h
+@@ -1045,6 +1045,8 @@ void __iomem *pcim_iomap(struct pci_dev *pdev, int bar, unsigned long maxlen);
+ void pcim_iounmap(struct pci_dev *pdev, void __iomem *addr);
+ void __iomem * const *pcim_iomap_table(struct pci_dev *pdev);
+ int pcim_iomap_regions(struct pci_dev *pdev, u16 mask, const char *name);
++int pcim_iomap_regions_request_all(struct pci_dev *pdev, u16 mask,
++				   const char *name);
+ void pcim_iounmap_regions(struct pci_dev *pdev, u16 mask);
+ 
+ extern int pci_pci_problems;
+diff --git a/include/linux/ps2esdi.h b/include/linux/ps2esdi.h
+deleted file mode 100644
+index c0e050b..0000000
+--- a/include/linux/ps2esdi.h
++++ /dev/null
+@@ -1,98 +0,0 @@
+-#ifndef _PS2ESDI_H_
+-#define _PS2ESDI_H_
+-
+-#define NRML_ESDI_ID 0xddff
+-#define INTG_ESDI_ID 0xdf9f
+-
+-#define PRIMARY_IO_BASE 0x3510
+-#define ALT_IO_BASE 0x3518
+-
+-#define ESDI_CMD_INT (io_base+0)
+-#define ESDI_STT_INT (io_base+0)
+-#define ESDI_CONTROL (io_base+2)
+-#define ESDI_STATUS  (io_base+2)
+-#define ESDI_ATTN    (io_base+3)
+-#define ESDI_INTRPT  (io_base+3)
+-
+-#define STATUS_ENABLED    0x01
+-#define STATUS_ALTERNATE  0x02
+-#define STATUS_BUSY       0x10
+-#define STATUS_STAT_AVAIL 0x08
+-#define STATUS_INTR       0x01
+-#define STATUS_RESET_FAIL 0xea
+-#define STATUS_CMD_INF	  0x04
+-
+-#define CTRL_SOFT_RESET   0xe4
+-#define CTRL_HARD_RESET   0x80
+-#define CTRL_EOI          0xe2
+-#define CTRL_ENABLE_DMA   0x02
+-#define CTRL_ENABLE_INTR  0x01
+-#define CTRL_DISABLE_INTR  0x00
+-
+-#define ATT_EOI 0x02
+-
+-/* bits of word 0 of configuration status block. more info see p.38 of tech ref */
+-#define CONFIG_IS 0x10 /* Invalid Secondary */
+-#define CONFIG_ZD 0x08 /* Zero Defect */
+-#define CONFIG_SF 0x04 /* Skewed Format */
+-#define CONFIG_FR 0x02 /* Removable */
+-#define CONFIG_RT 0x01 /* Retries */
+-
+-#define PORT_SYS_A   0x92
+-#define PORT_DMA_FN  0x18
+-#define PORT_DMA_EX  0x1a
+-
+-#define ON (unsigned char)0x40
+-#define OFF (unsigned char)~ON
+-#define LITE_ON outb(inb(PORT_SYS_A) | ON,PORT_SYS_A)
+-#define LITE_OFF outb((inb(PORT_SYS_A) & OFF),PORT_SYS_A)
+-
+-#define FAIL 0
+-#define SUCCES 1
+-
+-#define INT_CMD_COMPLETE 0x01
+-#define INT_CMD_ECC      0x03
+-#define INT_CMD_RETRY    0x05
+-#define INT_CMD_FORMAT   0x06
+-#define INT_CMD_ECC_RETRY 0x07
+-#define INT_CMD_WARNING  0x08
+-#define INT_CMD_ABORT    0x09
+-#define INT_RESET        0x0A
+-#define INT_TRANSFER_REQ 0x0B
+-#define INT_CMD_FAILED   0x0C
+-#define INT_DMA_ERR      0x0D
+-#define INT_CMD_BLK_ERR  0x0E
+-#define INT_ATTN_ERROR   0x0F
+-
+-#define DMA_MASK_CHAN 0x90
+-#define DMA_UNMASK_CHAN 0xA0
+-#define DMA_WRITE_ADDR 0x20
+-#define DMA_WRITE_TC 0x40
+-#define DMA_WRITE_MODE 0x70
+-
+-#define CMD_GET_DEV_CONFIG 0x09
+-#define CMD_READ 0x4601
+-#define CMD_WRITE 0x4602
+-#define DMA_READ_16 0x4C
+-#define DMA_WRITE_16 0x44
+-
+-
+-#define MB 1024*1024
+-#define SECT_SIZE 512   
+-
+-#define ERROR 1
+-#define OK 0
+-
+-#define HDIO_GETGEO 0x0301
+-
+-#define FALSE 0
+-#define TRUE !FALSE
+-
+-struct ps2esdi_geometry {
+-	unsigned char heads;
+-	unsigned char sectors;
+-	unsigned short cylinders;
+-	unsigned long start;
+-};
+-
+-#endif /* _PS2ESDI_H_ */
+diff --git a/include/linux/rcupreempt.h b/include/linux/rcupreempt.h
+index 01152ed..d038aa6 100644
+--- a/include/linux/rcupreempt.h
++++ b/include/linux/rcupreempt.h
+@@ -87,15 +87,15 @@ DECLARE_PER_CPU(long, dynticks_progress_counter);
+ 
+ static inline void rcu_enter_nohz(void)
+ {
++	smp_mb(); /* CPUs seeing ++ must see prior RCU read-side crit sects */
+ 	__get_cpu_var(dynticks_progress_counter)++;
+ 	WARN_ON(__get_cpu_var(dynticks_progress_counter) & 0x1);
+-	mb();
+ }
+ 
+ static inline void rcu_exit_nohz(void)
+ {
+-	mb();
+ 	__get_cpu_var(dynticks_progress_counter)++;
++	smp_mb(); /* CPUs seeing ++ must see later RCU read-side crit sects */
+ 	WARN_ON(!(__get_cpu_var(dynticks_progress_counter) & 0x1));
+ }
+ 
+diff --git a/include/linux/sched.h b/include/linux/sched.h
+index 11d8e9a..3625fca 100644
+--- a/include/linux/sched.h
++++ b/include/linux/sched.h
+@@ -929,6 +929,9 @@ struct sched_entity {
+ 	u64			vruntime;
+ 	u64			prev_sum_exec_runtime;
+ 
++	u64			last_wakeup;
++	u64			avg_overlap;
++
+ #ifdef CONFIG_SCHEDSTATS
+ 	u64			wait_start;
+ 	u64			wait_max;
+diff --git a/include/linux/topology.h b/include/linux/topology.h
+index 2352f46..2d8dac8 100644
+--- a/include/linux/topology.h
++++ b/include/linux/topology.h
+@@ -138,7 +138,6 @@
+ 				| SD_BALANCE_FORK	\
+ 				| SD_BALANCE_EXEC	\
+ 				| SD_WAKE_AFFINE	\
+-				| SD_WAKE_IDLE		\
+ 				| SD_SHARE_PKG_RESOURCES\
+ 				| BALANCE_FOR_MC_POWER,	\
+ 	.last_balance		= jiffies,		\
+diff --git a/include/linux/virtio.h b/include/linux/virtio.h
+index 260d1fc..12c18ac 100644
+--- a/include/linux/virtio.h
++++ b/include/linux/virtio.h
+@@ -43,8 +43,9 @@ struct virtqueue
+  *	vq: the struct virtqueue we're talking about.
+  * @enable_cb: restart callbacks after disable_cb.
+  *	vq: the struct virtqueue we're talking about.
+- *	This returns "false" (and doesn't re-enable) if there are pending
+- *	buffers in the queue, to avoid a race.
++ *	This re-enables callbacks; it returns "false" if there are pending
++ *	buffers in the queue, to detect a possible race between the driver
++ *	checking for more work, and enabling callbacks.
+  *
+  * Locking rules are straightforward: the driver is responsible for
+  * locking.  No two operations may be invoked simultaneously.
+diff --git a/kernel/relay.c b/kernel/relay.c
+index d080b9d..4c035a8 100644
+--- a/kernel/relay.c
++++ b/kernel/relay.c
+@@ -1066,7 +1066,7 @@ static int subbuf_splice_actor(struct file *in,
+ 			       unsigned int flags,
+ 			       int *nonpad_ret)
+ {
+-	unsigned int pidx, poff, total_len, subbuf_pages, ret;
++	unsigned int pidx, poff, total_len, subbuf_pages, nr_pages, ret;
+ 	struct rchan_buf *rbuf = in->private_data;
+ 	unsigned int subbuf_size = rbuf->chan->subbuf_size;
+ 	uint64_t pos = (uint64_t) *ppos;
+@@ -1097,8 +1097,9 @@ static int subbuf_splice_actor(struct file *in,
+ 	subbuf_pages = rbuf->chan->alloc_size >> PAGE_SHIFT;
+ 	pidx = (read_start / PAGE_SIZE) % subbuf_pages;
+ 	poff = read_start & ~PAGE_MASK;
++	nr_pages = min_t(unsigned int, subbuf_pages, PIPE_BUFFERS);
+ 
+-	for (total_len = 0; spd.nr_pages < subbuf_pages; spd.nr_pages++) {
++	for (total_len = 0; spd.nr_pages < nr_pages; spd.nr_pages++) {
+ 		unsigned int this_len, this_end, private;
+ 		unsigned int cur_pos = read_start + total_len;
+ 
+diff --git a/kernel/sched.c b/kernel/sched.c
+index d1ad69b..3f7c5eb 100644
+--- a/kernel/sched.c
++++ b/kernel/sched.c
+@@ -1396,6 +1396,12 @@ task_hot(struct task_struct *p, u64 now, struct sched_domain *sd)
+ {
+ 	s64 delta;
+ 
++	/*
++	 * Buddy candidates are cache hot:
++	 */
++	if (&p->se == cfs_rq_of(&p->se)->next)
++		return 1;
++
+ 	if (p->sched_class != &fair_sched_class)
+ 		return 0;
+ 
+@@ -1855,10 +1861,11 @@ out_activate:
+ 		schedstat_inc(p, se.nr_wakeups_remote);
+ 	update_rq_clock(rq);
+ 	activate_task(rq, p, 1);
+-	check_preempt_curr(rq, p);
+ 	success = 1;
+ 
+ out_running:
++	check_preempt_curr(rq, p);
++
+ 	p->state = TASK_RUNNING;
+ #ifdef CONFIG_SMP
+ 	if (p->sched_class->task_wake_up)
+@@ -1892,6 +1899,8 @@ static void __sched_fork(struct task_struct *p)
+ 	p->se.exec_start		= 0;
+ 	p->se.sum_exec_runtime		= 0;
+ 	p->se.prev_sum_exec_runtime	= 0;
++	p->se.last_wakeup		= 0;
++	p->se.avg_overlap		= 0;
+ 
+ #ifdef CONFIG_SCHEDSTATS
+ 	p->se.wait_start		= 0;
+diff --git a/kernel/sched_debug.c b/kernel/sched_debug.c
+index 4b5e24c..ef358ba 100644
+--- a/kernel/sched_debug.c
++++ b/kernel/sched_debug.c
+@@ -288,6 +288,7 @@ void proc_sched_show_task(struct task_struct *p, struct seq_file *m)
+ 	PN(se.exec_start);
+ 	PN(se.vruntime);
+ 	PN(se.sum_exec_runtime);
++	PN(se.avg_overlap);
+ 
+ 	nr_switches = p->nvcsw + p->nivcsw;
+ 
+diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c
+index f2cc590..b85cac4 100644
+--- a/kernel/sched_fair.c
++++ b/kernel/sched_fair.c
+@@ -73,13 +73,13 @@ unsigned int sysctl_sched_batch_wakeup_granularity = 10000000UL;
+ 
+ /*
+  * SCHED_OTHER wake-up granularity.
+- * (default: 10 msec * (1 + ilog(ncpus)), units: nanoseconds)
++ * (default: 5 msec * (1 + ilog(ncpus)), units: nanoseconds)
+  *
+  * This option delays the preemption effects of decoupled workloads
+  * and reduces their over-scheduling. Synchronous workloads will still
+  * have immediate wakeup/sleep latencies.
+  */
+-unsigned int sysctl_sched_wakeup_granularity = 10000000UL;
++unsigned int sysctl_sched_wakeup_granularity = 5000000UL;
+ 
+ const_debug unsigned int sysctl_sched_migration_cost = 500000UL;
+ 
+@@ -556,6 +556,21 @@ enqueue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int wakeup)
+ 	account_entity_enqueue(cfs_rq, se);
+ }
+ 
++static void update_avg(u64 *avg, u64 sample)
++{
++	s64 diff = sample - *avg;
++	*avg += diff >> 3;
++}
++
++static void update_avg_stats(struct cfs_rq *cfs_rq, struct sched_entity *se)
++{
++	if (!se->last_wakeup)
++		return;
++
++	update_avg(&se->avg_overlap, se->sum_exec_runtime - se->last_wakeup);
++	se->last_wakeup = 0;
++}
++
+ static void
+ dequeue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int sleep)
+ {
+@@ -566,6 +581,7 @@ dequeue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int sleep)
+ 
+ 	update_stats_dequeue(cfs_rq, se);
+ 	if (sleep) {
++		update_avg_stats(cfs_rq, se);
+ #ifdef CONFIG_SCHEDSTATS
+ 		if (entity_is_task(se)) {
+ 			struct task_struct *tsk = task_of(se);
+@@ -980,96 +996,121 @@ static inline int wake_idle(int cpu, struct task_struct *p)
+ #endif
+ 
+ #ifdef CONFIG_SMP
+-static int select_task_rq_fair(struct task_struct *p, int sync)
++
++static const struct sched_class fair_sched_class;
++
++static int
++wake_affine(struct rq *rq, struct sched_domain *this_sd, struct rq *this_rq,
++	    struct task_struct *p, int prev_cpu, int this_cpu, int sync,
++	    int idx, unsigned long load, unsigned long this_load,
++	    unsigned int imbalance)
+ {
+-	int cpu, this_cpu;
+-	struct rq *rq;
+-	struct sched_domain *sd, *this_sd = NULL;
+-	int new_cpu;
++	struct task_struct *curr = this_rq->curr;
++	unsigned long tl = this_load;
++	unsigned long tl_per_task;
++
++	if (!(this_sd->flags & SD_WAKE_AFFINE))
++		return 0;
++
++	/*
++	 * If the currently running task will sleep within
++	 * a reasonable amount of time then attract this newly
++	 * woken task:
++	 */
++	if (sync && curr->sched_class == &fair_sched_class) {
++		if (curr->se.avg_overlap < sysctl_sched_migration_cost &&
++				p->se.avg_overlap < sysctl_sched_migration_cost)
++			return 1;
++	}
+ 
+-	cpu      = task_cpu(p);
+-	rq       = task_rq(p);
+-	this_cpu = smp_processor_id();
+-	new_cpu  = cpu;
++	schedstat_inc(p, se.nr_wakeups_affine_attempts);
++	tl_per_task = cpu_avg_load_per_task(this_cpu);
+ 
+-	if (cpu == this_cpu)
+-		goto out_set_cpu;
++	/*
++	 * If sync wakeup then subtract the (maximum possible)
++	 * effect of the currently running task from the load
++	 * of the current CPU:
++	 */
++	if (sync)
++		tl -= current->se.load.weight;
++
++	if ((tl <= load && tl + target_load(prev_cpu, idx) <= tl_per_task) ||
++			100*(tl + p->se.load.weight) <= imbalance*load) {
++		/*
++		 * This domain has SD_WAKE_AFFINE and
++		 * p is cache cold in this domain, and
++		 * there is no bad imbalance.
++		 */
++		schedstat_inc(this_sd, ttwu_move_affine);
++		schedstat_inc(p, se.nr_wakeups_affine);
+ 
++		return 1;
++	}
++	return 0;
++}
++
++static int select_task_rq_fair(struct task_struct *p, int sync)
++{
++	struct sched_domain *sd, *this_sd = NULL;
++	int prev_cpu, this_cpu, new_cpu;
++	unsigned long load, this_load;
++	struct rq *rq, *this_rq;
++	unsigned int imbalance;
++	int idx;
++
++	prev_cpu	= task_cpu(p);
++	rq		= task_rq(p);
++	this_cpu	= smp_processor_id();
++	this_rq		= cpu_rq(this_cpu);
++	new_cpu		= prev_cpu;
++
++	/*
++	 * 'this_sd' is the first domain that both
++	 * this_cpu and prev_cpu are present in:
++	 */
+ 	for_each_domain(this_cpu, sd) {
+-		if (cpu_isset(cpu, sd->span)) {
++		if (cpu_isset(prev_cpu, sd->span)) {
+ 			this_sd = sd;
+ 			break;
+ 		}
+ 	}
+ 
+ 	if (unlikely(!cpu_isset(this_cpu, p->cpus_allowed)))
+-		goto out_set_cpu;
++		goto out;
+ 
+ 	/*
+ 	 * Check for affine wakeup and passive balancing possibilities.
+ 	 */
+-	if (this_sd) {
+-		int idx = this_sd->wake_idx;
+-		unsigned int imbalance;
+-		unsigned long load, this_load;
+-
+-		imbalance = 100 + (this_sd->imbalance_pct - 100) / 2;
+-
+-		load = source_load(cpu, idx);
+-		this_load = target_load(this_cpu, idx);
+-
+-		new_cpu = this_cpu; /* Wake to this CPU if we can */
+-
+-		if (this_sd->flags & SD_WAKE_AFFINE) {
+-			unsigned long tl = this_load;
+-			unsigned long tl_per_task;
+-
+-			/*
+-			 * Attract cache-cold tasks on sync wakeups:
+-			 */
+-			if (sync && !task_hot(p, rq->clock, this_sd))
+-				goto out_set_cpu;
+-
+-			schedstat_inc(p, se.nr_wakeups_affine_attempts);
+-			tl_per_task = cpu_avg_load_per_task(this_cpu);
+-
+-			/*
+-			 * If sync wakeup then subtract the (maximum possible)
+-			 * effect of the currently running task from the load
+-			 * of the current CPU:
+-			 */
+-			if (sync)
+-				tl -= current->se.load.weight;
+-
+-			if ((tl <= load &&
+-				tl + target_load(cpu, idx) <= tl_per_task) ||
+-			       100*(tl + p->se.load.weight) <= imbalance*load) {
+-				/*
+-				 * This domain has SD_WAKE_AFFINE and
+-				 * p is cache cold in this domain, and
+-				 * there is no bad imbalance.
+-				 */
+-				schedstat_inc(this_sd, ttwu_move_affine);
+-				schedstat_inc(p, se.nr_wakeups_affine);
+-				goto out_set_cpu;
+-			}
+-		}
++	if (!this_sd)
++		goto out;
+ 
+-		/*
+-		 * Start passive balancing when half the imbalance_pct
+-		 * limit is reached.
+-		 */
+-		if (this_sd->flags & SD_WAKE_BALANCE) {
+-			if (imbalance*this_load <= 100*load) {
+-				schedstat_inc(this_sd, ttwu_move_balance);
+-				schedstat_inc(p, se.nr_wakeups_passive);
+-				goto out_set_cpu;
+-			}
++	idx = this_sd->wake_idx;
++
++	imbalance = 100 + (this_sd->imbalance_pct - 100) / 2;
++
++	load = source_load(prev_cpu, idx);
++	this_load = target_load(this_cpu, idx);
++
++	if (wake_affine(rq, this_sd, this_rq, p, prev_cpu, this_cpu, sync, idx,
++				     load, this_load, imbalance))
++		return this_cpu;
++
++	if (prev_cpu == this_cpu)
++		goto out;
++
++	/*
++	 * Start passive balancing when half the imbalance_pct
++	 * limit is reached.
++	 */
++	if (this_sd->flags & SD_WAKE_BALANCE) {
++		if (imbalance*this_load <= 100*load) {
++			schedstat_inc(this_sd, ttwu_move_balance);
++			schedstat_inc(p, se.nr_wakeups_passive);
++			return this_cpu;
+ 		}
+ 	}
+ 
+-	new_cpu = cpu; /* Could not wake to this_cpu. Wake to cpu instead */
+-out_set_cpu:
++out:
+ 	return wake_idle(new_cpu, p);
+ }
+ #endif /* CONFIG_SMP */
+@@ -1092,6 +1133,10 @@ static void check_preempt_wakeup(struct rq *rq, struct task_struct *p)
+ 		return;
+ 	}
+ 
++	se->last_wakeup = se->sum_exec_runtime;
++	if (unlikely(se == pse))
++		return;
++
+ 	cfs_rq_of(pse)->next = pse;
+ 
+ 	/*
+diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c
+index 548c436..278534b 100644
+--- a/kernel/time/clocksource.c
++++ b/kernel/time/clocksource.c
+@@ -141,13 +141,8 @@ static void clocksource_watchdog(unsigned long data)
+ 	}
+ 
+ 	if (!list_empty(&watchdog_list)) {
+-		/* Cycle through CPUs to check if the CPUs stay synchronized to
+-		 * each other. */
+-		int next_cpu = next_cpu(raw_smp_processor_id(), cpu_online_map);
+-		if (next_cpu >= NR_CPUS)
+-			next_cpu = first_cpu(cpu_online_map);
+-		watchdog_timer.expires += WATCHDOG_INTERVAL;
+-		add_timer_on(&watchdog_timer, next_cpu);
++		__mod_timer(&watchdog_timer,
++			    watchdog_timer.expires + WATCHDOG_INTERVAL);
+ 	}
+ 	spin_unlock(&watchdog_lock);
+ }
+@@ -169,7 +164,7 @@ static void clocksource_check_watchdog(struct clocksource *cs)
+ 		if (!started && watchdog) {
+ 			watchdog_last = watchdog->read();
+ 			watchdog_timer.expires = jiffies + WATCHDOG_INTERVAL;
+-			add_timer_on(&watchdog_timer, first_cpu(cpu_online_map));
++			add_timer(&watchdog_timer);
+ 		}
+ 	} else {
+ 		if (cs->flags & CLOCK_SOURCE_IS_CONTINUOUS)
+@@ -190,8 +185,7 @@ static void clocksource_check_watchdog(struct clocksource *cs)
+ 				watchdog_last = watchdog->read();
+ 				watchdog_timer.expires =
+ 					jiffies + WATCHDOG_INTERVAL;
+-				add_timer_on(&watchdog_timer,
+-						first_cpu(cpu_online_map));
++				add_timer(&watchdog_timer);
+ 			}
+ 		}
+ 	}
+diff --git a/lib/devres.c b/lib/devres.c
+index b1d336c..edc27a5 100644
+--- a/lib/devres.c
++++ b/lib/devres.c
+@@ -298,6 +298,31 @@ int pcim_iomap_regions(struct pci_dev *pdev, u16 mask, const char *name)
+ EXPORT_SYMBOL(pcim_iomap_regions);
+ 
+ /**
++ * pcim_iomap_regions_request_all - Request all BARs and iomap specified ones
++ * @pdev: PCI device to map IO resources for
++ * @mask: Mask of BARs to iomap
++ * @name: Name used when requesting regions
++ *
++ * Request all PCI BARs and iomap regions specified by @mask.
++ */
++int pcim_iomap_regions_request_all(struct pci_dev *pdev, u16 mask,
++				   const char *name)
++{
++	int request_mask = ((1 << 6) - 1) & ~mask;
++	int rc;
++
++	rc = pci_request_selected_regions(pdev, request_mask, name);
++	if (rc)
++		return rc;
++
++	rc = pcim_iomap_regions(pdev, mask, name);
++	if (rc)
++		pci_release_selected_regions(pdev, request_mask);
++	return rc;
++}
++EXPORT_SYMBOL(pcim_iomap_regions_request_all);
++
++/**
+  * pcim_iounmap_regions - Unmap and release PCI BARs
+  * @pdev: PCI device to map IO resources for
+  * @mask: Mask of BARs to unmap and release
+diff --git a/mm/filemap.c b/mm/filemap.c
+index df343d1..07e9d92 100644
+--- a/mm/filemap.c
++++ b/mm/filemap.c
+@@ -343,7 +343,7 @@ int sync_page_range(struct inode *inode, struct address_space *mapping,
+ EXPORT_SYMBOL(sync_page_range);
+ 
+ /**
+- * sync_page_range_nolock
++ * sync_page_range_nolock - write & wait on all pages in the passed range without locking
+  * @inode:	target inode
+  * @mapping:	target address_space
+  * @pos:	beginning offset in pages to write
+@@ -611,7 +611,10 @@ int __lock_page_killable(struct page *page)
+ 					sync_page_killable, TASK_KILLABLE);
+ }
+ 
+-/*
++/**
++ * __lock_page_nosync - get a lock on the page, without calling sync_page()
++ * @page: the page to lock
++ *
+  * Variant of lock_page that does not require the caller to hold a reference
+  * on the page's mapping.
+  */
+@@ -1538,9 +1541,20 @@ repeat:
+ 	return page;
+ }
+ 
+-/*
++/**
++ * read_cache_page_async - read into page cache, fill it if needed
++ * @mapping:	the page's address_space
++ * @index:	the page index
++ * @filler:	function to perform the read
++ * @data:	destination for read data
++ *
+  * Same as read_cache_page, but don't wait for page to become unlocked
+  * after submitting it to the filler.
++ *
++ * Read into the page cache. If a page already exists, and PageUptodate() is
++ * not set, try to fill the page but don't wait for it to become unlocked.
++ *
++ * If the page does not get brought uptodate, return -EIO.
+  */
+ struct page *read_cache_page_async(struct address_space *mapping,
+ 				pgoff_t index,
+diff --git a/mm/fremap.c b/mm/fremap.c
+index 69a37c2..07a9c82 100644
+--- a/mm/fremap.c
++++ b/mm/fremap.c
+@@ -113,7 +113,7 @@ static int populate_range(struct mm_struct *mm, struct vm_area_struct *vma,
+  * mmap()/mremap() it does not create any new vmas. The new mappings are
+  * also safe across swapout.
+  *
+- * NOTE: the 'prot' parameter right now is ignored (but must be zero),
++ * NOTE: the @prot parameter right now is ignored (but must be zero),
+  * and the vma's default protection is used. Arbitrary protections
+  * might be implemented in the future.
+  */
+diff --git a/mm/highmem.c b/mm/highmem.c
+index 35d4773..7da4a7b 100644
+--- a/mm/highmem.c
++++ b/mm/highmem.c
+@@ -104,8 +104,9 @@ static void flush_all_zero_pkmaps(void)
+ 	flush_tlb_kernel_range(PKMAP_ADDR(0), PKMAP_ADDR(LAST_PKMAP));
+ }
+ 
+-/* Flush all unused kmap mappings in order to remove stray
+-   mappings. */
++/**
++ * kmap_flush_unused - flush all unused kmap mappings in order to remove stray mappings
++ */
+ void kmap_flush_unused(void)
+ {
+ 	spin_lock(&kmap_lock);
+@@ -163,6 +164,14 @@ start:
+ 	return vaddr;
+ }
+ 
++/**
++ * kmap_high - map a highmem page into memory
++ * @page: &struct page to map
++ *
++ * Returns the page's virtual memory address.
++ *
++ * We cannot call this from interrupts, as it may block.
++ */
+ void *kmap_high(struct page *page)
+ {
+ 	unsigned long vaddr;
+@@ -170,8 +179,6 @@ void *kmap_high(struct page *page)
+ 	/*
+ 	 * For highmem pages, we can't trust "virtual" until
+ 	 * after we have the lock.
+-	 *
+-	 * We cannot call this from interrupts, as it may block
+ 	 */
+ 	spin_lock(&kmap_lock);
+ 	vaddr = (unsigned long)page_address(page);
+@@ -185,6 +192,10 @@ void *kmap_high(struct page *page)
+ 
+ EXPORT_SYMBOL(kmap_high);
+ 
++/**
++ * kunmap_high - map a highmem page into memory
++ * @page: &struct page to unmap
++ */
+ void kunmap_high(struct page *page)
+ {
+ 	unsigned long vaddr;
+@@ -259,6 +270,12 @@ static struct page_address_slot *page_slot(struct page *page)
+ 	return &page_address_htable[hash_ptr(page, PA_HASH_ORDER)];
+ }
+ 
++/**
++ * page_address - get the mapped virtual address of a page
++ * @page: &struct page to get the virtual address of
++ *
++ * Returns the page's virtual address.
++ */
+ void *page_address(struct page *page)
+ {
+ 	unsigned long flags;
+@@ -288,6 +305,11 @@ done:
+ 
+ EXPORT_SYMBOL(page_address);
+ 
++/**
++ * set_page_address - set a page's virtual address
++ * @page: &struct page to set
++ * @virtual: virtual address to use
++ */
+ void set_page_address(struct page *page, void *virtual)
+ {
+ 	unsigned long flags;
+diff --git a/mm/memcontrol.c b/mm/memcontrol.c
+index 8b9f6ca..9b648bd 100644
+--- a/mm/memcontrol.c
++++ b/mm/memcontrol.c
+@@ -1079,7 +1079,7 @@ static void mem_cgroup_move_task(struct cgroup_subsys *ss,
+ 	 * Only thread group leaders are allowed to migrate, the mm_struct is
+ 	 * in effect owned by the leader
+ 	 */
+-	if (p->tgid != p->pid)
++	if (!thread_group_leader(p))
+ 		goto out;
+ 
+ 	css_get(&mem->css);
+diff --git a/mm/oom_kill.c b/mm/oom_kill.c
+index 44b2da1..f255eda 100644
+--- a/mm/oom_kill.c
++++ b/mm/oom_kill.c
+@@ -37,6 +37,7 @@ static DEFINE_SPINLOCK(zone_scan_mutex);
+  * badness - calculate a numeric value for how bad this task has been
+  * @p: task struct of which task we should calculate
+  * @uptime: current uptime in seconds
++ * @mem: target memory controller
+  *
+  * The formula used is relatively simple and documented inline in the
+  * function. The main rationale is that we want to select a good task
+@@ -264,6 +265,9 @@ static struct task_struct *select_bad_process(unsigned long *ppoints,
+ }
+ 
+ /**
++ * dump_tasks - dump current memory state of all system tasks
++ * @mem: target memory controller
++ *
+  * Dumps the current memory state of all system tasks, excluding kernel threads.
+  * State information includes task's pid, uid, tgid, vm size, rss, cpu, oom_adj
+  * score, and name.
+@@ -298,7 +302,7 @@ static void dump_tasks(const struct mem_cgroup *mem)
+ 	} while_each_thread(g, p);
+ }
+ 
+-/**
++/*
+  * Send SIGKILL to the selected  process irrespective of  CAP_SYS_RAW_IO
+  * flag though it's unlikely that  we select a process with CAP_SYS_RAW_IO
+  * set.
+@@ -504,6 +508,9 @@ void clear_zonelist_oom(struct zonelist *zonelist)
+ 
+ /**
+  * out_of_memory - kill the "best" process when we run out of memory
++ * @zonelist: zonelist pointer
++ * @gfp_mask: memory allocation flags
++ * @order: amount of memory being requested as a power of 2
+  *
+  * If we run out of memory, we have the choice between either
+  * killing a random task (bad), letting the system crash (worse)
+diff --git a/mm/pagewalk.c b/mm/pagewalk.c
+index b4f27d2..1cf1417 100644
+--- a/mm/pagewalk.c
++++ b/mm/pagewalk.c
+@@ -77,11 +77,11 @@ static int walk_pud_range(pgd_t *pgd, unsigned long addr, unsigned long end,
+ 
+ /**
+  * walk_page_range - walk a memory map's page tables with a callback
+- * @mm - memory map to walk
+- * @addr - starting address
+- * @end - ending address
+- * @walk - set of callbacks to invoke for each level of the tree
+- * @private - private data passed to the callback function
++ * @mm: memory map to walk
++ * @addr: starting address
++ * @end: ending address
++ * @walk: set of callbacks to invoke for each level of the tree
++ * @private: private data passed to the callback function
+  *
+  * Recursively walk the page table for the memory area in a VMA,
+  * calling supplied callbacks. Callbacks are called in-order (first
+diff --git a/mm/readahead.c b/mm/readahead.c
+index c9c50ca..8762e89 100644
+--- a/mm/readahead.c
++++ b/mm/readahead.c
+@@ -443,9 +443,10 @@ EXPORT_SYMBOL_GPL(page_cache_sync_readahead);
+  *            pagecache pages
+  *
+  * page_cache_async_ondemand() should be called when a page is used which
+- * has the PG_readahead flag: this is a marker to suggest that the application
++ * has the PG_readahead flag; this is a marker to suggest that the application
+  * has used up enough of the readahead window that we should start pulling in
+- * more pages. */
++ * more pages.
++ */
+ void
+ page_cache_async_readahead(struct address_space *mapping,
+ 			   struct file_ra_state *ra, struct file *filp,
+diff --git a/mm/rmap.c b/mm/rmap.c
+index 0c9a2df..997f069 100644
+--- a/mm/rmap.c
++++ b/mm/rmap.c
+@@ -335,6 +335,7 @@ static int page_referenced_anon(struct page *page,
+ /**
+  * page_referenced_file - referenced check for object-based rmap
+  * @page: the page we're checking references on.
++ * @mem_cont: target memory controller
+  *
+  * For an object-based mapped page, find all the places it is mapped and
+  * check/clear the referenced flag.  This is done by following the page->mapping
+@@ -402,6 +403,7 @@ static int page_referenced_file(struct page *page,
+  * page_referenced - test if the page was referenced
+  * @page: the page to test
+  * @is_locked: caller holds lock on the page
++ * @mem_cont: target memory controller
+  *
+  * Quick test_and_clear_referenced for all mappings to a page,
+  * returns the number of ptes which referenced the page.
+@@ -506,7 +508,7 @@ int page_mkclean(struct page *page)
+ EXPORT_SYMBOL_GPL(page_mkclean);
+ 
+ /**
+- * page_set_anon_rmap - setup new anonymous rmap
++ * __page_set_anon_rmap - setup new anonymous rmap
+  * @page:	the page to add the mapping to
+  * @vma:	the vm area in which the mapping is added
+  * @address:	the user virtual address mapped
+@@ -530,7 +532,7 @@ static void __page_set_anon_rmap(struct page *page,
+ }
+ 
+ /**
+- * page_set_anon_rmap - sanity check anonymous rmap addition
++ * __page_check_anon_rmap - sanity check anonymous rmap addition
+  * @page:	the page to add the mapping to
+  * @vma:	the vm area in which the mapping is added
+  * @address:	the user virtual address mapped
+@@ -583,7 +585,7 @@ void page_add_anon_rmap(struct page *page,
+ 	}
+ }
+ 
+-/*
++/**
+  * page_add_new_anon_rmap - add pte mapping to a new anonymous page
+  * @page:	the page to add the mapping to
+  * @vma:	the vm area in which the mapping is added
+@@ -623,6 +625,8 @@ void page_add_file_rmap(struct page *page)
+ /**
+  * page_dup_rmap - duplicate pte mapping to a page
+  * @page:	the page to add the mapping to
++ * @vma:	the vm area being duplicated
++ * @address:	the user virtual address mapped
+  *
+  * For copy_page_range only: minimal extract from page_add_file_rmap /
+  * page_add_anon_rmap, avoiding unnecessary tests (already checked) so it's
+@@ -642,6 +646,7 @@ void page_dup_rmap(struct page *page, struct vm_area_struct *vma, unsigned long
+ /**
+  * page_remove_rmap - take down pte mapping from a page
+  * @page: page to remove mapping from
++ * @vma: the vm area in which the mapping is removed
+  *
+  * The caller needs to hold the pte lock.
+  */
+@@ -890,6 +895,7 @@ static int try_to_unmap_anon(struct page *page, int migration)
+ /**
+  * try_to_unmap_file - unmap file page using the object-based rmap method
+  * @page: the page to unmap
++ * @migration: migration flag
+  *
+  * Find all the mappings of a page using the mapping pointer and the vma chains
+  * contained in the address_space struct it points to.
+@@ -986,6 +992,7 @@ out:
+ /**
+  * try_to_unmap - try to remove all page table mappings to a page
+  * @page: the page to get unmapped
++ * @migration: migration flag
+  *
+  * Tries to remove all the page table entries which are mapping this
+  * page, used in the pageout path.  Caller must hold the page lock.
+diff --git a/mm/shmem.c b/mm/shmem.c
+index 3372bc5..f514dd3 100644
+--- a/mm/shmem.c
++++ b/mm/shmem.c
+@@ -244,9 +244,8 @@ static void shmem_free_inode(struct super_block *sb)
+ 	}
+ }
+ 
+-/*
++/**
+  * shmem_recalc_inode - recalculate the size of an inode
+- *
+  * @inode: inode to recalc
+  *
+  * We have to calculate the free blocks since the mm can drop
+@@ -270,9 +269,8 @@ static void shmem_recalc_inode(struct inode *inode)
+ 	}
+ }
+ 
+-/*
++/**
+  * shmem_swp_entry - find the swap vector position in the info structure
+- *
+  * @info:  info structure for the inode
+  * @index: index of the page to find
+  * @page:  optional page to add to the structure. Has to be preset to
+@@ -374,13 +372,13 @@ static void shmem_swp_set(struct shmem_inode_info *info, swp_entry_t *entry, uns
+ 	}
+ }
+ 
+-/*
++/**
+  * shmem_swp_alloc - get the position of the swap entry for the page.
+- *                   If it does not exist allocate the entry.
+- *
+  * @info:	info structure for the inode
+  * @index:	index of the page to find
+  * @sgp:	check and recheck i_size? skip allocation?
++ *
++ * If the entry does not exist, allocate it.
+  */
+ static swp_entry_t *shmem_swp_alloc(struct shmem_inode_info *info, unsigned long index, enum sgp_type sgp)
+ {
+@@ -440,9 +438,8 @@ static swp_entry_t *shmem_swp_alloc(struct shmem_inode_info *info, unsigned long
+ 	return entry;
+ }
+ 
+-/*
++/**
+  * shmem_free_swp - free some swap entries in a directory
+- *
+  * @dir:        pointer to the directory
+  * @edir:       pointer after last entry of the directory
+  * @punch_lock: pointer to spinlock when needed for the holepunch case
+@@ -2022,7 +2019,7 @@ static const struct inode_operations shmem_symlink_inode_operations = {
+ };
+ 
+ #ifdef CONFIG_TMPFS_POSIX_ACL
+-/**
++/*
+  * Superblocks without xattr inode operations will get security.* xattr
+  * support from the VFS "for free". As soon as we have any other xattrs
+  * like ACLs, we also need to implement the security.* handlers at
+@@ -2561,12 +2558,11 @@ out4:
+ }
+ module_init(init_tmpfs)
+ 
+-/*
++/**
+  * shmem_file_setup - get an unlinked file living in tmpfs
+- *
+  * @name: name for dentry (to be seen in /proc/<pid>/maps
+  * @size: size to be set for the file
+- *
++ * @flags: vm_flags
+  */
+ struct file *shmem_file_setup(char *name, loff_t size, unsigned long flags)
+ {
+@@ -2621,9 +2617,8 @@ put_memory:
+ 	return ERR_PTR(error);
+ }
+ 
+-/*
++/**
+  * shmem_zero_setup - setup a shared anonymous mapping
+- *
+  * @vma: the vma to be mmapped is prepared by do_mmap_pgoff
+  */
+ int shmem_zero_setup(struct vm_area_struct *vma)
+diff --git a/mm/slab.c b/mm/slab.c
+index e6c698f..bb4070e 100644
+--- a/mm/slab.c
++++ b/mm/slab.c
+@@ -3624,12 +3624,11 @@ void *kmem_cache_alloc(struct kmem_cache *cachep, gfp_t flags)
+ EXPORT_SYMBOL(kmem_cache_alloc);
+ 
+ /**
+- * kmem_ptr_validate - check if an untrusted pointer might
+- *	be a slab entry.
++ * kmem_ptr_validate - check if an untrusted pointer might be a slab entry.
+  * @cachep: the cache we're checking against
+  * @ptr: pointer to validate
+  *
+- * This verifies that the untrusted pointer looks sane:
++ * This verifies that the untrusted pointer looks sane;
+  * it is _not_ a guarantee that the pointer is actually
+  * part of the slab cache in question, but it at least
+  * validates that the pointer can be dereferenced and
+diff --git a/mm/slub.c b/mm/slub.c
+index 96d63eb..ca71d5b 100644
+--- a/mm/slub.c
++++ b/mm/slub.c
+@@ -1536,9 +1536,15 @@ new_slab:
+ 	 * That is only possible if certain conditions are met that are being
+ 	 * checked when a slab is created.
+ 	 */
+-	if (!(gfpflags & __GFP_NORETRY) && (s->flags & __PAGE_ALLOC_FALLBACK))
+-		return kmalloc_large(s->objsize, gfpflags);
+-
++	if (!(gfpflags & __GFP_NORETRY) &&
++				(s->flags & __PAGE_ALLOC_FALLBACK)) {
++		if (gfpflags & __GFP_WAIT)
++			local_irq_enable();
++		object = kmalloc_large(s->objsize, gfpflags);
++		if (gfpflags & __GFP_WAIT)
++			local_irq_disable();
++		return object;
++	}
+ 	return NULL;
+ debug:
+ 	if (!alloc_debug_processing(s, c->page, object, addr))
+diff --git a/mm/swap.c b/mm/swap.c
+index d4ec59a..aa1139c 100644
+--- a/mm/swap.c
++++ b/mm/swap.c
+@@ -78,12 +78,11 @@ void put_page(struct page *page)
+ EXPORT_SYMBOL(put_page);
+ 
+ /**
+- * put_pages_list(): release a list of pages
++ * put_pages_list() - release a list of pages
++ * @pages: list of pages threaded on page->lru
+  *
+  * Release a list of pages which are strung together on page.lru.  Currently
+  * used by read_cache_pages() and related error recovery code.
+- *
+- * @pages: list of pages threaded on page->lru
+  */
+ void put_pages_list(struct list_head *pages)
+ {
+diff --git a/mm/swap_state.c b/mm/swap_state.c
+index ec42f01..50757ee 100644
+--- a/mm/swap_state.c
++++ b/mm/swap_state.c
+@@ -115,6 +115,7 @@ void __delete_from_swap_cache(struct page *page)
+ /**
+  * add_to_swap - allocate swap space for a page
+  * @page: page we want to move to swap
++ * @gfp_mask: memory allocation flags
+  *
+  * Allocate swap space for the page and add the page to the
+  * swap cache.  Caller needs to hold the page lock. 
+@@ -315,6 +316,7 @@ struct page *read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask,
+ /**
+  * swapin_readahead - swap in pages in hope we need them soon
+  * @entry: swap entry of this memory
++ * @gfp_mask: memory allocation flags
+  * @vma: user vma this address belongs to
+  * @addr: target address for mempolicy
+  *
+diff --git a/mm/tiny-shmem.c b/mm/tiny-shmem.c
+index 7020836..f0f5587 100644
+--- a/mm/tiny-shmem.c
++++ b/mm/tiny-shmem.c
+@@ -39,12 +39,11 @@ static int __init init_tmpfs(void)
+ }
+ module_init(init_tmpfs)
+ 
+-/*
++/**
+  * shmem_file_setup - get an unlinked file living in tmpfs
+- *
+  * @name: name for dentry (to be seen in /proc/<pid>/maps
+  * @size: size to be set for the file
+- *
++ * @flags: vm_flags
+  */
+ struct file *shmem_file_setup(char *name, loff_t size, unsigned long flags)
+ {
+@@ -95,9 +94,8 @@ put_memory:
+ 	return ERR_PTR(error);
+ }
+ 
+-/*
++/**
+  * shmem_zero_setup - setup a shared anonymous mapping
+- *
+  * @vma: the vma to be mmapped is prepared by do_mmap_pgoff
+  */
+ int shmem_zero_setup(struct vm_area_struct *vma)
+diff --git a/mm/vmalloc.c b/mm/vmalloc.c
+index 950c0be..ecf91f8 100644
+--- a/mm/vmalloc.c
++++ b/mm/vmalloc.c
+@@ -757,7 +757,8 @@ finished:
+  *	@vma:		vma to cover (map full range of vma)
+  *	@addr:		vmalloc memory
+  *	@pgoff:		number of pages into addr before first page to map
+- *	@returns:	0 for success, -Exxx on failure
++ *
++ *	Returns:	0 for success, -Exxx on failure
+  *
+  *	This function checks that addr is a valid vmalloc'ed area, and
+  *	that it is big enough to cover the vma. Will return failure if
+@@ -829,7 +830,8 @@ static int f(pte_t *pte, pgtable_t table, unsigned long addr, void *data)
+ /**
+  *	alloc_vm_area - allocate a range of kernel address space
+  *	@size:		size of the area
+- *	@returns:	NULL on failure, vm_struct on success
++ *
++ *	Returns:	NULL on failure, vm_struct on success
+  *
+  *	This function reserves a range of kernel address space, and
+  *	allocates pagetables to map that range.  No actual mappings
+diff --git a/net/core/sock.c b/net/core/sock.c
+index 09cb3a7..2654c14 100644
+--- a/net/core/sock.c
++++ b/net/core/sock.c
+@@ -1621,7 +1621,7 @@ static void sock_def_readable(struct sock *sk, int len)
+ {
+ 	read_lock(&sk->sk_callback_lock);
+ 	if (sk->sk_sleep && waitqueue_active(sk->sk_sleep))
+-		wake_up_interruptible(sk->sk_sleep);
++		wake_up_interruptible_sync(sk->sk_sleep);
+ 	sk_wake_async(sk, SOCK_WAKE_WAITD, POLL_IN);
+ 	read_unlock(&sk->sk_callback_lock);
+ }
+@@ -1635,7 +1635,7 @@ static void sock_def_write_space(struct sock *sk)
+ 	 */
+ 	if ((atomic_read(&sk->sk_wmem_alloc) << 1) <= sk->sk_sndbuf) {
+ 		if (sk->sk_sleep && waitqueue_active(sk->sk_sleep))
+-			wake_up_interruptible(sk->sk_sleep);
++			wake_up_interruptible_sync(sk->sk_sleep);
+ 
+ 		/* Should agree with poll, otherwise some programs break */
+ 		if (sock_writeable(sk))
+diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
+index 4bf4807..41a049f 100644
+--- a/security/selinux/hooks.c
++++ b/security/selinux/hooks.c
+@@ -800,7 +800,8 @@ static void selinux_sb_clone_mnt_opts(const struct super_block *oldsb,
+ 	mutex_unlock(&newsbsec->lock);
+ }
+ 
+-int selinux_parse_opts_str(char *options, struct security_mnt_opts *opts)
++static int selinux_parse_opts_str(char *options,
++				  struct security_mnt_opts *opts)
+ {
+ 	char *p;
+ 	char *context = NULL, *defcontext = NULL;
+diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c
+index 0241fd3..38d7075 100644
+--- a/security/smack/smack_lsm.c
++++ b/security/smack/smack_lsm.c
+@@ -1508,7 +1508,7 @@ static int smack_shm_associate(struct shmid_kernel *shp, int shmflg)
+  */
+ static int smack_shm_shmctl(struct shmid_kernel *shp, int cmd)
+ {
+-	char *ssp = smack_of_shm(shp);
++	char *ssp;
+ 	int may;
+ 
+ 	switch (cmd) {
+@@ -1532,6 +1532,7 @@ static int smack_shm_shmctl(struct shmid_kernel *shp, int cmd)
+ 		return -EINVAL;
+ 	}
+ 
++	ssp = smack_of_shm(shp);
+ 	return smk_curacc(ssp, may);
+ }
+ 
+@@ -1616,7 +1617,7 @@ static int smack_sem_associate(struct sem_array *sma, int semflg)
+  */
+ static int smack_sem_semctl(struct sem_array *sma, int cmd)
+ {
+-	char *ssp = smack_of_sem(sma);
++	char *ssp;
+ 	int may;
+ 
+ 	switch (cmd) {
+@@ -1645,6 +1646,7 @@ static int smack_sem_semctl(struct sem_array *sma, int cmd)
+ 		return -EINVAL;
+ 	}
+ 
++	ssp = smack_of_sem(sma);
+ 	return smk_curacc(ssp, may);
+ }
+ 
+@@ -1730,7 +1732,7 @@ static int smack_msg_queue_associate(struct msg_queue *msq, int msqflg)
+  */
+ static int smack_msg_queue_msgctl(struct msg_queue *msq, int cmd)
+ {
+-	char *msp = smack_of_msq(msq);
++	char *msp;
+ 	int may;
+ 
+ 	switch (cmd) {
+@@ -1752,6 +1754,7 @@ static int smack_msg_queue_msgctl(struct msg_queue *msq, int cmd)
+ 		return -EINVAL;
+ 	}
+ 
++	msp = smack_of_msq(msq);
+ 	return smk_curacc(msp, may);
+ }
+ 

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	Thu Mar 20 11:58:33 2008
@@ -1,4 +1,4 @@
-+ bugfix/all/patch-2.6.25-rc6-git3
++ bugfix/all/patch-2.6.25-rc6-git4
 + debian/version.patch
 + debian/kernelvariables.patch
 + debian/doc-build-parallel.patch



More information about the Kernel-svn-changes mailing list