[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, ¤t->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