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 - -diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h -index cf6dbd7..9b940e6 100644 ---- a/include/linux/pci_ids.h -+++ b/include/linux/pci_ids.h -@@ -1761,6 +1761,7 @@ - - #define PCI_VENDOR_ID_INTASHIELD 0x135a - #define PCI_DEVICE_ID_INTASHIELD_IS200 0x0d80 -+#define PCI_DEVICE_ID_INTASHIELD_IS400 0x0dc0 - - #define PCI_VENDOR_ID_QUATECH 0x135C - #define PCI_DEVICE_ID_QUATECH_QSC100 0x0010 -@@ -2383,6 +2384,9 @@ - #define PCI_DEVICE_ID_INTEL_ICH10_4 0x3a30 - #define PCI_DEVICE_ID_INTEL_ICH10_5 0x3a60 - #define PCI_DEVICE_ID_INTEL_IOAT_SNB 0x402f -+#define PCI_DEVICE_ID_INTEL_5400_ERR 0x4030 -+#define PCI_DEVICE_ID_INTEL_5400_FBD0 0x4035 -+#define PCI_DEVICE_ID_INTEL_5400_FBD1 0x4036 - #define PCI_DEVICE_ID_INTEL_IOAT_SCNB 0x65ff - #define PCI_DEVICE_ID_INTEL_TOLAPAI_0 0x5031 - #define PCI_DEVICE_ID_INTEL_TOLAPAI_1 0x5032 -diff --git a/include/linux/raid/bitmap.h b/include/linux/raid/bitmap.h -index 47fbcba..78bfdea 100644 ---- a/include/linux/raid/bitmap.h -+++ b/include/linux/raid/bitmap.h -@@ -262,7 +262,6 @@ int bitmap_create(mddev_t *mddev); - void bitmap_flush(mddev_t *mddev); - void bitmap_destroy(mddev_t *mddev); - --char *file_path(struct file *file, char *buf, int count); - void bitmap_print_sb(struct bitmap *bitmap); - void bitmap_update_sb(struct bitmap *bitmap); - -diff --git a/include/linux/raid/md.h b/include/linux/raid/md.h -index 81a1a02..b7386ae 100644 ---- a/include/linux/raid/md.h -+++ b/include/linux/raid/md.h -@@ -72,6 +72,8 @@ - */ - #define MD_PATCHLEVEL_VERSION 3 - -+extern int mdp_major; -+ - extern int register_md_personality (struct mdk_personality *p); - extern int unregister_md_personality (struct mdk_personality *p); - extern mdk_thread_t * md_register_thread (void (*run) (mddev_t *mddev), -diff --git a/include/linux/raid/md_k.h b/include/linux/raid/md_k.h -index 812ffa5..3dea9f5 100644 ---- a/include/linux/raid/md_k.h -+++ b/include/linux/raid/md_k.h -@@ -180,13 +180,15 @@ struct mddev_s - int sync_speed_min; - int sync_speed_max; - -+ /* resync even though the same disks are shared among md-devices */ -+ int parallel_resync; -+ - int ok_start_degraded; - /* recovery/resync flags - * NEEDED: we might need to start a resync/recover - * RUNNING: a thread is running, or about to be started - * SYNC: actually doing a resync, not a recovery -- * ERR: and IO error was detected - abort the resync/recovery -- * INTR: someone requested a (clean) early abort. -+ * INTR: resync needs to be aborted for some reason - * DONE: thread is done and is waiting to be reaped - * REQUEST: user-space has requested a sync (used with SYNC) - * CHECK: user-space request for for check-only, no repair -@@ -196,7 +198,6 @@ struct mddev_s - */ - #define MD_RECOVERY_RUNNING 0 - #define MD_RECOVERY_SYNC 1 --#define MD_RECOVERY_ERR 2 - #define MD_RECOVERY_INTR 3 - #define MD_RECOVERY_DONE 4 - #define MD_RECOVERY_NEEDED 5 -diff --git a/include/linux/sm501.h b/include/linux/sm501.h -index bca1345..95c1c39 100644 ---- a/include/linux/sm501.h -+++ b/include/linux/sm501.h -@@ -71,8 +71,8 @@ extern unsigned long sm501_gpio_get(struct device *dev, - #define SM501FB_FLAG_DISABLE_AT_EXIT (1<<1) - #define SM501FB_FLAG_USE_HWCURSOR (1<<2) - #define SM501FB_FLAG_USE_HWACCEL (1<<3) --#define SM501FB_FLAG_PANEL_USE_FPEN (1<<4) --#define SM501FB_FLAG_PANEL_USE_VBIASEN (1<<5) -+#define SM501FB_FLAG_PANEL_NO_FPEN (1<<4) -+#define SM501FB_FLAG_PANEL_NO_VBIASEN (1<<5) - - struct sm501_platdata_fbsub { - struct fb_videomode *def_mode; -diff --git a/include/linux/sunrpc/svc_rdma.h b/include/linux/sunrpc/svc_rdma.h -index c11bbcc..05eb466 100644 ---- a/include/linux/sunrpc/svc_rdma.h -+++ b/include/linux/sunrpc/svc_rdma.h -@@ -71,7 +71,8 @@ extern atomic_t rdma_stat_sq_prod; - * completes. - */ - struct svc_rdma_op_ctxt { -- struct svc_rdma_op_ctxt *next; -+ struct svc_rdma_op_ctxt *read_hdr; -+ struct list_head free_list; - struct xdr_buf arg; - struct list_head dto_q; - enum ib_wr_opcode wr_op; -@@ -85,7 +86,6 @@ struct svc_rdma_op_ctxt { - struct page *pages[RPCSVC_MAXPAGES]; - }; - --#define RDMACTXT_F_READ_DONE 1 - #define RDMACTXT_F_LAST_CTXT 2 - - struct svcxprt_rdma { -@@ -104,7 +104,8 @@ struct svcxprt_rdma { - - struct ib_pd *sc_pd; - -- struct svc_rdma_op_ctxt *sc_ctxt_head; -+ atomic_t sc_ctxt_used; -+ struct list_head sc_ctxt_free; - int sc_ctxt_cnt; - int sc_ctxt_bump; - int sc_ctxt_max; -@@ -123,6 +124,7 @@ struct svcxprt_rdma { - struct list_head sc_dto_q; /* DTO tasklet I/O pending Q */ - struct list_head sc_read_complete_q; - spinlock_t sc_read_complete_lock; -+ struct work_struct sc_work; - }; - /* sc_flags */ - #define RDMAXPRT_RQ_PENDING 1 -@@ -164,8 +166,8 @@ extern int svc_rdma_sendto(struct svc_rqst *); - - /* svc_rdma_transport.c */ - extern int svc_rdma_send(struct svcxprt_rdma *, struct ib_send_wr *); --extern int svc_rdma_send_error(struct svcxprt_rdma *, struct rpcrdma_msg *, -- enum rpcrdma_errcode); -+extern void svc_rdma_send_error(struct svcxprt_rdma *, struct rpcrdma_msg *, -+ enum rpcrdma_errcode); - struct page *svc_rdma_get_page(void); - extern int svc_rdma_post_recv(struct svcxprt_rdma *); - extern int svc_rdma_create_listen(struct svc_serv *, int, struct sockaddr *); -diff --git a/include/linux/tcp.h b/include/linux/tcp.h -index d96d9b1..18e62e3 100644 ---- a/include/linux/tcp.h -+++ b/include/linux/tcp.h -@@ -355,7 +355,7 @@ struct tcp_sock { - u32 lost_retrans_low; /* Sent seq after any rxmit (lowest) */ - - u16 advmss; /* Advertised MSS */ -- u16 prior_ssthresh; /* ssthresh saved at recovery start */ -+ u32 prior_ssthresh; /* ssthresh saved at recovery start */ - u32 lost_out; /* Lost packets */ - u32 sacked_out; /* SACK'd packets */ - u32 fackets_out; /* FACK'd packets */ -diff --git a/include/linux/types.h b/include/linux/types.h -index 9dc2346..d4a9ce6 100644 ---- a/include/linux/types.h -+++ b/include/linux/types.h -@@ -197,8 +197,6 @@ typedef u64 resource_size_t; - typedef u32 resource_size_t; - #endif - --#endif /* __KERNEL__ */ -- - struct ustat { - __kernel_daddr_t f_tfree; - __kernel_ino_t f_tinode; -@@ -206,4 +204,6 @@ struct ustat { - char f_fpack[6]; - }; - -+#endif /* __KERNEL__ */ -+ - #endif /* _LINUX_TYPES_H */ -diff --git a/include/linux/usb/cdc.h b/include/linux/usb/cdc.h -index 71e52f2..ca228bb 100644 ---- a/include/linux/usb/cdc.h -+++ b/include/linux/usb/cdc.h -@@ -130,6 +130,15 @@ struct usb_cdc_ether_desc { - __u8 bNumberPowerFilters; - } __attribute__ ((packed)); - -+/* "Telephone Control Model Functional Descriptor" from CDC WMC spec 6.3..3 */ -+struct usb_cdc_dmm_desc { -+ __u8 bFunctionLength; -+ __u8 bDescriptorType; -+ __u8 bDescriptorSubtype; -+ __u16 bcdVersion; -+ __le16 wMaxCommand; -+} __attribute__ ((packed)); -+ - /* "MDLM Functional Descriptor" from CDC WMC spec 6.7.2.3 */ - struct usb_cdc_mdlm_desc { - __u8 bLength; -diff --git a/include/media/videobuf-core.h b/include/media/videobuf-core.h -index 5b39a22..874f134 100644 ---- a/include/media/videobuf-core.h -+++ b/include/media/videobuf-core.h -@@ -237,6 +237,9 @@ unsigned int videobuf_poll_stream(struct file *file, - int videobuf_mmap_setup(struct videobuf_queue *q, - unsigned int bcount, unsigned int bsize, - enum v4l2_memory memory); -+int __videobuf_mmap_setup(struct videobuf_queue *q, -+ unsigned int bcount, unsigned int bsize, -+ enum v4l2_memory memory); - int videobuf_mmap_free(struct videobuf_queue *q); - int videobuf_mmap_mapper(struct videobuf_queue *q, - struct vm_area_struct *vma); -diff --git a/include/net/mac80211.h b/include/net/mac80211.h -index 4a80d74..dae3f9e 100644 ---- a/include/net/mac80211.h -+++ b/include/net/mac80211.h -@@ -1594,13 +1594,16 @@ void ieee80211_wake_queues(struct ieee80211_hw *hw); - void ieee80211_scan_completed(struct ieee80211_hw *hw); - - /** -- * ieee80211_iterate_active_interfaces - iterate active interfaces -+ * ieee80211_iterate_active_interfaces- iterate active interfaces - * - * This function iterates over the interfaces associated with a given - * hardware that are currently active and calls the callback for them. -+ * This function allows the iterator function to sleep, when the iterator -+ * function is atomic @ieee80211_iterate_active_interfaces_atomic can -+ * be used. - * - * @hw: the hardware struct of which the interfaces should be iterated over -- * @iterator: the iterator function to call, cannot sleep -+ * @iterator: the iterator function to call - * @data: first argument of the iterator function - */ - void ieee80211_iterate_active_interfaces(struct ieee80211_hw *hw, -@@ -1609,6 +1612,24 @@ void ieee80211_iterate_active_interfaces(struct ieee80211_hw *hw, - void *data); - - /** -+ * ieee80211_iterate_active_interfaces_atomic - iterate active interfaces -+ * -+ * This function iterates over the interfaces associated with a given -+ * hardware that are currently active and calls the callback for them. -+ * This function requires the iterator callback function to be atomic, -+ * if that is not desired, use @ieee80211_iterate_active_interfaces instead. -+ * -+ * @hw: the hardware struct of which the interfaces should be iterated over -+ * @iterator: the iterator function to call, cannot sleep -+ * @data: first argument of the iterator function -+ */ -+void ieee80211_iterate_active_interfaces_atomic(struct ieee80211_hw *hw, -+ void (*iterator)(void *data, -+ u8 *mac, -+ struct ieee80211_vif *vif), -+ void *data); -+ -+/** - * ieee80211_start_tx_ba_session - Start a tx Block Ack session. - * @hw: pointer as obtained from ieee80211_alloc_hw(). - * @ra: receiver address of the BA session recipient -diff --git a/include/net/ndisc.h b/include/net/ndisc.h -index 9c451ff..a01b7c4 100644 ---- a/include/net/ndisc.h -+++ b/include/net/ndisc.h -@@ -129,6 +129,10 @@ extern int ndisc_ifinfo_sysctl_change(struct ctl_table *ctl, - void __user *buffer, - size_t *lenp, - loff_t *ppos); -+int ndisc_ifinfo_sysctl_strategy(ctl_table *ctl, int __user *name, -+ int nlen, void __user *oldval, -+ size_t __user *oldlenp, -+ void __user *newval, size_t newlen); - #endif - - extern void inet6_ifinfo_notify(int event, -diff --git a/init/do_mounts_md.c b/init/do_mounts_md.c -index 7473b0c..693d246 100644 ---- a/init/do_mounts_md.c -+++ b/init/do_mounts_md.c -@@ -24,7 +24,6 @@ static struct { - - static int md_setup_ents __initdata; - --extern int mdp_major; - /* - * Parse the command-line parameters given our kernel, but do not - * actually try to invoke the MD device now; that is handled by -diff --git a/kernel/audit.c b/kernel/audit.c -index b7d3709..e8692a5 100644 ---- a/kernel/audit.c -+++ b/kernel/audit.c -@@ -572,16 +572,17 @@ void audit_send_reply(int pid, int seq, int type, int done, int multi, - - skb = audit_make_reply(pid, seq, type, done, multi, payload, size); - if (!skb) -- return; -+ goto out; - - reply->pid = pid; - reply->skb = skb; - - tsk = kthread_run(audit_send_reply_thread, reply, "audit_send_reply"); -- if (IS_ERR(tsk)) { -- kfree(reply); -- kfree_skb(skb); -- } -+ if (!IS_ERR(tsk)) -+ return; -+ kfree_skb(skb); -+out: -+ kfree(reply); - } - - /* -diff --git a/kernel/audit_tree.c b/kernel/audit_tree.c -index 9ef5e0a..f7921a2 100644 ---- a/kernel/audit_tree.c -+++ b/kernel/audit_tree.c -@@ -172,10 +172,9 @@ static void insert_hash(struct audit_chunk *chunk) - struct audit_chunk *audit_tree_lookup(const struct inode *inode) - { - struct list_head *list = chunk_hash(inode); -- struct list_head *pos; -+ struct audit_chunk *p; - -- list_for_each_rcu(pos, list) { -- struct audit_chunk *p = container_of(pos, struct audit_chunk, hash); -+ list_for_each_entry_rcu(p, list, hash) { - if (p->watch.inode == inode) { - get_inotify_watch(&p->watch); - return p; -diff --git a/kernel/cgroup.c b/kernel/cgroup.c -index fbc6fc8..15ac0e1 100644 ---- a/kernel/cgroup.c -+++ b/kernel/cgroup.c -@@ -2903,7 +2903,7 @@ int cgroup_clone(struct task_struct *tsk, struct cgroup_subsys *subsys) - cg = tsk->cgroups; - parent = task_cgroup(tsk, subsys->subsys_id); - -- snprintf(nodename, MAX_CGROUP_TYPE_NAMELEN, "node_%d", tsk->pid); -+ snprintf(nodename, MAX_CGROUP_TYPE_NAMELEN, "%d", tsk->pid); - - /* Pin the hierarchy */ - atomic_inc(&parent->root->sb->s_active); -diff --git a/kernel/exit.c b/kernel/exit.c -index 1510f78..8f6185e 100644 ---- a/kernel/exit.c -+++ b/kernel/exit.c -@@ -126,6 +126,12 @@ static void __exit_signal(struct task_struct *tsk) - - __unhash_process(tsk); - -+ /* -+ * Do this under ->siglock, we can race with another thread -+ * doing sigqueue_free() if we have SIGQUEUE_PREALLOC signals. -+ */ -+ flush_sigqueue(&tsk->pending); -+ - tsk->signal = NULL; - tsk->sighand = NULL; - spin_unlock(&sighand->siglock); -@@ -133,7 +139,6 @@ static void __exit_signal(struct task_struct *tsk) - - __cleanup_sighand(sighand); - clear_tsk_thread_flag(tsk,TIF_SIGPENDING); -- flush_sigqueue(&tsk->pending); - if (sig) { - flush_sigqueue(&sig->shared_pending); - taskstats_tgid_free(sig); -diff --git a/kernel/fork.c b/kernel/fork.c -index 933e60e..19908b2 100644 ---- a/kernel/fork.c -+++ b/kernel/fork.c -@@ -660,136 +660,6 @@ static int copy_fs(unsigned long clone_flags, struct task_struct *tsk) - return 0; - } - --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; --} -- --static struct files_struct *alloc_files(void) --{ -- struct files_struct *newf; -- struct fdtable *fdt; -- -- 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; -- fdt = &newf->fdtab; -- fdt->max_fds = NR_OPEN_DEFAULT; -- fdt->close_on_exec = (fd_set *)&newf->close_on_exec_init; -- fdt->open_fds = (fd_set *)&newf->open_fds_init; -- fdt->fd = &newf->fd_array[0]; -- INIT_RCU_HEAD(&fdt->rcu); -- fdt->next = NULL; -- rcu_assign_pointer(newf->fdt, fdt); --out: -- return newf; --} -- --/* -- * 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. -- */ --static 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 = alloc_files(); -- if (!newf) -- goto out; -- -- spin_lock(&oldf->file_lock); -- old_fdt = files_fdtable(oldf); -- new_fdt = files_fdtable(newf); -- open_files = count_open_files(old_fdt); -- -- /* -- * Check whether we need to allocate a larger fd array and fd set. -- * Note: we're not a clone task, so the open count won't change. -- */ -- if (open_files > new_fdt->max_fds) { -- new_fdt->max_fds = 0; -- spin_unlock(&oldf->file_lock); -- spin_lock(&newf->file_lock); -- *errorp = expand_files(newf, open_files-1); -- spin_unlock(&newf->file_lock); -- if (*errorp < 0) -- goto out_release; -- new_fdt = files_fdtable(newf); -- /* -- * 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); -- } -- -- 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); -- } -- -- return newf; -- --out_release: -- kmem_cache_free(files_cachep, newf); --out: -- return NULL; --} -- - static int copy_files(unsigned long clone_flags, struct task_struct * tsk) - { - struct files_struct *oldf, *newf; -diff --git a/kernel/module.c b/kernel/module.c -index f5e9491..5f80478 100644 ---- a/kernel/module.c -+++ b/kernel/module.c -@@ -1337,7 +1337,19 @@ out_unreg: - kobject_put(&mod->mkobj.kobj); - return err; - } --#endif -+ -+static void mod_sysfs_fini(struct module *mod) -+{ -+ kobject_put(&mod->mkobj.kobj); -+} -+ -+#else /* CONFIG_SYSFS */ -+ -+static void mod_sysfs_fini(struct module *mod) -+{ -+} -+ -+#endif /* CONFIG_SYSFS */ - - static void mod_kobject_remove(struct module *mod) - { -@@ -1345,7 +1357,7 @@ static void mod_kobject_remove(struct module *mod) - module_param_sysfs_remove(mod); - kobject_put(mod->mkobj.drivers_dir); - kobject_put(mod->holders_dir); -- kobject_put(&mod->mkobj.kobj); -+ mod_sysfs_fini(mod); - } - - /* -@@ -1780,7 +1792,7 @@ static struct module *load_module(void __user *umod, - - /* Sanity checks against insmoding binaries or wrong arch, - weird elf version */ -- if (memcmp(hdr->e_ident, ELFMAG, 4) != 0 -+ if (memcmp(hdr->e_ident, ELFMAG, SELFMAG) != 0 - || hdr->e_type != ET_REL - || !elf_check_arch(hdr) - || hdr->e_shentsize != sizeof(*sechdrs)) { -diff --git a/kernel/signal.c b/kernel/signal.c -index 72bb4f5..12ffea7 100644 ---- a/kernel/signal.c -+++ b/kernel/signal.c -@@ -1242,7 +1242,8 @@ void sigqueue_free(struct sigqueue *q) - /* - * If the signal is still pending remove it from the - * pending queue. We must hold ->siglock while testing -- * q->list to serialize with collect_signal(). -+ * q->list to serialize with collect_signal() or with -+ * __exit_signal()->flush_sigqueue(). - */ - spin_lock_irqsave(lock, flags); - if (!list_empty(&q->list)) -diff --git a/kernel/stop_machine.c b/kernel/stop_machine.c -index 0101aee..b7350bb 100644 ---- a/kernel/stop_machine.c -+++ b/kernel/stop_machine.c -@@ -62,8 +62,7 @@ static int stopmachine(void *cpu) - * help our sisters onto their CPUs. */ - if (!prepared && !irqs_disabled) - yield(); -- else -- cpu_relax(); -+ cpu_relax(); - } - - /* Ack: we are exiting. */ -@@ -106,8 +105,10 @@ static int stop_machine(void) - } - - /* Wait for them all to come to life. */ -- while (atomic_read(&stopmachine_thread_ack) != stopmachine_num_threads) -+ while (atomic_read(&stopmachine_thread_ack) != stopmachine_num_threads) { - yield(); -+ cpu_relax(); -+ } - - /* If some failed, kill them all. */ - if (ret < 0) { -diff --git a/kernel/sys.c b/kernel/sys.c -index 895d2d4..14e9728 100644 ---- a/kernel/sys.c -+++ b/kernel/sys.c -@@ -1652,7 +1652,7 @@ asmlinkage long sys_umask(int mask) - asmlinkage long sys_prctl(int option, unsigned long arg2, unsigned long arg3, - unsigned long arg4, unsigned long arg5) - { -- long uninitialized_var(error); -+ long error = 0; - - if (security_task_prctl(option, arg2, arg3, arg4, arg5, &error)) - return error; -@@ -1701,9 +1701,7 @@ asmlinkage long sys_prctl(int option, unsigned long arg2, unsigned long arg3, - error = PR_TIMING_STATISTICAL; - break; - case PR_SET_TIMING: -- if (arg2 == PR_TIMING_STATISTICAL) -- error = 0; -- else -+ if (arg2 != PR_TIMING_STATISTICAL) - error = -EINVAL; - break; - -diff --git a/kernel/sysctl.c b/kernel/sysctl.c -index d7ffdc5..2911665 100644 ---- a/kernel/sysctl.c -+++ b/kernel/sysctl.c -@@ -81,6 +81,7 @@ extern int compat_log; - extern int maps_protect; - extern int sysctl_stat_interval; - extern int latencytop_enabled; -+extern int sysctl_nr_open_min, sysctl_nr_open_max; - - /* Constants used for minimum and maximum */ - #if defined(CONFIG_DETECT_SOFTLOCKUP) || defined(CONFIG_HIGHMEM) -@@ -1190,7 +1191,9 @@ static struct ctl_table fs_table[] = { - .data = &sysctl_nr_open, - .maxlen = sizeof(int), - .mode = 0644, -- .proc_handler = &proc_dointvec, -+ .proc_handler = &proc_dointvec_minmax, -+ .extra1 = &sysctl_nr_open_min, -+ .extra2 = &sysctl_nr_open_max, - }, - { - .ctl_name = FS_DENTRY, -diff --git a/lib/lmb.c b/lib/lmb.c -index 867f7b5..5d7b928 100644 ---- a/lib/lmb.c -+++ b/lib/lmb.c -@@ -48,7 +48,8 @@ void lmb_dump_all(void) - } - - pr_info(" reserved.cnt = 0x%lx\n", lmb.reserved.cnt); -- pr_info(" reserved.size = 0x%lx\n", lmb.reserved.size); -+ pr_info(" reserved.size = 0x%llx\n", -+ (unsigned long long)lmb.memory.size); - for (i=0; i < lmb.reserved.cnt ;i++) { - pr_info(" reserved.region[0x%lx].base = 0x%llx\n", - i, (unsigned long long)lmb.reserved.region[i].base); -diff --git a/mm/backing-dev.c b/mm/backing-dev.c -index 7c4f9e0..f2e574d 100644 ---- a/mm/backing-dev.c -+++ b/mm/backing-dev.c -@@ -172,30 +172,22 @@ postcore_initcall(bdi_class_init); - int bdi_register(struct backing_dev_info *bdi, struct device *parent, - const char *fmt, ...) - { -- char *name; - va_list args; - int ret = 0; - struct device *dev; - - va_start(args, fmt); -- name = kvasprintf(GFP_KERNEL, fmt, args); -+ dev = device_create_vargs(bdi_class, parent, MKDEV(0, 0), bdi, fmt, args); - va_end(args); -- -- if (!name) -- return -ENOMEM; -- -- dev = device_create(bdi_class, parent, MKDEV(0, 0), name); - if (IS_ERR(dev)) { - ret = PTR_ERR(dev); - goto exit; - } - - bdi->dev = dev; -- dev_set_drvdata(bdi->dev, bdi); -- bdi_debug_register(bdi, name); -+ bdi_debug_register(bdi, dev_name(dev)); - - exit: -- kfree(name); - return ret; - } - EXPORT_SYMBOL(bdi_register); -diff --git a/mm/memory.c b/mm/memory.c -index fb5608a..19e0ae9 100644 ---- a/mm/memory.c -+++ b/mm/memory.c -@@ -2295,8 +2295,6 @@ static int __do_fault(struct mm_struct *mm, struct vm_area_struct *vma, - vmf.flags = flags; - vmf.page = NULL; - -- BUG_ON(vma->vm_flags & VM_PFNMAP); -- - ret = vma->vm_ops->fault(vma, &vmf); - if (unlikely(ret & (VM_FAULT_ERROR | VM_FAULT_NOPAGE))) - return ret; -diff --git a/mm/mmap.c b/mm/mmap.c -index fac6633..669499e 100644 ---- a/mm/mmap.c -+++ b/mm/mmap.c -@@ -80,7 +80,7 @@ EXPORT_SYMBOL(vm_get_page_prot); - int sysctl_overcommit_memory = OVERCOMMIT_GUESS; /* heuristic overcommit */ - int sysctl_overcommit_ratio = 50; /* default is 50% */ - int sysctl_max_map_count __read_mostly = DEFAULT_MAX_MAP_COUNT; --atomic_t vm_committed_space = ATOMIC_INIT(0); -+atomic_long_t vm_committed_space = ATOMIC_LONG_INIT(0); - - /* - * Check that a process has enough memory to allocate a new virtual -@@ -177,7 +177,7 @@ int __vm_enough_memory(struct mm_struct *mm, long pages, int cap_sys_admin) - * cast `allowed' as a signed long because vm_committed_space - * sometimes has a negative value - */ -- if (atomic_read(&vm_committed_space) < (long)allowed) -+ if (atomic_long_read(&vm_committed_space) < (long)allowed) - return 0; - error: - vm_unacct_memory(pages); -diff --git a/mm/nommu.c b/mm/nommu.c -index ef8c62c..dca93fc 100644 ---- a/mm/nommu.c -+++ b/mm/nommu.c -@@ -39,7 +39,7 @@ struct page *mem_map; - unsigned long max_mapnr; - unsigned long num_physpages; - unsigned long askedalloc, realalloc; --atomic_t vm_committed_space = ATOMIC_INIT(0); -+atomic_long_t vm_committed_space = ATOMIC_LONG_INIT(0); - int sysctl_overcommit_memory = OVERCOMMIT_GUESS; /* heuristic overcommit */ - int sysctl_overcommit_ratio = 50; /* default is 50% */ - int sysctl_max_map_count = DEFAULT_MAX_MAP_COUNT; -@@ -1410,7 +1410,7 @@ int __vm_enough_memory(struct mm_struct *mm, long pages, int cap_sys_admin) - * cast `allowed' as a signed long because vm_committed_space - * sometimes has a negative value - */ -- if (atomic_read(&vm_committed_space) < (long)allowed) -+ if (atomic_long_read(&vm_committed_space) < (long)allowed) - return 0; - error: - vm_unacct_memory(pages); -diff --git a/mm/page_alloc.c b/mm/page_alloc.c -index 6383557..8e83f02 100644 ---- a/mm/page_alloc.c -+++ b/mm/page_alloc.c -@@ -1396,6 +1396,9 @@ get_page_from_freelist(gfp_t gfp_mask, nodemask_t *nodemask, unsigned int order, - - (void)first_zones_zonelist(zonelist, high_zoneidx, nodemask, - &preferred_zone); -+ if (!preferred_zone) -+ return NULL; -+ - classzone_idx = zone_idx(preferred_zone); - - zonelist_scan: -@@ -2804,7 +2807,7 @@ int zone_wait_table_init(struct zone *zone, unsigned long zone_size_pages) - alloc_size = zone->wait_table_hash_nr_entries - * sizeof(wait_queue_head_t); - -- if (system_state == SYSTEM_BOOTING) { -+ if (!slab_is_available()) { - zone->wait_table = (wait_queue_head_t *) - alloc_bootmem_node(pgdat, alloc_size); - } else { -@@ -3378,7 +3381,8 @@ static void __paginginit free_area_init_core(struct pglist_data *pgdat, - * is used by this zone for memmap. This affects the watermark - * and per-cpu initialisations - */ -- memmap_pages = (size * sizeof(struct page)) >> PAGE_SHIFT; -+ memmap_pages = -+ PAGE_ALIGN(size * sizeof(struct page)) >> PAGE_SHIFT; - if (realsize >= memmap_pages) { - realsize -= memmap_pages; - printk(KERN_DEBUG -diff --git a/mm/swap.c b/mm/swap.c -index 91e1944..45c9f25 100644 ---- a/mm/swap.c -+++ b/mm/swap.c -@@ -503,7 +503,7 @@ void vm_acct_memory(long pages) - local = &__get_cpu_var(committed_space); - *local += pages; - if (*local > ACCT_THRESHOLD || *local < -ACCT_THRESHOLD) { -- atomic_add(*local, &vm_committed_space); -+ atomic_long_add(*local, &vm_committed_space); - *local = 0; - } - preempt_enable(); -@@ -520,7 +520,7 @@ static int cpu_swap_callback(struct notifier_block *nfb, - - committed = &per_cpu(committed_space, (long)hcpu); - if (action == CPU_DEAD || action == CPU_DEAD_FROZEN) { -- atomic_add(*committed, &vm_committed_space); -+ atomic_long_add(*committed, &vm_committed_space); - *committed = 0; - drain_cpu_pagevecs((long)hcpu); - } -diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c -index 2a739ad..5196130 100644 ---- a/net/8021q/vlan.c -+++ b/net/8021q/vlan.c -@@ -382,6 +382,24 @@ static void vlan_sync_address(struct net_device *dev, - memcpy(vlan->real_dev_addr, dev->dev_addr, ETH_ALEN); - } - -+static void vlan_transfer_features(struct net_device *dev, -+ struct net_device *vlandev) -+{ -+ unsigned long old_features = vlandev->features; -+ -+ if (dev->features & NETIF_F_VLAN_TSO) { -+ vlandev->features &= ~VLAN_TSO_FEATURES; -+ vlandev->features |= dev->features & VLAN_TSO_FEATURES; -+ } -+ if (dev->features & NETIF_F_VLAN_CSUM) { -+ vlandev->features &= ~NETIF_F_ALL_CSUM; -+ vlandev->features |= dev->features & NETIF_F_ALL_CSUM; -+ } -+ -+ if (old_features != vlandev->features) -+ netdev_features_change(vlandev); -+} -+ - static void __vlan_device_event(struct net_device *dev, unsigned long event) - { - switch (event) { -@@ -410,10 +428,8 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event, - int i, flgs; - struct net_device *vlandev; - -- if (is_vlan_dev(dev)) { -+ if (is_vlan_dev(dev)) - __vlan_device_event(dev, event); -- goto out; -- } - - grp = __vlan_find_group(dev); - if (!grp) -@@ -450,6 +466,18 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event, - } - break; - -+ case NETDEV_FEAT_CHANGE: -+ /* Propagate device features to underlying device */ -+ for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) { -+ vlandev = vlan_group_get_device(grp, i); -+ if (!vlandev) -+ continue; -+ -+ vlan_transfer_features(dev, vlandev); -+ } -+ -+ break; -+ - case NETDEV_DOWN: - /* Put all VLANs for this dev in the down state too. */ - for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) { -diff --git a/net/8021q/vlan.h b/net/8021q/vlan.h -index 5229a72..7962569 100644 ---- a/net/8021q/vlan.h -+++ b/net/8021q/vlan.h -@@ -7,6 +7,8 @@ - #define VLAN_GRP_HASH_SIZE (1 << VLAN_GRP_HASH_SHIFT) - #define VLAN_GRP_HASH_MASK (VLAN_GRP_HASH_SIZE - 1) - -+#define VLAN_TSO_FEATURES (NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_SG) -+ - /* Find a VLAN device by the MAC address of its Ethernet device, and - * it's VLAN ID. The default configuration is to have VLAN's scope - * to be box-wide, so the MAC will be ignored. The mac will only be -diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c -index c961f08..b1cfbaa 100644 ---- a/net/8021q/vlan_dev.c -+++ b/net/8021q/vlan_dev.c -@@ -663,6 +663,11 @@ static int vlan_dev_init(struct net_device *dev) - (1<<__LINK_STATE_DORMANT))) | - (1<<__LINK_STATE_PRESENT); - -+ if (real_dev->features & NETIF_F_VLAN_TSO) -+ dev->features |= real_dev->features & VLAN_TSO_FEATURES; -+ if (real_dev->features & NETIF_F_VLAN_CSUM) -+ dev->features |= real_dev->features & NETIF_F_ALL_CSUM; -+ - /* ipv6 shared card related stuff */ - dev->dev_id = real_dev->dev_id; - -diff --git a/net/core/dev.c b/net/core/dev.c -index a1607bc..5829630 100644 ---- a/net/core/dev.c -+++ b/net/core/dev.c -@@ -903,7 +903,11 @@ int dev_change_name(struct net_device *dev, char *newname) - strlcpy(dev->name, newname, IFNAMSIZ); - - rollback: -- device_rename(&dev->dev, dev->name); -+ err = device_rename(&dev->dev, dev->name); -+ if (err) { -+ memcpy(dev->name, oldname, IFNAMSIZ); -+ return err; -+ } - - write_lock_bh(&dev_base_lock); - hlist_del(&dev->name_hlist); -@@ -3137,7 +3141,7 @@ int dev_change_flags(struct net_device *dev, unsigned flags) - * Load in the correct multicast list now the flags have changed. - */ - -- if (dev->change_rx_flags && (dev->flags ^ flags) & IFF_MULTICAST) -+ if (dev->change_rx_flags && (old_flags ^ flags) & IFF_MULTICAST) - dev->change_rx_flags(dev, IFF_MULTICAST); - - dev_set_rx_mode(dev); -diff --git a/net/core/pktgen.c b/net/core/pktgen.c -index 8dca211..fdf5377 100644 ---- a/net/core/pktgen.c -+++ b/net/core/pktgen.c -@@ -390,6 +390,7 @@ struct pktgen_thread { - int cpu; - - wait_queue_head_t queue; -+ struct completion start_done; - }; - - #define REMOVE 1 -@@ -3414,6 +3415,7 @@ static int pktgen_thread_worker(void *arg) - BUG_ON(smp_processor_id() != cpu); - - init_waitqueue_head(&t->queue); -+ complete(&t->start_done); - - pr_debug("pktgen: starting pktgen/%d: pid=%d\n", cpu, task_pid_nr(current)); - -@@ -3615,6 +3617,7 @@ static int __init pktgen_create_thread(int cpu) - INIT_LIST_HEAD(&t->if_list); - - list_add_tail(&t->th_list, &pktgen_threads); -+ init_completion(&t->start_done); - - p = kthread_create(pktgen_thread_worker, t, "kpktgend_%d", cpu); - if (IS_ERR(p)) { -@@ -3639,6 +3642,7 @@ static int __init pktgen_create_thread(int cpu) - } - - wake_up_process(p); -+ wait_for_completion(&t->start_done); - - return 0; - } -diff --git a/net/ipv4/arp.c b/net/ipv4/arp.c -index 418862f..9b539fa 100644 ---- a/net/ipv4/arp.c -+++ b/net/ipv4/arp.c -@@ -1288,7 +1288,6 @@ static void arp_format_neigh_entry(struct seq_file *seq, - struct neighbour *n) - { - char hbuffer[HBUFFERLEN]; -- const char hexbuf[] = "0123456789ABCDEF"; - int k, j; - char tbuf[16]; - struct net_device *dev = n->dev; -@@ -1302,8 +1301,8 @@ static void arp_format_neigh_entry(struct seq_file *seq, - else { - #endif - for (k = 0, j = 0; k < HBUFFERLEN - 3 && j < dev->addr_len; j++) { -- hbuffer[k++] = hexbuf[(n->ha[j] >> 4) & 15]; -- hbuffer[k++] = hexbuf[n->ha[j] & 15]; -+ hbuffer[k++] = hex_asc_hi(n->ha[j]); -+ hbuffer[k++] = hex_asc_lo(n->ha[j]); - hbuffer[k++] = ':'; - } - hbuffer[--k] = 0; -diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c -index 2ada033..4342cba 100644 ---- a/net/ipv4/ip_gre.c -+++ b/net/ipv4/ip_gre.c -@@ -313,9 +313,8 @@ static void ipgre_tunnel_uninit(struct net_device *dev) - - static void ipgre_err(struct sk_buff *skb, u32 info) - { --#ifndef I_WISH_WORLD_WERE_PERFECT - --/* It is not :-( All the routers (except for Linux) return only -+/* All the routers (except for Linux) return only - 8 bytes of packet payload. It means, that precise relaying of - ICMP in the real Internet is absolutely infeasible. - -@@ -398,149 +397,6 @@ static void ipgre_err(struct sk_buff *skb, u32 info) - out: - read_unlock(&ipgre_lock); - return; --#else -- struct iphdr *iph = (struct iphdr*)dp; -- struct iphdr *eiph; -- __be16 *p = (__be16*)(dp+(iph->ihl<<2)); -- const int type = icmp_hdr(skb)->type; -- const int code = icmp_hdr(skb)->code; -- int rel_type = 0; -- int rel_code = 0; -- __be32 rel_info = 0; -- __u32 n = 0; -- __be16 flags; -- int grehlen = (iph->ihl<<2) + 4; -- struct sk_buff *skb2; -- struct flowi fl; -- struct rtable *rt; -- -- if (p[1] != htons(ETH_P_IP)) -- return; -- -- flags = p[0]; -- if (flags&(GRE_CSUM|GRE_KEY|GRE_SEQ|GRE_ROUTING|GRE_VERSION)) { -- if (flags&(GRE_VERSION|GRE_ROUTING)) -- return; -- if (flags&GRE_CSUM) -- grehlen += 4; -- if (flags&GRE_KEY) -- grehlen += 4; -- if (flags&GRE_SEQ) -- grehlen += 4; -- } -- if (len < grehlen + sizeof(struct iphdr)) -- return; -- eiph = (struct iphdr*)(dp + grehlen); -- -- switch (type) { -- default: -- return; -- case ICMP_PARAMETERPROB: -- n = ntohl(icmp_hdr(skb)->un.gateway) >> 24; -- if (n < (iph->ihl<<2)) -- return; -- -- /* So... This guy found something strange INSIDE encapsulated -- packet. Well, he is fool, but what can we do ? -- */ -- rel_type = ICMP_PARAMETERPROB; -- n -= grehlen; -- rel_info = htonl(n << 24); -- break; -- -- case ICMP_DEST_UNREACH: -- switch (code) { -- case ICMP_SR_FAILED: -- case ICMP_PORT_UNREACH: -- /* Impossible event. */ -- return; -- case ICMP_FRAG_NEEDED: -- /* And it is the only really necessary thing :-) */ -- n = ntohs(icmp_hdr(skb)->un.frag.mtu); -- if (n < grehlen+68) -- return; -- n -= grehlen; -- /* BSD 4.2 MORE DOES NOT EXIST IN NATURE. */ -- if (n > ntohs(eiph->tot_len)) -- return; -- rel_info = htonl(n); -- break; -- default: -- /* All others are translated to HOST_UNREACH. -- rfc2003 contains "deep thoughts" about NET_UNREACH, -- I believe, it is just ether pollution. --ANK -- */ -- rel_type = ICMP_DEST_UNREACH; -- rel_code = ICMP_HOST_UNREACH; -- break; -- } -- break; -- case ICMP_TIME_EXCEEDED: -- if (code != ICMP_EXC_TTL) -- return; -- break; -- } -- -- /* Prepare fake skb to feed it to icmp_send */ -- skb2 = skb_clone(skb, GFP_ATOMIC); -- if (skb2 == NULL) -- return; -- dst_release(skb2->dst); -- skb2->dst = NULL; -- skb_pull(skb2, skb->data - (u8*)eiph); -- skb_reset_network_header(skb2); -- -- /* Try to guess incoming interface */ -- memset(&fl, 0, sizeof(fl)); -- fl.fl4_dst = eiph->saddr; -- fl.fl4_tos = RT_TOS(eiph->tos); -- fl.proto = IPPROTO_GRE; -- if (ip_route_output_key(dev_net(skb->dev), &rt, &fl)) { -- kfree_skb(skb2); -- return; -- } -- skb2->dev = rt->u.dst.dev; -- -- /* route "incoming" packet */ -- if (rt->rt_flags&RTCF_LOCAL) { -- ip_rt_put(rt); -- rt = NULL; -- fl.fl4_dst = eiph->daddr; -- fl.fl4_src = eiph->saddr; -- fl.fl4_tos = eiph->tos; -- if (ip_route_output_key(dev_net(skb->dev), &rt, &fl) || -- rt->u.dst.dev->type != ARPHRD_IPGRE) { -- ip_rt_put(rt); -- kfree_skb(skb2); -- return; -- } -- } else { -- ip_rt_put(rt); -- if (ip_route_input(skb2, eiph->daddr, eiph->saddr, eiph->tos, skb2->dev) || -- skb2->dst->dev->type != ARPHRD_IPGRE) { -- kfree_skb(skb2); -- return; -- } -- } -- -- /* change mtu on this route */ -- if (type == ICMP_DEST_UNREACH && code == ICMP_FRAG_NEEDED) { -- if (n > dst_mtu(skb2->dst)) { -- kfree_skb(skb2); -- return; -- } -- skb2->dst->ops->update_pmtu(skb2->dst, n); -- } else if (type == ICMP_TIME_EXCEEDED) { -- struct ip_tunnel *t = netdev_priv(skb2->dev); -- if (t->parms.iph.ttl) { -- rel_type = ICMP_DEST_UNREACH; -- rel_code = ICMP_HOST_UNREACH; -- } -- } -- -- icmp_send(skb2, rel_type, rel_code, rel_info); -- kfree_skb(skb2); --#endif - } - - static inline void ipgre_ecn_decapsulate(struct iphdr *iph, struct sk_buff *skb) -diff --git a/net/ipv4/ipip.c b/net/ipv4/ipip.c -index 149111f..af5cb53 100644 ---- a/net/ipv4/ipip.c -+++ b/net/ipv4/ipip.c -@@ -278,9 +278,8 @@ static void ipip_tunnel_uninit(struct net_device *dev) - - static int ipip_err(struct sk_buff *skb, u32 info) - { --#ifndef I_WISH_WORLD_WERE_PERFECT - --/* It is not :-( All the routers (except for Linux) return only -+/* All the routers (except for Linux) return only - 8 bytes of packet payload. It means, that precise relaying of - ICMP in the real Internet is absolutely infeasible. - */ -@@ -337,133 +336,6 @@ static int ipip_err(struct sk_buff *skb, u32 info) - out: - read_unlock(&ipip_lock); - return err; --#else -- struct iphdr *iph = (struct iphdr*)dp; -- int hlen = iph->ihl<<2; -- struct iphdr *eiph; -- const int type = icmp_hdr(skb)->type; -- const int code = icmp_hdr(skb)->code; -- int rel_type = 0; -- int rel_code = 0; -- __be32 rel_info = 0; -- __u32 n = 0; -- struct sk_buff *skb2; -- struct flowi fl; -- struct rtable *rt; -- -- if (len < hlen + sizeof(struct iphdr)) -- return 0; -- eiph = (struct iphdr*)(dp + hlen); -- -- switch (type) { -- default: -- return 0; -- case ICMP_PARAMETERPROB: -- n = ntohl(icmp_hdr(skb)->un.gateway) >> 24; -- if (n < hlen) -- return 0; -- -- /* So... This guy found something strange INSIDE encapsulated -- packet. Well, he is fool, but what can we do ? -- */ -- rel_type = ICMP_PARAMETERPROB; -- rel_info = htonl((n - hlen) << 24); -- break; -- -- case ICMP_DEST_UNREACH: -- switch (code) { -- case ICMP_SR_FAILED: -- case ICMP_PORT_UNREACH: -- /* Impossible event. */ -- return 0; -- case ICMP_FRAG_NEEDED: -- /* And it is the only really necessary thing :-) */ -- n = ntohs(icmp_hdr(skb)->un.frag.mtu); -- if (n < hlen+68) -- return 0; -- n -= hlen; -- /* BSD 4.2 MORE DOES NOT EXIST IN NATURE. */ -- if (n > ntohs(eiph->tot_len)) -- return 0; -- rel_info = htonl(n); -- break; -- default: -- /* All others are translated to HOST_UNREACH. -- rfc2003 contains "deep thoughts" about NET_UNREACH, -- I believe, it is just ether pollution. --ANK -- */ -- rel_type = ICMP_DEST_UNREACH; -- rel_code = ICMP_HOST_UNREACH; -- break; -- } -- break; -- case ICMP_TIME_EXCEEDED: -- if (code != ICMP_EXC_TTL) -- return 0; -- break; -- } -- -- /* Prepare fake skb to feed it to icmp_send */ -- skb2 = skb_clone(skb, GFP_ATOMIC); -- if (skb2 == NULL) -- return 0; -- dst_release(skb2->dst); -- skb2->dst = NULL; -- skb_pull(skb2, skb->data - (u8*)eiph); -- skb_reset_network_header(skb2); -- -- /* Try to guess incoming interface */ -- memset(&fl, 0, sizeof(fl)); -- fl.fl4_daddr = eiph->saddr; -- fl.fl4_tos = RT_TOS(eiph->tos); -- fl.proto = IPPROTO_IPIP; -- if (ip_route_output_key(dev_net(skb->dev), &rt, &key)) { -- kfree_skb(skb2); -- return 0; -- } -- skb2->dev = rt->u.dst.dev; -- -- /* route "incoming" packet */ -- if (rt->rt_flags&RTCF_LOCAL) { -- ip_rt_put(rt); -- rt = NULL; -- fl.fl4_daddr = eiph->daddr; -- fl.fl4_src = eiph->saddr; -- fl.fl4_tos = eiph->tos; -- if (ip_route_output_key(dev_net(skb->dev), &rt, &fl) || -- rt->u.dst.dev->type != ARPHRD_TUNNEL) { -- ip_rt_put(rt); -- kfree_skb(skb2); -- return 0; -- } -- } else { -- ip_rt_put(rt); -- if (ip_route_input(skb2, eiph->daddr, eiph->saddr, eiph->tos, skb2->dev) || -- skb2->dst->dev->type != ARPHRD_TUNNEL) { -- kfree_skb(skb2); -- return 0; -- } -- } -- -- /* change mtu on this route */ -- if (type == ICMP_DEST_UNREACH && code == ICMP_FRAG_NEEDED) { -- if (n > dst_mtu(skb2->dst)) { -- kfree_skb(skb2); -- return 0; -- } -- skb2->dst->ops->update_pmtu(skb2->dst, n); -- } else if (type == ICMP_TIME_EXCEEDED) { -- struct ip_tunnel *t = netdev_priv(skb2->dev); -- if (t->parms.iph.ttl) { -- rel_type = ICMP_DEST_UNREACH; -- rel_code = ICMP_HOST_UNREACH; -- } -- } -- -- icmp_send(skb2, rel_type, rel_code, rel_info); -- kfree_skb(skb2); -- return 0; --#endif - } - - static inline void ipip_ecn_decapsulate(const struct iphdr *outer_iph, -diff --git a/net/ipv4/route.c b/net/ipv4/route.c -index 92f90ae..df41026 100644 ---- a/net/ipv4/route.c -+++ b/net/ipv4/route.c -@@ -160,7 +160,7 @@ static struct dst_ops ipv4_dst_ops = { - .negative_advice = ipv4_negative_advice, - .link_failure = ipv4_link_failure, - .update_pmtu = ip_rt_update_pmtu, -- .local_out = ip_local_out, -+ .local_out = __ip_local_out, - .entry_size = sizeof(struct rtable), - .entries = ATOMIC_INIT(0), - }; -diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c -index debf235..e399bde 100644 ---- a/net/ipv4/tcp_output.c -+++ b/net/ipv4/tcp_output.c -@@ -1836,7 +1836,7 @@ int tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb) - { - struct tcp_sock *tp = tcp_sk(sk); - struct inet_connection_sock *icsk = inet_csk(sk); -- unsigned int cur_mss = tcp_current_mss(sk, 0); -+ unsigned int cur_mss; - int err; - - /* Inconslusive MTU probe */ -@@ -1858,6 +1858,11 @@ int tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb) - return -ENOMEM; - } - -+ if (inet_csk(sk)->icsk_af_ops->rebuild_header(sk)) -+ return -EHOSTUNREACH; /* Routing failure or similar. */ -+ -+ cur_mss = tcp_current_mss(sk, 0); -+ - /* If receiver has shrunk his window, and skb is out of - * new window, do not retransmit it. The exception is the - * case, when window is shrunk to zero. In this case -@@ -1884,9 +1889,6 @@ int tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb) - (sysctl_tcp_retrans_collapse != 0)) - tcp_retrans_try_collapse(sk, skb, cur_mss); - -- if (inet_csk(sk)->icsk_af_ops->rebuild_header(sk)) -- return -EHOSTUNREACH; /* Routing failure or similar. */ -- - /* Some Solaris stacks overoptimize and ignore the FIN on a - * retransmit when old data is attached. So strip it off - * since it is cheap to do so and saves bytes on the network. -diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c -index e591e09..3a83557 100644 ---- a/net/ipv6/addrconf.c -+++ b/net/ipv6/addrconf.c -@@ -1764,14 +1764,16 @@ void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len) - * 2) Configure prefixes with the auto flag set - */ - -- /* Avoid arithmetic overflow. Really, we could -- save rt_expires in seconds, likely valid_lft, -- but it would require division in fib gc, that it -- not good. -- */ -- if (valid_lft >= 0x7FFFFFFF/HZ) -+ if (valid_lft == INFINITY_LIFE_TIME) -+ rt_expires = ~0UL; -+ else if (valid_lft >= 0x7FFFFFFF/HZ) { -+ /* Avoid arithmetic overflow. Really, we could -+ * save rt_expires in seconds, likely valid_lft, -+ * but it would require division in fib gc, that it -+ * not good. -+ */ - rt_expires = 0x7FFFFFFF - (0x7FFFFFFF % HZ); -- else -+ } else - rt_expires = valid_lft * HZ; - - /* -@@ -1779,7 +1781,7 @@ void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len) - * Avoid arithmetic overflow there as well. - * Overflow can happen only if HZ < USER_HZ. - */ -- if (HZ < USER_HZ && rt_expires > 0x7FFFFFFF / USER_HZ) -+ if (HZ < USER_HZ && ~rt_expires && rt_expires > 0x7FFFFFFF / USER_HZ) - rt_expires = 0x7FFFFFFF / USER_HZ; - - if (pinfo->onlink) { -@@ -1788,17 +1790,28 @@ void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len) - dev->ifindex, 1); - - if (rt && ((rt->rt6i_flags & (RTF_GATEWAY | RTF_DEFAULT)) == 0)) { -- if (rt->rt6i_flags&RTF_EXPIRES) { -- if (valid_lft == 0) { -- ip6_del_rt(rt); -- rt = NULL; -- } else { -- rt->rt6i_expires = jiffies + rt_expires; -- } -+ /* Autoconf prefix route */ -+ if (valid_lft == 0) { -+ ip6_del_rt(rt); -+ rt = NULL; -+ } else if (~rt_expires) { -+ /* not infinity */ -+ rt->rt6i_expires = jiffies + rt_expires; -+ rt->rt6i_flags |= RTF_EXPIRES; -+ } else { -+ rt->rt6i_flags &= ~RTF_EXPIRES; -+ rt->rt6i_expires = 0; - } - } else if (valid_lft) { -+ int flags = RTF_ADDRCONF | RTF_PREFIX_RT; -+ clock_t expires = 0; -+ if (~rt_expires) { -+ /* not infinity */ -+ flags |= RTF_EXPIRES; -+ expires = jiffies_to_clock_t(rt_expires); -+ } - addrconf_prefix_route(&pinfo->prefix, pinfo->prefix_len, -- dev, jiffies_to_clock_t(rt_expires), RTF_ADDRCONF|RTF_EXPIRES|RTF_PREFIX_RT); -+ dev, expires, flags); - } - if (rt) - dst_release(&rt->u.dst); -@@ -2021,7 +2034,8 @@ static int inet6_addr_add(struct net *net, int ifindex, struct in6_addr *pfx, - struct inet6_dev *idev; - struct net_device *dev; - int scope; -- u32 flags = RTF_EXPIRES; -+ u32 flags; -+ clock_t expires; - - ASSERT_RTNL(); - -@@ -2041,8 +2055,13 @@ static int inet6_addr_add(struct net *net, int ifindex, struct in6_addr *pfx, - if (valid_lft == INFINITY_LIFE_TIME) { - ifa_flags |= IFA_F_PERMANENT; - flags = 0; -- } else if (valid_lft >= 0x7FFFFFFF/HZ) -- valid_lft = 0x7FFFFFFF/HZ; -+ expires = 0; -+ } else { -+ if (valid_lft >= 0x7FFFFFFF/HZ) -+ valid_lft = 0x7FFFFFFF/HZ; -+ flags = RTF_EXPIRES; -+ expires = jiffies_to_clock_t(valid_lft * HZ); -+ } - - if (prefered_lft == 0) - ifa_flags |= IFA_F_DEPRECATED; -@@ -2060,7 +2079,7 @@ static int inet6_addr_add(struct net *net, int ifindex, struct in6_addr *pfx, - spin_unlock_bh(&ifp->lock); - - addrconf_prefix_route(&ifp->addr, ifp->prefix_len, dev, -- jiffies_to_clock_t(valid_lft * HZ), flags); -+ expires, flags); - /* - * Note that section 3.1 of RFC 4429 indicates - * that the Optimistic flag should not be set for -@@ -3148,7 +3167,8 @@ inet6_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) - static int inet6_addr_modify(struct inet6_ifaddr *ifp, u8 ifa_flags, - u32 prefered_lft, u32 valid_lft) - { -- u32 flags = RTF_EXPIRES; -+ u32 flags; -+ clock_t expires; - - if (!valid_lft || (prefered_lft > valid_lft)) - return -EINVAL; -@@ -3156,8 +3176,13 @@ static int inet6_addr_modify(struct inet6_ifaddr *ifp, u8 ifa_flags, - if (valid_lft == INFINITY_LIFE_TIME) { - ifa_flags |= IFA_F_PERMANENT; - flags = 0; -- } else if (valid_lft >= 0x7FFFFFFF/HZ) -- valid_lft = 0x7FFFFFFF/HZ; -+ expires = 0; -+ } else { -+ if (valid_lft >= 0x7FFFFFFF/HZ) -+ valid_lft = 0x7FFFFFFF/HZ; -+ flags = RTF_EXPIRES; -+ expires = jiffies_to_clock_t(valid_lft * HZ); -+ } - - if (prefered_lft == 0) - ifa_flags |= IFA_F_DEPRECATED; -@@ -3176,7 +3201,7 @@ static int inet6_addr_modify(struct inet6_ifaddr *ifp, u8 ifa_flags, - ipv6_ifa_notify(0, ifp); - - addrconf_prefix_route(&ifp->addr, ifp->prefix_len, ifp->idev->dev, -- jiffies_to_clock_t(valid_lft * HZ), flags); -+ expires, flags); - addrconf_verify(0); - - return 0; -@@ -4242,7 +4267,7 @@ static void addrconf_sysctl_register(struct inet6_dev *idev) - neigh_sysctl_register(idev->dev, idev->nd_parms, NET_IPV6, - NET_IPV6_NEIGH, "ipv6", - &ndisc_ifinfo_sysctl_change, -- NULL); -+ ndisc_ifinfo_sysctl_strategy); - __addrconf_sysctl_register(dev_net(idev->dev), idev->dev->name, - idev->dev->ifindex, idev, &idev->cnf); - } -diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c -index a55fc05..282fdb3 100644 ---- a/net/ipv6/ndisc.c -+++ b/net/ipv6/ndisc.c -@@ -1727,10 +1727,10 @@ int ndisc_ifinfo_sysctl_change(struct ctl_table *ctl, int write, struct file * f - return ret; - } - --static int ndisc_ifinfo_sysctl_strategy(ctl_table *ctl, int __user *name, -- int nlen, void __user *oldval, -- size_t __user *oldlenp, -- void __user *newval, size_t newlen) -+int ndisc_ifinfo_sysctl_strategy(ctl_table *ctl, int __user *name, -+ int nlen, void __user *oldval, -+ size_t __user *oldlenp, -+ void __user *newval, size_t newlen) - { - struct net_device *dev = ctl->extra1; - struct inet6_dev *idev; -diff --git a/net/ipv6/route.c b/net/ipv6/route.c -index 12bba08..48534c6 100644 ---- a/net/ipv6/route.c -+++ b/net/ipv6/route.c -@@ -109,7 +109,7 @@ static struct dst_ops ip6_dst_ops_template = { - .negative_advice = ip6_negative_advice, - .link_failure = ip6_link_failure, - .update_pmtu = ip6_rt_update_pmtu, -- .local_out = ip6_local_out, -+ .local_out = __ip6_local_out, - .entry_size = sizeof(struct rt6_info), - .entries = ATOMIC_INIT(0), - }; -@@ -475,7 +475,7 @@ int rt6_route_rcv(struct net_device *dev, u8 *opt, int len, - lifetime = ntohl(rinfo->lifetime); - if (lifetime == 0xffffffff) { - /* infinity */ -- } else if (lifetime > 0x7fffffff/HZ) { -+ } else if (lifetime > 0x7fffffff/HZ - 1) { - /* Avoid arithmetic overflow */ - lifetime = 0x7fffffff/HZ - 1; - } -@@ -1106,7 +1106,9 @@ int ip6_route_add(struct fib6_config *cfg) - } - - rt->u.dst.obsolete = -1; -- rt->rt6i_expires = jiffies + clock_t_to_jiffies(cfg->fc_expires); -+ rt->rt6i_expires = (cfg->fc_flags & RTF_EXPIRES) ? -+ jiffies + clock_t_to_jiffies(cfg->fc_expires) : -+ 0; - - if (cfg->fc_protocol == RTPROT_UNSPEC) - cfg->fc_protocol = RTPROT_BOOT; -@@ -2200,7 +2202,9 @@ static int rt6_fill_node(struct sk_buff *skb, struct rt6_info *rt, - - NLA_PUT_U32(skb, RTA_PRIORITY, rt->rt6i_metric); - -- expires = rt->rt6i_expires ? rt->rt6i_expires - jiffies : 0; -+ expires = (rt->rt6i_flags & RTF_EXPIRES) ? -+ rt->rt6i_expires - jiffies : 0; -+ - if (rtnl_put_cacheinfo(skb, &rt->u.dst, 0, 0, 0, - expires, rt->u.dst.error) < 0) - goto nla_put_failure; -diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c -index 5a6fab9..3de6ffd 100644 ---- a/net/ipv6/sit.c -+++ b/net/ipv6/sit.c -@@ -403,9 +403,8 @@ static void ipip6_tunnel_uninit(struct net_device *dev) - - static int ipip6_err(struct sk_buff *skb, u32 info) - { --#ifndef I_WISH_WORLD_WERE_PERFECT - --/* It is not :-( All the routers (except for Linux) return only -+/* All the routers (except for Linux) return only - 8 bytes of packet payload. It means, that precise relaying of - ICMP in the real Internet is absolutely infeasible. - */ -@@ -462,92 +461,6 @@ static int ipip6_err(struct sk_buff *skb, u32 info) - out: - read_unlock(&ipip6_lock); - return err; --#else -- struct iphdr *iph = (struct iphdr*)dp; -- int hlen = iph->ihl<<2; -- struct ipv6hdr *iph6; -- const int type = icmp_hdr(skb)->type; -- const int code = icmp_hdr(skb)->code; -- int rel_type = 0; -- int rel_code = 0; -- int rel_info = 0; -- struct sk_buff *skb2; -- struct rt6_info *rt6i; -- -- if (len < hlen + sizeof(struct ipv6hdr)) -- return; -- iph6 = (struct ipv6hdr*)(dp + hlen); -- -- switch (type) { -- default: -- return; -- case ICMP_PARAMETERPROB: -- if (icmp_hdr(skb)->un.gateway < hlen) -- return; -- -- /* So... This guy found something strange INSIDE encapsulated -- packet. Well, he is fool, but what can we do ? -- */ -- rel_type = ICMPV6_PARAMPROB; -- rel_info = icmp_hdr(skb)->un.gateway - hlen; -- break; -- -- case ICMP_DEST_UNREACH: -- switch (code) { -- case ICMP_SR_FAILED: -- case ICMP_PORT_UNREACH: -- /* Impossible event. */ -- return; -- case ICMP_FRAG_NEEDED: -- /* Too complicated case ... */ -- return; -- default: -- /* All others are translated to HOST_UNREACH. -- rfc2003 contains "deep thoughts" about NET_UNREACH, -- I believe, it is just ether pollution. --ANK -- */ -- rel_type = ICMPV6_DEST_UNREACH; -- rel_code = ICMPV6_ADDR_UNREACH; -- break; -- } -- break; -- case ICMP_TIME_EXCEEDED: -- if (code != ICMP_EXC_TTL) -- return; -- rel_type = ICMPV6_TIME_EXCEED; -- rel_code = ICMPV6_EXC_HOPLIMIT; -- break; -- } -- -- /* Prepare fake skb to feed it to icmpv6_send */ -- skb2 = skb_clone(skb, GFP_ATOMIC); -- if (skb2 == NULL) -- return 0; -- dst_release(skb2->dst); -- skb2->dst = NULL; -- skb_pull(skb2, skb->data - (u8*)iph6); -- skb_reset_network_header(skb2); -- -- /* Try to guess incoming interface */ -- rt6i = rt6_lookup(dev_net(skb->dev), &iph6->saddr, NULL, NULL, 0); -- if (rt6i && rt6i->rt6i_dev) { -- skb2->dev = rt6i->rt6i_dev; -- -- rt6i = rt6_lookup(dev_net(skb->dev), -- &iph6->daddr, &iph6->saddr, NULL, 0); -- -- if (rt6i && rt6i->rt6i_dev && rt6i->rt6i_dev->type == ARPHRD_SIT) { -- struct ip_tunnel *t = netdev_priv(rt6i->rt6i_dev); -- if (rel_type == ICMPV6_TIME_EXCEED && t->parms.iph.ttl) { -- rel_type = ICMPV6_DEST_UNREACH; -- rel_code = ICMPV6_ADDR_UNREACH; -- } -- icmpv6_send(skb2, rel_type, rel_code, rel_info, skb2->dev); -- } -- } -- kfree_skb(skb2); -- return 0; --#endif - } - - static inline void ipip6_ecn_decapsulate(struct iphdr *iph, struct sk_buff *skb) -diff --git a/net/key/af_key.c b/net/key/af_key.c -index 9e7236f..9bba7ac 100644 ---- a/net/key/af_key.c -+++ b/net/key/af_key.c -@@ -1251,7 +1251,7 @@ static struct xfrm_state * pfkey_msg2xfrm_state(struct sadb_msg *hdr, - x->sel.prefixlen_s = addr->sadb_address_prefixlen; - } - -- if (x->props.mode == XFRM_MODE_TRANSPORT) -+ if (!x->sel.family) - x->sel.family = x->props.family; - - if (ext_hdrs[SADB_X_EXT_NAT_T_TYPE-1]) { -diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c -index 4adba09..7cfd12e 100644 ---- a/net/mac80211/mlme.c -+++ b/net/mac80211/mlme.c -@@ -730,7 +730,17 @@ static void ieee80211_send_assoc(struct net_device *dev, - if (bss->wmm_ie) { - wmm = 1; - } -+ -+ /* get all rates supported by the device and the AP as -+ * some APs don't like getting a superset of their rates -+ * in the association request (e.g. D-Link DAP 1353 in -+ * b-only mode) */ -+ rates_len = ieee80211_compatible_rates(bss, sband, &rates); -+ - ieee80211_rx_bss_put(dev, bss); -+ } else { -+ rates = ~0; -+ rates_len = sband->n_bitrates; - } - - mgmt = (struct ieee80211_mgmt *) skb_put(skb, 24); -@@ -761,10 +771,7 @@ static void ieee80211_send_assoc(struct net_device *dev, - *pos++ = ifsta->ssid_len; - memcpy(pos, ifsta->ssid, ifsta->ssid_len); - -- /* all supported rates should be added here but some APs -- * (e.g. D-Link DAP 1353 in b-only mode) don't like that -- * Therefore only add rates the AP supports */ -- rates_len = ieee80211_compatible_rates(bss, sband, &rates); -+ /* add all rates which were marked to be used above */ - supp_rates_len = rates_len; - if (supp_rates_len > 8) - supp_rates_len = 8; -@@ -3446,21 +3453,17 @@ static int ieee80211_sta_config_auth(struct net_device *dev, - struct ieee80211_sta_bss *bss, *selected = NULL; - int top_rssi = 0, freq; - -- if (!(ifsta->flags & (IEEE80211_STA_AUTO_SSID_SEL | -- IEEE80211_STA_AUTO_BSSID_SEL | IEEE80211_STA_AUTO_CHANNEL_SEL))) { -- ifsta->state = IEEE80211_AUTHENTICATE; -- ieee80211_sta_reset_auth(dev, ifsta); -- return 0; -- } -- - spin_lock_bh(&local->sta_bss_lock); - freq = local->oper_channel->center_freq; - list_for_each_entry(bss, &local->sta_bss_list, list) { - if (!(bss->capability & WLAN_CAPABILITY_ESS)) - continue; - -- if (!!(bss->capability & WLAN_CAPABILITY_PRIVACY) ^ -- !!sdata->default_key) -+ if ((ifsta->flags & (IEEE80211_STA_AUTO_SSID_SEL | -+ IEEE80211_STA_AUTO_BSSID_SEL | -+ IEEE80211_STA_AUTO_CHANNEL_SEL)) && -+ (!!(bss->capability & WLAN_CAPABILITY_PRIVACY) ^ -+ !!sdata->default_key)) - continue; - - if (!(ifsta->flags & IEEE80211_STA_AUTO_CHANNEL_SEL) && -diff --git a/net/mac80211/util.c b/net/mac80211/util.c -index 24a465c..131e9e6 100644 ---- a/net/mac80211/util.c -+++ b/net/mac80211/util.c -@@ -389,6 +389,41 @@ void ieee80211_iterate_active_interfaces( - struct ieee80211_local *local = hw_to_local(hw); - struct ieee80211_sub_if_data *sdata; - -+ rtnl_lock(); -+ -+ list_for_each_entry(sdata, &local->interfaces, list) { -+ switch (sdata->vif.type) { -+ case IEEE80211_IF_TYPE_INVALID: -+ case IEEE80211_IF_TYPE_MNTR: -+ case IEEE80211_IF_TYPE_VLAN: -+ continue; -+ case IEEE80211_IF_TYPE_AP: -+ case IEEE80211_IF_TYPE_STA: -+ case IEEE80211_IF_TYPE_IBSS: -+ case IEEE80211_IF_TYPE_WDS: -+ case IEEE80211_IF_TYPE_MESH_POINT: -+ break; -+ } -+ if (sdata->dev == local->mdev) -+ continue; -+ if (netif_running(sdata->dev)) -+ iterator(data, sdata->dev->dev_addr, -+ &sdata->vif); -+ } -+ -+ rtnl_unlock(); -+} -+EXPORT_SYMBOL_GPL(ieee80211_iterate_active_interfaces); -+ -+void ieee80211_iterate_active_interfaces_atomic( -+ struct ieee80211_hw *hw, -+ void (*iterator)(void *data, u8 *mac, -+ struct ieee80211_vif *vif), -+ void *data) -+{ -+ struct ieee80211_local *local = hw_to_local(hw); -+ struct ieee80211_sub_if_data *sdata; -+ - rcu_read_lock(); - - list_for_each_entry_rcu(sdata, &local->interfaces, list) { -@@ -413,4 +448,4 @@ void ieee80211_iterate_active_interfaces( - - rcu_read_unlock(); - } --EXPORT_SYMBOL_GPL(ieee80211_iterate_active_interfaces); -+EXPORT_SYMBOL_GPL(ieee80211_iterate_active_interfaces_atomic); -diff --git a/net/mac80211/wext.c b/net/mac80211/wext.c -index 76e1de1..457ebf9 100644 ---- a/net/mac80211/wext.c -+++ b/net/mac80211/wext.c -@@ -209,7 +209,6 @@ static int ieee80211_ioctl_giwrange(struct net_device *dev, - range->num_frequency = c; - - IW_EVENT_CAPA_SET_KERNEL(range->event_capa); -- IW_EVENT_CAPA_SET(range->event_capa, SIOCGIWTHRSPY); - IW_EVENT_CAPA_SET(range->event_capa, SIOCGIWAP); - IW_EVENT_CAPA_SET(range->event_capa, SIOCGIWSCAN); - -diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c -index 1086df7..9360fc8 100644 ---- a/net/sched/cls_api.c -+++ b/net/sched/cls_api.c -@@ -220,7 +220,7 @@ replay: - tp = kzalloc(sizeof(*tp), GFP_KERNEL); - if (tp == NULL) - goto errout; -- err = -EINVAL; -+ err = -ENOENT; - tp_ops = tcf_proto_lookup_ops(tca[TCA_KIND]); - if (tp_ops == NULL) { - #ifdef CONFIG_KMOD -diff --git a/net/sunrpc/auth_generic.c b/net/sunrpc/auth_generic.c -index d927d9f..744b79f 100644 ---- a/net/sunrpc/auth_generic.c -+++ b/net/sunrpc/auth_generic.c -@@ -17,8 +17,8 @@ - # define RPCDBG_FACILITY RPCDBG_AUTH - #endif - --#define RPC_ANONYMOUS_USERID ((uid_t)-2) --#define RPC_ANONYMOUS_GROUPID ((gid_t)-2) -+#define RPC_MACHINE_CRED_USERID ((uid_t)0) -+#define RPC_MACHINE_CRED_GROUPID ((gid_t)0) - - struct generic_cred { - struct rpc_cred gc_base; -@@ -44,8 +44,8 @@ EXPORT_SYMBOL_GPL(rpc_lookup_cred); - struct rpc_cred *rpc_lookup_machine_cred(void) - { - struct auth_cred acred = { -- .uid = RPC_ANONYMOUS_USERID, -- .gid = RPC_ANONYMOUS_GROUPID, -+ .uid = RPC_MACHINE_CRED_USERID, -+ .gid = RPC_MACHINE_CRED_GROUPID, - .machine_cred = 1, - }; - -diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c -index d8e8d79..e46c825 100644 ---- a/net/sunrpc/svc_xprt.c -+++ b/net/sunrpc/svc_xprt.c -@@ -6,30 +6,9 @@ - - #include - #include --#include --#include --#include --#include --#include --#include --#include --#include --#include --#include --#include - #include - #include - #include --#include --#include --#include --#include --#include --#include -- --#include --#include --#include - #include - #include - -@@ -296,8 +275,6 @@ void svc_xprt_enqueue(struct svc_xprt *xprt) - if (!(xprt->xpt_flags & - ((1<xpt_flags)) -- return; - - cpu = get_cpu(); - pool = svc_pool_for_cpu(xprt->xpt_server, cpu); -diff --git a/net/sunrpc/svcauth_unix.c b/net/sunrpc/svcauth_unix.c -index 3f30ee6..f24800f 100644 ---- a/net/sunrpc/svcauth_unix.c -+++ b/net/sunrpc/svcauth_unix.c -@@ -278,7 +278,7 @@ static int ip_map_show(struct seq_file *m, - dom = im->m_client->h.name; - - if (ipv6_addr_v4mapped(&addr)) { -- seq_printf(m, "%s" NIPQUAD_FMT "%s\n", -+ seq_printf(m, "%s " NIPQUAD_FMT " %s\n", - im->m_class, - ntohl(addr.s6_addr32[3]) >> 24 & 0xff, - ntohl(addr.s6_addr32[3]) >> 16 & 0xff, -@@ -286,7 +286,7 @@ static int ip_map_show(struct seq_file *m, - ntohl(addr.s6_addr32[3]) >> 0 & 0xff, - dom); - } else { -- seq_printf(m, "%s" NIP6_FMT "%s\n", -+ seq_printf(m, "%s " NIP6_FMT " %s\n", - im->m_class, NIP6(addr), dom); - } - return 0; -diff --git a/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c b/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c -index c22d6b6..06ab484 100644 ---- a/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c -+++ b/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c -@@ -260,11 +260,16 @@ static int rdma_read_max_sge(struct svcxprt_rdma *xprt, int sge_count) - * On our side, we need to read into a pagelist. The first page immediately - * follows the RPC header. - * -- * This function returns 1 to indicate success. The data is not yet in -+ * This function returns: -+ * 0 - No error and no read-list found. -+ * -+ * 1 - Successful read-list processing. The data is not yet in - * the pagelist and therefore the RPC request must be deferred. The - * I/O completion will enqueue the transport again and - * svc_rdma_recvfrom will complete the request. - * -+ * <0 - Error processing/posting read-list. -+ * - * NOTE: The ctxt must not be touched after the last WR has been posted - * because the I/O completion processing may occur on another - * processor and free / modify the context. Ne touche pas! -@@ -284,7 +289,6 @@ static int rdma_read_xdr(struct svcxprt_rdma *xprt, - u64 sgl_offset; - struct rpcrdma_read_chunk *ch; - struct svc_rdma_op_ctxt *ctxt = NULL; -- struct svc_rdma_op_ctxt *head; - struct svc_rdma_op_ctxt *tmp_sge_ctxt; - struct svc_rdma_op_ctxt *tmp_ch_ctxt; - struct chunk_sge *ch_sge_ary; -@@ -302,25 +306,19 @@ static int rdma_read_xdr(struct svcxprt_rdma *xprt, - ch_sge_ary = (struct chunk_sge *)tmp_ch_ctxt->sge; - - svc_rdma_rcl_chunk_counts(ch, &ch_count, &byte_count); -+ if (ch_count > RPCSVC_MAXPAGES) -+ return -EINVAL; - sge_count = rdma_rcl_to_sge(xprt, rqstp, hdr_ctxt, rmsgp, - sge, ch_sge_ary, - ch_count, byte_count); -- head = svc_rdma_get_context(xprt); - sgl_offset = 0; - ch_no = 0; - - for (ch = (struct rpcrdma_read_chunk *)&rmsgp->rm_body.rm_chunks[0]; - ch->rc_discrim != 0; ch++, ch_no++) { - next_sge: -- if (!ctxt) -- ctxt = head; -- else { -- ctxt->next = svc_rdma_get_context(xprt); -- ctxt = ctxt->next; -- } -- ctxt->next = NULL; -+ ctxt = svc_rdma_get_context(xprt); - ctxt->direction = DMA_FROM_DEVICE; -- clear_bit(RDMACTXT_F_READ_DONE, &ctxt->flags); - clear_bit(RDMACTXT_F_LAST_CTXT, &ctxt->flags); - - /* Prepare READ WR */ -@@ -347,20 +345,15 @@ next_sge: - * the client and the RPC needs to be enqueued. - */ - set_bit(RDMACTXT_F_LAST_CTXT, &ctxt->flags); -- ctxt->next = hdr_ctxt; -- hdr_ctxt->next = head; -+ ctxt->read_hdr = hdr_ctxt; - } - /* Post the read */ - err = svc_rdma_send(xprt, &read_wr); - if (err) { -- printk(KERN_ERR "svcrdma: Error posting send = %d\n", -+ printk(KERN_ERR "svcrdma: Error %d posting RDMA_READ\n", - err); -- /* -- * Break the circular list so free knows when -- * to stop if the error happened to occur on -- * the last read -- */ -- ctxt->next = NULL; -+ set_bit(XPT_CLOSE, &xprt->sc_xprt.xpt_flags); -+ svc_rdma_put_context(ctxt, 0); - goto out; - } - atomic_inc(&rdma_stat_read); -@@ -371,7 +364,7 @@ next_sge: - goto next_sge; - } - sgl_offset = 0; -- err = 0; -+ err = 1; - } - - out: -@@ -389,25 +382,12 @@ next_sge: - while (rqstp->rq_resused) - rqstp->rq_respages[--rqstp->rq_resused] = NULL; - -- if (err) { -- printk(KERN_ERR "svcrdma : RDMA_READ error = %d\n", err); -- set_bit(XPT_CLOSE, &xprt->sc_xprt.xpt_flags); -- /* Free the linked list of read contexts */ -- while (head != NULL) { -- ctxt = head->next; -- svc_rdma_put_context(head, 1); -- head = ctxt; -- } -- return 0; -- } -- -- return 1; -+ return err; - } - - static int rdma_read_complete(struct svc_rqst *rqstp, -- struct svc_rdma_op_ctxt *data) -+ struct svc_rdma_op_ctxt *head) - { -- struct svc_rdma_op_ctxt *head = data->next; - int page_no; - int ret; - -@@ -433,21 +413,12 @@ static int rdma_read_complete(struct svc_rqst *rqstp, - rqstp->rq_arg.len = head->arg.len; - rqstp->rq_arg.buflen = head->arg.buflen; - -+ /* Free the context */ -+ svc_rdma_put_context(head, 0); -+ - /* XXX: What should this be? */ - rqstp->rq_prot = IPPROTO_MAX; -- -- /* -- * Free the contexts we used to build the RDMA_READ. We have -- * to be careful here because the context list uses the same -- * next pointer used to chain the contexts associated with the -- * RDMA_READ -- */ -- data->next = NULL; /* terminate circular list */ -- do { -- data = head->next; -- svc_rdma_put_context(head, 0); -- head = data; -- } while (head != NULL); -+ svc_xprt_copy_addrs(rqstp, rqstp->rq_xprt); - - ret = rqstp->rq_arg.head[0].iov_len - + rqstp->rq_arg.page_len -@@ -457,8 +428,6 @@ static int rdma_read_complete(struct svc_rqst *rqstp, - ret, rqstp->rq_arg.len, rqstp->rq_arg.head[0].iov_base, - rqstp->rq_arg.head[0].iov_len); - -- /* Indicate that we've consumed an RQ credit */ -- rqstp->rq_xprt_ctxt = rqstp->rq_xprt; - svc_xprt_received(rqstp->rq_xprt); - return ret; - } -@@ -480,13 +449,6 @@ int svc_rdma_recvfrom(struct svc_rqst *rqstp) - - dprintk("svcrdma: rqstp=%p\n", rqstp); - -- /* -- * The rq_xprt_ctxt indicates if we've consumed an RQ credit -- * or not. It is used in the rdma xpo_release_rqst function to -- * determine whether or not to return an RQ WQE to the RQ. -- */ -- rqstp->rq_xprt_ctxt = NULL; -- - spin_lock_bh(&rdma_xprt->sc_read_complete_lock); - if (!list_empty(&rdma_xprt->sc_read_complete_q)) { - ctxt = list_entry(rdma_xprt->sc_read_complete_q.next, -@@ -537,21 +499,22 @@ int svc_rdma_recvfrom(struct svc_rqst *rqstp) - /* If the request is invalid, reply with an error */ - if (len < 0) { - if (len == -ENOSYS) -- (void)svc_rdma_send_error(rdma_xprt, rmsgp, ERR_VERS); -+ svc_rdma_send_error(rdma_xprt, rmsgp, ERR_VERS); - goto close_out; - } - -- /* Read read-list data. If we would need to wait, defer -- * it. Not that in this case, we don't return the RQ credit -- * until after the read completes. -- */ -- if (rdma_read_xdr(rdma_xprt, rmsgp, rqstp, ctxt)) { -+ /* Read read-list data. */ -+ ret = rdma_read_xdr(rdma_xprt, rmsgp, rqstp, ctxt); -+ if (ret > 0) { -+ /* read-list posted, defer until data received from client. */ - svc_xprt_received(xprt); - return 0; - } -- -- /* Indicate we've consumed an RQ credit */ -- rqstp->rq_xprt_ctxt = rqstp->rq_xprt; -+ if (ret < 0) { -+ /* Post of read-list failed, free context. */ -+ svc_rdma_put_context(ctxt, 1); -+ return 0; -+ } - - ret = rqstp->rq_arg.head[0].iov_len - + rqstp->rq_arg.page_len -@@ -569,11 +532,8 @@ int svc_rdma_recvfrom(struct svc_rqst *rqstp) - return ret; - - close_out: -- if (ctxt) { -+ if (ctxt) - svc_rdma_put_context(ctxt, 1); -- /* Indicate we've consumed an RQ credit */ -- rqstp->rq_xprt_ctxt = rqstp->rq_xprt; -- } - dprintk("svcrdma: transport %p is closing\n", xprt); - /* - * Set the close bit and enqueue it. svc_recv will see the -diff --git a/net/sunrpc/xprtrdma/svc_rdma_sendto.c b/net/sunrpc/xprtrdma/svc_rdma_sendto.c -index 981f190..fb82b1b 100644 ---- a/net/sunrpc/xprtrdma/svc_rdma_sendto.c -+++ b/net/sunrpc/xprtrdma/svc_rdma_sendto.c -@@ -389,6 +389,17 @@ static int send_reply(struct svcxprt_rdma *rdma, - int page_no; - int ret; - -+ /* Post a recv buffer to handle another request. */ -+ ret = svc_rdma_post_recv(rdma); -+ if (ret) { -+ printk(KERN_INFO -+ "svcrdma: could not post a receive buffer, err=%d." -+ "Closing transport %p.\n", ret, rdma); -+ set_bit(XPT_CLOSE, &rdma->sc_xprt.xpt_flags); -+ svc_rdma_put_context(ctxt, 0); -+ return -ENOTCONN; -+ } -+ - /* Prepare the context */ - ctxt->pages[0] = page; - ctxt->count = 1; -diff --git a/net/sunrpc/xprtrdma/svc_rdma_transport.c b/net/sunrpc/xprtrdma/svc_rdma_transport.c -index af408fc..e132509 100644 ---- a/net/sunrpc/xprtrdma/svc_rdma_transport.c -+++ b/net/sunrpc/xprtrdma/svc_rdma_transport.c -@@ -103,8 +103,8 @@ static int rdma_bump_context_cache(struct svcxprt_rdma *xprt) - spin_lock_bh(&xprt->sc_ctxt_lock); - if (ctxt) { - at_least_one = 1; -- ctxt->next = xprt->sc_ctxt_head; -- xprt->sc_ctxt_head = ctxt; -+ INIT_LIST_HEAD(&ctxt->free_list); -+ list_add(&ctxt->free_list, &xprt->sc_ctxt_free); - } else { - /* kmalloc failed...give up for now */ - xprt->sc_ctxt_cnt--; -@@ -123,7 +123,7 @@ struct svc_rdma_op_ctxt *svc_rdma_get_context(struct svcxprt_rdma *xprt) - - while (1) { - spin_lock_bh(&xprt->sc_ctxt_lock); -- if (unlikely(xprt->sc_ctxt_head == NULL)) { -+ if (unlikely(list_empty(&xprt->sc_ctxt_free))) { - /* Try to bump my cache. */ - spin_unlock_bh(&xprt->sc_ctxt_lock); - -@@ -136,12 +136,15 @@ struct svc_rdma_op_ctxt *svc_rdma_get_context(struct svcxprt_rdma *xprt) - schedule_timeout_uninterruptible(msecs_to_jiffies(500)); - continue; - } -- ctxt = xprt->sc_ctxt_head; -- xprt->sc_ctxt_head = ctxt->next; -+ ctxt = list_entry(xprt->sc_ctxt_free.next, -+ struct svc_rdma_op_ctxt, -+ free_list); -+ list_del_init(&ctxt->free_list); - spin_unlock_bh(&xprt->sc_ctxt_lock); - ctxt->xprt = xprt; - INIT_LIST_HEAD(&ctxt->dto_q); - ctxt->count = 0; -+ atomic_inc(&xprt->sc_ctxt_used); - break; - } - return ctxt; -@@ -159,14 +162,15 @@ void svc_rdma_put_context(struct svc_rdma_op_ctxt *ctxt, int free_pages) - put_page(ctxt->pages[i]); - - for (i = 0; i < ctxt->count; i++) -- dma_unmap_single(xprt->sc_cm_id->device->dma_device, -- ctxt->sge[i].addr, -- ctxt->sge[i].length, -- ctxt->direction); -+ ib_dma_unmap_single(xprt->sc_cm_id->device, -+ ctxt->sge[i].addr, -+ ctxt->sge[i].length, -+ ctxt->direction); -+ - spin_lock_bh(&xprt->sc_ctxt_lock); -- ctxt->next = xprt->sc_ctxt_head; -- xprt->sc_ctxt_head = ctxt; -+ list_add(&ctxt->free_list, &xprt->sc_ctxt_free); - spin_unlock_bh(&xprt->sc_ctxt_lock); -+ atomic_dec(&xprt->sc_ctxt_used); - } - - /* ib_cq event handler */ -@@ -228,23 +232,8 @@ static void dto_tasklet_func(unsigned long data) - list_del_init(&xprt->sc_dto_q); - spin_unlock_irqrestore(&dto_lock, flags); - -- if (test_and_clear_bit(RDMAXPRT_RQ_PENDING, &xprt->sc_flags)) { -- ib_req_notify_cq(xprt->sc_rq_cq, IB_CQ_NEXT_COMP); -- rq_cq_reap(xprt); -- set_bit(XPT_DATA, &xprt->sc_xprt.xpt_flags); -- /* -- * If data arrived before established event, -- * don't enqueue. This defers RPC I/O until the -- * RDMA connection is complete. -- */ -- if (!test_bit(RDMAXPRT_CONN_PENDING, &xprt->sc_flags)) -- svc_xprt_enqueue(&xprt->sc_xprt); -- } -- -- if (test_and_clear_bit(RDMAXPRT_SQ_PENDING, &xprt->sc_flags)) { -- ib_req_notify_cq(xprt->sc_sq_cq, IB_CQ_NEXT_COMP); -- sq_cq_reap(xprt); -- } -+ rq_cq_reap(xprt); -+ sq_cq_reap(xprt); - - svc_xprt_put(&xprt->sc_xprt); - spin_lock_irqsave(&dto_lock, flags); -@@ -263,11 +252,15 @@ static void rq_comp_handler(struct ib_cq *cq, void *cq_context) - struct svcxprt_rdma *xprt = cq_context; - unsigned long flags; - -+ /* Guard against unconditional flush call for destroyed QP */ -+ if (atomic_read(&xprt->sc_xprt.xpt_ref.refcount)==0) -+ return; -+ - /* - * Set the bit regardless of whether or not it's on the list - * because it may be on the list already due to an SQ - * completion. -- */ -+ */ - set_bit(RDMAXPRT_RQ_PENDING, &xprt->sc_flags); - - /* -@@ -290,6 +283,8 @@ static void rq_comp_handler(struct ib_cq *cq, void *cq_context) - * - * Take all completing WC off the CQE and enqueue the associated DTO - * context on the dto_q for the transport. -+ * -+ * Note that caller must hold a transport reference. - */ - static void rq_cq_reap(struct svcxprt_rdma *xprt) - { -@@ -297,29 +292,47 @@ static void rq_cq_reap(struct svcxprt_rdma *xprt) - struct ib_wc wc; - struct svc_rdma_op_ctxt *ctxt = NULL; - -+ if (!test_and_clear_bit(RDMAXPRT_RQ_PENDING, &xprt->sc_flags)) -+ return; -+ -+ ib_req_notify_cq(xprt->sc_rq_cq, IB_CQ_NEXT_COMP); - atomic_inc(&rdma_stat_rq_poll); - -- spin_lock_bh(&xprt->sc_rq_dto_lock); - while ((ret = ib_poll_cq(xprt->sc_rq_cq, 1, &wc)) > 0) { - ctxt = (struct svc_rdma_op_ctxt *)(unsigned long)wc.wr_id; - ctxt->wc_status = wc.status; - ctxt->byte_len = wc.byte_len; - if (wc.status != IB_WC_SUCCESS) { - /* Close the transport */ -+ dprintk("svcrdma: transport closing putting ctxt %p\n", ctxt); - set_bit(XPT_CLOSE, &xprt->sc_xprt.xpt_flags); - svc_rdma_put_context(ctxt, 1); -+ svc_xprt_put(&xprt->sc_xprt); - continue; - } -+ spin_lock_bh(&xprt->sc_rq_dto_lock); - list_add_tail(&ctxt->dto_q, &xprt->sc_rq_dto_q); -+ spin_unlock_bh(&xprt->sc_rq_dto_lock); -+ svc_xprt_put(&xprt->sc_xprt); - } -- spin_unlock_bh(&xprt->sc_rq_dto_lock); - - if (ctxt) - atomic_inc(&rdma_stat_rq_prod); -+ -+ set_bit(XPT_DATA, &xprt->sc_xprt.xpt_flags); -+ /* -+ * If data arrived before established event, -+ * don't enqueue. This defers RPC I/O until the -+ * RDMA connection is complete. -+ */ -+ if (!test_bit(RDMAXPRT_CONN_PENDING, &xprt->sc_flags)) -+ svc_xprt_enqueue(&xprt->sc_xprt); - } - - /* - * Send Queue Completion Handler - potentially called on interrupt context. -+ * -+ * Note that caller must hold a transport reference. - */ - static void sq_cq_reap(struct svcxprt_rdma *xprt) - { -@@ -328,6 +341,11 @@ static void sq_cq_reap(struct svcxprt_rdma *xprt) - struct ib_cq *cq = xprt->sc_sq_cq; - int ret; - -+ -+ if (!test_and_clear_bit(RDMAXPRT_SQ_PENDING, &xprt->sc_flags)) -+ return; -+ -+ ib_req_notify_cq(xprt->sc_sq_cq, IB_CQ_NEXT_COMP); - atomic_inc(&rdma_stat_sq_poll); - while ((ret = ib_poll_cq(cq, 1, &wc)) > 0) { - ctxt = (struct svc_rdma_op_ctxt *)(unsigned long)wc.wr_id; -@@ -349,14 +367,16 @@ static void sq_cq_reap(struct svcxprt_rdma *xprt) - - case IB_WR_RDMA_READ: - if (test_bit(RDMACTXT_F_LAST_CTXT, &ctxt->flags)) { -+ struct svc_rdma_op_ctxt *read_hdr = ctxt->read_hdr; -+ BUG_ON(!read_hdr); - set_bit(XPT_DATA, &xprt->sc_xprt.xpt_flags); -- set_bit(RDMACTXT_F_READ_DONE, &ctxt->flags); - spin_lock_bh(&xprt->sc_read_complete_lock); -- list_add_tail(&ctxt->dto_q, -+ list_add_tail(&read_hdr->dto_q, - &xprt->sc_read_complete_q); - spin_unlock_bh(&xprt->sc_read_complete_lock); - svc_xprt_enqueue(&xprt->sc_xprt); - } -+ svc_rdma_put_context(ctxt, 0); - break; - - default: -@@ -365,6 +385,7 @@ static void sq_cq_reap(struct svcxprt_rdma *xprt) - wc.opcode, wc.status); - break; - } -+ svc_xprt_put(&xprt->sc_xprt); - } - - if (ctxt) -@@ -376,11 +397,15 @@ static void sq_comp_handler(struct ib_cq *cq, void *cq_context) - struct svcxprt_rdma *xprt = cq_context; - unsigned long flags; - -+ /* Guard against unconditional flush call for destroyed QP */ -+ if (atomic_read(&xprt->sc_xprt.xpt_ref.refcount)==0) -+ return; -+ - /* - * Set the bit regardless of whether or not it's on the list - * because it may be on the list already due to an RQ - * completion. -- */ -+ */ - set_bit(RDMAXPRT_SQ_PENDING, &xprt->sc_flags); - - /* -@@ -407,28 +432,29 @@ static void create_context_cache(struct svcxprt_rdma *xprt, - xprt->sc_ctxt_max = ctxt_max; - xprt->sc_ctxt_bump = ctxt_bump; - xprt->sc_ctxt_cnt = 0; -- xprt->sc_ctxt_head = NULL; -+ atomic_set(&xprt->sc_ctxt_used, 0); -+ -+ INIT_LIST_HEAD(&xprt->sc_ctxt_free); - for (i = 0; i < ctxt_count; i++) { - ctxt = kmalloc(sizeof(*ctxt), GFP_KERNEL); - if (ctxt) { -- ctxt->next = xprt->sc_ctxt_head; -- xprt->sc_ctxt_head = ctxt; -+ INIT_LIST_HEAD(&ctxt->free_list); -+ list_add(&ctxt->free_list, &xprt->sc_ctxt_free); - xprt->sc_ctxt_cnt++; - } - } - } - --static void destroy_context_cache(struct svc_rdma_op_ctxt *ctxt) -+static void destroy_context_cache(struct svcxprt_rdma *xprt) - { -- struct svc_rdma_op_ctxt *next; -- if (!ctxt) -- return; -- -- do { -- next = ctxt->next; -+ while (!list_empty(&xprt->sc_ctxt_free)) { -+ struct svc_rdma_op_ctxt *ctxt; -+ ctxt = list_entry(xprt->sc_ctxt_free.next, -+ struct svc_rdma_op_ctxt, -+ free_list); -+ list_del_init(&ctxt->free_list); - kfree(ctxt); -- ctxt = next; -- } while (next); -+ } - } - - static struct svcxprt_rdma *rdma_create_xprt(struct svc_serv *serv, -@@ -465,7 +491,7 @@ static struct svcxprt_rdma *rdma_create_xprt(struct svc_serv *serv, - reqs + - cma_xprt->sc_sq_depth + - RPCRDMA_MAX_THREADS + 1); /* max */ -- if (!cma_xprt->sc_ctxt_head) { -+ if (list_empty(&cma_xprt->sc_ctxt_free)) { - kfree(cma_xprt); - return NULL; - } -@@ -520,7 +546,12 @@ int svc_rdma_post_recv(struct svcxprt_rdma *xprt) - recv_wr.num_sge = ctxt->count; - recv_wr.wr_id = (u64)(unsigned long)ctxt; - -+ svc_xprt_get(&xprt->sc_xprt); - ret = ib_post_recv(xprt->sc_qp, &recv_wr, &bad_recv_wr); -+ if (ret) { -+ svc_xprt_put(&xprt->sc_xprt); -+ svc_rdma_put_context(ctxt, 1); -+ } - return ret; - } - -@@ -539,6 +570,7 @@ static void handle_connect_req(struct rdma_cm_id *new_cma_id) - { - struct svcxprt_rdma *listen_xprt = new_cma_id->context; - struct svcxprt_rdma *newxprt; -+ struct sockaddr *sa; - - /* Create a new transport */ - newxprt = rdma_create_xprt(listen_xprt->sc_xprt.xpt_server, 0); -@@ -551,6 +583,12 @@ static void handle_connect_req(struct rdma_cm_id *new_cma_id) - dprintk("svcrdma: Creating newxprt=%p, cm_id=%p, listenxprt=%p\n", - newxprt, newxprt->sc_cm_id, listen_xprt); - -+ /* Set the local and remote addresses in the transport */ -+ sa = (struct sockaddr *)&newxprt->sc_cm_id->route.addr.dst_addr; -+ svc_xprt_set_remote(&newxprt->sc_xprt, sa, svc_addr_len(sa)); -+ sa = (struct sockaddr *)&newxprt->sc_cm_id->route.addr.src_addr; -+ svc_xprt_set_local(&newxprt->sc_xprt, sa, svc_addr_len(sa)); -+ - /* - * Enqueue the new transport on the accept queue of the listening - * transport -@@ -627,6 +665,7 @@ static int rdma_cma_handler(struct rdma_cm_id *cma_id, - if (xprt) { - set_bit(XPT_CLOSE, &xprt->xpt_flags); - svc_xprt_enqueue(xprt); -+ svc_xprt_put(xprt); - } - break; - case RDMA_CM_EVENT_DEVICE_REMOVAL: -@@ -661,31 +700,27 @@ static struct svc_xprt *svc_rdma_create(struct svc_serv *serv, - - cma_xprt = rdma_create_xprt(serv, 1); - if (!cma_xprt) -- return ERR_PTR(ENOMEM); -+ return ERR_PTR(-ENOMEM); - xprt = &cma_xprt->sc_xprt; - - listen_id = rdma_create_id(rdma_listen_handler, cma_xprt, RDMA_PS_TCP); - if (IS_ERR(listen_id)) { -- svc_xprt_put(&cma_xprt->sc_xprt); -- dprintk("svcrdma: rdma_create_id failed = %ld\n", -- PTR_ERR(listen_id)); -- return (void *)listen_id; -+ ret = PTR_ERR(listen_id); -+ dprintk("svcrdma: rdma_create_id failed = %d\n", ret); -+ goto err0; - } -+ - ret = rdma_bind_addr(listen_id, sa); - if (ret) { -- rdma_destroy_id(listen_id); -- svc_xprt_put(&cma_xprt->sc_xprt); - dprintk("svcrdma: rdma_bind_addr failed = %d\n", ret); -- return ERR_PTR(ret); -+ goto err1; - } - cma_xprt->sc_cm_id = listen_id; - - ret = rdma_listen(listen_id, RPCRDMA_LISTEN_BACKLOG); - if (ret) { -- rdma_destroy_id(listen_id); -- svc_xprt_put(&cma_xprt->sc_xprt); - dprintk("svcrdma: rdma_listen failed = %d\n", ret); -- return ERR_PTR(ret); -+ goto err1; - } - - /* -@@ -696,6 +731,12 @@ static struct svc_xprt *svc_rdma_create(struct svc_serv *serv, - svc_xprt_set_local(&cma_xprt->sc_xprt, sa, salen); - - return &cma_xprt->sc_xprt; -+ -+ err1: -+ rdma_destroy_id(listen_id); -+ err0: -+ kfree(cma_xprt); -+ return ERR_PTR(ret); - } - - /* -@@ -716,7 +757,6 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt) - struct rdma_conn_param conn_param; - struct ib_qp_init_attr qp_attr; - struct ib_device_attr devattr; -- struct sockaddr *sa; - int ret; - int i; - -@@ -826,7 +866,6 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt) - newxprt->sc_sq_depth = qp_attr.cap.max_send_wr; - newxprt->sc_max_requests = qp_attr.cap.max_recv_wr; - } -- svc_xprt_get(&newxprt->sc_xprt); - newxprt->sc_qp = newxprt->sc_cm_id->qp; - - /* Register all of physical memory */ -@@ -850,6 +889,13 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt) - /* Swap out the handler */ - newxprt->sc_cm_id->event_handler = rdma_cma_handler; - -+ /* -+ * Arm the CQs for the SQ and RQ before accepting so we can't -+ * miss the first message -+ */ -+ ib_req_notify_cq(newxprt->sc_sq_cq, IB_CQ_NEXT_COMP); -+ ib_req_notify_cq(newxprt->sc_rq_cq, IB_CQ_NEXT_COMP); -+ - /* Accept Connection */ - set_bit(RDMAXPRT_CONN_PENDING, &newxprt->sc_flags); - memset(&conn_param, 0, sizeof conn_param); -@@ -886,58 +932,26 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt) - newxprt->sc_max_requests, - newxprt->sc_ord); - -- /* Set the local and remote addresses in the transport */ -- sa = (struct sockaddr *)&newxprt->sc_cm_id->route.addr.dst_addr; -- svc_xprt_set_remote(&newxprt->sc_xprt, sa, svc_addr_len(sa)); -- sa = (struct sockaddr *)&newxprt->sc_cm_id->route.addr.src_addr; -- svc_xprt_set_local(&newxprt->sc_xprt, sa, svc_addr_len(sa)); -- -- ib_req_notify_cq(newxprt->sc_sq_cq, IB_CQ_NEXT_COMP); -- ib_req_notify_cq(newxprt->sc_rq_cq, IB_CQ_NEXT_COMP); - return &newxprt->sc_xprt; - - errout: - dprintk("svcrdma: failure accepting new connection rc=%d.\n", ret); - /* Take a reference in case the DTO handler runs */ - svc_xprt_get(&newxprt->sc_xprt); -- if (newxprt->sc_qp && !IS_ERR(newxprt->sc_qp)) { -+ if (newxprt->sc_qp && !IS_ERR(newxprt->sc_qp)) - ib_destroy_qp(newxprt->sc_qp); -- svc_xprt_put(&newxprt->sc_xprt); -- } - rdma_destroy_id(newxprt->sc_cm_id); - /* This call to put will destroy the transport */ - svc_xprt_put(&newxprt->sc_xprt); - return NULL; - } - --/* -- * Post an RQ WQE to the RQ when the rqst is being released. This -- * effectively returns an RQ credit to the client. The rq_xprt_ctxt -- * will be null if the request is deferred due to an RDMA_READ or the -- * transport had no data ready (EAGAIN). Note that an RPC deferred in -- * svc_process will still return the credit, this is because the data -- * is copied and no longer consume a WQE/WC. -- */ - static void svc_rdma_release_rqst(struct svc_rqst *rqstp) - { -- int err; -- struct svcxprt_rdma *rdma = -- container_of(rqstp->rq_xprt, struct svcxprt_rdma, sc_xprt); -- if (rqstp->rq_xprt_ctxt) { -- BUG_ON(rqstp->rq_xprt_ctxt != rdma); -- err = svc_rdma_post_recv(rdma); -- if (err) -- dprintk("svcrdma: failed to post an RQ WQE error=%d\n", -- err); -- } -- rqstp->rq_xprt_ctxt = NULL; - } - - /* -- * When connected, an svc_xprt has at least three references: -- * -- * - A reference held by the QP. We still hold that here because this -- * code deletes the QP and puts the reference. -+ * When connected, an svc_xprt has at least two references: - * - * - A reference held by the cm_id between the ESTABLISHED and - * DISCONNECTED events. If the remote peer disconnected first, this -@@ -946,7 +960,7 @@ static void svc_rdma_release_rqst(struct svc_rqst *rqstp) - * - A reference held by the svc_recv code that called this function - * as part of close processing. - * -- * At a minimum two references should still be held. -+ * At a minimum one references should still be held. - */ - static void svc_rdma_detach(struct svc_xprt *xprt) - { -@@ -956,23 +970,53 @@ static void svc_rdma_detach(struct svc_xprt *xprt) - - /* Disconnect and flush posted WQE */ - rdma_disconnect(rdma->sc_cm_id); -- -- /* Destroy the QP if present (not a listener) */ -- if (rdma->sc_qp && !IS_ERR(rdma->sc_qp)) { -- ib_destroy_qp(rdma->sc_qp); -- svc_xprt_put(xprt); -- } -- -- /* Destroy the CM ID */ -- rdma_destroy_id(rdma->sc_cm_id); - } - --static void svc_rdma_free(struct svc_xprt *xprt) -+static void __svc_rdma_free(struct work_struct *work) - { -- struct svcxprt_rdma *rdma = (struct svcxprt_rdma *)xprt; -+ struct svcxprt_rdma *rdma = -+ container_of(work, struct svcxprt_rdma, sc_work); - dprintk("svcrdma: svc_rdma_free(%p)\n", rdma); -+ - /* We should only be called from kref_put */ -- BUG_ON(atomic_read(&xprt->xpt_ref.refcount) != 0); -+ BUG_ON(atomic_read(&rdma->sc_xprt.xpt_ref.refcount) != 0); -+ -+ /* -+ * Destroy queued, but not processed read completions. Note -+ * that this cleanup has to be done before destroying the -+ * cm_id because the device ptr is needed to unmap the dma in -+ * svc_rdma_put_context. -+ */ -+ spin_lock_bh(&rdma->sc_read_complete_lock); -+ while (!list_empty(&rdma->sc_read_complete_q)) { -+ struct svc_rdma_op_ctxt *ctxt; -+ ctxt = list_entry(rdma->sc_read_complete_q.next, -+ struct svc_rdma_op_ctxt, -+ dto_q); -+ list_del_init(&ctxt->dto_q); -+ svc_rdma_put_context(ctxt, 1); -+ } -+ spin_unlock_bh(&rdma->sc_read_complete_lock); -+ -+ /* Destroy queued, but not processed recv completions */ -+ spin_lock_bh(&rdma->sc_rq_dto_lock); -+ while (!list_empty(&rdma->sc_rq_dto_q)) { -+ struct svc_rdma_op_ctxt *ctxt; -+ ctxt = list_entry(rdma->sc_rq_dto_q.next, -+ struct svc_rdma_op_ctxt, -+ dto_q); -+ list_del_init(&ctxt->dto_q); -+ svc_rdma_put_context(ctxt, 1); -+ } -+ spin_unlock_bh(&rdma->sc_rq_dto_lock); -+ -+ /* Warn if we leaked a resource or under-referenced */ -+ WARN_ON(atomic_read(&rdma->sc_ctxt_used) != 0); -+ -+ /* Destroy the QP if present (not a listener) */ -+ if (rdma->sc_qp && !IS_ERR(rdma->sc_qp)) -+ ib_destroy_qp(rdma->sc_qp); -+ - if (rdma->sc_sq_cq && !IS_ERR(rdma->sc_sq_cq)) - ib_destroy_cq(rdma->sc_sq_cq); - -@@ -985,10 +1029,21 @@ static void svc_rdma_free(struct svc_xprt *xprt) - if (rdma->sc_pd && !IS_ERR(rdma->sc_pd)) - ib_dealloc_pd(rdma->sc_pd); - -- destroy_context_cache(rdma->sc_ctxt_head); -+ /* Destroy the CM ID */ -+ rdma_destroy_id(rdma->sc_cm_id); -+ -+ destroy_context_cache(rdma); - kfree(rdma); - } - -+static void svc_rdma_free(struct svc_xprt *xprt) -+{ -+ struct svcxprt_rdma *rdma = -+ container_of(xprt, struct svcxprt_rdma, sc_xprt); -+ INIT_WORK(&rdma->sc_work, __svc_rdma_free); -+ schedule_work(&rdma->sc_work); -+} -+ - static int svc_rdma_has_wspace(struct svc_xprt *xprt) - { - struct svcxprt_rdma *rdma = -@@ -1018,7 +1073,7 @@ int svc_rdma_send(struct svcxprt_rdma *xprt, struct ib_send_wr *wr) - int ret; - - if (test_bit(XPT_CLOSE, &xprt->sc_xprt.xpt_flags)) -- return 0; -+ return -ENOTCONN; - - BUG_ON(wr->send_flags != IB_SEND_SIGNALED); - BUG_ON(((struct svc_rdma_op_ctxt *)(unsigned long)wr->wr_id)->wr_op != -@@ -1029,7 +1084,8 @@ int svc_rdma_send(struct svcxprt_rdma *xprt, struct ib_send_wr *wr) - if (xprt->sc_sq_depth == atomic_read(&xprt->sc_sq_count)) { - spin_unlock_bh(&xprt->sc_lock); - atomic_inc(&rdma_stat_sq_starve); -- /* See if we can reap some SQ WR */ -+ -+ /* See if we can opportunistically reap SQ WR to make room */ - sq_cq_reap(xprt); - - /* Wait until SQ WR available if SQ still full */ -@@ -1041,22 +1097,25 @@ int svc_rdma_send(struct svcxprt_rdma *xprt, struct ib_send_wr *wr) - continue; - } - /* Bumped used SQ WR count and post */ -+ svc_xprt_get(&xprt->sc_xprt); - ret = ib_post_send(xprt->sc_qp, wr, &bad_wr); - if (!ret) - atomic_inc(&xprt->sc_sq_count); -- else -+ else { -+ svc_xprt_put(&xprt->sc_xprt); - dprintk("svcrdma: failed to post SQ WR rc=%d, " - "sc_sq_count=%d, sc_sq_depth=%d\n", - ret, atomic_read(&xprt->sc_sq_count), - xprt->sc_sq_depth); -+ } - spin_unlock_bh(&xprt->sc_lock); - break; - } - return ret; - } - --int svc_rdma_send_error(struct svcxprt_rdma *xprt, struct rpcrdma_msg *rmsgp, -- enum rpcrdma_errcode err) -+void svc_rdma_send_error(struct svcxprt_rdma *xprt, struct rpcrdma_msg *rmsgp, -+ enum rpcrdma_errcode err) - { - struct ib_send_wr err_wr; - struct ib_sge sge; -@@ -1094,9 +1153,8 @@ int svc_rdma_send_error(struct svcxprt_rdma *xprt, struct rpcrdma_msg *rmsgp, - /* Post It */ - ret = svc_rdma_send(xprt, &err_wr); - if (ret) { -- dprintk("svcrdma: Error posting send = %d\n", ret); -+ dprintk("svcrdma: Error %d posting send for protocol error\n", -+ ret); - svc_rdma_put_context(ctxt, 1); - } -- -- return ret; - } -diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c -index a1b0fbe..b976d9e 100644 ---- a/net/xfrm/xfrm_user.c -+++ b/net/xfrm/xfrm_user.c -@@ -50,19 +50,8 @@ static int verify_one_alg(struct nlattr **attrs, enum xfrm_attr_type_t type) - - switch (type) { - case XFRMA_ALG_AUTH: -- if (!algp->alg_key_len && -- strcmp(algp->alg_name, "digest_null") != 0) -- return -EINVAL; -- break; -- - case XFRMA_ALG_CRYPT: -- if (!algp->alg_key_len && -- strcmp(algp->alg_name, "cipher_null") != 0) -- return -EINVAL; -- break; -- - case XFRMA_ALG_COMP: -- /* Zero length keys are legal. */ - break; - - default: -diff --git a/scripts/kallsyms.c b/scripts/kallsyms.c -index 5d20a2e..ad2434b 100644 ---- a/scripts/kallsyms.c -+++ b/scripts/kallsyms.c -@@ -108,6 +108,9 @@ static int read_symbol(FILE *in, struct sym_entry *s) - /* exclude also MIPS ELF local symbols ($L123 instead of .L123) */ - else if (str[0] == '$') - return -1; -+ /* exclude debugging symbols */ -+ else if (stype == 'N') -+ return -1; - - /* include the type field in the symbol name, so that it gets - * compressed together */ -diff --git a/scripts/kconfig/util.c b/scripts/kconfig/util.c -index f8e73c0..3cc9f93 100644 ---- a/scripts/kconfig/util.c -+++ b/scripts/kconfig/util.c -@@ -77,7 +77,7 @@ struct gstr str_new(void) - { - struct gstr gs; - gs.s = malloc(sizeof(char) * 64); -- gs.len = 16; -+ gs.len = 64; - strcpy(gs.s, "\0"); - return gs; - } -diff --git a/scripts/kernel-doc b/scripts/kernel-doc -index 83cee18..88e3934 100755 ---- a/scripts/kernel-doc -+++ b/scripts/kernel-doc -@@ -1556,7 +1556,9 @@ sub create_parameterlist($$$) { - push_parameter($2, "$type $1", $file); - } - elsif ($param =~ m/(.*?):(\d+)/) { -- push_parameter($1, "$type:$2", $file) -+ if ($type ne "") { # skip unnamed bit-fields -+ push_parameter($1, "$type:$2", $file) -+ } - } - else { - push_parameter($param, $type, $file); -diff --git a/scripts/mksysmap b/scripts/mksysmap -index 4390fab..6e133a0 100644 ---- a/scripts/mksysmap -+++ b/scripts/mksysmap -@@ -32,6 +32,7 @@ - # For System.map filter away: - # a - local absolute symbols - # U - undefined global symbols -+# N - debugging symbols - # w - local weak symbols - - # readprofile starts reading symbols when _stext is found, and -@@ -40,5 +41,5 @@ - # so we just ignore them to let readprofile continue to work. - # (At least sparc64 has __crc_ in the middle). - --$NM -n $1 | grep -v '\( [aUw] \)\|\(__crc_\)\|\( \$[adt]\)' > $2 -+$NM -n $1 | grep -v '\( [aNUw] \)\|\(__crc_\)\|\( \$[adt]\)' > $2 - -diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c -index 757294b..508c589 100644 ---- a/scripts/mod/modpost.c -+++ b/scripts/mod/modpost.c -@@ -721,7 +721,7 @@ static int check_section(const char *modname, const char *sec) - /* consume all digits */ - while (*e && e != sec && isdigit(*e)) - e--; -- if (*e == '.') { -+ if (*e == '.' && !strstr(sec, ".linkonce")) { - warn("%s (%s): unexpected section name.\n" - "The (.[number]+) following section name are " - "ld generated and not expected.\n" -diff --git a/sound/Kconfig b/sound/Kconfig -index b2a2db4..4247406 100644 ---- a/sound/Kconfig -+++ b/sound/Kconfig -@@ -28,11 +28,6 @@ config SOUND - and read ; the module - will be called soundcore. - -- I'm told that even without a sound card, you can make your computer -- say more than an occasional beep, by programming the PC speaker. -- Kernel patches and supporting utilities to do that are in the pcsp -- package, available at . -- - source "sound/oss/dmasound/Kconfig" - - if !M68K -diff --git a/sound/core/sound.c b/sound/core/sound.c -index 812f91b..6c8ab48 100644 ---- a/sound/core/sound.c -+++ b/sound/core/sound.c -@@ -259,8 +259,9 @@ int snd_register_device_for_dev(int type, struct snd_card *card, int dev, - return minor; - } - snd_minors[minor] = preg; -- preg->dev = device_create(sound_class, device, MKDEV(major, minor), -- "%s", name); -+ preg->dev = device_create_drvdata(sound_class, device, -+ MKDEV(major, minor), -+ private_data, "%s", name); - if (IS_ERR(preg->dev)) { - snd_minors[minor] = NULL; - mutex_unlock(&sound_mutex); -@@ -269,9 +270,6 @@ int snd_register_device_for_dev(int type, struct snd_card *card, int dev, - return minor; - } - -- if (preg->dev) -- dev_set_drvdata(preg->dev, private_data); -- - mutex_unlock(&sound_mutex); - return 0; - } -diff --git a/sound/drivers/Kconfig b/sound/drivers/Kconfig -index 379bcb0..602b58e 100644 ---- a/sound/drivers/Kconfig -+++ b/sound/drivers/Kconfig -@@ -5,9 +5,10 @@ menu "Generic devices" - - - config SND_PCSP -- tristate "PC-Speaker support" -+ tristate "PC-Speaker support (READ HELP!)" - depends on PCSPKR_PLATFORM && X86_PC && HIGH_RES_TIMERS - depends on INPUT -+ depends on EXPERIMENTAL - depends on SND - select SND_PCM - help -@@ -18,11 +19,21 @@ config SND_PCSP - - You can compile this as a module which will be called snd-pcsp. - -+ WARNING: if you already have a soundcard, enabling this -+ driver may lead to a problem. Namely, it may get loaded -+ before the other sound driver of yours, making the -+ pc-speaker a default sound device. Which is likely not -+ what you want. To make this driver play nicely with other -+ sound driver, you can add this into your /etc/modprobe.conf: -+ options snd-pcsp index=2 -+ - You don't need this driver if you only want your pc-speaker to beep. - You don't need this driver if you have a tablet piezo beeper - in your PC instead of the real speaker. - -- It should not hurt to say Y or M here in all other cases. -+ Say N if you have a sound card. -+ Say M if you don't. -+ Say Y only if you really know what you do. - - config SND_MPU401_UART - tristate -diff --git a/sound/drivers/pcsp/pcsp.c b/sound/drivers/pcsp/pcsp.c -index 54a1f90..1899cf0 100644 ---- a/sound/drivers/pcsp/pcsp.c -+++ b/sound/drivers/pcsp/pcsp.c -@@ -96,7 +96,7 @@ static int __devinit snd_card_pcsp_probe(int devnum, struct device *dev) - return -EINVAL; - - hrtimer_init(&pcsp_chip.timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); -- pcsp_chip.timer.cb_mode = HRTIMER_CB_IRQSAFE; -+ pcsp_chip.timer.cb_mode = HRTIMER_CB_SOFTIRQ; - pcsp_chip.timer.function = pcsp_do_timer; - - card = snd_card_new(index, id, THIS_MODULE, 0); -diff --git a/sound/drivers/pcsp/pcsp_lib.c b/sound/drivers/pcsp/pcsp_lib.c -index ac6238e..e341f3f 100644 ---- a/sound/drivers/pcsp/pcsp_lib.c -+++ b/sound/drivers/pcsp/pcsp_lib.c -@@ -9,7 +9,6 @@ - #include - #include - #include --#include - #include - #include "pcsp.h" - -@@ -18,36 +17,12 @@ module_param(nforce_wa, bool, 0444); - MODULE_PARM_DESC(nforce_wa, "Apply NForce chipset workaround " - "(expect bad sound)"); - --static void pcsp_start_timer(unsigned long dummy) --{ -- hrtimer_start(&pcsp_chip.timer, ktime_set(0, 0), HRTIMER_MODE_REL); --} -- --/* -- * We need the hrtimer_start as a tasklet to avoid -- * the nasty locking problem. :( -- * The problem: -- * - The timer handler is called with the cpu_base->lock -- * already held by hrtimer code. -- * - snd_pcm_period_elapsed() takes the -- * substream->self_group.lock. -- * So far so good. -- * But the snd_pcsp_trigger() is called with the -- * substream->self_group.lock held, and it calls -- * hrtimer_start(), which takes the cpu_base->lock. -- * You see the problem. We have the code pathes -- * which take two locks in a reverse order. This -- * can deadlock and the lock validator complains. -- * The only solution I could find was to move the -- * hrtimer_start() into a tasklet. -stsp -- */ --static DECLARE_TASKLET(pcsp_start_timer_tasklet, pcsp_start_timer, 0); -+#define DMIX_WANTS_S16 1 - - enum hrtimer_restart pcsp_do_timer(struct hrtimer *handle) - { -- unsigned long flags; - unsigned char timer_cnt, val; -- int periods_elapsed; -+ int fmt_size, periods_elapsed; - u64 ns; - size_t period_bytes, buffer_bytes; - struct snd_pcm_substream *substream; -@@ -64,9 +39,7 @@ enum hrtimer_restart pcsp_do_timer(struct hrtimer *handle) - return HRTIMER_RESTART; - } - -- /* hrtimer calls us from both hardirq and softirq contexts, -- * so irqsave :( */ -- spin_lock_irqsave(&chip->substream_lock, flags); -+ spin_lock_irq(&chip->substream_lock); - /* Takashi Iwai says regarding this extra lock: - - If the irq handler handles some data on the DMA buffer, it should -@@ -92,8 +65,11 @@ enum hrtimer_restart pcsp_do_timer(struct hrtimer *handle) - goto exit_nr_unlock2; - - runtime = substream->runtime; -- /* assume it is u8 mono */ -- val = runtime->dma_area[chip->playback_ptr]; -+ fmt_size = snd_pcm_format_physical_width(runtime->format) >> 3; -+ /* assume it is mono! */ -+ val = runtime->dma_area[chip->playback_ptr + fmt_size - 1]; -+ if (snd_pcm_format_signed(runtime->format)) -+ val ^= 0x80; - timer_cnt = val * CUR_DIV() / 256; - - if (timer_cnt && chip->enable) { -@@ -111,12 +87,14 @@ enum hrtimer_restart pcsp_do_timer(struct hrtimer *handle) - - period_bytes = snd_pcm_lib_period_bytes(substream); - buffer_bytes = snd_pcm_lib_buffer_bytes(substream); -- chip->playback_ptr += PCSP_INDEX_INC(); -+ chip->playback_ptr += PCSP_INDEX_INC() * fmt_size; - periods_elapsed = chip->playback_ptr - chip->period_ptr; - if (periods_elapsed < 0) { -- printk(KERN_WARNING "PCSP: playback_ptr inconsistent " -+#if PCSP_DEBUG -+ printk(KERN_INFO "PCSP: buffer_bytes mod period_bytes != 0 ? " - "(%zi %zi %zi)\n", - chip->playback_ptr, period_bytes, buffer_bytes); -+#endif - periods_elapsed += buffer_bytes; - } - periods_elapsed /= period_bytes; -@@ -132,7 +110,7 @@ enum hrtimer_restart pcsp_do_timer(struct hrtimer *handle) - chip->period_ptr %= buffer_bytes; - } - -- spin_unlock_irqrestore(&chip->substream_lock, flags); -+ spin_unlock_irq(&chip->substream_lock); - - if (!atomic_read(&chip->timer_active)) - return HRTIMER_NORESTART; -@@ -146,7 +124,7 @@ enum hrtimer_restart pcsp_do_timer(struct hrtimer *handle) - exit_nr_unlock2: - snd_pcm_stream_unlock(substream); - exit_nr_unlock1: -- spin_unlock_irqrestore(&chip->substream_lock, flags); -+ spin_unlock_irq(&chip->substream_lock); - return HRTIMER_NORESTART; - } - -@@ -167,7 +145,7 @@ static void pcsp_start_playing(struct snd_pcsp *chip) - atomic_set(&chip->timer_active, 1); - chip->thalf = 0; - -- tasklet_schedule(&pcsp_start_timer_tasklet); -+ hrtimer_start(&pcsp_chip.timer, ktime_set(0, 0), HRTIMER_MODE_REL); - } - - static void pcsp_stop_playing(struct snd_pcsp *chip) -@@ -270,7 +248,11 @@ static struct snd_pcm_hardware snd_pcsp_playback = { - .info = (SNDRV_PCM_INFO_INTERLEAVED | - SNDRV_PCM_INFO_HALF_DUPLEX | - SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_MMAP_VALID), -- .formats = SNDRV_PCM_FMTBIT_U8, -+ .formats = (SNDRV_PCM_FMTBIT_U8 -+#if DMIX_WANTS_S16 -+ | SNDRV_PCM_FMTBIT_S16_LE -+#endif -+ ), - .rates = SNDRV_PCM_RATE_KNOT, - .rate_min = PCSP_DEFAULT_SRATE, - .rate_max = PCSP_DEFAULT_SRATE, -diff --git a/sound/oss/Kconfig b/sound/oss/Kconfig -index 857008b..3be2dc1 100644 ---- a/sound/oss/Kconfig -+++ b/sound/oss/Kconfig -@@ -79,7 +79,7 @@ config SOUND_TRIDENT - - config SOUND_MSNDCLAS - tristate "Support for Turtle Beach MultiSound Classic, Tahiti, Monterey" -- depends on SOUND_PRIME && (m || !STANDALONE) -+ depends on SOUND_PRIME && (m || !STANDALONE) && ISA - help - Say M here if you have a Turtle Beach MultiSound Classic, Tahiti or - Monterey (not for the Pinnacle or Fiji). -@@ -143,7 +143,7 @@ config MSNDCLAS_IO - - config SOUND_MSNDPIN - tristate "Support for Turtle Beach MultiSound Pinnacle, Fiji" -- depends on SOUND_PRIME && (m || !STANDALONE) -+ depends on SOUND_PRIME && (m || !STANDALONE) && ISA - help - Say M here if you have a Turtle Beach MultiSound Pinnacle or Fiji. - See for important information -diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c -index 6d4df45..864b2f5 100644 ---- a/sound/pci/hda/patch_realtek.c -+++ b/sound/pci/hda/patch_realtek.c -@@ -2981,7 +2981,7 @@ static struct snd_pci_quirk alc880_cfg_tbl[] = { - /* SND_PCI_QUIRK(0x1043, 0x1964, "ASUS", ALC880_ASUS_DIG), */ - SND_PCI_QUIRK(0x1043, 0x1973, "ASUS", ALC880_ASUS_DIG), - SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS", ALC880_ASUS_DIG), -- SND_PCI_QUIRK(0x1043, 0x814e, "ASUS", ALC880_ASUS), -+ SND_PCI_QUIRK(0x1043, 0x814e, "ASUS P5GD1 w/SPDIF", ALC880_6ST_DIG), - SND_PCI_QUIRK(0x1043, 0x8181, "ASUS P4GPL", ALC880_ASUS_DIG), - SND_PCI_QUIRK(0x1043, 0x8196, "ASUS P5GD1", ALC880_6ST), - SND_PCI_QUIRK(0x1043, 0x81b4, "ASUS", ALC880_6ST), -@@ -8757,35 +8757,39 @@ static struct hda_input_mux alc262_HP_D7000_capture_source = { - }, - }; - --/* mute/unmute internal speaker according to the hp jack and mute state */ -+/* mute/unmute internal speaker according to the hp jacks and mute state */ - static void alc262_fujitsu_automute(struct hda_codec *codec, int force) - { - struct alc_spec *spec = codec->spec; - unsigned int mute; - - if (force || !spec->sense_updated) { -- unsigned int present_int_hp, present_dock_hp; -+ unsigned int present; - /* need to execute and sync at first */ - snd_hda_codec_read(codec, 0x14, 0, AC_VERB_SET_PIN_SENSE, 0); -- present_int_hp = snd_hda_codec_read(codec, 0x14, 0, -- AC_VERB_GET_PIN_SENSE, 0); -- snd_hda_codec_read(codec, 0x1B, 0, AC_VERB_SET_PIN_SENSE, 0); -- present_dock_hp = snd_hda_codec_read(codec, 0x1b, 0, -- AC_VERB_GET_PIN_SENSE, 0); -- spec->jack_present = (present_int_hp & 0x80000000) != 0; -- spec->jack_present |= (present_dock_hp & 0x80000000) != 0; -+ /* check laptop HP jack */ -+ present = snd_hda_codec_read(codec, 0x14, 0, -+ AC_VERB_GET_PIN_SENSE, 0); -+ /* need to execute and sync at first */ -+ snd_hda_codec_read(codec, 0x1b, 0, AC_VERB_SET_PIN_SENSE, 0); -+ /* check docking HP jack */ -+ present |= snd_hda_codec_read(codec, 0x1b, 0, -+ AC_VERB_GET_PIN_SENSE, 0); -+ if (present & AC_PINSENSE_PRESENCE) -+ spec->jack_present = 1; -+ else -+ spec->jack_present = 0; - spec->sense_updated = 1; - } -- if (spec->jack_present) { -- /* mute internal speaker */ -- snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, -- HDA_AMP_MUTE, HDA_AMP_MUTE); -- } else { -- /* unmute internal speaker if necessary */ -+ /* unmute internal speaker only if both HPs are unplugged and -+ * master switch is on -+ */ -+ if (spec->jack_present) -+ mute = HDA_AMP_MUTE; -+ else - mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0); -- snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, -- HDA_AMP_MUTE, mute); -- } -+ snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, -+ HDA_AMP_MUTE, mute); - } - - /* unsolicited event for HP jack sensing */ -@@ -8797,6 +8801,11 @@ static void alc262_fujitsu_unsol_event(struct hda_codec *codec, - alc262_fujitsu_automute(codec, 1); - } - -+static void alc262_fujitsu_init_hook(struct hda_codec *codec) -+{ -+ alc262_fujitsu_automute(codec, 1); -+} -+ - /* bind volumes of both NID 0x0c and 0x0d */ - static struct hda_bind_ctls alc262_fujitsu_bind_master_vol = { - .ops = &snd_hda_bind_vol, -@@ -9570,6 +9579,7 @@ static struct alc_config_preset alc262_presets[] = { - .channel_mode = alc262_modes, - .input_mux = &alc262_fujitsu_capture_source, - .unsol_event = alc262_fujitsu_unsol_event, -+ .init_hook = alc262_fujitsu_init_hook, - }, - [ALC262_HP_BPC] = { - .mixers = { alc262_HP_BPC_mixer }, -diff --git a/sound/usb/caiaq/caiaq-device.c b/sound/usb/caiaq/caiaq-device.c -index e97d8b2..a972f77 100644 ---- a/sound/usb/caiaq/caiaq-device.c -+++ b/sound/usb/caiaq/caiaq-device.c -@@ -351,8 +351,8 @@ static struct snd_card* create_card(struct usb_device* usb_dev) - dev = caiaqdev(card); - dev->chip.dev = usb_dev; - dev->chip.card = card; -- dev->chip.usb_id = USB_ID(usb_dev->descriptor.idVendor, -- usb_dev->descriptor.idProduct); -+ dev->chip.usb_id = USB_ID(le16_to_cpu(usb_dev->descriptor.idVendor), -+ le16_to_cpu(usb_dev->descriptor.idProduct)); - spin_lock_init(&dev->spinlock); - snd_card_set_dev(card, &usb_dev->dev); - -diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c -index f7ba099..2d29e26 100644 ---- a/virt/kvm/kvm_main.c -+++ b/virt/kvm/kvm_main.c -@@ -758,25 +758,26 @@ void mark_page_dirty(struct kvm *kvm, gfn_t gfn) - */ - void kvm_vcpu_block(struct kvm_vcpu *vcpu) - { -- DECLARE_WAITQUEUE(wait, current); -- -- add_wait_queue(&vcpu->wq, &wait); -- -- /* -- * We will block until either an interrupt or a signal wakes us up -- */ -- while (!kvm_cpu_has_interrupt(vcpu) -- && !kvm_cpu_has_pending_timer(vcpu) -- && !signal_pending(current) -- && !kvm_arch_vcpu_runnable(vcpu)) { -- set_current_state(TASK_INTERRUPTIBLE); -+ DEFINE_WAIT(wait); -+ -+ for (;;) { -+ prepare_to_wait(&vcpu->wq, &wait, TASK_INTERRUPTIBLE); -+ -+ if (kvm_cpu_has_interrupt(vcpu)) -+ break; -+ if (kvm_cpu_has_pending_timer(vcpu)) -+ break; -+ if (kvm_arch_vcpu_runnable(vcpu)) -+ break; -+ if (signal_pending(current)) -+ break; -+ - vcpu_put(vcpu); - schedule(); - vcpu_load(vcpu); - } - -- __set_current_state(TASK_RUNNING); -- remove_wait_queue(&vcpu->wq, &wait); -+ finish_wait(&vcpu->wq, &wait); - } - - void kvm_resched(struct kvm_vcpu *vcpu) diff --git a/debian/patches/series/1~experimental.1 b/debian/patches/series/1~experimental.1 index 8534f8fe6..5300f7a50 100644 --- a/debian/patches/series/1~experimental.1 +++ b/debian/patches/series/1~experimental.1 @@ -1,4 +1,4 @@ -+ bugfix/all/patch-2.6.26-rc3-git7 +#+ bugfix/all/patch-2.6.26-rc3-git7 + debian/version.patch + debian/kernelvariables.patch + debian/doc-build-parallel.patch