Browse Source

Merge ../linux-2.6

Paul Mackerras 20 years ago
parent
commit
26925c5910
56 changed files with 485 additions and 452 deletions
  1. 19 1
      MAINTAINERS
  2. 0 7
      arch/i386/kernel/process.c
  3. 2 2
      arch/i386/pci/common.c
  4. 1 1
      arch/i386/pci/direct.c
  5. 5 2
      arch/i386/pci/i386.c
  6. 0 7
      arch/ia64/kernel/process.c
  7. 0 1
      arch/powerpc/kernel/process.c
  8. 0 4
      arch/powerpc/mm/4xx_mmu.c
  9. 4 6
      arch/powerpc/mm/hugetlbpage.c
  10. 1 1
      arch/powerpc/mm/mem.c
  11. 6 0
      arch/powerpc/mm/tlb_32.c
  12. 2 2
      arch/powerpc/mm/tlb_64.c
  13. 0 7
      arch/x86_64/kernel/process.c
  14. 9 12
      drivers/base/bus.c
  15. 3 5
      drivers/base/dd.c
  16. 0 6
      drivers/block/floppy.c
  17. 1 1
      drivers/char/drm/drm_memory.c
  18. 1 1
      drivers/char/drm/drm_memory_debug.h
  19. 1 1
      drivers/char/drm/mga_drv.c
  20. 1 2
      drivers/char/drm/radeon_drv.h
  21. 1 1
      drivers/hwmon/hdaps.c
  22. 7 0
      drivers/hwmon/it87.c
  23. 1 1
      drivers/hwmon/lm78.c
  24. 6 2
      drivers/hwmon/w83627hf.c
  25. 0 1
      drivers/pci/hotplug/pciehp.h
  26. 2 13
      drivers/pci/hotplug/pciehp_ctrl.c
  27. 9 1
      drivers/pci/hotplug/pciehp_hpc.c
  28. 1 0
      drivers/pci/pci-acpi.c
  29. 36 2
      drivers/usb/core/hcd-pci.c
  30. 0 1
      drivers/usb/core/hub.c
  31. 84 76
      drivers/usb/host/ehci-hcd.c
  32. 7 0
      drivers/usb/host/ehci-hub.c
  33. 170 189
      drivers/usb/host/ehci-pci.c
  34. 0 36
      drivers/usb/host/ohci-pci.c
  35. 1 1
      drivers/usb/media/sn9c102_core.c
  36. 2 0
      drivers/usb/serial/ftdi_sio.c
  37. 7 0
      drivers/usb/serial/ftdi_sio.h
  38. 0 1
      drivers/usb/serial/ipw.c
  39. 9 0
      drivers/usb/storage/unusual_devs.h
  40. 5 1
      drivers/video/fbmem.c
  41. 4 4
      fs/exec.c
  42. 4 4
      fs/jffs2/debug.h
  43. 5 2
      include/asm-alpha/atomic.h
  44. 1 1
      include/asm-arm/arch-iop3xx/timex.h
  45. 3 3
      include/asm-powerpc/page_64.h
  46. 1 0
      include/asm-sparc64/atomic.h
  47. 38 13
      include/asm-x86_64/atomic.h
  48. 1 7
      include/linux/smp.h
  49. 1 0
      include/linux/usb.h
  50. 0 15
      kernel/futex.c
  51. 15 0
      kernel/irq/manage.c
  52. 1 1
      kernel/printk.c
  53. 2 4
      mm/Kconfig
  54. 3 3
      mm/truncate.c
  55. 1 0
      net/bridge/br_if.c
  56. 1 0
      net/ipv4/netfilter/ip_conntrack_netlink.c

+ 19 - 1
MAINTAINERS

@@ -58,7 +58,7 @@ P: Person
 M: Mail patches to
 M: Mail patches to
 L: Mailing list that is relevant to this area
 L: Mailing list that is relevant to this area
 W: Web-page with status/info
 W: Web-page with status/info
-T: SCM tree type and URL.  Type is one of: git, hg, quilt.
+T: SCM tree type and location.  Type is one of: git, hg, quilt.
 S: Status, one of the following:
 S: Status, one of the following:
 
 
 	Supported:	Someone is actually paid to look after this.
 	Supported:	Someone is actually paid to look after this.
@@ -227,6 +227,7 @@ AGPGART DRIVER
 P:	Dave Jones
 P:	Dave Jones
 M:	davej@codemonkey.org.uk
 M:	davej@codemonkey.org.uk
 W:	http://www.codemonkey.org.uk/projects/agp/
 W:	http://www.codemonkey.org.uk/projects/agp/
+T:	git kernel.org:/pub/scm/linux/kernel/git/davej/agpgart.git
 S:	Maintained
 S:	Maintained
 
 
 AHA152X SCSI DRIVER
 AHA152X SCSI DRIVER
@@ -384,6 +385,7 @@ P:	David Woodhouse
 M:	dwmw2@infradead.org
 M:	dwmw2@infradead.org
 L:	linux-audit@redhat.com
 L:	linux-audit@redhat.com
 W:	http://people.redhat.com/sgrubb/audit/
 W:	http://people.redhat.com/sgrubb/audit/
+T:	git kernel.org:/pub/scm/linux/kernel/git/dwmw2/audit-2.6.git
 S:	Maintained
 S:	Maintained
 
 
 AX.25 NETWORK LAYER
 AX.25 NETWORK LAYER
@@ -432,6 +434,7 @@ L:	bluez-devel@lists.sf.net
 W:	http://bluez.sf.net
 W:	http://bluez.sf.net
 W:	http://www.bluez.org
 W:	http://www.bluez.org
 W:	http://www.holtmann.org/linux/bluetooth/
 W:	http://www.holtmann.org/linux/bluetooth/
+T:	git kernel.org:/pub/scm/linux/kernel/git/holtmann/bluetooth-2.6.git
 S:	Maintained
 S:	Maintained
 
 
 BLUETOOTH RFCOMM LAYER
 BLUETOOTH RFCOMM LAYER
@@ -547,6 +550,7 @@ P:	Steve French
 M:	sfrench@samba.org
 M:	sfrench@samba.org
 L:	samba-technical@lists.samba.org
 L:	samba-technical@lists.samba.org
 W:	http://us1.samba.org/samba/Linux_CIFS_client.html
 W:	http://us1.samba.org/samba/Linux_CIFS_client.html
+T:	git kernel.org:/pub/scm/linux/kernel/git/sfrench/cifs-2.6.git
 S:	Supported	
 S:	Supported	
 
 
 CIRRUS LOGIC GENERIC FBDEV DRIVER
 CIRRUS LOGIC GENERIC FBDEV DRIVER
@@ -608,6 +612,7 @@ P:	Dave Jones
 M:	davej@codemonkey.org.uk
 M:	davej@codemonkey.org.uk
 L:	cpufreq@lists.linux.org.uk
 L:	cpufreq@lists.linux.org.uk
 W:	http://www.codemonkey.org.uk/projects/cpufreq/
 W:	http://www.codemonkey.org.uk/projects/cpufreq/
+T:	git kernel.org/pub/scm/linux/kernel/davej/cpufreq.git
 S:	Maintained
 S:	Maintained
 
 
 CPUID/MSR DRIVER
 CPUID/MSR DRIVER
@@ -641,6 +646,7 @@ M:	herbert@gondor.apana.org.au
 P:	David S. Miller
 P:	David S. Miller
 M:	davem@davemloft.net
 M:	davem@davemloft.net
 L:	linux-crypto@vger.kernel.org
 L:	linux-crypto@vger.kernel.org
+T:	git kernel.org:/pub/scm/linux/kernel/git/herbert/crypto-2.6.git
 S:	Maintained
 S:	Maintained
 
 
 CYBERPRO FB DRIVER
 CYBERPRO FB DRIVER
@@ -1185,6 +1191,7 @@ P:	Bartlomiej Zolnierkiewicz
 M:	B.Zolnierkiewicz@elka.pw.edu.pl
 M:	B.Zolnierkiewicz@elka.pw.edu.pl
 L:	linux-kernel@vger.kernel.org
 L:	linux-kernel@vger.kernel.org
 L:	linux-ide@vger.kernel.org
 L:	linux-ide@vger.kernel.org
+T:	git kernel.org:/pub/scm/linux/kernel/git/bart/ide-2.6.git
 S:	Maintained
 S:	Maintained
 
 
 IDE/ATAPI CDROM DRIVER
 IDE/ATAPI CDROM DRIVER
@@ -1279,6 +1286,7 @@ P:	Vojtech Pavlik
 M:	vojtech@suse.cz
 M:	vojtech@suse.cz
 L:	linux-input@atrey.karlin.mff.cuni.cz
 L:	linux-input@atrey.karlin.mff.cuni.cz
 L:	linux-joystick@atrey.karlin.mff.cuni.cz
 L:	linux-joystick@atrey.karlin.mff.cuni.cz
+T:	git kernel.org:/pub/scm/linux/kernel/git/dtor/input.git
 S:	Maintained
 S:	Maintained
 
 
 INOTIFY
 INOTIFY
@@ -1392,6 +1400,7 @@ P:	Kai Germaschewski
 M:	kai.germaschewski@gmx.de
 M:	kai.germaschewski@gmx.de
 L:	isdn4linux@listserv.isdn4linux.de
 L:	isdn4linux@listserv.isdn4linux.de
 W:	http://www.isdn4linux.de
 W:	http://www.isdn4linux.de
+T:	git kernel.org:/pub/scm/linux/kernel/kkeil/isdn-2.6.git
 S:	Maintained
 S:	Maintained
 
 
 ISDN SUBSYSTEM (Eicon active card driver)
 ISDN SUBSYSTEM (Eicon active card driver)
@@ -1420,6 +1429,7 @@ P:	Dave Kleikamp
 M:	shaggy@austin.ibm.com
 M:	shaggy@austin.ibm.com
 L:	jfs-discussion@lists.sourceforge.net
 L:	jfs-discussion@lists.sourceforge.net
 W:	http://jfs.sourceforge.net/
 W:	http://jfs.sourceforge.net/
+T:	git kernel.org:/pub/scm/linux/kernel/git/shaggy/jfs-2.6.git
 S:	Supported
 S:	Supported
 
 
 KCONFIG
 KCONFIG
@@ -1534,6 +1544,7 @@ P:	Paul Mackerras
 M:	paulus@samba.org
 M:	paulus@samba.org
 W:	http://www.penguinppc.org/
 W:	http://www.penguinppc.org/
 L:	linuxppc-dev@ozlabs.org
 L:	linuxppc-dev@ozlabs.org
+T:	git kernel.org:/pub/scm/linux/kernel/git/paulus/powerpc.git
 S:	Supported
 S:	Supported
 
 
 LINUX FOR POWER MACINTOSH
 LINUX FOR POWER MACINTOSH
@@ -1601,6 +1612,7 @@ P:	Chris Wright
 M:	chrisw@osdl.org
 M:	chrisw@osdl.org
 L:	linux-security-module@wirex.com
 L:	linux-security-module@wirex.com
 W:	http://lsm.immunix.org
 W:	http://lsm.immunix.org
+T:	git kernel.org:/pub/scm/linux/kernel/git/chrisw/lsm-2.6.git
 S:	Supported
 S:	Supported
 
 
 LM83 HARDWARE MONITOR DRIVER
 LM83 HARDWARE MONITOR DRIVER
@@ -1695,6 +1707,7 @@ P:	David Woodhouse
 M:	dwmw2@infradead.org
 M:	dwmw2@infradead.org
 W:	http://www.linux-mtd.infradead.org/
 W:	http://www.linux-mtd.infradead.org/
 L:	linux-mtd@lists.infradead.org
 L:	linux-mtd@lists.infradead.org
+T:	git kernel.org:/pub/scm/linux/kernel/git/tglx/mtd-2.6.git
 S:	Maintained
 S:	Maintained
 
 
 MICROTEK X6 SCANNER
 MICROTEK X6 SCANNER
@@ -1815,6 +1828,7 @@ M:	yoshfuji@linux-ipv6.org
 P:	Patrick McHardy
 P:	Patrick McHardy
 M:	kaber@coreworks.de
 M:	kaber@coreworks.de
 L:	netdev@vger.kernel.org
 L:	netdev@vger.kernel.org
+T:	git kernel.org:/pub/scm/linux/kernel/davem/net-2.6.git
 S:	Maintained
 S:	Maintained
 
 
 IPVS
 IPVS
@@ -1866,6 +1880,7 @@ M:	aia21@cantab.net
 L:	linux-ntfs-dev@lists.sourceforge.net
 L:	linux-ntfs-dev@lists.sourceforge.net
 L:	linux-kernel@vger.kernel.org
 L:	linux-kernel@vger.kernel.org
 W:	http://linux-ntfs.sf.net/
 W:	http://linux-ntfs.sf.net/
+T:	git kernel.org:/pub/scm/linux/kernel/git/aia21/ntfs-2.6.git
 S:	Maintained
 S:	Maintained
 
 
 NVIDIA (RIVA) FRAMEBUFFER DRIVER
 NVIDIA (RIVA) FRAMEBUFFER DRIVER
@@ -2389,6 +2404,7 @@ P:	Anton Blanchard
 M:	anton@samba.org
 M:	anton@samba.org
 L:	sparclinux@vger.kernel.org
 L:	sparclinux@vger.kernel.org
 L:	ultralinux@vger.kernel.org
 L:	ultralinux@vger.kernel.org
+T:	git kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6.git
 S:	Maintained
 S:	Maintained
 
 
 SHARP LH SUPPORT (LH7952X & LH7A40X)
 SHARP LH SUPPORT (LH7952X & LH7A40X)
@@ -2527,6 +2543,7 @@ P:      Adrian Bunk
 M:      trivial@kernel.org
 M:      trivial@kernel.org
 L:      linux-kernel@vger.kernel.org
 L:      linux-kernel@vger.kernel.org
 W:      http://www.kernel.org/pub/linux/kernel/people/bunk/trivial/
 W:      http://www.kernel.org/pub/linux/kernel/people/bunk/trivial/
+T:      git kernel.org:/pub/scm/linux/kernel/git/bunk/trivial.git
 S:      Maintained
 S:      Maintained
 
 
 TMS380 TOKEN-RING NETWORK DRIVER
 TMS380 TOKEN-RING NETWORK DRIVER
@@ -2860,6 +2877,7 @@ P:      Latchesar Ionkov
 M:      lucho@ionkov.net
 M:      lucho@ionkov.net
 L:      v9fs-developer@lists.sourceforge.net
 L:      v9fs-developer@lists.sourceforge.net
 W:      http://v9fs.sf.net
 W:      http://v9fs.sf.net
+T:      git kernel.org:/pub/scm/linux/kernel/ericvh/v9fs-devel.git
 S:      Maintained
 S:      Maintained
 
 
 VIDEO FOR LINUX
 VIDEO FOR LINUX

+ 0 - 7
arch/i386/kernel/process.c

