diff --git a/debian/changelog b/debian/changelog
index 3691b0dcf..41ce29ceb 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,4 +1,4 @@
-linux-2.6 (2.6.26~rc3-1~experimental.1) UNRELEASED; urgency=low
+linux-2.6 (2.6.26~rc4-1~experimental.1) UNRELEASED; urgency=low
* New upstream release
- UDF 2.50 support. (closes: #480910)
diff --git a/debian/patches/bugfix/all/patch-2.6.26-rc3-git7 b/debian/patches/bugfix/all/patch-2.6.26-rc3-git7
deleted file mode 100644
index 7203c4c4f..000000000
--- a/debian/patches/bugfix/all/patch-2.6.26-rc3-git7
+++ /dev/null
@@ -1,30142 +0,0 @@
-diff --git a/.gitignore b/.gitignore
-index 090b293..9c0d650 100644
---- a/.gitignore
-+++ b/.gitignore
-@@ -54,6 +54,5 @@ series
- cscope.*
-
- *.orig
--*.rej
- *~
- \#*#
-diff --git a/Documentation/ABI/testing/sysfs-class-bdi b/Documentation/ABI/testing/sysfs-class-bdi
-index 5ac1e01..5f50097 100644
---- a/Documentation/ABI/testing/sysfs-class-bdi
-+++ b/Documentation/ABI/testing/sysfs-class-bdi
-@@ -14,6 +14,10 @@ MAJOR:MINOR
- non-block filesystems which provide their own BDI, such as NFS
- and FUSE.
-
-+MAJOR:MINOR-fuseblk
-+
-+ Value of st_dev on fuseblk filesystems.
-+
- default
-
- The default backing dev, used for non-block device backed
-diff --git a/Documentation/DocBook/kernel-locking.tmpl b/Documentation/DocBook/kernel-locking.tmpl
-index 77c42f4..2510763 100644
---- a/Documentation/DocBook/kernel-locking.tmpl
-+++ b/Documentation/DocBook/kernel-locking.tmpl
-@@ -703,6 +703,31 @@
-
-
-
-+
-+ The trylock Functions
-+
-+ There are functions that try to acquire a lock only once and immediately
-+ return a value telling about success or failure to acquire the lock.
-+ They can be used if you need no access to the data protected with the lock
-+ when some other thread is holding the lock. You should acquire the lock
-+ later if you then need access to the data protected with the lock.
-+
-+
-+
-+ spin_trylock() does not spin but returns non-zero if
-+ it acquires the spinlock on the first try or 0 if not. This function can
-+ be used in all contexts like spin_lock: you must have
-+ disabled the contexts that might interrupt you and acquire the spin lock.
-+
-+
-+
-+ mutex_trylock() does not suspend your task
-+ but returns non-zero if it could lock the mutex on the first try
-+ or 0 if not. This function cannot be safely used in hardware or software
-+ interrupt contexts despite not sleeping.
-+
-+
-+
-
- Common Examples
-
-diff --git a/Documentation/cpu-freq/governors.txt b/Documentation/cpu-freq/governors.txt
-index 6a9c55b..dcec056 100644
---- a/Documentation/cpu-freq/governors.txt
-+++ b/Documentation/cpu-freq/governors.txt
-@@ -129,14 +129,6 @@ to its default value of '80' it means that between the checking
- intervals the CPU needs to be on average more than 80% in use to then
- decide that the CPU frequency needs to be increased.
-
--sampling_down_factor: this parameter controls the rate that the CPU
--makes a decision on when to decrease the frequency. When set to its
--default value of '5' it means that at 1/5 the sampling_rate the kernel
--makes a decision to lower the frequency. Five "lower rate" decisions
--have to be made in a row before the CPU frequency is actually lower.
--If set to '1' then the frequency decreases as quickly as it increases,
--if set to '2' it decreases at half the rate of the increase.
--
- ignore_nice_load: this parameter takes a value of '0' or '1'. When
- set to '0' (its default), all processes are counted towards the
- 'cpu utilisation' value. When set to '1', the processes that are
-diff --git a/Documentation/hwmon/ibmaem b/Documentation/hwmon/ibmaem
-new file mode 100644
-index 0000000..2fefaf5
---- /dev/null
-+++ b/Documentation/hwmon/ibmaem
-@@ -0,0 +1,37 @@
-+Kernel driver ibmaem
-+======================
-+
-+Supported systems:
-+ * Any recent IBM System X server with Active Energy Manager support.
-+ This includes the x3350, x3550, x3650, x3655, x3755, x3850 M2,
-+ x3950 M2, and certain HS2x/LS2x/QS2x blades. The IPMI host interface
-+ driver ("ipmi-si") needs to be loaded for this driver to do anything.
-+ Prefix: 'ibmaem'
-+ Datasheet: Not available
-+
-+Author: Darrick J. Wong
-+
-+Description
-+-----------
-+
-+This driver implements sensor reading support for the energy and power
-+meters available on various IBM System X hardware through the BMC. All
-+sensor banks will be exported as platform devices; this driver can talk
-+to both v1 and v2 interfaces. This driver is completely separate from the
-+older ibmpex driver.
-+
-+The v1 AEM interface has a simple set of features to monitor energy use.
-+There is a register that displays an estimate of raw energy consumption
-+since the last BMC reset, and a power sensor that returns average power
-+use over a configurable interval.
-+
-+The v2 AEM interface is a bit more sophisticated, being able to present
-+a wider range of energy and power use registers, the power cap as
-+set by the AEM software, and temperature sensors.
-+
-+Special Features
-+----------------
-+
-+The "power_cap" value displays the current system power cap, as set by
-+the Active Energy Manager software. Setting the power cap from the host
-+is not currently supported.
-diff --git a/Kbuild b/Kbuild
-index 32f19c5..e750e9c 100644
---- a/Kbuild
-+++ b/Kbuild
-@@ -96,5 +96,4 @@ missing-syscalls: scripts/checksyscalls.sh FORCE
- $(call cmd,syscalls)
-
- # Delete all targets during make clean
--clean-files := $(addprefix $(objtree)/,$(targets))
--
-+clean-files := $(addprefix $(objtree)/,$(filter-out $(bounds-file) $(offsets-file),$(targets)))
-diff --git a/MAINTAINERS b/MAINTAINERS
-index c68a118..0a6d2ca 100644
---- a/MAINTAINERS
-+++ b/MAINTAINERS
-@@ -982,13 +982,6 @@ L: bonding-devel@lists.sourceforge.net
- W: http://sourceforge.net/projects/bonding/
- S: Supported
-
--BROADBAND PROCESSOR ARCHITECTURE
--P: Arnd Bergmann
--M: arnd@arndb.de
--L: linuxppc-dev@ozlabs.org
--W: http://www.penguinppc.org/ppc64/
--S: Supported
--
- BROADCOM B44 10/100 ETHERNET DRIVER
- P: Gary Zambrano
- M: zambrano@broadcom.com
-@@ -1052,6 +1045,14 @@ L: linux-kernel@vger.kernel.org
- L: discuss@x86-64.org
- S: Maintained
-
-+CELL BROADBAND ENGINE ARCHITECTURE
-+P: Arnd Bergmann
-+M: arnd@arndb.de
-+L: linuxppc-dev@ozlabs.org
-+L: cbe-oss-dev@ozlabs.org
-+W: http://www.ibm.com/developerworks/power/cell/
-+S: Supported
-+
- CFAG12864B LCD DRIVER
- P: Miguel Ojeda Sandonis
- M: maxextreme@gmail.com
-@@ -1239,6 +1240,20 @@ L: video4linux-list@redhat.com
- W: http://linuxtv.org
- S: Maintained
-
-+CXGB3 ETHERNET DRIVER (CXGB3)
-+P: Divy Le Ray
-+M: divy@chelsio.com
-+L: netdev@vger.kernel.org
-+W: http://www.chelsio.com
-+S: Supported
-+
-+CXGB3 IWARP RNIC DRIVER (IW_CXGB3)
-+P: Steve Wise
-+M: swise@chelsio.com
-+L: general@lists.openfabrics.org
-+W: http://www.openfabrics.org
-+S: Supported
-+
- CYBERPRO FB DRIVER
- P: Russell King
- M: rmk@arm.linux.org.uk
-@@ -1645,8 +1660,10 @@ W: http://linux-fbdev.sourceforge.net/
- S: Maintained
-
- FREESCALE DMA DRIVER
--P; Zhang Wei
--M: wei.zhang@freescale.com
-+P: Li Yang
-+M: leoli@freescale.com
-+P: Zhang Wei
-+M: zw@zh-kernel.org
- L: linuxppc-embedded@ozlabs.org
- L: linux-kernel@vger.kernel.org
- S: Maintained
-@@ -2329,7 +2346,8 @@ S: Maintained
- KERNEL BUILD (kbuild: Makefile, scripts/Makefile.*)
- P: Sam Ravnborg
- M: sam@ravnborg.org
--T: git kernel.org:/pub/scm/linux/kernel/git/sam/kbuild.git
-+T: git kernel.org:/pub/scm/linux/kernel/git/sam/kbuild-next.git
-+T: git kernel.org:/pub/scm/linux/kernel/git/sam/kbuild-fixes.git
- L: linux-kbuild@vger.kernel.org
- S: Maintained
-
-@@ -2351,24 +2369,24 @@ S: Supported
- KERNEL VIRTUAL MACHINE (KVM)
- P: Avi Kivity
- M: avi@qumranet.com
--L: kvm-devel@lists.sourceforge.net
--W: kvm.sourceforge.net
-+L: kvm@vger.kernel.org
-+W: http://kvm.qumranet.com
- S: Supported
-
- KERNEL VIRTUAL MACHINE (KVM) FOR POWERPC
- P: Hollis Blanchard
- M: hollisb@us.ibm.com
--L: kvm-ppc-devel@lists.sourceforge.net
--W: kvm.sourceforge.net
-+L: kvm-ppc@vger.kernel.org
-+W: http://kvm.qumranet.com
- S: Supported
-
--KERNEL VIRTUAL MACHINE For Itanium(KVM/IA64)
-+KERNEL VIRTUAL MACHINE For Itanium (KVM/IA64)
- P: Anthony Xu
- M: anthony.xu@intel.com
- P: Xiantao Zhang
- M: xiantao.zhang@intel.com
--L: kvm-ia64-devel@lists.sourceforge.net
--W: kvm.sourceforge.net
-+L: kvm-ia64@vger.kernel.org
-+W: http://kvm.qumranet.com
- S: Supported
-
- KERNEL VIRTUAL MACHINE for s390 (KVM/s390)
-@@ -2819,6 +2837,15 @@ M: jirislaby@gmail.com
- L: linux-kernel@vger.kernel.org
- S: Maintained
-
-+MYRICOM MYRI-10G 10GbE DRIVER (MYRI10GE)
-+P: Andrew Gallatin
-+M: gallatin@myri.com
-+P: Brice Goglin
-+M: brice@myri.com
-+L: netdev@vger.kernel.org
-+W: http://www.myri.com/scs/download-Myri10GE.html
-+S: Supported
-+
- NATSEMI ETHERNET DRIVER (DP8381x)
- P: Tim Hockin
- M: thockin@hockin.org
-@@ -3132,7 +3159,7 @@ PCI ERROR RECOVERY
- P: Linas Vepstas
- M: linas@austin.ibm.com
- L: linux-kernel@vger.kernel.org
--L: linux-pci@atrey.karlin.mff.cuni.cz
-+L: linux-pci@vger.kernel.org
- S: Supported
-
- PCI SUBSYSTEM
-@@ -3766,6 +3793,14 @@ M: dbrownell@users.sourceforge.net
- L: spi-devel-general@lists.sourceforge.net
- S: Maintained
-
-+SPU FILE SYSTEM
-+P: Jeremy Kerr
-+M: jk@ozlabs.org
-+L: linuxppc-dev@ozlabs.org
-+L: cbe-oss-dev@ozlabs.org
-+W: http://www.ibm.com/developerworks/power/cell/
-+S: Supported
-+
- STABLE BRANCH:
- P: Greg Kroah-Hartman
- M: greg@kroah.com
-@@ -4021,12 +4056,41 @@ M: ballabio_dario@emc.com
- L: linux-scsi@vger.kernel.org
- S: Maintained
-
-+UCLINUX (AND M68KNOMMU)
-+P: Greg Ungerer
-+M: gerg@uclinux.org
-+W: http://www.uclinux.org/
-+L: uclinux-dev@uclinux.org (subscribers-only)
-+S: Maintained
-+
-+UCLINUX FOR NEC V850
-+P: Miles Bader
-+
-+UCLINUX FOR RENESAS H8/300
-+P: Yoshinori Sato
-+M: ysato@users.sourceforge.jp
-+W: http://uclinux-h8.sourceforge.jp/
-+S: Supported
-+
- UDF FILESYSTEM
- P: Jan Kara
- M: jack@suse.cz
- W: http://linux-udf.sourceforge.net
- S: Maintained
-
-+UFS FILESYSTEM
-+P: Evgeniy Dushistov
-+M: dushistov@mail.ru
-+L: linux-kernel@vger.kernel.org
-+S: Maintained
-+
-+UltraSPARC (sparc64):
-+P: David S. Miller
-+M: davem@davemloft.net
-+L: sparclinux@vger.kernel.org
-+T: git kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6.git
-+S: Maintained
-+
- UNIFORM CDROM DRIVER
- P: Jens Axboe
- M: axboe@kernel.dk
-@@ -4073,6 +4137,13 @@ L: netdev@vger.kernel.org
- W: http://www.linux-usb.org/usbnet
- S: Maintained
-
-+USB DIAMOND RIO500 DRIVER
-+P: Cesar Miquel
-+M: miquel@df.uba.ar
-+L: rio500-users@lists.sourceforge.net
-+W: http://rio500.sourceforge.net
-+S: Maintained
-+
- USB EHCI DRIVER
- P: David Brownell
- M: dbrownell@users.sourceforge.net
-@@ -4304,6 +4375,14 @@ M: gregkh@suse.de
- L: linux-kernel@vger.kernel.org
- S: Maintained
-
-+UTIL-LINUX-NG PACKAGE
-+P: Karel Zak
-+M: kzak@redhat.com
-+L: util-linux-ng@vger.kernel.org
-+W: http://kernel.org/~kzak/util-linux-ng/
-+T: git://git.kernel.org/pub/scm/utils/util-linux-ng/util-linux-ng.git
-+S: Maintained
-+
- VFAT/FAT/MSDOS FILESYSTEM:
- P: OGAWA Hirofumi
- M: hirofumi@mail.parknet.co.jp
-@@ -4327,42 +4406,6 @@ M: romieu@fr.zoreil.com
- L: netdev@vger.kernel.org
- S: Maintained
-
--UCLINUX (AND M68KNOMMU)
--P: Greg Ungerer
--M: gerg@uclinux.org
--W: http://www.uclinux.org/
--L: uclinux-dev@uclinux.org (subscribers-only)
--S: Maintained
--
--UCLINUX FOR NEC V850
--P: Miles Bader
--
--UCLINUX FOR RENESAS H8/300
--P: Yoshinori Sato
--M: ysato@users.sourceforge.jp
--W: http://uclinux-h8.sourceforge.jp/
--S: Supported
--
--UFS FILESYSTEM
--P: Evgeniy Dushistov
--M: dushistov@mail.ru
--L: linux-kernel@vger.kernel.org
--S: Maintained
--
--UltraSPARC (sparc64):
--P: David S. Miller
--M: davem@davemloft.net
--L: sparclinux@vger.kernel.org
--T: git kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6.git
--S: Maintained
--
--USB DIAMOND RIO500 DRIVER
--P: Cesar Miquel
--M: miquel@df.uba.ar
--L: rio500-users@lists.sourceforge.net
--W: http://rio500.sourceforge.net
--S: Maintained
--
- VIDEO FOR LINUX
- P: Mauro Carvalho Chehab
- M: mchehab@infradead.org
-diff --git a/Makefile b/Makefile
-index f638842..d33f4eb 100644
---- a/Makefile
-+++ b/Makefile
-@@ -1114,6 +1114,7 @@ MRPROPER_DIRS += include/config include2 usr/include
- MRPROPER_FILES += .config .config.old include/asm .version .old_version \
- include/linux/autoconf.h include/linux/version.h \
- include/linux/utsrelease.h \
-+ include/linux/bounds.h include/asm*/asm-offsets.h \
- Module.symvers tags TAGS cscope*
-
- # clean - Delete most, but leave enough to build external modules
-@@ -1431,7 +1432,7 @@ define xtags
- elif $1 --version 2>&1 | grep -iq emacs; then \
- $(all-sources) | xargs $1 -a; \
- $(all-kconfigs) | xargs $1 -a \
-- --regex='/^[ \t]*(menu|)config[ \t]+\([a-zA-Z0-9_]+\)/\2/'; \
-+ --regex='/^[ \t]*\(\(menu\)*config\)[ \t]+\([a-zA-Z0-9_]+\)/\3/'; \
- $(all-defconfigs) | xargs -r $1 -a \
- --regex='/^#?[ \t]?\(CONFIG_[a-zA-Z0-9_]+\)/\1/'; \
- else \
-diff --git a/arch/alpha/kernel/init_task.c b/arch/alpha/kernel/init_task.c
-index 835d09a..1f76218 100644
---- a/arch/alpha/kernel/init_task.c
-+++ b/arch/alpha/kernel/init_task.c
-@@ -9,7 +9,6 @@
-
-
- static struct fs_struct init_fs = INIT_FS;
--static struct files_struct init_files = INIT_FILES;
- static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
- static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
- struct mm_struct init_mm = INIT_MM(init_mm);
-diff --git a/arch/arm/kernel/init_task.c b/arch/arm/kernel/init_task.c
-index bd4ef53..8b8c9d3 100644
---- a/arch/arm/kernel/init_task.c
-+++ b/arch/arm/kernel/init_task.c
-@@ -13,7 +13,6 @@
- #include
-
- static struct fs_struct init_fs = INIT_FS;
--static struct files_struct init_files = INIT_FILES;
- static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
- static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
- struct mm_struct init_mm = INIT_MM(init_mm);
-diff --git a/arch/arm/mach-at91/at91x40.c b/arch/arm/mach-at91/at91x40.c
-index 1de121f..f446477 100644
---- a/arch/arm/mach-at91/at91x40.c
-+++ b/arch/arm/mach-at91/at91x40.c
-@@ -16,16 +16,32 @@
- #include
- #include
- #include
-+#include
- #include "generic.h"
-
- /*
-- * This is used in the gpio code, stub locally.
-+ * Export the clock functions for the AT91X40. Some external code common
-+ * to all AT91 family parts relys on this, like the gpio and serial support.
- */
- int clk_enable(struct clk *clk)
- {
- return 0;
- }
-
-+void clk_disable(struct clk *clk)
-+{
-+}
-+
-+unsigned long clk_get_rate(struct clk *clk)
-+{
-+ return AT91X40_MASTER_CLOCK;
-+}
-+
-+struct clk *clk_get(struct device *dev, const char *id)
-+{
-+ return NULL;
-+}
-+
- void __init at91x40_initialize(unsigned long main_clock)
- {
- at91_extern_irq = (1 << AT91X40_ID_IRQ0) | (1 << AT91X40_ID_IRQ1)
-diff --git a/arch/arm/mach-integrator/impd1.c b/arch/arm/mach-integrator/impd1.c
-index 92d79fb..62e653a 100644
---- a/arch/arm/mach-integrator/impd1.c
-+++ b/arch/arm/mach-integrator/impd1.c
-@@ -369,7 +369,8 @@ static int impd1_probe(struct lm_device *dev)
-
- lm_set_drvdata(dev, impd1);
-
-- printk("IM-PD1 found at 0x%08lx\n", dev->resource.start);
-+ printk("IM-PD1 found at 0x%08lx\n",
-+ (unsigned long)dev->resource.start);
-
- for (i = 0; i < ARRAY_SIZE(impd1->vcos); i++) {
- impd1->vcos[i].owner = THIS_MODULE,
-diff --git a/arch/arm/mach-integrator/pci_v3.c b/arch/arm/mach-integrator/pci_v3.c
-index d55fa4e..c07f497 100644
---- a/arch/arm/mach-integrator/pci_v3.c
-+++ b/arch/arm/mach-integrator/pci_v3.c
-@@ -405,7 +405,6 @@ v3_pci_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
- addr, fsr, pc, instr, __raw_readl(SC_LBFADDR), __raw_readl(SC_LBFCODE) & 255,
- v3_readb(V3_LB_ISTAT));
- printk(KERN_DEBUG "%s", buf);
-- printascii(buf);
- #endif
-
- v3_writeb(V3_LB_ISTAT, 0);
-@@ -447,6 +446,7 @@ static irqreturn_t v3_irq(int dummy, void *devid)
- unsigned long pc = instruction_pointer(regs);
- unsigned long instr = *(unsigned long *)pc;
- char buf[128];
-+ extern void printascii(const char *);
-
- sprintf(buf, "V3 int %d: pc=0x%08lx [%08lx] LBFADDR=%08x LBFCODE=%02x "
- "ISTAT=%02x\n", IRQ_AP_V3INT, pc, instr,
-diff --git a/arch/arm/mach-omap1/board-palmte.c b/arch/arm/mach-omap1/board-palmte.c
-index a0b16a7..a4d2012 100644
---- a/arch/arm/mach-omap1/board-palmte.c
-+++ b/arch/arm/mach-omap1/board-palmte.c
-@@ -24,7 +24,6 @@
- #include
- #include
- #include
--#include
- #include
- #include
-
-@@ -315,14 +314,6 @@ static void palmte_get_power_status(struct apm_power_info *info, int *battery)
- #define palmte_get_power_status NULL
- #endif
-
--static struct tsc2102_config palmte_tsc2102_config = {
-- .use_internal = 0,
-- .monitor = TSC_BAT1 | TSC_AUX | TSC_TEMP,
-- .temp_at25c = { 2200, 2615 },
-- .apm_report = palmte_get_power_status,
-- .alsa_config = &palmte_alsa_config,
--};
--
- static struct omap_board_config_kernel palmte_config[] __initdata = {
- { OMAP_TAG_USB, &palmte_usb_config },
- { OMAP_TAG_MMC, &palmte_mmc_config },
-@@ -336,7 +327,6 @@ static struct spi_board_info palmte_spi_info[] __initdata = {
- .bus_num = 2, /* uWire (officially) */
- .chip_select = 0, /* As opposed to 3 */
- .irq = OMAP_GPIO_IRQ(PALMTE_PINTDAV_GPIO),
-- .platform_data = &palmte_tsc2102_config,
- .max_speed_hz = 8000000,
- },
- };
-diff --git a/arch/arm/mach-pxa/spitz.c b/arch/arm/mach-pxa/spitz.c
-index dace382..e7d0fcd 100644
---- a/arch/arm/mach-pxa/spitz.c
-+++ b/arch/arm/mach-pxa/spitz.c
-@@ -38,7 +38,6 @@
- #include
- #include
- #include
--#include
- #include
- #include
- #include
-diff --git a/arch/arm/mach-s3c2410/mach-bast.c b/arch/arm/mach-s3c2410/mach-bast.c
-index 661a235..27f63d5 100644
---- a/arch/arm/mach-s3c2410/mach-bast.c
-+++ b/arch/arm/mach-s3c2410/mach-bast.c
-@@ -374,7 +374,7 @@ static struct resource bast_dm9k_resource[] = {
- [2] = {
- .start = IRQ_DM9000,
- .end = IRQ_DM9000,
-- .flags = IORESOURCE_IRQ,
-+ .flags = IORESOURCE_IRQ | IRQF_TRIGGER_HIGH,
- }
-
- };
-diff --git a/arch/arm/mach-s3c2410/mach-vr1000.c b/arch/arm/mach-s3c2410/mach-vr1000.c
-index c564233..4c4b5c4 100644
---- a/arch/arm/mach-s3c2410/mach-vr1000.c
-+++ b/arch/arm/mach-s3c2410/mach-vr1000.c
-@@ -263,7 +263,7 @@ static struct resource vr1000_dm9k0_resource[] = {
- [2] = {
- .start = IRQ_VR1000_DM9000A,
- .end = IRQ_VR1000_DM9000A,
-- .flags = IORESOURCE_IRQ
-+ .flags = IORESOURCE_IRQ | IRQF_TRIGGER_HIGH,
- }
-
- };
-@@ -282,7 +282,7 @@ static struct resource vr1000_dm9k1_resource[] = {
- [2] = {
- .start = IRQ_VR1000_DM9000N,
- .end = IRQ_VR1000_DM9000N,
-- .flags = IORESOURCE_IRQ
-+ .flags = IORESOURCE_IRQ | IRQF_TRIGGER_HIGH,
- }
- };
-
-diff --git a/arch/arm/mach-sa1100/collie.c b/arch/arm/mach-sa1100/collie.c
-index 6496eb6..2f772a3 100644
---- a/arch/arm/mach-sa1100/collie.c
-+++ b/arch/arm/mach-sa1100/collie.c
-@@ -225,26 +225,28 @@ static void __init collie_init(void)
- int ret = 0;
-
- /* cpu initialize */
-- GAFR = ( GPIO_SSP_TXD | \
-- GPIO_SSP_SCLK | GPIO_SSP_SFRM | GPIO_SSP_CLK | GPIO_TIC_ACK | \
-- GPIO_32_768kHz );
--
-- GPDR = ( GPIO_LDD8 | GPIO_LDD9 | GPIO_LDD10 | GPIO_LDD11 | GPIO_LDD12 | \
-- GPIO_LDD13 | GPIO_LDD14 | GPIO_LDD15 | GPIO_SSP_TXD | \
-- GPIO_SSP_SCLK | GPIO_SSP_SFRM | GPIO_SDLC_SCLK | \
-- GPIO_SDLC_AAF | GPIO_UART_SCLK1 | GPIO_32_768kHz );
-- GPLR = GPIO_GPIO18;
--
-- // PPC pin setting
-- PPDR = ( PPC_LDD0 | PPC_LDD1 | PPC_LDD2 | PPC_LDD3 | PPC_LDD4 | PPC_LDD5 | \
-- PPC_LDD6 | PPC_LDD7 | PPC_L_PCLK | PPC_L_LCLK | PPC_L_FCLK | PPC_L_BIAS | \
-- PPC_TXD1 | PPC_TXD2 | PPC_RXD2 | PPC_TXD3 | PPC_TXD4 | PPC_SCLK | PPC_SFRM );
--
-- PSDR = ( PPC_RXD1 | PPC_RXD2 | PPC_RXD3 | PPC_RXD4 );
--
-- GAFR |= GPIO_32_768kHz;
-- GPDR |= GPIO_32_768kHz;
-- TUCR = TUCR_32_768kHz;
-+ GAFR = GPIO_SSP_TXD | GPIO_SSP_SCLK | GPIO_SSP_SFRM | GPIO_SSP_CLK |
-+ GPIO_MCP_CLK | GPIO_32_768kHz;
-+
-+ GPDR = GPIO_LDD8 | GPIO_LDD9 | GPIO_LDD10 | GPIO_LDD11 | GPIO_LDD12 |
-+ GPIO_LDD13 | GPIO_LDD14 | GPIO_LDD15 | GPIO_SSP_TXD |
-+ GPIO_SSP_SCLK | GPIO_SSP_SFRM | GPIO_SDLC_SCLK |
-+ COLLIE_GPIO_UCB1x00_RESET | COLLIE_GPIO_nMIC_ON |
-+ COLLIE_GPIO_nREMOCON_ON | GPIO_32_768kHz;
-+
-+ PPDR = PPC_LDD0 | PPC_LDD1 | PPC_LDD2 | PPC_LDD3 | PPC_LDD4 | PPC_LDD5 |
-+ PPC_LDD6 | PPC_LDD7 | PPC_L_PCLK | PPC_L_LCLK | PPC_L_FCLK | PPC_L_BIAS |
-+ PPC_TXD1 | PPC_TXD2 | PPC_TXD3 | PPC_TXD4 | PPC_SCLK | PPC_SFRM;
-+
-+ PWER = COLLIE_GPIO_AC_IN | COLLIE_GPIO_CO | COLLIE_GPIO_ON_KEY |
-+ COLLIE_GPIO_WAKEUP | COLLIE_GPIO_nREMOCON_INT | PWER_RTC;
-+
-+ PGSR = COLLIE_GPIO_nREMOCON_ON;
-+
-+ PSDR = PPC_RXD1 | PPC_RXD2 | PPC_RXD3 | PPC_RXD4;
-+
-+ PCFR = PCFR_OPDE;
-+
-
- platform_scoop_config = &collie_pcmcia_config;
-
-diff --git a/arch/arm/plat-omap/clock.c b/arch/arm/plat-omap/clock.c
-index 2946c19..2db5580 100644
---- a/arch/arm/plat-omap/clock.c
-+++ b/arch/arm/plat-omap/clock.c
-@@ -21,6 +21,7 @@
- #include
- #include
- #include
-+#include
-
- #include
-
-diff --git a/arch/arm/plat-s3c24xx/s3c244x.c b/arch/arm/plat-s3c24xx/s3c244x.c
-index f197bb3..2f01af5 100644
---- a/arch/arm/plat-s3c24xx/s3c244x.c
-+++ b/arch/arm/plat-s3c24xx/s3c244x.c
-@@ -65,6 +65,7 @@ void __init s3c244x_map_io(struct map_desc *mach_desc, int size)
-
- /* rename any peripherals used differing from the s3c2410 */
-
-+ s3c_device_sdi.name = "s3c2440-sdi";
- s3c_device_i2c.name = "s3c2440-i2c";
- s3c_device_nand.name = "s3c2440-nand";
- s3c_device_usbgadget.name = "s3c2440-usbgadget";
-diff --git a/arch/avr32/kernel/init_task.c b/arch/avr32/kernel/init_task.c
-index effcacf..4405846 100644
---- a/arch/avr32/kernel/init_task.c
-+++ b/arch/avr32/kernel/init_task.c
-@@ -14,7 +14,6 @@
- #include
-
- static struct fs_struct init_fs = INIT_FS;
--static struct files_struct init_files = INIT_FILES;
- static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
- static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
- struct mm_struct init_mm = INIT_MM(init_mm);
-diff --git a/arch/blackfin/Kconfig b/arch/blackfin/Kconfig
-index fd57085..b87634e 100644
---- a/arch/blackfin/Kconfig
-+++ b/arch/blackfin/Kconfig
-@@ -479,16 +479,6 @@ comment "Memory Setup"
-
- comment "Misc"
-
--config ENET_FLASH_PIN
-- int "PF port/pin used for flash and ethernet sharing"
-- depends on (BFIN533_STAMP)
-- default 0
-- help
-- PF port/pin used for flash and ethernet sharing to allow other PF
-- pins to be used on other platforms without having to touch common
-- code.
-- For example: PF0 --> 0,PF1 --> 1,PF2 --> 2, etc.
--
- choice
- prompt "Blackfin Exception Scratch Register"
- default BFIN_SCRATCH_REG_RETN
-@@ -695,6 +685,8 @@ choice
- prompt "Uncached SDRAM region"
- default DMA_UNCACHED_1M
- depends on BFIN_DMA_5XX
-+config DMA_UNCACHED_4M
-+ bool "Enable 4M DMA region"
- config DMA_UNCACHED_2M
- bool "Enable 2M DMA region"
- config DMA_UNCACHED_1M
-diff --git a/arch/blackfin/configs/BF527-EZKIT_defconfig b/arch/blackfin/configs/BF527-EZKIT_defconfig
-index 64876df..5e6fb9d 100644
---- a/arch/blackfin/configs/BF527-EZKIT_defconfig
-+++ b/arch/blackfin/configs/BF527-EZKIT_defconfig
-@@ -1,6 +1,7 @@
- #
- # Automatically generated make config: don't edit
--# Linux kernel version: 2.6.22.16
-+# Linux kernel version: 2.6.24.7
-+# Fri May 16 10:02:29 2008
- #
- # CONFIG_MMU is not set
- # CONFIG_FPU is not set
-@@ -13,35 +14,34 @@ CONFIG_GENERIC_FIND_NEXT_BIT=y
- CONFIG_GENERIC_HWEIGHT=y
- CONFIG_GENERIC_HARDIRQS=y
- CONFIG_GENERIC_IRQ_PROBE=y
--CONFIG_GENERIC_TIME=y
- CONFIG_GENERIC_GPIO=y
- CONFIG_FORCE_MAX_ZONEORDER=14
- CONFIG_GENERIC_CALIBRATE_DELAY=y
- CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-
- #
--# Code maturity level options
-+# General setup
- #
- CONFIG_EXPERIMENTAL=y
- CONFIG_BROKEN_ON_SMP=y
- CONFIG_INIT_ENV_ARG_LIMIT=32
--
--#
--# General setup
--#
- CONFIG_LOCALVERSION=""
- CONFIG_LOCALVERSION_AUTO=y
- CONFIG_SYSVIPC=y
--# CONFIG_IPC_NS is not set
- CONFIG_SYSVIPC_SYSCTL=y
- # CONFIG_POSIX_MQUEUE is not set
- # CONFIG_BSD_PROCESS_ACCT is not set
- # CONFIG_TASKSTATS is not set
--# CONFIG_UTS_NS is not set
-+# CONFIG_USER_NS is not set
-+# CONFIG_PID_NS is not set
- # CONFIG_AUDIT is not set
- CONFIG_IKCONFIG=y
- CONFIG_IKCONFIG_PROC=y
- CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_FAIR_GROUP_SCHED=y
-+CONFIG_FAIR_USER_SCHED=y
-+# CONFIG_FAIR_CGROUP_SCHED is not set
- CONFIG_SYSFS_DEPRECATED=y
- # CONFIG_RELAY is not set
- CONFIG_BLK_DEV_INITRD=y
-@@ -64,32 +64,24 @@ CONFIG_EPOLL=y
- CONFIG_SIGNALFD=y
- CONFIG_EVENTFD=y
- CONFIG_VM_EVENT_COUNTERS=y
--CONFIG_BIG_ORDER_ALLOC_NOFAIL_MAGIC=3
--# CONFIG_NP2 is not set
- CONFIG_SLAB=y
- # CONFIG_SLUB is not set
- # CONFIG_SLOB is not set
-+CONFIG_SLABINFO=y
- CONFIG_RT_MUTEXES=y
- CONFIG_TINY_SHMEM=y
- CONFIG_BASE_SMALL=0
--
--#
--# Loadable module support
--#
- CONFIG_MODULES=y
- CONFIG_MODULE_UNLOAD=y
- # CONFIG_MODULE_FORCE_UNLOAD is not set
- # CONFIG_MODVERSIONS is not set
- # CONFIG_MODULE_SRCVERSION_ALL is not set
- CONFIG_KMOD=y
--
--#
--# Block layer
--#
- CONFIG_BLOCK=y
- # CONFIG_LBD is not set
- # CONFIG_BLK_DEV_IO_TRACE is not set
- # CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-
- #
- # IO Schedulers
-@@ -141,7 +133,6 @@ CONFIG_BF_REV_0_0=y
- # CONFIG_BF_REV_ANY is not set
- # CONFIG_BF_REV_NONE is not set
- CONFIG_BF52x=y
--CONFIG_BFIN_SINGLE_CORE=y
- CONFIG_MEM_MT48LC32M16A2TG_75=y
- CONFIG_BFIN527_EZKIT=y
-
-@@ -227,12 +218,14 @@ CONFIG_IRQ_USB_DMA=11
- # Board customizations
- #
- # CONFIG_CMDLINE_BOOL is not set
-+CONFIG_BOOT_LOAD=0x1000
-
- #
- # Clock/PLL Setup
- #
- CONFIG_CLKIN_HZ=25000000
- # CONFIG_BFIN_KERNEL_CLOCK is not set
-+CONFIG_MAX_MEM_SIZE=512
- CONFIG_MAX_VCO_HZ=600000000
- CONFIG_MIN_VCO_HZ=50000000
- CONFIG_MAX_SCLK_HZ=133333333
-@@ -246,13 +239,17 @@ CONFIG_HZ_250=y
- # CONFIG_HZ_300 is not set
- # CONFIG_HZ_1000 is not set
- CONFIG_HZ=250
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+# CONFIG_CYCLES_CLOCKSOURCE is not set
-+# CONFIG_TICK_ONESHOT is not set
-+# CONFIG_NO_HZ is not set
-+# CONFIG_HIGH_RES_TIMERS is not set
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-
- #
--# Memory Setup
-+# Misc
- #
--CONFIG_MAX_MEM_SIZE=512
--CONFIG_MEM_ADD_WIDTH=10
--CONFIG_BOOT_LOAD=0x1000
- CONFIG_BFIN_SCRATCH_REG_RETN=y
- # CONFIG_BFIN_SCRATCH_REG_RETE is not set
- # CONFIG_BFIN_SCRATCH_REG_CYCLES is not set
-@@ -288,12 +285,14 @@ CONFIG_FLATMEM_MANUAL=y
- CONFIG_FLATMEM=y
- CONFIG_FLAT_NODE_MEM_MAP=y
- # CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
- CONFIG_SPLIT_PTLOCK_CPUS=4
- # CONFIG_RESOURCES_64BIT is not set
- CONFIG_ZONE_DMA_FLAG=1
--CONFIG_LARGE_ALLOCS=y
-+CONFIG_VIRT_TO_BUS=y
- # CONFIG_BFIN_GPTIMERS is not set
- CONFIG_BFIN_DMA_5XX=y
-+# CONFIG_DMA_UNCACHED_4M is not set
- # CONFIG_DMA_UNCACHED_2M is not set
- CONFIG_DMA_UNCACHED_1M=y
- # CONFIG_DMA_UNCACHED_NONE is not set
-@@ -338,10 +337,6 @@ CONFIG_BANK_3=0xFFC0
- #
- # CONFIG_PCI is not set
- # CONFIG_ARCH_SUPPORTS_MSI is not set
--
--#
--# PCCARD (PCMCIA/CardBus) support
--#
- # CONFIG_PCCARD is not set
-
- #
-@@ -357,9 +352,15 @@ CONFIG_BINFMT_ZFLAT=y
- # Power management options
- #
- # CONFIG_PM is not set
-+CONFIG_SUSPEND_UP_POSSIBLE=y
- # CONFIG_PM_WAKEUP_BY_GPIO is not set
-
- #
-+# CPU Frequency scaling
-+#
-+# CONFIG_CPU_FREQ is not set
-+
-+#
- # Networking
- #
- CONFIG_NET=y
-@@ -395,6 +396,7 @@ CONFIG_SYN_COOKIES=y
- CONFIG_INET_XFRM_MODE_TRANSPORT=y
- CONFIG_INET_XFRM_MODE_TUNNEL=y
- CONFIG_INET_XFRM_MODE_BEET=y
-+# CONFIG_INET_LRO is not set
- CONFIG_INET_DIAG=y
- CONFIG_INET_TCP_DIAG=y
- # CONFIG_TCP_CONG_ADVANCED is not set
-@@ -421,10 +423,6 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
- # CONFIG_LAPB is not set
- # CONFIG_ECONET is not set
- # CONFIG_WAN_ROUTER is not set
--
--#
--# QoS and/or fair queueing
--#
- # CONFIG_NET_SCHED is not set
-
- #
-@@ -444,6 +442,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
- # CONFIG_MAC80211 is not set
- # CONFIG_IEEE80211 is not set
- # CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-
- #
- # Device Drivers
-@@ -452,14 +451,11 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
- #
- # Generic Driver Options
- #
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
- CONFIG_STANDALONE=y
- CONFIG_PREVENT_FIRMWARE_BUILD=y
- # CONFIG_FW_LOADER is not set
- # CONFIG_SYS_HYPERVISOR is not set
--
--#
--# Connector - unified userspace <-> kernelspace linker
--#
- # CONFIG_CONNECTOR is not set
- CONFIG_MTD=y
- # CONFIG_MTD_DEBUG is not set
-@@ -479,6 +475,7 @@ CONFIG_MTD_BLOCK=y
- # CONFIG_INFTL is not set
- # CONFIG_RFD_FTL is not set
- # CONFIG_SSFDC is not set
-+# CONFIG_MTD_OOPS is not set
-
- #
- # RAM/ROM/Flash chip drivers
-@@ -542,39 +539,27 @@ CONFIG_MTD_NAND_IDS=m
- # CONFIG_MTD_NAND_DISKONCHIP is not set
- # CONFIG_MTD_NAND_NANDSIM is not set
- # CONFIG_MTD_NAND_PLATFORM is not set
-+# CONFIG_MTD_ALAUDA is not set
- # CONFIG_MTD_ONENAND is not set
-
- #
- # UBI - Unsorted block images
- #
- # CONFIG_MTD_UBI is not set
--
--#
--# Parallel port support
--#
- # CONFIG_PARPORT is not set
--
--#
--# Plug and Play support
--#
--# CONFIG_PNPACPI is not set
--
--#
--# Block devices
--#
-+CONFIG_BLK_DEV=y
- # CONFIG_BLK_DEV_COW_COMMON is not set
- # CONFIG_BLK_DEV_LOOP is not set
- # CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_UB is not set
- CONFIG_BLK_DEV_RAM=y
- CONFIG_BLK_DEV_RAM_COUNT=16
- CONFIG_BLK_DEV_RAM_SIZE=4096
- CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
- # CONFIG_CDROM_PKTCDVD is not set
- # CONFIG_ATA_OVER_ETH is not set
--
--#
--# Misc devices
--#
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_EEPROM_93CX6 is not set
- # CONFIG_IDE is not set
-
- #
-@@ -582,22 +567,18 @@ CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
- #
- # CONFIG_RAID_ATTRS is not set
- # CONFIG_SCSI is not set
-+# CONFIG_SCSI_DMA is not set
- # CONFIG_SCSI_NETLINK is not set
- # CONFIG_ATA is not set
--
--#
--# Multi-device support (RAID and LVM)
--#
- # CONFIG_MD is not set
--
--#
--# Network device support
--#
- CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
- # CONFIG_DUMMY is not set
- # CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
- # CONFIG_EQUALIZER is not set
- # CONFIG_TUN is not set
-+# CONFIG_VETH is not set
- CONFIG_PHYLIB=y
-
- #
-@@ -611,21 +592,24 @@ CONFIG_PHYLIB=y
- # CONFIG_VITESSE_PHY is not set
- # CONFIG_SMSC_PHY is not set
- # CONFIG_BROADCOM_PHY is not set
-+# CONFIG_ICPLUS_PHY is not set
- # CONFIG_FIXED_PHY is not set
--
--#
--# Ethernet (10 or 100Mbit)
--#
-+# CONFIG_MDIO_BITBANG is not set
- CONFIG_NET_ETHERNET=y
- CONFIG_MII=y
--# CONFIG_SMC91X is not set
- CONFIG_BFIN_MAC=y
- CONFIG_BFIN_MAC_USE_L1=y
- CONFIG_BFIN_TX_DESC_NUM=10
- CONFIG_BFIN_RX_DESC_NUM=20
- CONFIG_BFIN_MAC_RMII=y
-+# CONFIG_SMC91X is not set
- # CONFIG_SMSC911X is not set
- # CONFIG_DM9000 is not set
-+# CONFIG_IBM_NEW_EMAC_ZMII is not set
-+# CONFIG_IBM_NEW_EMAC_RGMII is not set
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-+# CONFIG_B44 is not set
- CONFIG_NETDEV_1000=y
- # CONFIG_AX88180 is not set
- CONFIG_NETDEV_10000=y
-@@ -635,6 +619,15 @@ CONFIG_NETDEV_10000=y
- #
- # CONFIG_WLAN_PRE80211 is not set
- # CONFIG_WLAN_80211 is not set
-+
-+#
-+# USB Network Adapters
-+#
-+# CONFIG_USB_CATC is not set
-+# CONFIG_USB_KAWETH is not set
-+# CONFIG_USB_PEGASUS is not set
-+# CONFIG_USB_RTL8150 is not set
-+# CONFIG_USB_USBNET is not set
- # CONFIG_WAN is not set
- # CONFIG_PPP is not set
- # CONFIG_SLIP is not set
-@@ -642,15 +635,7 @@ CONFIG_NETDEV_10000=y
- # CONFIG_NETCONSOLE is not set
- # CONFIG_NETPOLL is not set
- # CONFIG_NET_POLL_CONTROLLER is not set
--
--#
--# ISDN subsystem
--#
- # CONFIG_ISDN is not set
--
--#
--# Telephony Support
--#
- # CONFIG_PHONE is not set
-
- #
-@@ -665,7 +650,6 @@ CONFIG_INPUT=y
- #
- # CONFIG_INPUT_MOUSEDEV is not set
- # CONFIG_INPUT_JOYDEV is not set
--# CONFIG_INPUT_TSDEV is not set
- # CONFIG_INPUT_EVDEV is not set
- # CONFIG_INPUT_EVBUG is not set
-
-@@ -697,7 +681,6 @@ CONFIG_INPUT_MISC=y
- #
- # CONFIG_AD9960 is not set
- # CONFIG_SPI_ADC_BF533 is not set
--# CONFIG_BF5xx_PFLAGS is not set
- # CONFIG_BF5xx_PPIFCD is not set
- # CONFIG_BFIN_SIMPLE_TIMER is not set
- # CONFIG_BF5xx_PPI is not set
-@@ -706,7 +689,7 @@ CONFIG_BFIN_OTP=y
- # CONFIG_BFIN_SPORT is not set
- # CONFIG_BFIN_TIMER_LATENCY is not set
- # CONFIG_TWI_LCD is not set
--# CONFIG_AD5304 is not set
-+# CONFIG_SIMPLE_GPIO is not set
- # CONFIG_VT is not set
- # CONFIG_SERIAL_NONSTANDARD is not set
-
-@@ -735,27 +718,11 @@ CONFIG_UNIX98_PTYS=y
- # CAN, the car bus and industrial fieldbus
- #
- # CONFIG_CAN4LINUX is not set
--
--#
--# IPMI
--#
- # CONFIG_IPMI_HANDLER is not set
--CONFIG_WATCHDOG=y
--# CONFIG_WATCHDOG_NOWAYOUT is not set
--
--#
--# Watchdog Device Drivers
--#
--# CONFIG_SOFT_WATCHDOG is not set
--CONFIG_BFIN_WDT=y
- CONFIG_HW_RANDOM=y
- # CONFIG_GEN_RTC is not set
- # CONFIG_R3964 is not set
- # CONFIG_RAW_DRIVER is not set
--
--#
--# TPM devices
--#
- # CONFIG_TCG_TPM is not set
- CONFIG_I2C=y
- CONFIG_I2C_BOARDINFO=y
-@@ -777,21 +744,24 @@ CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ=50
- # CONFIG_I2C_OCORES is not set
- # CONFIG_I2C_PARPORT_LIGHT is not set
- # CONFIG_I2C_SIMTEC is not set
-+# CONFIG_I2C_TAOS_EVM is not set
- # CONFIG_I2C_STUB is not set
-+# CONFIG_I2C_TINY_USB is not set
-
- #
- # Miscellaneous I2C Chip support
- #
- # CONFIG_SENSORS_DS1337 is not set
- # CONFIG_SENSORS_DS1374 is not set
-+# CONFIG_DS1682 is not set
- # CONFIG_SENSORS_AD5252 is not set
- # CONFIG_SENSORS_EEPROM is not set
- # CONFIG_SENSORS_PCF8574 is not set
- # CONFIG_SENSORS_PCF8575 is not set
--# CONFIG_SENSORS_PCA9543 is not set
- # CONFIG_SENSORS_PCA9539 is not set
- # CONFIG_SENSORS_PCF8591 is not set
- # CONFIG_SENSORS_MAX6875 is not set
-+# CONFIG_SENSORS_TSL2550 is not set
- # CONFIG_I2C_DEBUG_CORE is not set
- # CONFIG_I2C_DEBUG_ALGO is not set
- # CONFIG_I2C_DEBUG_BUS is not set
-@@ -814,14 +784,11 @@ CONFIG_SPI_BFIN=y
- #
- # CONFIG_SPI_AT25 is not set
- # CONFIG_SPI_SPIDEV is not set
--
--#
--# Dallas's 1-wire bus
--#
-+# CONFIG_SPI_TLE62X0 is not set
- # CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
- CONFIG_HWMON=y
- # CONFIG_HWMON_VID is not set
--# CONFIG_SENSORS_ABITUGURU is not set
- # CONFIG_SENSORS_AD7418 is not set
- # CONFIG_SENSORS_ADM1021 is not set
- # CONFIG_SENSORS_ADM1025 is not set
-@@ -829,12 +796,12 @@ CONFIG_HWMON=y
- # CONFIG_SENSORS_ADM1029 is not set
- # CONFIG_SENSORS_ADM1031 is not set
- # CONFIG_SENSORS_ADM9240 is not set
--# CONFIG_SENSORS_ASB100 is not set
-+# CONFIG_SENSORS_ADT7470 is not set
- # CONFIG_SENSORS_ATXP1 is not set
- # CONFIG_SENSORS_DS1621 is not set
- # CONFIG_SENSORS_F71805F is not set
--# CONFIG_SENSORS_FSCHER is not set
--# CONFIG_SENSORS_FSCPOS is not set
-+# CONFIG_SENSORS_F71882FG is not set
-+# CONFIG_SENSORS_F75375S is not set
- # CONFIG_SENSORS_GL518SM is not set
- # CONFIG_SENSORS_GL520SM is not set
- # CONFIG_SENSORS_IT87 is not set
-@@ -849,13 +816,16 @@ CONFIG_HWMON=y
- # CONFIG_SENSORS_LM87 is not set
- # CONFIG_SENSORS_LM90 is not set
- # CONFIG_SENSORS_LM92 is not set
-+# CONFIG_SENSORS_LM93 is not set
- # CONFIG_SENSORS_MAX1619 is not set
- # CONFIG_SENSORS_MAX6650 is not set
- # CONFIG_SENSORS_PC87360 is not set
- # CONFIG_SENSORS_PC87427 is not set
-+# CONFIG_SENSORS_DME1737 is not set
- # CONFIG_SENSORS_SMSC47M1 is not set
- # CONFIG_SENSORS_SMSC47M192 is not set
- # CONFIG_SENSORS_SMSC47B397 is not set
-+# CONFIG_SENSORS_THMC50 is not set
- # CONFIG_SENSORS_VT1211 is not set
- # CONFIG_SENSORS_W83781D is not set
- # CONFIG_SENSORS_W83791D is not set
-@@ -865,6 +835,25 @@ CONFIG_HWMON=y
- # CONFIG_SENSORS_W83627HF is not set
- # CONFIG_SENSORS_W83627EHF is not set
- # CONFIG_HWMON_DEBUG_CHIP is not set
-+CONFIG_WATCHDOG=y
-+# CONFIG_WATCHDOG_NOWAYOUT is not set
-+
-+#
-+# Watchdog Device Drivers
-+#
-+# CONFIG_SOFT_WATCHDOG is not set
-+CONFIG_BFIN_WDT=y
-+
-+#
-+# USB-based Watchdog Cards
-+#
-+# CONFIG_USBPCWATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-
- #
- # Multifunction device drivers
-@@ -881,72 +870,133 @@ CONFIG_HWMON=y
- #
- # Graphics support
- #
-+# CONFIG_VGASTATE is not set
-+# CONFIG_VIDEO_OUTPUT_CONTROL is not set
-+# CONFIG_FB is not set
- # CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-
- #
- # Display device support
- #
- # CONFIG_DISPLAY_SUPPORT is not set
--# CONFIG_VGASTATE is not set
--# CONFIG_FB is not set
-
- #
- # Sound
- #
- # CONFIG_SOUND is not set
--
--#
--# HID Devices
--#
-+CONFIG_HID_SUPPORT=y
- CONFIG_HID=y
- # CONFIG_HID_DEBUG is not set
-+# CONFIG_HIDRAW is not set
-
- #
--# USB support
-+# USB Input Devices
- #
-+CONFIG_USB_HID=y
-+# CONFIG_USB_HIDINPUT_POWERBOOK is not set
-+# CONFIG_HID_FF is not set
-+# CONFIG_USB_HIDDEV is not set
-+CONFIG_USB_SUPPORT=y
- CONFIG_USB_ARCH_HAS_HCD=y
- # CONFIG_USB_ARCH_HAS_OHCI is not set
- # CONFIG_USB_ARCH_HAS_EHCI is not set
--# CONFIG_USB is not set
-+CONFIG_USB=y
-+# CONFIG_USB_DEBUG is not set
-+
-+#
-+# Miscellaneous USB options
-+#
-+# CONFIG_USB_DEVICEFS is not set
-+CONFIG_USB_DEVICE_CLASS=y
-+# CONFIG_USB_DYNAMIC_MINORS is not set
-+# CONFIG_USB_OTG is not set
-+# CONFIG_USB_OTG_WHITELIST is not set
-+CONFIG_USB_OTG_BLACKLIST_HUB=y
-+
-+#
-+# USB Host Controller Drivers
-+#
-+# CONFIG_USB_ISP116X_HCD is not set
-+# CONFIG_USB_ISP1362_HCD is not set
-+# CONFIG_USB_ISP1760_HCD is not set
-+# CONFIG_USB_SL811_HCD is not set
-+# CONFIG_USB_R8A66597_HCD is not set
-+CONFIG_USB_MUSB_HDRC=y
-+CONFIG_USB_MUSB_SOC=y
-
- #
--# Enable Host or Gadget support to see Inventra options
-+# Blackfin high speed USB support
- #
-+CONFIG_USB_MUSB_HOST=y
-+# CONFIG_USB_MUSB_PERIPHERAL is not set
-+# CONFIG_USB_MUSB_OTG is not set
-+CONFIG_USB_MUSB_HDRC_HCD=y
-+CONFIG_MUSB_PIO_ONLY=y
-+CONFIG_USB_MUSB_LOGLEVEL=0
-+
-+#
-+# USB Device Class drivers
-+#
-+# CONFIG_USB_ACM is not set
-+# CONFIG_USB_PRINTER is not set
-
- #
- # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
- #
-
- #
--# USB Gadget Support
-+# may also be needed; see USB_STORAGE Help for more information
- #
--# CONFIG_USB_GADGET is not set
--# CONFIG_MMC is not set
-+# CONFIG_USB_LIBUSUAL is not set
-
- #
--# LED devices
-+# USB Imaging devices
- #
--# CONFIG_NEW_LEDS is not set
-+# CONFIG_USB_MDC800 is not set
-+CONFIG_USB_MON=y
-
- #
--# LED drivers
-+# USB port drivers
- #
-
- #
--# LED Triggers
-+# USB Serial Converter support
- #
-+# CONFIG_USB_SERIAL is not set
-
- #
--# InfiniBand support
-+# USB Miscellaneous drivers
- #
-+# CONFIG_USB_EMI62 is not set
-+# CONFIG_USB_EMI26 is not set
-+# CONFIG_USB_ADUTUX is not set
-+# CONFIG_USB_AUERSWALD is not set
-+# CONFIG_USB_RIO500 is not set
-+# CONFIG_USB_LEGOTOWER is not set
-+# CONFIG_USB_LCD is not set
-+# CONFIG_USB_BERRY_CHARGE is not set
-+# CONFIG_USB_LED is not set
-+# CONFIG_USB_CYPRESS_CY7C63 is not set
-+# CONFIG_USB_CYTHERM is not set
-+# CONFIG_USB_PHIDGET is not set
-+# CONFIG_USB_IDMOUSE is not set
-+# CONFIG_USB_FTDI_ELAN is not set
-+# CONFIG_USB_APPLEDISPLAY is not set
-+# CONFIG_USB_SISUSBVGA is not set
-+# CONFIG_USB_LD is not set
-+# CONFIG_USB_TRANCEVIBRATOR is not set
-+# CONFIG_USB_IOWARRIOR is not set
-
- #
--# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
-+# USB DSL modem support
- #
-
- #
--# Real Time Clock
-+# USB Gadget Support
- #
-+# CONFIG_USB_GADGET is not set
-+# CONFIG_MMC is not set
-+# CONFIG_NEW_LEDS is not set
- CONFIG_RTC_LIB=y
- CONFIG_RTC_CLASS=y
- CONFIG_RTC_HCTOSYS=y
-@@ -966,6 +1016,7 @@ CONFIG_RTC_INTF_DEV=y
- # I2C RTC drivers
- #
- # CONFIG_RTC_DRV_DS1307 is not set
-+# CONFIG_RTC_DRV_DS1374 is not set
- # CONFIG_RTC_DRV_DS1672 is not set
- # CONFIG_RTC_DRV_MAX6900 is not set
- # CONFIG_RTC_DRV_RS5C372 is not set
-@@ -973,6 +1024,7 @@ CONFIG_RTC_INTF_DEV=y
- # CONFIG_RTC_DRV_X1205 is not set
- # CONFIG_RTC_DRV_PCF8563 is not set
- # CONFIG_RTC_DRV_PCF8583 is not set
-+# CONFIG_RTC_DRV_M41T80 is not set
-
- #
- # SPI RTC drivers
-@@ -984,8 +1036,10 @@ CONFIG_RTC_INTF_DEV=y
- # Platform RTC drivers
- #
- # CONFIG_RTC_DRV_DS1553 is not set
-+# CONFIG_RTC_DRV_STK17TA8 is not set
- # CONFIG_RTC_DRV_DS1742 is not set
- # CONFIG_RTC_DRV_M48T86 is not set
-+# CONFIG_RTC_DRV_M48T59 is not set
- # CONFIG_RTC_DRV_V3020 is not set
-
- #
-@@ -994,22 +1048,9 @@ CONFIG_RTC_INTF_DEV=y
- CONFIG_RTC_DRV_BFIN=y
-
- #
--# DMA Engine support
--#
--# CONFIG_DMA_ENGINE is not set
--
--#
--# DMA Clients
-+# Userspace I/O
- #
--
--#
--# DMA Devices
--#
--
--#
--# PBX support
--#
--# CONFIG_PBX is not set
-+# CONFIG_UIO is not set
-
- #
- # File systems
-@@ -1054,7 +1095,6 @@ CONFIG_PROC_SYSCTL=y
- CONFIG_SYSFS=y
- # CONFIG_TMPFS is not set
- # CONFIG_HUGETLB_PAGE is not set
--CONFIG_RAMFS=y
- # CONFIG_CONFIGFS_FS is not set
-
- #
-@@ -1080,10 +1120,12 @@ CONFIG_YAFFS_SHORT_NAMES_IN_RAM=y
- CONFIG_JFFS2_FS=m
- CONFIG_JFFS2_FS_DEBUG=0
- CONFIG_JFFS2_FS_WRITEBUFFER=y
-+# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
- # CONFIG_JFFS2_SUMMARY is not set
- # CONFIG_JFFS2_FS_XATTR is not set
- # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
- CONFIG_JFFS2_ZLIB=y
-+# CONFIG_JFFS2_LZO is not set
- CONFIG_JFFS2_RTIME=y
- # CONFIG_JFFS2_RUBIN is not set
- # CONFIG_CRAMFS is not set
-@@ -1092,10 +1134,7 @@ CONFIG_JFFS2_RTIME=y
- # CONFIG_QNX4FS_FS is not set
- # CONFIG_SYSV_FS is not set
- # CONFIG_UFS_FS is not set
--
--#
--# Network File Systems
--#
-+CONFIG_NETWORK_FILESYSTEMS=y
- CONFIG_NFS_FS=m
- CONFIG_NFS_V3=y
- # CONFIG_NFS_V3_ACL is not set
-@@ -1115,17 +1154,12 @@ CONFIG_SMB_FS=m
- # CONFIG_NCP_FS is not set
- # CONFIG_CODA_FS is not set
- # CONFIG_AFS_FS is not set
--# CONFIG_9P_FS is not set
-
- #
- # Partition Types
- #
- # CONFIG_PARTITION_ADVANCED is not set
- CONFIG_MSDOS_PARTITION=y
--
--#
--# Native Language Support
--#
- CONFIG_NLS=m
- CONFIG_NLS_DEFAULT="iso8859-1"
- # CONFIG_NLS_CODEPAGE_437 is not set
-@@ -1166,21 +1200,16 @@ CONFIG_NLS_DEFAULT="iso8859-1"
- # CONFIG_NLS_KOI8_R is not set
- # CONFIG_NLS_KOI8_U is not set
- # CONFIG_NLS_UTF8 is not set
--
--#
--# Distributed Lock Manager
--#
- # CONFIG_DLM is not set
--
--#
--# Profiling support
--#
-+CONFIG_INSTRUMENTATION=y
- # CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-
- #
- # Kernel hacking
- #
- # CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
- CONFIG_ENABLE_MUST_CHECK=y
- # CONFIG_MAGIC_SYSRQ is not set
- # CONFIG_UNUSED_SYMBOLS is not set
-@@ -1188,6 +1217,7 @@ CONFIG_DEBUG_FS=y
- # CONFIG_HEADERS_CHECK is not set
- # CONFIG_DEBUG_KERNEL is not set
- # CONFIG_DEBUG_BUGVERBOSE is not set
-+# CONFIG_SAMPLES is not set
- CONFIG_DEBUG_MMRS=y
- CONFIG_DEBUG_HUNT_FOR_ZERO=y
- CONFIG_DEBUG_BFIN_HWTRACE_ON=y
-@@ -1207,11 +1237,8 @@ CONFIG_ACCESS_CHECK=y
- # CONFIG_KEYS is not set
- CONFIG_SECURITY=y
- # CONFIG_SECURITY_NETWORK is not set
--CONFIG_SECURITY_CAPABILITIES=m
--
--#
--# Cryptographic options
--#
-+# CONFIG_SECURITY_CAPABILITIES is not set
-+# CONFIG_SECURITY_ROOTPLUG is not set
- # CONFIG_CRYPTO is not set
-
- #
-@@ -1222,6 +1249,7 @@ CONFIG_CRC_CCITT=m
- # CONFIG_CRC16 is not set
- # CONFIG_CRC_ITU_T is not set
- CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
- # CONFIG_LIBCRC32C is not set
- CONFIG_ZLIB_INFLATE=y
- CONFIG_ZLIB_DEFLATE=m
-diff --git a/arch/blackfin/configs/BF548-EZKIT_defconfig b/arch/blackfin/configs/BF548-EZKIT_defconfig
-index 5bfdfb2..1ff2ff4 100644
---- a/arch/blackfin/configs/BF548-EZKIT_defconfig
-+++ b/arch/blackfin/configs/BF548-EZKIT_defconfig
-@@ -1,6 +1,6 @@
- #
- # Automatically generated make config: don't edit
--# Linux kernel version: 2.6.22.16
-+# Linux kernel version: 2.6.24.7
- #
- # CONFIG_MMU is not set
- # CONFIG_FPU is not set
-@@ -13,35 +13,34 @@ CONFIG_GENERIC_FIND_NEXT_BIT=y
- CONFIG_GENERIC_HWEIGHT=y
- CONFIG_GENERIC_HARDIRQS=y
- CONFIG_GENERIC_IRQ_PROBE=y
--CONFIG_GENERIC_TIME=y
- CONFIG_GENERIC_GPIO=y
- CONFIG_FORCE_MAX_ZONEORDER=14
- CONFIG_GENERIC_CALIBRATE_DELAY=y
- CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-
- #
--# Code maturity level options
-+# General setup
- #
- CONFIG_EXPERIMENTAL=y
- CONFIG_BROKEN_ON_SMP=y
- CONFIG_INIT_ENV_ARG_LIMIT=32
--
--#
--# General setup
--#
- CONFIG_LOCALVERSION=""
- CONFIG_LOCALVERSION_AUTO=y
- CONFIG_SYSVIPC=y
--# CONFIG_IPC_NS is not set
- CONFIG_SYSVIPC_SYSCTL=y
- # CONFIG_POSIX_MQUEUE is not set
- # CONFIG_BSD_PROCESS_ACCT is not set
- # CONFIG_TASKSTATS is not set
--# CONFIG_UTS_NS is not set
-+# CONFIG_USER_NS is not set
-+# CONFIG_PID_NS is not set
- # CONFIG_AUDIT is not set
- CONFIG_IKCONFIG=y
- CONFIG_IKCONFIG_PROC=y
- CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_FAIR_GROUP_SCHED=y
-+CONFIG_FAIR_USER_SCHED=y
-+# CONFIG_FAIR_CGROUP_SCHED is not set
- CONFIG_SYSFS_DEPRECATED=y
- # CONFIG_RELAY is not set
- CONFIG_BLK_DEV_INITRD=y
-@@ -64,32 +63,24 @@ CONFIG_EPOLL=y
- CONFIG_SIGNALFD=y
- CONFIG_EVENTFD=y
- CONFIG_VM_EVENT_COUNTERS=y
--CONFIG_BIG_ORDER_ALLOC_NOFAIL_MAGIC=3
--# CONFIG_NP2 is not set
- CONFIG_SLAB=y
- # CONFIG_SLUB is not set
- # CONFIG_SLOB is not set
-+CONFIG_SLABINFO=y
- CONFIG_RT_MUTEXES=y
- CONFIG_TINY_SHMEM=y
- CONFIG_BASE_SMALL=0
--
--#
--# Loadable module support
--#
- CONFIG_MODULES=y
- CONFIG_MODULE_UNLOAD=y
- # CONFIG_MODULE_FORCE_UNLOAD is not set
- # CONFIG_MODVERSIONS is not set
- # CONFIG_MODULE_SRCVERSION_ALL is not set
- CONFIG_KMOD=y
--
--#
--# Block layer
--#
- CONFIG_BLOCK=y
- # CONFIG_LBD is not set
- # CONFIG_BLK_DEV_IO_TRACE is not set
- # CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-
- #
- # IO Schedulers
-@@ -141,7 +132,6 @@ CONFIG_BF_REV_0_0=y
- # CONFIG_BF_REV_ANY is not set
- # CONFIG_BF_REV_NONE is not set
- CONFIG_BF54x=y
--CONFIG_BFIN_SINGLE_CORE=y
- CONFIG_IRQ_PLL_WAKEUP=7
- CONFIG_IRQ_RTC=8
- CONFIG_IRQ_SPORT0_RX=9
-@@ -169,6 +159,7 @@ CONFIG_IRQ_TIMER8=11
- CONFIG_IRQ_TIMER9=11
- CONFIG_IRQ_TIMER10=11
- CONFIG_BFIN548_EZKIT=y
-+# CONFIG_BFIN548_BLUETECHNIX_CM is not set
-
- #
- # BF548 Specific Configuration
-@@ -262,12 +253,14 @@ CONFIG_PINT3_ASSIGN=0x02020303
- # Board customizations
- #
- # CONFIG_CMDLINE_BOOL is not set
-+CONFIG_BOOT_LOAD=0x1000
-
- #
- # Clock/PLL Setup
- #
- CONFIG_CLKIN_HZ=25000000
- # CONFIG_BFIN_KERNEL_CLOCK is not set
-+CONFIG_MAX_MEM_SIZE=512
- CONFIG_MAX_VCO_HZ=600000000
- CONFIG_MIN_VCO_HZ=50000000
- CONFIG_MAX_SCLK_HZ=133333333
-@@ -281,14 +274,17 @@ CONFIG_HZ_250=y
- # CONFIG_HZ_300 is not set
- # CONFIG_HZ_1000 is not set
- CONFIG_HZ=250
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+# CONFIG_CYCLES_CLOCKSOURCE is not set
-+# CONFIG_TICK_ONESHOT is not set
-+# CONFIG_NO_HZ is not set
-+# CONFIG_HIGH_RES_TIMERS is not set
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-
- #
--# Memory Setup
-+# Misc
- #
--CONFIG_MAX_MEM_SIZE=512
--# CONFIG_MEM_MT46V32M16_6T is not set
--CONFIG_MEM_MT46V32M16_5B=y
--CONFIG_BOOT_LOAD=0x1000
- CONFIG_BFIN_SCRATCH_REG_RETN=y
- # CONFIG_BFIN_SCRATCH_REG_RETE is not set
- # CONFIG_BFIN_SCRATCH_REG_CYCLES is not set
-@@ -324,12 +320,14 @@ CONFIG_FLATMEM_MANUAL=y
- CONFIG_FLATMEM=y
- CONFIG_FLAT_NODE_MEM_MAP=y
- # CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
- CONFIG_SPLIT_PTLOCK_CPUS=4
- # CONFIG_RESOURCES_64BIT is not set
- CONFIG_ZONE_DMA_FLAG=1
--CONFIG_LARGE_ALLOCS=y
-+CONFIG_VIRT_TO_BUS=y
- # CONFIG_BFIN_GPTIMERS is not set
- CONFIG_BFIN_DMA_5XX=y
-+# CONFIG_DMA_UNCACHED_4M is not set
- CONFIG_DMA_UNCACHED_2M=y
- # CONFIG_DMA_UNCACHED_1M is not set
- # CONFIG_DMA_UNCACHED_NONE is not set
-@@ -377,10 +375,6 @@ CONFIG_EBIU_FCTLVAL=0x6
- #
- # CONFIG_PCI is not set
- # CONFIG_ARCH_SUPPORTS_MSI is not set
--
--#
--# PCCARD (PCMCIA/CardBus) support
--#
- # CONFIG_PCCARD is not set
-
- #
-@@ -396,6 +390,7 @@ CONFIG_BINFMT_ZFLAT=y
- # Power management options
- #
- # CONFIG_PM is not set
-+CONFIG_SUSPEND_UP_POSSIBLE=y
- # CONFIG_PM_WAKEUP_BY_GPIO is not set
-
- #
-@@ -439,6 +434,7 @@ CONFIG_SYN_COOKIES=y
- CONFIG_INET_XFRM_MODE_TRANSPORT=y
- CONFIG_INET_XFRM_MODE_TUNNEL=y
- CONFIG_INET_XFRM_MODE_BEET=y
-+# CONFIG_INET_LRO is not set
- CONFIG_INET_DIAG=y
- CONFIG_INET_TCP_DIAG=y
- # CONFIG_TCP_CONG_ADVANCED is not set
-@@ -465,10 +461,6 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
- # CONFIG_LAPB is not set
- # CONFIG_ECONET is not set
- # CONFIG_WAN_ROUTER is not set
--
--#
--# QoS and/or fair queueing
--#
- # CONFIG_NET_SCHED is not set
-
- #
-@@ -488,6 +480,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
- # CONFIG_MAC80211 is not set
- # CONFIG_IEEE80211 is not set
- # CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-
- #
- # Device Drivers
-@@ -496,14 +489,11 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
- #
- # Generic Driver Options
- #
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
- CONFIG_STANDALONE=y
- CONFIG_PREVENT_FIRMWARE_BUILD=y
- # CONFIG_FW_LOADER is not set
- # CONFIG_SYS_HYPERVISOR is not set
--
--#
--# Connector - unified userspace <-> kernelspace linker
--#
- # CONFIG_CONNECTOR is not set
- CONFIG_MTD=y
- # CONFIG_MTD_DEBUG is not set
-@@ -523,6 +513,7 @@ CONFIG_MTD_BLOCK=y
- # CONFIG_INFTL is not set
- # CONFIG_RFD_FTL is not set
- # CONFIG_SSFDC is not set
-+# CONFIG_MTD_OOPS is not set
-
- #
- # RAM/ROM/Flash chip drivers
-@@ -587,39 +578,27 @@ CONFIG_MTD_NAND_BF5XX_HWECC=y
- # CONFIG_MTD_NAND_DISKONCHIP is not set
- # CONFIG_MTD_NAND_NANDSIM is not set
- # CONFIG_MTD_NAND_PLATFORM is not set
-+# CONFIG_MTD_ALAUDA is not set
- # CONFIG_MTD_ONENAND is not set
-
- #
- # UBI - Unsorted block images
- #
- # CONFIG_MTD_UBI is not set
--
--#
--# Parallel port support
--#
- # CONFIG_PARPORT is not set
--
--#
--# Plug and Play support
--#
--# CONFIG_PNPACPI is not set
--
--#
--# Block devices
--#
-+CONFIG_BLK_DEV=y
- # CONFIG_BLK_DEV_COW_COMMON is not set
- # CONFIG_BLK_DEV_LOOP is not set
- # CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_UB is not set
- CONFIG_BLK_DEV_RAM=y
- CONFIG_BLK_DEV_RAM_COUNT=16
- CONFIG_BLK_DEV_RAM_SIZE=4096
- CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
- # CONFIG_CDROM_PKTCDVD is not set
- # CONFIG_ATA_OVER_ETH is not set
--
--#
--# Misc devices
--#
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_EEPROM_93CX6 is not set
- # CONFIG_IDE is not set
-
- #
-@@ -627,6 +606,7 @@ CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
- #
- # CONFIG_RAID_ATTRS is not set
- CONFIG_SCSI=y
-+CONFIG_SCSI_DMA=y
- # CONFIG_SCSI_TGT is not set
- # CONFIG_SCSI_NETLINK is not set
- CONFIG_SCSI_PROC_FS=y
-@@ -657,43 +637,35 @@ CONFIG_SCSI_WAIT_SCAN=m
- # CONFIG_SCSI_SPI_ATTRS is not set
- # CONFIG_SCSI_FC_ATTRS is not set
- # CONFIG_SCSI_ISCSI_ATTRS is not set
--# CONFIG_SCSI_SAS_ATTRS is not set
- # CONFIG_SCSI_SAS_LIBSAS is not set
--
--#
--# SCSI low-level drivers
--#
-+# CONFIG_SCSI_SRP_ATTRS is not set
-+CONFIG_SCSI_LOWLEVEL=y
- # CONFIG_ISCSI_TCP is not set
- # CONFIG_SCSI_DEBUG is not set
- CONFIG_ATA=y
- # CONFIG_ATA_NONSTANDARD is not set
- # CONFIG_PATA_PLATFORM is not set
- CONFIG_PATA_BF54X=y
--CONFIG_PATA_BF54X_DMA=y
--
--#
--# Multi-device support (RAID and LVM)
--#
- # CONFIG_MD is not set
--
--#
--# Network device support
--#
- CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
- # CONFIG_DUMMY is not set
- # CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
- # CONFIG_EQUALIZER is not set
- # CONFIG_TUN is not set
-+# CONFIG_VETH is not set
- # CONFIG_PHYLIB is not set
--
--#
--# Ethernet (10 or 100Mbit)
--#
- CONFIG_NET_ETHERNET=y
- CONFIG_MII=y
- # CONFIG_SMC91X is not set
- CONFIG_SMSC911X=y
- # CONFIG_DM9000 is not set
-+# CONFIG_IBM_NEW_EMAC_ZMII is not set
-+# CONFIG_IBM_NEW_EMAC_RGMII is not set
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-+# CONFIG_B44 is not set
- CONFIG_NETDEV_1000=y
- # CONFIG_AX88180 is not set
- CONFIG_NETDEV_10000=y
-@@ -703,6 +675,15 @@ CONFIG_NETDEV_10000=y
- #
- # CONFIG_WLAN_PRE80211 is not set
- # CONFIG_WLAN_80211 is not set
-+
-+#
-+# USB Network Adapters
-+#
-+# CONFIG_USB_CATC is not set
-+# CONFIG_USB_KAWETH is not set
-+# CONFIG_USB_PEGASUS is not set
-+# CONFIG_USB_RTL8150 is not set
-+# CONFIG_USB_USBNET is not set
- # CONFIG_WAN is not set
- # CONFIG_PPP is not set
- # CONFIG_SLIP is not set
-@@ -710,15 +691,7 @@ CONFIG_NETDEV_10000=y
- # CONFIG_NETCONSOLE is not set
- # CONFIG_NETPOLL is not set
- # CONFIG_NET_POLL_CONTROLLER is not set
--
--#
--# ISDN subsystem
--#
- # CONFIG_ISDN is not set
--
--#
--# Telephony Support
--#
- # CONFIG_PHONE is not set
-
- #
-@@ -733,9 +706,6 @@ CONFIG_INPUT=y
- #
- # CONFIG_INPUT_MOUSEDEV is not set
- # CONFIG_INPUT_JOYDEV is not set
--CONFIG_INPUT_TSDEV=m
--CONFIG_INPUT_TSDEV_SCREEN_X=240
--CONFIG_INPUT_TSDEV_SCREEN_Y=320
- CONFIG_INPUT_EVDEV=m
- CONFIG_INPUT_EVBUG=m
-
-@@ -758,6 +728,7 @@ CONFIG_KEYBOARD_BFIN=y
- CONFIG_INPUT_TOUCHSCREEN=y
- # CONFIG_TOUCHSCREEN_ADS7846 is not set
- CONFIG_TOUCHSCREEN_AD7877=m
-+# CONFIG_TOUCHSCREEN_FUJITSU is not set
- # CONFIG_TOUCHSCREEN_GUNZE is not set
- # CONFIG_TOUCHSCREEN_ELO is not set
- # CONFIG_TOUCHSCREEN_MTOUCH is not set
-@@ -787,7 +758,6 @@ CONFIG_INPUT_MISC=y
- #
- # CONFIG_AD9960 is not set
- # CONFIG_SPI_ADC_BF533 is not set
--# CONFIG_BF5xx_PFLAGS is not set
- # CONFIG_BF5xx_PPIFCD is not set
- # CONFIG_BFIN_SIMPLE_TIMER is not set
- # CONFIG_BF5xx_PPI is not set
-@@ -796,7 +766,7 @@ CONFIG_BFIN_OTP=y
- # CONFIG_BFIN_SPORT is not set
- # CONFIG_BFIN_TIMER_LATENCY is not set
- # CONFIG_TWI_LCD is not set
--# CONFIG_AD5304 is not set
-+# CONFIG_SIMPLE_GPIO is not set
- CONFIG_VT=y
- CONFIG_VT_CONSOLE=y
- CONFIG_HW_CONSOLE=y
-@@ -830,27 +800,11 @@ CONFIG_UNIX98_PTYS=y
- # CAN, the car bus and industrial fieldbus
- #
- # CONFIG_CAN4LINUX is not set
--
--#
--# IPMI
--#
- # CONFIG_IPMI_HANDLER is not set
--CONFIG_WATCHDOG=y
--# CONFIG_WATCHDOG_NOWAYOUT is not set
--
--#
--# Watchdog Device Drivers
--#
--# CONFIG_SOFT_WATCHDOG is not set
--CONFIG_BFIN_WDT=y
- CONFIG_HW_RANDOM=y
- # CONFIG_GEN_RTC is not set
- # CONFIG_R3964 is not set
- # CONFIG_RAW_DRIVER is not set
--
--#
--# TPM devices
--#
- # CONFIG_TCG_TPM is not set
- CONFIG_I2C=y
- CONFIG_I2C_BOARDINFO=y
-@@ -872,21 +826,24 @@ CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ=50
- # CONFIG_I2C_OCORES is not set
- # CONFIG_I2C_PARPORT_LIGHT is not set
- # CONFIG_I2C_SIMTEC is not set
-+# CONFIG_I2C_TAOS_EVM is not set
- # CONFIG_I2C_STUB is not set
-+# CONFIG_I2C_TINY_USB is not set
-
- #
- # Miscellaneous I2C Chip support
- #
- # CONFIG_SENSORS_DS1337 is not set
- # CONFIG_SENSORS_DS1374 is not set
-+# CONFIG_DS1682 is not set
- # CONFIG_SENSORS_AD5252 is not set
- # CONFIG_SENSORS_EEPROM is not set
- # CONFIG_SENSORS_PCF8574 is not set
- # CONFIG_SENSORS_PCF8575 is not set
--# CONFIG_SENSORS_PCA9543 is not set
- # CONFIG_SENSORS_PCA9539 is not set
- # CONFIG_SENSORS_PCF8591 is not set
- # CONFIG_SENSORS_MAX6875 is not set
-+# CONFIG_SENSORS_TSL2550 is not set
- # CONFIG_I2C_DEBUG_CORE is not set
- # CONFIG_I2C_DEBUG_ALGO is not set
- # CONFIG_I2C_DEBUG_BUS is not set
-@@ -909,14 +866,11 @@ CONFIG_SPI_BFIN=y
- #
- # CONFIG_SPI_AT25 is not set
- # CONFIG_SPI_SPIDEV is not set
--
--#
--# Dallas's 1-wire bus
--#
-+# CONFIG_SPI_TLE62X0 is not set
- # CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
- CONFIG_HWMON=y
- # CONFIG_HWMON_VID is not set
--# CONFIG_SENSORS_ABITUGURU is not set
- # CONFIG_SENSORS_AD7418 is not set
- # CONFIG_SENSORS_ADM1021 is not set
- # CONFIG_SENSORS_ADM1025 is not set
-@@ -924,12 +878,12 @@ CONFIG_HWMON=y
- # CONFIG_SENSORS_ADM1029 is not set
- # CONFIG_SENSORS_ADM1031 is not set
- # CONFIG_SENSORS_ADM9240 is not set
--# CONFIG_SENSORS_ASB100 is not set
-+# CONFIG_SENSORS_ADT7470 is not set
- # CONFIG_SENSORS_ATXP1 is not set
- # CONFIG_SENSORS_DS1621 is not set
- # CONFIG_SENSORS_F71805F is not set
--# CONFIG_SENSORS_FSCHER is not set
--# CONFIG_SENSORS_FSCPOS is not set
-+# CONFIG_SENSORS_F71882FG is not set
-+# CONFIG_SENSORS_F75375S is not set
- # CONFIG_SENSORS_GL518SM is not set
- # CONFIG_SENSORS_GL520SM is not set
- # CONFIG_SENSORS_IT87 is not set
-@@ -944,13 +898,16 @@ CONFIG_HWMON=y
- # CONFIG_SENSORS_LM87 is not set
- # CONFIG_SENSORS_LM90 is not set
- # CONFIG_SENSORS_LM92 is not set
-+# CONFIG_SENSORS_LM93 is not set
- # CONFIG_SENSORS_MAX1619 is not set
- # CONFIG_SENSORS_MAX6650 is not set
- # CONFIG_SENSORS_PC87360 is not set
- # CONFIG_SENSORS_PC87427 is not set
-+# CONFIG_SENSORS_DME1737 is not set
- # CONFIG_SENSORS_SMSC47M1 is not set
- # CONFIG_SENSORS_SMSC47M192 is not set
- # CONFIG_SENSORS_SMSC47B397 is not set
-+# CONFIG_SENSORS_THMC50 is not set
- # CONFIG_SENSORS_VT1211 is not set
- # CONFIG_SENSORS_W83781D is not set
- # CONFIG_SENSORS_W83791D is not set
-@@ -960,6 +917,25 @@ CONFIG_HWMON=y
- # CONFIG_SENSORS_W83627HF is not set
- # CONFIG_SENSORS_W83627EHF is not set
- # CONFIG_HWMON_DEBUG_CHIP is not set
-+CONFIG_WATCHDOG=y
-+# CONFIG_WATCHDOG_NOWAYOUT is not set
-+
-+#
-+# Watchdog Device Drivers
-+#
-+# CONFIG_SOFT_WATCHDOG is not set
-+CONFIG_BFIN_WDT=y
-+
-+#
-+# USB-based Watchdog Cards
-+#
-+# CONFIG_USBPCWATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-
- #
- # Multifunction device drivers
-@@ -972,23 +948,20 @@ CONFIG_HWMON=y
- # CONFIG_VIDEO_DEV is not set
- # CONFIG_DVB_CORE is not set
- CONFIG_DAB=y
-+# CONFIG_USB_DABUSB is not set
-
- #
- # Graphics support
- #
--# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
--
--#
--# Display device support
--#
--# CONFIG_DISPLAY_SUPPORT is not set
- # CONFIG_VGASTATE is not set
-+# CONFIG_VIDEO_OUTPUT_CONTROL is not set
- CONFIG_FB=y
- CONFIG_FIRMWARE_EDID=y
- # CONFIG_FB_DDC is not set
- CONFIG_FB_CFB_FILLRECT=y
- CONFIG_FB_CFB_COPYAREA=y
- CONFIG_FB_CFB_IMAGEBLIT=y
-+# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
- # CONFIG_FB_SYS_FILLRECT is not set
- # CONFIG_FB_SYS_COPYAREA is not set
- # CONFIG_FB_SYS_IMAGEBLIT is not set
-@@ -1003,18 +976,24 @@ CONFIG_FB_DEFERRED_IO=y
- #
- # Frame buffer hardware drivers
- #
--# CONFIG_FB_BFIN_7171 is not set
--# CONFIG_FB_BFIN_7393 is not set
- CONFIG_FB_BF54X_LQ043=y
- # CONFIG_FB_BFIN_T350MCQB is not set
-+# CONFIG_FB_BFIN_7393 is not set
- # CONFIG_FB_S1D13XXX is not set
- # CONFIG_FB_VIRTUAL is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-
- #
- # Console display driver support
- #
- CONFIG_DUMMY_CONSOLE=y
- CONFIG_FRAMEBUFFER_CONSOLE=y
-+# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set
- # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
- CONFIG_FONTS=y
- # CONFIG_FONT_8x8 is not set
-@@ -1065,10 +1044,21 @@ CONFIG_SND_VERBOSE_PROCFS=y
- # CONFIG_SND_MPU401 is not set
-
- #
-+# SPI devices
-+#
-+
-+#
- # ALSA Blackfin devices
- #
- # CONFIG_SND_BLACKFIN_AD1836 is not set
- # CONFIG_SND_BFIN_AD73311 is not set
-+# CONFIG_SND_BFIN_AD73322 is not set
-+
-+#
-+# USB devices
-+#
-+# CONFIG_SND_USB_AUDIO is not set
-+# CONFIG_SND_USB_CAIAQ is not set
-
- #
- # System on Chip audio support
-@@ -1084,6 +1074,10 @@ CONFIG_SND_BF5XX_SOC_BF548_EZKIT=y
- CONFIG_SND_BF5XX_SPORT_NUM=0
- CONFIG_SND_BF5XX_HAVE_COLD_RESET=y
- CONFIG_SND_BF5XX_RESET_GPIO_NUM=19
-+
-+#
-+# SoC Audio support for SuperH
-+#
- CONFIG_SND_SOC_AD1980=y
-
- #
-@@ -1091,72 +1085,152 @@ CONFIG_SND_SOC_AD1980=y
- #
- # CONFIG_SOUND_PRIME is not set
- CONFIG_AC97_BUS=y
--
--#
--# HID Devices
--#
--CONFIG_HID=m
-+CONFIG_HID_SUPPORT=y
-+CONFIG_HID=y
- # CONFIG_HID_DEBUG is not set
-+# CONFIG_HIDRAW is not set
-
- #
--# USB support
-+# USB Input Devices
- #
-+CONFIG_USB_HID=y
-+# CONFIG_USB_HIDINPUT_POWERBOOK is not set
-+# CONFIG_HID_FF is not set
-+# CONFIG_USB_HIDDEV is not set
-+CONFIG_USB_SUPPORT=y
- CONFIG_USB_ARCH_HAS_HCD=y
- # CONFIG_USB_ARCH_HAS_OHCI is not set
- # CONFIG_USB_ARCH_HAS_EHCI is not set
--# CONFIG_USB is not set
-+CONFIG_USB=y
-+# CONFIG_USB_DEBUG is not set
-+
-+#
-+# Miscellaneous USB options
-+#
-+# CONFIG_USB_DEVICEFS is not set
-+CONFIG_USB_DEVICE_CLASS=y
-+# CONFIG_USB_DYNAMIC_MINORS is not set
-+# CONFIG_USB_OTG is not set
-+# CONFIG_USB_OTG_WHITELIST is not set
-+CONFIG_USB_OTG_BLACKLIST_HUB=y
-
- #
--# Enable Host or Gadget support to see Inventra options
-+# USB Host Controller Drivers
- #
-+# CONFIG_USB_ISP116X_HCD is not set
-+# CONFIG_USB_ISP1362_HCD is not set
-+# CONFIG_USB_ISP1760_HCD is not set
-+# CONFIG_USB_SL811_HCD is not set
-+# CONFIG_USB_R8A66597_HCD is not set
-+CONFIG_USB_MUSB_HDRC=y
-+CONFIG_USB_MUSB_SOC=y
-+
-+#
-+# Blackfin high speed USB support
-+#
-+CONFIG_USB_MUSB_HOST=y
-+# CONFIG_USB_MUSB_PERIPHERAL is not set
-+# CONFIG_USB_MUSB_OTG is not set
-+CONFIG_USB_MUSB_HDRC_HCD=y
-+# CONFIG_MUSB_PIO_ONLY is not set
-+# CONFIG_USB_INVENTRA_DMA is not set
-+# CONFIG_USB_TI_CPPI_DMA is not set
-+CONFIG_USB_MUSB_LOGLEVEL=0
-+
-+#
-+# USB Device Class drivers
-+#
-+# CONFIG_USB_ACM is not set
-+# CONFIG_USB_PRINTER is not set
-
- #
- # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
- #
-
- #
--# USB Gadget Support
-+# may also be needed; see USB_STORAGE Help for more information
- #
--# CONFIG_USB_GADGET is not set
--CONFIG_MMC=m
--# CONFIG_MMC_DEBUG is not set
--# CONFIG_MMC_UNSAFE_RESUME is not set
-+CONFIG_USB_STORAGE=m
-+# CONFIG_USB_STORAGE_DEBUG is not set
-+# CONFIG_USB_STORAGE_DATAFAB is not set
-+# CONFIG_USB_STORAGE_FREECOM is not set
-+# CONFIG_USB_STORAGE_ISD200 is not set
-+# CONFIG_USB_STORAGE_DPCM is not set
-+# CONFIG_USB_STORAGE_USBAT is not set
-+# CONFIG_USB_STORAGE_SDDR09 is not set
-+# CONFIG_USB_STORAGE_SDDR55 is not set
-+# CONFIG_USB_STORAGE_JUMPSHOT is not set
-+# CONFIG_USB_STORAGE_ALAUDA is not set
-+# CONFIG_USB_STORAGE_ONETOUCH is not set
-+# CONFIG_USB_STORAGE_KARMA is not set
-+# CONFIG_USB_LIBUSUAL is not set
-
- #
--# MMC/SD Card Drivers
-+# USB Imaging devices
- #
--CONFIG_MMC_BLOCK=m
-+# CONFIG_USB_MDC800 is not set
-+# CONFIG_USB_MICROTEK is not set
-+CONFIG_USB_MON=y
-
- #
--# MMC/SD Host Controller Drivers
-+# USB port drivers
- #
--CONFIG_SDH_BFIN=m
--# CONFIG_SPI_MMC is not set
-
- #
--# LED devices
-+# USB Serial Converter support
- #
--# CONFIG_NEW_LEDS is not set
-+# CONFIG_USB_SERIAL is not set
-
- #
--# LED drivers
-+# USB Miscellaneous drivers
- #
-+# CONFIG_USB_EMI62 is not set
-+# CONFIG_USB_EMI26 is not set
-+# CONFIG_USB_ADUTUX is not set
-+# CONFIG_USB_AUERSWALD is not set
-+# CONFIG_USB_RIO500 is not set
-+# CONFIG_USB_LEGOTOWER is not set
-+# CONFIG_USB_LCD is not set
-+# CONFIG_USB_BERRY_CHARGE is not set
-+# CONFIG_USB_LED is not set
-+# CONFIG_USB_CYPRESS_CY7C63 is not set
-+# CONFIG_USB_CYTHERM is not set
-+# CONFIG_USB_PHIDGET is not set
-+# CONFIG_USB_IDMOUSE is not set
-+# CONFIG_USB_FTDI_ELAN is not set
-+# CONFIG_USB_APPLEDISPLAY is not set
-+# CONFIG_USB_SISUSBVGA is not set
-+# CONFIG_USB_LD is not set
-+# CONFIG_USB_TRANCEVIBRATOR is not set
-+# CONFIG_USB_IOWARRIOR is not set
-
- #
--# LED Triggers
-+# USB DSL modem support
- #
-
- #
--# InfiniBand support
-+# USB Gadget Support
- #
-+# CONFIG_USB_GADGET is not set
-+CONFIG_MMC=m
-+# CONFIG_MMC_DEBUG is not set
-+# CONFIG_MMC_UNSAFE_RESUME is not set
-
- #
--# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
-+# MMC/SD Card Drivers
- #
-+CONFIG_MMC_BLOCK=m
-+CONFIG_MMC_BLOCK_BOUNCE=y
-+# CONFIG_SDIO_UART is not set
-
- #
--# Real Time Clock
-+# MMC/SD Host Controller Drivers
- #
-+CONFIG_SDH_BFIN=m
-+# CONFIG_SDH_BFIN_MISSING_CMD_PULLUP_WORKAROUND is not set
-+# CONFIG_MMC_SPI is not set
-+# CONFIG_SPI_MMC is not set
-+# CONFIG_NEW_LEDS is not set
- CONFIG_RTC_LIB=y
- CONFIG_RTC_CLASS=y
- CONFIG_RTC_HCTOSYS=y
-@@ -1176,6 +1250,7 @@ CONFIG_RTC_INTF_DEV=y
- # I2C RTC drivers
- #
- # CONFIG_RTC_DRV_DS1307 is not set
-+# CONFIG_RTC_DRV_DS1374 is not set
- # CONFIG_RTC_DRV_DS1672 is not set
- # CONFIG_RTC_DRV_MAX6900 is not set
- # CONFIG_RTC_DRV_RS5C372 is not set
-@@ -1183,6 +1258,7 @@ CONFIG_RTC_INTF_DEV=y
- # CONFIG_RTC_DRV_X1205 is not set
- # CONFIG_RTC_DRV_PCF8563 is not set
- # CONFIG_RTC_DRV_PCF8583 is not set
-+# CONFIG_RTC_DRV_M41T80 is not set
-
- #
- # SPI RTC drivers
-@@ -1194,8 +1270,10 @@ CONFIG_RTC_INTF_DEV=y
- # Platform RTC drivers
- #
- # CONFIG_RTC_DRV_DS1553 is not set
-+# CONFIG_RTC_DRV_STK17TA8 is not set
- # CONFIG_RTC_DRV_DS1742 is not set
- # CONFIG_RTC_DRV_M48T86 is not set
-+# CONFIG_RTC_DRV_M48T59 is not set
- # CONFIG_RTC_DRV_V3020 is not set
-
- #
-@@ -1204,22 +1282,9 @@ CONFIG_RTC_INTF_DEV=y
- CONFIG_RTC_DRV_BFIN=y
-
- #
--# DMA Engine support
--#
--# CONFIG_DMA_ENGINE is not set
--
--#
--# DMA Clients
-+# Userspace I/O
- #
--
--#
--# DMA Devices
--#
--
--#
--# PBX support
--#
--# CONFIG_PBX is not set
-+# CONFIG_UIO is not set
-
- #
- # File systems
-@@ -1280,7 +1345,6 @@ CONFIG_PROC_SYSCTL=y
- CONFIG_SYSFS=y
- # CONFIG_TMPFS is not set
- # CONFIG_HUGETLB_PAGE is not set
--CONFIG_RAMFS=y
- # CONFIG_CONFIGFS_FS is not set
-
- #
-@@ -1306,10 +1370,12 @@ CONFIG_YAFFS_SHORT_NAMES_IN_RAM=y
- CONFIG_JFFS2_FS=m
- CONFIG_JFFS2_FS_DEBUG=0
- CONFIG_JFFS2_FS_WRITEBUFFER=y
-+# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
- # CONFIG_JFFS2_SUMMARY is not set
- # CONFIG_JFFS2_FS_XATTR is not set
- # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
- CONFIG_JFFS2_ZLIB=y
-+# CONFIG_JFFS2_LZO is not set
- CONFIG_JFFS2_RTIME=y
- # CONFIG_JFFS2_RUBIN is not set
- # CONFIG_CRAMFS is not set
-@@ -1318,10 +1384,7 @@ CONFIG_JFFS2_RTIME=y
- # CONFIG_QNX4FS_FS is not set
- # CONFIG_SYSV_FS is not set
- # CONFIG_UFS_FS is not set
--
--#
--# Network File Systems
--#
-+CONFIG_NETWORK_FILESYSTEMS=y
- CONFIG_NFS_FS=m
- CONFIG_NFS_V3=y
- # CONFIG_NFS_V3_ACL is not set
-@@ -1352,7 +1415,6 @@ CONFIG_CIFS=y
- # CONFIG_NCP_FS is not set
- # CONFIG_CODA_FS is not set
- # CONFIG_AFS_FS is not set
--# CONFIG_9P_FS is not set
-
- #
- # Partition Types
-@@ -1375,10 +1437,6 @@ CONFIG_MSDOS_PARTITION=y
- # CONFIG_KARMA_PARTITION is not set
- # CONFIG_EFI_PARTITION is not set
- # CONFIG_SYSV68_PARTITION is not set
--
--#
--# Native Language Support
--#
- CONFIG_NLS=y
- CONFIG_NLS_DEFAULT="iso8859-1"
- CONFIG_NLS_CODEPAGE_437=m
-@@ -1419,21 +1477,16 @@ CONFIG_NLS_ISO8859_15=m
- CONFIG_NLS_KOI8_R=m
- CONFIG_NLS_KOI8_U=m
- CONFIG_NLS_UTF8=m
--
--#
--# Distributed Lock Manager
--#
- # CONFIG_DLM is not set
--
--#
--# Profiling support
--#
-+CONFIG_INSTRUMENTATION=y
- # CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-
- #
- # Kernel hacking
- #
- # CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
- CONFIG_ENABLE_MUST_CHECK=y
- # CONFIG_MAGIC_SYSRQ is not set
- # CONFIG_UNUSED_SYMBOLS is not set
-@@ -1441,6 +1494,7 @@ CONFIG_DEBUG_FS=y
- # CONFIG_HEADERS_CHECK is not set
- # CONFIG_DEBUG_KERNEL is not set
- # CONFIG_DEBUG_BUGVERBOSE is not set
-+# CONFIG_SAMPLES is not set
- CONFIG_DEBUG_MMRS=y
- CONFIG_DEBUG_HUNT_FOR_ZERO=y
- CONFIG_DEBUG_BFIN_HWTRACE_ON=y
-@@ -1460,11 +1514,8 @@ CONFIG_ACCESS_CHECK=y
- # CONFIG_KEYS is not set
- CONFIG_SECURITY=y
- # CONFIG_SECURITY_NETWORK is not set
--CONFIG_SECURITY_CAPABILITIES=m
--
--#
--# Cryptographic options
--#
-+# CONFIG_SECURITY_CAPABILITIES is not set
-+# CONFIG_SECURITY_ROOTPLUG is not set
- # CONFIG_CRYPTO is not set
-
- #
-@@ -1475,6 +1526,7 @@ CONFIG_CRC_CCITT=m
- # CONFIG_CRC16 is not set
- # CONFIG_CRC_ITU_T is not set
- CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
- # CONFIG_LIBCRC32C is not set
- CONFIG_ZLIB_INFLATE=y
- CONFIG_ZLIB_DEFLATE=m
-diff --git a/arch/blackfin/configs/IP0X_defconfig b/arch/blackfin/configs/IP0X_defconfig
-index 5f6ff04..4384a67 100644
---- a/arch/blackfin/configs/IP0X_defconfig
-+++ b/arch/blackfin/configs/IP0X_defconfig
-@@ -212,7 +212,7 @@ CONFIG_HZ=250
- #
- # Memory Setup
- #
--CONFIG_MEM_SIZE=64
-+CONFIG_MAX_MEM_SIZE=64
- CONFIG_MEM_ADD_WIDTH=10
-
- #
-diff --git a/arch/blackfin/kernel/bfin_dma_5xx.c b/arch/blackfin/kernel/bfin_dma_5xx.c
-index fd5448d..d54f190 100644
---- a/arch/blackfin/kernel/bfin_dma_5xx.c
-+++ b/arch/blackfin/kernel/bfin_dma_5xx.c
-@@ -90,6 +90,17 @@ int request_dma(unsigned int channel, char *device_id)
- {
-
- pr_debug("request_dma() : BEGIN \n");
-+
-+#if defined(CONFIG_BF561) && ANOMALY_05000182
-+ if (channel >= CH_IMEM_STREAM0_DEST && channel <= CH_IMEM_STREAM1_DEST) {
-+ if (get_cclk() > 500000000) {
-+ printk(KERN_WARNING
-+ "Request IMDMA failed due to ANOMALY 05000182\n");
-+ return -EFAULT;
-+ }
-+ }
-+#endif
-+
- mutex_lock(&(dma_ch[channel].dmalock));
-
- if ((dma_ch[channel].chan_status == DMA_CHANNEL_REQUESTED)
-diff --git a/arch/blackfin/kernel/bfin_gpio.c b/arch/blackfin/kernel/bfin_gpio.c
-index 7e8eaf4..b6d89d1 100644
---- a/arch/blackfin/kernel/bfin_gpio.c
-+++ b/arch/blackfin/kernel/bfin_gpio.c
-@@ -1130,6 +1130,25 @@ void bfin_gpio_irq_prepare(unsigned gpio)
-
- #else
-
-+int gpio_get_value(unsigned gpio)
-+{
-+ unsigned long flags;
-+ int ret;
-+
-+ if (unlikely(get_gpio_edge(gpio))) {
-+ local_irq_save(flags);
-+ set_gpio_edge(gpio, 0);
-+ ret = get_gpio_data(gpio);
-+ set_gpio_edge(gpio, 1);
-+ local_irq_restore(flags);
-+
-+ return ret;
-+ } else
-+ return get_gpio_data(gpio);
-+}
-+EXPORT_SYMBOL(gpio_get_value);
-+
-+
- int gpio_direction_input(unsigned gpio)
- {
- unsigned long flags;
-diff --git a/arch/blackfin/kernel/bfin_ksyms.c b/arch/blackfin/kernel/bfin_ksyms.c
-index 053edff..4367330 100644
---- a/arch/blackfin/kernel/bfin_ksyms.c
-+++ b/arch/blackfin/kernel/bfin_ksyms.c
-@@ -90,7 +90,9 @@ EXPORT_SYMBOL(__umodsi3);
- EXPORT_SYMBOL(outsb);
- EXPORT_SYMBOL(insb);
- EXPORT_SYMBOL(outsw);
-+EXPORT_SYMBOL(outsw_8);
- EXPORT_SYMBOL(insw);
-+EXPORT_SYMBOL(insw_8);
- EXPORT_SYMBOL(outsl);
- EXPORT_SYMBOL(insl);
- EXPORT_SYMBOL(insl_16);
-diff --git a/arch/blackfin/kernel/init_task.c b/arch/blackfin/kernel/init_task.c
-index c640154..6bdba7b 100644
---- a/arch/blackfin/kernel/init_task.c
-+++ b/arch/blackfin/kernel/init_task.c
-@@ -34,7 +34,6 @@
- #include
-
- static struct fs_struct init_fs = INIT_FS;
--static struct files_struct init_files = INIT_FILES;
- static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
- static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
-
-diff --git a/arch/blackfin/kernel/traps.c b/arch/blackfin/kernel/traps.c
-index 5b84707..7bfbd95 100644
---- a/arch/blackfin/kernel/traps.c
-+++ b/arch/blackfin/kernel/traps.c
-@@ -364,13 +364,13 @@ asmlinkage void trap_c(struct pt_regs *fp)
- /* 0x27 - Data CPLB Multiple Hits - Linux Trap Zero, handled here */
- case VEC_CPLB_MHIT:
- info.si_code = ILL_CPLB_MULHIT;
--#ifdef CONFIG_DEBUG_HUNT_FOR_ZERO
- sig = SIGSEGV;
-- printk(KERN_NOTICE "NULL pointer access (probably)\n");
--#else
-- sig = SIGILL;
-- printk(KERN_NOTICE EXC_0x27(KERN_NOTICE));
-+#ifdef CONFIG_DEBUG_HUNT_FOR_ZERO
-+ if (saved_dcplb_fault_addr < (void *)FIXED_CODE_START)
-+ printk(KERN_NOTICE "NULL pointer access\n");
-+ else
- #endif
-+ printk(KERN_NOTICE EXC_0x27(KERN_NOTICE));
- CHK_DEBUGGER_TRAP();
- break;
- /* 0x28 - Emulation Watchpoint, handled here */
-@@ -419,13 +419,13 @@ asmlinkage void trap_c(struct pt_regs *fp)
- /* 0x2D - Instruction CPLB Multiple Hits, handled here */
- case VEC_CPLB_I_MHIT:
- info.si_code = ILL_CPLB_MULHIT;
--#ifdef CONFIG_DEBUG_HUNT_FOR_ZERO
- sig = SIGSEGV;
-- printk(KERN_NOTICE "Jump to address 0 - 0x0fff\n");
--#else
-- sig = SIGILL;
-- printk(KERN_NOTICE EXC_0x2D(KERN_NOTICE));
-+#ifdef CONFIG_DEBUG_HUNT_FOR_ZERO
-+ if (saved_icplb_fault_addr < (void *)FIXED_CODE_START)
-+ printk(KERN_NOTICE "Jump to NULL address\n");
-+ else
- #endif
-+ printk(KERN_NOTICE EXC_0x2D(KERN_NOTICE));
- CHK_DEBUGGER_TRAP();
- break;
- /* 0x2E - Illegal use of Supervisor Resource, handled here */
-diff --git a/arch/blackfin/lib/checksum.c b/arch/blackfin/lib/checksum.c
-index 42768e0..5c87505 100644
---- a/arch/blackfin/lib/checksum.c
-+++ b/arch/blackfin/lib/checksum.c
-@@ -72,9 +72,9 @@ static unsigned short do_csum(const unsigned char *buff, int len)
- * This is a version of ip_compute_csum() optimized for IP headers,
- * which always checksum on 4 octet boundaries.
- */
--unsigned short ip_fast_csum(unsigned char *iph, unsigned int ihl)
-+__sum16 ip_fast_csum(unsigned char *iph, unsigned int ihl)
- {
-- return ~do_csum(iph, ihl * 4);
-+ return (__force __sum16)~do_csum(iph, ihl * 4);
- }
-
- /*
-@@ -89,7 +89,7 @@ unsigned short ip_fast_csum(unsigned char *iph, unsigned int ihl)
- *
- * it's best to have buff aligned on a 32-bit boundary
- */
--unsigned int csum_partial(const unsigned char *buff, int len, unsigned int sum)
-+__wsum csum_partial(const void *buff, int len, __wsum sum)
- {
- /*
- * Just in case we get nasty checksum data...
-@@ -109,22 +109,22 @@ unsigned int csum_partial(const unsigned char *buff, int len, unsigned int sum)
- * this routine is used for miscellaneous IP-like checksums, mainly
- * in icmp.c
- */
--unsigned short ip_compute_csum(const unsigned char *buff, int len)
-+__sum16 ip_compute_csum(const void *buff, int len)
- {
-- return ~do_csum(buff, len);
-+ return (__force __sum16)~do_csum(buff, len);
- }
-
- /*
- * copy from fs while checksumming, otherwise like csum_partial
- */
-
--unsigned int
--csum_partial_copy_from_user(const unsigned char *src, unsigned char *dst,
-- int len, int sum, int *csum_err)
-+__wsum
-+csum_partial_copy_from_user(const void __user *src, void *dst,
-+ int len, __wsum sum, int *csum_err)
- {
- if (csum_err)
- *csum_err = 0;
-- memcpy(dst, src, len);
-+ memcpy(dst, (__force void *)src, len);
- return csum_partial(dst, len, sum);
- }
-
-@@ -132,8 +132,7 @@ csum_partial_copy_from_user(const unsigned char *src, unsigned char *dst,
- * copy from ds while checksumming, otherwise like csum_partial
- */
-
--unsigned int csum_partial_copy(const unsigned char *src, unsigned char *dst,
-- int len, int sum)
-+__wsum csum_partial_copy(const void *src, void *dst, int len, __wsum sum)
- {
- memcpy(dst, src, len);
- return csum_partial(dst, len, sum);
-diff --git a/arch/blackfin/lib/ins.S b/arch/blackfin/lib/ins.S
-index df7b883..eba2343 100644
---- a/arch/blackfin/lib/ins.S
-+++ b/arch/blackfin/lib/ins.S
-@@ -7,7 +7,7 @@
- * Description: Implementation of ins{bwl} for BlackFin processors using zero overhead loops.
- *
- * Modified:
-- * Copyright 2004-2006 Analog Devices Inc.
-+ * Copyright 2004-2008 Analog Devices Inc.
- * Copyright (C) 2005 Bas Vermeulen, BuyWays BV
- *
- * Bugs: Enter bugs at http://blackfin.uclinux.org/
-@@ -63,6 +63,23 @@ ENTRY(_insw)
- RTS;
- ENDPROC(_insw)
-
-+ENTRY(_insw_8)
-+ P0 = R0; /* P0 = port */
-+ cli R3;
-+ P1 = R1; /* P1 = address */
-+ P2 = R2; /* P2 = count */
-+ SSYNC;
-+ LSETUP( .Lword8_loop_s, .Lword8_loop_e) LC0 = P2;
-+.Lword8_loop_s: R0 = W[P0];
-+ B[P1++] = R0;
-+ R0 = R0 >> 8;
-+ B[P1++] = R0;
-+ NOP;
-+.Lword8_loop_e: NOP;
-+ sti R3;
-+ RTS;
-+ENDPROC(_insw_8)
-+
- ENTRY(_insb)
- P0 = R0; /* P0 = port */
- cli R3;
-@@ -78,8 +95,6 @@ ENTRY(_insb)
- RTS;
- ENDPROC(_insb)
-
--
--
- ENTRY(_insl_16)
- P0 = R0; /* P0 = port */
- cli R3;
-diff --git a/arch/blackfin/lib/outs.S b/arch/blackfin/lib/outs.S
-index 4c3da8a..3daf960 100644
---- a/arch/blackfin/lib/outs.S
-+++ b/arch/blackfin/lib/outs.S
-@@ -7,7 +7,7 @@
- * Description: Implementation of outs{bwl} for BlackFin processors using zero overhead loops.
- *
- * Modified: Copyright (C) 2005 Bas Vermeulen, BuyWays BV
-- * Copyright 2004-2006 Analog Devices Inc.
-+ * Copyright 2004-2008 Analog Devices Inc.
- *
- * Bugs: Enter bugs at http://blackfin.uclinux.org/
- *
-@@ -63,3 +63,17 @@ ENTRY(_outsb)
- .Lbyte_loop_e: B[P0] = R0;
- RTS;
- ENDPROC(_outsb)
-+
-+ENTRY(_outsw_8)
-+ P0 = R0; /* P0 = port */
-+ P1 = R1; /* P1 = address */
-+ P2 = R2; /* P2 = count */
-+
-+ LSETUP( .Lword8_loop_s, .Lword8_loop_e) LC0 = P2;
-+.Lword8_loop_s: R1 = B[P1++];
-+ R0 = B[P1++];
-+ R0 = R0 << 8;
-+ R0 = R0 + R1;
-+.Lword8_loop_e: W[P0] = R0;
-+ RTS;
-+ENDPROC(_outsw)
-diff --git a/arch/blackfin/mach-bf533/boards/stamp.c b/arch/blackfin/mach-bf533/boards/stamp.c
-index 7fd35fb..ec05b23 100644
---- a/arch/blackfin/mach-bf533/boards/stamp.c
-+++ b/arch/blackfin/mach-bf533/boards/stamp.c
-@@ -111,7 +111,7 @@ static struct platform_device net2272_bfin_device = {
- };
- #endif
-
--#if defined(CONFIG_MTD_BF5xx) || defined(CONFIG_MTD_BF5xx_MODULE)
-+#if defined(CONFIG_MTD_BFIN_ASYNC) || defined(CONFIG_MTD_BFIN_ASYNC_MODULE)
- static struct mtd_partition stamp_partitions[] = {
- {
- .name = "Bootloader",
-@@ -141,13 +141,17 @@ static struct resource stamp_flash_resource[] = {
- .end = 0x203fffff,
- .flags = IORESOURCE_MEM,
- }, {
-- .start = CONFIG_ENET_FLASH_PIN,
-+ .start = 0x7BB07BB0, /* AMBCTL0 setting when accessing flash */
-+ .end = 0x7BB07BB0, /* AMBCTL1 setting when accessing flash */
-+ .flags = IORESOURCE_MEM,
-+ }, {
-+ .start = GPIO_PF0,
- .flags = IORESOURCE_IRQ,
- }
- };
-
- static struct platform_device stamp_flash_device = {
-- .name = "BF5xx-Flash",
-+ .name = "bfin-async-flash",
- .id = 0,
- .dev = {
- .platform_data = &stamp_flash_data,
-@@ -595,7 +599,7 @@ static struct platform_device *stamp_devices[] __initdata = {
-
- &bfin_gpios_device,
-
--#if defined(CONFIG_MTD_BF5xx) || defined(CONFIG_MTD_BF5xx_MODULE)
-+#if defined(CONFIG_MTD_BFIN_ASYNC) || defined(CONFIG_MTD_BFIN_ASYNC_MODULE)
- &stamp_flash_device,
- #endif
- };
-@@ -617,8 +621,8 @@ static int __init stamp_init(void)
-
- #if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
- /* setup BF533_STAMP CPLD to route AMS3 to Ethernet MAC */
-- bfin_write_FIO_DIR(bfin_read_FIO_DIR() | (1 << CONFIG_ENET_FLASH_PIN));
-- bfin_write_FIO_FLAG_S(1 << CONFIG_ENET_FLASH_PIN);
-+ bfin_write_FIO_DIR(bfin_read_FIO_DIR() | PF0);
-+ bfin_write_FIO_FLAG_S(PF0);
- SSYNC();
- #endif
-
-@@ -636,8 +640,8 @@ arch_initcall(stamp_init);
-
- void native_machine_restart(char *cmd)
- {
--#define BIT_TO_SET (1 << CONFIG_ENET_FLASH_PIN)
-- bfin_write_FIO_INEN(~BIT_TO_SET);
-- bfin_write_FIO_DIR(BIT_TO_SET);
-- bfin_write_FIO_FLAG_C(BIT_TO_SET);
-+ /* workaround pull up on cpld / flash pin not being strong enough */
-+ bfin_write_FIO_INEN(~PF0);
-+ bfin_write_FIO_DIR(PF0);
-+ bfin_write_FIO_FLAG_C(PF0);
- }
-diff --git a/arch/cris/kernel/process.c b/arch/cris/kernel/process.c
-index ef2db8f..5933656 100644
---- a/arch/cris/kernel/process.c
-+++ b/arch/cris/kernel/process.c
-@@ -38,7 +38,6 @@
- */
-
- static struct fs_struct init_fs = INIT_FS;
--static struct files_struct init_files = INIT_FILES;
- static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
- static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
- struct mm_struct init_mm = INIT_MM(init_mm);
-diff --git a/arch/frv/kernel/init_task.c b/arch/frv/kernel/init_task.c
-index 2299393..e219881 100644
---- a/arch/frv/kernel/init_task.c
-+++ b/arch/frv/kernel/init_task.c
-@@ -11,7 +11,6 @@
-
-
- static struct fs_struct init_fs = INIT_FS;
--static struct files_struct init_files = INIT_FILES;
- static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
- static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
- struct mm_struct init_mm = INIT_MM(init_mm);
-diff --git a/arch/frv/mm/init.c b/arch/frv/mm/init.c
-index b841ecf..9af7740 100644
---- a/arch/frv/mm/init.c
-+++ b/arch/frv/mm/init.c
-@@ -26,6 +26,7 @@
- #include
- #include
- #include
-+#include
-
- #include
- #include
-@@ -56,7 +57,9 @@ DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
- */
- static unsigned long empty_bad_page_table;
- static unsigned long empty_bad_page;
-+
- unsigned long empty_zero_page;
-+EXPORT_SYMBOL(empty_zero_page);
-
- /*****************************************************************************/
- /*
-diff --git a/arch/h8300/kernel/init_task.c b/arch/h8300/kernel/init_task.c
-index 19272c2..93a4899 100644
---- a/arch/h8300/kernel/init_task.c
-+++ b/arch/h8300/kernel/init_task.c
-@@ -13,7 +13,6 @@
- #include
-
- static struct fs_struct init_fs = INIT_FS;
--static struct files_struct init_files = INIT_FILES;
- static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
- static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
- struct mm_struct init_mm = INIT_MM(init_mm);
-diff --git a/arch/ia64/kernel/init_task.c b/arch/ia64/kernel/init_task.c
-index bc8efca..9d7e1c6 100644
---- a/arch/ia64/kernel/init_task.c
-+++ b/arch/ia64/kernel/init_task.c
-@@ -18,7 +18,6 @@
- #include
-
- static struct fs_struct init_fs = INIT_FS;
--static struct files_struct init_files = INIT_FILES;
- static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
- static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
- struct mm_struct init_mm = INIT_MM(init_mm);
-diff --git a/arch/ia64/kvm/Makefile b/arch/ia64/kvm/Makefile
-index 5235339..112791d 100644
---- a/arch/ia64/kvm/Makefile
-+++ b/arch/ia64/kvm/Makefile
-@@ -7,7 +7,6 @@ offsets-file := asm-offsets.h
- always := $(offsets-file)
- targets := $(offsets-file)
- targets += arch/ia64/kvm/asm-offsets.s
--clean-files := $(addprefix $(objtree)/,$(targets) $(obj)/memcpy.S $(obj)/memset.S)
-
- # Default sed regexp - multiline due to syntax constraints
- define sed-y
-@@ -54,5 +53,5 @@ EXTRA_CFLAGS_vcpu.o += -mfixed-range=f2-f5,f12-f127
- kvm-intel-objs = vmm.o vmm_ivt.o trampoline.o vcpu.o optvfault.o mmio.o \
- vtlb.o process.o
- #Add link memcpy and memset to avoid possible structure assignment error
--kvm-intel-objs += ../lib/memset.o ../lib/memcpy.o
-+kvm-intel-objs += memcpy.o memset.o
- obj-$(CONFIG_KVM_INTEL) += kvm-intel.o
-diff --git a/arch/ia64/kvm/memcpy.S b/arch/ia64/kvm/memcpy.S
-new file mode 100644
-index 0000000..c04cdbe
---- /dev/null
-+++ b/arch/ia64/kvm/memcpy.S
-@@ -0,0 +1 @@
-+#include "../lib/memcpy.S"
-diff --git a/arch/ia64/kvm/memset.S b/arch/ia64/kvm/memset.S
-new file mode 100644
-index 0000000..83c3066
---- /dev/null
-+++ b/arch/ia64/kvm/memset.S
-@@ -0,0 +1 @@
-+#include "../lib/memset.S"
-diff --git a/arch/m32r/kernel/init_task.c b/arch/m32r/kernel/init_task.c
-index 9e508fd..0d658db 100644
---- a/arch/m32r/kernel/init_task.c
-+++ b/arch/m32r/kernel/init_task.c
-@@ -12,7 +12,6 @@
- #include
-
- static struct fs_struct init_fs = INIT_FS;
--static struct files_struct init_files = INIT_FILES;
- static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
- static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
- struct mm_struct init_mm = INIT_MM(init_mm);
-diff --git a/arch/m68k/kernel/process.c b/arch/m68k/kernel/process.c
-index 5de4e4e..7888cdf 100644
---- a/arch/m68k/kernel/process.c
-+++ b/arch/m68k/kernel/process.c
-@@ -41,7 +41,6 @@
- * setup.
- */
- static struct fs_struct init_fs = INIT_FS;
--static struct files_struct init_files = INIT_FILES;
- static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
- static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
- struct mm_struct init_mm = INIT_MM(init_mm);
-diff --git a/arch/m68k/lib/string.c b/arch/m68k/lib/string.c
-index 891e134..4253f87 100644
---- a/arch/m68k/lib/string.c
-+++ b/arch/m68k/lib/string.c
-@@ -15,6 +15,12 @@ char *strcpy(char *dest, const char *src)
- }
- EXPORT_SYMBOL(strcpy);
-
-+char *strcat(char *dest, const char *src)
-+{
-+ return __kernel_strcpy(dest + __kernel_strlen(dest), src);
-+}
-+EXPORT_SYMBOL(strcat);
-+
- void *memset(void *s, int c, size_t count)
- {
- void *xs = s;
-diff --git a/arch/m68knommu/kernel/init_task.c b/arch/m68knommu/kernel/init_task.c
-index 3897043..344c01a 100644
---- a/arch/m68knommu/kernel/init_task.c
-+++ b/arch/m68knommu/kernel/init_task.c
-@@ -13,7 +13,6 @@
- #include
-
- static struct fs_struct init_fs = INIT_FS;
--static struct files_struct init_files = INIT_FILES;
- static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
- static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
- struct mm_struct init_mm = INIT_MM(init_mm);
-diff --git a/arch/mips/kernel/init_task.c b/arch/mips/kernel/init_task.c
-index aeda7f5..d72487a 100644
---- a/arch/mips/kernel/init_task.c
-+++ b/arch/mips/kernel/init_task.c
-@@ -10,7 +10,6 @@
- #include
-
- static struct fs_struct init_fs = INIT_FS;
--static struct files_struct init_files = INIT_FILES;
- static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
- static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
- struct mm_struct init_mm = INIT_MM(init_mm);
-diff --git a/arch/mn10300/kernel/init_task.c b/arch/mn10300/kernel/init_task.c
-index 39fe688..af16f6e 100644
---- a/arch/mn10300/kernel/init_task.c
-+++ b/arch/mn10300/kernel/init_task.c
-@@ -19,7 +19,6 @@
- #include
-
- static struct fs_struct init_fs = INIT_FS;
--static struct files_struct init_files = INIT_FILES;
- static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
- static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
- struct mm_struct init_mm = INIT_MM(init_mm);
-diff --git a/arch/parisc/kernel/init_task.c b/arch/parisc/kernel/init_task.c
-index 26198a0..f5941c0 100644
---- a/arch/parisc/kernel/init_task.c
-+++ b/arch/parisc/kernel/init_task.c
-@@ -35,7 +35,6 @@
- #include
-
- static struct fs_struct init_fs = INIT_FS;
--static struct files_struct init_files = INIT_FILES;
- static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
- static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
- struct mm_struct init_mm = INIT_MM(init_mm);
-diff --git a/arch/powerpc/boot/.gitignore b/arch/powerpc/boot/.gitignore
-index 2347294..2f50acd 100644
---- a/arch/powerpc/boot/.gitignore
-+++ b/arch/powerpc/boot/.gitignore
-@@ -20,21 +20,19 @@ kernel-vmlinux.strip.gz
- mktree
- uImage
- cuImage.*
-+dtbImage.*
- treeImage.*
- zImage
-+zImage.initrd
- zImage.bin.*
- zImage.chrp
- zImage.coff
--zImage.coff.lds
--zImage.ep*
-+zImage.holly
- zImage.iseries
- zImage.*lds
- zImage.miboot
- zImage.pmac
- zImage.pseries
--zImage.redboot*
--zImage.sandpoint
--zImage.vmode
- zconf.h
- zlib.h
- zutil.h
-diff --git a/arch/powerpc/boot/4xx.c b/arch/powerpc/boot/4xx.c
-index 758edf1..5c87843 100644
---- a/arch/powerpc/boot/4xx.c
-+++ b/arch/powerpc/boot/4xx.c
-@@ -21,6 +21,25 @@
- #include "reg.h"
- #include "dcr.h"
-
-+static unsigned long chip_11_errata(unsigned long memsize)
-+{
-+ unsigned long pvr;
-+
-+ pvr = mfpvr();
-+
-+ switch (pvr & 0xf0000ff0) {
-+ case 0x40000850:
-+ case 0x400008d0:
-+ case 0x200008d0:
-+ memsize -= 4096;
-+ break;
-+ default:
-+ break;
-+ }
-+
-+ return memsize;
-+}
-+
- /* Read the 4xx SDRAM controller to get size of system memory. */
- void ibm4xx_sdram_fixup_memsize(void)
- {
-@@ -34,6 +53,7 @@ void ibm4xx_sdram_fixup_memsize(void)
- memsize += SDRAM_CONFIG_BANK_SIZE(bank_config);
- }
-
-+ memsize = chip_11_errata(memsize);
- dt_fixup_memory(0, memsize);
- }
-
-@@ -199,6 +219,7 @@ void ibm4xx_denali_fixup_memsize(void)
- bank = 4; /* 4 banks */
-
- memsize = cs * (1 << (col+row)) * bank * dpath;
-+ memsize = chip_11_errata(memsize);
- dt_fixup_memory(0, memsize);
- }
-
-diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile
-index 7822d25..f5e0b2a 100644
---- a/arch/powerpc/boot/Makefile
-+++ b/arch/powerpc/boot/Makefile
-@@ -99,7 +99,7 @@ $(obj)/zImage.lds $(obj)/zImage.coff.lds $(obj)/zImage.ps3.lds: $(obj)/%: $(srct
- @cp $< $@
-
- clean-files := $(zlib) $(zlibheader) $(zliblinuxheader) \
-- empty.c zImage zImage.coff.lds zImage.ps3.lds zImage.lds
-+ empty.c zImage.coff.lds zImage.ps3.lds zImage.lds
-
- quiet_cmd_bootcc = BOOTCC $@
- cmd_bootcc = $(CROSS32CC) -Wp,-MD,$(depfile) $(BOOTCFLAGS) -c -o $@ $<
-@@ -339,7 +339,9 @@ install: $(CONFIGURE) $(addprefix $(obj)/, $(image-y))
- sh -x $(srctree)/$(src)/install.sh "$(KERNELRELEASE)" vmlinux System.map "$(INSTALL_PATH)" $<
-
- # anything not in $(targets)
--clean-files += $(image-) $(initrd-) zImage zImage.initrd cuImage.* treeImage.* \
-+clean-files += $(image-) $(initrd-) cuImage.* dtbImage.* treeImage.* \
-+ zImage zImage.initrd zImage.chrp zImage.coff zImage.holly \
-+ zImage.iseries zImage.miboot zImage.pmac zImage.pseries \
- otheros.bld *.dtb
-
- # clean up files cached by wrapper
-diff --git a/arch/powerpc/boot/dts/mpc8377_mds.dts b/arch/powerpc/boot/dts/mpc8377_mds.dts
-index 1e7802c..fea5925 100644
---- a/arch/powerpc/boot/dts/mpc8377_mds.dts
-+++ b/arch/powerpc/boot/dts/mpc8377_mds.dts
-@@ -271,27 +271,35 @@
- dma@82a8 {
- #address-cells = <1>;
- #size-cells = <1>;
-- compatible = "fsl,mpc8349-dma";
-+ compatible = "fsl,mpc8377-dma", "fsl,elo-dma";
- reg = <0x82a8 4>;
- ranges = <0 0x8100 0x1a8>;
- interrupt-parent = <&ipic>;
- interrupts = <0x47 8>;
- cell-index = <0>;
- dma-channel@0 {
-- compatible = "fsl,mpc8349-dma-channel";
-+ compatible = "fsl,mpc8377-dma-channel", "fsl,elo-dma-channel";
- reg = <0 0x80>;
-+ interrupt-parent = <&ipic>;
-+ interrupts = <0x47 8>;
- };
- dma-channel@80 {
-- compatible = "fsl,mpc8349-dma-channel";
-+ compatible = "fsl,mpc8377-dma-channel", "fsl,elo-dma-channel";
- reg = <0x80 0x80>;
-+ interrupt-parent = <&ipic>;
-+ interrupts = <0x47 8>;
- };
- dma-channel@100 {
-- compatible = "fsl,mpc8349-dma-channel";
-+ compatible = "fsl,mpc8377-dma-channel", "fsl,elo-dma-channel";
- reg = <0x100 0x80>;
-+ interrupt-parent = <&ipic>;
-+ interrupts = <0x47 8>;
- };
- dma-channel@180 {
-- compatible = "fsl,mpc8349-dma-channel";
-+ compatible = "fsl,mpc8377-dma-channel", "fsl,elo-dma-channel";
- reg = <0x180 0x28>;
-+ interrupt-parent = <&ipic>;
-+ interrupts = <0x47 8>;
- };
- };
-
-diff --git a/arch/powerpc/configs/chrp32_defconfig b/arch/powerpc/configs/chrp32_defconfig
-index d7fd298..05360d4 100644
---- a/arch/powerpc/configs/chrp32_defconfig
-+++ b/arch/powerpc/configs/chrp32_defconfig
-@@ -1,7 +1,7 @@
- #
- # Automatically generated make config: don't edit
--# Linux kernel version: 2.6.25-rc6
--# Thu Mar 27 13:55:37 2008
-+# Linux kernel version: 2.6.26-rc3
-+# Tue May 20 20:00:44 2008
- #
- # CONFIG_PPC64 is not set
-
-@@ -32,6 +32,8 @@ CONFIG_GENERIC_CLOCKEVENTS=y
- CONFIG_GENERIC_HARDIRQS=y
- # CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
- CONFIG_IRQ_PER_CPU=y
-+CONFIG_STACKTRACE_SUPPORT=y
-+CONFIG_LOCKDEP_SUPPORT=y
- CONFIG_RWSEM_XCHGADD_ALGORITHM=y
- CONFIG_ARCH_HAS_ILOG2_U32=y
- CONFIG_GENERIC_HWEIGHT=y
-@@ -88,6 +90,7 @@ CONFIG_INITRAMFS_SOURCE=""
- CONFIG_SYSCTL=y
- # CONFIG_EMBEDDED is not set
- CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_SYSCTL_SYSCALL_CHECK=y
- CONFIG_KALLSYMS=y
- # CONFIG_KALLSYMS_ALL is not set
- # CONFIG_KALLSYMS_EXTRA_PASS is not set
-@@ -95,6 +98,7 @@ CONFIG_HOTPLUG=y
- CONFIG_PRINTK=y
- CONFIG_BUG=y
- CONFIG_ELF_CORE=y
-+CONFIG_PCSPKR_PLATFORM=y
- # CONFIG_COMPAT_BRK is not set
- CONFIG_BASE_FULL=y
- CONFIG_FUTEX=y
-@@ -115,12 +119,14 @@ CONFIG_HAVE_OPROFILE=y
- # CONFIG_KPROBES is not set
- CONFIG_HAVE_KPROBES=y
- CONFIG_HAVE_KRETPROBES=y
-+# CONFIG_HAVE_DMA_ATTRS is not set
- CONFIG_PROC_PAGE_MONITOR=y
- CONFIG_SLABINFO=y
- CONFIG_RT_MUTEXES=y
- # CONFIG_TINY_SHMEM is not set
- CONFIG_BASE_SMALL=0
- CONFIG_MODULES=y
-+# CONFIG_MODULE_FORCE_LOAD is not set
- CONFIG_MODULE_UNLOAD=y
- CONFIG_MODULE_FORCE_UNLOAD=y
- # CONFIG_MODVERSIONS is not set
-@@ -217,11 +223,13 @@ CONFIG_FLATMEM=y
- CONFIG_FLAT_NODE_MEM_MAP=y
- # CONFIG_SPARSEMEM_STATIC is not set
- # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_PAGEFLAGS_EXTENDED=y
- CONFIG_SPLIT_PTLOCK_CPUS=4
- # CONFIG_RESOURCES_64BIT is not set
- CONFIG_ZONE_DMA_FLAG=1
- CONFIG_BOUNCE=y
- CONFIG_VIRT_TO_BUS=y
-+CONFIG_FORCE_MAX_ZONEORDER=11
- CONFIG_PROC_DEVICETREE=y
- # CONFIG_CMDLINE_BOOL is not set
- # CONFIG_PM is not set
-@@ -245,6 +253,7 @@ CONFIG_ARCH_SUPPORTS_MSI=y
- # CONFIG_PCI_DEBUG is not set
- # CONFIG_PCCARD is not set
- # CONFIG_HOTPLUG_PCI is not set
-+# CONFIG_HAS_RAPIDIO is not set
-
- #
- # Advanced setup
-@@ -254,11 +263,11 @@ CONFIG_ARCH_SUPPORTS_MSI=y
- #
- # Default settings for advanced configuration options are used
- #
--CONFIG_HIGHMEM_START=0xfe000000
- CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_PAGE_OFFSET=0xc0000000
- CONFIG_KERNEL_START=0xc0000000
-+CONFIG_PHYSICAL_START=0x00000000
- CONFIG_TASK_SIZE=0xc0000000
--CONFIG_BOOT_LOAD=0x00800000
-
- #
- # Networking
-@@ -299,8 +308,6 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
- # CONFIG_TCP_MD5SIG is not set
- # CONFIG_IP_VS is not set
- # CONFIG_IPV6 is not set
--# CONFIG_INET6_XFRM_TUNNEL is not set
--# CONFIG_INET6_TUNNEL is not set
- # CONFIG_NETWORK_SECMARK is not set
- CONFIG_NETFILTER=y
- # CONFIG_NETFILTER_DEBUG is not set
-@@ -398,6 +405,7 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y
- # CONFIG_CONNECTOR is not set
- # CONFIG_MTD is not set
- CONFIG_OF_DEVICE=y
-+CONFIG_OF_I2C=y
- # CONFIG_PARPORT is not set
- # CONFIG_PNP is not set
- CONFIG_BLK_DEV=y
-@@ -484,22 +492,8 @@ CONFIG_BLK_DEV_SL82C105=y
- # CONFIG_BLK_DEV_TRM290 is not set
- CONFIG_BLK_DEV_VIA82CXXX=y
- # CONFIG_BLK_DEV_TC86C001 is not set
--
--#
--# Other IDE chipsets support
--#
--
--#
--# Note: most of these also require special kernel boot parameters
--#
--# CONFIG_BLK_DEV_4DRIVES is not set
--# CONFIG_BLK_DEV_ALI14XX is not set
--# CONFIG_BLK_DEV_DTC2278 is not set
--# CONFIG_BLK_DEV_HT6560B is not set
--# CONFIG_BLK_DEV_QD65XX is not set
--# CONFIG_BLK_DEV_UMC8672 is not set
- CONFIG_BLK_DEV_IDEDMA=y
--CONFIG_IDE_ARCH_OBSOLETE_INIT=y
-+# CONFIG_BLK_DEV_HD_ONLY is not set
- # CONFIG_BLK_DEV_HD is not set
-
- #
-@@ -641,7 +635,6 @@ CONFIG_DE4X5=y
- # CONFIG_IBM_NEW_EMAC_EMAC4 is not set
- CONFIG_NET_PCI=y
- CONFIG_PCNET32=y
--# CONFIG_PCNET32_NAPI is not set
- # CONFIG_AMD8111_ETH is not set
- # CONFIG_ADAPTEC_STARFIRE is not set
- # CONFIG_AC3200 is not set
-@@ -684,7 +677,6 @@ CONFIG_NETDEV_1000=y
- # CONFIG_SIS190 is not set
- # CONFIG_SKGE is not set
- # CONFIG_SKY2 is not set
--# CONFIG_SK98LIN is not set
- # CONFIG_VIA_VELOCITY is not set
- # CONFIG_TIGON3 is not set
- # CONFIG_BNX2 is not set
-@@ -703,6 +695,7 @@ CONFIG_NETDEV_10000=y
- # CONFIG_MLX4_CORE is not set
- # CONFIG_TEHUTI is not set
- # CONFIG_BNX2X is not set
-+# CONFIG_SFC is not set
- # CONFIG_TR is not set
-
- #
-@@ -710,6 +703,7 @@ CONFIG_NETDEV_10000=y
- #
- # CONFIG_WLAN_PRE80211 is not set
- # CONFIG_WLAN_80211 is not set
-+# CONFIG_IWLWIFI_LEDS is not set
-
- #
- # USB Network Adapters
-@@ -813,6 +807,7 @@ CONFIG_VT=y
- CONFIG_VT_CONSOLE=y
- CONFIG_HW_CONSOLE=y
- # CONFIG_VT_HW_CONSOLE_BINDING is not set
-+CONFIG_DEVKMEM=y
- # CONFIG_SERIAL_NONSTANDARD is not set
- # CONFIG_NOZOMI is not set
-
-@@ -853,13 +848,7 @@ CONFIG_DEVPORT=y
- CONFIG_I2C=y
- CONFIG_I2C_BOARDINFO=y
- # CONFIG_I2C_CHARDEV is not set
--
--#
--# I2C Algorithms
--#
- CONFIG_I2C_ALGOBIT=y
--# CONFIG_I2C_ALGOPCF is not set
--# CONFIG_I2C_ALGOPCA is not set
-
- #
- # I2C Hardware Bus support
-@@ -890,6 +879,7 @@ CONFIG_I2C_ALGOBIT=y
- # CONFIG_I2C_VIAPRO is not set
- # CONFIG_I2C_VOODOO3 is not set
- # CONFIG_I2C_PCA_ISA is not set
-+# CONFIG_I2C_PCA_PLATFORM is not set
-
- #
- # Miscellaneous I2C Chip support
-@@ -899,19 +889,13 @@ CONFIG_I2C_ALGOBIT=y
- # CONFIG_SENSORS_PCF8574 is not set
- # CONFIG_PCF8575 is not set
- # CONFIG_SENSORS_PCF8591 is not set
--# CONFIG_TPS65010 is not set
- # CONFIG_SENSORS_MAX6875 is not set
- # CONFIG_SENSORS_TSL2550 is not set
- # CONFIG_I2C_DEBUG_CORE is not set
- # CONFIG_I2C_DEBUG_ALGO is not set
- # CONFIG_I2C_DEBUG_BUS is not set
- # CONFIG_I2C_DEBUG_CHIP is not set
--
--#
--# SPI support
--#
- # CONFIG_SPI is not set
--# CONFIG_SPI_MASTER is not set
- # CONFIG_W1 is not set
- # CONFIG_POWER_SUPPLY is not set
- # CONFIG_HWMON is not set
-@@ -928,12 +912,22 @@ CONFIG_SSB_POSSIBLE=y
- # Multifunction device drivers
- #
- # CONFIG_MFD_SM501 is not set
-+# CONFIG_HTC_PASIC3 is not set
-
- #
- # Multimedia devices
- #
-+
-+#
-+# Multimedia core support
-+#
- # CONFIG_VIDEO_DEV is not set
- # CONFIG_DVB_CORE is not set
-+# CONFIG_VIDEO_MEDIA is not set
-+
-+#
-+# Multimedia drivers
-+#
- # CONFIG_DAB is not set
-
- #
-@@ -953,8 +947,8 @@ CONFIG_FB_CFB_IMAGEBLIT=y
- # CONFIG_FB_SYS_FILLRECT is not set
- # CONFIG_FB_SYS_COPYAREA is not set
- # CONFIG_FB_SYS_IMAGEBLIT is not set
-+# CONFIG_FB_FOREIGN_ENDIAN is not set
- # CONFIG_FB_SYS_FOPS is not set
--CONFIG_FB_DEFERRED_IO=y
- # CONFIG_FB_SVGALIB is not set
- CONFIG_FB_MACMODES=y
- CONFIG_FB_BACKLIGHT=y
-@@ -1072,11 +1066,13 @@ CONFIG_USB_DEVICE_CLASS=y
- #
- # USB Host Controller Drivers
- #
-+# CONFIG_USB_C67X00_HCD is not set
- CONFIG_USB_EHCI_HCD=m
- # CONFIG_USB_EHCI_ROOT_HUB_TT is not set
- # CONFIG_USB_EHCI_TT_NEWSCHED is not set
- # CONFIG_USB_EHCI_HCD_PPC_OF is not set
- # CONFIG_USB_ISP116X_HCD is not set
-+# CONFIG_USB_ISP1760_HCD is not set
- CONFIG_USB_OHCI_HCD=y
- # CONFIG_USB_OHCI_HCD_PPC_OF is not set
- # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
-@@ -1112,6 +1108,7 @@ CONFIG_USB_STORAGE=m
- # CONFIG_USB_STORAGE_ALAUDA is not set
- # CONFIG_USB_STORAGE_ONETOUCH is not set
- # CONFIG_USB_STORAGE_KARMA is not set
-+# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
- # CONFIG_USB_LIBUSUAL is not set
-
- #
-@@ -1153,14 +1150,11 @@ CONFIG_USB_MON=y
- # CONFIG_MMC is not set
- # CONFIG_MEMSTICK is not set
- # CONFIG_NEW_LEDS is not set
-+# CONFIG_ACCESSIBILITY is not set
- # CONFIG_INFINIBAND is not set
- # CONFIG_EDAC is not set
- # CONFIG_RTC_CLASS is not set
- # CONFIG_DMADEVICES is not set
--
--#
--# Userspace I/O
--#
- # CONFIG_UIO is not set
-
- #
-@@ -1180,7 +1174,6 @@ CONFIG_FS_MBCACHE=y
- # CONFIG_JFS_FS is not set
- # CONFIG_FS_POSIX_ACL is not set
- # CONFIG_XFS_FS is not set
--# CONFIG_GFS2_FS is not set
- # CONFIG_OCFS2_FS is not set
- CONFIG_DNOTIFY=y
- CONFIG_INOTIFY=y
-@@ -1314,6 +1307,7 @@ CONFIG_NLS_ISO8859_1=m
- # Library routines
- #
- CONFIG_BITREVERSE=y
-+# CONFIG_GENERIC_FIND_FIRST_BIT is not set
- CONFIG_CRC_CCITT=m
- # CONFIG_CRC16 is not set
- # CONFIG_CRC_ITU_T is not set
-@@ -1334,6 +1328,7 @@ CONFIG_HAVE_LMB=y
- # CONFIG_PRINTK_TIME is not set
- CONFIG_ENABLE_WARN_DEPRECATED=y
- CONFIG_ENABLE_MUST_CHECK=y
-+CONFIG_FRAME_WARN=1024
- CONFIG_MAGIC_SYSRQ=y
- # CONFIG_UNUSED_SYMBOLS is not set
- # CONFIG_DEBUG_FS is not set
-@@ -1344,6 +1339,7 @@ CONFIG_DETECT_SOFTLOCKUP=y
- CONFIG_SCHED_DEBUG=y
- # CONFIG_SCHEDSTATS is not set
- # CONFIG_TIMER_STATS is not set
-+# CONFIG_DEBUG_OBJECTS is not set
- # CONFIG_SLUB_DEBUG_ON is not set
- # CONFIG_SLUB_STATS is not set
- # CONFIG_DEBUG_RT_MUTEXES is not set
-@@ -1357,6 +1353,7 @@ CONFIG_DEBUG_SPINLOCK_SLEEP=y
- CONFIG_DEBUG_BUGVERBOSE=y
- # CONFIG_DEBUG_INFO is not set
- # CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_WRITECOUNT is not set
- # CONFIG_DEBUG_LIST is not set
- # CONFIG_DEBUG_SG is not set
- # CONFIG_BOOT_PRINTK_DELAY is not set
-@@ -1371,6 +1368,7 @@ CONFIG_DEBUGGER=y
- CONFIG_XMON=y
- CONFIG_XMON_DEFAULT=y
- CONFIG_XMON_DISASSEMBLY=y
-+CONFIG_IRQSTACKS=y
- # CONFIG_BDI_SWITCH is not set
- # CONFIG_BOOTX_TEXT is not set
- # CONFIG_PPC_EARLY_DEBUG is not set
-@@ -1382,50 +1380,80 @@ CONFIG_XMON_DISASSEMBLY=y
- # CONFIG_SECURITY is not set
- # CONFIG_SECURITY_FILE_CAPABILITIES is not set
- CONFIG_CRYPTO=y
-+
-+#
-+# Crypto core or helper
-+#
- CONFIG_CRYPTO_ALGAPI=m
- CONFIG_CRYPTO_BLKCIPHER=m
--# CONFIG_CRYPTO_SEQIV is not set
- CONFIG_CRYPTO_MANAGER=m
-+# CONFIG_CRYPTO_GF128MUL is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+# CONFIG_CRYPTO_TEST is not set
-+
-+#
-+# Authenticated Encryption with Associated Data
-+#
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_SEQIV is not set
-+
-+#
-+# Block modes
-+#
-+CONFIG_CRYPTO_CBC=m
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_CTS is not set
-+CONFIG_CRYPTO_ECB=m
-+# CONFIG_CRYPTO_LRW is not set
-+CONFIG_CRYPTO_PCBC=m
-+# CONFIG_CRYPTO_XTS is not set
-+
-+#
-+# Hash modes
-+#
- # CONFIG_CRYPTO_HMAC is not set
- # CONFIG_CRYPTO_XCBC is not set
--# CONFIG_CRYPTO_NULL is not set
-+
-+#
-+# Digest
-+#
-+# CONFIG_CRYPTO_CRC32C is not set
- # CONFIG_CRYPTO_MD4 is not set
- # CONFIG_CRYPTO_MD5 is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
- CONFIG_CRYPTO_SHA1=m
- # CONFIG_CRYPTO_SHA256 is not set
- # CONFIG_CRYPTO_SHA512 is not set
--# CONFIG_CRYPTO_WP512 is not set
- # CONFIG_CRYPTO_TGR192 is not set
--# CONFIG_CRYPTO_GF128MUL is not set
--CONFIG_CRYPTO_ECB=m
--CONFIG_CRYPTO_CBC=m
--CONFIG_CRYPTO_PCBC=m
--# CONFIG_CRYPTO_LRW is not set
--# CONFIG_CRYPTO_XTS is not set
--# CONFIG_CRYPTO_CTR is not set
--# CONFIG_CRYPTO_GCM is not set
--# CONFIG_CRYPTO_CCM is not set
--# CONFIG_CRYPTO_CRYPTD is not set
--# CONFIG_CRYPTO_DES is not set
--# CONFIG_CRYPTO_FCRYPT is not set
--# CONFIG_CRYPTO_BLOWFISH is not set
--# CONFIG_CRYPTO_TWOFISH is not set
--# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+
-+#
-+# Ciphers
-+#
- # CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+CONFIG_CRYPTO_ARC4=m
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
- # CONFIG_CRYPTO_CAST5 is not set
- # CONFIG_CRYPTO_CAST6 is not set
--# CONFIG_CRYPTO_TEA is not set
--CONFIG_CRYPTO_ARC4=m
-+# CONFIG_CRYPTO_DES is not set
-+# CONFIG_CRYPTO_FCRYPT is not set
- # CONFIG_CRYPTO_KHAZAD is not set
--# CONFIG_CRYPTO_ANUBIS is not set
--# CONFIG_CRYPTO_SEED is not set
- # CONFIG_CRYPTO_SALSA20 is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+
-+#
-+# Compression
-+#
- # CONFIG_CRYPTO_DEFLATE is not set
--# CONFIG_CRYPTO_MICHAEL_MIC is not set
--# CONFIG_CRYPTO_CRC32C is not set
--# CONFIG_CRYPTO_CAMELLIA is not set
--# CONFIG_CRYPTO_TEST is not set
--# CONFIG_CRYPTO_AUTHENC is not set
- # CONFIG_CRYPTO_LZO is not set
- # CONFIG_CRYPTO_HW is not set
- # CONFIG_PPC_CLOCK is not set
-+# CONFIG_VIRTUALIZATION is not set
-diff --git a/arch/powerpc/configs/g5_defconfig b/arch/powerpc/configs/g5_defconfig
-index 88338a9..db34909 100644
---- a/arch/powerpc/configs/g5_defconfig
-+++ b/arch/powerpc/configs/g5_defconfig
-@@ -1,7 +1,7 @@
- #
- # Automatically generated make config: don't edit
--# Linux kernel version: 2.6.25-rc6
--# Thu Mar 27 13:55:43 2008
-+# Linux kernel version: 2.6.26-rc3
-+# Tue May 20 20:01:18 2008
- #
- CONFIG_PPC64=y
-
-@@ -29,6 +29,9 @@ CONFIG_GENERIC_CLOCKEVENTS=y
- CONFIG_GENERIC_HARDIRQS=y
- CONFIG_HAVE_SETUP_PER_CPU_AREA=y
- CONFIG_IRQ_PER_CPU=y
-+CONFIG_STACKTRACE_SUPPORT=y
-+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
-+CONFIG_LOCKDEP_SUPPORT=y
- CONFIG_RWSEM_XCHGADD_ALGORITHM=y
- CONFIG_ARCH_HAS_ILOG2_U32=y
- CONFIG_ARCH_HAS_ILOG2_U64=y
-@@ -91,6 +94,7 @@ CONFIG_CC_OPTIMIZE_FOR_SIZE=y
- CONFIG_SYSCTL=y
- # CONFIG_EMBEDDED is not set
- CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_SYSCTL_SYSCALL_CHECK=y
- CONFIG_KALLSYMS=y
- # CONFIG_KALLSYMS_ALL is not set
- # CONFIG_KALLSYMS_EXTRA_PASS is not set
-@@ -119,12 +123,14 @@ CONFIG_HAVE_OPROFILE=y
- # CONFIG_KPROBES is not set
- CONFIG_HAVE_KPROBES=y
- CONFIG_HAVE_KRETPROBES=y
-+# CONFIG_HAVE_DMA_ATTRS is not set
- CONFIG_PROC_PAGE_MONITOR=y
- CONFIG_SLABINFO=y
- CONFIG_RT_MUTEXES=y
- # CONFIG_TINY_SHMEM is not set
- CONFIG_BASE_SMALL=0
- CONFIG_MODULES=y
-+# CONFIG_MODULE_FORCE_LOAD is not set
- CONFIG_MODULE_UNLOAD=y
- # CONFIG_MODULE_FORCE_UNLOAD is not set
- CONFIG_MODVERSIONS=y
-@@ -165,11 +171,11 @@ CONFIG_PPC_PMAC=y
- CONFIG_PPC_PMAC64=y
- # CONFIG_PPC_MAPLE is not set
- # CONFIG_PPC_PASEMI is not set
--# CONFIG_PPC_CELLEB is not set
- # CONFIG_PPC_PS3 is not set
- # CONFIG_PPC_CELL is not set
- # CONFIG_PPC_CELL_NATIVE is not set
- # CONFIG_PPC_IBM_CELL_BLADE is not set
-+# CONFIG_PPC_CELLEB is not set
- # CONFIG_PQ2ADS is not set
- CONFIG_PPC_NATIVE=y
- # CONFIG_IPIC is not set
-@@ -190,6 +196,7 @@ CONFIG_CPU_FREQ_TABLE=y
- CONFIG_CPU_FREQ_STAT=y
- # CONFIG_CPU_FREQ_STAT_DETAILS is not set
- CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
-+# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set
- # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
- # CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
- # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
-@@ -224,7 +231,6 @@ CONFIG_PREEMPT_NONE=y
- CONFIG_BINFMT_ELF=y
- CONFIG_COMPAT_BINFMT_ELF=y
- # CONFIG_BINFMT_MISC is not set
--CONFIG_FORCE_MAX_ZONEORDER=13
- CONFIG_HUGETLB_PAGE_SIZE_VARIABLE=y
- CONFIG_IOMMU_VMERGE=y
- CONFIG_IOMMU_HELPER=y
-@@ -248,12 +254,14 @@ CONFIG_FLATMEM=y
- CONFIG_FLAT_NODE_MEM_MAP=y
- # CONFIG_SPARSEMEM_STATIC is not set
- CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
-+CONFIG_PAGEFLAGS_EXTENDED=y
- CONFIG_SPLIT_PTLOCK_CPUS=4
- CONFIG_RESOURCES_64BIT=y
- CONFIG_ZONE_DMA_FLAG=1
- CONFIG_BOUNCE=y
- # CONFIG_PPC_HAS_HASH_64K is not set
- # CONFIG_PPC_64K_PAGES is not set
-+CONFIG_FORCE_MAX_ZONEORDER=13
- # CONFIG_SCHED_SMT is not set
- CONFIG_PROC_DEVICETREE=y
- # CONFIG_CMDLINE_BOOL is not set
-@@ -278,7 +286,10 @@ CONFIG_PCI_MSI=y
- # CONFIG_PCI_DEBUG is not set
- # CONFIG_PCCARD is not set
- # CONFIG_HOTPLUG_PCI is not set
-+# CONFIG_HAS_RAPIDIO is not set
-+CONFIG_PAGE_OFFSET=0xc000000000000000
- CONFIG_KERNEL_START=0xc000000000000000
-+CONFIG_PHYSICAL_START=0x00000000
-
- #
- # Networking
-@@ -325,8 +336,6 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
- # CONFIG_TCP_MD5SIG is not set
- # CONFIG_IP_VS is not set
- # CONFIG_IPV6 is not set
--# CONFIG_INET6_XFRM_TUNNEL is not set
--# CONFIG_INET6_TUNNEL is not set
- # CONFIG_NETWORK_SECMARK is not set
- CONFIG_NETFILTER=y
- # CONFIG_NETFILTER_DEBUG is not set
-@@ -342,6 +351,7 @@ CONFIG_NF_CONNTRACK=m
- # CONFIG_NF_CT_ACCT is not set
- CONFIG_NF_CONNTRACK_MARK=y
- CONFIG_NF_CONNTRACK_EVENTS=y
-+# CONFIG_NF_CT_PROTO_DCCP is not set
- # CONFIG_NF_CT_PROTO_SCTP is not set
- # CONFIG_NF_CT_PROTO_UDPLITE is not set
- # CONFIG_NF_CONNTRACK_AMANDA is not set
-@@ -418,6 +428,7 @@ CONFIG_FW_LOADER=y
- # CONFIG_CONNECTOR is not set
- # CONFIG_MTD is not set
- CONFIG_OF_DEVICE=y
-+CONFIG_OF_I2C=y
- # CONFIG_PARPORT is not set
- CONFIG_BLK_DEV=y
- # CONFIG_BLK_DEV_FD is not set
-@@ -465,7 +476,6 @@ CONFIG_IDE_PROC_FS=y
- #
- # IDE chipset support/bugfixes
- #
--CONFIG_IDE_GENERIC=y
- # CONFIG_BLK_DEV_PLATFORM is not set
- CONFIG_BLK_DEV_IDEDMA_SFF=y
-
-@@ -506,7 +516,7 @@ CONFIG_BLK_DEV_IDE_PMAC=y
- CONFIG_BLK_DEV_IDE_PMAC_ATA100FIRST=y
- CONFIG_BLK_DEV_IDEDMA_PMAC=y
- CONFIG_BLK_DEV_IDEDMA=y
--CONFIG_IDE_ARCH_OBSOLETE_INIT=y
-+# CONFIG_BLK_DEV_HD_ONLY is not set
- # CONFIG_BLK_DEV_HD is not set
-
- #
-@@ -584,61 +594,10 @@ CONFIG_SCSI_LOWLEVEL=y
- # CONFIG_SCSI_SRP is not set
- CONFIG_ATA=y
- # CONFIG_ATA_NONSTANDARD is not set
-+CONFIG_SATA_PMP=y
- # CONFIG_SATA_AHCI is not set
--CONFIG_SATA_SVW=y
--# CONFIG_ATA_PIIX is not set
--# CONFIG_SATA_MV is not set
--# CONFIG_SATA_NV is not set
--# CONFIG_PDC_ADMA is not set
--# CONFIG_SATA_QSTOR is not set
--# CONFIG_SATA_PROMISE is not set
--# CONFIG_SATA_SX4 is not set
--# CONFIG_SATA_SIL is not set
- # CONFIG_SATA_SIL24 is not set
--# CONFIG_SATA_SIS is not set
--# CONFIG_SATA_ULI is not set
--# CONFIG_SATA_VIA is not set
--# CONFIG_SATA_VITESSE is not set
--# CONFIG_SATA_INIC162X is not set
--# CONFIG_PATA_ALI is not set
--# CONFIG_PATA_AMD is not set
--# CONFIG_PATA_ARTOP is not set
--# CONFIG_PATA_ATIIXP is not set
--# CONFIG_PATA_CMD640_PCI is not set
--# CONFIG_PATA_CMD64X is not set
--# CONFIG_PATA_CS5520 is not set
--# CONFIG_PATA_CS5530 is not set
--# CONFIG_PATA_CYPRESS is not set
--# CONFIG_PATA_EFAR is not set
--# CONFIG_ATA_GENERIC is not set
--# CONFIG_PATA_HPT366 is not set
--# CONFIG_PATA_HPT37X is not set
--# CONFIG_PATA_HPT3X2N is not set
--# CONFIG_PATA_HPT3X3 is not set
--# CONFIG_PATA_IT821X is not set
--# CONFIG_PATA_IT8213 is not set
--# CONFIG_PATA_JMICRON is not set
--# CONFIG_PATA_TRIFLEX is not set
--# CONFIG_PATA_MARVELL is not set
--# CONFIG_PATA_MPIIX is not set
--# CONFIG_PATA_OLDPIIX is not set
--# CONFIG_PATA_NETCELL is not set
--# CONFIG_PATA_NINJA32 is not set
--# CONFIG_PATA_NS87410 is not set
--# CONFIG_PATA_NS87415 is not set
--# CONFIG_PATA_OPTI is not set
--# CONFIG_PATA_OPTIDMA is not set
--# CONFIG_PATA_PDC_OLD is not set
--# CONFIG_PATA_RADISYS is not set
--# CONFIG_PATA_RZ1000 is not set
--# CONFIG_PATA_SC1200 is not set
--# CONFIG_PATA_SERVERWORKS is not set
--# CONFIG_PATA_PDC2027X is not set
--# CONFIG_PATA_SIL680 is not set
--# CONFIG_PATA_SIS is not set
--# CONFIG_PATA_VIA is not set
--# CONFIG_PATA_WINBOND is not set
--# CONFIG_PATA_PLATFORM is not set
-+# CONFIG_ATA_SFF is not set
- CONFIG_MD=y
- CONFIG_BLK_DEV_MD=y
- CONFIG_MD_LINEAR=y
-@@ -740,7 +699,6 @@ CONFIG_E1000=y
- # CONFIG_SIS190 is not set
- # CONFIG_SKGE is not set
- # CONFIG_SKY2 is not set
--# CONFIG_SK98LIN is not set
- # CONFIG_VIA_VELOCITY is not set
- CONFIG_TIGON3=y
- # CONFIG_BNX2 is not set
-@@ -755,10 +713,10 @@ CONFIG_NETDEV_10000=y
- # CONFIG_MYRI10GE is not set
- # CONFIG_NETXEN_NIC is not set
- # CONFIG_NIU is not set
--# CONFIG_PASEMI_MAC is not set
- # CONFIG_MLX4_CORE is not set
- # CONFIG_TEHUTI is not set
- # CONFIG_BNX2X is not set
-+# CONFIG_SFC is not set
- CONFIG_TR=y
- CONFIG_IBMOL=y
- # CONFIG_3C359 is not set
-@@ -769,6 +727,7 @@ CONFIG_IBMOL=y
- #
- # CONFIG_WLAN_PRE80211 is not set
- # CONFIG_WLAN_80211 is not set
-+# CONFIG_IWLWIFI_LEDS is not set
-
- #
- # USB Network Adapters
-@@ -865,6 +824,7 @@ CONFIG_VT=y
- CONFIG_VT_CONSOLE=y
- CONFIG_HW_CONSOLE=y
- # CONFIG_VT_HW_CONSOLE_BINDING is not set
-+CONFIG_DEVKMEM=y
- # CONFIG_SERIAL_NONSTANDARD is not set
- # CONFIG_NOZOMI is not set
-
-@@ -895,13 +855,7 @@ CONFIG_DEVPORT=y
- CONFIG_I2C=y
- CONFIG_I2C_BOARDINFO=y
- CONFIG_I2C_CHARDEV=y
--
--#
--# I2C Algorithms
--#
- CONFIG_I2C_ALGOBIT=y
--# CONFIG_I2C_ALGOPCF is not set
--# CONFIG_I2C_ALGOPCA is not set
-
- #
- # I2C Hardware Bus support
-@@ -930,6 +884,7 @@ CONFIG_I2C_POWERMAC=y
- # CONFIG_I2C_VIA is not set
- # CONFIG_I2C_VIAPRO is not set
- # CONFIG_I2C_VOODOO3 is not set
-+# CONFIG_I2C_PCA_PLATFORM is not set
-
- #
- # Miscellaneous I2C Chip support
-@@ -939,19 +894,13 @@ CONFIG_I2C_POWERMAC=y
- # CONFIG_SENSORS_PCF8574 is not set
- # CONFIG_PCF8575 is not set
- # CONFIG_SENSORS_PCF8591 is not set
--# CONFIG_TPS65010 is not set
- # CONFIG_SENSORS_MAX6875 is not set
- # CONFIG_SENSORS_TSL2550 is not set
- # CONFIG_I2C_DEBUG_CORE is not set
- # CONFIG_I2C_DEBUG_ALGO is not set
- # CONFIG_I2C_DEBUG_BUS is not set
- # CONFIG_I2C_DEBUG_CHIP is not set
--
--#
--# SPI support
--#
- # CONFIG_SPI is not set
--# CONFIG_SPI_MASTER is not set
- # CONFIG_W1 is not set
- # CONFIG_POWER_SUPPLY is not set
- # CONFIG_HWMON is not set
-@@ -968,12 +917,22 @@ CONFIG_SSB_POSSIBLE=y
- # Multifunction device drivers
- #
- # CONFIG_MFD_SM501 is not set
-+# CONFIG_HTC_PASIC3 is not set
-
- #
- # Multimedia devices
- #
-+
-+#
-+# Multimedia core support
-+#
- # CONFIG_VIDEO_DEV is not set
- # CONFIG_DVB_CORE is not set
-+# CONFIG_VIDEO_MEDIA is not set
-+
-+#
-+# Multimedia drivers
-+#
- CONFIG_DAB=y
- # CONFIG_USB_DABUSB is not set
-
-@@ -995,8 +954,8 @@ CONFIG_FB_CFB_IMAGEBLIT=y
- # CONFIG_FB_SYS_FILLRECT is not set
- # CONFIG_FB_SYS_COPYAREA is not set
- # CONFIG_FB_SYS_IMAGEBLIT is not set
-+# CONFIG_FB_FOREIGN_ENDIAN is not set
- # CONFIG_FB_SYS_FOPS is not set
--CONFIG_FB_DEFERRED_IO=y
- # CONFIG_FB_SVGALIB is not set
- CONFIG_FB_MACMODES=y
- CONFIG_FB_BACKLIGHT=y
-@@ -1112,6 +1071,7 @@ CONFIG_SND_VERBOSE_PROCFS=y
- # CONFIG_SND_AU8810 is not set
- # CONFIG_SND_AU8820 is not set
- # CONFIG_SND_AU8830 is not set
-+# CONFIG_SND_AW2 is not set
- # CONFIG_SND_AZT3328 is not set
- # CONFIG_SND_BT87X is not set
- # CONFIG_SND_CA0106 is not set
-@@ -1198,11 +1158,11 @@ CONFIG_SND_USB_AUDIO=m
- # CONFIG_SND_SOC is not set
-
- #
--# SoC Audio support for SuperH
-+# ALSA SoC audio for Freescale SOCs
- #
-
- #
--# ALSA SoC audio for Freescale SOCs
-+# SoC Audio for the Texas Instruments OMAP
- #
-
- #
-@@ -1222,6 +1182,7 @@ CONFIG_USB_HID=y
- CONFIG_HID_FF=y
- CONFIG_HID_PID=y
- CONFIG_LOGITECH_FF=y
-+# CONFIG_LOGIRUMBLEPAD2_FF is not set
- # CONFIG_PANTHERLORD_FF is not set
- CONFIG_THRUSTMASTER_FF=y
- # CONFIG_ZEROPLUS_FF is not set
-@@ -1245,11 +1206,13 @@ CONFIG_USB_DEVICE_CLASS=y
- #
- # USB Host Controller Drivers
- #
-+# CONFIG_USB_C67X00_HCD is not set
- CONFIG_USB_EHCI_HCD=y
- # CONFIG_USB_EHCI_ROOT_HUB_TT is not set
- # CONFIG_USB_EHCI_TT_NEWSCHED is not set
- # CONFIG_USB_EHCI_HCD_PPC_OF is not set
- # CONFIG_USB_ISP116X_HCD is not set
-+# CONFIG_USB_ISP1760_HCD is not set
- CONFIG_USB_OHCI_HCD=y
- CONFIG_USB_OHCI_HCD_PPC_OF=y
- CONFIG_USB_OHCI_HCD_PPC_OF_BE=y
-@@ -1288,6 +1251,7 @@ CONFIG_USB_STORAGE_JUMPSHOT=y
- # CONFIG_USB_STORAGE_ALAUDA is not set
- # CONFIG_USB_STORAGE_ONETOUCH is not set
- # CONFIG_USB_STORAGE_KARMA is not set
-+# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
- # CONFIG_USB_LIBUSUAL is not set
-
- #
-@@ -1342,9 +1306,11 @@ CONFIG_USB_SERIAL_KOBIL_SCT=m
- CONFIG_USB_SERIAL_MCT_U232=m
- # CONFIG_USB_SERIAL_MOS7720 is not set
- # CONFIG_USB_SERIAL_MOS7840 is not set
-+# CONFIG_USB_SERIAL_MOTOROLA is not set
- # CONFIG_USB_SERIAL_NAVMAN is not set
- CONFIG_USB_SERIAL_PL2303=m
- # CONFIG_USB_SERIAL_OTI6858 is not set
-+# CONFIG_USB_SERIAL_SPCP8X5 is not set
- # CONFIG_USB_SERIAL_HP4X is not set
- CONFIG_USB_SERIAL_SAFE=m
- CONFIG_USB_SERIAL_SAFE_PADDED=y
-@@ -1383,14 +1349,11 @@ CONFIG_USB_APPLEDISPLAY=m
- # CONFIG_MMC is not set
- # CONFIG_MEMSTICK is not set
- # CONFIG_NEW_LEDS is not set
-+# CONFIG_ACCESSIBILITY is not set
- # CONFIG_INFINIBAND is not set
- # CONFIG_EDAC is not set
- # CONFIG_RTC_CLASS is not set
- # CONFIG_DMADEVICES is not set
--
--#
--# Userspace I/O
--#
- # CONFIG_UIO is not set
-
- #
-@@ -1420,9 +1383,9 @@ CONFIG_REISERFS_FS_SECURITY=y
- CONFIG_FS_POSIX_ACL=y
- CONFIG_XFS_FS=m
- # CONFIG_XFS_QUOTA is not set
--CONFIG_XFS_SECURITY=y
- CONFIG_XFS_POSIX_ACL=y
- # CONFIG_XFS_RT is not set
-+# CONFIG_XFS_DEBUG is not set
- # CONFIG_GFS2_FS is not set
- # CONFIG_OCFS2_FS is not set
- CONFIG_DNOTIFY=y
-@@ -1488,13 +1451,11 @@ CONFIG_NFS_FS=y
- CONFIG_NFS_V3=y
- CONFIG_NFS_V3_ACL=y
- CONFIG_NFS_V4=y
--# CONFIG_NFS_DIRECTIO is not set
- CONFIG_NFSD=y
- CONFIG_NFSD_V2_ACL=y
- CONFIG_NFSD_V3=y
- CONFIG_NFSD_V3_ACL=y
- CONFIG_NFSD_V4=y
--CONFIG_NFSD_TCP=y
- CONFIG_LOCKD=y
- CONFIG_LOCKD_V4=y
- CONFIG_EXPORTFS=y
-@@ -1583,9 +1544,10 @@ CONFIG_NLS_UTF8=y
- # Library routines
- #
- CONFIG_BITREVERSE=y
-+# CONFIG_GENERIC_FIND_FIRST_BIT is not set
- CONFIG_CRC_CCITT=m
- # CONFIG_CRC16 is not set
--# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC_ITU_T=m
- CONFIG_CRC32=y
- # CONFIG_CRC7 is not set
- CONFIG_LIBCRC32C=m
-@@ -1603,6 +1565,7 @@ CONFIG_HAVE_LMB=y
- # CONFIG_PRINTK_TIME is not set
- CONFIG_ENABLE_WARN_DEPRECATED=y
- CONFIG_ENABLE_MUST_CHECK=y
-+CONFIG_FRAME_WARN=2048
- CONFIG_MAGIC_SYSRQ=y
- # CONFIG_UNUSED_SYMBOLS is not set
- CONFIG_DEBUG_FS=y
-@@ -1613,18 +1576,23 @@ CONFIG_DETECT_SOFTLOCKUP=y
- CONFIG_SCHED_DEBUG=y
- # CONFIG_SCHEDSTATS is not set
- # CONFIG_TIMER_STATS is not set
-+# CONFIG_DEBUG_OBJECTS is not set
- # CONFIG_SLUB_DEBUG_ON is not set
- # CONFIG_SLUB_STATS is not set
- # CONFIG_DEBUG_RT_MUTEXES is not set
- # CONFIG_RT_MUTEX_TESTER is not set
- # CONFIG_DEBUG_SPINLOCK is not set
- CONFIG_DEBUG_MUTEXES=y
-+# CONFIG_DEBUG_LOCK_ALLOC is not set
-+# CONFIG_PROVE_LOCKING is not set
-+# CONFIG_LOCK_STAT is not set
- # CONFIG_DEBUG_SPINLOCK_SLEEP is not set
- # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
- # CONFIG_DEBUG_KOBJECT is not set
- CONFIG_DEBUG_BUGVERBOSE=y
- # CONFIG_DEBUG_INFO is not set
- # CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_WRITECOUNT is not set
- # CONFIG_DEBUG_LIST is not set
- # CONFIG_DEBUG_SG is not set
- # CONFIG_BOOT_PRINTK_DELAY is not set
-@@ -1648,53 +1616,83 @@ CONFIG_BOOTX_TEXT=y
- # CONFIG_SECURITY is not set
- # CONFIG_SECURITY_FILE_CAPABILITIES is not set
- CONFIG_CRYPTO=y
-+
-+#
-+# Crypto core or helper
-+#
- CONFIG_CRYPTO_ALGAPI=y
- CONFIG_CRYPTO_AEAD=m
- CONFIG_CRYPTO_BLKCIPHER=y
--# CONFIG_CRYPTO_SEQIV is not set
- CONFIG_CRYPTO_HASH=y
- CONFIG_CRYPTO_MANAGER=y
-+# CONFIG_CRYPTO_GF128MUL is not set
-+CONFIG_CRYPTO_NULL=m
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_AUTHENC=m
-+CONFIG_CRYPTO_TEST=m
-+
-+#
-+# Authenticated Encryption with Associated Data
-+#
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_SEQIV is not set
-+
-+#
-+# Block modes
-+#
-+CONFIG_CRYPTO_CBC=y
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_CTS is not set
-+CONFIG_CRYPTO_ECB=m
-+# CONFIG_CRYPTO_LRW is not set
-+CONFIG_CRYPTO_PCBC=m
-+# CONFIG_CRYPTO_XTS is not set
-+
-+#
-+# Hash modes
-+#
- CONFIG_CRYPTO_HMAC=y
- # CONFIG_CRYPTO_XCBC is not set
--CONFIG_CRYPTO_NULL=m
-+
-+#
-+# Digest
-+#
-+CONFIG_CRYPTO_CRC32C=m
- CONFIG_CRYPTO_MD4=m
- CONFIG_CRYPTO_MD5=y
-+CONFIG_CRYPTO_MICHAEL_MIC=m
- CONFIG_CRYPTO_SHA1=m
- CONFIG_CRYPTO_SHA256=m
- CONFIG_CRYPTO_SHA512=m
--CONFIG_CRYPTO_WP512=m
- # CONFIG_CRYPTO_TGR192 is not set
--# CONFIG_CRYPTO_GF128MUL is not set
--CONFIG_CRYPTO_ECB=m
--CONFIG_CRYPTO_CBC=y
--CONFIG_CRYPTO_PCBC=m
--# CONFIG_CRYPTO_LRW is not set
--# CONFIG_CRYPTO_XTS is not set
--# CONFIG_CRYPTO_CTR is not set
--# CONFIG_CRYPTO_GCM is not set
--# CONFIG_CRYPTO_CCM is not set
--# CONFIG_CRYPTO_CRYPTD is not set
--CONFIG_CRYPTO_DES=y
--# CONFIG_CRYPTO_FCRYPT is not set
--CONFIG_CRYPTO_BLOWFISH=m
--CONFIG_CRYPTO_TWOFISH=m
--CONFIG_CRYPTO_TWOFISH_COMMON=m
--CONFIG_CRYPTO_SERPENT=m
-+CONFIG_CRYPTO_WP512=m
-+
-+#
-+# Ciphers
-+#
- CONFIG_CRYPTO_AES=m
-+CONFIG_CRYPTO_ANUBIS=m
-+CONFIG_CRYPTO_ARC4=m
-+CONFIG_CRYPTO_BLOWFISH=m
-+# CONFIG_CRYPTO_CAMELLIA is not set
- CONFIG_CRYPTO_CAST5=m
- CONFIG_CRYPTO_CAST6=m
--CONFIG_CRYPTO_TEA=m
--CONFIG_CRYPTO_ARC4=m
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
- CONFIG_CRYPTO_KHAZAD=m
--CONFIG_CRYPTO_ANUBIS=m
--# CONFIG_CRYPTO_SEED is not set
- # CONFIG_CRYPTO_SALSA20 is not set
-+# CONFIG_CRYPTO_SEED is not set
-+CONFIG_CRYPTO_SERPENT=m
-+CONFIG_CRYPTO_TEA=m
-+CONFIG_CRYPTO_TWOFISH=m
-+CONFIG_CRYPTO_TWOFISH_COMMON=m
-+
-+#
-+# Compression
-+#
- CONFIG_CRYPTO_DEFLATE=m
--CONFIG_CRYPTO_MICHAEL_MIC=m
--CONFIG_CRYPTO_CRC32C=m
--# CONFIG_CRYPTO_CAMELLIA is not set
--CONFIG_CRYPTO_TEST=m
--CONFIG_CRYPTO_AUTHENC=m
- # CONFIG_CRYPTO_LZO is not set
- # CONFIG_CRYPTO_HW is not set
- # CONFIG_PPC_CLOCK is not set
-+# CONFIG_VIRTUALIZATION is not set
-diff --git a/arch/powerpc/configs/iseries_defconfig b/arch/powerpc/configs/iseries_defconfig
-index b3128fb..63f0bdb 100644
---- a/arch/powerpc/configs/iseries_defconfig
-+++ b/arch/powerpc/configs/iseries_defconfig
-@@ -1,7 +1,7 @@
- #
- # Automatically generated make config: don't edit
--# Linux kernel version: 2.6.25-rc6
--# Thu Mar 27 13:55:45 2008
-+# Linux kernel version: 2.6.26-rc3
-+# Tue May 20 20:01:36 2008
- #
- CONFIG_PPC64=y
-
-@@ -30,6 +30,9 @@ CONFIG_GENERIC_CLOCKEVENTS=y
- CONFIG_GENERIC_HARDIRQS=y
- CONFIG_HAVE_SETUP_PER_CPU_AREA=y
- CONFIG_IRQ_PER_CPU=y
-+CONFIG_STACKTRACE_SUPPORT=y
-+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
-+CONFIG_LOCKDEP_SUPPORT=y
- CONFIG_RWSEM_XCHGADD_ALGORITHM=y
- CONFIG_ARCH_HAS_ILOG2_U32=y
- CONFIG_ARCH_HAS_ILOG2_U64=y
-@@ -91,6 +94,7 @@ CONFIG_CC_OPTIMIZE_FOR_SIZE=y
- CONFIG_SYSCTL=y
- # CONFIG_EMBEDDED is not set
- CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_SYSCTL_SYSCALL_CHECK=y
- CONFIG_KALLSYMS=y
- # CONFIG_KALLSYMS_ALL is not set
- # CONFIG_KALLSYMS_EXTRA_PASS is not set
-@@ -118,12 +122,14 @@ CONFIG_HAVE_OPROFILE=y
- # CONFIG_KPROBES is not set
- CONFIG_HAVE_KPROBES=y
- CONFIG_HAVE_KRETPROBES=y
-+# CONFIG_HAVE_DMA_ATTRS is not set
- CONFIG_PROC_PAGE_MONITOR=y
- CONFIG_SLABINFO=y
- CONFIG_RT_MUTEXES=y
- # CONFIG_TINY_SHMEM is not set
- CONFIG_BASE_SMALL=0
- CONFIG_MODULES=y
-+# CONFIG_MODULE_FORCE_LOAD is not set
- CONFIG_MODULE_UNLOAD=y
- # CONFIG_MODULE_FORCE_UNLOAD is not set
- CONFIG_MODVERSIONS=y
-@@ -172,11 +178,11 @@ CONFIG_VIOPATH=y
- # CONFIG_PPC_PMAC is not set
- # CONFIG_PPC_MAPLE is not set
- # CONFIG_PPC_PASEMI is not set
--# CONFIG_PPC_CELLEB is not set
- # CONFIG_PPC_PS3 is not set
- # CONFIG_PPC_CELL is not set
- # CONFIG_PPC_CELL_NATIVE is not set
- # CONFIG_PPC_IBM_CELL_BLADE is not set
-+# CONFIG_PPC_CELLEB is not set
- # CONFIG_PQ2ADS is not set
- # CONFIG_IPIC is not set
- # CONFIG_MPIC is not set
-@@ -212,7 +218,6 @@ CONFIG_PREEMPT_NONE=y
- CONFIG_BINFMT_ELF=y
- CONFIG_COMPAT_BINFMT_ELF=y
- # CONFIG_BINFMT_MISC is not set
--CONFIG_FORCE_MAX_ZONEORDER=13
- CONFIG_IOMMU_VMERGE=y
- CONFIG_IOMMU_HELPER=y
- CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-@@ -234,12 +239,14 @@ CONFIG_FLATMEM=y
- CONFIG_FLAT_NODE_MEM_MAP=y
- # CONFIG_SPARSEMEM_STATIC is not set
- CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
-+CONFIG_PAGEFLAGS_EXTENDED=y
- CONFIG_SPLIT_PTLOCK_CPUS=4
- CONFIG_RESOURCES_64BIT=y
- CONFIG_ZONE_DMA_FLAG=1
- CONFIG_BOUNCE=y
- # CONFIG_PPC_HAS_HASH_64K is not set
- # CONFIG_PPC_64K_PAGES is not set
-+CONFIG_FORCE_MAX_ZONEORDER=13
- # CONFIG_SCHED_SMT is not set
- CONFIG_PROC_DEVICETREE=y
- # CONFIG_CMDLINE_BOOL is not set
-@@ -263,7 +270,10 @@ CONFIG_ARCH_SUPPORTS_MSI=y
- # CONFIG_PCI_DEBUG is not set
- # CONFIG_PCCARD is not set
- # CONFIG_HOTPLUG_PCI is not set
-+# CONFIG_HAS_RAPIDIO is not set
-+CONFIG_PAGE_OFFSET=0xc000000000000000
- CONFIG_KERNEL_START=0xc000000000000000
-+CONFIG_PHYSICAL_START=0x00000000
-
- #
- # Networking
-@@ -310,8 +320,6 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
- # CONFIG_TCP_MD5SIG is not set
- # CONFIG_IP_VS is not set
- # CONFIG_IPV6 is not set
--# CONFIG_INET6_XFRM_TUNNEL is not set
--# CONFIG_INET6_TUNNEL is not set
- # CONFIG_NETWORK_SECMARK is not set
- CONFIG_NETFILTER=y
- # CONFIG_NETFILTER_DEBUG is not set
-@@ -327,6 +335,7 @@ CONFIG_NF_CONNTRACK=m
- # CONFIG_NF_CT_ACCT is not set
- CONFIG_NF_CONNTRACK_MARK=y
- CONFIG_NF_CONNTRACK_EVENTS=y
-+# CONFIG_NF_CT_PROTO_DCCP is not set
- # CONFIG_NF_CT_PROTO_SCTP is not set
- # CONFIG_NF_CT_PROTO_UDPLITE is not set
- # CONFIG_NF_CONNTRACK_AMANDA is not set
-@@ -631,7 +640,6 @@ CONFIG_MII=y
- # CONFIG_IBM_NEW_EMAC_EMAC4 is not set
- CONFIG_NET_PCI=y
- CONFIG_PCNET32=y
--CONFIG_PCNET32_NAPI=y
- # CONFIG_AMD8111_ETH is not set
- # CONFIG_ADAPTEC_STARFIRE is not set
- # CONFIG_B44 is not set
-@@ -667,7 +675,6 @@ CONFIG_E1000=m
- # CONFIG_SIS190 is not set
- # CONFIG_SKGE is not set
- # CONFIG_SKY2 is not set
--# CONFIG_SK98LIN is not set
- # CONFIG_VIA_VELOCITY is not set
- # CONFIG_TIGON3 is not set
- # CONFIG_BNX2 is not set
-@@ -682,10 +689,10 @@ CONFIG_NETDEV_10000=y
- # CONFIG_MYRI10GE is not set
- # CONFIG_NETXEN_NIC is not set
- # CONFIG_NIU is not set
--# CONFIG_PASEMI_MAC is not set
- # CONFIG_MLX4_CORE is not set
- # CONFIG_TEHUTI is not set
- # CONFIG_BNX2X is not set
-+# CONFIG_SFC is not set
- CONFIG_TR=y
- CONFIG_IBMOL=y
- # CONFIG_3C359 is not set
-@@ -696,6 +703,7 @@ CONFIG_IBMOL=y
- #
- # CONFIG_WLAN_PRE80211 is not set
- # CONFIG_WLAN_80211 is not set
-+# CONFIG_IWLWIFI_LEDS is not set
- # CONFIG_WAN is not set
- CONFIG_ISERIES_VETH=y
- # CONFIG_FDDI is not set
-@@ -762,6 +770,7 @@ CONFIG_VT=y
- CONFIG_VT_CONSOLE=y
- CONFIG_HW_CONSOLE=y
- # CONFIG_VT_HW_CONSOLE_BINDING is not set
-+CONFIG_DEVKMEM=y
- # CONFIG_SERIAL_NONSTANDARD is not set
- # CONFIG_NOZOMI is not set
-
-@@ -793,12 +802,7 @@ CONFIG_MAX_RAW_DEVS=256
- # CONFIG_TCG_TPM is not set
- CONFIG_DEVPORT=y
- # CONFIG_I2C is not set
--
--#
--# SPI support
--#
- # CONFIG_SPI is not set
--# CONFIG_SPI_MASTER is not set
- # CONFIG_W1 is not set
- # CONFIG_POWER_SUPPLY is not set
- # CONFIG_HWMON is not set
-@@ -815,12 +819,22 @@ CONFIG_SSB_POSSIBLE=y
- # Multifunction device drivers
- #
- # CONFIG_MFD_SM501 is not set
-+# CONFIG_HTC_PASIC3 is not set
-
- #
- # Multimedia devices
- #
-+
-+#
-+# Multimedia core support
-+#
- # CONFIG_VIDEO_DEV is not set
- # CONFIG_DVB_CORE is not set
-+# CONFIG_VIDEO_MEDIA is not set
-+
-+#
-+# Multimedia drivers
-+#
- # CONFIG_DAB is not set
-
- #
-@@ -854,14 +868,11 @@ CONFIG_DUMMY_CONSOLE=y
- # CONFIG_MMC is not set
- # CONFIG_MEMSTICK is not set
- # CONFIG_NEW_LEDS is not set
-+# CONFIG_ACCESSIBILITY is not set
- # CONFIG_INFINIBAND is not set
- # CONFIG_EDAC is not set
- # CONFIG_RTC_CLASS is not set
- # CONFIG_DMADEVICES is not set
--
--#
--# Userspace I/O
--#
- # CONFIG_UIO is not set
-
- #
-@@ -895,9 +906,9 @@ CONFIG_JFS_SECURITY=y
- CONFIG_FS_POSIX_ACL=y
- CONFIG_XFS_FS=m
- # CONFIG_XFS_QUOTA is not set
--CONFIG_XFS_SECURITY=y
- CONFIG_XFS_POSIX_ACL=y
- # CONFIG_XFS_RT is not set
-+# CONFIG_XFS_DEBUG is not set
- CONFIG_GFS2_FS=m
- CONFIG_GFS2_FS_LOCKING_NOLOCK=m
- CONFIG_GFS2_FS_LOCKING_DLM=m
-@@ -966,13 +977,11 @@ CONFIG_NFS_FS=y
- CONFIG_NFS_V3=y
- CONFIG_NFS_V3_ACL=y
- CONFIG_NFS_V4=y
--# CONFIG_NFS_DIRECTIO is not set
- CONFIG_NFSD=m
- CONFIG_NFSD_V2_ACL=y
- CONFIG_NFSD_V3=y
- CONFIG_NFSD_V3_ACL=y
- CONFIG_NFSD_V4=y
--CONFIG_NFSD_TCP=y
- CONFIG_LOCKD=y
- CONFIG_LOCKD_V4=y
- CONFIG_EXPORTFS=m
-@@ -1047,9 +1056,10 @@ CONFIG_DLM=m
- # Library routines
- #
- CONFIG_BITREVERSE=y
-+# CONFIG_GENERIC_FIND_FIRST_BIT is not set
- CONFIG_CRC_CCITT=m
- # CONFIG_CRC16 is not set
--# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC_ITU_T=m
- CONFIG_CRC32=y
- # CONFIG_CRC7 is not set
- CONFIG_LIBCRC32C=m
-@@ -1071,6 +1081,7 @@ CONFIG_HAVE_LMB=y
- # CONFIG_PRINTK_TIME is not set
- CONFIG_ENABLE_WARN_DEPRECATED=y
- CONFIG_ENABLE_MUST_CHECK=y
-+CONFIG_FRAME_WARN=2048
- CONFIG_MAGIC_SYSRQ=y
- # CONFIG_UNUSED_SYMBOLS is not set
- CONFIG_DEBUG_FS=y
-@@ -1081,18 +1092,23 @@ CONFIG_DETECT_SOFTLOCKUP=y
- CONFIG_SCHED_DEBUG=y
- # CONFIG_SCHEDSTATS is not set
- # CONFIG_TIMER_STATS is not set
-+# CONFIG_DEBUG_OBJECTS is not set
- # CONFIG_SLUB_DEBUG_ON is not set
- # CONFIG_SLUB_STATS is not set
- # CONFIG_DEBUG_RT_MUTEXES is not set
- # CONFIG_RT_MUTEX_TESTER is not set
- # CONFIG_DEBUG_SPINLOCK is not set
- # CONFIG_DEBUG_MUTEXES is not set
-+# CONFIG_DEBUG_LOCK_ALLOC is not set
-+# CONFIG_PROVE_LOCKING is not set
-+# CONFIG_LOCK_STAT is not set
- # CONFIG_DEBUG_SPINLOCK_SLEEP is not set
- # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
- # CONFIG_DEBUG_KOBJECT is not set
- CONFIG_DEBUG_BUGVERBOSE=y
- # CONFIG_DEBUG_INFO is not set
- # CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_WRITECOUNT is not set
- # CONFIG_DEBUG_LIST is not set
- # CONFIG_DEBUG_SG is not set
- # CONFIG_BOOT_PRINTK_DELAY is not set
-@@ -1116,53 +1132,83 @@ CONFIG_IRQSTACKS=y
- # CONFIG_SECURITY is not set
- # CONFIG_SECURITY_FILE_CAPABILITIES is not set
- CONFIG_CRYPTO=y
-+
-+#
-+# Crypto core or helper
-+#
- CONFIG_CRYPTO_ALGAPI=y
- CONFIG_CRYPTO_AEAD=m
- CONFIG_CRYPTO_BLKCIPHER=y
--# CONFIG_CRYPTO_SEQIV is not set
- CONFIG_CRYPTO_HASH=y
- CONFIG_CRYPTO_MANAGER=y
-+# CONFIG_CRYPTO_GF128MUL is not set
-+CONFIG_CRYPTO_NULL=m
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_AUTHENC=m
-+CONFIG_CRYPTO_TEST=m
-+
-+#
-+# Authenticated Encryption with Associated Data
-+#
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_SEQIV is not set
-+
-+#
-+# Block modes
-+#
-+CONFIG_CRYPTO_CBC=y
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_CTS is not set
-+CONFIG_CRYPTO_ECB=m
-+# CONFIG_CRYPTO_LRW is not set
-+CONFIG_CRYPTO_PCBC=m
-+# CONFIG_CRYPTO_XTS is not set
-+
-+#
-+# Hash modes
-+#
- CONFIG_CRYPTO_HMAC=y
- # CONFIG_CRYPTO_XCBC is not set
--CONFIG_CRYPTO_NULL=m
-+
-+#
-+# Digest
-+#
-+CONFIG_CRYPTO_CRC32C=m
- CONFIG_CRYPTO_MD4=m
- CONFIG_CRYPTO_MD5=y
-+CONFIG_CRYPTO_MICHAEL_MIC=m
- CONFIG_CRYPTO_SHA1=m
- CONFIG_CRYPTO_SHA256=m
- CONFIG_CRYPTO_SHA512=m
--CONFIG_CRYPTO_WP512=m
- CONFIG_CRYPTO_TGR192=m
--# CONFIG_CRYPTO_GF128MUL is not set
--CONFIG_CRYPTO_ECB=m
--CONFIG_CRYPTO_CBC=y
--CONFIG_CRYPTO_PCBC=m
--# CONFIG_CRYPTO_LRW is not set
--# CONFIG_CRYPTO_XTS is not set
--# CONFIG_CRYPTO_CTR is not set
--# CONFIG_CRYPTO_GCM is not set
--# CONFIG_CRYPTO_CCM is not set
--# CONFIG_CRYPTO_CRYPTD is not set
--CONFIG_CRYPTO_DES=y
--# CONFIG_CRYPTO_FCRYPT is not set
--CONFIG_CRYPTO_BLOWFISH=m
--CONFIG_CRYPTO_TWOFISH=m
--CONFIG_CRYPTO_TWOFISH_COMMON=m
--CONFIG_CRYPTO_SERPENT=m
-+CONFIG_CRYPTO_WP512=m
-+
-+#
-+# Ciphers
-+#
- CONFIG_CRYPTO_AES=m
-+CONFIG_CRYPTO_ANUBIS=m
-+CONFIG_CRYPTO_ARC4=m
-+CONFIG_CRYPTO_BLOWFISH=m
-+# CONFIG_CRYPTO_CAMELLIA is not set
- CONFIG_CRYPTO_CAST5=m
- CONFIG_CRYPTO_CAST6=m
--CONFIG_CRYPTO_TEA=m
--CONFIG_CRYPTO_ARC4=m
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
- CONFIG_CRYPTO_KHAZAD=m
--CONFIG_CRYPTO_ANUBIS=m
--CONFIG_CRYPTO_SEED=m
- # CONFIG_CRYPTO_SALSA20 is not set
-+CONFIG_CRYPTO_SEED=m
-+CONFIG_CRYPTO_SERPENT=m
-+CONFIG_CRYPTO_TEA=m
-+CONFIG_CRYPTO_TWOFISH=m
-+CONFIG_CRYPTO_TWOFISH_COMMON=m
-+
-+#
-+# Compression
-+#
- CONFIG_CRYPTO_DEFLATE=m
--CONFIG_CRYPTO_MICHAEL_MIC=m
--CONFIG_CRYPTO_CRC32C=m
--# CONFIG_CRYPTO_CAMELLIA is not set
--CONFIG_CRYPTO_TEST=m
--CONFIG_CRYPTO_AUTHENC=m
- # CONFIG_CRYPTO_LZO is not set
- # CONFIG_CRYPTO_HW is not set
- # CONFIG_PPC_CLOCK is not set
-+# CONFIG_VIRTUALIZATION is not set
-diff --git a/arch/powerpc/configs/pmac32_defconfig b/arch/powerpc/configs/pmac32_defconfig
-index fca1142..3688e4b 100644
---- a/arch/powerpc/configs/pmac32_defconfig
-+++ b/arch/powerpc/configs/pmac32_defconfig
-@@ -1,7 +1,7 @@
- #
- # Automatically generated make config: don't edit
--# Linux kernel version: 2.6.25-rc6
--# Thu Mar 27 13:56:21 2008
-+# Linux kernel version: 2.6.26-rc3
-+# Tue May 20 20:02:24 2008
- #
- # CONFIG_PPC64 is not set
-
-@@ -31,6 +31,8 @@ CONFIG_GENERIC_CLOCKEVENTS=y
- CONFIG_GENERIC_HARDIRQS=y
- # CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
- CONFIG_IRQ_PER_CPU=y
-+CONFIG_STACKTRACE_SUPPORT=y
-+CONFIG_LOCKDEP_SUPPORT=y
- CONFIG_RWSEM_XCHGADD_ALGORITHM=y
- CONFIG_ARCH_HAS_ILOG2_U32=y
- CONFIG_GENERIC_HWEIGHT=y
-@@ -91,6 +93,7 @@ CONFIG_INITRAMFS_SOURCE=""
- CONFIG_SYSCTL=y
- # CONFIG_EMBEDDED is not set
- CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_SYSCTL_SYSCALL_CHECK=y
- CONFIG_KALLSYMS=y
- # CONFIG_KALLSYMS_ALL is not set
- # CONFIG_KALLSYMS_EXTRA_PASS is not set
-@@ -119,12 +122,14 @@ CONFIG_HAVE_OPROFILE=y
- # CONFIG_KPROBES is not set
- CONFIG_HAVE_KPROBES=y
- CONFIG_HAVE_KRETPROBES=y
-+# CONFIG_HAVE_DMA_ATTRS is not set
- CONFIG_PROC_PAGE_MONITOR=y
- CONFIG_SLABINFO=y
- CONFIG_RT_MUTEXES=y
- # CONFIG_TINY_SHMEM is not set
- CONFIG_BASE_SMALL=0
- CONFIG_MODULES=y
-+# CONFIG_MODULE_FORCE_LOAD is not set
- CONFIG_MODULE_UNLOAD=y
- CONFIG_MODULE_FORCE_UNLOAD=y
- # CONFIG_MODVERSIONS is not set
-@@ -185,6 +190,7 @@ CONFIG_CPU_FREQ_TABLE=y
- CONFIG_CPU_FREQ_STAT=y
- # CONFIG_CPU_FREQ_STAT_DETAILS is not set
- CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
-+# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set
- # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
- # CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
- # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
-@@ -236,16 +242,17 @@ CONFIG_FLATMEM=y
- CONFIG_FLAT_NODE_MEM_MAP=y
- # CONFIG_SPARSEMEM_STATIC is not set
- # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_PAGEFLAGS_EXTENDED=y
- CONFIG_SPLIT_PTLOCK_CPUS=4
- # CONFIG_RESOURCES_64BIT is not set
- CONFIG_ZONE_DMA_FLAG=1
- CONFIG_BOUNCE=y
- CONFIG_VIRT_TO_BUS=y
-+CONFIG_FORCE_MAX_ZONEORDER=11
- CONFIG_PROC_DEVICETREE=y
- # CONFIG_CMDLINE_BOOL is not set
- CONFIG_ARCH_WANTS_FREEZER_CONTROL=y
- CONFIG_PM=y
--# CONFIG_PM_LEGACY is not set
- CONFIG_PM_DEBUG=y
- # CONFIG_PM_VERBOSE is not set
- CONFIG_CAN_PM_TRACE=y
-@@ -292,6 +299,7 @@ CONFIG_YENTA_TOSHIBA=y
- # CONFIG_I82092 is not set
- CONFIG_PCCARD_NONSTATIC=m
- # CONFIG_HOTPLUG_PCI is not set
-+# CONFIG_HAS_RAPIDIO is not set
-
- #
- # Advanced setup
-@@ -301,11 +309,11 @@ CONFIG_PCCARD_NONSTATIC=m
- #
- # Default settings for advanced configuration options are used
- #
--CONFIG_HIGHMEM_START=0xfe000000
- CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_PAGE_OFFSET=0xc0000000
- CONFIG_KERNEL_START=0xc0000000
-+CONFIG_PHYSICAL_START=0x00000000
- CONFIG_TASK_SIZE=0xc0000000
--CONFIG_BOOT_LOAD=0x00800000
-
- #
- # Networking
-@@ -352,8 +360,6 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
- # CONFIG_TCP_MD5SIG is not set
- # CONFIG_IP_VS is not set
- # CONFIG_IPV6 is not set
--# CONFIG_INET6_XFRM_TUNNEL is not set
--# CONFIG_INET6_TUNNEL is not set
- # CONFIG_NETWORK_SECMARK is not set
- CONFIG_NETFILTER=y
- # CONFIG_NETFILTER_DEBUG is not set
-@@ -369,6 +375,7 @@ CONFIG_NF_CONNTRACK=m
- # CONFIG_NF_CT_ACCT is not set
- # CONFIG_NF_CONNTRACK_MARK is not set
- # CONFIG_NF_CONNTRACK_EVENTS is not set
-+CONFIG_NF_CT_PROTO_DCCP=m
- # CONFIG_NF_CT_PROTO_SCTP is not set
- # CONFIG_NF_CT_PROTO_UDPLITE is not set
- # CONFIG_NF_CONNTRACK_AMANDA is not set
-@@ -445,6 +452,7 @@ CONFIG_IP_NF_TARGET_MASQUERADE=m
- CONFIG_IP_NF_TARGET_REDIRECT=m
- CONFIG_IP_NF_TARGET_NETMAP=m
- # CONFIG_NF_NAT_SNMP_BASIC is not set
-+CONFIG_NF_NAT_PROTO_DCCP=m
- CONFIG_NF_NAT_FTP=m
- CONFIG_NF_NAT_IRC=m
- CONFIG_NF_NAT_TFTP=m
-@@ -586,7 +594,6 @@ CONFIG_MAC80211=m
- # Rate control algorithm selection
- #
- CONFIG_MAC80211_RC_DEFAULT_PID=y
--# CONFIG_MAC80211_RC_DEFAULT_SIMPLE is not set
- # CONFIG_MAC80211_RC_DEFAULT_NONE is not set
-
- #
-@@ -598,7 +605,7 @@ CONFIG_MAC80211_RC_DEFAULT_PID=y
- #
- CONFIG_MAC80211_RC_DEFAULT="pid"
- CONFIG_MAC80211_RC_PID=y
--# CONFIG_MAC80211_RC_SIMPLE is not set
-+# CONFIG_MAC80211_MESH is not set
- CONFIG_MAC80211_LEDS=y
- # CONFIG_MAC80211_DEBUG_PACKET_ALIGNMENT is not set
- # CONFIG_MAC80211_DEBUG is not set
-@@ -607,7 +614,6 @@ CONFIG_IEEE80211=m
- CONFIG_IEEE80211_CRYPT_WEP=m
- CONFIG_IEEE80211_CRYPT_CCMP=m
- CONFIG_IEEE80211_CRYPT_TKIP=m
--# CONFIG_IEEE80211_SOFTMAC is not set
- # CONFIG_RFKILL is not set
- # CONFIG_NET_9P is not set
-
-@@ -629,6 +635,7 @@ CONFIG_CONNECTOR=y
- CONFIG_PROC_EVENTS=y
- # CONFIG_MTD is not set
- CONFIG_OF_DEVICE=y
-+CONFIG_OF_I2C=y
- # CONFIG_PARPORT is not set
- CONFIG_BLK_DEV=y
- # CONFIG_BLK_DEV_FD is not set
-@@ -720,7 +727,7 @@ CONFIG_BLK_DEV_IDE_PMAC=y
- CONFIG_BLK_DEV_IDE_PMAC_ATA100FIRST=y
- CONFIG_BLK_DEV_IDEDMA_PMAC=y
- CONFIG_BLK_DEV_IDEDMA=y
--CONFIG_IDE_ARCH_OBSOLETE_INIT=y
-+# CONFIG_BLK_DEV_HD_ONLY is not set
- # CONFIG_BLK_DEV_HD is not set
-
- #
-@@ -906,7 +913,6 @@ CONFIG_SUNGEM=y
- # CONFIG_IBM_NEW_EMAC_EMAC4 is not set
- CONFIG_NET_PCI=y
- CONFIG_PCNET32=y
--# CONFIG_PCNET32_NAPI is not set
- # CONFIG_AMD8111_ETH is not set
- # CONFIG_ADAPTEC_STARFIRE is not set
- # CONFIG_B44 is not set
-@@ -940,7 +946,6 @@ CONFIG_NETDEV_1000=y
- # CONFIG_SIS190 is not set
- # CONFIG_SKGE is not set
- # CONFIG_SKY2 is not set
--# CONFIG_SK98LIN is not set
- # CONFIG_VIA_VELOCITY is not set
- # CONFIG_TIGON3 is not set
- # CONFIG_BNX2 is not set
-@@ -959,6 +964,7 @@ CONFIG_NETDEV_10000=y
- # CONFIG_MLX4_CORE is not set
- # CONFIG_TEHUTI is not set
- # CONFIG_BNX2X is not set
-+# CONFIG_SFC is not set
- # CONFIG_TR is not set
-
- #
-@@ -992,6 +998,8 @@ CONFIG_P54_COMMON=m
- # CONFIG_P54_USB is not set
- # CONFIG_P54_PCI is not set
- # CONFIG_ATH5K is not set
-+# CONFIG_IWLCORE is not set
-+# CONFIG_IWLWIFI_LEDS is not set
- # CONFIG_IWL4965 is not set
- # CONFIG_IWL3945 is not set
- # CONFIG_HOSTAP is not set
-@@ -1110,6 +1118,7 @@ CONFIG_VT=y
- CONFIG_VT_CONSOLE=y
- CONFIG_HW_CONSOLE=y
- # CONFIG_VT_HW_CONSOLE_BINDING is not set
-+CONFIG_DEVKMEM=y
- # CONFIG_SERIAL_NONSTANDARD is not set
- # CONFIG_NOZOMI is not set
-
-@@ -1156,13 +1165,7 @@ CONFIG_DEVPORT=y
- CONFIG_I2C=y
- CONFIG_I2C_BOARDINFO=y
- CONFIG_I2C_CHARDEV=m
--
--#
--# I2C Algorithms
--#
- CONFIG_I2C_ALGOBIT=y
--# CONFIG_I2C_ALGOPCF is not set
--# CONFIG_I2C_ALGOPCA is not set
-
- #
- # I2C Hardware Bus support
-@@ -1192,6 +1195,7 @@ CONFIG_I2C_POWERMAC=y
- # CONFIG_I2C_VIA is not set
- # CONFIG_I2C_VIAPRO is not set
- # CONFIG_I2C_VOODOO3 is not set
-+# CONFIG_I2C_PCA_PLATFORM is not set
-
- #
- # Miscellaneous I2C Chip support
-@@ -1201,19 +1205,13 @@ CONFIG_I2C_POWERMAC=y
- # CONFIG_SENSORS_PCF8574 is not set
- # CONFIG_PCF8575 is not set
- # CONFIG_SENSORS_PCF8591 is not set
--# CONFIG_TPS65010 is not set
- # CONFIG_SENSORS_MAX6875 is not set
- # CONFIG_SENSORS_TSL2550 is not set
- # CONFIG_I2C_DEBUG_CORE is not set
- # CONFIG_I2C_DEBUG_ALGO is not set
- # CONFIG_I2C_DEBUG_BUS is not set
- # CONFIG_I2C_DEBUG_CHIP is not set
--
--#
--# SPI support
--#
- # CONFIG_SPI is not set
--# CONFIG_SPI_MASTER is not set
- # CONFIG_W1 is not set
- CONFIG_POWER_SUPPLY=y
- # CONFIG_POWER_SUPPLY_DEBUG is not set
-@@ -1230,6 +1228,7 @@ CONFIG_BATTERY_PMU=y
- #
- CONFIG_SSB_POSSIBLE=y
- CONFIG_SSB=m
-+CONFIG_SSB_SPROM=y
- CONFIG_SSB_PCIHOST_POSSIBLE=y
- CONFIG_SSB_PCIHOST=y
- CONFIG_SSB_B43_PCI_BRIDGE=y
-@@ -1243,12 +1242,22 @@ CONFIG_SSB_DRIVER_PCICORE=y
- # Multifunction device drivers
- #
- # CONFIG_MFD_SM501 is not set
-+# CONFIG_HTC_PASIC3 is not set
-
- #
- # Multimedia devices
- #
-+
-+#
-+# Multimedia core support
-+#
- # CONFIG_VIDEO_DEV is not set
- # CONFIG_DVB_CORE is not set
-+# CONFIG_VIDEO_MEDIA is not set
-+
-+#
-+# Multimedia drivers
-+#
- # CONFIG_DAB is not set
-
- #
-@@ -1276,8 +1285,8 @@ CONFIG_FB_CFB_IMAGEBLIT=y
- # CONFIG_FB_SYS_FILLRECT is not set
- # CONFIG_FB_SYS_COPYAREA is not set
- # CONFIG_FB_SYS_IMAGEBLIT is not set
-+# CONFIG_FB_FOREIGN_ENDIAN is not set
- # CONFIG_FB_SYS_FOPS is not set
--CONFIG_FB_DEFERRED_IO=y
- # CONFIG_FB_SVGALIB is not set
- CONFIG_FB_MACMODES=y
- CONFIG_FB_BACKLIGHT=y
-@@ -1413,6 +1422,7 @@ CONFIG_SND_DUMMY=m
- # CONFIG_SND_AU8810 is not set
- # CONFIG_SND_AU8820 is not set
- # CONFIG_SND_AU8830 is not set
-+# CONFIG_SND_AW2 is not set
- # CONFIG_SND_AZT3328 is not set
- # CONFIG_SND_BT87X is not set
- # CONFIG_SND_CA0106 is not set
-@@ -1505,11 +1515,11 @@ CONFIG_SND_USB_AUDIO=m
- # CONFIG_SND_SOC is not set
-
- #
--# SoC Audio support for SuperH
-+# ALSA SoC audio for Freescale SOCs
- #
-
- #
--# ALSA SoC audio for Freescale SOCs
-+# SoC Audio for the Texas Instruments OMAP
- #
-
- #
-@@ -1543,17 +1553,18 @@ CONFIG_USB_DEVICEFS=y
- CONFIG_USB_DEVICE_CLASS=y
- CONFIG_USB_DYNAMIC_MINORS=y
- # CONFIG_USB_SUSPEND is not set
--# CONFIG_USB_PERSIST is not set
- # CONFIG_USB_OTG is not set
-
- #
- # USB Host Controller Drivers
- #
-+# CONFIG_USB_C67X00_HCD is not set
- CONFIG_USB_EHCI_HCD=m
- CONFIG_USB_EHCI_ROOT_HUB_TT=y
- # CONFIG_USB_EHCI_TT_NEWSCHED is not set
- # CONFIG_USB_EHCI_HCD_PPC_OF is not set
- # CONFIG_USB_ISP116X_HCD is not set
-+# CONFIG_USB_ISP1760_HCD is not set
- CONFIG_USB_OHCI_HCD=y
- # CONFIG_USB_OHCI_HCD_PPC_OF is not set
- # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
-@@ -1587,7 +1598,9 @@ CONFIG_USB_STORAGE=m
- # CONFIG_USB_STORAGE_SDDR55 is not set
- # CONFIG_USB_STORAGE_JUMPSHOT is not set
- # CONFIG_USB_STORAGE_ALAUDA is not set
-+CONFIG_USB_STORAGE_ONETOUCH=y
- # CONFIG_USB_STORAGE_KARMA is not set
-+# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
- # CONFIG_USB_LIBUSUAL is not set
-
- #
-@@ -1642,9 +1655,11 @@ CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y
- # CONFIG_USB_SERIAL_MCT_U232 is not set
- # CONFIG_USB_SERIAL_MOS7720 is not set
- # CONFIG_USB_SERIAL_MOS7840 is not set
-+# CONFIG_USB_SERIAL_MOTOROLA is not set
- # CONFIG_USB_SERIAL_NAVMAN is not set
- # CONFIG_USB_SERIAL_PL2303 is not set
- # CONFIG_USB_SERIAL_OTI6858 is not set
-+# CONFIG_USB_SERIAL_SPCP8X5 is not set
- # CONFIG_USB_SERIAL_HP4X is not set
- # CONFIG_USB_SERIAL_SAFE is not set
- # CONFIG_USB_SERIAL_SIERRAWIRELESS is not set
-@@ -1695,14 +1710,12 @@ CONFIG_LEDS_TRIGGERS=y
- # CONFIG_LEDS_TRIGGER_TIMER is not set
- CONFIG_LEDS_TRIGGER_IDE_DISK=y
- # CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
-+CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
-+# CONFIG_ACCESSIBILITY is not set
- # CONFIG_INFINIBAND is not set
- # CONFIG_EDAC is not set
- # CONFIG_RTC_CLASS is not set
- # CONFIG_DMADEVICES is not set
--
--#
--# Userspace I/O
--#
- # CONFIG_UIO is not set
-
- #
-@@ -1786,13 +1799,11 @@ CONFIG_NFS_FS=y
- CONFIG_NFS_V3=y
- CONFIG_NFS_V3_ACL=y
- CONFIG_NFS_V4=y
--# CONFIG_NFS_DIRECTIO is not set
- CONFIG_NFSD=m
- CONFIG_NFSD_V2_ACL=y
- CONFIG_NFSD_V3=y
- CONFIG_NFSD_V3_ACL=y
- CONFIG_NFSD_V4=y
--CONFIG_NFSD_TCP=y
- CONFIG_LOCKD=y
- CONFIG_LOCKD_V4=y
- CONFIG_EXPORTFS=m
-@@ -1877,9 +1888,10 @@ CONFIG_NLS_UTF8=m
- # Library routines
- #
- CONFIG_BITREVERSE=y
-+# CONFIG_GENERIC_FIND_FIRST_BIT is not set
- CONFIG_CRC_CCITT=y
- CONFIG_CRC16=y
--# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC_ITU_T=m
- CONFIG_CRC32=y
- # CONFIG_CRC7 is not set
- CONFIG_LIBCRC32C=m
-@@ -1901,6 +1913,7 @@ CONFIG_HAVE_LMB=y
- # CONFIG_PRINTK_TIME is not set
- CONFIG_ENABLE_WARN_DEPRECATED=y
- CONFIG_ENABLE_MUST_CHECK=y
-+CONFIG_FRAME_WARN=1024
- CONFIG_MAGIC_SYSRQ=y
- # CONFIG_UNUSED_SYMBOLS is not set
- # CONFIG_DEBUG_FS is not set
-@@ -1911,6 +1924,7 @@ CONFIG_DETECT_SOFTLOCKUP=y
- CONFIG_SCHED_DEBUG=y
- # CONFIG_SCHEDSTATS is not set
- # CONFIG_TIMER_STATS is not set
-+# CONFIG_DEBUG_OBJECTS is not set
- # CONFIG_SLUB_DEBUG_ON is not set
- # CONFIG_SLUB_STATS is not set
- # CONFIG_DEBUG_RT_MUTEXES is not set
-@@ -1923,6 +1937,7 @@ CONFIG_SCHED_DEBUG=y
- CONFIG_DEBUG_BUGVERBOSE=y
- # CONFIG_DEBUG_INFO is not set
- # CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_WRITECOUNT is not set
- # CONFIG_DEBUG_LIST is not set
- # CONFIG_DEBUG_SG is not set
- # CONFIG_BOOT_PRINTK_DELAY is not set
-@@ -1936,6 +1951,7 @@ CONFIG_DEBUGGER=y
- CONFIG_XMON=y
- CONFIG_XMON_DEFAULT=y
- CONFIG_XMON_DISASSEMBLY=y
-+CONFIG_IRQSTACKS=y
- # CONFIG_BDI_SWITCH is not set
- CONFIG_BOOTX_TEXT=y
- # CONFIG_PPC_EARLY_DEBUG is not set
-@@ -1947,54 +1963,84 @@ CONFIG_BOOTX_TEXT=y
- # CONFIG_SECURITY is not set
- # CONFIG_SECURITY_FILE_CAPABILITIES is not set
- CONFIG_CRYPTO=y
-+
-+#
-+# Crypto core or helper
-+#
- CONFIG_CRYPTO_ALGAPI=y
- CONFIG_CRYPTO_AEAD=y
- CONFIG_CRYPTO_BLKCIPHER=y
--# CONFIG_CRYPTO_SEQIV is not set
- CONFIG_CRYPTO_HASH=y
- CONFIG_CRYPTO_MANAGER=y
-+# CONFIG_CRYPTO_GF128MUL is not set
-+CONFIG_CRYPTO_NULL=m
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_AUTHENC=y
-+# CONFIG_CRYPTO_TEST is not set
-+
-+#
-+# Authenticated Encryption with Associated Data
-+#
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_SEQIV is not set
-+
-+#
-+# Block modes
-+#
-+CONFIG_CRYPTO_CBC=y
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_CTS is not set
-+CONFIG_CRYPTO_ECB=m
-+# CONFIG_CRYPTO_LRW is not set
-+CONFIG_CRYPTO_PCBC=m
-+# CONFIG_CRYPTO_XTS is not set
-+
-+#
-+# Hash modes
-+#
- CONFIG_CRYPTO_HMAC=y
- # CONFIG_CRYPTO_XCBC is not set
--CONFIG_CRYPTO_NULL=m
-+
-+#
-+# Digest
-+#
-+CONFIG_CRYPTO_CRC32C=m
- CONFIG_CRYPTO_MD4=m
- CONFIG_CRYPTO_MD5=y
-+CONFIG_CRYPTO_MICHAEL_MIC=m
- CONFIG_CRYPTO_SHA1=y
- CONFIG_CRYPTO_SHA256=m
- CONFIG_CRYPTO_SHA512=m
--CONFIG_CRYPTO_WP512=m
- CONFIG_CRYPTO_TGR192=m
--# CONFIG_CRYPTO_GF128MUL is not set
--CONFIG_CRYPTO_ECB=m
--CONFIG_CRYPTO_CBC=y
--CONFIG_CRYPTO_PCBC=m
--# CONFIG_CRYPTO_LRW is not set
--# CONFIG_CRYPTO_XTS is not set
--# CONFIG_CRYPTO_CTR is not set
--# CONFIG_CRYPTO_GCM is not set
--# CONFIG_CRYPTO_CCM is not set
--# CONFIG_CRYPTO_CRYPTD is not set
--CONFIG_CRYPTO_DES=y
--# CONFIG_CRYPTO_FCRYPT is not set
--CONFIG_CRYPTO_BLOWFISH=m
--CONFIG_CRYPTO_TWOFISH=m
--CONFIG_CRYPTO_TWOFISH_COMMON=m
--CONFIG_CRYPTO_SERPENT=m
-+CONFIG_CRYPTO_WP512=m
-+
-+#
-+# Ciphers
-+#
- CONFIG_CRYPTO_AES=m
-+CONFIG_CRYPTO_ANUBIS=m
-+CONFIG_CRYPTO_ARC4=m
-+CONFIG_CRYPTO_BLOWFISH=m
-+# CONFIG_CRYPTO_CAMELLIA is not set
- CONFIG_CRYPTO_CAST5=m
- CONFIG_CRYPTO_CAST6=m
--CONFIG_CRYPTO_TEA=m
--CONFIG_CRYPTO_ARC4=m
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
- CONFIG_CRYPTO_KHAZAD=m
--CONFIG_CRYPTO_ANUBIS=m
--# CONFIG_CRYPTO_SEED is not set
- # CONFIG_CRYPTO_SALSA20 is not set
-+# CONFIG_CRYPTO_SEED is not set
-+CONFIG_CRYPTO_SERPENT=m
-+CONFIG_CRYPTO_TEA=m
-+CONFIG_CRYPTO_TWOFISH=m
-+CONFIG_CRYPTO_TWOFISH_COMMON=m
-+
-+#
-+# Compression
-+#
- CONFIG_CRYPTO_DEFLATE=m
--CONFIG_CRYPTO_MICHAEL_MIC=m
--CONFIG_CRYPTO_CRC32C=m
--# CONFIG_CRYPTO_CAMELLIA is not set
--# CONFIG_CRYPTO_TEST is not set
--CONFIG_CRYPTO_AUTHENC=y
- # CONFIG_CRYPTO_LZO is not set
- CONFIG_CRYPTO_HW=y
- # CONFIG_CRYPTO_DEV_HIFN_795X is not set
- # CONFIG_PPC_CLOCK is not set
-+# CONFIG_VIRTUALIZATION is not set
-diff --git a/arch/powerpc/configs/ppc64_defconfig b/arch/powerpc/configs/ppc64_defconfig
-index 970282b..40f84fa 100644
---- a/arch/powerpc/configs/ppc64_defconfig
-+++ b/arch/powerpc/configs/ppc64_defconfig
-@@ -1,7 +1,7 @@
- #
- # Automatically generated make config: don't edit
--# Linux kernel version: 2.6.25-rc6
--# Thu Mar 27 13:56:24 2008
-+# Linux kernel version: 2.6.26-rc3
-+# Tue May 20 20:03:02 2008
- #
- CONFIG_PPC64=y
-
-@@ -30,6 +30,9 @@ CONFIG_GENERIC_CLOCKEVENTS=y
- CONFIG_GENERIC_HARDIRQS=y
- CONFIG_HAVE_SETUP_PER_CPU_AREA=y
- CONFIG_IRQ_PER_CPU=y
-+CONFIG_STACKTRACE_SUPPORT=y
-+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
-+CONFIG_LOCKDEP_SUPPORT=y
- CONFIG_RWSEM_XCHGADD_ALGORITHM=y
- CONFIG_ARCH_HAS_ILOG2_U32=y
- CONFIG_ARCH_HAS_ILOG2_U64=y
-@@ -82,6 +85,7 @@ CONFIG_LOG_BUF_SHIFT=17
- CONFIG_CGROUPS=y
- # CONFIG_CGROUP_DEBUG is not set
- # CONFIG_CGROUP_NS is not set
-+# CONFIG_CGROUP_DEVICE is not set
- CONFIG_CPUSETS=y
- # CONFIG_GROUP_SCHED is not set
- # CONFIG_CGROUP_CPUACCT is not set
-@@ -101,6 +105,7 @@ CONFIG_CC_OPTIMIZE_FOR_SIZE=y
- CONFIG_SYSCTL=y
- # CONFIG_EMBEDDED is not set
- CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_SYSCTL_SYSCALL_CHECK=y
- CONFIG_KALLSYMS=y
- CONFIG_KALLSYMS_ALL=y
- # CONFIG_KALLSYMS_EXTRA_PASS is not set
-@@ -108,6 +113,7 @@ CONFIG_HOTPLUG=y
- CONFIG_PRINTK=y
- CONFIG_BUG=y
- CONFIG_ELF_CORE=y
-+CONFIG_PCSPKR_PLATFORM=y
- # CONFIG_COMPAT_BRK is not set
- CONFIG_BASE_FULL=y
- CONFIG_FUTEX=y
-@@ -129,12 +135,14 @@ CONFIG_HAVE_OPROFILE=y
- # CONFIG_KPROBES is not set
- CONFIG_HAVE_KPROBES=y
- CONFIG_HAVE_KRETPROBES=y
-+# CONFIG_HAVE_DMA_ATTRS is not set
- CONFIG_PROC_PAGE_MONITOR=y
- CONFIG_SLABINFO=y
- CONFIG_RT_MUTEXES=y
- # CONFIG_TINY_SHMEM is not set
- CONFIG_BASE_SMALL=0
- CONFIG_MODULES=y
-+# CONFIG_MODULE_FORCE_LOAD is not set
- CONFIG_MODULE_UNLOAD=y
- # CONFIG_MODULE_FORCE_UNLOAD is not set
- CONFIG_MODVERSIONS=y
-@@ -194,11 +202,11 @@ CONFIG_PPC_PASEMI=y
- CONFIG_PPC_PASEMI_IOMMU=y
- # CONFIG_PPC_PASEMI_IOMMU_DMA_FORCE is not set
- CONFIG_PPC_PASEMI_MDIO=y
--CONFIG_PPC_CELLEB=y
- # CONFIG_PPC_PS3 is not set
- CONFIG_PPC_CELL=y
- CONFIG_PPC_CELL_NATIVE=y
- CONFIG_PPC_IBM_CELL_BLADE=y
-+CONFIG_PPC_CELLEB=y
-
- #
- # Cell Broadband Engine options
-@@ -241,6 +249,7 @@ CONFIG_CPU_FREQ_TABLE=y
- CONFIG_CPU_FREQ_STAT=y
- # CONFIG_CPU_FREQ_STAT_DETAILS is not set
- CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
-+# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set
- # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
- # CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
- # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
-@@ -277,7 +286,6 @@ CONFIG_PREEMPT_NONE=y
- CONFIG_BINFMT_ELF=y
- CONFIG_COMPAT_BINFMT_ELF=y
- CONFIG_BINFMT_MISC=m
--CONFIG_FORCE_MAX_ZONEORDER=13
- CONFIG_HUGETLB_PAGE_SIZE_VARIABLE=y
- CONFIG_IOMMU_VMERGE=y
- CONFIG_IOMMU_HELPER=y
-@@ -307,6 +315,7 @@ CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
- CONFIG_SPARSEMEM_VMEMMAP=y
- CONFIG_MEMORY_HOTPLUG=y
- CONFIG_MEMORY_HOTPLUG_SPARSE=y
-+CONFIG_PAGEFLAGS_EXTENDED=y
- CONFIG_SPLIT_PTLOCK_CPUS=4
- CONFIG_RESOURCES_64BIT=y
- CONFIG_ZONE_DMA_FLAG=1
-@@ -314,6 +323,7 @@ CONFIG_BOUNCE=y
- CONFIG_ARCH_MEMORY_PROBE=y
- CONFIG_PPC_HAS_HASH_64K=y
- # CONFIG_PPC_64K_PAGES is not set
-+CONFIG_FORCE_MAX_ZONEORDER=13
- # CONFIG_SCHED_SMT is not set
- CONFIG_PROC_DEVICETREE=y
- # CONFIG_CMDLINE_BOOL is not set
-@@ -356,7 +366,10 @@ CONFIG_HOTPLUG_PCI=m
- # CONFIG_HOTPLUG_PCI_SHPC is not set
- CONFIG_HOTPLUG_PCI_RPA=m
- CONFIG_HOTPLUG_PCI_RPA_DLPAR=m
-+# CONFIG_HAS_RAPIDIO is not set
-+CONFIG_PAGE_OFFSET=0xc000000000000000
- CONFIG_KERNEL_START=0xc000000000000000
-+CONFIG_PHYSICAL_START=0x00000000
-
- #
- # Networking
-@@ -406,8 +419,6 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
- # CONFIG_TCP_MD5SIG is not set
- # CONFIG_IP_VS is not set
- # CONFIG_IPV6 is not set
--# CONFIG_INET6_XFRM_TUNNEL is not set
--# CONFIG_INET6_TUNNEL is not set
- # CONFIG_NETWORK_SECMARK is not set
- CONFIG_NETFILTER=y
- # CONFIG_NETFILTER_DEBUG is not set
-@@ -423,6 +434,7 @@ CONFIG_NF_CONNTRACK=m
- CONFIG_NF_CT_ACCT=y
- CONFIG_NF_CONNTRACK_MARK=y
- CONFIG_NF_CONNTRACK_EVENTS=y
-+# CONFIG_NF_CT_PROTO_DCCP is not set
- CONFIG_NF_CT_PROTO_GRE=m
- CONFIG_NF_CT_PROTO_SCTP=m
- # CONFIG_NF_CT_PROTO_UDPLITE is not set
-@@ -501,6 +513,7 @@ CONFIG_IP_NF_TARGET_REDIRECT=m
- CONFIG_IP_NF_TARGET_NETMAP=m
- CONFIG_NF_NAT_SNMP_BASIC=m
- CONFIG_NF_NAT_PROTO_GRE=m
-+CONFIG_NF_NAT_PROTO_SCTP=m
- CONFIG_NF_NAT_FTP=m
- CONFIG_NF_NAT_IRC=m
- CONFIG_NF_NAT_TFTP=m
-@@ -571,6 +584,7 @@ CONFIG_FW_LOADER=y
- # CONFIG_CONNECTOR is not set
- # CONFIG_MTD is not set
- CONFIG_OF_DEVICE=y
-+CONFIG_OF_I2C=y
- # CONFIG_PARPORT is not set
- CONFIG_BLK_DEV=y
- CONFIG_BLK_DEV_FD=y
-@@ -618,7 +632,6 @@ CONFIG_IDE_PROC_FS=y
- #
- # IDE chipset support/bugfixes
- #
--CONFIG_IDE_GENERIC=y
- # CONFIG_BLK_DEV_PLATFORM is not set
- CONFIG_BLK_DEV_IDEDMA_SFF=y
-
-@@ -661,7 +674,7 @@ CONFIG_BLK_DEV_IDE_PMAC=y
- CONFIG_BLK_DEV_IDE_PMAC_ATA100FIRST=y
- CONFIG_BLK_DEV_IDEDMA_PMAC=y
- CONFIG_BLK_DEV_IDEDMA=y
--CONFIG_IDE_ARCH_OBSOLETE_INIT=y
-+# CONFIG_BLK_DEV_HD_ONLY is not set
- # CONFIG_BLK_DEV_HD is not set
-
- #
-@@ -747,64 +760,10 @@ CONFIG_SCSI_DEBUG=m
- # CONFIG_SCSI_LOWLEVEL_PCMCIA is not set
- CONFIG_ATA=y
- CONFIG_ATA_NONSTANDARD=y
-+CONFIG_SATA_PMP=y
- # CONFIG_SATA_AHCI is not set
--CONFIG_SATA_SVW=y
--# CONFIG_ATA_PIIX is not set
--CONFIG_SATA_MV=y
--# CONFIG_SATA_NV is not set
--# CONFIG_PDC_ADMA is not set
--# CONFIG_SATA_QSTOR is not set
--# CONFIG_SATA_PROMISE is not set
--# CONFIG_SATA_SX4 is not set
--# CONFIG_SATA_SIL is not set
- CONFIG_SATA_SIL24=y
--# CONFIG_SATA_SIS is not set
--# CONFIG_SATA_ULI is not set
--# CONFIG_SATA_VIA is not set
--# CONFIG_SATA_VITESSE is not set
--# CONFIG_SATA_INIC162X is not set
--# CONFIG_PATA_ALI is not set
--# CONFIG_PATA_AMD is not set
--# CONFIG_PATA_ARTOP is not set
--# CONFIG_PATA_ATIIXP is not set
--# CONFIG_PATA_CMD640_PCI is not set
--# CONFIG_PATA_CMD64X is not set
--# CONFIG_PATA_CS5520 is not set
--# CONFIG_PATA_CS5530 is not set
--# CONFIG_PATA_CYPRESS is not set
--# CONFIG_PATA_EFAR is not set
--# CONFIG_ATA_GENERIC is not set
--# CONFIG_PATA_HPT366 is not set
--# CONFIG_PATA_HPT37X is not set
--# CONFIG_PATA_HPT3X2N is not set
--# CONFIG_PATA_HPT3X3 is not set
--# CONFIG_PATA_IT821X is not set
--# CONFIG_PATA_IT8213 is not set
--# CONFIG_PATA_JMICRON is not set
--# CONFIG_PATA_TRIFLEX is not set
--# CONFIG_PATA_MARVELL is not set
--# CONFIG_PATA_MPIIX is not set
--# CONFIG_PATA_OLDPIIX is not set
--# CONFIG_PATA_NETCELL is not set
--# CONFIG_PATA_NINJA32 is not set
--# CONFIG_PATA_NS87410 is not set
--# CONFIG_PATA_NS87415 is not set
--# CONFIG_PATA_OPTI is not set
--# CONFIG_PATA_OPTIDMA is not set
--CONFIG_PATA_PCMCIA=y
--# CONFIG_PATA_PDC_OLD is not set
--# CONFIG_PATA_RADISYS is not set
--# CONFIG_PATA_RZ1000 is not set
--# CONFIG_PATA_SC1200 is not set
--# CONFIG_PATA_SERVERWORKS is not set
--# CONFIG_PATA_PDC2027X is not set
--# CONFIG_PATA_SIL680 is not set
--# CONFIG_PATA_SIS is not set
--# CONFIG_PATA_VIA is not set
--CONFIG_PATA_WINBOND=y
--CONFIG_PATA_PLATFORM=y
--# CONFIG_PATA_OF_PLATFORM is not set
--CONFIG_PATA_SCC=y
-+# CONFIG_ATA_SFF is not set
- CONFIG_MD=y
- CONFIG_BLK_DEV_MD=y
- CONFIG_MD_LINEAR=y
-@@ -866,6 +825,7 @@ CONFIG_WINDFARM=y
- CONFIG_WINDFARM_PM81=y
- CONFIG_WINDFARM_PM91=y
- CONFIG_WINDFARM_PM112=y
-+CONFIG_WINDFARM_PM121=y
- # CONFIG_PMAC_RACKMETER is not set
- CONFIG_NETDEVICES=y
- # CONFIG_NETDEVICES_MULTIQUEUE is not set
-@@ -911,7 +871,6 @@ CONFIG_IBM_NEW_EMAC_TAH=y
- CONFIG_IBM_NEW_EMAC_EMAC4=y
- CONFIG_NET_PCI=y
- CONFIG_PCNET32=y
--# CONFIG_PCNET32_NAPI is not set
- # CONFIG_AMD8111_ETH is not set
- # CONFIG_ADAPTEC_STARFIRE is not set
- # CONFIG_B44 is not set
-@@ -947,7 +906,6 @@ CONFIG_E1000=y
- # CONFIG_SIS190 is not set
- # CONFIG_SKGE is not set
- # CONFIG_SKY2 is not set
--# CONFIG_SK98LIN is not set
- # CONFIG_VIA_VELOCITY is not set
- CONFIG_TIGON3=y
- # CONFIG_BNX2 is not set
-@@ -969,6 +927,7 @@ CONFIG_PASEMI_MAC=y
- # CONFIG_MLX4_CORE is not set
- # CONFIG_TEHUTI is not set
- # CONFIG_BNX2X is not set
-+# CONFIG_SFC is not set
- CONFIG_TR=y
- CONFIG_IBMOL=y
- # CONFIG_3C359 is not set
-@@ -979,6 +938,7 @@ CONFIG_IBMOL=y
- #
- # CONFIG_WLAN_PRE80211 is not set
- # CONFIG_WLAN_80211 is not set
-+# CONFIG_IWLWIFI_LEDS is not set
-
- #
- # USB Network Adapters
-@@ -1083,6 +1043,7 @@ CONFIG_VT=y
- CONFIG_VT_CONSOLE=y
- CONFIG_HW_CONSOLE=y
- # CONFIG_VT_HW_CONSOLE_BINDING is not set
-+CONFIG_DEVKMEM=y
- # CONFIG_SERIAL_NONSTANDARD is not set
- # CONFIG_NOZOMI is not set
-
-@@ -1121,8 +1082,6 @@ CONFIG_HVC_BEAT=y
- CONFIG_HVCS=m
- # CONFIG_IPMI_HANDLER is not set
- # CONFIG_HW_RANDOM is not set
--CONFIG_GEN_RTC=y
--# CONFIG_GEN_RTC_X is not set
- # CONFIG_R3964 is not set
- # CONFIG_APPLICOM is not set
-
-@@ -1141,13 +1100,7 @@ CONFIG_DEVPORT=y
- CONFIG_I2C=y
- CONFIG_I2C_BOARDINFO=y
- CONFIG_I2C_CHARDEV=y
--
--#
--# I2C Algorithms
--#
- CONFIG_I2C_ALGOBIT=y
--# CONFIG_I2C_ALGOPCF is not set
--# CONFIG_I2C_ALGOPCA is not set
-
- #
- # I2C Hardware Bus support
-@@ -1177,6 +1130,7 @@ CONFIG_I2C_PASEMI=y
- # CONFIG_I2C_VIA is not set
- # CONFIG_I2C_VIAPRO is not set
- # CONFIG_I2C_VOODOO3 is not set
-+# CONFIG_I2C_PCA_PLATFORM is not set
-
- #
- # Miscellaneous I2C Chip support
-@@ -1186,19 +1140,13 @@ CONFIG_I2C_PASEMI=y
- # CONFIG_SENSORS_PCF8574 is not set
- # CONFIG_PCF8575 is not set
- # CONFIG_SENSORS_PCF8591 is not set
--# CONFIG_TPS65010 is not set
- # CONFIG_SENSORS_MAX6875 is not set
- # CONFIG_SENSORS_TSL2550 is not set
- # CONFIG_I2C_DEBUG_CORE is not set
- # CONFIG_I2C_DEBUG_ALGO is not set
- # CONFIG_I2C_DEBUG_BUS is not set
- # CONFIG_I2C_DEBUG_CHIP is not set
--
--#
--# SPI support
--#
- # CONFIG_SPI is not set
--# CONFIG_SPI_MASTER is not set
- # CONFIG_W1 is not set
- # CONFIG_POWER_SUPPLY is not set
- # CONFIG_HWMON is not set
-@@ -1215,12 +1163,22 @@ CONFIG_SSB_POSSIBLE=y
- # Multifunction device drivers
- #
- # CONFIG_MFD_SM501 is not set
-+# CONFIG_HTC_PASIC3 is not set
-
- #
- # Multimedia devices
- #
-+
-+#
-+# Multimedia core support
-+#
- # CONFIG_VIDEO_DEV is not set
- # CONFIG_DVB_CORE is not set
-+# CONFIG_VIDEO_MEDIA is not set
-+
-+#
-+# Multimedia drivers
-+#
- # CONFIG_DAB is not set
-
- #
-@@ -1240,8 +1198,8 @@ CONFIG_FB_CFB_IMAGEBLIT=y
- # CONFIG_FB_SYS_FILLRECT is not set
- # CONFIG_FB_SYS_COPYAREA is not set
- # CONFIG_FB_SYS_IMAGEBLIT is not set
-+# CONFIG_FB_FOREIGN_ENDIAN is not set
- # CONFIG_FB_SYS_FOPS is not set
--CONFIG_FB_DEFERRED_IO=y
- # CONFIG_FB_SVGALIB is not set
- CONFIG_FB_MACMODES=y
- CONFIG_FB_BACKLIGHT=y
-@@ -1363,6 +1321,7 @@ CONFIG_SND_VERBOSE_PROCFS=y
- # CONFIG_SND_AU8810 is not set
- # CONFIG_SND_AU8820 is not set
- # CONFIG_SND_AU8830 is not set
-+# CONFIG_SND_AW2 is not set
- # CONFIG_SND_AZT3328 is not set
- # CONFIG_SND_BT87X is not set
- # CONFIG_SND_CA0106 is not set
-@@ -1455,11 +1414,11 @@ CONFIG_SND_AOA_SOUNDBUS_I2S=m
- # CONFIG_SND_SOC is not set
-
- #
--# SoC Audio support for SuperH
-+# ALSA SoC audio for Freescale SOCs
- #
-
- #
--# ALSA SoC audio for Freescale SOCs
-+# SoC Audio for the Texas Instruments OMAP
- #
-
- #
-@@ -1497,12 +1456,14 @@ CONFIG_USB_DEVICE_CLASS=y
- #
- # USB Host Controller Drivers
- #
-+# CONFIG_USB_C67X00_HCD is not set
- CONFIG_USB_EHCI_HCD=y
- # CONFIG_USB_EHCI_ROOT_HUB_TT is not set
- CONFIG_USB_EHCI_TT_NEWSCHED=y
- CONFIG_USB_EHCI_BIG_ENDIAN_MMIO=y
- # CONFIG_USB_EHCI_HCD_PPC_OF is not set
- # CONFIG_USB_ISP116X_HCD is not set
-+# CONFIG_USB_ISP1760_HCD is not set
- CONFIG_USB_OHCI_HCD=y
- # CONFIG_USB_OHCI_HCD_PPC_OF is not set
- # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
-@@ -1538,6 +1499,7 @@ CONFIG_USB_STORAGE=m
- # CONFIG_USB_STORAGE_ALAUDA is not set
- # CONFIG_USB_STORAGE_ONETOUCH is not set
- # CONFIG_USB_STORAGE_KARMA is not set
-+# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
- # CONFIG_USB_LIBUSUAL is not set
-
- #
-@@ -1579,6 +1541,7 @@ CONFIG_USB_APPLEDISPLAY=m
- # CONFIG_MMC is not set
- # CONFIG_MEMSTICK is not set
- # CONFIG_NEW_LEDS is not set
-+# CONFIG_ACCESSIBILITY is not set
- CONFIG_INFINIBAND=m
- # CONFIG_INFINIBAND_USER_MAD is not set
- # CONFIG_INFINIBAND_USER_ACCESS is not set
-@@ -1607,10 +1570,6 @@ CONFIG_EDAC_PASEMI=y
- # CONFIG_EDAC_CELL is not set
- CONFIG_RTC_LIB=y
- CONFIG_RTC_CLASS=y
--
--#
--# Conflicting RTC option has been selected, check GEN_RTC and RTC
--#
- CONFIG_RTC_HCTOSYS=y
- CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
- # CONFIG_RTC_DEBUG is not set
-@@ -1659,10 +1618,6 @@ CONFIG_RTC_DRV_DS1307=y
- # on-CPU RTC drivers
- #
- # CONFIG_DMADEVICES is not set
--
--#
--# Userspace I/O
--#
- # CONFIG_UIO is not set
-
- #
-@@ -1696,9 +1651,9 @@ CONFIG_JFS_SECURITY=y
- CONFIG_FS_POSIX_ACL=y
- CONFIG_XFS_FS=m
- # CONFIG_XFS_QUOTA is not set
--CONFIG_XFS_SECURITY=y
- CONFIG_XFS_POSIX_ACL=y
- # CONFIG_XFS_RT is not set
-+# CONFIG_XFS_DEBUG is not set
- # CONFIG_GFS2_FS is not set
- # CONFIG_OCFS2_FS is not set
- CONFIG_DNOTIFY=y
-@@ -1764,13 +1719,11 @@ CONFIG_NFS_FS=y
- CONFIG_NFS_V3=y
- CONFIG_NFS_V3_ACL=y
- CONFIG_NFS_V4=y
--# CONFIG_NFS_DIRECTIO is not set
- CONFIG_NFSD=m
- CONFIG_NFSD_V2_ACL=y
- CONFIG_NFSD_V3=y
- CONFIG_NFSD_V3_ACL=y
- CONFIG_NFSD_V4=y
--CONFIG_NFSD_TCP=y
- CONFIG_ROOT_NFS=y
- CONFIG_LOCKD=y
- CONFIG_LOCKD_V4=y
-@@ -1862,9 +1815,10 @@ CONFIG_NLS_UTF8=m
- # Library routines
- #
- CONFIG_BITREVERSE=y
-+# CONFIG_GENERIC_FIND_FIRST_BIT is not set
- CONFIG_CRC_CCITT=m
- # CONFIG_CRC16 is not set
--# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC_ITU_T=m
- CONFIG_CRC32=y
- # CONFIG_CRC7 is not set
- CONFIG_LIBCRC32C=m
-@@ -1888,6 +1842,7 @@ CONFIG_HAVE_LMB=y
- # CONFIG_PRINTK_TIME is not set
- CONFIG_ENABLE_WARN_DEPRECATED=y
- CONFIG_ENABLE_MUST_CHECK=y
-+CONFIG_FRAME_WARN=2048
- CONFIG_MAGIC_SYSRQ=y
- # CONFIG_UNUSED_SYMBOLS is not set
- CONFIG_DEBUG_FS=y
-@@ -1898,18 +1853,23 @@ CONFIG_DETECT_SOFTLOCKUP=y
- CONFIG_SCHED_DEBUG=y
- # CONFIG_SCHEDSTATS is not set
- # CONFIG_TIMER_STATS is not set
-+# CONFIG_DEBUG_OBJECTS is not set
- # CONFIG_SLUB_DEBUG_ON is not set
- # CONFIG_SLUB_STATS is not set
- # CONFIG_DEBUG_RT_MUTEXES is not set
- # CONFIG_RT_MUTEX_TESTER is not set
- # CONFIG_DEBUG_SPINLOCK is not set
- CONFIG_DEBUG_MUTEXES=y
-+# CONFIG_DEBUG_LOCK_ALLOC is not set
-+# CONFIG_PROVE_LOCKING is not set
-+# CONFIG_LOCK_STAT is not set
- # CONFIG_DEBUG_SPINLOCK_SLEEP is not set
- # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
- # CONFIG_DEBUG_KOBJECT is not set
- CONFIG_DEBUG_BUGVERBOSE=y
- # CONFIG_DEBUG_INFO is not set
- # CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_WRITECOUNT is not set
- # CONFIG_DEBUG_LIST is not set
- # CONFIG_DEBUG_SG is not set
- # CONFIG_BOOT_PRINTK_DELAY is not set
-@@ -1941,53 +1901,83 @@ CONFIG_ASYNC_CORE=y
- CONFIG_ASYNC_MEMCPY=y
- CONFIG_ASYNC_XOR=y
- CONFIG_CRYPTO=y
-+
-+#
-+# Crypto core or helper
-+#
- CONFIG_CRYPTO_ALGAPI=y
- CONFIG_CRYPTO_AEAD=m
- CONFIG_CRYPTO_BLKCIPHER=y
--CONFIG_CRYPTO_SEQIV=m
- CONFIG_CRYPTO_HASH=y
- CONFIG_CRYPTO_MANAGER=y
-+CONFIG_CRYPTO_GF128MUL=m
-+CONFIG_CRYPTO_NULL=m
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_AUTHENC=m
-+CONFIG_CRYPTO_TEST=m
-+
-+#
-+# Authenticated Encryption with Associated Data
-+#
-+CONFIG_CRYPTO_CCM=m
-+CONFIG_CRYPTO_GCM=m
-+CONFIG_CRYPTO_SEQIV=m
-+
-+#
-+# Block modes
-+#
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_CTR=m
-+# CONFIG_CRYPTO_CTS is not set
-+CONFIG_CRYPTO_ECB=m
-+# CONFIG_CRYPTO_LRW is not set
-+CONFIG_CRYPTO_PCBC=m
-+# CONFIG_CRYPTO_XTS is not set
-+
-+#
-+# Hash modes
-+#
- CONFIG_CRYPTO_HMAC=y
- # CONFIG_CRYPTO_XCBC is not set
--CONFIG_CRYPTO_NULL=m
-+
-+#
-+# Digest
-+#
-+CONFIG_CRYPTO_CRC32C=m
- CONFIG_CRYPTO_MD4=m
- CONFIG_CRYPTO_MD5=y
-+CONFIG_CRYPTO_MICHAEL_MIC=m
- CONFIG_CRYPTO_SHA1=m
- CONFIG_CRYPTO_SHA256=m
- CONFIG_CRYPTO_SHA512=m
--CONFIG_CRYPTO_WP512=m
- CONFIG_CRYPTO_TGR192=m
--CONFIG_CRYPTO_GF128MUL=m
--CONFIG_CRYPTO_ECB=m
--CONFIG_CRYPTO_CBC=y
--CONFIG_CRYPTO_PCBC=m
--# CONFIG_CRYPTO_LRW is not set
--# CONFIG_CRYPTO_XTS is not set
--CONFIG_CRYPTO_CTR=m
--CONFIG_CRYPTO_GCM=m
--CONFIG_CRYPTO_CCM=m
--# CONFIG_CRYPTO_CRYPTD is not set
--CONFIG_CRYPTO_DES=y
--# CONFIG_CRYPTO_FCRYPT is not set
--CONFIG_CRYPTO_BLOWFISH=m
--CONFIG_CRYPTO_TWOFISH=m
--CONFIG_CRYPTO_TWOFISH_COMMON=m
--CONFIG_CRYPTO_SERPENT=m
-+CONFIG_CRYPTO_WP512=m
-+
-+#
-+# Ciphers
-+#
- CONFIG_CRYPTO_AES=m
-+CONFIG_CRYPTO_ANUBIS=m
-+CONFIG_CRYPTO_ARC4=m
-+CONFIG_CRYPTO_BLOWFISH=m
-+# CONFIG_CRYPTO_CAMELLIA is not set
- CONFIG_CRYPTO_CAST5=m
- CONFIG_CRYPTO_CAST6=m
--CONFIG_CRYPTO_TEA=m
--CONFIG_CRYPTO_ARC4=m
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
- CONFIG_CRYPTO_KHAZAD=m
--CONFIG_CRYPTO_ANUBIS=m
--# CONFIG_CRYPTO_SEED is not set
- CONFIG_CRYPTO_SALSA20=m
-+# CONFIG_CRYPTO_SEED is not set
-+CONFIG_CRYPTO_SERPENT=m
-+CONFIG_CRYPTO_TEA=m
-+CONFIG_CRYPTO_TWOFISH=m
-+CONFIG_CRYPTO_TWOFISH_COMMON=m
-+
-+#
-+# Compression
-+#
- CONFIG_CRYPTO_DEFLATE=m
--CONFIG_CRYPTO_MICHAEL_MIC=m
--CONFIG_CRYPTO_CRC32C=m
--# CONFIG_CRYPTO_CAMELLIA is not set
--CONFIG_CRYPTO_TEST=m
--CONFIG_CRYPTO_AUTHENC=m
- CONFIG_CRYPTO_LZO=m
- # CONFIG_CRYPTO_HW is not set
- # CONFIG_PPC_CLOCK is not set
-+# CONFIG_VIRTUALIZATION is not set
-diff --git a/arch/powerpc/configs/pseries_defconfig b/arch/powerpc/configs/pseries_defconfig
-index 3e2593c..adaa05f 100644
---- a/arch/powerpc/configs/pseries_defconfig
-+++ b/arch/powerpc/configs/pseries_defconfig
-@@ -1,7 +1,7 @@
- #
- # Automatically generated make config: don't edit
--# Linux kernel version: 2.6.25-rc6
--# Thu Mar 27 13:56:28 2008
-+# Linux kernel version: 2.6.26-rc3
-+# Tue May 20 20:03:28 2008
- #
- CONFIG_PPC64=y
-
-@@ -30,6 +30,9 @@ CONFIG_GENERIC_CLOCKEVENTS=y
- CONFIG_GENERIC_HARDIRQS=y
- CONFIG_HAVE_SETUP_PER_CPU_AREA=y
- CONFIG_IRQ_PER_CPU=y
-+CONFIG_STACKTRACE_SUPPORT=y
-+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
-+CONFIG_LOCKDEP_SUPPORT=y
- CONFIG_RWSEM_XCHGADD_ALGORITHM=y
- CONFIG_ARCH_HAS_ILOG2_U32=y
- CONFIG_ARCH_HAS_ILOG2_U64=y
-@@ -81,6 +84,7 @@ CONFIG_LOG_BUF_SHIFT=17
- CONFIG_CGROUPS=y
- # CONFIG_CGROUP_DEBUG is not set
- CONFIG_CGROUP_NS=y
-+CONFIG_CGROUP_DEVICE=y
- CONFIG_CPUSETS=y
- # CONFIG_GROUP_SCHED is not set
- CONFIG_CGROUP_CPUACCT=y
-@@ -100,6 +104,7 @@ CONFIG_CC_OPTIMIZE_FOR_SIZE=y
- CONFIG_SYSCTL=y
- # CONFIG_EMBEDDED is not set
- CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_SYSCTL_SYSCALL_CHECK=y
- CONFIG_KALLSYMS=y
- CONFIG_KALLSYMS_ALL=y
- # CONFIG_KALLSYMS_EXTRA_PASS is not set
-@@ -107,6 +112,7 @@ CONFIG_HOTPLUG=y
- CONFIG_PRINTK=y
- CONFIG_BUG=y
- CONFIG_ELF_CORE=y
-+CONFIG_PCSPKR_PLATFORM=y
- # CONFIG_COMPAT_BRK is not set
- CONFIG_BASE_FULL=y
- CONFIG_FUTEX=y
-@@ -129,12 +135,14 @@ CONFIG_KPROBES=y
- CONFIG_KRETPROBES=y
- CONFIG_HAVE_KPROBES=y
- CONFIG_HAVE_KRETPROBES=y
-+# CONFIG_HAVE_DMA_ATTRS is not set
- CONFIG_PROC_PAGE_MONITOR=y
- CONFIG_SLABINFO=y
- CONFIG_RT_MUTEXES=y
- # CONFIG_TINY_SHMEM is not set
- CONFIG_BASE_SMALL=0
- CONFIG_MODULES=y
-+# CONFIG_MODULE_FORCE_LOAD is not set
- CONFIG_MODULE_UNLOAD=y
- # CONFIG_MODULE_FORCE_UNLOAD is not set
- CONFIG_MODVERSIONS=y
-@@ -178,11 +186,11 @@ CONFIG_LPARCFG=y
- # CONFIG_PPC_PMAC is not set
- # CONFIG_PPC_MAPLE is not set
- # CONFIG_PPC_PASEMI is not set
--# CONFIG_PPC_CELLEB is not set
- # CONFIG_PPC_PS3 is not set
- # CONFIG_PPC_CELL is not set
- # CONFIG_PPC_CELL_NATIVE is not set
- # CONFIG_PPC_IBM_CELL_BLADE is not set
-+# CONFIG_PPC_CELLEB is not set
- # CONFIG_PQ2ADS is not set
- CONFIG_PPC_NATIVE=y
- # CONFIG_UDBG_RTAS_CONSOLE is not set
-@@ -225,7 +233,6 @@ CONFIG_PREEMPT_NONE=y
- CONFIG_BINFMT_ELF=y
- CONFIG_COMPAT_BINFMT_ELF=y
- CONFIG_BINFMT_MISC=m
--CONFIG_FORCE_MAX_ZONEORDER=13
- CONFIG_HUGETLB_PAGE_SIZE_VARIABLE=y
- CONFIG_IOMMU_VMERGE=y
- CONFIG_IOMMU_HELPER=y
-@@ -255,6 +262,7 @@ CONFIG_SPARSEMEM_EXTREME=y
- CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
- CONFIG_SPARSEMEM_VMEMMAP=y
- # CONFIG_MEMORY_HOTPLUG is not set
-+CONFIG_PAGEFLAGS_EXTENDED=y
- CONFIG_SPLIT_PTLOCK_CPUS=4
- CONFIG_MIGRATION=y
- CONFIG_RESOURCES_64BIT=y
-@@ -263,6 +271,7 @@ CONFIG_BOUNCE=y
- CONFIG_NODES_SPAN_OTHER_NODES=y
- # CONFIG_PPC_HAS_HASH_64K is not set
- # CONFIG_PPC_64K_PAGES is not set
-+CONFIG_FORCE_MAX_ZONEORDER=13
- CONFIG_SCHED_SMT=y
- CONFIG_PROC_DEVICETREE=y
- # CONFIG_CMDLINE_BOOL is not set
-@@ -291,7 +300,10 @@ CONFIG_HOTPLUG_PCI=m
- # CONFIG_HOTPLUG_PCI_SHPC is not set
- CONFIG_HOTPLUG_PCI_RPA=m
- CONFIG_HOTPLUG_PCI_RPA_DLPAR=m
-+# CONFIG_HAS_RAPIDIO is not set
-+CONFIG_PAGE_OFFSET=0xc000000000000000
- CONFIG_KERNEL_START=0xc000000000000000
-+CONFIG_PHYSICAL_START=0x00000000
-
- #
- # Networking
-@@ -338,8 +350,6 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
- # CONFIG_TCP_MD5SIG is not set
- # CONFIG_IP_VS is not set
- # CONFIG_IPV6 is not set
--# CONFIG_INET6_XFRM_TUNNEL is not set
--# CONFIG_INET6_TUNNEL is not set
- # CONFIG_NETWORK_SECMARK is not set
- CONFIG_NETFILTER=y
- # CONFIG_NETFILTER_DEBUG is not set
-@@ -355,6 +365,7 @@ CONFIG_NF_CONNTRACK=m
- CONFIG_NF_CT_ACCT=y
- CONFIG_NF_CONNTRACK_MARK=y
- CONFIG_NF_CONNTRACK_EVENTS=y
-+# CONFIG_NF_CT_PROTO_DCCP is not set
- # CONFIG_NF_CT_PROTO_SCTP is not set
- CONFIG_NF_CT_PROTO_UDPLITE=m
- # CONFIG_NF_CONNTRACK_AMANDA is not set
-@@ -426,6 +437,7 @@ CONFIG_IP_NF_TARGET_MASQUERADE=m
- CONFIG_IP_NF_TARGET_REDIRECT=m
- CONFIG_IP_NF_TARGET_NETMAP=m
- CONFIG_NF_NAT_SNMP_BASIC=m
-+CONFIG_NF_NAT_PROTO_UDPLITE=m
- CONFIG_NF_NAT_FTP=m
- CONFIG_NF_NAT_IRC=m
- CONFIG_NF_NAT_TFTP=m
-@@ -492,6 +504,7 @@ CONFIG_FW_LOADER=y
- # CONFIG_CONNECTOR is not set
- # CONFIG_MTD is not set
- CONFIG_OF_DEVICE=y
-+CONFIG_OF_I2C=y
- CONFIG_PARPORT=m
- CONFIG_PARPORT_PC=m
- # CONFIG_PARPORT_SERIAL is not set
-@@ -545,7 +558,6 @@ CONFIG_IDE_PROC_FS=y
- #
- # IDE chipset support/bugfixes
- #
--CONFIG_IDE_GENERIC=y
- # CONFIG_BLK_DEV_PLATFORM is not set
- CONFIG_BLK_DEV_IDEDMA_SFF=y
-
-@@ -584,7 +596,7 @@ CONFIG_BLK_DEV_AMD74XX=y
- # CONFIG_BLK_DEV_VIA82CXXX is not set
- # CONFIG_BLK_DEV_TC86C001 is not set
- CONFIG_BLK_DEV_IDEDMA=y
--CONFIG_IDE_ARCH_OBSOLETE_INIT=y
-+# CONFIG_BLK_DEV_HD_ONLY is not set
- # CONFIG_BLK_DEV_HD is not set
-
- #
-@@ -671,61 +683,10 @@ CONFIG_SCSI_LPFC=m
- # CONFIG_SCSI_SRP is not set
- CONFIG_ATA=y
- # CONFIG_ATA_NONSTANDARD is not set
-+CONFIG_SATA_PMP=y
- # CONFIG_SATA_AHCI is not set
--# CONFIG_SATA_SVW is not set
--# CONFIG_ATA_PIIX is not set
--# CONFIG_SATA_MV is not set
--# CONFIG_SATA_NV is not set
--# CONFIG_PDC_ADMA is not set
--# CONFIG_SATA_QSTOR is not set
--# CONFIG_SATA_PROMISE is not set
--# CONFIG_SATA_SX4 is not set
--# CONFIG_SATA_SIL is not set
- # CONFIG_SATA_SIL24 is not set
--# CONFIG_SATA_SIS is not set
--# CONFIG_SATA_ULI is not set
--# CONFIG_SATA_VIA is not set
--# CONFIG_SATA_VITESSE is not set
--# CONFIG_SATA_INIC162X is not set
--# CONFIG_PATA_ALI is not set
--# CONFIG_PATA_AMD is not set
--# CONFIG_PATA_ARTOP is not set
--# CONFIG_PATA_ATIIXP is not set
--# CONFIG_PATA_CMD640_PCI is not set
--# CONFIG_PATA_CMD64X is not set
--# CONFIG_PATA_CS5520 is not set
--# CONFIG_PATA_CS5530 is not set
--# CONFIG_PATA_CYPRESS is not set
--# CONFIG_PATA_EFAR is not set
--# CONFIG_ATA_GENERIC is not set
--# CONFIG_PATA_HPT366 is not set
--# CONFIG_PATA_HPT37X is not set
--# CONFIG_PATA_HPT3X2N is not set
--# CONFIG_PATA_HPT3X3 is not set
--# CONFIG_PATA_IT821X is not set
--# CONFIG_PATA_IT8213 is not set
--# CONFIG_PATA_JMICRON is not set
--# CONFIG_PATA_TRIFLEX is not set
--# CONFIG_PATA_MARVELL is not set
--# CONFIG_PATA_MPIIX is not set
--# CONFIG_PATA_OLDPIIX is not set
--# CONFIG_PATA_NETCELL is not set
--# CONFIG_PATA_NINJA32 is not set
--# CONFIG_PATA_NS87410 is not set
--# CONFIG_PATA_NS87415 is not set
--# CONFIG_PATA_OPTI is not set
--# CONFIG_PATA_OPTIDMA is not set
--# CONFIG_PATA_PDC_OLD is not set
--# CONFIG_PATA_RADISYS is not set
--# CONFIG_PATA_RZ1000 is not set
--# CONFIG_PATA_SC1200 is not set
--# CONFIG_PATA_SERVERWORKS is not set
--# CONFIG_PATA_PDC2027X is not set
--# CONFIG_PATA_SIL680 is not set
--# CONFIG_PATA_SIS is not set
--# CONFIG_PATA_VIA is not set
--CONFIG_PATA_WINBOND=y
--# CONFIG_PATA_PLATFORM is not set
-+# CONFIG_ATA_SFF is not set
- CONFIG_MD=y
- CONFIG_BLK_DEV_MD=y
- CONFIG_MD_LINEAR=y
-@@ -783,7 +744,6 @@ CONFIG_IBMVETH=y
- # CONFIG_IBM_NEW_EMAC_EMAC4 is not set
- CONFIG_NET_PCI=y
- CONFIG_PCNET32=y
--# CONFIG_PCNET32_NAPI is not set
- # CONFIG_AMD8111_ETH is not set
- # CONFIG_ADAPTEC_STARFIRE is not set
- # CONFIG_B44 is not set
-@@ -820,7 +780,6 @@ CONFIG_E1000=y
- # CONFIG_SIS190 is not set
- # CONFIG_SKGE is not set
- # CONFIG_SKY2 is not set
--# CONFIG_SK98LIN is not set
- # CONFIG_VIA_VELOCITY is not set
- CONFIG_TIGON3=y
- # CONFIG_BNX2 is not set
-@@ -829,7 +788,6 @@ CONFIG_TIGON3=y
- CONFIG_NETDEV_10000=y
- # CONFIG_CHELSIO_T1 is not set
- # CONFIG_CHELSIO_T3 is not set
--CONFIG_EHEA=m
- # CONFIG_IXGBE is not set
- CONFIG_IXGB=m
- # CONFIG_IXGB_NAPI is not set
-@@ -838,10 +796,10 @@ CONFIG_S2IO=m
- # CONFIG_MYRI10GE is not set
- # CONFIG_NETXEN_NIC is not set
- # CONFIG_NIU is not set
--# CONFIG_PASEMI_MAC is not set
- # CONFIG_MLX4_CORE is not set
- # CONFIG_TEHUTI is not set
- # CONFIG_BNX2X is not set
-+# CONFIG_SFC is not set
- CONFIG_TR=y
- CONFIG_IBMOL=y
- # CONFIG_3C359 is not set
-@@ -852,6 +810,7 @@ CONFIG_IBMOL=y
- #
- # CONFIG_WLAN_PRE80211 is not set
- # CONFIG_WLAN_80211 is not set
-+# CONFIG_IWLWIFI_LEDS is not set
-
- #
- # USB Network Adapters
-@@ -956,6 +915,7 @@ CONFIG_VT=y
- CONFIG_VT_CONSOLE=y
- CONFIG_HW_CONSOLE=y
- # CONFIG_VT_HW_CONSOLE_BINDING is not set
-+CONFIG_DEVKMEM=y
- # CONFIG_SERIAL_NONSTANDARD is not set
- # CONFIG_NOZOMI is not set
-
-@@ -1000,13 +960,7 @@ CONFIG_DEVPORT=y
- CONFIG_I2C=y
- CONFIG_I2C_BOARDINFO=y
- # CONFIG_I2C_CHARDEV is not set
--
--#
--# I2C Algorithms
--#
- CONFIG_I2C_ALGOBIT=y
--# CONFIG_I2C_ALGOPCF is not set
--# CONFIG_I2C_ALGOPCA is not set
-
- #
- # I2C Hardware Bus support
-@@ -1035,6 +989,7 @@ CONFIG_I2C_ALGOBIT=y
- # CONFIG_I2C_VIA is not set
- # CONFIG_I2C_VIAPRO is not set
- # CONFIG_I2C_VOODOO3 is not set
-+# CONFIG_I2C_PCA_PLATFORM is not set
-
- #
- # Miscellaneous I2C Chip support
-@@ -1044,19 +999,13 @@ CONFIG_I2C_ALGOBIT=y
- # CONFIG_SENSORS_PCF8574 is not set
- # CONFIG_PCF8575 is not set
- # CONFIG_SENSORS_PCF8591 is not set
--# CONFIG_TPS65010 is not set
- # CONFIG_SENSORS_MAX6875 is not set
- # CONFIG_SENSORS_TSL2550 is not set
- # CONFIG_I2C_DEBUG_CORE is not set
- # CONFIG_I2C_DEBUG_ALGO is not set
- # CONFIG_I2C_DEBUG_BUS is not set
- # CONFIG_I2C_DEBUG_CHIP is not set
--
--#
--# SPI support
--#
- # CONFIG_SPI is not set
--# CONFIG_SPI_MASTER is not set
- # CONFIG_W1 is not set
- # CONFIG_POWER_SUPPLY is not set
- # CONFIG_HWMON is not set
-@@ -1073,12 +1022,22 @@ CONFIG_SSB_POSSIBLE=y
- # Multifunction device drivers
- #
- # CONFIG_MFD_SM501 is not set
-+# CONFIG_HTC_PASIC3 is not set
-
- #
- # Multimedia devices
- #
-+
-+#
-+# Multimedia core support
-+#
- # CONFIG_VIDEO_DEV is not set
- # CONFIG_DVB_CORE is not set
-+# CONFIG_VIDEO_MEDIA is not set
-+
-+#
-+# Multimedia drivers
-+#
- # CONFIG_DAB is not set
-
- #
-@@ -1098,8 +1057,8 @@ CONFIG_FB_CFB_IMAGEBLIT=y
- # CONFIG_FB_SYS_FILLRECT is not set
- # CONFIG_FB_SYS_COPYAREA is not set
- # CONFIG_FB_SYS_IMAGEBLIT is not set
-+# CONFIG_FB_FOREIGN_ENDIAN is not set
- # CONFIG_FB_SYS_FOPS is not set
--CONFIG_FB_DEFERRED_IO=y
- # CONFIG_FB_SVGALIB is not set
- CONFIG_FB_MACMODES=y
- CONFIG_FB_BACKLIGHT=y
-@@ -1209,11 +1168,13 @@ CONFIG_USB_DEVICE_CLASS=y
- #
- # USB Host Controller Drivers
- #
-+# CONFIG_USB_C67X00_HCD is not set
- CONFIG_USB_EHCI_HCD=y
- # CONFIG_USB_EHCI_ROOT_HUB_TT is not set
- # CONFIG_USB_EHCI_TT_NEWSCHED is not set
- # CONFIG_USB_EHCI_HCD_PPC_OF is not set
- # CONFIG_USB_ISP116X_HCD is not set
-+# CONFIG_USB_ISP1760_HCD is not set
- CONFIG_USB_OHCI_HCD=y
- # CONFIG_USB_OHCI_HCD_PPC_OF is not set
- # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
-@@ -1247,7 +1208,9 @@ CONFIG_USB_STORAGE=y
- # CONFIG_USB_STORAGE_SDDR55 is not set
- # CONFIG_USB_STORAGE_JUMPSHOT is not set
- # CONFIG_USB_STORAGE_ALAUDA is not set
-+CONFIG_USB_STORAGE_ONETOUCH=y
- # CONFIG_USB_STORAGE_KARMA is not set
-+# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
- # CONFIG_USB_LIBUSUAL is not set
-
- #
-@@ -1290,6 +1253,7 @@ CONFIG_USB_MON=y
- # CONFIG_MMC is not set
- # CONFIG_MEMSTICK is not set
- # CONFIG_NEW_LEDS is not set
-+# CONFIG_ACCESSIBILITY is not set
- CONFIG_INFINIBAND=m
- CONFIG_INFINIBAND_USER_MAD=m
- CONFIG_INFINIBAND_USER_ACCESS=m
-@@ -1312,10 +1276,6 @@ CONFIG_INFINIBAND_SRP=m
- # CONFIG_RTC_CLASS is not set
- # CONFIG_DMADEVICES is not set
- # CONFIG_AUXDISPLAY is not set
--
--#
--# Userspace I/O
--#
- # CONFIG_UIO is not set
-
- #
-@@ -1349,11 +1309,12 @@ CONFIG_JFS_SECURITY=y
- CONFIG_FS_POSIX_ACL=y
- CONFIG_XFS_FS=m
- # CONFIG_XFS_QUOTA is not set
--CONFIG_XFS_SECURITY=y
- CONFIG_XFS_POSIX_ACL=y
- # CONFIG_XFS_RT is not set
-+# CONFIG_XFS_DEBUG is not set
- # CONFIG_GFS2_FS is not set
- CONFIG_OCFS2_FS=m
-+CONFIG_OCFS2_FS_O2CB=m
- CONFIG_OCFS2_DEBUG_MASKLOG=y
- # CONFIG_OCFS2_DEBUG_FS is not set
- CONFIG_DNOTIFY=y
-@@ -1419,13 +1380,11 @@ CONFIG_NFS_FS=y
- CONFIG_NFS_V3=y
- CONFIG_NFS_V3_ACL=y
- CONFIG_NFS_V4=y
--# CONFIG_NFS_DIRECTIO is not set
- CONFIG_NFSD=y
- CONFIG_NFSD_V2_ACL=y
- CONFIG_NFSD_V3=y
- CONFIG_NFSD_V3_ACL=y
- CONFIG_NFSD_V4=y
--CONFIG_NFSD_TCP=y
- CONFIG_LOCKD=y
- CONFIG_LOCKD_V4=y
- CONFIG_EXPORTFS=y
-@@ -1500,9 +1459,10 @@ CONFIG_NLS_ISO8859_1=y
- # Library routines
- #
- CONFIG_BITREVERSE=y
-+# CONFIG_GENERIC_FIND_FIRST_BIT is not set
- CONFIG_CRC_CCITT=m
- # CONFIG_CRC16 is not set
--# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC_ITU_T=m
- CONFIG_CRC32=y
- # CONFIG_CRC7 is not set
- CONFIG_LIBCRC32C=m
-@@ -1526,6 +1486,7 @@ CONFIG_HAVE_LMB=y
- # CONFIG_PRINTK_TIME is not set
- CONFIG_ENABLE_WARN_DEPRECATED=y
- CONFIG_ENABLE_MUST_CHECK=y
-+CONFIG_FRAME_WARN=2048
- CONFIG_MAGIC_SYSRQ=y
- # CONFIG_UNUSED_SYMBOLS is not set
- CONFIG_DEBUG_FS=y
-@@ -1536,18 +1497,23 @@ CONFIG_DETECT_SOFTLOCKUP=y
- CONFIG_SCHED_DEBUG=y
- # CONFIG_SCHEDSTATS is not set
- # CONFIG_TIMER_STATS is not set
-+# CONFIG_DEBUG_OBJECTS is not set
- # CONFIG_SLUB_DEBUG_ON is not set
- # CONFIG_SLUB_STATS is not set
- # CONFIG_DEBUG_RT_MUTEXES is not set
- # CONFIG_RT_MUTEX_TESTER is not set
- # CONFIG_DEBUG_SPINLOCK is not set
- # CONFIG_DEBUG_MUTEXES is not set
-+# CONFIG_DEBUG_LOCK_ALLOC is not set
-+# CONFIG_PROVE_LOCKING is not set
-+# CONFIG_LOCK_STAT is not set
- # CONFIG_DEBUG_SPINLOCK_SLEEP is not set
- # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
- # CONFIG_DEBUG_KOBJECT is not set
- CONFIG_DEBUG_BUGVERBOSE=y
- # CONFIG_DEBUG_INFO is not set
- # CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_WRITECOUNT is not set
- # CONFIG_DEBUG_LIST is not set
- # CONFIG_DEBUG_SG is not set
- # CONFIG_BOOT_PRINTK_DELAY is not set
-@@ -1577,53 +1543,83 @@ CONFIG_VIRQ_DEBUG=y
- # CONFIG_SECURITY is not set
- # CONFIG_SECURITY_FILE_CAPABILITIES is not set
- CONFIG_CRYPTO=y
-+
-+#
-+# Crypto core or helper
-+#
- CONFIG_CRYPTO_ALGAPI=y
- CONFIG_CRYPTO_AEAD=m
- CONFIG_CRYPTO_BLKCIPHER=y
--CONFIG_CRYPTO_SEQIV=m
- CONFIG_CRYPTO_HASH=y
- CONFIG_CRYPTO_MANAGER=y
-+CONFIG_CRYPTO_GF128MUL=m
-+CONFIG_CRYPTO_NULL=m
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_AUTHENC=m
-+CONFIG_CRYPTO_TEST=m
-+
-+#
-+# Authenticated Encryption with Associated Data
-+#
-+CONFIG_CRYPTO_CCM=m
-+CONFIG_CRYPTO_GCM=m
-+CONFIG_CRYPTO_SEQIV=m
-+
-+#
-+# Block modes
-+#
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_CTR=m
-+# CONFIG_CRYPTO_CTS is not set
-+CONFIG_CRYPTO_ECB=m
-+# CONFIG_CRYPTO_LRW is not set
-+CONFIG_CRYPTO_PCBC=m
-+# CONFIG_CRYPTO_XTS is not set
-+
-+#
-+# Hash modes
-+#
- CONFIG_CRYPTO_HMAC=y
- # CONFIG_CRYPTO_XCBC is not set
--CONFIG_CRYPTO_NULL=m
-+
-+#
-+# Digest
-+#
-+CONFIG_CRYPTO_CRC32C=m
- CONFIG_CRYPTO_MD4=m
- CONFIG_CRYPTO_MD5=y
-+CONFIG_CRYPTO_MICHAEL_MIC=m
- CONFIG_CRYPTO_SHA1=m
- CONFIG_CRYPTO_SHA256=m
- CONFIG_CRYPTO_SHA512=m
--CONFIG_CRYPTO_WP512=m
- CONFIG_CRYPTO_TGR192=m
--CONFIG_CRYPTO_GF128MUL=m
--CONFIG_CRYPTO_ECB=m
--CONFIG_CRYPTO_CBC=y
--CONFIG_CRYPTO_PCBC=m
--# CONFIG_CRYPTO_LRW is not set
--# CONFIG_CRYPTO_XTS is not set
--CONFIG_CRYPTO_CTR=m
--CONFIG_CRYPTO_GCM=m
--CONFIG_CRYPTO_CCM=m
--# CONFIG_CRYPTO_CRYPTD is not set
--CONFIG_CRYPTO_DES=y
--# CONFIG_CRYPTO_FCRYPT is not set
--CONFIG_CRYPTO_BLOWFISH=m
--CONFIG_CRYPTO_TWOFISH=m
--CONFIG_CRYPTO_TWOFISH_COMMON=m
--CONFIG_CRYPTO_SERPENT=m
-+CONFIG_CRYPTO_WP512=m
-+
-+#
-+# Ciphers
-+#
- CONFIG_CRYPTO_AES=m
-+CONFIG_CRYPTO_ANUBIS=m
-+CONFIG_CRYPTO_ARC4=m
-+CONFIG_CRYPTO_BLOWFISH=m
-+# CONFIG_CRYPTO_CAMELLIA is not set
- CONFIG_CRYPTO_CAST5=m
- CONFIG_CRYPTO_CAST6=m
--CONFIG_CRYPTO_TEA=m
--CONFIG_CRYPTO_ARC4=m
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
- CONFIG_CRYPTO_KHAZAD=m
--CONFIG_CRYPTO_ANUBIS=m
--# CONFIG_CRYPTO_SEED is not set
- CONFIG_CRYPTO_SALSA20=m
-+# CONFIG_CRYPTO_SEED is not set
-+CONFIG_CRYPTO_SERPENT=m
-+CONFIG_CRYPTO_TEA=m
-+CONFIG_CRYPTO_TWOFISH=m
-+CONFIG_CRYPTO_TWOFISH_COMMON=m
-+
-+#
-+# Compression
-+#
- CONFIG_CRYPTO_DEFLATE=m
--CONFIG_CRYPTO_MICHAEL_MIC=m
--CONFIG_CRYPTO_CRC32C=m
--# CONFIG_CRYPTO_CAMELLIA is not set
--CONFIG_CRYPTO_TEST=m
--CONFIG_CRYPTO_AUTHENC=m
- CONFIG_CRYPTO_LZO=m
- # CONFIG_CRYPTO_HW is not set
- # CONFIG_PPC_CLOCK is not set
-+# CONFIG_VIRTUALIZATION is not set
-diff --git a/arch/powerpc/kernel/init_task.c b/arch/powerpc/kernel/init_task.c
-index 941043a..4c85b8d 100644
---- a/arch/powerpc/kernel/init_task.c
-+++ b/arch/powerpc/kernel/init_task.c
-@@ -8,7 +8,6 @@
- #include
-
- static struct fs_struct init_fs = INIT_FS;
--static struct files_struct init_files = INIT_FILES;
- static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
- static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
- struct mm_struct init_mm = INIT_MM(init_mm);
-diff --git a/arch/powerpc/kernel/prom_init_check.sh b/arch/powerpc/kernel/prom_init_check.sh
-index 8e24fc1..31729a9 100644
---- a/arch/powerpc/kernel/prom_init_check.sh
-+++ b/arch/powerpc/kernel/prom_init_check.sh
-@@ -20,7 +20,7 @@ WHITELIST="add_reloc_offset __bss_start __bss_stop copy_and_flush
- _end enter_prom memcpy memset reloc_offset __secondary_hold
- __secondary_hold_acknowledge __secondary_hold_spinloop __start
- strcmp strcpy strlcpy strlen strncmp strstr logo_linux_clut224
--reloc_got2"
-+reloc_got2 kernstart_addr"
-
- NM="$1"
- OBJ="$2"
-diff --git a/arch/powerpc/mm/hash_low_32.S b/arch/powerpc/mm/hash_low_32.S
-index ddeaf9e..b9ba7d9 100644
---- a/arch/powerpc/mm/hash_low_32.S
-+++ b/arch/powerpc/mm/hash_low_32.S
-@@ -1,6 +1,4 @@
- /*
-- * $Id: hashtable.S,v 1.6 1999/10/08 01:56:15 paulus Exp $
-- *
- * PowerPC version
- * Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
- * Rewritten by Cort Dougan (cort@cs.nmt.edu) for PReP
-diff --git a/arch/powerpc/mm/pgtable_32.c b/arch/powerpc/mm/pgtable_32.c
-index 80d1bab..e0ff59f 100644
---- a/arch/powerpc/mm/pgtable_32.c
-+++ b/arch/powerpc/mm/pgtable_32.c
-@@ -402,7 +402,7 @@ void __set_fixmap (enum fixed_addresses idx, phys_addr_t phys, pgprot_t flags)
- return;
- }
-
-- map_page(address, phys, flags);
-+ map_page(address, phys, pgprot_val(flags));
- fixmaps++;
- }
-
-diff --git a/arch/powerpc/platforms/ps3/mm.c b/arch/powerpc/platforms/ps3/mm.c
-index 5b3fb2b..3a58ffa 100644
---- a/arch/powerpc/platforms/ps3/mm.c
-+++ b/arch/powerpc/platforms/ps3/mm.c
-@@ -317,6 +317,9 @@ static int __init ps3_mm_add_memory(void)
- return result;
- }
-
-+ lmb_add(start_addr, map.r1.size);
-+ lmb_analyze();
-+
- result = online_pages(start_pfn, nr_pages);
-
- if (result)
-diff --git a/arch/powerpc/sysdev/mpic.c b/arch/powerpc/sysdev/mpic.c
-index 8619f2a..7680001 100644
---- a/arch/powerpc/sysdev/mpic.c
-+++ b/arch/powerpc/sysdev/mpic.c
-@@ -1331,6 +1331,9 @@ void mpic_irq_set_priority(unsigned int irq, unsigned int pri)
- unsigned long flags;
- u32 reg;
-
-+ if (!mpic)
-+ return;
-+
- spin_lock_irqsave(&mpic_lock, flags);
- if (is_ipi) {
- reg = mpic_ipi_read(src - mpic->ipi_vecs[0]) &
-@@ -1346,23 +1349,6 @@ void mpic_irq_set_priority(unsigned int irq, unsigned int pri)
- spin_unlock_irqrestore(&mpic_lock, flags);
- }
-
--unsigned int mpic_irq_get_priority(unsigned int irq)
--{
-- unsigned int is_ipi;
-- struct mpic *mpic = mpic_find(irq, &is_ipi);
-- unsigned int src = mpic_irq_to_hw(irq);
-- unsigned long flags;
-- u32 reg;
--
-- spin_lock_irqsave(&mpic_lock, flags);
-- if (is_ipi)
-- reg = mpic_ipi_read(src = mpic->ipi_vecs[0]);
-- else
-- reg = mpic_irq_read(src, MPIC_INFO(IRQ_VECTOR_PRI));
-- spin_unlock_irqrestore(&mpic_lock, flags);
-- return (reg & MPIC_VECPRI_PRIORITY_MASK) >> MPIC_VECPRI_PRIORITY_SHIFT;
--}
--
- void mpic_setup_this_cpu(void)
- {
- #ifdef CONFIG_SMP
-diff --git a/arch/s390/kernel/init_task.c b/arch/s390/kernel/init_task.c
-index d494161..7ad0039 100644
---- a/arch/s390/kernel/init_task.c
-+++ b/arch/s390/kernel/init_task.c
-@@ -17,7 +17,6 @@
- #include
-
- static struct fs_struct init_fs = INIT_FS;
--static struct files_struct init_files = INIT_FILES;
- static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
- static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
- struct mm_struct init_mm = INIT_MM(init_mm);
-diff --git a/arch/sh/drivers/heartbeat.c b/arch/sh/drivers/heartbeat.c
-index ab77b0e..938817e 100644
---- a/arch/sh/drivers/heartbeat.c
-+++ b/arch/sh/drivers/heartbeat.c
-@@ -154,4 +154,4 @@ module_exit(heartbeat_exit);
-
- MODULE_VERSION(DRV_VERSION);
- MODULE_AUTHOR("Paul Mundt");
--MODULE_LICENSE("GPLv2");
-+MODULE_LICENSE("GPL v2");
-diff --git a/arch/sh/kernel/cpu/sh4a/clock-sh7785.c b/arch/sh/kernel/cpu/sh4a/clock-sh7785.c
-index 805535a..27fa81b 100644
---- a/arch/sh/kernel/cpu/sh4a/clock-sh7785.c
-+++ b/arch/sh/kernel/cpu/sh4a/clock-sh7785.c
-@@ -26,7 +26,7 @@ static int pfc_divisors[] = { 1, 1, 1, 1, 1, 1, 1, 18,
-
- static void master_clk_init(struct clk *clk)
- {
-- clk->rate *= 36;
-+ clk->rate *= pfc_divisors[ctrl_inl(FRQMR1) & 0x000f];
- }
-
- static struct clk_ops sh7785_master_clk_ops = {
-diff --git a/arch/sh/kernel/entry-common.S b/arch/sh/kernel/entry-common.S
-index 926b2e7..718bd23 100644
---- a/arch/sh/kernel/entry-common.S
-+++ b/arch/sh/kernel/entry-common.S
-@@ -1,9 +1,6 @@
--/* $Id: entry.S,v 1.37 2004/06/11 13:02:46 doyu Exp $
-- *
-- * linux/arch/sh/entry.S
-- *
-+/*
- * Copyright (C) 1999, 2000, 2002 Niibe Yutaka
-- * Copyright (C) 2003 Paul Mundt
-+ * Copyright (C) 2003 - 2008 Paul Mundt
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License. See the file "COPYING" in the main directory of this archive
-@@ -262,6 +259,7 @@ __restore_all:
-
- .align 2
- syscall_badsys: ! Bad syscall number
-+ get_current_thread_info r8, r0
- mov #-ENOSYS, r0
- bra resume_userspace
- mov.l r0, @(OFF_R0,r15) ! Return value
-@@ -281,7 +279,9 @@ debug_trap:
- mov.l 1f, r8
- add r0, r8
- mov.l @r8, r8
-- jmp @r8
-+ jsr @r8
-+ nop
-+ bra __restore_all
- nop
-
- .align 2
-diff --git a/arch/sh/kernel/head_32.S b/arch/sh/kernel/head_32.S
-index d67d7ed..ae0a382 100644
---- a/arch/sh/kernel/head_32.S
-+++ b/arch/sh/kernel/head_32.S
-@@ -30,8 +30,8 @@ ENTRY(empty_zero_page)
- .long 0 /* RAMDISK_FLAGS */
- .long 0x0200 /* ORIG_ROOT_DEV */
- .long 1 /* LOADER_TYPE */
-- .long 0x00360000 /* INITRD_START */
-- .long 0x000a0000 /* INITRD_SIZE */
-+ .long 0x00000000 /* INITRD_START */
-+ .long 0x00000000 /* INITRD_SIZE */
- #ifdef CONFIG_32BIT
- .long 0x53453f00 + 32 /* "SE?" = 32 bit */
- #else
-diff --git a/arch/sh/kernel/init_task.c b/arch/sh/kernel/init_task.c
-index f9bcc60..b151a25 100644
---- a/arch/sh/kernel/init_task.c
-+++ b/arch/sh/kernel/init_task.c
-@@ -8,7 +8,6 @@
- #include
-
- static struct fs_struct init_fs = INIT_FS;
--static struct files_struct init_files = INIT_FILES;
- static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
- static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
- struct pt_regs fake_swapper_regs;
-diff --git a/arch/sh/kernel/kgdb_stub.c b/arch/sh/kernel/kgdb_stub.c
-index 832641b..bf8ac4c 100644
---- a/arch/sh/kernel/kgdb_stub.c
-+++ b/arch/sh/kernel/kgdb_stub.c
-@@ -274,8 +274,7 @@ static char *mem_to_hex(const char *mem, char *buf, const int count)
- }
- for (i = 0; i < count; i++) {
- ch = *mem++;
-- *buf++ = highhex(ch);
-- *buf++ = lowhex(ch);
-+ buf = pack_hex_byte(buf, ch);
- }
- *buf = 0;
- return (buf);
-@@ -427,8 +426,8 @@ static void put_packet(char *buffer)
-
- /* '#' Separator, put high and low components of checksum */
- put_debug_char('#');
-- put_debug_char(highhex(checksum));
-- put_debug_char(lowhex(checksum));
-+ put_debug_char(hex_asc_hi(checksum));
-+ put_debug_char(hex_asc_lo(checksum));
- }
- while ((get_debug_char()) != '+'); /* While no ack */
- }
-@@ -650,8 +649,8 @@ static void undo_single_step(void)
- static void send_signal_msg(const int signum)
- {
- out_buffer[0] = 'S';
-- out_buffer[1] = highhex(signum);
-- out_buffer[2] = lowhex(signum);
-+ out_buffer[1] = hex_asc_hi(signum);
-+ out_buffer[2] = hex_asc_lo(signum);
- out_buffer[3] = 0;
- put_packet(out_buffer);
- }
-diff --git a/arch/sh/kernel/setup.c b/arch/sh/kernel/setup.c
-index 516bde9..bca2bbc 100644
---- a/arch/sh/kernel/setup.c
-+++ b/arch/sh/kernel/setup.c
-@@ -292,6 +292,17 @@ void __init setup_arch(char **cmdline_p)
-
- ROOT_DEV = old_decode_dev(ORIG_ROOT_DEV);
-
-+ printk(KERN_NOTICE "Boot params:\n"
-+ "... MOUNT_ROOT_RDONLY - %08lx\n"
-+ "... RAMDISK_FLAGS - %08lx\n"
-+ "... ORIG_ROOT_DEV - %08lx\n"
-+ "... LOADER_TYPE - %08lx\n"
-+ "... INITRD_START - %08lx\n"
-+ "... INITRD_SIZE - %08lx\n",
-+ MOUNT_ROOT_RDONLY, RAMDISK_FLAGS,
-+ ORIG_ROOT_DEV, LOADER_TYPE,
-+ INITRD_START, INITRD_SIZE);
-+
- #ifdef CONFIG_BLK_DEV_RAM
- rd_image_start = RAMDISK_FLAGS & RAMDISK_IMAGE_START_MASK;
- rd_prompt = ((RAMDISK_FLAGS & RAMDISK_PROMPT_FLAG) != 0);
-diff --git a/arch/sh/kernel/traps.c b/arch/sh/kernel/traps.c
-index a3bdc68..438f1eb 100644
---- a/arch/sh/kernel/traps.c
-+++ b/arch/sh/kernel/traps.c
-@@ -4,6 +4,7 @@
- #include
- #include
- #include
-+#include
- #include
-
- #ifdef CONFIG_BUG
-@@ -21,7 +22,14 @@ static void handle_BUG(struct pt_regs *regs)
-
- int is_valid_bugaddr(unsigned long addr)
- {
-- return addr >= PAGE_OFFSET;
-+ unsigned short opcode;
-+
-+ if (addr < PAGE_OFFSET)
-+ return 0;
-+ if (probe_kernel_address((u16 *)addr, opcode))
-+ return 0;
-+
-+ return opcode == TRAPA_BUG_OPCODE;
- }
- #endif
-
-diff --git a/arch/sh/lib/memcpy-sh4.S b/arch/sh/lib/memcpy-sh4.S
-index 560bc17..459fa92 100644
---- a/arch/sh/lib/memcpy-sh4.S
-+++ b/arch/sh/lib/memcpy-sh4.S
-@@ -126,10 +126,10 @@
-
- mov.l r3,@-r0 ! 30 LS
- #else
--3: mov r1,r3 ! OPQR
-+3: mov r7,r3 ! OPQR
- shlr8 r3 ! xOPQ
-- mov.l @(r0,r5),r1 ! KLMN
-- mov r1,r6
-+ mov.l @(r0,r5),r7 ! KLMN
-+ mov r7,r6
- shll16 r6
- shll8 r6 ! Nxxx
- or r6,r3 ! NOPQ
-@@ -733,24 +733,24 @@ ENTRY(memcpy)
- movca.l r0,@r1 ! 40 LS (latency=3-7)
- add #-0x1c, r1 ! 50 EX
-
-- mov.l r3, @(0x1c,r1) ! 33 LS
-+ mov.l r3, @(0x18,r1) ! 33 LS
- xtrct r11, r10 ! 48 EX
-
-- mov.l r6, @(0x18,r1) ! 33 LS
-+ mov.l r6, @(0x14,r1) ! 33 LS
- xtrct r12, r11 ! 48 EX
-
-- mov.l r7, @(0x14,r1) ! 33 LS
-+ mov.l r7, @(0x10,r1) ! 33 LS
-
-- mov.l r8, @(0x10,r1) ! 33 LS
-- add #-0x3e, r5 ! 50 EX
-+ mov.l r8, @(0x0c,r1) ! 33 LS
-+ add #-0x1e, r5 ! 50 EX
-
-- mov.l r9, @(0x0c,r1) ! 33 LS
-+ mov.l r9, @(0x08,r1) ! 33 LS
- cmp/eq r2,r1 ! 54 MT
-
-- mov.l r10, @(0x08,r1) ! 33 LS
-+ mov.l r10, @(0x04,r1) ! 33 LS
- bf/s 2b ! 109 BR
-
-- mov.l r11, @(0x04,r1) ! 33 LS
-+ mov.l r11, @(0x00,r1) ! 33 LS
- #endif
-
- mov.l @r15+, r12
-diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig
-index d211fdb..789724e 100644
---- a/arch/sparc/Kconfig
-+++ b/arch/sparc/Kconfig
-@@ -1,4 +1,3 @@
--# $Id: config.in,v 1.113 2002/01/24 22:14:44 davem Exp $
- # For a description of the syntax of this configuration file,
- # see Documentation/kbuild/kconfig-language.txt.
- #
-diff --git a/arch/sparc/boot/Makefile b/arch/sparc/boot/Makefile
-index b365084..22d331e 100644
---- a/arch/sparc/boot/Makefile
-+++ b/arch/sparc/boot/Makefile
-@@ -1,4 +1,3 @@
--# $Id: Makefile,v 1.10 2000/02/23 08:17:46 jj Exp $
- # Makefile for the Sparc boot stuff.
- #
- # Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/arch/sparc/boot/btfixupprep.c b/arch/sparc/boot/btfixupprep.c
-index dc7b054..52a4208 100644
---- a/arch/sparc/boot/btfixupprep.c
-+++ b/arch/sparc/boot/btfixupprep.c
-@@ -1,4 +1,4 @@
--/* $Id: btfixupprep.c,v 1.6 2001/08/22 15:27:47 davem Exp $
-+/*
- Simple utility to prepare vmlinux image for sparc.
- Resolves all BTFIXUP uses and settings and creates
- a special .s object to link to the image.
-diff --git a/arch/sparc/boot/piggyback.c b/arch/sparc/boot/piggyback.c
-index 6962cc6..c9f500c 100644
---- a/arch/sparc/boot/piggyback.c
-+++ b/arch/sparc/boot/piggyback.c
-@@ -1,4 +1,4 @@
--/* $Id: piggyback.c,v 1.4 2000/12/05 00:48:57 anton Exp $
-+/*
- Simple utility to make a single-image install kernel with initial ramdisk
- for Sparc tftpbooting without need to set up nfs.
-
-diff --git a/arch/sparc/kernel/ebus.c b/arch/sparc/kernel/ebus.c
-index 96344ff..92c6fc0 100644
---- a/arch/sparc/kernel/ebus.c
-+++ b/arch/sparc/kernel/ebus.c
-@@ -1,4 +1,4 @@
--/* $Id: ebus.c,v 1.20 2002/01/05 01:13:43 davem Exp $
-+/*
- * ebus.c: PCI to EBus bridge device.
- *
- * Copyright (C) 1997 Eddie C. Dost (ecd@skynet.be)
-diff --git a/arch/sparc/kernel/etrap.S b/arch/sparc/kernel/etrap.S
-index a8b35be..f37d961 100644
---- a/arch/sparc/kernel/etrap.S
-+++ b/arch/sparc/kernel/etrap.S
-@@ -1,4 +1,4 @@
--/* $Id: etrap.S,v 1.31 2000/01/08 16:38:18 anton Exp $
-+/*
- * etrap.S: Sparc trap window preparation for entry into the
- * Linux kernel.
- *
-diff --git a/arch/sparc/kernel/head.S b/arch/sparc/kernel/head.S
-index 8bec05f..3bfd608 100644
---- a/arch/sparc/kernel/head.S
-+++ b/arch/sparc/kernel/head.S
-@@ -1,4 +1,4 @@
--/* $Id: head.S,v 1.105 2001/08/12 09:08:56 davem Exp $
-+/*
- * head.S: The initial boot code for the Sparc port of Linux.
- *
- * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/arch/sparc/kernel/idprom.c b/arch/sparc/kernel/idprom.c
-index 3a5bad5..7220562 100644
---- a/arch/sparc/kernel/idprom.c
-+++ b/arch/sparc/kernel/idprom.c
-@@ -1,4 +1,4 @@
--/* $Id: idprom.c,v 1.24 1999/08/31 06:54:20 davem Exp $
-+/*
- * idprom.c: Routines to load the idprom into kernel addresses and
- * interpret the data contained within.
- *
-diff --git a/arch/sparc/kernel/init_task.c b/arch/sparc/kernel/init_task.c
-index d9d4f96..8e64ebc 100644
---- a/arch/sparc/kernel/init_task.c
-+++ b/arch/sparc/kernel/init_task.c
-@@ -9,7 +9,6 @@
- #include
-
- static struct fs_struct init_fs = INIT_FS;
--static struct files_struct init_files = INIT_FILES;
- static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
- static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
- struct mm_struct init_mm = INIT_MM(init_mm);
-diff --git a/arch/sparc/kernel/ioport.c b/arch/sparc/kernel/ioport.c
-index ad0ede2..7b17522 100644
---- a/arch/sparc/kernel/ioport.c
-+++ b/arch/sparc/kernel/ioport.c
-@@ -1,4 +1,4 @@
--/* $Id: ioport.c,v 1.45 2001/10/30 04:54:21 davem Exp $
-+/*
- * ioport.c: Simple io mapping allocator.
- *
- * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/arch/sparc/kernel/irq.c b/arch/sparc/kernel/irq.c
-index 01a6756..087390b 100644
---- a/arch/sparc/kernel/irq.c
-+++ b/arch/sparc/kernel/irq.c
-@@ -1,4 +1,4 @@
--/* $Id: irq.c,v 1.114 2001/12/11 04:55:51 davem Exp $
-+/*
- * arch/sparc/kernel/irq.c: Interrupt request handling routines. On the
- * Sparc the IRQs are basically 'cast in stone'
- * and you are supposed to probe the prom's device
-diff --git a/arch/sparc/kernel/muldiv.c b/arch/sparc/kernel/muldiv.c
-index 37b9a49..e352239 100644
---- a/arch/sparc/kernel/muldiv.c
-+++ b/arch/sparc/kernel/muldiv.c
-@@ -1,4 +1,4 @@
--/* $Id: muldiv.c,v 1.5 1997/12/15 20:07:20 ecd Exp $
-+/*
- * muldiv.c: Hardware multiply/division illegal instruction trap
- * for sun4c/sun4 (which do not have those instructions)
- *
-diff --git a/arch/sparc/kernel/rtrap.S b/arch/sparc/kernel/rtrap.S
-index ab818cd..ce30082 100644
---- a/arch/sparc/kernel/rtrap.S
-+++ b/arch/sparc/kernel/rtrap.S
-@@ -1,4 +1,4 @@
--/* $Id: rtrap.S,v 1.58 2002/01/31 03:30:05 davem Exp $
-+/*
- * rtrap.S: Return from Sparc trap low-level code.
- *
- * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/arch/sparc/kernel/setup.c b/arch/sparc/kernel/setup.c
-index 8a55c4f..a0ea0bc 100644
---- a/arch/sparc/kernel/setup.c
-+++ b/arch/sparc/kernel/setup.c
-@@ -1,4 +1,4 @@
--/* $Id: setup.c,v 1.126 2001/11/13 00:49:27 davem Exp $
-+/*
- * linux/arch/sparc/kernel/setup.c
- *
- * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/arch/sparc/kernel/sparc_ksyms.c b/arch/sparc/kernel/sparc_ksyms.c
-index aa8ee06..b23cea5 100644
---- a/arch/sparc/kernel/sparc_ksyms.c
-+++ b/arch/sparc/kernel/sparc_ksyms.c
-@@ -1,4 +1,4 @@
--/* $Id: sparc_ksyms.c,v 1.107 2001/07/17 16:17:33 anton Exp $
-+/*
- * arch/sparc/kernel/ksyms.c: Sparc specific ksyms support.
- *
- * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/arch/sparc/kernel/sun4d_irq.c b/arch/sparc/kernel/sun4d_irq.c
-index e0efab2..8ac5661 100644
---- a/arch/sparc/kernel/sun4d_irq.c
-+++ b/arch/sparc/kernel/sun4d_irq.c
-@@ -1,4 +1,4 @@
--/* $Id: sun4d_irq.c,v 1.29 2001/12/11 04:55:51 davem Exp $
-+/*
- * arch/sparc/kernel/sun4d_irq.c:
- * SS1000/SC2000 interrupt handling.
- *
-diff --git a/arch/sparc/kernel/trampoline.S b/arch/sparc/kernel/trampoline.S
-index 2dcdaa1..356c56a 100644
---- a/arch/sparc/kernel/trampoline.S
-+++ b/arch/sparc/kernel/trampoline.S
-@@ -1,4 +1,4 @@
--/* $Id: trampoline.S,v 1.14 2002/01/11 08:45:38 davem Exp $
-+/*
- * trampoline.S: SMP cpu boot-up trampoline code.
- *
- * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/arch/sparc/kernel/traps.c b/arch/sparc/kernel/traps.c
-index d404e79..978e9d8 100644
---- a/arch/sparc/kernel/traps.c
-+++ b/arch/sparc/kernel/traps.c
-@@ -1,4 +1,4 @@
--/* $Id: traps.c,v 1.64 2000/09/03 15:00:49 anton Exp $
-+/*
- * arch/sparc/kernel/traps.c
- *
- * Copyright 1995 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/arch/sparc/kernel/unaligned.c b/arch/sparc/kernel/unaligned.c
-index 33857be..c2a28c5 100644
---- a/arch/sparc/kernel/unaligned.c
-+++ b/arch/sparc/kernel/unaligned.c
-@@ -1,4 +1,4 @@
--/* $Id: unaligned.c,v 1.23 2001/12/21 00:54:31 davem Exp $
-+/*
- * unaligned.c: Unaligned load/store trap handling with special
- * cases for the kernel to do them more quickly.
- *
-diff --git a/arch/sparc/kernel/wof.S b/arch/sparc/kernel/wof.S
-index 083b121..4bce38d 100644
---- a/arch/sparc/kernel/wof.S
-+++ b/arch/sparc/kernel/wof.S
-@@ -1,4 +1,4 @@
--/* $Id: wof.S,v 1.40 2000/01/08 16:38:18 anton Exp $
-+/*
- * wof.S: Sparc window overflow handler.
- *
- * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/arch/sparc/kernel/wuf.S b/arch/sparc/kernel/wuf.S
-index d1a266b..82e5145 100644
---- a/arch/sparc/kernel/wuf.S
-+++ b/arch/sparc/kernel/wuf.S
-@@ -1,4 +1,4 @@
--/* $Id: wuf.S,v 1.39 2000/01/08 16:38:18 anton Exp $
-+/*
- * wuf.S: Window underflow trap handler for the Sparc.
- *
- * Copyright (C) 1995 David S. Miller
-diff --git a/arch/sparc/lib/Makefile b/arch/sparc/lib/Makefile
-index 76effdb..6e303e1 100644
---- a/arch/sparc/lib/Makefile
-+++ b/arch/sparc/lib/Makefile
-@@ -1,4 +1,3 @@
--# $Id: Makefile,v 1.35 2000/12/15 00:41:18 davem Exp $
- # Makefile for Sparc library files..
- #
-
-diff --git a/arch/sparc/lib/ashldi3.S b/arch/sparc/lib/ashldi3.S
-index 52418a0..17912e6 100644
---- a/arch/sparc/lib/ashldi3.S
-+++ b/arch/sparc/lib/ashldi3.S
-@@ -1,4 +1,4 @@
--/* $Id: ashldi3.S,v 1.2 1999/11/19 04:11:46 davem Exp $
-+/*
- * ashldi3.S: GCC emits these for certain drivers playing
- * with long longs.
- *
-diff --git a/arch/sparc/lib/ashrdi3.S b/arch/sparc/lib/ashrdi3.S
-index 2848237..85398fd 100644
---- a/arch/sparc/lib/ashrdi3.S
-+++ b/arch/sparc/lib/ashrdi3.S
-@@ -1,4 +1,4 @@
--/* $Id: ashrdi3.S,v 1.4 1999/11/19 04:11:49 davem Exp $
-+/*
- * ashrdi3.S: The filesystem code creates all kinds of references to
- * this little routine on the sparc with gcc.
- *
-diff --git a/arch/sparc/lib/blockops.S b/arch/sparc/lib/blockops.S
-index a7c7ffa..804be87 100644
---- a/arch/sparc/lib/blockops.S
-+++ b/arch/sparc/lib/blockops.S
-@@ -1,4 +1,4 @@
--/* $Id: blockops.S,v 1.8 1998/01/30 10:58:44 jj Exp $
-+/*
- * blockops.S: Common block zero optimized routines.
- *
- * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/arch/sparc/lib/locks.S b/arch/sparc/lib/locks.S
-index b1df55c..64f53f2 100644
---- a/arch/sparc/lib/locks.S
-+++ b/arch/sparc/lib/locks.S
-@@ -1,4 +1,4 @@
--/* $Id: locks.S,v 1.16 2000/02/26 11:02:47 anton Exp $
-+/*
- * locks.S: SMP low-level lock primitives on Sparc.
- *
- * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/arch/sparc/lib/lshrdi3.S b/arch/sparc/lib/lshrdi3.S
-index 35abf5b..47a1354 100644
---- a/arch/sparc/lib/lshrdi3.S
-+++ b/arch/sparc/lib/lshrdi3.S
-@@ -1,4 +1,3 @@
--/* $Id: lshrdi3.S,v 1.1 1999/03/21 06:37:45 davem Exp $ */
-
- .globl __lshrdi3
- __lshrdi3:
-diff --git a/arch/sparc/lib/memscan.S b/arch/sparc/lib/memscan.S
-index 28e78ff..4ff1657 100644
---- a/arch/sparc/lib/memscan.S
-+++ b/arch/sparc/lib/memscan.S
-@@ -1,4 +1,4 @@
--/* $Id: memscan.S,v 1.4 1996/09/08 02:01:20 davem Exp $
-+/*
- * memscan.S: Optimized memscan for the Sparc.
- *
- * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/arch/sparc/lib/mul.S b/arch/sparc/lib/mul.S
-index da69356..c45470d 100644
---- a/arch/sparc/lib/mul.S
-+++ b/arch/sparc/lib/mul.S
-@@ -1,4 +1,4 @@
--/* $Id: mul.S,v 1.4 1996/09/30 02:22:32 davem Exp $
-+/*
- * mul.S: This routine was taken from glibc-1.09 and is covered
- * by the GNU Library General Public License Version 2.
- */
-diff --git a/arch/sparc/lib/rem.S b/arch/sparc/lib/rem.S
-index bf015a9..42fb862 100644
---- a/arch/sparc/lib/rem.S
-+++ b/arch/sparc/lib/rem.S
-@@ -1,4 +1,4 @@
--/* $Id: rem.S,v 1.7 1996/09/30 02:22:34 davem Exp $
-+/*
- * rem.S: This routine was taken from glibc-1.09 and is covered
- * by the GNU Library General Public License Version 2.
- */
-diff --git a/arch/sparc/lib/rwsem.S b/arch/sparc/lib/rwsem.S
-index f406b1f..9675268 100644
---- a/arch/sparc/lib/rwsem.S
-+++ b/arch/sparc/lib/rwsem.S
-@@ -1,4 +1,4 @@
--/* $Id: rwsem.S,v 1.5 2000/05/09 17:40:13 davem Exp $
-+/*
- * Assembly part of rw semaphores.
- *
- * Copyright (C) 1999 Jakub Jelinek (jakub@redhat.com)
-diff --git a/arch/sparc/lib/sdiv.S b/arch/sparc/lib/sdiv.S
-index af94516..f0a0d4e 100644
---- a/arch/sparc/lib/sdiv.S
-+++ b/arch/sparc/lib/sdiv.S
-@@ -1,4 +1,4 @@
--/* $Id: sdiv.S,v 1.6 1996/10/02 17:37:00 davem Exp $
-+/*
- * sdiv.S: This routine was taken from glibc-1.09 and is covered
- * by the GNU Library General Public License Version 2.
- */
-diff --git a/arch/sparc/lib/strncmp.S b/arch/sparc/lib/strncmp.S
-index 6156268..494ec66 100644
---- a/arch/sparc/lib/strncmp.S
-+++ b/arch/sparc/lib/strncmp.S
-@@ -1,4 +1,4 @@
--/* $Id: strncmp.S,v 1.2 1996/09/09 02:47:20 davem Exp $
-+/*
- * strncmp.S: Hand optimized Sparc assembly of GCC output from GNU libc
- * generic strncmp routine.
- */
-diff --git a/arch/sparc/lib/udiv.S b/arch/sparc/lib/udiv.S
-index 169e01d..2101405 100644
---- a/arch/sparc/lib/udiv.S
-+++ b/arch/sparc/lib/udiv.S
-@@ -1,4 +1,4 @@
--/* $Id: udiv.S,v 1.4 1996/09/30 02:22:38 davem Exp $
-+/*
- * udiv.S: This routine was taken from glibc-1.09 and is covered
- * by the GNU Library General Public License Version 2.
- */
-diff --git a/arch/sparc/lib/umul.S b/arch/sparc/lib/umul.S
-index f0e5b20..1f36ae6 100644
---- a/arch/sparc/lib/umul.S
-+++ b/arch/sparc/lib/umul.S
-@@ -1,4 +1,4 @@
--/* $Id: umul.S,v 1.4 1996/09/30 02:22:39 davem Exp $
-+/*
- * umul.S: This routine was taken from glibc-1.09 and is covered
- * by the GNU Library General Public License Version 2.
- */
-diff --git a/arch/sparc/lib/urem.S b/arch/sparc/lib/urem.S
-index 6b92bdc..77123eb 100644
---- a/arch/sparc/lib/urem.S
-+++ b/arch/sparc/lib/urem.S
-@@ -1,4 +1,4 @@
--/* $Id: urem.S,v 1.4 1996/09/30 02:22:42 davem Exp $
-+/*
- * urem.S: This routine was taken from glibc-1.09 and is covered
- * by the GNU Library General Public License Version 2.
- */
-diff --git a/arch/sparc/math-emu/ashldi3.S b/arch/sparc/math-emu/ashldi3.S
-index eab1d09..7230ff5 100644
---- a/arch/sparc/math-emu/ashldi3.S
-+++ b/arch/sparc/math-emu/ashldi3.S
-@@ -1,4 +1,4 @@
--/* $Id: ashldi3.S,v 1.1 1998/04/06 16:09:28 jj Exp $
-+/*
- * ashldi3.S: Math-emu code creates all kinds of references to
- * this little routine on the sparc with gcc.
- *
-diff --git a/arch/sparc/mm/Makefile b/arch/sparc/mm/Makefile
-index 16eeba4..109c8b2 100644
---- a/arch/sparc/mm/Makefile
-+++ b/arch/sparc/mm/Makefile
-@@ -1,4 +1,3 @@
--# $Id: Makefile,v 1.38 2000/12/15 00:41:22 davem Exp $
- # Makefile for the linux Sparc-specific parts of the memory manager.
- #
-
-diff --git a/arch/sparc/mm/fault.c b/arch/sparc/mm/fault.c
-index abd5079..0a3cd8f 100644
---- a/arch/sparc/mm/fault.c
-+++ b/arch/sparc/mm/fault.c
-@@ -1,4 +1,4 @@
--/* $Id: fault.c,v 1.122 2001/11/17 07:19:26 davem Exp $
-+/*
- * fault.c: Page fault handlers for the Sparc.
- *
- * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/arch/sparc/mm/generic.c b/arch/sparc/mm/generic.c
-index 1ef7fa0..a289261 100644
---- a/arch/sparc/mm/generic.c
-+++ b/arch/sparc/mm/generic.c
-@@ -1,4 +1,4 @@
--/* $Id: generic.c,v 1.14 2001/12/21 04:56:15 davem Exp $
-+/*
- * generic.c: Generic Sparc mm routines that are not dependent upon
- * MMU type but are Sparc specific.
- *
-diff --git a/arch/sparc/mm/hypersparc.S b/arch/sparc/mm/hypersparc.S
-index d29cc24..44aad32 100644
---- a/arch/sparc/mm/hypersparc.S
-+++ b/arch/sparc/mm/hypersparc.S
-@@ -1,4 +1,4 @@
--/* $Id: hypersparc.S,v 1.18 2001/12/21 04:56:15 davem Exp $
-+/*
- * hypersparc.S: High speed Hypersparc mmu/cache operations.
- *
- * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/arch/sparc/mm/init.c b/arch/sparc/mm/init.c
-index b89837a..7794ecb 100644
---- a/arch/sparc/mm/init.c
-+++ b/arch/sparc/mm/init.c
-@@ -1,4 +1,4 @@
--/* $Id: init.c,v 1.103 2001/11/19 19:03:08 davem Exp $
-+/*
- * linux/arch/sparc/mm/init.c
- *
- * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/arch/sparc/mm/io-unit.c b/arch/sparc/mm/io-unit.c
-index b86dfce..f167835 100644
---- a/arch/sparc/mm/io-unit.c
-+++ b/arch/sparc/mm/io-unit.c
-@@ -1,4 +1,4 @@
--/* $Id: io-unit.c,v 1.24 2001/12/17 07:05:09 davem Exp $
-+/*
- * io-unit.c: IO-UNIT specific routines for memory management.
- *
- * Copyright (C) 1997,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
-diff --git a/arch/sparc/mm/loadmmu.c b/arch/sparc/mm/loadmmu.c
-index 2d9cd65..652be05 100644
---- a/arch/sparc/mm/loadmmu.c
-+++ b/arch/sparc/mm/loadmmu.c
-@@ -1,4 +1,4 @@
--/* $Id: loadmmu.c,v 1.56 2000/02/08 20:24:21 davem Exp $
-+/*
- * loadmmu.c: This code loads up all the mm function pointers once the
- * machine type has been determined. It also sets the static
- * mmu values such as PAGE_NONE, etc.
-diff --git a/arch/sparc/mm/nosrmmu.c b/arch/sparc/mm/nosrmmu.c
-index 9e21565..3701f70 100644
---- a/arch/sparc/mm/nosrmmu.c
-+++ b/arch/sparc/mm/nosrmmu.c
-@@ -1,4 +1,4 @@
--/* $Id: nosrmmu.c,v 1.5 1999/11/19 04:11:54 davem Exp $
-+/*
- * nosrmmu.c: This file is a bunch of dummies for sun4 compiles,
- * so that it does not need srmmu and avoid ifdefs.
- *
-diff --git a/arch/sparc/mm/nosun4c.c b/arch/sparc/mm/nosun4c.c
-index ea2e210..196263f 100644
---- a/arch/sparc/mm/nosun4c.c
-+++ b/arch/sparc/mm/nosun4c.c
-@@ -1,4 +1,4 @@
--/* $Id: nosun4c.c,v 1.3 2000/02/14 04:52:36 jj Exp $
-+/*
- * nosun4c.c: This file is a bunch of dummies for SMP compiles,
- * so that it does not need sun4c and avoid ifdefs.
- *
-diff --git a/arch/sparc/mm/swift.S b/arch/sparc/mm/swift.S
-index 9f4cd39..c801c39 100644
---- a/arch/sparc/mm/swift.S
-+++ b/arch/sparc/mm/swift.S
-@@ -1,4 +1,4 @@
--/* $Id: swift.S,v 1.9 2002/01/08 11:11:59 davem Exp $
-+/*
- * swift.S: MicroSparc-II mmu/cache operations.
- *
- * Copyright (C) 1999 David S. Miller (davem@redhat.com)
-diff --git a/arch/sparc/mm/tsunami.S b/arch/sparc/mm/tsunami.S
-index 4988e6a..db0d6de 100644
---- a/arch/sparc/mm/tsunami.S
-+++ b/arch/sparc/mm/tsunami.S
-@@ -1,4 +1,4 @@
--/* $Id: tsunami.S,v 1.7 2001/12/21 04:56:15 davem Exp $
-+/*
- * tsunami.S: High speed MicroSparc-I mmu/cache operations.
- *
- * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/arch/sparc/mm/viking.S b/arch/sparc/mm/viking.S
-index 754c622..6dfcc13 100644
---- a/arch/sparc/mm/viking.S
-+++ b/arch/sparc/mm/viking.S
-@@ -1,4 +1,4 @@
--/* $Id: viking.S,v 1.19 2001/12/21 04:56:15 davem Exp $
-+/*
- * viking.S: High speed Viking cache/mmu operations
- *
- * Copyright (C) 1997 Eddie C. Dost (ecd@skynet.be)
-diff --git a/arch/sparc/prom/Makefile b/arch/sparc/prom/Makefile
-index 2b217ee..7f5eacf 100644
---- a/arch/sparc/prom/Makefile
-+++ b/arch/sparc/prom/Makefile
-@@ -1,4 +1,3 @@
--# $Id: Makefile,v 1.8 2000/12/15 00:41:22 davem Exp $
- # Makefile for the Sun Boot PROM interface library under
- # Linux.
- #
-diff --git a/arch/sparc/prom/bootstr.c b/arch/sparc/prom/bootstr.c
-index cfdeac2..5a35c76 100644
---- a/arch/sparc/prom/bootstr.c
-+++ b/arch/sparc/prom/bootstr.c
-@@ -1,4 +1,4 @@
--/* $Id: bootstr.c,v 1.20 2000/02/08 20:24:23 davem Exp $
-+/*
- * bootstr.c: Boot string/argument acquisition from the PROM.
- *
- * Copyright(C) 1995 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/arch/sparc/prom/console.c b/arch/sparc/prom/console.c
-index 2a007a7..790057a 100644
---- a/arch/sparc/prom/console.c
-+++ b/arch/sparc/prom/console.c
-@@ -1,4 +1,4 @@
--/* $Id: console.c,v 1.25 2001/10/30 04:54:22 davem Exp $
-+/*
- * console.c: Routines that deal with sending and receiving IO
- * to/from the current console device using the PROM.
- *
-diff --git a/arch/sparc/prom/devmap.c b/arch/sparc/prom/devmap.c
-index eb12073..1e51791 100644
---- a/arch/sparc/prom/devmap.c
-+++ b/arch/sparc/prom/devmap.c
-@@ -1,4 +1,4 @@
--/* $Id: devmap.c,v 1.7 2000/08/26 02:38:03 anton Exp $
-+/*
- * promdevmap.c: Map device/IO areas to virtual addresses.
- *
- * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/arch/sparc/prom/devops.c b/arch/sparc/prom/devops.c
-index 61919b5..9f1a95c 100644
---- a/arch/sparc/prom/devops.c
-+++ b/arch/sparc/prom/devops.c
-@@ -1,4 +1,4 @@
--/* $Id: devops.c,v 1.13 2000/08/26 02:38:03 anton Exp $
-+/*
- * devops.c: Device operations using the PROM.
- *
- * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/arch/sparc/prom/init.c b/arch/sparc/prom/init.c
-index 2fa3a47..729f870 100644
---- a/arch/sparc/prom/init.c
-+++ b/arch/sparc/prom/init.c
-@@ -1,4 +1,4 @@
--/* $Id: init.c,v 1.14 2000/01/29 01:09:12 anton Exp $
-+/*
- * init.c: Initialize internal variables used by the PROM
- * library functions.
- *
-diff --git a/arch/sparc/prom/misc.c b/arch/sparc/prom/misc.c
-index d9fb3af..49b5057 100644
---- a/arch/sparc/prom/misc.c
-+++ b/arch/sparc/prom/misc.c
-@@ -1,4 +1,4 @@
--/* $Id: misc.c,v 1.18 2000/08/26 02:38:03 anton Exp $
-+/*
- * misc.c: Miscellaneous prom functions that don't belong
- * anywhere else.
- *
-diff --git a/arch/sparc/prom/mp.c b/arch/sparc/prom/mp.c
-index 92fe373..4c4dc79 100644
---- a/arch/sparc/prom/mp.c
-+++ b/arch/sparc/prom/mp.c
-@@ -1,4 +1,4 @@
--/* $Id: mp.c,v 1.12 2000/08/26 02:38:03 anton Exp $
-+/*
- * mp.c: OpenBoot Prom Multiprocessor support routines. Don't call
- * these on a UP or else you will halt and catch fire. ;)
- *
-diff --git a/arch/sparc/prom/palloc.c b/arch/sparc/prom/palloc.c
-index 84ce8bc..20be339 100644
---- a/arch/sparc/prom/palloc.c
-+++ b/arch/sparc/prom/palloc.c
-@@ -1,4 +1,4 @@
--/* $Id: palloc.c,v 1.4 1996/04/25 06:09:48 davem Exp $
-+/*
- * palloc.c: Memory allocation from the Sun PROM.
- *
- * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/arch/sparc/prom/ranges.c b/arch/sparc/prom/ranges.c
-index a292032..f9b7def 100644
---- a/arch/sparc/prom/ranges.c
-+++ b/arch/sparc/prom/ranges.c
-@@ -1,4 +1,4 @@
--/* $Id: ranges.c,v 1.15 2001/12/19 00:29:51 davem Exp $
-+/*
- * ranges.c: Handle ranges in newer proms for obio/sbus.
- *
- * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/arch/sparc/prom/segment.c b/arch/sparc/prom/segment.c
-index 09d6460..04fd03a 100644
---- a/arch/sparc/prom/segment.c
-+++ b/arch/sparc/prom/segment.c
-@@ -1,4 +1,4 @@
--/* $Id: segment.c,v 1.7 2000/08/26 02:38:03 anton Exp $
-+/*
- * segment.c: Prom routine to map segments in other contexts before
- * a standalone is completely mapped. This is for sun4 and
- * sun4c architectures only.
-diff --git a/arch/sparc/prom/tree.c b/arch/sparc/prom/tree.c
-index 5ec2465..f228fe0 100644
---- a/arch/sparc/prom/tree.c
-+++ b/arch/sparc/prom/tree.c
-@@ -1,4 +1,4 @@
--/* $Id: tree.c,v 1.26 2000/08/26 02:38:03 anton Exp $
-+/*
- * tree.c: Basic device tree traversal/scanning for the Linux
- * prom library.
- *
-diff --git a/arch/sparc64/Makefile b/arch/sparc64/Makefile
-index 9cb75c8..4b8f2b0 100644
---- a/arch/sparc64/Makefile
-+++ b/arch/sparc64/Makefile
-@@ -1,4 +1,3 @@
--# $Id: Makefile,v 1.52 2002/02/09 19:49:31 davem Exp $
- # sparc64/Makefile
- #
- # Makefile for the architecture dependent flags and dependencies on the
-diff --git a/arch/sparc64/boot/Makefile b/arch/sparc64/boot/Makefile
-index 6968a6d..0458b52 100644
---- a/arch/sparc64/boot/Makefile
-+++ b/arch/sparc64/boot/Makefile
-@@ -1,4 +1,3 @@
--# $Id: Makefile,v 1.4 1997/12/15 20:08:56 ecd Exp $
- # Makefile for the Sparc64 boot stuff.
- #
- # Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/arch/sparc64/boot/piggyback.c b/arch/sparc64/boot/piggyback.c
-index 36f9074..de364bf 100644
---- a/arch/sparc64/boot/piggyback.c
-+++ b/arch/sparc64/boot/piggyback.c
-@@ -1,4 +1,4 @@
--/* $Id: piggyback.c,v 1.2 2000/09/19 14:34:39 anton Exp $
-+/*
- Simple utility to make a single-image install kernel with initial ramdisk
- for Sparc64 tftpbooting without need to set up nfs.
-
-diff --git a/arch/sparc64/kernel/dtlb_prot.S b/arch/sparc64/kernel/dtlb_prot.S
-index e0a9201..b2c2c5b 100644
---- a/arch/sparc64/kernel/dtlb_prot.S
-+++ b/arch/sparc64/kernel/dtlb_prot.S
-@@ -1,4 +1,4 @@
--/* $Id: dtlb_prot.S,v 1.22 2001/04/11 23:40:32 davem Exp $
-+/*
- * dtlb_prot.S: DTLB protection trap strategy.
- * This is included directly into the trap table.
- *
-diff --git a/arch/sparc64/kernel/ebus.c b/arch/sparc64/kernel/ebus.c
-index bc26322..c49d038 100644
---- a/arch/sparc64/kernel/ebus.c
-+++ b/arch/sparc64/kernel/ebus.c
-@@ -1,4 +1,4 @@
--/* $Id: ebus.c,v 1.64 2001/11/08 04:41:33 davem Exp $
-+/*
- * ebus.c: PCI to EBus bridge device.
- *
- * Copyright (C) 1997 Eddie C. Dost (ecd@skynet.be)
-diff --git a/arch/sparc64/kernel/etrap.S b/arch/sparc64/kernel/etrap.S
-index f25e1da..29ce489 100644
---- a/arch/sparc64/kernel/etrap.S
-+++ b/arch/sparc64/kernel/etrap.S
-@@ -1,4 +1,4 @@
--/* $Id: etrap.S,v 1.46 2002/02/09 19:49:30 davem Exp $
-+/*
- * etrap.S: Preparing for entry into the kernel on Sparc V9.
- *
- * Copyright (C) 1996, 1997 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/arch/sparc64/kernel/idprom.c b/arch/sparc64/kernel/idprom.c
-index 3b6789e..5b45a80 100644
---- a/arch/sparc64/kernel/idprom.c
-+++ b/arch/sparc64/kernel/idprom.c
-@@ -1,4 +1,4 @@
--/* $Id: idprom.c,v 1.3 1999/08/31 06:54:53 davem Exp $
-+/*
- * idprom.c: Routines to load the idprom into kernel addresses and
- * interpret the data contained within.
- *
-diff --git a/arch/sparc64/kernel/init_task.c b/arch/sparc64/kernel/init_task.c
-index 90007cf..d2b3123 100644
---- a/arch/sparc64/kernel/init_task.c
-+++ b/arch/sparc64/kernel/init_task.c
-@@ -10,7 +10,6 @@
- #include
-
- static struct fs_struct init_fs = INIT_FS;
--static struct files_struct init_files = INIT_FILES;
- static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
- static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
- struct mm_struct init_mm = INIT_MM(init_mm);
-diff --git a/arch/sparc64/kernel/process.c b/arch/sparc64/kernel/process.c
-index 4129c04..2084f81 100644
---- a/arch/sparc64/kernel/process.c
-+++ b/arch/sparc64/kernel/process.c
-@@ -1,6 +1,6 @@
- /* arch/sparc64/kernel/process.c
- *
-- * Copyright (C) 1995, 1996 David S. Miller (davem@caip.rutgers.edu)
-+ * Copyright (C) 1995, 1996, 2008 David S. Miller (davem@davemloft.net)
- * Copyright (C) 1996 Eddie C. Dost (ecd@skynet.be)
- * Copyright (C) 1997, 1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
- */
-@@ -30,6 +30,7 @@
- #include
- #include
- #include
-+#include
-
- #include
- #include
-@@ -49,6 +50,8 @@
- #include
- #include
- #include
-+#include
-+#include
-
- /* #define VERBOSE_SHOWREGS */
-
-@@ -298,6 +301,118 @@ void show_regs(struct pt_regs *regs)
- #endif
- }
-
-+#ifdef CONFIG_MAGIC_SYSRQ
-+struct global_reg_snapshot global_reg_snapshot[NR_CPUS];
-+static DEFINE_SPINLOCK(global_reg_snapshot_lock);
-+
-+static void __global_reg_self(struct thread_info *tp, struct pt_regs *regs,
-+ int this_cpu)
-+{
-+ flushw_all();
-+
-+ global_reg_snapshot[this_cpu].tstate = regs->tstate;
-+ global_reg_snapshot[this_cpu].tpc = regs->tpc;
-+ global_reg_snapshot[this_cpu].tnpc = regs->tnpc;
-+ global_reg_snapshot[this_cpu].o7 = regs->u_regs[UREG_I7];
-+
-+ if (regs->tstate & TSTATE_PRIV) {
-+ struct reg_window *rw;
-+
-+ rw = (struct reg_window *)
-+ (regs->u_regs[UREG_FP] + STACK_BIAS);
-+ global_reg_snapshot[this_cpu].i7 = rw->ins[6];
-+ } else
-+ global_reg_snapshot[this_cpu].i7 = 0;
-+
-+ global_reg_snapshot[this_cpu].thread = tp;
-+}
-+
-+/* In order to avoid hangs we do not try to synchronize with the
-+ * global register dump client cpus. The last store they make is to
-+ * the thread pointer, so do a short poll waiting for that to become
-+ * non-NULL.
-+ */
-+static void __global_reg_poll(struct global_reg_snapshot *gp)
-+{
-+ int limit = 0;
-+
-+ while (!gp->thread && ++limit < 100) {
-+ barrier();
-+ udelay(1);
-+ }
-+}
-+
-+static void sysrq_handle_globreg(int key, struct tty_struct *tty)
-+{
-+ struct thread_info *tp = current_thread_info();
-+ struct pt_regs *regs = get_irq_regs();
-+#ifdef CONFIG_KALLSYMS
-+ char buffer[KSYM_SYMBOL_LEN];
-+#endif
-+ unsigned long flags;
-+ int this_cpu, cpu;
-+
-+ if (!regs)
-+ regs = tp->kregs;
-+
-+ spin_lock_irqsave(&global_reg_snapshot_lock, flags);
-+
-+ memset(global_reg_snapshot, 0, sizeof(global_reg_snapshot));
-+
-+ this_cpu = raw_smp_processor_id();
-+
-+ __global_reg_self(tp, regs, this_cpu);
-+
-+ smp_fetch_global_regs();
-+
-+ for_each_online_cpu(cpu) {
-+ struct global_reg_snapshot *gp = &global_reg_snapshot[cpu];
-+ struct thread_info *tp;
-+
-+ __global_reg_poll(gp);
-+
-+ tp = gp->thread;
-+ printk("%c CPU[%3d]: TSTATE[%016lx] TPC[%016lx] TNPC[%016lx] TASK[%s:%d]\n",
-+ (cpu == this_cpu ? '*' : ' '), cpu,
-+ gp->tstate, gp->tpc, gp->tnpc,
-+ ((tp && tp->task) ? tp->task->comm : "NULL"),
-+ ((tp && tp->task) ? tp->task->pid : -1));
-+#ifdef CONFIG_KALLSYMS
-+ if (gp->tstate & TSTATE_PRIV) {
-+ sprint_symbol(buffer, gp->tpc);
-+ printk(" TPC[%s] ", buffer);
-+ sprint_symbol(buffer, gp->o7);
-+ printk("O7[%s] ", buffer);
-+ sprint_symbol(buffer, gp->i7);
-+ printk("I7[%s]\n", buffer);
-+ } else
-+#endif
-+ {
-+ printk(" TPC[%lx] O7[%lx] I7[%lx]\n",
-+ gp->tpc, gp->o7, gp->i7);
-+ }
-+ }
-+
-+ memset(global_reg_snapshot, 0, sizeof(global_reg_snapshot));
-+
-+ spin_unlock_irqrestore(&global_reg_snapshot_lock, flags);
-+}
-+
-+static struct sysrq_key_op sparc_globalreg_op = {
-+ .handler = sysrq_handle_globreg,
-+ .help_msg = "Globalregs",
-+ .action_msg = "Show Global CPU Regs",
-+};
-+
-+static int __init sparc_globreg_init(void)
-+{
-+ return register_sysrq_key('y', &sparc_globalreg_op);
-+}
-+
-+core_initcall(sparc_globreg_init);
-+
-+#endif
-+
- unsigned long thread_saved_pc(struct task_struct *tsk)
- {
- struct thread_info *ti = task_thread_info(tsk);
-@@ -542,20 +657,39 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long sp,
- struct task_struct *p, struct pt_regs *regs)
- {
- struct thread_info *t = task_thread_info(p);
-+ struct sparc_stackf *parent_sf;
-+ unsigned long child_stack_sz;
- char *child_trap_frame;
-+ int kernel_thread;
-
-- /* Calculate offset to stack_frame & pt_regs */
-- child_trap_frame = task_stack_page(p) + (THREAD_SIZE - (TRACEREG_SZ+STACKFRAME_SZ));
-- memcpy(child_trap_frame, (((struct sparc_stackf *)regs)-1), (TRACEREG_SZ+STACKFRAME_SZ));
-+ kernel_thread = (regs->tstate & TSTATE_PRIV) ? 1 : 0;
-+ parent_sf = ((struct sparc_stackf *) regs) - 1;
-
-- t->flags = (t->flags & ~((0xffUL << TI_FLAG_CWP_SHIFT) | (0xffUL << TI_FLAG_CURRENT_DS_SHIFT))) |
-+ /* Calculate offset to stack_frame & pt_regs */
-+ child_stack_sz = ((STACKFRAME_SZ + TRACEREG_SZ) +
-+ (kernel_thread ? STACKFRAME_SZ : 0));
-+ child_trap_frame = (task_stack_page(p) +
-+ (THREAD_SIZE - child_stack_sz));
-+ memcpy(child_trap_frame, parent_sf, child_stack_sz);
-+
-+ t->flags = (t->flags & ~((0xffUL << TI_FLAG_CWP_SHIFT) |
-+ (0xffUL << TI_FLAG_CURRENT_DS_SHIFT))) |
- (((regs->tstate + 1) & TSTATE_CWP) << TI_FLAG_CWP_SHIFT);
- t->new_child = 1;
- t->ksp = ((unsigned long) child_trap_frame) - STACK_BIAS;
-- t->kregs = (struct pt_regs *)(child_trap_frame+sizeof(struct sparc_stackf));
-+ t->kregs = (struct pt_regs *) (child_trap_frame +
-+ sizeof(struct sparc_stackf));
- t->fpsaved[0] = 0;
-
-- if (regs->tstate & TSTATE_PRIV) {
-+ if (kernel_thread) {
-+ struct sparc_stackf *child_sf = (struct sparc_stackf *)
-+ (child_trap_frame + (STACKFRAME_SZ + TRACEREG_SZ));
-+
-+ /* Zero terminate the stack backtrace. */
-+ child_sf->fp = NULL;
-+ t->kregs->u_regs[UREG_FP] =
-+ ((unsigned long) child_sf) - STACK_BIAS;
-+
- /* Special case, if we are spawning a kernel thread from
- * a userspace task (via KMOD, NFS, or similar) we must
- * disable performance counters in the child because the
-@@ -566,12 +700,7 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long sp,
- t->pcr_reg = 0;
- t->flags &= ~_TIF_PERFCTR;
- }
-- t->kregs->u_regs[UREG_FP] = t->ksp;
- t->flags |= ((long)ASI_P << TI_FLAG_CURRENT_DS_SHIFT);
-- flush_register_windows();
-- memcpy((void *)(t->ksp + STACK_BIAS),
-- (void *)(regs->u_regs[UREG_FP] + STACK_BIAS),
-- sizeof(struct sparc_stackf));
- t->kregs->u_regs[UREG_G6] = (unsigned long) t;
- t->kregs->u_regs[UREG_G4] = (unsigned long) t->task;
- } else {
-diff --git a/arch/sparc64/kernel/rtrap.S b/arch/sparc64/kernel/rtrap.S
-index 16689b2..c6fc695 100644
---- a/arch/sparc64/kernel/rtrap.S
-+++ b/arch/sparc64/kernel/rtrap.S
-@@ -1,4 +1,4 @@
--/* $Id: rtrap.S,v 1.61 2002/02/09 19:49:31 davem Exp $
-+/*
- * rtrap.S: Preparing for return from trap on Sparc V9.
- *
- * Copyright (C) 1997,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
-@@ -363,6 +363,7 @@ kern_rtt: rdpr %canrestore, %g1
- brz,pn %g1, kern_rtt_fill
- nop
- kern_rtt_restore:
-+ stw %g0, [%sp + PTREGS_OFF + PT_V9_MAGIC]
- restore
- retry
-
-diff --git a/arch/sparc64/kernel/sbus.c b/arch/sparc64/kernel/sbus.c
-index fa2827c..e33a8a6 100644
---- a/arch/sparc64/kernel/sbus.c
-+++ b/arch/sparc64/kernel/sbus.c
-@@ -1,4 +1,4 @@
--/* $Id: sbus.c,v 1.19 2002/01/23 11:27:32 davem Exp $
-+/*
- * sbus.c: UltraSparc SBUS controller support.
- *
- * Copyright (C) 1999 David S. Miller (davem@redhat.com)
-diff --git a/arch/sparc64/kernel/setup.c b/arch/sparc64/kernel/setup.c
-index da5e6ee..c8b03a4 100644
---- a/arch/sparc64/kernel/setup.c
-+++ b/arch/sparc64/kernel/setup.c
-@@ -1,4 +1,4 @@
--/* $Id: setup.c,v 1.72 2002/02/09 19:49:30 davem Exp $
-+/*
- * linux/arch/sparc64/kernel/setup.c
- *
- * Copyright (C) 1995,1996 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/arch/sparc64/kernel/signal.c b/arch/sparc64/kernel/signal.c
-index 6e4dc67..9667e96 100644
---- a/arch/sparc64/kernel/signal.c
-+++ b/arch/sparc64/kernel/signal.c
-@@ -1,4 +1,4 @@
--/* $Id: signal.c,v 1.60 2002/02/09 19:49:31 davem Exp $
-+/*
- * arch/sparc64/kernel/signal.c
- *
- * Copyright (C) 1991, 1992 Linus Torvalds
-diff --git a/arch/sparc64/kernel/smp.c b/arch/sparc64/kernel/smp.c
-index 0d6403a..fa63c68 100644
---- a/arch/sparc64/kernel/smp.c
-+++ b/arch/sparc64/kernel/smp.c
-@@ -900,6 +900,9 @@ extern unsigned long xcall_flush_tlb_mm;
- extern unsigned long xcall_flush_tlb_pending;
- extern unsigned long xcall_flush_tlb_kernel_range;
- extern unsigned long xcall_report_regs;
-+#ifdef CONFIG_MAGIC_SYSRQ
-+extern unsigned long xcall_fetch_glob_regs;
-+#endif
- extern unsigned long xcall_receive_signal;
- extern unsigned long xcall_new_mmu_context_version;
- #ifdef CONFIG_KGDB
-@@ -1080,6 +1083,13 @@ void smp_report_regs(void)
- smp_cross_call(&xcall_report_regs, 0, 0, 0);
- }
-
-+#ifdef CONFIG_MAGIC_SYSRQ
-+void smp_fetch_global_regs(void)
-+{
-+ smp_cross_call(&xcall_fetch_glob_regs, 0, 0, 0);
-+}
-+#endif
-+
- /* We know that the window frames of the user have been flushed
- * to the stack before we get here because all callers of us
- * are flush_tlb_*() routines, and these run after flush_cache_*()
-diff --git a/arch/sparc64/kernel/stacktrace.c b/arch/sparc64/kernel/stacktrace.c
-index 01b52f5..c73ce3f 100644
---- a/arch/sparc64/kernel/stacktrace.c
-+++ b/arch/sparc64/kernel/stacktrace.c
-@@ -19,7 +19,7 @@ void save_stack_trace(struct stack_trace *trace)
- fp = ksp + STACK_BIAS;
- thread_base = (unsigned long) tp;
- do {
-- struct reg_window *rw;
-+ struct sparc_stackf *sf;
- struct pt_regs *regs;
- unsigned long pc;
-
-@@ -28,15 +28,17 @@ void save_stack_trace(struct stack_trace *trace)
- fp >= (thread_base + THREAD_SIZE))
- break;
-
-- rw = (struct reg_window *) fp;
-- regs = (struct pt_regs *) (rw + 1);
-+ sf = (struct sparc_stackf *) fp;
-+ regs = (struct pt_regs *) (sf + 1);
-
- if ((regs->magic & ~0x1ff) == PT_REGS_MAGIC) {
-+ if (!(regs->tstate & TSTATE_PRIV))
-+ break;
- pc = regs->tpc;
- fp = regs->u_regs[UREG_I6] + STACK_BIAS;
- } else {
-- pc = rw->ins[7];
-- fp = rw->ins[6] + STACK_BIAS;
-+ pc = sf->callers_pc;
-+ fp = (unsigned long)sf->fp + STACK_BIAS;
- }
-
- if (trace->skip > 0)
-diff --git a/arch/sparc64/kernel/starfire.c b/arch/sparc64/kernel/starfire.c
-index b930fee..7461581 100644
---- a/arch/sparc64/kernel/starfire.c
-+++ b/arch/sparc64/kernel/starfire.c
-@@ -1,4 +1,4 @@
--/* $Id: starfire.c,v 1.10 2001/04/14 21:13:45 davem Exp $
-+/*
- * starfire.c: Starfire/E10000 support.
- *
- * Copyright (C) 1998 David S. Miller (davem@redhat.com)
-diff --git a/arch/sparc64/kernel/sys32.S b/arch/sparc64/kernel/sys32.S
-index 010a737..ade18ba 100644
---- a/arch/sparc64/kernel/sys32.S
-+++ b/arch/sparc64/kernel/sys32.S
-@@ -1,4 +1,4 @@
--/* $Id: sys32.S,v 1.12 2000/03/24 04:17:37 davem Exp $
-+/*
- * sys32.S: I-cache tricks for 32-bit compatibility layer simple
- * conversions.
- *
-diff --git a/arch/sparc64/kernel/trampoline.S b/arch/sparc64/kernel/trampoline.S
-index 56ff552..704a3af 100644
---- a/arch/sparc64/kernel/trampoline.S
-+++ b/arch/sparc64/kernel/trampoline.S
-@@ -1,4 +1,4 @@
--/* $Id: trampoline.S,v 1.26 2002/02/09 19:49:30 davem Exp $
-+/*
- * trampoline.S: Jump start slave processors on sparc64.
- *
- * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/arch/sparc64/kernel/traps.c b/arch/sparc64/kernel/traps.c
-index d9b8d46..3697492 100644
---- a/arch/sparc64/kernel/traps.c
-+++ b/arch/sparc64/kernel/traps.c
-@@ -2116,7 +2116,7 @@ void show_stack(struct task_struct *tsk, unsigned long *_ksp)
- printk("\n");
- #endif
- do {
-- struct reg_window *rw;
-+ struct sparc_stackf *sf;
- struct pt_regs *regs;
- unsigned long pc;
-
-@@ -2124,15 +2124,17 @@ void show_stack(struct task_struct *tsk, unsigned long *_ksp)
- if (fp < (thread_base + sizeof(struct thread_info)) ||
- fp >= (thread_base + THREAD_SIZE))
- break;
-- rw = (struct reg_window *)fp;
-- regs = (struct pt_regs *) (rw + 1);
-+ sf = (struct sparc_stackf *) fp;
-+ regs = (struct pt_regs *) (sf + 1);
-
- if ((regs->magic & ~0x1ff) == PT_REGS_MAGIC) {
-+ if (!(regs->tstate & TSTATE_PRIV))
-+ break;
- pc = regs->tpc;
- fp = regs->u_regs[UREG_I6] + STACK_BIAS;
- } else {
-- pc = rw->ins[7];
-- fp = rw->ins[6] + STACK_BIAS;
-+ pc = sf->callers_pc;
-+ fp = (unsigned long)sf->fp + STACK_BIAS;
- }
-
- printk(" [%016lx] ", pc);
-diff --git a/arch/sparc64/kernel/unaligned.c b/arch/sparc64/kernel/unaligned.c
-index 1a511e9..afa7fc4 100644
---- a/arch/sparc64/kernel/unaligned.c
-+++ b/arch/sparc64/kernel/unaligned.c
-@@ -1,4 +1,4 @@
--/* $Id: unaligned.c,v 1.24 2002/02/09 19:49:31 davem Exp $
-+/*
- * unaligned.c: Unaligned load/store trap handling with special
- * cases for the kernel to do them more quickly.
- *
-diff --git a/arch/sparc64/lib/PeeCeeI.c b/arch/sparc64/lib/PeeCeeI.c
-index 3c6cfbb..8b313f1 100644
---- a/arch/sparc64/lib/PeeCeeI.c
-+++ b/arch/sparc64/lib/PeeCeeI.c
-@@ -1,4 +1,4 @@
--/* $Id: PeeCeeI.c,v 1.4 1999/09/06 01:17:35 davem Exp $
-+/*
- * PeeCeeI.c: The emerging standard...
- *
- * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/arch/sparc64/lib/VISsave.S b/arch/sparc64/lib/VISsave.S
-index a0ded5c..b320ae9 100644
---- a/arch/sparc64/lib/VISsave.S
-+++ b/arch/sparc64/lib/VISsave.S
-@@ -1,4 +1,4 @@
--/* $Id: VISsave.S,v 1.6 2002/02/09 19:49:30 davem Exp $
-+/*
- * VISsave.S: Code for saving FPU register state for
- * VIS routines. One should not call this directly,
- * but use macros provided in .
-diff --git a/arch/sparc64/lib/memcmp.S b/arch/sparc64/lib/memcmp.S
-index c90ad96..d3fdaa8 100644
---- a/arch/sparc64/lib/memcmp.S
-+++ b/arch/sparc64/lib/memcmp.S
-@@ -1,4 +1,4 @@
--/* $Id: memcmp.S,v 1.3 2000/03/23 07:51:08 davem Exp $
-+/*
- * Sparc64 optimized memcmp code.
- *
- * Copyright (C) 1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
-diff --git a/arch/sparc64/lib/memscan.S b/arch/sparc64/lib/memscan.S
-index 5e72d49..5686dfa 100644
---- a/arch/sparc64/lib/memscan.S
-+++ b/arch/sparc64/lib/memscan.S
-@@ -1,4 +1,4 @@
--/* $Id: memscan.S,v 1.3 2000/01/31 04:59:10 davem Exp $
-+/*
- * memscan.S: Optimized memscan for Sparc64.
- *
- * Copyright (C) 1997,1998 Jakub Jelinek (jj@ultra.linux.cz)
-diff --git a/arch/sparc64/lib/strncmp.S b/arch/sparc64/lib/strncmp.S
-index 6f14f53..980e837 100644
---- a/arch/sparc64/lib/strncmp.S
-+++ b/arch/sparc64/lib/strncmp.S
-@@ -1,4 +1,4 @@
--/* $Id: strncmp.S,v 1.2 1997/03/11 17:51:44 jj Exp $
-+/*
- * Sparc64 optimized strncmp code.
- *
- * Copyright (C) 1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
-diff --git a/arch/sparc64/lib/strncpy_from_user.S b/arch/sparc64/lib/strncpy_from_user.S
-index b2f499f..511c8f1 100644
---- a/arch/sparc64/lib/strncpy_from_user.S
-+++ b/arch/sparc64/lib/strncpy_from_user.S
-@@ -1,4 +1,4 @@
--/* $Id: strncpy_from_user.S,v 1.6 1999/05/25 16:53:05 jj Exp $
-+/*
- * strncpy_from_user.S: Sparc64 strncpy from userspace.
- *
- * Copyright (C) 1997, 1999 Jakub Jelinek (jj@ultra.linux.cz)
-diff --git a/arch/sparc64/math-emu/math.c b/arch/sparc64/math-emu/math.c
-index 6ee496c..add053e 100644
---- a/arch/sparc64/math-emu/math.c
-+++ b/arch/sparc64/math-emu/math.c
-@@ -1,4 +1,4 @@
--/* $Id: math.c,v 1.11 1999/12/20 05:02:25 davem Exp $
-+/*
- * arch/sparc64/math-emu/math.c
- *
- * Copyright (C) 1997,1999 Jakub Jelinek (jj@ultra.linux.cz)
-diff --git a/arch/sparc64/math-emu/sfp-util.h b/arch/sparc64/math-emu/sfp-util.h
-index 31e4747..425d3cf 100644
---- a/arch/sparc64/math-emu/sfp-util.h
-+++ b/arch/sparc64/math-emu/sfp-util.h
-@@ -1,4 +1,4 @@
--/* $Id: sfp-util.h,v 1.5 2001/06/10 06:48:46 davem Exp $
-+/*
- * arch/sparc64/math-emu/sfp-util.h
- *
- * Copyright (C) 1999 Jakub Jelinek (jj@ultra.linux.cz)
-diff --git a/arch/sparc64/mm/Makefile b/arch/sparc64/mm/Makefile
-index e415bf9..68d04c0 100644
---- a/arch/sparc64/mm/Makefile
-+++ b/arch/sparc64/mm/Makefile
-@@ -1,4 +1,3 @@
--# $Id: Makefile,v 1.8 2000/12/14 22:57:25 davem Exp $
- # Makefile for the linux Sparc64-specific parts of the memory manager.
- #
-
-diff --git a/arch/sparc64/mm/fault.c b/arch/sparc64/mm/fault.c
-index 2650d0d..236f4d2 100644
---- a/arch/sparc64/mm/fault.c
-+++ b/arch/sparc64/mm/fault.c
-@@ -1,4 +1,4 @@
--/* $Id: fault.c,v 1.59 2002/02/09 19:49:31 davem Exp $
-+/*
- * arch/sparc64/mm/fault.c: Page fault handlers for the 64-bit Sparc.
- *
- * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/arch/sparc64/mm/generic.c b/arch/sparc64/mm/generic.c
-index af9d81d..f362c20 100644
---- a/arch/sparc64/mm/generic.c
-+++ b/arch/sparc64/mm/generic.c
-@@ -1,4 +1,4 @@
--/* $Id: generic.c,v 1.18 2001/12/21 04:56:15 davem Exp $
-+/*
- * generic.c: Generic Sparc mm routines that are not dependent upon
- * MMU type but are Sparc specific.
- *
-diff --git a/arch/sparc64/mm/init.c b/arch/sparc64/mm/init.c
-index 3c7b947..84898c4 100644
---- a/arch/sparc64/mm/init.c
-+++ b/arch/sparc64/mm/init.c
-@@ -1,4 +1,4 @@
--/* $Id: init.c,v 1.209 2002/02/09 19:49:31 davem Exp $
-+/*
- * arch/sparc64/mm/init.c
- *
- * Copyright (C) 1996-1999 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/arch/sparc64/mm/ultra.S b/arch/sparc64/mm/ultra.S
-index 796e005..9bb2d90 100644
---- a/arch/sparc64/mm/ultra.S
-+++ b/arch/sparc64/mm/ultra.S
-@@ -1,7 +1,7 @@
--/* $Id: ultra.S,v 1.72 2002/02/09 19:49:31 davem Exp $
-+/*
- * ultra.S: Don't expand these all over the place...
- *
-- * Copyright (C) 1997, 2000 David S. Miller (davem@redhat.com)
-+ * Copyright (C) 1997, 2000, 2008 David S. Miller (davem@davemloft.net)
- */
-
- #include
-@@ -15,6 +15,7 @@
- #include
- #include
- #include
-+#include
-
- /* Basically, most of the Spitfire vs. Cheetah madness
- * has to do with the fact that Cheetah does not support
-@@ -514,6 +515,32 @@ xcall_report_regs:
- b rtrap_xcall
- ldx [%sp + PTREGS_OFF + PT_V9_TSTATE], %l1
-
-+#ifdef CONFIG_MAGIC_SYSRQ
-+ .globl xcall_fetch_glob_regs
-+xcall_fetch_glob_regs:
-+ sethi %hi(global_reg_snapshot), %g1
-+ or %g1, %lo(global_reg_snapshot), %g1
-+ __GET_CPUID(%g2)
-+ sllx %g2, 6, %g3
-+ add %g1, %g3, %g1
-+ rdpr %tstate, %g7
-+ stx %g7, [%g1 + GR_SNAP_TSTATE]
-+ rdpr %tpc, %g7
-+ stx %g7, [%g1 + GR_SNAP_TPC]
-+ rdpr %tnpc, %g7
-+ stx %g7, [%g1 + GR_SNAP_TNPC]
-+ stx %o7, [%g1 + GR_SNAP_O7]
-+ stx %i7, [%g1 + GR_SNAP_I7]
-+ sethi %hi(trap_block), %g7
-+ or %g7, %lo(trap_block), %g7
-+ sllx %g2, TRAP_BLOCK_SZ_SHIFT, %g2
-+ add %g7, %g2, %g7
-+ ldx [%g7 + TRAP_PER_CPU_THREAD], %g3
-+ membar #StoreStore
-+ stx %g3, [%g1 + GR_SNAP_THREAD]
-+ retry
-+#endif /* CONFIG_MAGIC_SYSRQ */
-+
- #ifdef DCACHE_ALIASING_POSSIBLE
- .align 32
- .globl xcall_flush_dcache_page_cheetah
-diff --git a/arch/sparc64/prom/Makefile b/arch/sparc64/prom/Makefile
-index 3d33ed2..8c94483 100644
---- a/arch/sparc64/prom/Makefile
-+++ b/arch/sparc64/prom/Makefile
-@@ -1,4 +1,3 @@
--# $Id: Makefile,v 1.7 2000/12/14 22:57:25 davem Exp $
- # Makefile for the Sun Boot PROM interface library under
- # Linux.
- #
-diff --git a/arch/sparc64/prom/bootstr.c b/arch/sparc64/prom/bootstr.c
-index a727861..ab9ccc6 100644
---- a/arch/sparc64/prom/bootstr.c
-+++ b/arch/sparc64/prom/bootstr.c
-@@ -1,4 +1,4 @@
--/* $Id: bootstr.c,v 1.6 1999/08/31 06:55:01 davem Exp $
-+/*
- * bootstr.c: Boot string/argument acquisition from the PROM.
- *
- * Copyright(C) 1995 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/arch/sparc64/prom/devops.c b/arch/sparc64/prom/devops.c
-index 4641839..9dbd803 100644
---- a/arch/sparc64/prom/devops.c
-+++ b/arch/sparc64/prom/devops.c
-@@ -1,4 +1,4 @@
--/* $Id: devops.c,v 1.3 1997/10/29 07:43:28 ecd Exp $
-+/*
- * devops.c: Device operations using the PROM.
- *
- * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/arch/sparc64/prom/init.c b/arch/sparc64/prom/init.c
-index 87e7c7e..7b00f89 100644
---- a/arch/sparc64/prom/init.c
-+++ b/arch/sparc64/prom/init.c
-@@ -1,4 +1,4 @@
--/* $Id: init.c,v 1.10 1999/09/21 14:35:59 davem Exp $
-+/*
- * init.c: Initialize internal variables used by the PROM
- * library functions.
- *
-diff --git a/arch/sparc64/prom/misc.c b/arch/sparc64/prom/misc.c
-index 47a877a..9b0c076 100644
---- a/arch/sparc64/prom/misc.c
-+++ b/arch/sparc64/prom/misc.c
-@@ -1,4 +1,4 @@
--/* $Id: misc.c,v 1.20 2001/09/21 03:17:07 kanoj Exp $
-+/*
- * misc.c: Miscellaneous prom functions that don't belong
- * anywhere else.
- *
-diff --git a/arch/sparc64/prom/p1275.c b/arch/sparc64/prom/p1275.c
-index 7fcccc0..4b7c937 100644
---- a/arch/sparc64/prom/p1275.c
-+++ b/arch/sparc64/prom/p1275.c
-@@ -1,4 +1,4 @@
--/* $Id: p1275.c,v 1.22 2001/10/18 09:40:00 davem Exp $
-+/*
- * p1275.c: Sun IEEE 1275 PROM low level interface routines
- *
- * Copyright (C) 1996,1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
-diff --git a/arch/sparc64/prom/tree.c b/arch/sparc64/prom/tree.c
-index a99ccd7..281aea4 100644
---- a/arch/sparc64/prom/tree.c
-+++ b/arch/sparc64/prom/tree.c
-@@ -1,4 +1,4 @@
--/* $Id: tree.c,v 1.10 1998/01/10 22:39:00 ecd Exp $
-+/*
- * tree.c: Basic device tree traversal/scanning for the Linux
- * prom library.
- *
-diff --git a/arch/um/Kconfig b/arch/um/Kconfig
-index dba8e05..6976812 100644
---- a/arch/um/Kconfig
-+++ b/arch/um/Kconfig
-@@ -259,6 +259,8 @@ if BROKEN
- source "drivers/mtd/Kconfig"
- endif
-
-+source "drivers/leds/Kconfig"
-+
- #This is just to shut up some Kconfig warnings, so no prompt.
- config INPUT
- bool
-diff --git a/arch/um/drivers/pcap_user.c b/arch/um/drivers/pcap_user.c
-index e980935..5f90358 100644
---- a/arch/um/drivers/pcap_user.c
-+++ b/arch/um/drivers/pcap_user.c
-@@ -50,7 +50,7 @@ static int pcap_open(void *data)
- return -EIO;
- }
-
-- pri->compiled = kmalloc(sizeof(struct bpf_program),
-+ pri->compiled = uml_kmalloc(sizeof(struct bpf_program),
- UM_GFP_KERNEL);
- if (pri->compiled == NULL) {
- printk(UM_KERN_ERR "pcap_open : kmalloc failed\n");
-diff --git a/arch/um/kernel/init_task.c b/arch/um/kernel/init_task.c
-index dcfceca..910eda8 100644
---- a/arch/um/kernel/init_task.c
-+++ b/arch/um/kernel/init_task.c
-@@ -12,7 +12,6 @@
-
- static struct fs_struct init_fs = INIT_FS;
- struct mm_struct init_mm = INIT_MM(init_mm);
--static struct files_struct init_files = INIT_FILES;
- static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
- static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
- EXPORT_SYMBOL(init_mm);
-diff --git a/arch/um/kernel/ksyms.c b/arch/um/kernel/ksyms.c
-index 66e2a30..ccc02a6 100644
---- a/arch/um/kernel/ksyms.c
-+++ b/arch/um/kernel/ksyms.c
-@@ -60,6 +60,11 @@ EXPORT_SYMBOL(os_rcv_fd);
- EXPORT_SYMBOL(run_helper);
- EXPORT_SYMBOL(start_thread);
-
-+EXPORT_SYMBOL(add_sigio_fd);
-+EXPORT_SYMBOL(ignore_sigio_fd);
-+EXPORT_SYMBOL(deactivate_fd);
-+EXPORT_SYMBOL(sigio_broken);
-+
- #ifdef CONFIG_SMP
-
- /* required for SMP */
-diff --git a/arch/um/os-Linux/sys-i386/registers.c b/arch/um/os-Linux/sys-i386/registers.c
-index c6183e7..b487cbe 100644
---- a/arch/um/os-Linux/sys-i386/registers.c
-+++ b/arch/um/os-Linux/sys-i386/registers.c
-@@ -5,6 +5,7 @@
- */
-
- #include
-+#include
- #include
- #include "kern_constants.h"
- #include "longjmp.h"
-diff --git a/arch/um/sys-x86_64/ksyms.c b/arch/um/sys-x86_64/ksyms.c
-index 4d7d1a8..6604673 100644
---- a/arch/um/sys-x86_64/ksyms.c
-+++ b/arch/um/sys-x86_64/ksyms.c
-@@ -1,5 +1,7 @@
--#include "linux/module.h"
--#include "asm/string.h"
-+#include
-+#include
-+#include
-
- /*XXX: we need them because they would be exported by x86_64 */
- EXPORT_SYMBOL(__memcpy);
-+EXPORT_SYMBOL(csum_partial);
-diff --git a/arch/v850/kernel/init_task.c b/arch/v850/kernel/init_task.c
-index ed2f93c..44b274d 100644
---- a/arch/v850/kernel/init_task.c
-+++ b/arch/v850/kernel/init_task.c
-@@ -21,7 +21,6 @@
- #include
-
- static struct fs_struct init_fs = INIT_FS;
--static struct files_struct init_files = INIT_FILES;
- static struct signal_struct init_signals = INIT_SIGNALS (init_signals);
- static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
- struct mm_struct init_mm = INIT_MM (init_mm);
-diff --git a/arch/x86/boot/printf.c b/arch/x86/boot/printf.c
-index c1d00c0..50e47cd 100644
---- a/arch/x86/boot/printf.c
-+++ b/arch/x86/boot/printf.c
-@@ -56,7 +56,7 @@ static char *number(char *str, long num, int base, int size, int precision,
- if (type & LEFT)
- type &= ~ZEROPAD;
- if (base < 2 || base > 36)
-- return 0;
-+ return NULL;
- c = (type & ZEROPAD) ? '0' : ' ';
- sign = 0;
- if (type & SIGN) {
-diff --git a/arch/x86/kernel/apic_64.c b/arch/x86/kernel/apic_64.c
-index 5910020..0633cfd 100644
---- a/arch/x86/kernel/apic_64.c
-+++ b/arch/x86/kernel/apic_64.c
-@@ -534,7 +534,7 @@ int setup_profiling_timer(unsigned int multiplier)
- */
- void clear_local_APIC(void)
- {
-- int maxlvt = lapic_get_maxlvt();
-+ int maxlvt;
- u32 v;
-
- /* APIC hasn't been mapped yet */
-diff --git a/arch/x86/kernel/cpu/cpufreq/longrun.c b/arch/x86/kernel/cpu/cpufreq/longrun.c
-index af4a867..777a7ff 100644
---- a/arch/x86/kernel/cpu/cpufreq/longrun.c
-+++ b/arch/x86/kernel/cpu/cpufreq/longrun.c
-@@ -245,7 +245,7 @@ static unsigned int __init longrun_determine_freqs(unsigned int *low_freq,
- if ((ecx > 95) || (ecx == 0) || (eax < ebx))
- return -EIO;
-
-- edx = (eax - ebx) / (100 - ecx);
-+ edx = ((eax - ebx) * 100) / (100 - ecx);
- *low_freq = edx * 1000; /* back to kHz */
-
- dprintk("low frequency is %u kHz\n", *low_freq);
-diff --git a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c
-index 46d4034..206791e 100644
---- a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c
-+++ b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c
-@@ -1127,12 +1127,23 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol)
- * an UP version, and is deprecated by AMD.
- */
- if (num_online_cpus() != 1) {
-- printk(KERN_ERR PFX "MP systems not supported by PSB BIOS structure\n");
-+#ifndef CONFIG_ACPI_PROCESSOR
-+ printk(KERN_ERR PFX "ACPI Processor support is required "
-+ "for SMP systems but is absent. Please load the "
-+ "ACPI Processor module before starting this "
-+ "driver.\n");
-+#else
-+ printk(KERN_ERR PFX "Your BIOS does not provide ACPI "
-+ "_PSS objects in a way that Linux understands. "
-+ "Please report this to the Linux ACPI maintainers"
-+ " and complain to your BIOS vendor.\n");
-+#endif
- kfree(data);
- return -ENODEV;
- }
- if (pol->cpu != 0) {
-- printk(KERN_ERR PFX "No _PSS objects for CPU other than CPU0\n");
-+ printk(KERN_ERR PFX "No ACPI _PSS objects for CPU other than "
-+ "CPU0. Complain to your BIOS vendor.\n");
- kfree(data);
- return -ENODEV;
- }
-diff --git a/arch/x86/kernel/init_task.c b/arch/x86/kernel/init_task.c
-index 3d01e47..a4f93b4 100644
---- a/arch/x86/kernel/init_task.c
-+++ b/arch/x86/kernel/init_task.c
-@@ -11,7 +11,6 @@
- #include
-
- static struct fs_struct init_fs = INIT_FS;
--static struct files_struct init_files = INIT_FILES;
- static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
- static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
- struct mm_struct init_mm = INIT_MM(init_mm);
-diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c
-index 4bc1be5..08a3098 100644
---- a/arch/x86/kernel/kvmclock.c
-+++ b/arch/x86/kernel/kvmclock.c
-@@ -53,7 +53,7 @@ static cycle_t kvm_clock_read(void);
- * have elapsed since the hypervisor wrote the data. So we try to account for
- * that with system time
- */
--unsigned long kvm_get_wallclock(void)
-+static unsigned long kvm_get_wallclock(void)
- {
- u32 wc_sec, wc_nsec;
- u64 delta;
-@@ -86,7 +86,7 @@ unsigned long kvm_get_wallclock(void)
- return ts.tv_sec + 1;
- }
-
--int kvm_set_wallclock(unsigned long now)
-+static int kvm_set_wallclock(unsigned long now)
- {
- return 0;
- }
-diff --git a/arch/x86/kernel/tsc_32.c b/arch/x86/kernel/tsc_32.c
-index e479072..068759d 100644
---- a/arch/x86/kernel/tsc_32.c
-+++ b/arch/x86/kernel/tsc_32.c
-@@ -14,7 +14,7 @@
-
- #include "mach_timer.h"
-
--static int tsc_enabled;
-+static int tsc_disabled;
-
- /*
- * On some systems the TSC frequency does not
-@@ -28,8 +28,8 @@ EXPORT_SYMBOL_GPL(tsc_khz);
- static int __init tsc_setup(char *str)
- {
- printk(KERN_WARNING "notsc: Kernel compiled with CONFIG_X86_TSC, "
-- "cannot disable TSC completely.\n");
-- mark_tsc_unstable("user disabled TSC");
-+ "cannot disable TSC completely.\n");
-+ tsc_disabled = 1;
- return 1;
- }
- #else
-@@ -120,7 +120,7 @@ unsigned long long native_sched_clock(void)
- * very important for it to be as fast as the platform
- * can achive it. )
- */
-- if (unlikely(!tsc_enabled && !tsc_unstable))
-+ if (unlikely(tsc_disabled))
- /* No locking but a rare wrong value is not a big deal: */
- return (jiffies_64 - INITIAL_JIFFIES) * (1000000000 / HZ);
-
-@@ -322,7 +322,6 @@ void mark_tsc_unstable(char *reason)
- {
- if (!tsc_unstable) {
- tsc_unstable = 1;
-- tsc_enabled = 0;
- printk("Marking TSC unstable due to: %s.\n", reason);
- /* Can be called before registration */
- if (clocksource_tsc.mult)
-@@ -336,7 +335,7 @@ EXPORT_SYMBOL_GPL(mark_tsc_unstable);
- static int __init dmi_mark_tsc_unstable(const struct dmi_system_id *d)
- {
- printk(KERN_NOTICE "%s detected: marking TSC unstable.\n",
-- d->ident);
-+ d->ident);
- tsc_unstable = 1;
- return 0;
- }
-@@ -403,14 +402,22 @@ void __init tsc_init(void)
- {
- int cpu;
-
-- if (!cpu_has_tsc)
-+ if (!cpu_has_tsc || tsc_disabled) {
-+ /* Disable the TSC in case of !cpu_has_tsc */
-+ tsc_disabled = 1;
- return;
-+ }
-
- cpu_khz = calculate_cpu_khz();
- tsc_khz = cpu_khz;
-
- if (!cpu_khz) {
- mark_tsc_unstable("could not calculate TSC khz");
-+ /*
-+ * We need to disable the TSC completely in this case
-+ * to prevent sched_clock() from using it.
-+ */
-+ tsc_disabled = 1;
- return;
- }
-
-@@ -441,8 +448,6 @@ void __init tsc_init(void)
- if (check_tsc_unstable()) {
- clocksource_tsc.rating = 0;
- clocksource_tsc.flags &= ~CLOCK_SOURCE_IS_CONTINUOUS;
-- } else
-- tsc_enabled = 1;
--
-+ }
- clocksource_register(&clocksource_tsc);
- }
-diff --git a/arch/x86/kernel/tsc_64.c b/arch/x86/kernel/tsc_64.c
-index fcc16e5..1784b80 100644
---- a/arch/x86/kernel/tsc_64.c
-+++ b/arch/x86/kernel/tsc_64.c
-@@ -227,14 +227,14 @@ void __init tsc_calibrate(void)
- /* hpet or pmtimer available ? */
- if (!hpet && !pm1 && !pm2) {
- printk(KERN_INFO "TSC calibrated against PIT\n");
-- return;
-+ goto out;
- }
-
- /* Check, whether the sampling was disturbed by an SMI */
- if (tsc1 == ULONG_MAX || tsc2 == ULONG_MAX) {
- printk(KERN_WARNING "TSC calibration disturbed by SMI, "
- "using PIT calibration result\n");
-- return;
-+ goto out;
- }
-
- tsc2 = (tsc2 - tsc1) * 1000000L;
-@@ -255,6 +255,7 @@ void __init tsc_calibrate(void)
-
- tsc_khz = tsc2 / tsc1;
-
-+out:
- for_each_possible_cpu(cpu)
- set_cyc2ns_scale(tsc_khz, cpu);
- }
-diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c
-index 3324d90..7c077a9 100644
---- a/arch/x86/kvm/i8254.c
-+++ b/arch/x86/kvm/i8254.c
-@@ -216,7 +216,7 @@ int pit_has_pending_timer(struct kvm_vcpu *vcpu)
- {
- struct kvm_pit *pit = vcpu->kvm->arch.vpit;
-
-- if (pit && vcpu->vcpu_id == 0)
-+ if (pit && vcpu->vcpu_id == 0 && pit->pit_state.inject_pending)
- return atomic_read(&pit->pit_state.pit_timer.pending);
-
- return 0;
-diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
-index 36809d7..c297c50 100644
---- a/arch/x86/kvm/lapic.c
-+++ b/arch/x86/kvm/lapic.c
-@@ -957,7 +957,7 @@ int apic_has_pending_timer(struct kvm_vcpu *vcpu)
- {
- struct kvm_lapic *lapic = vcpu->arch.apic;
-
-- if (lapic)
-+ if (lapic && apic_enabled(lapic) && apic_lvt_enabled(lapic, APIC_LVTT))
- return atomic_read(&lapic->timer.pending);
-
- return 0;
-diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
-index 36c5406..7246b60 100644
---- a/arch/x86/kvm/mmu.c
-+++ b/arch/x86/kvm/mmu.c
-@@ -1996,7 +1996,7 @@ static struct shrinker mmu_shrinker = {
- .seeks = DEFAULT_SEEKS * 10,
- };
-
--void mmu_destroy_caches(void)
-+static void mmu_destroy_caches(void)
- {
- if (pte_chain_cache)
- kmem_cache_destroy(pte_chain_cache);
-diff --git a/arch/x86/kvm/x86_emulate.c b/arch/x86/kvm/x86_emulate.c
-index f2a696d..8a96320 100644
---- a/arch/x86/kvm/x86_emulate.c
-+++ b/arch/x86/kvm/x86_emulate.c
-@@ -677,8 +677,9 @@ static int decode_modrm(struct x86_emulate_ctxt *ctxt,
- c->use_modrm_ea = 1;
-
- if (c->modrm_mod == 3) {
-- c->modrm_val = *(unsigned long *)
-- decode_register(c->modrm_rm, c->regs, c->d & ByteOp);
-+ c->modrm_ptr = decode_register(c->modrm_rm,
-+ c->regs, c->d & ByteOp);
-+ c->modrm_val = *(unsigned long *)c->modrm_ptr;
- return rc;
- }
-
-@@ -1005,6 +1006,7 @@ done_prefixes:
- if ((c->d & ModRM) && c->modrm_mod == 3) {
- c->src.type = OP_REG;
- c->src.val = c->modrm_val;
-+ c->src.ptr = c->modrm_ptr;
- break;
- }
- c->src.type = OP_MEM;
-@@ -1049,6 +1051,7 @@ done_prefixes:
- if ((c->d & ModRM) && c->modrm_mod == 3) {
- c->dst.type = OP_REG;
- c->dst.val = c->dst.orig_val = c->modrm_val;
-+ c->dst.ptr = c->modrm_ptr;
- break;
- }
- c->dst.type = OP_MEM;
-diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c
-index 8545c8a..6e64aaf 100644
---- a/arch/x86/pci/common.c
-+++ b/arch/x86/pci/common.c
-@@ -302,18 +302,18 @@ static struct dmi_system_id __devinitdata pciprobe_dmi_table[] = {
- },
- {
- .callback = set_bf_sort,
-- .ident = "HP ProLiant DL385 G2",
-+ .ident = "HP ProLiant DL360",
- .matches = {
- DMI_MATCH(DMI_SYS_VENDOR, "HP"),
-- DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant DL385 G2"),
-+ DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant DL360"),
- },
- },
- {
- .callback = set_bf_sort,
-- .ident = "HP ProLiant DL585 G2",
-+ .ident = "HP ProLiant DL380",
- .matches = {
- DMI_MATCH(DMI_SYS_VENDOR, "HP"),
-- DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant DL585 G2"),
-+ DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant DL380"),
- },
- },
- #ifdef __i386__
-diff --git a/arch/x86/vdso/vclock_gettime.c b/arch/x86/vdso/vclock_gettime.c
-index 23476c2..efa2ba7 100644
---- a/arch/x86/vdso/vclock_gettime.c
-+++ b/arch/x86/vdso/vclock_gettime.c
-@@ -106,9 +106,9 @@ int __vdso_gettimeofday(struct timeval *tv, struct timezone *tz)
- do_realtime((struct timespec *)tv);
- tv->tv_usec /= 1000;
- if (unlikely(tz != NULL)) {
-- /* This relies on gcc inlining the memcpy. We'll notice
-- if it ever fails to do so. */
-- memcpy(tz, >od->sys_tz, sizeof(struct timezone));
-+ /* Avoid memcpy. Some old compilers fail to inline it */
-+ tz->tz_minuteswest = gtod->sys_tz.tz_minuteswest;
-+ tz->tz_dsttime = gtod->sys_tz.tz_dsttime;
- }
- return 0;
- }
-diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c
-index 126766d..3525ef5 100644
---- a/arch/x86/xen/mmu.c
-+++ b/arch/x86/xen/mmu.c
-@@ -60,7 +60,7 @@ xmaddr_t arbitrary_virt_to_machine(unsigned long address)
- {
- unsigned int level;
- pte_t *pte = lookup_address(address, &level);
-- unsigned offset = address & PAGE_MASK;
-+ unsigned offset = address & ~PAGE_MASK;
-
- BUG_ON(pte == NULL);
-
-diff --git a/arch/xtensa/kernel/init_task.c b/arch/xtensa/kernel/init_task.c
-index 021b4f4..3df469d 100644
---- a/arch/xtensa/kernel/init_task.c
-+++ b/arch/xtensa/kernel/init_task.c
-@@ -22,7 +22,6 @@
- #include
-
- static struct fs_struct init_fs = INIT_FS;
--static struct files_struct init_files = INIT_FILES;
- static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
- static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
- struct mm_struct init_mm = INIT_MM(init_mm);
-diff --git a/drivers/acpi/dispatcher/dsmethod.c b/drivers/acpi/dispatcher/dsmethod.c
-index e48a3ea..2509809 100644
---- a/drivers/acpi/dispatcher/dsmethod.c
-+++ b/drivers/acpi/dispatcher/dsmethod.c
-@@ -565,7 +565,7 @@ acpi_ds_terminate_control_method(union acpi_operand_object *method_desc,
-
- acpi_os_release_mutex(method_desc->method.
- mutex->mutex.os_mutex);
-- method_desc->method.mutex->mutex.thread_id = 0;
-+ method_desc->method.mutex->mutex.thread_id = NULL;
- }
- }
-
-diff --git a/drivers/acpi/executer/exmutex.c b/drivers/acpi/executer/exmutex.c
-index c873ab4..a8bf3d7 100644
---- a/drivers/acpi/executer/exmutex.c
-+++ b/drivers/acpi/executer/exmutex.c
-@@ -326,7 +326,7 @@ acpi_status acpi_ex_release_mutex_object(union acpi_operand_object *obj_desc)
-
- /* Clear mutex info */
-
-- obj_desc->mutex.thread_id = 0;
-+ obj_desc->mutex.thread_id = NULL;
- return_ACPI_STATUS(status);
- }
-
-@@ -463,7 +463,7 @@ void acpi_ex_release_all_mutexes(struct acpi_thread_state *thread)
- /* Mark mutex unowned */
-
- obj_desc->mutex.owner_thread = NULL;
-- obj_desc->mutex.thread_id = 0;
-+ obj_desc->mutex.thread_id = NULL;
-
- /* Update Thread sync_level (Last mutex is the important one) */
-
-diff --git a/drivers/ata/libata-acpi.c b/drivers/ata/libata-acpi.c
-index 70b77e0..dbf6ca7 100644
---- a/drivers/ata/libata-acpi.c
-+++ b/drivers/ata/libata-acpi.c
-@@ -118,8 +118,8 @@ static void ata_acpi_associate_ide_port(struct ata_port *ap)
- ap->pflags |= ATA_PFLAG_INIT_GTM_VALID;
- }
-
--static void ata_acpi_handle_hotplug(struct ata_port *ap, struct ata_device *dev,
-- u32 event)
-+static void ata_acpi_handle_hotplug(struct ata_port *ap, struct ata_device
-+ *dev, u32 event)
- {
- char event_string[12];
- char *envp[] = { event_string, NULL };
-@@ -127,6 +127,9 @@ static void ata_acpi_handle_hotplug(struct ata_port *ap, struct ata_device *dev,
- struct kobject *kobj = NULL;
- int wait = 0;
- unsigned long flags;
-+ acpi_handle handle, tmphandle;
-+ unsigned long sta;
-+ acpi_status status;
-
- if (!ap)
- ap = dev->link->ap;
-@@ -134,32 +137,57 @@ static void ata_acpi_handle_hotplug(struct ata_port *ap, struct ata_device *dev,
-
- spin_lock_irqsave(ap->lock, flags);
-
-+ if (dev)
-+ handle = dev->acpi_handle;
-+ else
-+ handle = ap->acpi_handle;
-+
-+ status = acpi_get_handle(handle, "_EJ0", &tmphandle);
-+ if (ACPI_FAILURE(status)) {
-+ /* This device is not ejectable */
-+ spin_unlock_irqrestore(ap->lock, flags);
-+ return;
-+ }
-+
-+ status = acpi_evaluate_integer(handle, "_STA", NULL, &sta);
-+ if (ACPI_FAILURE(status)) {
-+ printk ("Unable to determine bay status\n");
-+ spin_unlock_irqrestore(ap->lock, flags);
-+ return;
-+ }
-+
- switch (event) {
- case ACPI_NOTIFY_BUS_CHECK:
- case ACPI_NOTIFY_DEVICE_CHECK:
- ata_ehi_push_desc(ehi, "ACPI event");
-- ata_ehi_hotplugged(ehi);
-- ata_port_freeze(ap);
-- break;
--
-- case ACPI_NOTIFY_EJECT_REQUEST:
-- ata_ehi_push_desc(ehi, "ACPI event");
-- if (dev)
-- dev->flags |= ATA_DFLAG_DETACH;
-- else {
-- struct ata_link *tlink;
-- struct ata_device *tdev;
--
-- ata_port_for_each_link(tlink, ap)
-- ata_link_for_each_dev(tdev, tlink)
-- tdev->flags |= ATA_DFLAG_DETACH;
-+ if (!sta) {
-+ /* Device has been unplugged */
-+ if (dev)
-+ dev->flags |= ATA_DFLAG_DETACH;
-+ else {
-+ struct ata_link *tlink;
-+ struct ata_device *tdev;
-+
-+ ata_port_for_each_link(tlink, ap) {
-+ ata_link_for_each_dev(tdev, tlink) {
-+ tdev->flags |=
-+ ATA_DFLAG_DETACH;
-+ }
-+ }
-+ }
-+ ata_port_schedule_eh(ap);
-+ wait = 1;
-+ } else {
-+ ata_ehi_hotplugged(ehi);
-+ ata_port_freeze(ap);
- }
--
-- ata_port_schedule_eh(ap);
-- wait = 1;
-- break;
- }
-
-+ spin_unlock_irqrestore(ap->lock, flags);
-+
-+ if (wait)
-+ ata_port_wait_eh(ap);
-+
- if (dev) {
- if (dev->sdev)
- kobj = &dev->sdev->sdev_gendev.kobj;
-@@ -170,11 +198,6 @@ static void ata_acpi_handle_hotplug(struct ata_port *ap, struct ata_device *dev,
- sprintf(event_string, "BAY_EVENT=%d", event);
- kobject_uevent_env(kobj, KOBJ_CHANGE, envp);
- }
--
-- spin_unlock_irqrestore(ap->lock, flags);
--
-- if (wait)
-- ata_port_wait_eh(ap);
- }
-
- static void ata_acpi_dev_notify(acpi_handle handle, u32 event, void *data)
-diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
-index 927b692..3c89f20 100644
---- a/drivers/ata/libata-core.c
-+++ b/drivers/ata/libata-core.c
-@@ -2126,6 +2126,13 @@ int ata_dev_configure(struct ata_device *dev)
- dev->horkage |= ata_dev_blacklisted(dev);
- ata_force_horkage(dev);
-
-+ if (dev->horkage & ATA_HORKAGE_DISABLE) {
-+ ata_dev_printk(dev, KERN_INFO,
-+ "unsupported device, disabling\n");
-+ ata_dev_disable(dev);
-+ return 0;
-+ }
-+
- /* let ACPI work its magic */
- rc = ata_acpi_on_devcfg(dev);
- if (rc)
-@@ -3490,22 +3497,11 @@ int sata_link_resume(struct ata_link *link, const unsigned long *params,
- if ((rc = sata_link_debounce(link, params, deadline)))
- return rc;
-
-- /* Clear SError. PMP and some host PHYs require this to
-- * operate and clearing should be done before checking PHY
-- * online status to avoid race condition (hotplugging between
-- * link resume and status check).
-- */
-+ /* clear SError, some PHYs require this even for SRST to work */
- if (!(rc = sata_scr_read(link, SCR_ERROR, &serror)))
- rc = sata_scr_write(link, SCR_ERROR, serror);
-- if (rc == 0 || rc == -EINVAL) {
-- unsigned long flags;
-
-- spin_lock_irqsave(link->ap->lock, flags);
-- link->eh_info.serror = 0;
-- spin_unlock_irqrestore(link->ap->lock, flags);
-- rc = 0;
-- }
-- return rc;
-+ return rc != -EINVAL ? rc : 0;
- }
-
- /**
-@@ -3653,9 +3649,13 @@ int sata_link_hardreset(struct ata_link *link, const unsigned long *timing,
- if (check_ready)
- rc = ata_wait_ready(link, deadline, check_ready);
- out:
-- if (rc && rc != -EAGAIN)
-+ if (rc && rc != -EAGAIN) {
-+ /* online is set iff link is online && reset succeeded */
-+ if (online)
-+ *online = false;
- ata_link_printk(link, KERN_ERR,
- "COMRESET failed (errno=%d)\n", rc);
-+ }
- DPRINTK("EXIT, rc=%d\n", rc);
- return rc;
- }
-@@ -3700,8 +3700,14 @@ int sata_std_hardreset(struct ata_link *link, unsigned int *class,
- */
- void ata_std_postreset(struct ata_link *link, unsigned int *classes)
- {
-+ u32 serror;
-+
- DPRINTK("ENTER\n");
-
-+ /* reset complete, clear SError */
-+ if (!sata_scr_read(link, SCR_ERROR, &serror))
-+ sata_scr_write(link, SCR_ERROR, serror);
-+
- /* print link status */
- sata_print_link_status(link);
-
-@@ -3894,8 +3900,7 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
- { "SAMSUNG CD-ROM SN-124", "N001", ATA_HORKAGE_NODMA },
- { "Seagate STT20000A", NULL, ATA_HORKAGE_NODMA },
- /* Odd clown on sil3726/4726 PMPs */
-- { "Config Disk", NULL, ATA_HORKAGE_NODMA |
-- ATA_HORKAGE_SKIP_PM },
-+ { "Config Disk", NULL, ATA_HORKAGE_DISABLE },
-
- /* Weird ATAPI devices */
- { "TORiSAN DVD-ROM DRD-N216", NULL, ATA_HORKAGE_MAX_SEC_128 },
-@@ -5616,7 +5621,7 @@ int ata_host_register(struct ata_host *host, struct scsi_host_template *sht)
- spin_lock_irqsave(ap->lock, flags);
-
- ehi->probe_mask |= ATA_ALL_DEVICES;
-- ehi->action |= ATA_EH_RESET;
-+ ehi->action |= ATA_EH_RESET | ATA_EH_LPM;
- ehi->flags |= ATA_EHI_NO_AUTOPSY | ATA_EHI_QUIET;
-
- ap->pflags &= ~ATA_PFLAG_INITIALIZING;
-@@ -5649,7 +5654,6 @@ int ata_host_register(struct ata_host *host, struct scsi_host_template *sht)
- struct ata_port *ap = host->ports[i];
-
- ata_scsi_scan_host(ap, 1);
-- ata_lpm_schedule(ap, ap->pm_policy);
- }
-
- return 0;
-diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
-index 62e0331..7894d83 100644
---- a/drivers/ata/libata-eh.c
-+++ b/drivers/ata/libata-eh.c
-@@ -1308,12 +1308,7 @@ static void ata_eh_analyze_serror(struct ata_link *link)
- unsigned int err_mask = 0, action = 0;
- u32 hotplug_mask;
-
-- if (serror & SERR_PERSISTENT) {
-- err_mask |= AC_ERR_ATA_BUS;
-- action |= ATA_EH_RESET;
-- }
-- if (serror &
-- (SERR_DATA_RECOVERED | SERR_COMM_RECOVERED | SERR_DATA)) {
-+ if (serror & (SERR_PERSISTENT | SERR_DATA)) {
- err_mask |= AC_ERR_ATA_BUS;
- action |= ATA_EH_RESET;
- }
-@@ -2047,19 +2042,11 @@ static int ata_do_reset(struct ata_link *link, ata_reset_fn_t reset,
- unsigned int *classes, unsigned long deadline)
- {
- struct ata_device *dev;
-- int rc;
-
- ata_link_for_each_dev(dev, link)
- classes[dev->devno] = ATA_DEV_UNKNOWN;
-
-- rc = reset(link, classes, deadline);
--
-- /* convert all ATA_DEV_UNKNOWN to ATA_DEV_NONE */
-- ata_link_for_each_dev(dev, link)
-- if (classes[dev->devno] == ATA_DEV_UNKNOWN)
-- classes[dev->devno] = ATA_DEV_NONE;
--
-- return rc;
-+ return reset(link, classes, deadline);
- }
-
- static int ata_eh_followup_srst_needed(struct ata_link *link,
-@@ -2096,9 +2083,11 @@ int ata_eh_reset(struct ata_link *link, int classify,
- ata_reset_fn_t reset;
- unsigned long flags;
- u32 sstatus;
-- int rc;
-+ int nr_known, rc;
-
-- /* about to reset */
-+ /*
-+ * Prepare to reset
-+ */
- spin_lock_irqsave(ap->lock, flags);
- ap->pflags |= ATA_PFLAG_RESETTING;
- spin_unlock_irqrestore(ap->lock, flags);
-@@ -2124,16 +2113,8 @@ int ata_eh_reset(struct ata_link *link, int classify,
- ap->ops->set_piomode(ap, dev);
- }
-
-- if (!softreset && !hardreset) {
-- if (verbose)
-- ata_link_printk(link, KERN_INFO, "no reset method "
-- "available, skipping reset\n");
-- if (!(lflags & ATA_LFLAG_ASSUME_CLASS))
-- lflags |= ATA_LFLAG_ASSUME_ATA;
-- goto done;
-- }
--
- /* prefer hardreset */
-+ reset = NULL;
- ehc->i.action &= ~ATA_EH_RESET;
- if (hardreset) {
- reset = hardreset;
-@@ -2141,11 +2122,6 @@ int ata_eh_reset(struct ata_link *link, int classify,
- } else if (softreset) {
- reset = softreset;
- ehc->i.action = ATA_EH_SOFTRESET;
-- } else {
-- ata_link_printk(link, KERN_ERR, "BUG: no reset method, "
-- "please report to linux-ide@vger.kernel.org\n");
-- dump_stack();
-- return -EINVAL;
- }
-
- if (prereset) {
-@@ -2165,55 +2141,71 @@ int ata_eh_reset(struct ata_link *link, int classify,
- "prereset failed (errno=%d)\n", rc);
- goto out;
- }
-- }
-
-- /* prereset() might have cleared ATA_EH_RESET */
-- if (!(ehc->i.action & ATA_EH_RESET)) {
-- /* prereset told us not to reset, bang classes and return */
-- ata_link_for_each_dev(dev, link)
-- classes[dev->devno] = ATA_DEV_NONE;
-- rc = 0;
-- goto out;
-+ /* prereset() might have cleared ATA_EH_RESET. If so,
-+ * bang classes and return.
-+ */
-+ if (reset && !(ehc->i.action & ATA_EH_RESET)) {
-+ ata_link_for_each_dev(dev, link)
-+ classes[dev->devno] = ATA_DEV_NONE;
-+ rc = 0;
-+ goto out;
-+ }
- }
-
- retry:
-+ /*
-+ * Perform reset
-+ */
-+ if (ata_is_host_link(link))
-+ ata_eh_freeze_port(ap);
-+
- deadline = jiffies + ata_eh_reset_timeouts[try++];
-
-- /* shut up during boot probing */
-- if (verbose)
-- ata_link_printk(link, KERN_INFO, "%s resetting link\n",
-- reset == softreset ? "soft" : "hard");
-+ if (reset) {
-+ if (verbose)
-+ ata_link_printk(link, KERN_INFO, "%s resetting link\n",
-+ reset == softreset ? "soft" : "hard");
-
-- /* mark that this EH session started with reset */
-- if (reset == hardreset)
-- ehc->i.flags |= ATA_EHI_DID_HARDRESET;
-- else
-- ehc->i.flags |= ATA_EHI_DID_SOFTRESET;
-+ /* mark that this EH session started with reset */
-+ if (reset == hardreset)
-+ ehc->i.flags |= ATA_EHI_DID_HARDRESET;
-+ else
-+ ehc->i.flags |= ATA_EHI_DID_SOFTRESET;
-
-- rc = ata_do_reset(link, reset, classes, deadline);
-+ rc = ata_do_reset(link, reset, classes, deadline);
-
-- if (reset == hardreset &&
-- ata_eh_followup_srst_needed(link, rc, classify, classes)) {
-- /* okay, let's do follow-up softreset */
-- reset = softreset;
-+ if (reset == hardreset &&
-+ ata_eh_followup_srst_needed(link, rc, classify, classes)) {
-+ /* okay, let's do follow-up softreset */
-+ reset = softreset;
-
-- if (!reset) {
-- ata_link_printk(link, KERN_ERR,
-- "follow-up softreset required "
-- "but no softreset avaliable\n");
-- rc = -EINVAL;
-- goto fail;
-+ if (!reset) {
-+ ata_link_printk(link, KERN_ERR,
-+ "follow-up softreset required "
-+ "but no softreset avaliable\n");
-+ rc = -EINVAL;
-+ goto fail;
-+ }
-+
-+ ata_eh_about_to_do(link, NULL, ATA_EH_RESET);
-+ rc = ata_do_reset(link, reset, classes, deadline);
- }
-
-- ata_eh_about_to_do(link, NULL, ATA_EH_RESET);
-- rc = ata_do_reset(link, reset, classes, deadline);
-+ /* -EAGAIN can happen if we skipped followup SRST */
-+ if (rc && rc != -EAGAIN)
-+ goto fail;
-+ } else {
-+ if (verbose)
-+ ata_link_printk(link, KERN_INFO, "no reset method "
-+ "available, skipping reset\n");
-+ if (!(lflags & ATA_LFLAG_ASSUME_CLASS))
-+ lflags |= ATA_LFLAG_ASSUME_ATA;
- }
-
-- /* -EAGAIN can happen if we skipped followup SRST */
-- if (rc && rc != -EAGAIN)
-- goto fail;
--
-- done:
-+ /*
-+ * Post-reset processing
-+ */
- ata_link_for_each_dev(dev, link) {
- /* After the reset, the device state is PIO 0 and the
- * controller state is undefined. Reset also wakes up
-@@ -2236,9 +2228,53 @@ int ata_eh_reset(struct ata_link *link, int classify,
- if (sata_scr_read(link, SCR_STATUS, &sstatus) == 0)
- link->sata_spd = (sstatus >> 4) & 0xf;
-
-+ /* thaw the port */
-+ if (ata_is_host_link(link))
-+ ata_eh_thaw_port(ap);
-+
-+ /* postreset() should clear hardware SError. Although SError
-+ * is cleared during link resume, clearing SError here is
-+ * necessary as some PHYs raise hotplug events after SRST.
-+ * This introduces race condition where hotplug occurs between
-+ * reset and here. This race is mediated by cross checking
-+ * link onlineness and classification result later.
-+ */
- if (postreset)
- postreset(link, classes);
-
-+ /* clear cached SError */
-+ spin_lock_irqsave(link->ap->lock, flags);
-+ link->eh_info.serror = 0;
-+ spin_unlock_irqrestore(link->ap->lock, flags);
-+
-+ /* Make sure onlineness and classification result correspond.
-+ * Hotplug could have happened during reset and some
-+ * controllers fail to wait while a drive is spinning up after
-+ * being hotplugged causing misdetection. By cross checking
-+ * link onlineness and classification result, those conditions
-+ * can be reliably detected and retried.
-+ */
-+ nr_known = 0;
-+ ata_link_for_each_dev(dev, link) {
-+ /* convert all ATA_DEV_UNKNOWN to ATA_DEV_NONE */
-+ if (classes[dev->devno] == ATA_DEV_UNKNOWN)
-+ classes[dev->devno] = ATA_DEV_NONE;
-+ else
-+ nr_known++;
-+ }
-+
-+ if (classify && !nr_known && ata_link_online(link)) {
-+ if (try < max_tries) {
-+ ata_link_printk(link, KERN_WARNING, "link online but "
-+ "device misclassified, retrying\n");
-+ rc = -EAGAIN;
-+ goto fail;
-+ }
-+ ata_link_printk(link, KERN_WARNING,
-+ "link online but device misclassified, "
-+ "device detection might fail\n");
-+ }
-+
- /* reset successful, schedule revalidation */
- ata_eh_done(link, NULL, ATA_EH_RESET);
- ehc->i.action |= ATA_EH_REVALIDATE;
-@@ -2587,7 +2623,7 @@ int ata_eh_recover(struct ata_port *ap, ata_prereset_fn_t prereset,
- struct ata_link *link;
- struct ata_device *dev;
- int nr_failed_devs, nr_disabled_devs;
-- int reset, rc;
-+ int rc;
- unsigned long flags;
-
- DPRINTK("ENTER\n");
-@@ -2630,7 +2666,6 @@ int ata_eh_recover(struct ata_port *ap, ata_prereset_fn_t prereset,
- rc = 0;
- nr_failed_devs = 0;
- nr_disabled_devs = 0;
-- reset = 0;
-
- /* if UNLOADING, finish immediately */
- if (ap->pflags & ATA_PFLAG_UNLOADING)
-@@ -2644,40 +2679,24 @@ int ata_eh_recover(struct ata_port *ap, ata_prereset_fn_t prereset,
- if (ata_eh_skip_recovery(link))
- ehc->i.action = 0;
-
-- /* do we need to reset? */
-- if (ehc->i.action & ATA_EH_RESET)
-- reset = 1;
--
- ata_link_for_each_dev(dev, link)
- ehc->classes[dev->devno] = ATA_DEV_UNKNOWN;
- }
-
- /* reset */
-- if (reset) {
-- /* if PMP is attached, this function only deals with
-- * downstream links, port should stay thawed.
-- */
-- if (!sata_pmp_attached(ap))
-- ata_eh_freeze_port(ap);
--
-- ata_port_for_each_link(link, ap) {
-- struct ata_eh_context *ehc = &link->eh_context;
-+ ata_port_for_each_link(link, ap) {
-+ struct ata_eh_context *ehc = &link->eh_context;
-
-- if (!(ehc->i.action & ATA_EH_RESET))
-- continue;
-+ if (!(ehc->i.action & ATA_EH_RESET))
-+ continue;
-
-- rc = ata_eh_reset(link, ata_link_nr_vacant(link),
-- prereset, softreset, hardreset,
-- postreset);
-- if (rc) {
-- ata_link_printk(link, KERN_ERR,
-- "reset failed, giving up\n");
-- goto out;
-- }
-+ rc = ata_eh_reset(link, ata_link_nr_vacant(link),
-+ prereset, softreset, hardreset, postreset);
-+ if (rc) {
-+ ata_link_printk(link, KERN_ERR,
-+ "reset failed, giving up\n");
-+ goto out;
- }
--
-- if (!sata_pmp_attached(ap))
-- ata_eh_thaw_port(ap);
- }
-
- /* the rest */
-diff --git a/drivers/ata/libata-pmp.c b/drivers/ata/libata-pmp.c
-index ff1822a..0f9386d 100644
---- a/drivers/ata/libata-pmp.c
-+++ b/drivers/ata/libata-pmp.c
-@@ -48,7 +48,7 @@ static unsigned int sata_pmp_read(struct ata_link *link, int reg, u32 *r_val)
- tf.device = link->pmp;
-
- err_mask = ata_exec_internal(pmp_dev, &tf, NULL, DMA_NONE, NULL, 0,
-- SATA_PMP_SCR_TIMEOUT);
-+ SATA_PMP_RW_TIMEOUT);
- if (err_mask)
- return err_mask;
-
-@@ -88,7 +88,7 @@ static unsigned int sata_pmp_write(struct ata_link *link, int reg, u32 val)
- tf.lbah = (val >> 24) & 0xff;
-
- return ata_exec_internal(pmp_dev, &tf, NULL, DMA_NONE, NULL, 0,
-- SATA_PMP_SCR_TIMEOUT);
-+ SATA_PMP_RW_TIMEOUT);
- }
-
- /**
-@@ -257,19 +257,6 @@ static int sata_pmp_configure(struct ata_device *dev, int print_info)
- goto fail;
- }
-
-- /* turn off notification till fan-out ports are reset and configured */
-- if (gscr[SATA_PMP_GSCR_FEAT_EN] & SATA_PMP_FEAT_NOTIFY) {
-- gscr[SATA_PMP_GSCR_FEAT_EN] &= ~SATA_PMP_FEAT_NOTIFY;
--
-- err_mask = sata_pmp_write(dev->link, SATA_PMP_GSCR_FEAT_EN,
-- gscr[SATA_PMP_GSCR_FEAT_EN]);
-- if (err_mask) {
-- rc = -EIO;
-- reason = "failed to write GSCR_FEAT_EN";
-- goto fail;
-- }
-- }
--
- if (print_info) {
- ata_dev_printk(dev, KERN_INFO, "Port Multiplier %s, "
- "0x%04x:0x%04x r%d, %d ports, feat 0x%x/0x%x\n",
-@@ -700,8 +687,6 @@ static int sata_pmp_eh_recover_pmp(struct ata_port *ap,
- if (ehc->i.action & ATA_EH_RESET) {
- struct ata_link *tlink;
-
-- ata_eh_freeze_port(ap);
--
- /* reset */
- rc = ata_eh_reset(link, 0, prereset, softreset, hardreset,
- postreset);
-@@ -711,8 +696,6 @@ static int sata_pmp_eh_recover_pmp(struct ata_port *ap,
- goto fail;
- }
-
-- ata_eh_thaw_port(ap);
--
- /* PMP is reset, SErrors cannot be trusted, scan all */
- ata_port_for_each_link(tlink, ap) {
- struct ata_eh_context *ehc = &tlink->eh_context;
-@@ -864,6 +847,7 @@ static int sata_pmp_eh_recover(struct ata_port *ap)
- struct ata_link *pmp_link = &ap->link;
- struct ata_device *pmp_dev = pmp_link->device;
- struct ata_eh_context *pmp_ehc = &pmp_link->eh_context;
-+ u32 *gscr = pmp_dev->gscr;
- struct ata_link *link;
- struct ata_device *dev;
- unsigned int err_mask;
-@@ -901,6 +885,22 @@ static int sata_pmp_eh_recover(struct ata_port *ap)
- if (rc)
- goto pmp_fail;
-
-+ /* PHY event notification can disturb reset and other recovery
-+ * operations. Turn it off.
-+ */
-+ if (gscr[SATA_PMP_GSCR_FEAT_EN] & SATA_PMP_FEAT_NOTIFY) {
-+ gscr[SATA_PMP_GSCR_FEAT_EN] &= ~SATA_PMP_FEAT_NOTIFY;
-+
-+ err_mask = sata_pmp_write(pmp_link, SATA_PMP_GSCR_FEAT_EN,
-+ gscr[SATA_PMP_GSCR_FEAT_EN]);
-+ if (err_mask) {
-+ ata_link_printk(pmp_link, KERN_WARNING,
-+ "failed to disable NOTIFY (err_mask=0x%x)\n",
-+ err_mask);
-+ goto pmp_fail;
-+ }
-+ }
-+
- /* handle disabled links */
- rc = sata_pmp_eh_handle_disabled_links(ap);
- if (rc)
-@@ -923,10 +923,10 @@ static int sata_pmp_eh_recover(struct ata_port *ap)
-
- /* enable notification */
- if (pmp_dev->flags & ATA_DFLAG_AN) {
-- pmp_dev->gscr[SATA_PMP_GSCR_FEAT_EN] |= SATA_PMP_FEAT_NOTIFY;
-+ gscr[SATA_PMP_GSCR_FEAT_EN] |= SATA_PMP_FEAT_NOTIFY;
-
-- err_mask = sata_pmp_write(pmp_dev->link, SATA_PMP_GSCR_FEAT_EN,
-- pmp_dev->gscr[SATA_PMP_GSCR_FEAT_EN]);
-+ err_mask = sata_pmp_write(pmp_link, SATA_PMP_GSCR_FEAT_EN,
-+ gscr[SATA_PMP_GSCR_FEAT_EN]);
- if (err_mask) {
- ata_dev_printk(pmp_dev, KERN_ERR, "failed to write "
- "PMP_FEAT_EN (Emask=0x%x)\n", err_mask);
-diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c
-index 3ce4392..aeb6e01 100644
---- a/drivers/ata/libata-scsi.c
-+++ b/drivers/ata/libata-scsi.c
-@@ -1082,12 +1082,6 @@ static unsigned int ata_scsi_start_stop_xlat(struct ata_queued_cmd *qc)
- if (((cdb[4] >> 4) & 0xf) != 0)
- goto invalid_fld; /* power conditions not supported */
-
-- if (qc->dev->horkage & ATA_HORKAGE_SKIP_PM) {
-- /* the device lacks PM support, finish without doing anything */
-- scmd->result = SAM_STAT_GOOD;
-- return 1;
-- }
--
- if (cdb[4] & 0x1) {
- tf->nsect = 1; /* 1 sector, lba=0 */
-
-diff --git a/drivers/ata/pata_ali.c b/drivers/ata/pata_ali.c
-index fcabe46..0f3e659 100644
---- a/drivers/ata/pata_ali.c
-+++ b/drivers/ata/pata_ali.c
-@@ -177,11 +177,11 @@ static void ali_program_modes(struct ata_port *ap, struct ata_device *adev, stru
- u8 udma;
-
- if (t != NULL) {
-- t->setup = FIT(t->setup, 1, 8) & 7;
-- t->act8b = FIT(t->act8b, 1, 8) & 7;
-- t->rec8b = FIT(t->rec8b, 1, 16) & 15;
-- t->active = FIT(t->active, 1, 8) & 7;
-- t->recover = FIT(t->recover, 1, 16) & 15;
-+ t->setup = clamp_val(t->setup, 1, 8) & 7;
-+ t->act8b = clamp_val(t->act8b, 1, 8) & 7;
-+ t->rec8b = clamp_val(t->rec8b, 1, 16) & 15;
-+ t->active = clamp_val(t->active, 1, 8) & 7;
-+ t->recover = clamp_val(t->recover, 1, 16) & 15;
-
- pci_write_config_byte(pdev, cas, t->setup);
- pci_write_config_byte(pdev, cbt, (t->act8b << 4) | t->rec8b);
-diff --git a/drivers/ata/pata_amd.c b/drivers/ata/pata_amd.c
-index 26665c3..57dd00f 100644
---- a/drivers/ata/pata_amd.c
-+++ b/drivers/ata/pata_amd.c
-@@ -84,32 +84,32 @@ static void timing_setup(struct ata_port *ap, struct ata_device *adev, int offse
-
- /* Configure the address set up timing */
- pci_read_config_byte(pdev, offset + 0x0C, &t);
-- t = (t & ~(3 << ((3 - dn) << 1))) | ((FIT(at.setup, 1, 4) - 1) << ((3 - dn) << 1));
-+ t = (t & ~(3 << ((3 - dn) << 1))) | ((clamp_val(at.setup, 1, 4) - 1) << ((3 - dn) << 1));
- pci_write_config_byte(pdev, offset + 0x0C , t);
-
- /* Configure the 8bit I/O timing */
- pci_write_config_byte(pdev, offset + 0x0E + (1 - (dn >> 1)),
-- ((FIT(at.act8b, 1, 16) - 1) << 4) | (FIT(at.rec8b, 1, 16) - 1));
-+ ((clamp_val(at.act8b, 1, 16) - 1) << 4) | (clamp_val(at.rec8b, 1, 16) - 1));
-
- /* Drive timing */
- pci_write_config_byte(pdev, offset + 0x08 + (3 - dn),
-- ((FIT(at.active, 1, 16) - 1) << 4) | (FIT(at.recover, 1, 16) - 1));
-+ ((clamp_val(at.active, 1, 16) - 1) << 4) | (clamp_val(at.recover, 1, 16) - 1));
-
- switch (clock) {
- case 1:
-- t = at.udma ? (0xc0 | (FIT(at.udma, 2, 5) - 2)) : 0x03;
-+ t = at.udma ? (0xc0 | (clamp_val(at.udma, 2, 5) - 2)) : 0x03;
- break;
-
- case 2:
-- t = at.udma ? (0xc0 | amd_cyc2udma[FIT(at.udma, 2, 10)]) : 0x03;
-+ t = at.udma ? (0xc0 | amd_cyc2udma[clamp_val(at.udma, 2, 10)]) : 0x03;
- break;
-
- case 3:
-- t = at.udma ? (0xc0 | amd_cyc2udma[FIT(at.udma, 1, 10)]) : 0x03;
-+ t = at.udma ? (0xc0 | amd_cyc2udma[clamp_val(at.udma, 1, 10)]) : 0x03;
- break;
-
- case 4:
-- t = at.udma ? (0xc0 | amd_cyc2udma[FIT(at.udma, 1, 15)]) : 0x03;
-+ t = at.udma ? (0xc0 | amd_cyc2udma[clamp_val(at.udma, 1, 15)]) : 0x03;
- break;
-
- default:
-diff --git a/drivers/ata/pata_at32.c b/drivers/ata/pata_at32.c
-index 5e10438..82fb6e2 100644
---- a/drivers/ata/pata_at32.c
-+++ b/drivers/ata/pata_at32.c
-@@ -291,8 +291,6 @@ static int __init pata_at32_probe(struct platform_device *pdev)
- if (!info)
- return -ENOMEM;
-
-- memset(info, 0, sizeof(struct at32_ide_info));
--
- info->irq = irq;
- info->cs = board->cs;
-
-diff --git a/drivers/ata/pata_bf54x.c b/drivers/ata/pata_bf54x.c
-index 9ab8973..5551610 100644
---- a/drivers/ata/pata_bf54x.c
-+++ b/drivers/ata/pata_bf54x.c
-@@ -911,7 +911,10 @@ static void bfin_bmdma_start(struct ata_queued_cmd *qc)
- /* Reset all transfer count */
- ATAPI_SET_CONTROL(base, ATAPI_GET_CONTROL(base) | TFRCNT_RST);
-
-- /* Set transfer length to buffer len */
-+ /* Set ATAPI state machine contorl in terminate sequence */
-+ ATAPI_SET_CONTROL(base, ATAPI_GET_CONTROL(base) | END_ON_TERM);
-+
-+ /* Set transfer length to buffer len */
- for_each_sg(qc->sg, sg, qc->n_elem, si) {
- ATAPI_SET_XFER_LEN(base, (sg_dma_len(sg) >> 1));
- }
-diff --git a/drivers/ata/pata_cypress.c b/drivers/ata/pata_cypress.c
-index a9c3218..2ff6260 100644
---- a/drivers/ata/pata_cypress.c
-+++ b/drivers/ata/pata_cypress.c
-@@ -62,14 +62,14 @@ static void cy82c693_set_piomode(struct ata_port *ap, struct ata_device *adev)
- return;
- }
-
-- time_16 = FIT(t.recover, 0, 15) | (FIT(t.active, 0, 15) << 4);
-- time_8 = FIT(t.act8b, 0, 15) | (FIT(t.rec8b, 0, 15) << 4);
-+ time_16 = clamp_val(t.recover, 0, 15) | (clamp_val(t.active, 0, 15) << 4);
-+ time_8 = clamp_val(t.act8b, 0, 15) | (clamp_val(t.rec8b, 0, 15) << 4);
-
- if (adev->devno == 0) {
- pci_read_config_dword(pdev, CY82_IDE_ADDRSETUP, &addr);
-
- addr &= ~0x0F; /* Mask bits */
-- addr |= FIT(t.setup, 0, 15);
-+ addr |= clamp_val(t.setup, 0, 15);
-
- pci_write_config_dword(pdev, CY82_IDE_ADDRSETUP, addr);
- pci_write_config_byte(pdev, CY82_IDE_MASTER_IOR, time_16);
-@@ -79,7 +79,7 @@ static void cy82c693_set_piomode(struct ata_port *ap, struct ata_device *adev)
- pci_read_config_dword(pdev, CY82_IDE_ADDRSETUP, &addr);
-
- addr &= ~0xF0; /* Mask bits */
-- addr |= (FIT(t.setup, 0, 15) << 4);
-+ addr |= (clamp_val(t.setup, 0, 15) << 4);
-
- pci_write_config_dword(pdev, CY82_IDE_ADDRSETUP, addr);
- pci_write_config_byte(pdev, CY82_IDE_SLAVE_IOR, time_16);
-diff --git a/drivers/ata/pata_legacy.c b/drivers/ata/pata_legacy.c
-index 7af4b29..fe7cc8e 100644
---- a/drivers/ata/pata_legacy.c
-+++ b/drivers/ata/pata_legacy.c
-@@ -343,8 +343,8 @@ static void ht6560a_set_piomode(struct ata_port *ap, struct ata_device *adev)
- /* Get the timing data in cycles. For now play safe at 50Mhz */
- ata_timing_compute(adev, adev->pio_mode, &t, 20000, 1000);
-
-- active = FIT(t.active, 2, 15);
-- recover = FIT(t.recover, 4, 15);
-+ active = clamp_val(t.active, 2, 15);
-+ recover = clamp_val(t.recover, 4, 15);
-
- inb(0x3E6);
- inb(0x3E6);
-@@ -377,8 +377,8 @@ static void ht6560b_set_piomode(struct ata_port *ap, struct ata_device *adev)
- /* Get the timing data in cycles. For now play safe at 50Mhz */
- ata_timing_compute(adev, adev->pio_mode, &t, 20000, 1000);
-
-- active = FIT(t.active, 2, 15);
-- recover = FIT(t.recover, 2, 16);
-+ active = clamp_val(t.active, 2, 15);
-+ recover = clamp_val(t.recover, 2, 16);
- recover &= 0x15;
-
- inb(0x3E6);
-@@ -462,9 +462,9 @@ static void opti82c611a_set_piomode(struct ata_port *ap,
- ata_timing_merge(&t, &tp, &t, ATA_TIMING_SETUP);
- }
-
-- active = FIT(t.active, 2, 17) - 2;
-- recover = FIT(t.recover, 1, 16) - 1;
-- setup = FIT(t.setup, 1, 4) - 1;
-+ active = clamp_val(t.active, 2, 17) - 2;
-+ recover = clamp_val(t.recover, 1, 16) - 1;
-+ setup = clamp_val(t.setup, 1, 4) - 1;
-
- /* Select the right timing bank for write timing */
- rc = ioread8(ap->ioaddr.lbal_addr);
-@@ -541,9 +541,9 @@ static void opti82c46x_set_piomode(struct ata_port *ap, struct ata_device *adev)
- ata_timing_merge(&t, &tp, &t, ATA_TIMING_SETUP);
- }
-
-- active = FIT(t.active, 2, 17) - 2;
-- recover = FIT(t.recover, 1, 16) - 1;
-- setup = FIT(t.setup, 1, 4) - 1;
-+ active = clamp_val(t.active, 2, 17) - 2;
-+ recover = clamp_val(t.recover, 1, 16) - 1;
-+ setup = clamp_val(t.setup, 1, 4) - 1;
-
- /* Select the right timing bank for write timing */
- rc = ioread8(ap->ioaddr.lbal_addr);
-@@ -624,11 +624,11 @@ static void qdi6500_set_piomode(struct ata_port *ap, struct ata_device *adev)
- ata_timing_compute(adev, adev->pio_mode, &t, 30303, 1000);
-
- if (ld_qdi->fast) {
-- active = 8 - FIT(t.active, 1, 8);
-- recovery = 18 - FIT(t.recover, 3, 18);
-+ active = 8 - clamp_val(t.active, 1, 8);
-+ recovery = 18 - clamp_val(t.recover, 3, 18);
- } else {
-- active = 9 - FIT(t.active, 2, 9);
-- recovery = 15 - FIT(t.recover, 0, 15);
-+ active = 9 - clamp_val(t.active, 2, 9);
-+ recovery = 15 - clamp_val(t.recover, 0, 15);
- }
- timing = (recovery << 4) | active | 0x08;
-
-@@ -658,11 +658,11 @@ static void qdi6580dp_set_piomode(struct ata_port *ap, struct ata_device *adev)
- ata_timing_compute(adev, adev->pio_mode, &t, 30303, 1000);
-
- if (ld_qdi->fast) {
-- active = 8 - FIT(t.active, 1, 8);
-- recovery = 18 - FIT(t.recover, 3, 18);
-+ active = 8 - clamp_val(t.active, 1, 8);
-+ recovery = 18 - clamp_val(t.recover, 3, 18);
- } else {
-- active = 9 - FIT(t.active, 2, 9);
-- recovery = 15 - FIT(t.recover, 0, 15);
-+ active = 9 - clamp_val(t.active, 2, 9);
-+ recovery = 15 - clamp_val(t.recover, 0, 15);
- }
- timing = (recovery << 4) | active | 0x08;
-
-@@ -695,11 +695,11 @@ static void qdi6580_set_piomode(struct ata_port *ap, struct ata_device *adev)
- ata_timing_compute(adev, adev->pio_mode, &t, 30303, 1000);
-
- if (ld_qdi->fast) {
-- active = 8 - FIT(t.active, 1, 8);
-- recovery = 18 - FIT(t.recover, 3, 18);
-+ active = 8 - clamp_val(t.active, 1, 8);
-+ recovery = 18 - clamp_val(t.recover, 3, 18);
- } else {
-- active = 9 - FIT(t.active, 2, 9);
-- recovery = 15 - FIT(t.recover, 0, 15);
-+ active = 9 - clamp_val(t.active, 2, 9);
-+ recovery = 15 - clamp_val(t.recover, 0, 15);
- }
- timing = (recovery << 4) | active | 0x08;
- ld_qdi->clock[adev->devno] = timing;
-@@ -830,8 +830,8 @@ static void winbond_set_piomode(struct ata_port *ap, struct ata_device *adev)
- else
- ata_timing_compute(adev, adev->pio_mode, &t, 30303, 1000);
-
-- active = (FIT(t.active, 3, 17) - 1) & 0x0F;
-- recovery = (FIT(t.recover, 1, 15) + 1) & 0x0F;
-+ active = (clamp_val(t.active, 3, 17) - 1) & 0x0F;
-+ recovery = (clamp_val(t.recover, 1, 15) + 1) & 0x0F;
- timing = (active << 4) | recovery;
- winbond_writecfg(ld_winbond->timing, timing, reg);
-
-@@ -842,7 +842,7 @@ static void winbond_set_piomode(struct ata_port *ap, struct ata_device *adev)
- reg |= 0x08; /* FIFO off */
- if (!ata_pio_need_iordy(adev))
- reg |= 0x02; /* IORDY off */
-- reg |= (FIT(t.setup, 0, 3) << 6);
-+ reg |= (clamp_val(t.setup, 0, 3) << 6);
- winbond_writecfg(ld_winbond->timing, timing + 1, reg);
- }
-
-diff --git a/drivers/ata/pata_ns87410.c b/drivers/ata/pata_ns87410.c
-index 76d2455..be756b7 100644
---- a/drivers/ata/pata_ns87410.c
-+++ b/drivers/ata/pata_ns87410.c
-@@ -91,9 +91,9 @@ static void ns87410_set_piomode(struct ata_port *ap, struct ata_device *adev)
- return;
- }
-
-- at.active = FIT(at.active, 2, 16) - 2;
-- at.setup = FIT(at.setup, 1, 4) - 1;
-- at.recover = FIT(at.recover, 1, 12) - 1;
-+ at.active = clamp_val(at.active, 2, 16) - 2;
-+ at.setup = clamp_val(at.setup, 1, 4) - 1;
-+ at.recover = clamp_val(at.recover, 1, 12) - 1;
-
- idetcr = (at.setup << 6) | (recoverbits[at.recover] << 3) | activebits[at.active];
-
-diff --git a/drivers/ata/pata_ns87415.c b/drivers/ata/pata_ns87415.c
-index ae92b00..e0aa7ea 100644
---- a/drivers/ata/pata_ns87415.c
-+++ b/drivers/ata/pata_ns87415.c
-@@ -66,8 +66,8 @@ static void ns87415_set_mode(struct ata_port *ap, struct ata_device *adev, u8 mo
-
- ata_timing_compute(adev, adev->pio_mode, &t, T, 0);
-
-- clocking = 17 - FIT(t.active, 2, 17);
-- clocking |= (16 - FIT(t.recover, 1, 16)) << 4;
-+ clocking = 17 - clamp_val(t.active, 2, 17);
-+ clocking |= (16 - clamp_val(t.recover, 1, 16)) << 4;
- /* Use the same timing for read and write bytes */
- clocking |= (clocking << 8);
- pci_write_config_word(dev, timing, clocking);
-diff --git a/drivers/ata/pata_qdi.c b/drivers/ata/pata_qdi.c
-index bf45cf0..97e5b09 100644
---- a/drivers/ata/pata_qdi.c
-+++ b/drivers/ata/pata_qdi.c
-@@ -60,11 +60,11 @@ static void qdi6500_set_piomode(struct ata_port *ap, struct ata_device *adev)
- ata_timing_compute(adev, adev->pio_mode, &t, 30303, 1000);
-
- if (qdi->fast) {
-- active = 8 - FIT(t.active, 1, 8);
-- recovery = 18 - FIT(t.recover, 3, 18);
-+ active = 8 - clamp_val(t.active, 1, 8);
-+ recovery = 18 - clamp_val(t.recover, 3, 18);
- } else {
-- active = 9 - FIT(t.active, 2, 9);
-- recovery = 15 - FIT(t.recover, 0, 15);
-+ active = 9 - clamp_val(t.active, 2, 9);
-+ recovery = 15 - clamp_val(t.recover, 0, 15);
- }
- timing = (recovery << 4) | active | 0x08;
-
-@@ -84,11 +84,11 @@ static void qdi6580_set_piomode(struct ata_port *ap, struct ata_device *adev)
- ata_timing_compute(adev, adev->pio_mode, &t, 30303, 1000);
-
- if (qdi->fast) {
-- active = 8 - FIT(t.active, 1, 8);
-- recovery = 18 - FIT(t.recover, 3, 18);
-+ active = 8 - clamp_val(t.active, 1, 8);
-+ recovery = 18 - clamp_val(t.recover, 3, 18);
- } else {
-- active = 9 - FIT(t.active, 2, 9);
-- recovery = 15 - FIT(t.recover, 0, 15);
-+ active = 9 - clamp_val(t.active, 2, 9);
-+ recovery = 15 - clamp_val(t.recover, 0, 15);
- }
- timing = (recovery << 4) | active | 0x08;
-
-diff --git a/drivers/ata/pata_sl82c105.c b/drivers/ata/pata_sl82c105.c
-index 70d94fb..69877bd 100644
---- a/drivers/ata/pata_sl82c105.c
-+++ b/drivers/ata/pata_sl82c105.c
-@@ -216,7 +216,7 @@ static int sl82c105_qc_defer(struct ata_queued_cmd *qc)
- struct ata_port *alt = host->ports[1 ^ qc->ap->port_no];
- int rc;
-
-- /* First apply the usual rules */
-+ /* First apply the usual rules */
- rc = ata_std_qc_defer(qc);
- if (rc != 0)
- return rc;
-diff --git a/drivers/ata/pata_via.c b/drivers/ata/pata_via.c
-index 2fea6cb..708ed14 100644
---- a/drivers/ata/pata_via.c
-+++ b/drivers/ata/pata_via.c
-@@ -259,15 +259,15 @@ static void via_do_set_mode(struct ata_port *ap, struct ata_device *adev, int mo
-
- pci_read_config_byte(pdev, 0x4C, &setup);
- setup &= ~(3 << shift);
-- setup |= FIT(t.setup, 1, 4) << shift; /* 1,4 or 1,4 - 1 FIXME */
-+ setup |= clamp_val(t.setup, 1, 4) << shift; /* 1,4 or 1,4 - 1 FIXME */
- pci_write_config_byte(pdev, 0x4C, setup);
- }
-
- /* Load the PIO mode bits */
- pci_write_config_byte(pdev, 0x4F - ap->port_no,
-- ((FIT(t.act8b, 1, 16) - 1) << 4) | (FIT(t.rec8b, 1, 16) - 1));
-+ ((clamp_val(t.act8b, 1, 16) - 1) << 4) | (clamp_val(t.rec8b, 1, 16) - 1));
- pci_write_config_byte(pdev, 0x48 + offset,
-- ((FIT(t.active, 1, 16) - 1) << 4) | (FIT(t.recover, 1, 16) - 1));
-+ ((clamp_val(t.active, 1, 16) - 1) << 4) | (clamp_val(t.recover, 1, 16) - 1));
-
- /* Load the UDMA bits according to type */
- switch(udma_type) {
-@@ -275,16 +275,16 @@ static void via_do_set_mode(struct ata_port *ap, struct ata_device *adev, int mo
- /* BUG() ? */
- /* fall through */
- case 33:
-- ut = t.udma ? (0xe0 | (FIT(t.udma, 2, 5) - 2)) : 0x03;
-+ ut = t.udma ? (0xe0 | (clamp_val(t.udma, 2, 5) - 2)) : 0x03;
- break;
- case 66:
-- ut = t.udma ? (0xe8 | (FIT(t.udma, 2, 9) - 2)) : 0x0f;
-+ ut = t.udma ? (0xe8 | (clamp_val(t.udma, 2, 9) - 2)) : 0x0f;
- break;
- case 100:
-- ut = t.udma ? (0xe0 | (FIT(t.udma, 2, 9) - 2)) : 0x07;
-+ ut = t.udma ? (0xe0 | (clamp_val(t.udma, 2, 9) - 2)) : 0x07;
- break;
- case 133:
-- ut = t.udma ? (0xe0 | (FIT(t.udma, 2, 9) - 2)) : 0x07;
-+ ut = t.udma ? (0xe0 | (clamp_val(t.udma, 2, 9) - 2)) : 0x07;
- break;
- }
-
-diff --git a/drivers/ata/pata_winbond.c b/drivers/ata/pata_winbond.c
-index 6e52a35..474528f 100644
---- a/drivers/ata/pata_winbond.c
-+++ b/drivers/ata/pata_winbond.c
-@@ -75,8 +75,8 @@ static void winbond_set_piomode(struct ata_port *ap, struct ata_device *adev)
- else
- ata_timing_compute(adev, adev->pio_mode, &t, 30303, 1000);
-
-- active = (FIT(t.active, 3, 17) - 1) & 0x0F;
-- recovery = (FIT(t.recover, 1, 15) + 1) & 0x0F;
-+ active = (clamp_val(t.active, 3, 17) - 1) & 0x0F;
-+ recovery = (clamp_val(t.recover, 1, 15) + 1) & 0x0F;
- timing = (active << 4) | recovery;
- winbond_writecfg(winbond->config, timing, reg);
-
-@@ -87,7 +87,7 @@ static void winbond_set_piomode(struct ata_port *ap, struct ata_device *adev)
- reg |= 0x08; /* FIFO off */
- if (!ata_pio_need_iordy(adev))
- reg |= 0x02; /* IORDY off */
-- reg |= (FIT(t.setup, 0, 3) << 6);
-+ reg |= (clamp_val(t.setup, 0, 3) << 6);
- winbond_writecfg(winbond->config, timing + 1, reg);
- }
-
-diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c
-index bb73b22..fb81f0c 100644
---- a/drivers/ata/sata_mv.c
-+++ b/drivers/ata/sata_mv.c
-@@ -72,7 +72,7 @@
- #include
-
- #define DRV_NAME "sata_mv"
--#define DRV_VERSION "1.20"
-+#define DRV_VERSION "1.21"
-
- enum {
- /* BAR's are enumerated in terms of pci_resource_start() terms */
-@@ -128,8 +128,13 @@ enum {
- MV_COMMON_FLAGS = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
- ATA_FLAG_MMIO | ATA_FLAG_NO_ATAPI |
- ATA_FLAG_PIO_POLLING,
-+
- MV_6XXX_FLAGS = MV_FLAG_IRQ_COALESCE,
-
-+ MV_GENIIE_FLAGS = MV_COMMON_FLAGS | MV_6XXX_FLAGS |
-+ ATA_FLAG_PMP | ATA_FLAG_ACPI_SATA |
-+ ATA_FLAG_NCQ | ATA_FLAG_AN,
-+
- CRQB_FLAG_READ = (1 << 0),
- CRQB_TAG_SHIFT = 1,
- CRQB_IOID_SHIFT = 6, /* CRQB Gen-II/IIE IO Id shift */
-@@ -197,13 +202,6 @@ enum {
- HC_MAIN_RSVD = (0x7f << 25), /* bits 31-25 */
- HC_MAIN_RSVD_5 = (0x1fff << 19), /* bits 31-19 */
- HC_MAIN_RSVD_SOC = (0x3fffffb << 6), /* bits 31-9, 7-6 */
-- HC_MAIN_MASKED_IRQS = (TRAN_LO_DONE | TRAN_HI_DONE |
-- PORTS_0_3_COAL_DONE | PORTS_4_7_COAL_DONE |
-- PORTS_0_7_COAL_DONE | GPIO_INT | TWSI_INT |
-- HC_MAIN_RSVD),
-- HC_MAIN_MASKED_IRQS_5 = (PORTS_0_3_COAL_DONE | PORTS_4_7_COAL_DONE |
-- HC_MAIN_RSVD_5),
-- HC_MAIN_MASKED_IRQS_SOC = (PORTS_0_3_COAL_DONE | HC_MAIN_RSVD_SOC),
-
- /* SATAHC registers */
- HC_CFG_OFS = 0,
-@@ -221,6 +219,7 @@ enum {
- SATA_STATUS_OFS = 0x300, /* ctrl, err regs follow status */
- SATA_ACTIVE_OFS = 0x350,
- SATA_FIS_IRQ_CAUSE_OFS = 0x364,
-+ SATA_FIS_IRQ_AN = (1 << 9), /* async notification */
-
- LTMODE_OFS = 0x30c,
- LTMODE_BIT8 = (1 << 8), /* unknown, but necessary */
-@@ -459,6 +458,7 @@ struct mv_port_signal {
-
- struct mv_host_priv {
- u32 hp_flags;
-+ u32 main_irq_mask;
- struct mv_port_signal signal[8];
- const struct mv_hw_ops *ops;
- int n_ports;
-@@ -640,25 +640,19 @@ static const struct ata_port_info mv_port_info[] = {
- .port_ops = &mv6_ops,
- },
- { /* chip_6042 */
-- .flags = MV_COMMON_FLAGS | MV_6XXX_FLAGS |
-- ATA_FLAG_PMP | ATA_FLAG_ACPI_SATA |
-- ATA_FLAG_NCQ,
-+ .flags = MV_GENIIE_FLAGS,
- .pio_mask = 0x1f, /* pio0-4 */
- .udma_mask = ATA_UDMA6,
- .port_ops = &mv_iie_ops,
- },
- { /* chip_7042 */
-- .flags = MV_COMMON_FLAGS | MV_6XXX_FLAGS |
-- ATA_FLAG_PMP | ATA_FLAG_ACPI_SATA |
-- ATA_FLAG_NCQ,
-+ .flags = MV_GENIIE_FLAGS,
- .pio_mask = 0x1f, /* pio0-4 */
- .udma_mask = ATA_UDMA6,
- .port_ops = &mv_iie_ops,
- },
- { /* chip_soc */
-- .flags = MV_COMMON_FLAGS | MV_6XXX_FLAGS |
-- ATA_FLAG_PMP | ATA_FLAG_ACPI_SATA |
-- ATA_FLAG_NCQ | MV_FLAG_SOC,
-+ .flags = MV_GENIIE_FLAGS | MV_FLAG_SOC,
- .pio_mask = 0x1f, /* pio0-4 */
- .udma_mask = ATA_UDMA6,
- .port_ops = &mv_iie_ops,
-@@ -844,6 +838,33 @@ static void mv_set_edma_ptrs(void __iomem *port_mmio,
- port_mmio + EDMA_RSP_Q_OUT_PTR_OFS);
- }
-
-+static void mv_set_main_irq_mask(struct ata_host *host,
-+ u32 disable_bits, u32 enable_bits)
-+{
-+ struct mv_host_priv *hpriv = host->private_data;
-+ u32 old_mask, new_mask;
-+
-+ old_mask = hpriv->main_irq_mask;
-+ new_mask = (old_mask & ~disable_bits) | enable_bits;
-+ if (new_mask != old_mask) {
-+ hpriv->main_irq_mask = new_mask;
-+ writelfl(new_mask, hpriv->main_irq_mask_addr);
-+ }
-+}
-+
-+static void mv_enable_port_irqs(struct ata_port *ap,
-+ unsigned int port_bits)
-+{
-+ unsigned int shift, hardport, port = ap->port_no;
-+ u32 disable_bits, enable_bits;
-+
-+ MV_PORT_TO_SHIFT_AND_HARDPORT(port, shift, hardport);
-+
-+ disable_bits = (DONE_IRQ | ERR_IRQ) << shift;
-+ enable_bits = port_bits << shift;
-+ mv_set_main_irq_mask(ap->host, disable_bits, enable_bits);
-+}
-+
- /**
- * mv_start_dma - Enable eDMA engine
- * @base: port base address
-@@ -886,9 +907,11 @@ static void mv_start_dma(struct ata_port *ap, void __iomem *port_mmio,
- mv_edma_cfg(ap, want_ncq);
-
- /* clear FIS IRQ Cause */
-- writelfl(0, port_mmio + SATA_FIS_IRQ_CAUSE_OFS);
-+ if (IS_GEN_IIE(hpriv))
-+ writelfl(0, port_mmio + SATA_FIS_IRQ_CAUSE_OFS);
-
- mv_set_edma_ptrs(port_mmio, hpriv, pp);
-+ mv_enable_port_irqs(ap, DONE_IRQ|ERR_IRQ);
-
- writelfl(EDMA_EN, port_mmio + EDMA_CMD_OFS);
- pp->pp_flags |= MV_PP_FLAG_EDMA_EN;
-@@ -1341,6 +1364,7 @@ out_port_free_dma_mem:
- static void mv_port_stop(struct ata_port *ap)
- {
- mv_stop_edma(ap);
-+ mv_enable_port_irqs(ap, 0);
- mv_port_free_dma_mem(ap);
- }
-
-@@ -1582,6 +1606,7 @@ static unsigned int mv_qc_issue(struct ata_queued_cmd *qc)
- * shadow block, etc registers.
- */
- mv_stop_edma(ap);
-+ mv_enable_port_irqs(ap, ERR_IRQ);
- mv_pmp_select(ap, qc->dev->link->pmp);
- return ata_sff_qc_issue(qc);
- }
-@@ -1670,6 +1695,18 @@ static void mv_pmp_eh_prep(struct ata_port *ap, unsigned int pmp_map)
- }
- }
-
-+static int mv_req_q_empty(struct ata_port *ap)
-+{
-+ void __iomem *port_mmio = mv_ap_base(ap);
-+ u32 in_ptr, out_ptr;
-+
-+ in_ptr = (readl(port_mmio + EDMA_REQ_Q_IN_PTR_OFS)
-+ >> EDMA_REQ_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK;
-+ out_ptr = (readl(port_mmio + EDMA_REQ_Q_OUT_PTR_OFS)
-+ >> EDMA_REQ_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK;
-+ return (in_ptr == out_ptr); /* 1 == queue_is_empty */
-+}
-+
- static int mv_handle_fbs_ncq_dev_err(struct ata_port *ap)
- {
- struct mv_port_priv *pp = ap->private_data;
-@@ -1703,7 +1740,7 @@ static int mv_handle_fbs_ncq_dev_err(struct ata_port *ap)
- ap->qc_active, failed_links,
- ap->nr_active_links);
-
-- if (ap->nr_active_links <= failed_links) {
-+ if (ap->nr_active_links <= failed_links && mv_req_q_empty(ap)) {
- mv_process_crpb_entries(ap, pp);
- mv_stop_edma(ap);
- mv_eh_freeze(ap);
-@@ -1812,6 +1849,7 @@ static void mv_err_intr(struct ata_port *ap)
- {
- void __iomem *port_mmio = mv_ap_base(ap);
- u32 edma_err_cause, eh_freeze_mask, serr = 0;
-+ u32 fis_cause = 0;
- struct mv_port_priv *pp = ap->private_data;
- struct mv_host_priv *hpriv = ap->host->private_data;
- unsigned int action = 0, err_mask = 0;
-@@ -1821,16 +1859,19 @@ static void mv_err_intr(struct ata_port *ap)
-
- /*
- * Read and clear the SError and err_cause bits.
-+ * For GenIIe, if EDMA_ERR_TRANS_IRQ_7 is set, we also must read/clear
-+ * the FIS_IRQ_CAUSE register before clearing edma_err_cause.
- */
- sata_scr_read(&ap->link, SCR_ERROR, &serr);
- sata_scr_write_flush(&ap->link, SCR_ERROR, serr);
-
- edma_err_cause = readl(port_mmio + EDMA_ERR_IRQ_CAUSE_OFS);
-+ if (IS_GEN_IIE(hpriv) && (edma_err_cause & EDMA_ERR_TRANS_IRQ_7)) {
-+ fis_cause = readl(port_mmio + SATA_FIS_IRQ_CAUSE_OFS);
-+ writelfl(~fis_cause, port_mmio + SATA_FIS_IRQ_CAUSE_OFS);
-+ }
- writelfl(~edma_err_cause, port_mmio + EDMA_ERR_IRQ_CAUSE_OFS);
-
-- ata_port_printk(ap, KERN_INFO, "%s: err_cause=%08x pp_flags=0x%x\n",
-- __func__, edma_err_cause, pp->pp_flags);
--
- if (edma_err_cause & EDMA_ERR_DEV) {
- /*
- * Device errors during FIS-based switching operation
-@@ -1844,6 +1885,18 @@ static void mv_err_intr(struct ata_port *ap)
- ata_ehi_clear_desc(ehi);
- ata_ehi_push_desc(ehi, "edma_err_cause=%08x pp_flags=%08x",
- edma_err_cause, pp->pp_flags);
-+
-+ if (IS_GEN_IIE(hpriv) && (edma_err_cause & EDMA_ERR_TRANS_IRQ_7)) {
-+ ata_ehi_push_desc(ehi, "fis_cause=%08x", fis_cause);
-+ if (fis_cause & SATA_FIS_IRQ_AN) {
-+ u32 ec = edma_err_cause &
-+ ~(EDMA_ERR_TRANS_IRQ_7 | EDMA_ERR_IRQ_TRANSIENT);
-+ sata_async_notification(ap);
-+ if (!ec)
-+ return; /* Just an AN; no need for the nukes */
-+ ata_ehi_push_desc(ehi, "SDB notify");
-+ }
-+ }
- /*
- * All generations share these EDMA error cause bits:
- */
-@@ -2162,20 +2215,20 @@ static irqreturn_t mv_interrupt(int irq, void *dev_instance)
- struct ata_host *host = dev_instance;
- struct mv_host_priv *hpriv = host->private_data;
- unsigned int handled = 0;
-- u32 main_irq_cause, main_irq_mask;
-+ u32 main_irq_cause, pending_irqs;
-
- spin_lock(&host->lock);
- main_irq_cause = readl(hpriv->main_irq_cause_addr);
-- main_irq_mask = readl(hpriv->main_irq_mask_addr);
-+ pending_irqs = main_irq_cause & hpriv->main_irq_mask;
- /*
- * Deal with cases where we either have nothing pending, or have read
- * a bogus register value which can indicate HW removal or PCI fault.
- */
-- if ((main_irq_cause & main_irq_mask) && (main_irq_cause != 0xffffffffU)) {
-- if (unlikely((main_irq_cause & PCI_ERR) && HAS_PCI(host)))
-+ if (pending_irqs && main_irq_cause != 0xffffffffU) {
-+ if (unlikely((pending_irqs & PCI_ERR) && HAS_PCI(host)))
- handled = mv_pci_error(host, hpriv->base);
- else
-- handled = mv_host_intr(host, main_irq_cause);
-+ handled = mv_host_intr(host, pending_irqs);
- }
- spin_unlock(&host->lock);
- return IRQ_RETVAL(handled);
-@@ -2373,7 +2426,6 @@ static void mv_reset_pci_bus(struct ata_host *host, void __iomem *mmio)
- ZERO(MV_PCI_DISC_TIMER);
- ZERO(MV_PCI_MSI_TRIGGER);
- writel(0x000100ff, mmio + MV_PCI_XBAR_TMOUT_OFS);
-- ZERO(PCI_HC_MAIN_IRQ_MASK_OFS);
- ZERO(MV_PCI_SERR_MASK);
- ZERO(hpriv->irq_cause_ofs);
- ZERO(hpriv->irq_mask_ofs);
-@@ -2728,6 +2780,7 @@ static int mv_hardreset(struct ata_link *link, unsigned int *class,
-
- rc = sata_link_hardreset(link, timing, deadline + extra,
- &online, NULL);
-+ rc = online ? -EAGAIN : rc;
- if (rc)
- return rc;
- sata_scr_read(link, SCR_STATUS, &sstatus);
-@@ -2744,32 +2797,18 @@ static int mv_hardreset(struct ata_link *link, unsigned int *class,
-
- static void mv_eh_freeze(struct ata_port *ap)
- {
-- struct mv_host_priv *hpriv = ap->host->private_data;
-- unsigned int shift, hardport, port = ap->port_no;
-- u32 main_irq_mask;
--
-- /* FIXME: handle coalescing completion events properly */
--
- mv_stop_edma(ap);
-- MV_PORT_TO_SHIFT_AND_HARDPORT(port, shift, hardport);
--
-- /* disable assertion of portN err, done events */
-- main_irq_mask = readl(hpriv->main_irq_mask_addr);
-- main_irq_mask &= ~((DONE_IRQ | ERR_IRQ) << shift);
-- writelfl(main_irq_mask, hpriv->main_irq_mask_addr);
-+ mv_enable_port_irqs(ap, 0);
- }
-
- static void mv_eh_thaw(struct ata_port *ap)
- {
- struct mv_host_priv *hpriv = ap->host->private_data;
-- unsigned int shift, hardport, port = ap->port_no;
-+ unsigned int port = ap->port_no;
-+ unsigned int hardport = mv_hardport_from_port(port);
- void __iomem *hc_mmio = mv_hc_base_from_port(hpriv->base, port);
- void __iomem *port_mmio = mv_ap_base(ap);
-- u32 main_irq_mask, hc_irq_cause;
--
-- /* FIXME: handle coalescing completion events properly */
--
-- MV_PORT_TO_SHIFT_AND_HARDPORT(port, shift, hardport);
-+ u32 hc_irq_cause;
-
- /* clear EDMA errors on this port */
- writel(0, port_mmio + EDMA_ERR_IRQ_CAUSE_OFS);
-@@ -2779,10 +2818,7 @@ static void mv_eh_thaw(struct ata_port *ap)
- hc_irq_cause &= ~((DEV_IRQ | DMA_IRQ) << hardport);
- writelfl(hc_irq_cause, hc_mmio + HC_IRQ_CAUSE_OFS);
-
-- /* enable assertion of portN err, done events */
-- main_irq_mask = readl(hpriv->main_irq_mask_addr);
-- main_irq_mask |= ((DONE_IRQ | ERR_IRQ) << shift);
-- writelfl(main_irq_mask, hpriv->main_irq_mask_addr);
-+ mv_enable_port_irqs(ap, ERR_IRQ);
- }
-
- /**
-@@ -3035,7 +3071,7 @@ static int mv_init_host(struct ata_host *host, unsigned int board_idx)
- }
-
- /* global interrupt mask: 0 == mask everything */
-- writel(0, hpriv->main_irq_mask_addr);
-+ mv_set_main_irq_mask(host, ~0, 0);
-
- n_hc = mv_get_hc_count(host->ports[0]->flags);
-
-@@ -3083,25 +3119,12 @@ static int mv_init_host(struct ata_host *host, unsigned int board_idx)
-
- /* and unmask interrupt generation for host regs */
- writelfl(hpriv->unmask_all_irqs, mmio + hpriv->irq_mask_ofs);
-- if (IS_GEN_I(hpriv))
-- writelfl(~HC_MAIN_MASKED_IRQS_5,
-- hpriv->main_irq_mask_addr);
-- else
-- writelfl(~HC_MAIN_MASKED_IRQS,
-- hpriv->main_irq_mask_addr);
--
-- VPRINTK("HC MAIN IRQ cause/mask=0x%08x/0x%08x "
-- "PCI int cause/mask=0x%08x/0x%08x\n",
-- readl(hpriv->main_irq_cause_addr),
-- readl(hpriv->main_irq_mask_addr),
-- readl(mmio + hpriv->irq_cause_ofs),
-- readl(mmio + hpriv->irq_mask_ofs));
-- } else {
-- writelfl(~HC_MAIN_MASKED_IRQS_SOC,
-- hpriv->main_irq_mask_addr);
-- VPRINTK("HC MAIN IRQ cause/mask=0x%08x/0x%08x\n",
-- readl(hpriv->main_irq_cause_addr),
-- readl(hpriv->main_irq_mask_addr));
-+
-+ /*
-+ * enable only global host interrupts for now.
-+ * The per-port interrupts get done later as ports are set up.
-+ */
-+ mv_set_main_irq_mask(host, 0, PCI_ERR);
- }
- done:
- return rc;
-diff --git a/drivers/ata/sata_promise.c b/drivers/ata/sata_promise.c
-index 5a10dc5..030665b 100644
---- a/drivers/ata/sata_promise.c
-+++ b/drivers/ata/sata_promise.c
-@@ -53,7 +53,15 @@ enum {
- PDC_MMIO_BAR = 3,
- PDC_MAX_PRD = LIBATA_MAX_PRD - 1, /* -1 for ASIC PRD bug workaround */
-
-- /* register offsets */
-+ /* host register offsets (from host->iomap[PDC_MMIO_BAR]) */
-+ PDC_INT_SEQMASK = 0x40, /* Mask of asserted SEQ INTs */
-+ PDC_FLASH_CTL = 0x44, /* Flash control register */
-+ PDC_SATA_PLUG_CSR = 0x6C, /* SATA Plug control/status reg */
-+ PDC2_SATA_PLUG_CSR = 0x60, /* SATAII Plug control/status reg */
-+ PDC_TBG_MODE = 0x41C, /* TBG mode (not SATAII) */
-+ PDC_SLEW_CTL = 0x470, /* slew rate control reg (not SATAII) */
-+
-+ /* per-port ATA register offsets (from ap->ioaddr.cmd_addr) */
- PDC_FEATURE = 0x04, /* Feature/Error reg (per port) */
- PDC_SECTOR_COUNT = 0x08, /* Sector count reg (per port) */
- PDC_SECTOR_NUMBER = 0x0C, /* Sector number reg (per port) */
-@@ -63,14 +71,11 @@ enum {
- PDC_COMMAND = 0x1C, /* Command/status reg (per port) */
- PDC_ALTSTATUS = 0x38, /* Alternate-status/device-control reg (per port) */
- PDC_PKT_SUBMIT = 0x40, /* Command packet pointer addr */
-- PDC_INT_SEQMASK = 0x40, /* Mask of asserted SEQ INTs */
-- PDC_FLASH_CTL = 0x44, /* Flash control register */
- PDC_GLOBAL_CTL = 0x48, /* Global control/status (per port) */
- PDC_CTLSTAT = 0x60, /* IDE control and status (per port) */
-- PDC_SATA_PLUG_CSR = 0x6C, /* SATA Plug control/status reg */
-- PDC2_SATA_PLUG_CSR = 0x60, /* SATAII Plug control/status reg */
-- PDC_TBG_MODE = 0x41C, /* TBG mode (not SATAII) */
-- PDC_SLEW_CTL = 0x470, /* slew rate control reg (not SATAII) */
-+
-+ /* per-port SATA register offsets (from ap->ioaddr.scr_addr) */
-+ PDC_PHYMODE4 = 0x14,
-
- /* PDC_GLOBAL_CTL bit definitions */
- PDC_PH_ERR = (1 << 8), /* PCI error while loading packet */
-@@ -134,7 +139,7 @@ struct pdc_port_priv {
-
- static int pdc_sata_scr_read(struct ata_port *ap, unsigned int sc_reg, u32 *val);
- static int pdc_sata_scr_write(struct ata_port *ap, unsigned int sc_reg, u32 val);
--static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *ent);
-+static int pdc_ata_init_one(struct pci_dev *pdev, const struct pci_device_id *ent);
- static int pdc_common_port_start(struct ata_port *ap);
- static int pdc_sata_port_start(struct ata_port *ap);
- static void pdc_qc_prep(struct ata_queued_cmd *qc);
-@@ -332,12 +337,12 @@ static int pdc_sata_port_start(struct ata_port *ap)
-
- /* fix up PHYMODE4 align timing */
- if (ap->flags & PDC_FLAG_GEN_II) {
-- void __iomem *mmio = ap->ioaddr.scr_addr;
-+ void __iomem *sata_mmio = ap->ioaddr.scr_addr;
- unsigned int tmp;
-
-- tmp = readl(mmio + 0x014);
-+ tmp = readl(sata_mmio + PDC_PHYMODE4);
- tmp = (tmp & ~3) | 1; /* set bits 1:0 = 0:1 */
-- writel(tmp, mmio + 0x014);
-+ writel(tmp, sata_mmio + PDC_PHYMODE4);
- }
-
- return 0;
-@@ -345,32 +350,32 @@ static int pdc_sata_port_start(struct ata_port *ap)
-
- static void pdc_reset_port(struct ata_port *ap)
- {
-- void __iomem *mmio = ap->ioaddr.cmd_addr + PDC_CTLSTAT;
-+ void __iomem *ata_ctlstat_mmio = ap->ioaddr.cmd_addr + PDC_CTLSTAT;
- unsigned int i;
- u32 tmp;
-
- for (i = 11; i > 0; i--) {
-- tmp = readl(mmio);
-+ tmp = readl(ata_ctlstat_mmio);
- if (tmp & PDC_RESET)
- break;
-
- udelay(100);
-
- tmp |= PDC_RESET;
-- writel(tmp, mmio);
-+ writel(tmp, ata_ctlstat_mmio);
- }
-
- tmp &= ~PDC_RESET;
-- writel(tmp, mmio);
-- readl(mmio); /* flush */
-+ writel(tmp, ata_ctlstat_mmio);
-+ readl(ata_ctlstat_mmio); /* flush */
- }
-
- static int pdc_pata_cable_detect(struct ata_port *ap)
- {
- u8 tmp;
-- void __iomem *mmio = ap->ioaddr.cmd_addr + PDC_CTLSTAT + 0x03;
-+ void __iomem *ata_mmio = ap->ioaddr.cmd_addr;
-
-- tmp = readb(mmio);
-+ tmp = readb(ata_mmio + PDC_CTLSTAT + 3);
- if (tmp & 0x01)
- return ATA_CBL_PATA40;
- return ATA_CBL_PATA80;
-@@ -557,31 +562,25 @@ static void pdc_qc_prep(struct ata_queued_cmd *qc)
- switch (qc->tf.protocol) {
- case ATA_PROT_DMA:
- pdc_fill_sg(qc);
-- /* fall through */
--
-+ /*FALLTHROUGH*/
- case ATA_PROT_NODATA:
- i = pdc_pkt_header(&qc->tf, qc->ap->prd_dma,
- qc->dev->devno, pp->pkt);
--
- if (qc->tf.flags & ATA_TFLAG_LBA48)
- i = pdc_prep_lba48(&qc->tf, pp->pkt, i);
- else
- i = pdc_prep_lba28(&qc->tf, pp->pkt, i);
--
- pdc_pkt_footer(&qc->tf, pp->pkt, i);
- break;
--
- case ATAPI_PROT_PIO:
- pdc_fill_sg(qc);
- break;
--
- case ATAPI_PROT_DMA:
- pdc_fill_sg(qc);
- /*FALLTHROUGH*/
- case ATAPI_PROT_NODATA:
- pdc_atapi_pkt(qc);
- break;
--
- default:
- break;
- }
-@@ -611,7 +610,7 @@ static unsigned int pdc_sata_ata_port_to_ata_no(const struct ata_port *ap)
- unsigned int nr_ports = pdc_sata_nr_ports(ap);
- unsigned int i;
-
-- for(i = 0; i < nr_ports && host->ports[i] != ap; ++i)
-+ for (i = 0; i < nr_ports && host->ports[i] != ap; ++i)
- ;
- BUG_ON(i >= nr_ports);
- return pdc_port_no_to_ata_no(i, pdc_is_sataii_tx4(ap->flags));
-@@ -624,14 +623,14 @@ static unsigned int pdc_sata_hotplug_offset(const struct ata_port *ap)
-
- static void pdc_freeze(struct ata_port *ap)
- {
-- void __iomem *mmio = ap->ioaddr.cmd_addr;
-+ void __iomem *ata_mmio = ap->ioaddr.cmd_addr;
- u32 tmp;
-
-- tmp = readl(mmio + PDC_CTLSTAT);
-+ tmp = readl(ata_mmio + PDC_CTLSTAT);
- tmp |= PDC_IRQ_DISABLE;
- tmp &= ~PDC_DMA_ENABLE;
-- writel(tmp, mmio + PDC_CTLSTAT);
-- readl(mmio + PDC_CTLSTAT); /* flush */
-+ writel(tmp, ata_mmio + PDC_CTLSTAT);
-+ readl(ata_mmio + PDC_CTLSTAT); /* flush */
- }
-
- static void pdc_sata_freeze(struct ata_port *ap)
-@@ -659,17 +658,17 @@ static void pdc_sata_freeze(struct ata_port *ap)
-
- static void pdc_thaw(struct ata_port *ap)
- {
-- void __iomem *mmio = ap->ioaddr.cmd_addr;
-+ void __iomem *ata_mmio = ap->ioaddr.cmd_addr;
- u32 tmp;
-
- /* clear IRQ */
-- readl(mmio + PDC_INT_SEQMASK);
-+ readl(ata_mmio + PDC_COMMAND);
-
- /* turn IRQ back on */
-- tmp = readl(mmio + PDC_CTLSTAT);
-+ tmp = readl(ata_mmio + PDC_CTLSTAT);
- tmp &= ~PDC_IRQ_DISABLE;
-- writel(tmp, mmio + PDC_CTLSTAT);
-- readl(mmio + PDC_CTLSTAT); /* flush */
-+ writel(tmp, ata_mmio + PDC_CTLSTAT);
-+ readl(ata_mmio + PDC_CTLSTAT); /* flush */
- }
-
- static void pdc_sata_thaw(struct ata_port *ap)
-@@ -743,11 +742,11 @@ static void pdc_error_intr(struct ata_port *ap, struct ata_queued_cmd *qc,
- ata_port_abort(ap);
- }
-
--static inline unsigned int pdc_host_intr(struct ata_port *ap,
-- struct ata_queued_cmd *qc)
-+static unsigned int pdc_host_intr(struct ata_port *ap,
-+ struct ata_queued_cmd *qc)
- {
- unsigned int handled = 0;
-- void __iomem *port_mmio = ap->ioaddr.cmd_addr;
-+ void __iomem *ata_mmio = ap->ioaddr.cmd_addr;
- u32 port_status, err_mask;
-
- err_mask = PDC_ERR_MASK;
-@@ -755,7 +754,7 @@ static inline unsigned int pdc_host_intr(struct ata_port *ap,
- err_mask &= ~PDC1_ERR_MASK;
- else
- err_mask &= ~PDC2_ERR_MASK;
-- port_status = readl(port_mmio + PDC_GLOBAL_CTL);
-+ port_status = readl(ata_mmio + PDC_GLOBAL_CTL);
- if (unlikely(port_status & err_mask)) {
- pdc_error_intr(ap, qc, port_status, err_mask);
- return 1;
-@@ -770,7 +769,6 @@ static inline unsigned int pdc_host_intr(struct ata_port *ap,
- ata_qc_complete(qc);
- handled = 1;
- break;
--
- default:
- ap->stats.idle_irq++;
- break;
-@@ -781,10 +779,9 @@ static inline unsigned int pdc_host_intr(struct ata_port *ap,
-
- static void pdc_irq_clear(struct ata_port *ap)
- {
-- struct ata_host *host = ap->host;
-- void __iomem *mmio = host->iomap[PDC_MMIO_BAR];
-+ void __iomem *ata_mmio = ap->ioaddr.cmd_addr;
-
-- readl(mmio + PDC_INT_SEQMASK);
-+ readl(ata_mmio + PDC_COMMAND);
- }
-
- static irqreturn_t pdc_interrupt(int irq, void *dev_instance)
-@@ -794,7 +791,7 @@ static irqreturn_t pdc_interrupt(int irq, void *dev_instance)
- u32 mask = 0;
- unsigned int i, tmp;
- unsigned int handled = 0;
-- void __iomem *mmio_base;
-+ void __iomem *host_mmio;
- unsigned int hotplug_offset, ata_no;
- u32 hotplug_status;
- int is_sataii_tx4;
-@@ -806,7 +803,7 @@ static irqreturn_t pdc_interrupt(int irq, void *dev_instance)
- return IRQ_NONE;
- }
-
-- mmio_base = host->iomap[PDC_MMIO_BAR];
-+ host_mmio = host->iomap[PDC_MMIO_BAR];
-
- spin_lock(&host->lock);
-
-@@ -815,26 +812,26 @@ static irqreturn_t pdc_interrupt(int irq, void *dev_instance)
- hotplug_offset = PDC2_SATA_PLUG_CSR;
- else
- hotplug_offset = PDC_SATA_PLUG_CSR;
-- hotplug_status = readl(mmio_base + hotplug_offset);
-+ hotplug_status = readl(host_mmio + hotplug_offset);
- if (hotplug_status & 0xff)
-- writel(hotplug_status | 0xff, mmio_base + hotplug_offset);
-+ writel(hotplug_status | 0xff, host_mmio + hotplug_offset);
- hotplug_status &= 0xff; /* clear uninteresting bits */
-
- /* reading should also clear interrupts */
-- mask = readl(mmio_base + PDC_INT_SEQMASK);
-+ mask = readl(host_mmio + PDC_INT_SEQMASK);
-
- if (mask == 0xffffffff && hotplug_status == 0) {
- VPRINTK("QUICK EXIT 2\n");
- goto done_irq;
- }
-
-- mask &= 0xffff; /* only 16 tags possible */
-+ mask &= 0xffff; /* only 16 SEQIDs possible */
- if (mask == 0 && hotplug_status == 0) {
- VPRINTK("QUICK EXIT 3\n");
- goto done_irq;
- }
-
-- writel(mask, mmio_base + PDC_INT_SEQMASK);
-+ writel(mask, host_mmio + PDC_INT_SEQMASK);
-
- is_sataii_tx4 = pdc_is_sataii_tx4(host->ports[0]->flags);
-
-@@ -875,23 +872,24 @@ done_irq:
- return IRQ_RETVAL(handled);
- }
-
--static inline void pdc_packet_start(struct ata_queued_cmd *qc)
-+static void pdc_packet_start(struct ata_queued_cmd *qc)
- {
- struct ata_port *ap = qc->ap;
- struct pdc_port_priv *pp = ap->private_data;
-- void __iomem *mmio = ap->host->iomap[PDC_MMIO_BAR];
-+ void __iomem *host_mmio = ap->host->iomap[PDC_MMIO_BAR];
-+ void __iomem *ata_mmio = ap->ioaddr.cmd_addr;
- unsigned int port_no = ap->port_no;
- u8 seq = (u8) (port_no + 1);
-
- VPRINTK("ENTER, ap %p\n", ap);
-
-- writel(0x00000001, mmio + (seq * 4));
-- readl(mmio + (seq * 4)); /* flush */
-+ writel(0x00000001, host_mmio + (seq * 4));
-+ readl(host_mmio + (seq * 4)); /* flush */
-
- pp->pkt[2] = seq;
- wmb(); /* flush PRD, pkt writes */
-- writel(pp->pkt_dma, ap->ioaddr.cmd_addr + PDC_PKT_SUBMIT);
-- readl(ap->ioaddr.cmd_addr + PDC_PKT_SUBMIT); /* flush */
-+ writel(pp->pkt_dma, ata_mmio + PDC_PKT_SUBMIT);
-+ readl(ata_mmio + PDC_PKT_SUBMIT); /* flush */
- }
-
- static unsigned int pdc_qc_issue(struct ata_queued_cmd *qc)
-@@ -909,11 +907,9 @@ static unsigned int pdc_qc_issue(struct ata_queued_cmd *qc)
- case ATA_PROT_DMA:
- pdc_packet_start(qc);
- return 0;
--
- default:
- break;
- }
--
- return ata_sff_qc_issue(qc);
- }
-
-@@ -987,7 +983,7 @@ static void pdc_ata_setup_port(struct ata_port *ap,
-
- static void pdc_host_init(struct ata_host *host)
- {
-- void __iomem *mmio = host->iomap[PDC_MMIO_BAR];
-+ void __iomem *host_mmio = host->iomap[PDC_MMIO_BAR];
- int is_gen2 = host->ports[0]->flags & PDC_FLAG_GEN_II;
- int hotplug_offset;
- u32 tmp;
-@@ -1004,38 +1000,38 @@ static void pdc_host_init(struct ata_host *host)
- */
-
- /* enable BMR_BURST, maybe change FIFO_SHD to 8 dwords */
-- tmp = readl(mmio + PDC_FLASH_CTL);
-+ tmp = readl(host_mmio + PDC_FLASH_CTL);
- tmp |= 0x02000; /* bit 13 (enable bmr burst) */
- if (!is_gen2)
- tmp |= 0x10000; /* bit 16 (fifo threshold at 8 dw) */
-- writel(tmp, mmio + PDC_FLASH_CTL);
-+ writel(tmp, host_mmio + PDC_FLASH_CTL);
-
- /* clear plug/unplug flags for all ports */
-- tmp = readl(mmio + hotplug_offset);
-- writel(tmp | 0xff, mmio + hotplug_offset);
-+ tmp = readl(host_mmio + hotplug_offset);
-+ writel(tmp | 0xff, host_mmio + hotplug_offset);
-
- /* unmask plug/unplug ints */
-- tmp = readl(mmio + hotplug_offset);
-- writel(tmp & ~0xff0000, mmio + hotplug_offset);
-+ tmp = readl(host_mmio + hotplug_offset);
-+ writel(tmp & ~0xff0000, host_mmio + hotplug_offset);
-
- /* don't initialise TBG or SLEW on 2nd generation chips */
- if (is_gen2)
- return;
-
- /* reduce TBG clock to 133 Mhz. */
-- tmp = readl(mmio + PDC_TBG_MODE);
-+ tmp = readl(host_mmio + PDC_TBG_MODE);
- tmp &= ~0x30000; /* clear bit 17, 16*/
- tmp |= 0x10000; /* set bit 17:16 = 0:1 */
-- writel(tmp, mmio + PDC_TBG_MODE);
-+ writel(tmp, host_mmio + PDC_TBG_MODE);
-
-- readl(mmio + PDC_TBG_MODE); /* flush */
-+ readl(host_mmio + PDC_TBG_MODE); /* flush */
- msleep(10);
-
- /* adjust slew rate control register. */
-- tmp = readl(mmio + PDC_SLEW_CTL);
-+ tmp = readl(host_mmio + PDC_SLEW_CTL);
- tmp &= 0xFFFFF03F; /* clear bit 11 ~ 6 */
- tmp |= 0x00000900; /* set bit 11-9 = 100b , bit 8-6 = 100 */
-- writel(tmp, mmio + PDC_SLEW_CTL);
-+ writel(tmp, host_mmio + PDC_SLEW_CTL);
- }
-
- static int pdc_ata_init_one(struct pci_dev *pdev,
-@@ -1045,7 +1041,7 @@ static int pdc_ata_init_one(struct pci_dev *pdev,
- const struct ata_port_info *pi = &pdc_port_info[ent->driver_data];
- const struct ata_port_info *ppi[PDC_MAX_PORTS];
- struct ata_host *host;
-- void __iomem *base;
-+ void __iomem *host_mmio;
- int n_ports, i, rc;
- int is_sataii_tx4;
-
-@@ -1062,7 +1058,7 @@ static int pdc_ata_init_one(struct pci_dev *pdev,
- pcim_pin_device(pdev);
- if (rc)
- return rc;
-- base = pcim_iomap_table(pdev)[PDC_MMIO_BAR];
-+ host_mmio = pcim_iomap_table(pdev)[PDC_MMIO_BAR];
-
- /* determine port configuration and setup host */
- n_ports = 2;
-@@ -1072,7 +1068,7 @@ static int pdc_ata_init_one(struct pci_dev *pdev,
- ppi[i] = pi;
-
- if (pi->flags & PDC_FLAG_SATA_PATA) {
-- u8 tmp = readb(base + PDC_FLASH_CTL+1);
-+ u8 tmp = readb(host_mmio + PDC_FLASH_CTL + 1);
- if (!(tmp & 0x80))
- ppi[n_ports++] = pi + 1;
- }
-@@ -1088,13 +1084,13 @@ static int pdc_ata_init_one(struct pci_dev *pdev,
- for (i = 0; i < host->n_ports; i++) {
- struct ata_port *ap = host->ports[i];
- unsigned int ata_no = pdc_port_no_to_ata_no(i, is_sataii_tx4);
-- unsigned int port_offset = 0x200 + ata_no * 0x80;
-+ unsigned int ata_offset = 0x200 + ata_no * 0x80;
- unsigned int scr_offset = 0x400 + ata_no * 0x100;
-
-- pdc_ata_setup_port(ap, base + port_offset, base + scr_offset);
-+ pdc_ata_setup_port(ap, host_mmio + ata_offset, host_mmio + scr_offset);
-
- ata_port_pbar_desc(ap, PDC_MMIO_BAR, -1, "mmio");
-- ata_port_pbar_desc(ap, PDC_MMIO_BAR, port_offset, "port");
-+ ata_port_pbar_desc(ap, PDC_MMIO_BAR, ata_offset, "ata");
- }
-
- /* initialize adapter */
-diff --git a/drivers/ata/sata_sil24.c b/drivers/ata/sata_sil24.c
-index 27a1101..8ee6b5b 100644
---- a/drivers/ata/sata_sil24.c
-+++ b/drivers/ata/sata_sil24.c
-@@ -899,14 +899,25 @@ static bool sil24_qc_fill_rtf(struct ata_queued_cmd *qc)
-
- static void sil24_pmp_attach(struct ata_port *ap)
- {
-+ u32 *gscr = ap->link.device->gscr;
-+
- sil24_config_pmp(ap, 1);
- sil24_init_port(ap);
-+
-+ if (sata_pmp_gscr_vendor(gscr) == 0x11ab &&
-+ sata_pmp_gscr_devid(gscr) == 0x4140) {
-+ ata_port_printk(ap, KERN_INFO,
-+ "disabling NCQ support due to sil24-mv4140 quirk\n");
-+ ap->flags &= ~ATA_FLAG_NCQ;
-+ }
- }
-
- static void sil24_pmp_detach(struct ata_port *ap)
- {
- sil24_init_port(ap);
- sil24_config_pmp(ap, 0);
-+
-+ ap->flags |= ATA_FLAG_NCQ;
- }
-
- static int sil24_pmp_hardreset(struct ata_link *link, unsigned int *class,
-diff --git a/drivers/atm/fore200e.h b/drivers/atm/fore200e.h
-index 183841c..8dd4aa7 100644
---- a/drivers/atm/fore200e.h
-+++ b/drivers/atm/fore200e.h
-@@ -1,4 +1,3 @@
--/* $Id: fore200e.h,v 1.4 2000/04/14 10:10:34 davem Exp $ */
- #ifndef _FORE200E_H
- #define _FORE200E_H
-
-diff --git a/drivers/atm/he.h b/drivers/atm/he.h
-index 1dc2775..fe6cd15 100644
---- a/drivers/atm/he.h
-+++ b/drivers/atm/he.h
-@@ -1,5 +1,3 @@
--/* $Id: he.h,v 1.4 2003/05/06 22:48:00 chas Exp $ */
--
- /*
-
- he.h
-diff --git a/drivers/atm/idt77252.c b/drivers/atm/idt77252.c
-index 28d77b5..3a504e9 100644
---- a/drivers/atm/idt77252.c
-+++ b/drivers/atm/idt77252.c
-@@ -1,8 +1,4 @@
- /*******************************************************************
-- * ident "$Id: idt77252.c,v 1.2 2001/11/11 08:13:54 ecd Exp $"
-- *
-- * $Author: ecd $
-- * $Date: 2001/11/11 08:13:54 $
- *
- * Copyright (c) 2000 ATecoM GmbH
- *
-@@ -29,9 +25,6 @@
- * 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- *******************************************************************/
--static char const rcsid[] =
--"$Id: idt77252.c,v 1.2 2001/11/11 08:13:54 ecd Exp $";
--
-
- #include
- #include
-diff --git a/drivers/atm/idt77252.h b/drivers/atm/idt77252.h
-index 6f2b4a5..e83eaf1 100644
---- a/drivers/atm/idt77252.h
-+++ b/drivers/atm/idt77252.h
-@@ -1,8 +1,4 @@
- /*******************************************************************
-- * ident "$Id: idt77252.h,v 1.2 2001/11/11 08:13:54 ecd Exp $"
-- *
-- * $Author: ecd $
-- * $Date: 2001/11/11 08:13:54 $
- *
- * Copyright (c) 2000 ATecoM GmbH
- *
-diff --git a/drivers/atm/iphase.h b/drivers/atm/iphase.h
-index 133eefc..b2cd20f 100644
---- a/drivers/atm/iphase.h
-+++ b/drivers/atm/iphase.h
-@@ -1025,7 +1025,8 @@ typedef struct iadev_t {
- spinlock_t rx_lock, misc_lock;
- struct atm_vcc **rx_open; /* list of all open VCs */
- u16 num_rx_desc, rx_buf_sz, rxing;
-- u32 rx_pkt_ram, rx_tmp_cnt, rx_tmp_jif;
-+ u32 rx_pkt_ram, rx_tmp_cnt;
-+ unsigned long rx_tmp_jif;
- void __iomem *RX_DESC_BASE_ADDR;
- u32 drop_rxpkt, drop_rxcell, rx_cell_cnt, rx_pkt_cnt;
- struct atm_dev *next_board; /* other iphase devices */
-diff --git a/drivers/atm/nicstarmac.copyright b/drivers/atm/nicstarmac.copyright
-index 2e15b39..180531a 100644
---- a/drivers/atm/nicstarmac.copyright
-+++ b/drivers/atm/nicstarmac.copyright
-@@ -13,7 +13,7 @@
- *
- * Modified to work with the IDT7721 nicstar -- AAL5 (tested) only.
- *
-- * R. D. Rechenmacher , Aug. 6, 1997 $Revision: 1.1 $ $Date: 1999/08/20 11:00:11 $
-+ * R. D. Rechenmacher , Aug. 6, 1997
- *
- * Linux driver for the IDT77201 NICStAR PCI ATM controller.
- * PHY component is expected to be 155 Mbps S/UNI-Lite or IDT 77155;
-diff --git a/drivers/base/core.c b/drivers/base/core.c
-index be288b5..72eccae 100644
---- a/drivers/base/core.c
-+++ b/drivers/base/core.c
-@@ -1084,11 +1084,13 @@ static void device_create_release(struct device *dev)
- }
-
- /**
-- * device_create - creates a device and registers it with sysfs
-+ * device_create_vargs - creates a device and registers it with sysfs
- * @class: pointer to the struct class that this device should be registered to
- * @parent: pointer to the parent struct device of this new device, if any
- * @devt: the dev_t for the char device to be added
-+ * @drvdata: the data to be added to the device for callbacks
- * @fmt: string for the device's name
-+ * @args: va_list for the device's name
- *
- * This function can be used by char device classes. A struct device
- * will be created in sysfs, registered to the specified class.
-@@ -1104,10 +1106,10 @@ static void device_create_release(struct device *dev)
- * Note: the struct class passed to this function must have previously
- * been created with a call to class_create().
- */
--struct device *device_create(struct class *class, struct device *parent,
-- dev_t devt, const char *fmt, ...)
-+struct device *device_create_vargs(struct class *class, struct device *parent,
-+ dev_t devt, void *drvdata, const char *fmt,
-+ va_list args)
- {
-- va_list args;
- struct device *dev = NULL;
- int retval = -ENODEV;
-
-@@ -1124,10 +1126,9 @@ struct device *device_create(struct class *class, struct device *parent,
- dev->class = class;
- dev->parent = parent;
- dev->release = device_create_release;
-+ dev_set_drvdata(dev, drvdata);
-
-- va_start(args, fmt);
- vsnprintf(dev->bus_id, BUS_ID_SIZE, fmt, args);
-- va_end(args);
- retval = device_register(dev);
- if (retval)
- goto error;
-@@ -1138,6 +1139,78 @@ error:
- kfree(dev);
- return ERR_PTR(retval);
- }
-+EXPORT_SYMBOL_GPL(device_create_vargs);
-+
-+/**
-+ * device_create_drvdata - creates a device and registers it with sysfs
-+ * @class: pointer to the struct class that this device should be registered to
-+ * @parent: pointer to the parent struct device of this new device, if any
-+ * @devt: the dev_t for the char device to be added
-+ * @drvdata: the data to be added to the device for callbacks
-+ * @fmt: string for the device's name
-+ *
-+ * This function can be used by char device classes. A struct device
-+ * will be created in sysfs, registered to the specified class.
-+ *
-+ * A "dev" file will be created, showing the dev_t for the device, if
-+ * the dev_t is not 0,0.
-+ * If a pointer to a parent struct device is passed in, the newly created
-+ * struct device will be a child of that device in sysfs.
-+ * The pointer to the struct device will be returned from the call.
-+ * Any further sysfs files that might be required can be created using this
-+ * pointer.
-+ *
-+ * Note: the struct class passed to this function must have previously
-+ * been created with a call to class_create().
-+ */
-+struct device *device_create_drvdata(struct class *class,
-+ struct device *parent,
-+ dev_t devt,
-+ void *drvdata,
-+ const char *fmt, ...)
-+{
-+ va_list vargs;
-+ struct device *dev;
-+
-+ va_start(vargs, fmt);
-+ dev = device_create_vargs(class, parent, devt, drvdata, fmt, vargs);
-+ va_end(vargs);
-+ return dev;
-+}
-+EXPORT_SYMBOL_GPL(device_create_drvdata);
-+
-+/**
-+ * device_create - creates a device and registers it with sysfs
-+ * @class: pointer to the struct class that this device should be registered to
-+ * @parent: pointer to the parent struct device of this new device, if any
-+ * @devt: the dev_t for the char device to be added
-+ * @fmt: string for the device's name
-+ *
-+ * This function can be used by char device classes. A struct device
-+ * will be created in sysfs, registered to the specified class.
-+ *
-+ * A "dev" file will be created, showing the dev_t for the device, if
-+ * the dev_t is not 0,0.
-+ * If a pointer to a parent struct device is passed in, the newly created
-+ * struct device will be a child of that device in sysfs.
-+ * The pointer to the struct device will be returned from the call.
-+ * Any further sysfs files that might be required can be created using this
-+ * pointer.
-+ *
-+ * Note: the struct class passed to this function must have previously
-+ * been created with a call to class_create().
-+ */
-+struct device *device_create(struct class *class, struct device *parent,
-+ dev_t devt, const char *fmt, ...)
-+{
-+ va_list vargs;
-+ struct device *dev;
-+
-+ va_start(vargs, fmt);
-+ dev = device_create_vargs(class, parent, devt, NULL, fmt, vargs);
-+ va_end(vargs);
-+ return dev;
-+}
- EXPORT_SYMBOL_GPL(device_create);
-
- static int __match_devt(struct device *dev, void *data)
-@@ -1218,13 +1291,11 @@ int device_rename(struct device *dev, char *new_name)
- }
- #else
- if (dev->class) {
-- sysfs_remove_link(&dev->class->subsys.kobj, old_device_name);
- error = sysfs_create_link(&dev->class->subsys.kobj, &dev->kobj,
- dev->bus_id);
-- if (error) {
-- dev_err(dev, "%s: sysfs_create_symlink failed (%d)\n",
-- __func__, error);
-- }
-+ if (error)
-+ goto out;
-+ sysfs_remove_link(&dev->class->subsys.kobj, old_device_name);
- }
- #endif
-
-diff --git a/drivers/block/brd.c b/drivers/block/brd.c
-index a196ef7..680cdfc 100644
---- a/drivers/block/brd.c
-+++ b/drivers/block/brd.c
-@@ -447,6 +447,7 @@ static struct brd_device *brd_alloc(int i)
- disk->fops = &brd_fops;
- disk->private_data = brd;
- disk->queue = brd->brd_queue;
-+ disk->flags |= GENHD_FL_SUPPRESS_PARTITION_INFO;
- sprintf(disk->disk_name, "ram%d", i);
- set_capacity(disk, rd_size * 2);
-
-diff --git a/drivers/block/viodasd.c b/drivers/block/viodasd.c
-index ebfe038..f1c8feb 100644
---- a/drivers/block/viodasd.c
-+++ b/drivers/block/viodasd.c
-@@ -3,7 +3,7 @@
- * Authors: Dave Boutcher
- * Ryan Arnold
- * Colin Devilbiss
-- * Stephen Rothwell
-+ * Stephen Rothwell
- *
- * (C) Copyright 2000-2004 IBM Corporation
- *
-diff --git a/drivers/cdrom/viocd.c b/drivers/cdrom/viocd.c
-index 5245a4a..9d0dfe6 100644
---- a/drivers/cdrom/viocd.c
-+++ b/drivers/cdrom/viocd.c
-@@ -6,7 +6,7 @@
- * Authors: Dave Boutcher
- * Ryan Arnold
- * Colin Devilbiss
-- * Stephen Rothwell
-+ * Stephen Rothwell
- *
- * (C) Copyright 2000-2004 IBM Corporation
- *
-diff --git a/drivers/char/drm/drm.h b/drivers/char/drm/drm.h
-index 6874f31..3a05c6d 100644
---- a/drivers/char/drm/drm.h
-+++ b/drivers/char/drm/drm.h
-@@ -471,7 +471,6 @@ struct drm_irq_busid {
- enum drm_vblank_seq_type {
- _DRM_VBLANK_ABSOLUTE = 0x0, /**< Wait for specific vblank sequence number */
- _DRM_VBLANK_RELATIVE = 0x1, /**< Wait for given number of vblanks */
-- _DRM_VBLANK_FLIP = 0x8000000, /**< Scheduled buffer swap should flip */
- _DRM_VBLANK_NEXTONMISS = 0x10000000, /**< If missed, wait for next vblank */
- _DRM_VBLANK_SECONDARY = 0x20000000, /**< Secondary display controller */
- _DRM_VBLANK_SIGNAL = 0x40000000 /**< Send signal instead of blocking */
-@@ -504,21 +503,6 @@ union drm_wait_vblank {
- struct drm_wait_vblank_reply reply;
- };
-
--enum drm_modeset_ctl_cmd {
-- _DRM_PRE_MODESET = 1,
-- _DRM_POST_MODESET = 2,
--};
--
--/**
-- * DRM_IOCTL_MODESET_CTL ioctl argument type
-- *
-- * \sa drmModesetCtl().
-- */
--struct drm_modeset_ctl {
-- unsigned long arg;
-- enum drm_modeset_ctl_cmd cmd;
--};
--
- /**
- * DRM_IOCTL_AGP_ENABLE ioctl argument type.
- *
-@@ -603,7 +587,6 @@ struct drm_set_version {
- #define DRM_IOCTL_GET_CLIENT DRM_IOWR(0x05, struct drm_client)
- #define DRM_IOCTL_GET_STATS DRM_IOR( 0x06, struct drm_stats)
- #define DRM_IOCTL_SET_VERSION DRM_IOWR(0x07, struct drm_set_version)
--#define DRM_IOCTL_MODESET_CTL DRM_IOW(0x08, struct drm_modeset_ctl)
-
- #define DRM_IOCTL_SET_UNIQUE DRM_IOW( 0x10, struct drm_unique)
- #define DRM_IOCTL_AUTH_MAGIC DRM_IOW( 0x11, struct drm_auth)
-diff --git a/drivers/char/drm/drmP.h b/drivers/char/drm/drmP.h
-index 213b3ca..0764b66 100644
---- a/drivers/char/drm/drmP.h
-+++ b/drivers/char/drm/drmP.h
-@@ -100,8 +100,10 @@ struct drm_device;
- #define DRIVER_HAVE_DMA 0x20
- #define DRIVER_HAVE_IRQ 0x40
- #define DRIVER_IRQ_SHARED 0x80
-+#define DRIVER_IRQ_VBL 0x100
- #define DRIVER_DMA_QUEUE 0x200
- #define DRIVER_FB_DMA 0x400
-+#define DRIVER_IRQ_VBL2 0x800
-
- /***********************************************************************/
- /** \name Begin the DRM... */
-@@ -577,52 +579,10 @@ struct drm_driver {
- int (*context_dtor) (struct drm_device *dev, int context);
- int (*kernel_context_switch) (struct drm_device *dev, int old,
- int new);
-- void (*kernel_context_switch_unlock) (struct drm_device * dev);
-- /**
-- * get_vblank_counter - get raw hardware vblank counter
-- * @dev: DRM device
-- * @crtc: counter to fetch
-- *
-- * Driver callback for fetching a raw hardware vblank counter
-- * for @crtc. If a device doesn't have a hardware counter, the
-- * driver can simply return the value of drm_vblank_count and
-- * make the enable_vblank() and disable_vblank() hooks into no-ops,
-- * leaving interrupts enabled at all times.
-- *
-- * Wraparound handling and loss of events due to modesetting is dealt
-- * with in the DRM core code.
-- *
-- * RETURNS
-- * Raw vblank counter value.
-- */
-- u32 (*get_vblank_counter) (struct drm_device *dev, int crtc);
--
-- /**
-- * enable_vblank - enable vblank interrupt events
-- * @dev: DRM device
-- * @crtc: which irq to enable
-- *
-- * Enable vblank interrupts for @crtc. If the device doesn't have
-- * a hardware vblank counter, this routine should be a no-op, since
-- * interrupts will have to stay on to keep the count accurate.
-- *
-- * RETURNS
-- * Zero on success, appropriate errno if the given @crtc's vblank
-- * interrupt cannot be enabled.
-- */
-- int (*enable_vblank) (struct drm_device *dev, int crtc);
--
-- /**
-- * disable_vblank - disable vblank interrupt events
-- * @dev: DRM device
-- * @crtc: which irq to enable
-- *
-- * Disable vblank interrupts for @crtc. If the device doesn't have
-- * a hardware vblank counter, this routine should be a no-op, since
-- * interrupts will have to stay on to keep the count accurate.
-- */
-- void (*disable_vblank) (struct drm_device *dev, int crtc);
-- int (*dri_library_name) (struct drm_device *dev, char * buf);
-+ void (*kernel_context_switch_unlock) (struct drm_device *dev);
-+ int (*vblank_wait) (struct drm_device *dev, unsigned int *sequence);
-+ int (*vblank_wait2) (struct drm_device *dev, unsigned int *sequence);
-+ int (*dri_library_name) (struct drm_device *dev, char *buf);
-
- /**
- * Called by \c drm_device_is_agp. Typically used to determine if a
-@@ -641,7 +601,7 @@ struct drm_driver {
-
- irqreturn_t(*irq_handler) (DRM_IRQ_ARGS);
- void (*irq_preinstall) (struct drm_device *dev);
-- int (*irq_postinstall) (struct drm_device *dev);
-+ void (*irq_postinstall) (struct drm_device *dev);
- void (*irq_uninstall) (struct drm_device *dev);
- void (*reclaim_buffers) (struct drm_device *dev,
- struct drm_file * file_priv);
-@@ -770,21 +730,13 @@ struct drm_device {
- /** \name VBLANK IRQ support */
- /*@{ */
-
-- wait_queue_head_t *vbl_queue; /**< VBLANK wait queue */
-- atomic_t *_vblank_count; /**< number of VBLANK interrupts (driver must alloc the right number of counters) */
-+ wait_queue_head_t vbl_queue; /**< VBLANK wait queue */
-+ atomic_t vbl_received;
-+ atomic_t vbl_received2; /**< number of secondary VBLANK interrupts */
- spinlock_t vbl_lock;
-- struct list_head *vbl_sigs; /**< signal list to send on VBLANK */
-- atomic_t vbl_signal_pending; /* number of signals pending on all crtcs*/
-- atomic_t *vblank_refcount; /* number of users of vblank interrupts per crtc */
-- u32 *last_vblank; /* protected by dev->vbl_lock, used */
-- /* for wraparound handling */
-- u32 *vblank_offset; /* used to track how many vblanks */
-- int *vblank_enabled; /* so we don't call enable more than
-- once per disable */
-- u32 *vblank_premodeset; /* were lost during modeset */
-- struct timer_list vblank_disable_timer;
--
-- unsigned long max_vblank_count; /**< size of vblank counter register */
-+ struct list_head vbl_sigs; /**< signal list to send on VBLANK */
-+ struct list_head vbl_sigs2; /**< signals to send on secondary VBLANK */
-+ unsigned int vbl_pending;
- spinlock_t tasklet_lock; /**< For drm_locked_tasklet */
- void (*locked_tasklet_func)(struct drm_device *dev);
-
-@@ -804,7 +756,6 @@ struct drm_device {
- #ifdef __alpha__
- struct pci_controller *hose;
- #endif
-- int num_crtcs; /**< Number of CRTCs on this device */
- struct drm_sg_mem *sg; /**< Scatter gather memory */
- void *dev_private; /**< device private data */
- struct drm_sigdata sigdata; /**< For block_all_signals */
-@@ -1039,19 +990,11 @@ extern void drm_driver_irq_preinstall(struct drm_device *dev);
- extern void drm_driver_irq_postinstall(struct drm_device *dev);
- extern void drm_driver_irq_uninstall(struct drm_device *dev);
-
--extern int drm_vblank_init(struct drm_device *dev, int num_crtcs);
--extern int drm_wait_vblank(struct drm_device *dev, void *data, struct drm_file *filp);
--extern int drm_vblank_wait(struct drm_device * dev, unsigned int *vbl_seq);
--extern void drm_locked_tasklet(struct drm_device *dev, void(*func)(struct drm_device*));
--extern u32 drm_vblank_count(struct drm_device *dev, int crtc);
--extern void drm_update_vblank_count(struct drm_device *dev, int crtc);
--extern void drm_handle_vblank(struct drm_device *dev, int crtc);
--extern int drm_vblank_get(struct drm_device *dev, int crtc);
--extern void drm_vblank_put(struct drm_device *dev, int crtc);
--
-- /* Modesetting support */
--extern int drm_modeset_ctl(struct drm_device *dev, void *data,
-+extern int drm_wait_vblank(struct drm_device *dev, void *data,
- struct drm_file *file_priv);
-+extern int drm_vblank_wait(struct drm_device *dev, unsigned int *vbl_seq);
-+extern void drm_vbl_send_signals(struct drm_device *dev);
-+extern void drm_locked_tasklet(struct drm_device *dev, void(*func)(struct drm_device*));
-
- /* AGP/GART support (drm_agpsupport.h) */
- extern struct drm_agp_head *drm_agp_init(struct drm_device *dev);
-diff --git a/drivers/char/drm/drm_fops.c b/drivers/char/drm/drm_fops.c
-index 68f0da8..d2e6da8 100644
---- a/drivers/char/drm/drm_fops.c
-+++ b/drivers/char/drm/drm_fops.c
-@@ -323,7 +323,6 @@ int drm_release(struct inode *inode, struct file *filp)
- struct drm_file *file_priv = filp->private_data;
- struct drm_device *dev = file_priv->minor->dev;
- int retcode = 0;
-- unsigned long irqflags;
-
- lock_kernel();
-
-@@ -355,11 +354,9 @@ int drm_release(struct inode *inode, struct file *filp)
- */
-
- do{
-- spin_lock_irqsave(&dev->lock.spinlock,
-- irqflags);
-+ spin_lock_bh(&dev->lock.spinlock);
- locked = dev->lock.idle_has_lock;
-- spin_unlock_irqrestore(&dev->lock.spinlock,
-- irqflags);
-+ spin_unlock_bh(&dev->lock.spinlock);
- if (locked)
- break;
- schedule();
-diff --git a/drivers/char/drm/drm_irq.c b/drivers/char/drm/drm_irq.c
-index 286f9d6..089c015 100644
---- a/drivers/char/drm/drm_irq.c
-+++ b/drivers/char/drm/drm_irq.c
-@@ -71,117 +71,6 @@ int drm_irq_by_busid(struct drm_device *dev, void *data,
- return 0;
- }
-
--static void vblank_disable_fn(unsigned long arg)
--{
-- struct drm_device *dev = (struct drm_device *)arg;
-- unsigned long irqflags;
-- int i;
--
-- for (i = 0; i < dev->num_crtcs; i++) {
-- spin_lock_irqsave(&dev->vbl_lock, irqflags);
-- if (atomic_read(&dev->vblank_refcount[i]) == 0 &&
-- dev->vblank_enabled[i]) {
-- dev->driver->disable_vblank(dev, i);
-- dev->vblank_enabled[i] = 0;
-- }
-- spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
-- }
--}
--
--static void drm_vblank_cleanup(struct drm_device *dev)
--{
-- /* Bail if the driver didn't call drm_vblank_init() */
-- if (dev->num_crtcs == 0)
-- return;
--
-- del_timer(&dev->vblank_disable_timer);
--
-- vblank_disable_fn((unsigned long)dev);
--
-- drm_free(dev->vbl_queue, sizeof(*dev->vbl_queue) * dev->num_crtcs,
-- DRM_MEM_DRIVER);
-- drm_free(dev->vbl_sigs, sizeof(*dev->vbl_sigs) * dev->num_crtcs,
-- DRM_MEM_DRIVER);
-- drm_free(dev->_vblank_count, sizeof(*dev->_vblank_count) *
-- dev->num_crtcs, DRM_MEM_DRIVER);
-- drm_free(dev->vblank_refcount, sizeof(*dev->vblank_refcount) *
-- dev->num_crtcs, DRM_MEM_DRIVER);
-- drm_free(dev->vblank_enabled, sizeof(*dev->vblank_enabled) *
-- dev->num_crtcs, DRM_MEM_DRIVER);
-- drm_free(dev->last_vblank, sizeof(*dev->last_vblank) * dev->num_crtcs,
-- DRM_MEM_DRIVER);
-- drm_free(dev->vblank_premodeset, sizeof(*dev->vblank_premodeset) *
-- dev->num_crtcs, DRM_MEM_DRIVER);
-- drm_free(dev->vblank_offset, sizeof(*dev->vblank_offset) * dev->num_crtcs,
-- DRM_MEM_DRIVER);
--
-- dev->num_crtcs = 0;
--}
--
--int drm_vblank_init(struct drm_device *dev, int num_crtcs)
--{
-- int i, ret = -ENOMEM;
--
-- setup_timer(&dev->vblank_disable_timer, vblank_disable_fn,
-- (unsigned long)dev);
-- spin_lock_init(&dev->vbl_lock);
-- atomic_set(&dev->vbl_signal_pending, 0);
-- dev->num_crtcs = num_crtcs;
--
-- dev->vbl_queue = drm_alloc(sizeof(wait_queue_head_t) * num_crtcs,
-- DRM_MEM_DRIVER);
-- if (!dev->vbl_queue)
-- goto err;
--
-- dev->vbl_sigs = drm_alloc(sizeof(struct list_head) * num_crtcs,
-- DRM_MEM_DRIVER);
-- if (!dev->vbl_sigs)
-- goto err;
--
-- dev->_vblank_count = drm_alloc(sizeof(atomic_t) * num_crtcs,
-- DRM_MEM_DRIVER);
-- if (!dev->_vblank_count)
-- goto err;
--
-- dev->vblank_refcount = drm_alloc(sizeof(atomic_t) * num_crtcs,
-- DRM_MEM_DRIVER);
-- if (!dev->vblank_refcount)
-- goto err;
--
-- dev->vblank_enabled = drm_calloc(num_crtcs, sizeof(int),
-- DRM_MEM_DRIVER);
-- if (!dev->vblank_enabled)
-- goto err;
--
-- dev->last_vblank = drm_calloc(num_crtcs, sizeof(u32), DRM_MEM_DRIVER);
-- if (!dev->last_vblank)
-- goto err;
--
-- dev->vblank_premodeset = drm_calloc(num_crtcs, sizeof(u32),
-- DRM_MEM_DRIVER);
-- if (!dev->vblank_premodeset)
-- goto err;
--
-- dev->vblank_offset = drm_calloc(num_crtcs, sizeof(u32), DRM_MEM_DRIVER);
-- if (!dev->vblank_offset)
-- goto err;
--
-- /* Zero per-crtc vblank stuff */
-- for (i = 0; i < num_crtcs; i++) {
-- init_waitqueue_head(&dev->vbl_queue[i]);
-- INIT_LIST_HEAD(&dev->vbl_sigs[i]);
-- atomic_set(&dev->_vblank_count[i], 0);
-- atomic_set(&dev->vblank_refcount[i], 0);
-- }
--
-- return 0;
--
--err:
-- drm_vblank_cleanup(dev);
-- return ret;
--}
--EXPORT_SYMBOL(drm_vblank_init);
--
- /**
- * Install IRQ handler.
- *
-@@ -220,6 +109,17 @@ static int drm_irq_install(struct drm_device * dev)
-
- DRM_DEBUG("irq=%d\n", dev->irq);
-
-+ if (drm_core_check_feature(dev, DRIVER_IRQ_VBL)) {
-+ init_waitqueue_head(&dev->vbl_queue);
-+
-+ spin_lock_init(&dev->vbl_lock);
-+
-+ INIT_LIST_HEAD(&dev->vbl_sigs);
-+ INIT_LIST_HEAD(&dev->vbl_sigs2);
-+
-+ dev->vbl_pending = 0;
-+ }
-+
- /* Before installing handler */
- dev->driver->irq_preinstall(dev);
-
-@@ -237,14 +137,9 @@ static int drm_irq_install(struct drm_device * dev)
- }
-
- /* After installing handler */
-- ret = dev->driver->irq_postinstall(dev);
-- if (ret < 0) {
-- mutex_lock(&dev->struct_mutex);
-- dev->irq_enabled = 0;
-- mutex_unlock(&dev->struct_mutex);
-- }
-+ dev->driver->irq_postinstall(dev);
-
-- return ret;
-+ return 0;
- }
-
- /**
-@@ -275,8 +170,6 @@ int drm_irq_uninstall(struct drm_device * dev)
-
- free_irq(dev->irq, dev);
-
-- drm_vblank_cleanup(dev);
--
- dev->locked_tasklet_func = NULL;
-
- return 0;
-@@ -321,148 +214,6 @@ int drm_control(struct drm_device *dev, void *data,
- }
-
- /**
-- * drm_vblank_count - retrieve "cooked" vblank counter value
-- * @dev: DRM device
-- * @crtc: which counter to retrieve
-- *
-- * Fetches the "cooked" vblank count value that represents the number of
-- * vblank events since the system was booted, including lost events due to
-- * modesetting activity.
-- */
--u32 drm_vblank_count(struct drm_device *dev, int crtc)
--{
-- return atomic_read(&dev->_vblank_count[crtc]) +
-- dev->vblank_offset[crtc];
--}
--EXPORT_SYMBOL(drm_vblank_count);
--
--/**
-- * drm_update_vblank_count - update the master vblank counter
-- * @dev: DRM device
-- * @crtc: counter to update
-- *
-- * Call back into the driver to update the appropriate vblank counter
-- * (specified by @crtc). Deal with wraparound, if it occurred, and
-- * update the last read value so we can deal with wraparound on the next
-- * call if necessary.
-- */
--void drm_update_vblank_count(struct drm_device *dev, int crtc)
--{
-- unsigned long irqflags;
-- u32 cur_vblank, diff;
--
-- /*
-- * Interrupts were disabled prior to this call, so deal with counter
-- * wrap if needed.
-- * NOTE! It's possible we lost a full dev->max_vblank_count events
-- * here if the register is small or we had vblank interrupts off for
-- * a long time.
-- */
-- cur_vblank = dev->driver->get_vblank_counter(dev, crtc);
-- spin_lock_irqsave(&dev->vbl_lock, irqflags);
-- if (cur_vblank < dev->last_vblank[crtc]) {
-- diff = dev->max_vblank_count -
-- dev->last_vblank[crtc];
-- diff += cur_vblank;
-- } else {
-- diff = cur_vblank - dev->last_vblank[crtc];
-- }
-- dev->last_vblank[crtc] = cur_vblank;
-- spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
--
-- atomic_add(diff, &dev->_vblank_count[crtc]);
--}
--EXPORT_SYMBOL(drm_update_vblank_count);
--
--/**
-- * drm_vblank_get - get a reference count on vblank events
-- * @dev: DRM device
-- * @crtc: which CRTC to own
-- *
-- * Acquire a reference count on vblank events to avoid having them disabled
-- * while in use. Note callers will probably want to update the master counter
-- * using drm_update_vblank_count() above before calling this routine so that
-- * wakeups occur on the right vblank event.
-- *
-- * RETURNS
-- * Zero on success, nonzero on failure.
-- */
--int drm_vblank_get(struct drm_device *dev, int crtc)
--{
-- unsigned long irqflags;
-- int ret = 0;
--
-- spin_lock_irqsave(&dev->vbl_lock, irqflags);
-- /* Going from 0->1 means we have to enable interrupts again */
-- if (atomic_add_return(1, &dev->vblank_refcount[crtc]) == 1 &&
-- !dev->vblank_enabled[crtc]) {
-- ret = dev->driver->enable_vblank(dev, crtc);
-- if (ret)
-- atomic_dec(&dev->vblank_refcount[crtc]);
-- else
-- dev->vblank_enabled[crtc] = 1;
-- }
-- spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
--
-- return ret;
--}
--EXPORT_SYMBOL(drm_vblank_get);
--
--/**
-- * drm_vblank_put - give up ownership of vblank events
-- * @dev: DRM device
-- * @crtc: which counter to give up
-- *
-- * Release ownership of a given vblank counter, turning off interrupts
-- * if possible.
-- */
--void drm_vblank_put(struct drm_device *dev, int crtc)
--{
-- /* Last user schedules interrupt disable */
-- if (atomic_dec_and_test(&dev->vblank_refcount[crtc]))
-- mod_timer(&dev->vblank_disable_timer, jiffies + 5*DRM_HZ);
--}
--EXPORT_SYMBOL(drm_vblank_put);
--
--/**
-- * drm_modeset_ctl - handle vblank event counter changes across mode switch
-- * @DRM_IOCTL_ARGS: standard ioctl arguments
-- *
-- * Applications should call the %_DRM_PRE_MODESET and %_DRM_POST_MODESET
-- * ioctls around modesetting so that any lost vblank events are accounted for.
-- */
--int drm_modeset_ctl(struct drm_device *dev, void *data,
-- struct drm_file *file_priv)
--{
-- struct drm_modeset_ctl *modeset = data;
-- int crtc, ret = 0;
-- u32 new;
--
-- crtc = modeset->arg;
-- if (crtc >= dev->num_crtcs) {
-- ret = -EINVAL;
-- goto out;
-- }
--
-- switch (modeset->cmd) {
-- case _DRM_PRE_MODESET:
-- dev->vblank_premodeset[crtc] =
-- dev->driver->get_vblank_counter(dev, crtc);
-- break;
-- case _DRM_POST_MODESET:
-- new = dev->driver->get_vblank_counter(dev, crtc);
-- dev->vblank_offset[crtc] = dev->vblank_premodeset[crtc] - new;
-- break;
-- default:
-- ret = -EINVAL;
-- break;
-- }
--
--out:
-- return ret;
--}
--
--/**
- * Wait for VBLANK.
- *
- * \param inode device inode.
-@@ -481,13 +232,12 @@ out:
- *
- * If a signal is not requested, then calls vblank_wait().
- */
--int drm_wait_vblank(struct drm_device *dev, void *data,
-- struct drm_file *file_priv)
-+int drm_wait_vblank(struct drm_device *dev, void *data, struct drm_file *file_priv)
- {
- union drm_wait_vblank *vblwait = data;
- struct timeval now;
- int ret = 0;
-- unsigned int flags, seq, crtc;
-+ unsigned int flags, seq;
-
- if ((!dev->irq) || (!dev->irq_enabled))
- return -EINVAL;
-@@ -501,13 +251,13 @@ int drm_wait_vblank(struct drm_device *dev, void *data,
- }
-
- flags = vblwait->request.type & _DRM_VBLANK_FLAGS_MASK;
-- crtc = flags & _DRM_VBLANK_SECONDARY ? 1 : 0;
-
-- if (crtc >= dev->num_crtcs)
-+ if (!drm_core_check_feature(dev, (flags & _DRM_VBLANK_SECONDARY) ?
-+ DRIVER_IRQ_VBL2 : DRIVER_IRQ_VBL))
- return -EINVAL;
-
-- drm_update_vblank_count(dev, crtc);
-- seq = drm_vblank_count(dev, crtc);
-+ seq = atomic_read((flags & _DRM_VBLANK_SECONDARY) ? &dev->vbl_received2
-+ : &dev->vbl_received);
-
- switch (vblwait->request.type & _DRM_VBLANK_TYPES_MASK) {
- case _DRM_VBLANK_RELATIVE:
-@@ -526,7 +276,8 @@ int drm_wait_vblank(struct drm_device *dev, void *data,
-
- if (flags & _DRM_VBLANK_SIGNAL) {
- unsigned long irqflags;
-- struct list_head *vbl_sigs = &dev->vbl_sigs[crtc];
-+ struct list_head *vbl_sigs = (flags & _DRM_VBLANK_SECONDARY)
-+ ? &dev->vbl_sigs2 : &dev->vbl_sigs;
- struct drm_vbl_sig *vbl_sig;
-
- spin_lock_irqsave(&dev->vbl_lock, irqflags);
-@@ -547,26 +298,22 @@ int drm_wait_vblank(struct drm_device *dev, void *data,
- }
- }
-
-- if (atomic_read(&dev->vbl_signal_pending) >= 100) {
-+ if (dev->vbl_pending >= 100) {
- spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
- return -EBUSY;
- }
-
-+ dev->vbl_pending++;
-+
- spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
-
-- vbl_sig = drm_calloc(1, sizeof(struct drm_vbl_sig),
-- DRM_MEM_DRIVER);
-- if (!vbl_sig)
-+ if (!
-+ (vbl_sig =
-+ drm_alloc(sizeof(struct drm_vbl_sig), DRM_MEM_DRIVER))) {
- return -ENOMEM;
--
-- ret = drm_vblank_get(dev, crtc);
-- if (ret) {
-- drm_free(vbl_sig, sizeof(struct drm_vbl_sig),
-- DRM_MEM_DRIVER);
-- return ret;
- }
-
-- atomic_inc(&dev->vbl_signal_pending);
-+ memset((void *)vbl_sig, 0, sizeof(*vbl_sig));
-
- vbl_sig->sequence = vblwait->request.sequence;
- vbl_sig->info.si_signo = vblwait->request.signal;
-@@ -580,20 +327,17 @@ int drm_wait_vblank(struct drm_device *dev, void *data,
-
- vblwait->reply.sequence = seq;
- } else {
-- unsigned long cur_vblank;
--
-- ret = drm_vblank_get(dev, crtc);
-- if (ret)
-- return ret;
-- DRM_WAIT_ON(ret, dev->vbl_queue[crtc], 3 * DRM_HZ,
-- (((cur_vblank = drm_vblank_count(dev, crtc))
-- - vblwait->request.sequence) <= (1 << 23)));
-- drm_vblank_put(dev, crtc);
-- do_gettimeofday(&now);
-+ if (flags & _DRM_VBLANK_SECONDARY) {
-+ if (dev->driver->vblank_wait2)
-+ ret = dev->driver->vblank_wait2(dev, &vblwait->request.sequence);
-+ } else if (dev->driver->vblank_wait)
-+ ret =
-+ dev->driver->vblank_wait(dev,
-+ &vblwait->request.sequence);
-
-+ do_gettimeofday(&now);
- vblwait->reply.tval_sec = now.tv_sec;
- vblwait->reply.tval_usec = now.tv_usec;
-- vblwait->reply.sequence = cur_vblank;
- }
-
- done:
-@@ -604,57 +348,44 @@ int drm_wait_vblank(struct drm_device *dev, void *data,
- * Send the VBLANK signals.
- *
- * \param dev DRM device.
-- * \param crtc CRTC where the vblank event occurred
- *
- * Sends a signal for each task in drm_device::vbl_sigs and empties the list.
- *
- * If a signal is not requested, then calls vblank_wait().
- */
--static void drm_vbl_send_signals(struct drm_device * dev, int crtc)
-+void drm_vbl_send_signals(struct drm_device * dev)
- {
-- struct drm_vbl_sig *vbl_sig, *tmp;
-- struct list_head *vbl_sigs;
-- unsigned int vbl_seq;
- unsigned long flags;
-+ int i;
-
- spin_lock_irqsave(&dev->vbl_lock, flags);
-
-- vbl_sigs = &dev->vbl_sigs[crtc];
-- vbl_seq = drm_vblank_count(dev, crtc);
-+ for (i = 0; i < 2; i++) {
-+ struct drm_vbl_sig *vbl_sig, *tmp;
-+ struct list_head *vbl_sigs = i ? &dev->vbl_sigs2 : &dev->vbl_sigs;
-+ unsigned int vbl_seq = atomic_read(i ? &dev->vbl_received2 :
-+ &dev->vbl_received);
-
-- list_for_each_entry_safe(vbl_sig, tmp, vbl_sigs, head) {
-- if ((vbl_seq - vbl_sig->sequence) <= (1 << 23)) {
-- vbl_sig->info.si_code = vbl_seq;
-- send_sig_info(vbl_sig->info.si_signo,
-- &vbl_sig->info, vbl_sig->task);
-+ list_for_each_entry_safe(vbl_sig, tmp, vbl_sigs, head) {
-+ if ((vbl_seq - vbl_sig->sequence) <= (1 << 23)) {
-+ vbl_sig->info.si_code = vbl_seq;
-+ send_sig_info(vbl_sig->info.si_signo,
-+ &vbl_sig->info, vbl_sig->task);
-
-- list_del(&vbl_sig->head);
-+ list_del(&vbl_sig->head);
-
-- drm_free(vbl_sig, sizeof(*vbl_sig),
-- DRM_MEM_DRIVER);
-- atomic_dec(&dev->vbl_signal_pending);
-- drm_vblank_put(dev, crtc);
-- }
-+ drm_free(vbl_sig, sizeof(*vbl_sig),
-+ DRM_MEM_DRIVER);
-+
-+ dev->vbl_pending--;
-+ }
-+ }
- }
-
- spin_unlock_irqrestore(&dev->vbl_lock, flags);
- }
-
--/**
-- * drm_handle_vblank - handle a vblank event
-- * @dev: DRM device
-- * @crtc: where this event occurred
-- *
-- * Drivers should call this routine in their vblank interrupt handlers to
-- * update the vblank counter and send any signals that may be pending.
-- */
--void drm_handle_vblank(struct drm_device *dev, int crtc)
--{
-- drm_update_vblank_count(dev, crtc);
-- DRM_WAKEUP(&dev->vbl_queue[crtc]);
-- drm_vbl_send_signals(dev, crtc);
--}
--EXPORT_SYMBOL(drm_handle_vblank);
-+EXPORT_SYMBOL(drm_vbl_send_signals);
-
- /**
- * Tasklet wrapper function.
-diff --git a/drivers/char/drm/drm_lock.c b/drivers/char/drm/drm_lock.c
-index 12dcdd1..0998723 100644
---- a/drivers/char/drm/drm_lock.c
-+++ b/drivers/char/drm/drm_lock.c
-@@ -53,7 +53,6 @@ int drm_lock(struct drm_device *dev, void *data, struct drm_file *file_priv)
- DECLARE_WAITQUEUE(entry, current);
- struct drm_lock *lock = data;
- int ret = 0;
-- unsigned long irqflags;
-
- ++file_priv->lock_count;
-
-@@ -72,9 +71,9 @@ int drm_lock(struct drm_device *dev, void *data, struct drm_file *file_priv)
- return -EINVAL;
-
- add_wait_queue(&dev->lock.lock_queue, &entry);
-- spin_lock_irqsave(&dev->lock.spinlock, irqflags);
-+ spin_lock_bh(&dev->lock.spinlock);
- dev->lock.user_waiters++;
-- spin_unlock_irqrestore(&dev->lock.spinlock, irqflags);
-+ spin_unlock_bh(&dev->lock.spinlock);
- for (;;) {
- __set_current_state(TASK_INTERRUPTIBLE);
- if (!dev->lock.hw_lock) {
-@@ -96,9 +95,9 @@ int drm_lock(struct drm_device *dev, void *data, struct drm_file *file_priv)
- break;
- }
- }
-- spin_lock_irqsave(&dev->lock.spinlock, irqflags);
-+ spin_lock_bh(&dev->lock.spinlock);
- dev->lock.user_waiters--;
-- spin_unlock_irqrestore(&dev->lock.spinlock, irqflags);
-+ spin_unlock_bh(&dev->lock.spinlock);
- __set_current_state(TASK_RUNNING);
- remove_wait_queue(&dev->lock.lock_queue, &entry);
-
-@@ -199,9 +198,8 @@ int drm_lock_take(struct drm_lock_data *lock_data,
- {
- unsigned int old, new, prev;
- volatile unsigned int *lock = &lock_data->hw_lock->lock;
-- unsigned long irqflags;
-
-- spin_lock_irqsave(&lock_data->spinlock, irqflags);
-+ spin_lock_bh(&lock_data->spinlock);
- do {
- old = *lock;
- if (old & _DRM_LOCK_HELD)
-@@ -213,7 +211,7 @@ int drm_lock_take(struct drm_lock_data *lock_data,
- }
- prev = cmpxchg(lock, old, new);
- } while (prev != old);
-- spin_unlock_irqrestore(&lock_data->spinlock, irqflags);
-+ spin_unlock_bh(&lock_data->spinlock);
-
- if (_DRM_LOCKING_CONTEXT(old) == context) {
- if (old & _DRM_LOCK_HELD) {
-@@ -274,16 +272,15 @@ int drm_lock_free(struct drm_lock_data *lock_data, unsigned int context)
- {
- unsigned int old, new, prev;
- volatile unsigned int *lock = &lock_data->hw_lock->lock;
-- unsigned long irqflags;
-
-- spin_lock_irqsave(&lock_data->spinlock, irqflags);
-+ spin_lock_bh(&lock_data->spinlock);
- if (lock_data->kernel_waiters != 0) {
- drm_lock_transfer(lock_data, 0);
- lock_data->idle_has_lock = 1;
-- spin_unlock_irqrestore(&lock_data->spinlock, irqflags);
-+ spin_unlock_bh(&lock_data->spinlock);
- return 1;
- }
-- spin_unlock_irqrestore(&lock_data->spinlock, irqflags);
-+ spin_unlock_bh(&lock_data->spinlock);
-
- do {
- old = *lock;
-@@ -347,20 +344,19 @@ static int drm_notifier(void *priv)
- void drm_idlelock_take(struct drm_lock_data *lock_data)
- {
- int ret = 0;
-- unsigned long irqflags;
-
-- spin_lock_irqsave(&lock_data->spinlock, irqflags);
-+ spin_lock_bh(&lock_data->spinlock);
- lock_data->kernel_waiters++;
- if (!lock_data->idle_has_lock) {
-
-- spin_unlock_irqrestore(&lock_data->spinlock, irqflags);
-+ spin_unlock_bh(&lock_data->spinlock);
- ret = drm_lock_take(lock_data, DRM_KERNEL_CONTEXT);
-- spin_lock_irqsave(&lock_data->spinlock, irqflags);
-+ spin_lock_bh(&lock_data->spinlock);
-
- if (ret == 1)
- lock_data->idle_has_lock = 1;
- }
-- spin_unlock_irqrestore(&lock_data->spinlock, irqflags);
-+ spin_unlock_bh(&lock_data->spinlock);
- }
- EXPORT_SYMBOL(drm_idlelock_take);
-
-@@ -368,9 +364,8 @@ void drm_idlelock_release(struct drm_lock_data *lock_data)
- {
- unsigned int old, prev;
- volatile unsigned int *lock = &lock_data->hw_lock->lock;
-- unsigned long irqflags;
-
-- spin_lock_irqsave(&lock_data->spinlock, irqflags);
-+ spin_lock_bh(&lock_data->spinlock);
- if (--lock_data->kernel_waiters == 0) {
- if (lock_data->idle_has_lock) {
- do {
-@@ -381,7 +376,7 @@ void drm_idlelock_release(struct drm_lock_data *lock_data)
- lock_data->idle_has_lock = 0;
- }
- }
-- spin_unlock_irqrestore(&lock_data->spinlock, irqflags);
-+ spin_unlock_bh(&lock_data->spinlock);
- }
- EXPORT_SYMBOL(drm_idlelock_release);
-
-diff --git a/drivers/char/drm/drm_sysfs.c b/drivers/char/drm/drm_sysfs.c
-index 9a32169..af211a0 100644
---- a/drivers/char/drm/drm_sysfs.c
-+++ b/drivers/char/drm/drm_sysfs.c
-@@ -34,8 +34,6 @@ static int drm_sysfs_suspend(struct device *dev, pm_message_t state)
- struct drm_minor *drm_minor = to_drm_minor(dev);
- struct drm_device *drm_dev = drm_minor->dev;
-
-- printk(KERN_ERR "%s\n", __func__);
--
- if (drm_dev->driver->suspend)
- return drm_dev->driver->suspend(drm_dev, state);
-
-diff --git a/drivers/char/drm/i915_dma.c b/drivers/char/drm/i915_dma.c
-index f47e46e..8897434 100644
---- a/drivers/char/drm/i915_dma.c
-+++ b/drivers/char/drm/i915_dma.c
-@@ -415,13 +415,10 @@ static void i915_emit_breadcrumb(struct drm_device *dev)
- drm_i915_private_t *dev_priv = dev->dev_private;
- RING_LOCALS;
-
-- if (++dev_priv->counter > BREADCRUMB_MASK) {
-- dev_priv->counter = 1;
-- DRM_DEBUG("Breadcrumb counter wrapped around\n");
-- }
-+ dev_priv->sarea_priv->last_enqueue = ++dev_priv->counter;
-
-- if (dev_priv->sarea_priv)
-- dev_priv->sarea_priv->last_enqueue = dev_priv->counter;
-+ if (dev_priv->counter > 0x7FFFFFFFUL)
-+ dev_priv->sarea_priv->last_enqueue = dev_priv->counter = 1;
-
- BEGIN_LP_RING(4);
- OUT_RING(CMD_STORE_DWORD_IDX);
-@@ -431,26 +428,6 @@ static void i915_emit_breadcrumb(struct drm_device *dev)
- ADVANCE_LP_RING();
- }
-
--int i915_emit_mi_flush(struct drm_device *dev, uint32_t flush)
--{
-- drm_i915_private_t *dev_priv = dev->dev_private;
-- uint32_t flush_cmd = CMD_MI_FLUSH;
-- RING_LOCALS;
--
-- flush_cmd |= flush;
--
-- i915_kernel_lost_context(dev);
--
-- BEGIN_LP_RING(4);
-- OUT_RING(flush_cmd);
-- OUT_RING(0);
-- OUT_RING(0);
-- OUT_RING(0);
-- ADVANCE_LP_RING();
--
-- return 0;
--}
--
- static int i915_dispatch_cmdbuffer(struct drm_device * dev,
- drm_i915_cmdbuffer_t * cmd)
- {
-@@ -534,74 +511,52 @@ static int i915_dispatch_batchbuffer(struct drm_device * dev,
- return 0;
- }
-
--static void i915_do_dispatch_flip(struct drm_device * dev, int plane, int sync)
-+static int i915_dispatch_flip(struct drm_device * dev)
- {
- drm_i915_private_t *dev_priv = dev->dev_private;
-- u32 num_pages, current_page, next_page, dspbase;
-- int shift = 2 * plane, x, y;
- RING_LOCALS;
-
-- /* Calculate display base offset */
-- num_pages = dev_priv->sarea_priv->third_handle ? 3 : 2;
-- current_page = (dev_priv->sarea_priv->pf_current_page >> shift) & 0x3;
-- next_page = (current_page + 1) % num_pages;
-+ DRM_DEBUG("%s: page=%d pfCurrentPage=%d\n",
-+ __FUNCTION__,
-+ dev_priv->current_page,
-+ dev_priv->sarea_priv->pf_current_page);
-
-- switch (next_page) {
-- default:
-- case 0:
-- dspbase = dev_priv->sarea_priv->front_offset;
-- break;
-- case 1:
-- dspbase = dev_priv->sarea_priv->back_offset;
-- break;
-- case 2:
-- dspbase = dev_priv->sarea_priv->third_offset;
-- break;
-- }
-+ i915_kernel_lost_context(dev);
-+
-+ BEGIN_LP_RING(2);
-+ OUT_RING(INST_PARSER_CLIENT | INST_OP_FLUSH | INST_FLUSH_MAP_CACHE);
-+ OUT_RING(0);
-+ ADVANCE_LP_RING();
-
-- if (plane == 0) {
-- x = dev_priv->sarea_priv->planeA_x;
-- y = dev_priv->sarea_priv->planeA_y;
-+ BEGIN_LP_RING(6);
-+ OUT_RING(CMD_OP_DISPLAYBUFFER_INFO | ASYNC_FLIP);
-+ OUT_RING(0);
-+ if (dev_priv->current_page == 0) {
-+ OUT_RING(dev_priv->back_offset);
-+ dev_priv->current_page = 1;
- } else {
-- x = dev_priv->sarea_priv->planeB_x;
-- y = dev_priv->sarea_priv->planeB_y;
-+ OUT_RING(dev_priv->front_offset);
-+ dev_priv->current_page = 0;
- }
-+ OUT_RING(0);
-+ ADVANCE_LP_RING();
-
-- dspbase += (y * dev_priv->sarea_priv->pitch + x) * dev_priv->cpp;
-+ BEGIN_LP_RING(2);
-+ OUT_RING(MI_WAIT_FOR_EVENT | MI_WAIT_FOR_PLANE_A_FLIP);
-+ OUT_RING(0);
-+ ADVANCE_LP_RING();
-
-- DRM_DEBUG("plane=%d current_page=%d dspbase=0x%x\n", plane, current_page,
-- dspbase);
-+ dev_priv->sarea_priv->last_enqueue = dev_priv->counter++;
-
- BEGIN_LP_RING(4);
-- OUT_RING(sync ? 0 :
-- (MI_WAIT_FOR_EVENT | (plane ? MI_WAIT_FOR_PLANE_B_FLIP :
-- MI_WAIT_FOR_PLANE_A_FLIP)));
-- OUT_RING(CMD_OP_DISPLAYBUFFER_INFO | (sync ? 0 : ASYNC_FLIP) |
-- (plane ? DISPLAY_PLANE_B : DISPLAY_PLANE_A));
-- OUT_RING(dev_priv->sarea_priv->pitch * dev_priv->cpp);
-- OUT_RING(dspbase);
-+ OUT_RING(CMD_STORE_DWORD_IDX);
-+ OUT_RING(20);
-+ OUT_RING(dev_priv->counter);
-+ OUT_RING(0);
- ADVANCE_LP_RING();
-
-- dev_priv->sarea_priv->pf_current_page &= ~(0x3 << shift);
-- dev_priv->sarea_priv->pf_current_page |= next_page << shift;
--}
--
--void i915_dispatch_flip(struct drm_device * dev, int planes, int sync)
--{
-- drm_i915_private_t *dev_priv = dev->dev_private;
-- int i;
--
-- DRM_DEBUG("planes=0x%x pfCurrentPage=%d\n",
-- planes, dev_priv->sarea_priv->pf_current_page);
--
-- i915_emit_mi_flush(dev, MI_READ_FLUSH | MI_EXE_FLUSH);
--
-- for (i = 0; i < 2; i++)
-- if (planes & (1 << i))
-- i915_do_dispatch_flip(dev, i, sync);
--
-- i915_emit_breadcrumb(dev);
--
-+ dev_priv->sarea_priv->pf_current_page = dev_priv->current_page;
-+ return 0;
- }
-
- static int i915_quiescent(struct drm_device * dev)
-@@ -624,6 +579,7 @@ static int i915_batchbuffer(struct drm_device *dev, void *data,
- struct drm_file *file_priv)
- {
- drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
-+ u32 *hw_status = dev_priv->hw_status_page;
- drm_i915_sarea_t *sarea_priv = (drm_i915_sarea_t *)
- dev_priv->sarea_priv;
- drm_i915_batchbuffer_t *batch = data;
-@@ -646,7 +602,7 @@ static int i915_batchbuffer(struct drm_device *dev, void *data,
-
- ret = i915_dispatch_batchbuffer(dev, batch);
-
-- sarea_priv->last_dispatch = READ_BREADCRUMB(dev_priv);
-+ sarea_priv->last_dispatch = (int)hw_status[5];
- return ret;
- }
-
-@@ -654,6 +610,7 @@ static int i915_cmdbuffer(struct drm_device *dev, void *data,
- struct drm_file *file_priv)
- {
- drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
-+ u32 *hw_status = dev_priv->hw_status_page;
- drm_i915_sarea_t *sarea_priv = (drm_i915_sarea_t *)
- dev_priv->sarea_priv;
- drm_i915_cmdbuffer_t *cmdbuf = data;
-@@ -678,51 +635,18 @@ static int i915_cmdbuffer(struct drm_device *dev, void *data,
- return ret;
- }
-
-- sarea_priv->last_dispatch = READ_BREADCRUMB(dev_priv);
-- return 0;
--}
--
--static int i915_do_cleanup_pageflip(struct drm_device * dev)
--{
-- drm_i915_private_t *dev_priv = dev->dev_private;
-- int i, planes, num_pages = dev_priv->sarea_priv->third_handle ? 3 : 2;
--
-- DRM_DEBUG("\n");
--
-- for (i = 0, planes = 0; i < 2; i++)
-- if (dev_priv->sarea_priv->pf_current_page & (0x3 << (2 * i))) {
-- dev_priv->sarea_priv->pf_current_page =
-- (dev_priv->sarea_priv->pf_current_page &
-- ~(0x3 << (2 * i))) | ((num_pages - 1) << (2 * i));
--
-- planes |= 1 << i;
-- }
--
-- if (planes)
-- i915_dispatch_flip(dev, planes, 0);
--
-+ sarea_priv->last_dispatch = (int)hw_status[5];
- return 0;
- }
-
- static int i915_flip_bufs(struct drm_device *dev, void *data,
- struct drm_file *file_priv)
- {
-- drm_i915_flip_t *param = data;
--
-- DRM_DEBUG("\n");
-+ DRM_DEBUG("%s\n", __FUNCTION__);
-
- LOCK_TEST_WITH_RETURN(dev, file_priv);
-
-- /* This is really planes */
-- if (param->pipes & ~0x3) {
-- DRM_ERROR("Invalid planes 0x%x, only <= 0x3 is valid\n",
-- param->pipes);
-- return -EINVAL;
-- }
--
-- i915_dispatch_flip(dev, param->pipes, 0);
--
-- return 0;
-+ return i915_dispatch_flip(dev);
- }
-
- static int i915_getparam(struct drm_device *dev, void *data,
-@@ -883,8 +807,6 @@ void i915_driver_lastclose(struct drm_device * dev)
- if (!dev_priv)
- return;
-
-- if (drm_getsarea(dev) && dev_priv->sarea_priv)
-- i915_do_cleanup_pageflip(dev);
- if (dev_priv->agp_heap)
- i915_mem_takedown(&(dev_priv->agp_heap));
-
-diff --git a/drivers/char/drm/i915_drm.h b/drivers/char/drm/i915_drm.h
-index 0431c00..05c66cf 100644
---- a/drivers/char/drm/i915_drm.h
-+++ b/drivers/char/drm/i915_drm.h
-@@ -105,29 +105,14 @@ typedef struct _drm_i915_sarea {
- unsigned int rotated_tiled;
- unsigned int rotated2_tiled;
-
-- int planeA_x;
-- int planeA_y;
-- int planeA_w;
-- int planeA_h;
-- int planeB_x;
-- int planeB_y;
-- int planeB_w;
-- int planeB_h;
--
-- /* Triple buffering */
-- drm_handle_t third_handle;
-- int third_offset;
-- int third_size;
-- unsigned int third_tiled;
--
-- /* buffer object handles for the static buffers. May change
-- * over the lifetime of the client, though it doesn't in our current
-- * implementation.
-- */
-- unsigned int front_bo_handle;
-- unsigned int back_bo_handle;
-- unsigned int third_bo_handle;
-- unsigned int depth_bo_handle;
-+ int pipeA_x;
-+ int pipeA_y;
-+ int pipeA_w;
-+ int pipeA_h;
-+ int pipeB_x;
-+ int pipeB_y;
-+ int pipeB_w;
-+ int pipeB_h;
- } drm_i915_sarea_t;
-
- /* Flags for perf_boxes
-@@ -161,7 +146,7 @@ typedef struct _drm_i915_sarea {
-
- #define DRM_IOCTL_I915_INIT DRM_IOW( DRM_COMMAND_BASE + DRM_I915_INIT, drm_i915_init_t)
- #define DRM_IOCTL_I915_FLUSH DRM_IO ( DRM_COMMAND_BASE + DRM_I915_FLUSH)
--#define DRM_IOCTL_I915_FLIP DRM_IOW( DRM_COMMAND_BASE + DRM_I915_FLIP, drm_i915_flip_t)
-+#define DRM_IOCTL_I915_FLIP DRM_IO ( DRM_COMMAND_BASE + DRM_I915_FLIP)
- #define DRM_IOCTL_I915_BATCHBUFFER DRM_IOW( DRM_COMMAND_BASE + DRM_I915_BATCHBUFFER, drm_i915_batchbuffer_t)
- #define DRM_IOCTL_I915_IRQ_EMIT DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_IRQ_EMIT, drm_i915_irq_emit_t)
- #define DRM_IOCTL_I915_IRQ_WAIT DRM_IOW( DRM_COMMAND_BASE + DRM_I915_IRQ_WAIT, drm_i915_irq_wait_t)
-@@ -176,18 +161,6 @@ typedef struct _drm_i915_sarea {
- #define DRM_IOCTL_I915_GET_VBLANK_PIPE DRM_IOR( DRM_COMMAND_BASE + DRM_I915_GET_VBLANK_PIPE, drm_i915_vblank_pipe_t)
- #define DRM_IOCTL_I915_VBLANK_SWAP DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_VBLANK_SWAP, drm_i915_vblank_swap_t)
-
--/* Asynchronous page flipping:
-- */
--typedef struct drm_i915_flip {
-- /*
-- * This is really talking about planes, and we could rename it
-- * except for the fact that some of the duplicated i915_drm.h files
-- * out there check for HAVE_I915_FLIP and so might pick up this
-- * version.
-- */
-- int pipes;
--} drm_i915_flip_t;
--
- /* Allow drivers to submit batchbuffers directly to hardware, relying
- * on the security mechanisms provided by hardware.
- */
-diff --git a/drivers/char/drm/i915_drv.c b/drivers/char/drm/i915_drv.c
-index bb8f1b2..e8f3d68 100644
---- a/drivers/char/drm/i915_drv.c
-+++ b/drivers/char/drm/i915_drv.c
-@@ -147,7 +147,7 @@ static void i915_save_vga(struct drm_device *dev)
- i915_write_indexed(cr_index, cr_data, 0x11,
- i915_read_indexed(cr_index, cr_data, 0x11) &
- (~0x80));
-- for (i = 0; i < 0x24; i++)
-+ for (i = 0; i <= 0x24; i++)
- dev_priv->saveCR[i] =
- i915_read_indexed(cr_index, cr_data, i);
- /* Make sure we don't turn off CR group 0 writes */
-@@ -156,7 +156,7 @@ static void i915_save_vga(struct drm_device *dev)
- /* Attribute controller registers */
- inb(st01);
- dev_priv->saveAR_INDEX = inb(VGA_AR_INDEX);
-- for (i = 0; i < 20; i++)
-+ for (i = 0; i <= 0x14; i++)
- dev_priv->saveAR[i] = i915_read_ar(st01, i, 0);
- inb(st01);
- outb(dev_priv->saveAR_INDEX, VGA_AR_INDEX);
-@@ -206,7 +206,7 @@ static void i915_restore_vga(struct drm_device *dev)
- /* CRT controller regs */
- /* Enable CR group 0 writes */
- i915_write_indexed(cr_index, cr_data, 0x11, dev_priv->saveCR[0x11]);
-- for (i = 0; i < 0x24; i++)
-+ for (i = 0; i <= 0x24; i++)
- i915_write_indexed(cr_index, cr_data, i, dev_priv->saveCR[i]);
-
- /* Graphics controller regs */
-@@ -223,7 +223,7 @@ static void i915_restore_vga(struct drm_device *dev)
-
- /* Attribute controller registers */
- inb(st01);
-- for (i = 0; i < 20; i++)
-+ for (i = 0; i <= 0x14; i++)
- i915_write_ar(st01, i, dev_priv->saveAR[i], 0);
- inb(st01); /* switch back to index mode */
- outb(dev_priv->saveAR_INDEX | 0x20, VGA_AR_INDEX);
-@@ -256,6 +256,9 @@ static int i915_suspend(struct drm_device *dev, pm_message_t state)
- pci_save_state(dev->pdev);
- pci_read_config_byte(dev->pdev, LBB, &dev_priv->saveLBB);
-
-+ /* Display arbitration control */
-+ dev_priv->saveDSPARB = I915_READ(DSPARB);
-+
- /* Pipe & plane A info */
- dev_priv->savePIPEACONF = I915_READ(PIPEACONF);
- dev_priv->savePIPEASRC = I915_READ(PIPEASRC);
-@@ -349,6 +352,7 @@ static int i915_suspend(struct drm_device *dev, pm_message_t state)
- dev_priv->saveVGACNTRL = I915_READ(VGACNTRL);
-
- /* Clock gating state */
-+ dev_priv->saveD_STATE = I915_READ(D_STATE);
- dev_priv->saveDSPCLK_GATE_D = I915_READ(DSPCLK_GATE_D);
-
- /* Cache mode state */
-@@ -388,6 +392,8 @@ static int i915_resume(struct drm_device *dev)
-
- pci_write_config_byte(dev->pdev, LBB, dev_priv->saveLBB);
-
-+ I915_WRITE(DSPARB, dev_priv->saveDSPARB);
-+
- /* Pipe & plane A info */
- /* Prime the clock */
- if (dev_priv->saveDPLL_A & DPLL_VCO_ENABLE) {
-@@ -507,6 +513,7 @@ static int i915_resume(struct drm_device *dev)
- udelay(150);
-
- /* Clock gating state */
-+ I915_WRITE (D_STATE, dev_priv->saveD_STATE);
- I915_WRITE (DSPCLK_GATE_D, dev_priv->saveDSPCLK_GATE_D);
-
- /* Cache mode state */
-@@ -533,7 +540,8 @@ static struct drm_driver driver = {
- */
- .driver_features =
- DRIVER_USE_AGP | DRIVER_REQUIRE_AGP | /* DRIVER_USE_MTRR |*/
-- DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED,
-+ DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED | DRIVER_IRQ_VBL |
-+ DRIVER_IRQ_VBL2,
- .load = i915_driver_load,
- .unload = i915_driver_unload,
- .lastclose = i915_driver_lastclose,
-@@ -541,9 +549,8 @@ static struct drm_driver driver = {
- .suspend = i915_suspend,
- .resume = i915_resume,
- .device_is_agp = i915_driver_device_is_agp,
-- .get_vblank_counter = i915_get_vblank_counter,
-- .enable_vblank = i915_enable_vblank,
-- .disable_vblank = i915_disable_vblank,
-+ .vblank_wait = i915_driver_vblank_wait,
-+ .vblank_wait2 = i915_driver_vblank_wait2,
- .irq_preinstall = i915_driver_irq_preinstall,
- .irq_postinstall = i915_driver_irq_postinstall,
- .irq_uninstall = i915_driver_irq_uninstall,
-diff --git a/drivers/char/drm/i915_drv.h b/drivers/char/drm/i915_drv.h
-index db7001f..1b20f7c 100644
---- a/drivers/char/drm/i915_drv.h
-+++ b/drivers/char/drm/i915_drv.h
-@@ -76,9 +76,8 @@ struct mem_block {
- typedef struct _drm_i915_vbl_swap {
- struct list_head head;
- drm_drawable_t drw_id;
-- unsigned int plane;
-+ unsigned int pipe;
- unsigned int sequence;
-- int flip;
- } drm_i915_vbl_swap_t;
-
- typedef struct drm_i915_private {
-@@ -91,7 +90,7 @@ typedef struct drm_i915_private {
- drm_dma_handle_t *status_page_dmah;
- void *hw_status_page;
- dma_addr_t dma_status_page;
-- uint32_t counter;
-+ unsigned long counter;
- unsigned int status_gfx_addr;
- drm_local_map_t hws_map;
-
-@@ -104,18 +103,13 @@ typedef struct drm_i915_private {
-
- wait_queue_head_t irq_queue;
- atomic_t irq_received;
-- atomic_t irq_emited;
-+ atomic_t irq_emitted;
-
- int tex_lru_log_granularity;
- int allow_batchbuffer;
- struct mem_block *agp_heap;
- unsigned int sr01, adpa, ppcr, dvob, dvoc, lvds;
- int vblank_pipe;
-- spinlock_t user_irq_lock;
-- int user_irq_refcount;
-- int fence_irq_on;
-- uint32_t irq_enable_reg;
-- int irq_enabled;
-
- spinlock_t swaps_lock;
- drm_i915_vbl_swap_t vbl_swaps;
-@@ -125,6 +119,7 @@ typedef struct drm_i915_private {
- u8 saveLBB;
- u32 saveDSPACNTR;
- u32 saveDSPBCNTR;
-+ u32 saveDSPARB;
- u32 savePIPEACONF;
- u32 savePIPEBCONF;
- u32 savePIPEASRC;
-@@ -194,6 +189,7 @@ typedef struct drm_i915_private {
- u32 saveIIR;
- u32 saveIMR;
- u32 saveCACHE_MODE_0;
-+ u32 saveD_STATE;
- u32 saveDSPCLK_GATE_D;
- u32 saveMI_ARB_STATE;
- u32 saveSWF0[16];
-@@ -203,10 +199,10 @@ typedef struct drm_i915_private {
- u8 saveSR[8];
- u8 saveGR[25];
- u8 saveAR_INDEX;
-- u8 saveAR[20];
-+ u8 saveAR[21];
- u8 saveDACMASK;
- u8 saveDACDATA[256*3]; /* 256 3-byte colors */
-- u8 saveCR[36];
-+ u8 saveCR[37];
- } drm_i915_private_t;
-
- extern struct drm_ioctl_desc i915_ioctls[];
-@@ -222,7 +218,7 @@ extern void i915_driver_preclose(struct drm_device *dev,
- extern int i915_driver_device_is_agp(struct drm_device * dev);
- extern long i915_compat_ioctl(struct file *filp, unsigned int cmd,
- unsigned long arg);
--extern void i915_dispatch_flip(struct drm_device * dev, int pipes, int sync);
-+
- /* i915_irq.c */
- extern int i915_irq_emit(struct drm_device *dev, void *data,
- struct drm_file *file_priv);
-@@ -233,7 +229,7 @@ extern int i915_driver_vblank_wait(struct drm_device *dev, unsigned int *sequenc
- extern int i915_driver_vblank_wait2(struct drm_device *dev, unsigned int *sequence);
- extern irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS);
- extern void i915_driver_irq_preinstall(struct drm_device * dev);
--extern int i915_driver_irq_postinstall(struct drm_device * dev);
-+extern void i915_driver_irq_postinstall(struct drm_device * dev);
- extern void i915_driver_irq_uninstall(struct drm_device * dev);
- extern int i915_vblank_pipe_set(struct drm_device *dev, void *data,
- struct drm_file *file_priv);
-@@ -241,9 +237,6 @@ extern int i915_vblank_pipe_get(struct drm_device *dev, void *data,
- struct drm_file *file_priv);
- extern int i915_vblank_swap(struct drm_device *dev, void *data,
- struct drm_file *file_priv);
--extern int i915_enable_vblank(struct drm_device *dev, int crtc);
--extern void i915_disable_vblank(struct drm_device *dev, int crtc);
--extern u32 i915_get_vblank_counter(struct drm_device *dev, int crtc);
-
- /* i915_mem.c */
- extern int i915_mem_alloc(struct drm_device *dev, void *data,
-@@ -388,91 +381,21 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);
-
- /* Interrupt bits:
- */
--#define I915_PIPE_CONTROL_NOTIFY_INTERRUPT (1<<18)
--#define I915_DISPLAY_PORT_INTERRUPT (1<<17)
--#define I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT (1<<15)
--#define I915_GMCH_THERMAL_SENSOR_EVENT_INTERRUPT (1<<14)
--#define I915_HWB_OOM_INTERRUPT (1<<13) /* binner out of memory */
--#define I915_SYNC_STATUS_INTERRUPT (1<<12)
--#define I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT (1<<11)
--#define I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT (1<<10)
--#define I915_OVERLAY_PLANE_FLIP_PENDING_INTERRUPT (1<<9)
--#define I915_DISPLAY_PLANE_C_FLIP_PENDING_INTERRUPT (1<<8)
--#define I915_DISPLAY_PIPE_A_VBLANK_INTERRUPT (1<<7)
--#define I915_DISPLAY_PIPE_A_EVENT_INTERRUPT (1<<6)
--#define I915_DISPLAY_PIPE_B_VBLANK_INTERRUPT (1<<5)
--#define I915_DISPLAY_PIPE_B_EVENT_INTERRUPT (1<<4)
--#define I915_DEBUG_INTERRUPT (1<<2)
--#define I915_USER_INTERRUPT (1<<1)
--
-+#define USER_INT_FLAG (1<<1)
-+#define VSYNC_PIPEB_FLAG (1<<5)
-+#define VSYNC_PIPEA_FLAG (1<<7)
-+#define HWB_OOM_FLAG (1<<13) /* binner out of memory */
-
- #define I915REG_HWSTAM 0x02098
- #define I915REG_INT_IDENTITY_R 0x020a4
- #define I915REG_INT_MASK_R 0x020a8
- #define I915REG_INT_ENABLE_R 0x020a0
--#define I915REG_INSTPM 0x020c0
--
--#define PIPEADSL 0x70000
--#define PIPEBDSL 0x71000
-
- #define I915REG_PIPEASTAT 0x70024
- #define I915REG_PIPEBSTAT 0x71024
--/*
-- * The two pipe frame counter registers are not synchronized, so
-- * reading a stable value is somewhat tricky. The following code
-- * should work:
-- *
-- * do {
-- * high1 = ((INREG(PIPEAFRAMEHIGH) & PIPE_FRAME_HIGH_MASK) >>
-- * PIPE_FRAME_HIGH_SHIFT;
-- * low1 = ((INREG(PIPEAFRAMEPIXEL) & PIPE_FRAME_LOW_MASK) >>
-- * PIPE_FRAME_LOW_SHIFT);
-- * high2 = ((INREG(PIPEAFRAMEHIGH) & PIPE_FRAME_HIGH_MASK) >>
-- * PIPE_FRAME_HIGH_SHIFT);
-- * } while (high1 != high2);
-- * frame = (high1 << 8) | low1;
-- */
--#define PIPEAFRAMEHIGH 0x70040
--#define PIPEBFRAMEHIGH 0x71040
--#define PIPE_FRAME_HIGH_MASK 0x0000ffff
--#define PIPE_FRAME_HIGH_SHIFT 0
--#define PIPEAFRAMEPIXEL 0x70044
--#define PIPEBFRAMEPIXEL 0x71044
-
--#define PIPE_FRAME_LOW_MASK 0xff000000
--#define PIPE_FRAME_LOW_SHIFT 24
--/*
-- * Pixel within the current frame is counted in the PIPEAFRAMEPIXEL register
-- * and is 24 bits wide.
-- */
--#define PIPE_PIXEL_MASK 0x00ffffff
--#define PIPE_PIXEL_SHIFT 0
--
--#define I915_FIFO_UNDERRUN_STATUS (1UL<<31)
--#define I915_CRC_ERROR_ENABLE (1UL<<29)
--#define I915_CRC_DONE_ENABLE (1UL<<28)
--#define I915_GMBUS_EVENT_ENABLE (1UL<<27)
--#define I915_VSYNC_INTERRUPT_ENABLE (1UL<<25)
--#define I915_DISPLAY_LINE_COMPARE_ENABLE (1UL<<24)
--#define I915_DPST_EVENT_ENABLE (1UL<<23)
--#define I915_LEGACY_BLC_EVENT_ENABLE (1UL<<22)
--#define I915_ODD_FIELD_INTERRUPT_ENABLE (1UL<<21)
--#define I915_EVEN_FIELD_INTERRUPT_ENABLE (1UL<<20)
--#define I915_START_VBLANK_INTERRUPT_ENABLE (1UL<<18) /* 965 or later */
--#define I915_VBLANK_INTERRUPT_ENABLE (1UL<<17)
--#define I915_OVERLAY_UPDATED_ENABLE (1UL<<16)
--#define I915_CRC_ERROR_INTERRUPT_STATUS (1UL<<13)
--#define I915_CRC_DONE_INTERRUPT_STATUS (1UL<<12)
--#define I915_GMBUS_INTERRUPT_STATUS (1UL<<11)
--#define I915_VSYNC_INTERRUPT_STATUS (1UL<<9)
--#define I915_DISPLAY_LINE_COMPARE_STATUS (1UL<<8)
--#define I915_DPST_EVENT_STATUS (1UL<<7)
--#define I915_LEGACY_BLC_EVENT_STATUS (1UL<<6)
--#define I915_ODD_FIELD_INTERRUPT_STATUS (1UL<<5)
--#define I915_EVEN_FIELD_INTERRUPT_STATUS (1UL<<4)
--#define I915_START_VBLANK_INTERRUPT_STATUS (1UL<<2) /* 965 or later */
--#define I915_VBLANK_INTERRUPT_STATUS (1UL<<1)
--#define I915_OVERLAY_UPDATED_STATUS (1UL<<0)
-+#define I915_VBLANK_INTERRUPT_ENABLE (1UL<<17)
-+#define I915_VBLANK_CLEAR (1UL<<1)
-
- #define SRX_INDEX 0x3c4
- #define SRX_DATA 0x3c5
-@@ -749,6 +672,8 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);
- /** P1 value is 2 greater than this field */
- # define VGA0_PD_P1_MASK (0x1f << 0)
-
-+/* PCI D state control register */
-+#define D_STATE 0x6104
- #define DSPCLK_GATE_D 0x6200
-
- /* I830 CRTC registers */
-@@ -1059,6 +984,12 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);
- #define PIPECONF_INTERLACE_W_FIELD_INDICATION (6 << 21)
- #define PIPECONF_INTERLACE_FIELD_0_ONLY (7 << 21)
-
-+#define DSPARB 0x70030
-+#define DSPARB_CSTART_MASK (0x7f << 7)
-+#define DSPARB_CSTART_SHIFT 7
-+#define DSPARB_BSTART_MASK (0x7f)
-+#define DSPARB_BSTART_SHIFT 0
-+
- #define PIPEBCONF 0x71008
- #define PIPEBCONF_ENABLE (1<<31)
- #define PIPEBCONF_DISABLE 0
-diff --git a/drivers/char/drm/i915_irq.c b/drivers/char/drm/i915_irq.c
-index 023ce66..f7f16e7 100644
---- a/drivers/char/drm/i915_irq.c
-+++ b/drivers/char/drm/i915_irq.c
-@@ -38,109 +38,6 @@
- #define MAX_NOPID ((u32)~0)
-
- /**
-- * i915_get_pipe - return the the pipe associated with a given plane
-- * @dev: DRM device
-- * @plane: plane to look for
-- *
-- * The Intel Mesa & 2D drivers call the vblank routines with a plane number
-- * rather than a pipe number, since they may not always be equal. This routine
-- * maps the given @plane back to a pipe number.
-- */
--static int
--i915_get_pipe(struct drm_device *dev, int plane)
--{
-- drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
-- u32 dspcntr;
--
-- dspcntr = plane ? I915_READ(DSPBCNTR) : I915_READ(DSPACNTR);
--
-- return dspcntr & DISPPLANE_SEL_PIPE_MASK ? 1 : 0;
--}
--
--/**
-- * i915_get_plane - return the the plane associated with a given pipe
-- * @dev: DRM device
-- * @pipe: pipe to look for
-- *
-- * The Intel Mesa & 2D drivers call the vblank routines with a plane number
-- * rather than a plane number, since they may not always be equal. This routine
-- * maps the given @pipe back to a plane number.
-- */
--static int
--i915_get_plane(struct drm_device *dev, int pipe)
--{
-- if (i915_get_pipe(dev, 0) == pipe)
-- return 0;
-- return 1;
--}
--
--/**
-- * i915_pipe_enabled - check if a pipe is enabled
-- * @dev: DRM device
-- * @pipe: pipe to check
-- *
-- * Reading certain registers when the pipe is disabled can hang the chip.
-- * Use this routine to make sure the PLL is running and the pipe is active
-- * before reading such registers if unsure.
-- */
--static int
--i915_pipe_enabled(struct drm_device *dev, int pipe)
--{
-- drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
-- unsigned long pipeconf = pipe ? PIPEBCONF : PIPEACONF;
--
-- if (I915_READ(pipeconf) & PIPEACONF_ENABLE)
-- return 1;
--
-- return 0;
--}
--
--/**
-- * Emit a synchronous flip.
-- *
-- * This function must be called with the drawable spinlock held.
-- */
--static void
--i915_dispatch_vsync_flip(struct drm_device *dev, struct drm_drawable_info *drw,
-- int plane)
--{
-- drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
-- drm_i915_sarea_t *sarea_priv = dev_priv->sarea_priv;
-- u16 x1, y1, x2, y2;
-- int pf_planes = 1 << plane;
--
-- /* If the window is visible on the other plane, we have to flip on that
-- * plane as well.
-- */
-- if (plane == 1) {
-- x1 = sarea_priv->planeA_x;
-- y1 = sarea_priv->planeA_y;
-- x2 = x1 + sarea_priv->planeA_w;
-- y2 = y1 + sarea_priv->planeA_h;
-- } else {
-- x1 = sarea_priv->planeB_x;
-- y1 = sarea_priv->planeB_y;
-- x2 = x1 + sarea_priv->planeB_w;
-- y2 = y1 + sarea_priv->planeB_h;
-- }
--
-- if (x2 > 0 && y2 > 0) {
-- int i, num_rects = drw->num_rects;
-- struct drm_clip_rect *rect = drw->rects;
--
-- for (i = 0; i < num_rects; i++)
-- if (!(rect[i].x1 >= x2 || rect[i].y1 >= y2 ||
-- rect[i].x2 <= x1 || rect[i].y2 <= y1)) {
-- pf_planes = 0x3;
--
-- break;
-- }
-- }
--
-- i915_dispatch_flip(dev, pf_planes, 1);
--}
--
--/**
- * Emit blits for scheduled buffer swaps.
- *
- * This function will be called with the HW lock held.
-@@ -148,19 +45,20 @@ i915_dispatch_vsync_flip(struct drm_device *dev, struct drm_drawable_info *drw,
- static void i915_vblank_tasklet(struct drm_device *dev)
- {
- drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
-+ unsigned long irqflags;
- struct list_head *list, *tmp, hits, *hit;
-- int nhits, nrects, slice[2], upper[2], lower[2], i, num_pages;
-- unsigned counter[2];
-+ int nhits, nrects, slice[2], upper[2], lower[2], i;
-+ unsigned counter[2] = { atomic_read(&dev->vbl_received),
-+ atomic_read(&dev->vbl_received2) };
- struct drm_drawable_info *drw;
- drm_i915_sarea_t *sarea_priv = dev_priv->sarea_priv;
-- u32 cpp = dev_priv->cpp, offsets[3];
-+ u32 cpp = dev_priv->cpp;
- u32 cmd = (cpp == 4) ? (XY_SRC_COPY_BLT_CMD |
- XY_SRC_COPY_BLT_WRITE_ALPHA |
- XY_SRC_COPY_BLT_WRITE_RGB)
- : XY_SRC_COPY_BLT_CMD;
- u32 src_pitch = sarea_priv->pitch * cpp;
- u32 dst_pitch = sarea_priv->pitch * cpp;
-- /* COPY rop (0xcc), map cpp to magic color depth constants */
- u32 ropcpp = (0xcc << 16) | ((cpp - 1) << 24);
- RING_LOCALS;
-
-@@ -173,34 +71,24 @@ static void i915_vblank_tasklet(struct drm_device *dev)
- src_pitch >>= 2;
- }
-
-- counter[0] = drm_vblank_count(dev, 0);
-- counter[1] = drm_vblank_count(dev, 1);
--
- DRM_DEBUG("\n");
-
- INIT_LIST_HEAD(&hits);
-
- nhits = nrects = 0;
-
-- /* No irqsave/restore necessary. This tasklet may be run in an
-- * interrupt context or normal context, but we don't have to worry
-- * about getting interrupted by something acquiring the lock, because
-- * we are the interrupt context thing that acquires the lock.
-- */
-- spin_lock(&dev_priv->swaps_lock);
-+ spin_lock_irqsave(&dev_priv->swaps_lock, irqflags);
-
- /* Find buffer swaps scheduled for this vertical blank */
- list_for_each_safe(list, tmp, &dev_priv->vbl_swaps.head) {
- drm_i915_vbl_swap_t *vbl_swap =
- list_entry(list, drm_i915_vbl_swap_t, head);
-- int pipe = i915_get_pipe(dev, vbl_swap->plane);
-
-- if ((counter[pipe] - vbl_swap->sequence) > (1<<23))
-+ if ((counter[vbl_swap->pipe] - vbl_swap->sequence) > (1<<23))
- continue;
-
- list_del(list);
- dev_priv->swaps_pending--;
-- drm_vblank_put(dev, pipe);
-
- spin_unlock(&dev_priv->swaps_lock);
- spin_lock(&dev->drw_lock);
-@@ -238,23 +126,43 @@ static void i915_vblank_tasklet(struct drm_device *dev)
- spin_lock(&dev_priv->swaps_lock);
- }
-
-- spin_unlock(&dev_priv->swaps_lock);
--
-- if (nhits == 0)
-+ if (nhits == 0) {
-+ spin_unlock_irqrestore(&dev_priv->swaps_lock, irqflags);
- return;
-+ }
-+
-+ spin_unlock(&dev_priv->swaps_lock);
-
- i915_kernel_lost_context(dev);
-
-- upper[0] = upper[1] = 0;
-- slice[0] = max(sarea_priv->planeA_h / nhits, 1);
-- slice[1] = max(sarea_priv->planeB_h / nhits, 1);
-- lower[0] = sarea_priv->planeA_y + slice[0];
-- lower[1] = sarea_priv->planeB_y + slice[0];
-+ if (IS_I965G(dev)) {
-+ BEGIN_LP_RING(4);
-+
-+ OUT_RING(GFX_OP_DRAWRECT_INFO_I965);
-+ OUT_RING(0);
-+ OUT_RING(((sarea_priv->width - 1) & 0xffff) | ((sarea_priv->height - 1) << 16));
-+ OUT_RING(0);
-+ ADVANCE_LP_RING();
-+ } else {
-+ BEGIN_LP_RING(6);
-
-- offsets[0] = sarea_priv->front_offset;
-- offsets[1] = sarea_priv->back_offset;
-- offsets[2] = sarea_priv->third_offset;
-- num_pages = sarea_priv->third_handle ? 3 : 2;
-+ OUT_RING(GFX_OP_DRAWRECT_INFO);
-+ OUT_RING(0);
-+ OUT_RING(0);
-+ OUT_RING(sarea_priv->width | sarea_priv->height << 16);
-+ OUT_RING(sarea_priv->width | sarea_priv->height << 16);
-+ OUT_RING(0);
-+
-+ ADVANCE_LP_RING();
-+ }
-+
-+ sarea_priv->ctxOwner = DRM_KERNEL_CONTEXT;
-+
-+ upper[0] = upper[1] = 0;
-+ slice[0] = max(sarea_priv->pipeA_h / nhits, 1);
-+ slice[1] = max(sarea_priv->pipeB_h / nhits, 1);
-+ lower[0] = sarea_priv->pipeA_y + slice[0];
-+ lower[1] = sarea_priv->pipeB_y + slice[0];
-
- spin_lock(&dev->drw_lock);
-
-@@ -266,8 +174,6 @@ static void i915_vblank_tasklet(struct drm_device *dev)
- for (i = 0; i++ < nhits;
- upper[0] = lower[0], lower[0] += slice[0],
- upper[1] = lower[1], lower[1] += slice[1]) {
-- int init_drawrect = 1;
--
- if (i == nhits)
- lower[0] = lower[1] = sarea_priv->height;
-
-@@ -275,7 +181,7 @@ static void i915_vblank_tasklet(struct drm_device *dev)
- drm_i915_vbl_swap_t *swap_hit =
- list_entry(hit, drm_i915_vbl_swap_t, head);
- struct drm_clip_rect *rect;
-- int num_rects, plane, front, back;
-+ int num_rects, pipe;
- unsigned short top, bottom;
-
- drw = drm_get_drawable_info(dev, swap_hit->drw_id);
-@@ -283,50 +189,10 @@ static void i915_vblank_tasklet(struct drm_device *dev)
- if (!drw)
- continue;
-
-- plane = swap_hit->plane;
--
-- if (swap_hit->flip) {
-- i915_dispatch_vsync_flip(dev, drw, plane);
-- continue;
-- }
--
-- if (init_drawrect) {
-- int width = sarea_priv->width;
-- int height = sarea_priv->height;
-- if (IS_I965G(dev)) {
-- BEGIN_LP_RING(4);
--
-- OUT_RING(GFX_OP_DRAWRECT_INFO_I965);
-- OUT_RING(0);
-- OUT_RING(((width - 1) & 0xffff) | ((height - 1) << 16));
-- OUT_RING(0);
--
-- ADVANCE_LP_RING();
-- } else {
-- BEGIN_LP_RING(6);
--
-- OUT_RING(GFX_OP_DRAWRECT_INFO);
-- OUT_RING(0);
-- OUT_RING(0);
-- OUT_RING(((width - 1) & 0xffff) | ((height - 1) << 16));
-- OUT_RING(0);
-- OUT_RING(0);
--
-- ADVANCE_LP_RING();
-- }
--
-- sarea_priv->ctxOwner = DRM_KERNEL_CONTEXT;
--
-- init_drawrect = 0;
-- }
--
- rect = drw->rects;
-- top = upper[plane];
-- bottom = lower[plane];
--
-- front = (dev_priv->sarea_priv->pf_current_page >>
-- (2 * plane)) & 0x3;
-- back = (front + 1) % num_pages;
-+ pipe = swap_hit->pipe;
-+ top = upper[pipe];
-+ bottom = lower[pipe];
-
- for (num_rects = drw->num_rects; num_rects--; rect++) {
- int y1 = max(rect->y1, top);
-@@ -341,17 +207,17 @@ static void i915_vblank_tasklet(struct drm_device *dev)
- OUT_RING(ropcpp | dst_pitch);
- OUT_RING((y1 << 16) | rect->x1);
- OUT_RING((y2 << 16) | rect->x2);
-- OUT_RING(offsets[front]);
-+ OUT_RING(sarea_priv->front_offset);
- OUT_RING((y1 << 16) | rect->x1);
- OUT_RING(src_pitch);
-- OUT_RING(offsets[back]);
-+ OUT_RING(sarea_priv->back_offset);
-
- ADVANCE_LP_RING();
- }
- }
- }
-
-- spin_unlock(&dev->drw_lock);
-+ spin_unlock_irqrestore(&dev->drw_lock, irqflags);
-
- list_for_each_safe(hit, tmp, &hits) {
- drm_i915_vbl_swap_t *swap_hit =
-@@ -363,112 +229,67 @@ static void i915_vblank_tasklet(struct drm_device *dev)
- }
- }
-
--u32 i915_get_vblank_counter(struct drm_device *dev, int plane)
--{
-- drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
-- unsigned long high_frame;
-- unsigned long low_frame;
-- u32 high1, high2, low, count;
-- int pipe;
--
-- pipe = i915_get_pipe(dev, plane);
-- high_frame = pipe ? PIPEBFRAMEHIGH : PIPEAFRAMEHIGH;
-- low_frame = pipe ? PIPEBFRAMEPIXEL : PIPEAFRAMEPIXEL;
--
-- if (!i915_pipe_enabled(dev, pipe)) {
-- printk(KERN_ERR "trying to get vblank count for disabled "
-- "pipe %d\n", pipe);
-- return 0;
-- }
--
-- /*
-- * High & low register fields aren't synchronized, so make sure
-- * we get a low value that's stable across two reads of the high
-- * register.
-- */
-- do {
-- high1 = ((I915_READ(high_frame) & PIPE_FRAME_HIGH_MASK) >>
-- PIPE_FRAME_HIGH_SHIFT);
-- low = ((I915_READ(low_frame) & PIPE_FRAME_LOW_MASK) >>
-- PIPE_FRAME_LOW_SHIFT);
-- high2 = ((I915_READ(high_frame) & PIPE_FRAME_HIGH_MASK) >>
-- PIPE_FRAME_HIGH_SHIFT);
-- } while (high1 != high2);
--
-- count = (high1 << 8) | low;
--
-- /* count may be reset by other driver(e.g. 2D driver),
-- we have no way to know if it is wrapped or resetted
-- when count is zero. do a rough guess.
-- */
-- if (count == 0 && dev->last_vblank[pipe] < dev->max_vblank_count/2)
-- dev->last_vblank[pipe] = 0;
--
-- return count;
--}
--
- irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS)
- {
- struct drm_device *dev = (struct drm_device *) arg;
- drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
-- u32 iir;
-+ u16 temp;
- u32 pipea_stats, pipeb_stats;
-- int vblank = 0;
--
-- iir = I915_READ(I915REG_INT_IDENTITY_R);
-- if (iir == 0) {
-- DRM_DEBUG ("iir 0x%08x im 0x%08x ie 0x%08x pipea 0x%08x pipeb 0x%08x\n",
-- iir,
-- I915_READ(I915REG_INT_MASK_R),
-- I915_READ(I915REG_INT_ENABLE_R),
-- I915_READ(I915REG_PIPEASTAT),
-- I915_READ(I915REG_PIPEBSTAT));
-- return IRQ_NONE;
-- }
-
-- /*
-- * Clear the PIPE(A|B)STAT regs before the IIR otherwise
-- * we may get extra interrupts.
-- */
-- if (iir & I915_DISPLAY_PIPE_A_EVENT_INTERRUPT) {
-- pipea_stats = I915_READ(I915REG_PIPEASTAT);
-- if (pipea_stats & (I915_START_VBLANK_INTERRUPT_STATUS|
-- I915_VBLANK_INTERRUPT_STATUS))
-- {
-- vblank++;
-- drm_handle_vblank(dev, i915_get_plane(dev, 0));
-- }
-- I915_WRITE(I915REG_PIPEASTAT, pipea_stats);
-- }
-- if (iir & I915_DISPLAY_PIPE_B_EVENT_INTERRUPT) {
-- pipeb_stats = I915_READ(I915REG_PIPEBSTAT);
-- if (pipeb_stats & (I915_START_VBLANK_INTERRUPT_STATUS|
-- I915_VBLANK_INTERRUPT_STATUS))
-- {
-- vblank++;
-- drm_handle_vblank(dev, i915_get_plane(dev, 1));
-- }
-- I915_WRITE(I915REG_PIPEBSTAT, pipeb_stats);
-- }
-+ pipea_stats = I915_READ(I915REG_PIPEASTAT);
-+ pipeb_stats = I915_READ(I915REG_PIPEBSTAT);
-
-- if (dev_priv->sarea_priv)
-- dev_priv->sarea_priv->last_dispatch = READ_BREADCRUMB(dev_priv);
-+ temp = I915_READ16(I915REG_INT_IDENTITY_R);
-
-- I915_WRITE(I915REG_INT_IDENTITY_R, iir);
-- (void) I915_READ(I915REG_INT_IDENTITY_R); /* Flush posted write */
-+ temp &= (USER_INT_FLAG | VSYNC_PIPEA_FLAG | VSYNC_PIPEB_FLAG);
-
-- if (iir & I915_USER_INTERRUPT) {
-+ DRM_DEBUG("%s flag=%08x\n", __FUNCTION__, temp);
-+
-+ if (temp == 0)
-+ return IRQ_NONE;
-+
-+ I915_WRITE16(I915REG_INT_IDENTITY_R, temp);
-+ (void) I915_READ16(I915REG_INT_IDENTITY_R);
-+ DRM_READMEMORYBARRIER();
-+
-+ dev_priv->sarea_priv->last_dispatch = READ_BREADCRUMB(dev_priv);
-+
-+ if (temp & USER_INT_FLAG)
- DRM_WAKEUP(&dev_priv->irq_queue);
-- }
-- if (vblank) {
-+
-+ if (temp & (VSYNC_PIPEA_FLAG | VSYNC_PIPEB_FLAG)) {
-+ int vblank_pipe = dev_priv->vblank_pipe;
-+
-+ if ((vblank_pipe &
-+ (DRM_I915_VBLANK_PIPE_A | DRM_I915_VBLANK_PIPE_B))
-+ == (DRM_I915_VBLANK_PIPE_A | DRM_I915_VBLANK_PIPE_B)) {
-+ if (temp & VSYNC_PIPEA_FLAG)
-+ atomic_inc(&dev->vbl_received);
-+ if (temp & VSYNC_PIPEB_FLAG)
-+ atomic_inc(&dev->vbl_received2);
-+ } else if (((temp & VSYNC_PIPEA_FLAG) &&
-+ (vblank_pipe & DRM_I915_VBLANK_PIPE_A)) ||
-+ ((temp & VSYNC_PIPEB_FLAG) &&
-+ (vblank_pipe & DRM_I915_VBLANK_PIPE_B)))
-+ atomic_inc(&dev->vbl_received);
-+
-+ DRM_WAKEUP(&dev->vbl_queue);
-+ drm_vbl_send_signals(dev);
-+
- if (dev_priv->swaps_pending > 0)
- drm_locked_tasklet(dev, i915_vblank_tasklet);
-+ I915_WRITE(I915REG_PIPEASTAT,
-+ pipea_stats|I915_VBLANK_INTERRUPT_ENABLE|
-+ I915_VBLANK_CLEAR);
-+ I915_WRITE(I915REG_PIPEBSTAT,
-+ pipeb_stats|I915_VBLANK_INTERRUPT_ENABLE|
-+ I915_VBLANK_CLEAR);
- }
-
- return IRQ_HANDLED;
- }
-
--static int i915_emit_irq(struct drm_device *dev)
-+static int i915_emit_irq(struct drm_device * dev)
- {
- drm_i915_private_t *dev_priv = dev->dev_private;
- RING_LOCALS;
-@@ -515,12 +336,42 @@ static int i915_wait_irq(struct drm_device * dev, int irq_nr)
- READ_BREADCRUMB(dev_priv), (int)dev_priv->counter);
- }
-
-- if (dev_priv->sarea_priv)
-- dev_priv->sarea_priv->last_dispatch =
-- READ_BREADCRUMB(dev_priv);
-+ dev_priv->sarea_priv->last_dispatch = READ_BREADCRUMB(dev_priv);
- return ret;
- }
-
-+static int i915_driver_vblank_do_wait(struct drm_device *dev, unsigned int *sequence,
-+ atomic_t *counter)
-+{
-+ drm_i915_private_t *dev_priv = dev->dev_private;
-+ unsigned int cur_vblank;
-+ int ret = 0;
-+
-+ if (!dev_priv) {
-+ DRM_ERROR("called with no initialization\n");
-+ return -EINVAL;
-+ }
-+
-+ DRM_WAIT_ON(ret, dev->vbl_queue, 3 * DRM_HZ,
-+ (((cur_vblank = atomic_read(counter))
-+ - *sequence) <= (1<<23)));
-+
-+ *sequence = cur_vblank;
-+
-+ return ret;
-+}
-+
-+
-+int i915_driver_vblank_wait(struct drm_device *dev, unsigned int *sequence)
-+{
-+ return i915_driver_vblank_do_wait(dev, sequence, &dev->vbl_received);
-+}
-+
-+int i915_driver_vblank_wait2(struct drm_device *dev, unsigned int *sequence)
-+{
-+ return i915_driver_vblank_do_wait(dev, sequence, &dev->vbl_received2);
-+}
-+
- /* Needs the lock as it touches the ring.
- */
- int i915_irq_emit(struct drm_device *dev, void *data,
-@@ -563,96 +414,18 @@ int i915_irq_wait(struct drm_device *dev, void *data,
- return i915_wait_irq(dev, irqwait->irq_seq);
- }
-
--int i915_enable_vblank(struct drm_device *dev, int plane)
--{
-- drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
-- int pipe = i915_get_pipe(dev, plane);
-- u32 pipestat_reg = 0;
-- u32 pipestat;
--
-- switch (pipe) {
-- case 0:
-- pipestat_reg = I915REG_PIPEASTAT;
-- dev_priv->irq_enable_reg |= I915_DISPLAY_PIPE_A_EVENT_INTERRUPT;
-- break;
-- case 1:
-- pipestat_reg = I915REG_PIPEBSTAT;
-- dev_priv->irq_enable_reg |= I915_DISPLAY_PIPE_B_EVENT_INTERRUPT;
-- break;
-- default:
-- DRM_ERROR("tried to enable vblank on non-existent pipe %d\n",
-- pipe);
-- break;
-- }
--
-- if (pipestat_reg)
-- {
-- pipestat = I915_READ (pipestat_reg);
-- /*
-- * Older chips didn't have the start vblank interrupt,
-- * but
-- */
-- if (IS_I965G (dev))
-- pipestat |= I915_START_VBLANK_INTERRUPT_ENABLE;
-- else
-- pipestat |= I915_VBLANK_INTERRUPT_ENABLE;
-- /*
-- * Clear any pending status
-- */
-- pipestat |= (I915_START_VBLANK_INTERRUPT_STATUS |
-- I915_VBLANK_INTERRUPT_STATUS);
-- I915_WRITE(pipestat_reg, pipestat);
-- }
-- I915_WRITE(I915REG_INT_ENABLE_R, dev_priv->irq_enable_reg);
--
-- return 0;
--}
--
--void i915_disable_vblank(struct drm_device *dev, int plane)
--{
-- drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
-- int pipe = i915_get_pipe(dev, plane);
-- u32 pipestat_reg = 0;
-- u32 pipestat;
--
-- switch (pipe) {
-- case 0:
-- pipestat_reg = I915REG_PIPEASTAT;
-- dev_priv->irq_enable_reg &= ~I915_DISPLAY_PIPE_A_EVENT_INTERRUPT;
-- break;
-- case 1:
-- pipestat_reg = I915REG_PIPEBSTAT;
-- dev_priv->irq_enable_reg &= ~I915_DISPLAY_PIPE_B_EVENT_INTERRUPT;
-- break;
-- default:
-- DRM_ERROR("tried to disable vblank on non-existent pipe %d\n",
-- pipe);
-- break;
-- }
--
-- I915_WRITE(I915REG_INT_ENABLE_R, dev_priv->irq_enable_reg);
-- if (pipestat_reg)
-- {
-- pipestat = I915_READ (pipestat_reg);
-- pipestat &= ~(I915_START_VBLANK_INTERRUPT_ENABLE |
-- I915_VBLANK_INTERRUPT_ENABLE);
-- /*
-- * Clear any pending status
-- */
-- pipestat |= (I915_START_VBLANK_INTERRUPT_STATUS |
-- I915_VBLANK_INTERRUPT_STATUS);
-- I915_WRITE(pipestat_reg, pipestat);
-- }
--}
--
- static void i915_enable_interrupt (struct drm_device *dev)
- {
- drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
-+ u16 flag;
-
-- dev_priv->irq_enable_reg |= I915_USER_INTERRUPT;
-+ flag = 0;
-+ if (dev_priv->vblank_pipe & DRM_I915_VBLANK_PIPE_A)
-+ flag |= VSYNC_PIPEA_FLAG;
-+ if (dev_priv->vblank_pipe & DRM_I915_VBLANK_PIPE_B)
-+ flag |= VSYNC_PIPEB_FLAG;
-
-- I915_WRITE(I915REG_INT_ENABLE_R, dev_priv->irq_enable_reg);
-- dev_priv->irq_enabled = 1;
-+ I915_WRITE16(I915REG_INT_ENABLE_R, USER_INT_FLAG | flag);
- }
-
- /* Set the vblank monitor pipe
-@@ -675,6 +448,8 @@ int i915_vblank_pipe_set(struct drm_device *dev, void *data,
-
- dev_priv->vblank_pipe = pipe->pipe;
-
-+ i915_enable_interrupt (dev);
-+
- return 0;
- }
-
-@@ -692,9 +467,9 @@ int i915_vblank_pipe_get(struct drm_device *dev, void *data,
-
- flag = I915_READ(I915REG_INT_ENABLE_R);
- pipe->pipe = 0;
-- if (flag & I915_DISPLAY_PIPE_A_EVENT_INTERRUPT)
-+ if (flag & VSYNC_PIPEA_FLAG)
- pipe->pipe |= DRM_I915_VBLANK_PIPE_A;
-- if (flag & I915_DISPLAY_PIPE_B_EVENT_INTERRUPT)
-+ if (flag & VSYNC_PIPEB_FLAG)
- pipe->pipe |= DRM_I915_VBLANK_PIPE_B;
-
- return 0;
-@@ -709,30 +484,27 @@ int i915_vblank_swap(struct drm_device *dev, void *data,
- drm_i915_private_t *dev_priv = dev->dev_private;
- drm_i915_vblank_swap_t *swap = data;
- drm_i915_vbl_swap_t *vbl_swap;
-- unsigned int pipe, seqtype, curseq, plane;
-+ unsigned int pipe, seqtype, curseq;
- unsigned long irqflags;
- struct list_head *list;
-- int ret;
-
- if (!dev_priv) {
- DRM_ERROR("%s called with no initialization\n", __func__);
- return -EINVAL;
- }
-
-- if (!dev_priv->sarea_priv || dev_priv->sarea_priv->rotation) {
-+ if (dev_priv->sarea_priv->rotation) {
- DRM_DEBUG("Rotation not supported\n");
- return -EINVAL;
- }
-
- if (swap->seqtype & ~(_DRM_VBLANK_RELATIVE | _DRM_VBLANK_ABSOLUTE |
-- _DRM_VBLANK_SECONDARY | _DRM_VBLANK_NEXTONMISS |
-- _DRM_VBLANK_FLIP)) {
-+ _DRM_VBLANK_SECONDARY | _DRM_VBLANK_NEXTONMISS)) {
- DRM_ERROR("Invalid sequence type 0x%x\n", swap->seqtype);
- return -EINVAL;
- }
-
-- plane = (swap->seqtype & _DRM_VBLANK_SECONDARY) ? 1 : 0;
-- pipe = i915_get_pipe(dev, plane);
-+ pipe = (swap->seqtype & _DRM_VBLANK_SECONDARY) ? 1 : 0;
-
- seqtype = swap->seqtype & (_DRM_VBLANK_RELATIVE | _DRM_VBLANK_ABSOLUTE);
-
-@@ -743,11 +515,6 @@ int i915_vblank_swap(struct drm_device *dev, void *data,
-
- spin_lock_irqsave(&dev->drw_lock, irqflags);
-
-- /* It makes no sense to schedule a swap for a drawable that doesn't have
-- * valid information at this point. E.g. this could mean that the X
-- * server is too old to push drawable information to the DRM, in which
-- * case all such swaps would become ineffective.
-- */
- if (!drm_get_drawable_info(dev, swap->drawable)) {
- spin_unlock_irqrestore(&dev->drw_lock, irqflags);
- DRM_DEBUG("Invalid drawable ID %d\n", swap->drawable);
-@@ -756,8 +523,7 @@ int i915_vblank_swap(struct drm_device *dev, void *data,
-
- spin_unlock_irqrestore(&dev->drw_lock, irqflags);
-
-- drm_update_vblank_count(dev, pipe);
-- curseq = drm_vblank_count(dev, pipe);
-+ curseq = atomic_read(pipe ? &dev->vbl_received2 : &dev->vbl_received);
-
- if (seqtype == _DRM_VBLANK_RELATIVE)
- swap->sequence += curseq;
-@@ -771,43 +537,14 @@ int i915_vblank_swap(struct drm_device *dev, void *data,
- }
- }
-
-- if (swap->seqtype & _DRM_VBLANK_FLIP) {
-- swap->sequence--;
--
-- if ((curseq - swap->sequence) <= (1<<23)) {
-- struct drm_drawable_info *drw;
--
-- LOCK_TEST_WITH_RETURN(dev, file_priv);
--
-- spin_lock_irqsave(&dev->drw_lock, irqflags);
--
-- drw = drm_get_drawable_info(dev, swap->drawable);
--
-- if (!drw) {
-- spin_unlock_irqrestore(&dev->drw_lock,
-- irqflags);
-- DRM_DEBUG("Invalid drawable ID %d\n",
-- swap->drawable);
-- return -EINVAL;
-- }
--
-- i915_dispatch_vsync_flip(dev, drw, plane);
--
-- spin_unlock_irqrestore(&dev->drw_lock, irqflags);
--
-- return 0;
-- }
-- }
--
- spin_lock_irqsave(&dev_priv->swaps_lock, irqflags);
-
- list_for_each(list, &dev_priv->vbl_swaps.head) {
- vbl_swap = list_entry(list, drm_i915_vbl_swap_t, head);
-
- if (vbl_swap->drw_id == swap->drawable &&
-- vbl_swap->plane == plane &&
-+ vbl_swap->pipe == pipe &&
- vbl_swap->sequence == swap->sequence) {
-- vbl_swap->flip = (swap->seqtype & _DRM_VBLANK_FLIP);
- spin_unlock_irqrestore(&dev_priv->swaps_lock, irqflags);
- DRM_DEBUG("Already scheduled\n");
- return 0;
-@@ -830,19 +567,9 @@ int i915_vblank_swap(struct drm_device *dev, void *data,
-
- DRM_DEBUG("\n");
-
-- ret = drm_vblank_get(dev, pipe);
-- if (ret) {
-- drm_free(vbl_swap, sizeof(*vbl_swap), DRM_MEM_DRIVER);
-- return ret;
-- }
--
- vbl_swap->drw_id = swap->drawable;
-- vbl_swap->plane = plane;
-+ vbl_swap->pipe = pipe;
- vbl_swap->sequence = swap->sequence;
-- vbl_swap->flip = (swap->seqtype & _DRM_VBLANK_FLIP);
--
-- if (vbl_swap->flip)
-- swap->sequence++;
-
- spin_lock_irqsave(&dev_priv->swaps_lock, irqflags);
-
-@@ -860,57 +587,37 @@ void i915_driver_irq_preinstall(struct drm_device * dev)
- {
- drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
-
-- I915_WRITE16(I915REG_HWSTAM, 0xeffe);
-+ I915_WRITE16(I915REG_HWSTAM, 0xfffe);
- I915_WRITE16(I915REG_INT_MASK_R, 0x0);
- I915_WRITE16(I915REG_INT_ENABLE_R, 0x0);
- }
-
--int i915_driver_irq_postinstall(struct drm_device * dev)
-+void i915_driver_irq_postinstall(struct drm_device * dev)
- {
- drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
-- int ret, num_pipes = 2;
-
- spin_lock_init(&dev_priv->swaps_lock);
- INIT_LIST_HEAD(&dev_priv->vbl_swaps.head);
- dev_priv->swaps_pending = 0;
-
-- dev_priv->user_irq_refcount = 0;
-- dev_priv->irq_enable_reg = 0;
--
-- ret = drm_vblank_init(dev, num_pipes);
-- if (ret)
-- return ret;
--
-- dev->max_vblank_count = 0xffffff; /* only 24 bits of frame count */
--
-+ if (!dev_priv->vblank_pipe)
-+ dev_priv->vblank_pipe = DRM_I915_VBLANK_PIPE_A;
- i915_enable_interrupt(dev);
- DRM_INIT_WAITQUEUE(&dev_priv->irq_queue);
--
-- /*
-- * Initialize the hardware status page IRQ location.
-- */
--
-- I915_WRITE(I915REG_INSTPM, (1 << 5) | (1 << 21));
-- return 0;
- }
-
- void i915_driver_irq_uninstall(struct drm_device * dev)
- {
- drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
-- u32 temp;
-+ u16 temp;
-
- if (!dev_priv)
- return;
-
-- dev_priv->irq_enabled = 0;
-- I915_WRITE(I915REG_HWSTAM, 0xffffffff);
-- I915_WRITE(I915REG_INT_MASK_R, 0xffffffff);
-- I915_WRITE(I915REG_INT_ENABLE_R, 0x0);
--
-- temp = I915_READ(I915REG_PIPEASTAT);
-- I915_WRITE(I915REG_PIPEASTAT, temp);
-- temp = I915_READ(I915REG_PIPEBSTAT);
-- I915_WRITE(I915REG_PIPEBSTAT, temp);
-- temp = I915_READ(I915REG_INT_IDENTITY_R);
-- I915_WRITE(I915REG_INT_IDENTITY_R, temp);
-+ I915_WRITE16(I915REG_HWSTAM, 0xffff);
-+ I915_WRITE16(I915REG_INT_MASK_R, 0xffff);
-+ I915_WRITE16(I915REG_INT_ENABLE_R, 0x0);
-+
-+ temp = I915_READ16(I915REG_INT_IDENTITY_R);
-+ I915_WRITE16(I915REG_INT_IDENTITY_R, temp);
- }
-diff --git a/drivers/char/drm/mga_drv.c b/drivers/char/drm/mga_drv.c
-index 6b37909..5572939 100644
---- a/drivers/char/drm/mga_drv.c
-+++ b/drivers/char/drm/mga_drv.c
-@@ -45,16 +45,15 @@ static struct pci_device_id pciidlist[] = {
- static struct drm_driver driver = {
- .driver_features =
- DRIVER_USE_AGP | DRIVER_USE_MTRR | DRIVER_PCI_DMA |
-- DRIVER_HAVE_DMA | DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED,
-+ DRIVER_HAVE_DMA | DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED |
-+ DRIVER_IRQ_VBL,
- .dev_priv_size = sizeof(drm_mga_buf_priv_t),
- .load = mga_driver_load,
- .unload = mga_driver_unload,
- .lastclose = mga_driver_lastclose,
- .dma_quiescent = mga_driver_dma_quiescent,
- .device_is_agp = mga_driver_device_is_agp,
-- .get_vblank_counter = mga_get_vblank_counter,
-- .enable_vblank = mga_enable_vblank,
-- .disable_vblank = mga_disable_vblank,
-+ .vblank_wait = mga_driver_vblank_wait,
- .irq_preinstall = mga_driver_irq_preinstall,
- .irq_postinstall = mga_driver_irq_postinstall,
- .irq_uninstall = mga_driver_irq_uninstall,
-diff --git a/drivers/char/drm/mga_drv.h b/drivers/char/drm/mga_drv.h
-index 8f7291f..f6ebd24 100644
---- a/drivers/char/drm/mga_drv.h
-+++ b/drivers/char/drm/mga_drv.h
-@@ -120,7 +120,6 @@ typedef struct drm_mga_private {
- u32 clear_cmd;
- u32 maccess;
-
-- atomic_t vbl_received; /**< Number of vblanks received. */
- wait_queue_head_t fence_queue;
- atomic_t last_fence_retired;
- u32 next_fence_to_post;
-@@ -182,14 +181,11 @@ extern int mga_warp_install_microcode(drm_mga_private_t * dev_priv);
- extern int mga_warp_init(drm_mga_private_t * dev_priv);
-
- /* mga_irq.c */
--extern int mga_enable_vblank(struct drm_device *dev, int crtc);
--extern void mga_disable_vblank(struct drm_device *dev, int crtc);
--extern u32 mga_get_vblank_counter(struct drm_device *dev, int crtc);
- extern int mga_driver_fence_wait(struct drm_device * dev, unsigned int *sequence);
- extern int mga_driver_vblank_wait(struct drm_device * dev, unsigned int *sequence);
- extern irqreturn_t mga_driver_irq_handler(DRM_IRQ_ARGS);
- extern void mga_driver_irq_preinstall(struct drm_device * dev);
--extern int mga_driver_irq_postinstall(struct drm_device * dev);
-+extern void mga_driver_irq_postinstall(struct drm_device * dev);
- extern void mga_driver_irq_uninstall(struct drm_device * dev);
- extern long mga_compat_ioctl(struct file *filp, unsigned int cmd,
- unsigned long arg);
-diff --git a/drivers/char/drm/mga_irq.c b/drivers/char/drm/mga_irq.c
-index 06852fb..9302cb8 100644
---- a/drivers/char/drm/mga_irq.c
-+++ b/drivers/char/drm/mga_irq.c
-@@ -35,20 +35,6 @@
- #include "mga_drm.h"
- #include "mga_drv.h"
-
--u32 mga_get_vblank_counter(struct drm_device *dev, int crtc)
--{
-- const drm_mga_private_t *const dev_priv =
-- (drm_mga_private_t *) dev->dev_private;
--
-- if (crtc != 0) {
-- return 0;
-- }
--
--
-- return atomic_read(&dev_priv->vbl_received);
--}
--
--
- irqreturn_t mga_driver_irq_handler(DRM_IRQ_ARGS)
- {
- struct drm_device *dev = (struct drm_device *) arg;
-@@ -61,8 +47,9 @@ irqreturn_t mga_driver_irq_handler(DRM_IRQ_ARGS)
- /* VBLANK interrupt */
- if (status & MGA_VLINEPEN) {
- MGA_WRITE(MGA_ICLEAR, MGA_VLINEICLR);
-- atomic_inc(&dev_priv->vbl_received);
-- drm_handle_vblank(dev, 0);
-+ atomic_inc(&dev->vbl_received);
-+ DRM_WAKEUP(&dev->vbl_queue);
-+ drm_vbl_send_signals(dev);
- handled = 1;
- }
-
-@@ -91,34 +78,22 @@ irqreturn_t mga_driver_irq_handler(DRM_IRQ_ARGS)
- return IRQ_NONE;
- }
-
--int mga_enable_vblank(struct drm_device *dev, int crtc)
-+int mga_driver_vblank_wait(struct drm_device * dev, unsigned int *sequence)
- {
-- drm_mga_private_t *dev_priv = (drm_mga_private_t *) dev->dev_private;
--
-- if (crtc != 0) {
-- DRM_ERROR("tried to enable vblank on non-existent crtc %d\n",
-- crtc);
-- return 0;
-- }
--
-- MGA_WRITE(MGA_IEN, MGA_VLINEIEN | MGA_SOFTRAPEN);
-- return 0;
--}
-+ unsigned int cur_vblank;
-+ int ret = 0;
-
-+ /* Assume that the user has missed the current sequence number
-+ * by about a day rather than she wants to wait for years
-+ * using vertical blanks...
-+ */
-+ DRM_WAIT_ON(ret, dev->vbl_queue, 3 * DRM_HZ,
-+ (((cur_vblank = atomic_read(&dev->vbl_received))
-+ - *sequence) <= (1 << 23)));
-
--void mga_disable_vblank(struct drm_device *dev, int crtc)
--{
-- if (crtc != 0) {
-- DRM_ERROR("tried to disable vblank on non-existent crtc %d\n",
-- crtc);
-- }
-+ *sequence = cur_vblank;
-
-- /* Do *NOT* disable the vertical refresh interrupt. MGA doesn't have
-- * a nice hardware counter that tracks the number of refreshes when
-- * the interrupt is disabled, and the kernel doesn't know the refresh
-- * rate to calculate an estimate.
-- */
-- /* MGA_WRITE(MGA_IEN, MGA_VLINEIEN | MGA_SOFTRAPEN); */
-+ return ret;
- }
-
- int mga_driver_fence_wait(struct drm_device * dev, unsigned int *sequence)
-@@ -150,22 +125,14 @@ void mga_driver_irq_preinstall(struct drm_device * dev)
- MGA_WRITE(MGA_ICLEAR, ~0);
- }
-
--int mga_driver_irq_postinstall(struct drm_device * dev)
-+void mga_driver_irq_postinstall(struct drm_device * dev)
- {
- drm_mga_private_t *dev_priv = (drm_mga_private_t *) dev->dev_private;
-- int ret;
--
-- ret = drm_vblank_init(dev, 1);
-- if (ret)
-- return ret;
-
- DRM_INIT_WAITQUEUE(&dev_priv->fence_queue);
-
-- /* Turn on soft trap interrupt. Vertical blank interrupts are enabled
-- * in mga_enable_vblank.
-- */
-- MGA_WRITE(MGA_IEN, MGA_SOFTRAPEN);
-- return 0;
-+ /* Turn on vertical blank interrupt and soft trap interrupt. */
-+ MGA_WRITE(MGA_IEN, MGA_VLINEIEN | MGA_SOFTRAPEN);
- }
-
- void mga_driver_irq_uninstall(struct drm_device * dev)
-diff --git a/drivers/char/drm/r128_drv.c b/drivers/char/drm/r128_drv.c
-index 2888aa0..6108e75 100644
---- a/drivers/char/drm/r128_drv.c
-+++ b/drivers/char/drm/r128_drv.c
-@@ -43,13 +43,12 @@ static struct pci_device_id pciidlist[] = {
- static struct drm_driver driver = {
- .driver_features =
- DRIVER_USE_AGP | DRIVER_USE_MTRR | DRIVER_PCI_DMA | DRIVER_SG |
-- DRIVER_HAVE_DMA | DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED,
-+ DRIVER_HAVE_DMA | DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED |
-+ DRIVER_IRQ_VBL,
- .dev_priv_size = sizeof(drm_r128_buf_priv_t),
- .preclose = r128_driver_preclose,
- .lastclose = r128_driver_lastclose,
-- .get_vblank_counter = r128_get_vblank_counter,
-- .enable_vblank = r128_enable_vblank,
-- .disable_vblank = r128_disable_vblank,
-+ .vblank_wait = r128_driver_vblank_wait,
- .irq_preinstall = r128_driver_irq_preinstall,
- .irq_postinstall = r128_driver_irq_postinstall,
- .irq_uninstall = r128_driver_irq_uninstall,
-diff --git a/drivers/char/drm/r128_drv.h b/drivers/char/drm/r128_drv.h
-index 80af9e0..011105e 100644
---- a/drivers/char/drm/r128_drv.h
-+++ b/drivers/char/drm/r128_drv.h
-@@ -97,8 +97,6 @@ typedef struct drm_r128_private {
- u32 crtc_offset;
- u32 crtc_offset_cntl;
-
-- atomic_t vbl_received;
--
- u32 color_fmt;
- unsigned int front_offset;
- unsigned int front_pitch;
-@@ -151,12 +149,11 @@ extern int r128_wait_ring(drm_r128_private_t * dev_priv, int n);
- extern int r128_do_cce_idle(drm_r128_private_t * dev_priv);
- extern int r128_do_cleanup_cce(struct drm_device * dev);
-
--extern int r128_enable_vblank(struct drm_device *dev, int crtc);
--extern void r128_disable_vblank(struct drm_device *dev, int crtc);
--extern u32 r128_get_vblank_counter(struct drm_device *dev, int crtc);
-+extern int r128_driver_vblank_wait(struct drm_device * dev, unsigned int *sequence);
-+
- extern irqreturn_t r128_driver_irq_handler(DRM_IRQ_ARGS);
- extern void r128_driver_irq_preinstall(struct drm_device * dev);
--extern int r128_driver_irq_postinstall(struct drm_device * dev);
-+extern void r128_driver_irq_postinstall(struct drm_device * dev);
- extern void r128_driver_irq_uninstall(struct drm_device * dev);
- extern void r128_driver_lastclose(struct drm_device * dev);
- extern void r128_driver_preclose(struct drm_device * dev,
-diff --git a/drivers/char/drm/r128_irq.c b/drivers/char/drm/r128_irq.c
-index 5b95bd8..c76fdca 100644
---- a/drivers/char/drm/r128_irq.c
-+++ b/drivers/char/drm/r128_irq.c
-@@ -35,16 +35,6 @@
- #include "r128_drm.h"
- #include "r128_drv.h"
-
--u32 r128_get_vblank_counter(struct drm_device *dev, int crtc)
--{
-- const drm_r128_private_t *dev_priv = dev->dev_private;
--
-- if (crtc != 0)
-- return 0;
--
-- return atomic_read(&dev_priv->vbl_received);
--}
--
- irqreturn_t r128_driver_irq_handler(DRM_IRQ_ARGS)
- {
- struct drm_device *dev = (struct drm_device *) arg;
-@@ -56,38 +46,30 @@ irqreturn_t r128_driver_irq_handler(DRM_IRQ_ARGS)
- /* VBLANK interrupt */
- if (status & R128_CRTC_VBLANK_INT) {
- R128_WRITE(R128_GEN_INT_STATUS, R128_CRTC_VBLANK_INT_AK);
-- atomic_inc(&dev_priv->vbl_received);
-- drm_handle_vblank(dev, 0);
-+ atomic_inc(&dev->vbl_received);
-+ DRM_WAKEUP(&dev->vbl_queue);
-+ drm_vbl_send_signals(dev);
- return IRQ_HANDLED;
- }
- return IRQ_NONE;
- }
-
--int r128_enable_vblank(struct drm_device *dev, int crtc)
-+int r128_driver_vblank_wait(struct drm_device * dev, unsigned int *sequence)
- {
-- drm_r128_private_t *dev_priv = dev->dev_private;
--
-- if (crtc != 0) {
-- DRM_ERROR("%s: bad crtc %d\n", __FUNCTION__, crtc);
-- return -EINVAL;
-- }
-+ unsigned int cur_vblank;
-+ int ret = 0;
-
-- R128_WRITE(R128_GEN_INT_CNTL, R128_CRTC_VBLANK_INT_EN);
-- return 0;
--}
-+ /* Assume that the user has missed the current sequence number
-+ * by about a day rather than she wants to wait for years
-+ * using vertical blanks...
-+ */
-+ DRM_WAIT_ON(ret, dev->vbl_queue, 3 * DRM_HZ,
-+ (((cur_vblank = atomic_read(&dev->vbl_received))
-+ - *sequence) <= (1 << 23)));
-
--void r128_disable_vblank(struct drm_device *dev, int crtc)
--{
-- if (crtc != 0)
-- DRM_ERROR("%s: bad crtc %d\n", __FUNCTION__, crtc);
-+ *sequence = cur_vblank;
-
-- /*
-- * FIXME: implement proper interrupt disable by using the vblank
-- * counter register (if available)
-- *
-- * R128_WRITE(R128_GEN_INT_CNTL,
-- * R128_READ(R128_GEN_INT_CNTL) & ~R128_CRTC_VBLANK_INT_EN);
-- */
-+ return ret;
- }
-
- void r128_driver_irq_preinstall(struct drm_device * dev)
-@@ -100,9 +82,12 @@ void r128_driver_irq_preinstall(struct drm_device * dev)
- R128_WRITE(R128_GEN_INT_STATUS, R128_CRTC_VBLANK_INT_AK);
- }
-
--int r128_driver_irq_postinstall(struct drm_device * dev)
-+void r128_driver_irq_postinstall(struct drm_device * dev)
- {
-- return drm_vblank_init(dev, 1);
-+ drm_r128_private_t *dev_priv = (drm_r128_private_t *) dev->dev_private;
-+
-+ /* Turn on VBL interrupt */
-+ R128_WRITE(R128_GEN_INT_CNTL, R128_CRTC_VBLANK_INT_EN);
- }
-
- void r128_driver_irq_uninstall(struct drm_device * dev)
-diff --git a/drivers/char/drm/radeon_drv.c b/drivers/char/drm/radeon_drv.c
-index a261031..349ac3d 100644
---- a/drivers/char/drm/radeon_drv.c
-+++ b/drivers/char/drm/radeon_drv.c
-@@ -59,7 +59,8 @@ static struct pci_device_id pciidlist[] = {
- static struct drm_driver driver = {
- .driver_features =
- DRIVER_USE_AGP | DRIVER_USE_MTRR | DRIVER_PCI_DMA | DRIVER_SG |
-- DRIVER_HAVE_IRQ | DRIVER_HAVE_DMA | DRIVER_IRQ_SHARED,
-+ DRIVER_HAVE_IRQ | DRIVER_HAVE_DMA | DRIVER_IRQ_SHARED |
-+ DRIVER_IRQ_VBL | DRIVER_IRQ_VBL2,
- .dev_priv_size = sizeof(drm_radeon_buf_priv_t),
- .load = radeon_driver_load,
- .firstopen = radeon_driver_firstopen,
-@@ -68,9 +69,8 @@ static struct drm_driver driver = {
- .postclose = radeon_driver_postclose,
- .lastclose = radeon_driver_lastclose,
- .unload = radeon_driver_unload,
-- .get_vblank_counter = radeon_get_vblank_counter,
-- .enable_vblank = radeon_enable_vblank,
-- .disable_vblank = radeon_disable_vblank,
-+ .vblank_wait = radeon_driver_vblank_wait,
-+ .vblank_wait2 = radeon_driver_vblank_wait2,
- .dri_library_name = dri_library_name,
- .irq_preinstall = radeon_driver_irq_preinstall,
- .irq_postinstall = radeon_driver_irq_postinstall,
-diff --git a/drivers/char/drm/radeon_drv.h b/drivers/char/drm/radeon_drv.h
-index b791420..173ae62 100644
---- a/drivers/char/drm/radeon_drv.h
-+++ b/drivers/char/drm/radeon_drv.h
-@@ -304,9 +304,6 @@ typedef struct drm_radeon_private {
-
- u32 scratch_ages[5];
-
-- unsigned int crtc_last_cnt;
-- unsigned int crtc2_last_cnt;
--
- /* starting from here on, data is preserved accross an open */
- uint32_t flags; /* see radeon_chip_flags */
- unsigned long fb_aper_offset;
-@@ -377,13 +374,13 @@ extern int radeon_irq_emit(struct drm_device *dev, void *data, struct drm_file *
- extern int radeon_irq_wait(struct drm_device *dev, void *data, struct drm_file *file_priv);
-
- extern void radeon_do_release(struct drm_device * dev);
--extern u32 radeon_get_vblank_counter(struct drm_device *dev, int crtc);
--extern int radeon_enable_vblank(struct drm_device *dev, int crtc);
--extern void radeon_disable_vblank(struct drm_device *dev, int crtc);
--extern void radeon_do_release(struct drm_device * dev);
-+extern int radeon_driver_vblank_wait(struct drm_device * dev,
-+ unsigned int *sequence);
-+extern int radeon_driver_vblank_wait2(struct drm_device * dev,
-+ unsigned int *sequence);
- extern irqreturn_t radeon_driver_irq_handler(DRM_IRQ_ARGS);
- extern void radeon_driver_irq_preinstall(struct drm_device * dev);
--extern int radeon_driver_irq_postinstall(struct drm_device * dev);
-+extern void radeon_driver_irq_postinstall(struct drm_device * dev);
- extern void radeon_driver_irq_uninstall(struct drm_device * dev);
- extern int radeon_vblank_crtc_get(struct drm_device *dev);
- extern int radeon_vblank_crtc_set(struct drm_device *dev, int64_t value);
-@@ -561,12 +558,6 @@ extern int r300_do_cp_cmdbuf(struct drm_device * dev,
- ? DRM_READ32( dev_priv->ring_rptr, RADEON_SCRATCHOFF(x) ) \
- : RADEON_READ( RADEON_SCRATCH_REG0 + 4*(x) ) )
-
--#define RADEON_CRTC_CRNT_FRAME 0x0214
--#define RADEON_CRTC2_CRNT_FRAME 0x0314
--
--#define RADEON_CRTC_STATUS 0x005c
--#define RADEON_CRTC2_STATUS 0x03fc
--
- #define RADEON_GEN_INT_CNTL 0x0040
- # define RADEON_CRTC_VBLANK_MASK (1 << 0)
- # define RADEON_CRTC2_VBLANK_MASK (1 << 9)
-diff --git a/drivers/char/drm/radeon_irq.c b/drivers/char/drm/radeon_irq.c
-index 507d6b7..009af38 100644
---- a/drivers/char/drm/radeon_irq.c
-+++ b/drivers/char/drm/radeon_irq.c
-@@ -35,61 +35,12 @@
- #include "radeon_drm.h"
- #include "radeon_drv.h"
-
--static void radeon_irq_set_state(struct drm_device *dev, u32 mask, int state)
-+static __inline__ u32 radeon_acknowledge_irqs(drm_radeon_private_t * dev_priv,
-+ u32 mask)
- {
-- drm_radeon_private_t *dev_priv = dev->dev_private;
--
-- if (state)
-- dev_priv->irq_enable_reg |= mask;
-- else
-- dev_priv->irq_enable_reg &= ~mask;
--
-- RADEON_WRITE(RADEON_GEN_INT_CNTL, dev_priv->irq_enable_reg);
--}
--
--int radeon_enable_vblank(struct drm_device *dev, int crtc)
--{
-- switch (crtc) {
-- case 0:
-- radeon_irq_set_state(dev, RADEON_CRTC_VBLANK_MASK, 1);
-- break;
-- case 1:
-- radeon_irq_set_state(dev, RADEON_CRTC2_VBLANK_MASK, 1);
-- break;
-- default:
-- DRM_ERROR("tried to enable vblank on non-existent crtc %d\n",
-- crtc);
-- return EINVAL;
-- }
--
-- return 0;
--}
--
--void radeon_disable_vblank(struct drm_device *dev, int crtc)
--{
-- switch (crtc) {
-- case 0:
-- radeon_irq_set_state(dev, RADEON_CRTC_VBLANK_MASK, 0);
-- break;
-- case 1:
-- radeon_irq_set_state(dev, RADEON_CRTC2_VBLANK_MASK, 0);
-- break;
-- default:
-- DRM_ERROR("tried to enable vblank on non-existent crtc %d\n",
-- crtc);
-- break;
-- }
--}
--
--static __inline__ u32 radeon_acknowledge_irqs(drm_radeon_private_t * dev_priv)
--{
-- u32 irqs = RADEON_READ(RADEON_GEN_INT_STATUS) &
-- (RADEON_SW_INT_TEST | RADEON_CRTC_VBLANK_STAT |
-- RADEON_CRTC2_VBLANK_STAT);
--
-+ u32 irqs = RADEON_READ(RADEON_GEN_INT_STATUS) & mask;
- if (irqs)
- RADEON_WRITE(RADEON_GEN_INT_STATUS, irqs);
--
- return irqs;
- }
-
-@@ -121,21 +72,39 @@ irqreturn_t radeon_driver_irq_handler(DRM_IRQ_ARGS)
- /* Only consider the bits we're interested in - others could be used
- * outside the DRM
- */
-- stat = radeon_acknowledge_irqs(dev_priv);
-+ stat = radeon_acknowledge_irqs(dev_priv, (RADEON_SW_INT_TEST_ACK |
-+ RADEON_CRTC_VBLANK_STAT |
-+ RADEON_CRTC2_VBLANK_STAT));
- if (!stat)
- return IRQ_NONE;
-
- stat &= dev_priv->irq_enable_reg;
-
- /* SW interrupt */
-- if (stat & RADEON_SW_INT_TEST)
-+ if (stat & RADEON_SW_INT_TEST) {
- DRM_WAKEUP(&dev_priv->swi_queue);
-+ }
-
- /* VBLANK interrupt */
-- if (stat & RADEON_CRTC_VBLANK_STAT)
-- drm_handle_vblank(dev, 0);
-- if (stat & RADEON_CRTC2_VBLANK_STAT)
-- drm_handle_vblank(dev, 1);
-+ if (stat & (RADEON_CRTC_VBLANK_STAT|RADEON_CRTC2_VBLANK_STAT)) {
-+ int vblank_crtc = dev_priv->vblank_crtc;
-+
-+ if ((vblank_crtc &
-+ (DRM_RADEON_VBLANK_CRTC1 | DRM_RADEON_VBLANK_CRTC2)) ==
-+ (DRM_RADEON_VBLANK_CRTC1 | DRM_RADEON_VBLANK_CRTC2)) {
-+ if (stat & RADEON_CRTC_VBLANK_STAT)
-+ atomic_inc(&dev->vbl_received);
-+ if (stat & RADEON_CRTC2_VBLANK_STAT)
-+ atomic_inc(&dev->vbl_received2);
-+ } else if (((stat & RADEON_CRTC_VBLANK_STAT) &&
-+ (vblank_crtc & DRM_RADEON_VBLANK_CRTC1)) ||
-+ ((stat & RADEON_CRTC2_VBLANK_STAT) &&
-+ (vblank_crtc & DRM_RADEON_VBLANK_CRTC2)))
-+ atomic_inc(&dev->vbl_received);
-+
-+ DRM_WAKEUP(&dev->vbl_queue);
-+ drm_vbl_send_signals(dev);
-+ }
-
- return IRQ_HANDLED;
- }
-@@ -175,27 +144,54 @@ static int radeon_wait_irq(struct drm_device * dev, int swi_nr)
- return ret;
- }
-
--u32 radeon_get_vblank_counter(struct drm_device *dev, int crtc)
-+static int radeon_driver_vblank_do_wait(struct drm_device * dev,
-+ unsigned int *sequence, int crtc)
- {
-- drm_radeon_private_t *dev_priv = dev->dev_private;
-- u32 crtc_cnt_reg, crtc_status_reg;
--
-+ drm_radeon_private_t *dev_priv =
-+ (drm_radeon_private_t *) dev->dev_private;
-+ unsigned int cur_vblank;
-+ int ret = 0;
-+ int ack = 0;
-+ atomic_t *counter;
- if (!dev_priv) {
- DRM_ERROR("called with no initialization\n");
- return -EINVAL;
- }
-
-- if (crtc == 0) {
-- crtc_cnt_reg = RADEON_CRTC_CRNT_FRAME;
-- crtc_status_reg = RADEON_CRTC_STATUS;
-- } else if (crtc == 1) {
-- crtc_cnt_reg = RADEON_CRTC2_CRNT_FRAME;
-- crtc_status_reg = RADEON_CRTC2_STATUS;
-- } else {
-+ if (crtc == DRM_RADEON_VBLANK_CRTC1) {
-+ counter = &dev->vbl_received;
-+ ack |= RADEON_CRTC_VBLANK_STAT;
-+ } else if (crtc == DRM_RADEON_VBLANK_CRTC2) {
-+ counter = &dev->vbl_received2;
-+ ack |= RADEON_CRTC2_VBLANK_STAT;
-+ } else
- return -EINVAL;
-- }
-
-- return RADEON_READ(crtc_cnt_reg) + (RADEON_READ(crtc_status_reg) & 1);
-+ radeon_acknowledge_irqs(dev_priv, ack);
-+
-+ dev_priv->stats.boxes |= RADEON_BOX_WAIT_IDLE;
-+
-+ /* Assume that the user has missed the current sequence number
-+ * by about a day rather than she wants to wait for years
-+ * using vertical blanks...
-+ */
-+ DRM_WAIT_ON(ret, dev->vbl_queue, 3 * DRM_HZ,
-+ (((cur_vblank = atomic_read(counter))
-+ - *sequence) <= (1 << 23)));
-+
-+ *sequence = cur_vblank;
-+
-+ return ret;
-+}
-+
-+int radeon_driver_vblank_wait(struct drm_device *dev, unsigned int *sequence)
-+{
-+ return radeon_driver_vblank_do_wait(dev, sequence, DRM_RADEON_VBLANK_CRTC1);
-+}
-+
-+int radeon_driver_vblank_wait2(struct drm_device *dev, unsigned int *sequence)
-+{
-+ return radeon_driver_vblank_do_wait(dev, sequence, DRM_RADEON_VBLANK_CRTC2);
- }
-
- /* Needs the lock as it touches the ring.
-@@ -238,6 +234,21 @@ int radeon_irq_wait(struct drm_device *dev, void *data, struct drm_file *file_pr
- return radeon_wait_irq(dev, irqwait->irq_seq);
- }
-
-+static void radeon_enable_interrupt(struct drm_device *dev)
-+{
-+ drm_radeon_private_t *dev_priv = (drm_radeon_private_t *) dev->dev_private;
-+
-+ dev_priv->irq_enable_reg = RADEON_SW_INT_ENABLE;
-+ if (dev_priv->vblank_crtc & DRM_RADEON_VBLANK_CRTC1)
-+ dev_priv->irq_enable_reg |= RADEON_CRTC_VBLANK_MASK;
-+
-+ if (dev_priv->vblank_crtc & DRM_RADEON_VBLANK_CRTC2)
-+ dev_priv->irq_enable_reg |= RADEON_CRTC2_VBLANK_MASK;
-+
-+ RADEON_WRITE(RADEON_GEN_INT_CNTL, dev_priv->irq_enable_reg);
-+ dev_priv->irq_enabled = 1;
-+}
-+
- /* drm_dma.h hooks
- */
- void radeon_driver_irq_preinstall(struct drm_device * dev)
-@@ -249,27 +260,20 @@ void radeon_driver_irq_preinstall(struct drm_device * dev)
- RADEON_WRITE(RADEON_GEN_INT_CNTL, 0);
-
- /* Clear bits if they're already high */
-- radeon_acknowledge_irqs(dev_priv);
-+ radeon_acknowledge_irqs(dev_priv, (RADEON_SW_INT_TEST_ACK |
-+ RADEON_CRTC_VBLANK_STAT |
-+ RADEON_CRTC2_VBLANK_STAT));
- }
-
--int radeon_driver_irq_postinstall(struct drm_device * dev)
-+void radeon_driver_irq_postinstall(struct drm_device * dev)
- {
- drm_radeon_private_t *dev_priv =
- (drm_radeon_private_t *) dev->dev_private;
-- int ret;
-
- atomic_set(&dev_priv->swi_emitted, 0);
- DRM_INIT_WAITQUEUE(&dev_priv->swi_queue);
-
-- ret = drm_vblank_init(dev, 2);
-- if (ret)
-- return ret;
--
-- dev->max_vblank_count = 0x001fffff;
--
-- radeon_irq_set_state(dev, RADEON_SW_INT_ENABLE, 1);
--
-- return 0;
-+ radeon_enable_interrupt(dev);
- }
-
- void radeon_driver_irq_uninstall(struct drm_device * dev)
-@@ -311,5 +315,6 @@ int radeon_vblank_crtc_set(struct drm_device *dev, int64_t value)
- return -EINVAL;
- }
- dev_priv->vblank_crtc = (unsigned int)value;
-+ radeon_enable_interrupt(dev);
- return 0;
- }
-diff --git a/drivers/char/drm/via_drv.c b/drivers/char/drm/via_drv.c
-index 37870a4..80c01cd 100644
---- a/drivers/char/drm/via_drv.c
-+++ b/drivers/char/drm/via_drv.c
-@@ -40,13 +40,11 @@ static struct pci_device_id pciidlist[] = {
- static struct drm_driver driver = {
- .driver_features =
- DRIVER_USE_AGP | DRIVER_USE_MTRR | DRIVER_HAVE_IRQ |
-- DRIVER_IRQ_SHARED,
-+ DRIVER_IRQ_SHARED | DRIVER_IRQ_VBL,
- .load = via_driver_load,
- .unload = via_driver_unload,
- .context_dtor = via_final_context,
-- .get_vblank_counter = via_get_vblank_counter,
-- .enable_vblank = via_enable_vblank,
-- .disable_vblank = via_disable_vblank,
-+ .vblank_wait = via_driver_vblank_wait,
- .irq_preinstall = via_driver_irq_preinstall,
- .irq_postinstall = via_driver_irq_postinstall,
- .irq_uninstall = via_driver_irq_uninstall,
-diff --git a/drivers/char/drm/via_drv.h b/drivers/char/drm/via_drv.h
-index fe67030..2daae81 100644
---- a/drivers/char/drm/via_drv.h
-+++ b/drivers/char/drm/via_drv.h
-@@ -75,7 +75,6 @@ typedef struct drm_via_private {
- struct timeval last_vblank;
- int last_vblank_valid;
- unsigned usec_per_vblank;
-- atomic_t vbl_received;
- drm_via_state_t hc_state;
- char pci_buf[VIA_PCI_BUF_SIZE];
- const uint32_t *fire_offsets[VIA_FIRE_BUF_SIZE];
-@@ -131,13 +130,11 @@ extern int via_init_context(struct drm_device * dev, int context);
- extern int via_final_context(struct drm_device * dev, int context);
-
- extern int via_do_cleanup_map(struct drm_device * dev);
--extern u32 via_get_vblank_counter(struct drm_device *dev, int crtc);
--extern int via_enable_vblank(struct drm_device *dev, int crtc);
--extern void via_disable_vblank(struct drm_device *dev, int crtc);
-+extern int via_driver_vblank_wait(struct drm_device * dev, unsigned int *sequence);
-
- extern irqreturn_t via_driver_irq_handler(DRM_IRQ_ARGS);
- extern void via_driver_irq_preinstall(struct drm_device * dev);
--extern int via_driver_irq_postinstall(struct drm_device * dev);
-+extern void via_driver_irq_postinstall(struct drm_device * dev);
- extern void via_driver_irq_uninstall(struct drm_device * dev);
-
- extern int via_dma_cleanup(struct drm_device * dev);
-diff --git a/drivers/char/drm/via_irq.c b/drivers/char/drm/via_irq.c
-index f1ab6fc..c6bb978 100644
---- a/drivers/char/drm/via_irq.c
-+++ b/drivers/char/drm/via_irq.c
-@@ -92,17 +92,8 @@ static int via_irqmap_unichrome[] = {-1, -1, -1, 0, -1, 1};
- static unsigned time_diff(struct timeval *now, struct timeval *then)
- {
- return (now->tv_usec >= then->tv_usec) ?
-- now->tv_usec - then->tv_usec :
-- 1000000 - (then->tv_usec - now->tv_usec);
--}
--
--u32 via_get_vblank_counter(struct drm_device *dev, int crtc)
--{
-- drm_via_private_t *dev_priv = dev->dev_private;
-- if (crtc != 0)
-- return 0;
--
-- return atomic_read(&dev_priv->vbl_received);
-+ now->tv_usec - then->tv_usec :
-+ 1000000 - (then->tv_usec - now->tv_usec);
- }
-
- irqreturn_t via_driver_irq_handler(DRM_IRQ_ARGS)
-@@ -117,8 +108,8 @@ irqreturn_t via_driver_irq_handler(DRM_IRQ_ARGS)
-
- status = VIA_READ(VIA_REG_INTERRUPT);
- if (status & VIA_IRQ_VBLANK_PENDING) {
-- atomic_inc(&dev_priv->vbl_received);
-- if (!(atomic_read(&dev_priv->vbl_received) & 0x0F)) {
-+ atomic_inc(&dev->vbl_received);
-+ if (!(atomic_read(&dev->vbl_received) & 0x0F)) {
- do_gettimeofday(&cur_vblank);
- if (dev_priv->last_vblank_valid) {
- dev_priv->usec_per_vblank =
-@@ -128,11 +119,12 @@ irqreturn_t via_driver_irq_handler(DRM_IRQ_ARGS)
- dev_priv->last_vblank = cur_vblank;
- dev_priv->last_vblank_valid = 1;
- }
-- if (!(atomic_read(&dev_priv->vbl_received) & 0xFF)) {
-+ if (!(atomic_read(&dev->vbl_received) & 0xFF)) {
- DRM_DEBUG("US per vblank is: %u\n",
- dev_priv->usec_per_vblank);
- }
-- drm_handle_vblank(dev, 0);
-+ DRM_WAKEUP(&dev->vbl_queue);
-+ drm_vbl_send_signals(dev);
- handled = 1;
- }
-
-@@ -171,34 +163,31 @@ static __inline__ void viadrv_acknowledge_irqs(drm_via_private_t * dev_priv)
- }
- }
-
--int via_enable_vblank(struct drm_device *dev, int crtc)
-+int via_driver_vblank_wait(struct drm_device * dev, unsigned int *sequence)
- {
-- drm_via_private_t *dev_priv = dev->dev_private;
-- u32 status;
-+ drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private;
-+ unsigned int cur_vblank;
-+ int ret = 0;
-
-- if (crtc != 0) {
-- DRM_ERROR("%s: bad crtc %d\n", __FUNCTION__, crtc);
-+ DRM_DEBUG("\n");
-+ if (!dev_priv) {
-+ DRM_ERROR("called with no initialization\n");
- return -EINVAL;
- }
-
-- status = VIA_READ(VIA_REG_INTERRUPT);
-- VIA_WRITE(VIA_REG_INTERRUPT, status & VIA_IRQ_VBLANK_ENABLE);
-+ viadrv_acknowledge_irqs(dev_priv);
-
-- VIA_WRITE8(0x83d4, 0x11);
-- VIA_WRITE8(0x83d5, VIA_READ8(0x83d5) | 0x30);
-+ /* Assume that the user has missed the current sequence number
-+ * by about a day rather than she wants to wait for years
-+ * using vertical blanks...
-+ */
-
-- return 0;
--}
-+ DRM_WAIT_ON(ret, dev->vbl_queue, 3 * DRM_HZ,
-+ (((cur_vblank = atomic_read(&dev->vbl_received)) -
-+ *sequence) <= (1 << 23)));
-
--void via_disable_vblank(struct drm_device *dev, int crtc)
--{
-- drm_via_private_t *dev_priv = dev->dev_private;
--
-- VIA_WRITE8(0x83d4, 0x11);
-- VIA_WRITE8(0x83d5, VIA_READ8(0x83d5) & ~0x30);
--
-- if (crtc != 0)
-- DRM_ERROR("%s: bad crtc %d\n", __FUNCTION__, crtc);
-+ *sequence = cur_vblank;
-+ return ret;
- }
-
- static int
-@@ -303,25 +292,23 @@ void via_driver_irq_preinstall(struct drm_device * dev)
- }
- }
-
--int via_driver_irq_postinstall(struct drm_device * dev)
-+void via_driver_irq_postinstall(struct drm_device * dev)
- {
- drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private;
- u32 status;
-
-- DRM_DEBUG("via_driver_irq_postinstall\n");
-- if (!dev_priv)
-- return -EINVAL;
-+ DRM_DEBUG("\n");
-+ if (dev_priv) {
-+ status = VIA_READ(VIA_REG_INTERRUPT);
-+ VIA_WRITE(VIA_REG_INTERRUPT, status | VIA_IRQ_GLOBAL
-+ | dev_priv->irq_enable_mask);
-
-- drm_vblank_init(dev, 1);
-- status = VIA_READ(VIA_REG_INTERRUPT);
-- VIA_WRITE(VIA_REG_INTERRUPT, status | VIA_IRQ_GLOBAL
-- | dev_priv->irq_enable_mask);
-+ /* Some magic, oh for some data sheets ! */
-
-- /* Some magic, oh for some data sheets ! */
-- VIA_WRITE8(0x83d4, 0x11);
-- VIA_WRITE8(0x83d5, VIA_READ8(0x83d5) | 0x30);
-+ VIA_WRITE8(0x83d4, 0x11);
-+ VIA_WRITE8(0x83d5, VIA_READ8(0x83d5) | 0x30);
-
-- return 0;
-+ }
- }
-
- void via_driver_irq_uninstall(struct drm_device * dev)
-diff --git a/drivers/char/sysrq.c b/drivers/char/sysrq.c
-index 9e9bad8..dbce126 100644
---- a/drivers/char/sysrq.c
-+++ b/drivers/char/sysrq.c
-@@ -402,6 +402,7 @@ static struct sysrq_key_op *sysrq_key_table[36] = {
- &sysrq_showstate_blocked_op, /* w */
- /* x: May be registered on ppc/powerpc for xmon */
- NULL, /* x */
-+ /* y: May be registered on sparc64 for global register dump */
- NULL, /* y */
- NULL /* z */
- };
-diff --git a/drivers/char/viocons.c b/drivers/char/viocons.c
-index 3d3e1c2..65fb848 100644
---- a/drivers/char/viocons.c
-+++ b/drivers/char/viocons.c
-@@ -7,7 +7,7 @@
- * Authors: Dave Boutcher
- * Ryan Arnold
- * Colin Devilbiss
-- * Stephen Rothwell
-+ * Stephen Rothwell
- *
- * (C) Copyright 2000, 2001, 2002, 2003, 2004 IBM Corporation
- *
-diff --git a/drivers/char/viotape.c b/drivers/char/viotape.c
-index 58aad63..c39ddaf 100644
---- a/drivers/char/viotape.c
-+++ b/drivers/char/viotape.c
-@@ -6,7 +6,7 @@
- * Authors: Dave Boutcher
- * Ryan Arnold
- * Colin Devilbiss
-- * Stephen Rothwell
-+ * Stephen Rothwell
- *
- * (C) Copyright 2000-2004 IBM Corporation
- *
-diff --git a/drivers/cpufreq/freq_table.c b/drivers/cpufreq/freq_table.c
-index ae6cd60..b64c6bc 100644
---- a/drivers/cpufreq/freq_table.c
-+++ b/drivers/cpufreq/freq_table.c
-@@ -2,6 +2,11 @@
- * linux/drivers/cpufreq/freq_table.c
- *
- * Copyright (C) 2002 - 2003 Dominik Brodowski
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ *
- */
-
- #include
-diff --git a/drivers/dma/iop-adma.c b/drivers/dma/iop-adma.c
-index 762b729..0ec0f43 100644
---- a/drivers/dma/iop-adma.c
-+++ b/drivers/dma/iop-adma.c
-@@ -821,10 +821,10 @@ static int __devinit iop_adma_memcpy_self_test(struct iop_adma_device *device)
-
- dev_dbg(device->common.dev, "%s\n", __func__);
-
-- src = kzalloc(sizeof(u8) * IOP_ADMA_TEST_SIZE, GFP_KERNEL);
-+ src = kmalloc(IOP_ADMA_TEST_SIZE, GFP_KERNEL);
- if (!src)
- return -ENOMEM;
-- dest = kzalloc(sizeof(u8) * IOP_ADMA_TEST_SIZE, GFP_KERNEL);
-+ dest = kzalloc(IOP_ADMA_TEST_SIZE, GFP_KERNEL);
- if (!dest) {
- kfree(src);
- return -ENOMEM;
-@@ -834,8 +834,6 @@ static int __devinit iop_adma_memcpy_self_test(struct iop_adma_device *device)
- for (i = 0; i < IOP_ADMA_TEST_SIZE; i++)
- ((u8 *) src)[i] = (u8)i;
-
-- memset(dest, 0, IOP_ADMA_TEST_SIZE);
--
- /* Start copy, using first DMA channel */
- dma_chan = container_of(device->common.channels.next,
- struct dma_chan,
-diff --git a/drivers/edac/mpc85xx_edac.c b/drivers/edac/mpc85xx_edac.c
-index 065732d..d49361b 100644
---- a/drivers/edac/mpc85xx_edac.c
-+++ b/drivers/edac/mpc85xx_edac.c
-@@ -20,7 +20,6 @@
-
- #include
- #include
--#include
- #include "edac_module.h"
- #include "edac_core.h"
- #include "mpc85xx_edac.h"
-@@ -43,8 +42,6 @@ static u32 orig_pci_err_en;
- static u32 orig_l2_err_disable;
- static u32 orig_hid1;
-
--static const char *mpc85xx_ctl_name = "MPC85xx";
--
- /************************ MC SYSFS parts ***********************************/
-
- static ssize_t mpc85xx_mc_inject_data_hi_show(struct mem_ctl_info *mci,
-diff --git a/drivers/firewire/fw-cdev.c b/drivers/firewire/fw-cdev.c
-index 4a54192..dda1401 100644
---- a/drivers/firewire/fw-cdev.c
-+++ b/drivers/firewire/fw-cdev.c
-@@ -113,6 +113,11 @@ static int fw_device_op_open(struct inode *inode, struct file *file)
- if (device == NULL)
- return -ENODEV;
-
-+ if (fw_device_is_shutdown(device)) {
-+ fw_device_put(device);
-+ return -ENODEV;
-+ }
-+
- client = kzalloc(sizeof(*client), GFP_KERNEL);
- if (client == NULL) {
- fw_device_put(device);
-@@ -901,6 +906,9 @@ fw_device_op_ioctl(struct file *file,
- {
- struct client *client = file->private_data;
-
-+ if (fw_device_is_shutdown(client->device))
-+ return -ENODEV;
-+
- return dispatch_ioctl(client, cmd, (void __user *) arg);
- }
-
-@@ -911,6 +919,9 @@ fw_device_op_compat_ioctl(struct file *file,
- {
- struct client *client = file->private_data;
-
-+ if (fw_device_is_shutdown(client->device))
-+ return -ENODEV;
-+
- return dispatch_ioctl(client, cmd, compat_ptr(arg));
- }
- #endif
-@@ -922,6 +933,9 @@ static int fw_device_op_mmap(struct file *file, struct vm_area_struct *vma)
- unsigned long size;
- int page_count, retval;
-
-+ if (fw_device_is_shutdown(client->device))
-+ return -ENODEV;
-+
- /* FIXME: We could support multiple buffers, but we don't. */
- if (client->buffer.pages != NULL)
- return -EBUSY;
-diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
-index 7f138c6..beaf6b3 100644
---- a/drivers/gpio/gpiolib.c
-+++ b/drivers/gpio/gpiolib.c
-@@ -127,7 +127,7 @@ int __init gpiochip_reserve(int start, int ngpio)
- unsigned long flags;
- int i;
-
-- if (!gpio_is_valid(start) || !gpio_is_valid(start + ngpio))
-+ if (!gpio_is_valid(start) || !gpio_is_valid(start + ngpio - 1))
- return -EINVAL;
-
- spin_lock_irqsave(&gpio_lock, flags);
-@@ -170,7 +170,7 @@ int gpiochip_add(struct gpio_chip *chip)
- unsigned id;
- int base = chip->base;
-
-- if ((!gpio_is_valid(base) || !gpio_is_valid(base + chip->ngpio))
-+ if ((!gpio_is_valid(base) || !gpio_is_valid(base + chip->ngpio - 1))
- && base >= 0) {
- status = -EINVAL;
- goto fail;
-@@ -207,7 +207,7 @@ fail:
- /* failures here can mean systems won't boot... */
- if (status)
- pr_err("gpiochip_add: gpios %d..%d (%s) not registered\n",
-- chip->base, chip->base + chip->ngpio,
-+ chip->base, chip->base + chip->ngpio - 1,
- chip->label ? : "generic");
- return status;
- }
-diff --git a/drivers/gpio/mcp23s08.c b/drivers/gpio/mcp23s08.c
-index 7fb5b9d..7f92fdd 100644
---- a/drivers/gpio/mcp23s08.c
-+++ b/drivers/gpio/mcp23s08.c
-@@ -168,7 +168,7 @@ static void mcp23s08_dbg_show(struct seq_file *s, struct gpio_chip *chip)
- {
- struct mcp23s08 *mcp;
- char bank;
-- unsigned t;
-+ int t;
- unsigned mask;
-
- mcp = container_of(chip, struct mcp23s08, chip);
-diff --git a/drivers/gpio/pca953x.c b/drivers/gpio/pca953x.c
-index 93f9167..7e40e8a 100644
---- a/drivers/gpio/pca953x.c
-+++ b/drivers/gpio/pca953x.c
-@@ -30,6 +30,7 @@ static const struct i2c_device_id pca953x_id[] = {
- { "pca9537", 4, },
- { "pca9538", 8, },
- { "pca9539", 16, },
-+ { "pca9554", 8, },
- { "pca9555", 16, },
- { "pca9557", 8, },
- /* REVISIT several pca955x parts should work here too */
-diff --git a/drivers/hid/hid-debug.c b/drivers/hid/hid-debug.c
-index f88714b..47ac1a7 100644
---- a/drivers/hid/hid-debug.c
-+++ b/drivers/hid/hid-debug.c
-@@ -1,6 +1,4 @@
- /*
-- * $Id: hid-debug.h,v 1.8 2001/09/25 09:37:57 vojtech Exp $
-- *
- * (c) 1999 Andreas Gal
- * (c) 2000-2001 Vojtech Pavlik
- * (c) 2007 Jiri Kosina
-diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c
-index c3eb3f1..5c52a20 100644
---- a/drivers/hid/hid-input.c
-+++ b/drivers/hid/hid-input.c
-@@ -1,6 +1,4 @@
- /*
-- * $Id: hid-input.c,v 1.2 2002/04/23 00:59:25 rdamazio Exp $
-- *
- * Copyright (c) 2000-2001 Vojtech Pavlik
- * Copyright (c) 2006-2007 Jiri Kosina
- *
-@@ -218,8 +216,9 @@ int hidinput_apple_event(struct hid_device *hid, struct input_dev *input,
- }
- }
-
-- if (test_bit(usage->code, hid->pb_pressed_numlock) ||
-- test_bit(LED_NUML, input->led)) {
-+ if (hid->quirks & HID_QUIRK_APPLE_NUMLOCK_EMULATION && (
-+ test_bit(usage->code, hid->pb_pressed_numlock) ||
-+ test_bit(LED_NUML, input->led))) {
- trans = find_translation(powerbook_numlock_keys, usage->code);
-
- if (trans) {
-diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c
-index d3f8d91..1df832a 100644
---- a/drivers/hid/usbhid/hid-quirks.c
-+++ b/drivers/hid/usbhid/hid-quirks.c
-@@ -325,6 +325,10 @@
- #define USB_DEVICE_ID_MGE_UPS 0xffff
- #define USB_DEVICE_ID_MGE_UPS1 0x0001
-
-+#define USB_VENDOR_ID_MICROCHIP 0x04d8
-+#define USB_DEVICE_ID_PICKIT1 0x0032
-+#define USB_DEVICE_ID_PICKIT2 0x0033
-+
- #define USB_VENDOR_ID_MICROSOFT 0x045e
- #define USB_DEVICE_ID_SIDEWINDER_GV 0x003b
- #define USB_DEVICE_ID_WIRELESS_OPTICAL_DESKTOP_3_0 0x009d
-@@ -371,6 +375,9 @@
- #define USB_VENDOR_ID_SONY 0x054c
- #define USB_DEVICE_ID_SONY_PS3_CONTROLLER 0x0268
-
-+#define USB_VENDOR_ID_SOUNDGRAPH 0x15c2
-+#define USB_DEVICE_ID_SOUNDGRAPH_IMON_LCD 0x0038
-+
- #define USB_VENDOR_ID_SUN 0x0430
- #define USB_DEVICE_ID_RARITAN_KVM_DONGLE 0xcdab
-
-@@ -567,6 +574,7 @@ static const struct hid_blacklist {
- { USB_VENDOR_ID_PANJIT, 0x0002, HID_QUIRK_IGNORE },
- { USB_VENDOR_ID_PANJIT, 0x0003, HID_QUIRK_IGNORE },
- { USB_VENDOR_ID_PANJIT, 0x0004, HID_QUIRK_IGNORE },
-+ { USB_VENDOR_ID_SOUNDGRAPH, USB_DEVICE_ID_SOUNDGRAPH_IMON_LCD, HID_QUIRK_IGNORE },
- { USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_LABPRO, HID_QUIRK_IGNORE },
- { USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_GOTEMP, HID_QUIRK_IGNORE },
- { USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_SKIP, HID_QUIRK_IGNORE },
-@@ -580,6 +588,9 @@ static const struct hid_blacklist {
- { USB_VENDOR_ID_ACECAD, USB_DEVICE_ID_ACECAD_FLAIR, HID_QUIRK_IGNORE },
- { USB_VENDOR_ID_ACECAD, USB_DEVICE_ID_ACECAD_302, HID_QUIRK_IGNORE },
-
-+ { USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICKIT1, HID_QUIRK_IGNORE },
-+ { USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICKIT2, HID_QUIRK_IGNORE },
-+
- { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_ELITE_KBD, HID_QUIRK_LOGITECH_IGNORE_DOUBLED_WHEEL | HID_QUIRK_LOGITECH_EXPANDED_KEYMAP },
- { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_CORDLESS_DESKTOP_LX500, HID_QUIRK_LOGITECH_IGNORE_DOUBLED_WHEEL | HID_QUIRK_LOGITECH_EXPANDED_KEYMAP },
-
-@@ -611,28 +622,28 @@ static const struct hid_blacklist {
-
- { USB_VENDOR_ID_WISEGROUP_LTD, USB_DEVICE_ID_SMARTJOY_DUAL_PLUS, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT },
-
-- { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
-- { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ISO, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
-- { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ANSI, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
-- { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ISO, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_APPLE_ISO_KEYBOARD},
-- { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_JIS, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
-- { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ANSI, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
-- { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ISO, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_APPLE_ISO_KEYBOARD},
-- { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_JIS, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
-- { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ANSI, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
-- { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ISO, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_APPLE_ISO_KEYBOARD},
-- { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_JIS, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
-+ { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
-+ { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ISO, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
-+ { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ANSI, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
-+ { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ISO, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_APPLE_ISO_KEYBOARD},
-+ { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_JIS, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
-+ { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ANSI, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
-+ { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ISO, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_APPLE_ISO_KEYBOARD},
-+ { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_JIS, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
-+ { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ANSI, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
-+ { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ISO, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_APPLE_ISO_KEYBOARD},
-+ { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_JIS, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
- { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_ANSI, HID_QUIRK_APPLE_HAS_FN },
- { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_ISO, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_APPLE_ISO_KEYBOARD },
- { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_JIS, HID_QUIRK_APPLE_HAS_FN },
-- { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ANSI, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
-- { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ISO, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
-- { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
-- { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI, HID_QUIRK_APPLE_HAS_FN },
-- { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_APPLE_ISO_KEYBOARD },
-- { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS, HID_QUIRK_APPLE_HAS_FN },
-- { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
-- { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
-+ { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ANSI, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
-+ { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ISO, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
-+ { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
-+ { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN },
-+ { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_APPLE_ISO_KEYBOARD },
-+ { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN },
-+ { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
-+ { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
-
- { USB_VENDOR_ID_DELL, USB_DEVICE_ID_DELL_W7658, HID_QUIRK_RESET_LEDS },
- { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_KBD, HID_QUIRK_RESET_LEDS },
-diff --git a/drivers/hid/usbhid/usbkbd.c b/drivers/hid/usbhid/usbkbd.c
-index 5d9dbb4..3cd46d2 100644
---- a/drivers/hid/usbhid/usbkbd.c
-+++ b/drivers/hid/usbhid/usbkbd.c
-@@ -1,6 +1,4 @@
- /*
-- * $Id: usbkbd.c,v 1.27 2001/12/27 10:37:41 vojtech Exp $
-- *
- * Copyright (c) 1999-2001 Vojtech Pavlik
- *
- * USB HIDBP Keyboard support
-diff --git a/drivers/hid/usbhid/usbmouse.c b/drivers/hid/usbhid/usbmouse.c
-index df0d96d..703e9d0 100644
---- a/drivers/hid/usbhid/usbmouse.c
-+++ b/drivers/hid/usbhid/usbmouse.c
-@@ -1,6 +1,4 @@
- /*
-- * $Id: usbmouse.c,v 1.15 2001/12/27 10:37:41 vojtech Exp $
-- *
- * Copyright (c) 1999-2001 Vojtech Pavlik
- *
- * USB HIDBP Mouse support
-diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig
-index 4dc76bc..00ff533 100644
---- a/drivers/hwmon/Kconfig
-+++ b/drivers/hwmon/Kconfig
-@@ -330,6 +330,20 @@ config SENSORS_CORETEMP
- sensor inside your CPU. Supported all are all known variants
- of Intel Core family.
-
-+config SENSORS_IBMAEM
-+ tristate "IBM Active Energy Manager temperature/power sensors and control"
-+ select IPMI_SI
-+ depends on IPMI_HANDLER
-+ help
-+ If you say yes here you get support for the temperature and
-+ power sensors and capping hardware in various IBM System X
-+ servers that support Active Energy Manager. This includes
-+ the x3350, x3550, x3650, x3655, x3755, x3850 M2, x3950 M2,
-+ and certain HS2x/LS2x/QS2x blades.
-+
-+ This driver can also be built as a module. If so, the module
-+ will be called ibmaem.
-+
- config SENSORS_IBMPEX
- tristate "IBM PowerExecutive temperature/power sensors"
- select IPMI_SI
-diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile
-index 3bdb05a..d098677 100644
---- a/drivers/hwmon/Makefile
-+++ b/drivers/hwmon/Makefile
-@@ -41,6 +41,7 @@ obj-$(CONFIG_SENSORS_GL518SM) += gl518sm.o
- obj-$(CONFIG_SENSORS_GL520SM) += gl520sm.o
- obj-$(CONFIG_SENSORS_HDAPS) += hdaps.o
- obj-$(CONFIG_SENSORS_I5K_AMB) += i5k_amb.o
-+obj-$(CONFIG_SENSORS_IBMAEM) += ibmaem.o
- obj-$(CONFIG_SENSORS_IBMPEX) += ibmpex.o
- obj-$(CONFIG_SENSORS_IT87) += it87.o
- obj-$(CONFIG_SENSORS_K8TEMP) += k8temp.o
-diff --git a/drivers/hwmon/hdaps.c b/drivers/hwmon/hdaps.c
-index bab5fd2..88e8965 100644
---- a/drivers/hwmon/hdaps.c
-+++ b/drivers/hwmon/hdaps.c
-@@ -515,6 +515,7 @@ static struct dmi_system_id __initdata hdaps_whitelist[] = {
- HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad R50"),
- HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad R51"),
- HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad R52"),
-+ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad R61i"),
- HDAPS_DMI_MATCH_INVERT("IBM", "ThinkPad T41p"),
- HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad T41"),
- HDAPS_DMI_MATCH_INVERT("IBM", "ThinkPad T42p"),
-diff --git a/drivers/hwmon/i5k_amb.c b/drivers/hwmon/i5k_amb.c
-index 6ac5c6f..f9e2ed6 100644
---- a/drivers/hwmon/i5k_amb.c
-+++ b/drivers/hwmon/i5k_amb.c
-@@ -111,6 +111,7 @@ struct i5k_amb_data {
- void __iomem *amb_mmio;
- struct i5k_device_attribute *attrs;
- unsigned int num_attrs;
-+ unsigned long chipset_id;
- };
-
- static ssize_t show_name(struct device *dev, struct device_attribute *devattr,
-@@ -382,7 +383,8 @@ err:
- return res;
- }
-
--static int __devinit i5k_find_amb_registers(struct i5k_amb_data *data)
-+static int __devinit i5k_find_amb_registers(struct i5k_amb_data *data,
-+ unsigned long devid)
- {
- struct pci_dev *pcidev;
- u32 val32;
-@@ -390,7 +392,7 @@ static int __devinit i5k_find_amb_registers(struct i5k_amb_data *data)
-
- /* Find AMB register memory space */
- pcidev = pci_get_device(PCI_VENDOR_ID_INTEL,
-- PCI_DEVICE_ID_INTEL_5000_ERR,
-+ devid,
- NULL);
- if (!pcidev)
- return -ENODEV;
-@@ -409,6 +411,8 @@ static int __devinit i5k_find_amb_registers(struct i5k_amb_data *data)
- goto out;
- }
-
-+ data->chipset_id = devid;
-+
- res = 0;
- out:
- pci_dev_put(pcidev);
-@@ -441,10 +445,30 @@ out:
- return res;
- }
-
-+static unsigned long i5k_channel_pci_id(struct i5k_amb_data *data,
-+ unsigned long channel)
-+{
-+ switch (data->chipset_id) {
-+ case PCI_DEVICE_ID_INTEL_5000_ERR:
-+ return PCI_DEVICE_ID_INTEL_5000_FBD0 + channel;
-+ case PCI_DEVICE_ID_INTEL_5400_ERR:
-+ return PCI_DEVICE_ID_INTEL_5400_FBD0 + channel;
-+ default:
-+ BUG();
-+ }
-+}
-+
-+static unsigned long chipset_ids[] = {
-+ PCI_DEVICE_ID_INTEL_5000_ERR,
-+ PCI_DEVICE_ID_INTEL_5400_ERR,
-+ 0
-+};
-+
- static int __devinit i5k_amb_probe(struct platform_device *pdev)
- {
- struct i5k_amb_data *data;
- struct resource *reso;
-+ int i;
- int res = -ENODEV;
-
- data = kzalloc(sizeof(*data), GFP_KERNEL);
-@@ -452,19 +476,24 @@ static int __devinit i5k_amb_probe(struct platform_device *pdev)
- return -ENOMEM;
-
- /* Figure out where the AMB registers live */
-- res = i5k_find_amb_registers(data);
-+ i = 0;
-+ do {
-+ res = i5k_find_amb_registers(data, chipset_ids[i]);
-+ i++;
-+ } while (res && chipset_ids[i]);
-+
- if (res)
- goto err;
-
- /* Copy the DIMM presence map for the first two channels */
- res = i5k_channel_probe(&data->amb_present[0],
-- PCI_DEVICE_ID_INTEL_5000_FBD0);
-+ i5k_channel_pci_id(data, 0));
- if (res)
- goto err;
-
- /* Copy the DIMM presence map for the optional second two channels */
- i5k_channel_probe(&data->amb_present[2],
-- PCI_DEVICE_ID_INTEL_5000_FBD1);
-+ i5k_channel_pci_id(data, 1));
-
- /* Set up resource regions */
- reso = request_mem_region(data->amb_base, data->amb_len, DRVNAME);
-diff --git a/drivers/hwmon/ibmaem.c b/drivers/hwmon/ibmaem.c
-new file mode 100644
-index 0000000..5c006c9
---- /dev/null
-+++ b/drivers/hwmon/ibmaem.c
-@@ -0,0 +1,1111 @@
-+/*
-+ * A hwmon driver for the IBM Active Energy Manager temperature/power sensors
-+ * and capping functionality.
-+ * Copyright (C) 2008 IBM
-+ *
-+ * Author: Darrick J. Wong
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ */
-+
-+#include
-+#include
-+#include
-+#include
-+#include
-+#include
-+#include
-+#include
-+#include
-+#include
-+#include
-+#include
-+#include
-+
-+#define REFRESH_INTERVAL (HZ)
-+#define IPMI_TIMEOUT (30 * HZ)
-+#define DRVNAME "aem"
-+
-+#define AEM_NETFN 0x2E
-+
-+#define AEM_FIND_FW_CMD 0x80
-+#define AEM_ELEMENT_CMD 0x81
-+#define AEM_FW_INSTANCE_CMD 0x82
-+
-+#define AEM_READ_ELEMENT_CFG 0x80
-+#define AEM_READ_BUFFER 0x81
-+#define AEM_READ_REGISTER 0x82
-+#define AEM_WRITE_REGISTER 0x83
-+#define AEM_SET_REG_MASK 0x84
-+#define AEM_CLEAR_REG_MASK 0x85
-+#define AEM_READ_ELEMENT_CFG2 0x86
-+
-+#define AEM_CONTROL_ELEMENT 0
-+#define AEM_ENERGY_ELEMENT 1
-+#define AEM_CLOCK_ELEMENT 4
-+#define AEM_POWER_CAP_ELEMENT 7
-+#define AEM_EXHAUST_ELEMENT 9
-+#define AEM_POWER_ELEMENT 10
-+
-+#define AEM_MODULE_TYPE_ID 0x0001
-+
-+#define AEM2_NUM_ENERGY_REGS 2
-+#define AEM2_NUM_PCAP_REGS 6
-+#define AEM2_NUM_TEMP_REGS 2
-+#define AEM2_NUM_SENSORS 14
-+
-+#define AEM1_NUM_ENERGY_REGS 1
-+#define AEM1_NUM_SENSORS 3
-+
-+/* AEM 2.x has more energy registers */
-+#define AEM_NUM_ENERGY_REGS AEM2_NUM_ENERGY_REGS
-+/* AEM 2.x needs more sensor files */
-+#define AEM_NUM_SENSORS AEM2_NUM_SENSORS
-+
-+#define POWER_CAP 0
-+#define POWER_CAP_MAX_HOTPLUG 1
-+#define POWER_CAP_MAX 2
-+#define POWER_CAP_MIN_WARNING 3
-+#define POWER_CAP_MIN 4
-+#define POWER_AUX 5
-+
-+#define AEM_DEFAULT_POWER_INTERVAL 1000
-+#define AEM_MIN_POWER_INTERVAL 200
-+#define UJ_PER_MJ 1000L
-+
-+static DEFINE_IDR(aem_idr);
-+static DEFINE_SPINLOCK(aem_idr_lock);
-+
-+static struct device_driver aem_driver = {
-+ .name = DRVNAME,
-+ .bus = &platform_bus_type,
-+};
-+
-+struct aem_ipmi_data {
-+ struct completion read_complete;
-+ struct ipmi_addr address;
-+ ipmi_user_t user;
-+ int interface;
-+
-+ struct kernel_ipmi_msg tx_message;
-+ long tx_msgid;
-+
-+ void *rx_msg_data;
-+ unsigned short rx_msg_len;
-+ unsigned char rx_result;
-+ int rx_recv_type;
-+
-+ struct device *bmc_device;
-+};
-+
-+struct aem_ro_sensor_template {
-+ char *label;
-+ ssize_t (*show)(struct device *dev,
-+ struct device_attribute *devattr,
-+ char *buf);
-+ int index;
-+};
-+
-+struct aem_rw_sensor_template {
-+ char *label;
-+ ssize_t (*show)(struct device *dev,
-+ struct device_attribute *devattr,
-+ char *buf);
-+ ssize_t (*set)(struct device *dev,
-+ struct device_attribute *devattr,
-+ const char *buf, size_t count);
-+ int index;
-+};
-+
-+struct aem_data {
-+ struct list_head list;
-+
-+ struct device *hwmon_dev;
-+ struct platform_device *pdev;
-+ struct mutex lock;
-+ char valid;
-+ unsigned long last_updated; /* In jiffies */
-+ u8 ver_major;
-+ u8 ver_minor;
-+ u8 module_handle;
-+ int id;
-+ struct aem_ipmi_data ipmi;
-+
-+ /* Function to update sensors */
-+ void (*update)(struct aem_data *data);
-+
-+ /*
-+ * AEM 1.x sensors:
-+ * Available sensors:
-+ * Energy meter
-+ * Power meter
-+ *
-+ * AEM 2.x sensors:
-+ * Two energy meters
-+ * Two power meters
-+ * Two temperature sensors
-+ * Six power cap registers
-+ */
-+
-+ /* sysfs attrs */
-+ struct sensor_device_attribute sensors[AEM_NUM_SENSORS];
-+
-+ /* energy use in mJ */
-+ u64 energy[AEM_NUM_ENERGY_REGS];
-+
-+ /* power sampling interval in ms */
-+ unsigned long power_period[AEM_NUM_ENERGY_REGS];
-+
-+ /* Everything past here is for AEM2 only */
-+
-+ /* power caps in dW */
-+ u16 pcap[AEM2_NUM_PCAP_REGS];
-+
-+ /* exhaust temperature in C */
-+ u8 temp[AEM2_NUM_TEMP_REGS];
-+};
-+
-+/* Data structures returned by the AEM firmware */
-+struct aem_iana_id {
-+ u8 bytes[3];
-+};
-+static struct aem_iana_id system_x_id = {
-+ .bytes = {0x4D, 0x4F, 0x00}
-+};
-+
-+/* These are used to find AEM1 instances */
-+struct aem_find_firmware_req {
-+ struct aem_iana_id id;
-+ u8 rsvd;
-+ u16 index;
-+ u16 module_type_id;
-+} __packed;
-+
-+struct aem_find_firmware_resp {
-+ struct aem_iana_id id;
-+ u8 num_instances;
-+} __packed;
-+
-+/* These are used to find AEM2 instances */
-+struct aem_find_instance_req {
-+ struct aem_iana_id id;
-+ u8 instance_number;
-+ u16 module_type_id;
-+} __packed;
-+
-+struct aem_find_instance_resp {
-+ struct aem_iana_id id;
-+ u8 num_instances;
-+ u8 major;
-+ u8 minor;
-+ u8 module_handle;
-+ u16 record_id;
-+} __packed;
-+
-+/* These are used to query sensors */
-+struct aem_read_sensor_req {
-+ struct aem_iana_id id;
-+ u8 module_handle;
-+ u8 element;
-+ u8 subcommand;
-+ u8 reg;
-+ u8 rx_buf_size;
-+} __packed;
-+
-+struct aem_read_sensor_resp {
-+ struct aem_iana_id id;
-+ u8 bytes[0];
-+} __packed;
-+
-+/* Data structures to talk to the IPMI layer */
-+struct aem_driver_data {
-+ struct list_head aem_devices;
-+ struct ipmi_smi_watcher bmc_events;
-+ struct ipmi_user_hndl ipmi_hndlrs;
-+};
-+
-+static void aem_register_bmc(int iface, struct device *dev);
-+static void aem_bmc_gone(int iface);
-+static void aem_msg_handler(struct ipmi_recv_msg *msg, void *user_msg_data);
-+
-+static void aem_remove_sensors(struct aem_data *data);
-+static int aem_init_aem1(struct aem_ipmi_data *probe);
-+static int aem_init_aem2(struct aem_ipmi_data *probe);
-+static int aem1_find_sensors(struct aem_data *data);
-+static int aem2_find_sensors(struct aem_data *data);
-+static void update_aem1_sensors(struct aem_data *data);
-+static void update_aem2_sensors(struct aem_data *data);
-+
-+static struct aem_driver_data driver_data = {
-+ .aem_devices = LIST_HEAD_INIT(driver_data.aem_devices),
-+ .bmc_events = {
-+ .owner = THIS_MODULE,
-+ .new_smi = aem_register_bmc,
-+ .smi_gone = aem_bmc_gone,
-+ },
-+ .ipmi_hndlrs = {
-+ .ipmi_recv_hndl = aem_msg_handler,
-+ },
-+};
-+
-+/* Functions to talk to the IPMI layer */
-+
-+/* Initialize IPMI address, message buffers and user data */
-+static int aem_init_ipmi_data(struct aem_ipmi_data *data, int iface,
-+ struct device *bmc)
-+{
-+ int err;
-+
-+ init_completion(&data->read_complete);
-+ data->bmc_device = bmc;
-+
-+ /* Initialize IPMI address */
-+ data->address.addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE;
-+ data->address.channel = IPMI_BMC_CHANNEL;
-+ data->address.data[0] = 0;
-+ data->interface = iface;
-+
-+ /* Initialize message buffers */
-+ data->tx_msgid = 0;
-+ data->tx_message.netfn = AEM_NETFN;
-+
-+ /* Create IPMI messaging interface user */
-+ err = ipmi_create_user(data->interface, &driver_data.ipmi_hndlrs,
-+ data, &data->user);
-+ if (err < 0) {
-+ dev_err(bmc, "Unable to register user with IPMI "
-+ "interface %d\n", data->interface);
-+ return -EACCES;
-+ }
-+
-+ return 0;
-+}
-+
-+/* Send an IPMI command */
-+static int aem_send_message(struct aem_ipmi_data *data)
-+{
-+ int err;
-+
-+ err = ipmi_validate_addr(&data->address, sizeof(data->address));
-+ if (err)
-+ goto out;
-+
-+ data->tx_msgid++;
-+ err = ipmi_request_settime(data->user, &data->address, data->tx_msgid,
-+ &data->tx_message, data, 0, 0, 0);
-+ if (err)
-+ goto out1;
-+
-+ return 0;
-+out1:
-+ dev_err(data->bmc_device, "request_settime=%x\n", err);
-+ return err;
-+out:
-+ dev_err(data->bmc_device, "validate_addr=%x\n", err);
-+ return err;
-+}
-+
-+/* Dispatch IPMI messages to callers */
-+static void aem_msg_handler(struct ipmi_recv_msg *msg, void *user_msg_data)
-+{
-+ unsigned short rx_len;
-+ struct aem_ipmi_data *data = user_msg_data;
-+
-+ if (msg->msgid != data->tx_msgid) {
-+ dev_err(data->bmc_device, "Mismatch between received msgid "
-+ "(%02x) and transmitted msgid (%02x)!\n",
-+ (int)msg->msgid,
-+ (int)data->tx_msgid);
-+ ipmi_free_recv_msg(msg);
-+ return;
-+ }
-+
-+ data->rx_recv_type = msg->recv_type;
-+ if (msg->msg.data_len > 0)
-+ data->rx_result = msg->msg.data[0];
-+ else
-+ data->rx_result = IPMI_UNKNOWN_ERR_COMPLETION_CODE;
-+
-+ if (msg->msg.data_len > 1) {
-+ rx_len = msg->msg.data_len - 1;
-+ if (data->rx_msg_len < rx_len)
-+ rx_len = data->rx_msg_len;
-+ data->rx_msg_len = rx_len;
-+ memcpy(data->rx_msg_data, msg->msg.data + 1, data->rx_msg_len);
-+ } else
-+ data->rx_msg_len = 0;
-+
-+ ipmi_free_recv_msg(msg);
-+ complete(&data->read_complete);
-+}
-+
-+/* ID functions */
-+
-+/* Obtain an id */
-+static int aem_idr_get(int *id)
-+{
-+ int i, err;
-+
-+again:
-+ if (unlikely(!idr_pre_get(&aem_idr, GFP_KERNEL)))
-+ return -ENOMEM;
-+
-+ spin_lock(&aem_idr_lock);
-+ err = idr_get_new(&aem_idr, NULL, &i);
-+ spin_unlock(&aem_idr_lock);
-+
-+ if (unlikely(err == -EAGAIN))
-+ goto again;
-+ else if (unlikely(err))
-+ return err;
-+
-+ *id = i & MAX_ID_MASK;
-+ return 0;
-+}
-+
-+/* Release an object ID */
-+static void aem_idr_put(int id)
-+{
-+ spin_lock(&aem_idr_lock);
-+ idr_remove(&aem_idr, id);
-+ spin_unlock(&aem_idr_lock);
-+}
-+
-+/* Sensor support functions */
-+
-+/* Read a sensor value */
-+static int aem_read_sensor(struct aem_data *data, u8 elt, u8 reg,
-+ void *buf, size_t size)
-+{
-+ int rs_size, res;
-+ struct aem_read_sensor_req rs_req;
-+ struct aem_read_sensor_resp *rs_resp;
-+ struct aem_ipmi_data *ipmi = &data->ipmi;
-+
-+ /* AEM registers are 1, 2, 4 or 8 bytes */
-+ switch (size) {
-+ case 1:
-+ case 2:
-+ case 4:
-+ case 8:
-+ break;
-+ default:
-+ return -EINVAL;
-+ }
-+
-+ rs_req.id = system_x_id;
-+ rs_req.module_handle = data->module_handle;
-+ rs_req.element = elt;
-+ rs_req.subcommand = AEM_READ_REGISTER;
-+ rs_req.reg = reg;
-+ rs_req.rx_buf_size = size;
-+
-+ ipmi->tx_message.cmd = AEM_ELEMENT_CMD;
-+ ipmi->tx_message.data = (char *)&rs_req;
-+ ipmi->tx_message.data_len = sizeof(rs_req);
-+
-+ rs_size = sizeof(*rs_resp) + size;
-+ rs_resp = kzalloc(rs_size, GFP_KERNEL);
-+ if (!rs_resp)
-+ return -ENOMEM;
-+
-+ ipmi->rx_msg_data = rs_resp;
-+ ipmi->rx_msg_len = rs_size;
-+
-+ aem_send_message(ipmi);
-+
-+ res = wait_for_completion_timeout(&ipmi->read_complete, IPMI_TIMEOUT);
-+ if (!res)
-+ return -ETIMEDOUT;
-+
-+ if (ipmi->rx_result || ipmi->rx_msg_len != rs_size ||
-+ memcmp(&rs_resp->id, &system_x_id, sizeof(system_x_id))) {
-+ kfree(rs_resp);
-+ return -ENOENT;
-+ }
-+
-+ switch (size) {
-+ case 1: {
-+ u8 *x = buf;
-+ *x = rs_resp->bytes[0];
-+ break;
-+ }
-+ case 2: {
-+ u16 *x = buf;
-+ *x = be16_to_cpup((u16 *)rs_resp->bytes);
-+ break;
-+ }
-+ case 4: {
-+ u32 *x = buf;
-+ *x = be32_to_cpup((u32 *)rs_resp->bytes);
-+ break;
-+ }
-+ case 8: {
-+ u64 *x = buf;
-+ *x = be64_to_cpup((u64 *)rs_resp->bytes);
-+ break;
-+ }
-+ }
-+
-+ return 0;
-+}
-+
-+/* Update AEM energy registers */
-+static void update_aem_energy(struct aem_data *data)
-+{
-+ aem_read_sensor(data, AEM_ENERGY_ELEMENT, 0, &data->energy[0], 8);
-+ if (data->ver_major < 2)
-+ return;
-+ aem_read_sensor(data, AEM_ENERGY_ELEMENT, 1, &data->energy[1], 8);
-+}
-+
-+/* Update all AEM1 sensors */
-+static void update_aem1_sensors(struct aem_data *data)
-+{
-+ mutex_lock(&data->lock);
-+ if (time_before(jiffies, data->last_updated + REFRESH_INTERVAL) &&
-+ data->valid)
-+ goto out;
-+
-+ update_aem_energy(data);
-+out:
-+ mutex_unlock(&data->lock);
-+}
-+
-+/* Update all AEM2 sensors */
-+static void update_aem2_sensors(struct aem_data *data)
-+{
-+ int i;
-+
-+ mutex_lock(&data->lock);
-+ if (time_before(jiffies, data->last_updated + REFRESH_INTERVAL) &&
-+ data->valid)
-+ goto out;
-+
-+ update_aem_energy(data);
-+ aem_read_sensor(data, AEM_EXHAUST_ELEMENT, 0, &data->temp[0], 1);
-+ aem_read_sensor(data, AEM_EXHAUST_ELEMENT, 1, &data->temp[1], 1);
-+
-+ for (i = POWER_CAP; i <= POWER_AUX; i++)
-+ aem_read_sensor(data, AEM_POWER_CAP_ELEMENT, i,
-+ &data->pcap[i], 2);
-+out:
-+ mutex_unlock(&data->lock);
-+}
-+
-+/* Delete an AEM instance */
-+static void aem_delete(struct aem_data *data)
-+{
-+ list_del(&data->list);
-+ aem_remove_sensors(data);
-+ hwmon_device_unregister(data->hwmon_dev);
-+ ipmi_destroy_user(data->ipmi.user);
-+ dev_set_drvdata(&data->pdev->dev, NULL);
-+ platform_device_unregister(data->pdev);
-+ aem_idr_put(data->id);
-+ kfree(data);
-+}
-+
-+/* Probe functions for AEM1 devices */
-+
-+/* Retrieve version and module handle for an AEM1 instance */
-+static int aem_find_aem1_count(struct aem_ipmi_data *data)
-+{
-+ int res;
-+ struct aem_find_firmware_req ff_req;
-+ struct aem_find_firmware_resp ff_resp;
-+
-+ ff_req.id = system_x_id;
-+ ff_req.index = 0;
-+ ff_req.module_type_id = cpu_to_be16(AEM_MODULE_TYPE_ID);
-+
-+ data->tx_message.cmd = AEM_FIND_FW_CMD;
-+ data->tx_message.data = (char *)&ff_req;
-+ data->tx_message.data_len = sizeof(ff_req);
-+
-+ data->rx_msg_data = &ff_resp;
-+ data->rx_msg_len = sizeof(ff_resp);
-+
-+ aem_send_message(data);
-+
-+ res = wait_for_completion_timeout(&data->read_complete, IPMI_TIMEOUT);
-+ if (!res)
-+ return -ETIMEDOUT;
-+
-+ if (data->rx_result || data->rx_msg_len != sizeof(ff_resp) ||
-+ memcmp(&ff_resp.id, &system_x_id, sizeof(system_x_id)))
-+ return -ENOENT;
-+
-+ return ff_resp.num_instances;
-+}
-+
-+/* Find and initialize one AEM1 instance */
-+static int aem_init_aem1_inst(struct aem_ipmi_data *probe, u8 module_handle)
-+{
-+ struct aem_data *data;
-+ int i;
-+ int res = -ENOMEM;
-+
-+ data = kzalloc(sizeof(*data), GFP_KERNEL);
-+ if (!data)
-+ return res;
-+ mutex_init(&data->lock);
-+
-+ /* Copy instance data */
-+ data->ver_major = 1;
-+ data->ver_minor = 0;
-+ data->module_handle = module_handle;
-+ for (i = 0; i < AEM1_NUM_ENERGY_REGS; i++)
-+ data->power_period[i] = AEM_DEFAULT_POWER_INTERVAL;
-+
-+ /* Create sub-device for this fw instance */
-+ if (aem_idr_get(&data->id))
-+ goto id_err;
-+
-+ data->pdev = platform_device_alloc(DRVNAME, data->id);
-+ if (!data->pdev)
-+ goto dev_err;
-+ data->pdev->dev.driver = &aem_driver;
-+
-+ res = platform_device_add(data->pdev);
-+ if (res)
-+ goto ipmi_err;
-+
-+ dev_set_drvdata(&data->pdev->dev, data);
-+
-+ /* Set up IPMI interface */
-+ if (aem_init_ipmi_data(&data->ipmi, probe->interface,
-+ probe->bmc_device))
-+ goto ipmi_err;
-+
-+ /* Register with hwmon */
-+ data->hwmon_dev = hwmon_device_register(&data->pdev->dev);
-+
-+ if (IS_ERR(data->hwmon_dev)) {
-+ dev_err(&data->pdev->dev, "Unable to register hwmon "
-+ "device for IPMI interface %d\n",
-+ probe->interface);
-+ goto hwmon_reg_err;
-+ }
-+
-+ data->update = update_aem1_sensors;
-+
-+ /* Find sensors */
-+ if (aem1_find_sensors(data))
-+ goto sensor_err;
-+
-+ /* Add to our list of AEM devices */
-+ list_add_tail(&data->list, &driver_data.aem_devices);
-+
-+ dev_info(data->ipmi.bmc_device, "Found AEM v%d.%d at 0x%X\n",
-+ data->ver_major, data->ver_minor,
-+ data->module_handle);
-+ return 0;
-+
-+sensor_err:
-+ hwmon_device_unregister(data->hwmon_dev);
-+hwmon_reg_err:
-+ ipmi_destroy_user(data->ipmi.user);
-+ipmi_err:
-+ dev_set_drvdata(&data->pdev->dev, NULL);
-+ platform_device_unregister(data->pdev);
-+dev_err:
-+ aem_idr_put(data->id);
-+id_err:
-+ kfree(data);
-+
-+ return res;
-+}
-+
-+/* Find and initialize all AEM1 instances */
-+static int aem_init_aem1(struct aem_ipmi_data *probe)
-+{
-+ int num, i, err;
-+
-+ num = aem_find_aem1_count(probe);
-+ for (i = 0; i < num; i++) {
-+ err = aem_init_aem1_inst(probe, i);
-+ if (err) {
-+ dev_err(probe->bmc_device,
-+ "Error %d initializing AEM1 0x%X\n",
-+ err, i);
-+ return err;
-+ }
-+ }
-+
-+ return 0;
-+}
-+
-+/* Probe functions for AEM2 devices */
-+
-+/* Retrieve version and module handle for an AEM2 instance */
-+static int aem_find_aem2(struct aem_ipmi_data *data,
-+ struct aem_find_instance_resp *fi_resp,
-+ int instance_num)
-+{
-+ int res;
-+ struct aem_find_instance_req fi_req;
-+
-+ fi_req.id = system_x_id;
-+ fi_req.instance_number = instance_num;
-+ fi_req.module_type_id = cpu_to_be16(AEM_MODULE_TYPE_ID);
-+
-+ data->tx_message.cmd = AEM_FW_INSTANCE_CMD;
-+ data->tx_message.data = (char *)&fi_req;
-+ data->tx_message.data_len = sizeof(fi_req);
-+
-+ data->rx_msg_data = fi_resp;
-+ data->rx_msg_len = sizeof(*fi_resp);
-+
-+ aem_send_message(data);
-+
-+ res = wait_for_completion_timeout(&data->read_complete, IPMI_TIMEOUT);
-+ if (!res)
-+ return -ETIMEDOUT;
-+
-+ if (data->rx_result || data->rx_msg_len != sizeof(*fi_resp) ||
-+ memcmp(&fi_resp->id, &system_x_id, sizeof(system_x_id)))
-+ return -ENOENT;
-+
-+ return 0;
-+}
-+
-+/* Find and initialize one AEM2 instance */
-+static int aem_init_aem2_inst(struct aem_ipmi_data *probe,
-+ struct aem_find_instance_resp *fi_resp)
-+{
-+ struct aem_data *data;
-+ int i;
-+ int res = -ENOMEM;
-+
-+ data = kzalloc(sizeof(*data), GFP_KERNEL);
-+ if (!data)
-+ return res;
-+ mutex_init(&data->lock);
-+
-+ /* Copy instance data */
-+ data->ver_major = fi_resp->major;
-+ data->ver_minor = fi_resp->minor;
-+ data->module_handle = fi_resp->module_handle;
-+ for (i = 0; i < AEM2_NUM_ENERGY_REGS; i++)
-+ data->power_period[i] = AEM_DEFAULT_POWER_INTERVAL;
-+
-+ /* Create sub-device for this fw instance */
-+ if (aem_idr_get(&data->id))
-+ goto id_err;
-+
-+ data->pdev = platform_device_alloc(DRVNAME, data->id);
-+ if (!data->pdev)
-+ goto dev_err;
-+ data->pdev->dev.driver = &aem_driver;
-+
-+ res = platform_device_add(data->pdev);
-+ if (res)
-+ goto ipmi_err;
-+
-+ dev_set_drvdata(&data->pdev->dev, data);
-+
-+ /* Set up IPMI interface */
-+ if (aem_init_ipmi_data(&data->ipmi, probe->interface,
-+ probe->bmc_device))
-+ goto ipmi_err;
-+
-+ /* Register with hwmon */
-+ data->hwmon_dev = hwmon_device_register(&data->pdev->dev);
-+
-+ if (IS_ERR(data->hwmon_dev)) {
-+ dev_err(&data->pdev->dev, "Unable to register hwmon "
-+ "device for IPMI interface %d\n",
-+ probe->interface);
-+ goto hwmon_reg_err;
-+ }
-+
-+ data->update = update_aem2_sensors;
-+
-+ /* Find sensors */
-+ if (aem2_find_sensors(data))
-+ goto sensor_err;
-+
-+ /* Add to our list of AEM devices */
-+ list_add_tail(&data->list, &driver_data.aem_devices);
-+
-+ dev_info(data->ipmi.bmc_device, "Found AEM v%d.%d at 0x%X\n",
-+ data->ver_major, data->ver_minor,
-+ data->module_handle);
-+ return 0;
-+
-+sensor_err:
-+ hwmon_device_unregister(data->hwmon_dev);
-+hwmon_reg_err:
-+ ipmi_destroy_user(data->ipmi.user);
-+ipmi_err:
-+ dev_set_drvdata(&data->pdev->dev, NULL);
-+ platform_device_unregister(data->pdev);
-+dev_err:
-+ aem_idr_put(data->id);
-+id_err:
-+ kfree(data);
-+
-+ return res;
-+}
-+
-+/* Find and initialize all AEM2 instances */
-+static int aem_init_aem2(struct aem_ipmi_data *probe)
-+{
-+ struct aem_find_instance_resp fi_resp;
-+ int err;
-+ int i = 0;
-+
-+ while (!aem_find_aem2(probe, &fi_resp, i)) {
-+ if (fi_resp.major != 2) {
-+ dev_err(probe->bmc_device, "Unknown AEM v%d; please "
-+ "report this to the maintainer.\n",
-+ fi_resp.major);
-+ i++;
-+ continue;
-+ }
-+ err = aem_init_aem2_inst(probe, &fi_resp);
-+ if (err) {
-+ dev_err(probe->bmc_device,
-+ "Error %d initializing AEM2 0x%X\n",
-+ err, fi_resp.module_handle);
-+ return err;
-+ }
-+ i++;
-+ }
-+
-+ return 0;
-+}
-+
-+/* Probe a BMC for AEM firmware instances */
-+static void aem_register_bmc(int iface, struct device *dev)
-+{
-+ struct aem_ipmi_data probe;
-+
-+ if (aem_init_ipmi_data(&probe, iface, dev))
-+ return;
-+
-+ /* Ignore probe errors; they won't cause problems */
-+ aem_init_aem1(&probe);
-+ aem_init_aem2(&probe);
-+
-+ ipmi_destroy_user(probe.user);
-+}
-+
-+/* Handle BMC deletion */
-+static void aem_bmc_gone(int iface)
-+{
-+ struct aem_data *p1, *next1;
-+
-+ list_for_each_entry_safe(p1, next1, &driver_data.aem_devices, list)
-+ if (p1->ipmi.interface == iface)
-+ aem_delete(p1);
-+}
-+
-+/* sysfs support functions */
-+
-+/* AEM device name */
-+static ssize_t show_name(struct device *dev, struct device_attribute *devattr,
-+ char *buf)
-+{
-+ struct aem_data *data = dev_get_drvdata(dev);
-+
-+ return sprintf(buf, "%s%d\n", DRVNAME, data->ver_major);
-+}
-+static SENSOR_DEVICE_ATTR(name, S_IRUGO, show_name, NULL, 0);
-+
-+/* AEM device version */
-+static ssize_t show_version(struct device *dev,
-+ struct device_attribute *devattr,
-+ char *buf)
-+{
-+ struct aem_data *data = dev_get_drvdata(dev);
-+
-+ return sprintf(buf, "%d.%d\n", data->ver_major, data->ver_minor);
-+}
-+static SENSOR_DEVICE_ATTR(version, S_IRUGO, show_version, NULL, 0);
-+
-+/* Display power use */
-+static ssize_t aem_show_power(struct device *dev,
-+ struct device_attribute *devattr,
-+ char *buf)
-+{
-+ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
-+ struct aem_data *data = dev_get_drvdata(dev);
-+ u64 before, after, delta, time;
-+ signed long leftover;
-+ struct timespec b, a;
-+
-+ mutex_lock(&data->lock);
-+ update_aem_energy(data);
-+ getnstimeofday(&b);
-+ before = data->energy[attr->index];
-+
-+ leftover = schedule_timeout_interruptible(
-+ msecs_to_jiffies(data->power_period[attr->index])
-+ );
-+ if (leftover) {
-+ mutex_unlock(&data->lock);
-+ return 0;
-+ }
-+
-+ update_aem_energy(data);
-+ getnstimeofday(&a);
-+ after = data->energy[attr->index];
-+ mutex_unlock(&data->lock);
-+
-+ time = timespec_to_ns(&a) - timespec_to_ns(&b);
-+ delta = (after - before) * UJ_PER_MJ;
-+
-+ return sprintf(buf, "%llu\n",
-+ (unsigned long long)div64_u64(delta * NSEC_PER_SEC, time));
-+}
-+
-+/* Display energy use */
-+static ssize_t aem_show_energy(struct device *dev,
-+ struct device_attribute *devattr,
-+ char *buf)
-+{
-+ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
-+ struct aem_data *a = dev_get_drvdata(dev);
-+ a->update(a);
-+
-+ return sprintf(buf, "%llu\n",
-+ (unsigned long long)a->energy[attr->index] * 1000);
-+}
-+
-+/* Display power interval registers */
-+static ssize_t aem_show_power_period(struct device *dev,
-+ struct device_attribute *devattr,
-+ char *buf)
-+{
-+ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
-+ struct aem_data *a = dev_get_drvdata(dev);
-+ a->update(a);
-+
-+ return sprintf(buf, "%lu\n", a->power_period[attr->index]);
-+}
-+
-+/* Set power interval registers */
-+static ssize_t aem_set_power_period(struct device *dev,
-+ struct device_attribute *devattr,
-+ const char *buf, size_t count)
-+{
-+ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
-+ struct aem_data *a = dev_get_drvdata(dev);
-+ unsigned long temp;
-+ int res;
-+
-+ res = strict_strtoul(buf, 10, &temp);
-+ if (res)
-+ return res;
-+
-+ if (temp < AEM_MIN_POWER_INTERVAL)
-+ return -EINVAL;
-+
-+ mutex_lock(&a->lock);
-+ a->power_period[attr->index] = temp;
-+ mutex_unlock(&a->lock);
-+
-+ return count;
-+}
-+
-+/* Discover sensors on an AEM device */
-+static int aem_register_sensors(struct aem_data *data,
-+ struct aem_ro_sensor_template *ro,
-+ struct aem_rw_sensor_template *rw)
-+{
-+ struct device *dev = &data->pdev->dev;
-+ struct sensor_device_attribute *sensors = data->sensors;
-+ int err;
-+
-+ /* Set up read-only sensors */
-+ while (ro->label) {
-+ sensors->dev_attr.attr.name = ro->label;
-+ sensors->dev_attr.attr.mode = S_IRUGO;
-+ sensors->dev_attr.show = ro->show;
-+ sensors->index = ro->index;
-+
-+ err = device_create_file(dev, &sensors->dev_attr);
-+ if (err) {
-+ sensors->dev_attr.attr.name = NULL;
-+ goto error;
-+ }
-+ sensors++;
-+ ro++;
-+ }
-+
-+ /* Set up read-write sensors */
-+ while (rw->label) {
-+ sensors->dev_attr.attr.name = rw->label;
-+ sensors->dev_attr.attr.mode = S_IRUGO | S_IWUSR;
-+ sensors->dev_attr.show = rw->show;
-+ sensors->dev_attr.store = rw->set;
-+ sensors->index = rw->index;
-+
-+ err = device_create_file(dev, &sensors->dev_attr);
-+ if (err) {
-+ sensors->dev_attr.attr.name = NULL;
-+ goto error;
-+ }
-+ sensors++;
-+ rw++;
-+ }
-+
-+ err = device_create_file(dev, &sensor_dev_attr_name.dev_attr);
-+ if (err)
-+ goto error;
-+ err = device_create_file(dev, &sensor_dev_attr_version.dev_attr);
-+ return err;
-+
-+error:
-+ aem_remove_sensors(data);
-+ return err;
-+}
-+
-+/* sysfs support functions for AEM2 sensors */
-+
-+/* Display temperature use */
-+static ssize_t aem2_show_temp(struct device *dev,
-+ struct device_attribute *devattr,
-+ char *buf)
-+{
-+ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
-+ struct aem_data *a = dev_get_drvdata(dev);
-+ a->update(a);
-+
-+ return sprintf(buf, "%u\n", a->temp[attr->index] * 1000);
-+}
-+
-+/* Display power-capping registers */
-+static ssize_t aem2_show_pcap_value(struct device *dev,
-+ struct device_attribute *devattr,
-+ char *buf)
-+{
-+ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
-+ struct aem_data *a = dev_get_drvdata(dev);
-+ a->update(a);
-+
-+ return sprintf(buf, "%u\n", a->pcap[attr->index] * 100000);
-+}
-+
-+/* Remove sensors attached to an AEM device */
-+static void aem_remove_sensors(struct aem_data *data)
-+{
-+ int i;
-+
-+ for (i = 0; i < AEM_NUM_SENSORS; i++) {
-+ if (!data->sensors[i].dev_attr.attr.name)
-+ continue;
-+ device_remove_file(&data->pdev->dev,
-+ &data->sensors[i].dev_attr);
-+ }
-+
-+ device_remove_file(&data->pdev->dev,
-+ &sensor_dev_attr_name.dev_attr);
-+ device_remove_file(&data->pdev->dev,
-+ &sensor_dev_attr_version.dev_attr);
-+}
-+
-+/* Sensor probe functions */
-+
-+/* Description of AEM1 sensors */
-+static struct aem_ro_sensor_template aem1_ro_sensors[] = {
-+{"energy1_input", aem_show_energy, 0},
-+{"power1_average", aem_show_power, 0},
-+{NULL, NULL, 0},
-+};
-+
-+static struct aem_rw_sensor_template aem1_rw_sensors[] = {
-+{"power1_average_interval", aem_show_power_period, aem_set_power_period, 0},
-+{NULL, NULL, NULL, 0},
-+};
-+
-+/* Description of AEM2 sensors */
-+static struct aem_ro_sensor_template aem2_ro_sensors[] = {
-+{"energy1_input", aem_show_energy, 0},
-+{"energy2_input", aem_show_energy, 1},
-+{"power1_average", aem_show_power, 0},
-+{"power2_average", aem_show_power, 1},
-+{"temp1_input", aem2_show_temp, 0},
-+{"temp2_input", aem2_show_temp, 1},
-+
-+{"power4_average", aem2_show_pcap_value, POWER_CAP_MAX_HOTPLUG},
-+{"power5_average", aem2_show_pcap_value, POWER_CAP_MAX},
-+{"power6_average", aem2_show_pcap_value, POWER_CAP_MIN_WARNING},
-+{"power7_average", aem2_show_pcap_value, POWER_CAP_MIN},
-+
-+{"power3_average", aem2_show_pcap_value, POWER_AUX},
-+{"power_cap", aem2_show_pcap_value, POWER_CAP},
-+{NULL, NULL, 0},
-+};
-+
-+static struct aem_rw_sensor_template aem2_rw_sensors[] = {
-+{"power1_average_interval", aem_show_power_period, aem_set_power_period, 0},
-+{"power2_average_interval", aem_show_power_period, aem_set_power_period, 1},
-+{NULL, NULL, NULL, 0},
-+};
-+
-+/* Set up AEM1 sensor attrs */
-+static int aem1_find_sensors(struct aem_data *data)
-+{
-+ return aem_register_sensors(data, aem1_ro_sensors, aem1_rw_sensors);
-+}
-+
-+/* Set up AEM2 sensor attrs */
-+static int aem2_find_sensors(struct aem_data *data)
-+{
-+ return aem_register_sensors(data, aem2_ro_sensors, aem2_rw_sensors);
-+}
-+
-+/* Module init/exit routines */
-+
-+static int __init aem_init(void)
-+{
-+ int res;
-+
-+ res = driver_register(&aem_driver);
-+ if (res) {
-+ printk(KERN_ERR "Can't register aem driver\n");
-+ return res;
-+ }
-+
-+ res = ipmi_smi_watcher_register(&driver_data.bmc_events);
-+ if (res)
-+ goto ipmi_reg_err;
-+ return 0;
-+
-+ipmi_reg_err:
-+ driver_unregister(&aem_driver);
-+ return res;
-+
-+}
-+
-+static void __exit aem_exit(void)
-+{
-+ struct aem_data *p1, *next1;
-+
-+ ipmi_smi_watcher_unregister(&driver_data.bmc_events);
-+ driver_unregister(&aem_driver);
-+ list_for_each_entry_safe(p1, next1, &driver_data.aem_devices, list)
-+ aem_delete(p1);
-+}
-+
-+MODULE_AUTHOR("Darrick J. Wong ");
-+MODULE_DESCRIPTION("IBM Active Energy Manager power/temp sensor driver");
-+MODULE_LICENSE("GPL");
-+
-+module_init(aem_init);
-+module_exit(aem_exit);
-diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c
-index 34b0d4f..655ec7e 100644
---- a/drivers/ide/ide-probe.c
-+++ b/drivers/ide/ide-probe.c
-@@ -648,13 +648,12 @@ static int ide_register_port(ide_hwif_t *hwif)
-
- get_device(&hwif->gendev);
-
-- hwif->portdev = device_create(ide_port_class, &hwif->gendev,
-- MKDEV(0, 0), hwif->name);
-+ hwif->portdev = device_create_drvdata(ide_port_class, &hwif->gendev,
-+ MKDEV(0, 0), hwif, hwif->name);
- if (IS_ERR(hwif->portdev)) {
- ret = PTR_ERR(hwif->portdev);
- device_unregister(&hwif->gendev);
- }
-- dev_set_drvdata(hwif->portdev, hwif);
- out:
- return ret;
- }
-diff --git a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c
-index 16b9d0a..a5ceff2 100644
---- a/drivers/ieee1394/sbp2.c
-+++ b/drivers/ieee1394/sbp2.c
-@@ -1539,15 +1539,13 @@ static void sbp2_prep_command_orb_sg(struct sbp2_command_orb *orb,
-
- static void sbp2_create_command_orb(struct sbp2_lu *lu,
- struct sbp2_command_info *cmd,
-- unchar *scsi_cmd,
-- unsigned int scsi_use_sg,
-- unsigned int scsi_request_bufflen,
-- struct scatterlist *sg,
-- enum dma_data_direction dma_dir)
-+ struct scsi_cmnd *SCpnt)
- {
- struct sbp2_fwhost_info *hi = lu->hi;
- struct sbp2_command_orb *orb = &cmd->command_orb;
- u32 orb_direction;
-+ unsigned int scsi_request_bufflen = scsi_bufflen(SCpnt);
-+ enum dma_data_direction dma_dir = SCpnt->sc_data_direction;
-
- /*
- * Set-up our command ORB.
-@@ -1580,13 +1578,14 @@ static void sbp2_create_command_orb(struct sbp2_lu *lu,
- orb->data_descriptor_lo = 0x0;
- orb->misc |= ORB_SET_DIRECTION(1);
- } else
-- sbp2_prep_command_orb_sg(orb, hi, cmd, scsi_use_sg, sg,
-+ sbp2_prep_command_orb_sg(orb, hi, cmd, scsi_sg_count(SCpnt),
-+ scsi_sglist(SCpnt),
- orb_direction, dma_dir);
-
- sbp2util_cpu_to_be32_buffer(orb, sizeof(*orb));
-
-- memset(orb->cdb, 0, 12);
-- memcpy(orb->cdb, scsi_cmd, COMMAND_SIZE(*scsi_cmd));
-+ memset(orb->cdb, 0, sizeof(orb->cdb));
-+ memcpy(orb->cdb, SCpnt->cmnd, SCpnt->cmd_len);
- }
-
- static void sbp2_link_orb_command(struct sbp2_lu *lu,
-@@ -1669,16 +1668,13 @@ static void sbp2_link_orb_command(struct sbp2_lu *lu,
- static int sbp2_send_command(struct sbp2_lu *lu, struct scsi_cmnd *SCpnt,
- void (*done)(struct scsi_cmnd *))
- {
-- unchar *scsi_cmd = (unchar *)SCpnt->cmnd;
- struct sbp2_command_info *cmd;
-
- cmd = sbp2util_allocate_command_orb(lu, SCpnt, done);
- if (!cmd)
- return -EIO;
-
-- sbp2_create_command_orb(lu, cmd, scsi_cmd, scsi_sg_count(SCpnt),
-- scsi_bufflen(SCpnt), scsi_sglist(SCpnt),
-- SCpnt->sc_data_direction);
-+ sbp2_create_command_orb(lu, cmd, SCpnt);
- sbp2_link_orb_command(lu, cmd);
-
- return 0;
-diff --git a/drivers/infiniband/core/mad.c b/drivers/infiniband/core/mad.c
-index fbe16d5..1adf2ef 100644
---- a/drivers/infiniband/core/mad.c
-+++ b/drivers/infiniband/core/mad.c
-@@ -747,7 +747,9 @@ static int handle_outgoing_dr_smp(struct ib_mad_agent_private *mad_agent_priv,
- break;
- case IB_MAD_RESULT_SUCCESS | IB_MAD_RESULT_CONSUMED:
- kmem_cache_free(ib_mad_cache, mad_priv);
-- break;
-+ kfree(local);
-+ ret = 1;
-+ goto out;
- case IB_MAD_RESULT_SUCCESS:
- /* Treat like an incoming receive MAD */
- port_priv = ib_get_mad_port(mad_agent_priv->agent.device,
-diff --git a/drivers/infiniband/core/user_mad.c b/drivers/infiniband/core/user_mad.c
-index 3aa2db5..840ede9 100644
---- a/drivers/infiniband/core/user_mad.c
-+++ b/drivers/infiniband/core/user_mad.c
-@@ -1005,8 +1005,9 @@ static int ib_umad_init_port(struct ib_device *device, int port_num,
- if (cdev_add(port->cdev, base_dev + port->dev_num, 1))
- goto err_cdev;
-
-- port->dev = device_create(umad_class, device->dma_device,
-- port->cdev->dev, "umad%d", port->dev_num);
-+ port->dev = device_create_drvdata(umad_class, device->dma_device,
-+ port->cdev->dev, port,
-+ "umad%d", port->dev_num);
- if (IS_ERR(port->dev))
- goto err_cdev;
-
-@@ -1024,15 +1025,12 @@ static int ib_umad_init_port(struct ib_device *device, int port_num,
- if (cdev_add(port->sm_cdev, base_dev + port->dev_num + IB_UMAD_MAX_PORTS, 1))
- goto err_sm_cdev;
-
-- port->sm_dev = device_create(umad_class, device->dma_device,
-- port->sm_cdev->dev,
-- "issm%d", port->dev_num);
-+ port->sm_dev = device_create_drvdata(umad_class, device->dma_device,
-+ port->sm_cdev->dev, port,
-+ "issm%d", port->dev_num);
- if (IS_ERR(port->sm_dev))
- goto err_sm_cdev;
-
-- dev_set_drvdata(port->dev, port);
-- dev_set_drvdata(port->sm_dev, port);
--
- if (device_create_file(port->sm_dev, &dev_attr_ibdev))
- goto err_sm_dev;
- if (device_create_file(port->sm_dev, &dev_attr_port))
-diff --git a/drivers/infiniband/core/uverbs_main.c b/drivers/infiniband/core/uverbs_main.c
-index cc1afa2..f806da1 100644
---- a/drivers/infiniband/core/uverbs_main.c
-+++ b/drivers/infiniband/core/uverbs_main.c
-@@ -755,14 +755,15 @@ static void ib_uverbs_add_one(struct ib_device *device)
- if (cdev_add(uverbs_dev->cdev, IB_UVERBS_BASE_DEV + uverbs_dev->devnum, 1))
- goto err_cdev;
-
-- uverbs_dev->dev = device_create(uverbs_class, device->dma_device,
-- uverbs_dev->cdev->dev,
-- "uverbs%d", uverbs_dev->devnum);
-+ uverbs_dev->dev = device_create_drvdata(uverbs_class,
-+ device->dma_device,
-+ uverbs_dev->cdev->dev,
-+ uverbs_dev,
-+ "uverbs%d",
-+ uverbs_dev->devnum);
- if (IS_ERR(uverbs_dev->dev))
- goto err_cdev;
-
-- dev_set_drvdata(uverbs_dev->dev, uverbs_dev);
--
- if (device_create_file(uverbs_dev->dev, &dev_attr_ibdev))
- goto err_class;
- if (device_create_file(uverbs_dev->dev, &dev_attr_abi_version))
-diff --git a/drivers/infiniband/hw/cxgb3/iwch_qp.c b/drivers/infiniband/hw/cxgb3/iwch_qp.c
-index 79dbe5b..9926137 100644
---- a/drivers/infiniband/hw/cxgb3/iwch_qp.c
-+++ b/drivers/infiniband/hw/cxgb3/iwch_qp.c
-@@ -229,7 +229,7 @@ int iwch_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
- struct ib_send_wr **bad_wr)
- {
- int err = 0;
-- u8 t3_wr_flit_cnt;
-+ u8 uninitialized_var(t3_wr_flit_cnt);
- enum t3_wr_opcode t3_wr_opcode = 0;
- enum t3_wr_flags t3_wr_flags;
- struct iwch_qp *qhp;
-diff --git a/drivers/infiniband/hw/ipath/ipath_sdma.c b/drivers/infiniband/hw/ipath/ipath_sdma.c
-index 3697449..0a8c1b8 100644
---- a/drivers/infiniband/hw/ipath/ipath_sdma.c
-+++ b/drivers/infiniband/hw/ipath/ipath_sdma.c
-@@ -345,7 +345,7 @@ resched:
- * state change
- */
- if (jiffies > dd->ipath_sdma_abort_jiffies) {
-- ipath_dbg("looping with status 0x%016llx\n",
-+ ipath_dbg("looping with status 0x%08lx\n",
- dd->ipath_sdma_status);
- dd->ipath_sdma_abort_jiffies = jiffies + 5 * HZ;
- }
-@@ -615,7 +615,7 @@ void ipath_restart_sdma(struct ipath_devdata *dd)
- }
- spin_unlock_irqrestore(&dd->ipath_sdma_lock, flags);
- if (!needed) {
-- ipath_dbg("invalid attempt to restart SDMA, status 0x%016llx\n",
-+ ipath_dbg("invalid attempt to restart SDMA, status 0x%08lx\n",
- dd->ipath_sdma_status);
- goto bail;
- }
-diff --git a/drivers/infiniband/hw/ipath/ipath_uc.c b/drivers/infiniband/hw/ipath/ipath_uc.c
-index 7fd18e8..0596ec1 100644
---- a/drivers/infiniband/hw/ipath/ipath_uc.c
-+++ b/drivers/infiniband/hw/ipath/ipath_uc.c
-@@ -407,12 +407,11 @@ void ipath_uc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr,
- dev->n_pkt_drops++;
- goto done;
- }
-- /* XXX Need to free SGEs */
-+ wc.opcode = IB_WC_RECV;
- last_imm:
- ipath_copy_sge(&qp->r_sge, data, tlen);
- wc.wr_id = qp->r_wr_id;
- wc.status = IB_WC_SUCCESS;
-- wc.opcode = IB_WC_RECV;
- wc.qp = &qp->ibqp;
- wc.src_qp = qp->remote_qpn;
- wc.slid = qp->remote_ah_attr.dlid;
-@@ -514,6 +513,7 @@ void ipath_uc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr,
- goto done;
- }
- wc.byte_len = qp->r_len;
-+ wc.opcode = IB_WC_RECV_RDMA_WITH_IMM;
- goto last_imm;
-
- case OP(RDMA_WRITE_LAST):
-diff --git a/drivers/infiniband/hw/mlx4/qp.c b/drivers/infiniband/hw/mlx4/qp.c
-index 8e02ecf..a80df22 100644
---- a/drivers/infiniband/hw/mlx4/qp.c
-+++ b/drivers/infiniband/hw/mlx4/qp.c
-@@ -333,6 +333,9 @@ static int set_kernel_sq_size(struct mlx4_ib_dev *dev, struct ib_qp_cap *cap,
- cap->max_inline_data + sizeof (struct mlx4_wqe_inline_seg)) +
- send_wqe_overhead(type, qp->flags);
-
-+ if (s > dev->dev->caps.max_sq_desc_sz)
-+ return -EINVAL;
-+
- /*
- * Hermon supports shrinking WQEs, such that a single work
- * request can include multiple units of 1 << wqe_shift. This
-@@ -372,9 +375,6 @@ static int set_kernel_sq_size(struct mlx4_ib_dev *dev, struct ib_qp_cap *cap,
- qp->sq.wqe_shift = ilog2(roundup_pow_of_two(s));
-
- for (;;) {
-- if (1 << qp->sq.wqe_shift > dev->dev->caps.max_sq_desc_sz)
-- return -EINVAL;
--
- qp->sq_max_wqes_per_wr = DIV_ROUND_UP(s, 1U << qp->sq.wqe_shift);
-
- /*
-@@ -395,7 +395,8 @@ static int set_kernel_sq_size(struct mlx4_ib_dev *dev, struct ib_qp_cap *cap,
- ++qp->sq.wqe_shift;
- }
-
-- qp->sq.max_gs = ((qp->sq_max_wqes_per_wr << qp->sq.wqe_shift) -
-+ qp->sq.max_gs = (min(dev->dev->caps.max_sq_desc_sz,
-+ (qp->sq_max_wqes_per_wr << qp->sq.wqe_shift)) -
- send_wqe_overhead(type, qp->flags)) /
- sizeof (struct mlx4_wqe_data_seg);
-
-@@ -411,7 +412,9 @@ static int set_kernel_sq_size(struct mlx4_ib_dev *dev, struct ib_qp_cap *cap,
-
- cap->max_send_wr = qp->sq.max_post =
- (qp->sq.wqe_cnt - qp->sq_spare_wqes) / qp->sq_max_wqes_per_wr;
-- cap->max_send_sge = qp->sq.max_gs;
-+ cap->max_send_sge = min(qp->sq.max_gs,
-+ min(dev->dev->caps.max_sq_sg,
-+ dev->dev->caps.max_rq_sg));
- /* We don't support inline sends for kernel QPs (yet) */
- cap->max_inline_data = 0;
-
-@@ -1457,7 +1460,7 @@ int mlx4_ib_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
- unsigned ind;
- int uninitialized_var(stamp);
- int uninitialized_var(size);
-- unsigned seglen;
-+ unsigned uninitialized_var(seglen);
- int i;
-
- spin_lock_irqsave(&qp->sq.lock, flags);
-diff --git a/drivers/infiniband/hw/mthca/mthca_main.c b/drivers/infiniband/hw/mthca/mthca_main.c
-index 9ebadd6..200cf13 100644
---- a/drivers/infiniband/hw/mthca/mthca_main.c
-+++ b/drivers/infiniband/hw/mthca/mthca_main.c
-@@ -45,6 +45,7 @@
- #include "mthca_cmd.h"
- #include "mthca_profile.h"
- #include "mthca_memfree.h"
-+#include "mthca_wqe.h"
-
- MODULE_AUTHOR("Roland Dreier");
- MODULE_DESCRIPTION("Mellanox InfiniBand HCA low-level driver");
-@@ -200,7 +201,18 @@ static int mthca_dev_lim(struct mthca_dev *mdev, struct mthca_dev_lim *dev_lim)
- mdev->limits.gid_table_len = dev_lim->max_gids;
- mdev->limits.pkey_table_len = dev_lim->max_pkeys;
- mdev->limits.local_ca_ack_delay = dev_lim->local_ca_ack_delay;
-- mdev->limits.max_sg = dev_lim->max_sg;
-+ /*
-+ * Need to allow for worst case send WQE overhead and check
-+ * whether max_desc_sz imposes a lower limit than max_sg; UD
-+ * send has the biggest overhead.
-+ */
-+ mdev->limits.max_sg = min_t(int, dev_lim->max_sg,
-+ (dev_lim->max_desc_sz -
-+ sizeof (struct mthca_next_seg) -
-+ (mthca_is_memfree(mdev) ?
-+ sizeof (struct mthca_arbel_ud_seg) :
-+ sizeof (struct mthca_tavor_ud_seg))) /
-+ sizeof (struct mthca_data_seg));
- mdev->limits.max_wqes = dev_lim->max_qp_sz;
- mdev->limits.max_qp_init_rdma = dev_lim->max_requester_per_qp;
- mdev->limits.reserved_qps = dev_lim->reserved_qps;
-diff --git a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
-index d00a2c1..3f663fb 100644
---- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
-+++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
-@@ -194,7 +194,13 @@ static int ipoib_mcast_join_finish(struct ipoib_mcast *mcast,
- /* Set the cached Q_Key before we attach if it's the broadcast group */
- if (!memcmp(mcast->mcmember.mgid.raw, priv->dev->broadcast + 4,
- sizeof (union ib_gid))) {
-+ spin_lock_irq(&priv->lock);
-+ if (!priv->broadcast) {
-+ spin_unlock_irq(&priv->lock);
-+ return -EAGAIN;
-+ }
- priv->qkey = be32_to_cpu(priv->broadcast->mcmember.qkey);
-+ spin_unlock_irq(&priv->lock);
- priv->tx_wr.wr.ud.remote_qkey = priv->qkey;
- }
-
-diff --git a/drivers/input/keyboard/aaed2000_kbd.c b/drivers/input/keyboard/aaed2000_kbd.c
-index a293e8b..8a77bfc 100644
---- a/drivers/input/keyboard/aaed2000_kbd.c
-+++ b/drivers/input/keyboard/aaed2000_kbd.c
-@@ -183,4 +183,4 @@ module_exit(aaedkbd_exit);
-
- MODULE_AUTHOR("Nicolas Bellido Y Ortega");
- MODULE_DESCRIPTION("AAED-2000 Keyboard Driver");
--MODULE_LICENSE("GPLv2");
-+MODULE_LICENSE("GPL v2");
-diff --git a/drivers/input/keyboard/corgikbd.c b/drivers/input/keyboard/corgikbd.c
-index 29fbec6..1aa46ae 100644
---- a/drivers/input/keyboard/corgikbd.c
-+++ b/drivers/input/keyboard/corgikbd.c
-@@ -412,5 +412,5 @@ module_exit(corgikbd_exit);
-
- MODULE_AUTHOR("Richard Purdie ");
- MODULE_DESCRIPTION("Corgi Keyboard Driver");
--MODULE_LICENSE("GPLv2");
-+MODULE_LICENSE("GPL v2");
- MODULE_ALIAS("platform:corgi-keyboard");
-diff --git a/drivers/input/keyboard/jornada680_kbd.c b/drivers/input/keyboard/jornada680_kbd.c
-index 9387da3..781fc61 100644
---- a/drivers/input/keyboard/jornada680_kbd.c
-+++ b/drivers/input/keyboard/jornada680_kbd.c
-@@ -275,5 +275,5 @@ module_exit(jornada680kbd_exit);
-
- MODULE_AUTHOR("Kristoffer Ericson ");
- MODULE_DESCRIPTION("HP Jornada 620/660/680/690 Keyboard Driver");
--MODULE_LICENSE("GPLv2");
-+MODULE_LICENSE("GPL v2");
- MODULE_ALIAS("platform:jornada680_kbd");
-diff --git a/drivers/input/keyboard/jornada720_kbd.c b/drivers/input/keyboard/jornada720_kbd.c
-index a1164a0..ce650af 100644
---- a/drivers/input/keyboard/jornada720_kbd.c
-+++ b/drivers/input/keyboard/jornada720_kbd.c
-@@ -29,7 +29,7 @@
-
- MODULE_AUTHOR("Kristoffer Ericson ");
- MODULE_DESCRIPTION("HP Jornada 710/720/728 keyboard driver");
--MODULE_LICENSE("GPLv2");
-+MODULE_LICENSE("GPL v2");
-
- static unsigned short jornada_std_keymap[128] = { /* ROW */
- 0, KEY_ESC, KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_F7, /* #1 */
-diff --git a/drivers/input/keyboard/spitzkbd.c b/drivers/input/keyboard/spitzkbd.c
-index 61e401b..1aa3718 100644
---- a/drivers/input/keyboard/spitzkbd.c
-+++ b/drivers/input/keyboard/spitzkbd.c
-@@ -494,5 +494,5 @@ module_exit(spitzkbd_exit);
-
- MODULE_AUTHOR("Richard Purdie ");
- MODULE_DESCRIPTION("Spitz Keyboard Driver");
--MODULE_LICENSE("GPLv2");
-+MODULE_LICENSE("GPL v2");
- MODULE_ALIAS("platform:spitz-keyboard");
-diff --git a/drivers/input/touchscreen/jornada720_ts.c b/drivers/input/touchscreen/jornada720_ts.c
-index 7422421..1aca108 100644
---- a/drivers/input/touchscreen/jornada720_ts.c
-+++ b/drivers/input/touchscreen/jornada720_ts.c
-@@ -24,7 +24,7 @@
-
- MODULE_AUTHOR("Kristoffer Ericson ");
- MODULE_DESCRIPTION("HP Jornada 710/720/728 touchscreen driver");
--MODULE_LICENSE("GPLv2");
-+MODULE_LICENSE("GPL v2");
-
- struct jornada_ts {
- struct input_dev *dev;
-diff --git a/drivers/isdn/capi/capiutil.c b/drivers/isdn/capi/capiutil.c
-index ebef4ce..29419a8 100644
---- a/drivers/isdn/capi/capiutil.c
-+++ b/drivers/isdn/capi/capiutil.c
-@@ -948,17 +948,17 @@ int __init cdebug_init(void)
- {
- g_cmsg= kmalloc(sizeof(_cmsg), GFP_KERNEL);
- if (!g_cmsg)
-- return ENOMEM;
-+ return -ENOMEM;
- g_debbuf = kmalloc(sizeof(_cdebbuf), GFP_KERNEL);
- if (!g_debbuf) {
- kfree(g_cmsg);
-- return ENOMEM;
-+ return -ENOMEM;
- }
- g_debbuf->buf = kmalloc(CDEBUG_GSIZE, GFP_KERNEL);
- if (!g_debbuf->buf) {
- kfree(g_cmsg);
- kfree(g_debbuf);
-- return ENOMEM;;
-+ return -ENOMEM;;
- }
- g_debbuf->size = CDEBUG_GSIZE;
- g_debbuf->buf[0] = 0;
-diff --git a/drivers/isdn/hysdn/Kconfig b/drivers/isdn/hysdn/Kconfig
-index c6d8a70..c9e4231 100644
---- a/drivers/isdn/hysdn/Kconfig
-+++ b/drivers/isdn/hysdn/Kconfig
-@@ -3,7 +3,7 @@
- #
- config HYSDN
- tristate "Hypercope HYSDN cards (Champ, Ergo, Metro) support (module only)"
-- depends on m && PROC_FS && PCI && BROKEN_ON_SMP
-+ depends on m && PROC_FS && PCI
- help
- Say Y here if you have one of Hypercope's active PCI ISDN cards
- Champ, Ergo and Metro. You will then get a module called hysdn.
-diff --git a/drivers/isdn/hysdn/boardergo.c b/drivers/isdn/hysdn/boardergo.c
-index 6cdbad3..3eb096f 100644
---- a/drivers/isdn/hysdn/boardergo.c
-+++ b/drivers/isdn/hysdn/boardergo.c
-@@ -64,10 +64,11 @@ ergo_interrupt(int intno, void *dev_id)
- } /* ergo_interrupt */
-
- /******************************************************************************/
--/* ergo_irq_bh is the function called by the immediate kernel task list after */
--/* being activated with queue_task and no interrupts active. This task is the */
--/* only one handling data transfer from or to the card after booting. The task */
--/* may be queued from everywhere (interrupts included). */
-+/* ergo_irq_bh will be called as part of the kernel clearing its shared work */
-+/* queue sometime after a call to schedule_work has been made passing our */
-+/* work_struct. This task is the only one handling data transfer from or to */
-+/* the card after booting. The task may be queued from everywhere */
-+/* (interrupts included). */
- /******************************************************************************/
- static void
- ergo_irq_bh(struct work_struct *ugli_api)
-@@ -90,7 +91,6 @@ ergo_irq_bh(struct work_struct *ugli_api)
- card->hw_lock = 1; /* we now lock the hardware */
-
- do {
-- sti(); /* reenable other ints */
- again = 0; /* assume loop not to be repeated */
-
- if (!dpr->ToHyFlag) {
-@@ -110,7 +110,6 @@ ergo_irq_bh(struct work_struct *ugli_api)
- again = 1; /* restart loop */
- }
- } /* a message has arrived for us */
-- cli(); /* no further ints */
- if (again) {
- dpr->ToHyInt = 1;
- dpr->ToPcInt = 1; /* interrupt to E1 for all cards */
-@@ -242,7 +241,6 @@ ergo_writebootimg(struct HYSDN_CARD *card, unsigned char *buf,
- byteout(card->iobase + PCI9050_USER_IO, PCI9050_E1_RUN); /* start E1 processor */
- /* the interrupts are still masked */
-
-- sti();
- msleep_interruptible(20); /* Timeout 20ms */
-
- if (((tDpramBootSpooler *) card->dpram)->Len != DPRAM_SPOOLER_DATA_SIZE) {
-@@ -276,7 +274,6 @@ ergo_writebootseq(struct HYSDN_CARD *card, unsigned char *buf, int len)
- dst = sp->Data; /* point to data in spool structure */
- buflen = sp->Len; /* maximum len of spooled data */
- wr_mirror = sp->WrPtr; /* only once read */
-- sti();
-
- /* try until all bytes written or error */
- i = 0x1000; /* timeout value */
-@@ -380,7 +377,6 @@ ergo_waitpofready(struct HYSDN_CARD *card)
- #endif /* CONFIG_HYSDN_CAPI */
- return (0); /* success */
- } /* data has arrived */
-- sti();
- msleep_interruptible(50); /* Timeout 50ms */
- } /* wait until timeout */
-
-diff --git a/drivers/isdn/hysdn/hycapi.c b/drivers/isdn/hysdn/hycapi.c
-index d3999a8..53f6ad1 100644
---- a/drivers/isdn/hysdn/hycapi.c
-+++ b/drivers/isdn/hysdn/hycapi.c
-@@ -462,11 +462,11 @@ static int hycapi_read_proc(char *page, char **start, off_t off,
- default: s = "???"; break;
- }
- len += sprintf(page+len, "%-16s %s\n", "type", s);
-- if ((s = cinfo->version[VER_DRIVER]) != 0)
-+ if ((s = cinfo->version[VER_DRIVER]) != NULL)
- len += sprintf(page+len, "%-16s %s\n", "ver_driver", s);
-- if ((s = cinfo->version[VER_CARDTYPE]) != 0)
-+ if ((s = cinfo->version[VER_CARDTYPE]) != NULL)
- len += sprintf(page+len, "%-16s %s\n", "ver_cardtype", s);
-- if ((s = cinfo->version[VER_SERIAL]) != 0)
-+ if ((s = cinfo->version[VER_SERIAL]) != NULL)
- len += sprintf(page+len, "%-16s %s\n", "ver_serial", s);
-
- len += sprintf(page+len, "%-16s %s\n", "cardname", cinfo->cardname);
-diff --git a/drivers/leds/led-class.c b/drivers/leds/led-class.c
-index b3c54be..559a408 100644
---- a/drivers/leds/led-class.c
-+++ b/drivers/leds/led-class.c
-@@ -103,13 +103,11 @@ int led_classdev_register(struct device *parent, struct led_classdev *led_cdev)
- {
- int rc;
-
-- led_cdev->dev = device_create(leds_class, parent, 0, "%s",
-- led_cdev->name);
-+ led_cdev->dev = device_create_drvdata(leds_class, parent, 0, led_cdev,
-+ "%s", led_cdev->name);
- if (IS_ERR(led_cdev->dev))
- return PTR_ERR(led_cdev->dev);
-
-- dev_set_drvdata(led_cdev->dev, led_cdev);
--
- /* register the attributes */
- rc = device_create_file(led_cdev->dev, &dev_attr_brightness);
- if (rc)
-diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c
-index c14dacd..b26927c 100644
---- a/drivers/md/bitmap.c
-+++ b/drivers/md/bitmap.c
-@@ -203,17 +203,6 @@ static void bitmap_checkfree(struct bitmap *bitmap, unsigned long page)
- * bitmap file handling - read and write the bitmap file and its superblock
- */
-
--/* copy the pathname of a file to a buffer */
--char *file_path(struct file *file, char *buf, int count)
--{
-- if (!buf)
-- return NULL;
--
-- buf = d_path(&file->f_path, buf, count);
--
-- return IS_ERR(buf) ? NULL : buf;
--}
--
- /*
- * basic page I/O operations
- */
-@@ -721,11 +710,13 @@ static void bitmap_file_kick(struct bitmap *bitmap)
- if (bitmap->file) {
- path = kmalloc(PAGE_SIZE, GFP_KERNEL);
- if (path)
-- ptr = file_path(bitmap->file, path, PAGE_SIZE);
-+ ptr = d_path(&bitmap->file->f_path, path,
-+ PAGE_SIZE);
-+
-
- printk(KERN_ALERT
- "%s: kicking failed bitmap file %s from array!\n",
-- bmname(bitmap), ptr ? ptr : "");
-+ bmname(bitmap), IS_ERR(ptr) ? "" : ptr);
-
- kfree(path);
- } else
-diff --git a/drivers/md/md.c b/drivers/md/md.c
-index 83eb78b..51c19f8 100644
---- a/drivers/md/md.c
-+++ b/drivers/md/md.c
-@@ -74,6 +74,8 @@ static DEFINE_SPINLOCK(pers_lock);
-
- static void md_print_devices(void);
-
-+static DECLARE_WAIT_QUEUE_HEAD(resync_wait);
-+
- #define MD_BUG(x...) { printk("md: bug in file %s, line %d\n", __FILE__, __LINE__); md_print_devices(); }
-
- /*
-@@ -3013,6 +3015,36 @@ degraded_show(mddev_t *mddev, char *page)
- static struct md_sysfs_entry md_degraded = __ATTR_RO(degraded);
-
- static ssize_t
-+sync_force_parallel_show(mddev_t *mddev, char *page)
-+{
-+ return sprintf(page, "%d\n", mddev->parallel_resync);
-+}
-+
-+static ssize_t
-+sync_force_parallel_store(mddev_t *mddev, const char *buf, size_t len)
-+{
-+ long n;
-+
-+ if (strict_strtol(buf, 10, &n))
-+ return -EINVAL;
-+
-+ if (n != 0 && n != 1)
-+ return -EINVAL;
-+
-+ mddev->parallel_resync = n;
-+
-+ if (mddev->sync_thread)
-+ wake_up(&resync_wait);
-+
-+ return len;
-+}
-+
-+/* force parallel resync, even with shared block devices */
-+static struct md_sysfs_entry md_sync_force_parallel =
-+__ATTR(sync_force_parallel, S_IRUGO|S_IWUSR,
-+ sync_force_parallel_show, sync_force_parallel_store);
-+
-+static ssize_t
- sync_speed_show(mddev_t *mddev, char *page)
- {
- unsigned long resync, dt, db;
-@@ -3187,6 +3219,7 @@ static struct attribute *md_redundancy_attrs[] = {
- &md_sync_min.attr,
- &md_sync_max.attr,
- &md_sync_speed.attr,
-+ &md_sync_force_parallel.attr,
- &md_sync_completed.attr,
- &md_max_sync.attr,
- &md_suspend_lo.attr,
-@@ -3691,6 +3724,8 @@ static int do_md_stop(mddev_t * mddev, int mode)
-
- module_put(mddev->pers->owner);
- mddev->pers = NULL;
-+ /* tell userspace to handle 'inactive' */
-+ sysfs_notify(&mddev->kobj, NULL, "array_state");
-
- set_capacity(disk, 0);
- mddev->changed = 1;
-@@ -3987,8 +4022,8 @@ static int get_bitmap_file(mddev_t * mddev, void __user * arg)
- if (!buf)
- goto out;
-
-- ptr = file_path(mddev->bitmap->file, buf, sizeof(file->pathname));
-- if (!ptr)
-+ ptr = d_path(&mddev->bitmap->file->f_path, buf, sizeof(file->pathname));
-+ if (IS_ERR(ptr))
- goto out;
-
- strcpy(file->pathname, ptr);
-@@ -5399,7 +5434,7 @@ void md_done_sync(mddev_t *mddev, int blocks, int ok)
- atomic_sub(blocks, &mddev->recovery_active);
- wake_up(&mddev->recovery_wait);
- if (!ok) {
-- set_bit(MD_RECOVERY_ERR, &mddev->recovery);
-+ set_bit(MD_RECOVERY_INTR, &mddev->recovery);
- md_wakeup_thread(mddev->thread);
- // stop recovery, signal do_sync ....
- }
-@@ -5435,8 +5470,11 @@ void md_write_start(mddev_t *mddev, struct bio *bi)
- md_wakeup_thread(mddev->thread);
- }
- spin_unlock_irq(&mddev->write_lock);
-+ sysfs_notify(&mddev->kobj, NULL, "array_state");
- }
-- wait_event(mddev->sb_wait, mddev->flags==0);
-+ wait_event(mddev->sb_wait,
-+ !test_bit(MD_CHANGE_CLEAN, &mddev->flags) &&
-+ !test_bit(MD_CHANGE_PENDING, &mddev->flags));
- }
-
- void md_write_end(mddev_t *mddev)
-@@ -5471,13 +5509,17 @@ void md_allow_write(mddev_t *mddev)
- mddev->safemode = 1;
- spin_unlock_irq(&mddev->write_lock);
- md_update_sb(mddev, 0);
-+
-+ sysfs_notify(&mddev->kobj, NULL, "array_state");
-+ /* wait for the dirty state to be recorded in the metadata */
-+ wait_event(mddev->sb_wait,
-+ !test_bit(MD_CHANGE_CLEAN, &mddev->flags) &&
-+ !test_bit(MD_CHANGE_PENDING, &mddev->flags));
- } else
- spin_unlock_irq(&mddev->write_lock);
- }
- EXPORT_SYMBOL_GPL(md_allow_write);
-
--static DECLARE_WAIT_QUEUE_HEAD(resync_wait);
--
- #define SYNC_MARKS 10
- #define SYNC_MARK_STEP (3*HZ)
- void md_do_sync(mddev_t *mddev)
-@@ -5541,8 +5583,9 @@ void md_do_sync(mddev_t *mddev)
- for_each_mddev(mddev2, tmp) {
- if (mddev2 == mddev)
- continue;
-- if (mddev2->curr_resync &&
-- match_mddev_units(mddev,mddev2)) {
-+ if (!mddev->parallel_resync
-+ && mddev2->curr_resync
-+ && match_mddev_units(mddev, mddev2)) {
- DEFINE_WAIT(wq);
- if (mddev < mddev2 && mddev->curr_resync == 2) {
- /* arbitrarily yield */
-@@ -5647,7 +5690,7 @@ void md_do_sync(mddev_t *mddev)
- sectors = mddev->pers->sync_request(mddev, j, &skipped,
- currspeed < speed_min(mddev));
- if (sectors == 0) {
-- set_bit(MD_RECOVERY_ERR, &mddev->recovery);
-+ set_bit(MD_RECOVERY_INTR, &mddev->recovery);
- goto out;
- }
-
-@@ -5670,8 +5713,7 @@ void md_do_sync(mddev_t *mddev)
-
- last_check = io_sectors;
-
-- if (test_bit(MD_RECOVERY_INTR, &mddev->recovery) ||
-- test_bit(MD_RECOVERY_ERR, &mddev->recovery))
-+ if (test_bit(MD_RECOVERY_INTR, &mddev->recovery))
- break;
-
- repeat:
-@@ -5725,8 +5767,7 @@ void md_do_sync(mddev_t *mddev)
- /* tell personality that we are finished */
- mddev->pers->sync_request(mddev, max_sectors, &skipped, 1);
-
-- if (!test_bit(MD_RECOVERY_ERR, &mddev->recovery) &&
-- !test_bit(MD_RECOVERY_CHECK, &mddev->recovery) &&
-+ if (!test_bit(MD_RECOVERY_CHECK, &mddev->recovery) &&
- mddev->curr_resync > 2) {
- if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) {
- if (test_bit(MD_RECOVERY_INTR, &mddev->recovery)) {
-@@ -5795,7 +5836,10 @@ static int remove_and_add_spares(mddev_t *mddev)
- }
-
- if (mddev->degraded) {
-- rdev_for_each(rdev, rtmp, mddev)
-+ rdev_for_each(rdev, rtmp, mddev) {
-+ if (rdev->raid_disk >= 0 &&
-+ !test_bit(In_sync, &rdev->flags))
-+ spares++;
- if (rdev->raid_disk < 0
- && !test_bit(Faulty, &rdev->flags)) {
- rdev->recovery_offset = 0;
-@@ -5813,6 +5857,7 @@ static int remove_and_add_spares(mddev_t *mddev)
- } else
- break;
- }
-+ }
- }
- return spares;
- }
-@@ -5826,7 +5871,7 @@ static int remove_and_add_spares(mddev_t *mddev)
- * to do that as needed.
- * When it is determined that resync is needed, we set MD_RECOVERY_RUNNING in
- * "->recovery" and create a thread at ->sync_thread.
-- * When the thread finishes it sets MD_RECOVERY_DONE (and might set MD_RECOVERY_ERR)
-+ * When the thread finishes it sets MD_RECOVERY_DONE
- * and wakeups up this thread which will reap the thread and finish up.
- * This thread also removes any faulty devices (with nr_pending == 0).
- *
-@@ -5901,8 +5946,7 @@ void md_check_recovery(mddev_t *mddev)
- /* resync has finished, collect result */
- md_unregister_thread(mddev->sync_thread);
- mddev->sync_thread = NULL;
-- if (!test_bit(MD_RECOVERY_ERR, &mddev->recovery) &&
-- !test_bit(MD_RECOVERY_INTR, &mddev->recovery)) {
-+ if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery)) {
- /* success...*/
- /* activate any spares */
- mddev->pers->spare_active(mddev);
-@@ -5926,7 +5970,6 @@ void md_check_recovery(mddev_t *mddev)
- * might be left set
- */
- clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
-- clear_bit(MD_RECOVERY_ERR, &mddev->recovery);
- clear_bit(MD_RECOVERY_INTR, &mddev->recovery);
- clear_bit(MD_RECOVERY_DONE, &mddev->recovery);
-
-diff --git a/drivers/md/multipath.c b/drivers/md/multipath.c
-index 4f4d1f3..e968116 100644
---- a/drivers/md/multipath.c
-+++ b/drivers/md/multipath.c
-@@ -327,7 +327,8 @@ static int multipath_remove_disk(mddev_t *mddev, int number)
- if (rdev) {
- if (test_bit(In_sync, &rdev->flags) ||
- atomic_read(&rdev->nr_pending)) {
-- printk(KERN_ERR "hot-remove-disk, slot %d is identified" " but is still operational!\n", number);
-+ printk(KERN_ERR "hot-remove-disk, slot %d is identified"
-+ " but is still operational!\n", number);
- err = -EBUSY;
- goto abort;
- }
-diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
-index ac409b7..c610b94 100644
---- a/drivers/md/raid1.c
-+++ b/drivers/md/raid1.c
-@@ -773,7 +773,7 @@ static int make_request(struct request_queue *q, struct bio * bio)
- r1bio_t *r1_bio;
- struct bio *read_bio;
- int i, targets = 0, disks;
-- struct bitmap *bitmap = mddev->bitmap;
-+ struct bitmap *bitmap;
- unsigned long flags;
- struct bio_list bl;
- struct page **behind_pages = NULL;
-@@ -802,6 +802,8 @@ static int make_request(struct request_queue *q, struct bio * bio)
-
- wait_barrier(conf);
-
-+ bitmap = mddev->bitmap;
-+
- disk_stat_inc(mddev->gendisk, ios[rw]);
- disk_stat_add(mddev->gendisk, sectors[rw], bio_sectors(bio));
-
-@@ -1025,7 +1027,7 @@ static void error(mddev_t *mddev, mdk_rdev_t *rdev)
- /*
- * if recovery is running, make sure it aborts.
- */
-- set_bit(MD_RECOVERY_ERR, &mddev->recovery);
-+ set_bit(MD_RECOVERY_INTR, &mddev->recovery);
- } else
- set_bit(Faulty, &rdev->flags);
- set_bit(MD_CHANGE_DEVS, &mddev->flags);
-@@ -1146,6 +1148,14 @@ static int raid1_remove_disk(mddev_t *mddev, int number)
- err = -EBUSY;
- goto abort;
- }
-+ /* Only remove non-faulty devices is recovery
-+ * is not possible.
-+ */
-+ if (!test_bit(Faulty, &rdev->flags) &&
-+ mddev->degraded < conf->raid_disks) {
-+ err = -EBUSY;
-+ goto abort;
-+ }
- p->rdev = NULL;
- synchronize_rcu();
- if (atomic_read(&rdev->nr_pending)) {
-@@ -1282,6 +1292,7 @@ static void sync_request_write(mddev_t *mddev, r1bio_t *r1_bio)
- rdev_dec_pending(conf->mirrors[i].rdev, mddev);
- } else {
- /* fixup the bio for reuse */
-+ int size;
- sbio->bi_vcnt = vcnt;
- sbio->bi_size = r1_bio->sectors << 9;
- sbio->bi_idx = 0;
-@@ -1295,10 +1306,20 @@ static void sync_request_write(mddev_t *mddev, r1bio_t *r1_bio)
- sbio->bi_sector = r1_bio->sector +
- conf->mirrors[i].rdev->data_offset;
- sbio->bi_bdev = conf->mirrors[i].rdev->bdev;
-- for (j = 0; j < vcnt ; j++)
-- memcpy(page_address(sbio->bi_io_vec[j].bv_page),
-+ size = sbio->bi_size;
-+ for (j = 0; j < vcnt ; j++) {
-+ struct bio_vec *bi;
-+ bi = &sbio->bi_io_vec[j];
-+ bi->bv_offset = 0;
-+ if (size > PAGE_SIZE)
-+ bi->bv_len = PAGE_SIZE;
-+ else
-+ bi->bv_len = size;
-+ size -= PAGE_SIZE;
-+ memcpy(page_address(bi->bv_page),
- page_address(pbio->bi_io_vec[j].bv_page),
- PAGE_SIZE);
-+ }
-
- }
- }
-diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
-index 8536ede..1de17da 100644
---- a/drivers/md/raid10.c
-+++ b/drivers/md/raid10.c
-@@ -1020,7 +1020,7 @@ static void error(mddev_t *mddev, mdk_rdev_t *rdev)
- /*
- * if recovery is running, make sure it aborts.
- */
-- set_bit(MD_RECOVERY_ERR, &mddev->recovery);
-+ set_bit(MD_RECOVERY_INTR, &mddev->recovery);
- }
- set_bit(Faulty, &rdev->flags);
- set_bit(MD_CHANGE_DEVS, &mddev->flags);
-@@ -1171,6 +1171,14 @@ static int raid10_remove_disk(mddev_t *mddev, int number)
- err = -EBUSY;
- goto abort;
- }
-+ /* Only remove faulty devices in recovery
-+ * is not possible.
-+ */
-+ if (!test_bit(Faulty, &rdev->flags) &&
-+ enough(conf)) {
-+ err = -EBUSY;
-+ goto abort;
-+ }
- p->rdev = NULL;
- synchronize_rcu();
- if (atomic_read(&rdev->nr_pending)) {
-@@ -1237,6 +1245,7 @@ static void end_sync_write(struct bio *bio, int error)
-
- if (!uptodate)
- md_error(mddev, conf->mirrors[d].rdev);
-+
- update_head_pos(i, r10_bio);
-
- while (atomic_dec_and_test(&r10_bio->remaining)) {
-@@ -1844,7 +1853,8 @@ static sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *skipped, i
- if (rb2)
- atomic_dec(&rb2->remaining);
- r10_bio = rb2;
-- if (!test_and_set_bit(MD_RECOVERY_ERR, &mddev->recovery))
-+ if (!test_and_set_bit(MD_RECOVERY_INTR,
-+ &mddev->recovery))
- printk(KERN_INFO "raid10: %s: insufficient working devices for recovery.\n",
- mdname(mddev));
- break;
-diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
-index 93fde48..425958a 100644
---- a/drivers/md/raid5.c
-+++ b/drivers/md/raid5.c
-@@ -94,6 +94,8 @@
- #define __inline__
- #endif
-
-+#define printk_rl(args...) ((void) (printk_ratelimit() && printk(args)))
-+
- #if !RAID6_USE_EMPTY_ZERO_PAGE
- /* In .bss so it's zeroed */
- const char raid6_empty_zero_page[PAGE_SIZE] __attribute__((aligned(256)));
-@@ -1143,10 +1145,12 @@ static void raid5_end_read_request(struct bio * bi, int error)
- set_bit(R5_UPTODATE, &sh->dev[i].flags);
- if (test_bit(R5_ReadError, &sh->dev[i].flags)) {
- rdev = conf->disks[i].rdev;
-- printk(KERN_INFO "raid5:%s: read error corrected (%lu sectors at %llu on %s)\n",
-- mdname(conf->mddev), STRIPE_SECTORS,
-- (unsigned long long)(sh->sector + rdev->data_offset),
-- bdevname(rdev->bdev, b));
-+ printk_rl(KERN_INFO "raid5:%s: read error corrected"
-+ " (%lu sectors at %llu on %s)\n",
-+ mdname(conf->mddev), STRIPE_SECTORS,
-+ (unsigned long long)(sh->sector
-+ + rdev->data_offset),
-+ bdevname(rdev->bdev, b));
- clear_bit(R5_ReadError, &sh->dev[i].flags);
- clear_bit(R5_ReWrite, &sh->dev[i].flags);
- }
-@@ -1160,16 +1164,22 @@ static void raid5_end_read_request(struct bio * bi, int error)
- clear_bit(R5_UPTODATE, &sh->dev[i].flags);
- atomic_inc(&rdev->read_errors);
- if (conf->mddev->degraded)
-- printk(KERN_WARNING "raid5:%s: read error not correctable (sector %llu on %s).\n",
-- mdname(conf->mddev),
-- (unsigned long long)(sh->sector + rdev->data_offset),
-- bdn);
-+ printk_rl(KERN_WARNING
-+ "raid5:%s: read error not correctable "
-+ "(sector %llu on %s).\n",
-+ mdname(conf->mddev),
-+ (unsigned long long)(sh->sector
-+ + rdev->data_offset),
-+ bdn);
- else if (test_bit(R5_ReWrite, &sh->dev[i].flags))
- /* Oh, no!!! */
-- printk(KERN_WARNING "raid5:%s: read error NOT corrected!! (sector %llu on %s).\n",
-- mdname(conf->mddev),
-- (unsigned long long)(sh->sector + rdev->data_offset),
-- bdn);
-+ printk_rl(KERN_WARNING
-+ "raid5:%s: read error NOT corrected!! "
-+ "(sector %llu on %s).\n",
-+ mdname(conf->mddev),
-+ (unsigned long long)(sh->sector
-+ + rdev->data_offset),
-+ bdn);
- else if (atomic_read(&rdev->read_errors)
- > conf->max_nr_stripes)
- printk(KERN_WARNING
-@@ -1258,7 +1268,7 @@ static void error(mddev_t *mddev, mdk_rdev_t *rdev)
- /*
- * if recovery was running, make sure it aborts.
- */
-- set_bit(MD_RECOVERY_ERR, &mddev->recovery);
-+ set_bit(MD_RECOVERY_INTR, &mddev->recovery);
- }
- set_bit(Faulty, &rdev->flags);
- printk (KERN_ALERT
-@@ -4564,6 +4574,14 @@ static int raid5_remove_disk(mddev_t *mddev, int number)
- err = -EBUSY;
- goto abort;
- }
-+ /* Only remove non-faulty devices if recovery
-+ * isn't possible.
-+ */
-+ if (!test_bit(Faulty, &rdev->flags) &&
-+ mddev->degraded <= conf->max_degraded) {
-+ err = -EBUSY;
-+ goto abort;
-+ }
- p->rdev = NULL;
- synchronize_rcu();
- if (atomic_read(&rdev->nr_pending)) {
-diff --git a/drivers/media/video/Kconfig b/drivers/media/video/Kconfig
-index 89d8d37..3b26fbd 100644
---- a/drivers/media/video/Kconfig
-+++ b/drivers/media/video/Kconfig
-@@ -901,7 +901,7 @@ endif # V4L_USB_DRIVERS
-
- config SOC_CAMERA
- tristate "SoC camera support"
-- depends on VIDEO_V4L2
-+ depends on VIDEO_V4L2 && HAS_DMA
- select VIDEOBUF_DMA_SG
- help
- SoC Camera is a common API to several cameras, not connecting
-diff --git a/drivers/media/video/bt8xx/bttv-driver.c b/drivers/media/video/bt8xx/bttv-driver.c
-index 2ca3e9c..0165aac 100644
---- a/drivers/media/video/bt8xx/bttv-driver.c
-+++ b/drivers/media/video/bt8xx/bttv-driver.c
-@@ -2613,7 +2613,7 @@ static int vidiocgmbuf(struct file *file, void *priv, struct video_mbuf *mbuf)
- struct bttv_fh *fh = priv;
-
- mutex_lock(&fh->cap.vb_lock);
-- retval = videobuf_mmap_setup(&fh->cap, gbuffers, gbufsize,
-+ retval = __videobuf_mmap_setup(&fh->cap, gbuffers, gbufsize,
- V4L2_MEMORY_MMAP);
- if (retval < 0) {
- mutex_unlock(&fh->cap.vb_lock);
-diff --git a/drivers/media/video/videobuf-core.c b/drivers/media/video/videobuf-core.c
-index 982f446..0a88c44 100644
---- a/drivers/media/video/videobuf-core.c
-+++ b/drivers/media/video/videobuf-core.c
-@@ -331,7 +331,7 @@ int videobuf_mmap_free(struct videobuf_queue *q)
- }
-
- /* Locking: Caller holds q->vb_lock */
--static int __videobuf_mmap_setup(struct videobuf_queue *q,
-+int __videobuf_mmap_setup(struct videobuf_queue *q,
- unsigned int bcount, unsigned int bsize,
- enum v4l2_memory memory)
- {
-@@ -1129,6 +1129,7 @@ EXPORT_SYMBOL_GPL(videobuf_read_stream);
- EXPORT_SYMBOL_GPL(videobuf_read_one);
- EXPORT_SYMBOL_GPL(videobuf_poll_stream);
-
-+EXPORT_SYMBOL_GPL(__videobuf_mmap_setup);
- EXPORT_SYMBOL_GPL(videobuf_mmap_setup);
- EXPORT_SYMBOL_GPL(videobuf_mmap_free);
- EXPORT_SYMBOL_GPL(videobuf_mmap_mapper);
-diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
-index 2566479..ae96bd6 100644
---- a/drivers/mfd/Kconfig
-+++ b/drivers/mfd/Kconfig
-@@ -24,7 +24,7 @@ config MFD_ASIC3
-
- config HTC_EGPIO
- bool "HTC EGPIO support"
-- depends on GENERIC_HARDIRQS && HAVE_GPIO_LIB
-+ depends on GENERIC_HARDIRQS && HAVE_GPIO_LIB && ARM
- help
- This driver supports the CPLD egpio chip present on
- several HTC phones. It provides basic support for input
-diff --git a/drivers/mmc/card/Kconfig b/drivers/mmc/card/Kconfig
-index aa8a4e4..dd0f398 100644
---- a/drivers/mmc/card/Kconfig
-+++ b/drivers/mmc/card/Kconfig
-@@ -39,3 +39,15 @@ config SDIO_UART
- SDIO function driver for SDIO cards that implements the UART
- class, as well as the GPS class which appears like a UART.
-
-+config MMC_TEST
-+ tristate "MMC host test driver"
-+ default n
-+ help
-+ Development driver that performs a series of reads and writes
-+ to a memory card in order to expose certain well known bugs
-+ in host controllers. The tests are executed by writing to the
-+ "test" file in sysfs under each card. Note that whatever is
-+ on your card will be overwritten by these tests.
-+
-+ This driver is only of interest to those developing or
-+ testing a host driver. Most people should say N here.
-diff --git a/drivers/mmc/card/Makefile b/drivers/mmc/card/Makefile
-index fc5a784..0d40751 100644
---- a/drivers/mmc/card/Makefile
-+++ b/drivers/mmc/card/Makefile
-@@ -8,6 +8,7 @@ endif
-
- obj-$(CONFIG_MMC_BLOCK) += mmc_block.o
- mmc_block-objs := block.o queue.o
-+obj-$(CONFIG_MMC_TEST) += mmc_test.o
-
- obj-$(CONFIG_SDIO_UART) += sdio_uart.o
-
-diff --git a/drivers/mmc/card/mmc_test.c b/drivers/mmc/card/mmc_test.c
-new file mode 100644
-index 0000000..ffadee5
---- /dev/null
-+++ b/drivers/mmc/card/mmc_test.c
-@@ -0,0 +1,892 @@
-+/*
-+ * linux/drivers/mmc/card/mmc_test.c
-+ *
-+ * Copyright 2007 Pierre Ossman
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or (at
-+ * your option) any later version.
-+ */
-+
-+#include
-+#include
-+#include
-+#include
-+
-+#include
-+
-+#define RESULT_OK 0
-+#define RESULT_FAIL 1
-+#define RESULT_UNSUP_HOST 2
-+#define RESULT_UNSUP_CARD 3
-+
-+#define BUFFER_SIZE (PAGE_SIZE * 4)
-+
-+struct mmc_test_card {
-+ struct mmc_card *card;
-+
-+ u8 *buffer;
-+};
-+
-+/*******************************************************************/
-+/* Helper functions */
-+/*******************************************************************/
-+
-+static int mmc_test_set_blksize(struct mmc_test_card *test, unsigned size)
-+{
-+ struct mmc_command cmd;
-+ int ret;
-+
-+ cmd.opcode = MMC_SET_BLOCKLEN;
-+ cmd.arg = size;
-+ cmd.flags = MMC_RSP_R1 | MMC_CMD_AC;
-+ ret = mmc_wait_for_cmd(test->card->host, &cmd, 0);
-+ if (ret)
-+ return ret;
-+
-+ return 0;
-+}
-+
-+static int __mmc_test_transfer(struct mmc_test_card *test, int write,
-+ unsigned broken_xfer, u8 *buffer, unsigned addr,
-+ unsigned blocks, unsigned blksz)
-+{
-+ int ret, busy;
-+
-+ struct mmc_request mrq;
-+ struct mmc_command cmd;
-+ struct mmc_command stop;
-+ struct mmc_data data;
-+
-+ struct scatterlist sg;
-+
-+ memset(&mrq, 0, sizeof(struct mmc_request));
-+
-+ mrq.cmd = &cmd;
-+ mrq.data = &data;
-+
-+ memset(&cmd, 0, sizeof(struct mmc_command));
-+
-+ if (broken_xfer) {
-+ if (blocks > 1) {
-+ cmd.opcode = write ?
-+ MMC_WRITE_BLOCK : MMC_READ_SINGLE_BLOCK;
-+ } else {
-+ cmd.opcode = MMC_SEND_STATUS;
-+ }
-+ } else {
-+ if (blocks > 1) {
-+ cmd.opcode = write ?
-+ MMC_WRITE_MULTIPLE_BLOCK : MMC_READ_MULTIPLE_BLOCK;
-+ } else {
-+ cmd.opcode = write ?
-+ MMC_WRITE_BLOCK : MMC_READ_SINGLE_BLOCK;
-+ }
-+ }
-+
-+ if (broken_xfer && blocks == 1)
-+ cmd.arg = test->card->rca << 16;
-+ else
-+ cmd.arg = addr;
-+ cmd.flags = MMC_RSP_R1 | MMC_CMD_ADTC;
-+
-+ memset(&stop, 0, sizeof(struct mmc_command));
-+
-+ if (!broken_xfer && (blocks > 1)) {
-+ stop.opcode = MMC_STOP_TRANSMISSION;
-+ stop.arg = 0;
-+ stop.flags = MMC_RSP_R1B | MMC_CMD_AC;
-+
-+ mrq.stop = &stop;
-+ }
-+
-+ memset(&data, 0, sizeof(struct mmc_data));
-+
-+ data.blksz = blksz;
-+ data.blocks = blocks;
-+ data.flags = write ? MMC_DATA_WRITE : MMC_DATA_READ;
-+ data.sg = &sg;
-+ data.sg_len = 1;
-+
-+ sg_init_one(&sg, buffer, blocks * blksz);
-+
-+ mmc_set_data_timeout(&data, test->card);
-+
-+ mmc_wait_for_req(test->card->host, &mrq);
-+
-+ ret = 0;
-+
-+ if (broken_xfer) {
-+ if (!ret && cmd.error)
-+ ret = cmd.error;
-+ if (!ret && data.error == 0)
-+ ret = RESULT_FAIL;
-+ if (!ret && data.error != -ETIMEDOUT)
-+ ret = data.error;
-+ if (!ret && stop.error)
-+ ret = stop.error;
-+ if (blocks > 1) {
-+ if (!ret && data.bytes_xfered > blksz)
-+ ret = RESULT_FAIL;
-+ } else {
-+ if (!ret && data.bytes_xfered > 0)
-+ ret = RESULT_FAIL;
-+ }
-+ } else {
-+ if (!ret && cmd.error)
-+ ret = cmd.error;
-+ if (!ret && data.error)
-+ ret = data.error;
-+ if (!ret && stop.error)
-+ ret = stop.error;
-+ if (!ret && data.bytes_xfered != blocks * blksz)
-+ ret = RESULT_FAIL;
-+ }
-+
-+ if (ret == -EINVAL)
-+ ret = RESULT_UNSUP_HOST;
-+
-+ busy = 0;
-+ do {
-+ int ret2;
-+
-+ memset(&cmd, 0, sizeof(struct mmc_command));
-+
-+ cmd.opcode = MMC_SEND_STATUS;
-+ cmd.arg = test->card->rca << 16;
-+ cmd.flags = MMC_RSP_R1 | MMC_CMD_AC;
-+
-+ ret2 = mmc_wait_for_cmd(test->card->host, &cmd, 0);
-+ if (ret2)
-+ break;
-+
-+ if (!busy && !(cmd.resp[0] & R1_READY_FOR_DATA)) {
-+ busy = 1;
-+ printk(KERN_INFO "%s: Warning: Host did not "
-+ "wait for busy state to end.\n",
-+ mmc_hostname(test->card->host));
-+ }
-+ } while (!(cmd.resp[0] & R1_READY_FOR_DATA));
-+
-+ return ret;
-+}
-+
-+static int mmc_test_transfer(struct mmc_test_card *test, int write,
-+ u8 *buffer, unsigned addr, unsigned blocks, unsigned blksz)
-+{
-+ return __mmc_test_transfer(test, write, 0, buffer,
-+ addr, blocks, blksz);
-+}
-+
-+static int mmc_test_prepare_verify(struct mmc_test_card *test, int write)
-+{
-+ int ret, i;
-+
-+ ret = mmc_test_set_blksize(test, 512);
-+ if (ret)
-+ return ret;
-+
-+ if (write)
-+ memset(test->buffer, 0xDF, BUFFER_SIZE);
-+ else {
-+ for (i = 0;i < BUFFER_SIZE;i++)
-+ test->buffer[i] = i;
-+ }
-+
-+ for (i = 0;i < BUFFER_SIZE / 512;i++) {
-+ ret = mmc_test_transfer(test, 1, test->buffer + i * 512,
-+ i * 512, 1, 512);
-+ if (ret)
-+ return ret;
-+ }
-+
-+ return 0;
-+}
-+
-+static int mmc_test_prepare_verify_write(struct mmc_test_card *test)
-+{
-+ return mmc_test_prepare_verify(test, 1);
-+}
-+
-+static int mmc_test_prepare_verify_read(struct mmc_test_card *test)
-+{
-+ return mmc_test_prepare_verify(test, 0);
-+}
-+
-+static int mmc_test_verified_transfer(struct mmc_test_card *test, int write,
-+ u8 *buffer, unsigned addr, unsigned blocks, unsigned blksz)
-+{
-+ int ret, i, sectors;
-+
-+ /*
-+ * It is assumed that the above preparation has been done.
-+ */
-+
-+ memset(test->buffer, 0, BUFFER_SIZE);
-+
-+ if (write) {
-+ for (i = 0;i < blocks * blksz;i++)
-+ buffer[i] = i;
-+ }
-+
-+ ret = mmc_test_set_blksize(test, blksz);
-+ if (ret)
-+ return ret;
-+
-+ ret = mmc_test_transfer(test, write, buffer, addr, blocks, blksz);
-+ if (ret)
-+ return ret;
-+
-+ if (write) {
-+ ret = mmc_test_set_blksize(test, 512);
-+ if (ret)
-+ return ret;
-+
-+ sectors = (blocks * blksz + 511) / 512;
-+ if ((sectors * 512) == (blocks * blksz))
-+ sectors++;
-+
-+ if ((sectors * 512) > BUFFER_SIZE)
-+ return -EINVAL;
-+
-+ memset(test->buffer, 0, sectors * 512);
-+
-+ for (i = 0;i < sectors;i++) {
-+ ret = mmc_test_transfer(test, 0,
-+ test->buffer + i * 512,
-+ addr + i * 512, 1, 512);
-+ if (ret)
-+ return ret;
-+ }
-+
-+ for (i = 0;i < blocks * blksz;i++) {
-+ if (test->buffer[i] != (u8)i)
-+ return RESULT_FAIL;
-+ }
-+
-+ for (;i < sectors * 512;i++) {
-+ if (test->buffer[i] != 0xDF)
-+ return RESULT_FAIL;
-+ }
-+ } else {
-+ for (i = 0;i < blocks * blksz;i++) {
-+ if (buffer[i] != (u8)i)
-+ return RESULT_FAIL;
-+ }
-+ }
-+
-+ return 0;
-+}
-+
-+static int mmc_test_cleanup_verify(struct mmc_test_card *test)
-+{
-+ int ret, i;
-+
-+ ret = mmc_test_set_blksize(test, 512);
-+ if (ret)
-+ return ret;
-+
-+ memset(test->buffer, 0, BUFFER_SIZE);
-+
-+ for (i = 0;i < BUFFER_SIZE / 512;i++) {
-+ ret = mmc_test_transfer(test, 1, test->buffer + i * 512,
-+ i * 512, 1, 512);
-+ if (ret)
-+ return ret;
-+ }
-+
-+ return 0;
-+}
-+
-+/*******************************************************************/
-+/* Tests */
-+/*******************************************************************/
-+
-+struct mmc_test_case {
-+ const char *name;
-+
-+ int (*prepare)(struct mmc_test_card *);
-+ int (*run)(struct mmc_test_card *);
-+ int (*cleanup)(struct mmc_test_card *);
-+};
-+
-+static int mmc_test_basic_write(struct mmc_test_card *test)
-+{
-+ int ret;
-+
-+ ret = mmc_test_set_blksize(test, 512);
-+ if (ret)
-+ return ret;
-+
-+ ret = mmc_test_transfer(test, 1, test->buffer, 0, 1, 512);
-+ if (ret)
-+ return ret;
-+
-+ return 0;
-+}
-+
-+static int mmc_test_basic_read(struct mmc_test_card *test)
-+{
-+ int ret;
-+
-+ ret = mmc_test_set_blksize(test, 512);
-+ if (ret)
-+ return ret;
-+
-+ ret = mmc_test_transfer(test, 0, test->buffer, 0, 1, 512);
-+ if (ret)
-+ return ret;
-+
-+ return 0;
-+}
-+
-+static int mmc_test_verify_write(struct mmc_test_card *test)
-+{
-+ int ret;
-+
-+ ret = mmc_test_verified_transfer(test, 1, test->buffer, 0, 1, 512);
-+ if (ret)
-+ return ret;
-+
-+ return 0;
-+}
-+
-+static int mmc_test_verify_read(struct mmc_test_card *test)
-+{
-+ int ret;
-+
-+ ret = mmc_test_verified_transfer(test, 0, test->buffer, 0, 1, 512);
-+ if (ret)
-+ return ret;
-+
-+ return 0;
-+}
-+
-+static int mmc_test_multi_write(struct mmc_test_card *test)
-+{
-+ int ret;
-+ unsigned int size;
-+
-+ if (test->card->host->max_blk_count == 1)
-+ return RESULT_UNSUP_HOST;
-+
-+ size = PAGE_SIZE * 2;
-+ size = min(size, test->card->host->max_req_size);
-+ size = min(size, test->card->host->max_seg_size);
-+ size = min(size, test->card->host->max_blk_count * 512);
-+
-+ if (size < 1024)
-+ return RESULT_UNSUP_HOST;
-+
-+ ret = mmc_test_verified_transfer(test, 1, test->buffer, 0,
-+ size / 512, 512);
-+ if (ret)
-+ return ret;
-+
-+ return 0;
-+}
-+
-+static int mmc_test_multi_read(struct mmc_test_card *test)
-+{
-+ int ret;
-+ unsigned int size;
-+
-+ if (test->card->host->max_blk_count == 1)
-+ return RESULT_UNSUP_HOST;
-+
-+ size = PAGE_SIZE * 2;
-+ size = min(size, test->card->host->max_req_size);
-+ size = min(size, test->card->host->max_seg_size);
-+ size = min(size, test->card->host->max_blk_count * 512);
-+
-+ if (size < 1024)
-+ return RESULT_UNSUP_HOST;
-+
-+ ret = mmc_test_verified_transfer(test, 0, test->buffer, 0,
-+ size / 512, 512);
-+ if (ret)
-+ return ret;
-+
-+ return 0;
-+}
-+
-+static int mmc_test_pow2_write(struct mmc_test_card *test)
-+{
-+ int ret, i;
-+
-+ if (!test->card->csd.write_partial)
-+ return RESULT_UNSUP_CARD;
-+
-+ for (i = 1; i < 512;i <<= 1) {
-+ ret = mmc_test_verified_transfer(test, 1,
-+ test->buffer, 0, 1, i);
-+ if (ret)
-+ return ret;
-+ }
-+
-+ return 0;
-+}
-+
-+static int mmc_test_pow2_read(struct mmc_test_card *test)
-+{
-+ int ret, i;
-+
-+ if (!test->card->csd.read_partial)
-+ return RESULT_UNSUP_CARD;
-+
-+ for (i = 1; i < 512;i <<= 1) {
-+ ret = mmc_test_verified_transfer(test, 0,
-+ test->buffer, 0, 1, i);
-+ if (ret)
-+ return ret;
-+ }
-+
-+ return 0;
-+}
-+
-+static int mmc_test_weird_write(struct mmc_test_card *test)
-+{
-+ int ret, i;
-+
-+ if (!test->card->csd.write_partial)
-+ return RESULT_UNSUP_CARD;
-+
-+ for (i = 3; i < 512;i += 7) {
-+ ret = mmc_test_verified_transfer(test, 1,
-+ test->buffer, 0, 1, i);
-+ if (ret)
-+ return ret;
-+ }
-+
-+ return 0;
-+}
-+
-+static int mmc_test_weird_read(struct mmc_test_card *test)
-+{
-+ int ret, i;
-+
-+ if (!test->card->csd.read_partial)
-+ return RESULT_UNSUP_CARD;
-+
-+ for (i = 3; i < 512;i += 7) {
-+ ret = mmc_test_verified_transfer(test, 0,
-+ test->buffer, 0, 1, i);
-+ if (ret)
-+ return ret;
-+ }
-+
-+ return 0;
-+}
-+
-+static int mmc_test_align_write(struct mmc_test_card *test)
-+{
-+ int ret, i;
-+
-+ for (i = 1;i < 4;i++) {
-+ ret = mmc_test_verified_transfer(test, 1, test->buffer + i,
-+ 0, 1, 512);
-+ if (ret)
-+ return ret;
-+ }
-+
-+ return 0;
-+}
-+
-+static int mmc_test_align_read(struct mmc_test_card *test)
-+{
-+ int ret, i;
-+
-+ for (i = 1;i < 4;i++) {
-+ ret = mmc_test_verified_transfer(test, 0, test->buffer + i,
-+ 0, 1, 512);
-+ if (ret)
-+ return ret;
-+ }
-+
-+ return 0;
-+}
-+
-+static int mmc_test_align_multi_write(struct mmc_test_card *test)
-+{
-+ int ret, i;
-+ unsigned int size;
-+
-+ if (test->card->host->max_blk_count == 1)
-+ return RESULT_UNSUP_HOST;
-+
-+ size = PAGE_SIZE * 2;
-+ size = min(size, test->card->host->max_req_size);
-+ size = min(size, test->card->host->max_seg_size);
-+ size = min(size, test->card->host->max_blk_count * 512);
-+
-+ if (size < 1024)
-+ return RESULT_UNSUP_HOST;
-+
-+ for (i = 1;i < 4;i++) {
-+ ret = mmc_test_verified_transfer(test, 1, test->buffer + i,
-+ 0, size / 512, 512);
-+ if (ret)
-+ return ret;
-+ }
-+
-+ return 0;
-+}
-+
-+static int mmc_test_align_multi_read(struct mmc_test_card *test)
-+{
-+ int ret, i;
-+ unsigned int size;
-+
-+ if (test->card->host->max_blk_count == 1)
-+ return RESULT_UNSUP_HOST;
-+
-+ size = PAGE_SIZE * 2;
-+ size = min(size, test->card->host->max_req_size);
-+ size = min(size, test->card->host->max_seg_size);
-+ size = min(size, test->card->host->max_blk_count * 512);
-+
-+ if (size < 1024)
-+ return RESULT_UNSUP_HOST;
-+
-+ for (i = 1;i < 4;i++) {
-+ ret = mmc_test_verified_transfer(test, 0, test->buffer + i,
-+ 0, size / 512, 512);
-+ if (ret)
-+ return ret;
-+ }
-+
-+ return 0;
-+}
-+
-+static int mmc_test_xfersize_write(struct mmc_test_card *test)
-+{
-+ int ret;
-+
-+ ret = mmc_test_set_blksize(test, 512);
-+ if (ret)
-+ return ret;
-+
-+ ret = __mmc_test_transfer(test, 1, 1, test->buffer, 0, 1, 512);
-+ if (ret)
-+ return ret;
-+
-+ return 0;
-+}
-+
-+static int mmc_test_xfersize_read(struct mmc_test_card *test)
-+{
-+ int ret;
-+
-+ ret = mmc_test_set_blksize(test, 512);
-+ if (ret)
-+ return ret;
-+
-+ ret = __mmc_test_transfer(test, 0, 1, test->buffer, 0, 1, 512);
-+ if (ret)
-+ return ret;
-+
-+ return 0;
-+}
-+
-+static int mmc_test_multi_xfersize_write(struct mmc_test_card *test)
-+{
-+ int ret;
-+
-+ if (test->card->host->max_blk_count == 1)
-+ return RESULT_UNSUP_HOST;
-+
-+ ret = mmc_test_set_blksize(test, 512);
-+ if (ret)
-+ return ret;
-+
-+ ret = __mmc_test_transfer(test, 1, 1, test->buffer, 0, 2, 512);
-+ if (ret)
-+ return ret;
-+
-+ return 0;
-+}
-+
-+static int mmc_test_multi_xfersize_read(struct mmc_test_card *test)
-+{
-+ int ret;
-+
-+ if (test->card->host->max_blk_count == 1)
-+ return RESULT_UNSUP_HOST;
-+
-+ ret = mmc_test_set_blksize(test, 512);
-+ if (ret)
-+ return ret;
-+
-+ ret = __mmc_test_transfer(test, 0, 1, test->buffer, 0, 2, 512);
-+ if (ret)
-+ return ret;
-+
-+ return 0;
-+}
-+
-+static const struct mmc_test_case mmc_test_cases[] = {
-+ {
-+ .name = "Basic write (no data verification)",
-+ .run = mmc_test_basic_write,
-+ },
-+
-+ {
-+ .name = "Basic read (no data verification)",
-+ .run = mmc_test_basic_read,
-+ },
-+
-+ {
-+ .name = "Basic write (with data verification)",
-+ .prepare = mmc_test_prepare_verify_write,
-+ .run = mmc_test_verify_write,
-+ .cleanup = mmc_test_cleanup_verify,
-+ },
-+
-+ {
-+ .name = "Basic read (with data verification)",
-+ .prepare = mmc_test_prepare_verify_read,
-+ .run = mmc_test_verify_read,
-+ .cleanup = mmc_test_cleanup_verify,
-+ },
-+
-+ {
-+ .name = "Multi-block write",
-+ .prepare = mmc_test_prepare_verify_write,
-+ .run = mmc_test_multi_write,
-+ .cleanup = mmc_test_cleanup_verify,
-+ },
-+
-+ {
-+ .name = "Multi-block read",
-+ .prepare = mmc_test_prepare_verify_read,
-+ .run = mmc_test_multi_read,
-+ .cleanup = mmc_test_cleanup_verify,
-+ },
-+
-+ {
-+ .name = "Power of two block writes",
-+ .prepare = mmc_test_prepare_verify_write,
-+ .run = mmc_test_pow2_write,
-+ .cleanup = mmc_test_cleanup_verify,
-+ },
-+
-+ {
-+ .name = "Power of two block reads",
-+ .prepare = mmc_test_prepare_verify_read,
-+ .run = mmc_test_pow2_read,
-+ .cleanup = mmc_test_cleanup_verify,
-+ },
-+
-+ {
-+ .name = "Weird sized block writes",
-+ .prepare = mmc_test_prepare_verify_write,
-+ .run = mmc_test_weird_write,
-+ .cleanup = mmc_test_cleanup_verify,
-+ },
-+
-+ {
-+ .name = "Weird sized block reads",
-+ .prepare = mmc_test_prepare_verify_read,
-+ .run = mmc_test_weird_read,
-+ .cleanup = mmc_test_cleanup_verify,
-+ },
-+
-+ {
-+ .name = "Badly aligned write",
-+ .prepare = mmc_test_prepare_verify_write,
-+ .run = mmc_test_align_write,
-+ .cleanup = mmc_test_cleanup_verify,
-+ },
-+
-+ {
-+ .name = "Badly aligned read",
-+ .prepare = mmc_test_prepare_verify_read,
-+ .run = mmc_test_align_read,
-+ .cleanup = mmc_test_cleanup_verify,
-+ },
-+
-+ {
-+ .name = "Badly aligned multi-block write",
-+ .prepare = mmc_test_prepare_verify_write,
-+ .run = mmc_test_align_multi_write,
-+ .cleanup = mmc_test_cleanup_verify,
-+ },
-+
-+ {
-+ .name = "Badly aligned multi-block read",
-+ .prepare = mmc_test_prepare_verify_read,
-+ .run = mmc_test_align_multi_read,
-+ .cleanup = mmc_test_cleanup_verify,
-+ },
-+
-+ {
-+ .name = "Correct xfer_size at write (start failure)",
-+ .run = mmc_test_xfersize_write,
-+ },
-+
-+ {
-+ .name = "Correct xfer_size at read (start failure)",
-+ .run = mmc_test_xfersize_read,
-+ },
-+
-+ {
-+ .name = "Correct xfer_size at write (midway failure)",
-+ .run = mmc_test_multi_xfersize_write,
-+ },
-+
-+ {
-+ .name = "Correct xfer_size at read (midway failure)",
-+ .run = mmc_test_multi_xfersize_read,
-+ },
-+};
-+
-+static struct mutex mmc_test_lock;
-+
-+static void mmc_test_run(struct mmc_test_card *test)
-+{
-+ int i, ret;
-+
-+ printk(KERN_INFO "%s: Starting tests of card %s...\n",
-+ mmc_hostname(test->card->host), mmc_card_id(test->card));
-+
-+ mmc_claim_host(test->card->host);
-+
-+ for (i = 0;i < ARRAY_SIZE(mmc_test_cases);i++) {
-+ printk(KERN_INFO "%s: Test case %d. %s...\n",
-+ mmc_hostname(test->card->host), i + 1,
-+ mmc_test_cases[i].name);
-+
-+ if (mmc_test_cases[i].prepare) {
-+ ret = mmc_test_cases[i].prepare(test);
-+ if (ret) {
-+ printk(KERN_INFO "%s: Result: Prepare "
-+ "stage failed! (%d)\n",
-+ mmc_hostname(test->card->host),
-+ ret);
-+ continue;
-+ }
-+ }
-+
-+ ret = mmc_test_cases[i].run(test);
-+ switch (ret) {
-+ case RESULT_OK:
-+ printk(KERN_INFO "%s: Result: OK\n",
-+ mmc_hostname(test->card->host));
-+ break;
-+ case RESULT_FAIL:
-+ printk(KERN_INFO "%s: Result: FAILED\n",
-+ mmc_hostname(test->card->host));
-+ break;
-+ case RESULT_UNSUP_HOST:
-+ printk(KERN_INFO "%s: Result: UNSUPPORTED "
-+ "(by host)\n",
-+ mmc_hostname(test->card->host));
-+ break;
-+ case RESULT_UNSUP_CARD:
-+ printk(KERN_INFO "%s: Result: UNSUPPORTED "
-+ "(by card)\n",
-+ mmc_hostname(test->card->host));
-+ break;
-+ default:
-+ printk(KERN_INFO "%s: Result: ERROR (%d)\n",
-+ mmc_hostname(test->card->host), ret);
-+ }
-+
-+ if (mmc_test_cases[i].cleanup) {
-+ ret = mmc_test_cases[i].cleanup(test);
-+ if (ret) {
-+ printk(KERN_INFO "%s: Warning: Cleanup "
-+ "stage failed! (%d)\n",
-+ mmc_hostname(test->card->host),
-+ ret);
-+ }
-+ }
-+ }
-+
-+ mmc_release_host(test->card->host);
-+
-+ printk(KERN_INFO "%s: Tests completed.\n",
-+ mmc_hostname(test->card->host));
-+}
-+
-+static ssize_t mmc_test_show(struct device *dev,
-+ struct device_attribute *attr, char *buf)
-+{
-+ mutex_lock(&mmc_test_lock);
-+ mutex_unlock(&mmc_test_lock);
-+
-+ return 0;
-+}
-+
-+static ssize_t mmc_test_store(struct device *dev,
-+ struct device_attribute *attr, const char *buf, size_t count)
-+{
-+ struct mmc_card *card;
-+ struct mmc_test_card *test;
-+
-+ card = container_of(dev, struct mmc_card, dev);
-+
-+ test = kzalloc(sizeof(struct mmc_test_card), GFP_KERNEL);
-+ if (!test)
-+ return -ENOMEM;
-+
-+ test->card = card;
-+
-+ test->buffer = kzalloc(BUFFER_SIZE, GFP_KERNEL);
-+ if (test->buffer) {
-+ mutex_lock(&mmc_test_lock);
-+ mmc_test_run(test);
-+ mutex_unlock(&mmc_test_lock);
-+ }
-+
-+ kfree(test->buffer);
-+ kfree(test);
-+
-+ return count;
-+}
-+
-+static DEVICE_ATTR(test, S_IWUSR | S_IRUGO, mmc_test_show, mmc_test_store);
-+
-+static int mmc_test_probe(struct mmc_card *card)
-+{
-+ int ret;
-+
-+ mutex_init(&mmc_test_lock);
-+
-+ ret = device_create_file(&card->dev, &dev_attr_test);
-+ if (ret)
-+ return ret;
-+
-+ return 0;
-+}
-+
-+static void mmc_test_remove(struct mmc_card *card)
-+{
-+ device_remove_file(&card->dev, &dev_attr_test);
-+}
-+
-+static struct mmc_driver mmc_driver = {
-+ .drv = {
-+ .name = "mmc_test",
-+ },
-+ .probe = mmc_test_probe,
-+ .remove = mmc_test_remove,
-+};
-+
-+static int __init mmc_test_init(void)
-+{
-+ return mmc_register_driver(&mmc_driver);
-+}
-+
-+static void __exit mmc_test_exit(void)
-+{
-+ mmc_unregister_driver(&mmc_driver);
-+}
-+
-+module_init(mmc_test_init);
-+module_exit(mmc_test_exit);
-+
-+MODULE_LICENSE("GPL");
-+MODULE_DESCRIPTION("Multimedia Card (MMC) host test driver");
-+MODULE_AUTHOR("Pierre Ossman");
-diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
-index 3b3cd0e..dead617 100644
---- a/drivers/mmc/host/Kconfig
-+++ b/drivers/mmc/host/Kconfig
-@@ -119,7 +119,7 @@ config MMC_TIFM_SD
-
- config MMC_SPI
- tristate "MMC/SD over SPI"
-- depends on MMC && SPI_MASTER && !HIGHMEM
-+ depends on MMC && SPI_MASTER && !HIGHMEM && HAS_DMA
- select CRC7
- select CRC_ITU_T
- help
-diff --git a/drivers/mmc/host/at91_mci.c b/drivers/mmc/host/at91_mci.c
-index a28fc2f..8979ad3 100644
---- a/drivers/mmc/host/at91_mci.c
-+++ b/drivers/mmc/host/at91_mci.c
-@@ -663,9 +663,12 @@ static void at91_mci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
- gpio_set_value(host->board->vcc_pin, 0);
- break;
- case MMC_POWER_UP:
-- case MMC_POWER_ON:
- gpio_set_value(host->board->vcc_pin, 1);
- break;
-+ case MMC_POWER_ON:
-+ break;
-+ default:
-+ WARN_ON(1);
- }
- }
- }
-diff --git a/drivers/mmc/host/omap.c b/drivers/mmc/host/omap.c
-index 14759e9..549517c 100644
---- a/drivers/mmc/host/omap.c
-+++ b/drivers/mmc/host/omap.c
-@@ -1003,7 +1003,7 @@ static void mmc_omap_dma_cb(int lch, u16 ch_status, void *data)
-
- static int mmc_omap_get_dma_channel(struct mmc_omap_host *host, struct mmc_data *data)
- {
-- const char *dev_name;
-+ const char *dma_dev_name;
- int sync_dev, dma_ch, is_read, r;
-
- is_read = !(data->flags & MMC_DATA_WRITE);
-@@ -1018,21 +1018,21 @@ static int mmc_omap_get_dma_channel(struct mmc_omap_host *host, struct mmc_data
- if (is_read) {
- if (host->id == 1) {
- sync_dev = OMAP_DMA_MMC_RX;
-- dev_name = "MMC1 read";
-+ dma_dev_name = "MMC1 read";
- } else {
- sync_dev = OMAP_DMA_MMC2_RX;
-- dev_name = "MMC2 read";
-+ dma_dev_name = "MMC2 read";
- }
- } else {
- if (host->id == 1) {
- sync_dev = OMAP_DMA_MMC_TX;
-- dev_name = "MMC1 write";
-+ dma_dev_name = "MMC1 write";
- } else {
- sync_dev = OMAP_DMA_MMC2_TX;
-- dev_name = "MMC2 write";
-+ dma_dev_name = "MMC2 write";
- }
- }
-- r = omap_request_dma(sync_dev, dev_name, mmc_omap_dma_cb,
-+ r = omap_request_dma(sync_dev, dma_dev_name, mmc_omap_dma_cb,
- host, &dma_ch);
- if (r != 0) {
- dev_dbg(mmc_dev(host->mmc), "omap_request_dma() failed with %d\n", r);
-diff --git a/drivers/net/3c509.c b/drivers/net/3c509.c
-index e6c545f..87d8795 100644
---- a/drivers/net/3c509.c
-+++ b/drivers/net/3c509.c
-@@ -413,7 +413,7 @@ static int __devinit el3_pnp_probe(struct pnp_dev *pdev,
- {
- short i;
- int ioaddr, irq, if_port;
-- u16 phys_addr[3];
-+ __be16 phys_addr[3];
- struct net_device *dev = NULL;
- int err;
-
-@@ -605,7 +605,7 @@ static int __init el3_mca_probe(struct device *device)
-
- short i;
- int ioaddr, irq, if_port;
-- u16 phys_addr[3];
-+ __be16 phys_addr[3];
- struct net_device *dev = NULL;
- u_char pos4, pos5;
- struct mca_device *mdev = to_mca_device(device);
-@@ -635,14 +635,13 @@ static int __init el3_mca_probe(struct device *device)
- printk(KERN_DEBUG "3c529: irq %d ioaddr 0x%x ifport %d\n", irq, ioaddr, if_port);
- }
- EL3WINDOW(0);
-- for (i = 0; i < 3; i++) {
-- phys_addr[i] = htons(read_eeprom(ioaddr, i));
-- }
-+ for (i = 0; i < 3; i++)
-+ phys_addr[i] = htons(read_eeprom(ioaddr, i));
-
- dev = alloc_etherdev(sizeof (struct el3_private));
- if (dev == NULL) {
-- release_region(ioaddr, EL3_IO_EXTENT);
-- return -ENOMEM;
-+ release_region(ioaddr, EL3_IO_EXTENT);
-+ return -ENOMEM;
- }
-
- netdev_boot_setup_check(dev);
-@@ -668,7 +667,7 @@ static int __init el3_eisa_probe (struct device *device)
- {
- short i;
- int ioaddr, irq, if_port;
-- u16 phys_addr[3];
-+ __be16 phys_addr[3];
- struct net_device *dev = NULL;
- struct eisa_device *edev;
- int err;
-diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
-index 9f6cc8a..dd0ec9e 100644
---- a/drivers/net/Kconfig
-+++ b/drivers/net/Kconfig
-@@ -1353,7 +1353,7 @@ config APRICOT
-
- config B44
- tristate "Broadcom 440x/47xx ethernet support"
-- depends on SSB_POSSIBLE
-+ depends on SSB_POSSIBLE && HAS_DMA
- select SSB
- select MII
- help
-diff --git a/drivers/net/atlx/atl1.c b/drivers/net/atlx/atl1.c
-index 9c2394d..6e4c80d 100644
---- a/drivers/net/atlx/atl1.c
-+++ b/drivers/net/atlx/atl1.c
-@@ -2135,7 +2135,7 @@ static int atl1_tso(struct atl1_adapter *adapter, struct sk_buff *skb,
- return -1;
- }
-
-- if (skb->protocol == ntohs(ETH_P_IP)) {
-+ if (skb->protocol == htons(ETH_P_IP)) {
- struct iphdr *iph = ip_hdr(skb);
-
- real_len = (((unsigned char *)iph - skb->data) +
-diff --git a/drivers/net/bonding/bond_sysfs.c b/drivers/net/bonding/bond_sysfs.c
-index 68c41a0..08f3d39 100644
---- a/drivers/net/bonding/bond_sysfs.c
-+++ b/drivers/net/bonding/bond_sysfs.c
-@@ -1437,8 +1437,16 @@ int bond_create_sysfs(void)
- * configure multiple bonding devices.
- */
- if (ret == -EEXIST) {
-- netdev_class = NULL;
-- return 0;
-+ /* Is someone being kinky and naming a device bonding_master? */
-+ if (__dev_get_by_name(&init_net,
-+ class_attr_bonding_masters.attr.name))
-+ printk(KERN_ERR
-+ "network device named %s already exists in sysfs",
-+ class_attr_bonding_masters.attr.name);
-+ else {
-+ netdev_class = NULL;
-+ return 0;
-+ }
- }
-
- return ret;
-diff --git a/drivers/net/cassini.c b/drivers/net/cassini.c
-index 93e1363..83768df 100644
---- a/drivers/net/cassini.c
-+++ b/drivers/net/cassini.c
-@@ -142,8 +142,8 @@
-
- #define DRV_MODULE_NAME "cassini"
- #define PFX DRV_MODULE_NAME ": "
--#define DRV_MODULE_VERSION "1.5"
--#define DRV_MODULE_RELDATE "4 Jan 2008"
-+#define DRV_MODULE_VERSION "1.6"
-+#define DRV_MODULE_RELDATE "21 May 2008"
-
- #define CAS_DEF_MSG_ENABLE \
- (NETIF_MSG_DRV | \
-@@ -2136,9 +2136,12 @@ end_copy_pkt:
- if (addr)
- cas_page_unmap(addr);
- }
-- skb->csum = csum_unfold(~csum);
-- skb->ip_summed = CHECKSUM_COMPLETE;
- skb->protocol = eth_type_trans(skb, cp->dev);
-+ if (skb->protocol == htons(ETH_P_IP)) {
-+ skb->csum = csum_unfold(~csum);
-+ skb->ip_summed = CHECKSUM_COMPLETE;
-+ } else
-+ skb->ip_summed = CHECKSUM_NONE;
- return len;
- }
-
-diff --git a/drivers/net/irda/irda-usb.c b/drivers/net/irda/irda-usb.c
-index 9081234..6f50ed7 100644
---- a/drivers/net/irda/irda-usb.c
-+++ b/drivers/net/irda/irda-usb.c
-@@ -1120,7 +1120,7 @@ static int stir421x_patch_device(struct irda_usb_cb *self)
- }
- }
-
-- if (self->usbdev->descriptor.bcdDevice == fw_version) {
-+ if (self->usbdev->descriptor.bcdDevice == cpu_to_le16(fw_version)) {
- /*
- * If we're here, we've found a correct patch
- * The actual image starts after the "STMP" keyword
-diff --git a/drivers/net/irda/irda-usb.h b/drivers/net/irda/irda-usb.h
-index e846c38..a0ca9c1 100644
---- a/drivers/net/irda/irda-usb.h
-+++ b/drivers/net/irda/irda-usb.h
-@@ -117,11 +117,11 @@
- struct irda_class_desc {
- __u8 bLength;
- __u8 bDescriptorType;
-- __u16 bcdSpecRevision;
-+ __le16 bcdSpecRevision;
- __u8 bmDataSize;
- __u8 bmWindowSize;
- __u8 bmMinTurnaroundTime;
-- __u16 wBaudRate;
-+ __le16 wBaudRate;
- __u8 bmAdditionalBOFs;
- __u8 bIrdaRateSniff;
- __u8 bMaxUnicastList;
-diff --git a/drivers/net/pppol2tp.c b/drivers/net/pppol2tp.c
-index 7935991..8db342f 100644
---- a/drivers/net/pppol2tp.c
-+++ b/drivers/net/pppol2tp.c
-@@ -980,6 +980,8 @@ static int pppol2tp_xmit(struct ppp_channel *chan, struct sk_buff *skb)
- __wsum csum = 0;
- struct udphdr *uh;
- unsigned int len;
-+ int old_headroom;
-+ int new_headroom;
-
- if (sock_flag(sk, SOCK_DEAD) || !(sk->sk_state & PPPOX_CONNECTED))
- goto abort;
-@@ -1001,16 +1003,18 @@ static int pppol2tp_xmit(struct ppp_channel *chan, struct sk_buff *skb)
-
- /* Check that there's enough headroom in the skb to insert IP,
- * UDP and L2TP and PPP headers. If not enough, expand it to
-- * make room. Note that a new skb (or a clone) is
-- * allocated. If we return an error from this point on, make
-- * sure we free the new skb but do not free the original skb
-- * since that is done by the caller for the error case.
-+ * make room. Adjust truesize.
- */
- headroom = NET_SKB_PAD + sizeof(struct iphdr) +
- sizeof(struct udphdr) + hdr_len + sizeof(ppph);
-+ old_headroom = skb_headroom(skb);
- if (skb_cow_head(skb, headroom))
- goto abort;
-
-+ new_headroom = skb_headroom(skb);
-+ skb_orphan(skb);
-+ skb->truesize += new_headroom - old_headroom;
-+
- /* Setup PPP header */
- __skb_push(skb, sizeof(ppph));
- skb->data[0] = ppph[0];
-@@ -1065,7 +1069,6 @@ static int pppol2tp_xmit(struct ppp_channel *chan, struct sk_buff *skb)
- /* Get routing info from the tunnel socket */
- dst_release(skb->dst);
- skb->dst = dst_clone(__sk_dst_get(sk_tun));
-- skb_orphan(skb);
- skb->sk = sk_tun;
-
- /* Queue the packet to IP for output */
-diff --git a/drivers/net/usb/catc.c b/drivers/net/usb/catc.c
-index 76752d8..22c17bb 100644
---- a/drivers/net/usb/catc.c
-+++ b/drivers/net/usb/catc.c
-@@ -423,7 +423,10 @@ static int catc_hard_start_xmit(struct sk_buff *skb, struct net_device *netdev)
-
- catc->tx_ptr = (((catc->tx_ptr - 1) >> 6) + 1) << 6;
- tx_buf = catc->tx_buf[catc->tx_idx] + catc->tx_ptr;
-- *((u16*)tx_buf) = (catc->is_f5u011) ? cpu_to_be16((u16)skb->len) : cpu_to_le16((u16)skb->len);
-+ if (catc->is_f5u011)
-+ *(__be16 *)tx_buf = cpu_to_be16(skb->len);
-+ else
-+ *(__le16 *)tx_buf = cpu_to_le16(skb->len);
- skb_copy_from_linear_data(skb, tx_buf + 2, skb->len);
- catc->tx_ptr += skb->len + 2;
-
-diff --git a/drivers/net/usb/cdc_subset.c b/drivers/net/usb/cdc_subset.c
-index 0ec7936..c66b9c3 100644
---- a/drivers/net/usb/cdc_subset.c
-+++ b/drivers/net/usb/cdc_subset.c
-@@ -218,7 +218,7 @@ static const struct driver_info blob_info = {
- /*-------------------------------------------------------------------------*/
-
- #ifndef HAVE_HARDWARE
--#error You need to configure some hardware for this driver
-+#warning You need to configure some hardware for this driver
- #endif
-
- /*
-diff --git a/drivers/net/usb/rndis_host.c b/drivers/net/usb/rndis_host.c
-index 21a7785..3969b7a 100644
---- a/drivers/net/usb/rndis_host.c
-+++ b/drivers/net/usb/rndis_host.c
-@@ -283,8 +283,8 @@ generic_rndis_bind(struct usbnet *dev, struct usb_interface *intf, int flags)
- struct rndis_set_c *set_c;
- struct rndis_halt *halt;
- } u;
-- u32 tmp, phym_unspec;
-- __le32 *phym;
-+ u32 tmp;
-+ __le32 phym_unspec, *phym;
- int reply_len;
- unsigned char *bp;
-
-diff --git a/drivers/net/wireless/airo.c b/drivers/net/wireless/airo.c
-index 45f47c1..4e1c690 100644
---- a/drivers/net/wireless/airo.c
-+++ b/drivers/net/wireless/airo.c
-@@ -2668,6 +2668,7 @@ static struct net_device *init_wifidev(struct airo_info *ai,
- dev->irq = ethdev->irq;
- dev->base_addr = ethdev->base_addr;
- dev->wireless_data = ethdev->wireless_data;
-+ SET_NETDEV_DEV(dev, ethdev->dev.parent);
- memcpy(dev->dev_addr, ethdev->dev_addr, dev->addr_len);
- err = register_netdev(dev);
- if (err<0) {
-@@ -2904,7 +2905,7 @@ EXPORT_SYMBOL(init_airo_card);
-
- static int waitbusy (struct airo_info *ai) {
- int delay = 0;
-- while ((IN4500 (ai, COMMAND) & COMMAND_BUSY) & (delay < 10000)) {
-+ while ((IN4500 (ai, COMMAND) & COMMAND_BUSY) && (delay < 10000)) {
- udelay (10);
- if ((++delay % 20) == 0)
- OUT4500(ai, EVACK, EV_CLEARCOMMANDBUSY);
-diff --git a/drivers/net/wireless/ath5k/base.c b/drivers/net/wireless/ath5k/base.c
-index 4e5c8fc..635b9ac 100644
---- a/drivers/net/wireless/ath5k/base.c
-+++ b/drivers/net/wireless/ath5k/base.c
-@@ -1787,6 +1787,8 @@ ath5k_tasklet_rx(unsigned long data)
-
- spin_lock(&sc->rxbuflock);
- do {
-+ rxs.flag = 0;
-+
- if (unlikely(list_empty(&sc->rxbuf))) {
- ATH5K_WARN(sc, "empty rx buf pool\n");
- break;
-diff --git a/drivers/net/wireless/ath5k/hw.c b/drivers/net/wireless/ath5k/hw.c
-index 5fb1ae6..77990b5 100644
---- a/drivers/net/wireless/ath5k/hw.c
-+++ b/drivers/net/wireless/ath5k/hw.c
-@@ -4119,6 +4119,7 @@ static int ath5k_hw_proc_5210_rx_status(struct ath5k_hw *ah,
- rs->rs_tstamp = AR5K_REG_MS(rx_status->rx_status_1,
- AR5K_5210_RX_DESC_STATUS1_RECEIVE_TIMESTAMP);
- rs->rs_status = 0;
-+ rs->rs_phyerr = 0;
-
- /*
- * Key table status
-@@ -4145,7 +4146,7 @@ static int ath5k_hw_proc_5210_rx_status(struct ath5k_hw *ah,
- if (rx_status->rx_status_1 &
- AR5K_5210_RX_DESC_STATUS1_PHY_ERROR) {
- rs->rs_status |= AR5K_RXERR_PHY;
-- rs->rs_phyerr = AR5K_REG_MS(rx_status->rx_status_1,
-+ rs->rs_phyerr |= AR5K_REG_MS(rx_status->rx_status_1,
- AR5K_5210_RX_DESC_STATUS1_PHY_ERROR);
- }
-
-@@ -4193,6 +4194,7 @@ static int ath5k_hw_proc_5212_rx_status(struct ath5k_hw *ah,
- rs->rs_tstamp = AR5K_REG_MS(rx_status->rx_status_1,
- AR5K_5212_RX_DESC_STATUS1_RECEIVE_TIMESTAMP);
- rs->rs_status = 0;
-+ rs->rs_phyerr = 0;
-
- /*
- * Key table status
-@@ -4215,7 +4217,7 @@ static int ath5k_hw_proc_5212_rx_status(struct ath5k_hw *ah,
- if (rx_status->rx_status_1 &
- AR5K_5212_RX_DESC_STATUS1_PHY_ERROR) {
- rs->rs_status |= AR5K_RXERR_PHY;
-- rs->rs_phyerr = AR5K_REG_MS(rx_err->rx_error_1,
-+ rs->rs_phyerr |= AR5K_REG_MS(rx_err->rx_error_1,
- AR5K_RX_DESC_ERROR1_PHY_ERROR_CODE);
- }
-
-diff --git a/drivers/net/wireless/b43/Kconfig b/drivers/net/wireless/b43/Kconfig
-index f51b2d9..1fa043d 100644
---- a/drivers/net/wireless/b43/Kconfig
-+++ b/drivers/net/wireless/b43/Kconfig
-@@ -1,6 +1,6 @@
- config B43
- tristate "Broadcom 43xx wireless support (mac80211 stack)"
-- depends on SSB_POSSIBLE && MAC80211 && WLAN_80211
-+ depends on SSB_POSSIBLE && MAC80211 && WLAN_80211 && HAS_DMA
- select SSB
- select FW_LOADER
- select HW_RANDOM
-diff --git a/drivers/net/wireless/b43legacy/Kconfig b/drivers/net/wireless/b43legacy/Kconfig
-index 13c65fa..aef2298 100644
---- a/drivers/net/wireless/b43legacy/Kconfig
-+++ b/drivers/net/wireless/b43legacy/Kconfig
-@@ -1,6 +1,6 @@
- config B43LEGACY
- tristate "Broadcom 43xx-legacy wireless support (mac80211 stack)"
-- depends on SSB_POSSIBLE && MAC80211 && WLAN_80211
-+ depends on SSB_POSSIBLE && MAC80211 && WLAN_80211 && HAS_DMA
- select SSB
- select FW_LOADER
- select HW_RANDOM
-diff --git a/drivers/net/wireless/hostap/hostap_cs.c b/drivers/net/wireless/hostap/hostap_cs.c
-index 437a9bc..ed4317a 100644
---- a/drivers/net/wireless/hostap/hostap_cs.c
-+++ b/drivers/net/wireless/hostap/hostap_cs.c
-@@ -833,6 +833,7 @@ static struct pcmcia_device_id hostap_cs_ids[] = {
- PCMCIA_DEVICE_MANF_CARD(0x50c2, 0x0001),
- PCMCIA_DEVICE_MANF_CARD(0x50c2, 0x7300),
- /* PCMCIA_DEVICE_MANF_CARD(0xc00f, 0x0000), conflict with pcnet_cs */
-+ PCMCIA_DEVICE_MANF_CARD(0xc250, 0x0002),
- PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0002),
- PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0005),
- PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0010),
-diff --git a/drivers/net/wireless/hostap/hostap_hw.c b/drivers/net/wireless/hostap/hostap_hw.c
-index 7be68db..cdf90c4 100644
---- a/drivers/net/wireless/hostap/hostap_hw.c
-+++ b/drivers/net/wireless/hostap/hostap_hw.c
-@@ -3276,11 +3276,6 @@ while (0)
- }
- printk(KERN_INFO "%s: Registered netdevice %s\n", dev_info, dev->name);
-
--#ifndef PRISM2_NO_PROCFS_DEBUG
-- create_proc_read_entry("registers", 0, local->proc,
-- prism2_registers_proc_read, local);
--#endif /* PRISM2_NO_PROCFS_DEBUG */
--
- hostap_init_data(local);
- return dev;
-
-@@ -3307,6 +3302,10 @@ static int hostap_hw_ready(struct net_device *dev)
- netif_carrier_off(local->ddev);
- }
- hostap_init_proc(local);
-+#ifndef PRISM2_NO_PROCFS_DEBUG
-+ create_proc_read_entry("registers", 0, local->proc,
-+ prism2_registers_proc_read, local);
-+#endif /* PRISM2_NO_PROCFS_DEBUG */
- hostap_init_ap_proc(local);
- return 0;
- }
-diff --git a/drivers/net/wireless/ipw2200.c b/drivers/net/wireless/ipw2200.c
-index fa87c5c..d74c061 100644
---- a/drivers/net/wireless/ipw2200.c
-+++ b/drivers/net/wireless/ipw2200.c
-@@ -11584,6 +11584,7 @@ static int ipw_prom_alloc(struct ipw_priv *priv)
- priv->prom_net_dev->hard_start_xmit = ipw_prom_hard_start_xmit;
-
- priv->prom_priv->ieee->iw_mode = IW_MODE_MONITOR;
-+ SET_NETDEV_DEV(priv->prom_net_dev, &priv->pci_dev->dev);
-
- rc = register_netdev(priv->prom_net_dev);
- if (rc) {
-diff --git a/drivers/net/wireless/libertas/ethtool.c b/drivers/net/wireless/libertas/ethtool.c
-index dcfdb40..688d60d 100644
---- a/drivers/net/wireless/libertas/ethtool.c
-+++ b/drivers/net/wireless/libertas/ethtool.c
-@@ -73,8 +73,8 @@ out:
- return ret;
- }
-
--static void lbs_ethtool_get_stats(struct net_device * dev,
-- struct ethtool_stats * stats, u64 * data)
-+static void lbs_ethtool_get_stats(struct net_device *dev,
-+ struct ethtool_stats *stats, uint64_t *data)
- {
- struct lbs_private *priv = dev->priv;
- struct cmd_ds_mesh_access mesh_access;
-@@ -83,12 +83,12 @@ static void lbs_ethtool_get_stats(struct net_device * dev,
- lbs_deb_enter(LBS_DEB_ETHTOOL);
-
- /* Get Mesh Statistics */
-- ret = lbs_prepare_and_send_command(priv,
-- CMD_MESH_ACCESS, CMD_ACT_MESH_GET_STATS,
-- CMD_OPTION_WAITFORRSP, 0, &mesh_access);
-+ ret = lbs_mesh_access(priv, CMD_ACT_MESH_GET_STATS, &mesh_access);
-
-- if (ret)
-+ if (ret) {
-+ memset(data, 0, MESH_STATS_NUM*(sizeof(uint64_t)));
- return;
-+ }
-
- priv->mstats.fwd_drop_rbt = le32_to_cpu(mesh_access.data[0]);
- priv->mstats.fwd_drop_ttl = le32_to_cpu(mesh_access.data[1]);
-@@ -111,19 +111,18 @@ static void lbs_ethtool_get_stats(struct net_device * dev,
- lbs_deb_enter(LBS_DEB_ETHTOOL);
- }
-
--static int lbs_ethtool_get_sset_count(struct net_device * dev, int sset)
-+static int lbs_ethtool_get_sset_count(struct net_device *dev, int sset)
- {
-- switch (sset) {
-- case ETH_SS_STATS:
-+ struct lbs_private *priv = dev->priv;
-+
-+ if (sset == ETH_SS_STATS && dev == priv->mesh_dev)
- return MESH_STATS_NUM;
-- default:
-- return -EOPNOTSUPP;
-- }
-+
-+ return -EOPNOTSUPP;
- }
-
- static void lbs_ethtool_get_strings(struct net_device *dev,
-- u32 stringset,
-- u8 * s)
-+ uint32_t stringset, uint8_t *s)
- {
- int i;
-
-diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
-index 406f54d..e1f0660 100644
---- a/drivers/net/wireless/libertas/main.c
-+++ b/drivers/net/wireless/libertas/main.c
-@@ -756,6 +756,7 @@ static int lbs_thread(void *data)
- priv->nr_retries = 0;
- } else {
- priv->cur_cmd = NULL;
-+ priv->dnld_sent = DNLD_RES_RECEIVED;
- lbs_pr_info("requeueing command %x due to timeout (#%d)\n",
- le16_to_cpu(cmdnode->cmdbuf->command), priv->nr_retries);
-
-@@ -1564,6 +1565,7 @@ static int lbs_add_rtap(struct lbs_private *priv)
- rtap_dev->hard_start_xmit = lbs_rtap_hard_start_xmit;
- rtap_dev->set_multicast_list = lbs_set_multicast_list;
- rtap_dev->priv = priv;
-+ SET_NETDEV_DEV(rtap_dev, priv->dev->dev.parent);
-
- ret = register_netdev(rtap_dev);
- if (ret) {
-diff --git a/drivers/net/wireless/orinoco_cs.c b/drivers/net/wireless/orinoco_cs.c
-index 8b7f576..1c216e0 100644
---- a/drivers/net/wireless/orinoco_cs.c
-+++ b/drivers/net/wireless/orinoco_cs.c
-@@ -461,6 +461,7 @@ static struct pcmcia_device_id orinoco_cs_ids[] = {
- PCMCIA_DEVICE_MANF_CARD(0x028a, 0x0673), /* Linksys WCF12 Wireless CompactFlash Card */
- PCMCIA_DEVICE_MANF_CARD(0x02aa, 0x0002), /* ASUS SpaceLink WL-100 */
- PCMCIA_DEVICE_MANF_CARD(0x02ac, 0x0002), /* SpeedStream SS1021 Wireless Adapter */
-+ PCMCIA_DEVICE_MANF_CARD(0x02ac, 0x3021), /* SpeedStream Wireless Adapter */
- PCMCIA_DEVICE_MANF_CARD(0x14ea, 0xb001), /* PLANEX RoadLannerWave GW-NS11H */
- PCMCIA_DEVICE_MANF_CARD(0x50c2, 0x7300), /* Airvast WN-100 */
- PCMCIA_DEVICE_MANF_CARD(0x9005, 0x0021), /* Adaptec Ultra Wireless ANW-8030 */
-diff --git a/drivers/net/wireless/rtl8187_dev.c b/drivers/net/wireless/rtl8187_dev.c
-index d5787b3..9223ada 100644
---- a/drivers/net/wireless/rtl8187_dev.c
-+++ b/drivers/net/wireless/rtl8187_dev.c
-@@ -92,6 +92,7 @@ static void rtl8187_iowrite_async(struct rtl8187_priv *priv, __le16 addr,
- u8 data[4];
- struct usb_ctrlrequest dr;
- } *buf;
-+ int rc;
-
- buf = kmalloc(sizeof(*buf), GFP_ATOMIC);
- if (!buf)
-@@ -116,7 +117,11 @@ static void rtl8187_iowrite_async(struct rtl8187_priv *priv, __le16 addr,
- usb_fill_control_urb(urb, priv->udev, usb_sndctrlpipe(priv->udev, 0),
- (unsigned char *)dr, buf, len,
- rtl8187_iowrite_async_cb, buf);
-- usb_submit_urb(urb, GFP_ATOMIC);
-+ rc = usb_submit_urb(urb, GFP_ATOMIC);
-+ if (rc < 0) {
-+ kfree(buf);
-+ usb_free_urb(urb);
-+ }
- }
-
- static inline void rtl818x_iowrite32_async(struct rtl8187_priv *priv,
-@@ -169,6 +174,7 @@ static int rtl8187_tx(struct ieee80211_hw *dev, struct sk_buff *skb,
- struct urb *urb;
- __le16 rts_dur = 0;
- u32 flags;
-+ int rc;
-
- urb = usb_alloc_urb(0, GFP_ATOMIC);
- if (!urb) {
-@@ -208,7 +214,11 @@ static int rtl8187_tx(struct ieee80211_hw *dev, struct sk_buff *skb,
- info->dev = dev;
- usb_fill_bulk_urb(urb, priv->udev, usb_sndbulkpipe(priv->udev, 2),
- hdr, skb->len, rtl8187_tx_cb, skb);
-- usb_submit_urb(urb, GFP_ATOMIC);
-+ rc = usb_submit_urb(urb, GFP_ATOMIC);
-+ if (rc < 0) {
-+ usb_free_urb(urb);
-+ kfree_skb(skb);
-+ }
-
- return 0;
- }
-diff --git a/drivers/net/wireless/zd1211rw/zd_mac.c b/drivers/net/wireless/zd1211rw/zd_mac.c
-index 69c45ca..6424e5a 100644
---- a/drivers/net/wireless/zd1211rw/zd_mac.c
-+++ b/drivers/net/wireless/zd1211rw/zd_mac.c
-@@ -805,7 +805,7 @@ void zd_process_intr(struct work_struct *work)
- u16 int_status;
- struct zd_mac *mac = container_of(work, struct zd_mac, process_intr);
-
-- int_status = le16_to_cpu(*(u16 *)(mac->intr_buffer+4));
-+ int_status = le16_to_cpu(*(__le16 *)(mac->intr_buffer+4));
- if (int_status & INT_CFG_NEXT_BCN) {
- if (net_ratelimit())
- dev_dbg_f(zd_mac_dev(mac), "INT_CFG_NEXT_BCN\n");
-diff --git a/drivers/net/wireless/zd1211rw/zd_usb.c b/drivers/net/wireless/zd1211rw/zd_usb.c
-index 12e24f0..8941f5e 100644
---- a/drivers/net/wireless/zd1211rw/zd_usb.c
-+++ b/drivers/net/wireless/zd1211rw/zd_usb.c
-@@ -342,7 +342,7 @@ static inline void handle_regs_int(struct urb *urb)
- ZD_ASSERT(in_interrupt());
- spin_lock(&intr->lock);
-
-- int_num = le16_to_cpu(*(u16 *)(urb->transfer_buffer+2));
-+ int_num = le16_to_cpu(*(__le16 *)(urb->transfer_buffer+2));
- if (int_num == CR_INTERRUPT) {
- struct zd_mac *mac = zd_hw_mac(zd_usb_to_hw(urb->context));
- memcpy(&mac->intr_buffer, urb->transfer_buffer,
-diff --git a/drivers/power/power_supply_core.c b/drivers/power/power_supply_core.c
-index 138dd76..af1633e 100644
---- a/drivers/power/power_supply_core.c
-+++ b/drivers/power/power_supply_core.c
-@@ -91,15 +91,13 @@ int power_supply_register(struct device *parent, struct power_supply *psy)
- {
- int rc = 0;
-
-- psy->dev = device_create(power_supply_class, parent, 0,
-- "%s", psy->name);
-+ psy->dev = device_create_drvdata(power_supply_class, parent, 0,
-+ psy, "%s", psy->name);
- if (IS_ERR(psy->dev)) {
- rc = PTR_ERR(psy->dev);
- goto dev_create_failed;
- }
-
-- dev_set_drvdata(psy->dev, psy);
--
- INIT_WORK(&psy->changed_work, power_supply_changed_work);
-
- rc = power_supply_create_attrs(psy);
-diff --git a/drivers/s390/char/vmlogrdr.c b/drivers/s390/char/vmlogrdr.c
-index e848734..2c2428c 100644
---- a/drivers/s390/char/vmlogrdr.c
-+++ b/drivers/s390/char/vmlogrdr.c
-@@ -762,10 +762,10 @@ static int vmlogrdr_register_device(struct vmlogrdr_priv_t *priv)
- device_unregister(dev);
- return ret;
- }
-- priv->class_device = device_create(vmlogrdr_class, dev,
-- MKDEV(vmlogrdr_major,
-- priv->minor_num),
-- "%s", dev->bus_id);
-+ priv->class_device = device_create_drvdata(vmlogrdr_class, dev,
-+ MKDEV(vmlogrdr_major,
-+ priv->minor_num),
-+ priv, "%s", dev->bus_id);
- if (IS_ERR(priv->class_device)) {
- ret = PTR_ERR(priv->class_device);
- priv->class_device=NULL;
-@@ -773,7 +773,6 @@ static int vmlogrdr_register_device(struct vmlogrdr_priv_t *priv)
- device_unregister(dev);
- return ret;
- }
-- dev->driver_data = priv;
- priv->device = dev;
- return 0;
- }
-diff --git a/drivers/s390/kvm/kvm_virtio.c b/drivers/s390/kvm/kvm_virtio.c
-index 47a7e62..9f55ce6 100644
---- a/drivers/s390/kvm/kvm_virtio.c
-+++ b/drivers/s390/kvm/kvm_virtio.c
-@@ -78,27 +78,32 @@ static unsigned desc_size(const struct kvm_device_desc *desc)
- + desc->config_len;
- }
-
--/*
-- * This tests (and acknowleges) a feature bit.
-- */
--static bool kvm_feature(struct virtio_device *vdev, unsigned fbit)
-+/* This gets the device's feature bits. */
-+static u32 kvm_get_features(struct virtio_device *vdev)
- {
-+ unsigned int i;
-+ u32 features = 0;
- struct kvm_device_desc *desc = to_kvmdev(vdev)->desc;
-- u8 *features;
-+ u8 *in_features = kvm_vq_features(desc);
-
-- if (fbit / 8 > desc->feature_len)
-- return false;
-+ for (i = 0; i < min(desc->feature_len * 8, 32); i++)
-+ if (in_features[i / 8] & (1 << (i % 8)))
-+ features |= (1 << i);
-+ return features;
-+}
-
-- features = kvm_vq_features(desc);
-- if (!(features[fbit / 8] & (1 << (fbit % 8))))
-- return false;
-+static void kvm_set_features(struct virtio_device *vdev, u32 features)
-+{
-+ unsigned int i;
-+ struct kvm_device_desc *desc = to_kvmdev(vdev)->desc;
-+ /* Second half of bitmap is features we accept. */
-+ u8 *out_features = kvm_vq_features(desc) + desc->feature_len;
-
-- /*
-- * We set the matching bit in the other half of the bitmap to tell the
-- * Host we want to use this feature.
-- */
-- features[desc->feature_len + fbit / 8] |= (1 << (fbit % 8));
-- return true;
-+ memset(out_features, 0, desc->feature_len);
-+ for (i = 0; i < min(desc->feature_len * 8, 32); i++) {
-+ if (features & (1 << i))
-+ out_features[i / 8] |= (1 << (i % 8));
-+ }
- }
-
- /*
-@@ -221,7 +226,8 @@ static void kvm_del_vq(struct virtqueue *vq)
- * The config ops structure as defined by virtio config
- */
- static struct virtio_config_ops kvm_vq_configspace_ops = {
-- .feature = kvm_feature,
-+ .get_features = kvm_get_features,
-+ .set_features = kvm_set_features,
- .get = kvm_get,
- .set = kvm_set,
- .get_status = kvm_get_status,
-diff --git a/drivers/sbus/char/bpp.c b/drivers/sbus/char/bpp.c
-index b87037e..03c9660 100644
---- a/drivers/sbus/char/bpp.c
-+++ b/drivers/sbus/char/bpp.c
-@@ -869,7 +869,7 @@ static void probeLptPort(unsigned idx)
- instances[idx].mode = COMPATIBILITY;
- instances[idx].run_length = 0;
- instances[idx].run_flag = 0;
-- if (!request_region(lpAddr,3, dev_name)) return;
-+ if (!request_region(lpAddr,3, bpp_dev_name)) return;
-
- /*
- * First, make sure the instance exists. Do this by writing to
-@@ -1021,7 +1021,7 @@ static int __init bpp_init(void)
- if (rc == 0)
- return -ENODEV;
-
-- rc = register_chrdev(BPP_MAJOR, dev_name, &bpp_fops);
-+ rc = register_chrdev(BPP_MAJOR, bpp_dev_name, &bpp_fops);
- if (rc < 0)
- return rc;
-
-@@ -1037,7 +1037,7 @@ static void __exit bpp_cleanup(void)
- {
- unsigned idx;
-
-- unregister_chrdev(BPP_MAJOR, dev_name);
-+ unregister_chrdev(BPP_MAJOR, bpp_dev_name);
-
- for (idx = 0; idx < BPP_NO; idx++) {
- if (instances[idx].present)
-diff --git a/drivers/scsi/3w-9xxx.c b/drivers/scsi/3w-9xxx.c
-index b31faec..867f6fd 100644
---- a/drivers/scsi/3w-9xxx.c
-+++ b/drivers/scsi/3w-9xxx.c
-@@ -1278,7 +1278,7 @@ static irqreturn_t twa_interrupt(int irq, void *dev_instance)
- error = 0;
- /* Check for command packet errors */
- if (full_command_packet->command.newcommand.status != 0) {
-- if (tw_dev->srb[request_id] != 0) {
-+ if (tw_dev->srb[request_id] != NULL) {
- error = twa_fill_sense(tw_dev, request_id, 1, 1);
- } else {
- /* Skip ioctl error prints */
-@@ -1290,7 +1290,7 @@ static irqreturn_t twa_interrupt(int irq, void *dev_instance)
-
- /* Check for correct state */
- if (tw_dev->state[request_id] != TW_S_POSTED) {
-- if (tw_dev->srb[request_id] != 0) {
-+ if (tw_dev->srb[request_id] != NULL) {
- TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1a, "Received a request id that wasn't posted");
- TW_CLEAR_ALL_INTERRUPTS(tw_dev);
- goto twa_interrupt_bail;
-@@ -1298,7 +1298,7 @@ static irqreturn_t twa_interrupt(int irq, void *dev_instance)
- }
-
- /* Check for internal command completion */
-- if (tw_dev->srb[request_id] == 0) {
-+ if (tw_dev->srb[request_id] == NULL) {
- if (request_id != tw_dev->chrdev_request_id) {
- if (twa_aen_complete(tw_dev, request_id))
- TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1b, "Error completing AEN during attention interrupt");
-diff --git a/drivers/scsi/aha152x.c b/drivers/scsi/aha152x.c
-index 1dca177..0899cb6 100644
---- a/drivers/scsi/aha152x.c
-+++ b/drivers/scsi/aha152x.c
-@@ -3582,7 +3582,7 @@ static int checksetup(struct aha152x_setup *setup)
- if (i == ARRAY_SIZE(ports))
- return 0;
-
-- if ( request_region(setup->io_port, IO_RANGE, "aha152x")==0 ) {
-+ if (!request_region(setup->io_port, IO_RANGE, "aha152x")) {
- printk(KERN_ERR "aha152x: io port 0x%x busy.\n", setup->io_port);
- return 0;
- }
-@@ -3842,7 +3842,7 @@ static int __init aha152x_init(void)
- if ((setup_count == 1) && (setup[0].io_port == ports[i]))
- continue;
-
-- if ( request_region(ports[i], IO_RANGE, "aha152x")==0 ) {
-+ if (!request_region(ports[i], IO_RANGE, "aha152x")) {
- printk(KERN_ERR "aha152x: io port 0x%x busy.\n", ports[i]);
- continue;
- }
-diff --git a/drivers/scsi/atp870u.c b/drivers/scsi/atp870u.c
-index db6de5e..7d31154 100644
---- a/drivers/scsi/atp870u.c
-+++ b/drivers/scsi/atp870u.c
-@@ -747,7 +747,7 @@ static void send_s870(struct atp_unit *dev,unsigned char c)
- dev->quhd[c] = 0;
- }
- workreq = dev->quereq[c][dev->quhd[c]];
-- if (dev->id[c][scmd_id(workreq)].curr_req == 0) {
-+ if (dev->id[c][scmd_id(workreq)].curr_req == NULL) {
- dev->id[c][scmd_id(workreq)].curr_req = workreq;
- dev->last_cmd[c] = scmd_id(workreq);
- goto cmd_subp;
-diff --git a/drivers/scsi/ch.c b/drivers/scsi/ch.c
-index 75c84d7..c4b938b 100644
---- a/drivers/scsi/ch.c
-+++ b/drivers/scsi/ch.c
-@@ -910,9 +910,9 @@ static int ch_probe(struct device *dev)
- ch->minor = minor;
- sprintf(ch->name,"ch%d",ch->minor);
-
-- class_dev = device_create(ch_sysfs_class, dev,
-- MKDEV(SCSI_CHANGER_MAJOR,ch->minor),
-- "s%s", ch->name);
-+ class_dev = device_create_drvdata(ch_sysfs_class, dev,
-+ MKDEV(SCSI_CHANGER_MAJOR, ch->minor),
-+ ch, "s%s", ch->name);
- if (IS_ERR(class_dev)) {
- printk(KERN_WARNING "ch%d: device_create failed\n",
- ch->minor);
-@@ -926,7 +926,6 @@ static int ch_probe(struct device *dev)
- if (init)
- ch_init_elem(ch);
-
-- dev_set_drvdata(dev, ch);
- sdev_printk(KERN_INFO, sd, "Attached scsi changer %s\n", ch->name);
-
- return 0;
-diff --git a/drivers/scsi/hptiop.c b/drivers/scsi/hptiop.c
-index aaa48e0..da876d3 100644
---- a/drivers/scsi/hptiop.c
-+++ b/drivers/scsi/hptiop.c
-@@ -444,7 +444,7 @@ static void __iomem *hptiop_map_pci_bar(struct hptiop_hba *hba, int index)
- if (!(pci_resource_flags(pcidev, index) & IORESOURCE_MEM)) {
- printk(KERN_ERR "scsi%d: pci resource invalid\n",
- hba->host->host_no);
-- return 0;
-+ return NULL;
- }
-
- mem_base_phy = pci_resource_start(pcidev, index);
-@@ -454,7 +454,7 @@ static void __iomem *hptiop_map_pci_bar(struct hptiop_hba *hba, int index)
- if (!mem_base_virt) {
- printk(KERN_ERR "scsi%d: Fail to ioremap memory space\n",
- hba->host->host_no);
-- return 0;
-+ return NULL;
- }
- return mem_base_virt;
- }
-@@ -476,11 +476,11 @@ static void hptiop_unmap_pci_bar_itl(struct hptiop_hba *hba)
- static int hptiop_map_pci_bar_mv(struct hptiop_hba *hba)
- {
- hba->u.mv.regs = hptiop_map_pci_bar(hba, 0);
-- if (hba->u.mv.regs == 0)
-+ if (hba->u.mv.regs == NULL)
- return -1;
-
- hba->u.mv.mu = hptiop_map_pci_bar(hba, 2);
-- if (hba->u.mv.mu == 0) {
-+ if (hba->u.mv.mu == NULL) {
- iounmap(hba->u.mv.regs);
- return -1;
- }
-@@ -1210,8 +1210,8 @@ static void hptiop_remove(struct pci_dev *pcidev)
-
- static struct hptiop_adapter_ops hptiop_itl_ops = {
- .iop_wait_ready = iop_wait_ready_itl,
-- .internal_memalloc = 0,
-- .internal_memfree = 0,
-+ .internal_memalloc = NULL,
-+ .internal_memfree = NULL,
- .map_pci_bar = hptiop_map_pci_bar_itl,
- .unmap_pci_bar = hptiop_unmap_pci_bar_itl,
- .enable_intr = hptiop_enable_intr_itl,
-diff --git a/drivers/scsi/mac_esp.c b/drivers/scsi/mac_esp.c
-index cd37bd6..887682a 100644
---- a/drivers/scsi/mac_esp.c
-+++ b/drivers/scsi/mac_esp.c
-@@ -650,7 +650,7 @@ static void __exit mac_esp_exit(void)
-
- MODULE_DESCRIPTION("Mac ESP SCSI driver");
- MODULE_AUTHOR("Finn Thain ");
--MODULE_LICENSE("GPLv2");
-+MODULE_LICENSE("GPL v2");
- MODULE_VERSION(DRV_VERSION);
-
- module_init(mac_esp_init);
-diff --git a/drivers/scsi/osst.c b/drivers/scsi/osst.c
-index 31f7aec..243d8be 100644
---- a/drivers/scsi/osst.c
-+++ b/drivers/scsi/osst.c
-@@ -5695,13 +5695,12 @@ static int osst_sysfs_add(dev_t dev, struct device *device, struct osst_tape * S
- struct device *osst_member;
- int err;
-
-- osst_member = device_create(osst_sysfs_class, device, dev, "%s", name);
-+ osst_member = device_create_drvdata(osst_sysfs_class, device, dev, STp, "%s", name);
- if (IS_ERR(osst_member)) {
- printk(KERN_WARNING "osst :W: Unable to add sysfs class member %s\n", name);
- return PTR_ERR(osst_member);
- }
-
-- dev_set_drvdata(osst_member, STp);
- err = device_create_file(osst_member, &dev_attr_ADR_rev);
- if (err)
- goto err_out;
-diff --git a/drivers/scsi/qla1280.c b/drivers/scsi/qla1280.c
-index 51e2f29..3754ab8 100644
---- a/drivers/scsi/qla1280.c
-+++ b/drivers/scsi/qla1280.c
-@@ -2811,7 +2811,7 @@ qla1280_64bit_start_scsi(struct scsi_qla_host *ha, struct srb * sp)
-
- /* Check for room in outstanding command list. */
- for (cnt = 0; cnt < MAX_OUTSTANDING_COMMANDS &&
-- ha->outstanding_cmds[cnt] != 0; cnt++);
-+ ha->outstanding_cmds[cnt] != NULL; cnt++);
-
- if (cnt >= MAX_OUTSTANDING_COMMANDS) {
- status = 1;
-diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c
-index c9d7f72..ea0edd1 100644
---- a/drivers/scsi/sg.c
-+++ b/drivers/scsi/sg.c
-@@ -1441,17 +1441,18 @@ sg_add(struct device *cl_dev, struct class_interface *cl_intf)
- if (sg_sysfs_valid) {
- struct device *sg_class_member;
-
-- sg_class_member = device_create(sg_sysfs_class, cl_dev->parent,
-- MKDEV(SCSI_GENERIC_MAJOR,
-- sdp->index),
-- "%s", disk->disk_name);
-+ sg_class_member = device_create_drvdata(sg_sysfs_class,
-+ cl_dev->parent,
-+ MKDEV(SCSI_GENERIC_MAJOR,
-+ sdp->index),
-+ sdp,
-+ "%s", disk->disk_name);
- if (IS_ERR(sg_class_member)) {
- printk(KERN_ERR "sg_add: "
- "device_create failed\n");
- error = PTR_ERR(sg_class_member);
- goto cdev_add_err;
- }
-- dev_set_drvdata(sg_class_member, sdp);
- error = sysfs_create_link(&scsidp->sdev_gendev.kobj,
- &sg_class_member->kobj, "generic");
- if (error)
-diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c
-index e8db66a..6e5a5bb 100644
---- a/drivers/scsi/st.c
-+++ b/drivers/scsi/st.c
-@@ -4424,17 +4424,19 @@ static int do_create_class_files(struct scsi_tape *STp, int dev_num, int mode)
- snprintf(name, 10, "%s%s%s", rew ? "n" : "",
- STp->disk->disk_name, st_formats[i]);
- st_class_member =
-- device_create(st_sysfs_class, &STp->device->sdev_gendev,
-- MKDEV(SCSI_TAPE_MAJOR,
-- TAPE_MINOR(dev_num, mode, rew)),
-- "%s", name);
-+ device_create_drvdata(st_sysfs_class,
-+ &STp->device->sdev_gendev,
-+ MKDEV(SCSI_TAPE_MAJOR,
-+ TAPE_MINOR(dev_num,
-+ mode, rew)),
-+ &STp->modes[mode],
-+ "%s", name);
- if (IS_ERR(st_class_member)) {
- printk(KERN_WARNING "st%d: device_create failed\n",
- dev_num);
- error = PTR_ERR(st_class_member);
- goto out;
- }
-- dev_set_drvdata(st_class_member, &STp->modes[mode]);
-
- error = device_create_file(st_class_member,
- &dev_attr_defined);
-diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c
-index a1ca9b7..1400ea6 100644
---- a/drivers/serial/8250.c
-+++ b/drivers/serial/8250.c
-@@ -43,6 +43,7 @@
-
- #include
- #include
-+#include
-
- #include "8250.h"
-
-@@ -92,8 +93,6 @@ static unsigned int nr_uarts = CONFIG_SERIAL_8250_RUNTIME_UARTS;
- */
- #define CONFIG_HUB6 1
-
--#include
--
- /*
- * SERIAL_PORT_DFNS tells us about built-in ports that have no
- * standard enumeration mechanism. Platforms that can find all
-@@ -1548,6 +1547,8 @@ static int serial_link_irq_chain(struct uart_8250_port *up)
- i->head = &up->list;
- spin_unlock_irq(&i->lock);
-
-+ irq_flags |= SERIAL_EXTRA_IRQ_FLAGS;
-+
- ret = request_irq(up->port.irq, serial8250_interrupt,
- irq_flags, "serial", i);
- if (ret < 0)
-diff --git a/drivers/serial/8250.h b/drivers/serial/8250.h
-index 91bd28f..a10a40c 100644
---- a/drivers/serial/8250.h
-+++ b/drivers/serial/8250.h
-@@ -78,3 +78,8 @@ struct serial8250_config {
- #else
- #define ALPHA_KLUDGE_MCR 0
- #endif
-+
-+#ifndef SERIAL_EXTRA_IRQ_FLAGS
-+#define SERIAL_EXTRA_IRQ_FLAGS 0
-+#endif
-+
-diff --git a/drivers/serial/8250_pci.c b/drivers/serial/8250_pci.c
-index 53fa19c..788c355 100644
---- a/drivers/serial/8250_pci.c
-+++ b/drivers/serial/8250_pci.c
-@@ -2602,7 +2602,12 @@ static struct pci_device_id serial_pci_tbl[] = {
- { PCI_VENDOR_ID_INTASHIELD, PCI_DEVICE_ID_INTASHIELD_IS200,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, /* 135a.0811 */
- pbn_b2_2_115200 },
--
-+ /*
-+ * IntaShield IS-400
-+ */
-+ { PCI_VENDOR_ID_INTASHIELD, PCI_DEVICE_ID_INTASHIELD_IS400,
-+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, /* 135a.0dc0 */
-+ pbn_b2_4_115200 },
- /*
- * Perle PCI-RAS cards
- */
-diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig
-index 62e6eb1..9bc4276 100644
---- a/drivers/serial/Kconfig
-+++ b/drivers/serial/Kconfig
-@@ -1361,7 +1361,7 @@ config SERIAL_SC26XX_CONSOLE
-
- config SERIAL_BFIN_SPORT
- tristate "Blackfin SPORT emulate UART (EXPERIMENTAL)"
-- depends on BFIN && EXPERIMENTAL
-+ depends on BLACKFIN && EXPERIMENTAL
- select SERIAL_CORE
- help
- Enble support SPORT emulate UART on Blackfin series.
-diff --git a/drivers/serial/serial_core.c b/drivers/serial/serial_core.c
-index eab0327..53b03c6 100644
---- a/drivers/serial/serial_core.c
-+++ b/drivers/serial/serial_core.c
-@@ -2054,6 +2054,8 @@ int uart_suspend_port(struct uart_driver *drv, struct uart_port *port)
- int uart_resume_port(struct uart_driver *drv, struct uart_port *port)
- {
- struct uart_state *state = drv->state + port->line;
-+ struct device *tty_dev;
-+ struct uart_match match = {port, drv};
-
- mutex_lock(&state->mutex);
-
-@@ -2063,7 +2065,8 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *port)
- return 0;
- }
-
-- if (!port->suspended) {
-+ tty_dev = device_find_child(port->dev, &match, serial_match_port);
-+ if (!port->suspended && device_may_wakeup(tty_dev)) {
- disable_irq_wake(port->irq);
- mutex_unlock(&state->mutex);
- return 0;
-diff --git a/drivers/serial/sh-sci.c b/drivers/serial/sh-sci.c
-index 8fdafc2..ce6ee92 100644
---- a/drivers/serial/sh-sci.c
-+++ b/drivers/serial/sh-sci.c
-@@ -184,15 +184,15 @@ static void put_string(struct sci_port *sci_port, const char *buffer, int count)
- int h, l;
-
- c = *p++;
-- h = highhex(c);
-- l = lowhex(c);
-+ h = hex_asc_hi(c);
-+ l = hex_asc_lo(c);
- put_char(port, h);
- put_char(port, l);
- checksum += h + l;
- }
- put_char(port, '#');
-- put_char(port, highhex(checksum));
-- put_char(port, lowhex(checksum));
-+ put_char(port, hex_asc_hi(checksum));
-+ put_char(port, hex_asc_lo(checksum));
- } while (get_char(port) != '+');
- } else
- #endif /* CONFIG_SH_STANDARD_BIOS || CONFIG_SH_KGDB */
-diff --git a/drivers/serial/sunhv.c b/drivers/serial/sunhv.c
-index 145c028..2847336 100644
---- a/drivers/serial/sunhv.c
-+++ b/drivers/serial/sunhv.c
-@@ -499,7 +499,6 @@ static void sunhv_console_write_bychar(struct console *con, const char *s, unsig
- } else
- spin_lock(&port->lock);
-
-- spin_lock_irqsave(&port->lock, flags);
- for (i = 0; i < n; i++) {
- if (*s == '\n')
- sunhv_console_putchar(port, '\r');
-diff --git a/drivers/spi/spidev.c b/drivers/spi/spidev.c
-index b3518ca..41620c0 100644
---- a/drivers/spi/spidev.c
-+++ b/drivers/spi/spidev.c
-@@ -68,6 +68,7 @@ static unsigned long minors[N_SPI_MINORS / BITS_PER_LONG];
-
- struct spidev_data {
- struct device dev;
-+ spinlock_t spi_lock;
- struct spi_device *spi;
- struct list_head device_entry;
-
-@@ -85,12 +86,75 @@ MODULE_PARM_DESC(bufsiz, "data bytes in biggest supported SPI message");
-
- /*-------------------------------------------------------------------------*/
-
-+/*
-+ * We can't use the standard synchronous wrappers for file I/O; we
-+ * need to protect against async removal of the underlying spi_device.
-+ */
-+static void spidev_complete(void *arg)
-+{
-+ complete(arg);
-+}
-+
-+static ssize_t
-+spidev_sync(struct spidev_data *spidev, struct spi_message *message)
-+{
-+ DECLARE_COMPLETION_ONSTACK(done);
-+ int status;
-+
-+ message->complete = spidev_complete;
-+ message->context = &done;
-+
-+ spin_lock_irq(&spidev->spi_lock);
-+ if (spidev->spi == NULL)
-+ status = -ESHUTDOWN;
-+ else
-+ status = spi_async(spidev->spi, message);
-+ spin_unlock_irq(&spidev->spi_lock);
-+
-+ if (status == 0) {
-+ wait_for_completion(&done);
-+ status = message->status;
-+ if (status == 0)
-+ status = message->actual_length;
-+ }
-+ return status;
-+}
-+
-+static inline ssize_t
-+spidev_sync_write(struct spidev_data *spidev, size_t len)
-+{
-+ struct spi_transfer t = {
-+ .tx_buf = spidev->buffer,
-+ .len = len,
-+ };
-+ struct spi_message m;
-+
-+ spi_message_init(&m);
-+ spi_message_add_tail(&t, &m);
-+ return spidev_sync(spidev, &m);
-+}
-+
-+static inline ssize_t
-+spidev_sync_read(struct spidev_data *spidev, size_t len)
-+{
-+ struct spi_transfer t = {
-+ .rx_buf = spidev->buffer,
-+ .len = len,
-+ };
-+ struct spi_message m;
-+
-+ spi_message_init(&m);
-+ spi_message_add_tail(&t, &m);
-+ return spidev_sync(spidev, &m);
-+}
-+
-+/*-------------------------------------------------------------------------*/
-+
- /* Read-only message with current device setup */
- static ssize_t
- spidev_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos)
- {
- struct spidev_data *spidev;
-- struct spi_device *spi;
- ssize_t status = 0;
-
- /* chipselect only toggles at start or end of operation */
-@@ -98,10 +162,9 @@ spidev_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos)
- return -EMSGSIZE;
-
- spidev = filp->private_data;
-- spi = spidev->spi;
-
- mutex_lock(&spidev->buf_lock);
-- status = spi_read(spi, spidev->buffer, count);
-+ status = spidev_sync_read(spidev, count);
- if (status == 0) {
- unsigned long missing;
-
-@@ -122,7 +185,6 @@ spidev_write(struct file *filp, const char __user *buf,
- size_t count, loff_t *f_pos)
- {
- struct spidev_data *spidev;
-- struct spi_device *spi;
- ssize_t status = 0;
- unsigned long missing;
-
-@@ -131,12 +193,11 @@ spidev_write(struct file *filp, const char __user *buf,
- return -EMSGSIZE;
-
- spidev = filp->private_data;
-- spi = spidev->spi;
-
- mutex_lock(&spidev->buf_lock);
- missing = copy_from_user(spidev->buffer, buf, count);
- if (missing == 0) {
-- status = spi_write(spi, spidev->buffer, count);
-+ status = spidev_sync_write(spidev, count);
- if (status == 0)
- status = count;
- } else
-@@ -153,7 +214,6 @@ static int spidev_message(struct spidev_data *spidev,
- struct spi_transfer *k_xfers;
- struct spi_transfer *k_tmp;
- struct spi_ioc_transfer *u_tmp;
-- struct spi_device *spi = spidev->spi;
- unsigned n, total;
- u8 *buf;
- int status = -EFAULT;
-@@ -215,7 +275,7 @@ static int spidev_message(struct spidev_data *spidev,
- spi_message_add_tail(k_tmp, &msg);
- }
-
-- status = spi_sync(spi, &msg);
-+ status = spidev_sync(spidev, &msg);
- if (status < 0)
- goto done;
-
-@@ -269,8 +329,16 @@ spidev_ioctl(struct inode *inode, struct file *filp,
- if (err)
- return -EFAULT;
-
-+ /* guard against device removal before, or while,
-+ * we issue this ioctl.
-+ */
- spidev = filp->private_data;
-- spi = spidev->spi;
-+ spin_lock_irq(&spidev->spi_lock);
-+ spi = spi_dev_get(spidev->spi);
-+ spin_unlock_irq(&spidev->spi_lock);
-+
-+ if (spi == NULL)
-+ return -ESHUTDOWN;
-
- switch (cmd) {
- /* read requests */
-@@ -356,8 +424,10 @@ spidev_ioctl(struct inode *inode, struct file *filp,
- default:
- /* segmented and/or full-duplex I/O request */
- if (_IOC_NR(cmd) != _IOC_NR(SPI_IOC_MESSAGE(0))
-- || _IOC_DIR(cmd) != _IOC_WRITE)
-- return -ENOTTY;
-+ || _IOC_DIR(cmd) != _IOC_WRITE) {
-+ retval = -ENOTTY;
-+ break;
-+ }
-
- tmp = _IOC_SIZE(cmd);
- if ((tmp % sizeof(struct spi_ioc_transfer)) != 0) {
-@@ -385,6 +455,7 @@ spidev_ioctl(struct inode *inode, struct file *filp,
- kfree(ioc);
- break;
- }
-+ spi_dev_put(spi);
- return retval;
- }
-
-@@ -488,6 +559,7 @@ static int spidev_probe(struct spi_device *spi)
-
- /* Initialize the driver data */
- spidev->spi = spi;
-+ spin_lock_init(&spidev->spi_lock);
- mutex_init(&spidev->buf_lock);
-
- INIT_LIST_HEAD(&spidev->device_entry);
-@@ -526,13 +598,17 @@ static int spidev_remove(struct spi_device *spi)
- {
- struct spidev_data *spidev = dev_get_drvdata(&spi->dev);
-
-- mutex_lock(&device_list_lock);
-+ /* make sure ops on existing fds can abort cleanly */
-+ spin_lock_irq(&spidev->spi_lock);
-+ spidev->spi = NULL;
-+ spin_unlock_irq(&spidev->spi_lock);
-
-+ /* prevent new opens */
-+ mutex_lock(&device_list_lock);
- list_del(&spidev->device_entry);
- dev_set_drvdata(&spi->dev, NULL);
- clear_bit(MINOR(spidev->dev.devt), minors);
- device_unregister(&spidev->dev);
--
- mutex_unlock(&device_list_lock);
-
- return 0;
-diff --git a/drivers/uio/uio.c b/drivers/uio/uio.c
-index 55cc7b8..0a12e90 100644
---- a/drivers/uio/uio.c
-+++ b/drivers/uio/uio.c
-@@ -649,15 +649,14 @@ int __uio_register_device(struct module *owner,
- if (ret)
- goto err_get_minor;
-
-- idev->dev = device_create(uio_class->class, parent,
-- MKDEV(uio_major, idev->minor),
-- "uio%d", idev->minor);
-+ idev->dev = device_create_drvdata(uio_class->class, parent,
-+ MKDEV(uio_major, idev->minor), idev,
-+ "uio%d", idev->minor);
- if (IS_ERR(idev->dev)) {
- printk(KERN_ERR "UIO: device register failed\n");
- ret = PTR_ERR(idev->dev);
- goto err_device_create;
- }
-- dev_set_drvdata(idev->dev, idev);
-
- ret = uio_dev_add_attributes(idev);
- if (ret)
-diff --git a/drivers/usb/class/Kconfig b/drivers/usb/class/Kconfig
-index 3a9102d..66f17ed 100644
---- a/drivers/usb/class/Kconfig
-+++ b/drivers/usb/class/Kconfig
-@@ -29,3 +29,14 @@ config USB_PRINTER
- To compile this driver as a module, choose M here: the
- module will be called usblp.
-
-+config USB_WDM
-+ tristate "USB Wireless Device Management support"
-+ depends on USB
-+ ---help---
-+ This driver supports the WMC Device Management functionality
-+ of cell phones compliant to the CDC WMC specification. You can use
-+ AT commands over this device.
-+
-+ To compile this driver as a module, choose M here: the
-+ module will be called cdc-wdm.
-+
-diff --git a/drivers/usb/class/Makefile b/drivers/usb/class/Makefile
-index cc391e6..535d59a 100644
---- a/drivers/usb/class/Makefile
-+++ b/drivers/usb/class/Makefile
-@@ -5,3 +5,4 @@
-
- obj-$(CONFIG_USB_ACM) += cdc-acm.o
- obj-$(CONFIG_USB_PRINTER) += usblp.o
-+obj-$(CONFIG_USB_WDM) += cdc-wdm.o
-diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c
-new file mode 100644
-index 0000000..107666d
---- /dev/null
-+++ b/drivers/usb/class/cdc-wdm.c
-@@ -0,0 +1,740 @@
-+/*
-+ * cdc-wdm.c
-+ *
-+ * This driver supports USB CDC WCM Device Management.
-+ *
-+ * Copyright (c) 2007-2008 Oliver Neukum
-+ *
-+ * Some code taken from cdc-acm.c
-+ *
-+ * Released under the GPLv2.
-+ *
-+ * Many thanks to Carl Nordbeck
-+ */
-+#include
-+#include
-+#include
-+#include
-+#include
-+#include
-+#include
-+#include
-+#include
-+#include
-+#include
-+#include
-+#include
-+
-+/*
-+ * Version Information
-+ */
-+#define DRIVER_VERSION "v0.02"
-+#define DRIVER_AUTHOR "Oliver Neukum"
-+
-+static struct usb_device_id wdm_ids[] = {
-+ {
-+ .match_flags = USB_DEVICE_ID_MATCH_INT_CLASS |
-+ USB_DEVICE_ID_MATCH_INT_SUBCLASS,
-+ .bInterfaceClass = USB_CLASS_COMM,
-+ .bInterfaceSubClass = USB_CDC_SUBCLASS_DMM
-+ },
-+ { }
-+};
-+
-+#define WDM_MINOR_BASE 176
-+
-+
-+#define WDM_IN_USE 1
-+#define WDM_DISCONNECTING 2
-+#define WDM_RESULT 3
-+#define WDM_READ 4
-+#define WDM_INT_STALL 5
-+#define WDM_POLL_RUNNING 6
-+
-+
-+#define WDM_MAX 16
-+
-+
-+static DEFINE_MUTEX(wdm_mutex);
-+
-+/* --- method tables --- */
-+
-+struct wdm_device {
-+ u8 *inbuf; /* buffer for response */
-+ u8 *outbuf; /* buffer for command */
-+ u8 *sbuf; /* buffer for status */
-+ u8 *ubuf; /* buffer for copy to user space */
-+
-+ struct urb *command;
-+ struct urb *response;
-+ struct urb *validity;
-+ struct usb_interface *intf;
-+ struct usb_ctrlrequest *orq;
-+ struct usb_ctrlrequest *irq;
-+ spinlock_t iuspin;
-+
-+ unsigned long flags;
-+ u16 bufsize;
-+ u16 wMaxCommand;
-+ u16 wMaxPacketSize;
-+ u16 bMaxPacketSize0;
-+ __le16 inum;
-+ int reslength;
-+ int length;
-+ int read;
-+ int count;
-+ dma_addr_t shandle;
-+ dma_addr_t ihandle;
-+ struct mutex wlock;
-+ struct mutex rlock;
-+ wait_queue_head_t wait;
-+ struct work_struct rxwork;
-+ int werr;
-+ int rerr;
-+};
-+
-+static struct usb_driver wdm_driver;
-+
-+/* --- callbacks --- */
-+static void wdm_out_callback(struct urb *urb)
-+{
-+ struct wdm_device *desc;
-+ desc = urb->context;
-+ spin_lock(&desc->iuspin);
-+ desc->werr = urb->status;
-+ spin_unlock(&desc->iuspin);
-+ clear_bit(WDM_IN_USE, &desc->flags);
-+ kfree(desc->outbuf);
-+ wake_up(&desc->wait);
-+}
-+
-+static void wdm_in_callback(struct urb *urb)
-+{
-+ struct wdm_device *desc = urb->context;
-+ int status = urb->status;
-+
-+ spin_lock(&desc->iuspin);
-+
-+ if (status) {
-+ switch (status) {
-+ case -ENOENT:
-+ dev_dbg(&desc->intf->dev,
-+ "nonzero urb status received: -ENOENT");
-+ break;
-+ case -ECONNRESET:
-+ dev_dbg(&desc->intf->dev,
-+ "nonzero urb status received: -ECONNRESET");
-+ break;
-+ case -ESHUTDOWN:
-+ dev_dbg(&desc->intf->dev,
-+ "nonzero urb status received: -ESHUTDOWN");
-+ break;
-+ case -EPIPE:
-+ err("nonzero urb status received: -EPIPE");
-+ break;
-+ default:
-+ err("Unexpected error %d", status);
-+ break;
-+ }
-+ }
-+
-+ desc->rerr = status;
-+ desc->reslength = urb->actual_length;
-+ memmove(desc->ubuf + desc->length, desc->inbuf, desc->reslength);
-+ desc->length += desc->reslength;
-+ wake_up(&desc->wait);
-+
-+ set_bit(WDM_READ, &desc->flags);
-+ spin_unlock(&desc->iuspin);
-+}
-+
-+static void wdm_int_callback(struct urb *urb)
-+{
-+ int rv = 0;
-+ int status = urb->status;
-+ struct wdm_device *desc;
-+ struct usb_ctrlrequest *req;
-+ struct usb_cdc_notification *dr;
-+
-+ desc = urb->context;
-+ req = desc->irq;
-+ dr = (struct usb_cdc_notification *)desc->sbuf;
-+
-+ if (status) {
-+ switch (status) {
-+ case -ESHUTDOWN:
-+ case -ENOENT:
-+ case -ECONNRESET:
-+ return; /* unplug */
-+ case -EPIPE:
-+ set_bit(WDM_INT_STALL, &desc->flags);
-+ err("Stall on int endpoint");
-+ goto sw; /* halt is cleared in work */
-+ default:
-+ err("nonzero urb status received: %d", status);
-+ break;
-+ }
-+ }
-+
-+ if (urb->actual_length < sizeof(struct usb_cdc_notification)) {
-+ err("wdm_int_callback - %d bytes", urb->actual_length);
-+ goto exit;
-+ }
-+
-+ switch (dr->bNotificationType) {
-+ case USB_CDC_NOTIFY_RESPONSE_AVAILABLE:
-+ dev_dbg(&desc->intf->dev,
-+ "NOTIFY_RESPONSE_AVAILABLE received: index %d len %d",
-+ dr->wIndex, dr->wLength);
-+ break;
-+
-+ case USB_CDC_NOTIFY_NETWORK_CONNECTION:
-+
-+ dev_dbg(&desc->intf->dev,
-+ "NOTIFY_NETWORK_CONNECTION %s network",
-+ dr->wValue ? "connected to" : "disconnected from");
-+ goto exit;
-+ default:
-+ clear_bit(WDM_POLL_RUNNING, &desc->flags);
-+ err("unknown notification %d received: index %d len %d",
-+ dr->bNotificationType, dr->wIndex, dr->wLength);
-+ goto exit;
-+ }
-+
-+ req->bRequestType = (USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE);
-+ req->bRequest = USB_CDC_GET_ENCAPSULATED_RESPONSE;
-+ req->wValue = 0;
-+ req->wIndex = desc->inum;
-+ req->wLength = cpu_to_le16(desc->bMaxPacketSize0);
-+
-+ usb_fill_control_urb(
-+ desc->response,
-+ interface_to_usbdev(desc->intf),
-+ /* using common endpoint 0 */
-+ usb_rcvctrlpipe(interface_to_usbdev(desc->intf), 0),
-+ (unsigned char *)req,
-+ desc->inbuf,
-+ desc->bMaxPacketSize0,
-+ wdm_in_callback,
-+ desc
-+ );
-+ desc->response->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
-+ spin_lock(&desc->iuspin);
-+ clear_bit(WDM_READ, &desc->flags);
-+ if (!test_bit(WDM_DISCONNECTING, &desc->flags)) {
-+ rv = usb_submit_urb(desc->response, GFP_ATOMIC);
-+ dev_dbg(&desc->intf->dev, "%s: usb_submit_urb %d",
-+ __func__, rv);
-+ }
-+ spin_unlock(&desc->iuspin);
-+ if (rv < 0) {
-+ if (rv == -EPERM)
-+ return;
-+ if (rv == -ENOMEM) {
-+sw:
-+ rv = schedule_work(&desc->rxwork);
-+ if (rv)
-+ err("Cannot schedule work");
-+ }
-+ }
-+exit:
-+ rv = usb_submit_urb(urb, GFP_ATOMIC);
-+ if (rv)
-+ err("%s - usb_submit_urb failed with result %d",
-+ __func__, rv);
-+
-+}
-+
-+static void kill_urbs(struct wdm_device *desc)
-+{
-+ usb_kill_urb(desc->command);
-+ usb_kill_urb(desc->validity);
-+ usb_kill_urb(desc->response);
-+}
-+
-+static void free_urbs(struct wdm_device *desc)
-+{
-+ usb_free_urb(desc->validity);
-+ usb_free_urb(desc->response);
-+ usb_free_urb(desc->command);
-+}
-+
-+static void cleanup(struct wdm_device *desc)
-+{
-+ usb_buffer_free(interface_to_usbdev(desc->intf),
-+ desc->wMaxPacketSize,
-+ desc->sbuf,
-+ desc->validity->transfer_dma);
-+ usb_buffer_free(interface_to_usbdev(desc->intf),
-+ desc->wMaxPacketSize,
-+ desc->inbuf,
-+ desc->response->transfer_dma);
-+ kfree(desc->orq);
-+ kfree(desc->irq);
-+ kfree(desc->ubuf);
-+ free_urbs(desc);
-+ kfree(desc);
-+}
-+
-+static ssize_t wdm_write
-+(struct file *file, const char __user *buffer, size_t count, loff_t *ppos)
-+{
-+ u8 *buf;
-+ int rv = -EMSGSIZE, r, we;
-+ struct wdm_device *desc = file->private_data;
-+ struct usb_ctrlrequest *req;
-+
-+ if (count > desc->wMaxCommand)
-+ count = desc->wMaxCommand;
-+
-+ spin_lock_irq(&desc->iuspin);
-+ we = desc->werr;
-+ desc->werr = 0;
-+ spin_unlock_irq(&desc->iuspin);
-+ if (we < 0)
-+ return -EIO;
-+
-+ r = mutex_lock_interruptible(&desc->wlock); /* concurrent writes */
-+ rv = -ERESTARTSYS;
-+ if (r)
-+ goto outnl;
-+
-+ r = wait_event_interruptible(desc->wait, !test_bit(WDM_IN_USE,
-+ &desc->flags));
-+ if (r < 0)
-+ goto out;
-+
-+ if (test_bit(WDM_DISCONNECTING, &desc->flags)) {
-+ rv = -ENODEV;
-+ goto out;
-+ }
-+
-+ desc->outbuf = buf = kmalloc(count, GFP_KERNEL);
-+ if (!buf) {
-+ rv = -ENOMEM;
-+ goto out;
-+ }
-+
-+ r = copy_from_user(buf, buffer, count);
-+ if (r > 0) {
-+ kfree(buf);
-+ rv = -EFAULT;
-+ goto out;
-+ }
-+
-+ req = desc->orq;
-+ usb_fill_control_urb(
-+ desc->command,
-+ interface_to_usbdev(desc->intf),
-+ /* using common endpoint 0 */
-+ usb_sndctrlpipe(interface_to_usbdev(desc->intf), 0),
-+ (unsigned char *)req,
-+ buf,
-+ count,
-+ wdm_out_callback,
-+ desc
-+ );
-+
-+ req->bRequestType = (USB_DIR_OUT | USB_TYPE_CLASS |
-+ USB_RECIP_INTERFACE);
-+ req->bRequest = USB_CDC_SEND_ENCAPSULATED_COMMAND;
-+ req->wValue = 0;
-+ req->wIndex = desc->inum;
-+ req->wLength = cpu_to_le16(count);
-+ set_bit(WDM_IN_USE, &desc->flags);
-+
-+ rv = usb_submit_urb(desc->command, GFP_KERNEL);
-+ if (rv < 0) {
-+ kfree(buf);
-+ clear_bit(WDM_IN_USE, &desc->flags);
-+ } else {
-+ dev_dbg(&desc->intf->dev, "Tx URB has been submitted index=%d",
-+ req->wIndex);
-+ }
-+out:
-+ mutex_unlock(&desc->wlock);
-+outnl:
-+ return rv < 0 ? rv : count;
-+}
-+
-+static ssize_t wdm_read
-+(struct file *file, char __user *buffer, size_t count, loff_t *ppos)
-+{
-+ int rv, cntr;
-+ int i = 0;
-+ struct wdm_device *desc = file->private_data;
-+
-+
-+ rv = mutex_lock_interruptible(&desc->rlock); /*concurrent reads */
-+ if (rv < 0)
-+ return -ERESTARTSYS;
-+
-+ if (desc->length == 0) {
-+ desc->read = 0;
-+retry:
-+ i++;
-+ rv = wait_event_interruptible(desc->wait,
-+ test_bit(WDM_READ, &desc->flags));
-+
-+ if (rv < 0) {
-+ rv = -ERESTARTSYS;
-+ goto err;
-+ }
-+
-+ spin_lock_irq(&desc->iuspin);
-+
-+ if (desc->rerr) { /* read completed, error happened */
-+ int t = desc->rerr;
-+ desc->rerr = 0;
-+ spin_unlock_irq(&desc->iuspin);
-+ err("reading had resulted in %d", t);
-+ rv = -EIO;
-+ goto err;
-+ }
-+ /*
-+ * recheck whether we've lost the race
-+ * against the completion handler
-+ */
-+ if (!test_bit(WDM_READ, &desc->flags)) { /* lost race */
-+ spin_unlock_irq(&desc->iuspin);
-+ goto retry;
-+ }
-+ if (!desc->reslength) { /* zero length read */
-+ spin_unlock_irq(&desc->iuspin);
-+ goto retry;
-+ }
-+ clear_bit(WDM_READ, &desc->flags);
-+ spin_unlock_irq(&desc->iuspin);
-+ }
-+
-+ cntr = count > desc->length ? desc->length : count;
-+ rv = copy_to_user(buffer, desc->ubuf, cntr);
-+ if (rv > 0) {
-+ rv = -EFAULT;
-+ goto err;
-+ }
-+
-+ for (i = 0; i < desc->length - cntr; i++)
-+ desc->ubuf[i] = desc->ubuf[i + cntr];
-+
-+ desc->length -= cntr;
-+ rv = cntr;
-+
-+err:
-+ mutex_unlock(&desc->rlock);
-+ if (rv < 0)
-+ err("wdm_read: exit error");
-+ return rv;
-+}
-+
-+static int wdm_flush(struct file *file, fl_owner_t id)
-+{
-+ struct wdm_device *desc = file->private_data;
-+
-+ wait_event(desc->wait, !test_bit(WDM_IN_USE, &desc->flags));
-+ if (desc->werr < 0)
-+ err("Error in flush path: %d", desc->werr);
-+
-+ return desc->werr;
-+}
-+
-+static unsigned int wdm_poll(struct file *file, struct poll_table_struct *wait)
-+{
-+ struct wdm_device *desc = file->private_data;
-+ unsigned long flags;
-+ unsigned int mask = 0;
-+
-+ spin_lock_irqsave(&desc->iuspin, flags);
-+ if (test_bit(WDM_DISCONNECTING, &desc->flags)) {
-+ mask = POLLERR;
-+ spin_unlock_irqrestore(&desc->iuspin, flags);
-+ goto desc_out;
-+ }
-+ if (test_bit(WDM_READ, &desc->flags))
-+ mask = POLLIN | POLLRDNORM;
-+ if (desc->rerr || desc->werr)
-+ mask |= POLLERR;
-+ if (!test_bit(WDM_IN_USE, &desc->flags))
-+ mask |= POLLOUT | POLLWRNORM;
-+ spin_unlock_irqrestore(&desc->iuspin, flags);
-+
-+ poll_wait(file, &desc->wait, wait);
-+
-+desc_out:
-+ return mask;
-+}
-+
-+static int wdm_open(struct inode *inode, struct file *file)
-+{
-+ int minor = iminor(inode);
-+ int rv = -ENODEV;
-+ struct usb_interface *intf;
-+ struct wdm_device *desc;
-+
-+ mutex_lock(&wdm_mutex);
-+ intf = usb_find_interface(&wdm_driver, minor);
-+ if (!intf)
-+ goto out;
-+
-+ desc = usb_get_intfdata(intf);
-+ if (test_bit(WDM_DISCONNECTING, &desc->flags))
-+ goto out;
-+
-+ desc->count++;
-+ file->private_data = desc;
-+
-+ rv = usb_submit_urb(desc->validity, GFP_KERNEL);
-+
-+ if (rv < 0) {
-+ desc->count--;
-+ err("Error submitting int urb - %d", rv);
-+ goto out;
-+ }
-+ rv = 0;
-+
-+out:
-+ mutex_unlock(&wdm_mutex);
-+ return rv;
-+}
-+
-+static int wdm_release(struct inode *inode, struct file *file)
-+{
-+ struct wdm_device *desc = file->private_data;
-+
-+ mutex_lock(&wdm_mutex);
-+ desc->count--;
-+ if (!desc->count) {
-+ dev_dbg(&desc->intf->dev, "wdm_release: cleanup");
-+ kill_urbs(desc);
-+ }
-+ mutex_unlock(&wdm_mutex);
-+ return 0;
-+}
-+
-+static const struct file_operations wdm_fops = {
-+ .owner = THIS_MODULE,
-+ .read = wdm_read,
-+ .write = wdm_write,
-+ .open = wdm_open,
-+ .flush = wdm_flush,
-+ .release = wdm_release,
-+ .poll = wdm_poll
-+};
-+
-+static struct usb_class_driver wdm_class = {
-+ .name = "cdc-wdm%d",
-+ .fops = &wdm_fops,
-+ .minor_base = WDM_MINOR_BASE,
-+};
-+
-+/* --- error handling --- */
-+static void wdm_rxwork(struct work_struct *work)
-+{
-+ struct wdm_device *desc = container_of(work, struct wdm_device, rxwork);
-+ unsigned long flags;
-+ int rv;
-+
-+ spin_lock_irqsave(&desc->iuspin, flags);
-+ if (test_bit(WDM_DISCONNECTING, &desc->flags)) {
-+ spin_unlock_irqrestore(&desc->iuspin, flags);
-+ } else {
-+ spin_unlock_irqrestore(&desc->iuspin, flags);
-+ rv = usb_submit_urb(desc->response, GFP_KERNEL);
-+ if (rv < 0 && rv != -EPERM) {
-+ spin_lock_irqsave(&desc->iuspin, flags);
-+ if (!test_bit(WDM_DISCONNECTING, &desc->flags))
-+ schedule_work(&desc->rxwork);
-+ spin_unlock_irqrestore(&desc->iuspin, flags);
-+ }
-+ }
-+}
-+
-+/* --- hotplug --- */
-+
-+static int wdm_probe(struct usb_interface *intf, const struct usb_device_id *id)
-+{
-+ int rv = -EINVAL;
-+ struct usb_device *udev = interface_to_usbdev(intf);
-+ struct wdm_device *desc;
-+ struct usb_host_interface *iface;
-+ struct usb_endpoint_descriptor *ep;
-+ struct usb_cdc_dmm_desc *dmhd;
-+ u8 *buffer = intf->altsetting->extra;
-+ int buflen = intf->altsetting->extralen;
-+ u16 maxcom = 0;
-+
-+ if (!buffer)
-+ goto out;
-+
-+ while (buflen > 0) {
-+ if (buffer [1] != USB_DT_CS_INTERFACE) {
-+ err("skipping garbage");
-+ goto next_desc;
-+ }
-+
-+ switch (buffer [2]) {
-+ case USB_CDC_HEADER_TYPE:
-+ break;
-+ case USB_CDC_DMM_TYPE:
-+ dmhd = (struct usb_cdc_dmm_desc *)buffer;
-+ maxcom = le16_to_cpu(dmhd->wMaxCommand);
-+ dev_dbg(&intf->dev,
-+ "Finding maximum buffer length: %d", maxcom);
-+ break;
-+ default:
-+ err("Ignoring extra header, type %d, length %d",
-+ buffer[2], buffer[0]);
-+ break;
-+ }
-+next_desc:
-+ buflen -= buffer[0];
-+ buffer += buffer[0];
-+ }
-+
-+ rv = -ENOMEM;
-+ desc = kzalloc(sizeof(struct wdm_device), GFP_KERNEL);
-+ if (!desc)
-+ goto out;
-+ mutex_init(&desc->wlock);
-+ mutex_init(&desc->rlock);
-+ spin_lock_init(&desc->iuspin);
-+ init_waitqueue_head(&desc->wait);
-+ desc->wMaxCommand = maxcom;
-+ desc->inum = cpu_to_le16((u16)intf->cur_altsetting->desc.bInterfaceNumber);
-+ desc->intf = intf;
-+ INIT_WORK(&desc->rxwork, wdm_rxwork);
-+
-+ iface = &intf->altsetting[0];
-+ ep = &iface->endpoint[0].desc;
-+ if (!usb_endpoint_is_int_in(ep)) {
-+ rv = -EINVAL;
-+ goto err;
-+ }
-+
-+ desc->wMaxPacketSize = ep->wMaxPacketSize;
-+ desc->bMaxPacketSize0 = cpu_to_le16(udev->descriptor.bMaxPacketSize0);
-+
-+ desc->orq = kmalloc(sizeof(struct usb_ctrlrequest), GFP_KERNEL);
-+ if (!desc->orq)
-+ goto err;
-+ desc->irq = kmalloc(sizeof(struct usb_ctrlrequest), GFP_KERNEL);
-+ if (!desc->irq)
-+ goto err;
-+
-+ desc->validity = usb_alloc_urb(0, GFP_KERNEL);
-+ if (!desc->validity)
-+ goto err;
-+
-+ desc->response = usb_alloc_urb(0, GFP_KERNEL);
-+ if (!desc->response)
-+ goto err;
-+
-+ desc->command = usb_alloc_urb(0, GFP_KERNEL);
-+ if (!desc->command)
-+ goto err;
-+
-+ desc->ubuf = kmalloc(desc->wMaxCommand, GFP_KERNEL);
-+ if (!desc->ubuf)
-+ goto err;
-+
-+ desc->sbuf = usb_buffer_alloc(interface_to_usbdev(intf),
-+ desc->wMaxPacketSize,
-+ GFP_KERNEL,
-+ &desc->validity->transfer_dma);
-+ if (!desc->sbuf)
-+ goto err;
-+
-+ desc->inbuf = usb_buffer_alloc(interface_to_usbdev(intf),
-+ desc->bMaxPacketSize0,
-+ GFP_KERNEL,
-+ &desc->response->transfer_dma);
-+ if (!desc->inbuf)
-+ goto err2;
-+
-+ usb_fill_int_urb(
-+ desc->validity,
-+ interface_to_usbdev(intf),
-+ usb_rcvintpipe(interface_to_usbdev(intf), ep->bEndpointAddress),
-+ desc->sbuf,
-+ desc->wMaxPacketSize,
-+ wdm_int_callback,
-+ desc,
-+ ep->bInterval
-+ );
-+ desc->validity->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
-+
-+ usb_set_intfdata(intf, desc);
-+ rv = usb_register_dev(intf, &wdm_class);
-+ dev_info(&intf->dev, "cdc-wdm%d: USB WDM device\n",
-+ intf->minor - WDM_MINOR_BASE);
-+ if (rv < 0)
-+ goto err;
-+out:
-+ return rv;
-+err2:
-+ usb_buffer_free(interface_to_usbdev(desc->intf),
-+ desc->wMaxPacketSize,
-+ desc->sbuf,
-+ desc->validity->transfer_dma);
-+err:
-+ free_urbs(desc);
-+ kfree(desc->ubuf);
-+ kfree(desc->orq);
-+ kfree(desc->irq);
-+ kfree(desc);
-+ return rv;
-+}
-+
-+static void wdm_disconnect(struct usb_interface *intf)
-+{
-+ struct wdm_device *desc;
-+ unsigned long flags;
-+
-+ usb_deregister_dev(intf, &wdm_class);
-+ mutex_lock(&wdm_mutex);
-+ desc = usb_get_intfdata(intf);
-+
-+ /* the spinlock makes sure no new urbs are generated in the callbacks */
-+ spin_lock_irqsave(&desc->iuspin, flags);
-+ set_bit(WDM_DISCONNECTING, &desc->flags);
-+ set_bit(WDM_READ, &desc->flags);
-+ clear_bit(WDM_IN_USE, &desc->flags);
-+ spin_unlock_irqrestore(&desc->iuspin, flags);
-+ cancel_work_sync(&desc->rxwork);
-+ kill_urbs(desc);
-+ wake_up_all(&desc->wait);
-+ if (!desc->count)
-+ cleanup(desc);
-+ mutex_unlock(&wdm_mutex);
-+}
-+
-+static struct usb_driver wdm_driver = {
-+ .name = "cdc_wdm",
-+ .probe = wdm_probe,
-+ .disconnect = wdm_disconnect,
-+ .id_table = wdm_ids,
-+};
-+
-+/* --- low level module stuff --- */
-+
-+static int __init wdm_init(void)
-+{
-+ int rv;
-+
-+ rv = usb_register(&wdm_driver);
-+
-+ return rv;
-+}
-+
-+static void __exit wdm_exit(void)
-+{
-+ usb_deregister(&wdm_driver);
-+}
-+
-+module_init(wdm_init);
-+module_exit(wdm_exit);
-+
-+MODULE_AUTHOR(DRIVER_AUTHOR);
-+MODULE_DESCRIPTION("USB Abstract Control Model driver for "
-+ "USB WCM Device Management");
-+MODULE_LICENSE("GPL");
-diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
-index bf10e9c..09a53e7 100644
---- a/drivers/usb/core/hcd.c
-+++ b/drivers/usb/core/hcd.c
-@@ -818,12 +818,12 @@ static int usb_register_bus(struct usb_bus *bus)
- set_bit (busnum, busmap.busmap);
- bus->busnum = busnum;
-
-- bus->dev = device_create(usb_host_class, bus->controller, MKDEV(0, 0),
-- "usb_host%d", busnum);
-+ bus->dev = device_create_drvdata(usb_host_class, bus->controller,
-+ MKDEV(0, 0), bus,
-+ "usb_host%d", busnum);
- result = PTR_ERR(bus->dev);
- if (IS_ERR(bus->dev))
- goto error_create_class_dev;
-- dev_set_drvdata(bus->dev, bus);
-
- /* Add it to the local list of buses */
- list_add (&bus->bus_list, &usb_bus_list);
-diff --git a/drivers/usb/gadget/pxa27x_udc.c b/drivers/usb/gadget/pxa27x_udc.c
-index 499b7a2..e02bfd4 100644
---- a/drivers/usb/gadget/pxa27x_udc.c
-+++ b/drivers/usb/gadget/pxa27x_udc.c
-@@ -1526,7 +1526,8 @@ static void udc_disable(struct pxa_udc *udc)
-
- ep0_idle(udc);
- udc->gadget.speed = USB_SPEED_UNKNOWN;
-- udc->mach->udc_command(PXA2XX_UDC_CMD_DISCONNECT);
-+ if (udc->mach->udc_command)
-+ udc->mach->udc_command(PXA2XX_UDC_CMD_DISCONNECT);
- }
-
- /**
-diff --git a/drivers/usb/host/ehci-orion.c b/drivers/usb/host/ehci-orion.c
-index d187d03..3adfda8 100644
---- a/drivers/usb/host/ehci-orion.c
-+++ b/drivers/usb/host/ehci-orion.c
-@@ -115,6 +115,8 @@ static int ehci_orion_setup(struct usb_hcd *hcd)
- if (retval)
- return retval;
-
-+ hcd->has_tt = 1;
-+
- ehci_reset(ehci);
- ehci_port_power(ehci, 0);
-
-diff --git a/drivers/usb/misc/phidgetkit.c b/drivers/usb/misc/phidgetkit.c
-index 24230c6..4cfa25b 100644
---- a/drivers/usb/misc/phidgetkit.c
-+++ b/drivers/usb/misc/phidgetkit.c
-@@ -595,14 +595,14 @@ static int interfacekit_probe(struct usb_interface *intf, const struct usb_devic
- } while(value);
- kit->dev_no = bit;
-
-- kit->dev = device_create(phidget_class, &kit->udev->dev, 0,
-- "interfacekit%d", kit->dev_no);
-+ kit->dev = device_create_drvdata(phidget_class, &kit->udev->dev,
-+ MKDEV(0, 0), kit,
-+ "interfacekit%d", kit->dev_no);
- if (IS_ERR(kit->dev)) {
- rc = PTR_ERR(kit->dev);
- kit->dev = NULL;
- goto out;
- }
-- dev_set_drvdata(kit->dev, kit);
-
- if (usb_submit_urb(kit->irq, GFP_KERNEL)) {
- rc = -EIO;
-diff --git a/drivers/usb/misc/phidgetmotorcontrol.c b/drivers/usb/misc/phidgetmotorcontrol.c
-index f0113c1..9b4696f 100644
---- a/drivers/usb/misc/phidgetmotorcontrol.c
-+++ b/drivers/usb/misc/phidgetmotorcontrol.c
-@@ -365,16 +365,15 @@ static int motorcontrol_probe(struct usb_interface *intf, const struct usb_devic
- } while(value);
- mc->dev_no = bit;
-
-- mc->dev = device_create(phidget_class, &mc->udev->dev, 0,
-- "motorcontrol%d", mc->dev_no);
-+ mc->dev = device_create_drvdata(phidget_class, &mc->udev->dev,
-+ MKDEV(0, 0), mc,
-+ "motorcontrol%d", mc->dev_no);
- if (IS_ERR(mc->dev)) {
- rc = PTR_ERR(mc->dev);
- mc->dev = NULL;
- goto out;
- }
-
-- dev_set_drvdata(mc->dev, mc);
--
- if (usb_submit_urb(mc->irq, GFP_KERNEL)) {
- rc = -EIO;
- goto out;
-diff --git a/drivers/usb/misc/phidgetservo.c b/drivers/usb/misc/phidgetservo.c
-index 7d590c0..1ca7ddb 100644
---- a/drivers/usb/misc/phidgetservo.c
-+++ b/drivers/usb/misc/phidgetservo.c
-@@ -275,14 +275,14 @@ servo_probe(struct usb_interface *interface, const struct usb_device_id *id)
- } while (value);
- dev->dev_no = bit;
-
-- dev->dev = device_create(phidget_class, &dev->udev->dev, 0,
-- "servo%d", dev->dev_no);
-+ dev->dev = device_create_drvdata(phidget_class, &dev->udev->dev,
-+ MKDEV(0, 0), dev,
-+ "servo%d", dev->dev_no);
- if (IS_ERR(dev->dev)) {
- rc = PTR_ERR(dev->dev);
- dev->dev = NULL;
- goto out;
- }
-- dev_set_drvdata(dev->dev, dev);
-
- servo_count = dev->type & SERVO_COUNT_QUAD ? 4 : 1;
-
-diff --git a/drivers/usb/serial/ch341.c b/drivers/usb/serial/ch341.c
-index ba28fdc..1f7c86b 100644
---- a/drivers/usb/serial/ch341.c
-+++ b/drivers/usb/serial/ch341.c
-@@ -28,6 +28,7 @@ static int debug;
-
- static struct usb_device_id id_table [] = {
- { USB_DEVICE(0x4348, 0x5523) },
-+ { USB_DEVICE(0x1a86, 0x7523) },
- { },
- };
- MODULE_DEVICE_TABLE(usb, id_table);
-diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
-index 5b349ec..3cee6fe 100644
---- a/drivers/usb/serial/ftdi_sio.c
-+++ b/drivers/usb/serial/ftdi_sio.c
-@@ -374,6 +374,7 @@ static struct usb_device_id id_table_combined [] = {
- .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
- { USB_DEVICE(FTDI_VID, FTDI_OOCDLINK_PID),
- .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
-+ { USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID_USB60F) },
- { }, /* Optional parameter entry */
- { } /* Terminating entry */
- };
-diff --git a/drivers/usb/serial/ftdi_sio.h b/drivers/usb/serial/ftdi_sio.h
-index 504edf8..a72f2c8 100644
---- a/drivers/usb/serial/ftdi_sio.h
-+++ b/drivers/usb/serial/ftdi_sio.h
-@@ -592,6 +592,12 @@
- #define FIC_NEO1973_DEBUG_PID 0x5118
-
- /*
-+ * RATOC REX-USB60F
-+ */
-+#define RATOC_VENDOR_ID 0x0584
-+#define RATOC_PRODUCT_ID_USB60F 0xb020
-+
-+/*
- * BmRequestType: 1100 0000b
- * bRequest: FTDI_E2_READ
- * wValue: 0
-diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
-index e7e016e..6cecd2c 100644
---- a/drivers/usb/serial/option.c
-+++ b/drivers/usb/serial/option.c
-@@ -183,6 +183,7 @@ static int option_send_setup(struct usb_serial_port *port);
- #define AXESSTEL_PRODUCT_MV110H 0x1000
-
- #define ONDA_VENDOR_ID 0x19d2
-+#define ONDA_PRODUCT_MSA501HS 0x0001
- #define ONDA_PRODUCT_ET502HS 0x0002
-
- #define BANDRICH_VENDOR_ID 0x1A8D
-@@ -196,6 +197,9 @@ static int option_send_setup(struct usb_serial_port *port);
-
- #define MAXON_VENDOR_ID 0x16d8
-
-+#define TELIT_VENDOR_ID 0x1bc7
-+#define TELIT_PRODUCT_UC864E 0x1003
-+
- static struct usb_device_id option_ids[] = {
- { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) },
- { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) },
-@@ -297,13 +301,14 @@ static struct usb_device_id option_ids[] = {
- { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) },
- { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_500A) },
- { USB_DEVICE(AXESSTEL_VENDOR_ID, AXESSTEL_PRODUCT_MV110H) },
-+ { USB_DEVICE(ONDA_VENDOR_ID, ONDA_PRODUCT_MSA501HS) },
- { USB_DEVICE(ONDA_VENDOR_ID, ONDA_PRODUCT_ET502HS) },
- { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_1) },
- { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_2) },
- { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC680) },
- { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */
- { USB_DEVICE(MAXON_VENDOR_ID, 0x6280) }, /* BP3-USB & BP3-EXT HSDPA */
-- { USB_DEVICE(0x19d2, 0x0001) }, /* Telstra NextG CDMA */
-+ { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864E) },
- { } /* Terminating entry */
- };
- MODULE_DEVICE_TABLE(usb, option_ids);
-diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c
-index c605fb6..234c5ee 100644
---- a/drivers/usb/serial/pl2303.c
-+++ b/drivers/usb/serial/pl2303.c
-@@ -66,7 +66,6 @@ static struct usb_device_id id_table [] = {
- { USB_DEVICE(ITEGNO_VENDOR_ID, ITEGNO_PRODUCT_ID_2080) },
- { USB_DEVICE(MA620_VENDOR_ID, MA620_PRODUCT_ID) },
- { USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID) },
-- { USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID_USB60F) },
- { USB_DEVICE(TRIPP_VENDOR_ID, TRIPP_PRODUCT_ID) },
- { USB_DEVICE(RADIOSHACK_VENDOR_ID, RADIOSHACK_PRODUCT_ID) },
- { USB_DEVICE(DCU10_VENDOR_ID, DCU10_PRODUCT_ID) },
-diff --git a/drivers/usb/serial/pl2303.h b/drivers/usb/serial/pl2303.h
-index 10cf872..3bdefe0 100644
---- a/drivers/usb/serial/pl2303.h
-+++ b/drivers/usb/serial/pl2303.h
-@@ -36,7 +36,6 @@
-
- #define RATOC_VENDOR_ID 0x0584
- #define RATOC_PRODUCT_ID 0xb000
--#define RATOC_PRODUCT_ID_USB60F 0xb020
-
- #define TRIPP_VENDOR_ID 0x2478
- #define TRIPP_PRODUCT_ID 0x2008
-diff --git a/drivers/video/aty/atyfb_base.c b/drivers/video/aty/atyfb_base.c
-index e4bcf53..bd4ac0b 100644
---- a/drivers/video/aty/atyfb_base.c
-+++ b/drivers/video/aty/atyfb_base.c
-@@ -3356,7 +3356,7 @@ static int __devinit atyfb_setup_generic(struct pci_dev *pdev, struct fb_info *i
-
- info->fix.mmio_start = raddr;
- par->ati_regbase = ioremap(info->fix.mmio_start, 0x1000);
-- if (par->ati_regbase == 0)
-+ if (par->ati_regbase == NULL)
- return -ENOMEM;
-
- info->fix.mmio_start += par->aux_start ? 0x400 : 0xc00;
-diff --git a/drivers/video/aty/radeon_base.c b/drivers/video/aty/radeon_base.c
-index 72cd0d2..400e926 100644
---- a/drivers/video/aty/radeon_base.c
-+++ b/drivers/video/aty/radeon_base.c
-@@ -2277,8 +2277,8 @@ static int __devinit radeonfb_pci_register (struct pci_dev *pdev,
- do {
- rinfo->fb_base = ioremap (rinfo->fb_base_phys,
- rinfo->mapped_vram);
-- } while ( rinfo->fb_base == 0 &&
-- ((rinfo->mapped_vram /=2) >= MIN_MAPPED_VRAM) );
-+ } while (rinfo->fb_base == NULL &&
-+ ((rinfo->mapped_vram /= 2) >= MIN_MAPPED_VRAM));
-
- if (rinfo->fb_base == NULL) {
- printk (KERN_ERR "radeonfb (%s): cannot map FB\n",
-diff --git a/drivers/video/display/display-sysfs.c b/drivers/video/display/display-sysfs.c
-index 3547717..6ef800b 100644
---- a/drivers/video/display/display-sysfs.c
-+++ b/drivers/video/display/display-sysfs.c
-@@ -26,6 +26,7 @@
- #include
- #include
- #include
-+#include
-
- static ssize_t display_show_name(struct device *dev,
- struct device_attribute *attr, char *buf)
-@@ -152,10 +153,13 @@ struct display_device *display_device_register(struct display_driver *driver,
- mutex_unlock(&allocated_dsp_lock);
-
- if (!ret) {
-- new_dev->dev = device_create(display_class, parent, 0,
-- "display%d", new_dev->idx);
-+ new_dev->dev = device_create_drvdata(display_class,
-+ parent,
-+ MKDEV(0,0),
-+ new_dev,
-+ "display%d",
-+ new_dev->idx);
- if (!IS_ERR(new_dev->dev)) {
-- dev_set_drvdata(new_dev->dev, new_dev);
- new_dev->parent = parent;
- new_dev->driver = driver;
- mutex_init(&new_dev->lock);
-diff --git a/drivers/video/matrox/matroxfb_base.h b/drivers/video/matrox/matroxfb_base.h
-index f3107ad..9588323 100644
---- a/drivers/video/matrox/matroxfb_base.h
-+++ b/drivers/video/matrox/matroxfb_base.h
-@@ -200,7 +200,7 @@ static inline int mga_ioremap(unsigned long phys, unsigned long size, int flags,
- virt->vaddr = ioremap_nocache(phys, size);
- else
- virt->vaddr = ioremap(phys, size);
-- return (virt->vaddr == 0); /* 0, !0... 0, error_code in future */
-+ return (virt->vaddr == NULL); /* 0, !0... 0, error_code in future */
- }
-
- static inline void mga_iounmap(vaddr_t va) {
-diff --git a/drivers/video/pxafb.c b/drivers/video/pxafb.c
-index 3ee314b..274bc93 100644
---- a/drivers/video/pxafb.c
-+++ b/drivers/video/pxafb.c
-@@ -1351,7 +1351,6 @@ static struct pxafb_info * __init pxafb_init_fbinfo(struct device *dev)
- struct pxafb_info *fbi;
- void *addr;
- struct pxafb_mach_info *inf = dev->platform_data;
-- struct pxafb_mode_info *mode = inf->modes;
-
- /* Alloc the pxafb_info and pseudo_palette in one step */
- fbi = kmalloc(sizeof(struct pxafb_info) + sizeof(u32) * 16, GFP_KERNEL);
-diff --git a/drivers/video/s3c2410fb.c b/drivers/video/s3c2410fb.c
-index 13b38cb..f059896 100644
---- a/drivers/video/s3c2410fb.c
-+++ b/drivers/video/s3c2410fb.c
-@@ -1,75 +1,15 @@
--/*
-- * linux/drivers/video/s3c2410fb.c
-- * Copyright (c) Arnaud Patard, Ben Dooks
-+/* linux/drivers/video/s3c2410fb.c
-+ * Copyright (c) 2004,2005 Arnaud Patard
-+ * Copyright (c) 2004-2008 Ben Dooks
-+ *
-+ * S3C2410 LCD Framebuffer Driver
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License. See the file COPYING in the main directory of this archive for
- * more details.
- *
-- * S3C2410 LCD Controller Frame Buffer Driver
-- * based on skeletonfb.c, sa1100fb.c and others
-- *
-- * ChangeLog
-- * 2005-04-07: Arnaud Patard
-- * - u32 state -> pm_message_t state
-- * - S3C2410_{VA,SZ}_LCD -> S3C24XX
-- *
-- * 2005-03-15: Arnaud Patard
-- * - Removed the ioctl
-- * - use readl/writel instead of __raw_writel/__raw_readl
-- *
-- * 2004-12-04: Arnaud Patard
-- * - Added the possibility to set on or off the
-- * debugging messages
-- * - Replaced 0 and 1 by on or off when reading the
-- * /sys files
-- *
-- * 2005-03-23: Ben Dooks
-- * - added non 16bpp modes
-- * - updated platform information for range of x/y/bpp
-- * - add code to ensure palette is written correctly
-- * - add pixel clock divisor control
-- *
-- * 2004-11-11: Arnaud Patard
-- * - Removed the use of currcon as it no more exists
-- * - Added LCD power sysfs interface
-- *
-- * 2004-11-03: Ben Dooks
-- * - minor cleanups
-- * - add suspend/resume support
-- * - s3c2410fb_setcolreg() not valid in >8bpp modes
-- * - removed last CONFIG_FB_S3C2410_FIXED
-- * - ensure lcd controller stopped before cleanup
-- * - added sysfs interface for backlight power
-- * - added mask for gpio configuration
-- * - ensured IRQs disabled during GPIO configuration
-- * - disable TPAL before enabling video
-- *
-- * 2004-09-20: Arnaud Patard
-- * - Suppress command line options
-- *
-- * 2004-09-15: Arnaud Patard
-- * - code cleanup
-- *
-- * 2004-09-07: Arnaud Patard
-- * - Renamed from h1940fb.c to s3c2410fb.c
-- * - Add support for different devices
-- * - Backlight support
-- *
-- * 2004-09-05: Herbert Pötzl
-- * - added clock (de-)allocation code
-- * - added fixem fbmem option
-- *
-- * 2004-07-27: Arnaud Patard
-- * - code cleanup
-- * - added a forgotten return in h1940fb_init
-- *
-- * 2004-07-19: Herbert Pötzl
-- * - code cleanup and extended debugging
-- *
-- * 2004-07-15: Arnaud Patard
-- * - First version
-- */
-+ * Driver based on skeletonfb.c, sa1100fb.c and others.
-+*/
-
- #include
- #include
-@@ -580,6 +520,27 @@ static int s3c2410fb_setcolreg(unsigned regno,
- return 0;
- }
-
-+/* s3c2410fb_lcd_enable
-+ *
-+ * shutdown the lcd controller
-+ */
-+static void s3c2410fb_lcd_enable(struct s3c2410fb_info *fbi, int enable)
-+{
-+ unsigned long flags;
-+
-+ local_irq_save(flags);
-+
-+ if (enable)
-+ fbi->regs.lcdcon1 |= S3C2410_LCDCON1_ENVID;
-+ else
-+ fbi->regs.lcdcon1 &= ~S3C2410_LCDCON1_ENVID;
-+
-+ writel(fbi->regs.lcdcon1, fbi->io + S3C2410_LCDCON1);
-+
-+ local_irq_restore(flags);
-+}
-+
-+
- /*
- * s3c2410fb_blank
- * @blank_mode: the blank mode we want.
-@@ -589,9 +550,6 @@ static int s3c2410fb_setcolreg(unsigned regno,
- * blanking succeeded, != 0 if un-/blanking failed due to e.g. a
- * video mode which doesn't support it. Implements VESA suspend
- * and powerdown modes on hardware that supports disabling hsync/vsync:
-- * blank_mode == 2: suspend vsync
-- * blank_mode == 3: suspend hsync
-- * blank_mode == 4: powerdown
- *
- * Returns negative errno on error, or zero on success.
- *
-@@ -605,6 +563,12 @@ static int s3c2410fb_blank(int blank_mode, struct fb_info *info)
-
- tpal_reg += is_s3c2412(fbi) ? S3C2412_TPAL : S3C2410_TPAL;
-
-+ if (blank_mode == FB_BLANK_POWERDOWN) {
-+ s3c2410fb_lcd_enable(fbi, 0);
-+ } else {
-+ s3c2410fb_lcd_enable(fbi, 1);
-+ }
-+
- if (blank_mode == FB_BLANK_UNBLANK)
- writel(0x0, tpal_reg);
- else {
-@@ -948,7 +912,10 @@ static int __init s3c24xxfb_probe(struct platform_device *pdev,
- }
-
- /* create device files */
-- device_create_file(&pdev->dev, &dev_attr_debug);
-+ ret = device_create_file(&pdev->dev, &dev_attr_debug);
-+ if (ret) {
-+ printk(KERN_ERR "failed to add debug attribute\n");
-+ }
-
- printk(KERN_INFO "fb%d: %s frame buffer device\n",
- fbinfo->node, fbinfo->fix.id);
-@@ -983,21 +950,6 @@ static int __init s3c2412fb_probe(struct platform_device *pdev)
- return s3c24xxfb_probe(pdev, DRV_S3C2412);
- }
-
--/* s3c2410fb_stop_lcd
-- *
-- * shutdown the lcd controller
-- */
--static void s3c2410fb_stop_lcd(struct s3c2410fb_info *fbi)
--{
-- unsigned long flags;
--
-- local_irq_save(flags);
--
-- fbi->regs.lcdcon1 &= ~S3C2410_LCDCON1_ENVID;
-- writel(fbi->regs.lcdcon1, fbi->io + S3C2410_LCDCON1);
--
-- local_irq_restore(flags);
--}
-
- /*
- * Cleanup
-@@ -1010,7 +962,7 @@ static int s3c2410fb_remove(struct platform_device *pdev)
-
- unregister_framebuffer(fbinfo);
-
-- s3c2410fb_stop_lcd(info);
-+ s3c2410fb_lcd_enable(info, 0);
- msleep(1);
-
- s3c2410fb_unmap_video_memory(fbinfo);
-@@ -1043,7 +995,7 @@ static int s3c2410fb_suspend(struct platform_device *dev, pm_message_t state)
- struct fb_info *fbinfo = platform_get_drvdata(dev);
- struct s3c2410fb_info *info = fbinfo->par;
-
-- s3c2410fb_stop_lcd(info);
-+ s3c2410fb_lcd_enable(info, 0);
-
- /* sleep before disabling the clock, we need to ensure
- * the LCD DMA engine is not going to get back on the bus
-@@ -1118,3 +1070,5 @@ MODULE_AUTHOR("Arnaud Patard , "
- "Ben Dooks ");
- MODULE_DESCRIPTION("Framebuffer driver for the s3c2410");
- MODULE_LICENSE("GPL");
-+MODULE_ALIAS("platform:s3c2410-lcd");
-+MODULE_ALIAS("platform:s3c2412-lcd");
-diff --git a/drivers/video/s3c2410fb.h b/drivers/video/s3c2410fb.h
-index dbb73b9..9a6ba3e 100644
---- a/drivers/video/s3c2410fb.h
-+++ b/drivers/video/s3c2410fb.h
-@@ -1,26 +1,14 @@
- /*
- * linux/drivers/video/s3c2410fb.h
-- * Copyright (c) Arnaud Patard
-+ * Copyright (c) 2004 Arnaud Patard
-+ *
-+ * S3C2410 LCD Framebuffer Driver
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License. See the file COPYING in the main directory of this archive for
- * more details.
- *
-- * S3C2410 LCD Controller Frame Buffer Driver
-- * based on skeletonfb.c, sa1100fb.h
-- *
-- * ChangeLog
-- *
-- * 2004-12-04: Arnaud Patard
-- * - Moved dprintk to s3c2410fb.c
-- *
-- * 2004-09-07: Arnaud Patard
-- * - Renamed from h1940fb.h to s3c2410fb.h
-- * - Changed h1940 to s3c2410
-- *
-- * 2004-07-15: Arnaud Patard
-- * - First version
-- */
-+*/
-
- #ifndef __S3C2410FB_H
- #define __S3C2410FB_H
-diff --git a/drivers/video/sis/sis_main.c b/drivers/video/sis/sis_main.c
-index 7380362..b934384 100644
---- a/drivers/video/sis/sis_main.c
-+++ b/drivers/video/sis/sis_main.c
-@@ -5787,7 +5787,7 @@ sisfb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
- } else {
- struct sis_video_info *countvideo = card_list;
- ivideo->cardnumber = 1;
-- while((countvideo = countvideo->next) != 0)
-+ while((countvideo = countvideo->next) != NULL)
- ivideo->cardnumber++;
- }
-
-diff --git a/drivers/video/sm501fb.c b/drivers/video/sm501fb.c
-index 742b5c6..15d4a76 100644
---- a/drivers/video/sm501fb.c
-+++ b/drivers/video/sm501fb.c
-@@ -663,14 +663,14 @@ static void sm501fb_panel_power(struct sm501fb_info *fbi, int to)
- sm501fb_sync_regs(fbi);
- mdelay(10);
-
-- if (pd->flags & SM501FB_FLAG_PANEL_USE_VBIASEN) {
-+ if (!(pd->flags & SM501FB_FLAG_PANEL_NO_VBIASEN)) {
- control |= SM501_DC_PANEL_CONTROL_BIAS; /* VBIASEN */
- writel(control, ctrl_reg);
- sm501fb_sync_regs(fbi);
- mdelay(10);
- }
-
-- if (pd->flags & SM501FB_FLAG_PANEL_USE_FPEN) {
-+ if (!(pd->flags & SM501FB_FLAG_PANEL_NO_FPEN)) {
- control |= SM501_DC_PANEL_CONTROL_FPEN;
- writel(control, ctrl_reg);
- sm501fb_sync_regs(fbi);
-@@ -678,14 +678,14 @@ static void sm501fb_panel_power(struct sm501fb_info *fbi, int to)
- }
- } else if (!to && (control & SM501_DC_PANEL_CONTROL_VDD) != 0) {
- /* disable panel power */
-- if (pd->flags & SM501FB_FLAG_PANEL_USE_FPEN) {
-+ if (!(pd->flags & SM501FB_FLAG_PANEL_NO_FPEN)) {
- control &= ~SM501_DC_PANEL_CONTROL_FPEN;
- writel(control, ctrl_reg);
- sm501fb_sync_regs(fbi);
- mdelay(10);
- }
-
-- if (pd->flags & SM501FB_FLAG_PANEL_USE_VBIASEN) {
-+ if (!(pd->flags & SM501FB_FLAG_PANEL_NO_VBIASEN)) {
- control &= ~SM501_DC_PANEL_CONTROL_BIAS;
- writel(control, ctrl_reg);
- sm501fb_sync_regs(fbi);
-diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c
-index b25707f..0fa95b1 100644
---- a/fs/binfmt_elf.c
-+++ b/fs/binfmt_elf.c
-@@ -256,7 +256,7 @@ create_elf_tables(struct linux_binprm *bprm, struct elfhdr *exec,
- return -EFAULT;
- len = strnlen_user((void __user *)p, MAX_ARG_STRLEN);
- if (!len || len > MAX_ARG_STRLEN)
-- return 0;
-+ return -EINVAL;
- p += len;
- }
- if (__put_user(0, argv))
-@@ -268,7 +268,7 @@ create_elf_tables(struct linux_binprm *bprm, struct elfhdr *exec,
- return -EFAULT;
- len = strnlen_user((void __user *)p, MAX_ARG_STRLEN);
- if (!len || len > MAX_ARG_STRLEN)
-- return 0;
-+ return -EINVAL;
- p += len;
- }
- if (__put_user(0, envp))
-@@ -1900,7 +1900,7 @@ static int elf_core_dump(long signr, struct pt_regs *regs, struct file *file, un
- /* alloc memory for large data structures: too large to be on stack */
- elf = kmalloc(sizeof(*elf), GFP_KERNEL);
- if (!elf)
-- goto cleanup;
-+ goto out;
-
- segs = current->mm->map_count;
- #ifdef ELF_CORE_EXTRA_PHDRS
-@@ -2034,8 +2034,9 @@ end_coredump:
- set_fs(fs);
-
- cleanup:
-- kfree(elf);
- free_note_info(&info);
-+ kfree(elf);
-+out:
- return has_dumped;
- }
-
-diff --git a/fs/cifs/AUTHORS b/fs/cifs/AUTHORS
-index 8848e4d..9c136d7 100644
---- a/fs/cifs/AUTHORS
-+++ b/fs/cifs/AUTHORS
-@@ -36,6 +36,7 @@ Miklos Szeredi
- Kazeon team for various fixes especially for 2.4 version.
- Asser Ferno (Change Notify support)
- Shaggy (Dave Kleikamp) for inumerable small fs suggestions and some good cleanup
-+Igor Mammedov (DFS support)
-
- Test case and Bug Report contributors
- -------------------------------------
-diff --git a/fs/cifs/CHANGES b/fs/cifs/CHANGES
-index 8355e91..28e3d5c 100644
---- a/fs/cifs/CHANGES
-+++ b/fs/cifs/CHANGES
-@@ -1,5 +1,7 @@
- Version 1.53
- ------------
-+DFS support added (Microsoft Distributed File System client support needed
-+for referrals which enable a hierarchical name space among servers).
-
- Version 1.52
- ------------
-@@ -12,7 +14,8 @@ Add ability to modify cifs acls for handling chmod (when mounted with
- cifsacl flag). Fix prefixpath path separator so we can handle mounts
- with prefixpaths longer than one directory (one path component) when
- mounted to Windows servers. Fix slow file open when cifsacl
--enabled.
-+enabled. Fix memory leak in FindNext when the SMB call returns -EBADF.
-+
-
- Version 1.51
- ------------
-diff --git a/fs/cifs/README b/fs/cifs/README
-index 621aa1a..2bd6fe5 100644
---- a/fs/cifs/README
-+++ b/fs/cifs/README
-@@ -483,6 +483,11 @@ A partial list of the supported mount options follows:
- sign Must use packet signing (helps avoid unwanted data modification
- by intermediate systems in the route). Note that signing
- does not work with lanman or plaintext authentication.
-+ seal Must seal (encrypt) all data on this mounted share before
-+ sending on the network. Requires support for Unix Extensions.
-+ Note that this differs from the sign mount option in that it
-+ causes encryption of data sent over this mounted share but other
-+ shares mounted to the same server are unaffected.
- sec Security mode. Allowed values are:
- none attempt to connection as a null user (no name)
- krb5 Use Kerberos version 5 authentication
-diff --git a/fs/cifs/TODO b/fs/cifs/TODO
-index 92c9fea..5aff46c 100644
---- a/fs/cifs/TODO
-+++ b/fs/cifs/TODO
-@@ -1,4 +1,4 @@
--Version 1.52 January 3, 2008
-+Version 1.53 May 20, 2008
-
- A Partial List of Missing Features
- ==================================
-@@ -20,20 +20,21 @@ d) Cleanup now unneeded SessSetup code in
- fs/cifs/connect.c and add back in NTLMSSP code if any servers
- need it
-
--e) ms-dfs and ms-dfs host name resolution cleanup
--
--f) fix NTLMv2 signing when two mounts with different users to same
-+e) fix NTLMv2 signing when two mounts with different users to same
- server.
-
--g) Directory entry caching relies on a 1 second timer, rather than
-+f) Directory entry caching relies on a 1 second timer, rather than
- using FindNotify or equivalent. - (started)
-
--h) quota support (needs minor kernel change since quota calls
-+g) quota support (needs minor kernel change since quota calls
- to make it to network filesystems or deviceless filesystems)
-
--i) investigate sync behavior (including syncpage) and check
-+h) investigate sync behavior (including syncpage) and check
- for proper behavior of intr/nointr
-
-+i) improve support for very old servers (OS/2 and Win9x for example)
-+Including support for changing the time remotely (utimes command).
-+
- j) hook lower into the sockets api (as NFS/SunRPC does) to avoid the
- extra copy in/out of the socket buffers in some cases.
-
-diff --git a/fs/cifs/cifs_dfs_ref.c b/fs/cifs/cifs_dfs_ref.c
-index f6fdecf..d82374c 100644
---- a/fs/cifs/cifs_dfs_ref.c
-+++ b/fs/cifs/cifs_dfs_ref.c
-@@ -219,53 +219,6 @@ static struct vfsmount *cifs_dfs_do_refmount(const struct vfsmount *mnt_parent,
-
- }
-
--static char *build_full_dfs_path_from_dentry(struct dentry *dentry)
--{
-- char *full_path = NULL;
-- char *search_path;
-- char *tmp_path;
-- size_t l_max_len;
-- struct cifs_sb_info *cifs_sb;
--
-- if (dentry->d_inode == NULL)
-- return NULL;
--
-- cifs_sb = CIFS_SB(dentry->d_inode->i_sb);
--
-- if (cifs_sb->tcon == NULL)
-- return NULL;
--
-- search_path = build_path_from_dentry(dentry);
-- if (search_path == NULL)
-- return NULL;
--
-- if (cifs_sb->tcon->Flags & SMB_SHARE_IS_IN_DFS) {
-- int i;
-- /* we should use full path name for correct working with DFS */
-- l_max_len = strnlen(cifs_sb->tcon->treeName, MAX_TREE_SIZE+1) +
-- strnlen(search_path, MAX_PATHCONF) + 1;
-- tmp_path = kmalloc(l_max_len, GFP_KERNEL);
-- if (tmp_path == NULL) {
-- kfree(search_path);
-- return NULL;
-- }
-- strncpy(tmp_path, cifs_sb->tcon->treeName, l_max_len);
-- tmp_path[l_max_len-1] = 0;
-- if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS)
-- for (i = 0; i < l_max_len; i++) {
-- if (tmp_path[i] == '\\')
-- tmp_path[i] = '/';
-- }
-- strncat(tmp_path, search_path, l_max_len - strlen(tmp_path));
--
-- full_path = tmp_path;
-- kfree(search_path);
-- } else {
-- full_path = search_path;
-- }
-- return full_path;
--}
--
- static int add_mount_helper(struct vfsmount *newmnt, struct nameidata *nd,
- struct list_head *mntlist)
- {
-@@ -333,7 +286,7 @@ cifs_dfs_follow_mountpoint(struct dentry *dentry, struct nameidata *nd)
- goto out_err;
- }
-
-- full_path = build_full_dfs_path_from_dentry(dentry);
-+ full_path = build_path_from_dentry(dentry);
- if (full_path == NULL) {
- rc = -ENOMEM;
- goto out_err;
-diff --git a/fs/cifs/cifs_fs_sb.h b/fs/cifs/cifs_fs_sb.h
-index 8ad2330..877c854 100644
---- a/fs/cifs/cifs_fs_sb.h
-+++ b/fs/cifs/cifs_fs_sb.h
-@@ -30,6 +30,7 @@
- #define CIFS_MOUNT_CIFS_ACL 0x200 /* send ACL requests to non-POSIX srv */
- #define CIFS_MOUNT_OVERR_UID 0x400 /* override uid returned from server */
- #define CIFS_MOUNT_OVERR_GID 0x800 /* override gid returned from server */
-+#define CIFS_MOUNT_DYNPERM 0x1000 /* allow in-memory only mode setting */
-
- struct cifs_sb_info {
- struct cifsTconInfo *tcon; /* primary mount */
-diff --git a/fs/cifs/cifs_spnego.c b/fs/cifs/cifs_spnego.c
-index 6653e29..7013aaf 100644
---- a/fs/cifs/cifs_spnego.c
-+++ b/fs/cifs/cifs_spnego.c
-@@ -119,6 +119,9 @@ cifs_get_spnego_key(struct cifsSesInfo *sesInfo)
- dp = description + strlen(description);
- sprintf(dp, ";uid=0x%x", sesInfo->linux_uid);
-
-+ dp = description + strlen(description);
-+ sprintf(dp, ";user=%s", sesInfo->userName);
-+
- cFYI(1, ("key description = %s", description));
- spnego_key = request_key(&cifs_spnego_key_type, description, "");
-
-diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c
-index 427a7c6..5df93fd 100644
---- a/fs/cifs/cifsfs.c
-+++ b/fs/cifs/cifsfs.c
-@@ -1,7 +1,7 @@
- /*
- * fs/cifs/cifsfs.c
- *
-- * Copyright (C) International Business Machines Corp., 2002,2007
-+ * Copyright (C) International Business Machines Corp., 2002,2008
- * Author(s): Steve French (sfrench@us.ibm.com)
- *
- * Common Internet FileSystem (CIFS) client
-@@ -353,9 +353,41 @@ cifs_show_options(struct seq_file *s, struct vfsmount *m)
- if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID) ||
- !(cifs_sb->tcon->unix_ext))
- seq_printf(s, ",gid=%d", cifs_sb->mnt_gid);
-+ if (!cifs_sb->tcon->unix_ext) {
-+ seq_printf(s, ",file_mode=0%o,dir_mode=0%o",
-+ cifs_sb->mnt_file_mode,
-+ cifs_sb->mnt_dir_mode);
-+ }
-+ if (cifs_sb->tcon->seal)
-+ seq_printf(s, ",seal");
-+ if (cifs_sb->tcon->nocase)
-+ seq_printf(s, ",nocase");
-+ if (cifs_sb->tcon->retry)
-+ seq_printf(s, ",hard");
- }
- if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS)
- seq_printf(s, ",posixpaths");
-+ if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID)
-+ seq_printf(s, ",setuids");
-+ if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)
-+ seq_printf(s, ",serverino");
-+ if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO)
-+ seq_printf(s, ",directio");
-+ if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_XATTR)
-+ seq_printf(s, ",nouser_xattr");
-+ if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR)
-+ seq_printf(s, ",mapchars");
-+ if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL)
-+ seq_printf(s, ",sfu");
-+ if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
-+ seq_printf(s, ",nobrl");
-+ if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL)
-+ seq_printf(s, ",cifsacl");
-+ if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)
-+ seq_printf(s, ",dynperm");
-+ if (m->mnt_sb->s_flags & MS_POSIXACL)
-+ seq_printf(s, ",acl");
-+
- seq_printf(s, ",rsize=%d", cifs_sb->rsize);
- seq_printf(s, ",wsize=%d", cifs_sb->wsize);
- }
-@@ -657,7 +689,7 @@ const struct file_operations cifs_file_ops = {
- .splice_read = generic_file_splice_read,
- .llseek = cifs_llseek,
- #ifdef CONFIG_CIFS_POSIX
-- .ioctl = cifs_ioctl,
-+ .unlocked_ioctl = cifs_ioctl,
- #endif /* CONFIG_CIFS_POSIX */
-
- #ifdef CONFIG_CIFS_EXPERIMENTAL
-@@ -677,7 +709,7 @@ const struct file_operations cifs_file_direct_ops = {
- .flush = cifs_flush,
- .splice_read = generic_file_splice_read,
- #ifdef CONFIG_CIFS_POSIX
-- .ioctl = cifs_ioctl,
-+ .unlocked_ioctl = cifs_ioctl,
- #endif /* CONFIG_CIFS_POSIX */
- .llseek = cifs_llseek,
- #ifdef CONFIG_CIFS_EXPERIMENTAL
-@@ -697,7 +729,7 @@ const struct file_operations cifs_file_nobrl_ops = {
- .splice_read = generic_file_splice_read,
- .llseek = cifs_llseek,
- #ifdef CONFIG_CIFS_POSIX
-- .ioctl = cifs_ioctl,
-+ .unlocked_ioctl = cifs_ioctl,
- #endif /* CONFIG_CIFS_POSIX */
-
- #ifdef CONFIG_CIFS_EXPERIMENTAL
-@@ -716,7 +748,7 @@ const struct file_operations cifs_file_direct_nobrl_ops = {
- .flush = cifs_flush,
- .splice_read = generic_file_splice_read,
- #ifdef CONFIG_CIFS_POSIX
-- .ioctl = cifs_ioctl,
-+ .unlocked_ioctl = cifs_ioctl,
- #endif /* CONFIG_CIFS_POSIX */
- .llseek = cifs_llseek,
- #ifdef CONFIG_CIFS_EXPERIMENTAL
-@@ -731,7 +763,7 @@ const struct file_operations cifs_dir_ops = {
- #ifdef CONFIG_CIFS_EXPERIMENTAL
- .dir_notify = cifs_dir_notify,
- #endif /* CONFIG_CIFS_EXPERIMENTAL */
-- .ioctl = cifs_ioctl,
-+ .unlocked_ioctl = cifs_ioctl,
- };
-
- static void
-diff --git a/fs/cifs/cifsfs.h b/fs/cifs/cifsfs.h
-index cd1301a..25a6cbd 100644
---- a/fs/cifs/cifsfs.h
-+++ b/fs/cifs/cifsfs.h
-@@ -95,8 +95,7 @@ extern int cifs_setxattr(struct dentry *, const char *, const void *,
- size_t, int);
- extern ssize_t cifs_getxattr(struct dentry *, const char *, void *, size_t);
- extern ssize_t cifs_listxattr(struct dentry *, char *, size_t);
--extern int cifs_ioctl(struct inode *inode, struct file *filep,
-- unsigned int command, unsigned long arg);
-+extern long cifs_ioctl(struct file *filep, unsigned int cmd, unsigned long arg);
-
- #ifdef CONFIG_CIFS_EXPERIMENTAL
- extern const struct export_operations cifs_export_ops;
-diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h
-index b7d9f69..0891405 100644
---- a/fs/cifs/cifsglob.h
-+++ b/fs/cifs/cifsglob.h
-@@ -281,6 +281,7 @@ struct cifsTconInfo {
- bool ipc:1; /* set if connection to IPC$ eg for RPC/PIPES */
- bool retry:1;
- bool nocase:1;
-+ bool seal:1; /* transport encryption for this mounted share */
- bool unix_ext:1; /* if false disable Linux extensions to CIFS protocol
- for this mount even if server would support */
- /* BB add field for back pointer to sb struct(s)? */
-diff --git a/fs/cifs/cifspdu.h b/fs/cifs/cifspdu.h
-index c43bf4b..65d58b4 100644
---- a/fs/cifs/cifspdu.h
-+++ b/fs/cifs/cifspdu.h
-@@ -1904,19 +1904,26 @@ typedef struct smb_com_transaction2_get_dfs_refer_req {
- char RequestFileName[1];
- } __attribute__((packed)) TRANSACTION2_GET_DFS_REFER_REQ;
-
-+#define DFS_VERSION cpu_to_le16(0x0003)
-+
-+/* DFS server target type */
-+#define DFS_TYPE_LINK 0x0000 /* also for sysvol targets */
-+#define DFS_TYPE_ROOT 0x0001
-+
-+/* Referral Entry Flags */
-+#define DFS_NAME_LIST_REF 0x0200
-+
- typedef struct dfs_referral_level_3 {
- __le16 VersionNumber;
-- __le16 ReferralSize;
-- __le16 ServerType; /* 0x0001 = CIFS server */
-- __le16 ReferralFlags; /* or proximity - not clear which since it is
-- always set to zero - SNIA spec says 0x01
-- means strip off PathConsumed chars before
-- submitting RequestFileName to remote node */
-- __le16 TimeToLive;
-- __le16 Proximity;
-+ __le16 Size;
-+ __le16 ServerType; /* 0x0001 = root targets; 0x0000 = link targets */
-+ __le16 ReferralEntryFlags; /* 0x0200 bit set only for domain
-+ or DC referral responce */
-+ __le32 TimeToLive;
- __le16 DfsPathOffset;
- __le16 DfsAlternatePathOffset;
-- __le16 NetworkAddressOffset;
-+ __le16 NetworkAddressOffset; /* offset of the link target */
-+ __le16 ServiceSiteGuid;
- } __attribute__((packed)) REFERRAL3;
-
- typedef struct smb_com_transaction_get_dfs_refer_rsp {
-diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h
-index d481f6c..b9f5e93 100644
---- a/fs/cifs/cifsproto.h
-+++ b/fs/cifs/cifsproto.h
-@@ -93,7 +93,7 @@ extern struct timespec cnvrtDosUnixTm(__u16 date, __u16 time);
-
- extern int cifs_get_inode_info(struct inode **pinode,
- const unsigned char *search_path,
-- FILE_ALL_INFO * pfile_info,
-+ FILE_ALL_INFO *pfile_info,
- struct super_block *sb, int xid, const __u16 *pfid);
- extern int cifs_get_inode_info_unix(struct inode **pinode,
- const unsigned char *search_path,
-@@ -130,7 +130,7 @@ extern int CIFSFindClose(const int, struct cifsTconInfo *tcon,
-
- extern int CIFSSMBQPathInfo(const int xid, struct cifsTconInfo *tcon,
- const unsigned char *searchName,
-- FILE_ALL_INFO * findData,
-+ FILE_ALL_INFO *findData,
- int legacy /* whether to use old info level */,
- const struct nls_table *nls_codepage, int remap);
- extern int SMBQueryInformation(const int xid, struct cifsTconInfo *tcon,
-@@ -141,18 +141,15 @@ extern int SMBQueryInformation(const int xid, struct cifsTconInfo *tcon,
- extern int CIFSSMBUnixQPathInfo(const int xid,
- struct cifsTconInfo *tcon,
- const unsigned char *searchName,
-- FILE_UNIX_BASIC_INFO * pFindData,
-+ FILE_UNIX_BASIC_INFO *pFindData,
- const struct nls_table *nls_codepage, int remap);
-
- extern int CIFSGetDFSRefer(const int xid, struct cifsSesInfo *ses,
- const unsigned char *searchName,
-- unsigned char **targetUNCs,
-- unsigned int *number_of_UNC_in_array,
-+ struct dfs_info3_param **target_nodes,
-+ unsigned int *number_of_nodes_in_array,
- const struct nls_table *nls_codepage, int remap);
-
--extern int connect_to_dfs_path(int xid, struct cifsSesInfo *pSesInfo,
-- const char *old_path,
-- const struct nls_table *nls_codepage, int remap);
- extern int get_dfs_path(int xid, struct cifsSesInfo *pSesInfo,
- const char *old_path,
- const struct nls_table *nls_codepage,
-diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c
-index 95fbba4..9b8b4cf 100644
---- a/fs/cifs/cifssmb.c
-+++ b/fs/cifs/cifssmb.c
-@@ -81,6 +81,40 @@ static struct {
- #endif /* CONFIG_CIFS_WEAK_PW_HASH */
- #endif /* CIFS_POSIX */
-
-+/* Allocates buffer into dst and copies smb string from src to it.
-+ * caller is responsible for freeing dst if function returned 0.
-+ * returns:
-+ * on success - 0
-+ * on failure - errno
-+ */
-+static int
-+cifs_strncpy_to_host(char **dst, const char *src, const int maxlen,
-+ const bool is_unicode, const struct nls_table *nls_codepage)
-+{
-+ int plen;
-+
-+ if (is_unicode) {
-+ plen = UniStrnlen((wchar_t *)src, maxlen);
-+ *dst = kmalloc(plen + 2, GFP_KERNEL);
-+ if (!*dst)
-+ goto cifs_strncpy_to_host_ErrExit;
-+ cifs_strfromUCS_le(*dst, (__le16 *)src, plen, nls_codepage);
-+ } else {
-+ plen = strnlen(src, maxlen);
-+ *dst = kmalloc(plen + 2, GFP_KERNEL);
-+ if (!*dst)
-+ goto cifs_strncpy_to_host_ErrExit;
-+ strncpy(*dst, src, plen);
-+ }
-+ (*dst)[plen] = 0;
-+ (*dst)[plen+1] = 0; /* harmless for ASCII case, needed for Unicode */
-+ return 0;
-+
-+cifs_strncpy_to_host_ErrExit:
-+ cERROR(1, ("Failed to allocate buffer for string\n"));
-+ return -ENOMEM;
-+}
-+
-
- /* Mark as invalid, all open files on tree connections since they
- were closed when session to server was lost */
-@@ -1166,6 +1200,20 @@ static __u16 convert_disposition(int disposition)
- return ofun;
- }
-
-+static int
-+access_flags_to_smbopen_mode(const int access_flags)
-+{
-+ int masked_flags = access_flags & (GENERIC_READ | GENERIC_WRITE);
-+
-+ if (masked_flags == GENERIC_READ)
-+ return SMBOPEN_READ;
-+ else if (masked_flags == GENERIC_WRITE)
-+ return SMBOPEN_WRITE;
-+
-+ /* just go for read/write */
-+ return SMBOPEN_READWRITE;
-+}
-+
- int
- SMBLegacyOpen(const int xid, struct cifsTconInfo *tcon,
- const char *fileName, const int openDisposition,
-@@ -1207,13 +1255,7 @@ OldOpenRetry:
- pSMB->OpenFlags = cpu_to_le16(REQ_BATCHOPLOCK);
-
- pSMB->OpenFlags |= cpu_to_le16(REQ_MORE_INFO);
-- /* BB fixme add conversion for access_flags to bits 0 - 2 of mode */
-- /* 0 = read
-- 1 = write
-- 2 = rw
-- 3 = execute
-- */
-- pSMB->Mode = cpu_to_le16(2);
-+ pSMB->Mode = cpu_to_le16(access_flags_to_smbopen_mode(access_flags));
- pSMB->Mode |= cpu_to_le16(0x40); /* deny none */
- /* set file as system file if special file such
- as fifo and server expecting SFU style and
-@@ -1247,7 +1289,7 @@ OldOpenRetry:
- } else {
- /* BB verify if wct == 15 */
-
--/* *pOplock = pSMBr->OplockLevel; */ /* BB take from action field BB */
-+/* *pOplock = pSMBr->OplockLevel; */ /* BB take from action field*/
-
- *netfid = pSMBr->Fid; /* cifs fid stays in le */
- /* Let caller know file was created so we can set the mode. */
-@@ -1767,7 +1809,7 @@ CIFSSMBPosixLock(const int xid, struct cifsTconInfo *tcon,
- cFYI(1, ("Posix Lock"));
-
- if (pLockData == NULL)
-- return EINVAL;
-+ return -EINVAL;
-
- rc = small_smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB);
-
-@@ -1944,7 +1986,7 @@ renameRetry:
- /* protocol requires ASCII signature byte on Unicode string */
- pSMB->OldFileName[name_len + 1] = 0x00;
- name_len2 =
-- cifsConvertToUCS((__le16 *) &pSMB->OldFileName[name_len + 2],
-+ cifsConvertToUCS((__le16 *)&pSMB->OldFileName[name_len + 2],
- toName, PATH_MAX, nls_codepage, remap);
- name_len2 += 1 /* trailing null */ + 1 /* Signature word */ ;
- name_len2 *= 2; /* convert to bytes */
-@@ -2117,8 +2159,7 @@ copyRetry:
- cFYI(1, ("Send error in copy = %d with %d files copied",
- rc, le16_to_cpu(pSMBr->CopyCount)));
- }
-- if (pSMB)
-- cifs_buf_release(pSMB);
-+ cifs_buf_release(pSMB);
-
- if (rc == -EAGAIN)
- goto copyRetry;
-@@ -2207,8 +2248,7 @@ createSymLinkRetry:
- if (rc)
- cFYI(1, ("Send error in SetPathInfo create symlink = %d", rc));
-
-- if (pSMB)
-- cifs_buf_release(pSMB);
-+ cifs_buf_release(pSMB);
-
- if (rc == -EAGAIN)
- goto createSymLinkRetry;
-@@ -2925,7 +2965,8 @@ setAclRetry:
- }
- params = 6 + name_len;
- pSMB->MaxParameterCount = cpu_to_le16(2);
-- pSMB->MaxDataCount = cpu_to_le16(1000); /* BB find max SMB size from sess */
-+ /* BB find max SMB size from sess */
-+ pSMB->MaxDataCount = cpu_to_le16(1000);
- pSMB->MaxSetupCount = 0;
- pSMB->Reserved = 0;
- pSMB->Flags = 0;
-@@ -3322,7 +3363,8 @@ QPathInfoRetry:
- params = 2 /* level */ + 4 /* reserved */ + name_len /* includes NUL */;
- pSMB->TotalDataCount = 0;
- pSMB->MaxParameterCount = cpu_to_le16(2);
-- pSMB->MaxDataCount = cpu_to_le16(4000); /* BB find exact max SMB PDU from sess structure BB */
-+ /* BB find exact max SMB PDU from sess structure BB */
-+ pSMB->MaxDataCount = cpu_to_le16(4000);
- pSMB->MaxSetupCount = 0;
- pSMB->Reserved = 0;
- pSMB->Flags = 0;
-@@ -3388,7 +3430,7 @@ QPathInfoRetry:
- int
- CIFSSMBUnixQPathInfo(const int xid, struct cifsTconInfo *tcon,
- const unsigned char *searchName,
-- FILE_UNIX_BASIC_INFO * pFindData,
-+ FILE_UNIX_BASIC_INFO *pFindData,
- const struct nls_table *nls_codepage, int remap)
- {
- /* SMB_QUERY_FILE_UNIX_BASIC */
-@@ -3679,6 +3721,7 @@ int CIFSFindNext(const int xid, struct cifsTconInfo *tcon,
- if (rc) {
- if (rc == -EBADF) {
- psrch_inf->endOfSearch = true;
-+ cifs_buf_release(pSMB);
- rc = 0; /* search probably was closed at end of search*/
- } else
- cFYI(1, ("FindNext returned = %d", rc));
-@@ -3856,25 +3899,112 @@ GetInodeNumOut:
- return rc;
- }
-
-+/* parses DFS refferal V3 structure
-+ * caller is responsible for freeing target_nodes
-+ * returns:
-+ * on success - 0
-+ * on failure - errno
-+ */
-+static int
-+parse_DFS_referrals(TRANSACTION2_GET_DFS_REFER_RSP *pSMBr,
-+ unsigned int *num_of_nodes,
-+ struct dfs_info3_param **target_nodes,
-+ const struct nls_table *nls_codepage)
-+{
-+ int i, rc = 0;
-+ char *data_end;
-+ bool is_unicode;
-+ struct dfs_referral_level_3 *ref;
-+
-+ is_unicode = pSMBr->hdr.Flags2 & SMBFLG2_UNICODE;
-+ *num_of_nodes = le16_to_cpu(pSMBr->NumberOfReferrals);
-+
-+ if (*num_of_nodes < 1) {
-+ cERROR(1, ("num_referrals: must be at least > 0,"
-+ "but we get num_referrals = %d\n", *num_of_nodes));
-+ rc = -EINVAL;
-+ goto parse_DFS_referrals_exit;
-+ }
-+
-+ ref = (struct dfs_referral_level_3 *) &(pSMBr->referrals);
-+ if (ref->VersionNumber != 3) {
-+ cERROR(1, ("Referrals of V%d version are not supported,"
-+ "should be V3", ref->VersionNumber));
-+ rc = -EINVAL;
-+ goto parse_DFS_referrals_exit;
-+ }
-+
-+ /* get the upper boundary of the resp buffer */
-+ data_end = (char *)(&(pSMBr->PathConsumed)) +
-+ le16_to_cpu(pSMBr->t2.DataCount);
-+
-+ cFYI(1, ("num_referrals: %d dfs flags: 0x%x ... \n",
-+ *num_of_nodes,
-+ le16_to_cpu(pSMBr->DFSFlags)));
-+
-+ *target_nodes = kzalloc(sizeof(struct dfs_info3_param) *
-+ *num_of_nodes, GFP_KERNEL);
-+ if (*target_nodes == NULL) {
-+ cERROR(1, ("Failed to allocate buffer for target_nodes\n"));
-+ rc = -ENOMEM;
-+ goto parse_DFS_referrals_exit;
-+ }
-+
-+ /* collect neccessary data from referrals */
-+ for (i = 0; i < *num_of_nodes; i++) {
-+ char *temp;
-+ int max_len;
-+ struct dfs_info3_param *node = (*target_nodes)+i;
-+
-+ node->flags = le16_to_cpu(pSMBr->DFSFlags);
-+ node->path_consumed = le16_to_cpu(pSMBr->PathConsumed);
-+ node->server_type = le16_to_cpu(ref->ServerType);
-+ node->ref_flag = le16_to_cpu(ref->ReferralEntryFlags);
-+
-+ /* copy DfsPath */
-+ temp = (char *)ref + le16_to_cpu(ref->DfsPathOffset);
-+ max_len = data_end - temp;
-+ rc = cifs_strncpy_to_host(&(node->path_name), temp,
-+ max_len, is_unicode, nls_codepage);
-+ if (rc)
-+ goto parse_DFS_referrals_exit;
-+
-+ /* copy link target UNC */
-+ temp = (char *)ref + le16_to_cpu(ref->NetworkAddressOffset);
-+ max_len = data_end - temp;
-+ rc = cifs_strncpy_to_host(&(node->node_name), temp,
-+ max_len, is_unicode, nls_codepage);
-+ if (rc)
-+ goto parse_DFS_referrals_exit;
-+
-+ ref += ref->Size;
-+ }
-+
-+parse_DFS_referrals_exit:
-+ if (rc) {
-+ free_dfs_info_array(*target_nodes, *num_of_nodes);
-+ *target_nodes = NULL;
-+ *num_of_nodes = 0;
-+ }
-+ return rc;
-+}
-+
- int
- CIFSGetDFSRefer(const int xid, struct cifsSesInfo *ses,
- const unsigned char *searchName,
-- unsigned char **targetUNCs,
-- unsigned int *number_of_UNC_in_array,
-+ struct dfs_info3_param **target_nodes,
-+ unsigned int *num_of_nodes,
- const struct nls_table *nls_codepage, int remap)
- {
- /* TRANS2_GET_DFS_REFERRAL */
- TRANSACTION2_GET_DFS_REFER_REQ *pSMB = NULL;
- TRANSACTION2_GET_DFS_REFER_RSP *pSMBr = NULL;
-- struct dfs_referral_level_3 *referrals = NULL;
- int rc = 0;
- int bytes_returned;
- int name_len;
-- unsigned int i;
-- char *temp;
- __u16 params, byte_count;
-- *number_of_UNC_in_array = 0;
-- *targetUNCs = NULL;
-+ *num_of_nodes = 0;
-+ *target_nodes = NULL;
-
- cFYI(1, ("In GetDFSRefer the path %s", searchName));
- if (ses == NULL)
-@@ -3921,7 +4051,8 @@ getDFSRetry:
- pSMB->DataCount = 0;
- pSMB->DataOffset = 0;
- pSMB->MaxParameterCount = 0;
-- pSMB->MaxDataCount = cpu_to_le16(4000); /* BB find exact max SMB PDU from sess structure BB */
-+ /* BB find exact max SMB PDU from sess structure BB */
-+ pSMB->MaxDataCount = cpu_to_le16(4000);
- pSMB->MaxSetupCount = 0;
- pSMB->Reserved = 0;
- pSMB->Flags = 0;
-@@ -3943,103 +4074,26 @@ getDFSRetry:
- (struct smb_hdr *) pSMBr, &bytes_returned, 0);
- if (rc) {
- cFYI(1, ("Send error in GetDFSRefer = %d", rc));
-- } else { /* decode response */
--/* BB Add logic to parse referrals here */
-- rc = validate_t2((struct smb_t2_rsp *)pSMBr);
-+ goto GetDFSRefExit;
-+ }
-+ rc = validate_t2((struct smb_t2_rsp *)pSMBr);
-
-- /* BB Also check if enough total bytes returned? */
-- if (rc || (pSMBr->ByteCount < 17))
-- rc = -EIO; /* bad smb */
-- else {
-- __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset);
-- __u16 data_count = le16_to_cpu(pSMBr->t2.DataCount);
-+ /* BB Also check if enough total bytes returned? */
-+ if (rc || (pSMBr->ByteCount < 17)) {
-+ rc = -EIO; /* bad smb */
-+ goto GetDFSRefExit;
-+ }
-
-- cFYI(1,
-- ("Decoding GetDFSRefer response BCC: %d Offset %d",
-- pSMBr->ByteCount, data_offset));
-- referrals =
-- (struct dfs_referral_level_3 *)
-- (8 /* sizeof start of data block */ +
-- data_offset +
-- (char *) &pSMBr->hdr.Protocol);
-- cFYI(1, ("num_referrals: %d dfs flags: 0x%x ... \n"
-- "for referral one refer size: 0x%x srv "
-- "type: 0x%x refer flags: 0x%x ttl: 0x%x",
-- le16_to_cpu(pSMBr->NumberOfReferrals),
-- le16_to_cpu(pSMBr->DFSFlags),
-- le16_to_cpu(referrals->ReferralSize),
-- le16_to_cpu(referrals->ServerType),
-- le16_to_cpu(referrals->ReferralFlags),
-- le16_to_cpu(referrals->TimeToLive)));
-- /* BB This field is actually two bytes in from start of
-- data block so we could do safety check that DataBlock
-- begins at address of pSMBr->NumberOfReferrals */
-- *number_of_UNC_in_array =
-- le16_to_cpu(pSMBr->NumberOfReferrals);
--
-- /* BB Fix below so can return more than one referral */
-- if (*number_of_UNC_in_array > 1)
-- *number_of_UNC_in_array = 1;
--
-- /* get the length of the strings describing refs */
-- name_len = 0;
-- for (i = 0; i < *number_of_UNC_in_array; i++) {
-- /* make sure that DfsPathOffset not past end */
-- __u16 offset =
-- le16_to_cpu(referrals->DfsPathOffset);
-- if (offset > data_count) {
-- /* if invalid referral, stop here and do
-- not try to copy any more */
-- *number_of_UNC_in_array = i;
-- break;
-- }
-- temp = ((char *)referrals) + offset;
-+ cFYI(1, ("Decoding GetDFSRefer response BCC: %d Offset %d",
-+ pSMBr->ByteCount,
-+ le16_to_cpu(pSMBr->t2.DataOffset)));
-
-- if (pSMBr->hdr.Flags2 & SMBFLG2_UNICODE) {
-- name_len += UniStrnlen((wchar_t *)temp,
-- data_count);
-- } else {
-- name_len += strnlen(temp, data_count);
-- }
-- referrals++;
-- /* BB add check that referral pointer does
-- not fall off end PDU */
-- }
-- /* BB add check for name_len bigger than bcc */
-- *targetUNCs =
-- kmalloc(name_len+1+(*number_of_UNC_in_array),
-- GFP_KERNEL);
-- if (*targetUNCs == NULL) {
-- rc = -ENOMEM;
-- goto GetDFSRefExit;
-- }
-- /* copy the ref strings */
-- referrals = (struct dfs_referral_level_3 *)
-- (8 /* sizeof data hdr */ + data_offset +
-- (char *) &pSMBr->hdr.Protocol);
--
-- for (i = 0; i < *number_of_UNC_in_array; i++) {
-- temp = ((char *)referrals) +
-- le16_to_cpu(referrals->DfsPathOffset);
-- if (pSMBr->hdr.Flags2 & SMBFLG2_UNICODE) {
-- cifs_strfromUCS_le(*targetUNCs,
-- (__le16 *) temp,
-- name_len,
-- nls_codepage);
-- } else {
-- strncpy(*targetUNCs, temp, name_len);
-- }
-- /* BB update target_uncs pointers */
-- referrals++;
-- }
-- temp = *targetUNCs;
-- temp[name_len] = 0;
-- }
-+ /* parse returned result into more usable form */
-+ rc = parse_DFS_referrals(pSMBr, num_of_nodes,
-+ target_nodes, nls_codepage);
-
-- }
- GetDFSRefExit:
-- if (pSMB)
-- cifs_buf_release(pSMB);
-+ cifs_buf_release(pSMB);
-
- if (rc == -EAGAIN)
- goto getDFSRetry;
-@@ -4229,7 +4283,8 @@ QFSAttributeRetry:
- params = 2; /* level */
- pSMB->TotalDataCount = 0;
- pSMB->MaxParameterCount = cpu_to_le16(2);
-- pSMB->MaxDataCount = cpu_to_le16(1000); /* BB find exact max SMB PDU from sess structure BB */
-+ /* BB find exact max SMB PDU from sess structure BB */
-+ pSMB->MaxDataCount = cpu_to_le16(1000);
- pSMB->MaxSetupCount = 0;
- pSMB->Reserved = 0;
- pSMB->Flags = 0;
-@@ -4298,7 +4353,8 @@ QFSDeviceRetry:
- params = 2; /* level */
- pSMB->TotalDataCount = 0;
- pSMB->MaxParameterCount = cpu_to_le16(2);
-- pSMB->MaxDataCount = cpu_to_le16(1000); /* BB find exact max SMB PDU from sess structure BB */
-+ /* BB find exact max SMB PDU from sess structure BB */
-+ pSMB->MaxDataCount = cpu_to_le16(1000);
- pSMB->MaxSetupCount = 0;
- pSMB->Reserved = 0;
- pSMB->Flags = 0;
-@@ -4369,7 +4425,8 @@ QFSUnixRetry:
- pSMB->DataCount = 0;
- pSMB->DataOffset = 0;
- pSMB->MaxParameterCount = cpu_to_le16(2);
-- pSMB->MaxDataCount = cpu_to_le16(100); /* BB find exact max SMB PDU from sess structure BB */
-+ /* BB find exact max SMB PDU from sess structure BB */
-+ pSMB->MaxDataCount = cpu_to_le16(100);
- pSMB->MaxSetupCount = 0;
- pSMB->Reserved = 0;
- pSMB->Flags = 0;
-@@ -4444,7 +4501,8 @@ SETFSUnixRetry:
- offset = param_offset + params;
-
- pSMB->MaxParameterCount = cpu_to_le16(4);
-- pSMB->MaxDataCount = cpu_to_le16(100); /* BB find exact max SMB PDU from sess structure BB */
-+ /* BB find exact max SMB PDU from sess structure BB */
-+ pSMB->MaxDataCount = cpu_to_le16(100);
- pSMB->SetupCount = 1;
- pSMB->Reserved3 = 0;
- pSMB->SubCommand = cpu_to_le16(TRANS2_SET_FS_INFORMATION);
-@@ -4512,7 +4570,8 @@ QFSPosixRetry:
- pSMB->DataCount = 0;
- pSMB->DataOffset = 0;
- pSMB->MaxParameterCount = cpu_to_le16(2);
-- pSMB->MaxDataCount = cpu_to_le16(100); /* BB find exact max SMB PDU from sess structure BB */
-+ /* BB find exact max SMB PDU from sess structure BB */
-+ pSMB->MaxDataCount = cpu_to_le16(100);
- pSMB->MaxSetupCount = 0;
- pSMB->Reserved = 0;
- pSMB->Flags = 0;
-@@ -4702,7 +4761,8 @@ CIFSSMBSetFileSize(const int xid, struct cifsTconInfo *tcon, __u64 size,
-
- count = sizeof(struct file_end_of_file_info);
- pSMB->MaxParameterCount = cpu_to_le16(2);
-- pSMB->MaxDataCount = cpu_to_le16(1000); /* BB find max SMB PDU from sess */
-+ /* BB find exact max SMB PDU from sess structure BB */
-+ pSMB->MaxDataCount = cpu_to_le16(1000);
- pSMB->SetupCount = 1;
- pSMB->Reserved3 = 0;
- pSMB->SubCommand = cpu_to_le16(TRANS2_SET_FILE_INFORMATION);
-@@ -4789,7 +4849,8 @@ CIFSSMBSetFileTimes(const int xid, struct cifsTconInfo *tcon,
-
- count = sizeof(FILE_BASIC_INFO);
- pSMB->MaxParameterCount = cpu_to_le16(2);
-- pSMB->MaxDataCount = cpu_to_le16(1000); /* BB find max SMB PDU from sess */
-+ /* BB find max SMB PDU from sess */
-+ pSMB->MaxDataCount = cpu_to_le16(1000);
- pSMB->SetupCount = 1;
- pSMB->Reserved3 = 0;
- pSMB->SubCommand = cpu_to_le16(TRANS2_SET_FILE_INFORMATION);
-@@ -4856,7 +4917,8 @@ SetTimesRetry:
- params = 6 + name_len;
- count = sizeof(FILE_BASIC_INFO);
- pSMB->MaxParameterCount = cpu_to_le16(2);
-- pSMB->MaxDataCount = cpu_to_le16(1000); /* BB find exact max SMB PDU from sess structure BB */
-+ /* BB find max SMB PDU from sess structure BB */
-+ pSMB->MaxDataCount = cpu_to_le16(1000);
- pSMB->MaxSetupCount = 0;
- pSMB->Reserved = 0;
- pSMB->Flags = 0;
-@@ -4986,7 +5048,8 @@ setPermsRetry:
- params = 6 + name_len;
- count = sizeof(FILE_UNIX_BASIC_INFO);
- pSMB->MaxParameterCount = cpu_to_le16(2);
-- pSMB->MaxDataCount = cpu_to_le16(1000); /* BB find exact max SMB PDU from sess structure BB */
-+ /* BB find max SMB PDU from sess structure BB */
-+ pSMB->MaxDataCount = cpu_to_le16(1000);
- pSMB->MaxSetupCount = 0;
- pSMB->Reserved = 0;
- pSMB->Flags = 0;
-@@ -5051,8 +5114,7 @@ setPermsRetry:
- if (rc)
- cFYI(1, ("SetPathInfo (perms) returned %d", rc));
-
-- if (pSMB)
-- cifs_buf_release(pSMB);
-+ cifs_buf_release(pSMB);
- if (rc == -EAGAIN)
- goto setPermsRetry;
- return rc;
-@@ -5169,7 +5231,8 @@ QAllEAsRetry:
- params = 2 /* level */ + 4 /* reserved */ + name_len /* includes NUL */;
- pSMB->TotalDataCount = 0;
- pSMB->MaxParameterCount = cpu_to_le16(2);
-- pSMB->MaxDataCount = cpu_to_le16(4000); /* BB find exact max SMB PDU from sess structure BB */
-+ /* BB find exact max SMB PDU from sess structure BB */
-+ pSMB->MaxDataCount = cpu_to_le16(4000);
- pSMB->MaxSetupCount = 0;
- pSMB->Reserved = 0;
- pSMB->Flags = 0;
-@@ -5273,8 +5336,7 @@ QAllEAsRetry:
- }
- }
- }
-- if (pSMB)
-- cifs_buf_release(pSMB);
-+ cifs_buf_release(pSMB);
- if (rc == -EAGAIN)
- goto QAllEAsRetry;
-
-@@ -5317,7 +5379,8 @@ QEARetry:
- params = 2 /* level */ + 4 /* reserved */ + name_len /* includes NUL */;
- pSMB->TotalDataCount = 0;
- pSMB->MaxParameterCount = cpu_to_le16(2);
-- pSMB->MaxDataCount = cpu_to_le16(4000); /* BB find exact max SMB PDU from sess structure BB */
-+ /* BB find exact max SMB PDU from sess structure BB */
-+ pSMB->MaxDataCount = cpu_to_le16(4000);
- pSMB->MaxSetupCount = 0;
- pSMB->Reserved = 0;
- pSMB->Flags = 0;
-@@ -5422,8 +5485,7 @@ QEARetry:
- }
- }
- }
-- if (pSMB)
-- cifs_buf_release(pSMB);
-+ cifs_buf_release(pSMB);
- if (rc == -EAGAIN)
- goto QEARetry;
-
-@@ -5475,7 +5537,8 @@ SetEARetry:
-
- count = sizeof(*parm_data) + ea_value_len + name_len;
- pSMB->MaxParameterCount = cpu_to_le16(2);
-- pSMB->MaxDataCount = cpu_to_le16(1000); /* BB find max SMB size from sess */
-+ /* BB find max SMB PDU from sess */
-+ pSMB->MaxDataCount = cpu_to_le16(1000);
- pSMB->MaxSetupCount = 0;
- pSMB->Reserved = 0;
- pSMB->Flags = 0;
-diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
-index f428bf3..023434f 100644
---- a/fs/cifs/connect.c
-+++ b/fs/cifs/connect.c
-@@ -60,7 +60,7 @@ struct smb_vol {
- char *domainname;
- char *UNC;
- char *UNCip;
-- char *in6_addr; /* ipv6 address as human readable form of in6_addr */
-+ char *in6_addr; /* ipv6 address as human readable form of in6_addr */
- char *iocharset; /* local code page for mapping to and from Unicode */
- char source_rfc1001_name[16]; /* netbios name of client */
- char target_rfc1001_name[16]; /* netbios name of server for Win9x/ME */
-@@ -75,19 +75,21 @@ struct smb_vol {
- bool setuids:1;
- bool override_uid:1;
- bool override_gid:1;
-+ bool dynperm:1;
- bool noperm:1;
- bool no_psx_acl:1; /* set if posix acl support should be disabled */
- bool cifs_acl:1;
- bool no_xattr:1; /* set if xattr (EA) support should be disabled*/
- bool server_ino:1; /* use inode numbers from server ie UniqueId */
- bool direct_io:1;
-- bool remap:1; /* set to remap seven reserved chars in filenames */
-- bool posix_paths:1; /* unset to not ask for posix pathnames. */
-+ bool remap:1; /* set to remap seven reserved chars in filenames */
-+ bool posix_paths:1; /* unset to not ask for posix pathnames. */
- bool no_linux_ext:1;
- bool sfu_emul:1;
-- bool nullauth:1; /* attempt to authenticate with null user */
-- unsigned nocase; /* request case insensitive filenames */
-- unsigned nobrl; /* disable sending byte range locks to srv */
-+ bool nullauth:1; /* attempt to authenticate with null user */
-+ bool nocase:1; /* request case insensitive filenames */
-+ bool nobrl:1; /* disable sending byte range locks to srv */
-+ bool seal:1; /* request transport encryption on share */
- unsigned int rsize;
- unsigned int wsize;
- unsigned int sockopt;
-@@ -1246,6 +1248,10 @@ cifs_parse_mount_options(char *options, const char *devname,
- vol->setuids = 1;
- } else if (strnicmp(data, "nosetuids", 9) == 0) {
- vol->setuids = 0;
-+ } else if (strnicmp(data, "dynperm", 7) == 0) {
-+ vol->dynperm = true;
-+ } else if (strnicmp(data, "nodynperm", 9) == 0) {
-+ vol->dynperm = false;
- } else if (strnicmp(data, "nohard", 6) == 0) {
- vol->retry = 0;
- } else if (strnicmp(data, "nosoft", 6) == 0) {
-@@ -1268,8 +1274,12 @@ cifs_parse_mount_options(char *options, const char *devname,
- vol->no_psx_acl = 1;
- } else if (strnicmp(data, "sign", 4) == 0) {
- vol->secFlg |= CIFSSEC_MUST_SIGN;
--/* } else if (strnicmp(data, "seal",4) == 0) {
-- vol->secFlg |= CIFSSEC_MUST_SEAL; */
-+ } else if (strnicmp(data, "seal", 4) == 0) {
-+ /* we do not do the following in secFlags because seal
-+ is a per tree connection (mount) not a per socket
-+ or per-smb connection option in the protocol */
-+ /* vol->secFlg |= CIFSSEC_MUST_SEAL; */
-+ vol->seal = 1;
- } else if (strnicmp(data, "direct", 6) == 0) {
- vol->direct_io = 1;
- } else if (strnicmp(data, "forcedirectio", 13) == 0) {
-@@ -1414,34 +1424,12 @@ find_unc(__be32 new_target_ip_addr, char *uncName, char *userName)
- }
-
- int
--connect_to_dfs_path(int xid, struct cifsSesInfo *pSesInfo,
-- const char *old_path, const struct nls_table *nls_codepage,
-- int remap)
--{
-- struct dfs_info3_param *referrals = NULL;
-- unsigned int num_referrals;
-- int rc = 0;
--
-- rc = get_dfs_path(xid, pSesInfo, old_path, nls_codepage,
-- &num_referrals, &referrals, remap);
--
-- /* BB Add in code to: if valid refrl, if not ip address contact
-- the helper that resolves tcp names, mount to it, try to
-- tcon to it unmount it if fail */
--
-- kfree(referrals);
--
-- return rc;
--}
--
--int
- get_dfs_path(int xid, struct cifsSesInfo *pSesInfo, const char *old_path,
- const struct nls_table *nls_codepage, unsigned int *pnum_referrals,
- struct dfs_info3_param **preferrals, int remap)
- {
- char *temp_unc;
- int rc = 0;
-- unsigned char *targetUNCs;
-
- *pnum_referrals = 0;
- *preferrals = NULL;
-@@ -1464,7 +1452,7 @@ get_dfs_path(int xid, struct cifsSesInfo *pSesInfo, const char *old_path,
- kfree(temp_unc);
- }
- if (rc == 0)
-- rc = CIFSGetDFSRefer(xid, pSesInfo, old_path, &targetUNCs,
-+ rc = CIFSGetDFSRefer(xid, pSesInfo, old_path, preferrals,
- pnum_referrals, nls_codepage, remap);
- /* BB map targetUNCs to dfs_info3 structures, here or
- in CIFSGetDFSRefer BB */
-@@ -1815,7 +1803,7 @@ convert_delimiter(char *path, char delim)
- if (path == NULL)
- return;
-
-- if (delim == '/')
-+ if (delim == '/')
- old_delim = '\\';
- else
- old_delim = '/';
-@@ -2125,6 +2113,8 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
- cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_UID;
- if (volume_info.override_gid)
- cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_GID;
-+ if (volume_info.dynperm)
-+ cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DYNPERM;
- if (volume_info.direct_io) {
- cFYI(1, ("mounting share using direct i/o"));
- cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO;
-@@ -2141,6 +2131,9 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
- for the retry flag is used */
- tcon->retry = volume_info.retry;
- tcon->nocase = volume_info.nocase;
-+ if (tcon->seal != volume_info.seal)
-+ cERROR(1, ("transport encryption setting "
-+ "conflicts with existing tid"));
- } else {
- tcon = tconInfoAlloc();
- if (tcon == NULL)
-@@ -2154,10 +2147,11 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
- if ((strchr(volume_info.UNC + 3, '\\') == NULL)
- && (strchr(volume_info.UNC + 3, '/') ==
- NULL)) {
-- rc = connect_to_dfs_path(xid, pSesInfo,
-+/* rc = connect_to_dfs_path(xid, pSesInfo,
- "", cifs_sb->local_nls,
- cifs_sb->mnt_cifs_flags &
-- CIFS_MOUNT_MAP_SPECIAL_CHR);
-+ CIFS_MOUNT_MAP_SPECIAL_CHR);*/
-+ cFYI(1, ("DFS root not supported"));
- rc = -ENODEV;
- goto out;
- } else {
-@@ -2173,6 +2167,7 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
- atomic_inc(&pSesInfo->inUse);
- tcon->retry = volume_info.retry;
- tcon->nocase = volume_info.nocase;
-+ tcon->seal = volume_info.seal;
- }
- }
- }
-@@ -2314,9 +2309,10 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses,
- user = ses->userName;
- domain = ses->domainName;
- smb_buffer = cifs_buf_get();
-- if (smb_buffer == NULL) {
-+
-+ if (smb_buffer == NULL)
- return -ENOMEM;
-- }
-+
- smb_buffer_response = smb_buffer;
- pSMBr = pSMB = (SESSION_SETUP_ANDX *) smb_buffer;
-
-diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c
-index e4e0078..f0b5b5f 100644
---- a/fs/cifs/dir.c
-+++ b/fs/cifs/dir.c
-@@ -49,18 +49,25 @@ build_path_from_dentry(struct dentry *direntry)
- struct dentry *temp;
- int namelen;
- int pplen;
-+ int dfsplen;
- char *full_path;
- char dirsep;
-+ struct cifs_sb_info *cifs_sb;
-
- if (direntry == NULL)
- return NULL; /* not much we can do if dentry is freed and
- we need to reopen the file after it was closed implicitly
- when the server crashed */
-
-- dirsep = CIFS_DIR_SEP(CIFS_SB(direntry->d_sb));
-- pplen = CIFS_SB(direntry->d_sb)->prepathlen;
-+ cifs_sb = CIFS_SB(direntry->d_sb);
-+ dirsep = CIFS_DIR_SEP(cifs_sb);
-+ pplen = cifs_sb->prepathlen;
-+ if (cifs_sb->tcon && (cifs_sb->tcon->Flags & SMB_SHARE_IS_IN_DFS))
-+ dfsplen = strnlen(cifs_sb->tcon->treeName, MAX_TREE_SIZE + 1);
-+ else
-+ dfsplen = 0;
- cifs_bp_rename_retry:
-- namelen = pplen;
-+ namelen = pplen + dfsplen;
- for (temp = direntry; !IS_ROOT(temp);) {
- namelen += (1 + temp->d_name.len);
- temp = temp->d_parent;
-@@ -91,7 +98,7 @@ cifs_bp_rename_retry:
- return NULL;
- }
- }
-- if (namelen != pplen) {
-+ if (namelen != pplen + dfsplen) {
- cERROR(1,
- ("did not end path lookup where expected namelen is %d",
- namelen));
-@@ -107,7 +114,18 @@ cifs_bp_rename_retry:
- since the '\' is a valid posix character so we can not switch
- those safely to '/' if any are found in the middle of the prepath */
- /* BB test paths to Windows with '/' in the midst of prepath */
-- strncpy(full_path, CIFS_SB(direntry->d_sb)->prepath, pplen);
-+
-+ if (dfsplen) {
-+ strncpy(full_path, cifs_sb->tcon->treeName, dfsplen);
-+ if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS) {
-+ int i;
-+ for (i = 0; i < dfsplen; i++) {
-+ if (full_path[i] == '\\')
-+ full_path[i] = '/';
-+ }
-+ }
-+ }
-+ strncpy(full_path + dfsplen, CIFS_SB(direntry->d_sb)->prepath, pplen);
- return full_path;
- }
-
-@@ -590,7 +608,7 @@ static int cifs_ci_compare(struct dentry *dentry, struct qstr *a,
- * case take precedence. If a is not a negative dentry, this
- * should have no side effects
- */
-- memcpy(a->name, b->name, a->len);
-+ memcpy((void *)a->name, b->name, a->len);
- return 0;
- }
- return 1;
-diff --git a/fs/cifs/dns_resolve.c b/fs/cifs/dns_resolve.c
-index 939e256..f730ef3 100644
---- a/fs/cifs/dns_resolve.c
-+++ b/fs/cifs/dns_resolve.c
-@@ -134,10 +134,6 @@ dns_resolve_server_name_to_ip(const char *unc, char **ip_addr)
- rkey = request_key(&key_type_dns_resolver, name, "");
- if (!IS_ERR(rkey)) {
- data = rkey->payload.data;
-- cFYI(1, ("%s: resolved: %s to %s", __func__,
-- rkey->description,
-- *ip_addr
-- ));
- } else {
- cERROR(1, ("%s: unable to resolve: %s", __func__, name));
- goto out;
-@@ -150,6 +146,11 @@ skip_upcall:
- if (*ip_addr) {
- memcpy(*ip_addr, data, len);
- (*ip_addr)[len] = '\0';
-+ if (!IS_ERR(rkey))
-+ cFYI(1, ("%s: resolved: %s to %s", __func__,
-+ name,
-+ *ip_addr
-+ ));
- rc = 0;
- } else {
- rc = -ENOMEM;
-diff --git a/fs/cifs/file.c b/fs/cifs/file.c
-index 31a0a33..8636cec 100644
---- a/fs/cifs/file.c
-+++ b/fs/cifs/file.c
-@@ -75,7 +75,11 @@ static inline int cifs_convert_flags(unsigned int flags)
- return (GENERIC_READ | GENERIC_WRITE);
- }
-
-- return 0x20197;
-+ return (READ_CONTROL | FILE_WRITE_ATTRIBUTES | FILE_READ_ATTRIBUTES |
-+ FILE_WRITE_EA | FILE_APPEND_DATA | FILE_WRITE_DATA |
-+ FILE_READ_DATA);
-+
-+
- }
-
- static inline int cifs_get_disposition(unsigned int flags)
-diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c
-index fcbdbb6..129dbfe 100644
---- a/fs/cifs/inode.c
-+++ b/fs/cifs/inode.c
-@@ -161,118 +161,115 @@ static void cifs_unix_info_to_inode(struct inode *inode,
- spin_unlock(&inode->i_lock);
- }
-
--static const unsigned char *cifs_get_search_path(struct cifs_sb_info *cifs_sb,
-- const char *search_path)
--{
-- int tree_len;
-- int path_len;
-- int i;
-- char *tmp_path;
-- struct cifsTconInfo *pTcon = cifs_sb->tcon;
--
-- if (!(pTcon->Flags & SMB_SHARE_IS_IN_DFS))
-- return search_path;
-
-- /* use full path name for working with DFS */
-- tree_len = strnlen(pTcon->treeName, MAX_TREE_SIZE + 1);
-- path_len = strnlen(search_path, MAX_PATHCONF);
--
-- tmp_path = kmalloc(tree_len+path_len+1, GFP_KERNEL);
-- if (tmp_path == NULL)
-- return search_path;
-+/*
-+ * Needed to setup inode data for the directory which is the
-+ * junction to the new submount (ie to setup the fake directory
-+ * which represents a DFS referral)
-+ */
-+static void fill_fake_finddataunix(FILE_UNIX_BASIC_INFO *pfnd_dat,
-+ struct super_block *sb)
-+{
-+ struct inode *pinode = NULL;
-+
-+ memset(pfnd_dat, 0, sizeof(FILE_UNIX_BASIC_INFO));
-+
-+/* __le64 pfnd_dat->EndOfFile = cpu_to_le64(0);
-+ __le64 pfnd_dat->NumOfBytes = cpu_to_le64(0);
-+ __u64 UniqueId = 0; */
-+ pfnd_dat->LastStatusChange =
-+ cpu_to_le64(cifs_UnixTimeToNT(CURRENT_TIME));
-+ pfnd_dat->LastAccessTime =
-+ cpu_to_le64(cifs_UnixTimeToNT(CURRENT_TIME));
-+ pfnd_dat->LastModificationTime =
-+ cpu_to_le64(cifs_UnixTimeToNT(CURRENT_TIME));
-+ pfnd_dat->Type = cpu_to_le32(UNIX_DIR);
-+ pfnd_dat->Permissions = cpu_to_le64(S_IXUGO | S_IRWXU);
-+ pfnd_dat->Nlinks = cpu_to_le64(2);
-+ if (sb->s_root)
-+ pinode = sb->s_root->d_inode;
-+ if (pinode == NULL)
-+ return;
-
-- strncpy(tmp_path, pTcon->treeName, tree_len);
-- if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS)
-- for (i = 0; i < tree_len; i++) {
-- if (tmp_path[i] == '\\')
-- tmp_path[i] = '/';
-- }
-- strncpy(tmp_path+tree_len, search_path, path_len);
-- tmp_path[tree_len+path_len] = 0;
-- return tmp_path;
-+ /* fill in default values for the remaining based on root
-+ inode since we can not query the server for this inode info */
-+ pfnd_dat->DevMajor = cpu_to_le64(MAJOR(pinode->i_rdev));
-+ pfnd_dat->DevMinor = cpu_to_le64(MINOR(pinode->i_rdev));
-+ pfnd_dat->Uid = cpu_to_le64(pinode->i_uid);
-+ pfnd_dat->Gid = cpu_to_le64(pinode->i_gid);
- }
-
- int cifs_get_inode_info_unix(struct inode **pinode,
-- const unsigned char *search_path, struct super_block *sb, int xid)
-+ const unsigned char *full_path, struct super_block *sb, int xid)
- {
- int rc = 0;
-- FILE_UNIX_BASIC_INFO findData;
-+ FILE_UNIX_BASIC_INFO find_data;
- struct cifsTconInfo *pTcon;
- struct inode *inode;
- struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
-- const unsigned char *full_path;
- bool is_dfs_referral = false;
-+ struct cifsInodeInfo *cifsInfo;
-+ __u64 num_of_bytes;
-+ __u64 end_of_file;
-
- pTcon = cifs_sb->tcon;
-- cFYI(1, ("Getting info on %s", search_path));
-+ cFYI(1, ("Getting info on %s", full_path));
-
-- full_path = cifs_get_search_path(cifs_sb, search_path);
--
--try_again_CIFSSMBUnixQPathInfo:
- /* could have done a find first instead but this returns more info */
-- rc = CIFSSMBUnixQPathInfo(xid, pTcon, full_path, &findData,
-+ rc = CIFSSMBUnixQPathInfo(xid, pTcon, full_path, &find_data,
- cifs_sb->local_nls, cifs_sb->mnt_cifs_flags &
- CIFS_MOUNT_MAP_SPECIAL_CHR);
--/* dump_mem("\nUnixQPathInfo return data", &findData,
-- sizeof(findData)); */
- if (rc) {
- if (rc == -EREMOTE && !is_dfs_referral) {
- is_dfs_referral = true;
-- if (full_path != search_path) {
-- kfree(full_path);
-- full_path = search_path;
-- }
-- goto try_again_CIFSSMBUnixQPathInfo;
-+ cFYI(DBG2, ("DFS ref"));
-+ /* for DFS, server does not give us real inode data */
-+ fill_fake_finddataunix(&find_data, sb);
-+ rc = 0;
- }
-- goto cgiiu_exit;
-- } else {
-- struct cifsInodeInfo *cifsInfo;
-- __u64 num_of_bytes = le64_to_cpu(findData.NumOfBytes);
-- __u64 end_of_file = le64_to_cpu(findData.EndOfFile);
-+ }
-+ num_of_bytes = le64_to_cpu(find_data.NumOfBytes);
-+ end_of_file = le64_to_cpu(find_data.EndOfFile);
-
-- /* get new inode */
-+ /* get new inode */
-+ if (*pinode == NULL) {
-+ *pinode = new_inode(sb);
- if (*pinode == NULL) {
-- *pinode = new_inode(sb);
-- if (*pinode == NULL) {
-- rc = -ENOMEM;
-- goto cgiiu_exit;
-- }
-- /* Is an i_ino of zero legal? */
-- /* Are there sanity checks we can use to ensure that
-- the server is really filling in that field? */
-- if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) {
-- (*pinode)->i_ino =
-- (unsigned long)findData.UniqueId;
-- } /* note ino incremented to unique num in new_inode */
-- if (sb->s_flags & MS_NOATIME)
-- (*pinode)->i_flags |= S_NOATIME | S_NOCMTIME;
--
-- insert_inode_hash(*pinode);
-+ rc = -ENOMEM;
-+ goto cgiiu_exit;
- }
-+ /* Is an i_ino of zero legal? */
-+ /* note ino incremented to unique num in new_inode */
-+ /* Are there sanity checks we can use to ensure that
-+ the server is really filling in that field? */
-+ if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)
-+ (*pinode)->i_ino = (unsigned long)find_data.UniqueId;
-
-- inode = *pinode;
-- cifsInfo = CIFS_I(inode);
-+ if (sb->s_flags & MS_NOATIME)
-+ (*pinode)->i_flags |= S_NOATIME | S_NOCMTIME;
-
-- cFYI(1, ("Old time %ld", cifsInfo->time));
-- cifsInfo->time = jiffies;
-- cFYI(1, ("New time %ld", cifsInfo->time));
-- /* this is ok to set on every inode revalidate */
-- atomic_set(&cifsInfo->inUse, 1);
-+ insert_inode_hash(*pinode);
-+ }
-
-- cifs_unix_info_to_inode(inode, &findData, 0);
-+ inode = *pinode;
-+ cifsInfo = CIFS_I(inode);
-
-+ cFYI(1, ("Old time %ld", cifsInfo->time));
-+ cifsInfo->time = jiffies;
-+ cFYI(1, ("New time %ld", cifsInfo->time));
-+ /* this is ok to set on every inode revalidate */
-+ atomic_set(&cifsInfo->inUse, 1);
-
-- if (num_of_bytes < end_of_file)
-- cFYI(1, ("allocation size less than end of file"));
-- cFYI(1, ("Size %ld and blocks %llu",
-- (unsigned long) inode->i_size,
-- (unsigned long long)inode->i_blocks));
-+ cifs_unix_info_to_inode(inode, &find_data, 0);
-
-- cifs_set_ops(inode, is_dfs_referral);
-- }
-+ if (num_of_bytes < end_of_file)
-+ cFYI(1, ("allocation size less than end of file"));
-+ cFYI(1, ("Size %ld and blocks %llu",
-+ (unsigned long) inode->i_size,
-+ (unsigned long long)inode->i_blocks));
-+
-+ cifs_set_ops(inode, is_dfs_referral);
- cgiiu_exit:
-- if (full_path != search_path)
-- kfree(full_path);
- return rc;
- }
-
-@@ -379,21 +376,51 @@ static int get_sfu_mode(struct inode *inode,
- #endif
- }
-
-+/*
-+ * Needed to setup inode data for the directory which is the
-+ * junction to the new submount (ie to setup the fake directory
-+ * which represents a DFS referral)
-+ */
-+static void fill_fake_finddata(FILE_ALL_INFO *pfnd_dat,
-+ struct super_block *sb)
-+{
-+ memset(pfnd_dat, 0, sizeof(FILE_ALL_INFO));
-+
-+/* __le64 pfnd_dat->AllocationSize = cpu_to_le64(0);
-+ __le64 pfnd_dat->EndOfFile = cpu_to_le64(0);
-+ __u8 pfnd_dat->DeletePending = 0;
-+ __u8 pfnd_data->Directory = 0;
-+ __le32 pfnd_dat->EASize = 0;
-+ __u64 pfnd_dat->IndexNumber = 0;
-+ __u64 pfnd_dat->IndexNumber1 = 0; */
-+ pfnd_dat->CreationTime =
-+ cpu_to_le64(cifs_UnixTimeToNT(CURRENT_TIME));
-+ pfnd_dat->LastAccessTime =
-+ cpu_to_le64(cifs_UnixTimeToNT(CURRENT_TIME));
-+ pfnd_dat->LastWriteTime =
-+ cpu_to_le64(cifs_UnixTimeToNT(CURRENT_TIME));
-+ pfnd_dat->ChangeTime =
-+ cpu_to_le64(cifs_UnixTimeToNT(CURRENT_TIME));
-+ pfnd_dat->Attributes = cpu_to_le32(ATTR_DIRECTORY);
-+ pfnd_dat->NumberOfLinks = cpu_to_le32(2);
-+}
-+
- int cifs_get_inode_info(struct inode **pinode,
-- const unsigned char *search_path, FILE_ALL_INFO *pfindData,
-+ const unsigned char *full_path, FILE_ALL_INFO *pfindData,
- struct super_block *sb, int xid, const __u16 *pfid)
- {
- int rc = 0;
-+ __u32 attr;
-+ struct cifsInodeInfo *cifsInfo;
- struct cifsTconInfo *pTcon;
- struct inode *inode;
- struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
-- const unsigned char *full_path = NULL;
- char *buf = NULL;
- bool adjustTZ = false;
- bool is_dfs_referral = false;
-
- pTcon = cifs_sb->tcon;
-- cFYI(1, ("Getting info on %s", search_path));
-+ cFYI(1, ("Getting info on %s", full_path));
-
- if ((pfindData == NULL) && (*pinode != NULL)) {
- if (CIFS_I(*pinode)->clientCanCacheRead) {
-@@ -409,9 +436,6 @@ int cifs_get_inode_info(struct inode **pinode,
- return -ENOMEM;
- pfindData = (FILE_ALL_INFO *)buf;
-
-- full_path = cifs_get_search_path(cifs_sb, search_path);
--
--try_again_CIFSSMBQPathInfo:
- /* could do find first instead but this returns more info */
- rc = CIFSSMBQPathInfo(xid, pTcon, full_path, pfindData,
- 0 /* not legacy */,
-@@ -429,178 +453,168 @@ try_again_CIFSSMBQPathInfo:
- }
- }
- /* dump_mem("\nQPathInfo return data",&findData, sizeof(findData)); */
-- if (rc) {
-- if (rc == -EREMOTE && !is_dfs_referral) {
-- is_dfs_referral = true;
-- if (full_path != search_path) {
-- kfree(full_path);
-- full_path = search_path;
-- }
-- goto try_again_CIFSSMBQPathInfo;
-- }
-+ if (rc == -EREMOTE) {
-+ is_dfs_referral = true;
-+ fill_fake_finddata(pfindData, sb);
-+ rc = 0;
-+ } else if (rc)
- goto cgii_exit;
-- } else {
-- struct cifsInodeInfo *cifsInfo;
-- __u32 attr = le32_to_cpu(pfindData->Attributes);
-
-- /* get new inode */
-- if (*pinode == NULL) {
-- *pinode = new_inode(sb);
-- if (*pinode == NULL) {
-- rc = -ENOMEM;
-- goto cgii_exit;
-- }
-- /* Is an i_ino of zero legal? Can we use that to check
-- if the server supports returning inode numbers? Are
-- there other sanity checks we can use to ensure that
-- the server is really filling in that field? */
-+ attr = le32_to_cpu(pfindData->Attributes);
-
-- /* We can not use the IndexNumber field by default from
-- Windows or Samba (in ALL_INFO buf) but we can request
-- it explicitly. It may not be unique presumably if
-- the server has multiple devices mounted under one
-- share */
--
-- /* There may be higher info levels that work but are
-- there Windows server or network appliances for which
-- IndexNumber field is not guaranteed unique? */
--
-- if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) {
-- int rc1 = 0;
-- __u64 inode_num;
--
-- rc1 = CIFSGetSrvInodeNumber(xid, pTcon,
-- search_path, &inode_num,
-+ /* get new inode */
-+ if (*pinode == NULL) {
-+ *pinode = new_inode(sb);
-+ if (*pinode == NULL) {
-+ rc = -ENOMEM;
-+ goto cgii_exit;
-+ }
-+ /* Is an i_ino of zero legal? Can we use that to check
-+ if the server supports returning inode numbers? Are
-+ there other sanity checks we can use to ensure that
-+ the server is really filling in that field? */
-+
-+ /* We can not use the IndexNumber field by default from
-+ Windows or Samba (in ALL_INFO buf) but we can request
-+ it explicitly. It may not be unique presumably if
-+ the server has multiple devices mounted under one share */
-+
-+ /* There may be higher info levels that work but are
-+ there Windows server or network appliances for which
-+ IndexNumber field is not guaranteed unique? */
-+
-+ if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) {
-+ int rc1 = 0;
-+ __u64 inode_num;
-+
-+ rc1 = CIFSGetSrvInodeNumber(xid, pTcon,
-+ full_path, &inode_num,
- cifs_sb->local_nls,
- cifs_sb->mnt_cifs_flags &
- CIFS_MOUNT_MAP_SPECIAL_CHR);
-- if (rc1) {
-- cFYI(1, ("GetSrvInodeNum rc %d", rc1));
-- /* BB EOPNOSUPP disable SERVER_INUM? */
-- } else /* do we need cast or hash to ino? */
-- (*pinode)->i_ino = inode_num;
-- } /* else ino incremented to unique num in new_inode*/
-- if (sb->s_flags & MS_NOATIME)
-- (*pinode)->i_flags |= S_NOATIME | S_NOCMTIME;
-- insert_inode_hash(*pinode);
-- }
-- inode = *pinode;
-- cifsInfo = CIFS_I(inode);
-- cifsInfo->cifsAttrs = attr;
-- cFYI(1, ("Old time %ld", cifsInfo->time));
-- cifsInfo->time = jiffies;
-- cFYI(1, ("New time %ld", cifsInfo->time));
--
-- /* blksize needs to be multiple of two. So safer to default to
-- blksize and blkbits set in superblock so 2**blkbits and blksize
-- will match rather than setting to:
-- (pTcon->ses->server->maxBuf - MAX_CIFS_HDR_SIZE) & 0xFFFFFE00;*/
--
-- /* Linux can not store file creation time so ignore it */
-- if (pfindData->LastAccessTime)
-- inode->i_atime = cifs_NTtimeToUnix
-- (le64_to_cpu(pfindData->LastAccessTime));
-- else /* do not need to use current_fs_time - time not stored */
-- inode->i_atime = CURRENT_TIME;
-- inode->i_mtime =
-+ if (rc1) {
-+ cFYI(1, ("GetSrvInodeNum rc %d", rc1));
-+ /* BB EOPNOSUPP disable SERVER_INUM? */
-+ } else /* do we need cast or hash to ino? */
-+ (*pinode)->i_ino = inode_num;
-+ } /* else ino incremented to unique num in new_inode*/
-+ if (sb->s_flags & MS_NOATIME)
-+ (*pinode)->i_flags |= S_NOATIME | S_NOCMTIME;
-+ insert_inode_hash(*pinode);
-+ }
-+ inode = *pinode;
-+ cifsInfo = CIFS_I(inode);
-+ cifsInfo->cifsAttrs = attr;
-+ cFYI(1, ("Old time %ld", cifsInfo->time));
-+ cifsInfo->time = jiffies;
-+ cFYI(1, ("New time %ld", cifsInfo->time));
-+
-+ /* blksize needs to be multiple of two. So safer to default to
-+ blksize and blkbits set in superblock so 2**blkbits and blksize
-+ will match rather than setting to:
-+ (pTcon->ses->server->maxBuf - MAX_CIFS_HDR_SIZE) & 0xFFFFFE00;*/
-+
-+ /* Linux can not store file creation time so ignore it */
-+ if (pfindData->LastAccessTime)
-+ inode->i_atime = cifs_NTtimeToUnix
-+ (le64_to_cpu(pfindData->LastAccessTime));
-+ else /* do not need to use current_fs_time - time not stored */
-+ inode->i_atime = CURRENT_TIME;
-+ inode->i_mtime =
- cifs_NTtimeToUnix(le64_to_cpu(pfindData->LastWriteTime));
-- inode->i_ctime =
-- cifs_NTtimeToUnix(le64_to_cpu(pfindData->ChangeTime));
-- cFYI(0, ("Attributes came in as 0x%x", attr));
-- if (adjustTZ && (pTcon->ses) && (pTcon->ses->server)) {
-- inode->i_ctime.tv_sec += pTcon->ses->server->timeAdj;
-- inode->i_mtime.tv_sec += pTcon->ses->server->timeAdj;
-- }
-+ inode->i_ctime =
-+ cifs_NTtimeToUnix(le64_to_cpu(pfindData->ChangeTime));
-+ cFYI(DBG2, ("Attributes came in as 0x%x", attr));
-+ if (adjustTZ && (pTcon->ses) && (pTcon->ses->server)) {
-+ inode->i_ctime.tv_sec += pTcon->ses->server->timeAdj;
-+ inode->i_mtime.tv_sec += pTcon->ses->server->timeAdj;
-+ }
-
-- /* set default mode. will override for dirs below */
-- if (atomic_read(&cifsInfo->inUse) == 0)
-- /* new inode, can safely set these fields */
-- inode->i_mode = cifs_sb->mnt_file_mode;
-- else /* since we set the inode type below we need to mask off
-- to avoid strange results if type changes and both
-- get orred in */
-- inode->i_mode &= ~S_IFMT;
--/* if (attr & ATTR_REPARSE) */
-- /* We no longer handle these as symlinks because we could not
-- follow them due to the absolute path with drive letter */
-- if (attr & ATTR_DIRECTORY) {
-- /* override default perms since we do not do byte range locking
-- on dirs */
-- inode->i_mode = cifs_sb->mnt_dir_mode;
-- inode->i_mode |= S_IFDIR;
-- } else if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) &&
-- (cifsInfo->cifsAttrs & ATTR_SYSTEM) &&
-- /* No need to le64 convert size of zero */
-- (pfindData->EndOfFile == 0)) {
-- inode->i_mode = cifs_sb->mnt_file_mode;
-- inode->i_mode |= S_IFIFO;
-+ /* set default mode. will override for dirs below */
-+ if (atomic_read(&cifsInfo->inUse) == 0)
-+ /* new inode, can safely set these fields */
-+ inode->i_mode = cifs_sb->mnt_file_mode;
-+ else /* since we set the inode type below we need to mask off
-+ to avoid strange results if type changes and both
-+ get orred in */
-+ inode->i_mode &= ~S_IFMT;
-+/* if (attr & ATTR_REPARSE) */
-+ /* We no longer handle these as symlinks because we could not
-+ follow them due to the absolute path with drive letter */
-+ if (attr & ATTR_DIRECTORY) {
-+ /* override default perms since we do not do byte range locking
-+ on dirs */
-+ inode->i_mode = cifs_sb->mnt_dir_mode;
-+ inode->i_mode |= S_IFDIR;
-+ } else if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) &&
-+ (cifsInfo->cifsAttrs & ATTR_SYSTEM) &&
-+ /* No need to le64 convert size of zero */
-+ (pfindData->EndOfFile == 0)) {
-+ inode->i_mode = cifs_sb->mnt_file_mode;
-+ inode->i_mode |= S_IFIFO;
- /* BB Finish for SFU style symlinks and devices */
-- } else if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) &&
-- (cifsInfo->cifsAttrs & ATTR_SYSTEM)) {
-- if (decode_sfu_inode(inode,
-- le64_to_cpu(pfindData->EndOfFile),
-- search_path,
-- cifs_sb, xid))
-- cFYI(1, ("Unrecognized sfu inode type"));
--
-- cFYI(1, ("sfu mode 0%o", inode->i_mode));
-- } else {
-- inode->i_mode |= S_IFREG;
-- /* treat the dos attribute of read-only as read-only
-- mode e.g. 555 */
-- if (cifsInfo->cifsAttrs & ATTR_READONLY)
-- inode->i_mode &= ~(S_IWUGO);
-- else if ((inode->i_mode & S_IWUGO) == 0)
-- /* the ATTR_READONLY flag may have been */
-- /* changed on server -- set any w bits */
-- /* allowed by mnt_file_mode */
-- inode->i_mode |= (S_IWUGO &
-- cifs_sb->mnt_file_mode);
-- /* BB add code here -
-- validate if device or weird share or device type? */
-- }
-+ } else if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) &&
-+ (cifsInfo->cifsAttrs & ATTR_SYSTEM)) {
-+ if (decode_sfu_inode(inode, le64_to_cpu(pfindData->EndOfFile),
-+ full_path, cifs_sb, xid))
-+ cFYI(1, ("Unrecognized sfu inode type"));
-
-- spin_lock(&inode->i_lock);
-- if (is_size_safe_to_change(cifsInfo,
-- le64_to_cpu(pfindData->EndOfFile))) {
-- /* can not safely shrink the file size here if the
-- client is writing to it due to potential races */
-- i_size_write(inode, le64_to_cpu(pfindData->EndOfFile));
--
-- /* 512 bytes (2**9) is the fake blocksize that must be
-- used for this calculation */
-- inode->i_blocks = (512 - 1 + le64_to_cpu(
-- pfindData->AllocationSize)) >> 9;
-- }
-- spin_unlock(&inode->i_lock);
-+ cFYI(1, ("sfu mode 0%o", inode->i_mode));
-+ } else {
-+ inode->i_mode |= S_IFREG;
-+ /* treat dos attribute of read-only as read-only mode eg 555 */
-+ if (cifsInfo->cifsAttrs & ATTR_READONLY)
-+ inode->i_mode &= ~(S_IWUGO);
-+ else if ((inode->i_mode & S_IWUGO) == 0)
-+ /* the ATTR_READONLY flag may have been */
-+ /* changed on server -- set any w bits */
-+ /* allowed by mnt_file_mode */
-+ inode->i_mode |= (S_IWUGO & cifs_sb->mnt_file_mode);
-+ /* BB add code to validate if device or weird share or device type? */
-+ }
-+
-+ spin_lock(&inode->i_lock);
-+ if (is_size_safe_to_change(cifsInfo,
-+ le64_to_cpu(pfindData->EndOfFile))) {
-+ /* can not safely shrink the file size here if the
-+ client is writing to it due to potential races */
-+ i_size_write(inode, le64_to_cpu(pfindData->EndOfFile));
-+
-+ /* 512 bytes (2**9) is the fake blocksize that must be
-+ used for this calculation */
-+ inode->i_blocks = (512 - 1 + le64_to_cpu(
-+ pfindData->AllocationSize)) >> 9;
-+ }
-+ spin_unlock(&inode->i_lock);
-
-- inode->i_nlink = le32_to_cpu(pfindData->NumberOfLinks);
-+ inode->i_nlink = le32_to_cpu(pfindData->NumberOfLinks);
-
-- /* BB fill in uid and gid here? with help from winbind?
-- or retrieve from NTFS stream extended attribute */
-+ /* BB fill in uid and gid here? with help from winbind?
-+ or retrieve from NTFS stream extended attribute */
- #ifdef CONFIG_CIFS_EXPERIMENTAL
-- /* fill in 0777 bits from ACL */
-- if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) {
-- cFYI(1, ("Getting mode bits from ACL"));
-- acl_to_uid_mode(inode, search_path, pfid);
-- }
-+ /* fill in 0777 bits from ACL */
-+ if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) {
-+ cFYI(1, ("Getting mode bits from ACL"));
-+ acl_to_uid_mode(inode, full_path, pfid);
-+ }
- #endif
-- if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) {
-- /* fill in remaining high mode bits e.g. SUID, VTX */
-- get_sfu_mode(inode, search_path, cifs_sb, xid);
-- } else if (atomic_read(&cifsInfo->inUse) == 0) {
-- inode->i_uid = cifs_sb->mnt_uid;
-- inode->i_gid = cifs_sb->mnt_gid;
-- /* set so we do not keep refreshing these fields with
-- bad data after user has changed them in memory */
-- atomic_set(&cifsInfo->inUse, 1);
-- }
--
-- cifs_set_ops(inode, is_dfs_referral);
-+ if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) {
-+ /* fill in remaining high mode bits e.g. SUID, VTX */
-+ get_sfu_mode(inode, full_path, cifs_sb, xid);
-+ } else if (atomic_read(&cifsInfo->inUse) == 0) {
-+ inode->i_uid = cifs_sb->mnt_uid;
-+ inode->i_gid = cifs_sb->mnt_gid;
-+ /* set so we do not keep refreshing these fields with
-+ bad data after user has changed them in memory */
-+ atomic_set(&cifsInfo->inUse, 1);
- }
-+
-+ cifs_set_ops(inode, is_dfs_referral);
-+
-+
-+
-+
- cgii_exit:
-- if (full_path != search_path)
-- kfree(full_path);
- kfree(buf);
- return rc;
- }
-@@ -1502,8 +1516,7 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs)
- int oplock = 0;
-
- rc = SMBLegacyOpen(xid, pTcon, full_path,
-- FILE_OPEN,
-- SYNCHRONIZE | FILE_WRITE_ATTRIBUTES,
-+ FILE_OPEN, GENERIC_WRITE,
- CREATE_NOT_DIR, &netfid, &oplock,
- NULL, cifs_sb->local_nls,
- cifs_sb->mnt_cifs_flags &
-diff --git a/fs/cifs/ioctl.c b/fs/cifs/ioctl.c
-index 5c792df..0088a5b 100644
---- a/fs/cifs/ioctl.c
-+++ b/fs/cifs/ioctl.c
-@@ -30,9 +30,9 @@
-
- #define CIFS_IOC_CHECKUMOUNT _IO(0xCF, 2)
-
--int cifs_ioctl(struct inode *inode, struct file *filep,
-- unsigned int command, unsigned long arg)
-+long cifs_ioctl(struct file *filep, unsigned int command, unsigned long arg)
- {
-+ struct inode *inode = filep->f_dentry->d_inode;
- int rc = -ENOTTY; /* strange error - but the precedent */
- int xid;
- struct cifs_sb_info *cifs_sb;
-diff --git a/fs/cifs/link.c b/fs/cifs/link.c
-index 1c2c3ce..63f6440 100644
---- a/fs/cifs/link.c
-+++ b/fs/cifs/link.c
-@@ -234,7 +234,6 @@ cifs_readlink(struct dentry *direntry, char __user *pBuffer, int buflen)
- struct cifs_sb_info *cifs_sb;
- struct cifsTconInfo *pTcon;
- char *full_path = NULL;
-- char *tmp_path = NULL;
- char *tmpbuffer;
- int len;
- __u16 fid;
-@@ -295,45 +294,9 @@ cifs_readlink(struct dentry *direntry, char __user *pBuffer, int buflen)
- cFYI(1, ("Error closing junction point "
- "(open for ioctl)"));
- }
-- /* BB unwind this long, nested function, or remove BB */
-- if (rc == -EIO) {
-- /* Query if DFS Junction */
-- unsigned int num_referrals = 0;
-- struct dfs_info3_param *refs = NULL;
-- tmp_path =
-- kmalloc(MAX_TREE_SIZE + MAX_PATHCONF + 1,
-- GFP_KERNEL);
-- if (tmp_path) {
-- strncpy(tmp_path, pTcon->treeName,
-- MAX_TREE_SIZE);
-- strncat(tmp_path, full_path,
-- MAX_PATHCONF);
-- rc = get_dfs_path(xid, pTcon->ses,
-- tmp_path,
-- cifs_sb->local_nls,
-- &num_referrals, &refs,
-- cifs_sb->mnt_cifs_flags &
-- CIFS_MOUNT_MAP_SPECIAL_CHR);
-- cFYI(1, ("Get DFS for %s rc = %d ",
-- tmp_path, rc));
-- if ((num_referrals == 0) && (rc == 0))
-- rc = -EACCES;
-- else {
-- cFYI(1, ("num referral: %d",
-- num_referrals));
-- if (refs && refs->path_name) {
-- strncpy(tmpbuffer,
-- refs->path_name,
-- len-1);
-- }
-- }
-- kfree(refs);
-- kfree(tmp_path);
--}
-- /* BB add code like else decode referrals
-- then memcpy to tmpbuffer and free referrals
-- string array BB */
-- }
-+ /* If it is a DFS junction earlier we would have gotten
-+ PATH_NOT_COVERED returned from server so we do
-+ not need to request the DFS info here */
- }
- }
- /* BB Anything else to do to handle recursive links? */
-diff --git a/fs/cifs/netmisc.c b/fs/cifs/netmisc.c
-index 00f4cff..8703d68 100644
---- a/fs/cifs/netmisc.c
-+++ b/fs/cifs/netmisc.c
-@@ -141,11 +141,11 @@ cifs_inet_pton(const int address_family, const char *cp, void *dst)
- int ret = 0;
-
- /* calculate length by finding first slash or NULL */
-- if (address_family == AF_INET) {
-+ if (address_family == AF_INET)
- ret = in4_pton(cp, -1 /* len */, dst, '\\', NULL);
-- } else if (address_family == AF_INET6) {
-+ else if (address_family == AF_INET6)
- ret = in6_pton(cp, -1 /* len */, dst , '\\', NULL);
-- }
-+
- cFYI(DBG2, ("address conversion returned %d for %s", ret, cp));
- if (ret > 0)
- ret = 1;
-diff --git a/fs/cifs/ntlmssp.h b/fs/cifs/ntlmssp.h
-index 7170a9b..c377d80 100644
---- a/fs/cifs/ntlmssp.h
-+++ b/fs/cifs/ntlmssp.h
-@@ -64,7 +64,7 @@ typedef struct _SECURITY_BUFFER {
- } __attribute__((packed)) SECURITY_BUFFER;
-
- typedef struct _NEGOTIATE_MESSAGE {
-- __u8 Signature[sizeof (NTLMSSP_SIGNATURE)];
-+ __u8 Signature[sizeof(NTLMSSP_SIGNATURE)];
- __le32 MessageType; /* 1 */
- __le32 NegotiateFlags;
- SECURITY_BUFFER DomainName; /* RFC 1001 style and ASCII */
-@@ -74,7 +74,7 @@ typedef struct _NEGOTIATE_MESSAGE {
- } __attribute__((packed)) NEGOTIATE_MESSAGE, *PNEGOTIATE_MESSAGE;
-
- typedef struct _CHALLENGE_MESSAGE {
-- __u8 Signature[sizeof (NTLMSSP_SIGNATURE)];
-+ __u8 Signature[sizeof(NTLMSSP_SIGNATURE)];
- __le32 MessageType; /* 2 */
- SECURITY_BUFFER TargetName;
- __le32 NegotiateFlags;
-diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c
-index 34ec321..713c251 100644
---- a/fs/cifs/readdir.c
-+++ b/fs/cifs/readdir.c
-@@ -670,8 +670,11 @@ static int find_cifs_entry(const int xid, struct cifsTconInfo *pTcon,
- (index_to_find < first_entry_in_buffer)) {
- /* close and restart search */
- cFYI(1, ("search backing up - close and restart search"));
-- cifsFile->invalidHandle = true;
-- CIFSFindClose(xid, pTcon, cifsFile->netfid);
-+ if (!cifsFile->srch_inf.endOfSearch &&
-+ !cifsFile->invalidHandle) {
-+ cifsFile->invalidHandle = true;
-+ CIFSFindClose(xid, pTcon, cifsFile->netfid);
-+ }
- kfree(cifsFile->search_resume_name);
- cifsFile->search_resume_name = NULL;
- if (cifsFile->srch_inf.ntwrk_buf_start) {
-diff --git a/fs/compat.c b/fs/compat.c
-index 332a869..ed43e17 100644
---- a/fs/compat.c
-+++ b/fs/compat.c
-@@ -1405,7 +1405,7 @@ int compat_do_execve(char * filename,
- /* execve success */
- security_bprm_free(bprm);
- acct_update_integrals(current);
-- kfree(bprm);
-+ free_bprm(bprm);
- return retval;
- }
-
-@@ -1424,7 +1424,7 @@ out_file:
- }
-
- out_kfree:
-- kfree(bprm);
-+ free_bprm(bprm);
-
- out_ret:
- return retval;
-diff --git a/fs/dlm/lowcomms.c b/fs/dlm/lowcomms.c
-index 7c1e5e5..637018c 100644
---- a/fs/dlm/lowcomms.c
-+++ b/fs/dlm/lowcomms.c
-@@ -50,6 +50,7 @@
- #include
- #include
- #include
-+#include
- #include
- #include
-
-@@ -138,7 +139,7 @@ static struct workqueue_struct *recv_workqueue;
- static struct workqueue_struct *send_workqueue;
-
- static DEFINE_IDR(connections_idr);
--static DECLARE_MUTEX(connections_lock);
-+static DEFINE_MUTEX(connections_lock);
- static int max_nodeid;
- static struct kmem_cache *con_cache;
-
-@@ -205,9 +206,9 @@ static struct connection *nodeid2con(int nodeid, gfp_t allocation)
- {
- struct connection *con;
-
-- down(&connections_lock);
-+ mutex_lock(&connections_lock);
- con = __nodeid2con(nodeid, allocation);
-- up(&connections_lock);
-+ mutex_unlock(&connections_lock);
-
- return con;
- }
-@@ -218,15 +219,15 @@ static struct connection *assoc2con(int assoc_id)
- int i;
- struct connection *con;
-
-- down(&connections_lock);
-+ mutex_lock(&connections_lock);
- for (i=0; i<=max_nodeid; i++) {
- con = __nodeid2con(i, 0);
- if (con && con->sctp_assoc == assoc_id) {
-- up(&connections_lock);
-+ mutex_unlock(&connections_lock);
- return con;
- }
- }
-- up(&connections_lock);
-+ mutex_unlock(&connections_lock);
- return NULL;
- }
-
-@@ -381,7 +382,7 @@ static void sctp_init_failed(void)
- int i;
- struct connection *con;
-
-- down(&connections_lock);
-+ mutex_lock(&connections_lock);
- for (i=1; i<=max_nodeid; i++) {
- con = __nodeid2con(i, 0);
- if (!con)
-@@ -393,7 +394,7 @@ static void sctp_init_failed(void)
- }
- }
- }
-- up(&connections_lock);
-+ mutex_unlock(&connections_lock);
- }
-
- /* Something happened to an association */
-@@ -930,7 +931,7 @@ out_err:
- * errors we try again until the max number of retries is reached.
- */
- if (result != -EHOSTUNREACH && result != -ENETUNREACH &&
-- result != -ENETDOWN && result != EINVAL
-+ result != -ENETDOWN && result != -EINVAL
- && result != -EPROTONOSUPPORT) {
- lowcomms_connect_sock(con);
- result = 0;
-@@ -1417,7 +1418,7 @@ void dlm_lowcomms_stop(void)
- /* Set all the flags to prevent any
- socket activity.
- */
-- down(&connections_lock);
-+ mutex_lock(&connections_lock);
- for (i = 0; i <= max_nodeid; i++) {
- con = __nodeid2con(i, 0);
- if (con) {
-@@ -1426,11 +1427,11 @@ void dlm_lowcomms_stop(void)
- con->sock->sk->sk_user_data = NULL;
- }
- }
-- up(&connections_lock);
-+ mutex_unlock(&connections_lock);
-
- work_stop();
-
-- down(&connections_lock);
-+ mutex_lock(&connections_lock);
- clean_writequeues();
-
- for (i = 0; i <= max_nodeid; i++) {
-@@ -1443,7 +1444,7 @@ void dlm_lowcomms_stop(void)
- }
- }
- max_nodeid = 0;
-- up(&connections_lock);
-+ mutex_unlock(&connections_lock);
- kmem_cache_destroy(con_cache);
- idr_init(&connections_idr);
- }
-diff --git a/fs/dlm/netlink.c b/fs/dlm/netlink.c
-index 7145936..18bda83 100644
---- a/fs/dlm/netlink.c
-+++ b/fs/dlm/netlink.c
-@@ -95,7 +95,7 @@ int __init dlm_netlink_init(void)
- return rv;
- }
-
--void __exit dlm_netlink_exit(void)
-+void dlm_netlink_exit(void)
- {
- genl_unregister_ops(&family, &dlm_nl_ops);
- genl_unregister_family(&family);
-diff --git a/fs/dlm/plock.c b/fs/dlm/plock.c
-index d6d6e37..78878c5 100644
---- a/fs/dlm/plock.c
-+++ b/fs/dlm/plock.c
-@@ -379,7 +379,7 @@ static ssize_t dev_write(struct file *file, const char __user *u, size_t count,
- struct plock_xop *xop;
- xop = (struct plock_xop *)op;
- if (xop->callback)
-- count = dlm_plock_callback(op);
-+ dlm_plock_callback(op);
- else
- wake_up(&recv_wq);
- } else
-diff --git a/fs/ecryptfs/crypto.c b/fs/ecryptfs/crypto.c
-index cd62d75..e2832bc 100644
---- a/fs/ecryptfs/crypto.c
-+++ b/fs/ecryptfs/crypto.c
-@@ -1906,9 +1906,9 @@ int ecryptfs_get_tfm_and_mutex_for_cipher_name(struct crypto_blkcipher **tfm,
- goto out;
- }
- }
-- mutex_unlock(&key_tfm_list_mutex);
- (*tfm) = key_tfm->key_tfm;
- (*tfm_mutex) = &key_tfm->key_tfm_mutex;
- out:
-+ mutex_unlock(&key_tfm_list_mutex);
- return rc;
- }
-diff --git a/fs/ecryptfs/miscdev.c b/fs/ecryptfs/miscdev.c
-index 6560da1..50c994a 100644
---- a/fs/ecryptfs/miscdev.c
-+++ b/fs/ecryptfs/miscdev.c
-@@ -243,7 +243,6 @@ ecryptfs_miscdev_read(struct file *file, char __user *buf, size_t count,
- struct ecryptfs_daemon *daemon;
- struct ecryptfs_msg_ctx *msg_ctx;
- size_t packet_length_size;
-- u32 counter_nbo;
- char packet_length[3];
- size_t i;
- size_t total_length;
-@@ -328,20 +327,18 @@ check_list:
- "pending message\n", __func__, count, total_length);
- goto out_unlock_msg_ctx;
- }
-- i = 0;
-- buf[i++] = msg_ctx->type;
-- counter_nbo = cpu_to_be32(msg_ctx->counter);
-- memcpy(&buf[i], (char *)&counter_nbo, 4);
-- i += 4;
-+ rc = -EFAULT;
-+ if (put_user(msg_ctx->type, buf))
-+ goto out_unlock_msg_ctx;
-+ if (put_user(cpu_to_be32(msg_ctx->counter), (__be32 __user *)(buf + 1)))
-+ goto out_unlock_msg_ctx;
-+ i = 5;
- if (msg_ctx->msg) {
-- memcpy(&buf[i], packet_length, packet_length_size);
-+ if (copy_to_user(&buf[i], packet_length, packet_length_size))
-+ goto out_unlock_msg_ctx;
- i += packet_length_size;
-- rc = copy_to_user(&buf[i], msg_ctx->msg, msg_ctx->msg_size);
-- if (rc) {
-- printk(KERN_ERR "%s: copy_to_user returned error "
-- "[%d]\n", __func__, rc);
-+ if (copy_to_user(&buf[i], msg_ctx->msg, msg_ctx->msg_size))
- goto out_unlock_msg_ctx;
-- }
- i += msg_ctx->msg_size;
- }
- rc = i;
-@@ -452,7 +449,8 @@ static ssize_t
- ecryptfs_miscdev_write(struct file *file, const char __user *buf,
- size_t count, loff_t *ppos)
- {
-- u32 counter_nbo, seq;
-+ __be32 counter_nbo;
-+ u32 seq;
- size_t packet_size, packet_size_length, i;
- ssize_t sz = 0;
- char *data;
-@@ -485,7 +483,7 @@ ecryptfs_miscdev_write(struct file *file, const char __user *buf,
- count);
- goto out_free;
- }
-- memcpy((char *)&counter_nbo, &data[i], 4);
-+ memcpy(&counter_nbo, &data[i], 4);
- seq = be32_to_cpu(counter_nbo);
- i += 4;
- rc = ecryptfs_parse_packet_length(&data[i], &packet_size,
-diff --git a/fs/exec.c b/fs/exec.c
-index 1f8a24a..3c2ba7c 100644
---- a/fs/exec.c
-+++ b/fs/exec.c
-@@ -1251,6 +1251,12 @@ int search_binary_handler(struct linux_binprm *bprm,struct pt_regs *regs)
-
- EXPORT_SYMBOL(search_binary_handler);
-
-+void free_bprm(struct linux_binprm *bprm)
-+{
-+ free_arg_pages(bprm);
-+ kfree(bprm);
-+}
-+
- /*
- * sys_execve() executes a new program.
- */
-@@ -1320,17 +1326,15 @@ int do_execve(char * filename,
- retval = search_binary_handler(bprm,regs);
- if (retval >= 0) {
- /* execve success */
-- free_arg_pages(bprm);
- security_bprm_free(bprm);
- acct_update_integrals(current);
-- kfree(bprm);
-+ free_bprm(bprm);
- if (displaced)
- put_files_struct(displaced);
- return retval;
- }
-
- out:
-- free_arg_pages(bprm);
- if (bprm->security)
- security_bprm_free(bprm);
-
-@@ -1344,7 +1348,7 @@ out_file:
- fput(bprm->file);
- }
- out_kfree:
-- kfree(bprm);
-+ free_bprm(bprm);
-
- out_files:
- if (displaced)
-diff --git a/fs/file.c b/fs/file.c
-index 4c6f0ea..7b3887e 100644
---- a/fs/file.c
-+++ b/fs/file.c
-@@ -26,6 +26,8 @@ struct fdtable_defer {
- };
-
- int sysctl_nr_open __read_mostly = 1024*1024;
-+int sysctl_nr_open_min = BITS_PER_LONG;
-+int sysctl_nr_open_max = 1024 * 1024; /* raised later */
-
- /*
- * We use this list to defer free fdtables that have vmalloced
-@@ -119,8 +121,6 @@ static void copy_fdtable(struct fdtable *nfdt, struct fdtable *ofdt)
- unsigned int cpy, set;
-
- BUG_ON(nfdt->max_fds < ofdt->max_fds);
-- if (ofdt->max_fds == 0)
-- return;
-
- cpy = ofdt->max_fds * sizeof(struct file *);
- set = (nfdt->max_fds - ofdt->max_fds) * sizeof(struct file *);
-@@ -261,6 +261,139 @@ int expand_files(struct files_struct *files, int nr)
- return expand_fdtable(files, nr);
- }
-
-+static int count_open_files(struct fdtable *fdt)
-+{
-+ int size = fdt->max_fds;
-+ int i;
-+
-+ /* Find the last open fd */
-+ for (i = size/(8*sizeof(long)); i > 0; ) {
-+ if (fdt->open_fds->fds_bits[--i])
-+ break;
-+ }
-+ i = (i+1) * 8 * sizeof(long);
-+ return i;
-+}
-+
-+/*
-+ * Allocate a new files structure and copy contents from the
-+ * passed in files structure.
-+ * errorp will be valid only when the returned files_struct is NULL.
-+ */
-+struct files_struct *dup_fd(struct files_struct *oldf, int *errorp)
-+{
-+ struct files_struct *newf;
-+ struct file **old_fds, **new_fds;
-+ int open_files, size, i;
-+ struct fdtable *old_fdt, *new_fdt;
-+
-+ *errorp = -ENOMEM;
-+ newf = kmem_cache_alloc(files_cachep, GFP_KERNEL);
-+ if (!newf)
-+ goto out;
-+
-+ atomic_set(&newf->count, 1);
-+
-+ spin_lock_init(&newf->file_lock);
-+ newf->next_fd = 0;
-+ new_fdt = &newf->fdtab;
-+ new_fdt->max_fds = NR_OPEN_DEFAULT;
-+ new_fdt->close_on_exec = (fd_set *)&newf->close_on_exec_init;
-+ new_fdt->open_fds = (fd_set *)&newf->open_fds_init;
-+ new_fdt->fd = &newf->fd_array[0];
-+ INIT_RCU_HEAD(&new_fdt->rcu);
-+ new_fdt->next = NULL;
-+
-+ spin_lock(&oldf->file_lock);
-+ old_fdt = files_fdtable(oldf);
-+ open_files = count_open_files(old_fdt);
-+
-+ /*
-+ * Check whether we need to allocate a larger fd array and fd set.
-+ */
-+ while (unlikely(open_files > new_fdt->max_fds)) {
-+ spin_unlock(&oldf->file_lock);
-+
-+ if (new_fdt != &newf->fdtab) {
-+ free_fdarr(new_fdt);
-+ free_fdset(new_fdt);
-+ kfree(new_fdt);
-+ }
-+
-+ new_fdt = alloc_fdtable(open_files - 1);
-+ if (!new_fdt) {
-+ *errorp = -ENOMEM;
-+ goto out_release;
-+ }
-+
-+ /* beyond sysctl_nr_open; nothing to do */
-+ if (unlikely(new_fdt->max_fds < open_files)) {
-+ free_fdarr(new_fdt);
-+ free_fdset(new_fdt);
-+ kfree(new_fdt);
-+ *errorp = -EMFILE;
-+ goto out_release;
-+ }
-+
-+ /*
-+ * Reacquire the oldf lock and a pointer to its fd table
-+ * who knows it may have a new bigger fd table. We need
-+ * the latest pointer.
-+ */
-+ spin_lock(&oldf->file_lock);
-+ old_fdt = files_fdtable(oldf);
-+ open_files = count_open_files(old_fdt);
-+ }
-+
-+ old_fds = old_fdt->fd;
-+ new_fds = new_fdt->fd;
-+
-+ memcpy(new_fdt->open_fds->fds_bits,
-+ old_fdt->open_fds->fds_bits, open_files/8);
-+ memcpy(new_fdt->close_on_exec->fds_bits,
-+ old_fdt->close_on_exec->fds_bits, open_files/8);
-+
-+ for (i = open_files; i != 0; i--) {
-+ struct file *f = *old_fds++;
-+ if (f) {
-+ get_file(f);
-+ } else {
-+ /*
-+ * The fd may be claimed in the fd bitmap but not yet
-+ * instantiated in the files array if a sibling thread
-+ * is partway through open(). So make sure that this
-+ * fd is available to the new process.
-+ */
-+ FD_CLR(open_files - i, new_fdt->open_fds);
-+ }
-+ rcu_assign_pointer(*new_fds++, f);
-+ }
-+ spin_unlock(&oldf->file_lock);
-+
-+ /* compute the remainder to be cleared */
-+ size = (new_fdt->max_fds - open_files) * sizeof(struct file *);
-+
-+ /* This is long word aligned thus could use a optimized version */
-+ memset(new_fds, 0, size);
-+
-+ if (new_fdt->max_fds > open_files) {
-+ int left = (new_fdt->max_fds-open_files)/8;
-+ int start = open_files / (8 * sizeof(unsigned long));
-+
-+ memset(&new_fdt->open_fds->fds_bits[start], 0, left);
-+ memset(&new_fdt->close_on_exec->fds_bits[start], 0, left);
-+ }
-+
-+ rcu_assign_pointer(newf->fdt, new_fdt);
-+
-+ return newf;
-+
-+out_release:
-+ kmem_cache_free(files_cachep, newf);
-+out:
-+ return NULL;
-+}
-+
- static void __devinit fdtable_defer_list_init(int cpu)
- {
- struct fdtable_defer *fddef = &per_cpu(fdtable_defer_list, cpu);
-@@ -274,4 +407,19 @@ void __init files_defer_init(void)
- int i;
- for_each_possible_cpu(i)
- fdtable_defer_list_init(i);
-+ sysctl_nr_open_max = min((size_t)INT_MAX, ~(size_t)0/sizeof(void *)) &
-+ -BITS_PER_LONG;
- }
-+
-+struct files_struct init_files = {
-+ .count = ATOMIC_INIT(1),
-+ .fdt = &init_files.fdtab,
-+ .fdtab = {
-+ .max_fds = NR_OPEN_DEFAULT,
-+ .fd = &init_files.fd_array[0],
-+ .close_on_exec = (fd_set *)&init_files.close_on_exec_init,
-+ .open_fds = (fd_set *)&init_files.open_fds_init,
-+ .rcu = RCU_HEAD_INIT,
-+ },
-+ .file_lock = __SPIN_LOCK_UNLOCKED(init_task.file_lock),
-+};
-diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c
-index fb77e09..43e9951 100644
---- a/fs/fuse/inode.c
-+++ b/fs/fuse/inode.c
-@@ -488,7 +488,12 @@ static struct fuse_conn *new_conn(struct super_block *sb)
- err = bdi_init(&fc->bdi);
- if (err)
- goto error_kfree;
-- err = bdi_register_dev(&fc->bdi, fc->dev);
-+ if (sb->s_bdev) {
-+ err = bdi_register(&fc->bdi, NULL, "%u:%u-fuseblk",
-+ MAJOR(fc->dev), MINOR(fc->dev));
-+ } else {
-+ err = bdi_register_dev(&fc->bdi, fc->dev);
-+ }
- if (err)
- goto error_bdi_destroy;
- /*
-diff --git a/fs/gfs2/glops.c b/fs/gfs2/glops.c
-index d31bada..07d84d1 100644
---- a/fs/gfs2/glops.c
-+++ b/fs/gfs2/glops.c
-@@ -249,7 +249,7 @@ static int inode_go_lock(struct gfs2_holder *gh)
- struct gfs2_inode *ip = gl->gl_object;
- int error = 0;
-
-- if (!ip)
-+ if (!ip || (gh->gh_flags & GL_SKIP))
- return 0;
-
- if (test_bit(GIF_INVALID, &ip->i_flags)) {
-diff --git a/fs/gfs2/incore.h b/fs/gfs2/incore.h
-index 9c2c0b9..eabe5ea 100644
---- a/fs/gfs2/incore.h
-+++ b/fs/gfs2/incore.h
-@@ -236,6 +236,7 @@ enum {
- GIF_INVALID = 0,
- GIF_QD_LOCKED = 1,
- GIF_SW_PAGED = 3,
-+ GIF_USER = 4, /* user inode, not metadata addr space */
- };
-
- struct gfs2_dinode_host {
-diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c
-index 3a9ef52..09453d0 100644
---- a/fs/gfs2/inode.c
-+++ b/fs/gfs2/inode.c
-@@ -47,8 +47,7 @@ static int iget_test(struct inode *inode, void *opaque)
- struct gfs2_inode *ip = GFS2_I(inode);
- u64 *no_addr = opaque;
-
-- if (ip->i_no_addr == *no_addr &&
-- inode->i_private != NULL)
-+ if (ip->i_no_addr == *no_addr && test_bit(GIF_USER, &ip->i_flags))
- return 1;
-
- return 0;
-@@ -61,6 +60,7 @@ static int iget_set(struct inode *inode, void *opaque)
-
- inode->i_ino = (unsigned long)*no_addr;
- ip->i_no_addr = *no_addr;
-+ set_bit(GIF_USER, &ip->i_flags);
- return 0;
- }
-
-@@ -86,7 +86,7 @@ static int iget_skip_test(struct inode *inode, void *opaque)
- struct gfs2_inode *ip = GFS2_I(inode);
- struct gfs2_skip_data *data = opaque;
-
-- if (ip->i_no_addr == data->no_addr && inode->i_private != NULL){
-+ if (ip->i_no_addr == data->no_addr && test_bit(GIF_USER, &ip->i_flags)){
- if (inode->i_state & (I_FREEING|I_CLEAR|I_WILL_FREE)){
- data->skipped = 1;
- return 0;
-@@ -105,6 +105,7 @@ static int iget_skip_set(struct inode *inode, void *opaque)
- return 1;
- inode->i_ino = (unsigned long)(data->no_addr);
- ip->i_no_addr = data->no_addr;
-+ set_bit(GIF_USER, &ip->i_flags);
- return 0;
- }
-
-@@ -166,7 +167,7 @@ void gfs2_set_iop(struct inode *inode)
- * Returns: A VFS inode, or an error
- */
-
--struct inode *gfs2_inode_lookup(struct super_block *sb,
-+struct inode *gfs2_inode_lookup(struct super_block *sb,
- unsigned int type,
- u64 no_addr,
- u64 no_formal_ino, int skip_freeing)
-@@ -187,7 +188,6 @@ struct inode *gfs2_inode_lookup(struct super_block *sb,
-
- if (inode->i_state & I_NEW) {
- struct gfs2_sbd *sdp = GFS2_SB(inode);
-- inode->i_private = ip;
- ip->i_no_formal_ino = no_formal_ino;
-
- error = gfs2_glock_get(sdp, no_addr, &gfs2_inode_glops, CREATE, &ip->i_gl);
-diff --git a/fs/gfs2/meta_io.c b/fs/gfs2/meta_io.c
-index 85aea27..78d75f8 100644
---- a/fs/gfs2/meta_io.c
-+++ b/fs/gfs2/meta_io.c
-@@ -1,6 +1,6 @@
- /*
- * Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
-- * Copyright (C) 2004-2006 Red Hat, Inc. All rights reserved.
-+ * Copyright (C) 2004-2008 Red Hat, Inc. All rights reserved.
- *
- * This copyrighted material is made available to anyone wishing to use,
- * modify, copy, or redistribute it subject to the terms and conditions
-@@ -69,13 +69,15 @@ static const struct address_space_operations aspace_aops = {
- struct inode *gfs2_aspace_get(struct gfs2_sbd *sdp)
- {
- struct inode *aspace;
-+ struct gfs2_inode *ip;
-
- aspace = new_inode(sdp->sd_vfs);
- if (aspace) {
- mapping_set_gfp_mask(aspace->i_mapping, GFP_NOFS);
- aspace->i_mapping->a_ops = &aspace_aops;
- aspace->i_size = ~0ULL;
-- aspace->i_private = NULL;
-+ ip = GFS2_I(aspace);
-+ clear_bit(GIF_USER, &ip->i_flags);
- insert_inode_hash(aspace);
- }
- return aspace;
-diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c
-index ef9c6c4..b2028c8 100644
---- a/fs/gfs2/ops_fstype.c
-+++ b/fs/gfs2/ops_fstype.c
-@@ -142,8 +142,8 @@ static int init_names(struct gfs2_sbd *sdp, int silent)
- if (!table[0])
- table = sdp->sd_vfs->s_id;
-
-- snprintf(sdp->sd_proto_name, GFS2_FSNAME_LEN, "%s", proto);
-- snprintf(sdp->sd_table_name, GFS2_FSNAME_LEN, "%s", table);
-+ strlcpy(sdp->sd_proto_name, proto, GFS2_FSNAME_LEN);
-+ strlcpy(sdp->sd_table_name, table, GFS2_FSNAME_LEN);
-
- table = sdp->sd_table_name;
- while ((table = strchr(table, '/')))
-diff --git a/fs/gfs2/ops_super.c b/fs/gfs2/ops_super.c
-index 2278c68..0b7cc92 100644
---- a/fs/gfs2/ops_super.c
-+++ b/fs/gfs2/ops_super.c
-@@ -1,6 +1,6 @@
- /*
- * Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
-- * Copyright (C) 2004-2006 Red Hat, Inc. All rights reserved.
-+ * Copyright (C) 2004-2008 Red Hat, Inc. All rights reserved.
- *
- * This copyrighted material is made available to anyone wishing to use,
- * modify, copy, or redistribute it subject to the terms and conditions
-@@ -52,7 +52,7 @@ static int gfs2_write_inode(struct inode *inode, int sync)
- struct gfs2_inode *ip = GFS2_I(inode);
-
- /* Check this is a "normal" inode */
-- if (inode->i_private) {
-+ if (test_bit(GIF_USER, &ip->i_flags)) {
- if (current->flags & PF_MEMALLOC)
- return 0;
- if (sync)
-@@ -297,8 +297,9 @@ static int gfs2_remount_fs(struct super_block *sb, int *flags, char *data)
- */
- static void gfs2_drop_inode(struct inode *inode)
- {
-- if (inode->i_private && inode->i_nlink) {
-- struct gfs2_inode *ip = GFS2_I(inode);
-+ struct gfs2_inode *ip = GFS2_I(inode);
-+
-+ if (test_bit(GIF_USER, &ip->i_flags) && inode->i_nlink) {
- struct gfs2_glock *gl = ip->i_iopen_gh.gh_gl;
- if (gl && test_bit(GLF_DEMOTE, &gl->gl_flags))
- clear_nlink(inode);
-@@ -314,12 +315,13 @@ static void gfs2_drop_inode(struct inode *inode)
-
- static void gfs2_clear_inode(struct inode *inode)
- {
-+ struct gfs2_inode *ip = GFS2_I(inode);
-+
- /* This tells us its a "real" inode and not one which only
- * serves to contain an address space (see rgrp.c, meta_io.c)
- * which therefore doesn't have its own glocks.
- */
-- if (inode->i_private) {
-- struct gfs2_inode *ip = GFS2_I(inode);
-+ if (test_bit(GIF_USER, &ip->i_flags)) {
- ip->i_gl->gl_object = NULL;
- gfs2_glock_schedule_for_reclaim(ip->i_gl);
- gfs2_glock_put(ip->i_gl);
-@@ -419,7 +421,7 @@ static void gfs2_delete_inode(struct inode *inode)
- struct gfs2_holder gh;
- int error;
-
-- if (!inode->i_private)
-+ if (!test_bit(GIF_USER, &ip->i_flags))
- goto out;
-
- error = gfs2_glock_nq_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &gh);
-diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c
-index 7e8f0b1..6387523 100644
---- a/fs/gfs2/rgrp.c
-+++ b/fs/gfs2/rgrp.c
-@@ -1495,7 +1495,7 @@ u64 gfs2_alloc_block(struct gfs2_inode *ip, unsigned int *n)
-
- al->al_alloced += *n;
-
-- gfs2_statfs_change(sdp, 0, -*n, 0);
-+ gfs2_statfs_change(sdp, 0, -(s64)*n, 0);
- gfs2_quota_change(ip, *n, ip->i_inode.i_uid, ip->i_inode.i_gid);
-
- spin_lock(&sdp->sd_rindex_spin);
-diff --git a/fs/hppfs/Makefile b/fs/hppfs/Makefile
-index 8a1f503..3a982bd 100644
---- a/fs/hppfs/Makefile
-+++ b/fs/hppfs/Makefile
-@@ -3,7 +3,4 @@
- # Licensed under the GPL
- #
-
--hppfs-objs := hppfs.o
--
--obj-y =
--obj-$(CONFIG_HPPFS) += $(hppfs-objs)
-+obj-$(CONFIG_HPPFS) += hppfs.o
-diff --git a/fs/namei.c b/fs/namei.c
-index 32fd965..c7e4353 100644
---- a/fs/namei.c
-+++ b/fs/namei.c
-@@ -2003,18 +2003,22 @@ struct dentry *lookup_create(struct nameidata *nd, int is_dir)
- if (IS_ERR(dentry))
- goto fail;
-
-+ if (dentry->d_inode)
-+ goto eexist;
- /*
- * Special case - lookup gave negative, but... we had foo/bar/
- * From the vfs_mknod() POV we just have a negative dentry -
- * all is fine. Let's be bastards - you had / on the end, you've
- * been asking for (non-existent) directory. -ENOENT for you.
- */
-- if (!is_dir && nd->last.name[nd->last.len] && !dentry->d_inode)
-- goto enoent;
-+ if (unlikely(!is_dir && nd->last.name[nd->last.len])) {
-+ dput(dentry);
-+ dentry = ERR_PTR(-ENOENT);
-+ }
- return dentry;
--enoent:
-+eexist:
- dput(dentry);
-- dentry = ERR_PTR(-ENOENT);
-+ dentry = ERR_PTR(-EEXIST);
- fail:
- return dentry;
- }
-diff --git a/fs/nfs/callback.c b/fs/nfs/callback.c
-index 5606ae3..c1e7c83 100644
---- a/fs/nfs/callback.c
-+++ b/fs/nfs/callback.c
-@@ -182,7 +182,7 @@ static int nfs_callback_authenticate(struct svc_rqst *rqstp)
- if (clp == NULL)
- return SVC_DROP;
-
-- dprintk("%s: %s NFSv4 callback!\n", __FUNCTION__,
-+ dprintk("%s: %s NFSv4 callback!\n", __func__,
- svc_print_addr(rqstp, buf, sizeof(buf)));
- nfs_put_client(clp);
-
-diff --git a/fs/nfs/callback_proc.c b/fs/nfs/callback_proc.c
-index 15f7785..f7e83e2 100644
---- a/fs/nfs/callback_proc.c
-+++ b/fs/nfs/callback_proc.c
-@@ -57,7 +57,7 @@ out_iput:
- out_putclient:
- nfs_put_client(clp);
- out:
-- dprintk("%s: exit with status = %d\n", __FUNCTION__, ntohl(res->status));
-+ dprintk("%s: exit with status = %d\n", __func__, ntohl(res->status));
- return res->status;
- }
-
-@@ -98,6 +98,6 @@ __be32 nfs4_callback_recall(struct cb_recallargs *args, void *dummy)
- nfs_put_client(prev);
- } while (clp != NULL);
- out:
-- dprintk("%s: exit with status = %d\n", __FUNCTION__, ntohl(res));
-+ dprintk("%s: exit with status = %d\n", __func__, ntohl(res));
- return res;
- }
-diff --git a/fs/nfs/callback_xdr.c b/fs/nfs/callback_xdr.c
-index 13619d2..dd0ef34 100644
---- a/fs/nfs/callback_xdr.c
-+++ b/fs/nfs/callback_xdr.c
-@@ -141,7 +141,7 @@ static __be32 decode_compound_hdr_arg(struct xdr_stream *xdr, struct cb_compound
- /* We do not like overly long tags! */
- if (hdr->taglen > CB_OP_TAGLEN_MAXSZ - 12) {
- printk("NFSv4 CALLBACK %s: client sent tag of length %u\n",
-- __FUNCTION__, hdr->taglen);
-+ __func__, hdr->taglen);
- return htonl(NFS4ERR_RESOURCE);
- }
- p = read_buf(xdr, 12);
-@@ -151,7 +151,7 @@ static __be32 decode_compound_hdr_arg(struct xdr_stream *xdr, struct cb_compound
- /* Check minor version is zero. */
- if (minor_version != 0) {
- printk(KERN_WARNING "%s: NFSv4 server callback with illegal minor version %u!\n",
-- __FUNCTION__, minor_version);
-+ __func__, minor_version);
- return htonl(NFS4ERR_MINOR_VERS_MISMATCH);
- }
- hdr->callback_ident = ntohl(*p++);
-@@ -179,7 +179,7 @@ static __be32 decode_getattr_args(struct svc_rqst *rqstp, struct xdr_stream *xdr
- args->addr = svc_addr(rqstp);
- status = decode_bitmap(xdr, args->bitmap);
- out:
-- dprintk("%s: exit with status = %d\n", __FUNCTION__, ntohl(status));
-+ dprintk("%s: exit with status = %d\n", __func__, ntohl(status));
- return status;
- }
-
-@@ -200,7 +200,7 @@ static __be32 decode_recall_args(struct svc_rqst *rqstp, struct xdr_stream *xdr,
- args->truncate = ntohl(*p);
- status = decode_fh(xdr, &args->fh);
- out:
-- dprintk("%s: exit with status = %d\n", __FUNCTION__, ntohl(status));
-+ dprintk("%s: exit with status = %d\n", __func__, ntohl(status));
- return status;
- }
-
-@@ -349,7 +349,7 @@ static __be32 encode_getattr_res(struct svc_rqst *rqstp, struct xdr_stream *xdr,
- status = encode_attr_mtime(xdr, res->bitmap, &res->mtime);
- *savep = htonl((unsigned int)((char *)xdr->p - (char *)(savep+1)));
- out:
-- dprintk("%s: exit with status = %d\n", __FUNCTION__, ntohl(status));
-+ dprintk("%s: exit with status = %d\n", __func__, ntohl(status));
- return status;
- }
-
-@@ -363,7 +363,7 @@ static __be32 process_op(struct svc_rqst *rqstp,
- long maxlen;
- __be32 res;
-
-- dprintk("%s: start\n", __FUNCTION__);
-+ dprintk("%s: start\n", __func__);
- status = decode_op_hdr(xdr_in, &op_nr);
- if (likely(status == 0)) {
- switch (op_nr) {
-@@ -392,7 +392,7 @@ static __be32 process_op(struct svc_rqst *rqstp,
- status = res;
- if (op->encode_res != NULL && status == 0)
- status = op->encode_res(rqstp, xdr_out, resp);
-- dprintk("%s: done, status = %d\n", __FUNCTION__, ntohl(status));
-+ dprintk("%s: done, status = %d\n", __func__, ntohl(status));
- return status;
- }
-
-@@ -401,37 +401,37 @@ static __be32 process_op(struct svc_rqst *rqstp,
- */
- static __be32 nfs4_callback_compound(struct svc_rqst *rqstp, void *argp, void *resp)
- {
-- struct cb_compound_hdr_arg hdr_arg;
-- struct cb_compound_hdr_res hdr_res;
-+ struct cb_compound_hdr_arg hdr_arg = { 0 };
-+ struct cb_compound_hdr_res hdr_res = { NULL };
- struct xdr_stream xdr_in, xdr_out;
- __be32 *p;
- __be32 status;
-- unsigned int nops = 1;
-+ unsigned int nops = 0;
-
-- dprintk("%s: start\n", __FUNCTION__);
-+ dprintk("%s: start\n", __func__);
-
- xdr_init_decode(&xdr_in, &rqstp->rq_arg, rqstp->rq_arg.head[0].iov_base);
-
- p = (__be32*)((char *)rqstp->rq_res.head[0].iov_base + rqstp->rq_res.head[0].iov_len);
- xdr_init_encode(&xdr_out, &rqstp->rq_res, p);
-
-- decode_compound_hdr_arg(&xdr_in, &hdr_arg);
-+ status = decode_compound_hdr_arg(&xdr_in, &hdr_arg);
-+ if (status == __constant_htonl(NFS4ERR_RESOURCE))
-+ return rpc_garbage_args;
-+
- hdr_res.taglen = hdr_arg.taglen;
- hdr_res.tag = hdr_arg.tag;
-- hdr_res.nops = NULL;
-- encode_compound_hdr_res(&xdr_out, &hdr_res);
-+ if (encode_compound_hdr_res(&xdr_out, &hdr_res) != 0)
-+ return rpc_system_err;
-
-- for (;;) {
-+ while (status == 0 && nops != hdr_arg.nops) {
- status = process_op(rqstp, &xdr_in, argp, &xdr_out, resp);
-- if (status != 0)
-- break;
-- if (nops == hdr_arg.nops)
-- break;
- nops++;
- }
-+
- *hdr_res.status = status;
- *hdr_res.nops = htonl(nops);
-- dprintk("%s: done, status = %u\n", __FUNCTION__, ntohl(status));
-+ dprintk("%s: done, status = %u\n", __func__, ntohl(status));
- return rpc_success;
- }
-
-diff --git a/fs/nfs/client.c b/fs/nfs/client.c
-index 89ac5bb..f2a092c 100644
---- a/fs/nfs/client.c
-+++ b/fs/nfs/client.c
-@@ -488,7 +488,7 @@ static int nfs_create_rpc_client(struct nfs_client *clp,
- clnt = rpc_create(&args);
- if (IS_ERR(clnt)) {
- dprintk("%s: cannot create RPC client. Error = %ld\n",
-- __FUNCTION__, PTR_ERR(clnt));
-+ __func__, PTR_ERR(clnt));
- return PTR_ERR(clnt);
- }
-
-@@ -576,7 +576,7 @@ static int nfs_init_server_rpcclient(struct nfs_server *server,
-
- server->client = rpc_clone_client(clp->cl_rpcclient);
- if (IS_ERR(server->client)) {
-- dprintk("%s: couldn't create rpc_client!\n", __FUNCTION__);
-+ dprintk("%s: couldn't create rpc_client!\n", __func__);
- return PTR_ERR(server->client);
- }
-
-@@ -590,7 +590,7 @@ static int nfs_init_server_rpcclient(struct nfs_server *server,
-
- auth = rpcauth_create(pseudoflavour, server->client);
- if (IS_ERR(auth)) {
-- dprintk("%s: couldn't create credcache!\n", __FUNCTION__);
-+ dprintk("%s: couldn't create credcache!\n", __func__);
- return PTR_ERR(auth);
- }
- }
-@@ -985,7 +985,7 @@ static int nfs4_init_client(struct nfs_client *clp,
- error = nfs_idmap_new(clp);
- if (error < 0) {
- dprintk("%s: failed to create idmapper. Error = %d\n",
-- __FUNCTION__, error);
-+ __func__, error);
- goto error;
- }
- __set_bit(NFS_CS_IDMAP, &clp->cl_res_state);
-diff --git a/fs/nfs/delegation.c b/fs/nfs/delegation.c
-index 00a5e44..cc563cf 100644
---- a/fs/nfs/delegation.c
-+++ b/fs/nfs/delegation.c
-@@ -60,7 +60,7 @@ static int nfs_delegation_claim_locks(struct nfs_open_context *ctx, struct nfs4_
- switch (status) {
- default:
- printk(KERN_ERR "%s: unhandled error %d.\n",
-- __FUNCTION__, status);
-+ __func__, status);
- case -NFS4ERR_EXPIRED:
- /* kill_proc(fl->fl_pid, SIGLOST, 1); */
- case -NFS4ERR_STALE_CLIENTID:
-@@ -186,7 +186,7 @@ int nfs_inode_set_delegation(struct inode *inode, struct rpc_cred *cred, struct
- */
- dfprintk(FILE, "%s: server %s handed out "
- "a duplicate delegation!\n",
-- __FUNCTION__, clp->cl_hostname);
-+ __func__, clp->cl_hostname);
- if (delegation->type <= nfsi->delegation->type) {
- freeme = delegation;
- delegation = NULL;
-diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
-index f288b3e..58d43da 100644
---- a/fs/nfs/dir.c
-+++ b/fs/nfs/dir.c
-@@ -180,7 +180,7 @@ int nfs_readdir_filler(nfs_readdir_descriptor_t *desc, struct page *page)
- int error;
-
- dfprintk(DIRCACHE, "NFS: %s: reading cookie %Lu into page %lu\n",
-- __FUNCTION__, (long long)desc->entry->cookie,
-+ __func__, (long long)desc->entry->cookie,
- page->index);
-
- again:
-@@ -256,7 +256,7 @@ int find_dirent(nfs_readdir_descriptor_t *desc)
-
- while((status = dir_decode(desc)) == 0) {
- dfprintk(DIRCACHE, "NFS: %s: examining cookie %Lu\n",
-- __FUNCTION__, (unsigned long long)entry->cookie);
-+ __func__, (unsigned long long)entry->cookie);
- if (entry->prev_cookie == *desc->dir_cookie)
- break;
- if (loop_count++ > 200) {
-@@ -315,7 +315,7 @@ int find_dirent_page(nfs_readdir_descriptor_t *desc)
- int status;
-
- dfprintk(DIRCACHE, "NFS: %s: searching page %ld for target %Lu\n",
-- __FUNCTION__, desc->page_index,
-+ __func__, desc->page_index,
- (long long) *desc->dir_cookie);
-
- /* If we find the page in the page_cache, we cannot be sure
-@@ -339,7 +339,7 @@ int find_dirent_page(nfs_readdir_descriptor_t *desc)
- if (status < 0)
- dir_page_release(desc);
- out:
-- dfprintk(DIRCACHE, "NFS: %s: returns %d\n", __FUNCTION__, status);
-+ dfprintk(DIRCACHE, "NFS: %s: returns %d\n", __func__, status);
- return status;
- }
-
-@@ -380,7 +380,7 @@ int readdir_search_pagecache(nfs_readdir_descriptor_t *desc)
- }
- }
-
-- dfprintk(DIRCACHE, "NFS: %s: returns %d\n", __FUNCTION__, res);
-+ dfprintk(DIRCACHE, "NFS: %s: returns %d\n", __func__, res);
- return res;
- }
-
-@@ -506,7 +506,7 @@ int uncached_readdir(nfs_readdir_descriptor_t *desc, void *dirent,
- desc->entry->eof = 0;
- out:
- dfprintk(DIRCACHE, "NFS: %s: returns %d\n",
-- __FUNCTION__, status);
-+ __func__, status);
- return status;
- out_release:
- dir_page_release(desc);
-@@ -780,7 +780,7 @@ static int nfs_lookup_revalidate(struct dentry * dentry, struct nameidata *nd)
-
- if (is_bad_inode(inode)) {
- dfprintk(LOOKUPCACHE, "%s: %s/%s has dud inode\n",
-- __FUNCTION__, dentry->d_parent->d_name.name,
-+ __func__, dentry->d_parent->d_name.name,
- dentry->d_name.name);
- goto out_bad;
- }
-@@ -808,7 +808,7 @@ static int nfs_lookup_revalidate(struct dentry * dentry, struct nameidata *nd)
- unlock_kernel();
- dput(parent);
- dfprintk(LOOKUPCACHE, "NFS: %s(%s/%s) is valid\n",
-- __FUNCTION__, dentry->d_parent->d_name.name,
-+ __func__, dentry->d_parent->d_name.name,
- dentry->d_name.name);
- return 1;
- out_zap_parent:
-@@ -827,7 +827,7 @@ out_zap_parent:
- unlock_kernel();
- dput(parent);
- dfprintk(LOOKUPCACHE, "NFS: %s(%s/%s) is invalid\n",
-- __FUNCTION__, dentry->d_parent->d_name.name,
-+ __func__, dentry->d_parent->d_name.name,
- dentry->d_name.name);
- return 0;
- }
-diff --git a/fs/nfs/file.c b/fs/nfs/file.c
-index 3536b01..d84a3d8 100644
---- a/fs/nfs/file.c
-+++ b/fs/nfs/file.c
-@@ -526,7 +526,7 @@ static int do_vfs_lock(struct file *file, struct file_lock *fl)
- if (res < 0)
- dprintk(KERN_WARNING "%s: VFS is out of sync with lock manager"
- " - error %d!\n",
-- __FUNCTION__, res);
-+ __func__, res);
- return res;
- }
-
-diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c
-index 5cb3345..596c5d8 100644
---- a/fs/nfs/inode.c
-+++ b/fs/nfs/inode.c
-@@ -541,8 +541,7 @@ static void __put_nfs_open_context(struct nfs_open_context *ctx, int wait)
- }
- if (ctx->cred != NULL)
- put_rpccred(ctx->cred);
-- dput(ctx->path.dentry);
-- mntput(ctx->path.mnt);
-+ path_put(&ctx->path);
- kfree(ctx);
- }
-
-@@ -707,6 +706,13 @@ int nfs_attribute_timeout(struct inode *inode)
-
- if (nfs_have_delegation(inode, FMODE_READ))
- return 0;
-+ /*
-+ * Special case: if the attribute timeout is set to 0, then always
-+ * treat the cache as having expired (unless holding
-+ * a delegation).
-+ */
-+ if (nfsi->attrtimeo == 0)
-+ return 1;
- return !time_in_range(jiffies, nfsi->read_cache_jiffies, nfsi->read_cache_jiffies + nfsi->attrtimeo);
- }
-
-@@ -995,7 +1001,7 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
- unsigned long now = jiffies;
-
- dfprintk(VFS, "NFS: %s(%s/%ld ct=%d info=0x%x)\n",
-- __FUNCTION__, inode->i_sb->s_id, inode->i_ino,
-+ __func__, inode->i_sb->s_id, inode->i_ino,
- atomic_read(&inode->i_count), fattr->valid);
-
- if (nfsi->fileid != fattr->fileid)
-@@ -1119,7 +1125,7 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
- * Big trouble! The inode has become a different object.
- */
- printk(KERN_DEBUG "%s: inode %ld mode changed, %07o to %07o\n",
-- __FUNCTION__, inode->i_ino, inode->i_mode, fattr->mode);
-+ __func__, inode->i_ino, inode->i_mode, fattr->mode);
- out_err:
- /*
- * No need to worry about unhashing the dentry, as the
-diff --git a/fs/nfs/namespace.c b/fs/nfs/namespace.c
-index af4d0f1..2f285ef 100644
---- a/fs/nfs/namespace.c
-+++ b/fs/nfs/namespace.c
-@@ -106,7 +106,7 @@ static void * nfs_follow_mountpoint(struct dentry *dentry, struct nameidata *nd)
- dprintk("--> nfs_follow_mountpoint()\n");
-
- BUG_ON(IS_ROOT(dentry));
-- dprintk("%s: enter\n", __FUNCTION__);
-+ dprintk("%s: enter\n", __func__);
- dput(nd->path.dentry);
- nd->path.dentry = dget(dentry);
-
-@@ -137,13 +137,12 @@ static void * nfs_follow_mountpoint(struct dentry *dentry, struct nameidata *nd)
- goto out_follow;
- goto out_err;
- }
-- mntput(nd->path.mnt);
-- dput(nd->path.dentry);
-+ path_put(&nd->path);
- nd->path.mnt = mnt;
- nd->path.dentry = dget(mnt->mnt_root);
- schedule_delayed_work(&nfs_automount_task, nfs_mountpoint_expiry_timeout);
- out:
-- dprintk("%s: done, returned %d\n", __FUNCTION__, err);
-+ dprintk("%s: done, returned %d\n", __func__, err);
-
- dprintk("<-- nfs_follow_mountpoint() = %d\n", err);
- return ERR_PTR(err);
-@@ -230,7 +229,7 @@ static struct vfsmount *nfs_do_submount(const struct vfsmount *mnt_parent,
-
- dprintk("--> nfs_do_submount()\n");
-
-- dprintk("%s: submounting on %s/%s\n", __FUNCTION__,
-+ dprintk("%s: submounting on %s/%s\n", __func__,
- dentry->d_parent->d_name.name,
- dentry->d_name.name);
- if (page == NULL)
-@@ -243,7 +242,7 @@ static struct vfsmount *nfs_do_submount(const struct vfsmount *mnt_parent,
- free_page:
- free_page((unsigned long)page);
- out:
-- dprintk("%s: done\n", __FUNCTION__);
-+ dprintk("%s: done\n", __func__);
-
- dprintk("<-- nfs_do_submount() = %p\n", mnt);
- return mnt;
-diff --git a/fs/nfs/nfs3proc.c b/fs/nfs/nfs3proc.c
-index 549dbce..c3523ad 100644
---- a/fs/nfs/nfs3proc.c
-+++ b/fs/nfs/nfs3proc.c
-@@ -63,15 +63,15 @@ do_proc_get_root(struct rpc_clnt *client, struct nfs_fh *fhandle,
- };
- int status;
-
-- dprintk("%s: call fsinfo\n", __FUNCTION__);
-+ dprintk("%s: call fsinfo\n", __func__);
- nfs_fattr_init(info->fattr);
- status = rpc_call_sync(client, &msg, 0);
-- dprintk("%s: reply fsinfo: %d\n", __FUNCTION__, status);
-+ dprintk("%s: reply fsinfo: %d\n", __func__, status);
- if (!(info->fattr->valid & NFS_ATTR_FATTR)) {
- msg.rpc_proc = &nfs3_procedures[NFS3PROC_GETATTR];
- msg.rpc_resp = info->fattr;
- status = rpc_call_sync(client, &msg, 0);
-- dprintk("%s: reply getattr: %d\n", __FUNCTION__, status);
-+ dprintk("%s: reply getattr: %d\n", __func__, status);
- }
- return status;
- }
-diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h
-index bd1b9d6..ea79064 100644
---- a/fs/nfs/nfs4_fs.h
-+++ b/fs/nfs/nfs4_fs.h
-@@ -206,7 +206,6 @@ struct rpc_cred *nfs4_get_renew_cred(struct nfs_client *clp);
-
- extern struct nfs4_state_owner * nfs4_get_state_owner(struct nfs_server *, struct rpc_cred *);
- extern void nfs4_put_state_owner(struct nfs4_state_owner *);
--extern void nfs4_drop_state_owner(struct nfs4_state_owner *);
- extern struct nfs4_state * nfs4_get_open_state(struct inode *, struct nfs4_state_owner *);
- extern void nfs4_put_open_state(struct nfs4_state *);
- extern void nfs4_close_state(struct path *, struct nfs4_state *, mode_t);
-diff --git a/fs/nfs/nfs4namespace.c b/fs/nfs/nfs4namespace.c
-index 5f9ba41..b112857 100644
---- a/fs/nfs/nfs4namespace.c
-+++ b/fs/nfs/nfs4namespace.c
-@@ -86,7 +86,7 @@ static int nfs4_validate_fspath(const struct vfsmount *mnt_parent,
-
- if (strncmp(path, fs_path, strlen(fs_path)) != 0) {
- dprintk("%s: path %s does not begin with fsroot %s\n",
-- __FUNCTION__, path, fs_path);
-+ __func__, path, fs_path);
- return -ENOENT;
- }
-
-@@ -134,7 +134,7 @@ static struct vfsmount *nfs_follow_referral(const struct vfsmount *mnt_parent,
- if (locations == NULL || locations->nlocations <= 0)
- goto out;
-
-- dprintk("%s: referral at %s/%s\n", __FUNCTION__,
-+ dprintk("%s: referral at %s/%s\n", __func__,
- dentry->d_parent->d_name.name, dentry->d_name.name);
-
- page = (char *) __get_free_page(GFP_USER);
-@@ -204,7 +204,7 @@ static struct vfsmount *nfs_follow_referral(const struct vfsmount *mnt_parent,
- out:
- free_page((unsigned long) page);
- free_page((unsigned long) page2);
-- dprintk("%s: done\n", __FUNCTION__);
-+ dprintk("%s: done\n", __func__);
- return mnt;
- }
-
-@@ -223,7 +223,7 @@ struct vfsmount *nfs_do_refmount(const struct vfsmount *mnt_parent, struct dentr
- int err;
-
- /* BUG_ON(IS_ROOT(dentry)); */
-- dprintk("%s: enter\n", __FUNCTION__);
-+ dprintk("%s: enter\n", __func__);
-
- page = alloc_page(GFP_KERNEL);
- if (page == NULL)
-@@ -238,7 +238,7 @@ struct vfsmount *nfs_do_refmount(const struct vfsmount *mnt_parent, struct dentr
-
- parent = dget_parent(dentry);
- dprintk("%s: getting locations for %s/%s\n",
-- __FUNCTION__, parent->d_name.name, dentry->d_name.name);
-+ __func__, parent->d_name.name, dentry->d_name.name);
-
- err = nfs4_proc_fs_locations(parent->d_inode, &dentry->d_name, fs_locations, page);
- dput(parent);
-@@ -252,6 +252,6 @@ out_free:
- __free_page(page);
- kfree(fs_locations);
- out:
-- dprintk("%s: done\n", __FUNCTION__);
-+ dprintk("%s: done\n", __func__);
- return mnt;
- }
-diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
-index dbc0927..1293e0a 100644
---- a/fs/nfs/nfs4proc.c
-+++ b/fs/nfs/nfs4proc.c
-@@ -73,7 +73,7 @@ int nfs4_map_errors(int err)
- {
- if (err < -1000) {
- dprintk("%s could not handle NFSv4 error %d\n",
-- __FUNCTION__, -err);
-+ __func__, -err);
- return -EIO;
- }
- return err;
-@@ -306,8 +306,7 @@ static void nfs4_opendata_free(struct kref *kref)
- nfs4_put_open_state(p->state);
- nfs4_put_state_owner(p->owner);
- dput(p->dir);
-- dput(p->path.dentry);
-- mntput(p->path.mnt);
-+ path_put(&p->path);
- kfree(p);
- }
-
-@@ -1210,8 +1209,7 @@ static void nfs4_free_closedata(void *data)
- nfs4_put_open_state(calldata->state);
- nfs_free_seqid(calldata->arg.seqid);
- nfs4_put_state_owner(sp);
-- dput(calldata->path.dentry);
-- mntput(calldata->path.mnt);
-+ path_put(&calldata->path);
- kfree(calldata);
- }
-
-@@ -1578,7 +1576,7 @@ static int nfs4_get_referral(struct inode *dir, const struct qstr *name, struct
- goto out;
- /* Make sure server returned a different fsid for the referral */
- if (nfs_fsid_equal(&NFS_SERVER(dir)->fsid, &locations->fattr.fsid)) {
-- dprintk("%s: server did not return a different fsid for a referral at %s\n", __FUNCTION__, name->name);
-+ dprintk("%s: server did not return a different fsid for a referral at %s\n", __func__, name->name);
- status = -EIO;
- goto out;
- }
-@@ -2211,7 +2209,7 @@ static int _nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
- };
- int status;
-
-- dprintk("%s: dentry = %s/%s, cookie = %Lu\n", __FUNCTION__,
-+ dprintk("%s: dentry = %s/%s, cookie = %Lu\n", __func__,
- dentry->d_parent->d_name.name,
- dentry->d_name.name,
- (unsigned long long)cookie);
-@@ -2223,7 +2221,7 @@ static int _nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
-
- nfs_invalidate_atime(dir);
-
-- dprintk("%s: returns %d\n", __FUNCTION__, status);
-+ dprintk("%s: returns %d\n", __func__, status);
- return status;
- }
-
-@@ -3342,7 +3340,7 @@ static void nfs4_lock_prepare(struct rpc_task *task, void *calldata)
- struct nfs4_lockdata *data = calldata;
- struct nfs4_state *state = data->lsp->ls_state;
-
-- dprintk("%s: begin!\n", __FUNCTION__);
-+ dprintk("%s: begin!\n", __func__);
- if (nfs_wait_on_sequence(data->arg.lock_seqid, task) != 0)
- return;
- /* Do we need to do an open_to_lock_owner? */
-@@ -3356,14 +3354,14 @@ static void nfs4_lock_prepare(struct rpc_task *task, void *calldata)
- data->arg.new_lock_owner = 0;
- data->timestamp = jiffies;
- rpc_call_start(task);
-- dprintk("%s: done!, ret = %d\n", __FUNCTION__, data->rpc_status);
-+ dprintk("%s: done!, ret = %d\n", __func__, data->rpc_status);
- }
-
- static void nfs4_lock_done(struct rpc_task *task, void *calldata)
- {
- struct nfs4_lockdata *data = calldata;
-
-- dprintk("%s: begin!\n", __FUNCTION__);
-+ dprintk("%s: begin!\n", __func__);
-
- data->rpc_status = task->tk_status;
- if (RPC_ASSASSINATED(task))
-@@ -3381,14 +3379,14 @@ static void nfs4_lock_done(struct rpc_task *task, void *calldata)
- renew_lease(NFS_SERVER(data->ctx->path.dentry->d_inode), data->timestamp);
- }
- out:
-- dprintk("%s: done, ret = %d!\n", __FUNCTION__, data->rpc_status);
-+ dprintk("%s: done, ret = %d!\n", __func__, data->rpc_status);
- }
-
- static void nfs4_lock_release(void *calldata)
- {
- struct nfs4_lockdata *data = calldata;
-
-- dprintk("%s: begin!\n", __FUNCTION__);
-+ dprintk("%s: begin!\n", __func__);
- nfs_free_seqid(data->arg.open_seqid);
- if (data->cancelled != 0) {
- struct rpc_task *task;
-@@ -3396,13 +3394,13 @@ static void nfs4_lock_release(void *calldata)
- data->arg.lock_seqid);
- if (!IS_ERR(task))
- rpc_put_task(task);
-- dprintk("%s: cancelling lock!\n", __FUNCTION__);
-+ dprintk("%s: cancelling lock!\n", __func__);
- } else
- nfs_free_seqid(data->arg.lock_seqid);
- nfs4_put_lock_state(data->lsp);
- put_nfs_open_context(data->ctx);
- kfree(data);
-- dprintk("%s: done!\n", __FUNCTION__);
-+ dprintk("%s: done!\n", __func__);
- }
-
- static const struct rpc_call_ops nfs4_lock_ops = {
-@@ -3428,7 +3426,7 @@ static int _nfs4_do_setlk(struct nfs4_state *state, int cmd, struct file_lock *f
- };
- int ret;
-
-- dprintk("%s: begin!\n", __FUNCTION__);
-+ dprintk("%s: begin!\n", __func__);
- data = nfs4_alloc_lockdata(fl, nfs_file_open_context(fl->fl_file),
- fl->fl_u.nfs4_fl.owner);
- if (data == NULL)
-@@ -3451,7 +3449,7 @@ static int _nfs4_do_setlk(struct nfs4_state *state, int cmd, struct file_lock *f
- } else
- data->cancelled = 1;
- rpc_put_task(task);
-- dprintk("%s: done, ret = %d!\n", __FUNCTION__, ret);
-+ dprintk("%s: done, ret = %d!\n", __func__, ret);
- return ret;
- }
-
-@@ -3527,7 +3525,7 @@ static int _nfs4_proc_setlk(struct nfs4_state *state, int cmd, struct file_lock
- /* Note: we always want to sleep here! */
- request->fl_flags = fl_flags | FL_SLEEP;
- if (do_vfs_lock(request->fl_file, request) < 0)
-- printk(KERN_WARNING "%s: VFS is out of sync with lock manager!\n", __FUNCTION__);
-+ printk(KERN_WARNING "%s: VFS is out of sync with lock manager!\n", __func__);
- out_unlock:
- up_read(&clp->cl_sem);
- out:
-@@ -3665,12 +3663,12 @@ int nfs4_proc_fs_locations(struct inode *dir, const struct qstr *name,
- };
- int status;
-
-- dprintk("%s: start\n", __FUNCTION__);
-+ dprintk("%s: start\n", __func__);
- nfs_fattr_init(&fs_locations->fattr);
- fs_locations->server = server;
- fs_locations->nlocations = 0;
- status = rpc_call_sync(server->client, &msg, 0);
-- dprintk("%s: returned status = %d\n", __FUNCTION__, status);
-+ dprintk("%s: returned status = %d\n", __func__, status);
- return status;
- }
-
-diff --git a/fs/nfs/nfs4renewd.c b/fs/nfs/nfs4renewd.c
-index 5e2e4af..3305acb 100644
---- a/fs/nfs/nfs4renewd.c
-+++ b/fs/nfs/nfs4renewd.c
-@@ -66,7 +66,7 @@ nfs4_renew_state(struct work_struct *work)
- unsigned long last, now;
-
- down_read(&clp->cl_sem);
-- dprintk("%s: start\n", __FUNCTION__);
-+ dprintk("%s: start\n", __func__);
- /* Are there any active superblocks? */
- if (list_empty(&clp->cl_superblocks))
- goto out;
-@@ -92,17 +92,17 @@ nfs4_renew_state(struct work_struct *work)
- spin_lock(&clp->cl_lock);
- } else
- dprintk("%s: failed to call renewd. Reason: lease not expired \n",
-- __FUNCTION__);
-+ __func__);
- if (timeout < 5 * HZ) /* safeguard */
- timeout = 5 * HZ;
- dprintk("%s: requeueing work. Lease period = %ld\n",
-- __FUNCTION__, (timeout + HZ - 1) / HZ);
-+ __func__, (timeout + HZ - 1) / HZ);
- cancel_delayed_work(&clp->cl_renewd);
- schedule_delayed_work(&clp->cl_renewd, timeout);
- spin_unlock(&clp->cl_lock);
- out:
- up_read(&clp->cl_sem);
-- dprintk("%s: done\n", __FUNCTION__);
-+ dprintk("%s: done\n", __func__);
- }
-
- /* Must be called with clp->cl_sem locked for writes */
-@@ -117,7 +117,7 @@ nfs4_schedule_state_renewal(struct nfs_client *clp)
- if (timeout < 5 * HZ)
- timeout = 5 * HZ;
- dprintk("%s: requeueing work. Lease period = %ld\n",
-- __FUNCTION__, (timeout + HZ - 1) / HZ);
-+ __func__, (timeout + HZ - 1) / HZ);
- cancel_delayed_work(&clp->cl_renewd);
- schedule_delayed_work(&clp->cl_renewd, timeout);
- set_bit(NFS_CS_RENEWD, &clp->cl_res_state);
-diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
-index 46eb624..856a893 100644
---- a/fs/nfs/nfs4state.c
-+++ b/fs/nfs/nfs4state.c
-@@ -282,7 +282,7 @@ nfs4_alloc_state_owner(void)
- return sp;
- }
-
--void
-+static void
- nfs4_drop_state_owner(struct nfs4_state_owner *sp)
- {
- if (!RB_EMPTY_NODE(&sp->so_client_node)) {
-@@ -828,7 +828,7 @@ static int nfs4_reclaim_locks(struct nfs4_state_recovery_ops *ops, struct nfs4_s
- switch (status) {
- default:
- printk(KERN_ERR "%s: unhandled error %d. Zeroing state\n",
-- __FUNCTION__, status);
-+ __func__, status);
- case -NFS4ERR_EXPIRED:
- case -NFS4ERR_NO_GRACE:
- case -NFS4ERR_RECLAIM_BAD:
-@@ -869,14 +869,14 @@ static int nfs4_reclaim_open_state(struct nfs4_state_recovery_ops *ops, struct n
- list_for_each_entry(lock, &state->lock_states, ls_locks) {
- if (!(lock->ls_flags & NFS_LOCK_INITIALIZED))
- printk("%s: Lock reclaim failed!\n",
-- __FUNCTION__);
-+ __func__);
- }
- continue;
- }
- switch (status) {
- default:
- printk(KERN_ERR "%s: unhandled error %d. Zeroing state\n",
-- __FUNCTION__, status);
-+ __func__, status);
- case -ENOENT:
- case -NFS4ERR_RECLAIM_BAD:
- case -NFS4ERR_RECLAIM_CONFLICT:
-diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c
-index 5a2d649..b916297 100644
---- a/fs/nfs/nfs4xdr.c
-+++ b/fs/nfs/nfs4xdr.c
-@@ -1831,7 +1831,7 @@ static int nfs4_xdr_enc_readdir(struct rpc_rqst *req, __be32 *p, const struct nf
- xdr_inline_pages(&req->rq_rcv_buf, replen, args->pages,
- args->pgbase, args->count);
- dprintk("%s: inlined page args = (%u, %p, %u, %u)\n",
-- __FUNCTION__, replen, args->pages,
-+ __func__, replen, args->pages,
- args->pgbase, args->count);
-
- out:
-@@ -2192,9 +2192,9 @@ out:
- p = xdr_inline_decode(xdr, nbytes); \
- if (unlikely(!p)) { \
- dprintk("nfs: %s: prematurely hit end of receive" \
-- " buffer\n", __FUNCTION__); \
-+ " buffer\n", __func__); \
- dprintk("nfs: %s: xdr->p=%p, bytes=%u, xdr->end=%p\n", \
-- __FUNCTION__, xdr->p, nbytes, xdr->end); \
-+ __func__, xdr->p, nbytes, xdr->end); \
- return -EIO; \
- } \
- } while (0)
-@@ -2306,12 +2306,12 @@ static int decode_attr_type(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *
- READ_BUF(4);
- READ32(*type);
- if (*type < NF4REG || *type > NF4NAMEDATTR) {
-- dprintk("%s: bad type %d\n", __FUNCTION__, *type);
-+ dprintk("%s: bad type %d\n", __func__, *type);
- return -EIO;
- }
- bitmap[0] &= ~FATTR4_WORD0_TYPE;
- }
-- dprintk("%s: type=0%o\n", __FUNCTION__, nfs_type2fmt[*type].nfs2type);
-+ dprintk("%s: type=0%o\n", __func__, nfs_type2fmt[*type].nfs2type);
- return 0;
- }
-
-@@ -2327,7 +2327,7 @@ static int decode_attr_change(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t
- READ64(*change);
- bitmap[0] &= ~FATTR4_WORD0_CHANGE;
- }
-- dprintk("%s: change attribute=%Lu\n", __FUNCTION__,
-+ dprintk("%s: change attribute=%Lu\n", __func__,
- (unsigned long long)*change);
- return 0;
- }
-@@ -2344,7 +2344,7 @@ static int decode_attr_size(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *
- READ64(*size);
- bitmap[0] &= ~FATTR4_WORD0_SIZE;
- }
-- dprintk("%s: file size=%Lu\n", __FUNCTION__, (unsigned long long)*size);
-+ dprintk("%s: file size=%Lu\n", __func__, (unsigned long long)*size);
- return 0;
- }
-
-@@ -2360,7 +2360,7 @@ static int decode_attr_link_support(struct xdr_stream *xdr, uint32_t *bitmap, ui
- READ32(*res);
- bitmap[0] &= ~FATTR4_WORD0_LINK_SUPPORT;
- }
-- dprintk("%s: link support=%s\n", __FUNCTION__, *res == 0 ? "false" : "true");
-+ dprintk("%s: link support=%s\n", __func__, *res == 0 ? "false" : "true");
- return 0;
- }
-
-@@ -2376,7 +2376,7 @@ static int decode_attr_symlink_support(struct xdr_stream *xdr, uint32_t *bitmap,
- READ32(*res);
- bitmap[0] &= ~FATTR4_WORD0_SYMLINK_SUPPORT;
- }
-- dprintk("%s: symlink support=%s\n", __FUNCTION__, *res == 0 ? "false" : "true");
-+ dprintk("%s: symlink support=%s\n", __func__, *res == 0 ? "false" : "true");
- return 0;
- }
-
-@@ -2394,7 +2394,7 @@ static int decode_attr_fsid(struct xdr_stream *xdr, uint32_t *bitmap, struct nfs
- READ64(fsid->minor);
- bitmap[0] &= ~FATTR4_WORD0_FSID;
- }
-- dprintk("%s: fsid=(0x%Lx/0x%Lx)\n", __FUNCTION__,
-+ dprintk("%s: fsid=(0x%Lx/0x%Lx)\n", __func__,
- (unsigned long long)fsid->major,
- (unsigned long long)fsid->minor);
- return 0;
-@@ -2412,7 +2412,7 @@ static int decode_attr_lease_time(struct xdr_stream *xdr, uint32_t *bitmap, uint
- READ32(*res);
- bitmap[0] &= ~FATTR4_WORD0_LEASE_TIME;
- }
-- dprintk("%s: file size=%u\n", __FUNCTION__, (unsigned int)*res);
-+ dprintk("%s: file size=%u\n", __func__, (unsigned int)*res);
- return 0;
- }
-
-@@ -2428,7 +2428,7 @@ static int decode_attr_aclsupport(struct xdr_stream *xdr, uint32_t *bitmap, uint
- READ32(*res);
- bitmap[0] &= ~FATTR4_WORD0_ACLSUPPORT;
- }
-- dprintk("%s: ACLs supported=%u\n", __FUNCTION__, (unsigned int)*res);
-+ dprintk("%s: ACLs supported=%u\n", __func__, (unsigned int)*res);
- return 0;
- }
-
-@@ -2444,7 +2444,7 @@ static int decode_attr_fileid(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t
- READ64(*fileid);
- bitmap[0] &= ~FATTR4_WORD0_FILEID;
- }
-- dprintk("%s: fileid=%Lu\n", __FUNCTION__, (unsigned long long)*fileid);
-+ dprintk("%s: fileid=%Lu\n", __func__, (unsigned long long)*fileid);
- return 0;
- }
-
-@@ -2460,7 +2460,7 @@ static int decode_attr_mounted_on_fileid(struct xdr_stream *xdr, uint32_t *bitma
- READ64(*fileid);
- bitmap[1] &= ~FATTR4_WORD1_MOUNTED_ON_FILEID;
- }
-- dprintk("%s: fileid=%Lu\n", __FUNCTION__, (unsigned long long)*fileid);
-+ dprintk("%s: fileid=%Lu\n", __func__, (unsigned long long)*fileid);
- return 0;
- }
-
-@@ -2477,7 +2477,7 @@ static int decode_attr_files_avail(struct xdr_stream *xdr, uint32_t *bitmap, uin
- READ64(*res);
- bitmap[0] &= ~FATTR4_WORD0_FILES_AVAIL;
- }
-- dprintk("%s: files avail=%Lu\n", __FUNCTION__, (unsigned long long)*res);
-+ dprintk("%s: files avail=%Lu\n", __func__, (unsigned long long)*res);
- return status;
- }
-
-@@ -2494,7 +2494,7 @@ static int decode_attr_files_free(struct xdr_stream *xdr, uint32_t *bitmap, uint
- READ64(*res);
- bitmap[0] &= ~FATTR4_WORD0_FILES_FREE;
- }
-- dprintk("%s: files free=%Lu\n", __FUNCTION__, (unsigned long long)*res);
-+ dprintk("%s: files free=%Lu\n", __func__, (unsigned long long)*res);
- return status;
- }
-
-@@ -2511,7 +2511,7 @@ static int decode_attr_files_total(struct xdr_stream *xdr, uint32_t *bitmap, uin
- READ64(*res);
- bitmap[0] &= ~FATTR4_WORD0_FILES_TOTAL;
- }
-- dprintk("%s: files total=%Lu\n", __FUNCTION__, (unsigned long long)*res);
-+ dprintk("%s: files total=%Lu\n", __func__, (unsigned long long)*res);
- return status;
- }
-
-@@ -2569,7 +2569,7 @@ static int decode_attr_fs_locations(struct xdr_stream *xdr, uint32_t *bitmap, st
- status = 0;
- if (unlikely(!(bitmap[0] & FATTR4_WORD0_FS_LOCATIONS)))
- goto out;
-- dprintk("%s: fsroot ", __FUNCTION__);
-+ dprintk("%s: fsroot ", __func__);
- status = decode_pathname(xdr, &res->fs_path);
- if (unlikely(status != 0))
- goto out;
-@@ -2586,7 +2586,7 @@ static int decode_attr_fs_locations(struct xdr_stream *xdr, uint32_t *bitmap, st
- READ32(m);
-
- loc->nservers = 0;
-- dprintk("%s: servers ", __FUNCTION__);
-+ dprintk("%s: servers ", __func__);
- while (loc->nservers < m) {
- struct nfs4_string *server = &loc->servers[loc->nservers];
- status = decode_opaque_inline(xdr, &server->len, &server->data);
-@@ -2599,7 +2599,7 @@ static int decode_attr_fs_locations(struct xdr_stream *xdr, uint32_t *bitmap, st
- unsigned int i;
- dprintk("%s: using first %u of %u servers "
- "returned for location %u\n",
-- __FUNCTION__,
-+ __func__,
- NFS4_FS_LOCATION_MAXSERVERS,
- m, res->nlocations);
- for (i = loc->nservers; i < m; i++) {
-@@ -2618,7 +2618,7 @@ static int decode_attr_fs_locations(struct xdr_stream *xdr, uint32_t *bitmap, st
- res->nlocations++;
- }
- out:
-- dprintk("%s: fs_locations done, error = %d\n", __FUNCTION__, status);
-+ dprintk("%s: fs_locations done, error = %d\n", __func__, status);
- return status;
- out_eio:
- status = -EIO;
-@@ -2638,7 +2638,7 @@ static int decode_attr_maxfilesize(struct xdr_stream *xdr, uint32_t *bitmap, uin
- READ64(*res);
- bitmap[0] &= ~FATTR4_WORD0_MAXFILESIZE;
- }
-- dprintk("%s: maxfilesize=%Lu\n", __FUNCTION__, (unsigned long long)*res);
-+ dprintk("%s: maxfilesize=%Lu\n", __func__, (unsigned long long)*res);
- return status;
- }
-
-@@ -2655,7 +2655,7 @@ static int decode_attr_maxlink(struct xdr_stream *xdr, uint32_t *bitmap, uint32_
- READ32(*maxlink);
- bitmap[0] &= ~FATTR4_WORD0_MAXLINK;
- }
-- dprintk("%s: maxlink=%u\n", __FUNCTION__, *maxlink);
-+ dprintk("%s: maxlink=%u\n", __func__, *maxlink);
- return status;
- }
-
-@@ -2672,7 +2672,7 @@ static int decode_attr_maxname(struct xdr_stream *xdr, uint32_t *bitmap, uint32_
- READ32(*maxname);
- bitmap[0] &= ~FATTR4_WORD0_MAXNAME;
- }
-- dprintk("%s: maxname=%u\n", __FUNCTION__, *maxname);
-+ dprintk("%s: maxname=%u\n", __func__, *maxname);
- return status;
- }
-
-@@ -2693,7 +2693,7 @@ static int decode_attr_maxread(struct xdr_stream *xdr, uint32_t *bitmap, uint32_
- *res = (uint32_t)maxread;
- bitmap[0] &= ~FATTR4_WORD0_MAXREAD;
- }
-- dprintk("%s: maxread=%lu\n", __FUNCTION__, (unsigned long)*res);
-+ dprintk("%s: maxread=%lu\n", __func__, (unsigned long)*res);
- return status;
- }
-
-@@ -2714,7 +2714,7 @@ static int decode_attr_maxwrite(struct xdr_stream *xdr, uint32_t *bitmap, uint32
- *res = (uint32_t)maxwrite;
- bitmap[0] &= ~FATTR4_WORD0_MAXWRITE;
- }
-- dprintk("%s: maxwrite=%lu\n", __FUNCTION__, (unsigned long)*res);
-+ dprintk("%s: maxwrite=%lu\n", __func__, (unsigned long)*res);
- return status;
- }
-
-@@ -2731,7 +2731,7 @@ static int decode_attr_mode(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *
- *mode &= ~S_IFMT;
- bitmap[1] &= ~FATTR4_WORD1_MODE;
- }
-- dprintk("%s: file mode=0%o\n", __FUNCTION__, (unsigned int)*mode);
-+ dprintk("%s: file mode=0%o\n", __func__, (unsigned int)*mode);
- return 0;
- }
-
-@@ -2747,7 +2747,7 @@ static int decode_attr_nlink(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t
- READ32(*nlink);
- bitmap[1] &= ~FATTR4_WORD1_NUMLINKS;
- }
-- dprintk("%s: nlink=%u\n", __FUNCTION__, (unsigned int)*nlink);
-+ dprintk("%s: nlink=%u\n", __func__, (unsigned int)*nlink);
- return 0;
- }
-
-@@ -2766,13 +2766,13 @@ static int decode_attr_owner(struct xdr_stream *xdr, uint32_t *bitmap, struct nf
- if (len < XDR_MAX_NETOBJ) {
- if (nfs_map_name_to_uid(clp, (char *)p, len, uid) != 0)
- dprintk("%s: nfs_map_name_to_uid failed!\n",
-- __FUNCTION__);
-+ __func__);
- } else
- dprintk("%s: name too long (%u)!\n",
-- __FUNCTION__, len);
-+ __func__, len);
- bitmap[1] &= ~FATTR4_WORD1_OWNER;
- }
-- dprintk("%s: uid=%d\n", __FUNCTION__, (int)*uid);
-+ dprintk("%s: uid=%d\n", __func__, (int)*uid);
- return 0;
- }
-
-@@ -2791,13 +2791,13 @@ static int decode_attr_group(struct xdr_stream *xdr, uint32_t *bitmap, struct nf
- if (len < XDR_MAX_NETOBJ) {
- if (nfs_map_group_to_gid(clp, (char *)p, len, gid) != 0)
- dprintk("%s: nfs_map_group_to_gid failed!\n",
-- __FUNCTION__);
-+ __func__);
- } else
- dprintk("%s: name too long (%u)!\n",
-- __FUNCTION__, len);
-+ __func__, len);
- bitmap[1] &= ~FATTR4_WORD1_OWNER_GROUP;
- }
-- dprintk("%s: gid=%d\n", __FUNCTION__, (int)*gid);
-+ dprintk("%s: gid=%d\n", __func__, (int)*gid);
- return 0;
- }
-
-@@ -2820,7 +2820,7 @@ static int decode_attr_rdev(struct xdr_stream *xdr, uint32_t *bitmap, dev_t *rde
- *rdev = tmp;
- bitmap[1] &= ~ FATTR4_WORD1_RAWDEV;
- }
-- dprintk("%s: rdev=(0x%x:0x%x)\n", __FUNCTION__, major, minor);
-+ dprintk("%s: rdev=(0x%x:0x%x)\n", __func__, major, minor);
- return 0;
- }
-
-@@ -2837,7 +2837,7 @@ static int decode_attr_space_avail(struct xdr_stream *xdr, uint32_t *bitmap, uin
- READ64(*res);
- bitmap[1] &= ~FATTR4_WORD1_SPACE_AVAIL;
- }
-- dprintk("%s: space avail=%Lu\n", __FUNCTION__, (unsigned long long)*res);
-+ dprintk("%s: space avail=%Lu\n", __func__, (unsigned long long)*res);
- return status;
- }
-
-@@ -2854,7 +2854,7 @@ static int decode_attr_space_free(struct xdr_stream *xdr, uint32_t *bitmap, uint
- READ64(*res);
- bitmap[1] &= ~FATTR4_WORD1_SPACE_FREE;
- }
-- dprintk("%s: space free=%Lu\n", __FUNCTION__, (unsigned long long)*res);
-+ dprintk("%s: space free=%Lu\n", __func__, (unsigned long long)*res);
- return status;
- }
-
-@@ -2871,7 +2871,7 @@ static int decode_attr_space_total(struct xdr_stream *xdr, uint32_t *bitmap, uin
- READ64(*res);
- bitmap[1] &= ~FATTR4_WORD1_SPACE_TOTAL;
- }
-- dprintk("%s: space total=%Lu\n", __FUNCTION__, (unsigned long long)*res);
-+ dprintk("%s: space total=%Lu\n", __func__, (unsigned long long)*res);
- return status;
- }
-
-@@ -2887,7 +2887,7 @@ static int decode_attr_space_used(struct xdr_stream *xdr, uint32_t *bitmap, uint
- READ64(*used);
- bitmap[1] &= ~FATTR4_WORD1_SPACE_USED;
- }
-- dprintk("%s: space used=%Lu\n", __FUNCTION__,
-+ dprintk("%s: space used=%Lu\n", __func__,
- (unsigned long long)*used);
- return 0;
- }
-@@ -2918,7 +2918,7 @@ static int decode_attr_time_access(struct xdr_stream *xdr, uint32_t *bitmap, str
- status = decode_attr_time(xdr, time);
- bitmap[1] &= ~FATTR4_WORD1_TIME_ACCESS;
- }
-- dprintk("%s: atime=%ld\n", __FUNCTION__, (long)time->tv_sec);
-+ dprintk("%s: atime=%ld\n", __func__, (long)time->tv_sec);
- return status;
- }
-
-@@ -2934,7 +2934,7 @@ static int decode_attr_time_metadata(struct xdr_stream *xdr, uint32_t *bitmap, s
- status = decode_attr_time(xdr, time);
- bitmap[1] &= ~FATTR4_WORD1_TIME_METADATA;
- }
-- dprintk("%s: ctime=%ld\n", __FUNCTION__, (long)time->tv_sec);
-+ dprintk("%s: ctime=%ld\n", __func__, (long)time->tv_sec);
- return status;
- }
-
-@@ -2950,7 +2950,7 @@ static int decode_attr_time_modify(struct xdr_stream *xdr, uint32_t *bitmap, str
- status = decode_attr_time(xdr, time);
- bitmap[1] &= ~FATTR4_WORD1_TIME_MODIFY;
- }
-- dprintk("%s: mtime=%ld\n", __FUNCTION__, (long)time->tv_sec);
-+ dprintk("%s: mtime=%ld\n", __func__, (long)time->tv_sec);
- return status;
- }
-
-@@ -2962,7 +2962,7 @@ static int verify_attr_len(struct xdr_stream *xdr, __be32 *savep, uint32_t attrl
- if (unlikely(attrwords != nwords)) {
- dprintk("%s: server returned incorrect attribute length: "
- "%u %c %u\n",
-- __FUNCTION__,
-+ __func__,
- attrwords << 2,
- (attrwords < nwords) ? '<' : '>',
- nwords << 2);
-@@ -3067,7 +3067,7 @@ static int decode_server_caps(struct xdr_stream *xdr, struct nfs4_server_caps_re
- goto xdr_error;
- status = verify_attr_len(xdr, savep, attrlen);
- xdr_error:
-- dprintk("%s: xdr returned %d!\n", __FUNCTION__, -status);
-+ dprintk("%s: xdr returned %d!\n", __func__, -status);
- return status;
- }
-
-@@ -3100,7 +3100,7 @@ static int decode_statfs(struct xdr_stream *xdr, struct nfs_fsstat *fsstat)
-
- status = verify_attr_len(xdr, savep, attrlen);
- xdr_error:
-- dprintk("%s: xdr returned %d!\n", __FUNCTION__, -status);
-+ dprintk("%s: xdr returned %d!\n", __func__, -status);
- return status;
- }
-
-@@ -3125,7 +3125,7 @@ static int decode_pathconf(struct xdr_stream *xdr, struct nfs_pathconf *pathconf
-
- status = verify_attr_len(xdr, savep, attrlen);
- xdr_error:
-- dprintk("%s: xdr returned %d!\n", __FUNCTION__, -status);
-+ dprintk("%s: xdr returned %d!\n", __func__, -status);
- return status;
- }
-
-@@ -3193,7 +3193,7 @@ static int decode_getfattr(struct xdr_stream *xdr, struct nfs_fattr *fattr, cons
- if ((status = verify_attr_len(xdr, savep, attrlen)) == 0)
- fattr->valid = NFS_ATTR_FATTR | NFS_ATTR_FATTR_V3 | NFS_ATTR_FATTR_V4;
- xdr_error:
-- dprintk("%s: xdr returned %d\n", __FUNCTION__, -status);
-+ dprintk("%s: xdr returned %d\n", __func__, -status);
- return status;
- }
-
-@@ -3226,7 +3226,7 @@ static int decode_fsinfo(struct xdr_stream *xdr, struct nfs_fsinfo *fsinfo)
-
- status = verify_attr_len(xdr, savep, attrlen);
- xdr_error:
-- dprintk("%s: xdr returned %d!\n", __FUNCTION__, -status);
-+ dprintk("%s: xdr returned %d!\n", __func__, -status);
- return status;
- }
-
-@@ -3418,7 +3418,7 @@ static int decode_open(struct xdr_stream *xdr, struct nfs_openres *res)
-
- return decode_delegation(xdr, res);
- xdr_error:
-- dprintk("%s: Bitmap too large! Length = %u\n", __FUNCTION__, bmlen);
-+ dprintk("%s: Bitmap too large! Length = %u\n", __func__, bmlen);
- return -EIO;
- }
-
-@@ -3575,7 +3575,7 @@ short_pkt:
- * the call was successful, but incomplete. The caller can retry the
- * readdir starting at the last cookie.
- */
-- dprintk("%s: short packet at entry %d\n", __FUNCTION__, nr);
-+ dprintk("%s: short packet at entry %d\n", __func__, nr);
- entry[0] = entry[1] = 0;
- if (nr)
- goto out;
-diff --git a/fs/nfs/proc.c b/fs/nfs/proc.c
-index 5ccf7fa..03599bf 100644
---- a/fs/nfs/proc.c
-+++ b/fs/nfs/proc.c
-@@ -63,17 +63,17 @@ nfs_proc_get_root(struct nfs_server *server, struct nfs_fh *fhandle,
- };
- int status;
-
-- dprintk("%s: call getattr\n", __FUNCTION__);
-+ dprintk("%s: call getattr\n", __func__);
- nfs_fattr_init(fattr);
- status = rpc_call_sync(server->nfs_client->cl_rpcclient, &msg, 0);
-- dprintk("%s: reply getattr: %d\n", __FUNCTION__, status);
-+ dprintk("%s: reply getattr: %d\n", __func__, status);
- if (status)
- return status;
-- dprintk("%s: call statfs\n", __FUNCTION__);
-+ dprintk("%s: call statfs\n", __func__);
- msg.rpc_proc = &nfs_procedures[NFSPROC_STATFS];
- msg.rpc_resp = &fsinfo;
- status = rpc_call_sync(server->nfs_client->cl_rpcclient, &msg, 0);
-- dprintk("%s: reply statfs: %d\n", __FUNCTION__, status);
-+ dprintk("%s: reply statfs: %d\n", __func__, status);
- if (status)
- return status;
- info->rtmax = NFS_MAXDATA;
-diff --git a/fs/nfs/read.c b/fs/nfs/read.c
-index 16f57e0..40d1798 100644
---- a/fs/nfs/read.c
-+++ b/fs/nfs/read.c
-@@ -329,7 +329,7 @@ int nfs_readpage_result(struct rpc_task *task, struct nfs_read_data *data)
- {
- int status;
-
-- dprintk("NFS: %s: %5u, (status %d)\n", __FUNCTION__, task->tk_pid,
-+ dprintk("NFS: %s: %5u, (status %d)\n", __func__, task->tk_pid,
- task->tk_status);
-
- status = NFS_PROTO(data->inode)->read_done(task, data);
-diff --git a/fs/nfs/super.c b/fs/nfs/super.c
-index 7226a50..2a4a024 100644
---- a/fs/nfs/super.c
-+++ b/fs/nfs/super.c
-@@ -405,7 +405,7 @@ static int nfs_statfs(struct dentry *dentry, struct kstatfs *buf)
- return 0;
-
- out_err:
-- dprintk("%s: statfs error = %d\n", __FUNCTION__, -error);
-+ dprintk("%s: statfs error = %d\n", __func__, -error);
- unlock_kernel();
- return error;
- }
-@@ -2015,6 +2015,10 @@ static int nfs4_get_sb(struct file_system_type *fs_type,
- goto error_splat_super;
- }
-
-+ error = security_sb_set_mnt_opts(s, &data.lsm_opts);
-+ if (error)
-+ goto error_splat_root;
-+
- s->s_flags |= MS_ACTIVE;
- mnt->mnt_sb = s;
- mnt->mnt_root = mntroot;
-@@ -2031,6 +2035,8 @@ out_free:
- nfs_free_server(server);
- goto out;
-
-+error_splat_root:
-+ dput(mntroot);
- error_splat_super:
- up_write(&s->s_umount);
- deactivate_super(s);
-@@ -2114,6 +2120,8 @@ static int nfs4_xdev_get_sb(struct file_system_type *fs_type, int flags,
- mnt->mnt_sb = s;
- mnt->mnt_root = mntroot;
-
-+ security_sb_clone_mnt_opts(data->sb, s);
-+
- dprintk("<-- nfs4_xdev_get_sb() = 0\n");
- return 0;
-
-@@ -2197,6 +2205,8 @@ static int nfs4_referral_get_sb(struct file_system_type *fs_type, int flags,
- mnt->mnt_sb = s;
- mnt->mnt_root = mntroot;
-
-+ security_sb_clone_mnt_opts(data->sb, s);
-+
- dprintk("<-- nfs4_referral_get_sb() = 0\n");
- return 0;
-
-diff --git a/fs/nfs/write.c b/fs/nfs/write.c
-index 1ade11d..6d8ace3 100644
---- a/fs/nfs/write.c
-+++ b/fs/nfs/write.c
-@@ -415,7 +415,7 @@ nfs_dirty_request(struct nfs_page *req)
-
- if (page == NULL || test_bit(PG_NEED_COMMIT, &req->wb_flags))
- return 0;
-- return !PageWriteback(req->wb_page);
-+ return !PageWriteback(page);
- }
-
- #if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4)
-diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c
-index 0b3ffa9..4d4760e 100644
---- a/fs/nfsd/nfs4callback.c
-+++ b/fs/nfsd/nfs4callback.c
-@@ -419,9 +419,9 @@ static int do_probe_callback(void *data)
- out_release_client:
- rpc_shutdown_client(client);
- out_err:
-- put_nfs4_client(clp);
- dprintk("NFSD: warning: no callback path to client %.*s\n",
- (int)clp->cl_name.len, clp->cl_name.data);
-+ put_nfs4_client(clp);
- return status;
- }
-
-diff --git a/fs/ntfs/upcase.c b/fs/ntfs/upcase.c
-index 9101807..e2f72ca 100644
---- a/fs/ntfs/upcase.c
-+++ b/fs/ntfs/upcase.c
-@@ -77,11 +77,10 @@ ntfschar *generate_default_upcase(void)
- uc[i] = cpu_to_le16(i);
- for (r = 0; uc_run_table[r][0]; r++)
- for (i = uc_run_table[r][0]; i < uc_run_table[r][1]; i++)
-- uc[i] = cpu_to_le16(le16_to_cpu(uc[i]) +
-- uc_run_table[r][2]);
-+ le16_add_cpu(&uc[i], uc_run_table[r][2]);
- for (r = 0; uc_dup_table[r][0]; r++)
- for (i = uc_dup_table[r][0]; i < uc_dup_table[r][1]; i += 2)
-- uc[i + 1] = cpu_to_le16(le16_to_cpu(uc[i + 1]) - 1);
-+ le16_add_cpu(&uc[i + 1], -1);
- for (r = 0; uc_word_table[r][0]; r++)
- uc[uc_word_table[r][0]] = cpu_to_le16(uc_word_table[r][1]);
- return uc;
-diff --git a/fs/ocfs2/alloc.c b/fs/ocfs2/alloc.c
-index 41f84c9..10bfb46 100644
---- a/fs/ocfs2/alloc.c
-+++ b/fs/ocfs2/alloc.c
-@@ -2788,7 +2788,7 @@ static int ocfs2_merge_rec_right(struct inode *inode,
- BUG_ON(index >= le16_to_cpu(el->l_next_free_rec));
- left_rec = &el->l_recs[index];
-
-- if (index == le16_to_cpu(el->l_next_free_rec - 1) &&
-+ if (index == le16_to_cpu(el->l_next_free_rec) - 1 &&
- le16_to_cpu(el->l_next_free_rec) == le16_to_cpu(el->l_count)) {
- /* we meet with a cross extent block merge. */
- ret = ocfs2_get_right_path(inode, left_path, &right_path);
-@@ -2802,7 +2802,7 @@ static int ocfs2_merge_rec_right(struct inode *inode,
- BUG_ON(next_free <= 0);
- right_rec = &right_el->l_recs[0];
- if (ocfs2_is_empty_extent(right_rec)) {
-- BUG_ON(le16_to_cpu(next_free) <= 1);
-+ BUG_ON(next_free <= 1);
- right_rec = &right_el->l_recs[1];
- }
-
-diff --git a/fs/proc/base.c b/fs/proc/base.c
-index 808cbdc..c447e07 100644
---- a/fs/proc/base.c
-+++ b/fs/proc/base.c
-@@ -2441,7 +2441,7 @@ static const struct pid_entry tgid_base_stuff[] = {
- REG("oom_adj", S_IRUGO|S_IWUSR, oom_adjust),
- #ifdef CONFIG_AUDITSYSCALL
- REG("loginuid", S_IWUSR|S_IRUGO, loginuid),
-- REG("sessionid", S_IRUSR, sessionid),
-+ REG("sessionid", S_IRUGO, sessionid),
- #endif
- #ifdef CONFIG_FAULT_INJECTION
- REG("make-it-fail", S_IRUGO|S_IWUSR, fault_inject),
-diff --git a/fs/proc/inode.c b/fs/proc/inode.c
-index 6f4e8dc..b08d100 100644
---- a/fs/proc/inode.c
-+++ b/fs/proc/inode.c
-@@ -425,7 +425,8 @@ struct inode *proc_get_inode(struct super_block *sb, unsigned int ino,
- }
- }
- unlock_new_inode(inode);
-- }
-+ } else
-+ module_put(de->owner);
- return inode;
-
- out_ino:
-diff --git a/fs/proc/proc_misc.c b/fs/proc/proc_misc.c
-index 74a323d..32dc14c 100644
---- a/fs/proc/proc_misc.c
-+++ b/fs/proc/proc_misc.c
-@@ -139,7 +139,7 @@ static int meminfo_read_proc(char *page, char **start, off_t off,
- #define K(x) ((x) << (PAGE_SHIFT - 10))
- si_meminfo(&i);
- si_swapinfo(&i);
-- committed = atomic_read(&vm_committed_space);
-+ committed = atomic_long_read(&vm_committed_space);
- allowed = ((totalram_pages - hugetlb_total_pages())
- * sysctl_overcommit_ratio / 100) + total_swap_pages;
-
-diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c
-index a1c3a1f..8c0e4b9 100644
---- a/fs/sysfs/dir.c
-+++ b/fs/sysfs/dir.c
-@@ -419,12 +419,8 @@ void sysfs_addrm_start(struct sysfs_addrm_cxt *acxt,
- */
- int sysfs_add_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd)
- {
-- if (sysfs_find_dirent(acxt->parent_sd, sd->s_name)) {
-- printk(KERN_WARNING "sysfs: duplicate filename '%s' "
-- "can not be created\n", sd->s_name);
-- WARN_ON(1);
-+ if (sysfs_find_dirent(acxt->parent_sd, sd->s_name))
- return -EEXIST;
-- }
-
- sd->s_parent = sysfs_get(acxt->parent_sd);
-
-diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c
-index 5105015..98e0e86 100644
---- a/fs/xfs/linux-2.6/xfs_buf.c
-+++ b/fs/xfs/linux-2.6/xfs_buf.c
-@@ -387,6 +387,8 @@ _xfs_buf_lookup_pages(
- if (unlikely(page == NULL)) {
- if (flags & XBF_READ_AHEAD) {
- bp->b_page_count = i;
-+ for (i = 0; i < bp->b_page_count; i++)
-+ unlock_page(bp->b_pages[i]);
- return -ENOMEM;
- }
-
-@@ -416,17 +418,24 @@ _xfs_buf_lookup_pages(
- ASSERT(!PagePrivate(page));
- if (!PageUptodate(page)) {
- page_count--;
-- if (blocksize < PAGE_CACHE_SIZE && !PagePrivate(page)) {
-+ if (blocksize >= PAGE_CACHE_SIZE) {
-+ if (flags & XBF_READ)
-+ bp->b_flags |= _XBF_PAGE_LOCKED;
-+ } else if (!PagePrivate(page)) {
- if (test_page_region(page, offset, nbytes))
- page_count++;
- }
- }
-
-- unlock_page(page);
- bp->b_pages[i] = page;
- offset = 0;
- }
-
-+ if (!(bp->b_flags & _XBF_PAGE_LOCKED)) {
-+ for (i = 0; i < bp->b_page_count; i++)
-+ unlock_page(bp->b_pages[i]);
-+ }
-+
- if (page_count == bp->b_page_count)
- bp->b_flags |= XBF_DONE;
-
-@@ -746,6 +755,7 @@ xfs_buf_associate_memory(
- bp->b_count_desired = len;
- bp->b_buffer_length = buflen;
- bp->b_flags |= XBF_MAPPED;
-+ bp->b_flags &= ~_XBF_PAGE_LOCKED;
-
- return 0;
- }
-@@ -1093,8 +1103,10 @@ _xfs_buf_ioend(
- xfs_buf_t *bp,
- int schedule)
- {
-- if (atomic_dec_and_test(&bp->b_io_remaining) == 1)
-+ if (atomic_dec_and_test(&bp->b_io_remaining) == 1) {
-+ bp->b_flags &= ~_XBF_PAGE_LOCKED;
- xfs_buf_ioend(bp, schedule);
-+ }
- }
-
- STATIC void
-@@ -1125,6 +1137,9 @@ xfs_buf_bio_end_io(
-
- if (--bvec >= bio->bi_io_vec)
- prefetchw(&bvec->bv_page->flags);
-+
-+ if (bp->b_flags & _XBF_PAGE_LOCKED)
-+ unlock_page(page);
- } while (bvec >= bio->bi_io_vec);
-
- _xfs_buf_ioend(bp, 1);
-@@ -1163,7 +1178,8 @@ _xfs_buf_ioapply(
- * filesystem block size is not smaller than the page size.
- */
- if ((bp->b_buffer_length < PAGE_CACHE_SIZE) &&
-- (bp->b_flags & XBF_READ) &&
-+ ((bp->b_flags & (XBF_READ|_XBF_PAGE_LOCKED)) ==
-+ (XBF_READ|_XBF_PAGE_LOCKED)) &&
- (blocksize >= PAGE_CACHE_SIZE)) {
- bio = bio_alloc(GFP_NOIO, 1);
-
-diff --git a/fs/xfs/linux-2.6/xfs_buf.h b/fs/xfs/linux-2.6/xfs_buf.h
-index 841d788..f948ec7 100644
---- a/fs/xfs/linux-2.6/xfs_buf.h
-+++ b/fs/xfs/linux-2.6/xfs_buf.h
-@@ -66,6 +66,25 @@ typedef enum {
- _XBF_PAGES = (1 << 18), /* backed by refcounted pages */
- _XBF_RUN_QUEUES = (1 << 19),/* run block device task queue */
- _XBF_DELWRI_Q = (1 << 21), /* buffer on delwri queue */
-+
-+ /*
-+ * Special flag for supporting metadata blocks smaller than a FSB.
-+ *
-+ * In this case we can have multiple xfs_buf_t on a single page and
-+ * need to lock out concurrent xfs_buf_t readers as they only
-+ * serialise access to the buffer.
-+ *
-+ * If the FSB size >= PAGE_CACHE_SIZE case, we have no serialisation
-+ * between reads of the page. Hence we can have one thread read the
-+ * page and modify it, but then race with another thread that thinks
-+ * the page is not up-to-date and hence reads it again.
-+ *
-+ * The result is that the first modifcation to the page is lost.
-+ * This sort of AGF/AGI reading race can happen when unlinking inodes
-+ * that require truncation and results in the AGI unlinked list
-+ * modifications being lost.
-+ */
-+ _XBF_PAGE_LOCKED = (1 << 22),
- } xfs_buf_flags_t;
-
- typedef enum {
-diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c
-index 65e78c1..5f60363 100644
---- a/fs/xfs/linux-2.6/xfs_file.c
-+++ b/fs/xfs/linux-2.6/xfs_file.c
-@@ -184,19 +184,24 @@ xfs_file_release(
- return -xfs_release(XFS_I(inode));
- }
-
-+/*
-+ * We ignore the datasync flag here because a datasync is effectively
-+ * identical to an fsync. That is, datasync implies that we need to write
-+ * only the metadata needed to be able to access the data that is written
-+ * if we crash after the call completes. Hence if we are writing beyond
-+ * EOF we have to log the inode size change as well, which makes it a
-+ * full fsync. If we don't write beyond EOF, the inode core will be
-+ * clean in memory and so we don't need to log the inode, just like
-+ * fsync.
-+ */
- STATIC int
- xfs_file_fsync(
- struct file *filp,
- struct dentry *dentry,
- int datasync)
- {
-- int flags = FSYNC_WAIT;
--
-- if (datasync)
-- flags |= FSYNC_DATA;
- xfs_iflags_clear(XFS_I(dentry->d_inode), XFS_ITRUNCATED);
-- return -xfs_fsync(XFS_I(dentry->d_inode), flags,
-- (xfs_off_t)0, (xfs_off_t)-1);
-+ return -xfs_fsync(XFS_I(dentry->d_inode));
- }
-
- /*
-diff --git a/fs/xfs/linux-2.6/xfs_vnode.h b/fs/xfs/linux-2.6/xfs_vnode.h
-index 9d73cb5..25eb2a9 100644
---- a/fs/xfs/linux-2.6/xfs_vnode.h
-+++ b/fs/xfs/linux-2.6/xfs_vnode.h
-@@ -230,14 +230,6 @@ static inline void vn_atime_to_time_t(bhv_vnode_t *vp, time_t *tt)
- #define ATTR_NOSIZETOK 0x400 /* Don't get the SIZE token */
-
- /*
-- * Flags to vop_fsync/reclaim.
-- */
--#define FSYNC_NOWAIT 0 /* asynchronous flush */
--#define FSYNC_WAIT 0x1 /* synchronous fsync or forced reclaim */
--#define FSYNC_INVAL 0x2 /* flush and invalidate cached data */
--#define FSYNC_DATA 0x4 /* synchronous fsync of data only */
--
--/*
- * Tracking vnode activity.
- */
- #if defined(XFS_INODE_TRACE)
-diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
-index cf0bb9c..e569bf5 100644
---- a/fs/xfs/xfs_inode.c
-+++ b/fs/xfs/xfs_inode.c
-@@ -2974,6 +2974,7 @@ xfs_iflush_cluster(
- xfs_mount_t *mp = ip->i_mount;
- xfs_perag_t *pag = xfs_get_perag(mp, ip->i_ino);
- unsigned long first_index, mask;
-+ unsigned long inodes_per_cluster;
- int ilist_size;
- xfs_inode_t **ilist;
- xfs_inode_t *iq;
-@@ -2985,8 +2986,9 @@ xfs_iflush_cluster(
- ASSERT(pag->pagi_inodeok);
- ASSERT(pag->pag_ici_init);
-
-- ilist_size = XFS_INODE_CLUSTER_SIZE(mp) * sizeof(xfs_inode_t *);
-- ilist = kmem_alloc(ilist_size, KM_MAYFAIL);
-+ inodes_per_cluster = XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_inodelog;
-+ ilist_size = inodes_per_cluster * sizeof(xfs_inode_t *);
-+ ilist = kmem_alloc(ilist_size, KM_MAYFAIL|KM_NOFS);
- if (!ilist)
- return 0;
-
-@@ -2995,8 +2997,7 @@ xfs_iflush_cluster(
- read_lock(&pag->pag_ici_lock);
- /* really need a gang lookup range call here */
- nr_found = radix_tree_gang_lookup(&pag->pag_ici_root, (void**)ilist,
-- first_index,
-- XFS_INODE_CLUSTER_SIZE(mp));
-+ first_index, inodes_per_cluster);
- if (nr_found == 0)
- goto out_free;
-
-diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c
-index 70702a6..e475e37 100644
---- a/fs/xfs/xfs_vnodeops.c
-+++ b/fs/xfs/xfs_vnodeops.c
-@@ -856,18 +856,14 @@ xfs_readlink(
- /*
- * xfs_fsync
- *
-- * This is called to sync the inode and its data out to disk.
-- * We need to hold the I/O lock while flushing the data, and
-- * the inode lock while flushing the inode. The inode lock CANNOT
-- * be held while flushing the data, so acquire after we're done
-- * with that.
-+ * This is called to sync the inode and its data out to disk. We need to hold
-+ * the I/O lock while flushing the data, and the inode lock while flushing the
-+ * inode. The inode lock CANNOT be held while flushing the data, so acquire
-+ * after we're done with that.
- */
- int
- xfs_fsync(
-- xfs_inode_t *ip,
-- int flag,
-- xfs_off_t start,
-- xfs_off_t stop)
-+ xfs_inode_t *ip)
- {
- xfs_trans_t *tp;
- int error;
-@@ -875,103 +871,79 @@ xfs_fsync(
-
- xfs_itrace_entry(ip);
-
-- ASSERT(start >= 0 && stop >= -1);
--
- if (XFS_FORCED_SHUTDOWN(ip->i_mount))
- return XFS_ERROR(EIO);
-
-- if (flag & FSYNC_DATA)
-- filemap_fdatawait(vn_to_inode(XFS_ITOV(ip))->i_mapping);
-+ /* capture size updates in I/O completion before writing the inode. */
-+ error = filemap_fdatawait(vn_to_inode(XFS_ITOV(ip))->i_mapping);
-+ if (error)
-+ return XFS_ERROR(error);
-
- /*
-- * We always need to make sure that the required inode state
-- * is safe on disk. The vnode might be clean but because
-- * of committed transactions that haven't hit the disk yet.
-- * Likewise, there could be unflushed non-transactional
-- * changes to the inode core that have to go to disk.
-+ * We always need to make sure that the required inode state is safe on
-+ * disk. The vnode might be clean but we still might need to force the
-+ * log because of committed transactions that haven't hit the disk yet.
-+ * Likewise, there could be unflushed non-transactional changes to the
-+ * inode core that have to go to disk and this requires us to issue
-+ * a synchronous transaction to capture these changes correctly.
- *
-- * The following code depends on one assumption: that
-- * any transaction that changes an inode logs the core
-- * because it has to change some field in the inode core
-- * (typically nextents or nblocks). That assumption
-- * implies that any transactions against an inode will
-- * catch any non-transactional updates. If inode-altering
-- * transactions exist that violate this assumption, the
-- * code breaks. Right now, it figures that if the involved
-- * update_* field is clear and the inode is unpinned, the
-- * inode is clean. Either it's been flushed or it's been
-- * committed and the commit has hit the disk unpinning the inode.
-- * (Note that xfs_inode_item_format() called at commit clears
-- * the update_* fields.)
-+ * This code relies on the assumption that if the update_* fields
-+ * of the inode are clear and the inode is unpinned then it is clean
-+ * and no action is required.
- */
- xfs_ilock(ip, XFS_ILOCK_SHARED);
-
-- /* If we are flushing data then we care about update_size
-- * being set, otherwise we care about update_core
-- */
-- if ((flag & FSYNC_DATA) ?
-- (ip->i_update_size == 0) :
-- (ip->i_update_core == 0)) {
-+ if (!(ip->i_update_size || ip->i_update_core)) {
- /*
-- * Timestamps/size haven't changed since last inode
-- * flush or inode transaction commit. That means
-- * either nothing got written or a transaction
-- * committed which caught the updates. If the
-- * latter happened and the transaction hasn't
-- * hit the disk yet, the inode will be still
-- * be pinned. If it is, force the log.
-+ * Timestamps/size haven't changed since last inode flush or
-+ * inode transaction commit. That means either nothing got
-+ * written or a transaction committed which caught the updates.
-+ * If the latter happened and the transaction hasn't hit the
-+ * disk yet, the inode will be still be pinned. If it is,
-+ * force the log.
- */
-
- xfs_iunlock(ip, XFS_ILOCK_SHARED);
-
- if (xfs_ipincount(ip)) {
-- _xfs_log_force(ip->i_mount, (xfs_lsn_t)0,
-- XFS_LOG_FORCE |
-- ((flag & FSYNC_WAIT)
-- ? XFS_LOG_SYNC : 0),
-+ error = _xfs_log_force(ip->i_mount, (xfs_lsn_t)0,
-+ XFS_LOG_FORCE | XFS_LOG_SYNC,
- &log_flushed);
- } else {
- /*
-- * If the inode is not pinned and nothing
-- * has changed we don't need to flush the
-- * cache.
-+ * If the inode is not pinned and nothing has changed
-+ * we don't need to flush the cache.
- */
- changed = 0;
- }
-- error = 0;
- } else {
- /*
-- * Kick off a transaction to log the inode
-- * core to get the updates. Make it
-- * sync if FSYNC_WAIT is passed in (which
-- * is done by everybody but specfs). The
-- * sync transaction will also force the log.
-+ * Kick off a transaction to log the inode core to get the
-+ * updates. The sync transaction will also force the log.
- */
- xfs_iunlock(ip, XFS_ILOCK_SHARED);
- tp = xfs_trans_alloc(ip->i_mount, XFS_TRANS_FSYNC_TS);
-- if ((error = xfs_trans_reserve(tp, 0,
-- XFS_FSYNC_TS_LOG_RES(ip->i_mount),
-- 0, 0, 0))) {
-+ error = xfs_trans_reserve(tp, 0,
-+ XFS_FSYNC_TS_LOG_RES(ip->i_mount), 0, 0, 0);
-+ if (error) {
- xfs_trans_cancel(tp, 0);
- return error;
- }
- xfs_ilock(ip, XFS_ILOCK_EXCL);
-
- /*
-- * Note - it's possible that we might have pushed
-- * ourselves out of the way during trans_reserve
-- * which would flush the inode. But there's no
-- * guarantee that the inode buffer has actually
-- * gone out yet (it's delwri). Plus the buffer
-- * could be pinned anyway if it's part of an
-- * inode in another recent transaction. So we
-- * play it safe and fire off the transaction anyway.
-+ * Note - it's possible that we might have pushed ourselves out
-+ * of the way during trans_reserve which would flush the inode.
-+ * But there's no guarantee that the inode buffer has actually
-+ * gone out yet (it's delwri). Plus the buffer could be pinned
-+ * anyway if it's part of an inode in another recent
-+ * transaction. So we play it safe and fire off the
-+ * transaction anyway.
- */
- xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL);
- xfs_trans_ihold(tp, ip);
- xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
-- if (flag & FSYNC_WAIT)
-- xfs_trans_set_sync(tp);
-+ xfs_trans_set_sync(tp);
- error = _xfs_trans_commit(tp, 0, &log_flushed);
-
- xfs_iunlock(ip, XFS_ILOCK_EXCL);
-diff --git a/fs/xfs/xfs_vnodeops.h b/fs/xfs/xfs_vnodeops.h
-index 8abe8f1..57335ba 100644
---- a/fs/xfs/xfs_vnodeops.h
-+++ b/fs/xfs/xfs_vnodeops.h
-@@ -18,8 +18,7 @@ int xfs_open(struct xfs_inode *ip);
- int xfs_setattr(struct xfs_inode *ip, struct bhv_vattr *vap, int flags,
- struct cred *credp);
- int xfs_readlink(struct xfs_inode *ip, char *link);
--int xfs_fsync(struct xfs_inode *ip, int flag, xfs_off_t start,
-- xfs_off_t stop);
-+int xfs_fsync(struct xfs_inode *ip);
- int xfs_release(struct xfs_inode *ip);
- int xfs_inactive(struct xfs_inode *ip);
- int xfs_lookup(struct xfs_inode *dp, struct xfs_name *name,
-diff --git a/include/asm-arm/arch-omap/board-palmte.h b/include/asm-arm/arch-omap/board-palmte.h
-index cd22035..6fac2c8 100644
---- a/include/asm-arm/arch-omap/board-palmte.h
-+++ b/include/asm-arm/arch-omap/board-palmte.h
-@@ -14,8 +14,6 @@
- #ifndef __OMAP_BOARD_PALMTE_H
- #define __OMAP_BOARD_PALMTE_H
-
--#include
--
- #define PALMTE_USBDETECT_GPIO 0
- #define PALMTE_USB_OR_DC_GPIO 1
- #define PALMTE_TSC_GPIO 4
-diff --git a/include/asm-arm/arch-omap/clock.h b/include/asm-arm/arch-omap/clock.h
-index 57523bd..12a5e4d 100644
---- a/include/asm-arm/arch-omap/clock.h
-+++ b/include/asm-arm/arch-omap/clock.h
-@@ -73,6 +73,8 @@ struct clk {
- #endif
- };
-
-+struct cpufreq_frequency_table;
-+
- struct clk_functions {
- int (*clk_enable)(struct clk *clk);
- void (*clk_disable)(struct clk *clk);
-@@ -83,6 +85,9 @@ struct clk_functions {
- void (*clk_allow_idle)(struct clk *clk);
- void (*clk_deny_idle)(struct clk *clk);
- void (*clk_disable_unused)(struct clk *clk);
-+#ifdef CONFIG_CPU_FREQ
-+ void (*clk_init_cpufreq_table)(struct cpufreq_frequency_table **);
-+#endif
- };
-
- extern unsigned int mpurate;
-diff --git a/include/asm-arm/arch-omap/entry-macro.S b/include/asm-arm/arch-omap/entry-macro.S
-index 74cd572..369093a 100644
---- a/include/asm-arm/arch-omap/entry-macro.S
-+++ b/include/asm-arm/arch-omap/entry-macro.S
-@@ -8,6 +8,7 @@
- * warranty of any kind, whether express or implied.
- */
- #include
-+#include
- #include
-
- #if defined(CONFIG_ARCH_OMAP1)
-diff --git a/include/asm-arm/arch-omap/gpio.h b/include/asm-arm/arch-omap/gpio.h
-index 86621a0..5ee6a49 100644
---- a/include/asm-arm/arch-omap/gpio.h
-+++ b/include/asm-arm/arch-omap/gpio.h
-@@ -26,7 +26,6 @@
- #ifndef __ASM_ARCH_OMAP_GPIO_H
- #define __ASM_ARCH_OMAP_GPIO_H
-
--#include
- #include
- #include
-
-diff --git a/include/asm-arm/arch-omap/hardware.h b/include/asm-arm/arch-omap/hardware.h
-index da57209..91d85b3 100644
---- a/include/asm-arm/arch-omap/hardware.h
-+++ b/include/asm-arm/arch-omap/hardware.h
-@@ -41,7 +41,6 @@
- #include
- #include
- #endif
--#include
- #include
-
- /*
-diff --git a/include/asm-arm/arch-sa1100/collie.h b/include/asm-arm/arch-sa1100/collie.h
-index 14a344a..762eba5 100644
---- a/include/asm-arm/arch-sa1100/collie.h
-+++ b/include/asm-arm/arch-sa1100/collie.h
-@@ -34,9 +34,12 @@
-
- #define COLLIE_GPIO_ON_KEY GPIO_GPIO (0)
- #define COLLIE_GPIO_AC_IN GPIO_GPIO (1)
-+#define COLLIE_GPIO_SDIO_INT GPIO_GPIO (11)
- #define COLLIE_GPIO_CF_IRQ GPIO_GPIO (14)
- #define COLLIE_GPIO_nREMOCON_INT GPIO_GPIO (15)
- #define COLLIE_GPIO_UCB1x00_RESET GPIO_GPIO (16)
-+#define COLLIE_GPIO_nMIC_ON GPIO_GPIO (17)
-+#define COLLIE_GPIO_nREMOCON_ON GPIO_GPIO (18)
- #define COLLIE_GPIO_CO GPIO_GPIO (20)
- #define COLLIE_GPIO_MCP_CLK GPIO_GPIO (21)
- #define COLLIE_GPIO_CF_CD GPIO_GPIO (22)
-@@ -49,6 +52,7 @@
-
- #define COLLIE_IRQ_GPIO_ON_KEY IRQ_GPIO0
- #define COLLIE_IRQ_GPIO_AC_IN IRQ_GPIO1
-+#define COLLIE_IRQ_GPIO_SDIO_IRQ IRQ_GPIO11
- #define COLLIE_IRQ_GPIO_CF_IRQ IRQ_GPIO14
- #define COLLIE_IRQ_GPIO_nREMOCON_INT IRQ_GPIO15
- #define COLLIE_IRQ_GPIO_CO IRQ_GPIO20
-diff --git a/include/asm-arm/page.h b/include/asm-arm/page.h
-index 5c22b01..8e05bdb 100644
---- a/include/asm-arm/page.h
-+++ b/include/asm-arm/page.h
-@@ -179,10 +179,10 @@ typedef unsigned long pgprot_t;
-
- #endif /* STRICT_MM_TYPECHECKS */
-
--typedef struct page *pgtable_t;
--
- #endif /* CONFIG_MMU */
-
-+typedef struct page *pgtable_t;
-+
- #include
-
- #endif /* !__ASSEMBLY__ */
-diff --git a/include/asm-arm/system.h b/include/asm-arm/system.h
-index 6335de9..514af79 100644
---- a/include/asm-arm/system.h
-+++ b/include/asm-arm/system.h
-@@ -48,20 +48,6 @@
- #define CPUID_TCM 2
- #define CPUID_TLBTYPE 3
-
--#ifdef CONFIG_CPU_CP15
--#define read_cpuid(reg) \
-- ({ \
-- unsigned int __val; \
-- asm("mrc p15, 0, %0, c0, c0, " __stringify(reg) \
-- : "=r" (__val) \
-- : \
-- : "cc"); \
-- __val; \
-- })
--#else
--#define read_cpuid(reg) (processor_id)
--#endif
--
- /*
- * This is used to ensure the compiler did actually allocate the register we
- * asked it for some inline assembly sequences. Apparently we can't trust
-@@ -78,6 +64,21 @@
- #include
- #include
-
-+#ifdef CONFIG_CPU_CP15
-+#define read_cpuid(reg) \
-+ ({ \
-+ unsigned int __val; \
-+ asm("mrc p15, 0, %0, c0, c0, " __stringify(reg) \
-+ : "=r" (__val) \
-+ : \
-+ : "cc"); \
-+ __val; \
-+ })
-+#else
-+extern unsigned int processor_id;
-+#define read_cpuid(reg) (processor_id)
-+#endif
-+
- /*
- * The CPU ID never changes at run time, so we might as well tell the
- * compiler that it's constant. Use this function to read the CPU ID
-diff --git a/include/asm-blackfin/bfin-global.h b/include/asm-blackfin/bfin-global.h
-index 716df7c..a9248d8 100644
---- a/include/asm-blackfin/bfin-global.h
-+++ b/include/asm-blackfin/bfin-global.h
-@@ -37,7 +37,9 @@
- #include
- #include
-
--#if defined(CONFIG_DMA_UNCACHED_2M)
-+#if defined(CONFIG_DMA_UNCACHED_4M)
-+# define DMA_UNCACHED_REGION (4 * 1024 * 1024)
-+#elif defined(CONFIG_DMA_UNCACHED_2M)
- # define DMA_UNCACHED_REGION (2 * 1024 * 1024)
- #elif defined(CONFIG_DMA_UNCACHED_1M)
- # define DMA_UNCACHED_REGION (1024 * 1024)
-diff --git a/include/asm-blackfin/checksum.h b/include/asm-blackfin/checksum.h
-index 2638f25..6f6af2b 100644
---- a/include/asm-blackfin/checksum.h
-+++ b/include/asm-blackfin/checksum.h
-@@ -15,7 +15,7 @@
- *
- * it's best to have buff aligned on a 32-bit boundary
- */
--unsigned int csum_partial(const unsigned char *buff, int len, unsigned int sum);
-+__wsum csum_partial(const void *buff, int len, __wsum sum);
-
- /*
- * the same as csum_partial, but copies from src while it
-@@ -25,8 +25,8 @@ unsigned int csum_partial(const unsigned char *buff, int len, unsigned int sum);
- * better 64-bit) boundary
- */
-
--unsigned int csum_partial_copy(const unsigned char *src, unsigned char *dst,
-- int len, int sum);
-+__wsum csum_partial_copy(const void *src, void *dst,
-+ int len, __wsum sum);
-
- /*
- * the same as csum_partial_copy, but copies from user space.
-@@ -35,20 +35,19 @@ unsigned int csum_partial_copy(const unsigned char *src, unsigned char *dst,
- * better 64-bit) boundary
- */
-
--extern unsigned int csum_partial_copy_from_user(const unsigned char *src,
-- unsigned char *dst, int len,
-- int sum, int *csum_err);
-+extern __wsum csum_partial_copy_from_user(const void __user *src, void *dst,
-+ int len, __wsum sum, int *csum_err);
-
- #define csum_partial_copy_nocheck(src, dst, len, sum) \
- csum_partial_copy((src), (dst), (len), (sum))
-
--unsigned short ip_fast_csum(unsigned char *iph, unsigned int ihl);
-+__sum16 ip_fast_csum(unsigned char *iph, unsigned int ihl);
-
- /*
- * Fold a partial checksum
- */
-
--static inline unsigned int csum_fold(unsigned int sum)
-+static inline __sum16 csum_fold(__wsum sum)
- {
- while (sum >> 16)
- sum = (sum & 0xffff) + (sum >> 16);
-@@ -60,9 +59,9 @@ static inline unsigned int csum_fold(unsigned int sum)
- * returns a 16-bit checksum, already complemented
- */
-
--static inline unsigned int
--csum_tcpudp_nofold(unsigned long saddr, unsigned long daddr, unsigned short len,
-- unsigned short proto, unsigned int sum)
-+static inline __wsum
-+csum_tcpudp_nofold(__be32 saddr, __be32 daddr, unsigned short len,
-+ unsigned short proto, __wsum sum)
- {
-
- __asm__ ("%0 = %0 + %1;\n\t"
-@@ -84,9 +83,9 @@ csum_tcpudp_nofold(unsigned long saddr, unsigned long daddr, unsigned short len,
- return (sum);
- }
-
--static inline unsigned short int
--csum_tcpudp_magic(unsigned long saddr, unsigned long daddr, unsigned short len,
-- unsigned short proto, unsigned int sum)
-+static inline __sum16
-+csum_tcpudp_magic(__be32 saddr, __be32 daddr, unsigned short len,
-+ unsigned short proto, __wsum sum)
- {
- return csum_fold(csum_tcpudp_nofold(saddr, daddr, len, proto, sum));
- }
-@@ -96,6 +95,6 @@ csum_tcpudp_magic(unsigned long saddr, unsigned long daddr, unsigned short len,
- * in icmp.c
- */
-
--extern unsigned short ip_compute_csum(const unsigned char *buff, int len);
-+extern __sum16 ip_compute_csum(const void *buff, int len);
-
- #endif /* _BFIN_CHECKSUM_H */
-diff --git a/include/asm-blackfin/gpio.h b/include/asm-blackfin/gpio.h
-index 27ff532..ff95e9d 100644
---- a/include/asm-blackfin/gpio.h
-+++ b/include/asm-blackfin/gpio.h
-@@ -437,7 +437,6 @@ void gpio_set_value(unsigned gpio, int arg);
- int gpio_get_value(unsigned gpio);
-
- #ifndef BF548_FAMILY
--#define gpio_get_value(gpio) get_gpio_data(gpio)
- #define gpio_set_value(gpio, value) set_gpio_data(gpio, value)
- #endif
-
-diff --git a/include/asm-blackfin/io.h b/include/asm-blackfin/io.h
-index 574fe56..cbbf7ff 100644
---- a/include/asm-blackfin/io.h
-+++ b/include/asm-blackfin/io.h
-@@ -117,10 +117,12 @@ static inline unsigned int readl(const volatile void __iomem *addr)
-
- extern void outsb(unsigned long port, const void *addr, unsigned long count);
- extern void outsw(unsigned long port, const void *addr, unsigned long count);
-+extern void outsw_8(unsigned long port, const void *addr, unsigned long count);
- extern void outsl(unsigned long port, const void *addr, unsigned long count);
-
- extern void insb(unsigned long port, void *addr, unsigned long count);
- extern void insw(unsigned long port, void *addr, unsigned long count);
-+extern void insw_8(unsigned long port, void *addr, unsigned long count);
- extern void insl(unsigned long port, void *addr, unsigned long count);
- extern void insl_16(unsigned long port, void *addr, unsigned long count);
-
-diff --git a/include/asm-blackfin/mach-bf527/blackfin.h b/include/asm-blackfin/mach-bf527/blackfin.h
-index 2891727..297821e 100644
---- a/include/asm-blackfin/mach-bf527/blackfin.h
-+++ b/include/asm-blackfin/mach-bf527/blackfin.h
-@@ -39,22 +39,22 @@
- #include "defBF522.h"
- #include "anomaly.h"
-
--#if defined(CONFIG_BF527)
-+#if defined(CONFIG_BF527) || defined(CONFIG_BF526)
- #include "defBF527.h"
- #endif
-
--#if defined(CONFIG_BF525)
-+#if defined(CONFIG_BF525) || defined(CONFIG_BF524)
- #include "defBF525.h"
- #endif
-
- #if !defined(__ASSEMBLY__)
- #include "cdefBF522.h"
-
--#if defined(CONFIG_BF527)
-+#if defined(CONFIG_BF527) || defined(CONFIG_BF526)
- #include "cdefBF527.h"
- #endif
-
--#if defined(CONFIG_BF525)
-+#if defined(CONFIG_BF525) || defined(CONFIG_BF524)
- #include "cdefBF525.h"
- #endif
- #endif
-diff --git a/include/asm-blackfin/mach-bf561/dma.h b/include/asm-blackfin/mach-bf561/dma.h
-index 21d9820..8bc46cd 100644
---- a/include/asm-blackfin/mach-bf561/dma.h
-+++ b/include/asm-blackfin/mach-bf561/dma.h
-@@ -25,11 +25,11 @@
- #define CH_MEM_STREAM1_SRC 27 /* RX */
- #define CH_MEM_STREAM2_DEST 28
- #define CH_MEM_STREAM2_SRC 29
--#define CH_MEM_STREAM3_SRC 30
--#define CH_MEM_STREAM3_DEST 31
-+#define CH_MEM_STREAM3_DEST 30
-+#define CH_MEM_STREAM3_SRC 31
- #define CH_IMEM_STREAM0_DEST 32
- #define CH_IMEM_STREAM0_SRC 33
--#define CH_IMEM_STREAM1_SRC 34
--#define CH_IMEM_STREAM1_DEST 35
-+#define CH_IMEM_STREAM1_DEST 34
-+#define CH_IMEM_STREAM1_SRC 35
-
- #endif
-diff --git a/include/asm-blackfin/serial.h b/include/asm-blackfin/serial.h
-new file mode 100644
-index 0000000..994dd86
---- /dev/null
-+++ b/include/asm-blackfin/serial.h
-@@ -0,0 +1,5 @@
-+/*
-+ * include/asm-blackfin/serial.h
-+ */
-+
-+#define SERIAL_EXTRA_IRQ_FLAGS IRQF_TRIGGER_HIGH
-diff --git a/include/asm-generic/gpio.h b/include/asm-generic/gpio.h
-index ecf675a..6be061d 100644
---- a/include/asm-generic/gpio.h
-+++ b/include/asm-generic/gpio.h
-@@ -1,8 +1,12 @@
- #ifndef _ASM_GENERIC_GPIO_H
- #define _ASM_GENERIC_GPIO_H
-
-+#include
-+
- #ifdef CONFIG_HAVE_GPIO_LIB
-
-+#include
-+
- /* Platforms may implement their GPIO interface with library code,
- * at a small performance cost for non-inlined operations and some
- * extra memory (for code and for per-GPIO table entries).
-@@ -74,7 +78,7 @@ struct gpio_chip {
-
- extern const char *gpiochip_is_requested(struct gpio_chip *chip,
- unsigned offset);
--extern int __init __must_check gpiochip_reserve(int start, int ngpio);
-+extern int __must_check gpiochip_reserve(int start, int ngpio);
-
- /* add/remove chips */
- extern int gpiochip_add(struct gpio_chip *chip);
-diff --git a/include/asm-ia64/kvm.h b/include/asm-ia64/kvm.h
-index eb2d355..3f6a090 100644
---- a/include/asm-ia64/kvm.h
-+++ b/include/asm-ia64/kvm.h
-@@ -22,14 +22,13 @@
- */
-
- #include
--#include
-
- #include
-
- /* Architectural interrupt line count. */
- #define KVM_NR_INTERRUPTS 256
-
--#define KVM_IOAPIC_NUM_PINS 24
-+#define KVM_IOAPIC_NUM_PINS 48
-
- struct kvm_ioapic_state {
- __u64 base_address;
-@@ -61,6 +60,13 @@ struct kvm_ioapic_state {
-
- #define KVM_CONTEXT_SIZE 8*1024
-
-+struct kvm_fpreg {
-+ union {
-+ unsigned long bits[2];
-+ long double __dummy; /* force 16-byte alignment */
-+ } u;
-+};
-+
- union context {
- /* 8K size */
- char dummy[KVM_CONTEXT_SIZE];
-@@ -77,7 +83,7 @@ union context {
- unsigned long ibr[8];
- unsigned long dbr[8];
- unsigned long pkr[8];
-- struct ia64_fpreg fr[128];
-+ struct kvm_fpreg fr[128];
- };
- };
-
-diff --git a/include/asm-mips/gic.h b/include/asm-mips/gic.h
-index 01b2f92..3a492f2 100644
---- a/include/asm-mips/gic.h
-+++ b/include/asm-mips/gic.h
-@@ -330,7 +330,7 @@
-
- #define GIC_SH_RMASK_OFS 0x0300
- #define GIC_CLR_INTR_MASK(intr, val) \
-- GICWRITE(GIC_REG_ADDR(SHARED, GIC_SH_RMASK_OFS + 4 + (((((intr) / 32) ^ 1) - 1) * 4)), ((val) << ((intr) % 32))
-+ GICWRITE(GIC_REG_ADDR(SHARED, GIC_SH_RMASK_OFS + 4 + (((((intr) / 32) ^ 1) - 1) * 4)), ((val) << ((intr) % 32)))
-
- /* Register Map for Local Section */
- #define GIC_VPE_CTL_OFS 0x0000
-diff --git a/include/asm-mips/mach-au1x00/au1000.h b/include/asm-mips/mach-au1x00/au1000.h
-index 363a14e..1b5064d 100644
---- a/include/asm-mips/mach-au1x00/au1000.h
-+++ b/include/asm-mips/mach-au1x00/au1000.h
-@@ -1036,7 +1036,7 @@ enum soc_au1200_ints {
- #define USBD_INTSTAT 0xB020001C
- # define USBDEV_INT_SOF (1 << 12)
- # define USBDEV_INT_HF_BIT 6
--# define USBDEV_INT_HF_MASK 0x3f << USBDEV_INT_HF_BIT)
-+# define USBDEV_INT_HF_MASK (0x3f << USBDEV_INT_HF_BIT)
- # define USBDEV_INT_CMPLT_BIT 0
- # define USBDEV_INT_CMPLT_MASK (0x3f << USBDEV_INT_CMPLT_BIT)
- #define USBD_CONFIG 0xB0200020
-diff --git a/include/asm-powerpc/mpic.h b/include/asm-powerpc/mpic.h
-index 943c5a3..a4d0f87 100644
---- a/include/asm-powerpc/mpic.h
-+++ b/include/asm-powerpc/mpic.h
-@@ -428,12 +428,11 @@ extern void mpic_init(struct mpic *mpic);
- */
-
-
--/* Change/Read the priority of an interrupt. Default is 8 for irqs and
-+/* Change the priority of an interrupt. Default is 8 for irqs and
- * 10 for IPIs. You can call this on both IPIs and IRQ numbers, but the
- * IPI number is then the offset'ed (linux irq number mapped to the IPI)
- */
- extern void mpic_irq_set_priority(unsigned int irq, unsigned int pri);
--extern unsigned int mpic_irq_get_priority(unsigned int irq);
-
- /* Setup a non-boot CPU */
- extern void mpic_setup_this_cpu(void);
-diff --git a/include/asm-sh/kgdb.h b/include/asm-sh/kgdb.h
-index 4bc8cb1..24e4207 100644
---- a/include/asm-sh/kgdb.h
-+++ b/include/asm-sh/kgdb.h
-@@ -66,18 +66,4 @@ extern int setjmp(jmp_buf __jmpb);
- /* Forced breakpoint */
- #define breakpoint() __asm__ __volatile__("trapa #0x3c")
-
--/* Taken from sh-stub.c of GDB 4.18 */
--static const char hexchars[] = "0123456789abcdef";
--
--/* Get high hex bits */
--static inline char highhex(const int x)
--{
-- return hexchars[(x >> 4) & 0xf];
--}
--
--/* Get low hex bits */
--static inline char lowhex(const int x)
--{
-- return hexchars[x & 0xf];
--}
- #endif
-diff --git a/include/asm-sparc/asi.h b/include/asm-sparc/asi.h
-index 58c3754..158f9b0 100644
---- a/include/asm-sparc/asi.h
-+++ b/include/asm-sparc/asi.h
-@@ -1,4 +1,3 @@
--/* $Id: asi.h,v 1.18 1998/03/09 14:04:46 jj Exp $ */
- #ifndef _SPARC_ASI_H
- #define _SPARC_ASI_H
-
-diff --git a/include/asm-sparc/auxio.h b/include/asm-sparc/auxio.h
-index ee83aef..e552b8d 100644
---- a/include/asm-sparc/auxio.h
-+++ b/include/asm-sparc/auxio.h
-@@ -1,4 +1,4 @@
--/* $Id: auxio.h,v 1.18 1997/11/07 15:01:45 jj Exp $
-+/*
- * auxio.h: Definitions and code for the Auxiliary I/O register.
- *
- * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/include/asm-sparc/bitops.h b/include/asm-sparc/bitops.h
-index cb3cefa..68b98a7 100644
---- a/include/asm-sparc/bitops.h
-+++ b/include/asm-sparc/bitops.h
-@@ -1,4 +1,4 @@
--/* $Id: bitops.h,v 1.67 2001/11/19 18:36:34 davem Exp $
-+/*
- * bitops.h: Bit string operations on the Sparc.
- *
- * Copyright 1995 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/include/asm-sparc/btfixup.h b/include/asm-sparc/btfixup.h
-index c2868d0..08277e6 100644
---- a/include/asm-sparc/btfixup.h
-+++ b/include/asm-sparc/btfixup.h
-@@ -1,4 +1,4 @@
--/* $Id: btfixup.h,v 1.4 1998/03/09 14:04:43 jj Exp $
-+/*
- * asm-sparc/btfixup.h: Macros for boot time linking.
- *
- * Copyright (C) 1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
-diff --git a/include/asm-sparc/checksum.h b/include/asm-sparc/checksum.h
-index 34518ea..d044ddb 100644
---- a/include/asm-sparc/checksum.h
-+++ b/include/asm-sparc/checksum.h
-@@ -1,4 +1,3 @@
--/* $Id: checksum.h,v 1.33 2002/02/01 22:01:05 davem Exp $ */
- #ifndef __SPARC_CHECKSUM_H
- #define __SPARC_CHECKSUM_H
-
-diff --git a/include/asm-sparc/clock.h b/include/asm-sparc/clock.h
-index e708e6b..2cf99da 100644
---- a/include/asm-sparc/clock.h
-+++ b/include/asm-sparc/clock.h
-@@ -1,4 +1,4 @@
--/* $Id: clock.h,v 1.3 1995/11/25 02:31:25 davem Exp $
-+/*
- * clock.h: Definitions for clock operations on the Sparc.
- *
- * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/include/asm-sparc/contregs.h b/include/asm-sparc/contregs.h
-index 0e05afe..48fa8a4 100644
---- a/include/asm-sparc/contregs.h
-+++ b/include/asm-sparc/contregs.h
-@@ -1,4 +1,3 @@
--/* $Id: contregs.h,v 1.8 2000/12/28 22:49:11 davem Exp $ */
- #ifndef _SPARC_CONTREGS_H
- #define _SPARC_CONTREGS_H
-
-diff --git a/include/asm-sparc/cypress.h b/include/asm-sparc/cypress.h
-index 9959953..95e9772 100644
---- a/include/asm-sparc/cypress.h
-+++ b/include/asm-sparc/cypress.h
-@@ -1,4 +1,4 @@
--/* $Id: cypress.h,v 1.6 1996/08/29 09:48:09 davem Exp $
-+/*
- * cypress.h: Cypress module specific definitions and defines.
- *
- * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/include/asm-sparc/delay.h b/include/asm-sparc/delay.h
-index 48aa70e..bc9aba2 100644
---- a/include/asm-sparc/delay.h
-+++ b/include/asm-sparc/delay.h
-@@ -1,4 +1,4 @@
--/* $Id: delay.h,v 1.11 2001/01/01 01:46:15 davem Exp $
-+/*
- * delay.h: Linux delay routines on the Sparc.
- *
- * Copyright (C) 1994 David S. Miller (davem@caip.rutgers.edu).
-diff --git a/include/asm-sparc/ebus.h b/include/asm-sparc/ebus.h
-index 5465288..491f85d 100644
---- a/include/asm-sparc/ebus.h
-+++ b/include/asm-sparc/ebus.h
-@@ -1,4 +1,4 @@
--/* $Id: ebus.h,v 1.2 1999/09/11 23:05:55 zaitcev Exp $
-+/*
- * ebus.h: PCI to Ebus pseudo driver software state.
- *
- * Copyright (C) 1997 Eddie C. Dost (ecd@skynet.be)
-diff --git a/include/asm-sparc/ecc.h b/include/asm-sparc/ecc.h
-index 8e27cec..ccb84b6 100644
---- a/include/asm-sparc/ecc.h
-+++ b/include/asm-sparc/ecc.h
-@@ -1,4 +1,4 @@
--/* $Id: ecc.h,v 1.3 1996/04/25 06:12:57 davem Exp $
-+/*
- * ecc.h: Definitions and defines for the external cache/memory
- * controller on the sun4m.
- *
-diff --git a/include/asm-sparc/eeprom.h b/include/asm-sparc/eeprom.h
-index a8ff749..e17beec 100644
---- a/include/asm-sparc/eeprom.h
-+++ b/include/asm-sparc/eeprom.h
-@@ -1,4 +1,4 @@
--/* $Id: eeprom.h,v 1.3 1995/11/25 02:31:38 davem Exp $
-+/*
- * eeprom.h: Definitions for the Sun eeprom.
- *
- * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/include/asm-sparc/elf.h b/include/asm-sparc/elf.h
-index d2516ee..d043f80 100644
---- a/include/asm-sparc/elf.h
-+++ b/include/asm-sparc/elf.h
-@@ -1,4 +1,3 @@
--/* $Id: elf.h,v 1.22 2000/07/12 01:27:08 davem Exp $ */
- #ifndef __ASMSPARC_ELF_H
- #define __ASMSPARC_ELF_H
-
-diff --git a/include/asm-sparc/fcntl.h b/include/asm-sparc/fcntl.h
-index 5ec5463..07bd2d8 100644
---- a/include/asm-sparc/fcntl.h
-+++ b/include/asm-sparc/fcntl.h
-@@ -1,4 +1,3 @@
--/* $Id: fcntl.h,v 1.16 2001/09/20 00:35:33 davem Exp $ */
- #ifndef _SPARC_FCNTL_H
- #define _SPARC_FCNTL_H
-
-diff --git a/include/asm-sparc/head.h b/include/asm-sparc/head.h
-index e6532c3..7c35491 100644
---- a/include/asm-sparc/head.h
-+++ b/include/asm-sparc/head.h
-@@ -1,4 +1,3 @@
--/* $Id: head.h,v 1.39 2000/05/26 22:18:45 ecd Exp $ */
- #ifndef __SPARC_HEAD_H
- #define __SPARC_HEAD_H
-
-diff --git a/include/asm-sparc/idprom.h b/include/asm-sparc/idprom.h
-index 59083ed..41adb41 100644
---- a/include/asm-sparc/idprom.h
-+++ b/include/asm-sparc/idprom.h
-@@ -1,4 +1,4 @@
--/* $Id: idprom.h,v 1.6 1996/08/04 10:35:07 ecd Exp $
-+/*
- * idprom.h: Macros and defines for idprom routines
- *
- * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/include/asm-sparc/io.h b/include/asm-sparc/io.h
-index 243bf8e..3a3e7bd 100644
---- a/include/asm-sparc/io.h
-+++ b/include/asm-sparc/io.h
-@@ -1,6 +1,3 @@
--/*
-- * $Id: io.h,v 1.30 2001/12/21 01:23:21 davem Exp $
-- */
- #ifndef __SPARC_IO_H
- #define __SPARC_IO_H
-
-diff --git a/include/asm-sparc/ioctl.h b/include/asm-sparc/ioctl.h
-index e6fc4de..7d6bd51 100644
---- a/include/asm-sparc/ioctl.h
-+++ b/include/asm-sparc/ioctl.h
-@@ -1,4 +1,3 @@
--/* $Id: ioctl.h,v 1.6 1999/12/01 23:58:36 davem Exp $ */
- #ifndef _SPARC_IOCTL_H
- #define _SPARC_IOCTL_H
-
-diff --git a/include/asm-sparc/kdebug.h b/include/asm-sparc/kdebug.h
-index 631f15f..f69fe7d 100644
---- a/include/asm-sparc/kdebug.h
-+++ b/include/asm-sparc/kdebug.h
-@@ -1,4 +1,4 @@
--/* $Id: kdebug.h,v 1.11 2000/06/04 06:23:53 anton Exp $
-+/*
- * kdebug.h: Defines and definitions for debugging the Linux kernel
- * under various kernel debuggers.
- *
-diff --git a/include/asm-sparc/machines.h b/include/asm-sparc/machines.h
-index d831350..d6c6bf8 100644
---- a/include/asm-sparc/machines.h
-+++ b/include/asm-sparc/machines.h
-@@ -1,4 +1,4 @@
--/* $Id: machines.h,v 1.4 1995/11/25 02:31:58 davem Exp $
-+/*
- * machines.h: Defines for taking apart the machine type value in the
- * idprom and determining the kind of machine we are on.
- *
-diff --git a/include/asm-sparc/mbus.h b/include/asm-sparc/mbus.h
-index ecacdf4..bb5ae61 100644
---- a/include/asm-sparc/mbus.h
-+++ b/include/asm-sparc/mbus.h
-@@ -1,4 +1,4 @@
--/* $Id: mbus.h,v 1.9 1997/06/24 15:48:12 jj Exp $
-+/*
- * mbus.h: Various defines for MBUS modules.
- *
- * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/include/asm-sparc/memreg.h b/include/asm-sparc/memreg.h
-index 5fb95c8..845ad2b 100644
---- a/include/asm-sparc/memreg.h
-+++ b/include/asm-sparc/memreg.h
-@@ -1,4 +1,3 @@
--/* $Id: memreg.h,v 1.8 1996/08/29 09:48:23 davem Exp $ */
- #ifndef _SPARC_MEMREG_H
- #define _SPARC_MEMREG_H
- /* memreg.h: Definitions of the values found in the synchronous
-diff --git a/include/asm-sparc/mman.h b/include/asm-sparc/mman.h
-index 3d16b40..fdfbbf0 100644
---- a/include/asm-sparc/mman.h
-+++ b/include/asm-sparc/mman.h
-@@ -1,4 +1,3 @@
--/* $Id: mman.h,v 1.9 2000/03/15 02:44:23 davem Exp $ */
- #ifndef __SPARC_MMAN_H__
- #define __SPARC_MMAN_H__
-
-diff --git a/include/asm-sparc/mostek.h b/include/asm-sparc/mostek.h
-index 958d051..29aad11 100644
---- a/include/asm-sparc/mostek.h
-+++ b/include/asm-sparc/mostek.h
-@@ -1,4 +1,4 @@
--/* $Id: mostek.h,v 1.13 2001/01/11 15:07:09 davem Exp $
-+/*
- * mostek.h: Describes the various Mostek time of day clock registers.
- *
- * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/include/asm-sparc/mpmbox.h b/include/asm-sparc/mpmbox.h
-index 0e1bc58..f842303 100644
---- a/include/asm-sparc/mpmbox.h
-+++ b/include/asm-sparc/mpmbox.h
-@@ -1,4 +1,4 @@
--/* $Id: mpmbox.h,v 1.4 1996/04/25 06:13:19 davem Exp $
-+/*
- * mpmbox.h: Interface and defines for the OpenProm mailbox
- * facilities for MP machines under Linux.
- *
-diff --git a/include/asm-sparc/msi.h b/include/asm-sparc/msi.h
-index ff72cbd..724ca56 100644
---- a/include/asm-sparc/msi.h
-+++ b/include/asm-sparc/msi.h
-@@ -1,4 +1,4 @@
--/* $Id: msi.h,v 1.3 1996/08/29 09:48:25 davem Exp $
-+/*
- * msi.h: Defines specific to the MBus - Sbus - Interface.
- *
- * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/include/asm-sparc/mxcc.h b/include/asm-sparc/mxcc.h
-index 128fe97..c0517bd 100644
---- a/include/asm-sparc/mxcc.h
-+++ b/include/asm-sparc/mxcc.h
-@@ -1,4 +1,4 @@
--/* $Id: mxcc.h,v 1.7 1997/04/20 14:11:46 ecd Exp $
-+/*
- * mxcc.h: Definitions of the Viking MXCC registers
- *
- * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/include/asm-sparc/namei.h b/include/asm-sparc/namei.h
-index 618344d..0646102 100644
---- a/include/asm-sparc/namei.h
-+++ b/include/asm-sparc/namei.h
-@@ -1,4 +1,4 @@
--/* $Id: namei.h,v 1.16 2000/04/13 00:55:54 davem Exp $
-+/*
- * linux/include/asm-sparc/namei.h
- *
- * Routines to handle famous /usr/gnemul/s*.
-diff --git a/include/asm-sparc/obio.h b/include/asm-sparc/obio.h
-index 47854a2..1a7544c 100644
---- a/include/asm-sparc/obio.h
-+++ b/include/asm-sparc/obio.h
-@@ -1,4 +1,4 @@
--/* $Id: obio.h,v 1.4 1998/03/09 14:04:55 jj Exp $
-+/*
- * obio.h: Some useful locations in 0xFXXXXXXXX PA obio space on sun4d.
- *
- * Copyright (C) 1997 Jakub Jelinek
-diff --git a/include/asm-sparc/openprom.h b/include/asm-sparc/openprom.h
-index 12929a2..ed4b6bc 100644
---- a/include/asm-sparc/openprom.h
-+++ b/include/asm-sparc/openprom.h
-@@ -1,4 +1,3 @@
--/* $Id: openprom.h,v 1.24 2000/06/04 06:23:53 anton Exp $ */
- #ifndef __SPARC_OPENPROM_H
- #define __SPARC_OPENPROM_H
-
-diff --git a/include/asm-sparc/oplib.h b/include/asm-sparc/oplib.h
-index 7becc84..61c3ca6 100644
---- a/include/asm-sparc/oplib.h
-+++ b/include/asm-sparc/oplib.h
-@@ -1,4 +1,4 @@
--/* $Id: oplib.h,v 1.23 2001/12/21 00:54:31 davem Exp $
-+/*
- * oplib.h: Describes the interface and available routines in the
- * Linux Prom library.
- *
-diff --git a/include/asm-sparc/page.h b/include/asm-sparc/page.h
-index 1625a8c..6aa9e4c 100644
---- a/include/asm-sparc/page.h
-+++ b/include/asm-sparc/page.h
-@@ -1,4 +1,4 @@
--/* $Id: page.h,v 1.55 2000/10/30 21:01:41 davem Exp $
-+/*
- * page.h: Various defines and such for MMU operations on the Sparc for
- * the Linux kernel.
- *
-diff --git a/include/asm-sparc/param.h b/include/asm-sparc/param.h
-index 86ba59a..9836d9a 100644
---- a/include/asm-sparc/param.h
-+++ b/include/asm-sparc/param.h
-@@ -1,4 +1,3 @@
--/* $Id: param.h,v 1.4 2000/10/30 21:01:41 davem Exp $ */
- #ifndef _ASMSPARC_PARAM_H
- #define _ASMSPARC_PARAM_H
-
-diff --git a/include/asm-sparc/pbm.h b/include/asm-sparc/pbm.h
-index fedd9c6..458a491 100644
---- a/include/asm-sparc/pbm.h
-+++ b/include/asm-sparc/pbm.h
-@@ -1,4 +1,4 @@
--/* $Id: pbm.h,v 1.3 1999/12/20 17:06:35 zaitcev Exp $
-+/*
- *
- * pbm.h: PCI bus module pseudo driver software state
- * Adopted from sparc64 by V. Roganov and G. Raiko
-diff --git a/include/asm-sparc/pcic.h b/include/asm-sparc/pcic.h
-index dedea14..f20ef56 100644
---- a/include/asm-sparc/pcic.h
-+++ b/include/asm-sparc/pcic.h
-@@ -1,4 +1,4 @@
--/* $Id: pcic.h,v 1.4 1999/11/17 07:34:20 zaitcev Exp $
-+/*
- * pcic.h: JavaEngine 1 specific PCI definitions.
- *
- * Copyright (C) 1998 V. Roganov and G. Raiko
-diff --git a/include/asm-sparc/pgalloc.h b/include/asm-sparc/pgalloc.h
-index 6292cd0..681582d 100644
---- a/include/asm-sparc/pgalloc.h
-+++ b/include/asm-sparc/pgalloc.h
-@@ -1,4 +1,3 @@
--/* $Id: pgalloc.h,v 1.16 2001/12/21 04:56:17 davem Exp $ */
- #ifndef _SPARC_PGALLOC_H
- #define _SPARC_PGALLOC_H
-
-diff --git a/include/asm-sparc/pgtable.h b/include/asm-sparc/pgtable.h
-index d84af6d..6051229 100644
---- a/include/asm-sparc/pgtable.h
-+++ b/include/asm-sparc/pgtable.h
-@@ -1,4 +1,3 @@
--/* $Id: pgtable.h,v 1.110 2001/12/21 04:56:17 davem Exp $ */
- #ifndef _SPARC_PGTABLE_H
- #define _SPARC_PGTABLE_H
-
-diff --git a/include/asm-sparc/pgtsrmmu.h b/include/asm-sparc/pgtsrmmu.h
-index edeb981..808555f 100644
---- a/include/asm-sparc/pgtsrmmu.h
-+++ b/include/asm-sparc/pgtsrmmu.h
-@@ -1,4 +1,4 @@
--/* $Id: pgtsrmmu.h,v 1.31 2000/07/16 21:48:52 anton Exp $
-+/*
- * pgtsrmmu.h: SRMMU page table defines and code.
- *
- * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/include/asm-sparc/pgtsun4.h b/include/asm-sparc/pgtsun4.h
-index 60bda10..5a0d661 100644
---- a/include/asm-sparc/pgtsun4.h
-+++ b/include/asm-sparc/pgtsun4.h
-@@ -1,4 +1,4 @@
--/* $Id: pgtsun4.h,v 1.5 2000/06/05 06:08:46 anton Exp $
-+/*
- * pgtsun4.h: Sun4 specific pgtable.h defines and code.
- *
- * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/include/asm-sparc/pgtsun4c.h b/include/asm-sparc/pgtsun4c.h
-index f53b6db..aeb25e9 100644
---- a/include/asm-sparc/pgtsun4c.h
-+++ b/include/asm-sparc/pgtsun4c.h
-@@ -1,4 +1,4 @@
--/* $Id: pgtsun4c.h,v 1.37 2000/06/05 06:08:46 anton Exp $
-+/*
- * pgtsun4c.h: Sun4c specific pgtable.h defines and code.
- *
- * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/include/asm-sparc/psr.h b/include/asm-sparc/psr.h
-index 2139704..b8c0e5f 100644
---- a/include/asm-sparc/psr.h
-+++ b/include/asm-sparc/psr.h
-@@ -1,4 +1,4 @@
--/* $Id: psr.h,v 1.15 1997/10/04 08:54:22 ecd Exp $
-+/*
- * psr.h: This file holds the macros for masking off various parts of
- * the processor status register on the Sparc. This is valid
- * for Version 8. On the V9 this is renamed to the PSTATE
-diff --git a/include/asm-sparc/ptrace.h b/include/asm-sparc/ptrace.h
-index 0afb867..11f3bc2 100644
---- a/include/asm-sparc/ptrace.h
-+++ b/include/asm-sparc/ptrace.h
-@@ -1,4 +1,3 @@
--/* $Id: ptrace.h,v 1.25 1997/03/04 16:27:25 jj Exp $ */
- #ifndef _SPARC_PTRACE_H
- #define _SPARC_PTRACE_H
-
-diff --git a/include/asm-sparc/resource.h b/include/asm-sparc/resource.h
-index 0514c30..985948a 100644
---- a/include/asm-sparc/resource.h
-+++ b/include/asm-sparc/resource.h
-@@ -1,4 +1,4 @@
--/* $Id: resource.h,v 1.12 2000/09/23 02:09:21 davem Exp $
-+/*
- * resource.h: Resource definitions.
- *
- * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/include/asm-sparc/ross.h b/include/asm-sparc/ross.h
-index f2c14b5..ecb6e81 100644
---- a/include/asm-sparc/ross.h
-+++ b/include/asm-sparc/ross.h
-@@ -1,4 +1,4 @@
--/* $Id: ross.h,v 1.13 1998/01/07 06:49:11 baccala Exp $
-+/*
- * ross.h: Ross module specific definitions and defines.
- *
- * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/include/asm-sparc/rtc.h b/include/asm-sparc/rtc.h
-index f4f261d..f9ecb1f 100644
---- a/include/asm-sparc/rtc.h
-+++ b/include/asm-sparc/rtc.h
-@@ -1,5 +1,4 @@
--/* $Id: rtc.h,v 1.2 1996/08/21 23:17:39 ecd Exp $
-- *
-+/*
- * rtc.h: Definitions for access to the Mostek real time clock
- *
- * Copyright (C) 1996 Thomas K. Dyas (tdyas@eden.rutgers.edu)
-diff --git a/include/asm-sparc/sbi.h b/include/asm-sparc/sbi.h
-index 86a603a..5eb7f19 100644
---- a/include/asm-sparc/sbi.h
-+++ b/include/asm-sparc/sbi.h
-@@ -1,4 +1,4 @@
--/* $Id: sbi.h,v 1.2 1998/03/09 14:04:48 jj Exp $
-+/*
- * sbi.h: SBI (Sbus Interface on sun4d) definitions
- *
- * Copyright (C) 1997 Jakub Jelinek
-diff --git a/include/asm-sparc/sbus.h b/include/asm-sparc/sbus.h
-index 27d076c..f1d2fe1 100644
---- a/include/asm-sparc/sbus.h
-+++ b/include/asm-sparc/sbus.h
-@@ -1,4 +1,4 @@
--/* $Id: sbus.h,v 1.22 2000/02/18 13:50:50 davem Exp $
-+/*
- * sbus.h: Defines for the Sun SBus.
- *
- * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/include/asm-sparc/scatterlist.h b/include/asm-sparc/scatterlist.h
-index e08d3d7..c82609c 100644
---- a/include/asm-sparc/scatterlist.h
-+++ b/include/asm-sparc/scatterlist.h
-@@ -1,4 +1,3 @@
--/* $Id: scatterlist.h,v 1.8 2001/12/17 07:05:15 davem Exp $ */
- #ifndef _SPARC_SCATTERLIST_H
- #define _SPARC_SCATTERLIST_H
-
-diff --git a/include/asm-sparc/shmparam.h b/include/asm-sparc/shmparam.h
-index bb93a6f..59a1243 100644
---- a/include/asm-sparc/shmparam.h
-+++ b/include/asm-sparc/shmparam.h
-@@ -1,4 +1,3 @@
--/* $Id: shmparam.h,v 1.6 1999/12/09 10:32:41 davem Exp $ */
- #ifndef _ASMSPARC_SHMPARAM_H
- #define _ASMSPARC_SHMPARAM_H
-
-diff --git a/include/asm-sparc/sigcontext.h b/include/asm-sparc/sigcontext.h
-index 7fa2c7d..c5fb60d 100644
---- a/include/asm-sparc/sigcontext.h
-+++ b/include/asm-sparc/sigcontext.h
-@@ -1,4 +1,3 @@
--/* $Id: sigcontext.h,v 1.14 1999/09/06 08:22:05 jj Exp $ */
- #ifndef __SPARC_SIGCONTEXT_H
- #define __SPARC_SIGCONTEXT_H
-
-diff --git a/include/asm-sparc/siginfo.h b/include/asm-sparc/siginfo.h
-index 2c3ea8b..3c71af1 100644
---- a/include/asm-sparc/siginfo.h
-+++ b/include/asm-sparc/siginfo.h
-@@ -1,7 +1,3 @@
--/* $Id: siginfo.h,v 1.9 2002/02/08 03:57:18 davem Exp $
-- * siginfo.c:
-- */
--
- #ifndef _SPARC_SIGINFO_H
- #define _SPARC_SIGINFO_H
-
-diff --git a/include/asm-sparc/signal.h b/include/asm-sparc/signal.h
-index 94071c7..683657d 100644
---- a/include/asm-sparc/signal.h
-+++ b/include/asm-sparc/signal.h
-@@ -1,4 +1,3 @@
--/* $Id: signal.h,v 1.35 1999/09/06 08:22:04 jj Exp $ */
- #ifndef _ASMSPARC_SIGNAL_H
- #define _ASMSPARC_SIGNAL_H
-
-diff --git a/include/asm-sparc/smpprim.h b/include/asm-sparc/smpprim.h
-index e7b6d34..eb849d8 100644
---- a/include/asm-sparc/smpprim.h
-+++ b/include/asm-sparc/smpprim.h
-@@ -1,4 +1,4 @@
--/* $Id: smpprim.h,v 1.5 1996/08/29 09:48:49 davem Exp $
-+/*
- * smpprim.h: SMP locking primitives on the Sparc
- *
- * God knows we won't be actually using this code for some time
-diff --git a/include/asm-sparc/socket.h b/include/asm-sparc/socket.h
-index a00e15d..bf50d0c 100644
---- a/include/asm-sparc/socket.h
-+++ b/include/asm-sparc/socket.h
-@@ -1,4 +1,3 @@
--/* $Id: socket.h,v 1.17 2001/06/13 16:25:03 davem Exp $ */
- #ifndef _ASM_SOCKET_H
- #define _ASM_SOCKET_H
-
-diff --git a/include/asm-sparc/stat.h b/include/asm-sparc/stat.h
-index a5b4272..2299e1d 100644
---- a/include/asm-sparc/stat.h
-+++ b/include/asm-sparc/stat.h
-@@ -1,4 +1,3 @@
--/* $Id: stat.h,v 1.12 2000/08/04 05:35:55 davem Exp $ */
- #ifndef _SPARC_STAT_H
- #define _SPARC_STAT_H
-
-diff --git a/include/asm-sparc/statfs.h b/include/asm-sparc/statfs.h
-index d623f14..304520f 100644
---- a/include/asm-sparc/statfs.h
-+++ b/include/asm-sparc/statfs.h
-@@ -1,4 +1,3 @@
--/* $Id: statfs.h,v 1.4 1996/06/07 00:41:05 ecd Exp $ */
- #ifndef _SPARC_STATFS_H
- #define _SPARC_STATFS_H
-
-diff --git a/include/asm-sparc/string.h b/include/asm-sparc/string.h
-index cb1e923..8d7c0dd 100644
---- a/include/asm-sparc/string.h
-+++ b/include/asm-sparc/string.h
-@@ -1,4 +1,4 @@
--/* $Id: string.h,v 1.36 2001/12/21 00:54:31 davem Exp $
-+/*
- * string.h: External definitions for optimized assembly string
- * routines for the Linux Kernel.
- *
-diff --git a/include/asm-sparc/sun4paddr.h b/include/asm-sparc/sun4paddr.h
-index d863bfd..d52985f 100644
---- a/include/asm-sparc/sun4paddr.h
-+++ b/include/asm-sparc/sun4paddr.h
-@@ -1,4 +1,4 @@
--/* $Id: sun4paddr.h,v 1.3 1998/07/28 16:53:27 jj Exp $
-+/*
- * sun4paddr.h: Various physical addresses on sun4 machines
- *
- * Copyright (C) 1997 Anton Blanchard (anton@progsoc.uts.edu.au)
-diff --git a/include/asm-sparc/sunbpp.h b/include/asm-sparc/sunbpp.h
-index 568db79..92ee1a8 100644
---- a/include/asm-sparc/sunbpp.h
-+++ b/include/asm-sparc/sunbpp.h
-@@ -1,4 +1,4 @@
--/* $Id: sunbpp.h,v 1.1 1999/08/08 14:09:49 shadow Exp $
-+/*
- * include/asm-sparc/sunbpp.h
- */
-
-diff --git a/include/asm-sparc/sysen.h b/include/asm-sparc/sysen.h
-index 692fa6f..6af34ab 100644
---- a/include/asm-sparc/sysen.h
-+++ b/include/asm-sparc/sysen.h
-@@ -1,4 +1,4 @@
--/* $Id: sysen.h,v 1.3 1995/11/25 02:32:58 davem Exp $
-+/*
- * sysen.h: Bit fields within the "System Enable" register accessed via
- * the ASI_CONTROL address space at address AC_SYSENABLE.
- *
-diff --git a/include/asm-sparc/termios.h b/include/asm-sparc/termios.h
-index 733d405..f7b4409 100644
---- a/include/asm-sparc/termios.h
-+++ b/include/asm-sparc/termios.h
-@@ -1,4 +1,3 @@
--/* $Id: termios.h,v 1.32 2001/06/01 08:12:11 davem Exp $ */
- #ifndef _SPARC_TERMIOS_H
- #define _SPARC_TERMIOS_H
-
-diff --git a/include/asm-sparc/timer.h b/include/asm-sparc/timer.h
-index cb1fa1d..d909565 100644
---- a/include/asm-sparc/timer.h
-+++ b/include/asm-sparc/timer.h
-@@ -1,4 +1,4 @@
--/* $Id: timer.h,v 1.21 1999/04/20 13:22:51 anton Exp $
-+/*
- * timer.h: Definitions for the timer chips on the Sparc.
- *
- * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/include/asm-sparc/traps.h b/include/asm-sparc/traps.h
-index f62c7f8..bebdbf8 100644
---- a/include/asm-sparc/traps.h
-+++ b/include/asm-sparc/traps.h
-@@ -1,4 +1,4 @@
--/* $Id: traps.h,v 1.9 1998/03/09 14:04:53 jj Exp $
-+/*
- * traps.h: Format of entries for the Sparc trap table.
- *
- * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/include/asm-sparc/tsunami.h b/include/asm-sparc/tsunami.h
-index 887add5..5bbd1d5 100644
---- a/include/asm-sparc/tsunami.h
-+++ b/include/asm-sparc/tsunami.h
-@@ -1,4 +1,4 @@
--/* $Id: tsunami.h,v 1.5 1996/08/29 09:49:03 davem Exp $
-+/*
- * tsunami.h: Module specific definitions for Tsunami V8 Sparcs
- *
- * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/include/asm-sparc/turbosparc.h b/include/asm-sparc/turbosparc.h
-index 31d2350..17c7328 100644
---- a/include/asm-sparc/turbosparc.h
-+++ b/include/asm-sparc/turbosparc.h
-@@ -1,4 +1,4 @@
--/* $Id: turbosparc.h,v 1.4 1998/08/16 16:02:42 ecd Exp $
-+/*
- * turbosparc.h: Defines specific to the TurboSparc module.
- * This is SRMMU stuff.
- *
-diff --git a/include/asm-sparc/types.h b/include/asm-sparc/types.h
-index 1b08ef8..07734f9 100644
---- a/include/asm-sparc/types.h
-+++ b/include/asm-sparc/types.h
-@@ -1,4 +1,3 @@
--/* $Id: types.h,v 1.13 2001/12/21 01:22:59 davem Exp $ */
- #ifndef _SPARC_TYPES_H
- #define _SPARC_TYPES_H
-
-diff --git a/include/asm-sparc/uaccess.h b/include/asm-sparc/uaccess.h
-index 366b116..47d5619 100644
---- a/include/asm-sparc/uaccess.h
-+++ b/include/asm-sparc/uaccess.h
-@@ -1,4 +1,4 @@
--/* $Id: uaccess.h,v 1.24 2001/10/30 04:32:24 davem Exp $
-+/*
- * uaccess.h: User space memore access functions.
- *
- * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/include/asm-sparc/vac-ops.h b/include/asm-sparc/vac-ops.h
-index ab6f53b..d105276 100644
---- a/include/asm-sparc/vac-ops.h
-+++ b/include/asm-sparc/vac-ops.h
-@@ -1,4 +1,3 @@
--/* $Id: vac-ops.h,v 1.13 1998/01/30 10:59:59 jj Exp $ */
- #ifndef _SPARC_VAC_OPS_H
- #define _SPARC_VAC_OPS_H
-
-diff --git a/include/asm-sparc/vaddrs.h b/include/asm-sparc/vaddrs.h
-index 9109739..f6ca477 100644
---- a/include/asm-sparc/vaddrs.h
-+++ b/include/asm-sparc/vaddrs.h
-@@ -1,4 +1,3 @@
--/* $Id: vaddrs.h,v 1.27 2001/07/04 00:18:18 davem Exp $ */
- #ifndef _SPARC_VADDRS_H
- #define _SPARC_VADDRS_H
-
-diff --git a/include/asm-sparc/viking.h b/include/asm-sparc/viking.h
-index 7541da7..989930a 100644
---- a/include/asm-sparc/viking.h
-+++ b/include/asm-sparc/viking.h
-@@ -1,4 +1,4 @@
--/* $Id: viking.h,v 1.19 1997/04/20 14:11:48 ecd Exp $
-+/*
- * viking.h: Defines specific to the GNU/Viking MBUS module.
- * This is SRMMU stuff.
- *
-diff --git a/include/asm-sparc/winmacro.h b/include/asm-sparc/winmacro.h
-index 096f3d3..5b0a06d 100644
---- a/include/asm-sparc/winmacro.h
-+++ b/include/asm-sparc/winmacro.h
-@@ -1,4 +1,4 @@
--/* $Id: winmacro.h,v 1.22 2000/05/09 17:40:15 davem Exp $
-+/*
- * winmacro.h: Window loading-unloading macros.
- *
- * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/include/asm-sparc64/apb.h b/include/asm-sparc64/apb.h
-index 80f0df2..8f3b57d 100644
---- a/include/asm-sparc64/apb.h
-+++ b/include/asm-sparc64/apb.h
-@@ -1,4 +1,4 @@
--/* $Id: apb.h,v 1.2 1998/04/01 20:41:49 ecd Exp $
-+/*
- * apb.h: Advanced PCI Bridge Configuration Registers and Bits
- *
- * Copyright (C) 1998 Eddie C. Dost (ecd@skynet.be)
-diff --git a/include/asm-sparc64/asi.h b/include/asm-sparc64/asi.h
-index 662a211..bc57c40 100644
---- a/include/asm-sparc64/asi.h
-+++ b/include/asm-sparc64/asi.h
-@@ -1,4 +1,3 @@
--/* $Id: asi.h,v 1.5 2001/03/29 11:47:47 davem Exp $ */
- #ifndef _SPARC64_ASI_H
- #define _SPARC64_ASI_H
-
-diff --git a/include/asm-sparc64/auxio.h b/include/asm-sparc64/auxio.h
-index 81a590a..c410049 100644
---- a/include/asm-sparc64/auxio.h
-+++ b/include/asm-sparc64/auxio.h
-@@ -1,4 +1,4 @@
--/* $Id: auxio.h,v 1.3 2001/06/05 08:16:34 davem Exp $
-+/*
- * auxio.h: Definitions and code for the Auxiliary I/O registers.
- *
- * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/include/asm-sparc64/bbc.h b/include/asm-sparc64/bbc.h
-index 368fce4..423a858 100644
---- a/include/asm-sparc64/bbc.h
-+++ b/include/asm-sparc64/bbc.h
-@@ -1,4 +1,4 @@
--/* $Id: bbc.h,v 1.2 2001/03/26 23:47:18 davem Exp $
-+/*
- * bbc.h: Defines for BootBus Controller found on UltraSPARC-III
- * systems.
- *
-diff --git a/include/asm-sparc64/bitops.h b/include/asm-sparc64/bitops.h
-index 11f9d81..bb87b80 100644
---- a/include/asm-sparc64/bitops.h
-+++ b/include/asm-sparc64/bitops.h
-@@ -1,4 +1,4 @@
--/* $Id: bitops.h,v 1.39 2002/01/30 01:40:00 davem Exp $
-+/*
- * bitops.h: Bit string operations on the V9.
- *
- * Copyright 1996, 1997 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/include/asm-sparc64/chafsr.h b/include/asm-sparc64/chafsr.h
-index fd16883..85c69b3 100644
---- a/include/asm-sparc64/chafsr.h
-+++ b/include/asm-sparc64/chafsr.h
-@@ -1,4 +1,3 @@
--/* $Id: chafsr.h,v 1.1 2001/03/28 10:56:34 davem Exp $ */
- #ifndef _SPARC64_CHAFSR_H
- #define _SPARC64_CHAFSR_H
-
-diff --git a/include/asm-sparc64/checksum.h b/include/asm-sparc64/checksum.h
-index 70a006d..b290564 100644
---- a/include/asm-sparc64/checksum.h
-+++ b/include/asm-sparc64/checksum.h
-@@ -1,4 +1,3 @@
--/* $Id: checksum.h,v 1.19 2002/02/09 19:49:31 davem Exp $ */
- #ifndef __SPARC64_CHECKSUM_H
- #define __SPARC64_CHECKSUM_H
-
-diff --git a/include/asm-sparc64/chmctrl.h b/include/asm-sparc64/chmctrl.h
-index 53047f9..859b4a4 100644
---- a/include/asm-sparc64/chmctrl.h
-+++ b/include/asm-sparc64/chmctrl.h
-@@ -1,4 +1,3 @@
--/* $Id: chmctrl.h,v 1.1 2001/03/29 11:43:28 davem Exp $ */
- #ifndef _SPARC64_CHMCTRL_H
- #define _SPARC64_CHMCTRL_H
-
-diff --git a/include/asm-sparc64/dcr.h b/include/asm-sparc64/dcr.h
-index e9a3f30..620c9ba 100644
---- a/include/asm-sparc64/dcr.h
-+++ b/include/asm-sparc64/dcr.h
-@@ -1,4 +1,3 @@
--/* $Id: dcr.h,v 1.4 2001/03/09 17:56:37 davem Exp $ */
- #ifndef _SPARC64_DCR_H
- #define _SPARC64_DCR_H
-
-diff --git a/include/asm-sparc64/display7seg.h b/include/asm-sparc64/display7seg.h
-index 955a350..c066a89 100644
---- a/include/asm-sparc64/display7seg.h
-+++ b/include/asm-sparc64/display7seg.h
-@@ -1,4 +1,4 @@
--/* $Id: display7seg.h,v 1.2 2000/08/02 06:22:35 davem Exp $
-+/*
- *
- * display7seg - Driver interface for the 7-segment display
- * present on Sun Microsystems CP1400 and CP1500
-diff --git a/include/asm-sparc64/dma.h b/include/asm-sparc64/dma.h
-index a9fd061..9d4c024 100644
---- a/include/asm-sparc64/dma.h
-+++ b/include/asm-sparc64/dma.h
-@@ -1,4 +1,4 @@
--/* $Id: dma.h,v 1.21 2001/12/13 04:16:52 davem Exp $
-+/*
- * include/asm-sparc64/dma.h
- *
- * Copyright 1996 (C) David S. Miller (davem@caip.rutgers.edu)
-diff --git a/include/asm-sparc64/ebus.h b/include/asm-sparc64/ebus.h
-index 9c1c6db..fcc62b9 100644
---- a/include/asm-sparc64/ebus.h
-+++ b/include/asm-sparc64/ebus.h
-@@ -1,4 +1,4 @@
--/* $Id: ebus.h,v 1.10 2001/03/14 05:00:55 davem Exp $
-+/*
- * ebus.h: PCI to Ebus pseudo driver software state.
- *
- * Copyright (C) 1997 Eddie C. Dost (ecd@skynet.be)
-diff --git a/include/asm-sparc64/elf.h b/include/asm-sparc64/elf.h
-index 11c8e68..0818a13 100644
---- a/include/asm-sparc64/elf.h
-+++ b/include/asm-sparc64/elf.h
-@@ -1,4 +1,3 @@
--/* $Id: elf.h,v 1.32 2002/02/09 19:49:31 davem Exp $ */
- #ifndef __ASM_SPARC64_ELF_H
- #define __ASM_SPARC64_ELF_H
-
-diff --git a/include/asm-sparc64/envctrl.h b/include/asm-sparc64/envctrl.h
-index 53a6653..a5668a0 100644
---- a/include/asm-sparc64/envctrl.h
-+++ b/include/asm-sparc64/envctrl.h
-@@ -1,4 +1,4 @@
--/* $Id: envctrl.h,v 1.3 2000/11/03 00:37:40 davem Exp $
-+/*
- *
- * envctrl.h: Definitions for access to the i2c environment
- * monitoring on Ultrasparc systems.
-diff --git a/include/asm-sparc64/estate.h b/include/asm-sparc64/estate.h
-index a719c3d..520c085 100644
---- a/include/asm-sparc64/estate.h
-+++ b/include/asm-sparc64/estate.h
-@@ -1,4 +1,3 @@
--/* $Id: estate.h,v 1.1 2001/03/28 10:56:34 davem Exp $ */
- #ifndef _SPARC64_ESTATE_H
- #define _SPARC64_ESTATE_H
-
-diff --git a/include/asm-sparc64/fcntl.h b/include/asm-sparc64/fcntl.h
-index 111f6b3..8a09ca7 100644
---- a/include/asm-sparc64/fcntl.h
-+++ b/include/asm-sparc64/fcntl.h
-@@ -1,4 +1,3 @@
--/* $Id: fcntl.h,v 1.12 2001/09/20 00:35:34 davem Exp $ */
- #ifndef _SPARC64_FCNTL_H
- #define _SPARC64_FCNTL_H
-
-diff --git a/include/asm-sparc64/fhc.h b/include/asm-sparc64/fhc.h
-index 9e7f1b0..ddffcdf 100644
---- a/include/asm-sparc64/fhc.h
-+++ b/include/asm-sparc64/fhc.h
-@@ -1,4 +1,4 @@
--/* $Id: fhc.h,v 1.5 1999/09/21 14:39:29 davem Exp $
-+/*
- * fhc.h: Structures for central/fhc pseudo driver on Sunfire/Starfire/Wildfire.
- *
- * Copyright (C) 1997, 1999 David S. Miller (davem@redhat.com)
-diff --git a/include/asm-sparc64/head.h b/include/asm-sparc64/head.h
-index 67960a7..10e9dab 100644
---- a/include/asm-sparc64/head.h
-+++ b/include/asm-sparc64/head.h
-@@ -1,4 +1,3 @@
--/* $Id: head.h,v 1.30 1997/08/08 08:34:33 jj Exp $ */
- #ifndef _SPARC64_HEAD_H
- #define _SPARC64_HEAD_H
-
-diff --git a/include/asm-sparc64/ide.h b/include/asm-sparc64/ide.h
-index c5fdabe..1282676 100644
---- a/include/asm-sparc64/ide.h
-+++ b/include/asm-sparc64/ide.h
-@@ -1,4 +1,4 @@
--/* $Id: ide.h,v 1.21 2001/09/25 20:21:48 kanoj Exp $
-+/*
- * ide.h: Ultra/PCI specific IDE glue.
- *
- * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/include/asm-sparc64/idprom.h b/include/asm-sparc64/idprom.h
-index 77fbf98..a363fa0 100644
---- a/include/asm-sparc64/idprom.h
-+++ b/include/asm-sparc64/idprom.h
-@@ -1,4 +1,4 @@
--/* $Id: idprom.h,v 1.2 1997/04/04 00:50:16 davem Exp $
-+/*
- * idprom.h: Macros and defines for idprom routines
- *
- * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/include/asm-sparc64/ioctl.h b/include/asm-sparc64/ioctl.h
-index 253d0b5..d634c21 100644
---- a/include/asm-sparc64/ioctl.h
-+++ b/include/asm-sparc64/ioctl.h
-@@ -1,4 +1,3 @@
--/* $Id: ioctl.h,v 1.2 1998/10/15 05:40:38 jj Exp $ */
- #ifndef _SPARC64_IOCTL_H
- #define _SPARC64_IOCTL_H
-
-diff --git a/include/asm-sparc64/ioctls.h b/include/asm-sparc64/ioctls.h
-index c1be406..94d1b75 100644
---- a/include/asm-sparc64/ioctls.h
-+++ b/include/asm-sparc64/ioctls.h
-@@ -1,4 +1,3 @@
--/* $Id: ioctls.h,v 1.7 1998/02/23 02:49:41 davem Exp $ */
- #ifndef _ASM_SPARC64_IOCTLS_H
- #define _ASM_SPARC64_IOCTLS_H
-
-diff --git a/include/asm-sparc64/lsu.h b/include/asm-sparc64/lsu.h
-index 79f1098..7190f8d 100644
---- a/include/asm-sparc64/lsu.h
-+++ b/include/asm-sparc64/lsu.h
-@@ -1,4 +1,3 @@
--/* $Id: lsu.h,v 1.2 1997/04/04 00:50:22 davem Exp $ */
- #ifndef _SPARC64_LSU_H
- #define _SPARC64_LSU_H
-
-diff --git a/include/asm-sparc64/mman.h b/include/asm-sparc64/mman.h
-index 625be4d..d2ae67c 100644
---- a/include/asm-sparc64/mman.h
-+++ b/include/asm-sparc64/mman.h
-@@ -1,4 +1,3 @@
--/* $Id: mman.h,v 1.2 2000/03/15 02:44:26 davem Exp $ */
- #ifndef __SPARC64_MMAN_H__
- #define __SPARC64_MMAN_H__
-
-diff --git a/include/asm-sparc64/mmu_context.h b/include/asm-sparc64/mmu_context.h
-index 9fc225e..5693ab4 100644
---- a/include/asm-sparc64/mmu_context.h
-+++ b/include/asm-sparc64/mmu_context.h
-@@ -1,4 +1,3 @@
--/* $Id: mmu_context.h,v 1.54 2002/02/09 19:49:31 davem Exp $ */
- #ifndef __SPARC64_MMU_CONTEXT_H
- #define __SPARC64_MMU_CONTEXT_H
-
-diff --git a/include/asm-sparc64/namei.h b/include/asm-sparc64/namei.h
-index 275161f..cbc1b4c 100644
---- a/include/asm-sparc64/namei.h
-+++ b/include/asm-sparc64/namei.h
-@@ -1,4 +1,4 @@
--/* $Id: namei.h,v 1.17 2000/04/13 00:55:54 davem Exp $
-+/*
- * linux/include/asm-sparc64/namei.h
- *
- * Routines to handle famous /usr/gnemul/s*.
-diff --git a/include/asm-sparc64/openprom.h b/include/asm-sparc64/openprom.h
-index 26ec046..b69e4a8 100644
---- a/include/asm-sparc64/openprom.h
-+++ b/include/asm-sparc64/openprom.h
-@@ -1,4 +1,3 @@
--/* $Id: openprom.h,v 1.9 2001/03/16 10:22:02 davem Exp $ */
- #ifndef __SPARC64_OPENPROM_H
- #define __SPARC64_OPENPROM_H
-
-diff --git a/include/asm-sparc64/page.h b/include/asm-sparc64/page.h
-index 618117d..93f0881 100644
---- a/include/asm-sparc64/page.h
-+++ b/include/asm-sparc64/page.h
-@@ -1,5 +1,3 @@
--/* $Id: page.h,v 1.39 2002/02/09 19:49:31 davem Exp $ */
--
- #ifndef _SPARC64_PAGE_H
- #define _SPARC64_PAGE_H
-
-diff --git a/include/asm-sparc64/pgalloc.h b/include/asm-sparc64/pgalloc.h
-index 3ee2d40..326de10 100644
---- a/include/asm-sparc64/pgalloc.h
-+++ b/include/asm-sparc64/pgalloc.h
-@@ -1,4 +1,3 @@
--/* $Id: pgalloc.h,v 1.30 2001/12/21 04:56:17 davem Exp $ */
- #ifndef _SPARC64_PGALLOC_H
- #define _SPARC64_PGALLOC_H
-
-diff --git a/include/asm-sparc64/pgtable.h b/include/asm-sparc64/pgtable.h
-index 0e200e7..b870177 100644
---- a/include/asm-sparc64/pgtable.h
-+++ b/include/asm-sparc64/pgtable.h
-@@ -1,4 +1,4 @@
--/* $Id: pgtable.h,v 1.156 2002/02/09 19:49:31 davem Exp $
-+/*
- * pgtable.h: SpitFire page table operations.
- *
- * Copyright 1996,1997 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/include/asm-sparc64/pil.h b/include/asm-sparc64/pil.h
-index 2f5d126..eaac842 100644
---- a/include/asm-sparc64/pil.h
-+++ b/include/asm-sparc64/pil.h
-@@ -1,4 +1,3 @@
--/* $Id: pil.h,v 1.1 2002/01/23 11:27:36 davem Exp $ */
- #ifndef _SPARC64_PIL_H
- #define _SPARC64_PIL_H
-
-diff --git a/include/asm-sparc64/processor.h b/include/asm-sparc64/processor.h
-index 885b6a1..26b4e52 100644
---- a/include/asm-sparc64/processor.h
-+++ b/include/asm-sparc64/processor.h
-@@ -1,4 +1,4 @@
--/* $Id: processor.h,v 1.83 2002/02/10 06:04:33 davem Exp $
-+/*
- * include/asm-sparc64/processor.h
- *
- * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/include/asm-sparc64/psrcompat.h b/include/asm-sparc64/psrcompat.h
-index 3614ca0..44b6327 100644
---- a/include/asm-sparc64/psrcompat.h
-+++ b/include/asm-sparc64/psrcompat.h
-@@ -1,4 +1,3 @@
--/* $Id: psrcompat.h,v 1.5 1998/10/06 09:28:39 jj Exp $ */
- #ifndef _SPARC64_PSRCOMPAT_H
- #define _SPARC64_PSRCOMPAT_H
-
-diff --git a/include/asm-sparc64/pstate.h b/include/asm-sparc64/pstate.h
-index 949aeba..a26a537 100644
---- a/include/asm-sparc64/pstate.h
-+++ b/include/asm-sparc64/pstate.h
-@@ -1,4 +1,3 @@
--/* $Id: pstate.h,v 1.6 1997/06/25 07:39:45 jj Exp $ */
- #ifndef _SPARC64_PSTATE_H
- #define _SPARC64_PSTATE_H
-
-diff --git a/include/asm-sparc64/ptrace.h b/include/asm-sparc64/ptrace.h
-index 90972a5..d8a56cd 100644
---- a/include/asm-sparc64/ptrace.h
-+++ b/include/asm-sparc64/ptrace.h
-@@ -126,6 +126,17 @@ struct sparc_trapf {
- #define TRACEREG32_SZ sizeof(struct pt_regs32)
- #define STACKFRAME32_SZ sizeof(struct sparc_stackf32)
-
-+struct global_reg_snapshot {
-+ unsigned long tstate;
-+ unsigned long tpc;
-+ unsigned long tnpc;
-+ unsigned long o7;
-+ unsigned long i7;
-+ struct thread_info *thread;
-+ unsigned long pad1;
-+ unsigned long pad2;
-+};
-+
- #ifdef __KERNEL__
-
- #define __ARCH_WANT_COMPAT_SYS_PTRACE
-@@ -295,6 +306,16 @@ extern void __show_regs(struct pt_regs *);
- #define SF_XARG5 0x58
- #define SF_XXARG 0x5c
-
-+/* global_reg_snapshot offsets */
-+#define GR_SNAP_TSTATE 0x00
-+#define GR_SNAP_TPC 0x08
-+#define GR_SNAP_TNPC 0x10
-+#define GR_SNAP_O7 0x18
-+#define GR_SNAP_I7 0x20
-+#define GR_SNAP_THREAD 0x28
-+#define GR_SNAP_PAD1 0x30
-+#define GR_SNAP_PAD2 0x38
-+
- /* Stuff for the ptrace system call */
- #define PTRACE_SPARC_DETACH 11
- #define PTRACE_GETREGS 12
-diff --git a/include/asm-sparc64/reg.h b/include/asm-sparc64/reg.h
-index fc68f90..77aa480 100644
---- a/include/asm-sparc64/reg.h
-+++ b/include/asm-sparc64/reg.h
-@@ -1,4 +1,4 @@
--/* $Id: reg.h,v 1.6 1999/09/06 08:22:10 jj Exp $
-+/*
- * linux/asm-sparc64/reg.h
- * Layout of the registers as expected by gdb on the Sparc
- * we should replace the user.h definitions with those in
-diff --git a/include/asm-sparc64/resource.h b/include/asm-sparc64/resource.h
-index aa46979..4f08fb5 100644
---- a/include/asm-sparc64/resource.h
-+++ b/include/asm-sparc64/resource.h
-@@ -1,4 +1,4 @@
--/* $Id: resource.h,v 1.8 2000/09/23 02:09:21 davem Exp $
-+/*
- * resource.h: Resource definitions.
- *
- * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/include/asm-sparc64/rtc.h b/include/asm-sparc64/rtc.h
-index cb17334..f9ecb1f 100644
---- a/include/asm-sparc64/rtc.h
-+++ b/include/asm-sparc64/rtc.h
-@@ -1,5 +1,4 @@
--/* $Id: rtc.h,v 1.1 1996/12/26 14:22:35 davem Exp $
-- *
-+/*
- * rtc.h: Definitions for access to the Mostek real time clock
- *
- * Copyright (C) 1996 Thomas K. Dyas (tdyas@eden.rutgers.edu)
-diff --git a/include/asm-sparc64/rwsem.h b/include/asm-sparc64/rwsem.h
-index 1294b7c..1dc129a 100644
---- a/include/asm-sparc64/rwsem.h
-+++ b/include/asm-sparc64/rwsem.h
-@@ -1,4 +1,4 @@
--/* $Id: rwsem.h,v 1.5 2001/11/18 00:12:56 davem Exp $
-+/*
- * rwsem.h: R/W semaphores implemented using CAS
- *
- * Written by David S. Miller (davem@redhat.com), 2001.
-diff --git a/include/asm-sparc64/scatterlist.h b/include/asm-sparc64/scatterlist.h
-index 6df23f0..81bd058 100644
---- a/include/asm-sparc64/scatterlist.h
-+++ b/include/asm-sparc64/scatterlist.h
-@@ -1,4 +1,3 @@
--/* $Id: scatterlist.h,v 1.11 2001/12/17 07:05:15 davem Exp $ */
- #ifndef _SPARC64_SCATTERLIST_H
- #define _SPARC64_SCATTERLIST_H
-
-diff --git a/include/asm-sparc64/shmparam.h b/include/asm-sparc64/shmparam.h
-index 8c66fde..1ed0d67 100644
---- a/include/asm-sparc64/shmparam.h
-+++ b/include/asm-sparc64/shmparam.h
-@@ -1,4 +1,3 @@
--/* $Id: shmparam.h,v 1.5 2001/09/24 21:17:57 kanoj Exp $ */
- #ifndef _ASMSPARC64_SHMPARAM_H
- #define _ASMSPARC64_SHMPARAM_H
-
-diff --git a/include/asm-sparc64/sigcontext.h b/include/asm-sparc64/sigcontext.h
-index d807337..1c868d6 100644
---- a/include/asm-sparc64/sigcontext.h
-+++ b/include/asm-sparc64/sigcontext.h
-@@ -1,4 +1,3 @@
--/* $Id: sigcontext.h,v 1.12 1999/09/06 08:22:09 jj Exp $ */
- #ifndef __SPARC64_SIGCONTEXT_H
- #define __SPARC64_SIGCONTEXT_H
-
-diff --git a/include/asm-sparc64/signal.h b/include/asm-sparc64/signal.h
-index c49f32d..2a7c793 100644
---- a/include/asm-sparc64/signal.h
-+++ b/include/asm-sparc64/signal.h
-@@ -1,4 +1,3 @@
--/* $Id: signal.h,v 1.9 1999/09/06 08:22:11 jj Exp $ */
- #ifndef _ASMSPARC64_SIGNAL_H
- #define _ASMSPARC64_SIGNAL_H
-
-diff --git a/include/asm-sparc64/smp.h b/include/asm-sparc64/smp.h
-index 1c1c5ea..cd0311b 100644
---- a/include/asm-sparc64/smp.h
-+++ b/include/asm-sparc64/smp.h
-@@ -1,6 +1,6 @@
- /* smp.h: Sparc64 specific SMP stuff.
- *
-- * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
-+ * Copyright (C) 1996, 2008 David S. Miller (davem@davemloft.net)
- */
-
- #ifndef _SPARC64_SMP_H
-@@ -44,6 +44,8 @@ extern int hard_smp_processor_id(void);
- extern void smp_fill_in_sib_core_maps(void);
- extern void cpu_play_dead(void);
-
-+extern void smp_fetch_global_regs(void);
-+
- #ifdef CONFIG_HOTPLUG_CPU
- extern int __cpu_disable(void);
- extern void __cpu_die(unsigned int cpu);
-@@ -55,6 +57,7 @@ extern void __cpu_die(unsigned int cpu);
-
- #define hard_smp_processor_id() 0
- #define smp_fill_in_sib_core_maps() do { } while (0)
-+#define smp_fetch_global_regs() do { } while (0)
-
- #endif /* !(CONFIG_SMP) */
-
-diff --git a/include/asm-sparc64/socket.h b/include/asm-sparc64/socket.h
-index 8cf071f..5af688f 100644
---- a/include/asm-sparc64/socket.h
-+++ b/include/asm-sparc64/socket.h
-@@ -1,4 +1,3 @@
--/* $Id: socket.h,v 1.10 2001/06/13 16:25:03 davem Exp $ */
- #ifndef _ASM_SOCKET_H
- #define _ASM_SOCKET_H
-
-diff --git a/include/asm-sparc64/starfire.h b/include/asm-sparc64/starfire.h
-index 48b50b5..07bafd3 100644
---- a/include/asm-sparc64/starfire.h
-+++ b/include/asm-sparc64/starfire.h
-@@ -1,4 +1,4 @@
--/* $Id: starfire.h,v 1.2 2001/07/04 00:18:18 davem Exp $
-+/*
- * starfire.h: Group all starfire specific code together.
- *
- * Copyright (C) 2000 Anton Blanchard (anton@samba.org)
-diff --git a/include/asm-sparc64/stat.h b/include/asm-sparc64/stat.h
-index 128c27e..9650fde 100644
---- a/include/asm-sparc64/stat.h
-+++ b/include/asm-sparc64/stat.h
-@@ -1,4 +1,3 @@
--/* $Id: stat.h,v 1.7 2000/08/04 05:35:55 davem Exp $ */
- #ifndef _SPARC64_STAT_H
- #define _SPARC64_STAT_H
-
-diff --git a/include/asm-sparc64/statfs.h b/include/asm-sparc64/statfs.h
-index 185b6c4..79b3c89 100644
---- a/include/asm-sparc64/statfs.h
-+++ b/include/asm-sparc64/statfs.h
-@@ -1,4 +1,3 @@
--/* $Id: statfs.h,v 1.2 1997/04/14 17:05:22 jj Exp $ */
- #ifndef _SPARC64_STATFS_H
- #define _SPARC64_STATFS_H
-
-diff --git a/include/asm-sparc64/string.h b/include/asm-sparc64/string.h
-index c7d8862..43161f2 100644
---- a/include/asm-sparc64/string.h
-+++ b/include/asm-sparc64/string.h
-@@ -1,4 +1,4 @@
--/* $Id: string.h,v 1.20 2001/09/27 04:36:24 kanoj Exp $
-+/*
- * string.h: External definitions for optimized assembly string
- * routines for the Linux Kernel.
- *
-diff --git a/include/asm-sparc64/sunbpp.h b/include/asm-sparc64/sunbpp.h
-index b441cc9..8e171b7 100644
---- a/include/asm-sparc64/sunbpp.h
-+++ b/include/asm-sparc64/sunbpp.h
-@@ -1,4 +1,4 @@
--/* $Id: sunbpp.h,v 1.1 1999/08/13 06:21:44 shadow Exp $
-+/*
- * include/asm-sparc64/sunbpp.h
- */
-
-diff --git a/include/asm-sparc64/termios.h b/include/asm-sparc64/termios.h
-index cacbea1..1f5dab2 100644
---- a/include/asm-sparc64/termios.h
-+++ b/include/asm-sparc64/termios.h
-@@ -1,4 +1,3 @@
--/* $Id: termios.h,v 1.11 2001/06/01 08:12:11 davem Exp $ */
- #ifndef _SPARC64_TERMIOS_H
- #define _SPARC64_TERMIOS_H
-
-diff --git a/include/asm-sparc64/ttable.h b/include/asm-sparc64/ttable.h
-index 52d67d3..0ba1995 100644
---- a/include/asm-sparc64/ttable.h
-+++ b/include/asm-sparc64/ttable.h
-@@ -1,4 +1,3 @@
--/* $Id: ttable.h,v 1.18 2002/02/09 19:49:32 davem Exp $ */
- #ifndef _SPARC64_TTABLE_H
- #define _SPARC64_TTABLE_H
-
-diff --git a/include/asm-sparc64/types.h b/include/asm-sparc64/types.h
-index 5dbe04f..b27ccc8 100644
---- a/include/asm-sparc64/types.h
-+++ b/include/asm-sparc64/types.h
-@@ -1,4 +1,3 @@
--/* $Id: types.h,v 1.4 2001/10/09 02:24:35 davem Exp $ */
- #ifndef _SPARC64_TYPES_H
- #define _SPARC64_TYPES_H
-
-diff --git a/include/asm-sparc64/uaccess.h b/include/asm-sparc64/uaccess.h
-index d8547b8..5fcbaf6 100644
---- a/include/asm-sparc64/uaccess.h
-+++ b/include/asm-sparc64/uaccess.h
-@@ -1,4 +1,3 @@
--/* $Id: uaccess.h,v 1.35 2002/02/09 19:49:31 davem Exp $ */
- #ifndef _ASM_UACCESS_H
- #define _ASM_UACCESS_H
-
-diff --git a/include/asm-sparc64/uctx.h b/include/asm-sparc64/uctx.h
-index 6eaf16e..dc937c7 100644
---- a/include/asm-sparc64/uctx.h
-+++ b/include/asm-sparc64/uctx.h
-@@ -1,4 +1,4 @@
--/* $Id: uctx.h,v 1.1 1997/06/18 16:51:58 davem Exp $
-+/*
- * uctx.h: Sparc64 {set,get}context() register state layouts.
- *
- * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu)
-diff --git a/include/asm-sparc64/utrap.h b/include/asm-sparc64/utrap.h
-index 81b0ebf..e49e5c4 100644
---- a/include/asm-sparc64/utrap.h
-+++ b/include/asm-sparc64/utrap.h
-@@ -1,4 +1,4 @@
--/* $Id: utrap.h,v 1.1 1997/10/14 16:21:31 jj Exp $
-+/*
- * include/asm-sparc64/utrap.h
- *
- * Copyright (C) 1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
-diff --git a/include/asm-sparc64/watchdog.h b/include/asm-sparc64/watchdog.h
-index 4d5b03b..5baf2d3 100644
---- a/include/asm-sparc64/watchdog.h
-+++ b/include/asm-sparc64/watchdog.h
-@@ -1,4 +1,4 @@
--/* $Id: watchdog.h,v 1.1 2001/01/18 04:47:44 davem Exp $
-+/*
- *
- * watchdog - Driver interface for the hardware watchdog timers
- * present on Sun Microsystems boardsets
-diff --git a/include/asm-x86/kvm_x86_emulate.h b/include/asm-x86/kvm_x86_emulate.h
-index d6337f9..b877bbd 100644
---- a/include/asm-x86/kvm_x86_emulate.h
-+++ b/include/asm-x86/kvm_x86_emulate.h
-@@ -135,6 +135,7 @@ struct decode_cache {
- u8 modrm_rm;
- u8 use_modrm_ea;
- unsigned long modrm_ea;
-+ void *modrm_ptr;
- unsigned long modrm_val;
- struct fetch_cache fetch;
- };
-diff --git a/include/asm-x86/page.h b/include/asm-x86/page.h
-index b381f4a..dc936dd 100644
---- a/include/asm-x86/page.h
-+++ b/include/asm-x86/page.h
-@@ -10,8 +10,16 @@
-
- #ifdef __KERNEL__
-
--#define PHYSICAL_PAGE_MASK (PAGE_MASK & __PHYSICAL_MASK)
--#define PTE_MASK (_AT(long, PHYSICAL_PAGE_MASK))
-+#define __PHYSICAL_MASK ((phys_addr_t)(1ULL << __PHYSICAL_MASK_SHIFT) - 1)
-+#define __VIRTUAL_MASK ((1UL << __VIRTUAL_MASK_SHIFT) - 1)
-+
-+/* Cast PAGE_MASK to a signed type so that it is sign-extended if
-+ virtual addresses are 32-bits but physical addresses are larger
-+ (ie, 32-bit PAE). */
-+#define PHYSICAL_PAGE_MASK (((signed long)PAGE_MASK) & __PHYSICAL_MASK)
-+
-+/* PTE_MASK extracts the PFN from a (pte|pmd|pud|pgd)val_t */
-+#define PTE_MASK ((pteval_t)PHYSICAL_PAGE_MASK)
-
- #define PMD_PAGE_SIZE (_AC(1, UL) << PMD_SHIFT)
- #define PMD_PAGE_MASK (~(PMD_PAGE_SIZE-1))
-@@ -24,9 +32,6 @@
- /* to align the pointer to the (next) page boundary */
- #define PAGE_ALIGN(addr) (((addr)+PAGE_SIZE-1)&PAGE_MASK)
-
--#define __PHYSICAL_MASK _AT(phys_addr_t, (_AC(1,ULL) << __PHYSICAL_MASK_SHIFT) - 1)
--#define __VIRTUAL_MASK ((_AC(1,UL) << __VIRTUAL_MASK_SHIFT) - 1)
--
- #ifndef __ASSEMBLY__
- #include
- #endif
-diff --git a/include/asm-x86/pgtable-3level.h b/include/asm-x86/pgtable-3level.h
-index 8b4a9d4..c93dbb6 100644
---- a/include/asm-x86/pgtable-3level.h
-+++ b/include/asm-x86/pgtable-3level.h
-@@ -120,9 +120,9 @@ static inline void pud_clear(pud_t *pudp)
- write_cr3(pgd);
- }
-
--#define pud_page(pud) ((struct page *) __va(pud_val(pud) & PAGE_MASK))
-+#define pud_page(pud) ((struct page *) __va(pud_val(pud) & PTE_MASK))
-
--#define pud_page_vaddr(pud) ((unsigned long) __va(pud_val(pud) & PAGE_MASK))
-+#define pud_page_vaddr(pud) ((unsigned long) __va(pud_val(pud) & PTE_MASK))
-
-
- /* Find an entry in the second-level page table.. */
-@@ -160,7 +160,7 @@ static inline int pte_none(pte_t pte)
-
- static inline unsigned long pte_pfn(pte_t pte)
- {
-- return (pte_val(pte) & ~_PAGE_NX) >> PAGE_SHIFT;
-+ return (pte_val(pte) & PTE_MASK) >> PAGE_SHIFT;
- }
-
- /*
-diff --git a/include/asm-x86/pgtable.h b/include/asm-x86/pgtable.h
-index 55c3a0e..97c271b 100644
---- a/include/asm-x86/pgtable.h
-+++ b/include/asm-x86/pgtable.h
-@@ -57,6 +57,7 @@
- #define _KERNPG_TABLE (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | \
- _PAGE_DIRTY)
-
-+/* Set of bits not changed in pte_modify */
- #define _PAGE_CHG_MASK (PTE_MASK | _PAGE_PCD | _PAGE_PWT | \
- _PAGE_ACCESSED | _PAGE_DIRTY)
-
-@@ -304,7 +305,7 @@ static inline pgprot_t pgprot_modify(pgprot_t oldprot, pgprot_t newprot)
- return __pgprot(preservebits | addbits);
- }
-
--#define pte_pgprot(x) __pgprot(pte_val(x) & (0xfff | _PAGE_NX))
-+#define pte_pgprot(x) __pgprot(pte_val(x) & ~PTE_MASK)
-
- #define canon_pgprot(p) __pgprot(pgprot_val(p) & __supported_pte_mask)
-
-diff --git a/include/asm-x86/pgtable_32.h b/include/asm-x86/pgtable_32.h
-index d7f0403..32ca031 100644
---- a/include/asm-x86/pgtable_32.h
-+++ b/include/asm-x86/pgtable_32.h
-@@ -88,7 +88,7 @@ extern unsigned long pg0[];
- /* To avoid harmful races, pmd_none(x) should check only the lower when PAE */
- #define pmd_none(x) (!(unsigned long)pmd_val((x)))
- #define pmd_present(x) (pmd_val((x)) & _PAGE_PRESENT)
--#define pmd_bad(x) ((pmd_val(x) & (~PAGE_MASK & ~_PAGE_USER)) != _KERNPG_TABLE)
-+#define pmd_bad(x) ((pmd_val(x) & (~PTE_MASK & ~_PAGE_USER)) != _KERNPG_TABLE)
-
- #define pages_to_mb(x) ((x) >> (20-PAGE_SHIFT))
-
-@@ -159,7 +159,7 @@ static inline int pud_large(pud_t pud) { return 0; }
- #define pmd_page(pmd) (pfn_to_page(pmd_val((pmd)) >> PAGE_SHIFT))
-
- #define pmd_page_vaddr(pmd) \
-- ((unsigned long)__va(pmd_val((pmd)) & PAGE_MASK))
-+ ((unsigned long)__va(pmd_val((pmd)) & PTE_MASK))
-
- #if defined(CONFIG_HIGHPTE)
- #define pte_offset_map(dir, address) \
-diff --git a/include/asm-x86/pgtable_64.h b/include/asm-x86/pgtable_64.h
-index efe83dc..1cc50d2 100644
---- a/include/asm-x86/pgtable_64.h
-+++ b/include/asm-x86/pgtable_64.h
-@@ -151,19 +151,19 @@ static inline void native_pgd_clear(pgd_t *pgd)
-
- #ifndef __ASSEMBLY__
-
--static inline unsigned long pgd_bad(pgd_t pgd)
-+static inline int pgd_bad(pgd_t pgd)
- {
-- return pgd_val(pgd) & ~(PTE_MASK | _KERNPG_TABLE | _PAGE_USER);
-+ return (pgd_val(pgd) & ~(PTE_MASK | _PAGE_USER)) != _KERNPG_TABLE;
- }
-
--static inline unsigned long pud_bad(pud_t pud)
-+static inline int pud_bad(pud_t pud)
- {
-- return pud_val(pud) & ~(PTE_MASK | _KERNPG_TABLE | _PAGE_USER);
-+ return (pud_val(pud) & ~(PTE_MASK | _PAGE_USER)) != _KERNPG_TABLE;
- }
-
--static inline unsigned long pmd_bad(pmd_t pmd)
-+static inline int pmd_bad(pmd_t pmd)
- {
-- return pmd_val(pmd) & ~(PTE_MASK | _KERNPG_TABLE | _PAGE_USER);
-+ return (pmd_val(pmd) & ~(PTE_MASK | _PAGE_USER)) != _KERNPG_TABLE;
- }
-
- #define pte_none(x) (!pte_val((x)))
-diff --git a/include/asm-x86/tlbflush.h b/include/asm-x86/tlbflush.h
-index 0c0674d..35c76ce 100644
---- a/include/asm-x86/tlbflush.h
-+++ b/include/asm-x86/tlbflush.h
-@@ -22,12 +22,23 @@ static inline void __native_flush_tlb(void)
-
- static inline void __native_flush_tlb_global(void)
- {
-- unsigned long cr4 = read_cr4();
-+ unsigned long flags;
-+ unsigned long cr4;
-
-+ /*
-+ * Read-modify-write to CR4 - protect it from preemption and
-+ * from interrupts. (Use the raw variant because this code can
-+ * be called from deep inside debugging code.)
-+ */
-+ raw_local_irq_save(flags);
-+
-+ cr4 = read_cr4();
- /* clear PGE */
- write_cr4(cr4 & ~X86_CR4_PGE);
- /* write old PGE again and flush TLBs */
- write_cr4(cr4);
-+
-+ raw_local_irq_restore(flags);
- }
-
- static inline void __native_flush_tlb_single(unsigned long addr)
-diff --git a/include/asm-x86/xen/page.h b/include/asm-x86/xen/page.h
-index 0179930..baf3a4d 100644
---- a/include/asm-x86/xen/page.h
-+++ b/include/asm-x86/xen/page.h
-@@ -127,7 +127,7 @@ static inline void set_phys_to_machine(unsigned long pfn, unsigned long mfn)
-
- static inline unsigned long pte_mfn(pte_t pte)
- {
-- return (pte.pte & ~_PAGE_NX) >> PAGE_SHIFT;
-+ return (pte.pte & PTE_MASK) >> PAGE_SHIFT;
- }
-
- static inline pte_t mfn_pte(unsigned long page_nr, pgprot_t pgprot)
-diff --git a/include/linux/Kbuild b/include/linux/Kbuild
-index b7d81b2..93b9885 100644
---- a/include/linux/Kbuild
-+++ b/include/linux/Kbuild
-@@ -92,7 +92,6 @@ header-y += if_slip.h
- header-y += if_strip.h
- header-y += if_tun.h
- header-y += if_tunnel.h
--header-y += in6.h
- header-y += in_route.h
- header-y += ioctl.h
- header-y += ip6_tunnel.h
-@@ -105,7 +104,6 @@ header-y += ixjuser.h
- header-y += jffs2.h
- header-y += keyctl.h
- header-y += limits.h
--header-y += dlm_plock.h
- header-y += magic.h
- header-y += major.h
- header-y += matroxfb.h
-@@ -190,6 +188,7 @@ unifdef-y += cyclades.h
- unifdef-y += dccp.h
- unifdef-y += dirent.h
- unifdef-y += dlm.h
-+unifdef-y += dlm_plock.h
- unifdef-y += edd.h
- unifdef-y += elf.h
- unifdef-y += elfcore.h
-@@ -236,6 +235,7 @@ unifdef-y += if_vlan.h
- unifdef-y += igmp.h
- unifdef-y += inet_diag.h
- unifdef-y += in.h
-+unifdef-y += in6.h
- unifdef-y += inotify.h
- unifdef-y += input.h
- unifdef-y += ip.h
-diff --git a/include/linux/atm.h b/include/linux/atm.h
-index 6013668..c791ddd 100644
---- a/include/linux/atm.h
-+++ b/include/linux/atm.h
-@@ -16,14 +16,11 @@
- * documentation. Do not change them.
- */
-
--#ifdef __KERNEL__
--#include
--#include
--#endif
- #include
- #include
- #include
- #include
-+#include
-
-
- /* general ATM constants */
-@@ -212,7 +209,7 @@ struct sockaddr_atmsvc {
- char pub[ATM_E164_LEN+1]; /* public address (E.164) */
- /* unused addresses must be bzero'ed */
- char lij_type; /* role in LIJ call; one of ATM_LIJ* */
-- uint32_t lij_id; /* LIJ call identifier */
-+ __u32 lij_id; /* LIJ call identifier */
- } sas_addr __ATM_API_ALIGN; /* SVC address */
- };
-
-diff --git a/include/linux/atm_tcp.h b/include/linux/atm_tcp.h
-index 18787f9..375638f 100644
---- a/include/linux/atm_tcp.h
-+++ b/include/linux/atm_tcp.h
-@@ -8,11 +8,9 @@
- #define LINUX_ATM_TCP_H
-
- #include
--
--#ifdef __KERNEL__
--#include
--#endif
-+#include
- #include
-+#include
-
-
- /*
-@@ -20,9 +18,9 @@
- */
-
- struct atmtcp_hdr {
-- uint16_t vpi;
-- uint16_t vci;
-- uint32_t length; /* ... of data part */
-+ __u16 vpi;
-+ __u16 vci;
-+ __u32 length; /* ... of data part */
- };
-
- /*
-diff --git a/include/linux/binfmts.h b/include/linux/binfmts.h
-index b512e48..ee0ed48 100644
---- a/include/linux/binfmts.h
-+++ b/include/linux/binfmts.h
-@@ -99,6 +99,7 @@ extern int copy_strings_kernel(int argc,char ** argv,struct linux_binprm *bprm);
- extern void compute_creds(struct linux_binprm *binprm);
- extern int do_coredump(long signr, int exit_code, struct pt_regs * regs);
- extern int set_binfmt(struct linux_binfmt *new);
-+extern void free_bprm(struct linux_binprm *);
-
- #endif /* __KERNEL__ */
- #endif /* _LINUX_BINFMTS_H */
-diff --git a/include/linux/device.h b/include/linux/device.h
-index 15e9fa3..14616e8 100644
---- a/include/linux/device.h
-+++ b/include/linux/device.h
-@@ -449,9 +449,21 @@ extern int __must_check device_reprobe(struct device *dev);
- /*
- * Easy functions for dynamically creating devices on the fly
- */
-+extern struct device *device_create_vargs(struct class *cls,
-+ struct device *parent,
-+ dev_t devt,
-+ void *drvdata,
-+ const char *fmt,
-+ va_list vargs);
- extern struct device *device_create(struct class *cls, struct device *parent,
- dev_t devt, const char *fmt, ...)
- __attribute__((format(printf, 4, 5)));
-+extern struct device *device_create_drvdata(struct class *cls,
-+ struct device *parent,
-+ dev_t devt,
-+ void *drvdata,
-+ const char *fmt, ...)
-+ __attribute__((format(printf, 5, 6)));
- extern void device_destroy(struct class *cls, dev_t devt);
-
- /*
-diff --git a/include/linux/fdtable.h b/include/linux/fdtable.h
-index a118f3c..4aab6f1 100644
---- a/include/linux/fdtable.h
-+++ b/include/linux/fdtable.h
-@@ -93,6 +93,7 @@ struct files_struct *get_files_struct(struct task_struct *);
- void put_files_struct(struct files_struct *fs);
- void reset_files_struct(struct files_struct *);
- int unshare_files(struct files_struct **);
-+struct files_struct *dup_fd(struct files_struct *, int *);
-
- extern struct kmem_cache *files_cachep;
-
-diff --git a/include/linux/gpio.h b/include/linux/gpio.h
-index 4987a84..98be6c5 100644
---- a/include/linux/gpio.h
-+++ b/include/linux/gpio.h
-@@ -8,6 +8,9 @@
-
- #else
-
-+#include
-+#include
-+
- /*
- * Some platforms don't support the GPIO programming interface.
- *
-diff --git a/include/linux/hid.h b/include/linux/hid.h
-index 4ce3b7a..fe56b86 100644
---- a/include/linux/hid.h
-+++ b/include/linux/hid.h
-@@ -2,8 +2,6 @@
- #define __HID_H
-
- /*
-- * $Id: hid.h,v 1.24 2001/12/27 10:37:41 vojtech Exp $
-- *
- * Copyright (c) 1999 Andreas Gal
- * Copyright (c) 2000-2001 Vojtech Pavlik
- * Copyright (c) 2006-2007 Jiri Kosina
-@@ -285,6 +283,7 @@ struct hid_item {
- #define HID_QUIRK_HWHEEL_WHEEL_INVERT 0x04000000
- #define HID_QUIRK_MICROSOFT_KEYS 0x08000000
- #define HID_QUIRK_FULLSPEED_INTERVAL 0x10000000
-+#define HID_QUIRK_APPLE_NUMLOCK_EMULATION 0x20000000
-
- /*
- * Separate quirks for runtime report descriptor fixup
-diff --git a/include/linux/hiddev.h b/include/linux/hiddev.h
-index acbdae6..a416b90 100644
---- a/include/linux/hiddev.h
-+++ b/include/linux/hiddev.h
-@@ -2,8 +2,6 @@
- #define _HIDDEV_H
-
- /*
-- * $Id: hiddev.h,v 1.2 2001/04/26 11:26:09 vojtech Exp $
-- *
- * Copyright (c) 1999-2000 Vojtech Pavlik
- *
- * Sponsored by SuSE
-diff --git a/include/linux/init_task.h b/include/linux/init_task.h
-index b24c287..9927a88 100644
---- a/include/linux/init_task.h
-+++ b/include/linux/init_task.h
-@@ -1,7 +1,6 @@
- #ifndef _LINUX__INIT_TASK_H
- #define _LINUX__INIT_TASK_H
-
--#include
- #include
- #include
- #include
-@@ -12,27 +11,7 @@
- #include
- #include
-
--#define INIT_FDTABLE \
--{ \
-- .max_fds = NR_OPEN_DEFAULT, \
-- .fd = &init_files.fd_array[0], \
-- .close_on_exec = (fd_set *)&init_files.close_on_exec_init, \
-- .open_fds = (fd_set *)&init_files.open_fds_init, \
-- .rcu = RCU_HEAD_INIT, \
-- .next = NULL, \
--}
--
--#define INIT_FILES \
--{ \
-- .count = ATOMIC_INIT(1), \
-- .fdt = &init_files.fdtab, \
-- .fdtab = INIT_FDTABLE, \
-- .file_lock = __SPIN_LOCK_UNLOCKED(init_task.file_lock), \
-- .next_fd = 0, \
-- .close_on_exec_init = { { 0, } }, \
-- .open_fds_init = { { 0, } }, \
-- .fd_array = { NULL, } \
--}
-+extern struct files_struct init_files;
-
- #define INIT_KIOCTX(name, which_mm) \
- { \
-diff --git a/include/linux/libata.h b/include/linux/libata.h
-index 0f17643..4a92fba 100644
---- a/include/linux/libata.h
-+++ b/include/linux/libata.h
-@@ -341,7 +341,7 @@ enum {
- ATA_EH_PMP_TRIES = 5,
- ATA_EH_PMP_LINK_TRIES = 3,
-
-- SATA_PMP_SCR_TIMEOUT = 250,
-+ SATA_PMP_RW_TIMEOUT = 3000, /* PMP read/write timeout */
-
- /* Horkage types. May be set by libata or controller on drives
- (some horkage may be drive/controller pair dependant */
-@@ -351,7 +351,7 @@ enum {
- ATA_HORKAGE_NONCQ = (1 << 2), /* Don't use NCQ */
- ATA_HORKAGE_MAX_SEC_128 = (1 << 3), /* Limit max sects to 128 */
- ATA_HORKAGE_BROKEN_HPA = (1 << 4), /* Broken HPA */
-- ATA_HORKAGE_SKIP_PM = (1 << 5), /* Skip PM operations */
-+ ATA_HORKAGE_DISABLE = (1 << 5), /* Disable it */
- ATA_HORKAGE_HPA_SIZE = (1 << 6), /* native size off by one */
- ATA_HORKAGE_IPM = (1 << 7), /* Link PM problems */
- ATA_HORKAGE_IVB = (1 << 8), /* cbl det validity bit bugs */
-@@ -821,8 +821,6 @@ struct ata_timing {
- unsigned short udma; /* t2CYCTYP/2 */
- };
-
--#define FIT(v, vmin, vmax) max_t(short, min_t(short, v, vmax), vmin)
--
- /*
- * Core layer - drivers/ata/libata-core.c
- */
-diff --git a/include/linux/mman.h b/include/linux/mman.h
-index 87920a0..dab8892 100644
---- a/include/linux/mman.h
-+++ b/include/linux/mman.h
-@@ -17,14 +17,14 @@
-
- extern int sysctl_overcommit_memory;
- extern int sysctl_overcommit_ratio;
--extern atomic_t vm_committed_space;
-+extern atomic_long_t vm_committed_space;
-
- #ifdef CONFIG_SMP
- extern void vm_acct_memory(long pages);
- #else
- static inline void vm_acct_memory(long pages)
- {
-- atomic_add(pages, &vm_committed_space);
-+ atomic_long_add(pages, &vm_committed_space);
- }
- #endif
-
-diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h
-index c463cd8..443bc7c 100644
---- a/include/linux/mmzone.h
-+++ b/include/linux/mmzone.h
-@@ -703,7 +703,7 @@ extern struct pglist_data *next_online_pgdat(struct pglist_data *pgdat);
- extern struct zone *next_zone(struct zone *zone);
-
- /**
-- * for_each_pgdat - helper macro to iterate over all nodes
-+ * for_each_online_pgdat - helper macro to iterate over all online nodes
- * @pgdat - pointer to a pg_data_t variable
- */
- #define for_each_online_pgdat(pgdat) \
-diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
-index b11e6e1..2b02664 100644
---- a/include/linux/netdevice.h
-+++ b/include/linux/netdevice.h
-@@ -514,10 +514,12 @@ struct net_device
- #define NETIF_F_NETNS_LOCAL 8192 /* Does not change network namespaces */
- #define NETIF_F_MULTI_QUEUE 16384 /* Has multiple TX/RX queues */
- #define NETIF_F_LRO 32768 /* large receive offload */
-+#define NETIF_F_VLAN_TSO 65536 /* Supports TSO for VLANs */
-+#define NETIF_F_VLAN_CSUM 131072 /* Supports TX checksumming for VLANs */
-
- /* Segmentation offload features */
--#define NETIF_F_GSO_SHIFT 16
--#define NETIF_F_GSO_MASK 0xffff0000
-+#define NETIF_F_GSO_SHIFT 20
-+#define NETIF_F_GSO_MASK 0xfff00000
- #define NETIF_F_TSO (SKB_GSO_TCPV4 << NETIF_F_GSO_SHIFT)
- #define NETIF_F_UFO (SKB_GSO_UDP << NETIF_F_GSO_SHIFT)
- #define NETIF_F_GSO_ROBUST (SKB_GSO_DODGY << NETIF_F_GSO_SHIFT)
-diff --git a/include/linux/netfilter.h b/include/linux/netfilter.h
-index e4c6659..0c5eb7e 100644
---- a/include/linux/netfilter.h
-+++ b/include/linux/netfilter.h
-@@ -3,7 +3,6 @@
-
- #ifdef __KERNEL__
- #include
--#include
- #include
- #include
- #include
-@@ -14,6 +13,7 @@
- #include
- #include
- #endif
-+#include
- #include
-
- /* Responses from hook functions. */
-diff --git a/include/linux/netfilter_arp/arp_tables.h b/include/linux/netfilter_arp/arp_tables.h
-index dd9c97f..590ac3d 100644
---- a/include/linux/netfilter_arp/arp_tables.h
-+++ b/include/linux/netfilter_arp/arp_tables.h
-@@ -11,11 +11,11 @@
-
- #ifdef __KERNEL__
- #include
--#include
- #include
- #include
- #include
- #endif
-+#include
- #include
- #include
-
-diff --git a/include/linux/netfilter_ipv4/ip_tables.h b/include/linux/netfilter_ipv4/ip_tables.h
-index bfc889f..092bd50 100644
---- a/include/linux/netfilter_ipv4/ip_tables.h
-+++ b/include/linux/netfilter_ipv4/ip_tables.h
-@@ -17,11 +17,11 @@
-
- #ifdef __KERNEL__
- #include
--#include
- #include
- #include
- #include
- #endif
-+#include
- #include
- #include
-
-diff --git a/include/linux/netfilter_ipv6/ip6_tables.h b/include/linux/netfilter_ipv6/ip6_tables.h
-index f2507dc..1089e33 100644
---- a/include/linux/netfilter_ipv6/ip6_tables.h
-+++ b/include/linux/netfilter_ipv6/ip6_tables.h
-@@ -17,11 +17,11 @@
-
- #ifdef __KERNEL__
- #include
--#include
- #include
- #include
- #include
- #endif
-+#include
- #include
- #include