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

Maximilian Attems maks at alioth.debian.org
Sun Mar 9 19:58:51 UTC 2008


Author: maks
Date: Sun Mar  9 19:58:51 2008
New Revision: 10760

Log:
add 2.6.25-rc4-git3

important user fixes: x86, ide-cd, crypto..


Added:
   dists/trunk/linux-2.6/debian/patches/bugfix/all/patch-2.6.25-rc4-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-rc4-git3
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/bugfix/all/patch-2.6.25-rc4-git3	Sun Mar  9 19:58:51 2008
@@ -0,0 +1,10789 @@
+diff --git a/Documentation/00-INDEX b/Documentation/00-INDEX
+index 30b327a..042073f 100644
+--- a/Documentation/00-INDEX
++++ b/Documentation/00-INDEX
+@@ -183,8 +183,6 @@ i386/
+ 	- directory with info about Linux on Intel 32 bit architecture.
+ ia64/
+ 	- directory with info about Linux on Intel 64 bit architecture.
+-ide.txt
+-	- important info for users of ATA devices (IDE/EIDE disks and CD-ROMS).
+ infiniband/
+ 	- directory with documents concerning Linux InfiniBand support.
+ initrd.txt
+diff --git a/Documentation/cdrom/ide-cd b/Documentation/cdrom/ide-cd
+index 29721bf..91c0dcc 100644
+--- a/Documentation/cdrom/ide-cd
++++ b/Documentation/cdrom/ide-cd
+@@ -45,7 +45,7 @@ This driver provides the following features:
+ ---------------
+ 
+ 0. The ide-cd relies on the ide disk driver.  See
+-   Documentation/ide.txt for up-to-date information on the ide
++   Documentation/ide/ide.txt for up-to-date information on the ide
+    driver.
+ 
+ 1. Make sure that the ide and ide-cd drivers are compiled into the
+@@ -64,7 +64,7 @@ This driver provides the following features:
+ 
+    Depending on what type of IDE interface you have, you may need to
+    specify additional configuration options.  See
+-   Documentation/ide.txt.
++   Documentation/ide/ide.txt.
+ 
+ 2. You should also ensure that the iso9660 filesystem is either
+    compiled into the kernel or available as a loadable module.  You
+@@ -84,7 +84,7 @@ This driver provides the following features:
+    on the primary IDE interface are called `hda' and `hdb',
+    respectively.  The drives on the secondary interface are called
+    `hdc' and `hdd'.  (Interfaces at other locations get other letters
+-   in the third position; see Documentation/ide.txt.)
++   in the third position; see Documentation/ide/ide.txt.)
+ 
+    If you want your CDROM drive to be found automatically by the
+    driver, you should make sure your IDE interface uses either the
+@@ -93,7 +93,7 @@ This driver provides the following features:
+    be jumpered as `master'.  (If for some reason you cannot configure
+    your system in this manner, you can probably still use the driver.
+    You may have to pass extra configuration information to the kernel
+-   when you boot, however.  See Documentation/ide.txt for more
++   when you boot, however.  See Documentation/ide/ide.txt for more
+    information.)
+ 
+ 4. Boot the system.  If the drive is recognized, you should see a
+@@ -201,7 +201,7 @@ TEST
+ This section discusses some common problems encountered when trying to
+ use the driver, and some possible solutions.  Note that if you are
+ experiencing problems, you should probably also review
+-Documentation/ide.txt for current information about the underlying
++Documentation/ide/ide.txt for current information about the underlying
+ IDE support code.  Some of these items apply only to earlier versions
+ of the driver, but are mentioned here for completeness.
+ 
+@@ -211,7 +211,7 @@ from the driver.
+ a. Drive is not detected during booting.
+ 
+    - Review the configuration instructions above and in
+-     Documentation/ide.txt, and check how your hardware is
++     Documentation/ide/ide.txt, and check how your hardware is
+      configured.
+ 
+    - If your drive is the only device on an IDE interface, it should
+@@ -219,7 +219,7 @@ a. Drive is not detected during booting.
+ 
+    - If your IDE interface is not at the standard addresses of 0x170
+      or 0x1f0, you'll need to explicitly inform the driver using a
+-     lilo option.  See Documentation/ide.txt.  (This feature was
++     lilo option.  See Documentation/ide/ide.txt.  (This feature was
+      added around kernel version 1.3.30.)
+ 
+    - If the autoprobing is not finding your drive, you can tell the
+@@ -245,7 +245,7 @@ a. Drive is not detected during booting.
+      Support for some interfaces needing extra initialization is
+      provided in later 1.3.x kernels.  You may need to turn on
+      additional kernel configuration options to get them to work;
+-     see Documentation/ide.txt.
++     see Documentation/ide/ide.txt.
+ 
+      Even if support is not available for your interface, you may be
+      able to get it to work with the following procedure.  First boot
+@@ -299,7 +299,7 @@ c. System hangups.
+     be worked around by specifying the `serialize' option when
+     booting.  Recent kernels should be able to detect the need for
+     this automatically in most cases, but the detection is not
+-    foolproof.  See Documentation/ide.txt for more information
++    foolproof.  See Documentation/ide/ide.txt for more information
+     about the `serialize' option and the CMD640B.
+ 
+   - Note that many MS-DOS CDROM drivers will work with such buggy
+diff --git a/Documentation/ide.txt b/Documentation/ide.txt
+deleted file mode 100644
+index bcd7cd1..0000000
+--- a/Documentation/ide.txt
++++ /dev/null
+@@ -1,335 +0,0 @@
+-
+-	Information regarding the Enhanced IDE drive in Linux 2.6
+-
+-==============================================================================
+-
+-   
+-   The hdparm utility can be used to control various IDE features on a
+-   running system. It is packaged separately.  Please Look for it on popular
+-   linux FTP sites.
+-   
+-
+-
+-***  IMPORTANT NOTICES:  BUGGY IDE CHIPSETS CAN CORRUPT DATA!!
+-***  =================
+-***  PCI versions of the CMD640 and RZ1000 interfaces are now detected
+-***  automatically at startup when PCI BIOS support is configured.
+-***
+-***  Linux disables the "prefetch" ("readahead") mode of the RZ1000
+-***  to prevent data corruption possible due to hardware design flaws.
+-***
+-***  For the CMD640, linux disables "IRQ unmasking" (hdparm -u1) on any
+-***  drive for which the "prefetch" mode of the CMD640 is turned on.
+-***  If "prefetch" is disabled (hdparm -p8), then "IRQ unmasking" can be
+-***  used again.
+-***
+-***  For the CMD640, linux disables "32bit I/O" (hdparm -c1) on any drive
+-***  for which the "prefetch" mode of the CMD640 is turned off.
+-***  If "prefetch" is enabled (hdparm -p9), then "32bit I/O" can be
+-***  used again.
+-***
+-***  The CMD640 is also used on some Vesa Local Bus (VLB) cards, and is *NOT*
+-***  automatically detected by Linux.  For safe, reliable operation with such
+-***  interfaces, one *MUST* use the "cmd640.probe_vlb" kernel option.
+-***
+-***  Use of the "serialize" option is no longer necessary.
+-
+-================================================================================
+-Common pitfalls:
+-
+-- 40-conductor IDE cables are capable of transferring data in DMA modes up to
+-  udma2, but no faster.
+-
+-- If possible devices should be attached to separate channels if they are
+-  available. Typically the disk on the first and CD-ROM on the second.
+-
+-- If you mix devices on the same cable, please consider using similar devices
+-  in respect of the data transfer mode they support.
+-
+-- Even better try to stick to the same vendor and device type on the same
+-  cable.
+-
+-================================================================================
+-
+-This is the multiple IDE interface driver, as evolved from hd.c.  
+-
+-It supports up to 9 IDE interfaces per default, on one or more IRQs (usually
+-14 & 15).  There can be up to two drives per interface, as per the ATA-6 spec.
+-
+-Primary:    ide0, port 0x1f0; major=3;  hda is minor=0; hdb is minor=64
+-Secondary:  ide1, port 0x170; major=22; hdc is minor=0; hdd is minor=64
+-Tertiary:   ide2, port 0x1e8; major=33; hde is minor=0; hdf is minor=64
+-Quaternary: ide3, port 0x168; major=34; hdg is minor=0; hdh is minor=64
+-fifth..     ide4, usually PCI, probed
+-sixth..     ide5, usually PCI, probed
+-
+-To access devices on interfaces > ide0, device entries please make sure that
+-device files for them are present in /dev.  If not, please create such
+-entries, by using /dev/MAKEDEV.
+-
+-This driver automatically probes for most IDE interfaces (including all PCI
+-ones), for the drives/geometries attached to those interfaces, and for the IRQ
+-lines being used by the interfaces (normally 14, 15 for ide0/ide1).
+-
+-For special cases, interfaces may be specified using kernel "command line"
+-options.  For example,
+-
+-	ide3=0x168,0x36e,10	/* ioports 0x168-0x16f,0x36e, irq 10 */
+-
+-Normally the irq number need not be specified, as ide.c will probe for it:
+-
+-	ide3=0x168,0x36e	/* ioports 0x168-0x16f,0x36e */
+-
+-The standard port, and irq values are these:
+-
+-	ide0=0x1f0,0x3f6,14
+-	ide1=0x170,0x376,15
+-	ide2=0x1e8,0x3ee,11
+-	ide3=0x168,0x36e,10
+-
+-Note that the first parameter reserves 8 contiguous ioports, whereas the
+-second value denotes a single ioport. If in doubt, do a 'cat /proc/ioports'.
+-
+-In all probability the device uses these ports and IRQs if it is attached
+-to the appropriate ide channel.  Pass the parameter for the correct ide
+-channel to the kernel, as explained above.
+-
+-Any number of interfaces may share a single IRQ if necessary, at a slight
+-performance penalty, whether on separate cards or a single VLB card.
+-The IDE driver automatically detects and handles this.  However, this may
+-or may not be harmful to your hardware.. two or more cards driving the same IRQ
+-can potentially burn each other's bus driver, though in practice this
+-seldom occurs.  Be careful, and if in doubt, don't do it!
+-
+-Drives are normally found by auto-probing and/or examining the CMOS/BIOS data.
+-For really weird situations, the apparent (fdisk) geometry can also be specified
+-on the kernel "command line" using LILO.  The format of such lines is:
+-
+-	hdx=cyls,heads,sects,wpcom,irq
+-or	hdx=cdrom
+-
+-where hdx can be any of hda through hdh, Three values are required
+-(cyls,heads,sects).  For example:
+-
+-	hdc=1050,32,64  hdd=cdrom
+-
+-either {hda,hdb} or {hdc,hdd}.  The results of successful auto-probing may
+-override the physical geometry/irq specified, though the "original" geometry
+-may be retained as the "logical" geometry for partitioning purposes (fdisk).
+-
+-If the auto-probing during boot time confuses a drive (ie. the drive works
+-with hd.c but not with ide.c), then an command line option may be specified
+-for each drive for which you'd like the drive to skip the hardware
+-probe/identification sequence.  For example:
+-
+-	hdb=noprobe
+-or
+-	hdc=768,16,32
+-	hdc=noprobe
+-
+-Note that when only one IDE device is attached to an interface, it should be
+-jumpered as "single" or "master", *not* "slave".  Many folks have had
+-"trouble" with cdroms because of this requirement, so the driver now probes
+-for both units, though success is more likely when the drive is jumpered
+-correctly.
+-
+-Courtesy of Scott Snyder and others, the driver supports ATAPI cdrom drives
+-such as the NEC-260 and the new MITSUMI triple/quad speed drives.
+-Such drives will be identified at boot time, just like a hard disk.
+-
+-If for some reason your cdrom drive is *not* found at boot time, you can force
+-the probe to look harder by supplying a kernel command line parameter
+-via LILO, such as:
+-
+-	hdc=cdrom	/* hdc = "master" on second interface */
+-or
+-	hdd=cdrom	/* hdd = "slave" on second interface */
+-
+-For example, a GW2000 system might have a hard drive on the primary
+-interface (/dev/hda) and an IDE cdrom drive on the secondary interface
+-(/dev/hdc).  To mount a CD in the cdrom drive, one would use something like:
+-
+-	ln -sf /dev/hdc /dev/cdrom
+-	mkdir /mnt/cdrom
+-	mount /dev/cdrom /mnt/cdrom -t iso9660 -o ro
+-
+-If, after doing all of the above, mount doesn't work and you see
+-errors from the driver (with dmesg) complaining about `status=0xff',
+-this means that the hardware is not responding to the driver's attempts
+-to read it.  One of the following is probably the problem:
+-
+-  - Your hardware is broken.
+-
+-  - You are using the wrong address for the device, or you have the
+-    drive jumpered wrong.  Review the configuration instructions above.
+-
+-  - Your IDE controller requires some nonstandard initialization sequence
+-    before it will work properly.  If this is the case, there will often
+-    be a separate MS-DOS driver just for the controller.  IDE interfaces
+-    on sound cards usually fall into this category.  Such configurations
+-    can often be made to work by first booting MS-DOS, loading the
+-    appropriate drivers, and then warm-booting linux (without powering
+-    off).  This can be automated using loadlin in the MS-DOS autoexec.
+-
+-If you always get timeout errors, interrupts from the drive are probably
+-not making it to the host.  Check how you have the hardware jumpered
+-and make sure it matches what the driver expects (see the configuration
+-instructions above).  If you have a PCI system, also check the BIOS
+-setup; I've had one report of a system which was shipped with IRQ 15
+-disabled by the BIOS.
+-
+-The kernel is able to execute binaries directly off of the cdrom,
+-provided it is mounted with the default block size of 1024 (as above).
+-
+-Please pass on any feedback on any of this stuff to the maintainer,
+-whose address can be found in linux/MAINTAINERS.
+-
+-Note that if BOTH hd.c and ide.c are configured into the kernel,
+-hd.c will normally be allowed to control the primary IDE interface.
+-This is useful for older hardware that may be incompatible with ide.c,
+-and still allows newer hardware to run on the 2nd/3rd/4th IDE ports
+-under control of ide.c.   To have ide.c also "take over" the primary
+-IDE port in this situation, use the "command line" parameter:  ide0=0x1f0
+-
+-The IDE driver is modularized.  The high level disk/CD-ROM/tape/floppy
+-drivers can always be compiled as loadable modules, the chipset drivers
+-can only be compiled into the kernel, and the core code (ide.c) can be
+-compiled as a loadable module provided no chipset support is needed.
+-
+-When using ide.c as a module in combination with kmod, add:
+-
+-	alias block-major-3 ide-probe
+-
+-to /etc/modprobe.conf.
+-
+-When ide.c is used as a module, you can pass command line parameters to the
+-driver using the "options=" keyword to insmod, while replacing any ',' with
+-';'.  For example:
+-
+-	insmod ide.o options="ide0=serialize ide1=serialize ide2=0x1e8;0x3ee;11"
+-
+-
+-================================================================================
+-
+-Summary of ide driver parameters for kernel command line
+---------------------------------------------------------
+-
+- "hdx="  is recognized for all "x" from "a" to "h", such as "hdc".
+- 
+- "idex=" is recognized for all "x" from "0" to "3", such as "ide1".
+-
+- "hdx=noprobe"		: drive may be present, but do not probe for it
+- 
+- "hdx=none"		: drive is NOT present, ignore cmos and do not probe
+- 
+- "hdx=nowerr"		: ignore the WRERR_STAT bit on this drive
+- 
+- "hdx=cdrom"		: drive is present, and is a cdrom drive
+- 
+- "hdx=cyl,head,sect"	: disk drive is present, with specified geometry
+-
+- "hdx=remap"		: remap access of sector 0 to sector 1 (for EZDrive)
+-
+- "hdx=remap63"		: remap the drive: add 63 to all sector numbers
+-			  (for DM OnTrack)
+-
+- "idex=noautotune"	: driver will NOT attempt to tune interface speed
+-
+- "hdx=autotune"		: driver will attempt to tune interface speed
+-			  to the fastest PIO mode supported,
+-			  if possible for this drive only.
+-			  Not fully supported by all chipset types,
+-			  and quite likely to cause trouble with
+-			  older/odd IDE drives.
+-
+- "hdx=nodma"		: disallow DMA
+-
+- "hdx=scsi"		: the return of the ide-scsi flag, this is useful for
+- 			  allowing ide-floppy, ide-tape, and ide-cdrom|writers
+- 			  to use ide-scsi emulation on a device specific option.
+-
+- "idebus=xx"		: inform IDE driver of VESA/PCI bus speed in MHz,
+-			  where "xx" is between 20 and 66 inclusive,
+-			  used when tuning chipset PIO modes.
+-			  For PCI bus, 25 is correct for a P75 system,
+-			  30 is correct for P90,P120,P180 systems,
+-			  and 33 is used for P100,P133,P166 systems.
+-			  If in doubt, use idebus=33 for PCI.
+-			  As for VLB, it is safest to not specify it.
+-			  Bigger values are safer than smaller ones.
+-
+- "idex=base"		: probe for an interface at the addr specified,
+-			  where "base" is usually 0x1f0 or 0x170
+-			  and "ctl" is assumed to be "base"+0x206
+-			  
+- "idex=base,ctl"	: specify both base and ctl
+-
+- "idex=base,ctl,irq"	: specify base, ctl, and irq number
+-
+- "idex=serialize"	: do not overlap operations on idex. Please note
+-			  that you will have to specify this option for
+-			  both the respective primary and secondary channel
+-			  to take effect.
+-
+- "idex=four"		: four drives on idex and ide(x^1) share same ports
+-			
+- "idex=reset"		: reset interface after probe
+-
+- "idex=ata66"		: informs the interface that it has an 80c cable
+-			  for chipsets that are ATA-66 capable, but the
+-			  ability to bit test for detection is currently
+-			  unknown.
+-
+- "ide=reverse"		: formerly called to pci sub-system, but now local.
+-
+-The following are valid ONLY on ide0, which usually corresponds
+-to the first ATA interface found on the particular host, and the defaults for
+-the base,ctl ports must not be altered.
+-
+- "ide=doubler"		: probe/support IDE doublers on Amiga
+-
+-There may be more options than shown -- use the source, Luke!
+-
+-Everything else is rejected with a "BAD OPTION" message.
+-
+-For legacy IDE VLB host drivers (ali14xx/dtc2278/ht6560b/qd65xx/umc8672)
+-you need to explicitly enable probing by using "probe" kernel parameter,
+-i.e. to enable probing for ALI M14xx chipsets (ali14xx host driver) use:
+-
+-* "ali14xx.probe" boot option when ali14xx driver is built-in the kernel
+-
+-* "probe" module parameter when ali14xx driver is compiled as module
+-  ("modprobe ali14xx probe")
+-
+-Also for legacy CMD640 host driver (cmd640) you need to use "probe_vlb"
+-kernel paremeter to enable probing for VLB version of the chipset (PCI ones
+-are detected automatically).
+-
+-================================================================================
+-
+-Some Terminology
+-----------------
+-IDE = Integrated Drive Electronics, meaning that each drive has a built-in
+-controller, which is why an "IDE interface card" is not a "controller card".
+-
+-ATA = AT (the old IBM 286 computer) Attachment Interface, a draft American
+-National Standard for connecting hard drives to PCs.  This is the official
+-name for "IDE".
+-
+-The latest standards define some enhancements, known as the ATA-6 spec,
+-which grew out of vendor-specific "Enhanced IDE" (EIDE) implementations.
+-
+-ATAPI = ATA Packet Interface, a new protocol for controlling the drives,
+-similar to SCSI protocols, created at the same time as the ATA2 standard.
+-ATAPI is currently used for controlling CDROM, TAPE and FLOPPY (ZIP or
+-LS120/240) devices, removable R/W cartridges, and for high capacity hard disk
+-drives.
+-
+-mlord at pobox.com
+---
+-
+-Wed Apr 17 22:52:44 CEST 2002 edited by Marcin Dalecki, the current
+-maintainer.
+-
+-Wed Aug 20 22:31:29 CEST 2003 updated ide boot options to current ide.c
+-comments at 2.6.0-test4 time. Maciej Soltysiak <solt at dns.toxicfilms.tv>
+diff --git a/Documentation/ide/00-INDEX b/Documentation/ide/00-INDEX
+new file mode 100644
+index 0000000..d6b7788
+--- /dev/null
++++ b/Documentation/ide/00-INDEX
+@@ -0,0 +1,12 @@
++00-INDEX
++    	- this file
++ChangeLog.ide-cd.1994-2004
++	- ide-cd changelog
++ChangeLog.ide-floppy.1996-2002
++	- ide-floppy changelog
++ChangeLog.ide-tape.1995-2002
++	- ide-tape changelog
++ide-tape.txt
++	- info on the IDE ATAPI streaming tape driver
++ide.txt
++	- important info for users of ATA devices (IDE/EIDE disks and CD-ROMS).
+diff --git a/Documentation/ide/ide.txt b/Documentation/ide/ide.txt
+new file mode 100644
+index 0000000..e3b3425
+--- /dev/null
++++ b/Documentation/ide/ide.txt
+@@ -0,0 +1,335 @@
++
++	Information regarding the Enhanced IDE drive in Linux 2.6
++
++==============================================================================
++
++
++   The hdparm utility can be used to control various IDE features on a
++   running system. It is packaged separately.  Please Look for it on popular
++   linux FTP sites.
++
++
++
++***  IMPORTANT NOTICES:  BUGGY IDE CHIPSETS CAN CORRUPT DATA!!
++***  =================
++***  PCI versions of the CMD640 and RZ1000 interfaces are now detected
++***  automatically at startup when PCI BIOS support is configured.
++***
++***  Linux disables the "prefetch" ("readahead") mode of the RZ1000
++***  to prevent data corruption possible due to hardware design flaws.
++***
++***  For the CMD640, linux disables "IRQ unmasking" (hdparm -u1) on any
++***  drive for which the "prefetch" mode of the CMD640 is turned on.
++***  If "prefetch" is disabled (hdparm -p8), then "IRQ unmasking" can be
++***  used again.
++***
++***  For the CMD640, linux disables "32bit I/O" (hdparm -c1) on any drive
++***  for which the "prefetch" mode of the CMD640 is turned off.
++***  If "prefetch" is enabled (hdparm -p9), then "32bit I/O" can be
++***  used again.
++***
++***  The CMD640 is also used on some Vesa Local Bus (VLB) cards, and is *NOT*
++***  automatically detected by Linux.  For safe, reliable operation with such
++***  interfaces, one *MUST* use the "cmd640.probe_vlb" kernel option.
++***
++***  Use of the "serialize" option is no longer necessary.
++
++================================================================================
++Common pitfalls:
++
++- 40-conductor IDE cables are capable of transferring data in DMA modes up to
++  udma2, but no faster.
++
++- If possible devices should be attached to separate channels if they are
++  available. Typically the disk on the first and CD-ROM on the second.
++
++- If you mix devices on the same cable, please consider using similar devices
++  in respect of the data transfer mode they support.
++
++- Even better try to stick to the same vendor and device type on the same
++  cable.
++
++================================================================================
++
++This is the multiple IDE interface driver, as evolved from hd.c.
++
++It supports up to 9 IDE interfaces per default, on one or more IRQs (usually
++14 & 15).  There can be up to two drives per interface, as per the ATA-6 spec.
++
++Primary:    ide0, port 0x1f0; major=3;  hda is minor=0; hdb is minor=64
++Secondary:  ide1, port 0x170; major=22; hdc is minor=0; hdd is minor=64
++Tertiary:   ide2, port 0x1e8; major=33; hde is minor=0; hdf is minor=64
++Quaternary: ide3, port 0x168; major=34; hdg is minor=0; hdh is minor=64
++fifth..     ide4, usually PCI, probed
++sixth..     ide5, usually PCI, probed
++
++To access devices on interfaces > ide0, device entries please make sure that
++device files for them are present in /dev.  If not, please create such
++entries, by using /dev/MAKEDEV.
++
++This driver automatically probes for most IDE interfaces (including all PCI
++ones), for the drives/geometries attached to those interfaces, and for the IRQ
++lines being used by the interfaces (normally 14, 15 for ide0/ide1).
++
++For special cases, interfaces may be specified using kernel "command line"
++options.  For example,
++
++	ide3=0x168,0x36e,10	/* ioports 0x168-0x16f,0x36e, irq 10 */
++
++Normally the irq number need not be specified, as ide.c will probe for it:
++
++	ide3=0x168,0x36e	/* ioports 0x168-0x16f,0x36e */
++
++The standard port, and irq values are these:
++
++	ide0=0x1f0,0x3f6,14
++	ide1=0x170,0x376,15
++	ide2=0x1e8,0x3ee,11
++	ide3=0x168,0x36e,10
++
++Note that the first parameter reserves 8 contiguous ioports, whereas the
++second value denotes a single ioport. If in doubt, do a 'cat /proc/ioports'.
++
++In all probability the device uses these ports and IRQs if it is attached
++to the appropriate ide channel.  Pass the parameter for the correct ide
++channel to the kernel, as explained above.
++
++Any number of interfaces may share a single IRQ if necessary, at a slight
++performance penalty, whether on separate cards or a single VLB card.
++The IDE driver automatically detects and handles this.  However, this may
++or may not be harmful to your hardware.. two or more cards driving the same IRQ
++can potentially burn each other's bus driver, though in practice this
++seldom occurs.  Be careful, and if in doubt, don't do it!
++
++Drives are normally found by auto-probing and/or examining the CMOS/BIOS data.
++For really weird situations, the apparent (fdisk) geometry can also be specified
++on the kernel "command line" using LILO.  The format of such lines is:
++
++	hdx=cyls,heads,sects,wpcom,irq
++or	hdx=cdrom
++
++where hdx can be any of hda through hdh, Three values are required
++(cyls,heads,sects).  For example:
++
++	hdc=1050,32,64  hdd=cdrom
++
++either {hda,hdb} or {hdc,hdd}.  The results of successful auto-probing may
++override the physical geometry/irq specified, though the "original" geometry
++may be retained as the "logical" geometry for partitioning purposes (fdisk).
++
++If the auto-probing during boot time confuses a drive (ie. the drive works
++with hd.c but not with ide.c), then an command line option may be specified
++for each drive for which you'd like the drive to skip the hardware
++probe/identification sequence.  For example:
++
++	hdb=noprobe
++or
++	hdc=768,16,32
++	hdc=noprobe
++
++Note that when only one IDE device is attached to an interface, it should be
++jumpered as "single" or "master", *not* "slave".  Many folks have had
++"trouble" with cdroms because of this requirement, so the driver now probes
++for both units, though success is more likely when the drive is jumpered
++correctly.
++
++Courtesy of Scott Snyder and others, the driver supports ATAPI cdrom drives
++such as the NEC-260 and the new MITSUMI triple/quad speed drives.
++Such drives will be identified at boot time, just like a hard disk.
++
++If for some reason your cdrom drive is *not* found at boot time, you can force
++the probe to look harder by supplying a kernel command line parameter
++via LILO, such as:
++
++	hdc=cdrom	/* hdc = "master" on second interface */
++or
++	hdd=cdrom	/* hdd = "slave" on second interface */
++
++For example, a GW2000 system might have a hard drive on the primary
++interface (/dev/hda) and an IDE cdrom drive on the secondary interface
++(/dev/hdc).  To mount a CD in the cdrom drive, one would use something like:
++
++	ln -sf /dev/hdc /dev/cdrom
++	mkdir /mnt/cdrom
++	mount /dev/cdrom /mnt/cdrom -t iso9660 -o ro
++
++If, after doing all of the above, mount doesn't work and you see
++errors from the driver (with dmesg) complaining about `status=0xff',
++this means that the hardware is not responding to the driver's attempts
++to read it.  One of the following is probably the problem:
++
++  - Your hardware is broken.
++
++  - You are using the wrong address for the device, or you have the
++    drive jumpered wrong.  Review the configuration instructions above.
++
++  - Your IDE controller requires some nonstandard initialization sequence
++    before it will work properly.  If this is the case, there will often
++    be a separate MS-DOS driver just for the controller.  IDE interfaces
++    on sound cards usually fall into this category.  Such configurations
++    can often be made to work by first booting MS-DOS, loading the
++    appropriate drivers, and then warm-booting linux (without powering
++    off).  This can be automated using loadlin in the MS-DOS autoexec.
++
++If you always get timeout errors, interrupts from the drive are probably
++not making it to the host.  Check how you have the hardware jumpered
++and make sure it matches what the driver expects (see the configuration
++instructions above).  If you have a PCI system, also check the BIOS
++setup; I've had one report of a system which was shipped with IRQ 15
++disabled by the BIOS.
++
++The kernel is able to execute binaries directly off of the cdrom,
++provided it is mounted with the default block size of 1024 (as above).
++
++Please pass on any feedback on any of this stuff to the maintainer,
++whose address can be found in linux/MAINTAINERS.
++
++Note that if BOTH hd.c and ide.c are configured into the kernel,
++hd.c will normally be allowed to control the primary IDE interface.
++This is useful for older hardware that may be incompatible with ide.c,
++and still allows newer hardware to run on the 2nd/3rd/4th IDE ports
++under control of ide.c.   To have ide.c also "take over" the primary
++IDE port in this situation, use the "command line" parameter:  ide0=0x1f0
++
++The IDE driver is modularized.  The high level disk/CD-ROM/tape/floppy
++drivers can always be compiled as loadable modules, the chipset drivers
++can only be compiled into the kernel, and the core code (ide.c) can be
++compiled as a loadable module provided no chipset support is needed.
++
++When using ide.c as a module in combination with kmod, add:
++
++	alias block-major-3 ide-probe
++
++to /etc/modprobe.conf.
++
++When ide.c is used as a module, you can pass command line parameters to the
++driver using the "options=" keyword to insmod, while replacing any ',' with
++';'.  For example:
++
++	insmod ide.o options="ide0=serialize ide1=serialize ide2=0x1e8;0x3ee;11"
++
++
++================================================================================
++
++Summary of ide driver parameters for kernel command line
++--------------------------------------------------------
++
++ "hdx="  is recognized for all "x" from "a" to "h", such as "hdc".
++
++ "idex=" is recognized for all "x" from "0" to "3", such as "ide1".
++
++ "hdx=noprobe"		: drive may be present, but do not probe for it
++
++ "hdx=none"		: drive is NOT present, ignore cmos and do not probe
++
++ "hdx=nowerr"		: ignore the WRERR_STAT bit on this drive
++
++ "hdx=cdrom"		: drive is present, and is a cdrom drive
++
++ "hdx=cyl,head,sect"	: disk drive is present, with specified geometry
++
++ "hdx=remap"		: remap access of sector 0 to sector 1 (for EZDrive)
++
++ "hdx=remap63"		: remap the drive: add 63 to all sector numbers
++			  (for DM OnTrack)
++
++ "idex=noautotune"	: driver will NOT attempt to tune interface speed
++
++ "hdx=autotune"		: driver will attempt to tune interface speed
++			  to the fastest PIO mode supported,
++			  if possible for this drive only.
++			  Not fully supported by all chipset types,
++			  and quite likely to cause trouble with
++			  older/odd IDE drives.
++
++ "hdx=nodma"		: disallow DMA
++
++ "hdx=scsi"		: the return of the ide-scsi flag, this is useful for
++ 			  allowing ide-floppy, ide-tape, and ide-cdrom|writers
++ 			  to use ide-scsi emulation on a device specific option.
++
++ "idebus=xx"		: inform IDE driver of VESA/PCI bus speed in MHz,
++			  where "xx" is between 20 and 66 inclusive,
++			  used when tuning chipset PIO modes.
++			  For PCI bus, 25 is correct for a P75 system,
++			  30 is correct for P90,P120,P180 systems,
++			  and 33 is used for P100,P133,P166 systems.
++			  If in doubt, use idebus=33 for PCI.
++			  As for VLB, it is safest to not specify it.
++			  Bigger values are safer than smaller ones.
++
++ "idex=base"		: probe for an interface at the addr specified,
++			  where "base" is usually 0x1f0 or 0x170
++			  and "ctl" is assumed to be "base"+0x206
++
++ "idex=base,ctl"	: specify both base and ctl
++
++ "idex=base,ctl,irq"	: specify base, ctl, and irq number
++
++ "idex=serialize"	: do not overlap operations on idex. Please note
++			  that you will have to specify this option for
++			  both the respective primary and secondary channel
++			  to take effect.
++
++ "idex=four"		: four drives on idex and ide(x^1) share same ports
++
++ "idex=reset"		: reset interface after probe
++
++ "idex=ata66"		: informs the interface that it has an 80c cable
++			  for chipsets that are ATA-66 capable, but the
++			  ability to bit test for detection is currently
++			  unknown.
++
++ "ide=reverse"		: formerly called to pci sub-system, but now local.
++
++The following are valid ONLY on ide0, which usually corresponds
++to the first ATA interface found on the particular host, and the defaults for
++the base,ctl ports must not be altered.
++
++ "ide=doubler"		: probe/support IDE doublers on Amiga
++
++There may be more options than shown -- use the source, Luke!
++
++Everything else is rejected with a "BAD OPTION" message.
++
++For legacy IDE VLB host drivers (ali14xx/dtc2278/ht6560b/qd65xx/umc8672)
++you need to explicitly enable probing by using "probe" kernel parameter,
++i.e. to enable probing for ALI M14xx chipsets (ali14xx host driver) use:
++
++* "ali14xx.probe" boot option when ali14xx driver is built-in the kernel
++
++* "probe" module parameter when ali14xx driver is compiled as module
++  ("modprobe ali14xx probe")
++
++Also for legacy CMD640 host driver (cmd640) you need to use "probe_vlb"
++kernel paremeter to enable probing for VLB version of the chipset (PCI ones
++are detected automatically).
++
++================================================================================
++
++Some Terminology
++----------------
++IDE = Integrated Drive Electronics, meaning that each drive has a built-in
++controller, which is why an "IDE interface card" is not a "controller card".
++
++ATA = AT (the old IBM 286 computer) Attachment Interface, a draft American
++National Standard for connecting hard drives to PCs.  This is the official
++name for "IDE".
++
++The latest standards define some enhancements, known as the ATA-6 spec,
++which grew out of vendor-specific "Enhanced IDE" (EIDE) implementations.
++
++ATAPI = ATA Packet Interface, a new protocol for controlling the drives,
++similar to SCSI protocols, created at the same time as the ATA2 standard.
++ATAPI is currently used for controlling CDROM, TAPE and FLOPPY (ZIP or
++LS120/240) devices, removable R/W cartridges, and for high capacity hard disk
++drives.
++
++mlord at pobox.com
++--
++
++Wed Apr 17 22:52:44 CEST 2002 edited by Marcin Dalecki, the current
++maintainer.
++
++Wed Aug 20 22:31:29 CEST 2003 updated ide boot options to current ide.c
++comments at 2.6.0-test4 time. Maciej Soltysiak <solt at dns.toxicfilms.tv>
+diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
+index 9a5b665..533e67f 100644
+--- a/Documentation/kernel-parameters.txt
++++ b/Documentation/kernel-parameters.txt
+@@ -712,7 +712,7 @@ and is between 256 and 4096 characters. It is defined in the file
+ 			Format: <cyl>,<head>,<sect>
+ 
+ 	hd?=		[HW] (E)IDE subsystem
+-	hd?lun=		See Documentation/ide.txt.
++	hd?lun=		See Documentation/ide/ide.txt.
+ 
+ 	highmem=nn[KMG]	[KNL,BOOT] forces the highmem zone to have an exact
+ 			size of <nn>. This works even on boxes that have no
+@@ -766,14 +766,14 @@ and is between 256 and 4096 characters. It is defined in the file
+ 
+ 	ide=		[HW] (E)IDE subsystem
+ 			Format: ide=nodma or ide=doubler or ide=reverse
+-			See Documentation/ide.txt.
++			See Documentation/ide/ide.txt.
+ 
+ 	ide?=		[HW] (E)IDE subsystem
+ 			Format: ide?=noprobe or chipset specific parameters.
+-			See Documentation/ide.txt.
++			See Documentation/ide/ide.txt.
+ 
+ 	idebus=		[HW] (E)IDE subsystem - VLB/PCI bus speed
+-			See Documentation/ide.txt.
++			See Documentation/ide/ide.txt.
+ 
+ 	idle=		[X86]
+ 			Format: idle=poll or idle=mwait
+diff --git a/Documentation/scsi/ChangeLog.arcmsr b/Documentation/scsi/ChangeLog.arcmsr
+index de2bcac..038a3e6 100644
+--- a/Documentation/scsi/ChangeLog.arcmsr
++++ b/Documentation/scsi/ChangeLog.arcmsr
+@@ -109,4 +109,10 @@
+ **						8.replace pci_alloc_consistent()/pci_free_consistent() with kmalloc()/kfree() in arcmsr_iop_message_xfer()
+ **						9. fix the release of dma memory for type B in arcmsr_free_ccb_pool()
+ **						10.fix the arcmsr_polling_hbb_ccbdone()
++** 1.20.00.15	02/27/2008	Erich Chen & Nick Cheng
++**						1.arcmsr_iop_message_xfer() is called from atomic context under the
++**						queuecommand scsi_host_template handler. James Bottomley pointed out
++**						that the current GFP_KERNEL|GFP_DMA flags are wrong: firstly we are in
++**						atomic context, secondly this memory is not used for DMA.
++**						Also removed some unneeded casts. Thanks to Daniel Drake <dsd at gentoo.org>
+ **************************************************************************
+diff --git a/Documentation/vm/slub.txt b/Documentation/vm/slub.txt
+index dcf8bcf..7c13f22 100644
+--- a/Documentation/vm/slub.txt
++++ b/Documentation/vm/slub.txt
+@@ -50,14 +50,14 @@ F.e. in order to boot just with sanity checks and red zoning one would specify:
+ 
+ Trying to find an issue in the dentry cache? Try
+ 
+-	slub_debug=,dentry_cache
++	slub_debug=,dentry
+ 
+ to only enable debugging on the dentry cache.
+ 
+ Red zoning and tracking may realign the slab.  We can just apply sanity checks
+ to the dentry cache with
+ 
+-	slub_debug=F,dentry_cache
++	slub_debug=F,dentry
+ 
+ In case you forgot to enable debugging on the kernel command line: It is
+ possible to enable debugging manually when the kernel is up. Look at the
+diff --git a/arch/blackfin/kernel/fixed_code.S b/arch/blackfin/kernel/fixed_code.S
+index 9026269..5ed4722 100644
+--- a/arch/blackfin/kernel/fixed_code.S
++++ b/arch/blackfin/kernel/fixed_code.S
+@@ -101,9 +101,9 @@ ENDPROC (_atomic_ior32)
+ 
+ .align 16
+ 	/*
+-	 * Atomic ior, 32 bit.
++	 * Atomic and, 32 bit.
+ 	 * Inputs:	P0: memory address to use
+-	 *		R0: value to ior
++	 *		R0: value to and
+ 	 * Outputs:	R0: new contents of the memory address.
+ 	 *		R1: previous contents of the memory address.
+ 	 */
+@@ -112,13 +112,13 @@ ENTRY(_atomic_and32)
+ 	R0 = R1 & R0;
+ 	[P0] = R0;
+ 	rts;
+-ENDPROC (_atomic_ior32)
++ENDPROC (_atomic_and32)
+ 
+ .align 16
+ 	/*
+-	 * Atomic ior, 32 bit.
++	 * Atomic xor, 32 bit.
+ 	 * Inputs:	P0: memory address to use
+-	 *		R0: value to ior
++	 *		R0: value to xor
+ 	 * Outputs:	R0: new contents of the memory address.
+ 	 *		R1: previous contents of the memory address.
+ 	 */
+@@ -127,7 +127,7 @@ ENTRY(_atomic_xor32)
+ 	R0 = R1 ^ R0;
+ 	[P0] = R0;
+ 	rts;
+-ENDPROC (_atomic_ior32)
++ENDPROC (_atomic_xor32)
+ 
+ .align 16
+ 	/*
+diff --git a/arch/blackfin/mach-bf548/boards/ezkit.c b/arch/blackfin/mach-bf548/boards/ezkit.c
+index a0950c1..40846aa 100644
+--- a/arch/blackfin/mach-bf548/boards/ezkit.c
++++ b/arch/blackfin/mach-bf548/boards/ezkit.c
+@@ -323,7 +323,7 @@ static struct platform_device bf5xx_nand_device = {
+ };
+ #endif
+ 
+-#if defined(CONFIG_SDH_BFIN) || defined(CONFIG_SDH_BFIN)
++#if defined(CONFIG_SDH_BFIN) || defined(CONFIG_SDH_BFIN_MODULE)
+ static struct platform_device bf54x_sdh_device = {
+ 	.name = "bfin-sdh",
+ 	.id = 0,
+@@ -636,7 +636,7 @@ static struct platform_device *ezkit_devices[] __initdata = {
+ 	&bf5xx_nand_device,
+ #endif
+ 
+-#if defined(CONFIG_SDH_BFIN) || defined(CONFIG_SDH_BFIN)
++#if defined(CONFIG_SDH_BFIN) || defined(CONFIG_SDH_BFIN_MODULE)
+ 	&bf54x_sdh_device,
+ #endif
+ 
+diff --git a/arch/blackfin/mach-common/entry.S b/arch/blackfin/mach-common/entry.S
+index 2cbb7a0..cee54ce 100644
+--- a/arch/blackfin/mach-common/entry.S
++++ b/arch/blackfin/mach-common/entry.S
+@@ -1369,7 +1369,7 @@ ENTRY(_sys_call_table)
+ 	.long _sys_epoll_pwait
+ 	.long _sys_utimensat
+ 	.long _sys_signalfd
+-	.long _sys_ni_syscall
++	.long _sys_timerfd_create
+ 	.long _sys_eventfd	/* 350 */
+ 	.long _sys_pread64
+ 	.long _sys_pwrite64
+@@ -1378,6 +1378,9 @@ ENTRY(_sys_call_table)
+ 	.long _sys_get_robust_list	/* 355 */
+ 	.long _sys_fallocate
+ 	.long _sys_semtimedop
++	.long _sys_timerfd_settime
++	.long _sys_timerfd_gettime
++
+ 	.rept NR_syscalls-(.-_sys_call_table)/4
+ 	.long _sys_ni_syscall
+ 	.endr
+diff --git a/arch/ia64/hp/common/hwsw_iommu.c b/arch/ia64/hp/common/hwsw_iommu.c
+index 94e5710..8f6bcfe 100644
+--- a/arch/ia64/hp/common/hwsw_iommu.c
++++ b/arch/ia64/hp/common/hwsw_iommu.c
+@@ -71,7 +71,7 @@ hwsw_init (void)
+ #ifdef CONFIG_IA64_GENERIC
+ 		/* Better to have normal DMA than panic */
+ 		printk(KERN_WARNING "%s: Failed to initialize software I/O TLB,"
+-		       " reverting to hpzx1 platform vector\n", __FUNCTION__);
++		       " reverting to hpzx1 platform vector\n", __func__);
+ 		machvec_init("hpzx1");
+ #else
+ 		panic("Unable to initialize software I/O TLB services");
+diff --git a/arch/ia64/hp/common/sba_iommu.c b/arch/ia64/hp/common/sba_iommu.c
+index a944454..523eae6 100644
+--- a/arch/ia64/hp/common/sba_iommu.c
++++ b/arch/ia64/hp/common/sba_iommu.c
+@@ -529,7 +529,7 @@ sba_search_bitmap(struct ioc *ioc, unsigned long bits_wanted, int use_hint)
+ 		base_mask = RESMAP_MASK(bits_wanted);
+ 		mask = base_mask << bitshiftcnt;
+ 
+-		DBG_RES("%s() o %ld %p", __FUNCTION__, o, res_ptr);
++		DBG_RES("%s() o %ld %p", __func__, o, res_ptr);
+ 		for(; res_ptr < res_end ; res_ptr++)
+ 		{ 
+ 			DBG_RES("    %p %lx %lx\n", res_ptr, mask, *res_ptr);
+@@ -679,7 +679,7 @@ sba_alloc_range(struct ioc *ioc, size_t size)
+ #endif
+ 
+ 	DBG_RES("%s(%x) %d -> %lx hint %x/%x\n",
+-		__FUNCTION__, size, pages_needed, pide,
++		__func__, size, pages_needed, pide,
+ 		(uint) ((unsigned long) ioc->res_hint - (unsigned long) ioc->res_map),
+ 		ioc->res_bitshift );
+ 
+@@ -722,8 +722,8 @@ sba_free_range(struct ioc *ioc, dma_addr_t iova, size_t size)
+ 			m = RESMAP_MASK(bits_not_wanted) << (pide & (BITS_PER_LONG - 1));
+ 			bits_not_wanted = 0;
+ 
+-			DBG_RES("%s( ,%x,%x) %x/%lx %x %p %lx\n", __FUNCTION__, (uint) iova, size,
+-		        	bits_not_wanted, m, pide, res_ptr, *res_ptr);
++			DBG_RES("%s( ,%x,%x) %x/%lx %x %p %lx\n", __func__, (uint) iova, size,
++			        bits_not_wanted, m, pide, res_ptr, *res_ptr);
+ 
+ 			ASSERT(m != 0);
+ 			ASSERT(bits_not_wanted);
+@@ -940,8 +940,7 @@ sba_map_single(struct device *dev, void *addr, size_t size, int dir)
+ 
+ 	iovp = (dma_addr_t) pide << iovp_shift;
+ 
+-	DBG_RUN("%s() 0x%p -> 0x%lx\n",
+-		__FUNCTION__, addr, (long) iovp | offset);
++	DBG_RUN("%s() 0x%p -> 0x%lx\n", __func__, addr, (long) iovp | offset);
+ 
+ 	pdir_start = &(ioc->pdir_base[pide]);
+ 
+@@ -1029,8 +1028,7 @@ void sba_unmap_single(struct device *dev, dma_addr_t iova, size_t size, int dir)
+ #endif
+ 	offset = iova & ~iovp_mask;
+ 
+-	DBG_RUN("%s() iovp 0x%lx/%x\n",
+-		__FUNCTION__, (long) iova, size);
++	DBG_RUN("%s() iovp 0x%lx/%x\n", __func__, (long) iova, size);
+ 
+ 	iova ^= offset;        /* clear offset bits */
+ 	size += offset;
+@@ -1404,7 +1402,7 @@ int sba_map_sg(struct device *dev, struct scatterlist *sglist, int nents, int di
+ 	struct scatterlist *sg;
+ #endif
+ 
+-	DBG_RUN_SG("%s() START %d entries\n", __FUNCTION__, nents);
++	DBG_RUN_SG("%s() START %d entries\n", __func__, nents);
+ 	ioc = GET_IOC(dev);
+ 	ASSERT(ioc);
+ 
+@@ -1468,7 +1466,7 @@ int sba_map_sg(struct device *dev, struct scatterlist *sglist, int nents, int di
+ #endif
+ 
+ 	ASSERT(coalesced == filled);
+-	DBG_RUN_SG("%s() DONE %d mappings\n", __FUNCTION__, filled);
++	DBG_RUN_SG("%s() DONE %d mappings\n", __func__, filled);
+ 
+ 	return filled;
+ }
+@@ -1491,7 +1489,7 @@ void sba_unmap_sg (struct device *dev, struct scatterlist *sglist, int nents, in
+ #endif
+ 
+ 	DBG_RUN_SG("%s() START %d entries,  %p,%x\n",
+-		__FUNCTION__, nents, sba_sg_address(sglist), sglist->length);
++		   __func__, nents, sba_sg_address(sglist), sglist->length);
+ 
+ #ifdef ASSERT_PDIR_SANITY
+ 	ioc = GET_IOC(dev);
+@@ -1509,7 +1507,7 @@ void sba_unmap_sg (struct device *dev, struct scatterlist *sglist, int nents, in
+ 		nents--;
+ 	}
+ 
+-	DBG_RUN_SG("%s() DONE (nents %d)\n", __FUNCTION__,  nents);
++	DBG_RUN_SG("%s() DONE (nents %d)\n", __func__,  nents);
+ 
+ #ifdef ASSERT_PDIR_SANITY
+ 	spin_lock_irqsave(&ioc->res_lock, flags);
+@@ -1546,7 +1544,7 @@ ioc_iova_init(struct ioc *ioc)
+ 	ioc->iov_size = ~ioc->imask + 1;
+ 
+ 	DBG_INIT("%s() hpa %p IOV base 0x%lx mask 0x%lx (%dMB)\n",
+-		__FUNCTION__, ioc->ioc_hpa, ioc->ibase, ioc->imask,
++		__func__, ioc->ioc_hpa, ioc->ibase, ioc->imask,
+ 		ioc->iov_size >> 20);
+ 
+ 	switch (iovp_size) {
+@@ -1569,7 +1567,7 @@ ioc_iova_init(struct ioc *ioc)
+ 
+ 	memset(ioc->pdir_base, 0, ioc->pdir_size);
+ 
+-	DBG_INIT("%s() IOV page size %ldK pdir %p size %x\n", __FUNCTION__,
++	DBG_INIT("%s() IOV page size %ldK pdir %p size %x\n", __func__,
+ 		iovp_size >> 10, ioc->pdir_base, ioc->pdir_size);
+ 
+ 	ASSERT(ALIGN((unsigned long) ioc->pdir_base, 4*1024) == (unsigned long) ioc->pdir_base);
+@@ -1612,7 +1610,7 @@ ioc_iova_init(struct ioc *ioc)
+ 
+ 		prefetch_spill_page = virt_to_phys(addr);
+ 
+-		DBG_INIT("%s() prefetch spill addr: 0x%lx\n", __FUNCTION__, prefetch_spill_page);
++		DBG_INIT("%s() prefetch spill addr: 0x%lx\n", __func__, prefetch_spill_page);
+ 	}
+ 	/*
+   	** Set all the PDIR entries valid w/ the spill page as the target
+@@ -1641,7 +1639,7 @@ ioc_resource_init(struct ioc *ioc)
+ 	/* resource map size dictated by pdir_size */
+ 	ioc->res_size = ioc->pdir_size / PDIR_ENTRY_SIZE; /* entries */
+ 	ioc->res_size >>= 3;  /* convert bit count to byte count */
+-	DBG_INIT("%s() res_size 0x%x\n", __FUNCTION__, ioc->res_size);
++	DBG_INIT("%s() res_size 0x%x\n", __func__, ioc->res_size);
+ 
+ 	ioc->res_map = (char *) __get_free_pages(GFP_KERNEL,
+ 						 get_order(ioc->res_size));
+@@ -1664,7 +1662,7 @@ ioc_resource_init(struct ioc *ioc)
+ 							      | prefetch_spill_page);
+ #endif
+ 
+-	DBG_INIT("%s() res_map %x %p\n", __FUNCTION__,
++	DBG_INIT("%s() res_map %x %p\n", __func__,
+ 		 ioc->res_size, (void *) ioc->res_map);
+ }
+ 
+@@ -1767,7 +1765,7 @@ ioc_init(u64 hpa, void *handle)
+ 	iovp_size = (1 << iovp_shift);
+ 	iovp_mask = ~(iovp_size - 1);
+ 
+-	DBG_INIT("%s: PAGE_SIZE %ldK, iovp_size %ldK\n", __FUNCTION__,
++	DBG_INIT("%s: PAGE_SIZE %ldK, iovp_size %ldK\n", __func__,
+ 		PAGE_SIZE >> 10, iovp_size >> 10);
+ 
+ 	if (!ioc->name) {
+@@ -2137,7 +2135,7 @@ sba_page_override(char *str)
+ 			break;
+ 		default:
+ 			printk("%s: unknown/unsupported iommu page size %ld\n",
+-			       __FUNCTION__, page_size);
++			       __func__, page_size);
+ 	}
+ 
+ 	return 1;
+diff --git a/arch/ia64/hp/sim/simeth.c b/arch/ia64/hp/sim/simeth.c
+index 9898feb..969fe9f 100644
+--- a/arch/ia64/hp/sim/simeth.c
++++ b/arch/ia64/hp/sim/simeth.c
+@@ -222,7 +222,7 @@ simeth_probe1(void)
+ 	}
+ 
+ 	if ((rc = assign_irq_vector(AUTO_ASSIGN)) < 0)
+-		panic("%s: out of interrupt vectors!\n", __FUNCTION__);
++		panic("%s: out of interrupt vectors!\n", __func__);
+ 	dev->irq = rc;
+ 
+ 	/*
+diff --git a/arch/ia64/hp/sim/simserial.c b/arch/ia64/hp/sim/simserial.c
+index ef252df..eb0c32a 100644
+--- a/arch/ia64/hp/sim/simserial.c
++++ b/arch/ia64/hp/sim/simserial.c
+@@ -1000,7 +1000,7 @@ simrs_init (void)
+ 		if (!state->irq) {
+ 			if ((rc = assign_irq_vector(AUTO_ASSIGN)) < 0)
+ 				panic("%s: out of interrupt vectors!\n",
+-				      __FUNCTION__);
++				      __func__);
+ 			state->irq = rc;
+ 			ia64_ssc_connect_irq(KEYBOARD_INTR, state->irq);
+ 		}
+diff --git a/arch/ia64/ia32/sys_ia32.c b/arch/ia64/ia32/sys_ia32.c
+index d025a22..b1bf51f 100644
+--- a/arch/ia64/ia32/sys_ia32.c
++++ b/arch/ia64/ia32/sys_ia32.c
+@@ -32,13 +32,8 @@
+ #include <linux/shm.h>
+ #include <linux/slab.h>
+ #include <linux/uio.h>
+-#include <linux/nfs_fs.h>
++#include <linux/socket.h>
+ #include <linux/quota.h>
+-#include <linux/sunrpc/svc.h>
+-#include <linux/nfsd/nfsd.h>
+-#include <linux/nfsd/cache.h>
+-#include <linux/nfsd/xdr.h>
+-#include <linux/nfsd/syscall.h>
+ #include <linux/poll.h>
+ #include <linux/eventpoll.h>
+ #include <linux/personality.h>
+diff --git a/arch/ia64/kernel/crash.c b/arch/ia64/kernel/crash.c
+index f1cf2df..fbe742a 100644
+--- a/arch/ia64/kernel/crash.c
++++ b/arch/ia64/kernel/crash.c
+@@ -155,7 +155,7 @@ kdump_init_notifier(struct notifier_block *self, unsigned long val, void *data)
+ 		if (val == DIE_INIT_MONARCH_LEAVE)
+ 			ia64_mca_printk(KERN_NOTICE
+ 					"%s: kdump not configured\n",
+-					__FUNCTION__);
++					__func__);
+ 		return NOTIFY_DONE;
+ 	}
+ 
+diff --git a/arch/ia64/kernel/efi.c b/arch/ia64/kernel/efi.c
+index 919070a..728d724 100644
+--- a/arch/ia64/kernel/efi.c
++++ b/arch/ia64/kernel/efi.c
+@@ -379,8 +379,8 @@ efi_get_pal_addr (void)
+ 		 * a dedicated ITR for the PAL code.
+ 		 */
+ 		if ((vaddr & mask) == (KERNEL_START & mask)) {
+-			printk(KERN_INFO "%s: no need to install ITR for "
+-			       "PAL code\n", __FUNCTION__);
++			printk(KERN_INFO "%s: no need to install ITR for PAL code\n",
++			       __func__);
+ 			continue;
+ 		}
+ 
+@@ -399,7 +399,7 @@ efi_get_pal_addr (void)
+ 		return __va(md->phys_addr);
+ 	}
+ 	printk(KERN_WARNING "%s: no PAL-code memory-descriptor found\n",
+-	       __FUNCTION__);
++	       __func__);
+ 	return NULL;
+ }
+ 
+@@ -543,12 +543,30 @@ efi_init (void)
+ 		for (i = 0, p = efi_map_start; p < efi_map_end;
+ 		     ++i, p += efi_desc_size)
+ 		{
++			const char *unit;
++			unsigned long size;
++
+ 			md = p;
+-			printk("mem%02u: type=%u, attr=0x%lx, "
+-			       "range=[0x%016lx-0x%016lx) (%luMB)\n",
++			size = md->num_pages << EFI_PAGE_SHIFT;
++
++			if ((size >> 40) > 0) {
++				size >>= 40;
++				unit = "TB";
++			} else if ((size >> 30) > 0) {
++				size >>= 30;
++				unit = "GB";
++			} else if ((size >> 20) > 0) {
++				size >>= 20;
++				unit = "MB";
++			} else {
++				size >>= 10;
++				unit = "KB";
++			}
++
++			printk("mem%02d: type=%2u, attr=0x%016lx, "
++			       "range=[0x%016lx-0x%016lx) (%4lu%s)\n",
+ 			       i, md->type, md->attribute, md->phys_addr,
+-			       md->phys_addr + efi_md_size(md),
+-			       md->num_pages >> (20 - EFI_PAGE_SHIFT));
++			       md->phys_addr + efi_md_size(md), size, unit);
+ 		}
+ 	}
+ #endif
+diff --git a/arch/ia64/kernel/iosapic.c b/arch/ia64/kernel/iosapic.c
+index 7b32922..082c31d 100644
+--- a/arch/ia64/kernel/iosapic.c
++++ b/arch/ia64/kernel/iosapic.c
+@@ -534,7 +534,7 @@ iosapic_reassign_vector (int irq)
+ 	if (iosapic_intr_info[irq].count) {
+ 		new_irq = create_irq();
+ 		if (new_irq < 0)
+-			panic("%s: out of interrupt vectors!\n", __FUNCTION__);
++			panic("%s: out of interrupt vectors!\n", __func__);
+ 		printk(KERN_INFO "Reassigning vector %d to %d\n",
+ 		       irq_to_vector(irq), irq_to_vector(new_irq));
+ 		memcpy(&iosapic_intr_info[new_irq], &iosapic_intr_info[irq],
+@@ -599,7 +599,7 @@ register_intr (unsigned int gsi, int irq, unsigned char delivery,
+ 	index = find_iosapic(gsi);
+ 	if (index < 0) {
+ 		printk(KERN_WARNING "%s: No IOSAPIC for GSI %u\n",
+-		       __FUNCTION__, gsi);
++		       __func__, gsi);
+ 		return -ENODEV;
+ 	}
+ 
+@@ -608,7 +608,7 @@ register_intr (unsigned int gsi, int irq, unsigned char delivery,
+ 		rte = iosapic_alloc_rte();
+ 		if (!rte) {
+ 			printk(KERN_WARNING "%s: cannot allocate memory\n",
+-			       __FUNCTION__);
++			       __func__);
+ 			return -ENOMEM;
+ 		}
+ 
+@@ -625,7 +625,7 @@ register_intr (unsigned int gsi, int irq, unsigned char delivery,
+ 		    (info->trigger != trigger || info->polarity != polarity)){
+ 			printk (KERN_WARNING
+ 				"%s: cannot override the interrupt\n",
+-				__FUNCTION__);
++				__func__);
+ 			return -EINVAL;
+ 		}
+ 		rte->refcnt++;
+@@ -647,7 +647,7 @@ register_intr (unsigned int gsi, int irq, unsigned char delivery,
+ 		if (idesc->chip != &no_irq_type)
+ 			printk(KERN_WARNING
+ 			       "%s: changing vector %d from %s to %s\n",
+-			       __FUNCTION__, irq_to_vector(irq),
++			       __func__, irq_to_vector(irq),
+ 			       idesc->chip->name, irq_type->name);
+ 		idesc->chip = irq_type;
+ 	}
+@@ -920,7 +920,7 @@ iosapic_register_platform_intr (u32 int_type, unsigned int gsi,
+ 	      case ACPI_INTERRUPT_INIT:
+ 		irq = create_irq();
+ 		if (irq < 0)
+-			panic("%s: out of interrupt vectors!\n", __FUNCTION__);
++			panic("%s: out of interrupt vectors!\n", __func__);
+ 		vector = irq_to_vector(irq);
+ 		delivery = IOSAPIC_INIT;
+ 		break;
+@@ -931,7 +931,7 @@ iosapic_register_platform_intr (u32 int_type, unsigned int gsi,
+ 		mask = 1;
+ 		break;
+ 	      default:
+-		printk(KERN_ERR "%s: invalid int type 0x%x\n", __FUNCTION__,
++		printk(KERN_ERR "%s: invalid int type 0x%x\n", __func__,
+ 		       int_type);
+ 		return -1;
+ 	}
+@@ -996,7 +996,7 @@ iosapic_system_init (int system_pcat_compat)
+ 		 */
+ 		printk(KERN_INFO
+ 		       "%s: Disabling PC-AT compatible 8259 interrupts\n",
+-		       __FUNCTION__);
++		       __func__);
+ 		outb(0xff, 0xA1);
+ 		outb(0xff, 0x21);
+ 	}
+@@ -1011,7 +1011,7 @@ iosapic_alloc (void)
+ 		if (!iosapic_lists[index].addr)
+ 			return index;
+ 
+-	printk(KERN_WARNING "%s: failed to allocate iosapic\n", __FUNCTION__);
++	printk(KERN_WARNING "%s: failed to allocate iosapic\n", __func__);
+ 	return -1;
+ }
+ 
+@@ -1109,14 +1109,14 @@ iosapic_remove (unsigned int gsi_base)
+ 	index = find_iosapic(gsi_base);
+ 	if (index < 0) {
+ 		printk(KERN_WARNING "%s: No IOSAPIC for GSI base %u\n",
+-		       __FUNCTION__, gsi_base);
++		       __func__, gsi_base);
+ 		goto out;
+ 	}
+ 
+ 	if (iosapic_lists[index].rtes_inuse) {
+ 		err = -EBUSY;
+ 		printk(KERN_WARNING "%s: IOSAPIC for GSI base %u is busy\n",
+-		       __FUNCTION__, gsi_base);
++		       __func__, gsi_base);
+ 		goto out;
+ 	}
+ 
+@@ -1137,7 +1137,7 @@ map_iosapic_to_node(unsigned int gsi_base, int node)
+ 	index = find_iosapic(gsi_base);
+ 	if (index < 0) {
+ 		printk(KERN_WARNING "%s: No IOSAPIC for GSI %u\n",
+-		       __FUNCTION__, gsi_base);
++		       __func__, gsi_base);
+ 		return;
+ 	}
+ 	iosapic_lists[index].node = node;
+diff --git a/arch/ia64/kernel/irq_ia64.c b/arch/ia64/kernel/irq_ia64.c
+index 2b8cf6e..d8be23f 100644
+--- a/arch/ia64/kernel/irq_ia64.c
++++ b/arch/ia64/kernel/irq_ia64.c
+@@ -507,7 +507,7 @@ ia64_handle_irq (ia64_vector vector, struct pt_regs *regs)
+ 			if (unlikely(irq < 0)) {
+ 				printk(KERN_ERR "%s: Unexpected interrupt "
+ 				       "vector %d on CPU %d is not mapped "
+-				       "to any IRQ!\n", __FUNCTION__, vector,
++				       "to any IRQ!\n", __func__, vector,
+ 				       smp_processor_id());
+ 			} else
+ 				generic_handle_irq(irq);
+@@ -572,7 +572,7 @@ void ia64_process_pending_intr(void)
+ 			if (unlikely(irq < 0)) {
+ 				printk(KERN_ERR "%s: Unexpected interrupt "
+ 				       "vector %d on CPU %d not being mapped "
+-				       "to any IRQ!!\n", __FUNCTION__, vector,
++				       "to any IRQ!!\n", __func__, vector,
+ 				       smp_processor_id());
+ 			} else {
+ 				vectors_in_migration[irq]=0;
+@@ -666,11 +666,7 @@ ia64_send_ipi (int cpu, int vector, int delivery_mode, int redirect)
+ 	unsigned long ipi_data;
+ 	unsigned long phys_cpu_id;
+ 
+-#ifdef CONFIG_SMP
+ 	phys_cpu_id = cpu_physical_id(cpu);
+-#else
+-	phys_cpu_id = (ia64_getreg(_IA64_REG_CR_LID) >> 16) & 0xffff;
+-#endif
+ 
+ 	/*
+ 	 * cpu number is in 8bit ID and 8bit EID
+diff --git a/arch/ia64/kernel/kprobes.c b/arch/ia64/kernel/kprobes.c
+index 615c3d2..8d9a446 100644
+--- a/arch/ia64/kernel/kprobes.c
++++ b/arch/ia64/kernel/kprobes.c
+@@ -838,7 +838,7 @@ out:
+ 	return 1;
+ }
+ 
+-int __kprobes kprobes_fault_handler(struct pt_regs *regs, int trapnr)
++int __kprobes kprobe_fault_handler(struct pt_regs *regs, int trapnr)
+ {
+ 	struct kprobe *cur = kprobe_running();
+ 	struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
+diff --git a/arch/ia64/kernel/mca.c b/arch/ia64/kernel/mca.c
+index 6e17aed..6c18221 100644
+--- a/arch/ia64/kernel/mca.c
++++ b/arch/ia64/kernel/mca.c
+@@ -413,8 +413,8 @@ ia64_log_get(int sal_info_type, u8 **buffer, int irq_safe)
+ 		IA64_LOG_INDEX_INC(sal_info_type);
+ 		IA64_LOG_UNLOCK(sal_info_type);
+ 		if (irq_safe) {
+-			IA64_MCA_DEBUG("%s: SAL error record type %d retrieved. "
+-				       "Record length = %ld\n", __FUNCTION__, sal_info_type, total_len);
++			IA64_MCA_DEBUG("%s: SAL error record type %d retrieved. Record length = %ld\n",
++				       __func__, sal_info_type, total_len);
+ 		}
+ 		*buffer = (u8 *) log_buffer;
+ 		return total_len;
+@@ -518,7 +518,7 @@ ia64_mca_cpe_int_handler (int cpe_irq, void *arg)
+ 	static DEFINE_SPINLOCK(cpe_history_lock);
+ 
+ 	IA64_MCA_DEBUG("%s: received interrupt vector = %#x on CPU %d\n",
+-		       __FUNCTION__, cpe_irq, smp_processor_id());
++		       __func__, cpe_irq, smp_processor_id());
+ 
+ 	/* SAL spec states this should run w/ interrupts enabled */
+ 	local_irq_enable();
+@@ -594,7 +594,7 @@ ia64_mca_register_cpev (int cpev)
+ 	}
+ 
+ 	IA64_MCA_DEBUG("%s: corrected platform error "
+-		       "vector %#x registered\n", __FUNCTION__, cpev);
++		       "vector %#x registered\n", __func__, cpev);
+ }
+ #endif /* CONFIG_ACPI */
+ 
+@@ -621,12 +621,11 @@ ia64_mca_cmc_vector_setup (void)
+ 	cmcv.cmcv_vector	= IA64_CMC_VECTOR;
+ 	ia64_setreg(_IA64_REG_CR_CMCV, cmcv.cmcv_regval);
+ 
+-	IA64_MCA_DEBUG("%s: CPU %d corrected "
+-		       "machine check vector %#x registered.\n",
+-		       __FUNCTION__, smp_processor_id(), IA64_CMC_VECTOR);
++	IA64_MCA_DEBUG("%s: CPU %d corrected machine check vector %#x registered.\n",
++		       __func__, smp_processor_id(), IA64_CMC_VECTOR);
+ 
+ 	IA64_MCA_DEBUG("%s: CPU %d CMCV = %#016lx\n",
+-		       __FUNCTION__, smp_processor_id(), ia64_getreg(_IA64_REG_CR_CMCV));
++		       __func__, smp_processor_id(), ia64_getreg(_IA64_REG_CR_CMCV));
+ }
+ 
+ /*
+@@ -651,9 +650,8 @@ ia64_mca_cmc_vector_disable (void *dummy)
+ 	cmcv.cmcv_mask = 1; /* Mask/disable interrupt */
+ 	ia64_setreg(_IA64_REG_CR_CMCV, cmcv.cmcv_regval);
+ 
+-	IA64_MCA_DEBUG("%s: CPU %d corrected "
+-		       "machine check vector %#x disabled.\n",
+-		       __FUNCTION__, smp_processor_id(), cmcv.cmcv_vector);
++	IA64_MCA_DEBUG("%s: CPU %d corrected machine check vector %#x disabled.\n",
++		       __func__, smp_processor_id(), cmcv.cmcv_vector);
+ }
+ 
+ /*
+@@ -678,9 +676,8 @@ ia64_mca_cmc_vector_enable (void *dummy)
+ 	cmcv.cmcv_mask = 0; /* Unmask/enable interrupt */
+ 	ia64_setreg(_IA64_REG_CR_CMCV, cmcv.cmcv_regval);
+ 
+-	IA64_MCA_DEBUG("%s: CPU %d corrected "
+-		       "machine check vector %#x enabled.\n",
+-		       __FUNCTION__, smp_processor_id(), cmcv.cmcv_vector);
++	IA64_MCA_DEBUG("%s: CPU %d corrected machine check vector %#x enabled.\n",
++		       __func__, smp_processor_id(), cmcv.cmcv_vector);
+ }
+ 
+ /*
+@@ -767,7 +764,7 @@ ia64_mca_rendez_int_handler(int rendez_irq, void *arg)
+ 	local_irq_save(flags);
+ 	if (notify_die(DIE_MCA_RENDZVOUS_ENTER, "MCA", get_irq_regs(),
+ 		       (long)&nd, 0, 0) == NOTIFY_STOP)
+-		ia64_mca_spin(__FUNCTION__);
++		ia64_mca_spin(__func__);
+ 
+ 	ia64_mc_info.imi_rendez_checkin[cpu] = IA64_MCA_RENDEZ_CHECKIN_DONE;
+ 	/* Register with the SAL monarch that the slave has
+@@ -777,7 +774,7 @@ ia64_mca_rendez_int_handler(int rendez_irq, void *arg)
+ 
+ 	if (notify_die(DIE_MCA_RENDZVOUS_PROCESS, "MCA", get_irq_regs(),
+ 		       (long)&nd, 0, 0) == NOTIFY_STOP)
+-		ia64_mca_spin(__FUNCTION__);
++		ia64_mca_spin(__func__);
+ 
+ 	/* Wait for the monarch cpu to exit. */
+ 	while (monarch_cpu != -1)
+@@ -785,7 +782,7 @@ ia64_mca_rendez_int_handler(int rendez_irq, void *arg)
+ 
+ 	if (notify_die(DIE_MCA_RENDZVOUS_LEAVE, "MCA", get_irq_regs(),
+ 		       (long)&nd, 0, 0) == NOTIFY_STOP)
+-		ia64_mca_spin(__FUNCTION__);
++		ia64_mca_spin(__func__);
+ 
+ 	ia64_mc_info.imi_rendez_checkin[cpu] = IA64_MCA_RENDEZ_CHECKIN_NOTDONE;
+ 	/* Enable all interrupts */
+@@ -1230,7 +1227,7 @@ ia64_mca_handler(struct pt_regs *regs, struct switch_stack *sw,
+ 
+ 	if (notify_die(DIE_MCA_MONARCH_ENTER, "MCA", regs, (long)&nd, 0, 0)
+ 			== NOTIFY_STOP)
+-		ia64_mca_spin(__FUNCTION__);
++		ia64_mca_spin(__func__);
+ 
+ 	ia64_mc_info.imi_rendez_checkin[cpu] = IA64_MCA_RENDEZ_CHECKIN_CONCURRENT_MCA;
+ 	if (sos->monarch) {
+@@ -1246,7 +1243,7 @@ ia64_mca_handler(struct pt_regs *regs, struct switch_stack *sw,
+ 		ia64_mca_wakeup_all();
+ 		if (notify_die(DIE_MCA_MONARCH_PROCESS, "MCA", regs, (long)&nd, 0, 0)
+ 				== NOTIFY_STOP)
+-			ia64_mca_spin(__FUNCTION__);
++			ia64_mca_spin(__func__);
+ 	} else {
+ 		while (cpu_isset(cpu, mca_cpu))
+ 			cpu_relax();	/* spin until monarch wakes us */
+@@ -1276,7 +1273,7 @@ ia64_mca_handler(struct pt_regs *regs, struct switch_stack *sw,
+ 	}
+ 	if (notify_die(DIE_MCA_MONARCH_LEAVE, "MCA", regs, (long)&nd, 0, recover)
+ 			== NOTIFY_STOP)
+-		ia64_mca_spin(__FUNCTION__);
++		ia64_mca_spin(__func__);
+ 
+ 
+ 	if (atomic_dec_return(&mca_count) > 0) {
+@@ -1328,7 +1325,7 @@ ia64_mca_cmc_int_handler(int cmc_irq, void *arg)
+ 	static DEFINE_SPINLOCK(cmc_history_lock);
+ 
+ 	IA64_MCA_DEBUG("%s: received interrupt vector = %#x on CPU %d\n",
+-		       __FUNCTION__, cmc_irq, smp_processor_id());
++		       __func__, cmc_irq, smp_processor_id());
+ 
+ 	/* SAL spec states this should run w/ interrupts enabled */
+ 	local_irq_enable();
+@@ -1614,7 +1611,7 @@ ia64_init_handler(struct pt_regs *regs, struct switch_stack *sw,
+ 	 */
+ 	if (!sos->monarch && atomic_add_return(1, &slaves) == num_online_cpus()) {
+ 		mprintk(KERN_WARNING "%s: Promoting cpu %d to monarch.\n",
+-		       __FUNCTION__, cpu);
++		        __func__, cpu);
+ 		atomic_dec(&slaves);
+ 		sos->monarch = 1;
+ 	}
+@@ -1626,7 +1623,7 @@ ia64_init_handler(struct pt_regs *regs, struct switch_stack *sw,
+ 	 */
+ 	if (sos->monarch && atomic_add_return(1, &monarchs) > 1) {
+ 		mprintk(KERN_WARNING "%s: Demoting cpu %d to slave.\n",
+-			       __FUNCTION__, cpu);
++			       __func__, cpu);
+ 		atomic_dec(&monarchs);
+ 		sos->monarch = 0;
+ 	}
+@@ -1637,15 +1634,15 @@ ia64_init_handler(struct pt_regs *regs, struct switch_stack *sw,
+ 		       cpu_relax();	/* spin until monarch enters */
+ 		if (notify_die(DIE_INIT_SLAVE_ENTER, "INIT", regs, (long)&nd, 0, 0)
+ 				== NOTIFY_STOP)
+-			ia64_mca_spin(__FUNCTION__);
++			ia64_mca_spin(__func__);
+ 		if (notify_die(DIE_INIT_SLAVE_PROCESS, "INIT", regs, (long)&nd, 0, 0)
+ 				== NOTIFY_STOP)
+-			ia64_mca_spin(__FUNCTION__);
++			ia64_mca_spin(__func__);
+ 		while (monarch_cpu != -1)
+ 		       cpu_relax();	/* spin until monarch leaves */
+ 		if (notify_die(DIE_INIT_SLAVE_LEAVE, "INIT", regs, (long)&nd, 0, 0)
+ 				== NOTIFY_STOP)
+-			ia64_mca_spin(__FUNCTION__);
++			ia64_mca_spin(__func__);
+ 		mprintk("Slave on cpu %d returning to normal service.\n", cpu);
+ 		set_curr_task(cpu, previous_current);
+ 		ia64_mc_info.imi_rendez_checkin[cpu] = IA64_MCA_RENDEZ_CHECKIN_NOTDONE;
+@@ -1656,7 +1653,7 @@ ia64_init_handler(struct pt_regs *regs, struct switch_stack *sw,
+ 	monarch_cpu = cpu;
+ 	if (notify_die(DIE_INIT_MONARCH_ENTER, "INIT", regs, (long)&nd, 0, 0)
+ 			== NOTIFY_STOP)
+-		ia64_mca_spin(__FUNCTION__);
++		ia64_mca_spin(__func__);
+ 
+ 	/*
+ 	 * Wait for a bit.  On some machines (e.g., HP's zx2000 and zx6000, INIT can be
+@@ -1673,10 +1670,10 @@ ia64_init_handler(struct pt_regs *regs, struct switch_stack *sw,
+ 	 */
+ 	if (notify_die(DIE_INIT_MONARCH_PROCESS, "INIT", regs, (long)&nd, 0, 0)
+ 			== NOTIFY_STOP)
+-		ia64_mca_spin(__FUNCTION__);
++		ia64_mca_spin(__func__);
+ 	if (notify_die(DIE_INIT_MONARCH_LEAVE, "INIT", regs, (long)&nd, 0, 0)
+ 			== NOTIFY_STOP)
+-		ia64_mca_spin(__FUNCTION__);
++		ia64_mca_spin(__func__);
+ 	mprintk("\nINIT dump complete.  Monarch on cpu %d returning to normal service.\n", cpu);
+ 	atomic_dec(&monarchs);
+ 	set_curr_task(cpu, previous_current);
+@@ -1884,7 +1881,7 @@ ia64_mca_init(void)
+ 		.priority = 0/* we need to notified last */
+ 	};
+ 
+-	IA64_MCA_DEBUG("%s: begin\n", __FUNCTION__);
++	IA64_MCA_DEBUG("%s: begin\n", __func__);
+ 
+ 	/* Clear the Rendez checkin flag for all cpus */
+ 	for(i = 0 ; i < NR_CPUS; i++)
+@@ -1928,7 +1925,7 @@ ia64_mca_init(void)
+ 		return;
+ 	}
+ 
+-	IA64_MCA_DEBUG("%s: registered MCA rendezvous spinloop and wakeup mech.\n", __FUNCTION__);
++	IA64_MCA_DEBUG("%s: registered MCA rendezvous spinloop and wakeup mech.\n", __func__);
+ 
+ 	ia64_mc_info.imi_mca_handler        = ia64_tpa(mca_hldlr_ptr->fp);
+ 	/*
+@@ -1949,7 +1946,7 @@ ia64_mca_init(void)
+ 		return;
+ 	}
+ 
+-	IA64_MCA_DEBUG("%s: registered OS MCA handler with SAL at 0x%lx, gp = 0x%lx\n", __FUNCTION__,
++	IA64_MCA_DEBUG("%s: registered OS MCA handler with SAL at 0x%lx, gp = 0x%lx\n", __func__,
+ 		       ia64_mc_info.imi_mca_handler, ia64_tpa(mca_hldlr_ptr->gp));
+ 
+ 	/*
+@@ -1961,7 +1958,7 @@ ia64_mca_init(void)
+ 	ia64_mc_info.imi_slave_init_handler		= ia64_tpa(init_hldlr_ptr_slave->fp);
+ 	ia64_mc_info.imi_slave_init_handler_size	= 0;
+ 
+-	IA64_MCA_DEBUG("%s: OS INIT handler at %lx\n", __FUNCTION__,
++	IA64_MCA_DEBUG("%s: OS INIT handler at %lx\n", __func__,
+ 		       ia64_mc_info.imi_monarch_init_handler);
+ 
+ 	/* Register the os init handler with SAL */
+@@ -1982,7 +1979,7 @@ ia64_mca_init(void)
+ 		return;
+ 	}
+ 
+-	IA64_MCA_DEBUG("%s: registered OS INIT handler with SAL\n", __FUNCTION__);
++	IA64_MCA_DEBUG("%s: registered OS INIT handler with SAL\n", __func__);
+ 
+ 	/*
+ 	 *  Configure the CMCI/P vector and handler. Interrupts for CMC are
+@@ -2042,7 +2039,7 @@ ia64_mca_late_init(void)
+ 	cmc_polling_enabled = 0;
+ 	schedule_work(&cmc_enable_work);
+ 
+-	IA64_MCA_DEBUG("%s: CMCI/P setup and enabled.\n", __FUNCTION__);
++	IA64_MCA_DEBUG("%s: CMCI/P setup and enabled.\n", __func__);
+ 
+ #ifdef CONFIG_ACPI
+ 	/* Setup the CPEI/P vector and handler */
+@@ -2065,17 +2062,17 @@ ia64_mca_late_init(void)
+ 				ia64_cpe_irq = irq;
+ 				ia64_mca_register_cpev(cpe_vector);
+ 				IA64_MCA_DEBUG("%s: CPEI/P setup and enabled.\n",
+-					__FUNCTION__);
++					__func__);
+ 				return 0;
+ 			}
+ 			printk(KERN_ERR "%s: Failed to find irq for CPE "
+ 					"interrupt handler, vector %d\n",
+-					__FUNCTION__, cpe_vector);
++					__func__, cpe_vector);
+ 		}
+ 		/* If platform doesn't support CPEI, get the timer going. */
+ 		if (cpe_poll_enabled) {
+ 			ia64_mca_cpe_poll(0UL);
+-			IA64_MCA_DEBUG("%s: CPEP setup and enabled.\n", __FUNCTION__);
++			IA64_MCA_DEBUG("%s: CPEP setup and enabled.\n", __func__);
+ 		}
+ 	}
+ #endif
+diff --git a/arch/ia64/kernel/module.c b/arch/ia64/kernel/module.c
+index e58f436..e83e2ea 100644
+--- a/arch/ia64/kernel/module.c
++++ b/arch/ia64/kernel/module.c
+@@ -493,7 +493,7 @@ module_frob_arch_sections (Elf_Ehdr *ehdr, Elf_Shdr *sechdrs, char *secstrings,
+ 	mod->arch.opd->sh_addralign = 8;
+ 	mod->arch.opd->sh_size = fdescs * sizeof(struct fdesc);
+ 	DEBUGP("%s: core.plt=%lx, init.plt=%lx, got=%lx, fdesc=%lx\n",
+-	       __FUNCTION__, mod->arch.core_plt->sh_size, mod->arch.init_plt->sh_size,
++	       __func__, mod->arch.core_plt->sh_size, mod->arch.init_plt->sh_size,
+ 	       mod->arch.got->sh_size, mod->arch.opd->sh_size);
+ 	return 0;
+ }
+@@ -585,7 +585,7 @@ get_plt (struct module *mod, const struct insn *insn, uint64_t value, int *okp)
+ #if ARCH_MODULE_DEBUG
+ 	if (plt_target(plt) != target_ip) {
+ 		printk("%s: mistargeted PLT: wanted %lx, got %lx\n",
+-		       __FUNCTION__, target_ip, plt_target(plt));
++		       __func__, target_ip, plt_target(plt));
+ 		*okp = 0;
+ 		return 0;
+ 	}
+@@ -703,7 +703,7 @@ do_reloc (struct module *mod, uint8_t r_type, Elf64_Sym *sym, uint64_t addend,
+ 		if (r_type == R_IA64_PCREL21BI) {
+ 			if (!is_internal(mod, val)) {
+ 				printk(KERN_ERR "%s: %s reloc against non-local symbol (%lx)\n",
+-				       __FUNCTION__, reloc_name[r_type], val);
++				       __func__, reloc_name[r_type], val);
+ 				return -ENOEXEC;
+ 			}
+ 			format = RF_INSN21B;
+@@ -737,7 +737,7 @@ do_reloc (struct module *mod, uint8_t r_type, Elf64_Sym *sym, uint64_t addend,
+ 		      case R_IA64_LDXMOV:
+ 			if (gp_addressable(mod, val)) {
+ 				/* turn "ld8" into "mov": */
+-				DEBUGP("%s: patching ld8 at %p to mov\n", __FUNCTION__, location);
++				DEBUGP("%s: patching ld8 at %p to mov\n", __func__, location);
+ 				ia64_patch((u64) location, 0x1fff80fe000UL, 0x10000000000UL);
+ 			}
+ 			return 0;
+@@ -771,7 +771,7 @@ do_reloc (struct module *mod, uint8_t r_type, Elf64_Sym *sym, uint64_t addend,
+ 	if (!ok)
+ 		return -ENOEXEC;
+ 
+-	DEBUGP("%s: [%p]<-%016lx = %s(%lx)\n", __FUNCTION__, location, val,
++	DEBUGP("%s: [%p]<-%016lx = %s(%lx)\n", __func__, location, val,
+ 	       reloc_name[r_type] ? reloc_name[r_type] : "?", sym->st_value + addend);
+ 
+ 	switch (format) {
+@@ -807,7 +807,7 @@ apply_relocate_add (Elf64_Shdr *sechdrs, const char *strtab, unsigned int symind
+ 	Elf64_Shdr *target_sec;
+ 	int ret;
+ 
+-	DEBUGP("%s: applying section %u (%u relocs) to %u\n", __FUNCTION__,
++	DEBUGP("%s: applying section %u (%u relocs) to %u\n", __func__,
+ 	       relsec, n, sechdrs[relsec].sh_info);
+ 
+ 	target_sec = sechdrs + sechdrs[relsec].sh_info;
+@@ -835,7 +835,7 @@ apply_relocate_add (Elf64_Shdr *sechdrs, const char *strtab, unsigned int symind
+ 			gp = mod->core_size / 2;
+ 		gp = (uint64_t) mod->module_core + ((gp + 7) & -8);
+ 		mod->arch.gp = gp;
+-		DEBUGP("%s: placing gp at 0x%lx\n", __FUNCTION__, gp);
++		DEBUGP("%s: placing gp at 0x%lx\n", __func__, gp);
+ 	}
+ 
+ 	for (i = 0; i < n; i++) {
+@@ -903,7 +903,7 @@ register_unwind_table (struct module *mod)
+ 		init = start + num_core;
+ 	}
+ 
+-	DEBUGP("%s: name=%s, gp=%lx, num_init=%lu, num_core=%lu\n", __FUNCTION__,
++	DEBUGP("%s: name=%s, gp=%lx, num_init=%lu, num_core=%lu\n", __func__,
+ 	       mod->name, mod->arch.gp, num_init, num_core);
+ 
+ 	/*
+@@ -912,13 +912,13 @@ register_unwind_table (struct module *mod)
+ 	if (num_core > 0) {
+ 		mod->arch.core_unw_table = unw_add_unwind_table(mod->name, 0, mod->arch.gp,
+ 								core, core + num_core);
+-		DEBUGP("%s:  core: handle=%p [%p-%p)\n", __FUNCTION__,
++		DEBUGP("%s:  core: handle=%p [%p-%p)\n", __func__,
+ 		       mod->arch.core_unw_table, core, core + num_core);
+ 	}
+ 	if (num_init > 0) {
+ 		mod->arch.init_unw_table = unw_add_unwind_table(mod->name, 0, mod->arch.gp,
+ 								init, init + num_init);
+-		DEBUGP("%s:  init: handle=%p [%p-%p)\n", __FUNCTION__,
++		DEBUGP("%s:  init: handle=%p [%p-%p)\n", __func__,
+ 		       mod->arch.init_unw_table, init, init + num_init);
+ 	}
+ }
+@@ -926,7 +926,7 @@ register_unwind_table (struct module *mod)
+ int
+ module_finalize (const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs, struct module *mod)
+ {
+-	DEBUGP("%s: init: entry=%p\n", __FUNCTION__, mod->init);
++	DEBUGP("%s: init: entry=%p\n", __func__, mod->init);
+ 	if (mod->arch.unwind)
+ 		register_unwind_table(mod);
+ 	return 0;
+diff --git a/arch/ia64/kernel/perfmon.c b/arch/ia64/kernel/perfmon.c
+index f6b9971..a2aabfd 100644
+--- a/arch/ia64/kernel/perfmon.c
++++ b/arch/ia64/kernel/perfmon.c
+@@ -227,12 +227,12 @@
+ #ifdef PFM_DEBUGGING
+ #define DPRINT(a) \
+ 	do { \
+-		if (unlikely(pfm_sysctl.debug >0)) { printk("%s.%d: CPU%d [%d] ", __FUNCTION__, __LINE__, smp_processor_id(), task_pid_nr(current)); printk a; } \
++		if (unlikely(pfm_sysctl.debug >0)) { printk("%s.%d: CPU%d [%d] ", __func__, __LINE__, smp_processor_id(), task_pid_nr(current)); printk a; } \
+ 	} while (0)
+ 
+ #define DPRINT_ovfl(a) \
+ 	do { \
+-		if (unlikely(pfm_sysctl.debug > 0 && pfm_sysctl.debug_ovfl >0)) { printk("%s.%d: CPU%d [%d] ", __FUNCTION__, __LINE__, smp_processor_id(), task_pid_nr(current)); printk a; } \
++		if (unlikely(pfm_sysctl.debug > 0 && pfm_sysctl.debug_ovfl >0)) { printk("%s.%d: CPU%d [%d] ", __func__, __LINE__, smp_processor_id(), task_pid_nr(current)); printk a; } \
+ 	} while (0)
+ #endif
+ 
+diff --git a/arch/ia64/kernel/perfmon_default_smpl.c b/arch/ia64/kernel/perfmon_default_smpl.c
+index a7af1cb..5f637bb 100644
+--- a/arch/ia64/kernel/perfmon_default_smpl.c
++++ b/arch/ia64/kernel/perfmon_default_smpl.c
+@@ -24,12 +24,12 @@ MODULE_LICENSE("GPL");
+ #ifdef DEFAULT_DEBUG
+ #define DPRINT(a) \
+ 	do { \
+-		if (unlikely(pfm_sysctl.debug >0)) { printk("%s.%d: CPU%d ", __FUNCTION__, __LINE__, smp_processor_id()); printk a; } \
++		if (unlikely(pfm_sysctl.debug >0)) { printk("%s.%d: CPU%d ", __func__, __LINE__, smp_processor_id()); printk a; } \
+ 	} while (0)
+ 
+ #define DPRINT_ovfl(a) \
+ 	do { \
+-		if (unlikely(pfm_sysctl.debug > 0 && pfm_sysctl.debug_ovfl >0)) { printk("%s.%d: CPU%d ", __FUNCTION__, __LINE__, smp_processor_id()); printk a; } \
++		if (unlikely(pfm_sysctl.debug > 0 && pfm_sysctl.debug_ovfl >0)) { printk("%s.%d: CPU%d ", __func__, __LINE__, smp_processor_id()); printk a; } \
+ 	} while (0)
+ 
+ #else
+diff --git a/arch/ia64/kernel/ptrace.c b/arch/ia64/kernel/ptrace.c
+index 331d676..ab784ec 100644
+--- a/arch/ia64/kernel/ptrace.c
++++ b/arch/ia64/kernel/ptrace.c
+@@ -698,52 +698,6 @@ thread_matches (struct task_struct *thread, unsigned long addr)
+ }
+ 
+ /*
+- * GDB apparently wants to be able to read the register-backing store
+- * of any thread when attached to a given process.  If we are peeking
+- * or poking an address that happens to reside in the kernel-backing
+- * store of another thread, we need to attach to that thread, because
+- * otherwise we end up accessing stale data.
+- *
+- * task_list_lock must be read-locked before calling this routine!
+- */
+-static struct task_struct *
+-find_thread_for_addr (struct task_struct *child, unsigned long addr)
+-{
+-	struct task_struct *p;
+-	struct mm_struct *mm;
+-	struct list_head *this, *next;
+-	int mm_users;
+-
+-	if (!(mm = get_task_mm(child)))
+-		return child;
+-
+-	/* -1 because of our get_task_mm(): */
+-	mm_users = atomic_read(&mm->mm_users) - 1;
+-	if (mm_users <= 1)
+-		goto out;		/* not multi-threaded */
+-
+-	/*
+-	 * Traverse the current process' children list.  Every task that
+-	 * one attaches to becomes a child.  And it is only attached children
+-	 * of the debugger that are of interest (ptrace_check_attach checks
+-	 * for this).
+-	 */
+- 	list_for_each_safe(this, next, &current->children) {
+-		p = list_entry(this, struct task_struct, sibling);
+-		if (p->tgid != child->tgid)
+-			continue;
+-		if (thread_matches(p, addr)) {
+-			child = p;
+-			goto out;
+-		}
+-	}
+-
+-  out:
+-	mmput(mm);
+-	return child;
+-}
+-
+-/*
+  * Write f32-f127 back to task->thread.fph if it has been modified.
+  */
+ inline void
+@@ -826,14 +780,14 @@ convert_to_non_syscall (struct task_struct *child, struct pt_regs  *pt,
+ 		if ((long)((unsigned long)child + IA64_STK_OFFSET - sp)
+ 		    < IA64_PT_REGS_SIZE) {
+ 			dprintk("ptrace.%s: ran off the top of the kernel "
+-				"stack\n", __FUNCTION__);
++				"stack\n", __func__);
+ 			return;
+ 		}
+ 		if (unw_get_pr (&prev_info, &pr) < 0) {
+ 			unw_get_rp(&prev_info, &ip);
+ 			dprintk("ptrace.%s: failed to read "
+ 				"predicate register (ip=0x%lx)\n",
+-				__FUNCTION__, ip);
++				__func__, ip);
+ 			return;
+ 		}
+ 		if (unw_is_intr_frame(&info)
+@@ -908,7 +862,7 @@ static int
+ access_uarea (struct task_struct *child, unsigned long addr,
+ 	      unsigned long *data, int write_access)
+ {
+-	unsigned long *ptr, regnum, urbs_end, rnat_addr, cfm;
++	unsigned long *ptr, regnum, urbs_end, cfm;
+ 	struct switch_stack *sw;
+ 	struct pt_regs *pt;
+ #	define pt_reg_addr(pt, reg)	((void *)			    \
+@@ -1011,14 +965,9 @@ access_uarea (struct task_struct *child, unsigned long addr,
+ 			 * the kernel was entered.
+ 			 *
+ 			 * Furthermore, when changing the contents of
+-			 * PT_AR_BSP (or PT_CFM) we MUST copy any
+-			 * users-level stacked registers that are
+-			 * stored on the kernel stack back to
+-			 * user-space because otherwise, we might end
+-			 * up clobbering kernel stacked registers.
+-			 * Also, if this happens while the task is
+-			 * blocked in a system call, which convert the
+-			 * state such that the non-system-call exit
++			 * PT_AR_BSP (or PT_CFM) while the task is
++			 * blocked in a system call, convert the state
++			 * so that the non-system-call exit
+ 			 * path is used.  This ensures that the proper
+ 			 * state will be picked up when resuming
+ 			 * execution.  However, it *also* means that
+@@ -1035,10 +984,6 @@ access_uarea (struct task_struct *child, unsigned long addr,
+ 			urbs_end = ia64_get_user_rbs_end(child, pt, &cfm);
+ 			if (write_access) {
+ 				if (*data != urbs_end) {
+-					if (ia64_sync_user_rbs(child, sw,
+-							       pt->ar_bspstore,
+-							       urbs_end) < 0)
+-						return -1;
+ 					if (in_syscall(pt))
+ 						convert_to_non_syscall(child,
+ 								       pt,
+@@ -1058,10 +1003,6 @@ access_uarea (struct task_struct *child, unsigned long addr,
+ 			urbs_end = ia64_get_user_rbs_end(child, pt, &cfm);
+ 			if (write_access) {
+ 				if (((cfm ^ *data) & PFM_MASK) != 0) {
+-					if (ia64_sync_user_rbs(child, sw,
+-							       pt->ar_bspstore,
+-							       urbs_end) < 0)
+-						return -1;
+ 					if (in_syscall(pt))
+ 						convert_to_non_syscall(child,
+ 								       pt,
+@@ -1093,16 +1034,8 @@ access_uarea (struct task_struct *child, unsigned long addr,
+ 			return 0;
+ 
+ 		      case PT_AR_RNAT:
+-			urbs_end = ia64_get_user_rbs_end(child, pt, NULL);
+-			rnat_addr = (long) ia64_rse_rnat_addr((long *)
+-							      urbs_end);
+-			if (write_access)
+-				return ia64_poke(child, sw, urbs_end,
+-						 rnat_addr, *data);
+-			else
+-				return ia64_peek(child, sw, urbs_end,
+-						 rnat_addr, data);
+-
++			ptr = pt_reg_addr(pt, ar_rnat);
++			break;
+ 		      case PT_R1:
+ 			ptr = pt_reg_addr(pt, r1);
+ 			break;
+@@ -1521,215 +1454,97 @@ ptrace_setregs (struct task_struct *child, struct pt_all_user_regs __user *ppr)
+ 	return ret;
+ }
+ 
+-/*
+- * Called by kernel/ptrace.c when detaching..
+- *
+- * Make sure the single step bit is not set.
+- */
+ void
+-ptrace_disable (struct task_struct *child)
++user_enable_single_step (struct task_struct *child)
+ {
+ 	struct ia64_psr *child_psr = ia64_psr(task_pt_regs(child));
+ 
+-	/* make sure the single step/taken-branch trap bits are not set: */
+-	clear_tsk_thread_flag(child, TIF_SINGLESTEP);
+-	child_psr->ss = 0;
+-	child_psr->tb = 0;
++	set_tsk_thread_flag(child, TIF_SINGLESTEP);
++	child_psr->ss = 1;
+ }
+ 
+-asmlinkage long
+-sys_ptrace (long request, pid_t pid, unsigned long addr, unsigned long data)
++void
++user_enable_block_step (struct task_struct *child)
+ {
+-	struct pt_regs *pt;
+-	unsigned long urbs_end, peek_or_poke;
+-	struct task_struct *child;
+-	struct switch_stack *sw;
+-	long ret;
+-	struct unw_frame_info info;
++	struct ia64_psr *child_psr = ia64_psr(task_pt_regs(child));
+ 
+-	lock_kernel();
+-	ret = -EPERM;
+-	if (request == PTRACE_TRACEME) {
+-		ret = ptrace_traceme();
+-		goto out;
+-	}
++	set_tsk_thread_flag(child, TIF_SINGLESTEP);
++	child_psr->tb = 1;
++}
+ 
+-	peek_or_poke = (request == PTRACE_PEEKTEXT
+-			|| request == PTRACE_PEEKDATA
+-			|| request == PTRACE_POKETEXT
+-			|| request == PTRACE_POKEDATA);
+-	ret = -ESRCH;
+-	read_lock(&tasklist_lock);
+-	{
+-		child = find_task_by_pid(pid);
+-		if (child) {
+-			if (peek_or_poke)
+-				child = find_thread_for_addr(child, addr);
+-			get_task_struct(child);
+-		}
+-	}
+-	read_unlock(&tasklist_lock);
+-	if (!child)
+-		goto out;
+-	ret = -EPERM;
+-	if (pid == 1)		/* no messing around with init! */
+-		goto out_tsk;
+-
+-	if (request == PTRACE_ATTACH) {
+-		ret = ptrace_attach(child);
+-		if (!ret)
+-			arch_ptrace_attach(child);
+-		goto out_tsk;
+-	}
++void
++user_disable_single_step (struct task_struct *child)
++{
++	struct ia64_psr *child_psr = ia64_psr(task_pt_regs(child));
+ 
+-	ret = ptrace_check_attach(child, request == PTRACE_KILL);
+-	if (ret < 0)
+-		goto out_tsk;
++	/* make sure the single step/taken-branch trap bits are not set: */
++	clear_tsk_thread_flag(child, TIF_SINGLESTEP);
++	child_psr->ss = 0;
++	child_psr->tb = 0;
++}
+ 
+-	pt = task_pt_regs(child);
+-	sw = (struct switch_stack *) (child->thread.ksp + 16);
++/*
++ * Called by kernel/ptrace.c when detaching..
++ *
++ * Make sure the single step bit is not set.
++ */
++void
++ptrace_disable (struct task_struct *child)
++{
++	user_disable_single_step(child);
++}
+ 
++long
++arch_ptrace (struct task_struct *child, long request, long addr, long data)
++{
+ 	switch (request) {
+-	      case PTRACE_PEEKTEXT:
+-	      case PTRACE_PEEKDATA:
++	case PTRACE_PEEKTEXT:
++	case PTRACE_PEEKDATA:
+ 		/* read word at location addr */
+-		urbs_end = ia64_get_user_rbs_end(child, pt, NULL);
+-		ret = ia64_peek(child, sw, urbs_end, addr, &data);
+-		if (ret == 0) {
+-			ret = data;
+-			/* ensure "ret" is not mistaken as an error code: */
+-			force_successful_syscall_return();
+-		}
+-		goto out_tsk;
+-
+-	      case PTRACE_POKETEXT:
+-	      case PTRACE_POKEDATA:
+-		/* write the word at location addr */
+-		urbs_end = ia64_get_user_rbs_end(child, pt, NULL);
+-		ret = ia64_poke(child, sw, urbs_end, addr, data);
+-
+-		/* Make sure user RBS has the latest data */
+-		unw_init_from_blocked_task(&info, child);
+-		do_sync_rbs(&info, ia64_sync_user_rbs);
++		if (access_process_vm(child, addr, &data, sizeof(data), 0)
++		    != sizeof(data))
++			return -EIO;
++		/* ensure return value is not mistaken for error code */
++		force_successful_syscall_return();
++		return data;
+ 
+-		goto out_tsk;
++	/* PTRACE_POKETEXT and PTRACE_POKEDATA is handled
++	 * by the generic ptrace_request().
++	 */
+ 
+-	      case PTRACE_PEEKUSR:
++	case PTRACE_PEEKUSR:
+ 		/* read the word at addr in the USER area */
+-		if (access_uarea(child, addr, &data, 0) < 0) {
+-			ret = -EIO;
+-			goto out_tsk;
+-		}
+-		ret = data;
+-		/* ensure "ret" is not mistaken as an error code */
++		if (access_uarea(child, addr, &data, 0) < 0)
++			return -EIO;
++		/* ensure return value is not mistaken for error code */
+ 		force_successful_syscall_return();
+-		goto out_tsk;
++		return data;
+ 
+-	      case PTRACE_POKEUSR:
++	case PTRACE_POKEUSR:
+ 		/* write the word at addr in the USER area */
+-		if (access_uarea(child, addr, &data, 1) < 0) {
+-			ret = -EIO;
+-			goto out_tsk;
+-		}
+-		ret = 0;
+-		goto out_tsk;
++		if (access_uarea(child, addr, &data, 1) < 0)
++			return -EIO;
++		return 0;
+ 
+-	      case PTRACE_OLD_GETSIGINFO:
++	case PTRACE_OLD_GETSIGINFO:
+ 		/* for backwards-compatibility */
+-		ret = ptrace_request(child, PTRACE_GETSIGINFO, addr, data);
+-		goto out_tsk;
++		return ptrace_request(child, PTRACE_GETSIGINFO, addr, data);
+ 
+-	      case PTRACE_OLD_SETSIGINFO:
++	case PTRACE_OLD_SETSIGINFO:
+ 		/* for backwards-compatibility */
+-		ret = ptrace_request(child, PTRACE_SETSIGINFO, addr, data);
+-		goto out_tsk;
+-
+-	      case PTRACE_SYSCALL:
+-		/* continue and stop at next (return from) syscall */
+-	      case PTRACE_CONT:
+-		/* restart after signal. */
+-		ret = -EIO;
+-		if (!valid_signal(data))
+-			goto out_tsk;
+-		if (request == PTRACE_SYSCALL)
+-			set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
+-		else
+-			clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
+-		child->exit_code = data;
++		return ptrace_request(child, PTRACE_SETSIGINFO, addr, data);
+ 
+-		/*
+-		 * Make sure the single step/taken-branch trap bits
+-		 * are not set:
+-		 */
+-		clear_tsk_thread_flag(child, TIF_SINGLESTEP);
+-		ia64_psr(pt)->ss = 0;
+-		ia64_psr(pt)->tb = 0;
++	case PTRACE_GETREGS:
++		return ptrace_getregs(child,
++				      (struct pt_all_user_regs __user *) data);
+ 
+-		wake_up_process(child);
+-		ret = 0;
+-		goto out_tsk;
++	case PTRACE_SETREGS:
++		return ptrace_setregs(child,
++				      (struct pt_all_user_regs __user *) data);
+ 
+-	      case PTRACE_KILL:
+-		/*
+-		 * Make the child exit.  Best I can do is send it a
+-		 * sigkill.  Perhaps it should be put in the status
+-		 * that it wants to exit.
+-		 */
+-		if (child->exit_state == EXIT_ZOMBIE)
+-			/* already dead */
+-			goto out_tsk;
+-		child->exit_code = SIGKILL;
+-
+-		ptrace_disable(child);
+-		wake_up_process(child);
+-		ret = 0;
+-		goto out_tsk;
+-
+-	      case PTRACE_SINGLESTEP:
+-		/* let child execute for one instruction */
+-	      case PTRACE_SINGLEBLOCK:
+-		ret = -EIO;
+-		if (!valid_signal(data))
+-			goto out_tsk;
+-
+-		clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
+-		set_tsk_thread_flag(child, TIF_SINGLESTEP);
+-		if (request == PTRACE_SINGLESTEP) {
+-			ia64_psr(pt)->ss = 1;
+-		} else {
+-			ia64_psr(pt)->tb = 1;
+-		}
+-		child->exit_code = data;
+-
+-		/* give it a chance to run. */
+-		wake_up_process(child);
+-		ret = 0;
+-		goto out_tsk;
+-
+-	      case PTRACE_DETACH:
+-		/* detach a process that was attached. */
+-		ret = ptrace_detach(child, data);
+-		goto out_tsk;
+-
+-	      case PTRACE_GETREGS:
+-		ret = ptrace_getregs(child,
+-				     (struct pt_all_user_regs __user *) data);
+-		goto out_tsk;
+-
+-	      case PTRACE_SETREGS:
+-		ret = ptrace_setregs(child,
+-				     (struct pt_all_user_regs __user *) data);
+-		goto out_tsk;
+-
+-	      default:
+-		ret = ptrace_request(child, request, addr, data);
+-		goto out_tsk;
++	default:
++		return ptrace_request(child, request, addr, data);
+ 	}
+-  out_tsk:
+-	put_task_struct(child);
+-  out:
+-	unlock_kernel();
+-	return ret;
+ }
+ 
+ 
+diff --git a/arch/ia64/kernel/setup.c b/arch/ia64/kernel/setup.c
+index ebd1a09..4aa9eae 100644
+--- a/arch/ia64/kernel/setup.c
++++ b/arch/ia64/kernel/setup.c
+@@ -690,7 +690,7 @@ get_model_name(__u8 family, __u8 model)
+ 	if (overflow++ == 0)
+ 		printk(KERN_ERR
+ 		       "%s: Table overflow. Some processor model information will be missing\n",
+-		       __FUNCTION__);
++		       __func__);
+ 	return "Unknown";
+ }
+ 
+@@ -785,7 +785,7 @@ get_max_cacheline_size (void)
+         status = ia64_pal_cache_summary(&levels, &unique_caches);
+         if (status != 0) {
+                 printk(KERN_ERR "%s: ia64_pal_cache_summary() failed (status=%ld)\n",
+-                       __FUNCTION__, status);
++                       __func__, status);
+                 max = SMP_CACHE_BYTES;
+ 		/* Safest setup for "flush_icache_range()" */
+ 		ia64_i_cache_stride_shift = I_CACHE_STRIDE_SHIFT;
+@@ -798,7 +798,7 @@ get_max_cacheline_size (void)
+ 		if (status != 0) {
+ 			printk(KERN_ERR
+ 			       "%s: ia64_pal_cache_config_info(l=%lu, 2) failed (status=%ld)\n",
+-			       __FUNCTION__, l, status);
++			       __func__, l, status);
+ 			max = SMP_CACHE_BYTES;
+ 			/* The safest setup for "flush_icache_range()" */
+ 			cci.pcci_stride = I_CACHE_STRIDE_SHIFT;
+@@ -814,7 +814,7 @@ get_max_cacheline_size (void)
+ 			if (status != 0) {
+ 				printk(KERN_ERR
+ 				"%s: ia64_pal_cache_config_info(l=%lu, 1) failed (status=%ld)\n",
+-					__FUNCTION__, l, status);
++					__func__, l, status);
+ 				/* The safest setup for "flush_icache_range()" */
+ 				cci.pcci_stride = I_CACHE_STRIDE_SHIFT;
+ 			}
+diff --git a/arch/ia64/kernel/unaligned.c b/arch/ia64/kernel/unaligned.c
+index 52f70bb..6903361 100644
+--- a/arch/ia64/kernel/unaligned.c
++++ b/arch/ia64/kernel/unaligned.c
+@@ -28,7 +28,7 @@ extern int die_if_kernel(char *str, struct pt_regs *regs, long err);
+ #undef DEBUG_UNALIGNED_TRAP
+ 
+ #ifdef DEBUG_UNALIGNED_TRAP
+-# define DPRINT(a...)	do { printk("%s %u: ", __FUNCTION__, __LINE__); printk (a); } while (0)
++# define DPRINT(a...)	do { printk("%s %u: ", __func__, __LINE__); printk (a); } while (0)
+ # define DDUMP(str,vp,len)	dump(str, vp, len)
+ 
+ static void
+@@ -674,7 +674,7 @@ emulate_load_updates (update_t type, load_store_t ld, struct pt_regs *regs, unsi
+ 	 * just in case.
+ 	 */
+ 	if (ld.x6_op == 1 || ld.x6_op == 3) {
+-		printk(KERN_ERR "%s: register update on speculative load, error\n", __FUNCTION__);
++		printk(KERN_ERR "%s: register update on speculative load, error\n", __func__);
+ 		if (die_if_kernel("unaligned reference on speculative load with register update\n",
+ 				  regs, 30))
+ 			return;
+@@ -1104,7 +1104,7 @@ emulate_load_floatpair (unsigned long ifa, load_store_t ld, struct pt_regs *regs
+ 		 */
+ 		if (ld.x6_op == 1 || ld.x6_op == 3)
+ 			printk(KERN_ERR "%s: register update on speculative load pair, error\n",
+-			       __FUNCTION__);
++			       __func__);
+ 
+ 		setreg(ld.r3, ifa, 0, regs);
+ 	}
+diff --git a/arch/ia64/kernel/unwind.c b/arch/ia64/kernel/unwind.c
+index c1bdb51..67810b7 100644
+--- a/arch/ia64/kernel/unwind.c
++++ b/arch/ia64/kernel/unwind.c
+@@ -257,7 +257,7 @@ pt_regs_off (unsigned long reg)
+ 		off = unw.pt_regs_offsets[reg];
+ 
+ 	if (off < 0) {
+-		UNW_DPRINT(0, "unwind.%s: bad scratch reg r%lu\n", __FUNCTION__, reg);
++		UNW_DPRINT(0, "unwind.%s: bad scratch reg r%lu\n", __func__, reg);
+ 		off = 0;
+ 	}
+ 	return (unsigned long) off;
+@@ -268,13 +268,13 @@ get_scratch_regs (struct unw_frame_info *info)
+ {
+ 	if (!info->pt) {
+ 		/* This should not happen with valid unwind info.  */
+-		UNW_DPRINT(0, "unwind.%s: bad unwind info: resetting info->pt\n", __FUNCTION__);
++		UNW_DPRINT(0, "unwind.%s: bad unwind info: resetting info->pt\n", __func__);
+ 		if (info->flags & UNW_FLAG_INTERRUPT_FRAME)
+ 			info->pt = (unsigned long) ((struct pt_regs *) info->psp - 1);
+ 		else
+ 			info->pt = info->sp - 16;
+ 	}
+-	UNW_DPRINT(3, "unwind.%s: sp 0x%lx pt 0x%lx\n", __FUNCTION__, info->sp, info->pt);
++	UNW_DPRINT(3, "unwind.%s: sp 0x%lx pt 0x%lx\n", __func__, info->sp, info->pt);
+ 	return (struct pt_regs *) info->pt;
+ }
+ 
+@@ -294,7 +294,7 @@ unw_access_gr (struct unw_frame_info *info, int regnum, unsigned long *val, char
+ 			return 0;
+ 		}
+ 		UNW_DPRINT(0, "unwind.%s: trying to access non-existent r%u\n",
+-			   __FUNCTION__, regnum);
++			   __func__, regnum);
+ 		return -1;
+ 	}
+ 
+@@ -341,7 +341,7 @@ unw_access_gr (struct unw_frame_info *info, int regnum, unsigned long *val, char
+ 					{
+ 						UNW_DPRINT(0, "unwind.%s: %p outside of regstk "
+ 							"[0x%lx-0x%lx)\n",
+-							__FUNCTION__, (void *) addr,
++							__func__, (void *) addr,
+ 							info->regstk.limit,
+ 							info->regstk.top);
+ 						return -1;
+@@ -374,7 +374,7 @@ unw_access_gr (struct unw_frame_info *info, int regnum, unsigned long *val, char
+ 		    || (unsigned long) addr >= info->regstk.top)
+ 		{
+ 			UNW_DPRINT(0, "unwind.%s: ignoring attempt to access register outside "
+-				   "of rbs\n",  __FUNCTION__);
++				   "of rbs\n",  __func__);
+ 			return -1;
+ 		}
+ 		if ((unsigned long) nat_addr >= info->regstk.top)
+@@ -385,7 +385,7 @@ unw_access_gr (struct unw_frame_info *info, int regnum, unsigned long *val, char
+ 	if (write) {
+ 		if (read_only(addr)) {
+ 			UNW_DPRINT(0, "unwind.%s: ignoring attempt to write read-only location\n",
+-				__FUNCTION__);
++				__func__);
+ 		} else {
+ 			*addr = *val;
+ 			if (*nat)
+@@ -427,13 +427,13 @@ unw_access_br (struct unw_frame_info *info, int regnum, unsigned long *val, int
+ 
+ 	      default:
+ 		UNW_DPRINT(0, "unwind.%s: trying to access non-existent b%u\n",
+-			   __FUNCTION__, regnum);
++			   __func__, regnum);
+ 		return -1;
+ 	}
+ 	if (write)
+ 		if (read_only(addr)) {
+ 			UNW_DPRINT(0, "unwind.%s: ignoring attempt to write read-only location\n",
+-				__FUNCTION__);
++				__func__);
+ 		} else
+ 			*addr = *val;
+ 	else
+@@ -450,7 +450,7 @@ unw_access_fr (struct unw_frame_info *info, int regnum, struct ia64_fpreg *val,
+ 
+ 	if ((unsigned) (regnum - 2) >= 126) {
+ 		UNW_DPRINT(0, "unwind.%s: trying to access non-existent f%u\n",
+-			   __FUNCTION__, regnum);
++			   __func__, regnum);
+ 		return -1;
+ 	}
+ 
+@@ -482,7 +482,7 @@ unw_access_fr (struct unw_frame_info *info, int regnum, struct ia64_fpreg *val,
+ 	if (write)
+ 		if (read_only(addr)) {
+ 			UNW_DPRINT(0, "unwind.%s: ignoring attempt to write read-only location\n",
+-				__FUNCTION__);
++				__func__);
+ 		} else
+ 			*addr = *val;
+ 	else
+@@ -572,14 +572,14 @@ unw_access_ar (struct unw_frame_info *info, int regnum, unsigned long *val, int
+ 
+ 	      default:
+ 		UNW_DPRINT(0, "unwind.%s: trying to access non-existent ar%u\n",
+-			   __FUNCTION__, regnum);
++			   __func__, regnum);
+ 		return -1;
+ 	}
+ 
+ 	if (write) {
+ 		if (read_only(addr)) {
+ 			UNW_DPRINT(0, "unwind.%s: ignoring attempt to write read-only location\n",
+-				__FUNCTION__);
++				__func__);
+ 		} else
+ 			*addr = *val;
+ 	} else
+@@ -600,7 +600,7 @@ unw_access_pr (struct unw_frame_info *info, unsigned long *val, int write)
+ 	if (write) {
+ 		if (read_only(addr)) {
+ 			UNW_DPRINT(0, "unwind.%s: ignoring attempt to write read-only location\n",
+-				__FUNCTION__);
++				__func__);
+ 		} else
+ 			*addr = *val;
+ 	} else
+@@ -699,7 +699,7 @@ decode_abreg (unsigned char abreg, int memory)
+ 	      default:
+ 		break;
+ 	}
+-	UNW_DPRINT(0, "unwind.%s: bad abreg=0x%x\n", __FUNCTION__, abreg);
++	UNW_DPRINT(0, "unwind.%s: bad abreg=0x%x\n", __func__, abreg);
+ 	return UNW_REG_LC;
+ }
+ 
+@@ -739,7 +739,7 @@ spill_next_when (struct unw_reg_info **regp, struct unw_reg_info *lim, unw_word
+ 			return;
+ 		}
+ 	}
+-	UNW_DPRINT(0, "unwind.%s: excess spill!\n",  __FUNCTION__);
++	UNW_DPRINT(0, "unwind.%s: excess spill!\n",  __func__);
+ }
+ 
+ static inline void
+@@ -855,11 +855,11 @@ desc_abi (unsigned char abi, unsigned char context, struct unw_state_record *sr)
+ {
+ 	if (abi == 3 && context == 'i') {
+ 		sr->flags |= UNW_FLAG_INTERRUPT_FRAME;
+-		UNW_DPRINT(3, "unwind.%s: interrupt frame\n",  __FUNCTION__);
++		UNW_DPRINT(3, "unwind.%s: interrupt frame\n",  __func__);
+ 	}
+ 	else
+ 		UNW_DPRINT(0, "unwind%s: ignoring unwabi(abi=0x%x,context=0x%x)\n",
+-				__FUNCTION__, abi, context);
++				__func__, abi, context);
+ }
+ 
+ static inline void
+@@ -1347,7 +1347,7 @@ script_emit (struct unw_script *script, struct unw_insn insn)
+ {
+ 	if (script->count >= UNW_MAX_SCRIPT_LEN) {
+ 		UNW_DPRINT(0, "unwind.%s: script exceeds maximum size of %u instructions!\n",
+-			__FUNCTION__, UNW_MAX_SCRIPT_LEN);
++			__func__, UNW_MAX_SCRIPT_LEN);
+ 		return;
+ 	}
+ 	script->insn[script->count++] = insn;
+@@ -1389,7 +1389,7 @@ emit_nat_info (struct unw_state_record *sr, int i, struct unw_script *script)
+ 
+ 	      default:
+ 		UNW_DPRINT(0, "unwind.%s: don't know how to emit nat info for where = %u\n",
+-			   __FUNCTION__, r->where);
++			   __func__, r->where);
+ 		return;
+ 	}
+ 	insn.opc = opc;
+@@ -1446,7 +1446,7 @@ compile_reg (struct unw_state_record *sr, int i, struct unw_script *script)
+ 				val = offsetof(struct pt_regs, f6) + 16*(rval - 6);
+ 			else
+ 				UNW_DPRINT(0, "unwind.%s: kernel may not touch f%lu\n",
+-					   __FUNCTION__, rval);
++					   __func__, rval);
+ 		}
+ 		break;
+ 
+@@ -1474,7 +1474,7 @@ compile_reg (struct unw_state_record *sr, int i, struct unw_script *script)
+ 
+ 	      default:
+ 		UNW_DPRINT(0, "unwind%s: register %u has unexpected `where' value of %u\n",
+-			   __FUNCTION__, i, r->where);
++			   __func__, i, r->where);
+ 		break;
+ 	}
+ 	insn.opc = opc;
+@@ -1547,10 +1547,10 @@ build_script (struct unw_frame_info *info)
+ 		r->when = UNW_WHEN_NEVER;
+ 	sr.pr_val = info->pr;
+ 
+-	UNW_DPRINT(3, "unwind.%s: ip 0x%lx\n", __FUNCTION__, ip);
++	UNW_DPRINT(3, "unwind.%s: ip 0x%lx\n", __func__, ip);
+ 	script = script_new(ip);
+ 	if (!script) {
+-		UNW_DPRINT(0, "unwind.%s: failed to create unwind script\n",  __FUNCTION__);
++		UNW_DPRINT(0, "unwind.%s: failed to create unwind script\n",  __func__);
+ 		STAT(unw.stat.script.build_time += ia64_get_itc() - start);
+ 		return NULL;
+ 	}
+@@ -1569,7 +1569,7 @@ build_script (struct unw_frame_info *info)
+ 	if (!e) {
+ 		/* no info, return default unwinder (leaf proc, no mem stack, no saved regs)  */
+ 		UNW_DPRINT(1, "unwind.%s: no unwind info for ip=0x%lx (prev ip=0x%lx)\n",
+-			__FUNCTION__, ip, unw.cache[info->prev_script].ip);
++			__func__, ip, unw.cache[info->prev_script].ip);
+ 		sr.curr.reg[UNW_REG_RP].where = UNW_WHERE_BR;
+ 		sr.curr.reg[UNW_REG_RP].when = -1;
+ 		sr.curr.reg[UNW_REG_RP].val = 0;
+@@ -1618,13 +1618,13 @@ build_script (struct unw_frame_info *info)
+ 		sr.curr.reg[UNW_REG_RP].when = -1;
+ 		sr.curr.reg[UNW_REG_RP].val = sr.return_link_reg;
+ 		UNW_DPRINT(1, "unwind.%s: using default for rp at ip=0x%lx where=%d val=0x%lx\n",
+-			   __FUNCTION__, ip, sr.curr.reg[UNW_REG_RP].where,
++			   __func__, ip, sr.curr.reg[UNW_REG_RP].where,
+ 			   sr.curr.reg[UNW_REG_RP].val);
+ 	}
+ 
+ #ifdef UNW_DEBUG
+ 	UNW_DPRINT(1, "unwind.%s: state record for func 0x%lx, t=%u:\n",
+-		__FUNCTION__, table->segment_base + e->start_offset, sr.when_target);
++		__func__, table->segment_base + e->start_offset, sr.when_target);
+ 	for (r = sr.curr.reg; r < sr.curr.reg + UNW_NUM_REGS; ++r) {
+ 		if (r->where != UNW_WHERE_NONE || r->when != UNW_WHEN_NEVER) {
+ 			UNW_DPRINT(1, "  %s <- ", unw.preg_name[r - sr.curr.reg]);
+@@ -1746,7 +1746,7 @@ run_script (struct unw_script *script, struct unw_frame_info *state)
+ 			} else {
+ 				s[dst] = 0;
+ 				UNW_DPRINT(0, "unwind.%s: no state->pt, dst=%ld, val=%ld\n",
+-					   __FUNCTION__, dst, val);
++					   __func__, dst, val);
+ 			}
+ 			break;
+ 
+@@ -1756,7 +1756,7 @@ run_script (struct unw_script *script, struct unw_frame_info *state)
+ 			else {
+ 				s[dst] = 0;
+ 				UNW_DPRINT(0, "unwind.%s: UNW_INSN_MOVE_CONST bad val=%ld\n",
+-					   __FUNCTION__, val);
++					   __func__, val);
+ 			}
+ 			break;
+ 
+@@ -1791,7 +1791,7 @@ run_script (struct unw_script *script, struct unw_frame_info *state)
+ 			    || s[val] < TASK_SIZE)
+ 			{
+ 				UNW_DPRINT(0, "unwind.%s: rejecting bad psp=0x%lx\n",
+-					   __FUNCTION__, s[val]);
++					   __func__, s[val]);
+ 				break;
+ 			}
+ #endif
+@@ -1825,7 +1825,7 @@ find_save_locs (struct unw_frame_info *info)
+ 	if ((info->ip & (local_cpu_data->unimpl_va_mask | 0xf)) || info->ip < TASK_SIZE) {
+ 		/* don't let obviously bad addresses pollute the cache */
+ 		/* FIXME: should really be level 0 but it occurs too often. KAO */
+-		UNW_DPRINT(1, "unwind.%s: rejecting bad ip=0x%lx\n", __FUNCTION__, info->ip);
++		UNW_DPRINT(1, "unwind.%s: rejecting bad ip=0x%lx\n", __func__, info->ip);
+ 		info->rp_loc = NULL;
+ 		return -1;
+ 	}
+@@ -1838,7 +1838,7 @@ find_save_locs (struct unw_frame_info *info)
+ 			spin_unlock_irqrestore(&unw.lock, flags);
+ 			UNW_DPRINT(0,
+ 				   "unwind.%s: failed to locate/build unwind script for ip %lx\n",
+-				   __FUNCTION__, info->ip);
++				   __func__, info->ip);
+ 			return -1;
+ 		}
+ 		have_write_lock = 1;
+@@ -1882,21 +1882,21 @@ unw_unwind (struct unw_frame_info *info)
+ 	if (!unw_valid(info, info->rp_loc)) {
+ 		/* FIXME: should really be level 0 but it occurs too often. KAO */
+ 		UNW_DPRINT(1, "unwind.%s: failed to locate return link (ip=0x%lx)!\n",
+-			   __FUNCTION__, info->ip);
++			   __func__, info->ip);
+ 		STAT(unw.stat.api.unwind_time += ia64_get_itc() - start; local_irq_restore(flags));
+ 		return -1;
+ 	}
+ 	/* restore the ip */
+ 	ip = info->ip = *info->rp_loc;
+ 	if (ip < GATE_ADDR) {
+-		UNW_DPRINT(2, "unwind.%s: reached user-space (ip=0x%lx)\n", __FUNCTION__, ip);
++		UNW_DPRINT(2, "unwind.%s: reached user-space (ip=0x%lx)\n", __func__, ip);
+ 		STAT(unw.stat.api.unwind_time += ia64_get_itc() - start; local_irq_restore(flags));
+ 		return -1;
+ 	}
+ 
+ 	/* validate the previous stack frame pointer */
+ 	if (!unw_valid(info, info->pfs_loc)) {
+-		UNW_DPRINT(0, "unwind.%s: failed to locate ar.pfs!\n", __FUNCTION__);
++		UNW_DPRINT(0, "unwind.%s: failed to locate ar.pfs!\n", __func__);
+ 		STAT(unw.stat.api.unwind_time += ia64_get_itc() - start; local_irq_restore(flags));
+ 		return -1;
+ 	}
+@@ -1912,13 +1912,13 @@ unw_unwind (struct unw_frame_info *info)
+ 			num_regs = *info->cfm_loc & 0x7f;		/* size of frame */
+ 		info->pfs_loc =
+ 			(unsigned long *) (info->pt + offsetof(struct pt_regs, ar_pfs));
+-		UNW_DPRINT(3, "unwind.%s: interrupt_frame pt 0x%lx\n", __FUNCTION__, info->pt);
++		UNW_DPRINT(3, "unwind.%s: interrupt_frame pt 0x%lx\n", __func__, info->pt);
+ 	} else
+ 		num_regs = (*info->cfm_loc >> 7) & 0x7f;	/* size of locals */
+ 	info->bsp = (unsigned long) ia64_rse_skip_regs((unsigned long *) info->bsp, -num_regs);
+ 	if (info->bsp < info->regstk.limit || info->bsp > info->regstk.top) {
+ 		UNW_DPRINT(0, "unwind.%s: bsp (0x%lx) out of range [0x%lx-0x%lx]\n",
+-			__FUNCTION__, info->bsp, info->regstk.limit, info->regstk.top);
++			__func__, info->bsp, info->regstk.limit, info->regstk.top);
+ 		STAT(unw.stat.api.unwind_time += ia64_get_itc() - start; local_irq_restore(flags));
+ 		return -1;
+ 	}
+@@ -1927,14 +1927,14 @@ unw_unwind (struct unw_frame_info *info)
+ 	info->sp = info->psp;
+ 	if (info->sp < info->memstk.top || info->sp > info->memstk.limit) {
+ 		UNW_DPRINT(0, "unwind.%s: sp (0x%lx) out of range [0x%lx-0x%lx]\n",
+-			__FUNCTION__, info->sp, info->memstk.top, info->memstk.limit);
++			__func__, info->sp, info->memstk.top, info->memstk.limit);
+ 		STAT(unw.stat.api.unwind_time += ia64_get_itc() - start; local_irq_restore(flags));
+ 		return -1;
+ 	}
+ 
+ 	if (info->ip == prev_ip && info->sp == prev_sp && info->bsp == prev_bsp) {
+ 		UNW_DPRINT(0, "unwind.%s: ip, sp, bsp unchanged; stopping here (ip=0x%lx)\n",
+-			   __FUNCTION__, ip);
++			   __func__, ip);
+ 		STAT(unw.stat.api.unwind_time += ia64_get_itc() - start; local_irq_restore(flags));
+ 		return -1;
+ 	}
+@@ -1961,7 +1961,7 @@ unw_unwind_to_user (struct unw_frame_info *info)
+ 		if ((long)((unsigned long)info->task + IA64_STK_OFFSET - sp)
+ 		    < IA64_PT_REGS_SIZE) {
+ 			UNW_DPRINT(0, "unwind.%s: ran off the top of the kernel stack\n",
+-				   __FUNCTION__);
++				   __func__);
+ 			break;
+ 		}
+ 		if (unw_is_intr_frame(info) &&
+@@ -1971,13 +1971,13 @@ unw_unwind_to_user (struct unw_frame_info *info)
+ 			unw_get_rp(info, &ip);
+ 			UNW_DPRINT(0, "unwind.%s: failed to read "
+ 				   "predicate register (ip=0x%lx)\n",
+-				__FUNCTION__, ip);
++				__func__, ip);
+ 			return -1;
+ 		}
+ 	} while (unw_unwind(info) >= 0);
+ 	unw_get_ip(info, &ip);
+ 	UNW_DPRINT(0, "unwind.%s: failed to unwind to user-level (ip=0x%lx)\n",
+-		   __FUNCTION__, ip);
++		   __func__, ip);
+ 	return -1;
+ }
+ EXPORT_SYMBOL(unw_unwind_to_user);
+@@ -2028,7 +2028,7 @@ init_frame_info (struct unw_frame_info *info, struct task_struct *t,
+ 		   "  pr     0x%lx\n"
+ 		   "  sw     0x%lx\n"
+ 		   "  sp     0x%lx\n",
+-		   __FUNCTION__, (unsigned long) t, rbslimit, rbstop, stktop, stklimit,
++		   __func__, (unsigned long) t, rbslimit, rbstop, stktop, stklimit,
+ 		   info->pr, (unsigned long) info->sw, info->sp);
+ 	STAT(unw.stat.api.init_time += ia64_get_itc() - start; local_irq_restore(flags));
+ }
+@@ -2047,7 +2047,7 @@ unw_init_frame_info (struct unw_frame_info *info, struct task_struct *t, struct
+ 		   "  bsp    0x%lx\n"
+ 		   "  sol    0x%lx\n"
+ 		   "  ip     0x%lx\n",
+-		   __FUNCTION__, info->bsp, sol, info->ip);
++		   __func__, info->bsp, sol, info->ip);
+ 	find_save_locs(info);
+ }
+ 
+@@ -2058,7 +2058,7 @@ unw_init_from_blocked_task (struct unw_frame_info *info, struct task_struct *t)
+ {
+ 	struct switch_stack *sw = (struct switch_stack *) (t->thread.ksp + 16);
+ 
+-	UNW_DPRINT(1, "unwind.%s\n", __FUNCTION__);
++	UNW_DPRINT(1, "unwind.%s\n", __func__);
+ 	unw_init_frame_info(info, t, sw);
+ }
+ EXPORT_SYMBOL(unw_init_from_blocked_task);
+@@ -2088,7 +2088,7 @@ unw_add_unwind_table (const char *name, unsigned long segment_base, unsigned lon
+ 
+ 	if (end - start <= 0) {
+ 		UNW_DPRINT(0, "unwind.%s: ignoring attempt to insert empty unwind table\n",
+-			   __FUNCTION__);
++			   __func__);
+ 		return NULL;
+ 	}
+ 
+@@ -2119,14 +2119,14 @@ unw_remove_unwind_table (void *handle)
+ 
+ 	if (!handle) {
+ 		UNW_DPRINT(0, "unwind.%s: ignoring attempt to remove non-existent unwind table\n",
+-			   __FUNCTION__);
++			   __func__);
+ 		return;
+ 	}
+ 
+ 	table = handle;
+ 	if (table == &unw.kernel_table) {
+ 		UNW_DPRINT(0, "unwind.%s: sorry, freeing the kernel's unwind table is a "
+-			   "no-can-do!\n", __FUNCTION__);
++			   "no-can-do!\n", __func__);
+ 		return;
+ 	}
+ 
+@@ -2139,7 +2139,7 @@ unw_remove_unwind_table (void *handle)
+ 				break;
+ 		if (!prev) {
+ 			UNW_DPRINT(0, "unwind.%s: failed to find unwind table %p\n",
+-				   __FUNCTION__, (void *) table);
++				   __func__, (void *) table);
+ 			spin_unlock_irqrestore(&unw.lock, flags);
+ 			return;
+ 		}
+@@ -2185,7 +2185,7 @@ create_gate_table (void)
+ 		}
+ 
+ 	if (!punw) {
+-		printk("%s: failed to find gate DSO's unwind table!\n", __FUNCTION__);
++		printk("%s: failed to find gate DSO's unwind table!\n", __func__);
+ 		return 0;
+ 	}
+ 
+@@ -2202,7 +2202,7 @@ create_gate_table (void)
+ 	unw.gate_table = kmalloc(size, GFP_KERNEL);
+ 	if (!unw.gate_table) {
+ 		unw.gate_table_size = 0;
+-		printk(KERN_ERR "%s: unable to create unwind data for gate page!\n", __FUNCTION__);
++		printk(KERN_ERR "%s: unable to create unwind data for gate page!\n", __func__);
+ 		return 0;
+ 	}
+ 	unw.gate_table_size = size;
+diff --git a/arch/ia64/mm/fault.c b/arch/ia64/mm/fault.c
+index 3e69881..23088be 100644
+--- a/arch/ia64/mm/fault.c
++++ b/arch/ia64/mm/fault.c
+@@ -26,7 +26,7 @@ static inline int notify_page_fault(struct pt_regs *regs, int trap)
+ 	if (!user_mode(regs)) {
+ 		/* kprobe_running() needs smp_processor_id() */
+ 		preempt_disable();
+-		if (kprobe_running() && kprobes_fault_handler(regs, trap))
++		if (kprobe_running() && kprobe_fault_handler(regs, trap))
+ 			ret = 1;
+ 		preempt_enable();
+ 	}
+diff --git a/arch/ia64/mm/init.c b/arch/ia64/mm/init.c
+index 25aef62..a4ca657 100644
+--- a/arch/ia64/mm/init.c
++++ b/arch/ia64/mm/init.c
+@@ -714,7 +714,7 @@ int arch_add_memory(int nid, u64 start, u64 size)
+ 
+ 	if (ret)
+ 		printk("%s: Problem encountered in __add_pages() as ret=%d\n",
+-		       __FUNCTION__,  ret);
++		       __func__,  ret);
+ 
+ 	return ret;
+ }
+diff --git a/arch/ia64/pci/fixup.c b/arch/ia64/pci/fixup.c
+index 245dc1f..f5959c0 100644
+--- a/arch/ia64/pci/fixup.c
++++ b/arch/ia64/pci/fixup.c
+@@ -63,7 +63,7 @@ static void __devinit pci_fixup_video(struct pci_dev *pdev)
+ 	pci_read_config_word(pdev, PCI_COMMAND, &config);
+ 	if (config & (PCI_COMMAND_IO | PCI_COMMAND_MEMORY)) {
+ 		pdev->resource[PCI_ROM_RESOURCE].flags |= IORESOURCE_ROM_SHADOW;
+-		printk(KERN_DEBUG "Boot video device is %s\n", pci_name(pdev));
++		dev_printk(KERN_DEBUG, &pdev->dev, "Boot video device\n");
+ 	}
+ }
+ DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, pci_fixup_video);
+diff --git a/arch/ia64/pci/pci.c b/arch/ia64/pci/pci.c
+index 8fd7e82..e282c34 100644
+--- a/arch/ia64/pci/pci.c
++++ b/arch/ia64/pci/pci.c
+@@ -765,7 +765,7 @@ static void __init set_pci_cacheline_size(void)
+ 	status = ia64_pal_cache_summary(&levels, &unique_caches);
+ 	if (status != 0) {
+ 		printk(KERN_ERR "%s: ia64_pal_cache_summary() failed "
+-			"(status=%ld)\n", __FUNCTION__, status);
++			"(status=%ld)\n", __func__, status);
+ 		return;
+ 	}
+ 
+@@ -773,7 +773,7 @@ static void __init set_pci_cacheline_size(void)
+ 				/* cache_type (data_or_unified)= */ 2, &cci);
+ 	if (status != 0) {
+ 		printk(KERN_ERR "%s: ia64_pal_cache_config_info() failed "
+-			"(status=%ld)\n", __FUNCTION__, status);
++			"(status=%ld)\n", __func__, status);
+ 		return;
+ 	}
+ 	pci_cache_line_size = (1 << cci.pcci_line_size) / 4;
+diff --git a/arch/ia64/sn/kernel/huberror.c b/arch/ia64/sn/kernel/huberror.c
+index b663168..0101c79 100644
+--- a/arch/ia64/sn/kernel/huberror.c
++++ b/arch/ia64/sn/kernel/huberror.c
+@@ -37,7 +37,7 @@ static irqreturn_t hub_eint_handler(int irq, void *arg)
+ 			(u64) nasid, 0, 0, 0, 0, 0, 0);
+ 
+ 		if ((int)ret_stuff.v0)
+-			panic("%s: Fatal %s Error", __FUNCTION__,
++			panic("%s: Fatal %s Error", __func__,
+ 				((nasid & 1) ? "TIO" : "HUBII"));
+ 
+ 		if (!(nasid & 1)) /* Not a TIO, handle CRB errors */
+@@ -48,7 +48,7 @@ static irqreturn_t hub_eint_handler(int irq, void *arg)
+ 				(u64) nasid, 0, 0, 0, 0, 0, 0);
+ 
+ 			if ((int)ret_stuff.v0)
+-				panic("%s: Fatal TIO Error", __FUNCTION__);
++				panic("%s: Fatal TIO Error", __func__);
+ 		} else
+ 			bte_error_handler((unsigned long)NODEPDA(nasid_to_cnodeid(nasid)));
+ 
+diff --git a/arch/ia64/sn/kernel/io_acpi_init.c b/arch/ia64/sn/kernel/io_acpi_init.c
+index 3c7178f..6568942 100644
+--- a/arch/ia64/sn/kernel/io_acpi_init.c
++++ b/arch/ia64/sn/kernel/io_acpi_init.c
+@@ -133,7 +133,7 @@ sn_get_bussoft_ptr(struct pci_bus *bus)
+ 	if (ACPI_FAILURE(status)) {
+ 		printk(KERN_ERR "%s: "
+ 		       "acpi_get_vendor_resource() failed (0x%x) for: ",
+-		       __FUNCTION__, status);
++		       __func__, status);
+ 		acpi_ns_print_node_pathname(handle, NULL);
+ 		printk("\n");
+ 		return NULL;
+@@ -145,7 +145,7 @@ sn_get_bussoft_ptr(struct pci_bus *bus)
+ 	     sizeof(struct pcibus_bussoft *)) {
+ 		printk(KERN_ERR
+ 		       "%s: Invalid vendor data length %d\n",
+-			__FUNCTION__, vendor->byte_length);
++			__func__, vendor->byte_length);
+ 		kfree(buffer.pointer);
+ 		return NULL;
+ 	}
+@@ -184,7 +184,7 @@ sn_extract_device_info(acpi_handle handle, struct pcidev_info **pcidev_info,
+ 	if (ACPI_FAILURE(status)) {
+ 		printk(KERN_ERR
+ 		       "%s: acpi_get_vendor_resource() failed (0x%x) for: ",
+-		        __FUNCTION__, status);
++		        __func__, status);
+ 		acpi_ns_print_node_pathname(handle, NULL);
+ 		printk("\n");
+ 		return 1;
+@@ -196,7 +196,7 @@ sn_extract_device_info(acpi_handle handle, struct pcidev_info **pcidev_info,
+ 	    sizeof(struct pci_devdev_info *)) {
+ 		printk(KERN_ERR
+ 		       "%s: Invalid vendor data length: %d for: ",
+-		        __FUNCTION__, vendor->byte_length);
++		        __func__, vendor->byte_length);
+ 		acpi_ns_print_node_pathname(handle, NULL);
+ 		printk("\n");
+ 		ret = 1;
+@@ -205,7 +205,7 @@ sn_extract_device_info(acpi_handle handle, struct pcidev_info **pcidev_info,
+ 
+ 	pcidev_ptr = kzalloc(sizeof(struct pcidev_info), GFP_KERNEL);
+ 	if (!pcidev_ptr)
+-		panic("%s: Unable to alloc memory for pcidev_info", __FUNCTION__);
++		panic("%s: Unable to alloc memory for pcidev_info", __func__);
+ 
+ 	memcpy(&addr, vendor->byte_data, sizeof(struct pcidev_info *));
+ 	pcidev_prom_ptr = __va(addr);
+@@ -214,7 +214,7 @@ sn_extract_device_info(acpi_handle handle, struct pcidev_info **pcidev_info,
+ 	/* Get the IRQ info */
+ 	irq_info = kzalloc(sizeof(struct sn_irq_info), GFP_KERNEL);
+ 	if (!irq_info)
+-		 panic("%s: Unable to alloc memory for sn_irq_info", __FUNCTION__);
++		 panic("%s: Unable to alloc memory for sn_irq_info", __func__);
+ 
+ 	if (pcidev_ptr->pdi_sn_irq_info) {
+ 		irq_info_prom = __va(pcidev_ptr->pdi_sn_irq_info);
+@@ -249,10 +249,10 @@ get_host_devfn(acpi_handle device_handle, acpi_handle rootbus_handle)
+ 		status = acpi_get_parent(child, &parent);
+ 		if (ACPI_FAILURE(status)) {
+ 			printk(KERN_ERR "%s: acpi_get_parent() failed "
+-			       "(0x%x) for: ", __FUNCTION__, status);
++			       "(0x%x) for: ", __func__, status);
+ 			acpi_ns_print_node_pathname(child, NULL);
+ 			printk("\n");
+-			panic("%s: Unable to find host devfn\n", __FUNCTION__);
++			panic("%s: Unable to find host devfn\n", __func__);
+ 		}
+ 		if (parent == rootbus_handle)
+ 			break;
+@@ -260,7 +260,7 @@ get_host_devfn(acpi_handle device_handle, acpi_handle rootbus_handle)
+ 	}
+ 	if (!child) {
+ 		printk(KERN_ERR "%s: Unable to find root bus for: ",
+-		       __FUNCTION__);
++		       __func__);
+ 		acpi_ns_print_node_pathname(device_handle, NULL);
+ 		printk("\n");
+ 		BUG();
+@@ -269,10 +269,10 @@ get_host_devfn(acpi_handle device_handle, acpi_handle rootbus_handle)
+ 	status = acpi_evaluate_integer(child, METHOD_NAME__ADR, NULL, &adr);
+ 	if (ACPI_FAILURE(status)) {
+ 		printk(KERN_ERR "%s: Unable to get _ADR (0x%x) for: ",
+-		       __FUNCTION__, status);
++		       __func__, status);
+ 		acpi_ns_print_node_pathname(child, NULL);
+ 		printk("\n");
+-		panic("%s: Unable to find host devfn\n", __FUNCTION__);
++		panic("%s: Unable to find host devfn\n", __func__);
+ 	}
+ 
+ 	slot = (adr >> 16) & 0xffff;
+@@ -308,7 +308,7 @@ find_matching_device(acpi_handle handle, u32 lvl, void *context, void **rv)
+ 		if (ACPI_FAILURE(status)) {
+ 			printk(KERN_ERR
+ 			       "%s: acpi_get_parent() failed (0x%x) for: ",
+-					__FUNCTION__, status);
++					__func__, status);
+ 			acpi_ns_print_node_pathname(handle, NULL);
+ 			printk("\n");
+ 			return AE_OK;
+@@ -318,7 +318,7 @@ find_matching_device(acpi_handle handle, u32 lvl, void *context, void **rv)
+ 		if (ACPI_FAILURE(status)) {
+ 			printk(KERN_ERR
+ 			  "%s: Failed to find _BBN in parent of: ",
+-					__FUNCTION__);
++					__func__);
+ 			acpi_ns_print_node_pathname(handle, NULL);
+ 			printk("\n");
+ 			return AE_OK;
+@@ -358,14 +358,14 @@ sn_acpi_get_pcidev_info(struct pci_dev *dev, struct pcidev_info **pcidev_info,
+ 		if (segment != pci_domain_nr(dev)) {
+ 			printk(KERN_ERR
+ 			       "%s: Segment number mismatch, 0x%lx vs 0x%x for: ",
+-			       __FUNCTION__, segment, pci_domain_nr(dev));
++			       __func__, segment, pci_domain_nr(dev));
+ 			acpi_ns_print_node_pathname(rootbus_handle, NULL);
+ 			printk("\n");
+ 			return 1;
+ 		}
+ 	} else {
+ 		printk(KERN_ERR "%s: Unable to get __SEG from: ",
+-		       __FUNCTION__);
++		       __func__);
+ 		acpi_ns_print_node_pathname(rootbus_handle, NULL);
+ 		printk("\n");
+ 		return 1;
+@@ -386,7 +386,7 @@ sn_acpi_get_pcidev_info(struct pci_dev *dev, struct pcidev_info **pcidev_info,
+ 	if (!pcidev_match.handle) {
+ 		printk(KERN_ERR
+ 		       "%s: Could not find matching ACPI device for %s.\n",
+-		       __FUNCTION__, pci_name(dev));
++		       __func__, pci_name(dev));
+ 		return 1;
+ 	}
+ 
+@@ -422,7 +422,7 @@ sn_acpi_slot_fixup(struct pci_dev *dev)
+ 
+ 	if (sn_acpi_get_pcidev_info(dev, &pcidev_info, &sn_irq_info)) {
+ 		panic("%s:  Failure obtaining pcidev_info for %s\n",
+-		      __FUNCTION__, pci_name(dev));
++		      __func__, pci_name(dev));
+ 	}
+ 
+ 	if (pcidev_info->pdi_pio_mapped_addr[PCI_ROM_RESOURCE]) {
+@@ -463,7 +463,7 @@ sn_acpi_bus_fixup(struct pci_bus *bus)
+ 			printk(KERN_ERR
+ 			       "%s: 0x%04x:0x%02x Unable to "
+ 			       "obtain prom_bussoft_ptr\n",
+-			       __FUNCTION__, pci_domain_nr(bus), bus->number);
++			       __func__, pci_domain_nr(bus), bus->number);
+ 			return;
+ 		}
+ 		sn_common_bus_fixup(bus, prom_bussoft_ptr);
+diff --git a/arch/ia64/sn/kernel/io_common.c b/arch/ia64/sn/kernel/io_common.c
+index c4eb84f..8a924a5 100644
+--- a/arch/ia64/sn/kernel/io_common.c
++++ b/arch/ia64/sn/kernel/io_common.c
+@@ -364,7 +364,7 @@ void sn_bus_store_sysdata(struct pci_dev *dev)
+ 
+ 	element = kzalloc(sizeof(struct sysdata_el), GFP_KERNEL);
+ 	if (!element) {
+-		dev_dbg(&dev->dev, "%s: out of memory!\n", __FUNCTION__);
++		dev_dbg(&dev->dev, "%s: out of memory!\n", __func__);
+ 		return;
+ 	}
+ 	element->sysdata = SN_PCIDEV_INFO(dev);
+diff --git a/arch/ia64/sn/kernel/io_init.c b/arch/ia64/sn/kernel/io_init.c
+index 906b936..c3aa851 100644
+--- a/arch/ia64/sn/kernel/io_init.c
++++ b/arch/ia64/sn/kernel/io_init.c
+@@ -209,11 +209,11 @@ sn_io_slot_fixup(struct pci_dev *dev)
+ 
+ 	pcidev_info = kzalloc(sizeof(struct pcidev_info), GFP_KERNEL);
+ 	if (!pcidev_info)
+-		panic("%s: Unable to alloc memory for pcidev_info", __FUNCTION__);
++		panic("%s: Unable to alloc memory for pcidev_info", __func__);
+ 
+ 	sn_irq_info = kzalloc(sizeof(struct sn_irq_info), GFP_KERNEL);
+ 	if (!sn_irq_info)
+-		panic("%s: Unable to alloc memory for sn_irq_info", __FUNCTION__);
++		panic("%s: Unable to alloc memory for sn_irq_info", __func__);
+ 
+ 	/* Call to retrieve pci device information needed by kernel. */
+ 	status = sal_get_pcidev_info((u64) pci_domain_nr(dev),
+diff --git a/arch/ia64/sn/kernel/mca.c b/arch/ia64/sn/kernel/mca.c
+index 868c9aa..27793f7 100644
+--- a/arch/ia64/sn/kernel/mca.c
++++ b/arch/ia64/sn/kernel/mca.c
+@@ -100,7 +100,7 @@ sn_platform_plat_specific_err_print(const u8 * sect_header, u8 ** oemdata,
+ 		if (!newbuf) {
+ 			mutex_unlock(&sn_oemdata_mutex);
+ 			printk(KERN_ERR "%s: unable to extend sn_oemdata\n",
+-			       __FUNCTION__);
++			       __func__);
+ 			return 1;
+ 		}
+ 		vfree(*sn_oemdata);
+diff --git a/arch/ia64/sn/pci/pci_dma.c b/arch/ia64/sn/pci/pci_dma.c
+index 511db2f..18b94b7 100644
+--- a/arch/ia64/sn/pci/pci_dma.c
++++ b/arch/ia64/sn/pci/pci_dma.c
+@@ -116,7 +116,7 @@ void *sn_dma_alloc_coherent(struct device *dev, size_t size,
+ 	*dma_handle = provider->dma_map_consistent(pdev, phys_addr, size,
+ 						   SN_DMA_ADDR_PHYS);
+ 	if (!*dma_handle) {
+-		printk(KERN_ERR "%s: out of ATEs\n", __FUNCTION__);
++		printk(KERN_ERR "%s: out of ATEs\n", __func__);
+ 		free_pages((unsigned long)cpuaddr, get_order(size));
+ 		return NULL;
+ 	}
+@@ -179,7 +179,7 @@ dma_addr_t sn_dma_map_single(struct device *dev, void *cpu_addr, size_t size,
+ 	phys_addr = __pa(cpu_addr);
+ 	dma_addr = provider->dma_map(pdev, phys_addr, size, SN_DMA_ADDR_PHYS);
+ 	if (!dma_addr) {
+-		printk(KERN_ERR "%s: out of ATEs\n", __FUNCTION__);
++		printk(KERN_ERR "%s: out of ATEs\n", __func__);
+ 		return 0;
+ 	}
+ 	return dma_addr;
+@@ -266,7 +266,7 @@ int sn_dma_map_sg(struct device *dev, struct scatterlist *sgl, int nhwentries,
+ 						    SN_DMA_ADDR_PHYS);
+ 
+ 		if (!sg->dma_address) {
+-			printk(KERN_ERR "%s: out of ATEs\n", __FUNCTION__);
++			printk(KERN_ERR "%s: out of ATEs\n", __func__);
+ 
+ 			/*
+ 			 * Free any successfully allocated entries.
+diff --git a/arch/ia64/sn/pci/tioca_provider.c b/arch/ia64/sn/pci/tioca_provider.c
+index ef048a6..529462c 100644
+--- a/arch/ia64/sn/pci/tioca_provider.c
++++ b/arch/ia64/sn/pci/tioca_provider.c
+@@ -88,7 +88,7 @@ tioca_gart_init(struct tioca_kernel *tioca_kern)
+ 		break;
+ 	default:
+ 		printk(KERN_ERR "%s:  Invalid CA_APERATURE_SIZE "
+-		       "0x%lx\n", __FUNCTION__, (ulong) CA_APERATURE_SIZE);
++		       "0x%lx\n", __func__, (ulong) CA_APERATURE_SIZE);
+ 		return -1;
+ 	}
+ 
+@@ -124,7 +124,7 @@ tioca_gart_init(struct tioca_kernel *tioca_kern)
+ 	if (!tmp) {
+ 		printk(KERN_ERR "%s:  Could not allocate "
+ 		       "%lu bytes (order %d) for GART\n",
+-		       __FUNCTION__,
++		       __func__,
+ 		       tioca_kern->ca_gart_size,
+ 		       get_order(tioca_kern->ca_gart_size));
+ 		return -ENOMEM;
+@@ -341,7 +341,7 @@ tioca_dma_d48(struct pci_dev *pdev, u64 paddr)
+ 
+ 	if (node_upper > 64) {
+ 		printk(KERN_ERR "%s:  coretalk addr 0x%p node id out "
+-		       "of range\n", __FUNCTION__, (void *)ct_addr);
++		       "of range\n", __func__, (void *)ct_addr);
+ 		return 0;
+ 	}
+ 
+@@ -349,7 +349,7 @@ tioca_dma_d48(struct pci_dev *pdev, u64 paddr)
+ 	if (node_upper != (agp_dma_extn >> CA_AGP_DMA_NODE_ID_SHFT)) {
+ 		printk(KERN_ERR "%s:  coretalk upper node (%u) "
+ 		       "mismatch with ca_agp_dma_addr_extn (%lu)\n",
+-		       __FUNCTION__,
++		       __func__,
+ 		       node_upper, (agp_dma_extn >> CA_AGP_DMA_NODE_ID_SHFT));
+ 		return 0;
+ 	}
+@@ -597,7 +597,7 @@ tioca_bus_fixup(struct pcibus_bussoft *prom_bussoft, struct pci_controller *cont
+ 	if (is_shub1() && sn_sal_rev() < 0x0406) {
+ 		printk
+ 		    (KERN_ERR "%s:  SGI prom rev 4.06 or greater required "
+-		     "for tioca support\n", __FUNCTION__);
++		     "for tioca support\n", __func__);
+ 		return NULL;
+ 	}
+ 
+@@ -651,7 +651,7 @@ tioca_bus_fixup(struct pcibus_bussoft *prom_bussoft, struct pci_controller *cont
+ 		printk(KERN_WARNING
+ 		       "%s:  Unable to get irq %d.  "
+ 		       "Error interrupts won't be routed for TIOCA bus %d\n",
+-		       __FUNCTION__, SGI_TIOCA_ERROR,
++		       __func__, SGI_TIOCA_ERROR,
+ 		       (int)tioca_common->ca_common.bs_persist_busnum);
+ 
+ 	sn_set_err_irq_affinity(SGI_TIOCA_ERROR);
+diff --git a/arch/ia64/sn/pci/tioce_provider.c b/arch/ia64/sn/pci/tioce_provider.c
+index 999f14f..9b3c113 100644
+--- a/arch/ia64/sn/pci/tioce_provider.c
++++ b/arch/ia64/sn/pci/tioce_provider.c
+@@ -494,7 +494,7 @@ tioce_dma_unmap(struct pci_dev *pdev, dma_addr_t bus_addr, int dir)
+ 		if (&map->ce_dmamap_list == &ce_kern->ce_dmamap_list) {
+ 			printk(KERN_WARNING
+ 			       "%s:  %s - no map found for bus_addr 0x%lx\n",
+-			       __FUNCTION__, pci_name(pdev), bus_addr);
++			       __func__, pci_name(pdev), bus_addr);
+ 		} else if (--map->refcnt == 0) {
+ 			for (i = 0; i < map->ate_count; i++) {
+ 				map->ate_shadow[i] = 0;
+@@ -1030,7 +1030,7 @@ tioce_bus_fixup(struct pcibus_bussoft *prom_bussoft, struct pci_controller *cont
+ 		       "%s:  Unable to get irq %d.  "
+ 		       "Error interrupts won't be routed for "
+ 		       "TIOCE bus %04x:%02x\n",
+-		       __FUNCTION__, SGI_PCIASIC_ERROR,
++		       __func__, SGI_PCIASIC_ERROR,
+ 		       tioce_common->ce_pcibus.bs_persist_segment,
+ 		       tioce_common->ce_pcibus.bs_persist_busnum);
+ 
+diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig
+index 9892827..1831833 100644
+--- a/arch/s390/Kconfig
++++ b/arch/s390/Kconfig
+@@ -351,6 +351,10 @@ endchoice
+ 
+ source "fs/Kconfig.binfmt"
+ 
++config FORCE_MAX_ZONEORDER
++	int
++	default "9"
++
+ config PROCESS_DEBUG
+ 	bool "Show crashed user process info"
+ 	help
+diff --git a/arch/s390/defconfig b/arch/s390/defconfig
+index 39921f3..62f6b5a 100644
+--- a/arch/s390/defconfig
++++ b/arch/s390/defconfig
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.24
+-# Sat Feb  9 12:13:01 2008
++# Linux kernel version: 2.6.25-rc4
++# Wed Mar  5 11:22:59 2008
+ #
+ CONFIG_MMU=y
+ CONFIG_ZONE_DMA=y
+@@ -43,12 +43,15 @@ CONFIG_CGROUPS=y
+ # CONFIG_CGROUP_DEBUG is not set
+ CONFIG_CGROUP_NS=y
+ # CONFIG_CPUSETS is not set
++CONFIG_GROUP_SCHED=y
+ CONFIG_FAIR_GROUP_SCHED=y
+-CONFIG_FAIR_USER_SCHED=y
+-# CONFIG_FAIR_CGROUP_SCHED is not set
++# CONFIG_RT_GROUP_SCHED is not set
++CONFIG_USER_SCHED=y
++# 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_RELAY is not set
+ CONFIG_NAMESPACES=y
+ CONFIG_UTS_NS=y
+@@ -85,7 +88,9 @@ CONFIG_SLAB=y
+ # CONFIG_MARKERS is not set
+ 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
+@@ -185,6 +190,7 @@ CONFIG_IPL=y
+ CONFIG_IPL_VM=y
+ CONFIG_BINFMT_ELF=y
+ CONFIG_BINFMT_MISC=m
++CONFIG_FORCE_MAX_ZONEORDER=9
+ # CONFIG_PROCESS_DEBUG is not set
+ CONFIG_PFAULT=y
+ # CONFIG_SHARED_KERNEL is not set
+@@ -435,6 +441,7 @@ CONFIG_DASD_EER=y
+ CONFIG_MISC_DEVICES=y
+ # CONFIG_EEPROM_93CX6 is not set
+ # CONFIG_ENCLOSURE_SERVICES is not set
++# CONFIG_HAVE_IDE is not set
+ 
+ #
+ # SCSI device support
+@@ -593,6 +600,7 @@ CONFIG_S390_VMUR=m
+ #
+ # Sonics Silicon Backplane
+ #
++# CONFIG_MEMSTICK is not set
+ 
+ #
+ # File systems
+@@ -750,7 +758,6 @@ CONFIG_DEBUG_BUGVERBOSE=y
+ # CONFIG_DEBUG_LIST is not set
+ # CONFIG_DEBUG_SG is not set
+ # CONFIG_FRAME_POINTER is not set
+-CONFIG_FORCED_INLINING=y
+ # CONFIG_RCU_TORTURE_TEST is not set
+ # CONFIG_KPROBES_SANITY_TEST is not set
+ # CONFIG_BACKTRACE_SELF_TEST is not set
+@@ -759,6 +766,7 @@ CONFIG_FORCED_INLINING=y
+ # CONFIG_LATENCYTOP is not set
+ CONFIG_SAMPLES=y
+ # CONFIG_SAMPLE_KOBJECT is not set
++# CONFIG_SAMPLE_KPROBES is not set
+ # CONFIG_DEBUG_PAGEALLOC is not set
+ 
+ #
+diff --git a/arch/s390/kernel/Makefile b/arch/s390/kernel/Makefile
+index b3b650a..4d3e383 100644
+--- a/arch/s390/kernel/Makefile
++++ b/arch/s390/kernel/Makefile
+@@ -4,6 +4,11 @@
+ 
+ EXTRA_AFLAGS	:= -traditional
+ 
++#
++# Passing null pointers is ok for smp code, since we access the lowcore here.
++#
++CFLAGS_smp.o	:= -Wno-nonnull
++
+ obj-y	:=  bitmap.o traps.o time.o process.o base.o early.o \
+             setup.o sys_s390.o ptrace.o signal.o cpcmd.o ebcdic.o \
+ 	    semaphore.o s390_ext.o debug.o irq.o ipl.o dis.o diag.o
+diff --git a/arch/s390/kernel/early.c b/arch/s390/kernel/early.c
+index 9f7b73b..01832c4 100644
+--- a/arch/s390/kernel/early.c
++++ b/arch/s390/kernel/early.c
+@@ -88,13 +88,17 @@ static noinline __init void create_kernel_nss(void)
+ 
+ 	__cpcmd(defsys_cmd, NULL, 0, &response);
+ 
+-	if (response != 0)
++	if (response != 0) {
++		kernel_nss_name[0] = '\0';
+ 		return;
++	}
+ 
+ 	__cpcmd(savesys_cmd, NULL, 0, &response);
+ 
+-	if (response != strlen(savesys_cmd))
++	if (response != strlen(savesys_cmd)) {
++		kernel_nss_name[0] = '\0';
+ 		return;
++	}
+ 
+ 	ipl_flags = IPL_NSS_VALID;
+ }
+diff --git a/arch/s390/kernel/ipl.c b/arch/s390/kernel/ipl.c
+index 60acdc2..375232c 100644
+--- a/arch/s390/kernel/ipl.c
++++ b/arch/s390/kernel/ipl.c
+@@ -704,6 +704,7 @@ void reipl_run(struct shutdown_trigger *trigger)
+ 	default:
+ 		break;
+ 	}
++	disabled_wait((unsigned long) __builtin_return_address(0));
+ }
+ 
+ static void __init reipl_probe(void)
+diff --git a/arch/s390/kernel/process.c b/arch/s390/kernel/process.c
+index 1c59ec1..ce20315 100644
+--- a/arch/s390/kernel/process.c
++++ b/arch/s390/kernel/process.c
+@@ -152,6 +152,10 @@ static void default_idle(void)
+ 	local_mcck_disable();
+ 	if (test_thread_flag(TIF_MCCK_PENDING)) {
+ 		local_mcck_enable();
++		/* disable monitor call class 0 */
++		__ctl_clear_bit(8, 15);
++		atomic_notifier_call_chain(&idle_chain, S390_CPU_NOT_IDLE,
++					   hcpu);
+ 		local_irq_enable();
+ 		s390_handle_mcck();
+ 		return;
+diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c
+index 818bd09..8f894d3 100644
+--- a/arch/s390/kernel/smp.c
++++ b/arch/s390/kernel/smp.c
+@@ -629,14 +629,8 @@ static int __cpuinit smp_alloc_lowcore(int cpu)
+ 	panic_stack = __get_free_page(GFP_KERNEL);
+ 	if (!panic_stack || !async_stack)
+ 		goto out;
+-	/*
+-	 * Only need to copy the first 512 bytes from address 0. But since
+-	 * the compiler emits a warning if src == NULL for memcpy use copy_page
+-	 * instead. Copies more than needed but this code is not performance
+-	 * critical.
+-	 */
+-	copy_page(lowcore, &S390_lowcore);
+-	memset((void *)lowcore + 512, 0, sizeof(*lowcore) - 512);
++	memcpy(lowcore, &S390_lowcore, 512);
++	memset((char *)lowcore + 512, 0, sizeof(*lowcore) - 512);
+ 	lowcore->async_stack = async_stack + ASYNC_SIZE;
+ 	lowcore->panic_stack = panic_stack + PAGE_SIZE;
+ 
+diff --git a/arch/s390/kernel/time.c b/arch/s390/kernel/time.c
+index 76a5dd1..cb232c1 100644
+--- a/arch/s390/kernel/time.c
++++ b/arch/s390/kernel/time.c
+@@ -209,8 +209,6 @@ static void stop_hz_timer(void)
+  */
+ static void start_hz_timer(void)
+ {
+-	BUG_ON(!in_interrupt());
+-
+ 	if (!cpu_isset(smp_processor_id(), nohz_cpu_mask))
+ 		return;
+ 	account_ticks(get_clock());
+diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig
+index 783cfbb..95b7534 100644
+--- a/arch/sh/Kconfig
++++ b/arch/sh/Kconfig
+@@ -456,13 +456,6 @@ config SH_SECUREEDGE5410
+ 	  This includes both the OEM SecureEdge products as well as the
+ 	  SME product line.
+ 
+-config SH_7710VOIPGW
+-	bool "SH7710-VOIP-GW"
+-	depends on CPU_SUBTYPE_SH7710
+-	help
+-	  Select this option to build a kernel for the SH7710 based
+-	  VOIP GW.
+-
+ config SH_RTS7751R2D
+ 	bool "RTS7751R2D"
+ 	depends on CPU_SUBTYPE_SH7751R
+diff --git a/arch/sh/Makefile b/arch/sh/Makefile
+index 81381e5..c510c22 100644
+--- a/arch/sh/Makefile
++++ b/arch/sh/Makefile
+@@ -118,7 +118,6 @@ machdir-$(CONFIG_SH_EDOSK7705)			+= renesas/edosk7705
+ machdir-$(CONFIG_SH_HIGHLANDER)			+= renesas/r7780rp
+ machdir-$(CONFIG_SH_MIGOR)			+= renesas/migor
+ machdir-$(CONFIG_SH_SDK7780)			+= renesas/sdk7780
+-machdir-$(CONFIG_SH_7710VOIPGW)			+= renesas/sh7710voipgw
+ machdir-$(CONFIG_SH_X3PROTO)			+= renesas/x3proto
+ machdir-$(CONFIG_SH_SH4202_MICRODEV)		+= superh/microdev
+ machdir-$(CONFIG_SH_LANDISK)			+= landisk
+diff --git a/arch/sh/boards/hp6xx/hp6xx_apm.c b/arch/sh/boards/hp6xx/hp6xx_apm.c
+index 640ca2a..177f4f0 100644
+--- a/arch/sh/boards/hp6xx/hp6xx_apm.c
++++ b/arch/sh/boards/hp6xx/hp6xx_apm.c
+@@ -2,6 +2,7 @@
+  * bios-less APM driver for hp680
+  *
+  * Copyright 2005 (c) Andriy Skulysh <askulysh at gmail.com>
++ * Copyright 2008 (c) Kristoffer Ericson <kristoffer.ericson at gmail.com>
+  *
+  * This program is free software; you can redistribute it and/or
+  * modify it under the terms of the GNU General Public License.
+@@ -15,17 +16,19 @@
+ #include <asm/adc.h>
+ #include <asm/hp6xx.h>
+ 
+-#define SH7709_PGDR			0xa400012c
+-
++/* percentage values */
+ #define APM_CRITICAL			10
+ #define APM_LOW				30
+ 
++/* resonably sane values */
+ #define HP680_BATTERY_MAX		898
+ #define HP680_BATTERY_MIN		486
+ #define HP680_BATTERY_AC_ON		1023
+ 
+ #define MODNAME "hp6x0_apm"
+ 
++#define PGDR	0xa400012c
++
+ static void hp6x0_apm_get_power_status(struct apm_power_info *info)
+ {
+ 	int battery, backup, charging, percentage;
+@@ -38,17 +41,26 @@ static void hp6x0_apm_get_power_status(struct apm_power_info *info)
+ 	percentage = 100 * (battery - HP680_BATTERY_MIN) /
+ 			   (HP680_BATTERY_MAX - HP680_BATTERY_MIN);
+ 
++	/* % of full battery */
++	info->battery_life = percentage;
++
++	/* We want our estimates in minutes */
++	info->units = 0;
++
++	/* Extremely(!!) rough estimate, we will replace this with a datalist later on */
++	info->time = (2 * battery);
++
+ 	info->ac_line_status = (battery > HP680_BATTERY_AC_ON) ?
+ 			 APM_AC_ONLINE : APM_AC_OFFLINE;
+ 
+-	pgdr = ctrl_inb(SH7709_PGDR);
++	pgdr = ctrl_inb(PGDR);
+ 	if (pgdr & PGDR_MAIN_BATTERY_OUT) {
+ 		info->battery_status	= APM_BATTERY_STATUS_NOT_PRESENT;
+ 		info->battery_flag	= 0x80;
+ 	} else if (charging < 8) {
+ 		info->battery_status	= APM_BATTERY_STATUS_CHARGING;
+ 		info->battery_flag	= 0x08;
+-		info->ac_line_status = 0xff;
++		info->ac_line_status	= 0x01;
+ 	} else if (percentage <= APM_CRITICAL) {
+ 		info->battery_status	= APM_BATTERY_STATUS_CRITICAL;
+ 		info->battery_flag	= 0x04;
+@@ -59,8 +71,6 @@ static void hp6x0_apm_get_power_status(struct apm_power_info *info)
+ 		info->battery_status	= APM_BATTERY_STATUS_HIGH;
+ 		info->battery_flag	= 0x01;
+ 	}
+-
+-	info->units = 0;
+ }
+ 
+ static irqreturn_t hp6x0_apm_interrupt(int irq, void *dev)
+diff --git a/arch/sh/boards/renesas/sh7710voipgw/Makefile b/arch/sh/boards/renesas/sh7710voipgw/Makefile
+deleted file mode 100644
+index 7703756..0000000
+--- a/arch/sh/boards/renesas/sh7710voipgw/Makefile
++++ /dev/null
+@@ -1 +0,0 @@
+-obj-y	 := setup.o
+diff --git a/arch/sh/boards/renesas/sh7710voipgw/setup.c b/arch/sh/boards/renesas/sh7710voipgw/setup.c
+deleted file mode 100644
+index 0d56fd8..0000000
+--- a/arch/sh/boards/renesas/sh7710voipgw/setup.c
++++ /dev/null
+@@ -1,94 +0,0 @@
+-/*
+- * Renesas Technology SH7710 VoIP Gateway
+- *
+- * Copyright (C) 2006  Ranjit Deshpande
+- * Kenati Technologies Inc.
+- *
+- * May be copied or modified under the terms of the GNU General Public
+- * License.  See linux/COPYING for more information.
+- */
+-#include <linux/init.h>
+-#include <asm/machvec.h>
+-#include <asm/irq.h>
+-#include <asm/io.h>
+-
+-static struct ipr_data sh7710voipgw_ipr_map[] = {
+-	{ TIMER2_IRQ, TIMER2_IPR_ADDR, TIMER2_IPR_POS, TIMER2_PRIORITY },
+-	{ WDT_IRQ, WDT_IPR_ADDR, WDT_IPR_POS, WDT_PRIORITY },
+-
+-	/* SCIF0 */
+-	{ SCIF0_ERI_IRQ, SCIF0_IPR_ADDR, SCIF0_IPR_POS, SCIF0_PRIORITY },
+-	{ SCIF0_RXI_IRQ, SCIF0_IPR_ADDR, SCIF0_IPR_POS, SCIF0_PRIORITY },
+-	{ SCIF0_BRI_IRQ, SCIF0_IPR_ADDR, SCIF0_IPR_POS, SCIF0_PRIORITY },
+-	{ SCIF0_TXI_IRQ, SCIF0_IPR_ADDR, SCIF0_IPR_POS, SCIF0_PRIORITY },
+-
+-	/* DMAC-1 */
+-	{ DMTE0_IRQ, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY },
+-	{ DMTE1_IRQ, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY },
+-	{ DMTE2_IRQ, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY },
+-	{ DMTE3_IRQ, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY },
+-
+-	/* DMAC-2 */
+-	{ DMTE4_IRQ, DMA2_IPR_ADDR, DMA2_IPR_POS, DMA2_PRIORITY },
+-	{ DMTE4_IRQ, DMA2_IPR_ADDR, DMA2_IPR_POS, DMA2_PRIORITY },
+-
+-	/* IPSEC */
+-	{ IPSEC_IRQ, IPSEC_IPR_ADDR, IPSEC_IPR_POS, IPSEC_PRIORITY },
+-
+-	/* EDMAC */
+-	{ EDMAC0_IRQ, EDMAC0_IPR_ADDR, EDMAC0_IPR_POS, EDMAC0_PRIORITY },
+-	{ EDMAC1_IRQ, EDMAC1_IPR_ADDR, EDMAC1_IPR_POS, EDMAC1_PRIORITY },
+-	{ EDMAC2_IRQ, EDMAC2_IPR_ADDR, EDMAC2_IPR_POS, EDMAC2_PRIORITY },
+-
+-	/* SIOF0 */
+-	{ SIOF0_ERI_IRQ, SIOF0_IPR_ADDR, SIOF0_IPR_POS, SIOF0_PRIORITY },
+-	{ SIOF0_TXI_IRQ, SIOF0_IPR_ADDR, SIOF0_IPR_POS, SIOF0_PRIORITY },
+-	{ SIOF0_RXI_IRQ, SIOF0_IPR_ADDR, SIOF0_IPR_POS, SIOF0_PRIORITY },
+-	{ SIOF0_CCI_IRQ, SIOF0_IPR_ADDR, SIOF0_IPR_POS, SIOF0_PRIORITY },
+-
+-	/* SIOF1 */
+-	{ SIOF1_ERI_IRQ, SIOF1_IPR_ADDR, SIOF1_IPR_POS, SIOF1_PRIORITY },
+-	{ SIOF1_TXI_IRQ, SIOF1_IPR_ADDR, SIOF1_IPR_POS, SIOF1_PRIORITY },
+-	{ SIOF1_RXI_IRQ, SIOF1_IPR_ADDR, SIOF1_IPR_POS, SIOF1_PRIORITY },
+-	{ SIOF1_CCI_IRQ, SIOF1_IPR_ADDR, SIOF1_IPR_POS, SIOF1_PRIORITY },
+-
+-	/* SLIC IRQ's */
+-	{ IRQ1_IRQ, IRQ1_IPR_ADDR, IRQ1_IPR_POS, IRQ1_PRIORITY },
+-	{ IRQ2_IRQ, IRQ2_IPR_ADDR, IRQ2_IPR_POS, IRQ2_PRIORITY },
+-};
+-
+-/*
+- * Initialize IRQ setting
+- */
+-static void __init sh7710voipgw_init_irq(void)
+-{
+-	/* Disable all interrupts in IPR registers */
+-	ctrl_outw(0x0, INTC_IPRA);
+-	ctrl_outw(0x0, INTC_IPRB);
+-	ctrl_outw(0x0, INTC_IPRC);
+-	ctrl_outw(0x0, INTC_IPRD);
+-	ctrl_outw(0x0, INTC_IPRE);
+-	ctrl_outw(0x0, INTC_IPRF);
+-	ctrl_outw(0x0, INTC_IPRG);
+-	ctrl_outw(0x0, INTC_IPRH);
+-	ctrl_outw(0x0, INTC_IPRI);
+-
+-	/* Ack all interrupt sources in the IRR0 register */
+-	ctrl_outb(0x3f, INTC_IRR0);
+-
+-	/* Use IRQ0 - IRQ3 as active low interrupt lines i.e. disable
+-	 * IRL mode.
+-	 */
+-	ctrl_outw(0x2aa, INTC_ICR1);
+-
+-	make_ipr_irq(sh7710voipgw_ipr_map, ARRAY_SIZE(sh7710voipgw_ipr_map));
+-}
+-
+-/*
+- * The Machine Vector
+- */
+-static struct sh_machine_vector mv_sh7710voipgw __initmv = {
+-	.mv_name		= "SH7710 VoIP Gateway",
+-	.mv_nr_irqs		= 104,
+-	.mv_init_irq		= sh7710voipgw_init_irq,
+-};
+diff --git a/arch/sh/boards/renesas/x3proto/ilsel.c b/arch/sh/boards/renesas/x3proto/ilsel.c
+index 6d4454f..b5c673c 100644
+--- a/arch/sh/boards/renesas/x3proto/ilsel.c
++++ b/arch/sh/boards/renesas/x3proto/ilsel.c
+@@ -68,7 +68,7 @@ static void __ilsel_enable(ilsel_source_t set, unsigned int bit)
+ 	shift = mk_ilsel_shift(bit);
+ 
+ 	pr_debug("%s: bit#%d: addr - 0x%08lx (shift %d, set %d)\n",
+-		 __FUNCTION__, bit, addr, shift, set);
++		 __func__, bit, addr, shift, set);
+ 
+ 	tmp = ctrl_inw(addr);
+ 	tmp &= ~(0xf << shift);
+diff --git a/arch/sh/boards/superh/microdev/io.c b/arch/sh/boards/superh/microdev/io.c
+index b704e20..9f8a540 100644
+--- a/arch/sh/boards/superh/microdev/io.c
++++ b/arch/sh/boards/superh/microdev/io.c
+@@ -127,7 +127,7 @@ static unsigned long microdev_isa_port2addr(unsigned long offset)
+ 			 *	safe default.
+ 			 */
+ 		printk("Warning: unexpected port in %s( offset = 0x%lx )\n",
+-		       __FUNCTION__, offset);
++		       __func__, offset);
+ 		result = PVR;
+ 	}
+ 
+diff --git a/arch/sh/configs/r7780mp_defconfig b/arch/sh/configs/r7780mp_defconfig
+index 2ad804e..1a07261 100644
+--- a/arch/sh/configs/r7780mp_defconfig
++++ b/arch/sh/configs/r7780mp_defconfig
+@@ -1,9 +1,10 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.24-rc2
+-# Tue Nov 13 20:32:39 2007
++# Linux kernel version: 2.6.25-rc4
++# Thu Mar  6 15:39:59 2008
+ #
+ CONFIG_SUPERH=y
++CONFIG_SUPERH32=y
+ CONFIG_RWSEM_GENERIC_SPINLOCK=y
+ CONFIG_GENERIC_BUG=y
+ CONFIG_GENERIC_FIND_NEXT_BIT=y
+@@ -19,6 +20,8 @@ CONFIG_LOCKDEP_SUPPORT=y
+ # CONFIG_ARCH_HAS_ILOG2_U32 is not set
+ # CONFIG_ARCH_HAS_ILOG2_U64 is not set
+ CONFIG_ARCH_NO_VIRT_TO_BUS=y
++CONFIG_ARCH_SUPPORTS_AOUT=y
++CONFIG_IO_TRAPPED=y
+ CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+ 
+ #
+@@ -37,17 +40,20 @@ CONFIG_SYSVIPC_SYSCTL=y
+ CONFIG_BSD_PROCESS_ACCT=y
+ # CONFIG_BSD_PROCESS_ACCT_V3 is not set
+ # CONFIG_TASKSTATS is not set
+-# CONFIG_USER_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_GROUP_SCHED=y
+ CONFIG_FAIR_GROUP_SCHED=y
+-CONFIG_FAIR_USER_SCHED=y
+-# CONFIG_FAIR_CGROUP_SCHED is not set
+-# CONFIG_SYSFS_DEPRECATED is not set
++# CONFIG_RT_GROUP_SCHED is not set
++CONFIG_USER_SCHED=y
++# CONFIG_CGROUP_SCHED is not set
++CONFIG_SYSFS_DEPRECATED=y
++CONFIG_SYSFS_DEPRECATED_V2=y
+ # CONFIG_RELAY is not set
++# CONFIG_NAMESPACES is not set
+ # CONFIG_BLK_DEV_INITRD is not set
+ CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+ CONFIG_SYSCTL=y
+@@ -61,17 +67,27 @@ CONFIG_HOTPLUG=y
+ CONFIG_PRINTK=y
+ CONFIG_BUG=y
+ CONFIG_ELF_CORE=y
++CONFIG_COMPAT_BRK=y
+ CONFIG_BASE_FULL=y
+ # CONFIG_FUTEX is not set
+ CONFIG_ANON_INODES=y
+ # CONFIG_EPOLL is not set
+ 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_HAVE_KPROBES is not set
++# CONFIG_HAVE_KRETPROBES is not set
++CONFIG_PROC_PAGE_MONITOR=y
++CONFIG_SLABINFO=y
+ # CONFIG_TINY_SHMEM is not set
+ CONFIG_BASE_SMALL=0
+ CONFIG_MODULES=y
+@@ -98,6 +114,8 @@ CONFIG_IOSCHED_NOOP=y
+ # CONFIG_DEFAULT_CFQ is not set
+ CONFIG_DEFAULT_NOOP=y
+ CONFIG_DEFAULT_IOSCHED="noop"
++CONFIG_CLASSIC_RCU=y
++# CONFIG_PREEMPT_RCU is not set
+ 
+ #
+ # System type
+@@ -105,7 +123,9 @@ CONFIG_DEFAULT_IOSCHED="noop"
+ CONFIG_CPU_SH4=y
+ CONFIG_CPU_SH4A=y
+ # CONFIG_CPU_SUBTYPE_SH7619 is not set
++# CONFIG_CPU_SUBTYPE_SH7203 is not set
+ # CONFIG_CPU_SUBTYPE_SH7206 is not set
++# CONFIG_CPU_SUBTYPE_SH7263 is not set
+ # CONFIG_CPU_SUBTYPE_SH7705 is not set
+ # CONFIG_CPU_SUBTYPE_SH7706 is not set
+ # CONFIG_CPU_SUBTYPE_SH7707 is not set
+@@ -114,6 +134,7 @@ CONFIG_CPU_SH4A=y
+ # CONFIG_CPU_SUBTYPE_SH7710 is not set
+ # CONFIG_CPU_SUBTYPE_SH7712 is not set
+ # CONFIG_CPU_SUBTYPE_SH7720 is not set
++# CONFIG_CPU_SUBTYPE_SH7721 is not set
+ # CONFIG_CPU_SUBTYPE_SH7750 is not set
+ # CONFIG_CPU_SUBTYPE_SH7091 is not set
+ # CONFIG_CPU_SUBTYPE_SH7750R is not set
+@@ -122,12 +143,16 @@ CONFIG_CPU_SH4A=y
+ # CONFIG_CPU_SUBTYPE_SH7751R is not set
+ # CONFIG_CPU_SUBTYPE_SH7760 is not set
+ # CONFIG_CPU_SUBTYPE_SH4_202 is not set
++# CONFIG_CPU_SUBTYPE_SH7763 is not set
+ # CONFIG_CPU_SUBTYPE_SH7770 is not set
+ CONFIG_CPU_SUBTYPE_SH7780=y
+ # CONFIG_CPU_SUBTYPE_SH7785 is not set
+ # CONFIG_CPU_SUBTYPE_SHX3 is not set
+ # CONFIG_CPU_SUBTYPE_SH7343 is not set
+ # CONFIG_CPU_SUBTYPE_SH7722 is not set
++# CONFIG_CPU_SUBTYPE_SH7366 is not set
++# CONFIG_CPU_SUBTYPE_SH5_101 is not set
++# CONFIG_CPU_SUBTYPE_SH5_103 is not set
+ 
+ #
+ # Memory management options
+@@ -137,7 +162,8 @@ CONFIG_MMU=y
+ CONFIG_PAGE_OFFSET=0x80000000
+ CONFIG_MEMORY_START=0x08000000
+ CONFIG_MEMORY_SIZE=0x08000000
+-# CONFIG_32BIT is not set
++CONFIG_29BIT=y
++# CONFIG_PMB is not set
+ CONFIG_VSYSCALL=y
+ CONFIG_ARCH_FLATMEM_ENABLE=y
+ CONFIG_ARCH_SPARSEMEM_ENABLE=y
+@@ -153,6 +179,7 @@ CONFIG_HUGETLB_PAGE_SIZE_64K=y
+ # CONFIG_HUGETLB_PAGE_SIZE_1MB is not set
+ # CONFIG_HUGETLB_PAGE_SIZE_4MB is not set
+ # CONFIG_HUGETLB_PAGE_SIZE_64MB is not set
++# CONFIG_HUGETLB_PAGE_SIZE_512MB is not set
+ CONFIG_SELECT_MEMORY_MODEL=y
+ CONFIG_FLATMEM_MANUAL=y
+ # CONFIG_DISCONTIGMEM_MANUAL is not set
+@@ -190,6 +217,7 @@ CONFIG_CPU_HAS_FPU=y
+ # Board support
+ #
+ # CONFIG_SH_7780_SOLUTION_ENGINE is not set
++# CONFIG_SH_SDK7780 is not set
+ CONFIG_SH_HIGHLANDER=y
+ # CONFIG_SH_R7780RP is not set
+ CONFIG_SH_R7780MP=y
+@@ -234,12 +262,13 @@ 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_KEXEC=y
+ # CONFIG_CRASH_DUMP is not set
+ # CONFIG_PREEMPT_NONE is not set
+ # CONFIG_PREEMPT_VOLUNTARY is not set
+ CONFIG_PREEMPT=y
+-CONFIG_PREEMPT_BKL=y
++CONFIG_RCU_TRACE=y
+ CONFIG_GUSA=y
+ 
+ #
+@@ -284,6 +313,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
+@@ -344,6 +374,7 @@ CONFIG_LLC=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
+@@ -386,7 +417,7 @@ CONFIG_BLK_DEV=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
+@@ -394,6 +425,8 @@ CONFIG_MISC_DEVICES=y
+ CONFIG_EEPROM_93CX6=y
+ # 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
+ 
+ #
+@@ -453,6 +486,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
+@@ -506,6 +540,7 @@ CONFIG_SATA_SIL=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
+@@ -538,7 +573,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
+@@ -551,7 +585,6 @@ CONFIG_AX88796_93CX6=y
+ # CONFIG_CASSINI is not set
+ # CONFIG_NET_VENDOR_3COM is not set
+ # CONFIG_SMC91X is not set
+-# CONFIG_SMC911X is not set
+ # CONFIG_NET_TULIP is not set
+ # CONFIG_HP100 is not set
+ # CONFIG_IBM_NEW_EMAC_ZMII is not set
+@@ -576,6 +609,7 @@ CONFIG_8139TOO=m
+ # CONFIG_8139TOO_TUNE_TWISTER is not set
+ CONFIG_8139TOO_8129=y
+ # 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
+@@ -591,6 +625,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
+@@ -616,6 +653,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
+ 
+ #
+@@ -629,7 +667,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
+@@ -686,6 +723,7 @@ CONFIG_SERIO_LIBPS2=y
+ #
+ # CONFIG_VT is not set
+ # CONFIG_SERIAL_NONSTANDARD is not set
++# CONFIG_NOZOMI is not set
+ 
+ #
+ # Serial drivers
+@@ -722,6 +760,7 @@ CONFIG_DEVPORT=y
+ # CONFIG_POWER_SUPPLY is not set
+ CONFIG_HWMON=y
+ # CONFIG_HWMON_VID is not set
++# CONFIG_SENSORS_I5K_AMB is not set
+ # CONFIG_SENSORS_F71805F is not set
+ # CONFIG_SENSORS_F71882FG is not set
+ # CONFIG_SENSORS_IT87 is not set
+@@ -736,6 +775,7 @@ CONFIG_HWMON=y
+ # CONFIG_SENSORS_W83627HF is not set
+ # CONFIG_SENSORS_W83627EHF is not set
+ # CONFIG_HWMON_DEBUG_CHIP is not set
++CONFIG_THERMAL=y
+ # CONFIG_WATCHDOG is not set
+ 
+ #
+@@ -800,12 +840,9 @@ CONFIG_USB_ARCH_HAS_EHCI=y
+ #
+ # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk 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_RTC_LIB=y
+@@ -830,9 +867,10 @@ CONFIG_RTC_INTF_DEV=y
+ #
+ # Platform RTC drivers
+ #
++# 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
+@@ -867,12 +905,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=y
+-# 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=m
+@@ -920,8 +956,10 @@ CONFIG_CONFIGFS_FS=m
+ # CONFIG_EFS_FS is not set
+ # CONFIG_CRAMFS is not set
+ # CONFIG_VXFS_FS is not set
++CONFIG_MINIX_FS=y
+ # 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
+@@ -997,10 +1035,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_INSTRUMENTATION=y
+-CONFIG_PROFILING=y
+-CONFIG_OPROFILE=m
+-# CONFIG_MARKERS is not set
+ 
+ #
+ # Kernel hacking
+@@ -1035,9 +1069,9 @@ CONFIG_DEBUG_INFO=y
+ # CONFIG_DEBUG_LIST is not set
+ # CONFIG_DEBUG_SG is not set
+ # CONFIG_FRAME_POINTER 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_SH_STANDARD_BIOS=y
+@@ -1059,6 +1093,7 @@ CONFIG_DEBUG_STACKOVERFLOW=y
+ CONFIG_CRYPTO=y
+ CONFIG_CRYPTO_ALGAPI=y
+ CONFIG_CRYPTO_BLKCIPHER=y
++# CONFIG_CRYPTO_SEQIV is not set
+ CONFIG_CRYPTO_HASH=y
+ CONFIG_CRYPTO_MANAGER=y
+ CONFIG_CRYPTO_HMAC=y
+@@ -1077,6 +1112,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
+@@ -1091,13 +1129,16 @@ CONFIG_CRYPTO_DES=y
+ # 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=y
++# CONFIG_CRYPTO_DEV_HIFN_795X is not set
+ 
+ #
+ # Library routines
+diff --git a/arch/sh/configs/se7780_defconfig b/arch/sh/configs/se7780_defconfig
+index f68743d..30f5ee4 100644
+--- a/arch/sh/configs/se7780_defconfig
++++ b/arch/sh/configs/se7780_defconfig
+@@ -1,9 +1,10 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.21-rc3
+-# Thu Mar 15 14:06:20 2007
++# Linux kernel version: 2.6.25-rc3
++# Thu Feb 28 10:18:04 2008
+ #
+ CONFIG_SUPERH=y
++CONFIG_SUPERH32=y
+ CONFIG_RWSEM_GENERIC_SPINLOCK=y
+ CONFIG_GENERIC_BUG=y
+ CONFIG_GENERIC_FIND_NEXT_BIT=y
+@@ -11,38 +12,44 @@ CONFIG_GENERIC_HWEIGHT=y
+ CONFIG_GENERIC_HARDIRQS=y
+ CONFIG_GENERIC_IRQ_PROBE=y
+ CONFIG_GENERIC_CALIBRATE_DELAY=y
+-# CONFIG_GENERIC_TIME is not set
++CONFIG_GENERIC_TIME=y
++CONFIG_GENERIC_CLOCKEVENTS=y
++CONFIG_SYS_SUPPORTS_PCI=y
+ CONFIG_STACKTRACE_SUPPORT=y
+ CONFIG_LOCKDEP_SUPPORT=y
+ # CONFIG_ARCH_HAS_ILOG2_U32 is not set
+ # CONFIG_ARCH_HAS_ILOG2_U64 is not set
++CONFIG_ARCH_NO_VIRT_TO_BUS=y
++CONFIG_ARCH_SUPPORTS_AOUT=y
+ CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+ 
+ #
+-# Code maturity level options
++# General setup
+ #
+ # CONFIG_EXPERIMENTAL is not set
+ CONFIG_BROKEN_ON_SMP=y
+ CONFIG_INIT_ENV_ARG_LIMIT=32
+-
+-#
+-# General setup
+-#
+ CONFIG_LOCALVERSION=""
+ CONFIG_LOCALVERSION_AUTO=y
+ # CONFIG_SWAP is not set
+ CONFIG_SYSVIPC=y
+-# CONFIG_IPC_NS is not set
+ CONFIG_SYSVIPC_SYSCTL=y
+ # CONFIG_BSD_PROCESS_ACCT is not set
+ # CONFIG_TASKSTATS is not set
+-# CONFIG_UTS_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_GROUP_SCHED=y
++CONFIG_FAIR_GROUP_SCHED=y
++CONFIG_USER_SCHED=y
++# CONFIG_CGROUP_SCHED is not set
+ CONFIG_SYSFS_DEPRECATED=y
+ # CONFIG_RELAY is not set
++# CONFIG_NAMESPACES is not set
+ # CONFIG_BLK_DEV_INITRD is not set
++CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+ CONFIG_SYSCTL=y
+ CONFIG_EMBEDDED=y
+ CONFIG_UID16=y
+@@ -52,31 +59,36 @@ CONFIG_SYSCTL_SYSCALL=y
+ CONFIG_PRINTK=y
+ CONFIG_BUG=y
+ CONFIG_ELF_CORE=y
++CONFIG_COMPAT_BRK=y
+ CONFIG_BASE_FULL=y
+ CONFIG_FUTEX=y
++CONFIG_ANON_INODES=y
+ # CONFIG_EPOLL is not set
++CONFIG_SIGNALFD=y
++CONFIG_TIMERFD=y
++CONFIG_EVENTFD=y
+ CONFIG_SHMEM=y
+-CONFIG_SLAB=y
+ CONFIG_VM_EVENT_COUNTERS=y
++CONFIG_SLAB=y
++# CONFIG_SLUB is not set
++# CONFIG_SLOB is not set
++# CONFIG_PROFILING is not set
++# CONFIG_MARKERS is not set
++CONFIG_HAVE_OPROFILE=y
++# CONFIG_HAVE_KPROBES is not set
++CONFIG_PROC_PAGE_MONITOR=y
++CONFIG_SLABINFO=y
+ CONFIG_RT_MUTEXES=y
+ # CONFIG_TINY_SHMEM is not set
+ CONFIG_BASE_SMALL=0
+-# CONFIG_SLOB is not set
+-
+-#
+-# Loadable module support
+-#
+ CONFIG_MODULES=y
+ CONFIG_MODULE_UNLOAD=y
+ # CONFIG_MODVERSIONS is not set
+ # CONFIG_MODULE_SRCVERSION_ALL is not set
+ CONFIG_KMOD=y
+-
+-#
+-# Block layer
+-#
+ CONFIG_BLOCK=y
+ # CONFIG_LBD is not set
++# CONFIG_BLK_DEV_IO_TRACE is not set
+ # CONFIG_LSF is not set
+ 
+ #
+@@ -91,68 +103,27 @@ CONFIG_DEFAULT_DEADLINE=y
+ # CONFIG_DEFAULT_CFQ is not set
+ # CONFIG_DEFAULT_NOOP is not set
+ CONFIG_DEFAULT_IOSCHED="deadline"
++CONFIG_CLASSIC_RCU=y
++# CONFIG_PREEMPT_RCU is not set
+ 
+ #
+ # System type
+ #
+-CONFIG_SOLUTION_ENGINE=y
+-# CONFIG_SH_SOLUTION_ENGINE is not set
+-# CONFIG_SH_7751_SOLUTION_ENGINE is not set
+-CONFIG_SH_7780_SOLUTION_ENGINE=y
+-# CONFIG_SH_7300_SOLUTION_ENGINE is not set
+-# CONFIG_SH_7343_SOLUTION_ENGINE is not set
+-# CONFIG_SH_73180_SOLUTION_ENGINE is not set
+-# CONFIG_SH_7751_SYSTEMH is not set
+-# CONFIG_SH_HP6XX is not set
+-# CONFIG_SH_SATURN is not set
+-# CONFIG_SH_DREAMCAST is not set
+-# CONFIG_SH_MPC1211 is not set
+-# CONFIG_SH_SH03 is not set
+-# CONFIG_SH_SECUREEDGE5410 is not set
+-# CONFIG_SH_HS7751RVOIP is not set
+-# CONFIG_SH_7710VOIPGW is not set
+-# CONFIG_SH_RTS7751R2D is not set
+-# CONFIG_SH_HIGHLANDER is not set
+-# CONFIG_SH_EDOSK7705 is not set
+-# CONFIG_SH_SH4202_MICRODEV is not set
+-# CONFIG_SH_LANDISK is not set
+-# CONFIG_SH_TITAN is not set
+-# CONFIG_SH_SHMIN is not set
+-# CONFIG_SH_7206_SOLUTION_ENGINE is not set
+-# CONFIG_SH_7619_SOLUTION_ENGINE is not set
+-# CONFIG_SH_UNKNOWN is not set
+-
+-#
+-# Processor selection
+-#
+ CONFIG_CPU_SH4=y
+ CONFIG_CPU_SH4A=y
+-
+-#
+-# SH-2 Processor Support
+-#
+-# CONFIG_CPU_SUBTYPE_SH7604 is not set
+ # CONFIG_CPU_SUBTYPE_SH7619 is not set
+-
+-#
+-# SH-2A Processor Support
+-#
++# CONFIG_CPU_SUBTYPE_SH7203 is not set
+ # CONFIG_CPU_SUBTYPE_SH7206 is not set
+-
+-#
+-# SH-3 Processor Support
+-#
+-# CONFIG_CPU_SUBTYPE_SH7300 is not set
++# CONFIG_CPU_SUBTYPE_SH7263 is not set
+ # CONFIG_CPU_SUBTYPE_SH7705 is not set
+ # CONFIG_CPU_SUBTYPE_SH7706 is not set
+ # CONFIG_CPU_SUBTYPE_SH7707 is not set
+ # CONFIG_CPU_SUBTYPE_SH7708 is not set
+ # CONFIG_CPU_SUBTYPE_SH7709 is not set
+ # CONFIG_CPU_SUBTYPE_SH7710 is not set
+-
+-#
+-# SH-4 Processor Support
+-#
++# CONFIG_CPU_SUBTYPE_SH7712 is not set
++# CONFIG_CPU_SUBTYPE_SH7720 is not set
++# CONFIG_CPU_SUBTYPE_SH7721 is not set
+ # CONFIG_CPU_SUBTYPE_SH7750 is not set
+ # CONFIG_CPU_SUBTYPE_SH7091 is not set
+ # CONFIG_CPU_SUBTYPE_SH7750R is not set
+@@ -161,52 +132,58 @@ CONFIG_CPU_SH4A=y
+ # CONFIG_CPU_SUBTYPE_SH7751R is not set
+ # CONFIG_CPU_SUBTYPE_SH7760 is not set
+ # CONFIG_CPU_SUBTYPE_SH4_202 is not set
+-
+-#
+-# ST40 Processor Support
+-#
+-# CONFIG_CPU_SUBTYPE_ST40STB1 is not set
+-# CONFIG_CPU_SUBTYPE_ST40GX1 is not set
+-
+-#
+-# SH-4A Processor Support
+-#
++# CONFIG_CPU_SUBTYPE_SH7763 is not set
+ # CONFIG_CPU_SUBTYPE_SH7770 is not set
+ CONFIG_CPU_SUBTYPE_SH7780=y
+ # CONFIG_CPU_SUBTYPE_SH7785 is not set
+-
+-#
+-# SH4AL-DSP Processor Support
+-#
+-# CONFIG_CPU_SUBTYPE_SH73180 is not set
++# CONFIG_CPU_SUBTYPE_SHX3 is not set
+ # CONFIG_CPU_SUBTYPE_SH7343 is not set
+ # CONFIG_CPU_SUBTYPE_SH7722 is not set
++# CONFIG_CPU_SUBTYPE_SH7366 is not set
++# CONFIG_CPU_SUBTYPE_SH5_101 is not set
++# CONFIG_CPU_SUBTYPE_SH5_103 is not set
+ 
+ #
+ # Memory management options
+ #
++CONFIG_QUICKLIST=y
+ CONFIG_MMU=y
+ CONFIG_PAGE_OFFSET=0x80000000
+ CONFIG_MEMORY_START=0x08000000
+ CONFIG_MEMORY_SIZE=0x08000000
+-CONFIG_32BIT=y
++CONFIG_29BIT=y
++# CONFIG_PMB is not set
+ CONFIG_VSYSCALL=y
++CONFIG_ARCH_FLATMEM_ENABLE=y
++CONFIG_ARCH_SPARSEMEM_ENABLE=y
++CONFIG_ARCH_SPARSEMEM_DEFAULT=y
++CONFIG_MAX_ACTIVE_REGIONS=1
++CONFIG_ARCH_POPULATES_NODE_MAP=y
++CONFIG_ARCH_SELECT_MEMORY_MODEL=y
++CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
+ CONFIG_PAGE_SIZE_4KB=y
+ # CONFIG_PAGE_SIZE_8KB is not set
+ # CONFIG_PAGE_SIZE_64KB is not set
+-CONFIG_FLATMEM=y
+-CONFIG_FLAT_NODE_MEM_MAP=y
+-# CONFIG_SPARSEMEM_STATIC is not set
++CONFIG_SELECT_MEMORY_MODEL=y
++# CONFIG_FLATMEM_MANUAL is not set
++# CONFIG_DISCONTIGMEM_MANUAL is not set
++CONFIG_SPARSEMEM_MANUAL=y
++CONFIG_SPARSEMEM=y
++CONFIG_HAVE_MEMORY_PRESENT=y
++CONFIG_SPARSEMEM_STATIC=y
++# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
+ CONFIG_SPLIT_PTLOCK_CPUS=4
+ # CONFIG_RESOURCES_64BIT is not set
+ CONFIG_ZONE_DMA_FLAG=0
++CONFIG_NR_QUICK=2
+ 
+ #
+ # Cache configuration
+ #
+ # CONFIG_SH_DIRECT_MAPPED is not set
+-# CONFIG_SH_WRITETHROUGH is not set
+-# CONFIG_SH_OCRAM is not set
++CONFIG_CACHE_WRITEBACK=y
++# CONFIG_CACHE_WRITETHROUGH is not set
++# CONFIG_CACHE_OFF is not set
+ 
+ #
+ # Processor features
+@@ -214,20 +191,29 @@ CONFIG_ZONE_DMA_FLAG=0
+ CONFIG_CPU_LITTLE_ENDIAN=y
+ # CONFIG_CPU_BIG_ENDIAN is not set
+ CONFIG_SH_FPU=y
+-# CONFIG_SH_DSP is not set
+ # CONFIG_SH_STORE_QUEUES is not set
+ CONFIG_CPU_HAS_INTEVT=y
+-CONFIG_CPU_HAS_INTC2_IRQ=y
+-CONFIG_CPU_HAS_INTC_IRQ=y
+ CONFIG_CPU_HAS_SR_RB=y
++CONFIG_CPU_HAS_FPU=y
++
++#
++# Board support
++#
++CONFIG_SOLUTION_ENGINE=y
++CONFIG_SH_7780_SOLUTION_ENGINE=y
++# CONFIG_SH_SDK7780 is not set
++# CONFIG_SH_HIGHLANDER is not set
+ 
+ #
+ # Timer and clock configuration
+ #
+ CONFIG_SH_TMU=y
+ CONFIG_SH_TIMER_IRQ=28
+-# CONFIG_NO_IDLE_HZ is not set
+ CONFIG_SH_PCLK_FREQ=33333333
++# CONFIG_TICK_ONESHOT is not set
++# CONFIG_NO_HZ is not set
++# CONFIG_HIGH_RES_TIMERS is not set
++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
+ 
+ #
+ # CPU Frequency scaling
+@@ -242,7 +228,6 @@ CONFIG_SH_PCLK_FREQ=33333333
+ #
+ # Companion Chips
+ #
+-# CONFIG_HD6446X_SERIES is not set
+ 
+ #
+ # Additional SuperH Device Drivers
+@@ -258,40 +243,36 @@ CONFIG_HZ_250=y
+ # CONFIG_HZ_300 is not set
+ # CONFIG_HZ_1000 is not set
+ CONFIG_HZ=250
+-# CONFIG_SMP is not set
++# CONFIG_SCHED_HRTICK is not set
+ CONFIG_PREEMPT_NONE=y
+ # CONFIG_PREEMPT_VOLUNTARY is not set
+ # CONFIG_PREEMPT is not set
++CONFIG_RCU_TRACE=y
++CONFIG_GUSA=y
+ 
+ #
+ # Boot options
+ #
+ CONFIG_ZERO_PAGE_OFFSET=0x00001000
+ CONFIG_BOOT_LINK_OFFSET=0x00810000
+-# CONFIG_UBC_WAKEUP is not set
+-# CONFIG_CMDLINE_BOOL is not set
++CONFIG_CMDLINE_BOOL=y
++CONFIG_CMDLINE="console=ttySC0.115200 root=/dev/sda1"
+ 
+ #
+ # Bus options
+ #
++# CONFIG_CF_ENABLER is not set
+ CONFIG_PCI=y
+ CONFIG_SH_PCIDMA_NONCOHERENT=y
+ CONFIG_PCI_AUTO=y
+ CONFIG_PCI_AUTO_UPDATE_RESOURCES=y
+-
+-#
+-# PCCARD (PCMCIA/CardBus) support
+-#
+-
+-#
+-# PCI Hotplug Support
+-#
++# CONFIG_ARCH_SUPPORTS_MSI is not set
++CONFIG_PCI_LEGACY=y
+ 
+ #
+ # Executable file formats
+ #
+ CONFIG_BINFMT_ELF=y
+-# CONFIG_BINFMT_FLAT is not set
+ # CONFIG_BINFMT_MISC is not set
+ 
+ #
+@@ -302,7 +283,6 @@ CONFIG_NET=y
+ #
+ # Networking options
+ #
+-# CONFIG_NETDEBUG is not set
+ CONFIG_PACKET=y
+ # CONFIG_PACKET_MMAP is not set
+ CONFIG_UNIX=y
+@@ -329,6 +309,7 @@ CONFIG_IP_PNP=y
+ CONFIG_INET_XFRM_MODE_TRANSPORT=y
+ CONFIG_INET_XFRM_MODE_TUNNEL=y
+ CONFIG_INET_XFRM_MODE_BEET=y
++# CONFIG_INET_LRO is not set
+ CONFIG_INET_DIAG=y
+ CONFIG_INET_TCP_DIAG=y
+ # CONFIG_TCP_CONG_ADVANCED is not set
+@@ -349,16 +330,13 @@ CONFIG_IPV6=y
+ # CONFIG_IPV6_TUNNEL is not set
+ # CONFIG_NETWORK_SECMARK is not set
+ # CONFIG_NETFILTER is not set
++# CONFIG_ATM is not set
+ # CONFIG_BRIDGE is not set
+ # CONFIG_VLAN_8021Q is not set
+ # CONFIG_DECNET is not set
+ # CONFIG_LLC2 is not set
+ # CONFIG_IPX is not set
+ # CONFIG_ATALK is not set
+-
+-#
+-# QoS and/or fair queueing
+-#
+ # CONFIG_NET_SCHED is not set
+ 
+ #
+@@ -366,9 +344,18 @@ CONFIG_IPV6=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
++
++#
++# Wireless
++#
++# CONFIG_CFG80211 is not set
++# CONFIG_WIRELESS_EXT is not set
++# CONFIG_MAC80211 is not set
+ # CONFIG_IEEE80211 is not set
++# CONFIG_RFKILL is not set
+ 
+ #
+ # Device Drivers
+@@ -380,15 +367,7 @@ CONFIG_IPV6=y
+ CONFIG_STANDALONE=y
+ # CONFIG_PREVENT_FIRMWARE_BUILD is not set
+ # CONFIG_SYS_HYPERVISOR is not set
+-
+-#
+-# Connector - unified userspace <-> kernelspace linker
+-#
+ # CONFIG_CONNECTOR is not set
+-
+-#
+-# Memory Technology Devices (MTD)
+-#
+ CONFIG_MTD=y
+ # CONFIG_MTD_DEBUG is not set
+ # CONFIG_MTD_CONCAT is not set
+@@ -407,6 +386,7 @@ CONFIG_MTD_BLOCK=y
+ # CONFIG_INFTL is not set
+ # CONFIG_RFD_FTL is not set
+ # CONFIG_SSFDC is not set
++# CONFIG_MTD_OOPS is not set
+ 
+ #
+ # RAM/ROM/Flash chip drivers
+@@ -437,13 +417,13 @@ CONFIG_MTD_CFI_UTIL=y
+ # CONFIG_MTD_RAM is not set
+ CONFIG_MTD_ROM=y
+ # CONFIG_MTD_ABSENT is not set
+-# CONFIG_MTD_OBSOLETE_CHIPS is not set
+ 
+ #
+ # Mapping drivers for chip access
+ #
+ # CONFIG_MTD_COMPLEX_MAPPINGS is not set
+ # CONFIG_MTD_PHYSMAP is not set
++# CONFIG_MTD_INTEL_VR_NOR is not set
+ # CONFIG_MTD_PLATRAM is not set
+ 
+ #
+@@ -461,31 +441,15 @@ CONFIG_MTD_ROM=y
+ # CONFIG_MTD_DOC2000 is not set
+ # CONFIG_MTD_DOC2001 is not set
+ # CONFIG_MTD_DOC2001PLUS is not set
+-
+-#
+-# NAND Flash Device Drivers
+-#
+ # CONFIG_MTD_NAND is not set
+-
+-#
+-# OneNAND Flash Device Drivers
+-#
+ # CONFIG_MTD_ONENAND is not set
+ 
+ #
+-# Parallel port support
++# UBI - Unsorted block images
+ #
++# CONFIG_MTD_UBI is not set
+ # CONFIG_PARPORT is not set
+-
+-#
+-# Plug and Play support
+-#
+-# CONFIG_PNPACPI is not set
+-
+-#
+-# Block devices
+-#
+-# CONFIG_BLK_CPQ_DA is not set
++CONFIG_BLK_DEV=y
+ # CONFIG_BLK_CPQ_CISS_DA is not set
+ # CONFIG_BLK_DEV_DAC960 is not set
+ # CONFIG_BLK_DEV_COW_COMMON is not set
+@@ -497,15 +461,12 @@ CONFIG_BLK_DEV_LOOP=y
+ # CONFIG_BLK_DEV_RAM is not set
+ # CONFIG_CDROM_PKTCDVD is not set
+ # CONFIG_ATA_OVER_ETH is not set
+-
+-#
+-# Misc devices
+-#
++CONFIG_MISC_DEVICES=y
++# CONFIG_PHANTOM is not set
++# CONFIG_EEPROM_93CX6 is not set
+ # CONFIG_SGI_IOC4 is not set
+-
+-#
+-# ATA/ATAPI/MFM/RLL support
+-#
++# CONFIG_ENCLOSURE_SERVICES is not set
++CONFIG_HAVE_IDE=y
+ # CONFIG_IDE is not set
+ 
+ #
+@@ -513,6 +474,7 @@ CONFIG_BLK_DEV_LOOP=y
+ #
+ # CONFIG_RAID_ATTRS is not set
+ CONFIG_SCSI=y
++CONFIG_SCSI_DMA=y
+ # CONFIG_SCSI_NETLINK is not set
+ CONFIG_SCSI_PROC_FS=y
+ 
+@@ -533,6 +495,7 @@ CONFIG_CHR_DEV_SG=y
+ # CONFIG_SCSI_CONSTANTS is not set
+ # CONFIG_SCSI_LOGGING is not set
+ # CONFIG_SCSI_SCAN_ASYNC is not set
++CONFIG_SCSI_WAIT_SCAN=m
+ 
+ #
+ # SCSI Transports
+@@ -540,12 +503,9 @@ CONFIG_CHR_DEV_SG=y
+ # CONFIG_SCSI_SPI_ATTRS is not set
+ # CONFIG_SCSI_FC_ATTRS is not set
+ # CONFIG_SCSI_ISCSI_ATTRS is not set
+-# CONFIG_SCSI_SAS_ATTRS is not set
+ # CONFIG_SCSI_SAS_LIBSAS is not set
+-
+-#
+-# SCSI low-level drivers
+-#
++# CONFIG_SCSI_SRP_ATTRS is not set
++CONFIG_SCSI_LOWLEVEL=y
+ # CONFIG_ISCSI_TCP is not set
+ # CONFIG_BLK_DEV_3W_XXXX_RAID is not set
+ # CONFIG_SCSI_3W_9XXX is not set
+@@ -555,7 +515,6 @@ CONFIG_CHR_DEV_SG=y
+ # CONFIG_SCSI_AIC7XXX_OLD is not set
+ # CONFIG_SCSI_AIC79XX is not set
+ # CONFIG_SCSI_AIC94XX is not set
+-# CONFIG_SCSI_DPT_I2O is not set
+ # CONFIG_SCSI_ARCMSR is not set
+ # CONFIG_MEGARAID_NEWGEN is not set
+ # CONFIG_MEGARAID_LEGACY is not set
+@@ -566,6 +525,7 @@ CONFIG_CHR_DEV_SG=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
+@@ -577,10 +537,6 @@ CONFIG_CHR_DEV_SG=y
+ # CONFIG_SCSI_NSP32 is not set
+ # CONFIG_SCSI_DEBUG is not set
+ # CONFIG_SCSI_SRP is not set
+-
+-#
+-# Serial ATA (prod) and Parallel ATA (experimental) drivers
+-#
+ CONFIG_ATA=y
+ # CONFIG_ATA_NONSTANDARD is not set
+ # CONFIG_SATA_AHCI is not set
+@@ -597,62 +553,48 @@ CONFIG_SATA_SIL=y
+ # CONFIG_SATA_VIA is not set
+ # CONFIG_SATA_VITESSE is not set
+ # CONFIG_PATA_AMD is not set
++# CONFIG_PATA_ARTOP is not set
++# CONFIG_PATA_ATIIXP is not set
++# CONFIG_PATA_CMD64X is not set
+ # CONFIG_PATA_CS5520 is not set
+ # CONFIG_PATA_EFAR is not set
+ # CONFIG_ATA_GENERIC is not set
++# CONFIG_PATA_HPT366 is not set
+ # CONFIG_PATA_HPT3X3 is not set
++# CONFIG_PATA_IT821X is not set
+ # CONFIG_PATA_JMICRON is not set
+ # CONFIG_PATA_TRIFLEX is not set
+ # CONFIG_PATA_MARVELL is not set
+ # CONFIG_PATA_MPIIX is not set
++# CONFIG_PATA_OLDPIIX is not set
+ # CONFIG_PATA_NETCELL is not set
+ # CONFIG_PATA_RZ1000 is not set
++# CONFIG_PATA_SERVERWORKS is not set
+ # CONFIG_PATA_PDC2027X is not set
+ # CONFIG_PATA_SIL680 is not set
+ # CONFIG_PATA_VIA is not set
+ # CONFIG_PATA_WINBOND is not set
+ # CONFIG_PATA_PLATFORM is not set
+-
+-#
+-# Multi-device support (RAID and LVM)
+-#
+ # CONFIG_MD is not set
+-
+-#
+-# Fusion MPT device support
+-#
+ # CONFIG_FUSION is not set
+-# CONFIG_FUSION_SPI is not set
+-# CONFIG_FUSION_FC is not set
+-# CONFIG_FUSION_SAS is not set
+ 
+ #
+ # IEEE 1394 (FireWire) support
+ #
+-# CONFIG_IEEE1394 is not set
+ 
+ #
+-# I2O device support
++# An alternative FireWire stack is available with EXPERIMENTAL=y
+ #
++# CONFIG_IEEE1394 is not set
+ # CONFIG_I2O is not set
+-
+-#
+-# Network device support
+-#
+ CONFIG_NETDEVICES=y
++# CONFIG_NETDEVICES_MULTIQUEUE is not set
+ # CONFIG_DUMMY is not set
+ # CONFIG_BONDING is not set
+ # CONFIG_EQUALIZER is not set
+ # CONFIG_TUN is not set
+-
+-#
+-# ARCnet devices
+-#
++# CONFIG_VETH is not set
+ # CONFIG_ARCNET is not set
+-
+-#
+-# PHY device support
+-#
+ CONFIG_PHYLIB=y
+ 
+ #
+@@ -666,85 +608,59 @@ CONFIG_PHYLIB=y
+ # CONFIG_VITESSE_PHY is not set
+ CONFIG_SMSC_PHY=y
+ # CONFIG_BROADCOM_PHY is not set
++# CONFIG_ICPLUS_PHY is not set
++# CONFIG_REALTEK_PHY is not set
+ # CONFIG_FIXED_PHY is not set
+-
+-#
+-# Ethernet (10 or 100Mbit)
+-#
++# CONFIG_MDIO_BITBANG is not set
+ CONFIG_NET_ETHERNET=y
+ CONFIG_MII=y
++# CONFIG_AX88796 is not set
+ # CONFIG_STNIC is not set
+ # CONFIG_HAPPYMEAL is not set
+ # CONFIG_SUNGEM is not set
+ # CONFIG_CASSINI is not set
+ # CONFIG_NET_VENDOR_3COM is not set
+ CONFIG_SMC91X=y
+-
+-#
+-# Tulip family network device support
+-#
+ # CONFIG_NET_TULIP is not set
+ # CONFIG_HP100 is not set
++# CONFIG_IBM_NEW_EMAC_ZMII is not set
++# CONFIG_IBM_NEW_EMAC_RGMII is not set
++# CONFIG_IBM_NEW_EMAC_TAH is not set
++# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
+ CONFIG_NET_PCI=y
+ # CONFIG_PCNET32 is not set
+ # CONFIG_AMD8111_ETH is not set
+ # CONFIG_ADAPTEC_STARFIRE is not set
+ # CONFIG_B44 is not set
+ # CONFIG_FORCEDETH is not set
+-# CONFIG_DGRS is not set
+ # CONFIG_EEPRO100 is not set
+ # CONFIG_E100 is not set
+ # CONFIG_FEALNX is not set
+ # CONFIG_NATSEMI is not set
+ # CONFIG_NE2K_PCI 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
+ # CONFIG_TLAN is not set
+ # CONFIG_VIA_RHINE is not set
+-
+-#
+-# Ethernet (1000 Mbit)
+-#
+-# CONFIG_ACENIC is not set
+-# CONFIG_DL2K is not set
+-# CONFIG_E1000 is not set
+-# CONFIG_NS83820 is not set
+-# CONFIG_HAMACHI is not set
+-# CONFIG_R8169 is not set
+-# CONFIG_SIS190 is not set
+-# CONFIG_SKGE is not set
+-# CONFIG_SKY2 is not set
+-# CONFIG_SK98LIN is not set
+-# CONFIG_VIA_VELOCITY is not set
+-# CONFIG_TIGON3 is not set
+-# CONFIG_BNX2 is not set
+-# CONFIG_QLA3XXX is not set
+-
+-#
+-# Ethernet (10000 Mbit)
+-#
+-# CONFIG_CHELSIO_T1 is not set
+-# CONFIG_CHELSIO_T3 is not set
+-# CONFIG_IXGB is not set
+-# CONFIG_S2IO is not set
+-# CONFIG_MYRI10GE is not set
+-# CONFIG_NETXEN_NIC is not set
+-
+-#
+-# Token Ring devices
+-#
++# CONFIG_NETDEV_1000 is not set
++# CONFIG_NETDEV_10000 is not set
+ # CONFIG_TR is not set
+ 
+ #
+-# Wireless LAN (non-hamradio)
++# Wireless LAN
+ #
+-# CONFIG_NET_RADIO is not set
++# CONFIG_WLAN_PRE80211 is not set
++# CONFIG_WLAN_80211 is not set
+ 
+ #
+-# Wan interfaces
++# USB Network Adapters
+ #
++# CONFIG_USB_KAWETH is not set
++# CONFIG_USB_PEGASUS is not set
++# CONFIG_USB_USBNET is not set
+ # CONFIG_WAN is not set
+ # CONFIG_FDDI is not set
+ # CONFIG_PPP is not set
+@@ -752,15 +668,7 @@ CONFIG_NET_PCI=y
+ # CONFIG_NET_FC is not set
+ # CONFIG_NETPOLL is not set
+ # CONFIG_NET_POLL_CONTROLLER is not set
+-
+-#
+-# ISDN subsystem
+-#
+ # CONFIG_ISDN is not set
+-
+-#
+-# Telephony Support
+-#
+ # CONFIG_PHONE is not set
+ 
+ #
+@@ -768,6 +676,7 @@ CONFIG_NET_PCI=y
+ #
+ CONFIG_INPUT=y
+ # CONFIG_INPUT_FF_MEMLESS is not set
++# CONFIG_INPUT_POLLDEV is not set
+ 
+ #
+ # Userland interfaces
+@@ -777,7 +686,6 @@ CONFIG_INPUT_MOUSEDEV=y
+ CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+ # CONFIG_INPUT_JOYDEV is not set
+-# CONFIG_INPUT_TSDEV is not set
+ # CONFIG_INPUT_EVDEV is not set
+ # CONFIG_INPUT_EVBUG is not set
+ 
+@@ -787,6 +695,7 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+ # CONFIG_INPUT_KEYBOARD is not set
+ # CONFIG_INPUT_MOUSE is not set
+ # CONFIG_INPUT_JOYSTICK is not set
++# CONFIG_INPUT_TABLET is not set
+ # CONFIG_INPUT_TOUCHSCREEN is not set
+ # CONFIG_INPUT_MISC is not set
+ 
+@@ -821,31 +730,12 @@ CONFIG_SERIAL_CORE_CONSOLE=y
+ # CONFIG_SERIAL_JSM is not set
+ CONFIG_UNIX98_PTYS=y
+ # CONFIG_LEGACY_PTYS is not set
+-
+-#
+-# IPMI
+-#
+ # CONFIG_IPMI_HANDLER is not set
+-
+-#
+-# Watchdog Cards
+-#
+-# CONFIG_WATCHDOG is not set
+ # CONFIG_HW_RANDOM is not set
+-# CONFIG_GEN_RTC is not set
+-# CONFIG_DTLK is not set
+ # CONFIG_R3964 is not set
+ # CONFIG_APPLICOM is not set
+-# CONFIG_DRM is not set
+ # CONFIG_RAW_DRIVER is not set
+-
+-#
+-# TPM devices
+-#
+-
+-#
+-# I2C support
+-#
++CONFIG_DEVPORT=y
+ # CONFIG_I2C is not set
+ 
+ #
+@@ -853,18 +743,27 @@ CONFIG_UNIX98_PTYS=y
+ #
+ # CONFIG_SPI is not set
+ # CONFIG_SPI_MASTER is not set
+-
+-#
+-# Dallas's 1-wire bus
+-#
+ # CONFIG_W1 is not set
+-
+-#
+-# Hardware Monitoring support
+-#
++# CONFIG_POWER_SUPPLY is not set
+ CONFIG_HWMON=y
+ # CONFIG_HWMON_VID is not set
++# CONFIG_SENSORS_IT87 is not set
++# CONFIG_SENSORS_PC87360 is not set
++# CONFIG_SENSORS_SIS5595 is not set
++# CONFIG_SENSORS_SMSC47M1 is not set
++# CONFIG_SENSORS_VIA686A is not set
++# CONFIG_SENSORS_VT8231 is not set
++# CONFIG_SENSORS_W83627HF is not set
++# CONFIG_SENSORS_W83627EHF is not set
+ # CONFIG_HWMON_DEBUG_CHIP is not set
++CONFIG_THERMAL=y
++# CONFIG_WATCHDOG is not set
++
++#
++# Sonics Silicon Backplane
++#
++CONFIG_SSB_POSSIBLE=y
++# CONFIG_SSB is not set
+ 
+ #
+ # Multifunction device drivers
+@@ -875,23 +774,27 @@ CONFIG_HWMON=y
+ # Multimedia devices
+ #
+ # CONFIG_VIDEO_DEV is not set
+-
+-#
+-# Digital Video Broadcasting Devices
+-#
+-# CONFIG_DVB is not set
+-# CONFIG_USB_DABUSB is not set
++# CONFIG_DVB_CORE is not set
++# CONFIG_DAB is not set
+ 
+ #
+ # Graphics support
+ #
+-# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
++# CONFIG_DRM is not set
++# CONFIG_VGASTATE is not set
++# CONFIG_VIDEO_OUTPUT_CONTROL is not set
+ CONFIG_FB=y
+ CONFIG_FIRMWARE_EDID=y
+ # CONFIG_FB_DDC is not set
+ # CONFIG_FB_CFB_FILLRECT is not set
+ # CONFIG_FB_CFB_COPYAREA is not set
+ # CONFIG_FB_CFB_IMAGEBLIT is not set
++# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
++# CONFIG_FB_SYS_FILLRECT is not set
++# CONFIG_FB_SYS_COPYAREA is not set
++# CONFIG_FB_SYS_IMAGEBLIT is not set
++# CONFIG_FB_SYS_FOPS is not set
++CONFIG_FB_DEFERRED_IO=y
+ # CONFIG_FB_SVGALIB is not set
+ # CONFIG_FB_MACMODES is not set
+ # CONFIG_FB_BACKLIGHT is not set
+@@ -899,14 +802,13 @@ CONFIG_FIRMWARE_EDID=y
+ # CONFIG_FB_TILEBLITTING is not set
+ 
+ #
+-# Frambuffer hardware drivers
++# Frame buffer hardware drivers
+ #
+ # CONFIG_FB_CIRRUS is not set
+ # CONFIG_FB_PM2 is not set
+ # CONFIG_FB_CYBER2000 is not set
+ # CONFIG_FB_ASILIANT is not set
+ # CONFIG_FB_IMSTT is not set
+-# CONFIG_FB_EPSON1355 is not set
+ # CONFIG_FB_S1D13XXX is not set
+ # CONFIG_FB_NVIDIA is not set
+ # CONFIG_FB_RIVA is not set
+@@ -920,22 +822,27 @@ CONFIG_FIRMWARE_EDID=y
+ # CONFIG_FB_KYRO is not set
+ # CONFIG_FB_3DFX is not set
+ # CONFIG_FB_VOODOO1 is not set
++# CONFIG_FB_VT8623 is not set
+ # CONFIG_FB_TRIDENT is not set
++# CONFIG_FB_ARK is not set
+ # CONFIG_FB_VIRTUAL is not set
++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
++
++#
++# Display device support
++#
++# CONFIG_DISPLAY_SUPPORT is not set
+ 
+ #
+ # Console display driver support
+ #
+ CONFIG_DUMMY_CONSOLE=y
+ CONFIG_FRAMEBUFFER_CONSOLE=y
++# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set
+ # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
+ # CONFIG_FONTS is not set
+ CONFIG_FONT_8x8=y
+ CONFIG_FONT_8x16=y
+-
+-#
+-# Logo configuration
+-#
+ CONFIG_LOGO=y
+ # CONFIG_LOGO_LINUX_MONO is not set
+ # CONFIG_LOGO_LINUX_VGA16 is not set
+@@ -958,39 +865,38 @@ CONFIG_SOUND=y
+ # Open Sound System
+ #
+ CONFIG_SOUND_PRIME=y
+-# CONFIG_OBSOLETE_OSS is not set
+-# CONFIG_SOUND_BT878 is not set
+-# CONFIG_SOUND_ICH is not set
+ # CONFIG_SOUND_TRIDENT is not set
+ # CONFIG_SOUND_MSNDCLAS is not set
+ # CONFIG_SOUND_MSNDPIN is not set
+-# CONFIG_SOUND_VIA82CXXX is not set
+-
+-#
+-# HID Devices
+-#
++CONFIG_HID_SUPPORT=y
+ CONFIG_HID=y
+ # CONFIG_HID_DEBUG is not set
++# CONFIG_HIDRAW is not set
+ 
+ #
+-# USB support
++# USB Input Devices
+ #
++CONFIG_USB_HID=y
++# CONFIG_USB_HIDINPUT_POWERBOOK is not set
++# CONFIG_USB_HIDDEV is not set
++CONFIG_USB_SUPPORT=y
+ CONFIG_USB_ARCH_HAS_HCD=y
+ CONFIG_USB_ARCH_HAS_OHCI=y
+ CONFIG_USB_ARCH_HAS_EHCI=y
+ CONFIG_USB=y
+-CONFIG_USB_DEBUG=y
++# CONFIG_USB_DEBUG is not set
++# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
+ 
+ #
+ # Miscellaneous USB options
+ #
+ CONFIG_USB_DEVICEFS=y
++# CONFIG_USB_DEVICE_CLASS is not set
+ 
+ #
+ # USB Host Controller Drivers
+ #
+ CONFIG_USB_EHCI_HCD=y
+-# CONFIG_USB_EHCI_BIG_ENDIAN_MMIO is not set
+ # CONFIG_USB_ISP116X_HCD is not set
+ CONFIG_USB_OHCI_HCD=y
+ # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
+@@ -998,6 +904,7 @@ CONFIG_USB_OHCI_HCD=y
+ CONFIG_USB_OHCI_LITTLE_ENDIAN=y
+ # CONFIG_USB_UHCI_HCD is not set
+ # CONFIG_USB_SL811_HCD is not set
++# CONFIG_USB_R8A66597_HCD is not set
+ 
+ #
+ # USB Device Class drivers
+@@ -1015,49 +922,20 @@ CONFIG_USB_OHCI_LITTLE_ENDIAN=y
+ CONFIG_USB_STORAGE=y
+ # CONFIG_USB_STORAGE_DEBUG is not set
+ # CONFIG_USB_STORAGE_FREECOM is not set
++# CONFIG_USB_STORAGE_ISD200 is not set
+ # CONFIG_USB_STORAGE_DPCM is not set
+ # CONFIG_USB_STORAGE_KARMA is not set
+ # CONFIG_USB_LIBUSUAL is not set
+ 
+ #
+-# USB Input Devices
+-#
+-CONFIG_USB_HID=y
+-# CONFIG_USB_HIDINPUT_POWERBOOK is not set
+-# CONFIG_USB_HIDDEV is not set
+-# CONFIG_USB_AIPTEK is not set
+-# CONFIG_USB_WACOM is not set
+-# CONFIG_USB_ACECAD is not set
+-# CONFIG_USB_KBTAB is not set
+-# CONFIG_USB_POWERMATE is not set
+-# CONFIG_USB_TOUCHSCREEN is not set
+-# CONFIG_USB_XPAD is not set
+-# CONFIG_USB_ATI_REMOTE is not set
+-# CONFIG_USB_ATI_REMOTE2 is not set
+-# CONFIG_USB_APPLETOUCH is not set
+-# CONFIG_USB_GTCO is not set
+-
+-#
+ # USB Imaging devices
+ #
+ # CONFIG_USB_MICROTEK is not set
+-
+-#
+-# USB Network Adapters
+-#
+-# CONFIG_USB_KAWETH is not set
+-# CONFIG_USB_PEGASUS is not set
+-# CONFIG_USB_USBNET_MII is not set
+-# CONFIG_USB_USBNET is not set
+ CONFIG_USB_MON=y
+ 
+ #
+ # USB port drivers
+ #
+-
+-#
+-# USB Serial Converter support
+-#
+ # CONFIG_USB_SERIAL is not set
+ 
+ #
+@@ -1078,67 +956,17 @@ CONFIG_USB_MON=y
+ # CONFIG_USB_LD is not set
+ # CONFIG_USB_TRANCEVIBRATOR is not set
+ # CONFIG_USB_IOWARRIOR is not set
+-
+-#
+-# USB DSL modem support
+-#
+-
+-#
+-# USB Gadget Support
+-#
+ # CONFIG_USB_GADGET is not set
+-
+-#
+-# MMC/SD Card support
+-#
+ # CONFIG_MMC is not set
+-
+-#
+-# LED devices
+-#
++# CONFIG_MEMSTICK is not set
+ # CONFIG_NEW_LEDS is not set
+-
+-#
+-# LED drivers
+-#
+-
+-#
+-# LED Triggers
+-#
+-
+-#
+-# InfiniBand support
+-#
+ # CONFIG_INFINIBAND is not set
++# CONFIG_RTC_CLASS is not set
+ 
+ #
+-# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
+-#
+-
+-#
+-# Real Time Clock
+-#
+-
+-#
+-# DMA Engine support
+-#
+-# CONFIG_DMA_ENGINE is not set
+-
+-#
+-# DMA Clients
+-#
+-
+-#
+-# DMA Devices
+-#
+-
+-#
+-# Auxiliary Display support
+-#
+-
+-#
+-# Virtualization
++# Userspace I/O
+ #
++# CONFIG_UIO is not set
+ 
+ #
+ # File systems
+@@ -1151,12 +979,11 @@ CONFIG_EXT2_FS=y
+ # CONFIG_JFS_FS is not set
+ # CONFIG_FS_POSIX_ACL is not set
+ # CONFIG_XFS_FS is not set
+-# CONFIG_MINIX_FS is not set
+-# CONFIG_ROMFS_FS is not set
++# CONFIG_OCFS2_FS is not set
++# CONFIG_DNOTIFY is not set
+ CONFIG_INOTIFY=y
+ CONFIG_INOTIFY_USER=y
+ # CONFIG_QUOTA is not set
+-# CONFIG_DNOTIFY is not set
+ # CONFIG_AUTOFS_FS is not set
+ # CONFIG_AUTOFS4_FS is not set
+ # CONFIG_FUSE_FS is not set
+@@ -1181,14 +1008,14 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
+ # Pseudo filesystems
+ #
+ CONFIG_PROC_FS=y
+-# CONFIG_PROC_KCORE is not set
++CONFIG_PROC_KCORE=y
+ CONFIG_PROC_SYSCTL=y
+-# CONFIG_SYSFS is not set
++CONFIG_SYSFS=y
+ CONFIG_TMPFS=y
+ # CONFIG_TMPFS_POSIX_ACL is not set
+ # CONFIG_HUGETLBFS is not set
+ # CONFIG_HUGETLB_PAGE is not set
+-CONFIG_RAMFS=y
++# CONFIG_CONFIGFS_FS is not set
+ 
+ #
+ # Miscellaneous filesystems
+@@ -1197,14 +1024,13 @@ CONFIG_RAMFS=y
+ # CONFIG_JFFS2_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
+-
+-#
+-# Network File Systems
+-#
++CONFIG_NETWORK_FILESYSTEMS=y
+ CONFIG_NFS_FS=y
+ CONFIG_NFS_V3=y
+ # CONFIG_NFS_V3_ACL is not set
+@@ -1225,10 +1051,6 @@ CONFIG_SUNRPC=y
+ #
+ # CONFIG_PARTITION_ADVANCED is not set
+ CONFIG_MSDOS_PARTITION=y
+-
+-#
+-# Native Language Support
+-#
+ CONFIG_NLS=y
+ CONFIG_NLS_DEFAULT="iso8859-1"
+ # CONFIG_NLS_CODEPAGE_437 is not set
+@@ -1275,13 +1097,15 @@ CONFIG_NLS_DEFAULT="iso8859-1"
+ #
+ CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+ # CONFIG_PRINTK_TIME is not set
++CONFIG_ENABLE_WARN_DEPRECATED=y
+ CONFIG_ENABLE_MUST_CHECK=y
+ # CONFIG_MAGIC_SYSRQ is not set
+ # CONFIG_UNUSED_SYMBOLS is not set
++CONFIG_DEBUG_FS=y
+ # CONFIG_HEADERS_CHECK is not set
+ # CONFIG_DEBUG_KERNEL is not set
+-CONFIG_LOG_BUF_SHIFT=14
+ # CONFIG_DEBUG_BUGVERBOSE is not set
++# CONFIG_SAMPLES is not set
+ # CONFIG_SH_STANDARD_BIOS is not set
+ # CONFIG_EARLY_SCIF_CONSOLE is not set
+ # CONFIG_SH_KGDB is not set
+@@ -1290,11 +1114,48 @@ CONFIG_LOG_BUF_SHIFT=14
+ # Security options
+ #
+ # CONFIG_KEYS is not set
+-
+-#
+-# Cryptographic options
+-#
+-# CONFIG_CRYPTO is not set
++# CONFIG_SECURITY is not set
++CONFIG_CRYPTO=y
++# CONFIG_CRYPTO_SEQIV is not set
++# CONFIG_CRYPTO_MANAGER is not set
++# CONFIG_CRYPTO_HMAC is not set
++# CONFIG_CRYPTO_NULL is not set
++# CONFIG_CRYPTO_MD4 is not set
++# CONFIG_CRYPTO_MD5 is not set
++# CONFIG_CRYPTO_SHA1 is not set
++# CONFIG_CRYPTO_SHA256 is not set
++# CONFIG_CRYPTO_SHA512 is not set
++# CONFIG_CRYPTO_WP512 is not set
++# CONFIG_CRYPTO_TGR192 is not set
++# CONFIG_CRYPTO_ECB is not set
++# CONFIG_CRYPTO_CBC is not set
++# CONFIG_CRYPTO_PCBC is not set
++# CONFIG_CRYPTO_CTR is not set
++# CONFIG_CRYPTO_GCM is not set
++# CONFIG_CRYPTO_CCM is not set
++# CONFIG_CRYPTO_CRYPTD is not set
++# CONFIG_CRYPTO_DES is not set
++# CONFIG_CRYPTO_FCRYPT is not set
++# CONFIG_CRYPTO_BLOWFISH is not set
++# CONFIG_CRYPTO_TWOFISH is not set
++# CONFIG_CRYPTO_SERPENT is not set
++# CONFIG_CRYPTO_AES is not set
++# CONFIG_CRYPTO_CAST5 is not set
++# CONFIG_CRYPTO_CAST6 is not set
++# CONFIG_CRYPTO_TEA is not set
++# CONFIG_CRYPTO_ARC4 is not set
++# CONFIG_CRYPTO_KHAZAD is not set
++# CONFIG_CRYPTO_ANUBIS is not set
++# CONFIG_CRYPTO_SEED 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=y
++# CONFIG_CRYPTO_DEV_HIFN_795X is not set
+ 
+ #
+ # Library routines
+@@ -1302,9 +1163,12 @@ CONFIG_LOG_BUF_SHIFT=14
+ CONFIG_BITREVERSE=y
+ # CONFIG_CRC_CCITT is not set
+ # CONFIG_CRC16 is not set
++# CONFIG_CRC_ITU_T is not set
+ CONFIG_CRC32=y
++# CONFIG_CRC7 is not set
+ # CONFIG_LIBCRC32C is not set
+ CONFIG_ZLIB_INFLATE=y
+ CONFIG_PLIST=y
+ CONFIG_HAS_IOMEM=y
+ CONFIG_HAS_IOPORT=y
++CONFIG_HAS_DMA=y
+diff --git a/arch/sh/configs/sh7710voipgw_defconfig b/arch/sh/configs/sh7710voipgw_defconfig
+index 9380c32..37e49a5 100644
+--- a/arch/sh/configs/sh7710voipgw_defconfig
++++ b/arch/sh/configs/sh7710voipgw_defconfig
+@@ -1,40 +1,55 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.18
+-# Tue Oct  3 12:48:56 2006
++# Linux kernel version: 2.6.25-rc4
++# Thu Mar  6 16:02:29 2008
+ #
+ CONFIG_SUPERH=y
++CONFIG_SUPERH32=y
+ CONFIG_RWSEM_GENERIC_SPINLOCK=y
++CONFIG_GENERIC_BUG=y
+ CONFIG_GENERIC_FIND_NEXT_BIT=y
+ CONFIG_GENERIC_HWEIGHT=y
+ CONFIG_GENERIC_HARDIRQS=y
+ CONFIG_GENERIC_IRQ_PROBE=y
+ CONFIG_GENERIC_CALIBRATE_DELAY=y
++CONFIG_GENERIC_TIME=y
++CONFIG_GENERIC_CLOCKEVENTS=y
++CONFIG_STACKTRACE_SUPPORT=y
++CONFIG_LOCKDEP_SUPPORT=y
++# CONFIG_ARCH_HAS_ILOG2_U32 is not set
++# CONFIG_ARCH_HAS_ILOG2_U64 is not set
++CONFIG_ARCH_NO_VIRT_TO_BUS=y
++CONFIG_ARCH_SUPPORTS_AOUT=y
+ CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+ 
+ #
+-# Code maturity level options
++# General setup
+ #
+ CONFIG_EXPERIMENTAL=y
+ CONFIG_BROKEN_ON_SMP=y
+ CONFIG_INIT_ENV_ARG_LIMIT=32
+-
+-#
+-# General setup
+-#
+ CONFIG_LOCALVERSION=""
+ CONFIG_LOCALVERSION_AUTO=y
+ # CONFIG_SWAP is not set
+ CONFIG_SYSVIPC=y
+-# CONFIG_IPC_NS is not set
++CONFIG_SYSVIPC_SYSCTL=y
+ CONFIG_POSIX_MQUEUE=y
+ # CONFIG_BSD_PROCESS_ACCT is not set
+ # CONFIG_TASKSTATS is not set
+-# CONFIG_UTS_NS is not set
+ # CONFIG_AUDIT is not set
+ # CONFIG_IKCONFIG is not set
++CONFIG_LOG_BUF_SHIFT=14
++# CONFIG_CGROUPS is not set
++CONFIG_GROUP_SCHED=y
++CONFIG_FAIR_GROUP_SCHED=y
++# CONFIG_RT_GROUP_SCHED is not set
++CONFIG_USER_SCHED=y
++# CONFIG_CGROUP_SCHED is not set
++CONFIG_SYSFS_DEPRECATED=y
++CONFIG_SYSFS_DEPRECATED_V2=y
+ # CONFIG_RELAY is not set
+-CONFIG_INITRAMFS_SOURCE=""
++# CONFIG_NAMESPACES is not set
++# CONFIG_BLK_DEV_INITRD is not set
+ CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+ CONFIG_SYSCTL=y
+ CONFIG_EMBEDDED=y
+@@ -46,33 +61,39 @@ CONFIG_HOTPLUG=y
+ CONFIG_PRINTK=y
+ CONFIG_BUG=y
+ CONFIG_ELF_CORE=y
++CONFIG_COMPAT_BRK=y
+ CONFIG_BASE_FULL=y
+ # CONFIG_FUTEX is not set
++CONFIG_ANON_INODES=y
+ # CONFIG_EPOLL is not set
++CONFIG_SIGNALFD=y
++CONFIG_TIMERFD=y
++CONFIG_EVENTFD=y
+ # CONFIG_SHMEM is not set
+-CONFIG_SLAB=y
+ CONFIG_VM_EVENT_COUNTERS=y
++CONFIG_SLAB=y
++# CONFIG_SLUB is not set
++# CONFIG_SLOB is not set
++# CONFIG_PROFILING is not set
++# CONFIG_MARKERS is not set
++CONFIG_HAVE_OPROFILE=y
++# CONFIG_HAVE_KPROBES is not set
++# CONFIG_HAVE_KRETPROBES is not set
++CONFIG_PROC_PAGE_MONITOR=y
++CONFIG_SLABINFO=y
+ CONFIG_TINY_SHMEM=y
+ CONFIG_BASE_SMALL=0
+-# CONFIG_SLOB is not set
+-
+-#
+-# Loadable module support
+-#
+ CONFIG_MODULES=y
+ CONFIG_MODULE_UNLOAD=y
+ CONFIG_MODULE_FORCE_UNLOAD=y
+ # CONFIG_MODVERSIONS is not set
+ # CONFIG_MODULE_SRCVERSION_ALL is not set
+ # CONFIG_KMOD is not set
+-
+-#
+-# Block layer
+-#
+ CONFIG_BLOCK=y
+ # CONFIG_LBD is not set
+ # CONFIG_BLK_DEV_IO_TRACE is not set
+ # CONFIG_LSF is not set
++# CONFIG_BLK_DEV_BSG is not set
+ 
+ #
+ # IO Schedulers
+@@ -86,59 +107,26 @@ CONFIG_DEFAULT_DEADLINE=y
+ # CONFIG_DEFAULT_CFQ is not set
+ # CONFIG_DEFAULT_NOOP is not set
+ CONFIG_DEFAULT_IOSCHED="deadline"
++CONFIG_CLASSIC_RCU=y
++# CONFIG_PREEMPT_RCU is not set
+ 
+ #
+ # System type
+ #
+-# CONFIG_SH_SOLUTION_ENGINE is not set
+-# CONFIG_SH_7751_SOLUTION_ENGINE is not set
+-# CONFIG_SH_7300_SOLUTION_ENGINE is not set
+-# CONFIG_SH_7343_SOLUTION_ENGINE is not set
+-# CONFIG_SH_73180_SOLUTION_ENGINE is not set
+-# CONFIG_SH_7751_SYSTEMH is not set
+-# CONFIG_SH_HP6XX is not set
+-# CONFIG_SH_EC3104 is not set
+-# CONFIG_SH_SATURN is not set
+-# CONFIG_SH_DREAMCAST is not set
+-# CONFIG_SH_BIGSUR is not set
+-# CONFIG_SH_MPC1211 is not set
+-# CONFIG_SH_SH03 is not set
+-# CONFIG_SH_SECUREEDGE5410 is not set
+-# CONFIG_SH_HS7751RVOIP is not set
+-CONFIG_SH_7710VOIPGW=y
+-# CONFIG_SH_RTS7751R2D is not set
+-# CONFIG_SH_R7780RP is not set
+-# CONFIG_SH_EDOSK7705 is not set
+-# CONFIG_SH_SH4202_MICRODEV is not set
+-# CONFIG_SH_LANDISK is not set
+-# CONFIG_SH_TITAN is not set
+-# CONFIG_SH_SHMIN is not set
+-# CONFIG_SH_UNKNOWN is not set
+-
+-#
+-# Processor selection
+-#
+ CONFIG_CPU_SH3=y
+-
+-#
+-# SH-2 Processor Support
+-#
+-# CONFIG_CPU_SUBTYPE_SH7604 is not set
+-
+-#
+-# SH-3 Processor Support
+-#
+-# CONFIG_CPU_SUBTYPE_SH7300 is not set
++# CONFIG_CPU_SUBTYPE_SH7619 is not set
++# CONFIG_CPU_SUBTYPE_SH7203 is not set
++# CONFIG_CPU_SUBTYPE_SH7206 is not set
++# CONFIG_CPU_SUBTYPE_SH7263 is not set
+ # CONFIG_CPU_SUBTYPE_SH7705 is not set
+ # CONFIG_CPU_SUBTYPE_SH7706 is not set
+ # CONFIG_CPU_SUBTYPE_SH7707 is not set
+ # CONFIG_CPU_SUBTYPE_SH7708 is not set
+ # CONFIG_CPU_SUBTYPE_SH7709 is not set
+ CONFIG_CPU_SUBTYPE_SH7710=y
+-
+-#
+-# SH-4 Processor Support
+-#
++# CONFIG_CPU_SUBTYPE_SH7712 is not set
++# CONFIG_CPU_SUBTYPE_SH7720 is not set
++# CONFIG_CPU_SUBTYPE_SH7721 is not set
+ # CONFIG_CPU_SUBTYPE_SH7750 is not set
+ # CONFIG_CPU_SUBTYPE_SH7091 is not set
+ # CONFIG_CPU_SUBTYPE_SH7750R is not set
+@@ -147,65 +135,84 @@ CONFIG_CPU_SUBTYPE_SH7710=y
+ # CONFIG_CPU_SUBTYPE_SH7751R is not set
+ # CONFIG_CPU_SUBTYPE_SH7760 is not set
+ # CONFIG_CPU_SUBTYPE_SH4_202 is not set
+-
+-#
+-# ST40 Processor Support
+-#
+-# CONFIG_CPU_SUBTYPE_ST40STB1 is not set
+-# CONFIG_CPU_SUBTYPE_ST40GX1 is not set
+-
+-#
+-# SH-4A Processor Support
+-#
++# CONFIG_CPU_SUBTYPE_SH7763 is not set
+ # CONFIG_CPU_SUBTYPE_SH7770 is not set
+ # CONFIG_CPU_SUBTYPE_SH7780 is not set
+-
+-#
+-# SH4AL-DSP Processor Support
+-#
+-# CONFIG_CPU_SUBTYPE_SH73180 is not set
++# CONFIG_CPU_SUBTYPE_SH7785 is not set
++# CONFIG_CPU_SUBTYPE_SHX3 is not set
+ # CONFIG_CPU_SUBTYPE_SH7343 is not set
++# CONFIG_CPU_SUBTYPE_SH7722 is not set
++# CONFIG_CPU_SUBTYPE_SH7366 is not set
++# CONFIG_CPU_SUBTYPE_SH5_101 is not set
++# CONFIG_CPU_SUBTYPE_SH5_103 is not set
+ 
+ #
+ # Memory management options
+ #
++CONFIG_QUICKLIST=y
+ CONFIG_MMU=y
+ CONFIG_PAGE_OFFSET=0x80000000
+ CONFIG_MEMORY_START=0x0c000000
+ CONFIG_MEMORY_SIZE=0x00800000
++CONFIG_29BIT=y
+ CONFIG_VSYSCALL=y
++CONFIG_ARCH_FLATMEM_ENABLE=y
++CONFIG_ARCH_SPARSEMEM_ENABLE=y
++CONFIG_ARCH_SPARSEMEM_DEFAULT=y
++CONFIG_MAX_ACTIVE_REGIONS=1
++CONFIG_ARCH_POPULATES_NODE_MAP=y
++CONFIG_ARCH_SELECT_MEMORY_MODEL=y
++CONFIG_PAGE_SIZE_4KB=y
++# CONFIG_PAGE_SIZE_8KB is not set
++# CONFIG_PAGE_SIZE_64KB is not set
+ CONFIG_SELECT_MEMORY_MODEL=y
+ CONFIG_FLATMEM_MANUAL=y
+ # CONFIG_DISCONTIGMEM_MANUAL is not set
+ # CONFIG_SPARSEMEM_MANUAL is not set
+ CONFIG_FLATMEM=y
+ CONFIG_FLAT_NODE_MEM_MAP=y
+-# CONFIG_SPARSEMEM_STATIC is not set
++CONFIG_SPARSEMEM_STATIC=y
++# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
+ CONFIG_SPLIT_PTLOCK_CPUS=4
+ # CONFIG_RESOURCES_64BIT is not set
++CONFIG_ZONE_DMA_FLAG=0
++CONFIG_NR_QUICK=2
+ 
+ #
+ # Cache configuration
+ #
+ # CONFIG_SH_DIRECT_MAPPED is not set
+-# CONFIG_SH_WRITETHROUGH is not set
+-# CONFIG_SH_OCRAM is not set
++CONFIG_CACHE_WRITEBACK=y
++# CONFIG_CACHE_WRITETHROUGH is not set
++# CONFIG_CACHE_OFF is not set
+ 
+ #
+ # Processor features
+ #
+ CONFIG_CPU_LITTLE_ENDIAN=y
++# CONFIG_CPU_BIG_ENDIAN is not set
+ # CONFIG_SH_FPU_EMU is not set
+ CONFIG_SH_DSP=y
+ # CONFIG_SH_ADC is not set
+ CONFIG_CPU_HAS_INTEVT=y
+ CONFIG_CPU_HAS_SR_RB=y
++CONFIG_CPU_HAS_DSP=y
+ 
+ #
+-# Timer support
++# Board support
++#
++# CONFIG_SH_SOLUTION_ENGINE is not set
++
++#
++# Timer and clock configuration
+ #
+ CONFIG_SH_TMU=y
++CONFIG_SH_TIMER_IRQ=16
+ CONFIG_SH_PCLK_FREQ=32768000
++# CONFIG_TICK_ONESHOT is not set
++# CONFIG_NO_HZ is not set
++# CONFIG_HIGH_RES_TIMERS is not set
++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
+ 
+ #
+ # CPU Frequency scaling
+@@ -220,56 +227,51 @@ CONFIG_SH_PCLK_FREQ=32768000
+ #
+ # Companion Chips
+ #
+-# CONFIG_HD6446X_SERIES is not set
++
++#
++# Additional SuperH Device Drivers
++#
++# CONFIG_HEARTBEAT is not set
++# CONFIG_PUSH_SWITCH is not set
+ 
+ #
+ # Kernel features
+ #
+ # CONFIG_HZ_100 is not set
+ 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_KEXEC is not set
+-# CONFIG_SMP is not set
++# CONFIG_CRASH_DUMP is not set
+ CONFIG_PREEMPT_NONE=y
+ # CONFIG_PREEMPT_VOLUNTARY is not set
+ # CONFIG_PREEMPT is not set
++CONFIG_RCU_TRACE=y
++CONFIG_GUSA=y
++# CONFIG_GUSA_RB is not set
+ 
+ #
+ # Boot options
+ #
+ CONFIG_ZERO_PAGE_OFFSET=0x00001000
+ CONFIG_BOOT_LINK_OFFSET=0x00800000
+-# CONFIG_UBC_WAKEUP is not set
+ # CONFIG_CMDLINE_BOOL is not set
+ 
+ #
+ # Bus options
+ #
+-# CONFIG_PCI is not set
+-
+-#
+-# PCCARD (PCMCIA/CardBus) support
+-#
++# CONFIG_ARCH_SUPPORTS_MSI is not set
+ # CONFIG_PCCARD is not set
+ 
+ #
+-# PCI Hotplug Support
+-#
+-
+-#
+ # Executable file formats
+ #
+ CONFIG_BINFMT_ELF=y
+-# CONFIG_BINFMT_FLAT is not set
+ # CONFIG_BINFMT_MISC is not set
+ 
+ #
+-# Power management options (EXPERIMENTAL)
+-#
+-# CONFIG_PM is not set
+-
+-#
+ # Networking
+ #
+ CONFIG_NET=y
+@@ -277,13 +279,14 @@ CONFIG_NET=y
+ #
+ # Networking options
+ #
+-# CONFIG_NETDEBUG is not set
+ CONFIG_PACKET=y
+ # CONFIG_PACKET_MMAP is not set
+ CONFIG_UNIX=y
+ 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
+@@ -301,14 +304,13 @@ CONFIG_SYN_COOKIES=y
+ # CONFIG_INET_TUNNEL is not set
+ CONFIG_INET_XFRM_MODE_TRANSPORT=y
+ CONFIG_INET_XFRM_MODE_TUNNEL=y
++CONFIG_INET_XFRM_MODE_BEET=y
++# CONFIG_INET_LRO is not set
+ # CONFIG_INET_DIAG is not set
+ # CONFIG_TCP_CONG_ADVANCED is not set
+ CONFIG_TCP_CONG_CUBIC=y
+ CONFIG_DEFAULT_TCP_CONG="cubic"
+-
+-#
+-# IP: Virtual Server Configuration
+-#
++# CONFIG_TCP_MD5SIG is not set
+ # CONFIG_IP_VS is not set
+ # CONFIG_IPV6 is not set
+ # CONFIG_INET6_XFRM_TUNNEL is not set
+@@ -316,44 +318,24 @@ 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_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
+ 
+ #
+ # IP: Netfilter Configuration
+ #
+-CONFIG_IP_NF_CONNTRACK=y
+-# CONFIG_IP_NF_CT_ACCT is not set
+-# CONFIG_IP_NF_CONNTRACK_MARK is not set
+-# CONFIG_IP_NF_CONNTRACK_EVENTS is not set
+-# CONFIG_IP_NF_CT_PROTO_SCTP is not set
+-CONFIG_IP_NF_FTP=m
+-# CONFIG_IP_NF_IRC is not set
+-# CONFIG_IP_NF_NETBIOS_NS is not set
+-# CONFIG_IP_NF_TFTP is not set
+-# CONFIG_IP_NF_AMANDA is not set
+-CONFIG_IP_NF_PPTP=m
+-# CONFIG_IP_NF_H323 is not set
+-# CONFIG_IP_NF_SIP is not set
+ # CONFIG_IP_NF_QUEUE is not set
+-
+-#
+-# DCCP Configuration (EXPERIMENTAL)
+-#
++# CONFIG_IP_NF_IPTABLES is not set
++# CONFIG_IP_NF_ARPTABLES is not set
+ # CONFIG_IP_DCCP is not set
+-
+-#
+-# SCTP Configuration (EXPERIMENTAL)
+-#
+ # CONFIG_IP_SCTP is not set
+-
+-#
+-# TIPC Configuration (EXPERIMENTAL)
+-#
+ # CONFIG_TIPC is not set
+ # CONFIG_ATM is not set
+ # CONFIG_BRIDGE is not set
+@@ -366,14 +348,7 @@ CONFIG_IP_NF_PPTP=m
+ # CONFIG_LAPB is not set
+ # CONFIG_ECONET is not set
+ # CONFIG_WAN_ROUTER is not set
+-
+-#
+-# QoS and/or fair queueing
+-#
+ CONFIG_NET_SCHED=y
+-CONFIG_NET_SCH_CLK_JIFFIES=y
+-# CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set
+-# CONFIG_NET_SCH_CLK_CPU is not set
+ 
+ #
+ # Queueing/Scheduling
+@@ -382,6 +357,7 @@ CONFIG_NET_SCH_CBQ=y
+ # CONFIG_NET_SCH_HTB is not set
+ # CONFIG_NET_SCH_HFSC is not set
+ # CONFIG_NET_SCH_PRIO is not set
++# CONFIG_NET_SCH_RR is not set
+ # CONFIG_NET_SCH_RED is not set
+ # CONFIG_NET_SCH_SFQ is not set
+ # CONFIG_NET_SCH_TEQL is not set
+@@ -389,7 +365,6 @@ CONFIG_NET_SCH_CBQ=y
+ # CONFIG_NET_SCH_GRED is not set
+ # CONFIG_NET_SCH_DSMARK is not set
+ # CONFIG_NET_SCH_NETEM is not set
+-CONFIG_NET_SCH_INGRESS=y
+ 
+ #
+ # Classification
+@@ -405,20 +380,31 @@ CONFIG_NET_CLS_U32=y
+ # CONFIG_CLS_U32_MARK is not set
+ # CONFIG_NET_CLS_RSVP is not set
+ # CONFIG_NET_CLS_RSVP6 is not set
++# CONFIG_NET_CLS_FLOW is not set
+ # CONFIG_NET_EMATCH is not set
+ # CONFIG_NET_CLS_ACT is not set
+-CONFIG_NET_CLS_POLICE=y
+ # CONFIG_NET_CLS_IND is not set
+-CONFIG_NET_ESTIMATOR=y
++CONFIG_NET_SCH_FIFO=y
+ 
+ #
+ # Network testing
+ #
+ # 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
++
++#
++# Wireless
++#
++# CONFIG_CFG80211 is not set
++# CONFIG_WIRELESS_EXT is not set
++# CONFIG_MAC80211 is not set
+ # CONFIG_IEEE80211 is not set
++# CONFIG_RFKILL is not set
++# CONFIG_NET_9P is not set
+ 
+ #
+ # Device Drivers
+@@ -427,19 +413,12 @@ CONFIG_NET_ESTIMATOR=y
+ #
+ # Generic Driver Options
+ #
++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+ CONFIG_STANDALONE=y
+ CONFIG_PREVENT_FIRMWARE_BUILD=y
+ CONFIG_FW_LOADER=y
+ # CONFIG_SYS_HYPERVISOR is not set
+-
+-#
+-# Connector - unified userspace <-> kernelspace linker
+-#
+ # CONFIG_CONNECTOR is not set
+-
+-#
+-# Memory Technology Devices (MTD)
+-#
+ CONFIG_MTD=y
+ # CONFIG_MTD_DEBUG is not set
+ # CONFIG_MTD_CONCAT is not set
+@@ -451,12 +430,14 @@ CONFIG_MTD_PARTITIONS=y
+ # User Modules And Translation Layers
+ #
+ CONFIG_MTD_CHAR=y
++CONFIG_MTD_BLKDEVS=y
+ CONFIG_MTD_BLOCK=y
+ # CONFIG_FTL is not set
+ # CONFIG_NFTL is not set
+ # CONFIG_INFTL is not set
+ # CONFIG_RFD_FTL is not set
+ # CONFIG_SSFDC is not set
++# CONFIG_MTD_OOPS is not set
+ 
+ #
+ # RAM/ROM/Flash chip drivers
+@@ -482,7 +463,6 @@ CONFIG_MTD_CFI_UTIL=y
+ CONFIG_MTD_RAM=y
+ # CONFIG_MTD_ROM is not set
+ # CONFIG_MTD_ABSENT is not set
+-# CONFIG_MTD_OBSOLETE_CHIPS is not set
+ 
+ #
+ # Mapping drivers for chip access
+@@ -505,40 +485,25 @@ CONFIG_MTD_RAM=y
+ # CONFIG_MTD_DOC2000 is not set
+ # CONFIG_MTD_DOC2001 is not set
+ # CONFIG_MTD_DOC2001PLUS is not set
+-
+-#
+-# NAND Flash Device Drivers
+-#
+ # CONFIG_MTD_NAND is not set
+-
+-#
+-# OneNAND Flash Device Drivers
+-#
+ # CONFIG_MTD_ONENAND is not set
+ 
+ #
+-# Parallel port support
++# UBI - Unsorted block images
+ #
++# CONFIG_MTD_UBI is not set
+ # CONFIG_PARPORT is not set
+-
+-#
+-# Plug and Play support
+-#
+-
+-#
+-# Block devices
+-#
++CONFIG_BLK_DEV=y
+ # CONFIG_BLK_DEV_COW_COMMON is not set
+ # CONFIG_BLK_DEV_LOOP is not set
+ # CONFIG_BLK_DEV_NBD is not set
+ # CONFIG_BLK_DEV_RAM is not set
+-# CONFIG_BLK_DEV_INITRD is not set
+ # CONFIG_CDROM_PKTCDVD is not set
+ # CONFIG_ATA_OVER_ETH is not set
+-
+-#
+-# ATA/ATAPI/MFM/RLL support
+-#
++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
+ 
+ #
+@@ -546,104 +511,59 @@ CONFIG_MTD_RAM=y
+ #
+ # CONFIG_RAID_ATTRS is not set
+ # CONFIG_SCSI is not set
++# CONFIG_SCSI_DMA is not set
+ # CONFIG_SCSI_NETLINK is not set
+-
+-#
+-# Serial ATA (prod) and Parallel ATA (experimental) drivers
+-#
+ # CONFIG_ATA is not set
+-
+-#
+-# Multi-device support (RAID and LVM)
+-#
+ # CONFIG_MD is not set
+-
+-#
+-# Fusion MPT device support
+-#
+-# CONFIG_FUSION is not set
+-
+-#
+-# IEEE 1394 (FireWire) support
+-#
+-
+-#
+-# I2O device support
+-#
+-
+-#
+-# Network device support
+-#
+ CONFIG_NETDEVICES=y
++# CONFIG_NETDEVICES_MULTIQUEUE is not set
+ # CONFIG_DUMMY is not set
+ # CONFIG_BONDING is not set
++# CONFIG_MACVLAN is not set
+ # CONFIG_EQUALIZER is not set
+ # CONFIG_TUN is not set
+-
+-#
+-# PHY device support
+-#
++# CONFIG_VETH is not set
+ # CONFIG_PHYLIB is not set
+-
+-#
+-# Ethernet (10 or 100Mbit)
+-#
+ CONFIG_NET_ETHERNET=y
+ # CONFIG_MII is not set
++# CONFIG_AX88796 is not set
+ # CONFIG_STNIC is not set
+ # CONFIG_SMC91X is not set
++# CONFIG_IBM_NEW_EMAC_ZMII is not set
++# CONFIG_IBM_NEW_EMAC_RGMII is not set
++# CONFIG_IBM_NEW_EMAC_TAH is not set
++# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
++# CONFIG_B44 is not set
++CONFIG_NETDEV_1000=y
++# CONFIG_E1000E_ENABLED is not set
++CONFIG_NETDEV_10000=y
+ 
+ #
+-# Ethernet (1000 Mbit)
+-#
+-
+-#
+-# Ethernet (10000 Mbit)
+-#
+-
+-#
+-# Token Ring devices
+-#
+-
+-#
+-# Wireless LAN (non-hamradio)
+-#
+-# CONFIG_NET_RADIO is not set
+-
+-#
+-# Wan interfaces
++# Wireless LAN
+ #
++# CONFIG_WLAN_PRE80211 is not set
++# CONFIG_WLAN_80211 is not set
+ # 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
+-
+-#
+-# ISDN subsystem
+-#
+ # CONFIG_ISDN is not set
+-
+-#
+-# Telephony Support
+-#
+ CONFIG_PHONE=y
+-# CONFIG_PHONE_IXJ is not set
+ 
+ #
+ # Input device support
+ #
+ CONFIG_INPUT=y
+ # CONFIG_INPUT_FF_MEMLESS is not set
++# CONFIG_INPUT_POLLDEV is not set
+ 
+ #
+ # Userland interfaces
+ #
+ # CONFIG_INPUT_MOUSEDEV is not set
+ # CONFIG_INPUT_JOYDEV is not set
+-# CONFIG_INPUT_TSDEV is not set
+ # CONFIG_INPUT_EVDEV is not set
+ # CONFIG_INPUT_EVBUG is not set
+ 
+@@ -653,6 +573,7 @@ CONFIG_INPUT=y
+ # CONFIG_INPUT_KEYBOARD is not set
+ # CONFIG_INPUT_MOUSE is not set
+ # CONFIG_INPUT_JOYSTICK is not set
++# CONFIG_INPUT_TABLET is not set
+ # CONFIG_INPUT_TOUCHSCREEN is not set
+ # CONFIG_INPUT_MISC is not set
+ 
+@@ -684,35 +605,11 @@ CONFIG_SERIAL_CORE_CONSOLE=y
+ # CONFIG_UNIX98_PTYS is not set
+ CONFIG_LEGACY_PTYS=y
+ CONFIG_LEGACY_PTY_COUNT=256
+-
+-#
+-# IPMI
+-#
+ # CONFIG_IPMI_HANDLER is not set
+-
+-#
+-# Watchdog Cards
+-#
+-# CONFIG_WATCHDOG is not set
+ CONFIG_HW_RANDOM=y
+-# CONFIG_GEN_RTC is not set
+-# CONFIG_DTLK is not set
+ # CONFIG_R3964 is not set
+-
+-#
+-# Ftape, the floppy tape device driver
+-#
+ # CONFIG_RAW_DRIVER is not set
+-
+-#
+-# TPM devices
+-#
+ # CONFIG_TCG_TPM is not set
+-# CONFIG_TELCLOCK is not set
+-
+-#
+-# I2C support
+-#
+ # CONFIG_I2C is not set
+ 
+ #
+@@ -720,119 +617,86 @@ CONFIG_HW_RANDOM=y
+ #
+ # CONFIG_SPI is not set
+ # CONFIG_SPI_MASTER is not set
++# CONFIG_W1 is not set
++# CONFIG_POWER_SUPPLY is not set
++# CONFIG_HWMON is not set
++CONFIG_THERMAL=y
++# CONFIG_WATCHDOG is not set
+ 
+ #
+-# Dallas's 1-wire bus
+-#
+-
+-#
+-# Hardware Monitoring support
++# Sonics Silicon Backplane
+ #
+-# CONFIG_HWMON is not set
+-# CONFIG_HWMON_VID is not set
++CONFIG_SSB_POSSIBLE=y
++# CONFIG_SSB is not set
+ 
+ #
+-# Misc devices
++# Multifunction device drivers
+ #
++# CONFIG_MFD_SM501 is not set
+ 
+ #
+ # Multimedia devices
+ #
+ # CONFIG_VIDEO_DEV is not set
+-CONFIG_VIDEO_V4L2=y
+-
+-#
+-# Digital Video Broadcasting Devices
+-#
+-# CONFIG_DVB is not set
++# CONFIG_DVB_CORE is not set
++# CONFIG_DAB is not set
+ 
+ #
+ # Graphics support
+ #
+-CONFIG_FIRMWARE_EDID=y
++# CONFIG_VGASTATE is not set
++# CONFIG_VIDEO_OUTPUT_CONTROL is not set
+ # CONFIG_FB is not set
+ # CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+ 
+ #
+-# Sound
++# Display device support
+ #
+-# CONFIG_SOUND is not set
++# CONFIG_DISPLAY_SUPPORT is not set
+ 
+ #
+-# USB support
++# Sound
+ #
+-# CONFIG_USB_ARCH_HAS_HCD is not set
++# CONFIG_SOUND is not set
++CONFIG_HID_SUPPORT=y
++CONFIG_HID=y
++# CONFIG_HID_DEBUG is not set
++# CONFIG_HIDRAW is not set
++CONFIG_USB_SUPPORT=y
++CONFIG_USB_ARCH_HAS_HCD=y
+ # CONFIG_USB_ARCH_HAS_OHCI is not set
+ # CONFIG_USB_ARCH_HAS_EHCI is not set
++# CONFIG_USB is not set
+ 
+ #
+ # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+ #
+-
+-#
+-# USB Gadget Support
+-#
+ # CONFIG_USB_GADGET is not set
+-
+-#
+-# MMC/SD Card support
+-#
+ # CONFIG_MMC is not set
+-
+-#
+-# LED devices
+-#
++# CONFIG_MEMSTICK is not set
+ # CONFIG_NEW_LEDS is not set
+-
+-#
+-# LED drivers
+-#
+-
+-#
+-# LED Triggers
+-#
+-
+-#
+-# InfiniBand support
+-#
+-
+-#
+-# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
+-#
+-
+-#
+-# Real Time Clock
+-#
+ # CONFIG_RTC_CLASS is not set
+ 
+ #
+-# DMA Engine support
+-#
+-# CONFIG_DMA_ENGINE is not set
+-
+-#
+-# DMA Clients
+-#
+-
+-#
+-# DMA Devices
++# Userspace I/O
+ #
++# CONFIG_UIO is not set
+ 
+ #
+ # File systems
+ #
+ # CONFIG_EXT2_FS is not set
+ # CONFIG_EXT3_FS is not set
++# CONFIG_EXT4DEV_FS is not set
+ # CONFIG_REISERFS_FS is not set
+ # CONFIG_JFS_FS is not set
+ # CONFIG_FS_POSIX_ACL is not set
+ # CONFIG_XFS_FS is not set
++# CONFIG_GFS2_FS is not set
+ # CONFIG_OCFS2_FS is not set
+-# CONFIG_MINIX_FS is not set
+-# CONFIG_ROMFS_FS is not set
++# CONFIG_DNOTIFY is not set
+ # CONFIG_INOTIFY is not set
+ # CONFIG_QUOTA is not set
+-# CONFIG_DNOTIFY is not set
+ # CONFIG_AUTOFS_FS is not set
+ # CONFIG_AUTOFS4_FS is not set
+ # CONFIG_FUSE_FS is not set
+@@ -861,7 +725,6 @@ CONFIG_TMPFS=y
+ # CONFIG_TMPFS_POSIX_ACL is not set
+ # CONFIG_HUGETLBFS is not set
+ # CONFIG_HUGETLB_PAGE is not set
+-CONFIG_RAMFS=y
+ # CONFIG_CONFIGFS_FS is not set
+ 
+ #
+@@ -874,26 +737,26 @@ CONFIG_RAMFS=y
+ # CONFIG_BEFS_FS is not set
+ # CONFIG_BFS_FS is not set
+ # CONFIG_EFS_FS is not set
+-# CONFIG_JFFS_FS is not set
+ CONFIG_JFFS2_FS=y
+ CONFIG_JFFS2_FS_DEBUG=0
+ CONFIG_JFFS2_FS_WRITEBUFFER=y
++# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
+ # CONFIG_JFFS2_SUMMARY is not set
+ # CONFIG_JFFS2_FS_XATTR is not set
+ # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
+ CONFIG_JFFS2_ZLIB=y
++# CONFIG_JFFS2_LZO is not set
+ CONFIG_JFFS2_RTIME=y
+ # CONFIG_JFFS2_RUBIN is not set
+ # CONFIG_CRAMFS is not set
+ # 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
+-
+-#
+-# Network File Systems
+-#
++CONFIG_NETWORK_FILESYSTEMS=y
+ # CONFIG_NFS_FS is not set
+ # CONFIG_NFSD is not set
+ # CONFIG_SMB_FS is not set
+@@ -901,55 +764,97 @@ CONFIG_JFFS2_RTIME=y
+ # CONFIG_NCP_FS is not set
+ # CONFIG_CODA_FS is not set
+ # CONFIG_AFS_FS is not set
+-# CONFIG_9P_FS is not set
+ 
+ #
+ # Partition Types
+ #
+ # CONFIG_PARTITION_ADVANCED is not set
+ CONFIG_MSDOS_PARTITION=y
+-
+-#
+-# Native Language Support
+-#
+ # CONFIG_NLS is not set
+-
+-#
+-# Profiling support
+-#
+-# CONFIG_PROFILING is not set
++# CONFIG_DLM is not set
+ 
+ #
+ # Kernel hacking
+ #
++CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+ # CONFIG_PRINTK_TIME is not set
++CONFIG_ENABLE_WARN_DEPRECATED=y
+ CONFIG_ENABLE_MUST_CHECK=y
+ # CONFIG_MAGIC_SYSRQ is not set
+ # CONFIG_UNUSED_SYMBOLS is not set
++CONFIG_DEBUG_FS=y
++# CONFIG_HEADERS_CHECK is not set
+ # CONFIG_DEBUG_KERNEL is not set
+-CONFIG_LOG_BUF_SHIFT=14
+ # CONFIG_DEBUG_BUGVERBOSE is not set
+-# CONFIG_DEBUG_FS is not set
++# CONFIG_SAMPLES is not set
+ # CONFIG_SH_STANDARD_BIOS is not set
+-# CONFIG_KGDB is not set
++# CONFIG_EARLY_SCIF_CONSOLE is not set
++# CONFIG_SH_KGDB is not set
+ 
+ #
+ # Security options
+ #
+ # CONFIG_KEYS is not set
+ # CONFIG_SECURITY is not set
+-
+-#
+-# Cryptographic options
+-#
+-# CONFIG_CRYPTO is not set
++# CONFIG_SECURITY_FILE_CAPABILITIES is not set
++CONFIG_CRYPTO=y
++# CONFIG_CRYPTO_SEQIV is not set
++# CONFIG_CRYPTO_MANAGER is not set
++# CONFIG_CRYPTO_HMAC is not set
++# CONFIG_CRYPTO_XCBC is not set
++# CONFIG_CRYPTO_NULL is not set
++# CONFIG_CRYPTO_MD4 is not set
++# CONFIG_CRYPTO_MD5 is not set
++# CONFIG_CRYPTO_SHA1 is not set
++# CONFIG_CRYPTO_SHA256 is not set
++# CONFIG_CRYPTO_SHA512 is not set
++# CONFIG_CRYPTO_WP512 is not set
++# CONFIG_CRYPTO_TGR192 is not set
++# CONFIG_CRYPTO_GF128MUL is not set
++# CONFIG_CRYPTO_ECB is not set
++# CONFIG_CRYPTO_CBC is not set
++# CONFIG_CRYPTO_PCBC is not set
++# CONFIG_CRYPTO_LRW is not set
++# CONFIG_CRYPTO_XTS is not set
++# CONFIG_CRYPTO_CTR is not set
++# CONFIG_CRYPTO_GCM is not set
++# CONFIG_CRYPTO_CCM is not set
++# CONFIG_CRYPTO_CRYPTD is not set
++# CONFIG_CRYPTO_DES is not set
++# CONFIG_CRYPTO_FCRYPT is not set
++# CONFIG_CRYPTO_BLOWFISH is not set
++# CONFIG_CRYPTO_TWOFISH is not set
++# CONFIG_CRYPTO_SERPENT is not set
++# CONFIG_CRYPTO_AES is not set
++# CONFIG_CRYPTO_CAST5 is not set
++# CONFIG_CRYPTO_CAST6 is not set
++# CONFIG_CRYPTO_TEA is not set
++# CONFIG_CRYPTO_ARC4 is not set
++# CONFIG_CRYPTO_KHAZAD is not set
++# CONFIG_CRYPTO_ANUBIS is not set
++# CONFIG_CRYPTO_SEED is not set
++# CONFIG_CRYPTO_SALSA20 is not set
++# CONFIG_CRYPTO_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=y
+ 
+ #
+ # Library routines
+ #
++CONFIG_BITREVERSE=y
+ # CONFIG_CRC_CCITT is not set
+ # CONFIG_CRC16 is not set
++# CONFIG_CRC_ITU_T is not set
+ CONFIG_CRC32=y
++# CONFIG_CRC7 is not set
+ # CONFIG_LIBCRC32C is not set
+ CONFIG_ZLIB_INFLATE=y
+ CONFIG_ZLIB_DEFLATE=y
++CONFIG_HAS_IOMEM=y
++CONFIG_HAS_IOPORT=y
++CONFIG_HAS_DMA=y
+diff --git a/arch/sh/kernel/cpu/init.c b/arch/sh/kernel/cpu/init.c
+index 80a3132..75fb03d 100644
+--- a/arch/sh/kernel/cpu/init.c
++++ b/arch/sh/kernel/cpu/init.c
+@@ -233,7 +233,7 @@ static void __init dsp_init(void)
+  * and cache configuration in detect_cpu_and_cache_system().
+  */
+ 
+-asmlinkage void __cpuinit sh_cpu_init(void)
++asmlinkage void __init sh_cpu_init(void)
+ {
+ 	current_thread_info()->cpu = hard_smp_processor_id();
+ 
+diff --git a/arch/sh/kernel/cpu/sh4/sq.c b/arch/sh/kernel/cpu/sh4/sq.c
+index 8250e01..9561b02 100644
+--- a/arch/sh/kernel/cpu/sh4/sq.c
++++ b/arch/sh/kernel/cpu/sh4/sq.c
+@@ -216,7 +216,7 @@ void sq_unmap(unsigned long vaddr)
+ 
+ 	if (unlikely(!map)) {
+ 		printk("%s: bad store queue address 0x%08lx\n",
+-		       __FUNCTION__, vaddr);
++		       __func__, vaddr);
+ 		return;
+ 	}
+ 
+@@ -233,7 +233,7 @@ void sq_unmap(unsigned long vaddr)
+ 		vma = remove_vm_area((void *)(map->sq_addr & PAGE_MASK));
+ 		if (!vma) {
+ 			printk(KERN_ERR "%s: bad address 0x%08lx\n",
+-			       __FUNCTION__, map->sq_addr);
++			       __func__, map->sq_addr);
+ 			return;
+ 		}
+ 	}
+diff --git a/arch/sh/kernel/cpu/sh5/unwind.c b/arch/sh/kernel/cpu/sh5/unwind.c
+index 119c20a..b205b25 100644
+--- a/arch/sh/kernel/cpu/sh5/unwind.c
++++ b/arch/sh/kernel/cpu/sh5/unwind.c
+@@ -149,7 +149,7 @@ static int lookup_prev_stack_frame(unsigned long fp, unsigned long pc,
+ 			if (dest >= 63) {
+ 				printk(KERN_NOTICE "%s: Invalid dest reg %d "
+ 				       "specified in movi handler. Failed "
+-				       "opcode was 0x%lx: ", __FUNCTION__,
++				       "opcode was 0x%lx: ", __func__,
+ 				       dest, op);
+ 
+ 				continue;
+diff --git a/arch/sh/kernel/io_trapped.c b/arch/sh/kernel/io_trapped.c
+index 86a665d..39cd7f3 100644
+--- a/arch/sh/kernel/io_trapped.c
++++ b/arch/sh/kernel/io_trapped.c
+@@ -32,7 +32,7 @@ EXPORT_SYMBOL_GPL(trapped_mem);
+ #endif
+ static DEFINE_SPINLOCK(trapped_lock);
+ 
+-int __init register_trapped_io(struct trapped_io *tiop)
++int register_trapped_io(struct trapped_io *tiop)
+ {
+ 	struct resource *res;
+ 	unsigned long len = 0, flags = 0;
+diff --git a/arch/sh/kernel/sh_ksyms_32.c b/arch/sh/kernel/sh_ksyms_32.c
+index e1a6de9..d80de39 100644
+--- a/arch/sh/kernel/sh_ksyms_32.c
++++ b/arch/sh/kernel/sh_ksyms_32.c
+@@ -111,9 +111,9 @@ DECLARE_EXPORT(__movmem_i4_even);
+ DECLARE_EXPORT(__movmem_i4_odd);
+ DECLARE_EXPORT(__movmemSI12_i4);
+ 
+-#if (__GNUC_MINOR__ == 2 || defined(__GNUC_STM_RELEASE__))
++#if (__GNUC_MINOR__ >= 2 || defined(__GNUC_STM_RELEASE__))
+ /*
+- * GCC 4.2 emits these for division, as do GCC 4.1.x versions of the ST
++ * GCC >= 4.2 emits these for division, as do GCC 4.1.x versions of the ST
+  * compiler which include backported patches.
+  */
+ DECLARE_EXPORT(__sdivsi3_i4i);
+@@ -146,5 +146,6 @@ EXPORT_SYMBOL(csum_partial_copy_generic);
+ EXPORT_SYMBOL(csum_ipv6_magic);
+ #endif
+ EXPORT_SYMBOL(clear_page);
++EXPORT_SYMBOL(copy_page);
+ EXPORT_SYMBOL(__clear_user);
+ EXPORT_SYMBOL(_ebss);
+diff --git a/arch/sh/kernel/sh_ksyms_64.c b/arch/sh/kernel/sh_ksyms_64.c
+index 8004c38..dd38a68 100644
+--- a/arch/sh/kernel/sh_ksyms_64.c
++++ b/arch/sh/kernel/sh_ksyms_64.c
+@@ -42,6 +42,7 @@ EXPORT_SYMBOL(__down_trylock);
+ EXPORT_SYMBOL(__up);
+ EXPORT_SYMBOL(__put_user_asm_l);
+ EXPORT_SYMBOL(__get_user_asm_l);
++EXPORT_SYMBOL(copy_page);
+ EXPORT_SYMBOL(__copy_user);
+ EXPORT_SYMBOL(memcpy);
+ EXPORT_SYMBOL(__udelay);
+diff --git a/arch/sh/kernel/timers/timer-cmt.c b/arch/sh/kernel/timers/timer-cmt.c
+index 7131232..d20c8c3 100644
+--- a/arch/sh/kernel/timers/timer-cmt.c
++++ b/arch/sh/kernel/timers/timer-cmt.c
+@@ -77,7 +77,7 @@ static unsigned long cmt_timer_get_offset(void)
+ 				count -= LATCH;
+ 			} else {
+ 				printk("%s (): hardware timer problem?\n",
+-				       __FUNCTION__);
++				       __func__);
+ 			}
+ 		}
+ 	} else
+diff --git a/arch/sh/kernel/timers/timer-mtu2.c b/arch/sh/kernel/timers/timer-mtu2.c
+index ade9d6e..fe453c0 100644
+--- a/arch/sh/kernel/timers/timer-mtu2.c
++++ b/arch/sh/kernel/timers/timer-mtu2.c
+@@ -76,7 +76,7 @@ static unsigned long mtu2_timer_get_offset(void)
+ 				count -= LATCH;
+ 			} else {
+ 				printk("%s (): hardware timer problem?\n",
+-				       __FUNCTION__);
++				       __func__);
+ 			}
+ 		}
+ 	} else
+diff --git a/arch/sh/kernel/topology.c b/arch/sh/kernel/topology.c
+index 9b5844a..0838942 100644
+--- a/arch/sh/kernel/topology.c
++++ b/arch/sh/kernel/topology.c
+@@ -29,7 +29,7 @@ static int __init topology_init(void)
+ 		ret = register_cpu(&per_cpu(cpu_devices, i), i);
+ 		if (unlikely(ret))
+ 			printk(KERN_WARNING "%s: register_cpu %d failed (%d)\n",
+-			       __FUNCTION__, i, ret);
++			       __func__, i, ret);
+ 	}
+ 
+ #if defined(CONFIG_NUMA) && !defined(CONFIG_SMP)
+diff --git a/arch/sh/kernel/traps_64.c b/arch/sh/kernel/traps_64.c
+index a55ac81..1b58a74 100644
+--- a/arch/sh/kernel/traps_64.c
++++ b/arch/sh/kernel/traps_64.c
+@@ -238,7 +238,7 @@ DO_ERROR(12, SIGILL,  "reserved instruction", reserved_inst, current)
+ /* Called with interrupts disabled */
+ asmlinkage void do_exception_error(unsigned long ex, struct pt_regs *regs)
+ {
+-	show_excp_regs(__FUNCTION__, -1, -1, regs);
++	show_excp_regs(__func__, -1, -1, regs);
+ 	die_if_kernel("exception", regs, ex);
+ }
+ 
+diff --git a/arch/sh/lib64/c-checksum.c b/arch/sh/lib64/c-checksum.c
+index 5dfbd8b..5c284e0 100644
+--- a/arch/sh/lib64/c-checksum.c
++++ b/arch/sh/lib64/c-checksum.c
+@@ -207,7 +207,7 @@ __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr,
+ 	result = (result & 0xffffffff) + (result >> 32);
+ 
+ 	pr_debug("%s saddr %x daddr %x len %x proto %x sum %x result %08Lx\n",
+-		__FUNCTION__, saddr, daddr, len, proto, sum, result);
++		__func__, saddr, daddr, len, proto, sum, result);
+ 
+ 	return (__wsum)result;
+ }
+diff --git a/arch/sh/lib64/udelay.c b/arch/sh/lib64/udelay.c
+index 23c7d17..d76bd80 100644
+--- a/arch/sh/lib64/udelay.c
++++ b/arch/sh/lib64/udelay.c
+@@ -21,7 +21,7 @@
+  * a 1GHz box, that's about 2 seconds.
+  */
+ 
+-void __delay(int loops)
++void __delay(unsigned long loops)
+ {
+ 	long long dummy;
+ 	__asm__ __volatile__("gettr	tr0, %1\n\t"
+@@ -33,24 +33,17 @@ void __delay(int loops)
+ 			     :"0"(loops));
+ }
+ 
+-void __udelay(unsigned long long usecs, unsigned long lpj)
++inline void __const_udelay(unsigned long xloops)
+ {
+-	usecs *= (((unsigned long long) HZ << 32) / 1000000) * lpj;
+-	__delay((long long) usecs >> 32);
++	__delay(xloops * (HZ * cpu_data[raw_smp_processor_id()].loops_per_jiffy));
+ }
+ 
+-void __ndelay(unsigned long long nsecs, unsigned long lpj)
++void __udelay(unsigned long usecs)
+ {
+-	nsecs *= (((unsigned long long) HZ << 32) / 1000000000) * lpj;
+-	__delay((long long) nsecs >> 32);
++	__const_udelay(usecs * 0x000010c6);  /* 2**32 / 1000000 */
+ }
+ 
+-void udelay(unsigned long usecs)
++void __ndelay(unsigned long nsecs)
+ {
+-	__udelay(usecs, cpu_data[raw_smp_processor_id()].loops_per_jiffy);
+-}
+-
+-void ndelay(unsigned long nsecs)
+-{
+-	__ndelay(nsecs, cpu_data[raw_smp_processor_id()].loops_per_jiffy);
++	__const_udelay(nsecs * 0x00000005);
+ }
+diff --git a/arch/sh/mm/Kconfig b/arch/sh/mm/Kconfig
+index f549b8c..5fd2184 100644
+--- a/arch/sh/mm/Kconfig
++++ b/arch/sh/mm/Kconfig
+@@ -59,7 +59,7 @@ config 32BIT
+ 
+ config PMB
+ 	bool "Support 32-bit physical addressing through PMB"
+-	depends on MMU && (CPU_SUBTYPE_SH7780 || CPU_SUBTYPE_SH7785)
++	depends on MMU && EXPERIMENTAL && (CPU_SUBTYPE_SH7780 || CPU_SUBTYPE_SH7785)
+ 	select 32BIT
+ 	default y
+ 	help
+diff --git a/arch/sh/mm/init.c b/arch/sh/mm/init.c
+index e2ed6dd..53dde06 100644
+--- a/arch/sh/mm/init.c
++++ b/arch/sh/mm/init.c
+@@ -328,7 +328,7 @@ int arch_add_memory(int nid, u64 start, u64 size)
+ 	/* We only have ZONE_NORMAL, so this is easy.. */
+ 	ret = __add_pages(pgdat->node_zones + ZONE_NORMAL, start_pfn, nr_pages);
+ 	if (unlikely(ret))
+-		printk("%s: Failed, __add_pages() == %d\n", __FUNCTION__, ret);
++		printk("%s: Failed, __add_pages() == %d\n", __func__, ret);
+ 
+ 	return ret;
+ }
+diff --git a/arch/sh/mm/ioremap_32.c b/arch/sh/mm/ioremap_32.c
+index 0c7b7e3..882a32e 100644
+--- a/arch/sh/mm/ioremap_32.c
++++ b/arch/sh/mm/ioremap_32.c
+@@ -141,7 +141,7 @@ void __iounmap(void __iomem *addr)
+ 
+ 	p = remove_vm_area((void *)(vaddr & PAGE_MASK));
+ 	if (!p) {
+-		printk(KERN_ERR "%s: bad address %p\n", __FUNCTION__, addr);
++		printk(KERN_ERR "%s: bad address %p\n", __func__, addr);
+ 		return;
+ 	}
+ 
+diff --git a/arch/sh/mm/ioremap_64.c b/arch/sh/mm/ioremap_64.c
+index e27d165..cea224c 100644
+--- a/arch/sh/mm/ioremap_64.c
++++ b/arch/sh/mm/ioremap_64.c
+@@ -178,7 +178,7 @@ static unsigned long shmedia_alloc_io(unsigned long phys, unsigned long size,
+         } else {
+                 if (!printed_full) {
+                         printk("%s: done with statics, switching to kmalloc\n",
+-			       __FUNCTION__);
++			       __func__);
+                         printed_full = 1;
+                 }
+                 tlen = strlen(name);
+@@ -352,7 +352,7 @@ void onchip_unmap(unsigned long vaddr)
+ 	res = shmedia_find_resource(&shmedia_iomap, vaddr);
+ 	if (!res) {
+ 		printk(KERN_ERR "%s: Failed to free 0x%08lx\n",
+-		       __FUNCTION__, vaddr);
++		       __func__, vaddr);
+ 		return;
+ 	}
+ 
+diff --git a/arch/sh/mm/pg-sh7705.c b/arch/sh/mm/pg-sh7705.c
+index a4b015f..7f885b7 100644
+--- a/arch/sh/mm/pg-sh7705.c
++++ b/arch/sh/mm/pg-sh7705.c
+@@ -14,6 +14,7 @@
+ #include <linux/mman.h>
+ #include <linux/mm.h>
+ #include <linux/threads.h>
++#include <linux/fs.h>
+ #include <asm/addrspace.h>
+ #include <asm/page.h>
+ #include <asm/pgtable.h>
+diff --git a/arch/sh/mm/tlbflush_64.c b/arch/sh/mm/tlbflush_64.c
+index 2a98c9e..7876997 100644
+--- a/arch/sh/mm/tlbflush_64.c
++++ b/arch/sh/mm/tlbflush_64.c
+@@ -131,7 +131,7 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long writeaccess,
+ #ifdef DEBUG_FAULT
+ 		print_task(tsk);
+ 		printk("%s:%d fault, address is 0x%08x PC %016Lx textaccess %d writeaccess %d\n",
+-		       __FUNCTION__,__LINE__,
++		       __func__, __LINE__,
+ 		       address,regs->pc,textaccess,writeaccess);
+ 		show_regs(regs);
+ #endif
+@@ -145,7 +145,7 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long writeaccess,
+ #ifdef DEBUG_FAULT
+ 		print_task(tsk);
+ 		printk("%s:%d fault, address is 0x%08x PC %016Lx textaccess %d writeaccess %d\n",
+-		       __FUNCTION__,__LINE__,
++		       __func__, __LINE__,
+ 		       address,regs->pc,textaccess,writeaccess);
+ 		show_regs(regs);
+ 
+@@ -157,7 +157,7 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long writeaccess,
+ #ifdef DEBUG_FAULT
+ 		print_task(tsk);
+ 		printk("%s:%d fault, address is 0x%08x PC %016Lx textaccess %d writeaccess %d\n",
+-		       __FUNCTION__,__LINE__,
++		       __func__, __LINE__,
+ 		       address,regs->pc,textaccess,writeaccess);
+ 		show_regs(regs);
+ #endif
+diff --git a/arch/sh/tools/mach-types b/arch/sh/tools/mach-types
+index 67997af..d63b93d 100644
+--- a/arch/sh/tools/mach-types
++++ b/arch/sh/tools/mach-types
+@@ -38,7 +38,6 @@ R7780MP			SH_R7780MP
+ R7785RP			SH_R7785RP
+ TITAN			SH_TITAN
+ SHMIN			SH_SHMIN
+-7710VOIPGW		SH_7710VOIPGW
+ LBOXRE2			SH_LBOX_RE2
+ X3PROTO			SH_X3PROTO
+ MAGICPANELR2		SH_MAGIC_PANEL_R2
+diff --git a/arch/x86/boot/vesa.h b/arch/x86/boot/vesa.h
+index ff5b73c..468e444 100644
+--- a/arch/x86/boot/vesa.h
++++ b/arch/x86/boot/vesa.h
+@@ -26,17 +26,10 @@ struct vesa_general_info {
+ 	far_ptr video_mode_ptr;	/* 14 */
+ 	u16 total_memory;	/* 18 */
+ 
+-	u16 oem_software_rev;	/* 20 */
+-	far_ptr oem_vendor_name_ptr;	/* 22 */
+-	far_ptr oem_product_name_ptr;	/* 26 */
+-	far_ptr oem_product_rev_ptr;	/* 30 */
+-
+-	u8 reserved[222];	/* 34 */
+-	u8 oem_data[256];	/* 256 */
++	u8 reserved[236];	/* 20 */
+ } __attribute__ ((packed));
+ 
+ #define VESA_MAGIC ('V' + ('E' << 8) + ('S' << 16) + ('A' << 24))
+-#define VBE2_MAGIC ('V' + ('B' << 8) + ('E' << 16) + ('2' << 24))
+ 
+ struct vesa_mode_info {
+ 	u16 mode_attr;		/* 0 */
+diff --git a/arch/x86/boot/video-vesa.c b/arch/x86/boot/video-vesa.c
+index 662dd2f..419b5c2 100644
+--- a/arch/x86/boot/video-vesa.c
++++ b/arch/x86/boot/video-vesa.c
+@@ -37,8 +37,6 @@ static int vesa_probe(void)
+ 
+ 	video_vesa.modes = GET_HEAP(struct mode_info, 0);
+ 
+-	vginfo.signature = VBE2_MAGIC;
+-
+ 	ax = 0x4f00;
+ 	di = (size_t)&vginfo;
+ 	asm(INT10
+diff --git a/arch/x86/ia32/ia32_signal.c b/arch/x86/ia32/ia32_signal.c
+index 1c0503b..5e7771a 100644
+--- a/arch/x86/ia32/ia32_signal.c
++++ b/arch/x86/ia32/ia32_signal.c
+@@ -500,7 +500,7 @@ int ia32_setup_frame(int sig, struct k_sigaction *ka,
+ 	regs->ss = __USER32_DS;
+ 
+ 	set_fs(USER_DS);
+-	regs->flags &= ~X86_EFLAGS_TF;
++	regs->flags &= ~(X86_EFLAGS_TF | X86_EFLAGS_DF);
+ 	if (test_thread_flag(TIF_SINGLESTEP))
+ 		ptrace_notify(SIGTRAP);
+ 
+@@ -600,7 +600,7 @@ int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
+ 	regs->ss = __USER32_DS;
+ 
+ 	set_fs(USER_DS);
+-	regs->flags &= ~X86_EFLAGS_TF;
++	regs->flags &= ~(X86_EFLAGS_TF | X86_EFLAGS_DF);
+ 	if (test_thread_flag(TIF_SINGLESTEP))
+ 		ptrace_notify(SIGTRAP);
+ 
+diff --git a/arch/x86/kernel/cpu/cpufreq/e_powersaver.c b/arch/x86/kernel/cpu/cpufreq/e_powersaver.c
+index 39f8cb1..c2f930d 100644
+--- a/arch/x86/kernel/cpu/cpufreq/e_powersaver.c
++++ b/arch/x86/kernel/cpu/cpufreq/e_powersaver.c
+@@ -55,7 +55,6 @@ static int eps_set_state(struct eps_cpu_data *centaur,
+ {
+ 	struct cpufreq_freqs freqs;
+ 	u32 lo, hi;
+-	u8 current_multiplier, current_voltage;
+ 	int err = 0;
+ 	int i;
+ 
+@@ -95,6 +94,10 @@ postchange:
+ 	rdmsr(MSR_IA32_PERF_STATUS, lo, hi);
+ 	freqs.new = centaur->fsb * ((lo >> 8) & 0xff);
+ 
++#ifdef DEBUG
++	{
++	u8 current_multiplier, current_voltage;
++
+ 	/* Print voltage and multiplier */
+ 	rdmsr(MSR_IA32_PERF_STATUS, lo, hi);
+ 	current_voltage = lo & 0xff;
+@@ -103,7 +106,8 @@ postchange:
+ 	current_multiplier = (lo >> 8) & 0xff;
+ 	printk(KERN_INFO "eps: Current multiplier = %d\n",
+ 		current_multiplier);
+-
++	}
++#endif
+ 	cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
+ 	return err;
+ }
+diff --git a/arch/x86/kernel/i387.c b/arch/x86/kernel/i387.c
+index 60fe801..d2e39e6 100644
+--- a/arch/x86/kernel/i387.c
++++ b/arch/x86/kernel/i387.c
+@@ -261,7 +261,7 @@ static void convert_from_fxsr(struct user_i387_ia32_struct *env,
+ 	}
+ #else
+ 	env->fip = fxsave->fip;
+-	env->fcs = fxsave->fcs;
++	env->fcs = (u16) fxsave->fcs | ((u32) fxsave->fop << 16);
+ 	env->foo = fxsave->foo;
+ 	env->fos = fxsave->fos;
+ #endif
+diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c
+index f41fdc9..8f64abe 100644
+--- a/arch/x86/kernel/ptrace.c
++++ b/arch/x86/kernel/ptrace.c
+@@ -323,6 +323,16 @@ static int putreg(struct task_struct *child,
+ 		return set_flags(child, value);
+ 
+ #ifdef CONFIG_X86_64
++	/*
++	 * Orig_ax is really just a flag with small positive and
++	 * negative values, so make sure to always sign-extend it
++	 * from 32 bits so that it works correctly regardless of
++	 * whether we come from a 32-bit environment or not.
++	 */
++	case offsetof(struct user_regs_struct, orig_ax):
++		value = (long) (s32) value;
++		break;
++
+ 	case offsetof(struct user_regs_struct,fs_base):
+ 		if (value >= TASK_SIZE_OF(child))
+ 			return -EIO;
+diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c
+index 7fd6ac4..55ceb8c 100644
+--- a/arch/x86/kernel/reboot.c
++++ b/arch/x86/kernel/reboot.c
+@@ -326,6 +326,10 @@ static inline void kb_wait(void)
+ 	}
+ }
+ 
++void __attribute__((weak)) mach_reboot_fixups(void)
++{
++}
++
+ static void native_machine_emergency_restart(void)
+ {
+ 	int i;
+@@ -337,6 +341,8 @@ static void native_machine_emergency_restart(void)
+ 		/* Could also try the reset bit in the Hammer NB */
+ 		switch (reboot_type) {
+ 		case BOOT_KBD:
++			mach_reboot_fixups(); /* for board specific fixups */
++
+ 			for (i = 0; i < 10; i++) {
+ 				kb_wait();
+ 				udelay(50);
+diff --git a/arch/x86/kernel/signal_32.c b/arch/x86/kernel/signal_32.c
+index caee1f0..0157a6f 100644
+--- a/arch/x86/kernel/signal_32.c
++++ b/arch/x86/kernel/signal_32.c
+@@ -407,7 +407,7 @@ static int setup_frame(int sig, struct k_sigaction *ka,
+ 	 * The tracer may want to single-step inside the
+ 	 * handler too.
+ 	 */
+-	regs->flags &= ~TF_MASK;
++	regs->flags &= ~(TF_MASK | X86_EFLAGS_DF);
+ 	if (test_thread_flag(TIF_SINGLESTEP))
+ 		ptrace_notify(SIGTRAP);
+ 
+@@ -500,7 +500,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
+ 	 * The tracer may want to single-step inside the
+ 	 * handler too.
+ 	 */
+-	regs->flags &= ~TF_MASK;
++	regs->flags &= ~(TF_MASK | X86_EFLAGS_DF);
+ 	if (test_thread_flag(TIF_SINGLESTEP))
+ 		ptrace_notify(SIGTRAP);
+ 
+diff --git a/arch/x86/kernel/signal_64.c b/arch/x86/kernel/signal_64.c
+index 7347bb1..56b72fb 100644
+--- a/arch/x86/kernel/signal_64.c
++++ b/arch/x86/kernel/signal_64.c
+@@ -295,7 +295,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
+ 	   see include/asm-x86_64/uaccess.h for details. */
+ 	set_fs(USER_DS);
+ 
+-	regs->flags &= ~X86_EFLAGS_TF;
++	regs->flags &= ~(X86_EFLAGS_TF | X86_EFLAGS_DF);
+ 	if (test_thread_flag(TIF_SINGLESTEP))
+ 		ptrace_notify(SIGTRAP);
+ #ifdef DEBUG_SIG
+diff --git a/arch/x86/kernel/step.c b/arch/x86/kernel/step.c
+index 2ef1a5f..9d406cd 100644
+--- a/arch/x86/kernel/step.c
++++ b/arch/x86/kernel/step.c
+@@ -166,7 +166,7 @@ static void enable_step(struct task_struct *child, bool block)
+ 				  child->thread.debugctlmsr | DEBUGCTLMSR_BTF);
+ 	} else {
+ 	    write_debugctlmsr(child,
+-			      child->thread.debugctlmsr & ~TIF_DEBUGCTLMSR);
++			      child->thread.debugctlmsr & ~DEBUGCTLMSR_BTF);
+ 
+ 	    if (!child->thread.debugctlmsr)
+ 		    clear_tsk_thread_flag(child, TIF_DEBUGCTLMSR);
+@@ -189,7 +189,7 @@ void user_disable_single_step(struct task_struct *child)
+ 	 * Make sure block stepping (BTF) is disabled.
+ 	 */
+ 	write_debugctlmsr(child,
+-			  child->thread.debugctlmsr & ~TIF_DEBUGCTLMSR);
++			  child->thread.debugctlmsr & ~DEBUGCTLMSR_BTF);
+ 
+ 	if (!child->thread.debugctlmsr)
+ 		clear_tsk_thread_flag(child, TIF_DEBUGCTLMSR);
+diff --git a/crypto/Kconfig b/crypto/Kconfig
+index 898acc5..69f1be6 100644
+--- a/crypto/Kconfig
++++ b/crypto/Kconfig
+@@ -575,6 +575,7 @@ config CRYPTO_TEST
+ config CRYPTO_AUTHENC
+ 	tristate "Authenc support"
+ 	select CRYPTO_AEAD
++	select CRYPTO_BLKCIPHER
+ 	select CRYPTO_MANAGER
+ 	select CRYPTO_HASH
+ 	help
+diff --git a/crypto/Makefile b/crypto/Makefile
+index 48c7583..7cf3625 100644
+--- a/crypto/Makefile
++++ b/crypto/Makefile
+@@ -12,9 +12,9 @@ obj-$(CONFIG_CRYPTO_AEAD) += aead.o
+ 
+ crypto_blkcipher-objs := ablkcipher.o
+ crypto_blkcipher-objs += blkcipher.o
++crypto_blkcipher-objs += chainiv.o
++crypto_blkcipher-objs += eseqiv.o
+ obj-$(CONFIG_CRYPTO_BLKCIPHER) += crypto_blkcipher.o
+-obj-$(CONFIG_CRYPTO_BLKCIPHER) += chainiv.o
+-obj-$(CONFIG_CRYPTO_BLKCIPHER) += eseqiv.o
+ obj-$(CONFIG_CRYPTO_SEQIV) += seqiv.o
+ 
+ crypto_hash-objs := hash.o
+diff --git a/crypto/ablkcipher.c b/crypto/ablkcipher.c
+index 3bcb099..94140b3 100644
+--- a/crypto/ablkcipher.c
++++ b/crypto/ablkcipher.c
+@@ -341,6 +341,3 @@ err:
+ 	return ERR_PTR(err);
+ }
+ EXPORT_SYMBOL_GPL(crypto_alloc_ablkcipher);
+-
+-MODULE_LICENSE("GPL");
+-MODULE_DESCRIPTION("Asynchronous block chaining cipher type");
+diff --git a/crypto/blkcipher.c b/crypto/blkcipher.c
+index 4a7e65c..185f955 100644
+--- a/crypto/blkcipher.c
++++ b/crypto/blkcipher.c
+@@ -696,5 +696,34 @@ void skcipher_geniv_exit(struct crypto_tfm *tfm)
+ }
+ EXPORT_SYMBOL_GPL(skcipher_geniv_exit);
+ 
++static int __init blkcipher_module_init(void)
++{
++	int err;
++
++	err = chainiv_module_init();
++	if (err)
++		goto out;
++
++	err = eseqiv_module_init();
++	if (err)
++		goto eseqiv_err;
++
++out:
++	return err;
++
++eseqiv_err:
++	chainiv_module_exit();
++	goto out;
++}
++
++static void __exit blkcipher_module_exit(void)
++{
++	eseqiv_module_exit();
++	chainiv_module_exit();
++}
++
++module_init(blkcipher_module_init);
++module_exit(blkcipher_module_exit);
++
+ MODULE_LICENSE("GPL");
+ MODULE_DESCRIPTION("Generic block chaining cipher type");
+diff --git a/crypto/chainiv.c b/crypto/chainiv.c
+index d17fa04..0a7cac6 100644
+--- a/crypto/chainiv.c
++++ b/crypto/chainiv.c
+@@ -314,18 +314,14 @@ static struct crypto_template chainiv_tmpl = {
+ 	.module = THIS_MODULE,
+ };
+ 
+-static int __init chainiv_module_init(void)
++int __init chainiv_module_init(void)
+ {
+ 	return crypto_register_template(&chainiv_tmpl);
+ }
++EXPORT_SYMBOL_GPL(chainiv_module_init);
+ 
+-static void __exit chainiv_module_exit(void)
++void __exit chainiv_module_exit(void)
+ {
+ 	crypto_unregister_template(&chainiv_tmpl);
+ }
+-
+-module_init(chainiv_module_init);
+-module_exit(chainiv_module_exit);
+-
+-MODULE_LICENSE("GPL");
+-MODULE_DESCRIPTION("Chain IV Generator");
++EXPORT_SYMBOL_GPL(chainiv_module_exit);
+diff --git a/crypto/digest.c b/crypto/digest.c
+index 6fd43bd..b526cc3 100644
+--- a/crypto/digest.c
++++ b/crypto/digest.c
+@@ -21,6 +21,8 @@
+ #include <linux/module.h>
+ #include <linux/scatterlist.h>
+ 
++#include "internal.h"
++
+ static int init(struct hash_desc *desc)
+ {
+ 	struct crypto_tfm *tfm = crypto_hash_tfm(desc->tfm);
+diff --git a/crypto/eseqiv.c b/crypto/eseqiv.c
+index eb90d27..6f2cd06 100644
+--- a/crypto/eseqiv.c
++++ b/crypto/eseqiv.c
+@@ -247,18 +247,14 @@ static struct crypto_template eseqiv_tmpl = {
+ 	.module = THIS_MODULE,
+ };
+ 
+-static int __init eseqiv_module_init(void)
++int __init eseqiv_module_init(void)
+ {
+ 	return crypto_register_template(&eseqiv_tmpl);
+ }
++EXPORT_SYMBOL_GPL(eseqiv_module_init);
+ 
+-static void __exit eseqiv_module_exit(void)
++void __exit eseqiv_module_exit(void)
+ {
+ 	crypto_unregister_template(&eseqiv_tmpl);
+ }
+-
+-module_init(eseqiv_module_init);
+-module_exit(eseqiv_module_exit);
+-
+-MODULE_LICENSE("GPL");
+-MODULE_DESCRIPTION("Encrypted Sequence Number IV Generator");
++EXPORT_SYMBOL_GPL(eseqiv_module_exit);
+diff --git a/crypto/xcbc.c b/crypto/xcbc.c
+index 8672740..2feb0f2 100644
+--- a/crypto/xcbc.c
++++ b/crypto/xcbc.c
+@@ -124,6 +124,11 @@ static int crypto_xcbc_digest_update2(struct hash_desc *pdesc,
+ 		unsigned int offset = sg[i].offset;
+ 		unsigned int slen = sg[i].length;
+ 
++		if (unlikely(slen > nbytes))
++			slen = nbytes;
++
++		nbytes -= slen;
++
+ 		while (slen > 0) {
+ 			unsigned int len = min(slen, ((unsigned int)(PAGE_SIZE)) - offset);
+ 			char *p = crypto_kmap(pg, 0) + offset;
+@@ -177,7 +182,6 @@ static int crypto_xcbc_digest_update2(struct hash_desc *pdesc,
+ 			offset = 0;
+ 			pg++;
+ 		}
+-		nbytes-=sg[i].length;
+ 		i++;
+ 	} while (nbytes>0);
+ 
+diff --git a/crypto/xts.c b/crypto/xts.c
+index 8eb08bf..d87b0f3 100644
+--- a/crypto/xts.c
++++ b/crypto/xts.c
+@@ -77,16 +77,16 @@ static int setkey(struct crypto_tfm *parent, const u8 *key,
+ }
+ 
+ struct sinfo {
+-	be128 t;
++	be128 *t;
+ 	struct crypto_tfm *tfm;
+ 	void (*fn)(struct crypto_tfm *, u8 *, const u8 *);
+ };
+ 
+ static inline void xts_round(struct sinfo *s, void *dst, const void *src)
+ {
+-	be128_xor(dst, &s->t, src);		/* PP <- T xor P */
++	be128_xor(dst, s->t, src);		/* PP <- T xor P */
+ 	s->fn(s->tfm, dst, dst);		/* CC <- E(Key1,PP) */
+-	be128_xor(dst, dst, &s->t);		/* C <- T xor CC */
++	be128_xor(dst, dst, s->t);		/* C <- T xor CC */
+ }
+ 
+ static int crypt(struct blkcipher_desc *d,
+@@ -101,7 +101,6 @@ static int crypt(struct blkcipher_desc *d,
+ 		.tfm = crypto_cipher_tfm(ctx->child),
+ 		.fn = fn
+ 	};
+-	be128 *iv;
+ 	u8 *wsrc;
+ 	u8 *wdst;
+ 
+@@ -109,20 +108,20 @@ static int crypt(struct blkcipher_desc *d,
+ 	if (!w->nbytes)
+ 		return err;
+ 
++	s.t = (be128 *)w->iv;
+ 	avail = w->nbytes;
+ 
+ 	wsrc = w->src.virt.addr;
+ 	wdst = w->dst.virt.addr;
+ 
+ 	/* calculate first value of T */
+-	iv = (be128 *)w->iv;
+-	tw(crypto_cipher_tfm(ctx->tweak), (void *)&s.t, w->iv);
++	tw(crypto_cipher_tfm(ctx->tweak), w->iv, w->iv);
+ 
+ 	goto first;
+ 
+ 	for (;;) {
+ 		do {
+-			gf128mul_x_ble(&s.t, &s.t);
++			gf128mul_x_ble(s.t, s.t);
+ 
+ first:
+ 			xts_round(&s, wdst, wsrc);
+diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
+index 1db93b6..8a49835 100644
+--- a/drivers/ata/ahci.c
++++ b/drivers/ata/ahci.c
+@@ -186,6 +186,7 @@ enum {
+ 	AHCI_HFLAG_NO_MSI		= (1 << 5), /* no PCI MSI */
+ 	AHCI_HFLAG_NO_PMP		= (1 << 6), /* no PMP */
+ 	AHCI_HFLAG_NO_HOTPLUG		= (1 << 7), /* ignore PxSERR.DIAG.N */
++	AHCI_HFLAG_SECT255		= (1 << 8), /* max 255 sectors */
+ 
+ 	/* ap->flags bits */
+ 
+@@ -255,6 +256,7 @@ static void ahci_vt8251_error_handler(struct ata_port *ap);
+ static void ahci_p5wdh_error_handler(struct ata_port *ap);
+ static void ahci_post_internal_cmd(struct ata_queued_cmd *qc);
+ static int ahci_port_resume(struct ata_port *ap);
++static void ahci_dev_config(struct ata_device *dev);
+ static unsigned int ahci_fill_sg(struct ata_queued_cmd *qc, void *cmd_tbl);
+ static void ahci_fill_cmd_slot(struct ahci_port_priv *pp, unsigned int tag,
+ 			       u32 opts);
+@@ -294,6 +296,8 @@ static const struct ata_port_operations ahci_ops = {
+ 	.check_altstatus	= ahci_check_status,
+ 	.dev_select		= ata_noop_dev_select,
+ 
++	.dev_config		= ahci_dev_config,
++
+ 	.tf_read		= ahci_tf_read,
+ 
+ 	.qc_defer		= sata_pmp_qc_defer_cmd_switch,
+@@ -425,7 +429,7 @@ static const struct ata_port_info ahci_port_info[] = {
+ 	/* board_ahci_sb600 */
+ 	{
+ 		AHCI_HFLAGS	(AHCI_HFLAG_IGN_SERR_INTERNAL |
+-				 AHCI_HFLAG_32BIT_ONLY | AHCI_HFLAG_NO_PMP),
++				 AHCI_HFLAG_SECT255 | AHCI_HFLAG_NO_PMP),
+ 		.flags		= AHCI_FLAG_COMMON,
+ 		.link_flags	= AHCI_LFLAG_COMMON,
+ 		.pio_mask	= 0x1f, /* pio0-4 */
+@@ -1176,6 +1180,14 @@ static void ahci_init_controller(struct ata_host *host)
+ 	VPRINTK("HOST_CTL 0x%x\n", tmp);
+ }
+ 
++static void ahci_dev_config(struct ata_device *dev)
++{
++	struct ahci_host_priv *hpriv = dev->link->ap->host->private_data;
++
++	if (hpriv->flags & AHCI_HFLAG_SECT255)
++		dev->max_sectors = 255;
++}
++
+ static unsigned int ahci_dev_classify(struct ata_port *ap)
+ {
+ 	void __iomem *port_mmio = ahci_port_base(ap);
+diff --git a/drivers/ata/pata_hpt366.c b/drivers/ata/pata_hpt366.c
+index 0713872..a742efa 100644
+--- a/drivers/ata/pata_hpt366.c
++++ b/drivers/ata/pata_hpt366.c
+@@ -27,7 +27,7 @@
+ #include <linux/libata.h>
+ 
+ #define DRV_NAME	"pata_hpt366"
+-#define DRV_VERSION	"0.6.1"
++#define DRV_VERSION	"0.6.2"
+ 
+ struct hpt_clock {
+ 	u8	xfer_speed;
+@@ -180,9 +180,9 @@ static unsigned long hpt366_filter(struct ata_device *adev, unsigned long mask)
+ 		if (hpt_dma_blacklisted(adev, "UDMA",  bad_ata33))
+ 			mask &= ~ATA_MASK_UDMA;
+ 		if (hpt_dma_blacklisted(adev, "UDMA3", bad_ata66_3))
+-			mask &= ~(0x07 << ATA_SHIFT_UDMA);
++			mask &= ~(0xF8 << ATA_SHIFT_UDMA);
+ 		if (hpt_dma_blacklisted(adev, "UDMA4", bad_ata66_4))
+-			mask &= ~(0x0F << ATA_SHIFT_UDMA);
++			mask &= ~(0xF0 << ATA_SHIFT_UDMA);
+ 	}
+ 	return ata_pci_default_filter(adev, mask);
+ }
+diff --git a/drivers/ata/pata_hpt37x.c b/drivers/ata/pata_hpt37x.c
+index 68eb349..9a10878 100644
+--- a/drivers/ata/pata_hpt37x.c
++++ b/drivers/ata/pata_hpt37x.c
+@@ -24,7 +24,7 @@
+ #include <linux/libata.h>
+ 
+ #define DRV_NAME	"pata_hpt37x"
+-#define DRV_VERSION	"0.6.9"
++#define DRV_VERSION	"0.6.11"
+ 
+ struct hpt_clock {
+ 	u8	xfer_speed;
+@@ -281,7 +281,7 @@ static unsigned long hpt370_filter(struct ata_device *adev, unsigned long mask)
+ 		if (hpt_dma_blacklisted(adev, "UDMA", bad_ata33))
+ 			mask &= ~ATA_MASK_UDMA;
+ 		if (hpt_dma_blacklisted(adev, "UDMA100", bad_ata100_5))
+-			mask &= ~(0x1F << ATA_SHIFT_UDMA);
++			mask &= ~(0xE0 << ATA_SHIFT_UDMA);
+ 	}
+ 	return ata_pci_default_filter(adev, mask);
+ }
+@@ -297,7 +297,7 @@ static unsigned long hpt370a_filter(struct ata_device *adev, unsigned long mask)
+ {
+ 	if (adev->class == ATA_DEV_ATA) {
+ 		if (hpt_dma_blacklisted(adev, "UDMA100", bad_ata100_5))
+-			mask &= ~ (0x1F << ATA_SHIFT_UDMA);
++			mask &= ~(0xE0 << ATA_SHIFT_UDMA);
+ 	}
+ 	return ata_pci_default_filter(adev, mask);
+ }
+diff --git a/drivers/ata/pata_serverworks.c b/drivers/ata/pata_serverworks.c
+index 9c523fb..a589c0f 100644
+--- a/drivers/ata/pata_serverworks.c
++++ b/drivers/ata/pata_serverworks.c
+@@ -226,7 +226,7 @@ static unsigned long serverworks_csb_filter(struct ata_device *adev, unsigned lo
+ 
+ 	for (i = 0; (p = csb_bad_ata100[i]) != NULL; i++) {
+ 		if (!strcmp(p, model_num))
+-			mask &= ~(0x1F << ATA_SHIFT_UDMA);
++			mask &= ~(0xE0 << ATA_SHIFT_UDMA);
+ 	}
+ 	return ata_pci_default_filter(adev, mask);
+ }
+diff --git a/drivers/bluetooth/hci_usb.c b/drivers/bluetooth/hci_usb.c
+index 372c7ef..f16c94c 100644
+--- a/drivers/bluetooth/hci_usb.c
++++ b/drivers/bluetooth/hci_usb.c
+@@ -116,6 +116,7 @@ static struct usb_device_id blacklist_ids[] = {
+ 	{ USB_DEVICE(0x0a5c, 0x2009), .driver_info = HCI_BCM92035 },
+ 
+ 	/* Broadcom BCM2045 */
++	{ USB_DEVICE(0x0a5c, 0x2039), .driver_info = HCI_RESET | HCI_WRONG_SCO_MTU },
+ 	{ USB_DEVICE(0x0a5c, 0x2101), .driver_info = HCI_RESET | HCI_WRONG_SCO_MTU },
+ 
+ 	/* IBM/Lenovo ThinkPad with Broadcom chip */
+diff --git a/drivers/char/esp.c b/drivers/char/esp.c
+index c01e26d..f3fe620 100644
+--- a/drivers/char/esp.c
++++ b/drivers/char/esp.c
+@@ -2484,6 +2484,7 @@ static int __init espserial_init(void)
+ 			return 0;
+ 		}
+ 
++		spin_lock_init(&info->lock);
+ 		/* rx_trigger, tx_trigger are needed by autoconfig */
+ 		info->config.rx_trigger = rx_trigger;
+ 		info->config.tx_trigger = tx_trigger;
+diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
+index 89a29cd..35a26a3 100644
+--- a/drivers/cpufreq/cpufreq.c
++++ b/drivers/cpufreq/cpufreq.c
+@@ -671,13 +671,13 @@ static ssize_t show(struct kobject * kobj, struct attribute * attr ,char * buf)
+ {
+ 	struct cpufreq_policy * policy = to_policy(kobj);
+ 	struct freq_attr * fattr = to_attr(attr);
+-	ssize_t ret;
++	ssize_t ret = -EINVAL;
+ 	policy = cpufreq_cpu_get(policy->cpu);
+ 	if (!policy)
+-		return -EINVAL;
++		goto no_policy;
+ 
+ 	if (lock_policy_rwsem_read(policy->cpu) < 0)
+-		return -EINVAL;
++		goto fail;
+ 
+ 	if (fattr->show)
+ 		ret = fattr->show(policy, buf);
+@@ -685,8 +685,9 @@ static ssize_t show(struct kobject * kobj, struct attribute * attr ,char * buf)
+ 		ret = -EIO;
+ 
+ 	unlock_policy_rwsem_read(policy->cpu);
+-
++fail:
+ 	cpufreq_cpu_put(policy);
++no_policy:
+ 	return ret;
+ }
+ 
+@@ -695,13 +696,13 @@ static ssize_t store(struct kobject * kobj, struct attribute * attr,
+ {
+ 	struct cpufreq_policy * policy = to_policy(kobj);
+ 	struct freq_attr * fattr = to_attr(attr);
+-	ssize_t ret;
++	ssize_t ret = -EINVAL;
+ 	policy = cpufreq_cpu_get(policy->cpu);
+ 	if (!policy)
+-		return -EINVAL;
++		goto no_policy;
+ 
+ 	if (lock_policy_rwsem_write(policy->cpu) < 0)
+-		return -EINVAL;
++		goto fail;
+ 
+ 	if (fattr->store)
+ 		ret = fattr->store(policy, buf, count);
+@@ -709,8 +710,9 @@ static ssize_t store(struct kobject * kobj, struct attribute * attr,
+ 		ret = -EIO;
+ 
+ 	unlock_policy_rwsem_write(policy->cpu);
+-
++fail:
+ 	cpufreq_cpu_put(policy);
++no_policy:
+ 	return ret;
+ }
+ 
+@@ -1775,7 +1777,7 @@ static int __cpuinit cpufreq_cpu_callback(struct notifier_block *nfb,
+ 	return NOTIFY_OK;
+ }
+ 
+-static struct notifier_block __cpuinitdata cpufreq_cpu_notifier =
++static struct notifier_block __refdata cpufreq_cpu_notifier =
+ {
+     .notifier_call = cpufreq_cpu_callback,
+ };
+diff --git a/drivers/cpufreq/cpufreq_stats.c b/drivers/cpufreq/cpufreq_stats.c
+index 1b8312b..070421a 100644
+--- a/drivers/cpufreq/cpufreq_stats.c
++++ b/drivers/cpufreq/cpufreq_stats.c
+@@ -323,7 +323,7 @@ static int __cpuinit cpufreq_stat_cpu_callback(struct notifier_block *nfb,
+ 	return NOTIFY_OK;
+ }
+ 
+-static struct notifier_block cpufreq_stat_cpu_notifier __cpuinitdata =
++static struct notifier_block cpufreq_stat_cpu_notifier __refdata =
+ {
+ 	.notifier_call = cpufreq_stat_cpu_callback,
+ };
+diff --git a/drivers/ide/Kconfig b/drivers/ide/Kconfig
+index df752e6..eed6d8e 100644
+--- a/drivers/ide/Kconfig
++++ b/drivers/ide/Kconfig
+@@ -50,7 +50,7 @@ menuconfig IDE
+ 	  To compile this driver as a module, choose M here: the
+ 	  module will be called ide.
+ 
+-	  For further information, please read <file:Documentation/ide.txt>.
++	  For further information, please read <file:Documentation/ide/ide.txt>.
+ 
+ 	  If unsure, say Y.
+ 
+@@ -77,7 +77,7 @@ config BLK_DEV_IDE
+ 	  Useful information about large (>540 MB) IDE disks, multiple
+ 	  interfaces, what to do if ATA/IDE devices are not automatically
+ 	  detected, sound card ATA/IDE ports, module support, and other
+-	  topics, is contained in <file:Documentation/ide.txt>. For detailed
++	  topics, is contained in <file:Documentation/ide/ide.txt>. For detailed
+ 	  information about hard drives, consult the Disk-HOWTO and the
+ 	  Multi-Disk-HOWTO, available from
+ 	  <http://www.tldp.org/docs.html#howto>.
+@@ -87,7 +87,7 @@ config BLK_DEV_IDE
+ 	  <ftp://ibiblio.org/pub/Linux/system/hardware/>.
+ 
+ 	  To compile this driver as a module, choose M here and read
+-	  <file:Documentation/ide.txt>. The module will be called ide-mod.
++	  <file:Documentation/ide/ide.txt>. The module will be called ide-mod.
+ 	  Do not compile this driver as a module if your root file system (the
+ 	  one containing the directory /) is located on an IDE device.
+ 
+@@ -98,7 +98,7 @@ config BLK_DEV_IDE
+ 
+ if BLK_DEV_IDE
+ 
+-comment "Please see Documentation/ide.txt for help/info on IDE drives"
++comment "Please see Documentation/ide/ide.txt for help/info on IDE drives"
+ 
+ config BLK_DEV_IDE_SATA
+ 	bool "Support for SATA (deprecated; conflicts with libata SATA driver)"
+@@ -235,8 +235,8 @@ config BLK_DEV_IDETAPE
+ 	  along with other IDE devices, as "hdb" or "hdc", or something
+ 	  similar, and will be mapped to a character device such as "ht0"
+ 	  (check the boot messages with dmesg).  Be sure to consult the
+-	  <file:drivers/ide/ide-tape.c> and <file:Documentation/ide.txt> files
+-	  for usage information.
++	  <file:drivers/ide/ide-tape.c> and <file:Documentation/ide/ide.txt>
++	  files for usage information.
+ 
+ 	  To compile this driver as a module, choose M here: the
+ 	  module will be called ide-tape.
+@@ -358,7 +358,7 @@ config BLK_DEV_CMD640
+ 
+ 	  The CMD640 chip is also used on add-in cards by Acculogic, and on
+ 	  the "CSA-6400E PCI to IDE controller" that some people have. For
+-	  details, read <file:Documentation/ide.txt>.
++	  details, read <file:Documentation/ide/ide.txt>.
+ 
+ config BLK_DEV_CMD640_ENHANCED
+ 	bool "CMD640 enhanced support"
+@@ -366,7 +366,7 @@ config BLK_DEV_CMD640_ENHANCED
+ 	help
+ 	  This option includes support for setting/autotuning PIO modes and
+ 	  prefetch on CMD640 IDE interfaces.  For details, read
+-	  <file:Documentation/ide.txt>. If you have a CMD640 IDE interface
++	  <file:Documentation/ide/ide.txt>. If you have a CMD640 IDE interface
+ 	  and your BIOS does not already do this for you, then say Y here.
+ 	  Otherwise say N.
+ 
+@@ -1069,9 +1069,9 @@ config BLK_DEV_ALI14XX
+ 	  This driver is enabled at runtime using the "ali14xx.probe" kernel
+ 	  boot parameter.  It enables support for the secondary IDE interface
+ 	  of the ALI M1439/1443/1445/1487/1489 chipsets, and permits faster
+-	  I/O speeds to be set as well.  See the files
+-	  <file:Documentation/ide.txt> and <file:drivers/ide/legacy/ali14xx.c>
+-	  for more info.
++	  I/O speeds to be set as well.
++	  See the files <file:Documentation/ide/ide.txt> and
++	  <file:drivers/ide/legacy/ali14xx.c> for more info.
+ 
+ config BLK_DEV_DTC2278
+ 	tristate "DTC-2278 support"
+@@ -1079,7 +1079,7 @@ config BLK_DEV_DTC2278
+ 	  This driver is enabled at runtime using the "dtc2278.probe" kernel
+ 	  boot parameter. It enables support for the secondary IDE interface
+ 	  of the DTC-2278 card, and permits faster I/O speeds to be set as
+-	  well. See the <file:Documentation/ide.txt> and
++	  well. See the <file:Documentation/ide/ide.txt> and
+ 	  <file:drivers/ide/legacy/dtc2278.c> files for more info.
+ 
+ config BLK_DEV_HT6560B
+@@ -1088,7 +1088,7 @@ config BLK_DEV_HT6560B
+ 	  This driver is enabled at runtime using the "ht6560b.probe" kernel
+ 	  boot parameter. It enables support for the secondary IDE interface
+ 	  of the Holtek card, and permits faster I/O speeds to be set as well.
+-	  See the <file:Documentation/ide.txt> and
++	  See the <file:Documentation/ide/ide.txt> and
+ 	  <file:drivers/ide/legacy/ht6560b.c> files for more info.
+ 
+ config BLK_DEV_QD65XX
+@@ -1096,7 +1096,7 @@ config BLK_DEV_QD65XX
+ 	help
+ 	  This driver is enabled at runtime using the "qd65xx.probe" kernel
+ 	  boot parameter.  It permits faster I/O speeds to be set.  See the
+-	  <file:Documentation/ide.txt> and <file:drivers/ide/legacy/qd65xx.c>
++	  <file:Documentation/ide/ide.txt> and <file:drivers/ide/legacy/qd65xx.c>
+ 	  for more info.
+ 
+ config BLK_DEV_UMC8672
+@@ -1105,7 +1105,7 @@ config BLK_DEV_UMC8672
+ 	  This driver is enabled at runtime using the "umc8672.probe" kernel
+ 	  boot parameter. It enables support for the secondary IDE interface
+ 	  of the UMC-8672, and permits faster I/O speeds to be set as well.
+-	  See the files <file:Documentation/ide.txt> and
++	  See the files <file:Documentation/ide/ide.txt> and
+ 	  <file:drivers/ide/legacy/umc8672.c> for more info.
+ 
+ endif
+diff --git a/drivers/ide/ide-cd_ioctl.c b/drivers/ide/ide-cd_ioctl.c
+index b68284d..6d147ce 100644
+--- a/drivers/ide/ide-cd_ioctl.c
++++ b/drivers/ide/ide-cd_ioctl.c
+@@ -457,6 +457,10 @@ int ide_cdrom_packet(struct cdrom_device_info *cdi,
+ 	   layer. the packet must be complete, as we do not
+ 	   touch it at all. */
+ 	ide_cd_init_rq(drive, &req);
++
++	if (cgc->data_direction == CGC_DATA_WRITE)
++		req.cmd_flags |= REQ_RW;
++
+ 	memcpy(req.cmd, cgc->cmd, CDROM_PACKET_SIZE);
+ 	if (cgc->sense)
+ 		memset(cgc->sense, 0, sizeof(struct request_sense));
+diff --git a/drivers/ide/ide-dma.c b/drivers/ide/ide-dma.c
+index 2de99e4..d61e578 100644
+--- a/drivers/ide/ide-dma.c
++++ b/drivers/ide/ide-dma.c
+@@ -713,7 +713,7 @@ static int ide_tune_dma(ide_drive_t *drive)
+ 	}
+ 
+ 	if (hwif->host_flags & IDE_HFLAG_NO_SET_MODE)
+-		return 0;
++		return 1;
+ 
+ 	if (ide_set_dma_mode(drive, speed))
+ 		return 0;
+diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c
+index fa16bc3..9976f9d 100644
+--- a/drivers/ide/ide.c
++++ b/drivers/ide/ide.c
+@@ -667,7 +667,6 @@ int ide_register_hw(hw_regs_t *hw, void (*quirkproc)(ide_drive_t *),
+ 
+ 	do {
+ 		hwif = ide_deprecated_find_port(hw->io_ports[IDE_DATA_OFFSET]);
+-		index = hwif->index;
+ 		if (hwif)
+ 			goto found;
+ 		for (index = 0; index < MAX_HWIFS; index++)
+@@ -675,6 +674,7 @@ int ide_register_hw(hw_regs_t *hw, void (*quirkproc)(ide_drive_t *),
+ 	} while (retry--);
+ 	return -1;
+ found:
++	index = hwif->index;
+ 	if (hwif->present)
+ 		ide_unregister(index, 0, 1);
+ 	else if (!hwif->hold)
+@@ -1180,7 +1180,7 @@ static int __initdata is_chipset_set[MAX_HWIFS];
+  * ide_setup() gets called VERY EARLY during initialization,
+  * to handle kernel "command line" strings beginning with "hdx=" or "ide".
+  *
+- * Remember to update Documentation/ide.txt if you change something here.
++ * Remember to update Documentation/ide/ide.txt if you change something here.
+  */
+ static int __init ide_setup(char *s)
+ {
+diff --git a/drivers/isdn/gigaset/common.c b/drivers/isdn/gigaset/common.c
+index aacedec..827c32c 100644
+--- a/drivers/isdn/gigaset/common.c
++++ b/drivers/isdn/gigaset/common.c
+@@ -637,7 +637,6 @@ struct cardstate *gigaset_initcs(struct gigaset_driver *drv, int channels,
+ 		err("maximum number of devices exceeded");
+ 		return NULL;
+ 	}
+-	mutex_init(&cs->mutex);
+ 
+ 	gig_dbg(DEBUG_INIT, "allocating bcs[0..%d]", channels - 1);
+ 	cs->bcs = kmalloc(channels * sizeof(struct bc_state), GFP_KERNEL);
+@@ -898,8 +897,10 @@ int gigaset_shutdown(struct cardstate *cs)
+ {
+ 	mutex_lock(&cs->mutex);
+ 
+-	if (!(cs->flags & VALID_MINOR))
++	if (!(cs->flags & VALID_MINOR)) {
++		mutex_unlock(&cs->mutex);
+ 		return -1;
++	}
+ 
+ 	cs->waiting = 1;
+ 
+@@ -1086,6 +1087,7 @@ struct gigaset_driver *gigaset_initdriver(unsigned minor, unsigned minors,
+ 		drv->cs[i].driver = drv;
+ 		drv->cs[i].ops = drv->ops;
+ 		drv->cs[i].minor_index = i;
++		mutex_init(&drv->cs[i].mutex);
+ 	}
+ 
+ 	gigaset_if_initdriver(drv, procname, devname);
+diff --git a/drivers/message/fusion/mptsas.c b/drivers/message/fusion/mptsas.c
+index f77b329..78734e2 100644
+--- a/drivers/message/fusion/mptsas.c
++++ b/drivers/message/fusion/mptsas.c
+@@ -1701,6 +1701,11 @@ mptsas_sas_expander_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info,
+ 	if (error)
+ 		goto out_free_consistent;
+ 
++	if (!buffer->NumPhys) {
++		error = -ENODEV;
++		goto out_free_consistent;
++	}
++
+ 	/* save config data */
+ 	port_info->num_phys = buffer->NumPhys;
+ 	port_info->phy_info = kcalloc(port_info->num_phys,
+diff --git a/drivers/mtd/ubi/build.c b/drivers/mtd/ubi/build.c
+index 6ac81e3..2759604 100644
+--- a/drivers/mtd/ubi/build.c
++++ b/drivers/mtd/ubi/build.c
+@@ -1000,8 +1000,8 @@ static int __init ubi_init(void)
+ 		mutex_unlock(&ubi_devices_mutex);
+ 		if (err < 0) {
+ 			put_mtd_device(mtd);
+-			printk(KERN_ERR "UBI error: cannot attach %s\n",
+-			       p->name);
++			printk(KERN_ERR "UBI error: cannot attach mtd%d\n",
++			       mtd->index);
+ 			goto out_detach;
+ 		}
+ 	}
+diff --git a/drivers/mtd/ubi/ubi.h b/drivers/mtd/ubi/ubi.h
+index 4577106..a548c1d 100644
+--- a/drivers/mtd/ubi/ubi.h
++++ b/drivers/mtd/ubi/ubi.h
+@@ -217,11 +217,11 @@ struct ubi_volume {
+ 	void *upd_buf;
+ 
+ 	int *eba_tbl;
+-	int checked:1;
+-	int corrupted:1;
+-	int upd_marker:1;
+-	int updating:1;
+-	int changing_leb:1;
++	unsigned int checked:1;
++	unsigned int corrupted:1;
++	unsigned int upd_marker:1;
++	unsigned int updating:1;
++	unsigned int changing_leb:1;
+ 
+ #ifdef CONFIG_MTD_UBI_GLUEBI
+ 	/*
+diff --git a/drivers/mtd/ubi/vmt.c b/drivers/mtd/ubi/vmt.c
+index a3ca225..5be58d8 100644
+--- a/drivers/mtd/ubi/vmt.c
++++ b/drivers/mtd/ubi/vmt.c
+@@ -376,7 +376,9 @@ out_sysfs:
+ 	get_device(&vol->dev);
+ 	volume_sysfs_close(vol);
+ out_gluebi:
+-	ubi_destroy_gluebi(vol);
++	if (ubi_destroy_gluebi(vol))
++		dbg_err("cannot destroy gluebi for volume %d:%d",
++			ubi->ubi_num, vol_id);
+ out_cdev:
+ 	cdev_del(&vol->cdev);
+ out_mapping:
+diff --git a/drivers/mtd/ubi/vtbl.c b/drivers/mtd/ubi/vtbl.c
+index 56fc3fb..af36b12 100644
+--- a/drivers/mtd/ubi/vtbl.c
++++ b/drivers/mtd/ubi/vtbl.c
+@@ -519,6 +519,7 @@ static int init_volumes(struct ubi_device *ubi, const struct ubi_scan_info *si,
+ 			if (ubi->autoresize_vol_id != -1) {
+ 				ubi_err("more then one auto-resize volume (%d "
+ 					"and %d)", ubi->autoresize_vol_id, i);
++				kfree(vol);
+ 				return -EINVAL;
+ 			}
+ 
+diff --git a/drivers/parisc/ccio-dma.c b/drivers/parisc/ccio-dma.c
+index 60d338c..62db3c3 100644
+--- a/drivers/parisc/ccio-dma.c
++++ b/drivers/parisc/ccio-dma.c
+@@ -366,8 +366,8 @@ ccio_alloc_range(struct ioc *ioc, struct device *dev, size_t size)
+ 	** ggg sacrifices another 710 to the computer gods.
+ 	*/
+ 
+-	boundary_size = ALIGN(dma_get_seg_boundary(dev) + 1, 1 << IOVP_SHIFT);
+-	boundary_size >>= IOVP_SHIFT;
++	boundary_size = ALIGN((unsigned long long)dma_get_seg_boundary(dev) + 1,
++			      1ULL << IOVP_SHIFT) >> IOVP_SHIFT;
+ 
+ 	if (pages_needed <= 8) {
+ 		/*
+diff --git a/drivers/parisc/sba_iommu.c b/drivers/parisc/sba_iommu.c
+index e834127..bdbe780 100644
+--- a/drivers/parisc/sba_iommu.c
++++ b/drivers/parisc/sba_iommu.c
+@@ -341,8 +341,8 @@ sba_search_bitmap(struct ioc *ioc, struct device *dev,
+ 	unsigned long shift;
+ 	int ret;
+ 
+-	boundary_size = ALIGN(dma_get_seg_boundary(dev) + 1, 1 << IOVP_SHIFT);
+-	boundary_size >>= IOVP_SHIFT;
++	boundary_size = ALIGN((unsigned long long)dma_get_seg_boundary(dev) + 1,
++			      1ULL << IOVP_SHIFT) >> IOVP_SHIFT;
+ 
+ #if defined(ZX1_SUPPORT)
+ 	BUG_ON(ioc->ibase & ~IOVP_MASK);
+diff --git a/drivers/s390/block/dasd_3990_erp.c b/drivers/s390/block/dasd_3990_erp.c
+index f69714a..b19db20 100644
+--- a/drivers/s390/block/dasd_3990_erp.c
++++ b/drivers/s390/block/dasd_3990_erp.c
+@@ -2310,10 +2310,8 @@ static int
+ dasd_3990_erp_error_match(struct dasd_ccw_req *cqr1, struct dasd_ccw_req *cqr2)
+ {
+ 
+-	/* check failed CCW */
+-	if (cqr1->irb.scsw.cpa != cqr2->irb.scsw.cpa) {
+-		//	return 0;	/* CCW doesn't match */
+-	}
++	if (cqr1->startdev != cqr2->startdev)
++		return 0;
+ 
+ 	if (cqr1->irb.esw.esw0.erw.cons != cqr2->irb.esw.esw0.erw.cons)
+ 		return 0;
+diff --git a/drivers/s390/block/dasd_proc.c b/drivers/s390/block/dasd_proc.c
+index 28a86f0..556063e 100644
+--- a/drivers/s390/block/dasd_proc.c
++++ b/drivers/s390/block/dasd_proc.c
+@@ -62,8 +62,10 @@ dasd_devices_show(struct seq_file *m, void *v)
+ 		return 0;
+ 	if (device->block)
+ 		block = device->block;
+-	else
++	else {
++		dasd_put_device(device);
+ 		return 0;
++	}
+ 	/* Print device number. */
+ 	seq_printf(m, "%s", device->cdev->dev.bus_id);
+ 	/* Print discipline string. */
+diff --git a/drivers/s390/char/sclp_vt220.c b/drivers/s390/char/sclp_vt220.c
+index 92f5272..f7b258d 100644
+--- a/drivers/s390/char/sclp_vt220.c
++++ b/drivers/s390/char/sclp_vt220.c
+@@ -367,7 +367,7 @@ sclp_vt220_timeout(unsigned long data)
+ 	sclp_vt220_emit_current();
+ }
+ 
+-#define BUFFER_MAX_DELAY	HZ/2
++#define BUFFER_MAX_DELAY	HZ/20
+ 
+ /* 
+  * Internal implementation of the write function. Write COUNT bytes of data
+diff --git a/drivers/s390/crypto/ap_bus.c b/drivers/s390/crypto/ap_bus.c
+index d0c6fd3..7b0b819 100644
+--- a/drivers/s390/crypto/ap_bus.c
++++ b/drivers/s390/crypto/ap_bus.c
+@@ -490,10 +490,12 @@ static int ap_device_probe(struct device *dev)
+ 	int rc;
+ 
+ 	ap_dev->drv = ap_drv;
+-	spin_lock_bh(&ap_device_lock);
+-	list_add(&ap_dev->list, &ap_device_list);
+-	spin_unlock_bh(&ap_device_lock);
+ 	rc = ap_drv->probe ? ap_drv->probe(ap_dev) : -ENODEV;
++	if (!rc) {
++		spin_lock_bh(&ap_device_lock);
++		list_add(&ap_dev->list, &ap_device_list);
++		spin_unlock_bh(&ap_device_lock);
++	}
+ 	return rc;
+ }
+ 
+@@ -532,11 +534,11 @@ static int ap_device_remove(struct device *dev)
+ 
+ 	ap_flush_queue(ap_dev);
+ 	del_timer_sync(&ap_dev->timeout);
+-	if (ap_drv->remove)
+-		ap_drv->remove(ap_dev);
+ 	spin_lock_bh(&ap_device_lock);
+ 	list_del_init(&ap_dev->list);
+ 	spin_unlock_bh(&ap_device_lock);
++	if (ap_drv->remove)
++		ap_drv->remove(ap_dev);
+ 	spin_lock_bh(&ap_dev->lock);
+ 	atomic_sub(ap_dev->queue_count, &ap_poll_requests);
+ 	spin_unlock_bh(&ap_dev->lock);
+diff --git a/drivers/scsi/aic94xx/aic94xx.h b/drivers/scsi/aic94xx/aic94xx.h
+index 32f513b..eb8efdc 100644
+--- a/drivers/scsi/aic94xx/aic94xx.h
++++ b/drivers/scsi/aic94xx/aic94xx.h
+@@ -102,6 +102,7 @@ int  asd_abort_task_set(struct domain_device *, u8 *lun);
+ int  asd_clear_aca(struct domain_device *, u8 *lun);
+ int  asd_clear_task_set(struct domain_device *, u8 *lun);
+ int  asd_lu_reset(struct domain_device *, u8 *lun);
++int  asd_I_T_nexus_reset(struct domain_device *dev);
+ int  asd_query_task(struct sas_task *);
+ 
+ /* ---------- Adapter and Port management ---------- */
+diff --git a/drivers/scsi/aic94xx/aic94xx_hwi.h b/drivers/scsi/aic94xx/aic94xx_hwi.h
+index 150f670..abc7575 100644
+--- a/drivers/scsi/aic94xx/aic94xx_hwi.h
++++ b/drivers/scsi/aic94xx/aic94xx_hwi.h
+@@ -140,7 +140,7 @@ struct asd_ascb {
+ 
+ 	/* internally generated command */
+ 	struct timer_list timer;
+-	struct completion completion;
++	struct completion *completion;
+ 	u8        tag_valid:1;
+ 	__be16    tag;		  /* error recovery only */
+ 
+@@ -294,7 +294,6 @@ static inline void asd_init_ascb(struct asd_ha_struct *asd_ha,
+ 	ascb->timer.function = NULL;
+ 	init_timer(&ascb->timer);
+ 	ascb->tc_index = -1;
+-	init_completion(&ascb->completion);
+ }
+ 
+ /* Must be called with the tc_index_lock held!
+diff --git a/drivers/scsi/aic94xx/aic94xx_init.c b/drivers/scsi/aic94xx/aic94xx_init.c
+index 5d761eb..88d1e73 100644
+--- a/drivers/scsi/aic94xx/aic94xx_init.c
++++ b/drivers/scsi/aic94xx/aic94xx_init.c
+@@ -1003,7 +1003,7 @@ static struct sas_domain_function_template aic94xx_transport_functions = {
+ 	.lldd_abort_task_set	= asd_abort_task_set,
+ 	.lldd_clear_aca		= asd_clear_aca,
+ 	.lldd_clear_task_set	= asd_clear_task_set,
+-	.lldd_I_T_nexus_reset	= NULL,
++	.lldd_I_T_nexus_reset	= asd_I_T_nexus_reset,
+ 	.lldd_lu_reset		= asd_lu_reset,
+ 	.lldd_query_task	= asd_query_task,
+ 
+diff --git a/drivers/scsi/aic94xx/aic94xx_task.c b/drivers/scsi/aic94xx/aic94xx_task.c
+index 965d4bb..008df9a 100644
+--- a/drivers/scsi/aic94xx/aic94xx_task.c
++++ b/drivers/scsi/aic94xx/aic94xx_task.c
+@@ -343,11 +343,13 @@ Again:
+ 	task->task_state_flags &= ~SAS_TASK_AT_INITIATOR;
+ 	task->task_state_flags |= SAS_TASK_STATE_DONE;
+ 	if (unlikely((task->task_state_flags & SAS_TASK_STATE_ABORTED))) {
++		struct completion *completion = ascb->completion;
+ 		spin_unlock_irqrestore(&task->task_state_lock, flags);
+ 		ASD_DPRINTK("task 0x%p done with opcode 0x%x resp 0x%x "
+ 			    "stat 0x%x but aborted by upper layer!\n",
+ 			    task, opcode, ts->resp, ts->stat);
+-		complete(&ascb->completion);
++		if (completion)
++			complete(completion);
+ 	} else {
+ 		spin_unlock_irqrestore(&task->task_state_lock, flags);
+ 		task->lldd_task = NULL;
+diff --git a/drivers/scsi/aic94xx/aic94xx_tmf.c b/drivers/scsi/aic94xx/aic94xx_tmf.c
+index 144f5ad..b9ac8f7 100644
+--- a/drivers/scsi/aic94xx/aic94xx_tmf.c
++++ b/drivers/scsi/aic94xx/aic94xx_tmf.c
+@@ -53,50 +53,64 @@ static int asd_enqueue_internal(struct asd_ascb *ascb,
+ 	return res;
+ }
+ 
+-static inline void asd_timedout_common(unsigned long data)
+-{
+-	struct asd_ascb *ascb = (void *) data;
+-	struct asd_seq_data *seq = &ascb->ha->seq;
+-        unsigned long flags;
++/* ---------- CLEAR NEXUS ---------- */
+ 
+-	spin_lock_irqsave(&seq->pend_q_lock, flags);
+-        seq->pending--;
+-        list_del_init(&ascb->list);
+-        spin_unlock_irqrestore(&seq->pend_q_lock, flags);
+-}
++struct tasklet_completion_status {
++	int	dl_opcode;
++	int	tmf_state;
++	u8	tag_valid:1;
++	__be16	tag;
++};
++
++#define DECLARE_TCS(tcs) \
++	struct tasklet_completion_status tcs = { \
++		.dl_opcode = 0, \
++		.tmf_state = 0, \
++		.tag_valid = 0, \
++		.tag = 0, \
++	}
+ 
+-/* ---------- CLEAR NEXUS ---------- */
+ 
+ static void asd_clear_nexus_tasklet_complete(struct asd_ascb *ascb,
+ 					     struct done_list_struct *dl)
+ {
++	struct tasklet_completion_status *tcs = ascb->uldd_task;
+ 	ASD_DPRINTK("%s: here\n", __FUNCTION__);
+ 	if (!del_timer(&ascb->timer)) {
+ 		ASD_DPRINTK("%s: couldn't delete timer\n", __FUNCTION__);
+ 		return;
+ 	}
+ 	ASD_DPRINTK("%s: opcode: 0x%x\n", __FUNCTION__, dl->opcode);
+-	ascb->uldd_task = (void *) (unsigned long) dl->opcode;
+-	complete(&ascb->completion);
++	tcs->dl_opcode = dl->opcode;
++	complete(ascb->completion);
++	asd_ascb_free(ascb);
+ }
+ 
+ static void asd_clear_nexus_timedout(unsigned long data)
+ {
+-	struct asd_ascb *ascb = (void *) data;
++	struct asd_ascb *ascb = (void *)data;
++	struct tasklet_completion_status *tcs = ascb->uldd_task;
+ 
+ 	ASD_DPRINTK("%s: here\n", __FUNCTION__);
+-	asd_timedout_common(data);
+-	ascb->uldd_task = (void *) TMF_RESP_FUNC_FAILED;
+-	complete(&ascb->completion);
++	tcs->dl_opcode = TMF_RESP_FUNC_FAILED;
++	complete(ascb->completion);
+ }
+ 
+ #define CLEAR_NEXUS_PRE         \
++	struct asd_ascb *ascb; \
++	struct scb *scb; \
++	int res; \
++	DECLARE_COMPLETION_ONSTACK(completion); \
++	DECLARE_TCS(tcs); \
++		\
+ 	ASD_DPRINTK("%s: PRE\n", __FUNCTION__); \
+         res = 1;                \
+ 	ascb = asd_ascb_alloc_list(asd_ha, &res, GFP_KERNEL); \
+ 	if (!ascb)              \
+ 		return -ENOMEM; \
+                                 \
++	ascb->completion = &completion; \
++	ascb->uldd_task = &tcs; \
+ 	scb = ascb->scb;        \
+ 	scb->header.opcode = CLEAR_NEXUS
+ 
+@@ -107,10 +121,11 @@ static void asd_clear_nexus_timedout(unsigned long data)
+ 	if (res)                \
+ 		goto out_err;   \
+ 	ASD_DPRINTK("%s: clear nexus posted, waiting...\n", __FUNCTION__); \
+-	wait_for_completion(&ascb->completion); \
+-	res = (int) (unsigned long) ascb->uldd_task; \
++	wait_for_completion(&completion); \
++	res = tcs.dl_opcode; \
+ 	if (res == TC_NO_ERROR) \
+ 		res = TMF_RESP_FUNC_COMPLETE;   \
++	return res; \
+ out_err:                        \
+ 	asd_ascb_free(ascb);    \
+ 	return res
+@@ -118,9 +133,6 @@ out_err:                        \
+ int asd_clear_nexus_ha(struct sas_ha_struct *sas_ha)
+ {
+ 	struct asd_ha_struct *asd_ha = sas_ha->lldd_ha;
+-	struct asd_ascb *ascb;
+-	struct scb *scb;
+-	int res;
+ 
+ 	CLEAR_NEXUS_PRE;
+ 	scb->clear_nexus.nexus = NEXUS_ADAPTER;
+@@ -130,9 +142,6 @@ int asd_clear_nexus_ha(struct sas_ha_struct *sas_ha)
+ int asd_clear_nexus_port(struct asd_sas_port *port)
+ {
+ 	struct asd_ha_struct *asd_ha = port->ha->lldd_ha;
+-	struct asd_ascb *ascb;
+-	struct scb *scb;
+-	int res;
+ 
+ 	CLEAR_NEXUS_PRE;
+ 	scb->clear_nexus.nexus = NEXUS_PORT;
+@@ -140,29 +149,73 @@ int asd_clear_nexus_port(struct asd_sas_port *port)
+ 	CLEAR_NEXUS_POST;
+ }
+ 
+-#if 0
+-static int asd_clear_nexus_I_T(struct domain_device *dev)
++enum clear_nexus_phase {
++	NEXUS_PHASE_PRE,
++	NEXUS_PHASE_POST,
++	NEXUS_PHASE_RESUME,
++};
++
++static int asd_clear_nexus_I_T(struct domain_device *dev,
++			       enum clear_nexus_phase phase)
+ {
+ 	struct asd_ha_struct *asd_ha = dev->port->ha->lldd_ha;
+-	struct asd_ascb *ascb;
+-	struct scb *scb;
+-	int res;
+ 
+ 	CLEAR_NEXUS_PRE;
+ 	scb->clear_nexus.nexus = NEXUS_I_T;
+-	scb->clear_nexus.flags = SEND_Q | EXEC_Q | NOTINQ;
++	switch (phase) {
++	case NEXUS_PHASE_PRE:
++		scb->clear_nexus.flags = EXEC_Q | SUSPEND_TX;
++		break;
++	case NEXUS_PHASE_POST:
++		scb->clear_nexus.flags = SEND_Q | NOTINQ;
++		break;
++	case NEXUS_PHASE_RESUME:
++		scb->clear_nexus.flags = RESUME_TX;
++	}
+ 	scb->clear_nexus.conn_handle = cpu_to_le16((u16)(unsigned long)
+ 						   dev->lldd_dev);
+ 	CLEAR_NEXUS_POST;
+ }
+-#endif
++
++int asd_I_T_nexus_reset(struct domain_device *dev)
++{
++	int res, tmp_res, i;
++	struct sas_phy *phy = sas_find_local_phy(dev);
++	/* Standard mandates link reset for ATA  (type 0) and
++	 * hard reset for SSP (type 1) */
++	int reset_type = (dev->dev_type == SATA_DEV ||
++			  (dev->tproto & SAS_PROTOCOL_STP)) ? 0 : 1;
++
++	asd_clear_nexus_I_T(dev, NEXUS_PHASE_PRE);
++	/* send a hard reset */
++	ASD_DPRINTK("sending %s reset to %s\n",
++		    reset_type ? "hard" : "soft", phy->dev.bus_id);
++	res = sas_phy_reset(phy, reset_type);
++	if (res == TMF_RESP_FUNC_COMPLETE) {
++		/* wait for the maximum settle time */
++		msleep(500);
++		/* clear all outstanding commands (keep nexus suspended) */
++		asd_clear_nexus_I_T(dev, NEXUS_PHASE_POST);
++	}
++	for (i = 0 ; i < 3; i++) {
++		tmp_res = asd_clear_nexus_I_T(dev, NEXUS_PHASE_RESUME);
++		if (tmp_res == TC_RESUME)
++			return res;
++		msleep(500);
++	}
++
++	/* This is a bit of a problem:  the sequencer is still suspended
++	 * and is refusing to resume.  Hope it will resume on a bigger hammer
++	 * or the disk is lost */
++	dev_printk(KERN_ERR, &phy->dev,
++		   "Failed to resume nexus after reset 0x%x\n", tmp_res);
++
++	return TMF_RESP_FUNC_FAILED;
++}
+ 
+ static int asd_clear_nexus_I_T_L(struct domain_device *dev, u8 *lun)
+ {
+ 	struct asd_ha_struct *asd_ha = dev->port->ha->lldd_ha;
+-	struct asd_ascb *ascb;
+-	struct scb *scb;
+-	int res;
+ 
+ 	CLEAR_NEXUS_PRE;
+ 	scb->clear_nexus.nexus = NEXUS_I_T_L;
+@@ -177,9 +230,6 @@ static int asd_clear_nexus_tag(struct sas_task *task)
+ {
+ 	struct asd_ha_struct *asd_ha = task->dev->port->ha->lldd_ha;
+ 	struct asd_ascb *tascb = task->lldd_task;
+-	struct asd_ascb *ascb;
+-	struct scb *scb;
+-	int res;
+ 
+ 	CLEAR_NEXUS_PRE;
+ 	scb->clear_nexus.nexus = NEXUS_TAG;
+@@ -195,9 +245,6 @@ static int asd_clear_nexus_index(struct sas_task *task)
+ {
+ 	struct asd_ha_struct *asd_ha = task->dev->port->ha->lldd_ha;
+ 	struct asd_ascb *tascb = task->lldd_task;
+-	struct asd_ascb *ascb;
+-	struct scb *scb;
+-	int res;
+ 
+ 	CLEAR_NEXUS_PRE;
+ 	scb->clear_nexus.nexus = NEXUS_TRANS_CX;
+@@ -213,11 +260,11 @@ static int asd_clear_nexus_index(struct sas_task *task)
+ static void asd_tmf_timedout(unsigned long data)
+ {
+ 	struct asd_ascb *ascb = (void *) data;
++	struct tasklet_completion_status *tcs = ascb->uldd_task;
+ 
+ 	ASD_DPRINTK("tmf timed out\n");
+-	asd_timedout_common(data);
+-	ascb->uldd_task = (void *) TMF_RESP_FUNC_FAILED;
+-	complete(&ascb->completion);
++	tcs->tmf_state = TMF_RESP_FUNC_FAILED;
++	complete(ascb->completion);
+ }
+ 
+ static int asd_get_tmf_resp_tasklet(struct asd_ascb *ascb,
+@@ -269,18 +316,24 @@ static int asd_get_tmf_resp_tasklet(struct asd_ascb *ascb,
+ static void asd_tmf_tasklet_complete(struct asd_ascb *ascb,
+ 				     struct done_list_struct *dl)
+ {
++	struct tasklet_completion_status *tcs;
++
+ 	if (!del_timer(&ascb->timer))
+ 		return;
+ 
++	tcs = ascb->uldd_task;
+ 	ASD_DPRINTK("tmf tasklet complete\n");
+ 
+-	if (dl->opcode == TC_SSP_RESP)
+-		ascb->uldd_task = (void *) (unsigned long)
+-			asd_get_tmf_resp_tasklet(ascb, dl);
+-	else
+-		ascb->uldd_task = (void *) 0xFF00 + (unsigned long) dl->opcode;
++	tcs->dl_opcode = dl->opcode;
++
++	if (dl->opcode == TC_SSP_RESP) {
++		tcs->tmf_state = asd_get_tmf_resp_tasklet(ascb, dl);
++		tcs->tag_valid = ascb->tag_valid;
++		tcs->tag = ascb->tag;
++	}
+ 
+-	complete(&ascb->completion);
++	complete(ascb->completion);
++	asd_ascb_free(ascb);
+ }
+ 
+ static inline int asd_clear_nexus(struct sas_task *task)
+@@ -288,15 +341,19 @@ static inline int asd_clear_nexus(struct sas_task *task)
+ 	int res = TMF_RESP_FUNC_FAILED;
+ 	int leftover;
+ 	struct asd_ascb *tascb = task->lldd_task;
++	DECLARE_COMPLETION_ONSTACK(completion);
+ 	unsigned long flags;
+ 
++	tascb->completion = &completion;
++
+ 	ASD_DPRINTK("task not done, clearing nexus\n");
+ 	if (tascb->tag_valid)
+ 		res = asd_clear_nexus_tag(task);
+ 	else
+ 		res = asd_clear_nexus_index(task);
+-	leftover = wait_for_completion_timeout(&tascb->completion,
++	leftover = wait_for_completion_timeout(&completion,
+ 					       AIC94XX_SCB_TIMEOUT);
++	tascb->completion = NULL;
+ 	ASD_DPRINTK("came back from clear nexus\n");
+ 	spin_lock_irqsave(&task->task_state_lock, flags);
+ 	if (leftover < 1)
+@@ -350,6 +407,11 @@ int asd_abort_task(struct sas_task *task)
+ 	struct asd_ascb *ascb = NULL;
+ 	struct scb *scb;
+ 	int leftover;
++	DECLARE_TCS(tcs);
++	DECLARE_COMPLETION_ONSTACK(completion);
++	DECLARE_COMPLETION_ONSTACK(tascb_completion);
++
++	tascb->completion = &tascb_completion;
+ 
+ 	spin_lock_irqsave(&task->task_state_lock, flags);
+ 	if (task->task_state_flags & SAS_TASK_STATE_DONE) {
+@@ -363,8 +425,10 @@ int asd_abort_task(struct sas_task *task)
+ 	ascb = asd_ascb_alloc_list(asd_ha, &res, GFP_KERNEL);
+ 	if (!ascb)
+ 		return -ENOMEM;
+-	scb = ascb->scb;
+ 
++	ascb->uldd_task = &tcs;
++	ascb->completion = &completion;
++	scb = ascb->scb;
+ 	scb->header.opcode = SCB_ABORT_TASK;
+ 
+ 	switch (task->task_proto) {
+@@ -406,13 +470,12 @@ int asd_abort_task(struct sas_task *task)
+ 	res = asd_enqueue_internal(ascb, asd_tmf_tasklet_complete,
+ 				   asd_tmf_timedout);
+ 	if (res)
+-		goto out;
+-	wait_for_completion(&ascb->completion);
++		goto out_free;
++	wait_for_completion(&completion);
+ 	ASD_DPRINTK("tmf came back\n");
+ 
+-	res = (int) (unsigned long) ascb->uldd_task;
+-	tascb->tag = ascb->tag;
+-	tascb->tag_valid = ascb->tag_valid;
++	tascb->tag = tcs.tag;
++	tascb->tag_valid = tcs.tag_valid;
+ 
+ 	spin_lock_irqsave(&task->task_state_lock, flags);
+ 	if (task->task_state_flags & SAS_TASK_STATE_DONE) {
+@@ -423,63 +486,68 @@ int asd_abort_task(struct sas_task *task)
+ 	}
+ 	spin_unlock_irqrestore(&task->task_state_lock, flags);
+ 
+-	switch (res) {
+-	/* The task to be aborted has been sent to the device.
+-	 * We got a Response IU for the ABORT TASK TMF. */
+-	case TC_NO_ERROR + 0xFF00:
+-	case TMF_RESP_FUNC_COMPLETE:
+-	case TMF_RESP_FUNC_FAILED:
+-		res = asd_clear_nexus(task);
+-		break;
+-	case TMF_RESP_INVALID_FRAME:
+-	case TMF_RESP_OVERLAPPED_TAG:
+-	case TMF_RESP_FUNC_ESUPP:
+-	case TMF_RESP_NO_LUN:
+-		goto out_done; break;
+-	}
+-	/* In the following we assume that the managing layer
+-	 * will _never_ make a mistake, when issuing ABORT TASK.
+-	 */
+-	switch (res) {
+-	default:
+-		res = asd_clear_nexus(task);
+-		/* fallthrough */
+-	case TC_NO_ERROR + 0xFF00:
+-	case TMF_RESP_FUNC_COMPLETE:
+-		break;
+-	/* The task hasn't been sent to the device xor we never got
+-	 * a (sane) Response IU for the ABORT TASK TMF.
+-	 */
+-	case TF_NAK_RECV + 0xFF00:
+-		res = TMF_RESP_INVALID_FRAME;
+-		break;
+-	case TF_TMF_TASK_DONE + 0xFF00:	/* done but not reported yet */
++	if (tcs.dl_opcode == TC_SSP_RESP) {
++		/* The task to be aborted has been sent to the device.
++		 * We got a Response IU for the ABORT TASK TMF. */
++		if (tcs.tmf_state == TMF_RESP_FUNC_COMPLETE)
++			res = asd_clear_nexus(task);
++		else
++			res = tcs.tmf_state;
++	} else if (tcs.dl_opcode == TC_NO_ERROR &&
++		   tcs.tmf_state == TMF_RESP_FUNC_FAILED) {
++		/* timeout */
+ 		res = TMF_RESP_FUNC_FAILED;
+-		leftover = wait_for_completion_timeout(&tascb->completion,
+-						       AIC94XX_SCB_TIMEOUT);
+-		spin_lock_irqsave(&task->task_state_lock, flags);
+-		if (leftover < 1)
++	} else {
++		/* In the following we assume that the managing layer
++		 * will _never_ make a mistake, when issuing ABORT
++		 * TASK.
++		 */
++		switch (tcs.dl_opcode) {
++		default:
++			res = asd_clear_nexus(task);
++			/* fallthrough */
++		case TC_NO_ERROR:
++			break;
++			/* The task hasn't been sent to the device xor
++			 * we never got a (sane) Response IU for the
++			 * ABORT TASK TMF.
++			 */
++		case TF_NAK_RECV:
++			res = TMF_RESP_INVALID_FRAME;
++			break;
++		case TF_TMF_TASK_DONE:	/* done but not reported yet */
+ 			res = TMF_RESP_FUNC_FAILED;
+-		if (task->task_state_flags & SAS_TASK_STATE_DONE)
++			leftover =
++				wait_for_completion_timeout(&tascb_completion,
++							  AIC94XX_SCB_TIMEOUT);
++			spin_lock_irqsave(&task->task_state_lock, flags);
++			if (leftover < 1)
++				res = TMF_RESP_FUNC_FAILED;
++			if (task->task_state_flags & SAS_TASK_STATE_DONE)
++				res = TMF_RESP_FUNC_COMPLETE;
++			spin_unlock_irqrestore(&task->task_state_lock, flags);
++			break;
++		case TF_TMF_NO_TAG:
++		case TF_TMF_TAG_FREE: /* the tag is in the free list */
++		case TF_TMF_NO_CONN_HANDLE: /* no such device */
+ 			res = TMF_RESP_FUNC_COMPLETE;
+-		spin_unlock_irqrestore(&task->task_state_lock, flags);
+-		goto out_done;
+-	case TF_TMF_NO_TAG + 0xFF00:
+-	case TF_TMF_TAG_FREE + 0xFF00: /* the tag is in the free list */
+-	case TF_TMF_NO_CONN_HANDLE + 0xFF00: /* no such device */
+-		res = TMF_RESP_FUNC_COMPLETE;
+-		goto out_done;
+-	case TF_TMF_NO_CTX + 0xFF00: /* not in seq, or proto != SSP */
+-		res = TMF_RESP_FUNC_ESUPP;
+-		goto out;
++			break;
++		case TF_TMF_NO_CTX: /* not in seq, or proto != SSP */
++			res = TMF_RESP_FUNC_ESUPP;
++			break;
++		}
+ 	}
+-out_done:
++ out_done:
++	tascb->completion = NULL;
+ 	if (res == TMF_RESP_FUNC_COMPLETE) {
+ 		task->lldd_task = NULL;
+ 		mb();
+ 		asd_ascb_free(tascb);
+ 	}
+-out:
++	ASD_DPRINTK("task 0x%p aborted, res: 0x%x\n", task, res);
++	return res;
++
++ out_free:
+ 	asd_ascb_free(ascb);
+ 	ASD_DPRINTK("task 0x%p aborted, res: 0x%x\n", task, res);
+ 	return res;
+@@ -507,6 +575,8 @@ static int asd_initiate_ssp_tmf(struct domain_device *dev, u8 *lun,
+ 	struct asd_ascb *ascb;
+ 	int res = 1;
+ 	struct scb *scb;
++	DECLARE_COMPLETION_ONSTACK(completion);
++	DECLARE_TCS(tcs);
+ 
+ 	if (!(dev->tproto & SAS_PROTOCOL_SSP))
+ 		return TMF_RESP_FUNC_ESUPP;
+@@ -514,6 +584,9 @@ static int asd_initiate_ssp_tmf(struct domain_device *dev, u8 *lun,
+ 	ascb = asd_ascb_alloc_list(asd_ha, &res, GFP_KERNEL);
+ 	if (!ascb)
+ 		return -ENOMEM;
++
++	ascb->completion = &completion;
++	ascb->uldd_task = &tcs;
+ 	scb = ascb->scb;
+ 
+ 	if (tmf == TMF_QUERY_TASK)
+@@ -546,31 +619,32 @@ static int asd_initiate_ssp_tmf(struct domain_device *dev, u8 *lun,
+ 				   asd_tmf_timedout);
+ 	if (res)
+ 		goto out_err;
+-	wait_for_completion(&ascb->completion);
+-	res = (int) (unsigned long) ascb->uldd_task;
++	wait_for_completion(&completion);
+ 
+-	switch (res) {
+-	case TC_NO_ERROR + 0xFF00:
++	switch (tcs.dl_opcode) {
++	case TC_NO_ERROR:
+ 		res = TMF_RESP_FUNC_COMPLETE;
+ 		break;
+-	case TF_NAK_RECV + 0xFF00:
++	case TF_NAK_RECV:
+ 		res = TMF_RESP_INVALID_FRAME;
+ 		break;
+-	case TF_TMF_TASK_DONE + 0xFF00:
++	case TF_TMF_TASK_DONE:
+ 		res = TMF_RESP_FUNC_FAILED;
+ 		break;
+-	case TF_TMF_NO_TAG + 0xFF00:
+-	case TF_TMF_TAG_FREE + 0xFF00: /* the tag is in the free list */
+-	case TF_TMF_NO_CONN_HANDLE + 0xFF00: /* no such device */
++	case TF_TMF_NO_TAG:
++	case TF_TMF_TAG_FREE: /* the tag is in the free list */
++	case TF_TMF_NO_CONN_HANDLE: /* no such device */
+ 		res = TMF_RESP_FUNC_COMPLETE;
+ 		break;
+-	case TF_TMF_NO_CTX + 0xFF00: /* not in seq, or proto != SSP */
++	case TF_TMF_NO_CTX: /* not in seq, or proto != SSP */
+ 		res = TMF_RESP_FUNC_ESUPP;
+ 		break;
+ 	default:
+ 		/* Allow TMF response codes to propagate upwards */
++		res = tcs.dl_opcode;
+ 		break;
+ 	}
++	return res;
+ out_err:
+ 	asd_ascb_free(ascb);
+ 	return res;
+diff --git a/drivers/scsi/arcmsr/arcmsr.h b/drivers/scsi/arcmsr/arcmsr.h
+index 5778650..0393707 100644
+--- a/drivers/scsi/arcmsr/arcmsr.h
++++ b/drivers/scsi/arcmsr/arcmsr.h
+@@ -48,7 +48,7 @@ struct class_device_attribute;
+ /*The limit of outstanding scsi command that firmware can handle*/
+ #define ARCMSR_MAX_OUTSTANDING_CMD						256
+ #define ARCMSR_MAX_FREECCB_NUM							320
+-#define ARCMSR_DRIVER_VERSION		     "Driver Version 1.20.00.15 2007/12/24"
++#define ARCMSR_DRIVER_VERSION		     "Driver Version 1.20.00.15 2008/02/27"
+ #define ARCMSR_SCSI_INITIATOR_ID						255
+ #define ARCMSR_MAX_XFER_SECTORS							512
+ #define ARCMSR_MAX_XFER_SECTORS_B						4096
+diff --git a/drivers/scsi/gdth.c b/drivers/scsi/gdth.c
+index 6d67f5c..27ebd33 100644
+--- a/drivers/scsi/gdth.c
++++ b/drivers/scsi/gdth.c
+@@ -160,7 +160,7 @@ static void gdth_readapp_event(gdth_ha_str *ha, unchar application,
+ static void gdth_clear_events(void);
+ 
+ static void gdth_copy_internal_data(gdth_ha_str *ha, Scsi_Cmnd *scp,
+-                                    char *buffer, ushort count, int to_buffer);
++                                    char *buffer, ushort count);
+ static int gdth_internal_cache_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp);
+ static int gdth_fill_cache_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp, ushort hdrive);
+ 
+@@ -182,7 +182,6 @@ static int gdth_ioctl(struct inode *inode, struct file *filep,
+                       unsigned int cmd, unsigned long arg);
+ 
+ static void gdth_flush(gdth_ha_str *ha);
+-static int gdth_halt(struct notifier_block *nb, ulong event, void *buf);
+ static int gdth_queuecommand(Scsi_Cmnd *scp,void (*done)(Scsi_Cmnd *));
+ static int __gdth_queuecommand(gdth_ha_str *ha, struct scsi_cmnd *scp,
+ 				struct gdth_cmndinfo *cmndinfo);
+@@ -417,12 +416,6 @@ static inline void gdth_set_sglist(struct scsi_cmnd *cmd,
+ #include "gdth_proc.h"
+ #include "gdth_proc.c"
+ 
+-/* notifier block to get a notify on system shutdown/halt/reboot */
+-static struct notifier_block gdth_notifier = {
+-    gdth_halt, NULL, 0
+-};
+-static int notifier_disabled = 0;
+-
+ static gdth_ha_str *gdth_find_ha(int hanum)
+ {
+ 	gdth_ha_str *ha;
+@@ -445,8 +438,8 @@ static struct gdth_cmndinfo *gdth_get_cmndinfo(gdth_ha_str *ha)
+ 	for (i=0; i<GDTH_MAXCMDS; ++i) {
+ 		if (ha->cmndinfo[i].index == 0) {
+ 			priv = &ha->cmndinfo[i];
+-			priv->index = i+1;
+ 			memset(priv, 0, sizeof(*priv));
++			priv->index = i+1;
+ 			break;
+ 		}
+ 	}
+@@ -493,7 +486,6 @@ int __gdth_execute(struct scsi_device *sdev, gdth_cmd_str *gdtcmd, char *cmnd,
+     gdth_ha_str *ha = shost_priv(sdev->host);
+     Scsi_Cmnd *scp;
+     struct gdth_cmndinfo cmndinfo;
+-    struct scatterlist one_sg;
+     DECLARE_COMPLETION_ONSTACK(wait);
+     int rval;
+ 
+@@ -507,13 +499,10 @@ int __gdth_execute(struct scsi_device *sdev, gdth_cmd_str *gdtcmd, char *cmnd,
+     /* use request field to save the ptr. to completion struct. */
+     scp->request = (struct request *)&wait;
+     scp->timeout_per_command = timeout*HZ;
+-    sg_init_one(&one_sg, gdtcmd, sizeof(*gdtcmd));
+-    gdth_set_sglist(scp, &one_sg);
+-    gdth_set_sg_count(scp, 1);
+-    gdth_set_bufflen(scp, sizeof(*gdtcmd));
+     scp->cmd_len = 12;
+     memcpy(scp->cmnd, cmnd, 12);
+     cmndinfo.priority = IOCTL_PRI;
++    cmndinfo.internal_cmd_str = gdtcmd;
+     cmndinfo.internal_command = 1;
+ 
+     TRACE(("__gdth_execute() cmd 0x%x\n", scp->cmnd[0]));
+@@ -2355,7 +2344,7 @@ static void gdth_next(gdth_ha_str *ha)
+  * buffers, kmap_atomic() as needed.
+  */
+ static void gdth_copy_internal_data(gdth_ha_str *ha, Scsi_Cmnd *scp,
+-                                    char *buffer, ushort count, int to_buffer)
++                                    char *buffer, ushort count)
+ {
+     ushort cpcount,i, max_sg = gdth_sg_count(scp);
+     ushort cpsum,cpnow;
+@@ -2381,10 +2370,7 @@ static void gdth_copy_internal_data(gdth_ha_str *ha, Scsi_Cmnd *scp,
+             }
+             local_irq_save(flags);
+             address = kmap_atomic(sg_page(sl), KM_BIO_SRC_IRQ) + sl->offset;
+-            if (to_buffer)
+-                memcpy(buffer, address, cpnow);
+-            else
+-                memcpy(address, buffer, cpnow);
++            memcpy(address, buffer, cpnow);
+             flush_dcache_page(sg_page(sl));
+             kunmap_atomic(address, KM_BIO_SRC_IRQ);
+             local_irq_restore(flags);
+@@ -2438,7 +2424,7 @@ static int gdth_internal_cache_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp)
+         strcpy(inq.vendor,ha->oem_name);
+         sprintf(inq.product,"Host Drive  #%02d",t);
+         strcpy(inq.revision,"   ");
+-        gdth_copy_internal_data(ha, scp, (char*)&inq, sizeof(gdth_inq_data), 0);
++        gdth_copy_internal_data(ha, scp, (char*)&inq, sizeof(gdth_inq_data));
+         break;
+ 
+       case REQUEST_SENSE:
+@@ -2448,7 +2434,7 @@ static int gdth_internal_cache_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp)
+         sd.key       = NO_SENSE;
+         sd.info      = 0;
+         sd.add_length= 0;
+-        gdth_copy_internal_data(ha, scp, (char*)&sd, sizeof(gdth_sense_data), 0);
++        gdth_copy_internal_data(ha, scp, (char*)&sd, sizeof(gdth_sense_data));
+         break;
+ 
+       case MODE_SENSE:
+@@ -2460,7 +2446,7 @@ static int gdth_internal_cache_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp)
+         mpd.bd.block_length[0] = (SECTOR_SIZE & 0x00ff0000) >> 16;
+         mpd.bd.block_length[1] = (SECTOR_SIZE & 0x0000ff00) >> 8;
+         mpd.bd.block_length[2] = (SECTOR_SIZE & 0x000000ff);
+-        gdth_copy_internal_data(ha, scp, (char*)&mpd, sizeof(gdth_modep_data), 0);
++        gdth_copy_internal_data(ha, scp, (char*)&mpd, sizeof(gdth_modep_data));
+         break;
+ 
+       case READ_CAPACITY:
+@@ -2470,7 +2456,7 @@ static int gdth_internal_cache_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp)
+         else
+             rdc.last_block_no = cpu_to_be32(ha->hdr[t].size-1);
+         rdc.block_length  = cpu_to_be32(SECTOR_SIZE);
+-        gdth_copy_internal_data(ha, scp, (char*)&rdc, sizeof(gdth_rdcap_data), 0);
++        gdth_copy_internal_data(ha, scp, (char*)&rdc, sizeof(gdth_rdcap_data));
+         break;
+ 
+       case SERVICE_ACTION_IN:
+@@ -2482,7 +2468,7 @@ static int gdth_internal_cache_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp)
+             rdc16.last_block_no = cpu_to_be64(ha->hdr[t].size-1);
+             rdc16.block_length  = cpu_to_be32(SECTOR_SIZE);
+             gdth_copy_internal_data(ha, scp, (char*)&rdc16,
+-                                                 sizeof(gdth_rdcap16_data), 0);
++                                                 sizeof(gdth_rdcap16_data));
+         } else { 
+             scp->result = DID_ABORT << 16;
+         }
+@@ -2852,6 +2838,7 @@ static int gdth_fill_raw_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp, unchar b)
+ static int gdth_special_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp)
+ {
+     register gdth_cmd_str *cmdp;
++    struct gdth_cmndinfo *cmndinfo = gdth_cmnd_priv(scp);
+     int cmd_index;
+ 
+     cmdp= ha->pccb;
+@@ -2860,7 +2847,7 @@ static int gdth_special_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp)
+     if (ha->type==GDT_EISA && ha->cmd_cnt>0) 
+         return 0;
+ 
+-    gdth_copy_internal_data(ha, scp, (char *)cmdp, sizeof(gdth_cmd_str), 1);
++    *cmdp = *cmndinfo->internal_cmd_str;
+     cmdp->RequestBuffer = scp;
+ 
+     /* search free command index */
+@@ -3794,6 +3781,8 @@ static void gdth_timeout(ulong data)
+     gdth_ha_str *ha;
+     ulong flags;
+ 
++    BUG_ON(list_empty(&gdth_instances));
++
+     ha = list_first_entry(&gdth_instances, gdth_ha_str, list);
+     spin_lock_irqsave(&ha->smp_lock, flags);
+ 
+@@ -4669,45 +4658,6 @@ static void gdth_flush(gdth_ha_str *ha)
+     }
+ }
+ 
+-/* shutdown routine */
+-static int gdth_halt(struct notifier_block *nb, ulong event, void *buf)
+-{
+-    gdth_ha_str *ha;
+-#ifndef __alpha__
+-    gdth_cmd_str    gdtcmd;
+-    char            cmnd[MAX_COMMAND_SIZE];   
+-#endif
+-
+-    if (notifier_disabled)
+-        return NOTIFY_OK;
+-
+-    TRACE2(("gdth_halt() event %d\n",(int)event));
+-    if (event != SYS_RESTART && event != SYS_HALT && event != SYS_POWER_OFF)
+-        return NOTIFY_DONE;
+-
+-    notifier_disabled = 1;
+-    printk("GDT-HA: Flushing all host drives .. ");
+-    list_for_each_entry(ha, &gdth_instances, list) {
+-        gdth_flush(ha);
+-
+-#ifndef __alpha__
+-        /* controller reset */
+-        memset(cmnd, 0xff, MAX_COMMAND_SIZE);
+-        gdtcmd.BoardNode = LOCALBOARD;
+-        gdtcmd.Service = CACHESERVICE;
+-        gdtcmd.OpCode = GDT_RESET;
+-        TRACE2(("gdth_halt(): reset controller %d\n", ha->hanum));
+-        gdth_execute(ha->shost, &gdtcmd, cmnd, 10, NULL);
+-#endif
+-    }
+-    printk("Done.\n");
+-
+-#ifdef GDTH_STATISTICS
+-    del_timer(&gdth_timer);
+-#endif
+-    return NOTIFY_OK;
+-}
+-
+ /* configure lun */
+ static int gdth_slave_configure(struct scsi_device *sdev)
+ {
+@@ -5142,13 +5092,13 @@ static void gdth_remove_one(gdth_ha_str *ha)
+ 
+ 	scsi_remove_host(shp);
+ 
++	gdth_flush(ha);
++
+ 	if (ha->sdev) {
+ 		scsi_free_host_dev(ha->sdev);
+ 		ha->sdev = NULL;
+ 	}
+ 
+-	gdth_flush(ha);
+-
+ 	if (shp->irq)
+ 		free_irq(shp->irq,ha);
+ 
+@@ -5174,6 +5124,24 @@ static void gdth_remove_one(gdth_ha_str *ha)
+ 	scsi_host_put(shp);
+ }
+ 
++static int gdth_halt(struct notifier_block *nb, ulong event, void *buf)
++{
++	gdth_ha_str *ha;
++
++	TRACE2(("gdth_halt() event %d\n", (int)event));
++	if (event != SYS_RESTART && event != SYS_HALT && event != SYS_POWER_OFF)
++		return NOTIFY_DONE;
++
++	list_for_each_entry(ha, &gdth_instances, list)
++		gdth_flush(ha);
++
++	return NOTIFY_OK;
++}
++
++static struct notifier_block gdth_notifier = {
++    gdth_halt, NULL, 0
++};
++
+ static int __init gdth_init(void)
+ {
+ 	if (disable) {
+@@ -5236,7 +5204,6 @@ static int __init gdth_init(void)
+ 	add_timer(&gdth_timer);
+ #endif
+ 	major = register_chrdev(0,"gdth", &gdth_fops);
+-	notifier_disabled = 0;
+ 	register_reboot_notifier(&gdth_notifier);
+ 	gdth_polling = FALSE;
+ 	return 0;
+@@ -5246,14 +5213,15 @@ static void __exit gdth_exit(void)
+ {
+ 	gdth_ha_str *ha;
+ 
+-	list_for_each_entry(ha, &gdth_instances, list)
+-		gdth_remove_one(ha);
++	unregister_chrdev(major, "gdth");
++	unregister_reboot_notifier(&gdth_notifier);
+ 
+ #ifdef GDTH_STATISTICS
+-	del_timer(&gdth_timer);
++	del_timer_sync(&gdth_timer);
+ #endif
+-	unregister_chrdev(major,"gdth");
+-	unregister_reboot_notifier(&gdth_notifier);
++
++	list_for_each_entry(ha, &gdth_instances, list)
++		gdth_remove_one(ha);
+ }
+ 
+ module_init(gdth_init);
+diff --git a/drivers/scsi/gdth.h b/drivers/scsi/gdth.h
+index 1434c6b..26e4e92 100644
+--- a/drivers/scsi/gdth.h
++++ b/drivers/scsi/gdth.h
+@@ -915,6 +915,7 @@ typedef struct {
+     struct gdth_cmndinfo {                      /* per-command private info */
+         int index;
+         int internal_command;                   /* don't call scsi_done */
++        gdth_cmd_str *internal_cmd_str;         /* crier for internal messages*/
+         dma_addr_t sense_paddr;                 /* sense dma-addr */
+         unchar priority;
+         int timeout;
+diff --git a/drivers/scsi/ibmvscsi/ibmvstgt.c b/drivers/scsi/ibmvscsi/ibmvstgt.c
+index bd62131..e5881e9 100644
+--- a/drivers/scsi/ibmvscsi/ibmvstgt.c
++++ b/drivers/scsi/ibmvscsi/ibmvstgt.c
+@@ -290,7 +290,7 @@ static int ibmvstgt_cmd_done(struct scsi_cmnd *sc,
+ 	int err = 0;
+ 
+ 	dprintk("%p %p %x %u\n", iue, target, vio_iu(iue)->srp.cmd.cdb[0],
+-		cmd->usg_sg);
++		scsi_sg_count(sc));
+ 
+ 	if (scsi_sg_count(sc))
+ 		err = srp_transfer_data(sc, &vio_iu(iue)->srp.cmd, ibmvstgt_rdma, 1, 1);
+@@ -838,9 +838,6 @@ static int ibmvstgt_probe(struct vio_dev *dev, const struct vio_device_id *id)
+ 	if (!shost)
+ 		goto free_vport;
+ 	shost->transportt = ibmvstgt_transport_template;
+-	err = scsi_tgt_alloc_queue(shost);
+-	if (err)
+-		goto put_host;
+ 
+ 	target = host_to_srp_target(shost);
+ 	target->shost = shost;
+@@ -872,6 +869,10 @@ static int ibmvstgt_probe(struct vio_dev *dev, const struct vio_device_id *id)
+ 	if (err)
+ 		goto destroy_queue;
+ 
++	err = scsi_tgt_alloc_queue(shost);
++	if (err)
++		goto destroy_queue;
++
+ 	return 0;
+ destroy_queue:
+ 	crq_queue_destroy(target);
+diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c
+index 59f8445..bdd7de7 100644
+--- a/drivers/scsi/libiscsi.c
++++ b/drivers/scsi/libiscsi.c
+@@ -1708,8 +1708,8 @@ iscsi_session_setup(struct iscsi_transport *iscsit,
+ 		qdepth = ISCSI_DEF_CMD_PER_LUN;
+ 	}
+ 
+-	if (!is_power_of_2(cmds_max) ||
+-	    cmds_max >= ISCSI_MGMT_ITT_OFFSET) {
++	if (!is_power_of_2(cmds_max) || cmds_max >= ISCSI_MGMT_ITT_OFFSET ||
++	    cmds_max < 2) {
+ 		if (cmds_max != 0)
+ 			printk(KERN_ERR "iscsi: invalid can_queue of %d. "
+ 			       "can_queue must be a power of 2 and between "
+diff --git a/drivers/scsi/libsas/sas_ata.c b/drivers/scsi/libsas/sas_ata.c
+index 7cd05b5..b0e5ac3 100644
+--- a/drivers/scsi/libsas/sas_ata.c
++++ b/drivers/scsi/libsas/sas_ata.c
+@@ -236,12 +236,12 @@ static void sas_ata_phy_reset(struct ata_port *ap)
+ 	struct domain_device *dev = ap->private_data;
+ 	struct sas_internal *i =
+ 		to_sas_internal(dev->port->ha->core.shost->transportt);
+-	int res = 0;
++	int res = TMF_RESP_FUNC_FAILED;
+ 
+ 	if (i->dft->lldd_I_T_nexus_reset)
+ 		res = i->dft->lldd_I_T_nexus_reset(dev);
+ 
+-	if (res)
++	if (res != TMF_RESP_FUNC_COMPLETE)
+ 		SAS_DPRINTK("%s: Unable to reset I T nexus?\n", __FUNCTION__);
+ 
+ 	switch (dev->sata_dev.command_set) {
+@@ -656,21 +656,6 @@ out:
+ 	return res;
+ }
+ 
+-static void sas_sata_propagate_sas_addr(struct domain_device *dev)
+-{
+-	unsigned long flags;
+-	struct asd_sas_port *port = dev->port;
+-	struct asd_sas_phy  *phy;
+-
+-	BUG_ON(dev->parent);
+-
+-	memcpy(port->attached_sas_addr, dev->sas_addr, SAS_ADDR_SIZE);
+-	spin_lock_irqsave(&port->phy_list_lock, flags);
+-	list_for_each_entry(phy, &port->phy_list, port_phy_el)
+-		memcpy(phy->attached_sas_addr, dev->sas_addr, SAS_ADDR_SIZE);
+-	spin_unlock_irqrestore(&port->phy_list_lock, flags);
+-}
+-
+ #define ATA_IDENTIFY_DEV         0xEC
+ #define ATA_IDENTIFY_PACKET_DEV  0xA1
+ #define ATA_SET_FEATURES         0xEF
+@@ -728,26 +713,6 @@ static int sas_discover_sata_dev(struct domain_device *dev)
+ 			goto out_err;
+ 	}
+ cont1:
+-	/* Get WWN */
+-	if (dev->port->oob_mode != SATA_OOB_MODE) {
+-		memcpy(dev->sas_addr, dev->sata_dev.rps_resp.rps.stp_sas_addr,
+-		       SAS_ADDR_SIZE);
+-	} else if (dev->sata_dev.command_set == ATA_COMMAND_SET &&
+-		   (le16_to_cpu(dev->sata_dev.identify_device[108]) & 0xF000)
+-		   == 0x5000) {
+-		int i;
+-
+-		for (i = 0; i < 4; i++) {
+-			dev->sas_addr[2*i] =
+-	     (le16_to_cpu(dev->sata_dev.identify_device[108+i]) & 0xFF00) >> 8;
+-			dev->sas_addr[2*i+1] =
+-	      le16_to_cpu(dev->sata_dev.identify_device[108+i]) & 0x00FF;
+-		}
+-	}
+-	sas_hash_addr(dev->hashed_sas_addr, dev->sas_addr);
+-	if (!dev->parent)
+-		sas_sata_propagate_sas_addr(dev);
+-
+ 	/* XXX Hint: register this SATA device with SATL.
+ 	   When this returns, dev->sata_dev->lu is alive and
+ 	   present.
+diff --git a/drivers/scsi/libsas/sas_port.c b/drivers/scsi/libsas/sas_port.c
+index e1e2d08..39ae68a 100644
+--- a/drivers/scsi/libsas/sas_port.c
++++ b/drivers/scsi/libsas/sas_port.c
+@@ -92,9 +92,6 @@ static void sas_form_port(struct asd_sas_phy *phy)
+ 	if (!port->phy)
+ 		port->phy = phy->phy;
+ 
+-	SAS_DPRINTK("phy%d added to port%d, phy_mask:0x%x\n", phy->id,
+-		    port->id, port->phy_mask);
+-
+ 	if (*(u64 *)port->attached_sas_addr == 0) {
+ 		port->class = phy->class;
+ 		memcpy(port->attached_sas_addr, phy->attached_sas_addr,
+@@ -115,6 +112,11 @@ static void sas_form_port(struct asd_sas_phy *phy)
+ 	}
+ 	sas_port_add_phy(port->port, phy->phy);
+ 
++	SAS_DPRINTK("%s added to %s, phy_mask:0x%x (%16llx)\n",
++		    phy->phy->dev.bus_id,port->port->dev.bus_id,
++		    port->phy_mask,
++		    SAS_ADDR(port->attached_sas_addr));
++
+ 	if (port->port_dev)
+ 		port->port_dev->pathways = port->num_phys;
+ 
+@@ -255,12 +257,11 @@ void sas_porte_hard_reset(struct work_struct *work)
+ static void sas_init_port(struct asd_sas_port *port,
+ 			  struct sas_ha_struct *sas_ha, int i)
+ {
++	memset(port, 0, sizeof(*port));
+ 	port->id = i;
+ 	INIT_LIST_HEAD(&port->dev_list);
+ 	spin_lock_init(&port->phy_list_lock);
+ 	INIT_LIST_HEAD(&port->phy_list);
+-	port->num_phys = 0;
+-	port->phy_mask = 0;
+ 	port->ha = sas_ha;
+ 
+ 	spin_lock_init(&port->dev_list_lock);
+diff --git a/drivers/scsi/libsas/sas_scsi_host.c b/drivers/scsi/libsas/sas_scsi_host.c
+index 704ea06..1f82415 100644
+--- a/drivers/scsi/libsas/sas_scsi_host.c
++++ b/drivers/scsi/libsas/sas_scsi_host.c
+@@ -434,7 +434,7 @@ static int sas_recover_I_T(struct domain_device *dev)
+ }
+ 
+ /* Find the sas_phy that's attached to this device */
+-static struct sas_phy *find_local_sas_phy(struct domain_device *dev)
++struct sas_phy *sas_find_local_phy(struct domain_device *dev)
+ {
+ 	struct domain_device *pdev = dev->parent;
+ 	struct ex_phy *exphy = NULL;
+@@ -456,6 +456,7 @@ static struct sas_phy *find_local_sas_phy(struct domain_device *dev)
+ 	BUG_ON(!exphy);
+ 	return exphy->phy;
+ }
++EXPORT_SYMBOL_GPL(sas_find_local_phy);
+ 
+ /* Attempt to send a LUN reset message to a device */
+ int sas_eh_device_reset_handler(struct scsi_cmnd *cmd)
+@@ -482,7 +483,7 @@ int sas_eh_device_reset_handler(struct scsi_cmnd *cmd)
+ int sas_eh_bus_reset_handler(struct scsi_cmnd *cmd)
+ {
+ 	struct domain_device *dev = cmd_to_domain_dev(cmd);
+-	struct sas_phy *phy = find_local_sas_phy(dev);
++	struct sas_phy *phy = sas_find_local_phy(dev);
+ 	int res;
+ 
+ 	res = sas_phy_reset(phy, 1);
+@@ -497,10 +498,10 @@ int sas_eh_bus_reset_handler(struct scsi_cmnd *cmd)
+ }
+ 
+ /* Try to reset a device */
+-static int try_to_reset_cmd_device(struct Scsi_Host *shost,
+-				   struct scsi_cmnd *cmd)
++static int try_to_reset_cmd_device(struct scsi_cmnd *cmd)
+ {
+ 	int res;
++	struct Scsi_Host *shost = cmd->device->host;
+ 
+ 	if (!shost->hostt->eh_device_reset_handler)
+ 		goto try_bus_reset;
+@@ -540,6 +541,12 @@ Again:
+ 		need_reset = task->task_state_flags & SAS_TASK_NEED_DEV_RESET;
+ 		spin_unlock_irqrestore(&task->task_state_lock, flags);
+ 
++		if (need_reset) {
++			SAS_DPRINTK("%s: task 0x%p requests reset\n",
++				    __FUNCTION__, task);
++			goto reset;
++		}
++
+ 		SAS_DPRINTK("trying to find task 0x%p\n", task);
+ 		res = sas_scsi_find_task(task);
+ 
+@@ -550,18 +557,15 @@ Again:
+ 			SAS_DPRINTK("%s: task 0x%p is done\n", __FUNCTION__,
+ 				    task);
+ 			sas_eh_finish_cmd(cmd);
+-			if (need_reset)
+-				try_to_reset_cmd_device(shost, cmd);
+ 			continue;
+ 		case TASK_IS_ABORTED:
+ 			SAS_DPRINTK("%s: task 0x%p is aborted\n",
+ 				    __FUNCTION__, task);
+ 			sas_eh_finish_cmd(cmd);
+-			if (need_reset)
+-				try_to_reset_cmd_device(shost, cmd);
+ 			continue;
+ 		case TASK_IS_AT_LU:
+ 			SAS_DPRINTK("task 0x%p is at LU: lu recover\n", task);
++ reset:
+ 			tmf_resp = sas_recover_lu(task->dev, cmd);
+ 			if (tmf_resp == TMF_RESP_FUNC_COMPLETE) {
+ 				SAS_DPRINTK("dev %016llx LU %x is "
+@@ -569,8 +573,6 @@ Again:
+ 					    SAS_ADDR(task->dev),
+ 					    cmd->device->lun);
+ 				sas_eh_finish_cmd(cmd);
+-				if (need_reset)
+-					try_to_reset_cmd_device(shost, cmd);
+ 				sas_scsi_clear_queue_lu(work_q, cmd);
+ 				goto Again;
+ 			}
+@@ -581,15 +583,15 @@ Again:
+ 				    task);
+ 			tmf_resp = sas_recover_I_T(task->dev);
+ 			if (tmf_resp == TMF_RESP_FUNC_COMPLETE) {
++				struct domain_device *dev = task->dev;
+ 				SAS_DPRINTK("I_T %016llx recovered\n",
+ 					    SAS_ADDR(task->dev->sas_addr));
+ 				sas_eh_finish_cmd(cmd);
+-				if (need_reset)
+-					try_to_reset_cmd_device(shost, cmd);
+-				sas_scsi_clear_queue_I_T(work_q, task->dev);
++				sas_scsi_clear_queue_I_T(work_q, dev);
+ 				goto Again;
+ 			}
+ 			/* Hammer time :-) */
++			try_to_reset_cmd_device(cmd);
+ 			if (i->dft->lldd_clear_nexus_port) {
+ 				struct asd_sas_port *port = task->dev->port;
+ 				SAS_DPRINTK("clearing nexus for port:%d\n",
+@@ -599,8 +601,6 @@ Again:
+ 					SAS_DPRINTK("clear nexus port:%d "
+ 						    "succeeded\n", port->id);
+ 					sas_eh_finish_cmd(cmd);
+-					if (need_reset)
+-						try_to_reset_cmd_device(shost, cmd);
+ 					sas_scsi_clear_queue_port(work_q,
+ 								  port);
+ 					goto Again;
+@@ -613,8 +613,6 @@ Again:
+ 					SAS_DPRINTK("clear nexus ha "
+ 						    "succeeded\n");
+ 					sas_eh_finish_cmd(cmd);
+-					if (need_reset)
+-						try_to_reset_cmd_device(shost, cmd);
+ 					goto clear_q;
+ 				}
+ 			}
+@@ -628,8 +626,6 @@ Again:
+ 				    cmd->device->lun);
+ 
+ 			sas_eh_finish_cmd(cmd);
+-			if (need_reset)
+-				try_to_reset_cmd_device(shost, cmd);
+ 			goto clear_q;
+ 		}
+ 	}
+diff --git a/drivers/scsi/mvsas.c b/drivers/scsi/mvsas.c
+index d4a6ac3..5ec0665 100644
+--- a/drivers/scsi/mvsas.c
++++ b/drivers/scsi/mvsas.c
+@@ -40,7 +40,7 @@
+ #include <asm/io.h>
+ 
+ #define DRV_NAME	"mvsas"
+-#define DRV_VERSION	"0.5"
++#define DRV_VERSION	"0.5.1"
+ #define _MV_DUMP 0
+ #define MVS_DISABLE_NVRAM
+ #define MVS_DISABLE_MSI
+@@ -1005,7 +1005,7 @@ err_out:
+ 	return rc;
+ #else
+ 	/* FIXME , For SAS target mode */
+-	memcpy(buf, "\x00\x00\xab\x11\x30\x04\x05\x50", 8);
++	memcpy(buf, "\x50\x05\x04\x30\x11\xab\x00\x00", 8);
+ 	return 0;
+ #endif
+ }
+@@ -1330,7 +1330,7 @@ static int mvs_int_rx(struct mvs_info *mvi, bool self_clear)
+ 
+ 		mvs_hba_cq_dump(mvi);
+ 
+-		if (unlikely(rx_desc & RXQ_DONE))
++		if (likely(rx_desc & RXQ_DONE))
+ 			mvs_slot_complete(mvi, rx_desc);
+ 		if (rx_desc & RXQ_ATTN) {
+ 			attn = true;
+@@ -2720,9 +2720,8 @@ static int __devinit mvs_hw_init(struct mvs_info *mvi)
+ 	msleep(100);
+ 	/* init and reset phys */
+ 	for (i = 0; i < mvi->chip->n_phy; i++) {
+-		/* FIXME: is this the correct dword order? */
+-		u32 lo = *((u32 *)&mvi->sas_addr[0]);
+-		u32 hi = *((u32 *)&mvi->sas_addr[4]);
++		u32 lo = be32_to_cpu(*(u32 *)&mvi->sas_addr[4]);
++		u32 hi = be32_to_cpu(*(u32 *)&mvi->sas_addr[0]);
+ 
+ 		mvs_detect_porttype(mvi, i);
+ 
+diff --git a/drivers/scsi/ps3rom.c b/drivers/scsi/ps3rom.c
+index 0cd614a..fad6cb5 100644
+--- a/drivers/scsi/ps3rom.c
++++ b/drivers/scsi/ps3rom.c
+@@ -124,7 +124,7 @@ static int fill_from_dev_buffer(struct scsi_cmnd *cmd, const void *buf)
+ 		}
+ 		req_len += sgpnt->length;
+ 	}
+-	scsi_set_resid(cmd, req_len - act_len);
++	scsi_set_resid(cmd, buflen - act_len);
+ 	return 0;
+ }
+ 
+@@ -427,7 +427,7 @@ static struct scsi_host_template ps3rom_host_template = {
+ 	.cmd_per_lun =		1,
+ 	.emulated =             1,		/* only sg driver uses this */
+ 	.max_sectors =		PS3ROM_MAX_SECTORS,
+-	.use_clustering =	ENABLE_CLUSTERING,
++	.use_clustering =	DISABLE_CLUSTERING,
+ 	.module =		THIS_MODULE,
+ };
+ 
+diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c
+index 6226d88..c180876 100644
+--- a/drivers/scsi/qla2xxx/qla_gs.c
++++ b/drivers/scsi/qla2xxx/qla_gs.c
+@@ -39,7 +39,7 @@ qla2x00_prep_ms_iocb(scsi_qla_host_t *ha, uint32_t req_size, uint32_t rsp_size)
+ 	ms_pkt->entry_count = 1;
+ 	SET_TARGET_ID(ha, ms_pkt->loop_id, SIMPLE_NAME_SERVER);
+ 	ms_pkt->control_flags = __constant_cpu_to_le16(CF_READ | CF_HEAD_TAG);
+-	ms_pkt->timeout = __constant_cpu_to_le16(25);
++	ms_pkt->timeout = cpu_to_le16(ha->r_a_tov / 10 * 2);
+ 	ms_pkt->cmd_dsd_count = __constant_cpu_to_le16(1);
+ 	ms_pkt->total_dsd_count = __constant_cpu_to_le16(2);
+ 	ms_pkt->rsp_bytecount = cpu_to_le32(rsp_size);
+@@ -75,7 +75,7 @@ qla24xx_prep_ms_iocb(scsi_qla_host_t *ha, uint32_t req_size, uint32_t rsp_size)
+ 	ct_pkt->entry_type = CT_IOCB_TYPE;
+ 	ct_pkt->entry_count = 1;
+ 	ct_pkt->nport_handle = __constant_cpu_to_le16(NPH_SNS);
+-	ct_pkt->timeout = __constant_cpu_to_le16(25);
++	ct_pkt->timeout = cpu_to_le16(ha->r_a_tov / 10 * 2);
+ 	ct_pkt->cmd_dsd_count = __constant_cpu_to_le16(1);
+ 	ct_pkt->rsp_dsd_count = __constant_cpu_to_le16(1);
+ 	ct_pkt->rsp_byte_count = cpu_to_le32(rsp_size);
+@@ -1144,7 +1144,7 @@ qla2x00_prep_ms_fdmi_iocb(scsi_qla_host_t *ha, uint32_t req_size,
+ 	ms_pkt->entry_count = 1;
+ 	SET_TARGET_ID(ha, ms_pkt->loop_id, ha->mgmt_svr_loop_id);
+ 	ms_pkt->control_flags = __constant_cpu_to_le16(CF_READ | CF_HEAD_TAG);
+-	ms_pkt->timeout = __constant_cpu_to_le16(59);
++	ms_pkt->timeout = cpu_to_le16(ha->r_a_tov / 10 * 2);
+ 	ms_pkt->cmd_dsd_count = __constant_cpu_to_le16(1);
+ 	ms_pkt->total_dsd_count = __constant_cpu_to_le16(2);
+ 	ms_pkt->rsp_bytecount = cpu_to_le32(rsp_size);
+@@ -1181,7 +1181,7 @@ qla24xx_prep_ms_fdmi_iocb(scsi_qla_host_t *ha, uint32_t req_size,
+ 	ct_pkt->entry_type = CT_IOCB_TYPE;
+ 	ct_pkt->entry_count = 1;
+ 	ct_pkt->nport_handle = cpu_to_le16(ha->mgmt_svr_loop_id);
+-	ct_pkt->timeout = __constant_cpu_to_le16(59);
++	ct_pkt->timeout = cpu_to_le16(ha->r_a_tov / 10 * 2);
+ 	ct_pkt->cmd_dsd_count = __constant_cpu_to_le16(1);
+ 	ct_pkt->rsp_dsd_count = __constant_cpu_to_le16(1);
+ 	ct_pkt->rsp_byte_count = cpu_to_le32(rsp_size);
+@@ -1761,7 +1761,7 @@ qla24xx_prep_ms_fm_iocb(scsi_qla_host_t *ha, uint32_t req_size,
+ 	ct_pkt->entry_type = CT_IOCB_TYPE;
+ 	ct_pkt->entry_count = 1;
+ 	ct_pkt->nport_handle = cpu_to_le16(ha->mgmt_svr_loop_id);
+-	ct_pkt->timeout = __constant_cpu_to_le16(59);
++	ct_pkt->timeout = cpu_to_le16(ha->r_a_tov / 10 * 2);
+ 	ct_pkt->cmd_dsd_count = __constant_cpu_to_le16(1);
+ 	ct_pkt->rsp_dsd_count = __constant_cpu_to_le16(1);
+ 	ct_pkt->rsp_byte_count = cpu_to_le32(rsp_size);
+diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
+index d5c7853..364be7d 100644
+--- a/drivers/scsi/qla2xxx/qla_init.c
++++ b/drivers/scsi/qla2xxx/qla_init.c
+@@ -1733,8 +1733,8 @@ qla2x00_nvram_config(scsi_qla_host_t *ha)
+ 	ha->login_timeout = nv->login_timeout;
+ 	icb->login_timeout = nv->login_timeout;
+ 
+-	/* Set minimum RATOV to 200 tenths of a second. */
+-	ha->r_a_tov = 200;
++	/* Set minimum RATOV to 100 tenths of a second. */
++	ha->r_a_tov = 100;
+ 
+ 	ha->loop_reset_delay = nv->reset_delay;
+ 
+@@ -3645,8 +3645,8 @@ qla24xx_nvram_config(scsi_qla_host_t *ha)
+ 	ha->login_timeout = le16_to_cpu(nv->login_timeout);
+ 	icb->login_timeout = cpu_to_le16(nv->login_timeout);
+ 
+-	/* Set minimum RATOV to 200 tenths of a second. */
+-	ha->r_a_tov = 200;
++	/* Set minimum RATOV to 100 tenths of a second. */
++	ha->r_a_tov = 100;
+ 
+ 	ha->loop_reset_delay = nv->reset_delay;
+ 
+@@ -4022,7 +4022,8 @@ qla2x00_try_to_stop_firmware(scsi_qla_host_t *ha)
+ 		return;
+ 
+ 	ret = qla2x00_stop_firmware(ha);
+-	for (retries = 5; ret != QLA_SUCCESS && retries ; retries--) {
++	for (retries = 5; ret != QLA_SUCCESS && ret != QLA_FUNCTION_TIMEOUT &&
++	    retries ; retries--) {
+ 		qla2x00_reset_chip(ha);
+ 		if (qla2x00_chip_diag(ha) != QLA_SUCCESS)
+ 			continue;
+diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c
+index 14e6f22..f033703 100644
+--- a/drivers/scsi/qla2xxx/qla_isr.c
++++ b/drivers/scsi/qla2xxx/qla_isr.c
+@@ -958,6 +958,11 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt)
+ 		}
+ 	}
+ 
++	/* Check for overrun. */
++	if (IS_FWI2_CAPABLE(ha) && comp_status == CS_COMPLETE &&
++	    scsi_status & SS_RESIDUAL_OVER)
++		comp_status = CS_DATA_OVERRUN;
++
+ 	/*
+ 	 * Based on Host and scsi status generate status code for Linux
+ 	 */
+diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c
+index 99d29ff..bb10358 100644
+--- a/drivers/scsi/qla2xxx/qla_mbx.c
++++ b/drivers/scsi/qla2xxx/qla_mbx.c
+@@ -2206,7 +2206,7 @@ qla24xx_abort_target(fc_port_t *fcport)
+ 	tsk->p.tsk.entry_type = TSK_MGMT_IOCB_TYPE;
+ 	tsk->p.tsk.entry_count = 1;
+ 	tsk->p.tsk.nport_handle = cpu_to_le16(fcport->loop_id);
+-	tsk->p.tsk.timeout = __constant_cpu_to_le16(25);
++	tsk->p.tsk.timeout = cpu_to_le16(ha->r_a_tov / 10 * 2);
+ 	tsk->p.tsk.control_flags = __constant_cpu_to_le32(TCF_TARGET_RESET);
+ 	tsk->p.tsk.port_id[0] = fcport->d_id.b.al_pa;
+ 	tsk->p.tsk.port_id[1] = fcport->d_id.b.area;
+diff --git a/drivers/scsi/qla2xxx/qla_version.h b/drivers/scsi/qla2xxx/qla_version.h
+index c5742cc..ea08a12 100644
+--- a/drivers/scsi/qla2xxx/qla_version.h
++++ b/drivers/scsi/qla2xxx/qla_version.h
+@@ -7,7 +7,7 @@
+ /*
+  * Driver version
+  */
+-#define QLA2XXX_VERSION      "8.02.00-k8"
++#define QLA2XXX_VERSION      "8.02.00-k9"
+ 
+ #define QLA_DRIVER_MAJOR_VER	8
+ #define QLA_DRIVER_MINOR_VER	2
+diff --git a/drivers/scsi/qla4xxx/ql4_init.c b/drivers/scsi/qla4xxx/ql4_init.c
+index 10b3b9a..109c5f5 100644
+--- a/drivers/scsi/qla4xxx/ql4_init.c
++++ b/drivers/scsi/qla4xxx/ql4_init.c
+@@ -1299,9 +1299,9 @@ int qla4xxx_process_ddb_changed(struct scsi_qla_host *ha,
+ 	ddb_entry->fw_ddb_device_state = state;
+ 	/* Device is back online. */
+ 	if (ddb_entry->fw_ddb_device_state == DDB_DS_SESSION_ACTIVE) {
++		atomic_set(&ddb_entry->state, DDB_STATE_ONLINE);
+ 		atomic_set(&ddb_entry->port_down_timer,
+ 			   ha->port_down_retry_count);
+-		atomic_set(&ddb_entry->state, DDB_STATE_ONLINE);
+ 		atomic_set(&ddb_entry->relogin_retry_count, 0);
+ 		atomic_set(&ddb_entry->relogin_timer, 0);
+ 		clear_bit(DF_RELOGIN, &ddb_entry->flags);
+diff --git a/drivers/scsi/qla4xxx/ql4_os.c b/drivers/scsi/qla4xxx/ql4_os.c
+index c3c59d7..8b92f34 100644
+--- a/drivers/scsi/qla4xxx/ql4_os.c
++++ b/drivers/scsi/qla4xxx/ql4_os.c
+@@ -75,6 +75,7 @@ static int qla4xxx_eh_host_reset(struct scsi_cmnd *cmd);
+ static int qla4xxx_slave_alloc(struct scsi_device *device);
+ static int qla4xxx_slave_configure(struct scsi_device *device);
+ static void qla4xxx_slave_destroy(struct scsi_device *sdev);
++static void qla4xxx_scan_start(struct Scsi_Host *shost);
+ 
+ static struct scsi_host_template qla4xxx_driver_template = {
+ 	.module			= THIS_MODULE,
+@@ -90,6 +91,7 @@ static struct scsi_host_template qla4xxx_driver_template = {
+ 	.slave_destroy		= qla4xxx_slave_destroy,
+ 
+ 	.scan_finished		= iscsi_scan_finished,
++	.scan_start		= qla4xxx_scan_start,
+ 
+ 	.this_id		= -1,
+ 	.cmd_per_lun		= 3,
+@@ -299,6 +301,18 @@ struct ddb_entry *qla4xxx_alloc_sess(struct scsi_qla_host *ha)
+ 	return ddb_entry;
+ }
+ 
++static void qla4xxx_scan_start(struct Scsi_Host *shost)
++{
++	struct scsi_qla_host *ha = shost_priv(shost);
++	struct ddb_entry *ddb_entry, *ddbtemp;
++
++	/* finish setup of sessions that were already setup in firmware */
++	list_for_each_entry_safe(ddb_entry, ddbtemp, &ha->ddb_list, list) {
++		if (ddb_entry->fw_ddb_device_state == DDB_DS_SESSION_ACTIVE)
++			qla4xxx_add_sess(ddb_entry);
++	}
++}
++
+ /*
+  * Timer routines
+  */
+@@ -864,8 +878,9 @@ static void qla4xxx_flush_active_srbs(struct scsi_qla_host *ha)
+  * qla4xxx_recover_adapter - recovers adapter after a fatal error
+  * @ha: Pointer to host adapter structure.
+  * @renew_ddb_list: Indicates what to do with the adapter's ddb list
+- *	after adapter recovery has completed.
+- *	0=preserve ddb list, 1=destroy and rebuild ddb list
++ *
++ * renew_ddb_list value can be 0=preserve ddb list, 1=destroy and rebuild
++ * ddb list.
+  **/
+ static int qla4xxx_recover_adapter(struct scsi_qla_host *ha,
+ 				uint8_t renew_ddb_list)
+@@ -874,6 +889,7 @@ static int qla4xxx_recover_adapter(struct scsi_qla_host *ha,
+ 
+ 	/* Stall incoming I/O until we are done */
+ 	clear_bit(AF_ONLINE, &ha->flags);
++
+ 	DEBUG2(printk("scsi%ld: %s calling qla4xxx_cmd_wait\n", ha->host_no,
+ 		      __func__));
+ 
+@@ -1176,7 +1192,6 @@ static int __devinit qla4xxx_probe_adapter(struct pci_dev *pdev,
+ 	int ret = -ENODEV, status;
+ 	struct Scsi_Host *host;
+ 	struct scsi_qla_host *ha;
+-	struct ddb_entry *ddb_entry, *ddbtemp;
+ 	uint8_t init_retry_count = 0;
+ 	char buf[34];
+ 
+@@ -1295,13 +1310,6 @@ static int __devinit qla4xxx_probe_adapter(struct pci_dev *pdev,
+ 	if (ret)
+ 		goto probe_failed;
+ 
+-	/* Update transport device information for all devices. */
+-	list_for_each_entry_safe(ddb_entry, ddbtemp, &ha->ddb_list, list) {
+-		if (ddb_entry->fw_ddb_device_state == DDB_DS_SESSION_ACTIVE)
+-			if (qla4xxx_add_sess(ddb_entry))
+-				goto remove_host;
+-	}
+-
+ 	printk(KERN_INFO
+ 	       " QLogic iSCSI HBA Driver version: %s\n"
+ 	       "  QLogic ISP%04x @ %s, host#=%ld, fw=%02d.%02d.%02d.%02d\n",
+@@ -1311,10 +1319,6 @@ static int __devinit qla4xxx_probe_adapter(struct pci_dev *pdev,
+ 	scsi_scan_host(host);
+ 	return 0;
+ 
+-remove_host:
+-	qla4xxx_free_ddb_list(ha);
+-	scsi_remove_host(host);
+-
+ probe_failed:
+ 	qla4xxx_free_adapter(ha);
+ 	scsi_host_put(ha->host);
+@@ -1600,9 +1604,12 @@ static int qla4xxx_eh_host_reset(struct scsi_cmnd *cmd)
+ 		return FAILED;
+ 	}
+ 
+-	if (qla4xxx_recover_adapter(ha, PRESERVE_DDB_LIST) == QLA_SUCCESS) {
++	/* make sure the dpc thread is stopped while we reset the hba */
++	clear_bit(AF_ONLINE, &ha->flags);
++	flush_workqueue(ha->dpc_thread);
++
++	if (qla4xxx_recover_adapter(ha, PRESERVE_DDB_LIST) == QLA_SUCCESS)
+ 		return_status = SUCCESS;
+-	}
+ 
+ 	dev_info(&ha->pdev->dev, "HOST RESET %s.\n",
+ 		   return_status == FAILED ? "FAILED" : "SUCCEDED");
+diff --git a/drivers/scsi/scsi_tgt_lib.c b/drivers/scsi/scsi_tgt_lib.c
+index 3677fbb..a0f308b 100644
+--- a/drivers/scsi/scsi_tgt_lib.c
++++ b/drivers/scsi/scsi_tgt_lib.c
+@@ -103,7 +103,6 @@ struct scsi_cmnd *scsi_host_get_command(struct Scsi_Host *shost,
+ 	if (!cmd)
+ 		goto release_rq;
+ 
+-	memset(cmd, 0, sizeof(*cmd));
+ 	cmd->sc_data_direction = data_dir;
+ 	cmd->jiffies_at_alloc = jiffies;
+ 	cmd->request = rq;
+@@ -382,6 +381,11 @@ static int scsi_map_user_pages(struct scsi_tgt_cmd *tcmd, struct scsi_cmnd *cmd,
+ 		scsi_release_buffers(cmd);
+ 		goto unmap_rq;
+ 	}
++	/*
++	 * we use REQ_TYPE_BLOCK_PC so scsi_init_io doesn't set the
++	 * length for us.
++	 */
++	cmd->sdb.length = rq->data_len;
+ 
+ 	return 0;
+ 
+diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c
+index 9981682..ca7bb6f 100644
+--- a/drivers/scsi/scsi_transport_iscsi.c
++++ b/drivers/scsi/scsi_transport_iscsi.c
+@@ -33,7 +33,7 @@
+ #define ISCSI_SESSION_ATTRS 19
+ #define ISCSI_CONN_ATTRS 13
+ #define ISCSI_HOST_ATTRS 4
+-#define ISCSI_TRANSPORT_VERSION "2.0-868"
++#define ISCSI_TRANSPORT_VERSION "2.0-869"
+ 
+ struct iscsi_internal {
+ 	int daemon_pid;
+@@ -373,24 +373,25 @@ static void session_recovery_timedout(struct work_struct *work)
+ 	scsi_target_unblock(&session->dev);
+ }
+ 
+-static void __iscsi_unblock_session(struct iscsi_cls_session *session)
+-{
+-	if (!cancel_delayed_work(&session->recovery_work))
+-		flush_workqueue(iscsi_eh_timer_workq);
+-	scsi_target_unblock(&session->dev);
+-}
+-
+-void iscsi_unblock_session(struct iscsi_cls_session *session)
++static void __iscsi_unblock_session(struct work_struct *work)
+ {
++	struct iscsi_cls_session *session =
++			container_of(work, struct iscsi_cls_session,
++				     unblock_work);
+ 	struct Scsi_Host *shost = iscsi_session_to_shost(session);
+ 	struct iscsi_host *ihost = shost->shost_data;
+ 	unsigned long flags;
+ 
++	/*
++	 * The recovery and unblock work get run from the same workqueue,
++	 * so try to cancel it if it was going to run after this unblock.
++	 */
++	cancel_delayed_work(&session->recovery_work);
+ 	spin_lock_irqsave(&session->lock, flags);
+ 	session->state = ISCSI_SESSION_LOGGED_IN;
+ 	spin_unlock_irqrestore(&session->lock, flags);
+-
+-	__iscsi_unblock_session(session);
++	/* start IO */
++	scsi_target_unblock(&session->dev);
+ 	/*
+ 	 * Only do kernel scanning if the driver is properly hooked into
+ 	 * the async scanning code (drivers like iscsi_tcp do login and
+@@ -401,20 +402,43 @@ void iscsi_unblock_session(struct iscsi_cls_session *session)
+ 			atomic_inc(&ihost->nr_scans);
+ 	}
+ }
++
++/**
++ * iscsi_unblock_session - set a session as logged in and start IO.
++ * @session: iscsi session
++ *
++ * Mark a session as ready to accept IO.
++ */
++void iscsi_unblock_session(struct iscsi_cls_session *session)
++{
++	queue_work(iscsi_eh_timer_workq, &session->unblock_work);
++	/*
++	 * make sure all the events have completed before tell the driver
++	 * it is safe
++	 */
++	flush_workqueue(iscsi_eh_timer_workq);
++}
+ EXPORT_SYMBOL_GPL(iscsi_unblock_session);
+ 
+-void iscsi_block_session(struct iscsi_cls_session *session)
++static void __iscsi_block_session(struct work_struct *work)
+ {
++	struct iscsi_cls_session *session =
++			container_of(work, struct iscsi_cls_session,
++				     block_work);
+ 	unsigned long flags;
+ 
+ 	spin_lock_irqsave(&session->lock, flags);
+ 	session->state = ISCSI_SESSION_FAILED;
+ 	spin_unlock_irqrestore(&session->lock, flags);
+-
+ 	scsi_target_block(&session->dev);
+ 	queue_delayed_work(iscsi_eh_timer_workq, &session->recovery_work,
+ 			   session->recovery_tmo * HZ);
+ }
++
++void iscsi_block_session(struct iscsi_cls_session *session)
++{
++	queue_work(iscsi_eh_timer_workq, &session->block_work);
++}
+ EXPORT_SYMBOL_GPL(iscsi_block_session);
+ 
+ static void __iscsi_unbind_session(struct work_struct *work)
+@@ -463,6 +487,8 @@ iscsi_alloc_session(struct Scsi_Host *shost,
+ 	INIT_DELAYED_WORK(&session->recovery_work, session_recovery_timedout);
+ 	INIT_LIST_HEAD(&session->host_list);
+ 	INIT_LIST_HEAD(&session->sess_list);
++	INIT_WORK(&session->unblock_work, __iscsi_unblock_session);
++	INIT_WORK(&session->block_work, __iscsi_block_session);
+ 	INIT_WORK(&session->unbind_work, __iscsi_unbind_session);
+ 	INIT_WORK(&session->scan_work, iscsi_scan_session);
+ 	spin_lock_init(&session->lock);
+@@ -575,24 +601,25 @@ void iscsi_remove_session(struct iscsi_cls_session *session)
+ 	list_del(&session->sess_list);
+ 	spin_unlock_irqrestore(&sesslock, flags);
+ 
++	/* make sure there are no blocks/unblocks queued */
++	flush_workqueue(iscsi_eh_timer_workq);
++	/* make sure the timedout callout is not running */
++	if (!cancel_delayed_work(&session->recovery_work))
++		flush_workqueue(iscsi_eh_timer_workq);
+ 	/*
+ 	 * If we are blocked let commands flow again. The lld or iscsi
+ 	 * layer should set up the queuecommand to fail commands.
++	 * We assume that LLD will not be calling block/unblock while
++	 * removing the session.
+ 	 */
+ 	spin_lock_irqsave(&session->lock, flags);
+ 	session->state = ISCSI_SESSION_FREE;
+ 	spin_unlock_irqrestore(&session->lock, flags);
+-	__iscsi_unblock_session(session);
+-	__iscsi_unbind_session(&session->unbind_work);
+ 
+-	/* flush running scans */
++	scsi_target_unblock(&session->dev);
++	/* flush running scans then delete devices */
+ 	flush_workqueue(ihost->scan_workq);
+-	/*
+-	 * If the session dropped while removing devices then we need to make
+-	 * sure it is not blocked
+-	 */
+-	if (!cancel_delayed_work(&session->recovery_work))
+-		flush_workqueue(iscsi_eh_timer_workq);
++	__iscsi_unbind_session(&session->unbind_work);
+ 
+ 	/* hw iscsi may not have removed all connections from session */
+ 	err = device_for_each_child(&session->dev, NULL,
+@@ -802,23 +829,16 @@ EXPORT_SYMBOL_GPL(iscsi_recv_pdu);
+ 
+ void iscsi_conn_error(struct iscsi_cls_conn *conn, enum iscsi_err error)
+ {
+-	struct iscsi_cls_session *session = iscsi_conn_to_session(conn);
+ 	struct nlmsghdr	*nlh;
+ 	struct sk_buff	*skb;
+ 	struct iscsi_uevent *ev;
+ 	struct iscsi_internal *priv;
+ 	int len = NLMSG_SPACE(sizeof(*ev));
+-	unsigned long flags;
+ 
+ 	priv = iscsi_if_transport_lookup(conn->transport);
+ 	if (!priv)
+ 		return;
+ 
+-	spin_lock_irqsave(&session->lock, flags);
+-	if (session->state == ISCSI_SESSION_LOGGED_IN)
+-		session->state = ISCSI_SESSION_FAILED;
+-	spin_unlock_irqrestore(&session->lock, flags);
+-
+ 	skb = alloc_skb(len, GFP_ATOMIC);
+ 	if (!skb) {
+ 		iscsi_cls_conn_printk(KERN_ERR, conn, "gracefully ignored "
+diff --git a/drivers/video/hitfb.c b/drivers/video/hitfb.c
+index 756c0ce..392a8be 100644
+--- a/drivers/video/hitfb.c
++++ b/drivers/video/hitfb.c
+@@ -403,7 +403,7 @@ static int __init hitfb_probe(struct platform_device *dev)
+ 	return 0;
+ }
+ 
+-static int __devexit hitfb_remove(struct platform_device *dev)
++static int __exit hitfb_remove(struct platform_device *dev)
+ {
+ 	return unregister_framebuffer(&fb_info);
+ }
+@@ -439,7 +439,7 @@ static int hitfb_resume(struct platform_device *dev)
+ 
+ static struct platform_driver hitfb_driver = {
+ 	.probe		= hitfb_probe,
+-	.remove		= __devexit_p(hitfb_remove),
++	.remove		= __exit_p(hitfb_remove),
+ #ifdef CONFIG_PM
+ 	.suspend	= hitfb_suspend,
+ 	.resume		= hitfb_resume,
+diff --git a/drivers/video/pvr2fb.c b/drivers/video/pvr2fb.c
+index 6a3d0b5..8c863a7 100644
+--- a/drivers/video/pvr2fb.c
++++ b/drivers/video/pvr2fb.c
+@@ -1,16 +1,12 @@
+-/* drivers/video/pvr2fb.c
++/*
++ * drivers/video/pvr2fb.c
+  *
+  * Frame buffer and fbcon support for the NEC PowerVR2 found within the Sega
+  * Dreamcast.
+  *
+  * Copyright (c) 2001 M. R. Brown <mrbrown at 0xd6.org>
+- * Copyright (c) 2001, 2002, 2003, 2004, 2005 Paul Mundt <lethal at linux-sh.org>
+- *
+- * This file is part of the LinuxDC project (linuxdc.sourceforge.net).
++ * Copyright (c) 2001 - 2008  Paul Mundt <lethal at linux-sh.org>
+  *
+- */
+-
+-/*
+  * This driver is mostly based on the excellent amifb and vfb sources.  It uses
+  * an odd scheme for converting hardware values to/from framebuffer values,
+  * here are some hacked-up formulas:
+@@ -490,7 +486,7 @@ static int pvr2fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
+ 	} else {
+ 		var->sync &= ~FB_SYNC_BROADCAST;
+ 		var->vmode &= ~FB_VMODE_INTERLACED;
+-		var->vmode |= pvr2_var.vmode;
++		var->vmode |= FB_VMODE_NONINTERLACED;
+ 	}
+ 
+ 	if ((var->activate & FB_ACTIVATE_MASK) != FB_ACTIVATE_TEST) {
+diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
+index ae04892..6cea747 100644
+--- a/fs/nfs/dir.c
++++ b/fs/nfs/dir.c
+@@ -710,6 +710,8 @@ int nfs_lookup_verify_inode(struct inode *inode, struct nameidata *nd)
+ {
+ 	struct nfs_server *server = NFS_SERVER(inode);
+ 
++	if (test_bit(NFS_INO_MOUNTPOINT, &NFS_I(inode)->flags))
++		return 0;
+ 	if (nd != NULL) {
+ 		/* VFS wants an on-the-wire revalidation */
+ 		if (nd->flags & LOOKUP_REVAL)
+diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c
+index 966a885..a4c7cf2 100644
+--- a/fs/nfs/inode.c
++++ b/fs/nfs/inode.c
+@@ -299,6 +299,7 @@ nfs_fhget(struct super_block *sb, struct nfs_fh *fh, struct nfs_fattr *fattr)
+ 				else
+ 					inode->i_op = &nfs_mountpoint_inode_operations;
+ 				inode->i_fop = NULL;
++				set_bit(NFS_INO_MOUNTPOINT, &nfsi->flags);
+ 			}
+ 		} else if (S_ISLNK(inode->i_mode))
+ 			inode->i_op = &nfs_symlink_inode_operations;
+@@ -1003,8 +1004,9 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
+ 
+ 	server = NFS_SERVER(inode);
+ 	/* Update the fsid? */
+-	if (S_ISDIR(inode->i_mode)
+-			&& !nfs_fsid_equal(&server->fsid, &fattr->fsid))
++	if (S_ISDIR(inode->i_mode) &&
++			!nfs_fsid_equal(&server->fsid, &fattr->fsid) &&
++			!test_bit(NFS_INO_MOUNTPOINT, &nfsi->flags))
+ 		server->fsid = fattr->fsid;
+ 
+ 	/*
+diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h
+index 0f56196..9319927 100644
+--- a/fs/nfs/internal.h
++++ b/fs/nfs/internal.h
+@@ -3,6 +3,7 @@
+  */
+ 
+ #include <linux/mount.h>
++#include <linux/security.h>
+ 
+ struct nfs_string;
+ 
+@@ -57,6 +58,8 @@ struct nfs_parsed_mount_data {
+ 		char			*export_path;
+ 		int			protocol;
+ 	} nfs_server;
++
++	struct security_mnt_opts lsm_opts;
+ };
+ 
+ /* client.c */
+diff --git a/fs/nfs/super.c b/fs/nfs/super.c
+index 1fb3818..fcf4b98 100644
+--- a/fs/nfs/super.c
++++ b/fs/nfs/super.c
+@@ -684,8 +684,9 @@ static void nfs_parse_server_address(char *value,
+ static int nfs_parse_mount_options(char *raw,
+ 				   struct nfs_parsed_mount_data *mnt)
+ {
+-	char *p, *string;
++	char *p, *string, *secdata;
+ 	unsigned short port = 0;
++	int rc;
+ 
+ 	if (!raw) {
+ 		dfprintk(MOUNT, "NFS: mount options string was NULL.\n");
+@@ -693,6 +694,20 @@ static int nfs_parse_mount_options(char *raw,
+ 	}
+ 	dfprintk(MOUNT, "NFS: nfs mount opts='%s'\n", raw);
+ 
++	secdata = alloc_secdata();
++	if (!secdata)
++		goto out_nomem;
++
++	rc = security_sb_copy_data(raw, secdata);
++	if (rc)
++		goto out_security_failure;
++
++	rc = security_sb_parse_opts_str(secdata, &mnt->lsm_opts);
++	if (rc)
++		goto out_security_failure;
++
++	free_secdata(secdata);
++
+ 	while ((p = strsep(&raw, ",")) != NULL) {
+ 		substring_t args[MAX_OPT_ARGS];
+ 		int option, token;
+@@ -1042,7 +1057,10 @@ static int nfs_parse_mount_options(char *raw,
+ out_nomem:
+ 	printk(KERN_INFO "NFS: not enough memory to parse option\n");
+ 	return 0;
+-
++out_security_failure:
++	free_secdata(secdata);
++	printk(KERN_INFO "NFS: security options invalid: %d\n", rc);
++	return 0;
+ out_unrec_vers:
+ 	printk(KERN_INFO "NFS: unrecognized NFS version number\n");
+ 	return 0;
+@@ -1214,6 +1232,33 @@ static int nfs_validate_mount_data(void *options,
+ 		args->namlen		= data->namlen;
+ 		args->bsize		= data->bsize;
+ 		args->auth_flavors[0]	= data->pseudoflavor;
++
++		/*
++		 * The legacy version 6 binary mount data from userspace has a
++		 * field used only to transport selinux information into the
++		 * the kernel.  To continue to support that functionality we
++		 * have a touch of selinux knowledge here in the NFS code. The
++		 * userspace code converted context=blah to just blah so we are
++		 * converting back to the full string selinux understands.
++		 */
++		if (data->context[0]){
++#ifdef CONFIG_SECURITY_SELINUX
++			int rc;
++			char *opts_str = kmalloc(sizeof(data->context) + 8, GFP_KERNEL);
++			if (!opts_str)
++				return -ENOMEM;
++			strcpy(opts_str, "context=");
++			data->context[NFS_MAX_CONTEXT_LEN] = '\0';
++			strcat(opts_str, &data->context[0]);
++			rc = security_sb_parse_opts_str(opts_str, &args->lsm_opts);
++			kfree(opts_str);
++			if (rc)
++				return rc;
++#else
++			return -EINVAL;
++#endif
++		}
++
+ 		break;
+ 	default: {
+ 		unsigned int len;
+@@ -1476,6 +1521,8 @@ static int nfs_get_sb(struct file_system_type *fs_type,
+ 	};
+ 	int error;
+ 
++	security_init_mnt_opts(&data.lsm_opts);
++
+ 	/* Validate the mount data */
+ 	error = nfs_validate_mount_data(raw_data, &data, &mntfh, dev_name);
+ 	if (error < 0)
+@@ -1515,6 +1562,10 @@ static int nfs_get_sb(struct file_system_type *fs_type,
+ 		goto error_splat_super;
+ 	}
+ 
++	error = security_sb_set_mnt_opts(s, &data.lsm_opts);
++	if (error)
++		goto error_splat_root;
++
+ 	s->s_flags |= MS_ACTIVE;
+ 	mnt->mnt_sb = s;
+ 	mnt->mnt_root = mntroot;
+@@ -1523,12 +1574,15 @@ static int nfs_get_sb(struct file_system_type *fs_type,
+ out:
+ 	kfree(data.nfs_server.hostname);
+ 	kfree(data.mount_server.hostname);
++	security_free_mnt_opts(&data.lsm_opts);
+ 	return error;
+ 
+ out_err_nosb:
+ 	nfs_free_server(server);
+ 	goto out;
+ 
++error_splat_root:
++	dput(mntroot);
+ error_splat_super:
+ 	up_write(&s->s_umount);
+ 	deactivate_super(s);
+@@ -1608,6 +1662,9 @@ static int nfs_xdev_get_sb(struct file_system_type *fs_type, int flags,
+ 	mnt->mnt_sb = s;
+ 	mnt->mnt_root = mntroot;
+ 
++	/* clone any lsm security options from the parent to the new sb */
++	security_sb_clone_mnt_opts(data->sb, s);
++
+ 	dprintk("<-- nfs_xdev_get_sb() = 0\n");
+ 	return 0;
+ 
+@@ -1850,6 +1907,8 @@ static int nfs4_get_sb(struct file_system_type *fs_type,
+ 	};
+ 	int error;
+ 
++	security_init_mnt_opts(&data.lsm_opts);
++
+ 	/* Validate the mount data */
+ 	error = nfs4_validate_mount_data(raw_data, &data, dev_name);
+ 	if (error < 0)
+@@ -1898,6 +1957,7 @@ out:
+ 	kfree(data.client_address);
+ 	kfree(data.nfs_server.export_path);
+ 	kfree(data.nfs_server.hostname);
++	security_free_mnt_opts(&data.lsm_opts);
+ 	return error;
+ 
+ out_free:
+diff --git a/fs/nfs/write.c b/fs/nfs/write.c
+index f55c437..80c61fd 100644
+--- a/fs/nfs/write.c
++++ b/fs/nfs/write.c
+@@ -734,7 +734,7 @@ int nfs_updatepage(struct file *file, struct page *page,
+ 	 */
+ 	if (nfs_write_pageuptodate(page, inode) &&
+ 			inode->i_flock == NULL &&
+-			!(file->f_mode & O_SYNC)) {
++			!(file->f_flags & O_SYNC)) {
+ 		count = max(count + offset, nfs_page_length(page));
+ 		offset = 0;
+ 	}
+diff --git a/fs/super.c b/fs/super.c
+index 88811f6..010446d 100644
+--- a/fs/super.c
++++ b/fs/super.c
+@@ -870,12 +870,12 @@ vfs_kern_mount(struct file_system_type *type, int flags, const char *name, void
+ 	if (!mnt)
+ 		goto out;
+ 
+-	if (data) {
++	if (data && !(type->fs_flags & FS_BINARY_MOUNTDATA)) {
+ 		secdata = alloc_secdata();
+ 		if (!secdata)
+ 			goto out_mnt;
+ 
+-		error = security_sb_copy_data(type, data, secdata);
++		error = security_sb_copy_data(data, secdata);
+ 		if (error)
+ 			goto out_free_secdata;
+ 	}
+diff --git a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c
+index f01b076..8e09b71 100644
+--- a/fs/xfs/xfs_iget.c
++++ b/fs/xfs/xfs_iget.c
+@@ -235,6 +235,7 @@ finish_inode:
+ 	 */
+ 	new_icl = kmem_zone_alloc(xfs_icluster_zone, KM_SLEEP);
+ 	if (radix_tree_preload(GFP_KERNEL)) {
++		xfs_idestroy(ip);
+ 		delay(1);
+ 		goto again;
+ 	}
+diff --git a/fs/xfs/xfs_trans_ail.c b/fs/xfs/xfs_trans_ail.c
+index 4d6330e..76d470d 100644
+--- a/fs/xfs/xfs_trans_ail.c
++++ b/fs/xfs/xfs_trans_ail.c
+@@ -261,16 +261,19 @@ xfsaild_push(
+ 		xfs_log_force(mp, (xfs_lsn_t)0, XFS_LOG_FORCE);
+ 	}
+ 
+-	/*
+-	 * We reached the target so wait a bit longer for I/O to complete and
+-	 * remove pushed items from the AIL before we start the next scan from
+-	 * the start of the AIL.
+-	 */
+-	if ((XFS_LSN_CMP(lsn, target) >= 0)) {
++	if (!count) {
++		/* We're past our target or empty, so idle */
++		tout = 1000;
++	} else if (XFS_LSN_CMP(lsn, target) >= 0) {
++		/*
++		 * We reached the target so wait a bit longer for I/O to
++		 * complete and remove pushed items from the AIL before we
++		 * start the next scan from the start of the AIL.
++		 */
+ 		tout += 20;
+ 		last_pushed_lsn = 0;
+ 	} else if ((restarts > XFS_TRANS_PUSH_AIL_RESTARTS) ||
+-		   (count && ((stuck * 100) / count > 90))) {
++		   ((stuck * 100) / count > 90)) {
+ 		/*
+ 		 * Either there is a lot of contention on the AIL or we
+ 		 * are stuck due to operations in progress. "Stuck" in this
+diff --git a/include/asm-blackfin/mmu_context.h b/include/asm-blackfin/mmu_context.h
+index b5eb675..f55ec3c 100644
+--- a/include/asm-blackfin/mmu_context.h
++++ b/include/asm-blackfin/mmu_context.h
+@@ -73,7 +73,7 @@ static inline void destroy_context(struct mm_struct *mm)
+ 	struct sram_list_struct *tmp;
+ 
+ 	if (current_l1_stack_save == mm->context.l1_stack_save)
+-		current_l1_stack_save = 0;
++		current_l1_stack_save = NULL;
+ 	if (mm->context.l1_stack_save)
+ 		free_l1stack();
+ 
+diff --git a/include/asm-blackfin/unistd.h b/include/asm-blackfin/unistd.h
+index e981673..c18a399 100644
+--- a/include/asm-blackfin/unistd.h
++++ b/include/asm-blackfin/unistd.h
+@@ -361,7 +361,7 @@
+ #define __NR_epoll_pwait	346
+ #define __NR_utimensat		347
+ #define __NR_signalfd		348
+-#define __NR_timerfd		349
++#define __NR_timerfd_create	349
+ #define __NR_eventfd		350
+ #define __NR_pread64		351
+ #define __NR_pwrite64		352
+@@ -370,8 +370,10 @@
+ #define __NR_get_robust_list	355
+ #define __NR_fallocate		356
+ #define __NR_semtimedop		357
++#define __NR_timerfd_settime	358
++#define __NR_timerfd_gettime	359
+ 
+-#define __NR_syscall		358
++#define __NR_syscall		360
+ #define NR_syscalls		__NR_syscall
+ 
+ /* Old optional stuff no one actually uses */
+diff --git a/include/asm-ia64/kprobes.h b/include/asm-ia64/kprobes.h
+index 8233b3a..d03bf9f 100644
+--- a/include/asm-ia64/kprobes.h
++++ b/include/asm-ia64/kprobes.h
+@@ -117,7 +117,7 @@ struct arch_specific_insn {
+ 	unsigned short slot;
+ };
+ 
+-extern int kprobes_fault_handler(struct pt_regs *regs, int trapnr);
++extern int kprobe_fault_handler(struct pt_regs *regs, int trapnr);
+ extern int kprobe_exceptions_notify(struct notifier_block *self,
+ 				    unsigned long val, void *data);
+ 
+diff --git a/include/asm-ia64/ptrace.h b/include/asm-ia64/ptrace.h
+index 0bdce7d..4b2a8d4 100644
+--- a/include/asm-ia64/ptrace.h
++++ b/include/asm-ia64/ptrace.h
+@@ -233,8 +233,6 @@ struct switch_stack {
+ #include <asm/current.h>
+ #include <asm/page.h>
+ 
+-#define __ARCH_SYS_PTRACE	1
+-
+ /*
+  * We use the ia64_psr(regs)->ri to determine which of the three
+  * instructions in bundle (16 bytes) took the sample. Generate
+@@ -314,6 +312,13 @@ struct switch_stack {
+   #define arch_ptrace_attach(child) \
+ 	ptrace_attach_sync_user_rbs(child)
+ 
++  #define arch_has_single_step()  (1)
++  extern void user_enable_single_step(struct task_struct *);
++  extern void user_disable_single_step(struct task_struct *);
++
++  #define arch_has_block_step()   (1)
++  extern void user_enable_block_step(struct task_struct *);
++
+ #endif /* !__KERNEL__ */
+ 
+ /* pt_all_user_regs is used for PTRACE_GETREGS PTRACE_SETREGS */
+diff --git a/include/asm-mn10300/Kbuild b/include/asm-mn10300/Kbuild
+index 79384c5..c68e168 100644
+--- a/include/asm-mn10300/Kbuild
++++ b/include/asm-mn10300/Kbuild
+@@ -1,5 +1 @@
+ include include/asm-generic/Kbuild.asm
+-
+-unifdef-y += termios.h
+-unifdef-y += ptrace.h
+-unifdef-y += page.h
+diff --git a/include/asm-sh/delay.h b/include/asm-sh/delay.h
+index d5d4640..4b16bf9 100644
+--- a/include/asm-sh/delay.h
++++ b/include/asm-sh/delay.h
+@@ -15,7 +15,6 @@ extern void __ndelay(unsigned long nsecs);
+ extern void __const_udelay(unsigned long xloops);
+ extern void __delay(unsigned long loops);
+ 
+-#ifdef CONFIG_SUPERH32
+ #define udelay(n) (__builtin_constant_p(n) ? \
+ 	((n) > 20000 ? __bad_udelay() : __const_udelay((n) * 0x10c6ul)) : \
+ 	__udelay(n))
+@@ -23,9 +22,5 @@ extern void __delay(unsigned long loops);
+ #define ndelay(n) (__builtin_constant_p(n) ? \
+ 	((n) > 20000 ? __bad_ndelay() : __const_udelay((n) * 5ul)) : \
+ 	__ndelay(n))
+-#else
+-extern void udelay(unsigned long usecs);
+-extern void ndelay(unsigned long nsecs);
+-#endif
+ 
+ #endif /* __ASM_SH_DELAY_H */
+diff --git a/include/asm-x86/Kbuild b/include/asm-x86/Kbuild
+index b04a7ff..3b8160a 100644
+--- a/include/asm-x86/Kbuild
++++ b/include/asm-x86/Kbuild
+@@ -16,7 +16,6 @@ unifdef-y += ist.h
+ unifdef-y += mce.h
+ unifdef-y += msr.h
+ unifdef-y += mtrr.h
+-unifdef-y += page.h
+ unifdef-y += posix_types_32.h
+ unifdef-y += posix_types_64.h
+ unifdef-y += ptrace.h
+diff --git a/include/crypto/internal/skcipher.h b/include/crypto/internal/skcipher.h
+index 2ba42cd..a8f1264 100644
+--- a/include/crypto/internal/skcipher.h
++++ b/include/crypto/internal/skcipher.h
+@@ -15,6 +15,7 @@
+ 
+ #include <crypto/algapi.h>
+ #include <crypto/skcipher.h>
++#include <linux/init.h>
+ #include <linux/types.h>
+ 
+ struct rtattr;
+@@ -64,6 +65,11 @@ void skcipher_geniv_free(struct crypto_instance *inst);
+ int skcipher_geniv_init(struct crypto_tfm *tfm);
+ void skcipher_geniv_exit(struct crypto_tfm *tfm);
+ 
++int __init eseqiv_module_init(void);
++void __exit eseqiv_module_exit(void);
++int __init chainiv_module_init(void);
++void __exit chainiv_module_exit(void);
++
+ static inline struct crypto_ablkcipher *skcipher_geniv_cipher(
+ 	struct crypto_ablkcipher *geniv)
+ {
+diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h
+index a69ba80..f4a0e4c 100644
+--- a/include/linux/nfs_fs.h
++++ b/include/linux/nfs_fs.h
+@@ -195,6 +195,7 @@ struct nfs_inode {
+ #define NFS_INO_ADVISE_RDPLUS	(1)		/* advise readdirplus */
+ #define NFS_INO_STALE		(2)		/* possible stale inode */
+ #define NFS_INO_ACL_LRU_SET	(3)		/* Inode is on the LRU list */
++#define NFS_INO_MOUNTPOINT	(4)		/* inode is remote mountpoint */
+ 
+ static inline struct nfs_inode *NFS_I(const struct inode *inode)
+ {
+diff --git a/include/linux/sched.h b/include/linux/sched.h
+index 9ae4030..11d8e9a 100644
+--- a/include/linux/sched.h
++++ b/include/linux/sched.h
+@@ -899,6 +899,10 @@ struct sched_class {
+ 			     int running);
+ 	void (*prio_changed) (struct rq *this_rq, struct task_struct *task,
+ 			     int oldprio, int running);
++
++#ifdef CONFIG_FAIR_GROUP_SCHED
++	void (*moved_group) (struct task_struct *p);
++#endif
+ };
+ 
+ struct load_weight {
+diff --git a/include/linux/security.h b/include/linux/security.h
+index fe52cde..b07357c 100644
+--- a/include/linux/security.h
++++ b/include/linux/security.h
+@@ -34,12 +34,6 @@
+ #include <linux/xfrm.h>
+ #include <net/flow.h>
+ 
+-/* only a char in selinux superblock security struct flags */
+-#define FSCONTEXT_MNT		0x01
+-#define CONTEXT_MNT		0x02
+-#define ROOTCONTEXT_MNT		0x04
+-#define DEFCONTEXT_MNT		0x08
+-
+ extern unsigned securebits;
+ 
+ struct ctl_table;
+@@ -114,6 +108,32 @@ struct request_sock;
+ 
+ #ifdef CONFIG_SECURITY
+ 
++struct security_mnt_opts {
++	char **mnt_opts;
++	int *mnt_opts_flags;
++	int num_mnt_opts;
++};
++
++static inline void security_init_mnt_opts(struct security_mnt_opts *opts)
++{
++	opts->mnt_opts = NULL;
++	opts->mnt_opts_flags = NULL;
++	opts->num_mnt_opts = 0;
++}
++
++static inline void security_free_mnt_opts(struct security_mnt_opts *opts)
++{
++	int i;
++	if (opts->mnt_opts)
++		for(i = 0; i < opts->num_mnt_opts; i++)
++			kfree(opts->mnt_opts[i]);
++	kfree(opts->mnt_opts);
++	opts->mnt_opts = NULL;
++	kfree(opts->mnt_opts_flags);
++	opts->mnt_opts_flags = NULL;
++	opts->num_mnt_opts = 0;
++}
++
+ /**
+  * struct security_operations - main security structure
+  *
+@@ -262,19 +282,19 @@ struct request_sock;
+  * @sb_get_mnt_opts:
+  *	Get the security relevant mount options used for a superblock
+  *	@sb the superblock to get security mount options from
+- *	@mount_options array for pointers to mount options
+- *	@mount_flags array of ints specifying what each mount options is
+- *	@num_opts number of options in the arrays
++ *	@opts binary data structure containing all lsm mount data
+  * @sb_set_mnt_opts:
+  *	Set the security relevant mount options used for a superblock
+  *	@sb the superblock to set security mount options for
+- *	@mount_options array for pointers to mount options
+- *	@mount_flags array of ints specifying what each mount options is
+- *	@num_opts number of options in the arrays
++ *	@opts binary data structure containing all lsm mount data
+  * @sb_clone_mnt_opts:
+  *	Copy all security options from a given superblock to another
+  *	@oldsb old superblock which contain information to clone
+  *	@newsb new superblock which needs filled in
++ * @sb_parse_opts_str:
++ *	Parse a string of security data filling in the opts structure
++ *	@options string containing all mount options known by the LSM
++ *	@opts binary data structure usable by the LSM
+  *
+  * Security hooks for inode operations.
+  *
+@@ -1238,8 +1258,7 @@ struct security_operations {
+ 
+ 	int (*sb_alloc_security) (struct super_block * sb);
+ 	void (*sb_free_security) (struct super_block * sb);
+-	int (*sb_copy_data)(struct file_system_type *type,
+-			    void *orig, void *copy);
++	int (*sb_copy_data)(char *orig, char *copy);
+ 	int (*sb_kern_mount) (struct super_block *sb, void *data);
+ 	int (*sb_statfs) (struct dentry *dentry);
+ 	int (*sb_mount) (char *dev_name, struct nameidata * nd,
+@@ -1257,12 +1276,12 @@ struct security_operations {
+ 	void (*sb_post_pivotroot) (struct nameidata * old_nd,
+ 				   struct nameidata * new_nd);
+ 	int (*sb_get_mnt_opts) (const struct super_block *sb,
+-				char ***mount_options, int **flags,
+-				int *num_opts);
+-	int (*sb_set_mnt_opts) (struct super_block *sb, char **mount_options,
+-				int *flags, int num_opts);
++				struct security_mnt_opts *opts);
++	int (*sb_set_mnt_opts) (struct super_block *sb,
++				struct security_mnt_opts *opts);
+ 	void (*sb_clone_mnt_opts) (const struct super_block *oldsb,
+ 				   struct super_block *newsb);
++	int (*sb_parse_opts_str) (char *options, struct security_mnt_opts *opts);
+ 
+ 	int (*inode_alloc_security) (struct inode *inode);	
+ 	void (*inode_free_security) (struct inode *inode);
+@@ -1507,7 +1526,7 @@ int security_bprm_check(struct linux_binprm *bprm);
+ int security_bprm_secureexec(struct linux_binprm *bprm);
+ int security_sb_alloc(struct super_block *sb);
+ void security_sb_free(struct super_block *sb);
+-int security_sb_copy_data(struct file_system_type *type, void *orig, void *copy);
++int security_sb_copy_data(char *orig, char *copy);
+ int security_sb_kern_mount(struct super_block *sb, void *data);
+ int security_sb_statfs(struct dentry *dentry);
+ int security_sb_mount(char *dev_name, struct nameidata *nd,
+@@ -1520,12 +1539,12 @@ void security_sb_post_remount(struct vfsmount *mnt, unsigned long flags, void *d
+ void security_sb_post_addmount(struct vfsmount *mnt, struct nameidata *mountpoint_nd);
+ int security_sb_pivotroot(struct nameidata *old_nd, struct nameidata *new_nd);
+ void security_sb_post_pivotroot(struct nameidata *old_nd, struct nameidata *new_nd);
+-int security_sb_get_mnt_opts(const struct super_block *sb, char ***mount_options,
+-			     int **flags, int *num_opts);
+-int security_sb_set_mnt_opts(struct super_block *sb, char **mount_options,
+-			     int *flags, int num_opts);
++int security_sb_get_mnt_opts(const struct super_block *sb,
++				struct security_mnt_opts *opts);
++int security_sb_set_mnt_opts(struct super_block *sb, struct security_mnt_opts *opts);
+ void security_sb_clone_mnt_opts(const struct super_block *oldsb,
+ 				struct super_block *newsb);
++int security_sb_parse_opts_str(char *options, struct security_mnt_opts *opts);
+ 
+ int security_inode_alloc(struct inode *inode);
+ void security_inode_free(struct inode *inode);
+@@ -1635,6 +1654,16 @@ int security_secctx_to_secid(char *secdata, u32 seclen, u32 *secid);
+ void security_release_secctx(char *secdata, u32 seclen);
+ 
+ #else /* CONFIG_SECURITY */
++struct security_mnt_opts {
++};
++
++static inline void security_init_mnt_opts(struct security_mnt_opts *opts)
++{
++}
++
++static inline void security_free_mnt_opts(struct security_mnt_opts *opts)
++{
++}
+ 
+ /*
+  * This is the default capabilities functionality.  Most of these functions
+@@ -1762,8 +1791,7 @@ static inline int security_sb_alloc (struct super_block *sb)
+ static inline void security_sb_free (struct super_block *sb)
+ { }
+ 
+-static inline int security_sb_copy_data (struct file_system_type *type,
+-					 void *orig, void *copy)
++static inline int security_sb_copy_data (char *orig, char *copy)
+ {
+ 	return 0;
+ }
+@@ -1819,6 +1847,27 @@ static inline int security_sb_pivotroot (struct nameidata *old_nd,
+ static inline void security_sb_post_pivotroot (struct nameidata *old_nd,
+ 					       struct nameidata *new_nd)
+ { }
++static inline int security_sb_get_mnt_opts(const struct super_block *sb,
++					   struct security_mnt_opts *opts)
++{
++	security_init_mnt_opts(opts);
++	return 0;
++}
++
++static inline int security_sb_set_mnt_opts(struct super_block *sb,
++					   struct security_mnt_opts *opts)
++{
++	return 0;
++}
++
++static inline void security_sb_clone_mnt_opts(const struct super_block *oldsb,
++					      struct super_block *newsb)
++{ }
++
++static inline int security_sb_parse_opts_str(char *options, struct security_mnt_opts *opts)
++{
++	return 0;
++}
+ 
+ static inline int security_inode_alloc (struct inode *inode)
+ {
+diff --git a/include/linux/slab_def.h b/include/linux/slab_def.h
+index fcc4809..39c3a5e 100644
+--- a/include/linux/slab_def.h
++++ b/include/linux/slab_def.h
+@@ -41,7 +41,7 @@ static inline void *kmalloc(size_t size, gfp_t flags)
+ 			goto found; \
+ 		else \
+ 			i++;
+-#include "kmalloc_sizes.h"
++#include <linux/kmalloc_sizes.h>
+ #undef CACHE
+ 		{
+ 			extern void __you_cannot_kmalloc_that_much(void);
+@@ -75,7 +75,7 @@ static inline void *kmalloc_node(size_t size, gfp_t flags, int node)
+ 			goto found; \
+ 		else \
+ 			i++;
+-#include "kmalloc_sizes.h"
++#include <linux/kmalloc_sizes.h>
+ #undef CACHE
+ 		{
+ 			extern void __you_cannot_kmalloc_that_much(void);
+diff --git a/include/scsi/libsas.h b/include/scsi/libsas.h
+index 3ffd6b5..39e1cac 100644
+--- a/include/scsi/libsas.h
++++ b/include/scsi/libsas.h
+@@ -675,5 +675,6 @@ extern int sas_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy,
+ 
+ extern void sas_ssp_task_response(struct device *dev, struct sas_task *task,
+ 				  struct ssp_response_iu *iu);
++struct sas_phy *sas_find_local_phy(struct domain_device *dev);
+ 
+ #endif /* _SASLIB_H_ */
+diff --git a/include/scsi/scsi_transport_iscsi.h b/include/scsi/scsi_transport_iscsi.h
+index dbc96ef..aab1eae 100644
+--- a/include/scsi/scsi_transport_iscsi.h
++++ b/include/scsi/scsi_transport_iscsi.h
+@@ -177,6 +177,8 @@ struct iscsi_cls_session {
+ 	struct list_head host_list;
+ 	struct iscsi_transport *transport;
+ 	spinlock_t lock;
++	struct work_struct block_work;
++	struct work_struct unblock_work;
+ 	struct work_struct scan_work;
+ 	struct work_struct unbind_work;
+ 
+diff --git a/kernel/cpuset.c b/kernel/cpuset.c
+index 3e296ed..a1b61f4 100644
+--- a/kernel/cpuset.c
++++ b/kernel/cpuset.c
+@@ -322,8 +322,8 @@ static void guarantee_online_mems(const struct cpuset *cs, nodemask_t *pmask)
+  * Call without callback_mutex or task_lock() held.  May be
+  * called with or without cgroup_mutex held.  Thanks in part to
+  * 'the_top_cpuset_hack', the task's cpuset pointer will never
+- * be NULL.  This routine also might acquire callback_mutex and
+- * current->mm->mmap_sem during call.
++ * be NULL.  This routine also might acquire callback_mutex during
++ * call.
+  *
+  * Reading current->cpuset->mems_generation doesn't need task_lock
+  * to guard the current->cpuset derefence, because it is guarded
+diff --git a/kernel/sched.c b/kernel/sched.c
+index dcd553c..52b9867 100644
+--- a/kernel/sched.c
++++ b/kernel/sched.c
+@@ -4422,7 +4422,7 @@ int task_nice(const struct task_struct *p)
+ {
+ 	return TASK_NICE(p);
+ }
+-EXPORT_SYMBOL_GPL(task_nice);
++EXPORT_SYMBOL(task_nice);
+ 
+ /**
+  * idle_cpu - is a given cpu idle currently?
+@@ -5100,7 +5100,7 @@ long sys_sched_rr_get_interval(pid_t pid, struct timespec __user *interval)
+ 	time_slice = 0;
+ 	if (p->policy == SCHED_RR) {
+ 		time_slice = DEF_TIMESLICE;
+-	} else {
++	} else if (p->policy != SCHED_FIFO) {
+ 		struct sched_entity *se = &p->se;
+ 		unsigned long flags;
+ 		struct rq *rq;
+@@ -7625,6 +7625,11 @@ void sched_move_task(struct task_struct *tsk)
+ 
+ 	set_task_rq(tsk, task_cpu(tsk));
+ 
++#ifdef CONFIG_FAIR_GROUP_SCHED
++	if (tsk->sched_class->moved_group)
++		tsk->sched_class->moved_group(tsk);
++#endif
++
+ 	if (on_rq) {
+ 		if (unlikely(running))
+ 			tsk->sched_class->set_curr_task(rq);
+@@ -7721,9 +7726,7 @@ static unsigned long to_ratio(u64 period, u64 runtime)
+ 	if (runtime == RUNTIME_INF)
+ 		return 1ULL << 16;
+ 
+-	runtime *= (1ULL << 16);
+-	div64_64(runtime, period);
+-	return runtime;
++	return div64_64(runtime << 16, period);
+ }
+ 
+ static int __rt_schedulable(struct task_group *tg, u64 period, u64 runtime)
+@@ -7747,25 +7750,40 @@ static int __rt_schedulable(struct task_group *tg, u64 period, u64 runtime)
+ 	return total + to_ratio(period, runtime) < global_ratio;
+ }
+ 
++/* Must be called with tasklist_lock held */
++static inline int tg_has_rt_tasks(struct task_group *tg)
++{
++	struct task_struct *g, *p;
++	do_each_thread(g, p) {
++		if (rt_task(p) && rt_rq_of_se(&p->rt)->tg == tg)
++			return 1;
++	} while_each_thread(g, p);
++	return 0;
++}
++
+ int sched_group_set_rt_runtime(struct task_group *tg, long rt_runtime_us)
+ {
+ 	u64 rt_runtime, rt_period;
+ 	int err = 0;
+ 
+-	rt_period = sysctl_sched_rt_period * NSEC_PER_USEC;
++	rt_period = (u64)sysctl_sched_rt_period * NSEC_PER_USEC;
+ 	rt_runtime = (u64)rt_runtime_us * NSEC_PER_USEC;
+ 	if (rt_runtime_us == -1)
+-		rt_runtime = rt_period;
++		rt_runtime = RUNTIME_INF;
+ 
+ 	mutex_lock(&rt_constraints_mutex);
++	read_lock(&tasklist_lock);
++	if (rt_runtime_us == 0 && tg_has_rt_tasks(tg)) {
++		err = -EBUSY;
++		goto unlock;
++	}
+ 	if (!__rt_schedulable(tg, rt_period, rt_runtime)) {
+ 		err = -EINVAL;
+ 		goto unlock;
+ 	}
+-	if (rt_runtime_us == -1)
+-		rt_runtime = RUNTIME_INF;
+ 	tg->rt_runtime = rt_runtime;
+  unlock:
++	read_unlock(&tasklist_lock);
+ 	mutex_unlock(&rt_constraints_mutex);
+ 
+ 	return err;
+diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c
+index 3df4d46..e2a5305 100644
+--- a/kernel/sched_fair.c
++++ b/kernel/sched_fair.c
+@@ -1353,6 +1353,16 @@ static void set_curr_task_fair(struct rq *rq)
+ 		set_next_entity(cfs_rq_of(se), se);
+ }
+ 
++#ifdef CONFIG_FAIR_GROUP_SCHED
++static void moved_group_fair(struct task_struct *p)
++{
++	struct cfs_rq *cfs_rq = task_cfs_rq(p);
++
++	update_curr(cfs_rq);
++	place_entity(cfs_rq, &p->se, 1);
++}
++#endif
++
+ /*
+  * All the scheduling class methods:
+  */
+@@ -1381,6 +1391,10 @@ static const struct sched_class fair_sched_class = {
+ 
+ 	.prio_changed		= prio_changed_fair,
+ 	.switched_to		= switched_to_fair,
++
++#ifdef CONFIG_FAIR_GROUP_SCHED
++	.moved_group		= moved_group_fair,
++#endif
+ };
+ 
+ #ifdef CONFIG_SCHED_DEBUG
+diff --git a/kernel/sched_rt.c b/kernel/sched_rt.c
+index 76e8285..0a6d2e5 100644
+--- a/kernel/sched_rt.c
++++ b/kernel/sched_rt.c
+@@ -1107,9 +1107,11 @@ static void prio_changed_rt(struct rq *rq, struct task_struct *p,
+ 			pull_rt_task(rq);
+ 		/*
+ 		 * If there's a higher priority task waiting to run
+-		 * then reschedule.
++		 * then reschedule. Note, the above pull_rt_task
++		 * can release the rq lock and p could migrate.
++		 * Only reschedule if p is still on the same runqueue.
+ 		 */
+-		if (p->prio > rq->rt.highest_prio)
++		if (p->prio > rq->rt.highest_prio && rq->curr == p)
+ 			resched_task(p);
+ #else
+ 		/* For UP simply resched on drop of prio */
+diff --git a/mm/slab.c b/mm/slab.c
+index 473e6c2..e6c698f 100644
+--- a/mm/slab.c
++++ b/mm/slab.c
+@@ -333,7 +333,7 @@ static __always_inline int index_of(const size_t size)
+ 		return i; \
+ 	else \
+ 		i++;
+-#include "linux/kmalloc_sizes.h"
++#include <linux/kmalloc_sizes.h>
+ #undef CACHE
+ 		__bad_size();
+ 	} else
+@@ -2964,11 +2964,10 @@ static void *cache_alloc_refill(struct kmem_cache *cachep, gfp_t flags)
+ 	struct array_cache *ac;
+ 	int node;
+ 
+-	node = numa_node_id();
+-
++retry:
+ 	check_irq_off();
++	node = numa_node_id();
+ 	ac = cpu_cache_get(cachep);
+-retry:
+ 	batchcount = ac->batchcount;
+ 	if (!ac->touched && batchcount > BATCHREFILL_LIMIT) {
+ 		/*
+@@ -3280,7 +3279,7 @@ retry:
+ 		if (local_flags & __GFP_WAIT)
+ 			local_irq_enable();
+ 		kmem_flagcheck(cache, flags);
+-		obj = kmem_getpages(cache, flags, -1);
++		obj = kmem_getpages(cache, local_flags, -1);
+ 		if (local_flags & __GFP_WAIT)
+ 			local_irq_disable();
+ 		if (obj) {
+diff --git a/mm/slub.c b/mm/slub.c
+index 0863fd3..96d63eb 100644
+--- a/mm/slub.c
++++ b/mm/slub.c
+@@ -1368,7 +1368,7 @@ static void deactivate_slab(struct kmem_cache *s, struct kmem_cache_cpu *c)
+ 	struct page *page = c->page;
+ 	int tail = 1;
+ 
+-	if (c->freelist)
++	if (page->freelist)
+ 		stat(c, DEACTIVATE_REMOTE_FREES);
+ 	/*
+ 	 * Merge cpu freelist into slab freelist. Typically we get here
+@@ -1856,12 +1856,15 @@ static unsigned long calculate_alignment(unsigned long flags,
+ 	 * The hardware cache alignment cannot override the specified
+ 	 * alignment though. If that is greater then use it.
+ 	 */
+-	if ((flags & SLAB_HWCACHE_ALIGN) &&
+-			size > cache_line_size() / 2)
+-		return max_t(unsigned long, align, cache_line_size());
++	if (flags & SLAB_HWCACHE_ALIGN) {
++		unsigned long ralign = cache_line_size();
++		while (size <= ralign / 2)
++			ralign /= 2;
++		align = max(align, ralign);
++	}
+ 
+ 	if (align < ARCH_SLAB_MINALIGN)
+-		return ARCH_SLAB_MINALIGN;
++		align = ARCH_SLAB_MINALIGN;
+ 
+ 	return ALIGN(align, sizeof(void *));
+ }
+diff --git a/net/sunrpc/xprtrdma/transport.c b/net/sunrpc/xprtrdma/transport.c
+index 02c522c..a564c1a 100644
+--- a/net/sunrpc/xprtrdma/transport.c
++++ b/net/sunrpc/xprtrdma/transport.c
+@@ -614,7 +614,11 @@ xprt_rdma_free(void *buffer)
+ 		return;
+ 
+ 	req = container_of(buffer, struct rpcrdma_req, rl_xdr_buf[0]);
+-	r_xprt = container_of(req->rl_buffer, struct rpcrdma_xprt, rx_buf);
++	if (req->rl_iov.length == 0) {	/* see allocate above */
++		r_xprt = container_of(((struct rpcrdma_req *) req->rl_buffer)->rl_buffer,
++				      struct rpcrdma_xprt, rx_buf);
++	} else
++		r_xprt = container_of(req->rl_buffer, struct rpcrdma_xprt, rx_buf);
+ 	rep = req->rl_reply;
+ 
+ 	dprintk("RPC:       %s: called on 0x%p%s\n",
+diff --git a/security/dummy.c b/security/dummy.c
+index 649326b..78d8f92 100644
+--- a/security/dummy.c
++++ b/security/dummy.c
+@@ -181,8 +181,7 @@ static void dummy_sb_free_security (struct super_block *sb)
+ 	return;
+ }
+ 
+-static int dummy_sb_copy_data (struct file_system_type *type,
+-			       void *orig, void *copy)
++static int dummy_sb_copy_data (char *orig, char *copy)
+ {
+ 	return 0;
+ }
+@@ -245,19 +244,17 @@ static void dummy_sb_post_pivotroot (struct nameidata *old_nd, struct nameidata
+ 	return;
+ }
+ 
+-static int dummy_sb_get_mnt_opts(const struct super_block *sb, char ***mount_options,
+-				 int **flags, int *num_opts)
++static int dummy_sb_get_mnt_opts(const struct super_block *sb,
++				 struct security_mnt_opts *opts)
+ {
+-	*mount_options = NULL;
+-	*flags = NULL;
+-	*num_opts = 0;
++	security_init_mnt_opts(opts);
+ 	return 0;
+ }
+ 
+-static int dummy_sb_set_mnt_opts(struct super_block *sb, char **mount_options,
+-				 int *flags, int num_opts)
++static int dummy_sb_set_mnt_opts(struct super_block *sb,
++				 struct security_mnt_opts *opts)
+ {
+-	if (unlikely(num_opts))
++	if (unlikely(opts->num_mnt_opts))
+ 		return -EOPNOTSUPP;
+ 	return 0;
+ }
+@@ -268,6 +265,11 @@ static void dummy_sb_clone_mnt_opts(const struct super_block *oldsb,
+ 	return;
+ }
+ 
++static int dummy_sb_parse_opts_str(char *options, struct security_mnt_opts *opts)
++{
++	return 0;
++}
++
+ static int dummy_inode_alloc_security (struct inode *inode)
+ {
+ 	return 0;
+@@ -1028,6 +1030,7 @@ void security_fixup_ops (struct security_operations *ops)
+ 	set_to_dummy_if_null(ops, sb_get_mnt_opts);
+ 	set_to_dummy_if_null(ops, sb_set_mnt_opts);
+ 	set_to_dummy_if_null(ops, sb_clone_mnt_opts);
++	set_to_dummy_if_null(ops, sb_parse_opts_str);
+ 	set_to_dummy_if_null(ops, inode_alloc_security);
+ 	set_to_dummy_if_null(ops, inode_free_security);
+ 	set_to_dummy_if_null(ops, inode_init_security);
+diff --git a/security/security.c b/security/security.c
+index d15e56c..b1387a6 100644
+--- a/security/security.c
++++ b/security/security.c
+@@ -244,10 +244,11 @@ void security_sb_free(struct super_block *sb)
+ 	security_ops->sb_free_security(sb);
+ }
+ 
+-int security_sb_copy_data(struct file_system_type *type, void *orig, void *copy)
++int security_sb_copy_data(char *orig, char *copy)
+ {
+-	return security_ops->sb_copy_data(type, orig, copy);
++	return security_ops->sb_copy_data(orig, copy);
+ }
++EXPORT_SYMBOL(security_sb_copy_data);
+ 
+ int security_sb_kern_mount(struct super_block *sb, void *data)
+ {
+@@ -306,24 +307,30 @@ void security_sb_post_pivotroot(struct nameidata *old_nd, struct nameidata *new_
+ }
+ 
+ int security_sb_get_mnt_opts(const struct super_block *sb,
+-			      char ***mount_options,
+-			      int **flags, int *num_opts)
++				struct security_mnt_opts *opts)
+ {
+-	return security_ops->sb_get_mnt_opts(sb, mount_options, flags, num_opts);
++	return security_ops->sb_get_mnt_opts(sb, opts);
+ }
+ 
+ int security_sb_set_mnt_opts(struct super_block *sb,
+-			      char **mount_options,
+-			      int *flags, int num_opts)
++				struct security_mnt_opts *opts)
+ {
+-	return security_ops->sb_set_mnt_opts(sb, mount_options, flags, num_opts);
++	return security_ops->sb_set_mnt_opts(sb, opts);
+ }
++EXPORT_SYMBOL(security_sb_set_mnt_opts);
+ 
+ void security_sb_clone_mnt_opts(const struct super_block *oldsb,
+ 				struct super_block *newsb)
+ {
+ 	security_ops->sb_clone_mnt_opts(oldsb, newsb);
+ }
++EXPORT_SYMBOL(security_sb_clone_mnt_opts);
++
++int security_sb_parse_opts_str(char *options, struct security_mnt_opts *opts)
++{
++	return security_ops->sb_parse_opts_str(options, opts);
++}
++EXPORT_SYMBOL(security_sb_parse_opts_str);
+ 
+ int security_inode_alloc(struct inode *inode)
+ {
+diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
+index 75c2e99..4bf4807 100644
+--- a/security/selinux/hooks.c
++++ b/security/selinux/hooks.c
+@@ -443,8 +443,7 @@ out:
+  * mount options, or whatever.
+  */
+ static int selinux_get_mnt_opts(const struct super_block *sb,
+-				char ***mount_options, int **mnt_opts_flags,
+-				int *num_opts)
++				struct security_mnt_opts *opts)
+ {
+ 	int rc = 0, i;
+ 	struct superblock_security_struct *sbsec = sb->s_security;
+@@ -452,9 +451,7 @@ static int selinux_get_mnt_opts(const struct super_block *sb,
+ 	u32 len;
+ 	char tmp;
+ 
+-	*num_opts = 0;
+-	*mount_options = NULL;
+-	*mnt_opts_flags = NULL;
++	security_init_mnt_opts(opts);
+ 
+ 	if (!sbsec->initialized)
+ 		return -EINVAL;
+@@ -470,18 +467,18 @@ static int selinux_get_mnt_opts(const struct super_block *sb,
+ 	/* count the number of mount options for this sb */
+ 	for (i = 0; i < 8; i++) {
+ 		if (tmp & 0x01)
+-			(*num_opts)++;
++			opts->num_mnt_opts++;
+ 		tmp >>= 1;
+ 	}
+ 
+-	*mount_options = kcalloc(*num_opts, sizeof(char *), GFP_ATOMIC);
+-	if (!*mount_options) {
++	opts->mnt_opts = kcalloc(opts->num_mnt_opts, sizeof(char *), GFP_ATOMIC);
++	if (!opts->mnt_opts) {
+ 		rc = -ENOMEM;
+ 		goto out_free;
+ 	}
+ 
+-	*mnt_opts_flags = kcalloc(*num_opts, sizeof(int), GFP_ATOMIC);
+-	if (!*mnt_opts_flags) {
++	opts->mnt_opts_flags = kcalloc(opts->num_mnt_opts, sizeof(int), GFP_ATOMIC);
++	if (!opts->mnt_opts_flags) {
+ 		rc = -ENOMEM;
+ 		goto out_free;
+ 	}
+@@ -491,22 +488,22 @@ static int selinux_get_mnt_opts(const struct super_block *sb,
+ 		rc = security_sid_to_context(sbsec->sid, &context, &len);
+ 		if (rc)
+ 			goto out_free;
+-		(*mount_options)[i] = context;
+-		(*mnt_opts_flags)[i++] = FSCONTEXT_MNT;
++		opts->mnt_opts[i] = context;
++		opts->mnt_opts_flags[i++] = FSCONTEXT_MNT;
+ 	}
+ 	if (sbsec->flags & CONTEXT_MNT) {
+ 		rc = security_sid_to_context(sbsec->mntpoint_sid, &context, &len);
+ 		if (rc)
+ 			goto out_free;
+-		(*mount_options)[i] = context;
+-		(*mnt_opts_flags)[i++] = CONTEXT_MNT;
++		opts->mnt_opts[i] = context;
++		opts->mnt_opts_flags[i++] = CONTEXT_MNT;
+ 	}
+ 	if (sbsec->flags & DEFCONTEXT_MNT) {
+ 		rc = security_sid_to_context(sbsec->def_sid, &context, &len);
+ 		if (rc)
+ 			goto out_free;
+-		(*mount_options)[i] = context;
+-		(*mnt_opts_flags)[i++] = DEFCONTEXT_MNT;
++		opts->mnt_opts[i] = context;
++		opts->mnt_opts_flags[i++] = DEFCONTEXT_MNT;
+ 	}
+ 	if (sbsec->flags & ROOTCONTEXT_MNT) {
+ 		struct inode *root = sbsec->sb->s_root->d_inode;
+@@ -515,24 +512,16 @@ static int selinux_get_mnt_opts(const struct super_block *sb,
+ 		rc = security_sid_to_context(isec->sid, &context, &len);
+ 		if (rc)
+ 			goto out_free;
+-		(*mount_options)[i] = context;
+-		(*mnt_opts_flags)[i++] = ROOTCONTEXT_MNT;
++		opts->mnt_opts[i] = context;
++		opts->mnt_opts_flags[i++] = ROOTCONTEXT_MNT;
+ 	}
+ 
+-	BUG_ON(i != *num_opts);
++	BUG_ON(i != opts->num_mnt_opts);
+ 
+ 	return 0;
+ 
+ out_free:
+-	/* don't leak context string if security_sid_to_context had an error */
+-	if (*mount_options && i)
+-		for (; i > 0; i--)
+-			kfree((*mount_options)[i-1]);
+-	kfree(*mount_options);
+-	*mount_options = NULL;
+-	kfree(*mnt_opts_flags);
+-	*mnt_opts_flags = NULL;
+-	*num_opts = 0;
++	security_free_mnt_opts(opts);
+ 	return rc;
+ }
+ 
+@@ -553,12 +542,13 @@ static int bad_option(struct superblock_security_struct *sbsec, char flag,
+ 			return 1;
+ 	return 0;
+ }
++
+ /*
+  * Allow filesystems with binary mount data to explicitly set mount point
+  * labeling information.
+  */
+-static int selinux_set_mnt_opts(struct super_block *sb, char **mount_options,
+-				int *flags, int num_opts)
++static int selinux_set_mnt_opts(struct super_block *sb,
++				struct security_mnt_opts *opts)
+ {
+ 	int rc = 0, i;
+ 	struct task_security_struct *tsec = current->security;
+@@ -568,6 +558,9 @@ static int selinux_set_mnt_opts(struct super_block *sb, char **mount_options,
+ 	struct inode_security_struct *root_isec = inode->i_security;
+ 	u32 fscontext_sid = 0, context_sid = 0, rootcontext_sid = 0;
+ 	u32 defcontext_sid = 0;
++	char **mount_options = opts->mnt_opts;
++	int *flags = opts->mnt_opts_flags;
++	int num_opts = opts->num_mnt_opts;
+ 
+ 	mutex_lock(&sbsec->lock);
+ 
+@@ -589,6 +582,21 @@ static int selinux_set_mnt_opts(struct super_block *sb, char **mount_options,
+ 	}
+ 
+ 	/*
++	 * Binary mount data FS will come through this function twice.  Once
++	 * from an explicit call and once from the generic calls from the vfs.
++	 * Since the generic VFS calls will not contain any security mount data
++	 * we need to skip the double mount verification.
++	 *
++	 * This does open a hole in which we will not notice if the first
++	 * mount using this sb set explict options and a second mount using
++	 * this sb does not set any security options.  (The first options
++	 * will be used for both mounts)
++	 */
++	if (sbsec->initialized && (sb->s_type->fs_flags & FS_BINARY_MOUNTDATA)
++	    && (num_opts == 0))
++	        goto out;
++
++	/*
+ 	 * parse the mount options, check if they are valid sids.
+ 	 * also check if someone is trying to mount the same sb more
+ 	 * than once with different security options.
+@@ -792,43 +800,14 @@ static void selinux_sb_clone_mnt_opts(const struct super_block *oldsb,
+ 	mutex_unlock(&newsbsec->lock);
+ }
+ 
+-/*
+- * string mount options parsing and call set the sbsec
+- */
+-static int superblock_doinit(struct super_block *sb, void *data)
++int selinux_parse_opts_str(char *options, struct security_mnt_opts *opts)
+ {
++	char *p;
+ 	char *context = NULL, *defcontext = NULL;
+ 	char *fscontext = NULL, *rootcontext = NULL;
+-	int rc = 0;
+-	char *p, *options = data;
+-	/* selinux only know about a fixed number of mount options */
+-	char *mnt_opts[NUM_SEL_MNT_OPTS];
+-	int mnt_opts_flags[NUM_SEL_MNT_OPTS], num_mnt_opts = 0;
+-
+-	if (!data)
+-		goto out;
++	int rc, num_mnt_opts = 0;
+ 
+-	/* with the nfs patch this will become a goto out; */
+-	if (sb->s_type->fs_flags & FS_BINARY_MOUNTDATA) {
+-		const char *name = sb->s_type->name;
+-		/* NFS we understand. */
+-		if (!strcmp(name, "nfs")) {
+-			struct nfs_mount_data *d = data;
+-
+-			if (d->version !=  NFS_MOUNT_VERSION)
+-				goto out;
+-
+-			if (d->context[0]) {
+-				context = kstrdup(d->context, GFP_KERNEL);
+-				if (!context) {
+-					rc = -ENOMEM;
+-					goto out;
+-				}
+-			}
+-			goto build_flags;
+-		} else
+-			goto out;
+-	}
++	opts->num_mnt_opts = 0;
+ 
+ 	/* Standard string-based options. */
+ 	while ((p = strsep(&options, "|")) != NULL) {
+@@ -901,26 +880,37 @@ static int superblock_doinit(struct super_block *sb, void *data)
+ 		}
+ 	}
+ 
+-build_flags:
++	rc = -ENOMEM;
++	opts->mnt_opts = kcalloc(NUM_SEL_MNT_OPTS, sizeof(char *), GFP_ATOMIC);
++	if (!opts->mnt_opts)
++		goto out_err;
++
++	opts->mnt_opts_flags = kcalloc(NUM_SEL_MNT_OPTS, sizeof(int), GFP_ATOMIC);
++	if (!opts->mnt_opts_flags) {
++		kfree(opts->mnt_opts);
++		goto out_err;
++	}
++
+ 	if (fscontext) {
+-		mnt_opts[num_mnt_opts] = fscontext;
+-		mnt_opts_flags[num_mnt_opts++] = FSCONTEXT_MNT;
++		opts->mnt_opts[num_mnt_opts] = fscontext;
++		opts->mnt_opts_flags[num_mnt_opts++] = FSCONTEXT_MNT;
+ 	}
+ 	if (context) {
+-		mnt_opts[num_mnt_opts] = context;
+-		mnt_opts_flags[num_mnt_opts++] = CONTEXT_MNT;
++		opts->mnt_opts[num_mnt_opts] = context;
++		opts->mnt_opts_flags[num_mnt_opts++] = CONTEXT_MNT;
+ 	}
+ 	if (rootcontext) {
+-		mnt_opts[num_mnt_opts] = rootcontext;
+-		mnt_opts_flags[num_mnt_opts++] = ROOTCONTEXT_MNT;
++		opts->mnt_opts[num_mnt_opts] = rootcontext;
++		opts->mnt_opts_flags[num_mnt_opts++] = ROOTCONTEXT_MNT;
+ 	}
+ 	if (defcontext) {
+-		mnt_opts[num_mnt_opts] = defcontext;
+-		mnt_opts_flags[num_mnt_opts++] = DEFCONTEXT_MNT;
++		opts->mnt_opts[num_mnt_opts] = defcontext;
++		opts->mnt_opts_flags[num_mnt_opts++] = DEFCONTEXT_MNT;
+ 	}
+ 
+-out:
+-	rc = selinux_set_mnt_opts(sb, mnt_opts, mnt_opts_flags, num_mnt_opts);
++	opts->num_mnt_opts = num_mnt_opts;
++	return 0;
++
+ out_err:
+ 	kfree(context);
+ 	kfree(defcontext);
+@@ -928,6 +918,33 @@ out_err:
+ 	kfree(rootcontext);
+ 	return rc;
+ }
++/*
++ * string mount options parsing and call set the sbsec
++ */
++static int superblock_doinit(struct super_block *sb, void *data)
++{
++	int rc = 0;
++	char *options = data;
++	struct security_mnt_opts opts;
++
++	security_init_mnt_opts(&opts);
++
++	if (!data)
++		goto out;
++
++	BUG_ON(sb->s_type->fs_flags & FS_BINARY_MOUNTDATA);
++
++	rc = selinux_parse_opts_str(options, &opts);
++	if (rc)
++		goto out_err;
++
++out:
++	rc = selinux_set_mnt_opts(sb, &opts);
++
++out_err:
++	security_free_mnt_opts(&opts);
++	return rc;
++}
+ 
+ static inline u16 inode_mode_to_security_class(umode_t mode)
+ {
+@@ -2253,7 +2270,7 @@ static inline void take_selinux_option(char **to, char *from, int *first,
+ 	}
+ }
+ 
+-static int selinux_sb_copy_data(struct file_system_type *type, void *orig, void *copy)
++static int selinux_sb_copy_data(char *orig, char *copy)
+ {
+ 	int fnosec, fsec, rc = 0;
+ 	char *in_save, *in_curr, *in_end;
+@@ -2263,12 +2280,6 @@ static int selinux_sb_copy_data(struct file_system_type *type, void *orig, void
+ 	in_curr = orig;
+ 	sec_curr = copy;
+ 
+-	/* Binary mount data: just copy */
+-	if (type->fs_flags & FS_BINARY_MOUNTDATA) {
+-		copy_page(sec_curr, in_curr);
+-		goto out;
+-	}
+-
+ 	nosec = (char *)get_zeroed_page(GFP_KERNEL);
+ 	if (!nosec) {
+ 		rc = -ENOMEM;
+@@ -5251,6 +5262,8 @@ static struct security_operations selinux_ops = {
+ 	.sb_get_mnt_opts =		selinux_get_mnt_opts,
+ 	.sb_set_mnt_opts =		selinux_set_mnt_opts,
+ 	.sb_clone_mnt_opts = 		selinux_sb_clone_mnt_opts,
++	.sb_parse_opts_str = 		selinux_parse_opts_str,
++
+ 
+ 	.inode_alloc_security =		selinux_inode_alloc_security,
+ 	.inode_free_security =		selinux_inode_free_security,
+diff --git a/security/selinux/include/security.h b/security/selinux/include/security.h
+index 837ce42..f7d2f03 100644
+--- a/security/selinux/include/security.h
++++ b/security/selinux/include/security.h
+@@ -35,6 +35,11 @@
+ #define POLICYDB_VERSION_MAX	POLICYDB_VERSION_POLCAP
+ #endif
+ 
++#define CONTEXT_MNT	0x01
++#define FSCONTEXT_MNT	0x02
++#define ROOTCONTEXT_MNT	0x04
++#define DEFCONTEXT_MNT	0x08
++
+ struct netlbl_lsm_secattr;
+ 
+ extern int selinux_enabled;
+diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c
+index 770eb06..0241fd3 100644
+--- a/security/smack/smack_lsm.c
++++ b/security/smack/smack_lsm.c
+@@ -189,17 +189,10 @@ static void smack_sb_free_security(struct super_block *sb)
+  * Copy the Smack specific mount options out of the mount
+  * options list.
+  */
+-static int smack_sb_copy_data(struct file_system_type *type, void *orig,
+-			      void *smackopts)
++static int smack_sb_copy_data(char *orig, char *smackopts)
+ {
+ 	char *cp, *commap, *otheropts, *dp;
+ 
+-	/* Binary mount data: just copy */
+-	if (type->fs_flags & FS_BINARY_MOUNTDATA) {
+-		copy_page(smackopts, orig);
+-		return 0;
+-	}
+-
+ 	otheropts = (char *)get_zeroed_page(GFP_KERNEL);
+ 	if (otheropts == NULL)
+ 		return -ENOMEM;

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	Sun Mar  9 19:58:51 2008
@@ -1,3 +1,4 @@
++ bugfix/all/patch-2.6.25-rc4-git3
 + debian/version.patch
 + debian/kernelvariables.patch
 + debian/doc-build-parallel.patch



More information about the Kernel-svn-changes mailing list