@@ -393,13 +393,6 @@ void flush_thread(void)
 {
 {
 	struct task_struct *tsk = current;
 	struct task_struct *tsk = current;
 
 
-	/*
-	 * Remove function-return probe instances associated with this task
-	 * and put them back on the free list. Do not insert an exit probe for
-	 * this function, it will be disabled by kprobe_flush_task if you do.
-	 */
-	kprobe_flush_task(tsk);
-
 	memset(tsk->thread.debugreg, 0, sizeof(unsigned long)*8);
 	memset(tsk->thread.debugreg, 0, sizeof(unsigned long)*8);
 	memset(tsk->thread.tls_array, 0, sizeof(tsk->thread.tls_array));	
 	memset(tsk->thread.tls_array, 0, sizeof(tsk->thread.tls_array));	
 	/*
 	/*

+ 2 - 2
arch/i386/pci/common.c

@@ -132,7 +132,7 @@ struct pci_bus * __devinit pcibios_scan_root(int busnum)
 		}
 		}
 	}
 	}
 
 
-	printk("PCI: Probing PCI hardware (bus %02x)\n", busnum);
+	printk(KERN_DEBUG "PCI: Probing PCI hardware (bus %02x)\n", busnum);
 
 
 	return pci_scan_bus_parented(NULL, busnum, &pci_root_ops, NULL);
 	return pci_scan_bus_parented(NULL, busnum, &pci_root_ops, NULL);
 }
 }
@@ -144,7 +144,7 @@ static int __init pcibios_init(void)
 	struct cpuinfo_x86 *c = &boot_cpu_data;
 	struct cpuinfo_x86 *c = &boot_cpu_data;
 
 
 	if (!raw_pci_ops) {
 	if (!raw_pci_ops) {
-		printk("PCI: System does not support PCI\n");
+		printk(KERN_WARNING "PCI: System does not support PCI\n");
 		return 0;
 		return 0;
 	}
 	}
 
 

+ 1 - 1
arch/i386/pci/direct.c

@@ -201,7 +201,7 @@ static int __init pci_sanity_check(struct pci_raw_ops *o)
 			return 1;
 			return 1;
 	}
 	}
 
 
-	DBG("PCI: Sanity check failed\n");
+	DBG(KERN_WARNING "PCI: Sanity check failed\n");
 	return 0;
 	return 0;
 }
 }
 
 

+ 5 - 2
arch/i386/pci/i386.c

@@ -221,6 +221,11 @@ int pcibios_enable_resources(struct pci_dev *dev, int mask)
 			continue;
 			continue;
 
 
 		r = &dev->resource[idx];
 		r = &dev->resource[idx];
+		if (!(r->flags & (IORESOURCE_IO | IORESOURCE_MEM)))
+			continue;
+		if ((idx == PCI_ROM_RESOURCE) &&
+				(!(r->flags & IORESOURCE_ROM_ENABLE)))
+			continue;
 		if (!r->start && r->end) {
 		if (!r->start && r->end) {
 			printk(KERN_ERR "PCI: Device %s not available because of resource collisions\n", pci_name(dev));
 			printk(KERN_ERR "PCI: Device %s not available because of resource collisions\n", pci_name(dev));
 			return -EINVAL;
 			return -EINVAL;
@@ -230,8 +235,6 @@ int pcibios_enable_resources(struct pci_dev *dev, int mask)
 		if (r->flags & IORESOURCE_MEM)
 		if (r->flags & IORESOURCE_MEM)
 			cmd |= PCI_COMMAND_MEMORY;
 			cmd |= PCI_COMMAND_MEMORY;
 	}
 	}
-	if (dev->resource[PCI_ROM_RESOURCE].start)
-		cmd |= PCI_COMMAND_MEMORY;
 	if (cmd != old_cmd) {
 	if (cmd != old_cmd) {
 		printk("PCI: Enabling device %s (%04x -> %04x)\n", pci_name(dev), old_cmd, cmd);
 		printk("PCI: Enabling device %s (%04x -> %04x)\n", pci_name(dev), old_cmd, cmd);
 		pci_write_config_word(dev, PCI_COMMAND, cmd);
 		pci_write_config_word(dev, PCI_COMMAND, cmd);

+ 0 - 7
arch/ia64/kernel/process.c

@@ -718,13 +718,6 @@ kernel_thread_helper (int (*fn)(void *), void *arg)
 void
 void
 flush_thread (void)
 flush_thread (void)
 {
 {
-	/*
-	 * Remove function-return probe instances associated with this task
-	 * and put them back on the free list. Do not insert an exit probe for
-	 * this function, it will be disabled by kprobe_flush_task if you do.
-	 */
-	kprobe_flush_task(current);
-
 	/* drop floating-point and debug-register state if it exists: */
 	/* drop floating-point and debug-register state if it exists: */
 	current->thread.flags &= ~(IA64_THREAD_FPH_VALID | IA64_THREAD_DBG_VALID);
 	current->thread.flags &= ~(IA64_THREAD_FPH_VALID | IA64_THREAD_DBG_VALID);
 	ia64_drop_fpu(current);
 	ia64_drop_fpu(current);

+ 0 - 1
arch/powerpc/kernel/process.c

@@ -457,7 +457,6 @@ void flush_thread(void)
 	if (t->flags & _TIF_ABI_PENDING)
 	if (t->flags & _TIF_ABI_PENDING)
 		t->flags ^= (_TIF_ABI_PENDING | _TIF_32BIT);
 		t->flags ^= (_TIF_ABI_PENDING | _TIF_32BIT);
 #endif
 #endif
-	kprobe_flush_task(current);
 
 
 #ifndef CONFIG_SMP
 #ifndef CONFIG_SMP
 	if (last_task_used_math == current)
 	if (last_task_used_math == current)

+ 0 - 4
arch/powerpc/mm/4xx_mmu.c

@@ -110,13 +110,11 @@ unsigned long __init mmu_mapin_ram(void)
 		pmd_t *pmdp;
 		pmd_t *pmdp;
 		unsigned long val = p | _PMD_SIZE_16M | _PAGE_HWEXEC | _PAGE_HWWRITE;
 		unsigned long val = p | _PMD_SIZE_16M | _PAGE_HWEXEC | _PAGE_HWWRITE;
 
 
-		spin_lock(&init_mm.page_table_lock);
 		pmdp = pmd_offset(pgd_offset_k(v), v);
 		pmdp = pmd_offset(pgd_offset_k(v), v);
 		pmd_val(*pmdp++) = val;
 		pmd_val(*pmdp++) = val;
 		pmd_val(*pmdp++) = val;
 		pmd_val(*pmdp++) = val;
 		pmd_val(*pmdp++) = val;
 		pmd_val(*pmdp++) = val;
 		pmd_val(*pmdp++) = val;
 		pmd_val(*pmdp++) = val;
-		spin_unlock(&init_mm.page_table_lock);
 
 
 		v += LARGE_PAGE_SIZE_16M;
 		v += LARGE_PAGE_SIZE_16M;
 		p += LARGE_PAGE_SIZE_16M;
 		p += LARGE_PAGE_SIZE_16M;
@@ -127,10 +125,8 @@ unsigned long __init mmu_mapin_ram(void)
 		pmd_t *pmdp;
 		pmd_t *pmdp;
 		unsigned long val = p | _PMD_SIZE_4M | _PAGE_HWEXEC | _PAGE_HWWRITE;
 		unsigned long val = p | _PMD_SIZE_4M | _PAGE_HWEXEC | _PAGE_HWWRITE;
 
 
-		spin_lock(&init_mm.page_table_lock);
 		pmdp = pmd_offset(pgd_offset_k(v), v);
 		pmdp = pmd_offset(pgd_offset_k(v), v);
 		pmd_val(*pmdp) = val;
 		pmd_val(*pmdp) = val;
-		spin_unlock(&init_mm.page_table_lock);
 
 
 		v += LARGE_PAGE_SIZE_4M;
 		v += LARGE_PAGE_SIZE_4M;
 		p += LARGE_PAGE_SIZE_4M;
 		p += LARGE_PAGE_SIZE_4M;

+ 4 - 6
arch/powerpc/mm/hugetlbpage.c

@@ -287,15 +287,15 @@ static int open_high_hpage_areas(struct mm_struct *mm, u16 newareas)
 
 
 int prepare_hugepage_range(unsigned long addr, unsigned long len)
 int prepare_hugepage_range(unsigned long addr, unsigned long len)
 {
 {
-	int err;
+	int err = 0;
 
 
 	if ( (addr+len) < addr )
 	if ( (addr+len) < addr )
 		return -EINVAL;
 		return -EINVAL;
 
 
-	if ((addr + len) < 0x100000000UL)
+	if (addr < 0x100000000UL)
 		err = open_low_hpage_areas(current->mm,
 		err = open_low_hpage_areas(current->mm,
 					  LOW_ESID_MASK(addr, len));
 					  LOW_ESID_MASK(addr, len));
-	else
+	if ((addr + len) >= 0x100000000UL)
 		err = open_high_hpage_areas(current->mm,
 		err = open_high_hpage_areas(current->mm,
 					    HTLB_AREA_MASK(addr, len));
 					    HTLB_AREA_MASK(addr, len));
 	if (err) {
 	if (err) {
@@ -754,9 +754,7 @@ repeat:
 	}
 	}
 
 
 	/*
 	/*
-	 * No need to use ldarx/stdcx here because all who
-	 * might be updating the pte will hold the
-	 * page_table_lock
+	 * No need to use ldarx/stdcx here
 	 */
 	 */
 	*ptep = __pte(new_pte & ~_PAGE_BUSY);
 	*ptep = __pte(new_pte & ~_PAGE_BUSY);
 
 

+ 1 - 1
arch/powerpc/mm/mem.c

@@ -495,7 +495,7 @@ EXPORT_SYMBOL(flush_icache_user_range);
  * We use it to preload an HPTE into the hash table corresponding to
  * We use it to preload an HPTE into the hash table corresponding to
  * the updated linux PTE.
  * the updated linux PTE.
  * 
  * 
- * This must always be called with the mm->page_table_lock held
+ * This must always be called with the pte lock held.
  */
  */
 void update_mmu_cache(struct vm_area_struct *vma, unsigned long address,
 void update_mmu_cache(struct vm_area_struct *vma, unsigned long address,
 		      pte_t pte)
 		      pte_t pte)

+ 6 - 0
arch/powerpc/mm/tlb_32.c

@@ -149,6 +149,12 @@ void flush_tlb_mm(struct mm_struct *mm)
 		return;
 		return;
 	}
 	}
 
 
+	/*
+	 * It is safe to go down the mm's list of vmas when called
+	 * from dup_mmap, holding mmap_sem.  It would also be safe from
+	 * unmap_region or exit_mmap, but not from vmtruncate on SMP -
+	 * but it seems dup_mmap is the only SMP case which gets here.
+	 */
 	for (mp = mm->mmap; mp != NULL; mp = mp->vm_next)
 	for (mp = mm->mmap; mp != NULL; mp = mp->vm_next)
 		flush_range(mp->vm_mm, mp->vm_start, mp->vm_end);
 		flush_range(mp->vm_mm, mp->vm_start, mp->vm_end);
 	FINISH_FLUSH;
 	FINISH_FLUSH;

+ 2 - 2
arch/powerpc/mm/tlb_64.c

@@ -95,7 +95,7 @@ static void pte_free_submit(struct pte_freelist_batch *batch)
 
 
 void pgtable_free_tlb(struct mmu_gather *tlb, pgtable_free_t pgf)
 void pgtable_free_tlb(struct mmu_gather *tlb, pgtable_free_t pgf)
 {
 {
-	/* This is safe as we are holding page_table_lock */
+	/* This is safe since tlb_gather_mmu has disabled preemption */
         cpumask_t local_cpumask = cpumask_of_cpu(smp_processor_id());
         cpumask_t local_cpumask = cpumask_of_cpu(smp_processor_id());
 	struct pte_freelist_batch **batchp = &__get_cpu_var(pte_freelist_cur);
 	struct pte_freelist_batch **batchp = &__get_cpu_var(pte_freelist_cur);
 
 
@@ -206,7 +206,7 @@ void __flush_tlb_pending(struct ppc64_tlb_batch *batch)
 
 
 void pte_free_finish(void)
 void pte_free_finish(void)
 {
 {
-	/* This is safe as we are holding page_table_lock */
+	/* This is safe since tlb_gather_mmu has disabled preemption */
 	struct pte_freelist_batch **batchp = &__get_cpu_var(pte_freelist_cur);
 	struct pte_freelist_batch **batchp = &__get_cpu_var(pte_freelist_cur);
 
 
 	if (*batchp == NULL)
 	if (*batchp == NULL)

+ 0 - 7
arch/x86_64/kernel/process.c

@@ -351,13 +351,6 @@ void flush_thread(void)
 	struct task_struct *tsk = current;
 	struct task_struct *tsk = current;
 	struct thread_info *t = current_thread_info();
 	struct thread_info *t = current_thread_info();
 
 
-	/*
-	 * Remove function-return probe instances associated with this task
-	 * and put them back on the free list. Do not insert an exit probe for
-	 * this function, it will be disabled by kprobe_flush_task if you do.
-	 */
-	kprobe_flush_task(tsk);
-
 	if (t->flags & _TIF_ABI_PENDING)
 	if (t->flags & _TIF_ABI_PENDING)
 		t->flags ^= (_TIF_ABI_PENDING | _TIF_IA32);
 		t->flags ^= (_TIF_ABI_PENDING | _TIF_IA32);
 
 

+ 9 - 12
drivers/base/bus.c

@@ -133,7 +133,7 @@ static struct kobj_type ktype_bus = {
 decl_subsys(bus, &ktype_bus, NULL);
 decl_subsys(bus, &ktype_bus, NULL);
 
 
 
 
-/* Manually detach a device from it's associated driver. */
+/* Manually detach a device from its associated driver. */
 static int driver_helper(struct device *dev, void *data)
 static int driver_helper(struct device *dev, void *data)
 {
 {
 	const char *name = data;
 	const char *name = data;
@@ -151,14 +151,13 @@ static ssize_t driver_unbind(struct device_driver *drv,
 	int err = -ENODEV;
 	int err = -ENODEV;
 
 
 	dev = bus_find_device(bus, NULL, (void *)buf, driver_helper);
 	dev = bus_find_device(bus, NULL, (void *)buf, driver_helper);
-	if ((dev) &&
-	    (dev->driver == drv)) {
+	if (dev && dev->driver == drv) {
 		device_release_driver(dev);
 		device_release_driver(dev);
 		err = count;
 		err = count;
 	}
 	}
-	if (err)
-		return err;
-	return count;
+	put_device(dev);
+	put_bus(bus);
+	return err;
 }
 }
 static DRIVER_ATTR(unbind, S_IWUSR, NULL, driver_unbind);
 static DRIVER_ATTR(unbind, S_IWUSR, NULL, driver_unbind);
 
 
@@ -175,16 +174,14 @@ static ssize_t driver_bind(struct device_driver *drv,
 	int err = -ENODEV;
 	int err = -ENODEV;
 
 
 	dev = bus_find_device(bus, NULL, (void *)buf, driver_helper);
 	dev = bus_find_device(bus, NULL, (void *)buf, driver_helper);
-	if ((dev) &&
-	    (dev->driver == NULL)) {
+	if (dev && dev->driver == NULL) {
 		down(&dev->sem);
 		down(&dev->sem);
 		err = driver_probe_device(drv, dev);
 		err = driver_probe_device(drv, dev);
 		up(&dev->sem);
 		up(&dev->sem);
-		put_device(dev);
 	}
 	}
-	if (err)
-		return err;
-	return count;
+	put_device(dev);
+	put_bus(bus);
+	return err;
 }
 }
 static DRIVER_ATTR(bind, S_IWUSR, NULL, driver_bind);
 static DRIVER_ATTR(bind, S_IWUSR, NULL, driver_bind);
 
 

+ 3 - 5
drivers/base/dd.c

@@ -62,7 +62,6 @@ void device_bind_driver(struct device * dev)
  *	because we don't know the format of the ID structures, nor what
  *	because we don't know the format of the ID structures, nor what
  *	is to be considered a match and what is not.
  *	is to be considered a match and what is not.
  *
  *
- *
  *	This function returns 1 if a match is found, an error if one
  *	This function returns 1 if a match is found, an error if one
  *	occurs (that is not -ENODEV or -ENXIO), and 0 otherwise.
  *	occurs (that is not -ENODEV or -ENXIO), and 0 otherwise.
  *
  *
@@ -158,7 +157,6 @@ static int __driver_attach(struct device * dev, void * data)
 		driver_probe_device(drv, dev);
 		driver_probe_device(drv, dev);
 	up(&dev->sem);
 	up(&dev->sem);
 
 
-
 	return 0;
 	return 0;
 }
 }
 
 
@@ -225,15 +223,15 @@ void driver_detach(struct device_driver * drv)
 	struct device * dev;
 	struct device * dev;
 
 
 	for (;;) {
 	for (;;) {
-		spin_lock_irq(&drv->klist_devices.k_lock);
+		spin_lock(&drv->klist_devices.k_lock);
 		if (list_empty(&drv->klist_devices.k_list)) {
 		if (list_empty(&drv->klist_devices.k_list)) {
-			spin_unlock_irq(&drv->klist_devices.k_lock);
+			spin_unlock(&drv->klist_devices.k_lock);
 			break;
 			break;
 		}
 		}
 		dev = list_entry(drv->klist_devices.k_list.prev,
 		dev = list_entry(drv->klist_devices.k_list.prev,
 				struct device, knode_driver.n_node);
 				struct device, knode_driver.n_node);
 		get_device(dev);
 		get_device(dev);
-		spin_unlock_irq(&drv->klist_devices.k_lock);
+		spin_unlock(&drv->klist_devices.k_lock);
 
 
 		down(&dev->sem);
 		down(&dev->sem);
 		if (dev->driver == drv)
 		if (dev->driver == drv)

+ 0 - 6
drivers/block/floppy.c

@@ -3714,12 +3714,6 @@ static int floppy_open(struct inode *inode, struct file *filp)
 		USETF(FD_VERIFY);
 		USETF(FD_VERIFY);
 	}
 	}
 
 
-	/* set underlying gendisk policy to reflect real ro/rw status */
-	if (UTESTF(FD_DISK_WRITABLE))
-		inode->i_bdev->bd_disk->policy = 0;
-	else
-		inode->i_bdev->bd_disk->policy = 1;
-
 	if (UDRS->fd_ref == -1 || (UDRS->fd_ref && (filp->f_flags & O_EXCL)))
 	if (UDRS->fd_ref == -1 || (UDRS->fd_ref && (filp->f_flags & O_EXCL)))
 		goto out2;
 		goto out2;
 
 

+ 1 - 1
drivers/char/drm/drm_memory.c

@@ -95,7 +95,7 @@ unsigned long drm_alloc_pages(int order, int area)
 	unsigned long addr;
 	unsigned long addr;
 	unsigned int sz;
 	unsigned int sz;
 
 
-	address = __get_free_pages(GFP_KERNEL, order);
+	address = __get_free_pages(GFP_KERNEL|__GFP_COMP, order);
 	if (!address)
 	if (!address)
 		return 0;
 		return 0;
 
 

+ 1 - 1
drivers/char/drm/drm_memory_debug.h

@@ -221,7 +221,7 @@ unsigned long DRM(alloc_pages) (int order, int area) {
 	}
 	}
 	spin_unlock(&DRM(mem_lock));
 	spin_unlock(&DRM(mem_lock));
 
 
-	address = __get_free_pages(GFP_KERNEL, order);
+	address = __get_free_pages(GFP_KERNEL|__GFP_COMP, order);
 	if (!address) {
 	if (!address) {
 		spin_lock(&DRM(mem_lock));
 		spin_lock(&DRM(mem_lock));
 		++DRM(mem_stats)[area].fail_count;
 		++DRM(mem_stats)[area].fail_count;

+ 1 - 1
drivers/char/drm/mga_drv.c

@@ -161,7 +161,7 @@ static int mga_driver_device_is_agp(drm_device_t * dev)
 	 * device.
 	 * device.
 	 */
 	 */
 
 
-	if ((pdev->device == 0x0525)
+	if ((pdev->device == 0x0525) && pdev->bus->self
 	    && (pdev->bus->self->vendor == 0x3388)
 	    && (pdev->bus->self->vendor == 0x3388)
 	    && (pdev->bus->self->device == 0x0021)) {
 	    && (pdev->bus->self->device == 0x0021)) {
 		return 0;
 		return 0;

+ 1 - 2
drivers/char/drm/radeon_drv.h

@@ -214,8 +214,6 @@ typedef struct drm_radeon_private {
 
 
 	int microcode_version;
 	int microcode_version;
 
 
-	int is_pci;
-
 	struct {
 	struct {
 		u32 boxes;
 		u32 boxes;
 		int freelist_timeouts;
 		int freelist_timeouts;
@@ -275,6 +273,7 @@ typedef struct drm_radeon_private {
 
 
 	/* starting from here on, data is preserved accross an open */
 	/* starting from here on, data is preserved accross an open */
 	uint32_t flags;		/* see radeon_chip_flags */
 	uint32_t flags;		/* see radeon_chip_flags */
+	int is_pci;
 } drm_radeon_private_t;
 } drm_radeon_private_t;
 
 
 typedef struct drm_radeon_buf_priv {
 typedef struct drm_radeon_buf_priv {

+ 1 - 1
drivers/hwmon/hdaps.c

@@ -570,7 +570,7 @@ static int __init hdaps_init(void)
 	hdaps_idev->evbit[0] = BIT(EV_ABS);
 	hdaps_idev->evbit[0] = BIT(EV_ABS);
 	input_set_abs_params(hdaps_idev, ABS_X,
 	input_set_abs_params(hdaps_idev, ABS_X,
 			-256, 256, HDAPS_INPUT_FUZZ, HDAPS_INPUT_FLAT);
 			-256, 256, HDAPS_INPUT_FUZZ, HDAPS_INPUT_FLAT);
-	input_set_abs_params(hdaps_idev, ABS_X,
+	input_set_abs_params(hdaps_idev, ABS_Y,
 			-256, 256, HDAPS_INPUT_FUZZ, HDAPS_INPUT_FLAT);
 			-256, 256, HDAPS_INPUT_FUZZ, HDAPS_INPUT_FLAT);
 
 
 	input_register_device(hdaps_idev);
 	input_register_device(hdaps_idev);

+ 7 - 0
drivers/hwmon/it87.c

@@ -522,8 +522,15 @@ static ssize_t set_fan_min(struct device *dev, struct device_attribute *attr,
 	struct i2c_client *client = to_i2c_client(dev);
 	struct i2c_client *client = to_i2c_client(dev);
 	struct it87_data *data = i2c_get_clientdata(client);
 	struct it87_data *data = i2c_get_clientdata(client);
 	int val = simple_strtol(buf, NULL, 10);
 	int val = simple_strtol(buf, NULL, 10);
+	u8 reg = it87_read_value(client, IT87_REG_FAN_DIV);
 
 
 	down(&data->update_lock);
 	down(&data->update_lock);
+	switch (nr) {
+	case 0: data->fan_div[nr] = reg & 0x07; break;
+	case 1: data->fan_div[nr] = (reg >> 3) & 0x07; break;
+	case 2: data->fan_div[nr] = (reg & 0x40) ? 3 : 1; break;
+	}
+
 	data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr]));
 	data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr]));
 	it87_write_value(client, IT87_REG_FAN_MIN(nr), data->fan_min[nr]);
 	it87_write_value(client, IT87_REG_FAN_MIN(nr), data->fan_min[nr]);
 	up(&data->update_lock);
 	up(&data->update_lock);

+ 1 - 1
drivers/hwmon/lm78.c

@@ -451,7 +451,7 @@ static DEVICE_ATTR(fan3_div, S_IRUGO, show_fan_3_div, NULL);
 static ssize_t show_vid(struct device *dev, struct device_attribute *attr, char *buf)
 static ssize_t show_vid(struct device *dev, struct device_attribute *attr, char *buf)
 {
 {
 	struct lm78_data *data = lm78_update_device(dev);
 	struct lm78_data *data = lm78_update_device(dev);
-	return sprintf(buf, "%d\n", vid_from_reg(82, data->vid));
+	return sprintf(buf, "%d\n", vid_from_reg(data->vid, 82));
 }
 }
 static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL);
 static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL);
 
 

+ 6 - 2
drivers/hwmon/w83627hf.c

@@ -456,7 +456,9 @@ static ssize_t store_regs_in_min0(struct device *dev, struct device_attribute *a
 		(w83627thf == data->type || w83637hf == data->type))
 		(w83627thf == data->type || w83637hf == data->type))
 
 
 		/* use VRM9 calculation */
 		/* use VRM9 calculation */
-		data->in_min[0] = (u8)(((val * 100) - 70000 + 244) / 488);
+		data->in_min[0] =
+			SENSORS_LIMIT(((val * 100) - 70000 + 244) / 488, 0,
+					255);
 	else
 	else
 		/* use VRM8 (standard) calculation */
 		/* use VRM8 (standard) calculation */
 		data->in_min[0] = IN_TO_REG(val);
 		data->in_min[0] = IN_TO_REG(val);
@@ -481,7 +483,9 @@ static ssize_t store_regs_in_max0(struct device *dev, struct device_attribute *a
 		(w83627thf == data->type || w83637hf == data->type))
 		(w83627thf == data->type || w83637hf == data->type))
 		
 		
 		/* use VRM9 calculation */
 		/* use VRM9 calculation */
-		data->in_max[0] = (u8)(((val * 100) - 70000 + 244) / 488);
+		data->in_max[0] =
+			SENSORS_LIMIT(((val * 100) - 70000 + 244) / 488, 0,
+					255);
 	else
 	else
 		/* use VRM8 (standard) calculation */
 		/* use VRM8 (standard) calculation */
 		data->in_max[0] = IN_TO_REG(val);
 		data->in_max[0] = IN_TO_REG(val);

+ 0 - 1
drivers/pci/hotplug/pciehp.h

@@ -59,7 +59,6 @@ struct slot {
 	struct slot *next;
 	struct slot *next;
 	u8 bus;
 	u8 bus;
 	u8 device;
 	u8 device;
-	u16 status;
 	u32 number;
 	u32 number;
 	u8 state;
 	u8 state;
 	struct timer_list task_event;
 	struct timer_list task_event;

+ 2 - 13
drivers/pci/hotplug/pciehp_ctrl.c

@@ -207,7 +207,6 @@ u8 pciehp_handle_power_fault(u8 hp_slot, void *inst_id)
 		 * power fault Cleared
 		 * power fault Cleared
 		 */
 		 */
 		info("Power fault cleared on Slot(%d)\n", ctrl->first_slot + hp_slot);
 		info("Power fault cleared on Slot(%d)\n", ctrl->first_slot + hp_slot);
-		p_slot->status = 0x00;
 		taskInfo->event_type = INT_POWER_FAULT_CLEAR;
 		taskInfo->event_type = INT_POWER_FAULT_CLEAR;
 	} else {
 	} else {
 		/*
 		/*
@@ -215,8 +214,6 @@ u8 pciehp_handle_power_fault(u8 hp_slot, void *inst_id)
 		 */
 		 */
 		info("Power fault on Slot(%d)\n", ctrl->first_slot + hp_slot);
 		info("Power fault on Slot(%d)\n", ctrl->first_slot + hp_slot);
 		taskInfo->event_type = INT_POWER_FAULT;
 		taskInfo->event_type = INT_POWER_FAULT;
-		/* set power fault status for this board */
-		p_slot->status = 0xFF;
 		info("power fault bit %x set\n", hp_slot);
 		info("power fault bit %x set\n", hp_slot);
 	}
 	}
 	if (rc)
 	if (rc)
@@ -317,13 +314,10 @@ static int board_added(struct slot *p_slot)
 		return rc;
 		return rc;
 	}
 	}
 
 
