[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,¶ms) == NOTIFY_STOP)
++ || !bound) {
++ notifier_call_chain(KBD_UNBOUND_KEYCODE,¶ms);
++ return;
++ }
++
++ if (unicode) {
++ param.value = unicode;
++ if (notifier_call_chain(KBD_UNICODE,¶ms) == NOTIFY_STOP)
++ return;
++ emit unicode;
++ return;
++ }
++
++ params.value = keysym;
++ if (notifier_call_chain(KBD_KEYSYM,¶ms) == NOTIFY_STOP)
++ return;
++ apply keysym;
++ notifier_call_chain(KBD_POST_KEYSYM,¶ms);
++}
++
++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(¶m, 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, ¶m,
+- 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