-	dbg("%s: slot status = %x\n", __FUNCTION__, p_slot->status);
-
 	/* Check for a power fault */
 	/* Check for a power fault */
-	if (p_slot->status == 0xFF) {
-		/* power fault occurred, but it was benign */
+	if (p_slot->hpc_ops->query_power_fault(p_slot)) {
+		dbg("%s: power fault detected\n", __FUNCTION__);
 		rc = POWER_FAILURE;
 		rc = POWER_FAILURE;
-		p_slot->status = 0;
 		goto err_exit;
 		goto err_exit;
 	}
 	}
 
 
@@ -334,8 +328,6 @@ static int board_added(struct slot *p_slot)
 		goto err_exit;
 		goto err_exit;
 	}
 	}
 
 
-	p_slot->status = 0;
-
 	/*
 	/*
 	 * Some PCI Express root ports require fixup after hot-plug operation.
 	 * Some PCI Express root ports require fixup after hot-plug operation.
 	 */
 	 */
@@ -382,9 +374,6 @@ static int remove_board(struct slot *p_slot)
 
 
 	dbg("In %s, hp_slot = %d\n", __FUNCTION__, hp_slot);
 	dbg("In %s, hp_slot = %d\n", __FUNCTION__, hp_slot);
 
 
-	/* Change status to shutdown */
-	p_slot->status = 0x01;
-
 	/* Wait for exclusive access to hardware */
 	/* Wait for exclusive access to hardware */
 	down(&ctrl->crit_sect);
 	down(&ctrl->crit_sect);
 
 

+ 9 - 1
drivers/pci/hotplug/pciehp_hpc.c

@@ -750,7 +750,7 @@ static int hpc_power_on_slot(struct slot * slot)
 {
 {
 	struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle;
 	struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle;
 	u16 slot_cmd;
 	u16 slot_cmd;
-	u16 slot_ctrl;
+	u16 slot_ctrl, slot_status;
 
 
 	int retval = 0;
 	int retval = 0;
 
 
@@ -767,6 +767,14 @@ static int hpc_power_on_slot(struct slot * slot)
 		return -1;
 		return -1;
 	}
 	}
 
 
+	/* Clear sticky power-fault bit from previous power failures */
+	hp_register_read_word(php_ctlr->pci_dev,
+			SLOT_STATUS(slot->ctrl->cap_base), slot_status);
+	slot_status &= PWR_FAULT_DETECTED;
+	if (slot_status)
+		hp_register_write_word(php_ctlr->pci_dev,
+			SLOT_STATUS(slot->ctrl->cap_base), slot_status);
+
 	retval = hp_register_read_word(php_ctlr->pci_dev, SLOT_CTRL(slot->ctrl->cap_base), slot_ctrl);
 	retval = hp_register_read_word(php_ctlr->pci_dev, SLOT_CTRL(slot->ctrl->cap_base), slot_ctrl);
 
 
 	if (retval) {
 	if (retval) {

+ 1 - 0
drivers/pci/pci-acpi.c

@@ -178,6 +178,7 @@ EXPORT_SYMBOL(pci_osc_support_set);
 
 
 /**
 /**
  * pci_osc_control_set - commit requested control to Firmware
  * pci_osc_control_set - commit requested control to Firmware
+ * @handle: acpi_handle for the target ACPI object
  * @flags: driver's requested control bits
  * @flags: driver's requested control bits
  *
  *
  * Attempt to take control from Firmware on requested control bits.
  * Attempt to take control from Firmware on requested control bits.

+ 36 - 2
drivers/usb/core/hcd-pci.c

@@ -20,9 +20,17 @@
 #include <linux/kernel.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/module.h>
 #include <linux/pci.h>
 #include <linux/pci.h>
+#include <linux/usb.h>
+
 #include <asm/io.h>
 #include <asm/io.h>
 #include <asm/irq.h>
 #include <asm/irq.h>
-#include <linux/usb.h>
+
+#ifdef CONFIG_PPC_PMAC
+#include <asm/machdep.h>
+#include <asm/pmac_feature.h>
+#include <asm/pci-bridge.h>
+#include <asm/prom.h>
+#endif
 
 
 #include "usb.h"
 #include "usb.h"
 #include "hcd.h"
 #include "hcd.h"
@@ -277,8 +285,22 @@ int usb_hcd_pci_suspend (struct pci_dev *dev, pm_message_t message)
 	}
 	}
 
 
 done:
 done:
-	if (retval == 0)
+	if (retval == 0) {
 		dev->dev.power.power_state = PMSG_SUSPEND;
 		dev->dev.power.power_state = PMSG_SUSPEND;
+
+#ifdef CONFIG_PPC_PMAC
+		/* Disable ASIC clocks for USB */
+		if (_machine == _MACH_Pmac) {
+			struct device_node	*of_node;
+
+			of_node = pci_device_to_OF_node (dev);
+			if (of_node)
+				pmac_call_feature(PMAC_FTR_USB_ENABLE,
+							of_node, 0, 0);
+		}
+#endif
+	}
+
 	return retval;
 	return retval;
 }
 }
 EXPORT_SYMBOL (usb_hcd_pci_suspend);
 EXPORT_SYMBOL (usb_hcd_pci_suspend);
@@ -301,6 +323,18 @@ int usb_hcd_pci_resume (struct pci_dev *dev)
 		return 0;
 		return 0;
 	}
 	}
 
 
+#ifdef CONFIG_PPC_PMAC
+	/* Reenable ASIC clocks for USB */
+	if (_machine == _MACH_Pmac) {
+		struct device_node *of_node;
+
+		of_node = pci_device_to_OF_node (dev);
+		if (of_node)
+			pmac_call_feature (PMAC_FTR_USB_ENABLE,
+						of_node, 0, 1);
+	}
+#endif
+
 	/* NOTE:  chip docs cover clean "real suspend" cases (what Linux
 	/* NOTE:  chip docs cover clean "real suspend" cases (what Linux
 	 * calls "standby", "suspend to RAM", and so on).  There are also
 	 * calls "standby", "suspend to RAM", and so on).  There are also
 	 * dirty cases when swsusp fakes a suspend in "shutdown" mode.
 	 * dirty cases when swsusp fakes a suspend in "shutdown" mode.

+ 0 - 1
drivers/usb/core/hub.c

@@ -1669,7 +1669,6 @@ int usb_suspend_device(struct usb_device *udev)
 	return 0;
 	return 0;
 #endif
 #endif
 }
 }
-EXPORT_SYMBOL_GPL(usb_suspend_device);
 
 
 /*
 /*
  * If the USB "suspend" state is in use (rather than "global suspend"),
  * If the USB "suspend" state is in use (rather than "global suspend"),

+ 84 - 76
drivers/usb/host/ehci-hcd.c

@@ -411,50 +411,39 @@ static void ehci_stop (struct usb_hcd *hcd)
 	dbg_status (ehci, "ehci_stop completed", readl (&ehci->regs->status));
 	dbg_status (ehci, "ehci_stop completed", readl (&ehci->regs->status));
 }
 }
 
 
-static int ehci_run (struct usb_hcd *hcd)
+/* one-time init, only for memory state */
+static int ehci_init(struct usb_hcd *hcd)
 {
 {
-	struct ehci_hcd		*ehci = hcd_to_ehci (hcd);
+	struct ehci_hcd		*ehci = hcd_to_ehci(hcd);
 	u32			temp;
 	u32			temp;
 	int			retval;
 	int			retval;
 	u32			hcc_params;
 	u32			hcc_params;
-	int			first;
-
-	/* skip some things on restart paths */
-	first = (ehci->watchdog.data == 0);
-	if (first) {
-		init_timer (&ehci->watchdog);
-		ehci->watchdog.function = ehci_watchdog;
-		ehci->watchdog.data = (unsigned long) ehci;
-	}
+
+	spin_lock_init(&ehci->lock);
+
+	init_timer(&ehci->watchdog);
+	ehci->watchdog.function = ehci_watchdog;
+	ehci->watchdog.data = (unsigned long) ehci;
 
 
 	/*
 	/*
 	 * hw default: 1K periodic list heads, one per frame.
 	 * hw default: 1K periodic list heads, one per frame.
 	 * periodic_size can shrink by USBCMD update if hcc_params allows.
 	 * periodic_size can shrink by USBCMD update if hcc_params allows.
 	 */
 	 */
 	ehci->periodic_size = DEFAULT_I_TDPS;
 	ehci->periodic_size = DEFAULT_I_TDPS;
-	if (first && (retval = ehci_mem_init (ehci, GFP_KERNEL)) < 0)
+	if ((retval = ehci_mem_init(ehci, GFP_KERNEL)) < 0)
 		return retval;
 		return retval;
 
 
 	/* controllers may cache some of the periodic schedule ... */
 	/* controllers may cache some of the periodic schedule ... */
-	hcc_params = readl (&ehci->caps->hcc_params);
-	if (HCC_ISOC_CACHE (hcc_params)) 	// full frame cache
+	hcc_params = readl(&ehci->caps->hcc_params);
+	if (HCC_ISOC_CACHE(hcc_params)) 	// full frame cache
 		ehci->i_thresh = 8;
 		ehci->i_thresh = 8;
 	else					// N microframes cached
 	else					// N microframes cached
-		ehci->i_thresh = 2 + HCC_ISOC_THRES (hcc_params);
+		ehci->i_thresh = 2 + HCC_ISOC_THRES(hcc_params);
 
 
 	ehci->reclaim = NULL;
 	ehci->reclaim = NULL;
 	ehci->reclaim_ready = 0;
 	ehci->reclaim_ready = 0;
 	ehci->next_uframe = -1;
 	ehci->next_uframe = -1;
 
 
-	/* controller state:  unknown --> reset */
-
-	/* EHCI spec section 4.1 */
-	if ((retval = ehci_reset (ehci)) != 0) {
-		ehci_mem_cleanup (ehci);
-		return retval;
-	}
-	writel (ehci->periodic_dma, &ehci->regs->frame_list);
-
 	/*
 	/*
 	 * dedicate a qh for the async ring head, since we couldn't unlink
 	 * dedicate a qh for the async ring head, since we couldn't unlink
 	 * a 'real' qh without stopping the async schedule [4.8].  use it
 	 * a 'real' qh without stopping the async schedule [4.8].  use it
@@ -462,37 +451,13 @@ static int ehci_run (struct usb_hcd *hcd)
 	 * its dummy is used in hw_alt_next of many tds, to prevent the qh
 	 * its dummy is used in hw_alt_next of many tds, to prevent the qh
 	 * from automatically advancing to the next td after short reads.
 	 * from automatically advancing to the next td after short reads.
 	 */
 	 */
-	if (first) {
-		ehci->async->qh_next.qh = NULL;
-		ehci->async->hw_next = QH_NEXT (ehci->async->qh_dma);
-		ehci->async->hw_info1 = cpu_to_le32 (QH_HEAD);
-		ehci->async->hw_token = cpu_to_le32 (QTD_STS_HALT);
-		ehci->async->hw_qtd_next = EHCI_LIST_END;
-		ehci->async->qh_state = QH_STATE_LINKED;
-		ehci->async->hw_alt_next = QTD_NEXT (ehci->async->dummy->qtd_dma);
-	}
-	writel ((u32)ehci->async->qh_dma, &ehci->regs->async_next);
-
-	/*
-	 * hcc_params controls whether ehci->regs->segment must (!!!)
-	 * be used; it constrains QH/ITD/SITD and QTD locations.
-	 * pci_pool consistent memory always uses segment zero.
-	 * streaming mappings for I/O buffers, like pci_map_single(),
-	 * can return segments above 4GB, if the device allows.
-	 *
-	 * NOTE:  the dma mask is visible through dma_supported(), so
-	 * drivers can pass this info along ... like NETIF_F_HIGHDMA,
-	 * Scsi_Host.highmem_io, and so forth.  It's readonly to all
-	 * host side drivers though.
-	 */
-	if (HCC_64BIT_ADDR (hcc_params)) {
-		writel (0, &ehci->regs->segment);
-#if 0
-// this is deeply broken on almost all architectures
-		if (!dma_set_mask (hcd->self.controller, DMA_64BIT_MASK))
-			ehci_info (ehci, "enabled 64bit DMA\n");
-#endif
-	}
+	ehci->async->qh_next.qh = NULL;
+	ehci->async->hw_next = QH_NEXT(ehci->async->qh_dma);
+	ehci->async->hw_info1 = cpu_to_le32(QH_HEAD);
+	ehci->async->hw_token = cpu_to_le32(QTD_STS_HALT);
+	ehci->async->hw_qtd_next = EHCI_LIST_END;
+	ehci->async->qh_state = QH_STATE_LINKED;
+	ehci->async->hw_alt_next = QTD_NEXT(ehci->async->dummy->qtd_dma);
 
 
 	/* clear interrupt enables, set irq latency */
 	/* clear interrupt enables, set irq latency */
 	if (log2_irq_thresh < 0 || log2_irq_thresh > 6)
 	if (log2_irq_thresh < 0 || log2_irq_thresh > 6)
@@ -507,13 +472,13 @@ static int ehci_run (struct usb_hcd *hcd)
 		 * make problems:  throughput reduction (!), data errors...
 		 * make problems:  throughput reduction (!), data errors...
 		 */
 		 */
 		if (park) {
 		if (park) {
-			park = min (park, (unsigned) 3);
+			park = min(park, (unsigned) 3);
 			temp |= CMD_PARK;
 			temp |= CMD_PARK;
 			temp |= park << 8;
 			temp |= park << 8;
 		}
 		}
-		ehci_info (ehci, "park %d\n", park);
+		ehci_dbg(ehci, "park %d\n", park);
 	}
 	}
-	if (HCC_PGM_FRAMELISTLEN (hcc_params)) {
+	if (HCC_PGM_FRAMELISTLEN(hcc_params)) {
 		/* periodic schedule size can be smaller than default */
 		/* periodic schedule size can be smaller than default */
 		temp &= ~(3 << 2);
 		temp &= ~(3 << 2);
 		temp |= (EHCI_TUNE_FLS << 2);
 		temp |= (EHCI_TUNE_FLS << 2);
@@ -521,16 +486,63 @@ static int ehci_run (struct usb_hcd *hcd)
 		case 0: ehci->periodic_size = 1024; break;
 		case 0: ehci->periodic_size = 1024; break;
 		case 1: ehci->periodic_size = 512; break;
 		case 1: ehci->periodic_size = 512; break;
 		case 2: ehci->periodic_size = 256; break;
 		case 2: ehci->periodic_size = 256; break;
-		default:	BUG ();
+		default:	BUG();
 		}
 		}
 	}
 	}
+	ehci->command = temp;
+
+	ehci->reboot_notifier.notifier_call = ehci_reboot;
+	register_reboot_notifier(&ehci->reboot_notifier);
+
+	return 0;
+}
+
+/* start HC running; it's halted, ehci_init() has been run (once) */
+static int ehci_run (struct usb_hcd *hcd)
+{
+	struct ehci_hcd		*ehci = hcd_to_ehci (hcd);
+	int			retval;
+	u32			temp;
+	u32			hcc_params;
+
+	/* EHCI spec section 4.1 */
+	if ((retval = ehci_reset(ehci)) != 0) {
+		unregister_reboot_notifier(&ehci->reboot_notifier);
+		ehci_mem_cleanup(ehci);
+		return retval;
+	}
+	writel(ehci->periodic_dma, &ehci->regs->frame_list);
+	writel((u32)ehci->async->qh_dma, &ehci->regs->async_next);
+
+	/*
+	 * hcc_params controls whether ehci->regs->segment must (!!!)
+	 * be used; it constrains QH/ITD/SITD and QTD locations.
+	 * pci_pool consistent memory always uses segment zero.
+	 * streaming mappings for I/O buffers, like pci_map_single(),
+	 * can return segments above 4GB, if the device allows.
+	 *
+	 * NOTE:  the dma mask is visible through dma_supported(), so
+	 * drivers can pass this info along ... like NETIF_F_HIGHDMA,
+	 * Scsi_Host.highmem_io, and so forth.  It's readonly to all
+	 * host side drivers though.
+	 */
+	hcc_params = readl(&ehci->caps->hcc_params);
+	if (HCC_64BIT_ADDR(hcc_params)) {
+		writel(0, &ehci->regs->segment);
+#if 0
+// this is deeply broken on almost all architectures
+		if (!dma_set_mask(hcd->self.controller, DMA_64BIT_MASK))
+			ehci_info(ehci, "enabled 64bit DMA\n");
+#endif
+	}
+
+
 	// Philips, Intel, and maybe others need CMD_RUN before the
 	// Philips, Intel, and maybe others need CMD_RUN before the
 	// root hub will detect new devices (why?); NEC doesn't
 	// root hub will detect new devices (why?); NEC doesn't
-	temp |= CMD_RUN;
-	writel (temp, &ehci->regs->command);
-	dbg_cmd (ehci, "init", temp);
-
-	/* set async sleep time = 10 us ... ? */
+	ehci->command &= ~(CMD_LRESET|CMD_IAAD|CMD_PSE|CMD_ASE|CMD_RESET);
+	ehci->command |= CMD_RUN;
+	writel (ehci->command, &ehci->regs->command);
+	dbg_cmd (ehci, "init", ehci->command);
 
 
 	/*
 	/*
 	 * Start, enabling full USB 2.0 functionality ... usb 1.1 devices
 	 * Start, enabling full USB 2.0 functionality ... usb 1.1 devices
@@ -538,26 +550,23 @@ static int ehci_run (struct usb_hcd *hcd)
 	 * involved with the root hub.  (Except where one is integrated,
 	 * involved with the root hub.  (Except where one is integrated,
 	 * and there's no companion controller unless maybe for USB OTG.)
 	 * and there's no companion controller unless maybe for USB OTG.)
 	 */
 	 */
-	if (first) {
-		ehci->reboot_notifier.notifier_call = ehci_reboot;
-		register_reboot_notifier (&ehci->reboot_notifier);
-	}
-
 	hcd->state = HC_STATE_RUNNING;
 	hcd->state = HC_STATE_RUNNING;
 	writel (FLAG_CF, &ehci->regs->configured_flag);
 	writel (FLAG_CF, &ehci->regs->configured_flag);
-	readl (&ehci->regs->command);	/* unblock posted write */
+	readl (&ehci->regs->command);	/* unblock posted writes */
 
 
 	temp = HC_VERSION(readl (&ehci->caps->hc_capbase));
 	temp = HC_VERSION(readl (&ehci->caps->hc_capbase));
 	ehci_info (ehci,
 	ehci_info (ehci,
-		"USB %x.%x %s, EHCI %x.%02x, driver %s\n",
+		"USB %x.%x started, EHCI %x.%02x, driver %s\n",
 		((ehci->sbrn & 0xf0)>>4), (ehci->sbrn & 0x0f),
 		((ehci->sbrn & 0xf0)>>4), (ehci->sbrn & 0x0f),
-		first ? "initialized" : "restarted",
 		temp >> 8, temp & 0xff, DRIVER_VERSION);
 		temp >> 8, temp & 0xff, DRIVER_VERSION);
 
 
 	writel (INTR_MASK, &ehci->regs->intr_enable); /* Turn On Interrupts */
 	writel (INTR_MASK, &ehci->regs->intr_enable); /* Turn On Interrupts */
 
 
-	if (first)
-		create_debug_files (ehci);
+	/* GRR this is run-once init(), being done every time the HC starts.
+	 * So long as they're part of class devices, we can't do it init()
+	 * since the class device isn't created that early.
+	 */
+	create_debug_files(ehci);
 
 
 	return 0;
 	return 0;
 }
 }
@@ -636,9 +645,8 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd, struct pt_regs *regs)
 			 * stop that signaling.
 			 * stop that signaling.
 			 */
 			 */
 			ehci->reset_done [i] = jiffies + msecs_to_jiffies (20);
 			ehci->reset_done [i] = jiffies + msecs_to_jiffies (20);
-			mod_timer (&hcd->rh_timer,
-					ehci->reset_done [i] + 1);
 			ehci_dbg (ehci, "port %d remote wakeup\n", i + 1);
 			ehci_dbg (ehci, "port %d remote wakeup\n", i + 1);
+			usb_hcd_resume_root_hub(hcd);
 		}
 		}
 	}
 	}
 
 

+ 7 - 0
drivers/usb/host/ehci-hub.c

@@ -94,6 +94,13 @@ static int ehci_bus_resume (struct usb_hcd *hcd)
 		msleep(5);
 		msleep(5);
 	spin_lock_irq (&ehci->lock);
 	spin_lock_irq (&ehci->lock);
 
 
+	/* Ideally and we've got a real resume here, and no port's power
+	 * was lost.  (For PCI, that means Vaux was maintained.)  But we
+	 * could instead be restoring a swsusp snapshot -- so that BIOS was
+	 * the last user of the controller, not reset/pm hardware keeping
+	 * state we gave to it.
+	 */
+
 	/* re-init operational registers in case we lost power */
 	/* re-init operational registers in case we lost power */
 	if (readl (&ehci->regs->intr_enable) == 0) {
 	if (readl (&ehci->regs->intr_enable) == 0) {
  		/* at least some APM implementations will try to deliver
  		/* at least some APM implementations will try to deliver

+ 170 - 189
drivers/usb/host/ehci-pci.c

@@ -27,7 +27,7 @@
 /* EHCI 0.96 (and later) section 5.1 says how to kick BIOS/SMM/...
 /* EHCI 0.96 (and later) section 5.1 says how to kick BIOS/SMM/...
  * off the controller (maybe it can boot from highspeed USB disks).
  * off the controller (maybe it can boot from highspeed USB disks).
  */
  */
-static int bios_handoff (struct ehci_hcd *ehci, int where, u32 cap)
+static int bios_handoff(struct ehci_hcd *ehci, int where, u32 cap)
 {
 {
 	struct pci_dev *pdev = to_pci_dev(ehci_to_hcd(ehci)->self.controller);
 	struct pci_dev *pdev = to_pci_dev(ehci_to_hcd(ehci)->self.controller);
 
 
@@ -48,7 +48,7 @@ static int bios_handoff (struct ehci_hcd *ehci, int where, u32 cap)
 				where, cap);
 				where, cap);
 			// some BIOS versions seem buggy...
 			// some BIOS versions seem buggy...
 			// return 1;
 			// return 1;
-			ehci_warn (ehci, "continuing after BIOS bug...\n");
+			ehci_warn(ehci, "continuing after BIOS bug...\n");
 			/* disable all SMIs, and clear "BIOS owns" flag */
 			/* disable all SMIs, and clear "BIOS owns" flag */
 			pci_write_config_dword(pdev, where + 4, 0);
 			pci_write_config_dword(pdev, where + 4, 0);
 			pci_write_config_byte(pdev, where + 2, 0);
 			pci_write_config_byte(pdev, where + 2, 0);
@@ -58,96 +58,47 @@ static int bios_handoff (struct ehci_hcd *ehci, int where, u32 cap)
 	return 0;
 	return 0;
 }
 }
 
 
-/* called by khubd or root hub init threads */
-static int ehci_pci_reset (struct usb_hcd *hcd)
+/* called after powerup, by probe or system-pm "wakeup" */
+static int ehci_pci_reinit(struct ehci_hcd *ehci, struct pci_dev *pdev)
 {
 {
-	struct ehci_hcd		*ehci = hcd_to_ehci (hcd);
 	u32			temp;
 	u32			temp;
+	int			retval;
 	unsigned		count = 256/4;
 	unsigned		count = 256/4;
 
 
-	spin_lock_init (&ehci->lock);
-
-	ehci->caps = hcd->regs;
-	ehci->regs = hcd->regs + HC_LENGTH (readl (&ehci->caps->hc_capbase));
-	dbg_hcs_params (ehci, "reset");
-	dbg_hcc_params (ehci, "reset");
-
-	/* cache this readonly data; minimize chip reads */
-	ehci->hcs_params = readl (&ehci->caps->hcs_params);
-
-	if (hcd->self.controller->bus == &pci_bus_type) {
-		struct pci_dev	*pdev = to_pci_dev(hcd->self.controller);
-
-		switch (pdev->vendor) {
-		case PCI_VENDOR_ID_TDI:
-			if (pdev->device == PCI_DEVICE_ID_TDI_EHCI) {
-				ehci->is_tdi_rh_tt = 1;
-				tdi_reset (ehci);
-			}
-			break;
-		case PCI_VENDOR_ID_AMD:
-			/* AMD8111 EHCI doesn't work, according to AMD errata */
-			if (pdev->device == 0x7463) {
-				ehci_info (ehci, "ignoring AMD8111 (errata)\n");
-				return -EIO;
-			}
-			break;
-		case PCI_VENDOR_ID_NVIDIA:
-			/* NVidia reports that certain chips don't handle
-			 * QH, ITD, or SITD addresses above 2GB.  (But TD,
-			 * data buffer, and periodic schedule are normal.)
-			 */
-			switch (pdev->device) {
-			case 0x003c:	/* MCP04 */
-			case 0x005b:	/* CK804 */
-			case 0x00d8:	/* CK8 */
-			case 0x00e8:	/* CK8S */
-				if (pci_set_consistent_dma_mask(pdev,
-							DMA_31BIT_MASK) < 0)
-					ehci_warn (ehci, "can't enable NVidia "
-						"workaround for >2GB RAM\n");
-				break;
-			}
-			break;
-		}
-
-		/* optional debug port, normally in the first BAR */
-		temp = pci_find_capability (pdev, 0x0a);
-		if (temp) {
-			pci_read_config_dword(pdev, temp, &temp);
-			temp >>= 16;
-			if ((temp & (3 << 13)) == (1 << 13)) {
-				temp &= 0x1fff;
-				ehci->debug = hcd->regs + temp;
-				temp = readl (&ehci->debug->control);
-				ehci_info (ehci, "debug port %d%s\n",
-					HCS_DEBUG_PORT(ehci->hcs_params),
-					(temp & DBGP_ENABLED)
-						? " IN USE"
-						: "");
-				if (!(temp & DBGP_ENABLED))
-					ehci->debug = NULL;
-			}
+	/* optional debug port, normally in the first BAR */
+	temp = pci_find_capability(pdev, 0x0a);
+	if (temp) {
+		pci_read_config_dword(pdev, temp, &temp);
+		temp >>= 16;
+		if ((temp & (3 << 13)) == (1 << 13)) {
+			temp &= 0x1fff;
+			ehci->debug = ehci_to_hcd(ehci)->regs + temp;
+			temp = readl(&ehci->debug->control);
+			ehci_info(ehci, "debug port %d%s\n",
+				HCS_DEBUG_PORT(ehci->hcs_params),
+				(temp & DBGP_ENABLED)
+					? " IN USE"
+					: "");
+			if (!(temp & DBGP_ENABLED))
+				ehci->debug = NULL;
 		}
 		}
+	}
 
 
-		temp = HCC_EXT_CAPS (readl (&ehci->caps->hcc_params));
-	} else
-		temp = 0;
+	temp = HCC_EXT_CAPS(readl(&ehci->caps->hcc_params));
 
 
 	/* EHCI 0.96 and later may have "extended capabilities" */
 	/* EHCI 0.96 and later may have "extended capabilities" */
 	while (temp && count--) {
 	while (temp && count--) {
 		u32		cap;
 		u32		cap;
 
 
-		pci_read_config_dword (to_pci_dev(hcd->self.controller),
-				temp, &cap);
-		ehci_dbg (ehci, "capability %04x at %02x\n", cap, temp);
+		pci_read_config_dword(pdev, temp, &cap);
+		ehci_dbg(ehci, "capability %04x at %02x\n", cap, temp);
 		switch (cap & 0xff) {
 		switch (cap & 0xff) {
 		case 1:			/* BIOS/SMM/... handoff */
 		case 1:			/* BIOS/SMM/... handoff */
-			if (bios_handoff (ehci, temp, cap) != 0)
+			if (bios_handoff(ehci, temp, cap) != 0)
 				return -EOPNOTSUPP;
 				return -EOPNOTSUPP;
 			break;
 			break;
 		case 0:			/* illegal reserved capability */
 		case 0:			/* illegal reserved capability */
-			ehci_warn (ehci, "illegal capability!\n");
+			ehci_dbg(ehci, "illegal capability!\n");
 			cap = 0;
 			cap = 0;
 			/* FALLTHROUGH */
 			/* FALLTHROUGH */
 		default:		/* unknown */
 		default:		/* unknown */
@@ -156,77 +107,109 @@ static int ehci_pci_reset (struct usb_hcd *hcd)
 		temp = (cap >> 8) & 0xff;
 		temp = (cap >> 8) & 0xff;
 	}
 	}
 	if (!count) {
 	if (!count) {
-		ehci_err (ehci, "bogus capabilities ... PCI problems!\n");
+		ehci_err(ehci, "bogus capabilities ... PCI problems!\n");
 		return -EIO;
 		return -EIO;
 	}
 	}
-	if (ehci_is_TDI(ehci))
-		ehci_reset (ehci);
 
 
-	ehci_port_power (ehci, 0);
+	/* PCI Memory-Write-Invalidate cycle support is optional (uncommon) */
+	retval = pci_set_mwi(pdev);
+	if (!retval)
+		ehci_dbg(ehci, "MWI active\n");
+
+	ehci_port_power(ehci, 0);
+
+	return 0;
+}
+
+/* called by khubd or root hub (re)init threads; leaves HC in halt state */
+static int ehci_pci_reset(struct usb_hcd *hcd)
+{
+	struct ehci_hcd		*ehci = hcd_to_ehci(hcd);
+	struct pci_dev		*pdev = to_pci_dev(hcd->self.controller);
+	u32			temp;
+	int			retval;
+
+	ehci->caps = hcd->regs;
+	ehci->regs = hcd->regs + HC_LENGTH(readl(&ehci->caps->hc_capbase));
+	dbg_hcs_params(ehci, "reset");
+	dbg_hcc_params(ehci, "reset");
+
+	/* cache this readonly data; minimize chip reads */
+	ehci->hcs_params = readl(&ehci->caps->hcs_params);
+
+	retval = ehci_halt(ehci);
+	if (retval)
+		return retval;
+
+	/* NOTE:  only the parts below this line are PCI-specific */
+
+	switch (pdev->vendor) {
+	case PCI_VENDOR_ID_TDI:
+		if (pdev->device == PCI_DEVICE_ID_TDI_EHCI) {
+			ehci->is_tdi_rh_tt = 1;
+			tdi_reset(ehci);
+		}
+		break;
+	case PCI_VENDOR_ID_AMD:
+		/* AMD8111 EHCI doesn't work, according to AMD errata */
+		if (pdev->device == 0x7463) {
+			ehci_info(ehci, "ignoring AMD8111 (errata)\n");
+			return -EIO;
+		}
+		break;
+	case PCI_VENDOR_ID_NVIDIA:
+		/* NVidia reports that certain chips don't handle
+		 * QH, ITD, or SITD addresses above 2GB.  (But TD,
+		 * data buffer, and periodic schedule are normal.)
+		 */
+		switch (pdev->device) {
+		case 0x003c:	/* MCP04 */
+		case 0x005b:	/* CK804 */
+		case 0x00d8:	/* CK8 */
+		case 0x00e8:	/* CK8S */
+			if (pci_set_consistent_dma_mask(pdev,
+						DMA_31BIT_MASK) < 0)
+				ehci_warn(ehci, "can't enable NVidia "
+					"workaround for >2GB RAM\n");
+			break;
+		}
+		break;
+	}
+
+	if (ehci_is_TDI(ehci))
+		ehci_reset(ehci);
 
 
 	/* at least the Genesys GL880S needs fixup here */
 	/* at least the Genesys GL880S needs fixup here */
 	temp = HCS_N_CC(ehci->hcs_params) * HCS_N_PCC(ehci->hcs_params);
 	temp = HCS_N_CC(ehci->hcs_params) * HCS_N_PCC(ehci->hcs_params);
 	temp &= 0x0f;
 	temp &= 0x0f;
 	if (temp && HCS_N_PORTS(ehci->hcs_params) > temp) {
 	if (temp && HCS_N_PORTS(ehci->hcs_params) > temp) {
-		ehci_dbg (ehci, "bogus port configuration: "
+		ehci_dbg(ehci, "bogus port configuration: "
 			"cc=%d x pcc=%d < ports=%d\n",
 			"cc=%d x pcc=%d < ports=%d\n",
 			HCS_N_CC(ehci->hcs_params),
 			HCS_N_CC(ehci->hcs_params),
 			HCS_N_PCC(ehci->hcs_params),
 			HCS_N_PCC(ehci->hcs_params),
 			HCS_N_PORTS(ehci->hcs_params));
 			HCS_N_PORTS(ehci->hcs_params));
 
 
-		if (hcd->self.controller->bus == &pci_bus_type) {
-			struct pci_dev	*pdev;
-
-			pdev = to_pci_dev(hcd->self.controller);
-			switch (pdev->vendor) {
-			case 0x17a0:		/* GENESYS */
-				/* GL880S: should be PORTS=2 */
-				temp |= (ehci->hcs_params & ~0xf);
-				ehci->hcs_params = temp;
-				break;
-			case PCI_VENDOR_ID_NVIDIA:
-				/* NF4: should be PCC=10 */
-				break;
-			}
+		switch (pdev->vendor) {
+		case 0x17a0:		/* GENESYS */
+			/* GL880S: should be PORTS=2 */
+			temp |= (ehci->hcs_params & ~0xf);
+			ehci->hcs_params = temp;
+			break;
+		case PCI_VENDOR_ID_NVIDIA:
+			/* NF4: should be PCC=10 */
+			break;
 		}
 		}
 	}
 	}
 
 
-	/* force HC to halt state */
-	return ehci_halt (ehci);
-}
-
-static int ehci_pci_start (struct usb_hcd *hcd)
-{
-	struct ehci_hcd		*ehci = hcd_to_ehci (hcd);
-	int result = 0;
-
-	if (hcd->self.controller->bus == &pci_bus_type) {
-		struct pci_dev		*pdev;
-		u16			port_wake;
-
-		pdev = to_pci_dev(hcd->self.controller);
-
-		/* Serial Bus Release Number is at PCI 0x60 offset */
-		pci_read_config_byte(pdev, 0x60, &ehci->sbrn);
-
-		/* port wake capability, reported by boot firmware */
-		pci_read_config_word(pdev, 0x62, &port_wake);
-		hcd->can_wakeup = (port_wake & 1) != 0;
+	/* Serial Bus Release Number is at PCI 0x60 offset */
+	pci_read_config_byte(pdev, 0x60, &ehci->sbrn);
 
 
-		/* help hc dma work well with cachelines */
-		result = pci_set_mwi(pdev);
-		if (result)
-			ehci_dbg(ehci, "unable to enable MWI - not fatal.\n");
-	}
-
-	return ehci_run (hcd);
-}
+	/* REVISIT:  per-port wake capability (PCI 0x62) currently unused */
 
 
-/* always called by thread; normally rmmod */
+	retval = ehci_pci_reinit(ehci, pdev);
 
 
-static void ehci_pci_stop (struct usb_hcd *hcd)
-{
-	ehci_stop (hcd);
+	/* finish init */
+	return ehci_init(hcd);
 }
 }
 
 
 /*-------------------------------------------------------------------------*/
 /*-------------------------------------------------------------------------*/
@@ -235,90 +218,88 @@ static void ehci_pci_stop (struct usb_hcd *hcd)
 
 
 /* suspend/resume, section 4.3 */
 /* suspend/resume, section 4.3 */
 
 
-/* These routines rely on the bus (pci, platform, etc)
+/* These routines rely on the PCI bus glue
  * to handle powerdown and wakeup, and currently also on
  * to handle powerdown and wakeup, and currently also on
  * transceivers that don't need any software attention to set up
  * transceivers that don't need any software attention to set up
  * the right sort of wakeup.
  * the right sort of wakeup.
+ * Also they depend on separate root hub suspend/resume.
  */
  */
 
 
-static int ehci_pci_suspend (struct usb_hcd *hcd, pm_message_t message)
+static int ehci_pci_suspend(struct usb_hcd *hcd, pm_message_t message)
 {
 {
-	struct ehci_hcd		*ehci = hcd_to_ehci (hcd);
+	struct ehci_hcd		*ehci = hcd_to_ehci(hcd);
 
 
-	if (time_before (jiffies, ehci->next_statechange))
-		msleep (100);
+	if (time_before(jiffies, ehci->next_statechange))
+		msleep(10);
 
 
-#ifdef	CONFIG_USB_SUSPEND
-	(void) usb_suspend_device (hcd->self.root_hub);
-#else
-	usb_lock_device (hcd->self.root_hub);
-	(void) ehci_bus_suspend (hcd);
-	usb_unlock_device (hcd->self.root_hub);
-#endif
-
-	// save (PCI) FLADJ in case of Vaux power loss
+	// could save FLADJ in case of Vaux power loss
 	// ... we'd only use it to handle clock skew
 	// ... we'd only use it to handle clock skew
 
 
 	return 0;
 	return 0;
 }
 }
 
 
-static int ehci_pci_resume (struct usb_hcd *hcd)
+static int ehci_pci_resume(struct usb_hcd *hcd)
 {
 {
-	struct ehci_hcd		*ehci = hcd_to_ehci (hcd);
+	struct ehci_hcd		*ehci = hcd_to_ehci(hcd);
 	unsigned		port;
 	unsigned		port;
 	struct usb_device	*root = hcd->self.root_hub;
 	struct usb_device	*root = hcd->self.root_hub;
+	struct pci_dev		*pdev = to_pci_dev(hcd->self.controller);
 	int			retval = -EINVAL;
 	int			retval = -EINVAL;
 
 
-	// maybe restore (PCI) FLADJ
+	// maybe restore FLADJ
 
 
-	if (time_before (jiffies, ehci->next_statechange))
-		msleep (100);
+	if (time_before(jiffies, ehci->next_statechange))
+		msleep(100);
+
+	/* If CF is clear, we lost PCI Vaux power and need to restart.  */
+	if (readl(&ehci->regs->configured_flag) != FLAG_CF)
+		goto restart;
 
 
 	/* If any port is suspended (or owned by the companion),
 	/* If any port is suspended (or owned by the companion),
 	 * we know we can/must resume the HC (and mustn't reset it).
 	 * we know we can/must resume the HC (and mustn't reset it).
+	 * We just defer that to the root hub code.
 	 */
 	 */
-	for (port = HCS_N_PORTS (ehci->hcs_params); port > 0; ) {
+	for (port = HCS_N_PORTS(ehci->hcs_params); port > 0; ) {
 		u32	status;
 		u32	status;
 		port--;
 		port--;
-		status = readl (&ehci->regs->port_status [port]);
+		status = readl(&ehci->regs->port_status [port]);
 		if (!(status & PORT_POWER))
 		if (!(status & PORT_POWER))
 			continue;
 			continue;
-		if (status & (PORT_SUSPEND | PORT_OWNER)) {
-			down (&hcd->self.root_hub->serialize);
-			retval = ehci_bus_resume (hcd);
-			up (&hcd->self.root_hub->serialize);
-			break;
+		if (status & (PORT_SUSPEND | PORT_RESUME | PORT_OWNER)) {
+			usb_hcd_resume_root_hub(hcd);
+			return 0;
 		}
 		}
+	}
+
+restart:
+	ehci_dbg(ehci, "lost power, restarting\n");
+	for (port = HCS_N_PORTS(ehci->hcs_params); port > 0; ) {
+		port--;
 		if (!root->children [port])
 		if (!root->children [port])
 			continue;
 			continue;
-		dbg_port (ehci, __FUNCTION__, port + 1, status);
-		usb_set_device_state (root->children[port],
+		usb_set_device_state(root->children[port],
 					USB_STATE_NOTATTACHED);
 					USB_STATE_NOTATTACHED);
 	}
 	}
 
 
 	/* Else reset, to cope with power loss or flush-to-storage
 	/* Else reset, to cope with power loss or flush-to-storage
-	 * style "resume" having activated BIOS during reboot.
+	 * style "resume" having let BIOS kick in during reboot.
 	 */
 	 */
-	if (port == 0) {
-		(void) ehci_halt (ehci);
-		(void) ehci_reset (ehci);
-		(void) ehci_pci_reset (hcd);
-
-		/* emptying the schedule aborts any urbs */
-		spin_lock_irq (&ehci->lock);
-		if (ehci->reclaim)
-			ehci->reclaim_ready = 1;
-		ehci_work (ehci, NULL);
-		spin_unlock_irq (&ehci->lock);
-
-		/* restart; khubd will disconnect devices */
-		retval = ehci_run (hcd);
-
-		/* here we "know" root ports should always stay powered;
-		 * but some controllers may lose all power.
-		 */
-		ehci_port_power (ehci, 1);
-	}
+	(void) ehci_halt(ehci);
+	(void) ehci_reset(ehci);
+	(void) ehci_pci_reinit(ehci, pdev);
+
+	/* emptying the schedule aborts any urbs */
+	spin_lock_irq(&ehci->lock);
+	if (ehci->reclaim)
+		ehci->reclaim_ready = 1;
+	ehci_work(ehci, NULL);
+	spin_unlock_irq(&ehci->lock);
+
+	/* restart; khubd will disconnect devices */
+	retval = ehci_run(hcd);
+
+	/* here we "know" root ports should always stay powered */
+	ehci_port_power(ehci, 1);
 
 
 	return retval;
 	return retval;
 }
 }
@@ -339,12 +320,12 @@ static const struct hc_driver ehci_pci_hc_driver = {
 	 * basic lifecycle operations
 	 * basic lifecycle operations
 	 */
 	 */
 	.reset =		ehci_pci_reset,
 	.reset =		ehci_pci_reset,
-	.start =		ehci_pci_start,
+	.start =		ehci_run,
 #ifdef	CONFIG_PM
 #ifdef	CONFIG_PM
 	.suspend =		ehci_pci_suspend,
 	.suspend =		ehci_pci_suspend,
 	.resume =		ehci_pci_resume,
 	.resume =		ehci_pci_resume,
 #endif
 #endif
-	.stop =			ehci_pci_stop,
+	.stop =			ehci_stop,
 
 
 	/*
 	/*
 	 * managing i/o requests and associated device resources
 	 * managing i/o requests and associated device resources
@@ -377,7 +358,7 @@ static const struct pci_device_id pci_ids [] = { {
 	},
 	},
 	{ /* end: all zeroes */ }
 	{ /* end: all zeroes */ }
 };
 };
-MODULE_DEVICE_TABLE (pci, pci_ids);
+MODULE_DEVICE_TABLE(pci, pci_ids);
 
 
 /* pci driver glue; this is a "new style" PCI driver module */
 /* pci driver glue; this is a "new style" PCI driver module */
 static struct pci_driver ehci_pci_driver = {
 static struct pci_driver ehci_pci_driver = {
@@ -393,22 +374,22 @@ static struct pci_driver ehci_pci_driver = {
 #endif
 #endif
 };
 };
 
 
-static int __init ehci_hcd_pci_init (void)
+static int __init ehci_hcd_pci_init(void)
 {
 {
 	if (usb_disabled())
 	if (usb_disabled())
 		return -ENODEV;
 		return -ENODEV;
 
 
-	pr_debug ("%s: block sizes: qh %Zd qtd %Zd itd %Zd sitd %Zd\n",
+	pr_debug("%s: block sizes: qh %Zd qtd %Zd itd %Zd sitd %Zd\n",
 		hcd_name,
 		hcd_name,
-		sizeof (struct ehci_qh), sizeof (struct ehci_qtd),
-		sizeof (struct ehci_itd), sizeof (struct ehci_sitd));
+		sizeof(struct ehci_qh), sizeof(struct ehci_qtd),
+		sizeof(struct ehci_itd), sizeof(struct ehci_sitd));
 
 
-	return pci_register_driver (&ehci_pci_driver);
+	return pci_register_driver(&ehci_pci_driver);
 }
 }
-module_init (ehci_hcd_pci_init);
+module_init(ehci_hcd_pci_init);
 
 
-static void __exit ehci_hcd_pci_cleanup (void)
+static void __exit ehci_hcd_pci_cleanup(void)
 {
 {
-	pci_unregister_driver (&ehci_pci_driver);
+	pci_unregister_driver(&ehci_pci_driver);
 }
 }
-module_exit (ehci_hcd_pci_cleanup);
+module_exit(ehci_hcd_pci_cleanup);

+ 0 - 36
drivers/usb/host/ohci-pci.c

@@ -14,15 +14,6 @@
  * This file is licenced under the GPL.
  * This file is licenced under the GPL.
  */
  */
  
  
-#include <linux/jiffies.h>
-
-#ifdef CONFIG_PPC_PMAC
-#include <asm/machdep.h>
-#include <asm/pmac_feature.h>
-#include <asm/pci-bridge.h>
-#include <asm/prom.h>
-#endif
-
 #ifndef CONFIG_PCI
 #ifndef CONFIG_PCI
 #error "This file is PCI bus glue.  CONFIG_PCI must be defined."
 #error "This file is PCI bus glue.  CONFIG_PCI must be defined."
 #endif
 #endif
@@ -115,39 +106,12 @@ ohci_pci_start (struct usb_hcd *hcd)
 static int ohci_pci_suspend (struct usb_hcd *hcd, pm_message_t message)
 static int ohci_pci_suspend (struct usb_hcd *hcd, pm_message_t message)
 {
 {
 	/* root hub was already suspended */
 	/* root hub was already suspended */
-
-	/* FIXME these PMAC things get called in the wrong places.  ASIC
-	 * clocks should be turned off AFTER entering D3, and on BEFORE
-	 * trying to enter D0.  Evidently the PCI layer doesn't currently
-	 * provide the right sort of platform hooks for this ...
-	 */
-#ifdef CONFIG_PPC_PMAC
-	if (_machine == _MACH_Pmac) {
-	   	struct device_node	*of_node;
- 
-		/* Disable USB PAD & cell clock */
-		of_node = pci_device_to_OF_node (to_pci_dev(hcd->self.controller));
-		if (of_node)
-			pmac_call_feature(PMAC_FTR_USB_ENABLE, of_node, 0, 0);
-	}
-#endif /* CONFIG_PPC_PMAC */
 	return 0;
 	return 0;
 }
 }
 
 
 
 
 static int ohci_pci_resume (struct usb_hcd *hcd)
 static int ohci_pci_resume (struct usb_hcd *hcd)
 {
 {
-#ifdef CONFIG_PPC_PMAC
-	if (_machine == _MACH_Pmac) {
-		struct device_node *of_node;
-
-		/* Re-enable USB PAD & cell clock */
-		of_node = pci_device_to_OF_node (to_pci_dev(hcd->self.controller));
-		if (of_node)
-			pmac_call_feature (PMAC_FTR_USB_ENABLE, of_node, 0, 1);
-	}
-#endif /* CONFIG_PPC_PMAC */
-
 	usb_hcd_resume_root_hub(hcd);
 	usb_hcd_resume_root_hub(hcd);
 	return 0;
 	return 0;
 }
 }

+ 1 - 1
drivers/usb/media/sn9c102_core.c

@@ -199,7 +199,7 @@ static void sn9c102_release_buffers(struct sn9c102_device* cam)
 {
 {
 	if (cam->nbuffers) {
 	if (cam->nbuffers) {
 		rvfree(cam->frame[0].bufmem,
 		rvfree(cam->frame[0].bufmem,
-		       cam->nbuffers * cam->frame[0].buf.length);
+		       cam->nbuffers * PAGE_ALIGN(cam->frame[0].buf.length));
 		cam->nbuffers = 0;
 		cam->nbuffers = 0;
 	}
 	}
 }
 }

+ 2 - 0
drivers/usb/serial/ftdi_sio.c

@@ -475,6 +475,8 @@ static struct usb_device_id id_table_combined [] = {
 	{ USB_DEVICE(FTDI_VID, FTDI_ARTEMIS_PID) },
 	{ USB_DEVICE(FTDI_VID, FTDI_ARTEMIS_PID) },
 	{ USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16_PID) },
 	{ USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16_PID) },
 	{ USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16HR_PID) },
 	{ USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16HR_PID) },
+	{ USB_DEVICE(KOBIL_VID, KOBIL_CONV_B1_PID) },
+	{ USB_DEVICE(KOBIL_VID, KOBIL_CONV_KAAN_PID) },
 	{ },					/* Optional parameter entry */
 	{ },					/* Optional parameter entry */
 	{ }					/* Terminating entry */
 	{ }					/* Terminating entry */
 };
 };

+ 7 - 0
drivers/usb/serial/ftdi_sio.h

@@ -127,6 +127,13 @@
 #define SEALEVEL_2803_7_PID	0X2873 	/* SeaLINK+8 (2803) Port 7 */
 #define SEALEVEL_2803_7_PID	0X2873 	/* SeaLINK+8 (2803) Port 7 */
 #define SEALEVEL_2803_8_PID	0X2883 	/* SeaLINK+8 (2803) Port 8 */
 #define SEALEVEL_2803_8_PID	0X2883 	/* SeaLINK+8 (2803) Port 8 */
 
 
+/*
+ * The following are the values for two KOBIL chipcard terminals.
+ */
+#define KOBIL_VID		0x0d46	/* KOBIL Vendor ID */
+#define KOBIL_CONV_B1_PID	0x2020	/* KOBIL Konverter for B1 */
+#define KOBIL_CONV_KAAN_PID	0x2021	/* KOBIL_Konverter for KAAN */
+
 /*
 /*
  * DSS-20 Sync Station for Sony Ericsson P800
  * DSS-20 Sync Station for Sony Ericsson P800
  */
  */

+ 0 - 1
drivers/usb/serial/ipw.c

@@ -46,7 +46,6 @@
 #include <linux/module.h>
 #include <linux/module.h>
 #include <linux/spinlock.h>
 #include <linux/spinlock.h>
 #include <linux/usb.h>
 #include <linux/usb.h>
-#include <linux/usb.h>
 #include <asm/uaccess.h>
 #include <asm/uaccess.h>
 #include "usb-serial.h"
 #include "usb-serial.h"
 
 

+ 9 - 0
drivers/usb/storage/unusual_devs.h

@@ -1118,6 +1118,15 @@ UNUSUAL_DEV(  0x2735, 0x100b, 0x0000, 0x9999,
 		US_SC_DEVICE, US_PR_DEVICE, NULL,
 		US_SC_DEVICE, US_PR_DEVICE, NULL,
 		US_FL_GO_SLOW ),
 		US_FL_GO_SLOW ),
 
 
+/*
+ * David Härdeman <david@2gen.com>
+ * The key makes the SCSI stack print confusing (but harmless) messages
+ */
+UNUSUAL_DEV(  0x4146, 0xba01, 0x0100, 0x0100,
+		"Iomega",
+		"Micro Mini 1GB",
+		US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_NOT_LOCKABLE ),
+
 #ifdef CONFIG_USB_STORAGE_SDDR55
 #ifdef CONFIG_USB_STORAGE_SDDR55
 UNUSUAL_DEV(  0x55aa, 0xa103, 0x0000, 0x9999, 
 UNUSUAL_DEV(  0x55aa, 0xa103, 0x0000, 0x9999, 
 		"Sandisk",
 		"Sandisk",

+ 5 - 1
drivers/video/fbmem.c

@@ -452,13 +452,17 @@ int fb_prepare_logo(struct fb_info *info, int rotate)
 
 
 	/* Return if no suitable logo was found */
 	/* Return if no suitable logo was found */
 	fb_logo.logo = fb_find_logo(depth);
 	fb_logo.logo = fb_find_logo(depth);
+
+	if (!fb_logo.logo) {
+		return 0;
+	}
 	
 	
 	if (rotate == FB_ROTATE_UR || rotate == FB_ROTATE_UD)
 	if (rotate == FB_ROTATE_UR || rotate == FB_ROTATE_UD)
 		yres = info->var.yres;
 		yres = info->var.yres;
 	else
 	else
 		yres = info->var.xres;
 		yres = info->var.xres;
 
 
-	if (fb_logo.logo && fb_logo.logo->height > yres) {
+	if (fb_logo.logo->height > yres) {
 		fb_logo.logo = NULL;
 		fb_logo.logo = NULL;
 		return 0;
 		return 0;
 	}
 	}

+ 4 - 4
fs/exec.c

@@ -668,7 +668,7 @@ static inline int de_thread(struct task_struct *tsk)
 	if (!thread_group_leader(current)) {
 	if (!thread_group_leader(current)) {
 		struct task_struct *parent;
 		struct task_struct *parent;
 		struct dentry *proc_dentry1, *proc_dentry2;
 		struct dentry *proc_dentry1, *proc_dentry2;
-		unsigned long exit_state, ptrace;
+		unsigned long ptrace;
 
 
 		/*
 		/*
 		 * Wait for the thread group leader to be a zombie.
 		 * Wait for the thread group leader to be a zombie.
@@ -726,15 +726,15 @@ static inline int de_thread(struct task_struct *tsk)
 		list_del(&current->tasks);
 		list_del(&current->tasks);
 		list_add_tail(&current->tasks, &init_task.tasks);
 		list_add_tail(&current->tasks, &init_task.tasks);
 		current->exit_signal = SIGCHLD;
 		current->exit_signal = SIGCHLD;
-		exit_state = leader->exit_state;
+
+		BUG_ON(leader->exit_state != EXIT_ZOMBIE);
+		leader->exit_state = EXIT_DEAD;
 
 
 		write_unlock_irq(&tasklist_lock);
 		write_unlock_irq(&tasklist_lock);
 		spin_unlock(&leader->proc_lock);
 		spin_unlock(&leader->proc_lock);
 		spin_unlock(&current->proc_lock);
 		spin_unlock(&current->proc_lock);
 		proc_pid_flush(proc_dentry1);
 		proc_pid_flush(proc_dentry1);
 		proc_pid_flush(proc_dentry2);
 		proc_pid_flush(proc_dentry2);
-
-		BUG_ON(exit_state != EXIT_ZOMBIE);
         }
         }
 
 
 	/*
 	/*

+ 4 - 4
fs/jffs2/debug.h

@@ -82,28 +82,28 @@
 	do {								\
 	do {								\
 		printk(JFFS2_ERR_MSG_PREFIX				\
 		printk(JFFS2_ERR_MSG_PREFIX				\
 			" (%d) %s: " fmt, current->pid,			\
 			" (%d) %s: " fmt, current->pid,			\
-			__FUNCTION__, ##__VA_ARGS__);			\
+			__FUNCTION__ , ##__VA_ARGS__);			\
 	} while(0)
 	} while(0)
 
 
 #define JFFS2_WARNING(fmt, ...)						\
 #define JFFS2_WARNING(fmt, ...)						\
 	do {								\
 	do {								\
 		printk(JFFS2_WARN_MSG_PREFIX				\
 		printk(JFFS2_WARN_MSG_PREFIX				\
 			" (%d) %s: " fmt, current->pid,			\
 			" (%d) %s: " fmt, current->pid,			\
-			__FUNCTION__, ##__VA_ARGS__);			\
+			__FUNCTION__ , ##__VA_ARGS__);			\
 	} while(0)
 	} while(0)
 
 
 #define JFFS2_NOTICE(fmt, ...)						\
 #define JFFS2_NOTICE(fmt, ...)						\
 	do {								\
 	do {								\
 		printk(JFFS2_NOTICE_MSG_PREFIX				\
 		printk(JFFS2_NOTICE_MSG_PREFIX				\
 			" (%d) %s: " fmt, current->pid,			\
 			" (%d) %s: " fmt, current->pid,			\
-			__FUNCTION__, ##__VA_ARGS__);			\
+			__FUNCTION__ , ##__VA_ARGS__);			\
 	} while(0)
 	} while(0)
 
 
 #define JFFS2_DEBUG(fmt, ...)						\
 #define JFFS2_DEBUG(fmt, ...)						\
 	do {								\
 	do {								\
 		printk(JFFS2_DBG_MSG_PREFIX				\
 		printk(JFFS2_DBG_MSG_PREFIX				\
 			" (%d) %s: " fmt, current->pid,			\
 			" (%d) %s: " fmt, current->pid,			\
-			__FUNCTION__, ##__VA_ARGS__);			\
+			__FUNCTION__ , ##__VA_ARGS__);			\
 	} while(0)
 	} while(0)
 
 
 /*
 /*

+ 5 - 2
include/asm-alpha/atomic.h

@@ -118,8 +118,6 @@ static __inline__ long atomic_add_return(int i, atomic_t * v)
 	return result;
 	return result;
 }
 }
 
 
-#define atomic_add_negative(a, v)	(atomic_add_return((a), (v)) < 0)
-
 static __inline__ long atomic64_add_return(long i, atomic64_t * v)
 static __inline__ long atomic64_add_return(long i, atomic64_t * v)
 {
 {
 	long temp, result;
 	long temp, result;
@@ -189,6 +187,9 @@ static __inline__ long atomic64_sub_return(long i, atomic64_t * v)
 })
 })
 #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
 #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
 
 
+#define atomic_add_negative(a, v) (atomic_add_return((a), (v)) < 0)
+#define atomic64_add_negative(a, v) (atomic64_add_return((a), (v)) < 0)
+
 #define atomic_dec_return(v) atomic_sub_return(1,(v))
 #define atomic_dec_return(v) atomic_sub_return(1,(v))
 #define atomic64_dec_return(v) atomic64_sub_return(1,(v))
 #define atomic64_dec_return(v) atomic64_sub_return(1,(v))
 
 
@@ -199,6 +200,8 @@ static __inline__ long atomic64_sub_return(long i, atomic64_t * v)
 #define atomic64_sub_and_test(i,v) (atomic64_sub_return((i), (v)) == 0)
 #define atomic64_sub_and_test(i,v) (atomic64_sub_return((i), (v)) == 0)
 
 
 #define atomic_inc_and_test(v) (atomic_add_return(1, (v)) == 0)
 #define atomic_inc_and_test(v) (atomic_add_return(1, (v)) == 0)
+#define atomic64_inc_and_test(v) (atomic64_add_return(1, (v)) == 0)
+
 #define atomic_dec_and_test(v) (atomic_sub_return(1, (v)) == 0)
 #define atomic_dec_and_test(v) (atomic_sub_return(1, (v)) == 0)
 #define atomic64_dec_and_test(v) (atomic64_sub_return(1, (v)) == 0)
 #define atomic64_dec_and_test(v) (atomic64_sub_return(1, (v)) == 0)
 
 

+ 1 - 1
include/asm-arm/arch-iop3xx/timex.h

@@ -4,7 +4,7 @@
  * IOP3xx architecture timex specifications
  * IOP3xx architecture timex specifications
  */
  */
 #include <linux/config.h>
 #include <linux/config.h>
-
+#include <asm/hardware.h>
 
 
 #if defined(CONFIG_ARCH_IQ80321) || defined(CONFIG_ARCH_IQ31244)
 #if defined(CONFIG_ARCH_IQ80321) || defined(CONFIG_ARCH_IQ31244)
 
 

+ 3 - 3
include/asm-powerpc/page_64.h

@@ -135,9 +135,9 @@ extern unsigned int HPAGE_SHIFT;
 
 
 #define in_hugepage_area(context, addr) \
 #define in_hugepage_area(context, addr) \
 	(cpu_has_feature(CPU_FTR_16M_PAGE) && \
 	(cpu_has_feature(CPU_FTR_16M_PAGE) && \
-	 ( ((1 << GET_HTLB_AREA(addr)) & (context).high_htlb_areas) || \
-	   ( ((addr) < 0x100000000L) && \
-	     ((1 << GET_ESID(addr)) & (context).low_htlb_areas) ) ) )
+	 ( ( (addr) >= 0x100000000UL) \
+	   ? ((1 << GET_HTLB_AREA(addr)) & (context).high_htlb_areas) \
+	   : ((1 << GET_ESID(addr)) & (context).low_htlb_areas) ) )
 
 
 #else /* !CONFIG_HUGETLB_PAGE */
 #else /* !CONFIG_HUGETLB_PAGE */
 
 

+ 1 - 0
include/asm-sparc64/atomic.h

@@ -54,6 +54,7 @@ extern int atomic64_sub_ret(int, atomic64_t *);
  * other cases.
  * other cases.
  */
  */
 #define atomic_inc_and_test(v) (atomic_inc_return(v) == 0)
 #define atomic_inc_and_test(v) (atomic_inc_return(v) == 0)
+#define atomic64_inc_and_test(v) (atomic64_inc_return(v) == 0)
 
 
 #define atomic_sub_and_test(i, v) (atomic_sub_ret(i, v) == 0)
 #define atomic_sub_and_test(i, v) (atomic_sub_ret(i, v) == 0)
 #define atomic64_sub_and_test(i, v) (atomic64_sub_ret(i, v) == 0)
 #define atomic64_sub_and_test(i, v) (atomic64_sub_ret(i, v) == 0)

+ 38 - 13
include/asm-x86_64/atomic.h

@@ -160,8 +160,8 @@ static __inline__ int atomic_inc_and_test(atomic_t *v)
 
 
 /**
 /**
  * atomic_add_negative - add and test if negative
  * atomic_add_negative - add and test if negative
- * @v: pointer of type atomic_t
  * @i: integer value to add
  * @i: integer value to add
+ * @v: pointer of type atomic_t
  * 
  * 
  * Atomically adds @i to @v and returns true
  * Atomically adds @i to @v and returns true
  * if the result is negative, or false when
  * if the result is negative, or false when
@@ -178,6 +178,31 @@ static __inline__ int atomic_add_negative(int i, atomic_t *v)
 	return c;
 	return c;
 }
 }
 
 
+/**
+ * atomic_add_return - add and return
+ * @i: integer value to add
+ * @v: pointer of type atomic_t
+ *
+ * Atomically adds @i to @v and returns @i + @v
+ */
+static __inline__ int atomic_add_return(int i, atomic_t *v)
+{
+	int __i = i;
+	__asm__ __volatile__(
+		LOCK "xaddl %0, %1;"
+		:"=r"(i)
+		:"m"(v->counter), "0"(i));
+	return i + __i;
+}
+
+static __inline__ int atomic_sub_return(int i, atomic_t *v)
+{
+	return atomic_add_return(-i,v);
+}
+
+#define atomic_inc_return(v)  (atomic_add_return(1,v))
+#define atomic_dec_return(v)  (atomic_sub_return(1,v))
+
 /* An 64bit atomic type */
 /* An 64bit atomic type */
 
 
 typedef struct { volatile long counter; } atomic64_t;
 typedef struct { volatile long counter; } atomic64_t;
@@ -320,14 +345,14 @@ static __inline__ int atomic64_inc_and_test(atomic64_t *v)
 
 
 /**
 /**
  * atomic64_add_negative - add and test if negative
  * atomic64_add_negative - add and test if negative
- * @v: pointer to atomic64_t
  * @i: integer value to add
  * @i: integer value to add
+ * @v: pointer to type atomic64_t
  *
  *
  * Atomically adds @i to @v and returns true
  * Atomically adds @i to @v and returns true
  * if the result is negative, or false when
  * if the result is negative, or false when
  * result is greater than or equal to zero.
  * result is greater than or equal to zero.
  */
  */
-static __inline__ long atomic64_add_negative(long i, atomic64_t *v)
+static __inline__ int atomic64_add_negative(long i, atomic64_t *v)
 {
 {
 	unsigned char c;
 	unsigned char c;
 
 
@@ -339,27 +364,30 @@ static __inline__ long atomic64_add_negative(long i, atomic64_t *v)
 }
 }
 
 
 /**
 /**
- * atomic_add_return - add and return
- * @v: pointer of type atomic_t
+ * atomic64_add_return - add and return
  * @i: integer value to add
  * @i: integer value to add
+ * @v: pointer to type atomic64_t
  *
  *
  * Atomically adds @i to @v and returns @i + @v
  * Atomically adds @i to @v and returns @i + @v
  */
  */
-static __inline__ int atomic_add_return(int i, atomic_t *v)
+static __inline__ long atomic64_add_return(long i, atomic64_t *v)
 {
 {
-	int __i = i;
+	long __i = i;
 	__asm__ __volatile__(
 	__asm__ __volatile__(
-		LOCK "xaddl %0, %1;"
+		LOCK "xaddq %0, %1;"
 		:"=r"(i)
 		:"=r"(i)
 		:"m"(v->counter), "0"(i));
 		:"m"(v->counter), "0"(i));
 	return i + __i;
 	return i + __i;
 }
 }
 
 
-static __inline__ int atomic_sub_return(int i, atomic_t *v)
+static __inline__ long atomic64_sub_return(long i, atomic64_t *v)
 {
 {
-	return atomic_add_return(-i,v);
+	return atomic64_add_return(-i,v);
 }
 }
 
 
+#define atomic64_inc_return(v)  (atomic64_add_return(1,v))
+#define atomic64_dec_return(v)  (atomic64_sub_return(1,v))
+
 #define atomic_cmpxchg(v, old, new) ((int)cmpxchg(&((v)->counter), old, new))
 #define atomic_cmpxchg(v, old, new) ((int)cmpxchg(&((v)->counter), old, new))
 
 
 /**
 /**
@@ -381,9 +409,6 @@ static __inline__ int atomic_sub_return(int i, atomic_t *v)
 })
 })
 #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
 #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
 
 
-#define atomic_inc_return(v)  (atomic_add_return(1,v))
-#define atomic_dec_return(v)  (atomic_sub_return(1,v))
-
 /* These are x86-specific, used by some header files */
 /* These are x86-specific, used by some header files */
 #define atomic_clear_mask(mask, addr) \
 #define atomic_clear_mask(mask, addr) \
 __asm__ __volatile__(LOCK "andl %0,%1" \
 __asm__ __volatile__(LOCK "andl %0,%1" \

+ 1 - 7
include/linux/smp.h

@@ -94,13 +94,7 @@ void smp_prepare_boot_cpu(void);
  */
  */
 #define raw_smp_processor_id()			0
 #define raw_smp_processor_id()			0
 #define hard_smp_processor_id()			0
 #define hard_smp_processor_id()			0
-
-static inline int smp_call_function(void (*func) (void *info), void *info,
-				    int retry, int wait)
-{
-	return 0;
-}
-
+#define smp_call_function(func,info,retry,wait)	({ 0; })
 #define on_each_cpu(func,info,retry,wait)	({ func(info); 0; })
 #define on_each_cpu(func,info,retry,wait)	({ func(info); 0; })
 static inline void smp_send_reschedule(int cpu) { }
 static inline void smp_send_reschedule(int cpu) { }
 #define num_booting_cpus()			1
 #define num_booting_cpus()			1

+ 1 - 0
include/linux/usb.h

@@ -47,6 +47,7 @@ struct usb_driver;
  * @urb_list: urbs queued to this endpoint; maintained by usbcore
  * @urb_list: urbs queued to this endpoint; maintained by usbcore
  * @hcpriv: for use by HCD; typically holds hardware dma queue head (QH)
  * @hcpriv: for use by HCD; typically holds hardware dma queue head (QH)
  *	with one or more transfer descriptors (TDs) per urb
  *	with one or more transfer descriptors (TDs) per urb
+ * @kobj: kobject for sysfs info
  * @extra: descriptors following this endpoint in the configuration
  * @extra: descriptors following this endpoint in the configuration
  * @extralen: how many bytes of "extra" are valid
  * @extralen: how many bytes of "extra" are valid
  *
  *

+ 0 - 15
kernel/futex.c

@@ -201,21 +201,6 @@ static int get_futex_key(unsigned long uaddr, union futex_key *key)
 	 * from swap.  But that's a lot of code to duplicate here
 	 * from swap.  But that's a lot of code to duplicate here
 	 * for a rare case, so we simply fetch the page.
 	 * for a rare case, so we simply fetch the page.
 	 */
 	 */
-
-	/*
-	 * Do a quick atomic lookup first - this is the fastpath.
-	 */
-	page = follow_page(mm, uaddr, FOLL_TOUCH|FOLL_GET);
-	if (likely(page != NULL)) {
-		key->shared.pgoff =
-			page->index << (PAGE_CACHE_SHIFT - PAGE_SHIFT);
-		put_page(page);
-		return 0;
-	}
-
-	/*
-	 * Do it the general way.
-	 */
 	err = get_user_pages(current, mm, uaddr, 1, 0, 0, &page, NULL);
 	err = get_user_pages(current, mm, uaddr, 1, 0, 0, &page, NULL);
 	if (err >= 0) {
 	if (err >= 0) {
 		key->shared.pgoff =
 		key->shared.pgoff =

+ 15 - 0
kernel/irq/manage.c

@@ -36,6 +36,9 @@ void synchronize_irq(unsigned int irq)
 {
 {
 	struct irq_desc *desc = irq_desc + irq;
 	struct irq_desc *desc = irq_desc + irq;
 
 
+	if (irq >= NR_IRQS)
+		return;
+
 	while (desc->status & IRQ_INPROGRESS)
 	while (desc->status & IRQ_INPROGRESS)
 		cpu_relax();
 		cpu_relax();
 }
 }
@@ -60,6 +63,9 @@ void disable_irq_nosync(unsigned int irq)
 	irq_desc_t *desc = irq_desc + irq;
 	irq_desc_t *desc = irq_desc + irq;
 	unsigned long flags;
 	unsigned long flags;
 
 
+	if (irq >= NR_IRQS)
+		return;
+
 	spin_lock_irqsave(&desc->lock, flags);
 	spin_lock_irqsave(&desc->lock, flags);
 	if (!desc->depth++) {
 	if (!desc->depth++) {
 		desc->status |= IRQ_DISABLED;
 		desc->status |= IRQ_DISABLED;
@@ -86,6 +92,9 @@ void disable_irq(unsigned int irq)
 {
 {
 	irq_desc_t *desc = irq_desc + irq;
 	irq_desc_t *desc = irq_desc + irq;
 
 
+	if (irq >= NR_IRQS)
+		return;
+
 	disable_irq_nosync(irq);
 	disable_irq_nosync(irq);
 	if (desc->action)
 	if (desc->action)
 		synchronize_irq(irq);
 		synchronize_irq(irq);
@@ -108,6 +117,9 @@ void enable_irq(unsigned int irq)
 	irq_desc_t *desc = irq_desc + irq;
 	irq_desc_t *desc = irq_desc + irq;
 	unsigned long flags;
 	unsigned long flags;
 
 
+	if (irq >= NR_IRQS)
+		return;
+
 	spin_lock_irqsave(&desc->lock, flags);
 	spin_lock_irqsave(&desc->lock, flags);
 	switch (desc->depth) {
 	switch (desc->depth) {
 	case 0:
 	case 0:
@@ -163,6 +175,9 @@ int setup_irq(unsigned int irq, struct irqaction * new)
 	unsigned long flags;
 	unsigned long flags;
 	int shared = 0;
 	int shared = 0;
 
 
+	if (irq >= NR_IRQS)
+		return -EINVAL;
+
 	if (desc->handler == &no_irq_type)
 	if (desc->handler == &no_irq_type)
 		return -ENOSYS;
 		return -ENOSYS;
 	/*
 	/*

+ 1 - 1
kernel/printk.c

@@ -956,7 +956,7 @@ int unregister_console(struct console *console)
 	if (console_drivers == console) {
 	if (console_drivers == console) {
 		console_drivers=console->next;
 		console_drivers=console->next;
 		res = 0;
 		res = 0;
-	} else {
+	} else if (console_drivers) {
 		for (a=console_drivers->next, b=console_drivers ;
 		for (a=console_drivers->next, b=console_drivers ;
 		     a; b=a, a=b->next) {
 		     a; b=a, a=b->next) {
 			if (a == console) {
 			if (a == console) {

+ 2 - 4
mm/Kconfig

@@ -125,12 +125,10 @@ comment "Memory hotplug is currently incompatible with Software Suspend"
 # space can be handled with less contention: split it at this NR_CPUS.
 # space can be handled with less contention: split it at this NR_CPUS.
 # Default to 4 for wider testing, though 8 might be more appropriate.
 # Default to 4 for wider testing, though 8 might be more appropriate.
 # ARM's adjust_pte (unused if VIPT) depends on mm-wide page_table_lock.
 # ARM's adjust_pte (unused if VIPT) depends on mm-wide page_table_lock.
-# PA-RISC's debug spinlock_t is too large for the 32-bit struct page.
-# ARM26 and SPARC32 and PPC64 may use one page for multiple page tables.
+# PA-RISC 7xxx's spinlock_t would enlarge struct page from 32 to 44 bytes.
 #
 #
 config SPLIT_PTLOCK_CPUS
 config SPLIT_PTLOCK_CPUS
 	int
 	int
 	default "4096" if ARM && !CPU_CACHE_VIPT
 	default "4096" if ARM && !CPU_CACHE_VIPT
-	default "4096" if PARISC && DEBUG_SPINLOCK && !64BIT
-	default "4096" if ARM26 || SPARC32 || PPC64
+	default "4096" if PARISC && !PA20
 	default "4"
 	default "4"

+ 3 - 3
mm/truncate.c

@@ -282,8 +282,8 @@ int invalidate_inode_pages2_range(struct address_space *mapping,
 					 * Zap the rest of the file in one hit.
 					 * Zap the rest of the file in one hit.
 					 */
 					 */
 					unmap_mapping_range(mapping,
 					unmap_mapping_range(mapping,
-					    page_index << PAGE_CACHE_SHIFT,
-					    (end - page_index + 1)
+					   (loff_t)page_index<<PAGE_CACHE_SHIFT,
+					   (loff_t)(end - page_index + 1)
 							<< PAGE_CACHE_SHIFT,
 							<< PAGE_CACHE_SHIFT,
 					    0);
 					    0);
 					did_range_unmap = 1;
 					did_range_unmap = 1;
@@ -292,7 +292,7 @@ int invalidate_inode_pages2_range(struct address_space *mapping,
 					 * Just zap this page
 					 * Just zap this page
 					 */
 					 */
 					unmap_mapping_range(mapping,
 					unmap_mapping_range(mapping,
-					  page_index << PAGE_CACHE_SHIFT,
+					  (loff_t)page_index<<PAGE_CACHE_SHIFT,
 					  PAGE_CACHE_SIZE, 0);
 					  PAGE_CACHE_SIZE, 0);
 				}
 				}
 			}
 			}

+ 1 - 0
net/bridge/br_if.c

@@ -366,6 +366,7 @@ int br_add_if(struct net_bridge *br, struct net_device *dev)
 
 
 		spin_lock_bh(&br->lock);
 		spin_lock_bh(&br->lock);
 		br_stp_recalculate_bridge_id(br);
 		br_stp_recalculate_bridge_id(br);
+		br_features_recompute(br);
 		if ((br->dev->flags & IFF_UP) 
 		if ((br->dev->flags & IFF_UP) 
 		    && (dev->flags & IFF_UP) && netif_carrier_ok(dev))
 		    && (dev->flags & IFF_UP) && netif_carrier_ok(dev))
 			br_stp_enable_port(p);
 			br_stp_enable_port(p);

+ 1 - 0
net/ipv4/netfilter/ip_conntrack_netlink.c

@@ -27,6 +27,7 @@
 #include <linux/errno.h>
 #include <linux/errno.h>
 #include <linux/netlink.h>
 #include <linux/netlink.h>
 #include <linux/spinlock.h>
 #include <linux/spinlock.h>
+#include <linux/interrupt.h>
 #include <linux/notifier.h>
 #include <linux/notifier.h>
 
 
 #include <linux/netfilter.h>
 #include <linux/netfilter.h>