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

Maximilian Attems maks at alioth.debian.org
Mon Dec 15 09:53:47 UTC 2008


Author: maks
Date: Mon Dec 15 09:53:45 2008
New Revision: 12506

Log:
add stable release 2.6.27.9

Added:
   dists/trunk/linux-2.6/debian/patches/bugfix/all/stable/patch-2.6.27.9
Modified:
   dists/trunk/linux-2.6/debian/changelog
   dists/trunk/linux-2.6/debian/patches/series/1~experimental.1

Modified: dists/trunk/linux-2.6/debian/changelog
==============================================================================
--- dists/trunk/linux-2.6/debian/changelog	(original)
+++ dists/trunk/linux-2.6/debian/changelog	Mon Dec 15 09:53:45 2008
@@ -18,7 +18,7 @@
     EDAC_I5100, RTC_DRV_M41T94, RTC_DRV_DS1305, UBIFS.
   * [x86] set MOUSE_BCM5974, X86_RESERVE_LOW_64K.
   * [x86_64] set AMD_IOMMU, MTRR_SANITIZER.
-  * Add stable releases 2.6.27.1-2.6.27.8.
+  * Add stable releases 2.6.27.1-2.6.27.9.
 
   [ Martin Michlmayr ]
   * [mips/r4k-ip22, mips/sb1-bcm91250a] Don't build in ISO9660.

Added: dists/trunk/linux-2.6/debian/patches/bugfix/all/stable/patch-2.6.27.9
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/bugfix/all/stable/patch-2.6.27.9	Mon Dec 15 09:53:45 2008
@@ -0,0 +1,3018 @@
+diff --git a/arch/powerpc/kernel/cpu_setup_44x.S b/arch/powerpc/kernel/cpu_setup_44x.S
+index 80cac98..f812452 100644
+--- a/arch/powerpc/kernel/cpu_setup_44x.S
++++ b/arch/powerpc/kernel/cpu_setup_44x.S
+@@ -35,6 +35,7 @@ _GLOBAL(__setup_cpu_440grx)
+ _GLOBAL(__setup_cpu_460ex)
+ _GLOBAL(__setup_cpu_460gt)
+ 	b	__init_fpu_44x
++_GLOBAL(__setup_cpu_440x5)
+ _GLOBAL(__setup_cpu_440gx)
+ _GLOBAL(__setup_cpu_440spe)
+ 	b	__fixup_440A_mcheck
+diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c
+index 25c273c..2b88cae 100644
+--- a/arch/powerpc/kernel/cputable.c
++++ b/arch/powerpc/kernel/cputable.c
+@@ -39,6 +39,7 @@ extern void __setup_cpu_440epx(unsigned long offset, struct cpu_spec* spec);
+ extern void __setup_cpu_440gx(unsigned long offset, struct cpu_spec* spec);
+ extern void __setup_cpu_440grx(unsigned long offset, struct cpu_spec* spec);
+ extern void __setup_cpu_440spe(unsigned long offset, struct cpu_spec* spec);
++extern void __setup_cpu_440x5(unsigned long offset, struct cpu_spec* spec);
+ extern void __setup_cpu_460ex(unsigned long offset, struct cpu_spec* spec);
+ extern void __setup_cpu_460gt(unsigned long offset, struct cpu_spec* spec);
+ extern void __setup_cpu_603(unsigned long offset, struct cpu_spec* spec);
+@@ -1463,6 +1464,8 @@ static struct cpu_spec __initdata cpu_specs[] = {
+ 		.cpu_user_features	= COMMON_USER_BOOKE,
+ 		.icache_bsize		= 32,
+ 		.dcache_bsize		= 32,
++		.cpu_setup		= __setup_cpu_440x5,
++		.machine_check		= machine_check_440A,
+ 		.platform		= "ppc440",
+ 	},
+ 	{ /* 460EX */
+diff --git a/arch/powerpc/platforms/cell/smp.c b/arch/powerpc/platforms/cell/smp.c
+index efb3964..c0d86e1 100644
+--- a/arch/powerpc/platforms/cell/smp.c
++++ b/arch/powerpc/platforms/cell/smp.c
+@@ -54,8 +54,8 @@
+ #endif
+ 
+ /*
+- * The primary thread of each non-boot processor is recorded here before
+- * smp init.
++ * The Primary thread of each non-boot processor was started from the OF client
++ * interface by prom_hold_cpus and is spinning on secondary_hold_spinloop.
+  */
+ static cpumask_t of_spin_map;
+ 
+@@ -208,11 +208,7 @@ void __init smp_init_cell(void)
+ 	/* Mark threads which are still spinning in hold loops. */
+ 	if (cpu_has_feature(CPU_FTR_SMT)) {
+ 		for_each_present_cpu(i) {
+-			if (i % 2 == 0)
+-				/*
+-				 * Even-numbered logical cpus correspond to
+-				 * primary threads.
+-				 */
++			if (cpu_thread_in_core(i) == 0)
+ 				cpu_set(i, of_spin_map);
+ 		}
+ 	} else {
+diff --git a/arch/powerpc/platforms/pseries/smp.c b/arch/powerpc/platforms/pseries/smp.c
+index 9d8f8c8..c9337c7 100644
+--- a/arch/powerpc/platforms/pseries/smp.c
++++ b/arch/powerpc/platforms/pseries/smp.c
+@@ -52,8 +52,8 @@
+ 
+ 
+ /*
+- * The primary thread of each non-boot processor is recorded here before
+- * smp init.
++ * The Primary thread of each non-boot processor was started from the OF client
++ * interface by prom_hold_cpus and is spinning on secondary_hold_spinloop.
+  */
+ static cpumask_t of_spin_map;
+ 
+@@ -191,8 +191,7 @@ static void __devinit smp_pSeries_kick_cpu(int nr)
+ static int smp_pSeries_cpu_bootable(unsigned int nr)
+ {
+ 	/* Special case - we inhibit secondary thread startup
+-	 * during boot if the user requests it.  Odd-numbered
+-	 * cpus are assumed to be secondary threads.
++	 * during boot if the user requests it.
+ 	 */
+ 	if (system_state < SYSTEM_RUNNING &&
+ 	    cpu_has_feature(CPU_FTR_SMT) &&
+@@ -229,11 +228,7 @@ static void __init smp_init_pseries(void)
+ 	/* Mark threads which are still spinning in hold loops. */
+ 	if (cpu_has_feature(CPU_FTR_SMT)) {
+ 		for_each_present_cpu(i) { 
+-			if (i % 2 == 0)
+-				/*
+-				 * Even-numbered logical cpus correspond to
+-				 * primary threads.
+-				 */
++			if (cpu_thread_in_core(i) == 0)
+ 				cpu_set(i, of_spin_map);
+ 		}
+ 	} else {
+diff --git a/arch/powerpc/sysdev/mpic.c b/arch/powerpc/sysdev/mpic.c
+index f6299cc..b24e1d0 100644
+--- a/arch/powerpc/sysdev/mpic.c
++++ b/arch/powerpc/sysdev/mpic.c
+@@ -1271,6 +1271,7 @@ void __init mpic_set_default_senses(struct mpic *mpic, u8 *senses, int count)
+ void __init mpic_init(struct mpic *mpic)
+ {
+ 	int i;
++	int cpu;
+ 
+ 	BUG_ON(mpic->num_sources == 0);
+ 
+@@ -1313,6 +1314,11 @@ void __init mpic_init(struct mpic *mpic)
+ 
+ 	mpic_pasemi_msi_init(mpic);
+ 
++	if (mpic->flags & MPIC_PRIMARY)
++		cpu = hard_smp_processor_id();
++	else
++		cpu = 0;
++
+ 	for (i = 0; i < mpic->num_sources; i++) {
+ 		/* start with vector = source number, and masked */
+ 		u32 vecpri = MPIC_VECPRI_MASK | i |
+@@ -1323,8 +1329,7 @@ void __init mpic_init(struct mpic *mpic)
+ 			continue;
+ 		/* init hw */
+ 		mpic_irq_write(i, MPIC_INFO(IRQ_VECTOR_PRI), vecpri);
+-		mpic_irq_write(i, MPIC_INFO(IRQ_DESTINATION),
+-			       1 << hard_smp_processor_id());
++		mpic_irq_write(i, MPIC_INFO(IRQ_DESTINATION), 1 << cpu);
+ 	}
+ 	
+ 	/* Init spurious vector */
+diff --git a/arch/sparc/include/asm/uaccess_64.h b/arch/sparc/include/asm/uaccess_64.h
+index 296ef30..c64e767 100644
+--- a/arch/sparc/include/asm/uaccess_64.h
++++ b/arch/sparc/include/asm/uaccess_64.h
+@@ -265,8 +265,8 @@ extern long __strnlen_user(const char __user *, long len);
+ 
+ #define strlen_user __strlen_user
+ #define strnlen_user __strnlen_user
+-#define __copy_to_user_inatomic __copy_to_user
+-#define __copy_from_user_inatomic __copy_from_user
++#define __copy_to_user_inatomic ___copy_to_user
++#define __copy_from_user_inatomic ___copy_from_user
+ 
+ #endif  /* __ASSEMBLY__ */
+ 
+diff --git a/arch/sparc64/kernel/pci.c b/arch/sparc64/kernel/pci.c
+index 80dad76..83b4725 100644
+--- a/arch/sparc64/kernel/pci.c
++++ b/arch/sparc64/kernel/pci.c
+@@ -1017,6 +1017,7 @@ static int __pci_mmap_make_offset(struct pci_dev *pdev,
+ 
+ 	for (i = 0; i <= PCI_ROM_RESOURCE; i++) {
+ 		struct resource *rp = &pdev->resource[i];
++		resource_size_t aligned_end;
+ 
+ 		/* Active? */
+ 		if (!rp->flags)
+@@ -1034,8 +1035,15 @@ static int __pci_mmap_make_offset(struct pci_dev *pdev,
+ 				continue;
+ 		}
+ 
++		/* Align the resource end to the next page address.
++		 * PAGE_SIZE intentionally added instead of (PAGE_SIZE - 1),
++		 * because actually we need the address of the next byte
++		 * after rp->end.
++		 */
++		aligned_end = (rp->end + PAGE_SIZE) & PAGE_MASK;
++
+ 		if ((rp->start <= user_paddr) &&
+-		    (user_paddr + user_size) <= (rp->end + 1UL))
++		    (user_paddr + user_size) <= aligned_end)
+ 			break;
+ 	}
+ 
+diff --git a/arch/sparc64/kernel/ptrace.c b/arch/sparc64/kernel/ptrace.c
+index 10306e4..2df5b9b 100644
+--- a/arch/sparc64/kernel/ptrace.c
++++ b/arch/sparc64/kernel/ptrace.c
+@@ -1014,7 +1014,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
+ 		break;
+ 
+ 	case PTRACE_SETFPREGS64:
+-		ret = copy_regset_to_user(child, view, REGSET_FP,
++		ret = copy_regset_from_user(child, view, REGSET_FP,
+ 					  0 * sizeof(u64),
+ 					  33 * sizeof(u64),
+ 					  fps);
+diff --git a/arch/sparc64/kernel/visemul.c b/arch/sparc64/kernel/visemul.c
+index c3fd647..a4428fd 100644
+--- a/arch/sparc64/kernel/visemul.c
++++ b/arch/sparc64/kernel/visemul.c
+@@ -131,7 +131,7 @@
+ #define VIS_OPF_SHIFT	5
+ #define VIS_OPF_MASK	(0x1ff << VIS_OPF_SHIFT)
+ 
+-#define RS1(INSN)	(((INSN) >> 24) & 0x1f)
++#define RS1(INSN)	(((INSN) >> 14) & 0x1f)
+ #define RS2(INSN)	(((INSN) >>  0) & 0x1f)
+ #define RD(INSN)	(((INSN) >> 25) & 0x1f)
+ 
+@@ -445,7 +445,7 @@ static void pdist(struct pt_regs *regs, unsigned int insn)
+ 	unsigned long i;
+ 
+ 	rs1 = fpd_regval(f, RS1(insn));
+-	rs2 = fpd_regval(f, RS1(insn));
++	rs2 = fpd_regval(f, RS2(insn));
+ 	rd = fpd_regaddr(f, RD(insn));
+ 
+ 	rd_val = *rd;
+@@ -807,6 +807,8 @@ int vis_emul(struct pt_regs *regs, unsigned int insn)
+ 	if (get_user(insn, (u32 __user *) pc))
+ 		return -EFAULT;
+ 
++	save_and_clear_fpu();
++
+ 	opf = (insn & VIS_OPF_MASK) >> VIS_OPF_SHIFT;
+ 	switch (opf) {
+ 	default:
+diff --git a/arch/sparc64/lib/user_fixup.c b/arch/sparc64/lib/user_fixup.c
+index 19d1fdb..05a361b 100644
+--- a/arch/sparc64/lib/user_fixup.c
++++ b/arch/sparc64/lib/user_fixup.c
+@@ -24,7 +24,7 @@ static unsigned long compute_size(unsigned long start, unsigned long size, unsig
+ 	if (fault_addr < start || fault_addr >= end) {
+ 		*offset = 0;
+ 	} else {
+-		*offset = start - fault_addr;
++		*offset = fault_addr - start;
+ 		size = end - fault_addr;
+ 	}
+ 	return size;
+diff --git a/arch/um/drivers/mconsole_kern.c b/arch/um/drivers/mconsole_kern.c
+index 19d579d..8f44ebb 100644
+--- a/arch/um/drivers/mconsole_kern.c
++++ b/arch/um/drivers/mconsole_kern.c
+@@ -16,6 +16,8 @@
+ #include <linux/slab.h>
+ #include <linux/syscalls.h>
+ #include <linux/utsname.h>
++#include <linux/socket.h>
++#include <linux/un.h>
+ #include <linux/workqueue.h>
+ #include <linux/mutex.h>
+ #include <asm/uaccess.h>
+@@ -785,7 +787,7 @@ static int __init mconsole_init(void)
+ 	/* long to avoid size mismatch warnings from gcc */
+ 	long sock;
+ 	int err;
+-	char file[256];
++	char file[UNIX_PATH_MAX];
+ 
+ 	if (umid_file_name("mconsole", file, sizeof(file)))
+ 		return -1;
+diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c
+index 73deaff..759e8da 100644
+--- a/arch/x86/kernel/hpet.c
++++ b/arch/x86/kernel/hpet.c
+@@ -283,7 +283,7 @@ static int hpet_legacy_next_event(unsigned long delta,
+ 	 * what we wrote hit the chip before we compare it to the
+ 	 * counter.
+ 	 */
+-	WARN_ON((u32)hpet_readl(HPET_T0_CMP) != cnt);
++	WARN_ON_ONCE((u32)hpet_readl(HPET_T0_CMP) != cnt);
+ 
+ 	return (s32)((u32)hpet_readl(HPET_COUNTER) - cnt) >= 0 ? -ETIME : 0;
+ }
+diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
+index d3746ef..1adbb3e 100644
+--- a/arch/x86/mm/init_64.c
++++ b/arch/x86/mm/init_64.c
+@@ -721,12 +721,12 @@ int arch_add_memory(int nid, u64 start, u64 size)
+ 	unsigned long nr_pages = size >> PAGE_SHIFT;
+ 	int ret;
+ 
+-	last_mapped_pfn = init_memory_mapping(start, start + size-1);
++	last_mapped_pfn = init_memory_mapping(start, start + size);
+ 	if (last_mapped_pfn > max_pfn_mapped)
+ 		max_pfn_mapped = last_mapped_pfn;
+ 
+ 	ret = __add_pages(zone, start_pfn, nr_pages);
+-	WARN_ON(1);
++	WARN_ON_ONCE(ret);
+ 
+ 	return ret;
+ }
+diff --git a/block/bsg.c b/block/bsg.c
+index 0aae8d7..9cfbea8 100644
+--- a/block/bsg.c
++++ b/block/bsg.c
+@@ -202,6 +202,8 @@ static int blk_fill_sgv4_hdr_rq(struct request_queue *q, struct request *rq,
+ 		rq->timeout = q->sg_timeout;
+ 	if (!rq->timeout)
+ 		rq->timeout = BLK_DEFAULT_SG_TIMEOUT;
++	if (rq->timeout < BLK_MIN_SG_TIMEOUT)
++		rq->timeout = BLK_MIN_SG_TIMEOUT;
+ 
+ 	return 0;
+ }
+diff --git a/block/scsi_ioctl.c b/block/scsi_ioctl.c
+index ec4b7f2..dd3281a 100644
+--- a/block/scsi_ioctl.c
++++ b/block/scsi_ioctl.c
+@@ -208,6 +208,8 @@ static int blk_fill_sghdr_rq(struct request_queue *q, struct request *rq,
+ 		rq->timeout = q->sg_timeout;
+ 	if (!rq->timeout)
+ 		rq->timeout = BLK_DEFAULT_SG_TIMEOUT;
++	if (rq->timeout < BLK_MIN_SG_TIMEOUT)
++		rq->timeout = BLK_MIN_SG_TIMEOUT;
+ 
+ 	return 0;
+ }
+diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c
+index 235a138..b0d40aa 100644
+--- a/drivers/acpi/osl.c
++++ b/drivers/acpi/osl.c
+@@ -1261,34 +1261,6 @@ acpi_status acpi_os_release_object(acpi_cache_t * cache, void *object)
+ 	return (AE_OK);
+ }
+ 
+-/**
+- *	acpi_dmi_dump - dump DMI slots needed for blacklist entry
+- *
+- *	Returns 0 on success
+- */
+-static int acpi_dmi_dump(void)
+-{
+-
+-	if (!dmi_available)
+-		return -1;
+-
+-	printk(KERN_NOTICE PREFIX "DMI System Vendor: %s\n",
+-		dmi_get_system_info(DMI_SYS_VENDOR));
+-	printk(KERN_NOTICE PREFIX "DMI Product Name: %s\n",
+-		dmi_get_system_info(DMI_PRODUCT_NAME));
+-	printk(KERN_NOTICE PREFIX "DMI Product Version: %s\n",
+-		dmi_get_system_info(DMI_PRODUCT_VERSION));
+-	printk(KERN_NOTICE PREFIX "DMI Board Name: %s\n",
+-		dmi_get_system_info(DMI_BOARD_NAME));
+-	printk(KERN_NOTICE PREFIX "DMI BIOS Vendor: %s\n",
+-		dmi_get_system_info(DMI_BIOS_VENDOR));
+-	printk(KERN_NOTICE PREFIX "DMI BIOS Date: %s\n",
+-		dmi_get_system_info(DMI_BIOS_DATE));
+-
+-	return 0;
+-}
+-
+-
+ /******************************************************************************
+  *
+  * FUNCTION:    acpi_os_validate_interface
+@@ -1315,14 +1287,6 @@ acpi_os_validate_interface (char *interface)
+ 			osi_linux.cmdline ? " via cmdline" :
+ 			osi_linux.dmi ? " via DMI" : "");
+ 
+-		if (!osi_linux.dmi) {
+-			if (acpi_dmi_dump())
+-				printk(KERN_NOTICE PREFIX
+-					"[please extract dmidecode output]\n");
+-			printk(KERN_NOTICE PREFIX
+-				"Please send DMI info above to "
+-				"linux-acpi at vger.kernel.org\n");
+-		}
+ 		if (!osi_linux.known && !osi_linux.cmdline) {
+ 			printk(KERN_NOTICE PREFIX
+ 				"If \"acpi_osi=%sLinux\" works better, "
+diff --git a/drivers/acpi/sleep/main.c b/drivers/acpi/sleep/main.c
+index 4751909..3706469 100644
+--- a/drivers/acpi/sleep/main.c
++++ b/drivers/acpi/sleep/main.c
+@@ -60,6 +60,18 @@ void __init acpi_old_suspend_ordering(void)
+ 	old_suspend_ordering = true;
+ }
+ 
++/*
++ * According to the ACPI specification the BIOS should make sure that ACPI is
++ * enabled and SCI_EN bit is set on wake-up from S1 - S3 sleep states.  Still,
++ * some BIOSes don't do that and therefore we use acpi_enable() to enable ACPI
++ * on such systems during resume.  Unfortunately that doesn't help in
++ * particularly pathological cases in which SCI_EN has to be set directly on
++ * resume, although the specification states very clearly that this flag is
++ * owned by the hardware.  The set_sci_en_on_resume variable will be set in such
++ * cases.
++ */
++static bool set_sci_en_on_resume;
++
+ /**
+  *	acpi_pm_disable_gpes - Disable the GPEs.
+  */
+@@ -201,7 +213,11 @@ static int acpi_suspend_enter(suspend_state_t pm_state)
+ 	}
+ 
+ 	/* If ACPI is not enabled by the BIOS, we need to enable it here. */
+-	acpi_enable();
++	if (set_sci_en_on_resume)
++		acpi_set_register(ACPI_BITREG_SCI_ENABLE, 1);
++	else
++		acpi_enable();
++
+ 	/* Reprogram control registers and execute _BFS */
+ 	acpi_leave_sleep_state_prep(acpi_state);
+ 
+@@ -289,6 +305,12 @@ static int __init init_old_suspend_ordering(const struct dmi_system_id *d)
+ 	return 0;
+ }
+ 
++static int __init init_set_sci_en_on_resume(const struct dmi_system_id *d)
++{
++	set_sci_en_on_resume = true;
++	return 0;
++}
++
+ static struct dmi_system_id __initdata acpisleep_dmi_table[] = {
+ 	{
+ 	.callback = init_old_suspend_ordering,
+@@ -306,6 +328,22 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = {
+ 		DMI_MATCH(DMI_PRODUCT_NAME, "HP xw4600 Workstation"),
+ 		},
+ 	},
++	{
++	.callback = init_set_sci_en_on_resume,
++	.ident = "Apple MacBook 1,1",
++	.matches = {
++		DMI_MATCH(DMI_SYS_VENDOR, "Apple Computer, Inc."),
++		DMI_MATCH(DMI_PRODUCT_NAME, "MacBook1,1"),
++		},
++	},
++	{
++	.callback = init_set_sci_en_on_resume,
++	.ident = "Apple MacMini 1,1",
++	.matches = {
++		DMI_MATCH(DMI_SYS_VENDOR, "Apple Computer, Inc."),
++		DMI_MATCH(DMI_PRODUCT_NAME, "Macmini1,1"),
++		},
++	},
+ 	{},
+ };
+ #endif /* CONFIG_SUSPEND */
+diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c
+index 2a4c516..bb26a26 100644
+--- a/drivers/ata/libata-sff.c
++++ b/drivers/ata/libata-sff.c
+@@ -1227,10 +1227,19 @@ fsm_start:
+ 			/* ATA PIO protocol */
+ 			if (unlikely((status & ATA_DRQ) == 0)) {
+ 				/* handle BSY=0, DRQ=0 as error */
+-				if (likely(status & (ATA_ERR | ATA_DF)))
++				if (likely(status & (ATA_ERR | ATA_DF))) {
+ 					/* device stops HSM for abort/error */
+ 					qc->err_mask |= AC_ERR_DEV;
+-				else {
++
++					/* If diagnostic failed and this is
++					 * IDENTIFY, it's likely a phantom
++					 * device.  Mark hint.
++					 */
++					if (qc->dev->horkage &
++					    ATA_HORKAGE_DIAGNOSTIC)
++						qc->err_mask |=
++							AC_ERR_NODEV_HINT;
++				} else {
+ 					/* HSM violation. Let EH handle this.
+ 					 * Phantom devices also trigger this
+ 					 * condition.  Mark hint.
+diff --git a/drivers/char/applicom.c b/drivers/char/applicom.c
+index 31d08b6..b899d91 100644
+--- a/drivers/char/applicom.c
++++ b/drivers/char/applicom.c
+@@ -712,8 +712,7 @@ static int ac_ioctl(struct inode *inode, struct file *file, unsigned int cmd, un
+ 	
+ 	IndexCard = adgl->num_card-1;
+ 	 
+-	if(cmd != 0 && cmd != 6 &&
+-	   ((IndexCard >= MAX_BOARD) || !apbs[IndexCard].RamIO)) {
++	if(cmd != 6 && ((IndexCard >= MAX_BOARD) || !apbs[IndexCard].RamIO)) {
+ 		static int warncount = 10;
+ 		if (warncount) {
+ 			printk( KERN_WARNING "APPLICOM driver IOCTL, bad board number %d\n",(int)IndexCard+1);
+@@ -832,8 +831,7 @@ static int ac_ioctl(struct inode *inode, struct file *file, unsigned int cmd, un
+ 		}
+ 		break;
+ 	default:
+-		printk(KERN_INFO "APPLICOM driver ioctl, unknown function code %d\n",cmd) ;
+-		ret = -EINVAL;
++		ret = -ENOTTY;
+ 		break;
+ 	}
+ 	Dummy = readb(apbs[IndexCard].RamIO + VERS);
+diff --git a/drivers/edac/cell_edac.c b/drivers/edac/cell_edac.c
+index 887072f..cd2e3b8 100644
+--- a/drivers/edac/cell_edac.c
++++ b/drivers/edac/cell_edac.c
+@@ -9,6 +9,7 @@
+  */
+ #undef DEBUG
+ 
++#include <linux/edac.h>
+ #include <linux/module.h>
+ #include <linux/init.h>
+ #include <linux/platform_device.h>
+@@ -164,6 +165,8 @@ static int __devinit cell_edac_probe(struct platform_device *pdev)
+ 	if (regs == NULL)
+ 		return -ENODEV;
+ 
++	edac_op_state = EDAC_OPSTATE_POLL;
++
+ 	/* Get channel population */
+ 	reg = in_be64(&regs->mic_mnt_cfg);
+ 	dev_dbg(&pdev->dev, "MIC_MNT_CFG = 0x%016lx\n", reg);
+diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c
+index 49144cb..e87956a 100644
+--- a/drivers/hid/usbhid/hid-quirks.c
++++ b/drivers/hid/usbhid/hid-quirks.c
+@@ -83,6 +83,7 @@
+ #define USB_DEVICE_ID_APPLE_WELLSPRING2_JIS	0x0232
+ #define USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY	0x030a
+ #define USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY	0x030b
++#define USB_DEVICE_ID_APPLE_ATV_IRCONTROL	0x8241
+ #define USB_DEVICE_ID_APPLE_IRCONTROL4	0x8242
+ 
+ #define USB_VENDOR_ID_ASUS		0x0b05
+@@ -458,6 +459,7 @@ static const struct hid_blacklist {
+ 	{ USB_VENDOR_ID_AFATECH, USB_DEVICE_ID_AFATECH_AF9016, HID_QUIRK_FULLSPEED_INTERVAL },
+ 
+ 	{ USB_VENDOR_ID_BELKIN, USB_DEVICE_ID_FLIP_KVM, HID_QUIRK_HIDDEV },
++	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ATV_IRCONTROL, HID_QUIRK_HIDDEV | HID_QUIRK_IGNORE_HIDINPUT },
+ 	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL4, HID_QUIRK_HIDDEV | HID_QUIRK_IGNORE_HIDINPUT },
+ 	{ USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_IR_REMOTE, HID_QUIRK_HIDDEV | HID_QUIRK_IGNORE_HIDINPUT },
+ 	{ USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_SIDEWINDER_GV, HID_QUIRK_HIDINPUT },
+diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h
+index 5aafe24..29e6863 100644
+--- a/drivers/input/serio/i8042-x86ia64io.h
++++ b/drivers/input/serio/i8042-x86ia64io.h
+@@ -135,6 +135,14 @@ static struct dmi_system_id __initdata i8042_dmi_noloop_table[] = {
+ 			DMI_MATCH(DMI_PRODUCT_VERSION, "5a"),
+ 		},
+ 	},
++	{
++		.ident = "Blue FB5601",
++		.matches = {
++			DMI_MATCH(DMI_SYS_VENDOR, "blue"),
++			DMI_MATCH(DMI_PRODUCT_NAME, "FB5601"),
++			DMI_MATCH(DMI_PRODUCT_VERSION, "M606"),
++		},
++	},
+ 	{ }
+ };
+ 
+@@ -322,6 +330,27 @@ static struct dmi_system_id __initdata i8042_dmi_nomux_table[] = {
+ 			DMI_MATCH(DMI_PRODUCT_NAME, "N34AS6"),
+ 		},
+ 	},
++	{
++		.ident = "IBM 2656",
++		.matches = {
++			DMI_MATCH(DMI_SYS_VENDOR, "IBM"),
++			DMI_MATCH(DMI_PRODUCT_NAME, "2656"),
++		},
++	},
++	{
++		.ident = "Dell XPS M1530",
++		.matches = {
++			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
++			DMI_MATCH(DMI_PRODUCT_NAME, "XPS M1530"),
++		},
++	},
++	{
++		.ident = "Compal HEL80I",
++		.matches = {
++			DMI_MATCH(DMI_SYS_VENDOR, "COMPAL"),
++			DMI_MATCH(DMI_PRODUCT_NAME, "HEL80I"),
++		},
++	},
+ 	{ }
+ };
+ 
+diff --git a/drivers/net/cxgb3/adapter.h b/drivers/net/cxgb3/adapter.h
+index 2711404..b1a694b 100644
+--- a/drivers/net/cxgb3/adapter.h
++++ b/drivers/net/cxgb3/adapter.h
+@@ -285,6 +285,7 @@ void t3_os_link_changed(struct adapter *adapter, int port_id, int link_status,
+ 
+ void t3_sge_start(struct adapter *adap);
+ void t3_sge_stop(struct adapter *adap);
++void t3_stop_sge_timers(struct adapter *adap);
+ void t3_free_sge_resources(struct adapter *adap);
+ void t3_sge_err_intr_handler(struct adapter *adapter);
+ irq_handler_t t3_intr_handler(struct adapter *adap, int polling);
+diff --git a/drivers/net/cxgb3/cxgb3_main.c b/drivers/net/cxgb3/cxgb3_main.c
+index 5447f3e..d355c82 100644
+--- a/drivers/net/cxgb3/cxgb3_main.c
++++ b/drivers/net/cxgb3/cxgb3_main.c
+@@ -479,6 +479,7 @@ static int setup_sge_qsets(struct adapter *adap)
+ 							     irq_idx,
+ 				&adap->params.sge.qset[qset_idx], ntxq, dev);
+ 			if (err) {
++				t3_stop_sge_timers(adap);
+ 				t3_free_sge_resources(adap);
+ 				return err;
+ 			}
+@@ -2449,6 +2450,9 @@ static pci_ers_result_t t3_io_error_detected(struct pci_dev *pdev,
+ 	    test_bit(OFFLOAD_DEVMAP_BIT, &adapter->open_device_map))
+ 		offload_close(&adapter->tdev);
+ 
++	/* Stop SGE timers */
++	t3_stop_sge_timers(adapter);
++
+ 	adapter->flags &= ~FULL_INIT_DONE;
+ 
+ 	pci_disable_device(pdev);
+@@ -2801,6 +2805,7 @@ static void __devexit remove_one(struct pci_dev *pdev)
+ 		    if (test_bit(i, &adapter->registered_device_map))
+ 			unregister_netdev(adapter->port[i]);
+ 
++		t3_stop_sge_timers(adapter);
+ 		t3_free_sge_resources(adapter);
+ 		cxgb_disable_msi(adapter);
+ 
+diff --git a/drivers/net/cxgb3/sge.c b/drivers/net/cxgb3/sge.c
+index 1b0861d..52f4138 100644
+--- a/drivers/net/cxgb3/sge.c
++++ b/drivers/net/cxgb3/sge.c
+@@ -603,9 +603,6 @@ static void t3_free_qset(struct adapter *adapter, struct sge_qset *q)
+ 	int i;
+ 	struct pci_dev *pdev = adapter->pdev;
+ 
+-	if (q->tx_reclaim_timer.function)
+-		del_timer_sync(&q->tx_reclaim_timer);
+-
+ 	for (i = 0; i < SGE_RXQ_PER_SET; ++i)
+ 		if (q->fl[i].desc) {
+ 			spin_lock_irq(&adapter->sge.reg_lock);
+@@ -1937,38 +1934,6 @@ static inline int lro_frame_ok(const struct cpl_rx_pkt *p)
+ 		eh->h_proto == htons(ETH_P_IP) && ih->ihl == (sizeof(*ih) >> 2);
+ }
+ 
+-#define TCP_FLAG_MASK (TCP_FLAG_CWR | TCP_FLAG_ECE | TCP_FLAG_URG |\
+-                       TCP_FLAG_ACK | TCP_FLAG_PSH | TCP_FLAG_RST |\
+-		                       TCP_FLAG_SYN | TCP_FLAG_FIN)
+-#define TSTAMP_WORD ((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) |\
+-                     (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP)
+-
+-/**
+- *	lro_segment_ok - check if a TCP segment is eligible for LRO
+- *	@tcph: the TCP header of the packet
+- *
+- *	Returns true if a TCP packet is eligible for LRO.  This requires that
+- *	the packet have only the ACK flag set and no TCP options besides
+- *	time stamps.
+- */
+-static inline int lro_segment_ok(const struct tcphdr *tcph)
+-{
+-	int optlen;
+-
+-	if (unlikely((tcp_flag_word(tcph) & TCP_FLAG_MASK) != TCP_FLAG_ACK))
+-		return 0;
+-
+-	optlen = (tcph->doff << 2) - sizeof(*tcph);
+-	if (optlen) {
+-		const u32 *opt = (const u32 *)(tcph + 1);
+-
+-		if (optlen != TCPOLEN_TSTAMP_ALIGNED ||
+-		    *opt != htonl(TSTAMP_WORD) || !opt[2])
+-			return 0;
+-	}
+-	return 1;
+-}
+-
+ static int t3_get_lro_header(void **eh,  void **iph, void **tcph,
+ 			     u64 *hdr_flags, void *priv)
+ {
+@@ -1981,9 +1946,6 @@ static int t3_get_lro_header(void **eh,  void **iph, void **tcph,
+ 	*iph = (struct iphdr *)((struct ethhdr *)*eh + 1);
+ 	*tcph = (struct tcphdr *)((struct iphdr *)*iph + 1);
+ 
+-	 if (!lro_segment_ok(*tcph))
+-		return -1;
+-
+ 	*hdr_flags = LRO_IPV4 | LRO_TCP;
+ 	return 0;
+ }
+@@ -3043,6 +3005,24 @@ err:
+ }
+ 
+ /**
++ *	t3_stop_sge_timers - stop SGE timer call backs
++ *	@adap: the adapter
++ *
++ *	Stops each SGE queue set's timer call back
++ */
++void t3_stop_sge_timers(struct adapter *adap)
++{
++	int i;
++
++	for (i = 0; i < SGE_QSETS; ++i) {
++		struct sge_qset *q = &adap->sge.qs[i];
++
++		if (q->tx_reclaim_timer.function)
++			del_timer_sync(&q->tx_reclaim_timer);
++	}
++}
++
++/**
+  *	t3_free_sge_resources - free SGE resources
+  *	@adap: the adapter
+  *
+diff --git a/drivers/net/niu.c b/drivers/net/niu.c
+index e3be81e..6f9809e 100644
+--- a/drivers/net/niu.c
++++ b/drivers/net/niu.c
+@@ -51,8 +51,7 @@ MODULE_VERSION(DRV_MODULE_VERSION);
+ #ifndef readq
+ static u64 readq(void __iomem *reg)
+ {
+-	return (((u64)readl(reg + 0x4UL) << 32) |
+-		(u64)readl(reg));
++	return ((u64) readl(reg)) | (((u64) readl(reg + 4UL)) << 32);
+ }
+ 
+ static void writeq(u64 val, void __iomem *reg)
+diff --git a/drivers/net/pppol2tp.c b/drivers/net/pppol2tp.c
+index ff175e8..de80ba4 100644
+--- a/drivers/net/pppol2tp.c
++++ b/drivers/net/pppol2tp.c
+@@ -1353,6 +1353,7 @@ static int pppol2tp_release(struct socket *sock)
+ 			kfree_skb(skb);
+ 			sock_put(sk);
+ 		}
++		sock_put(sk);
+ 	}
+ 
+ 	release_sock(sk);
+diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c
+index 851f5b8..aa6fda1 100644
+--- a/drivers/pci/pcie/aspm.c
++++ b/drivers/pci/pcie/aspm.c
+@@ -16,6 +16,7 @@
+ #include <linux/pm.h>
+ #include <linux/init.h>
+ #include <linux/slab.h>
++#include <linux/jiffies.h>
+ #include <linux/pci-aspm.h>
+ #include "../pci.h"
+ 
+@@ -161,11 +162,12 @@ static void pcie_check_clock_pm(struct pci_dev *pdev)
+  */
+ static void pcie_aspm_configure_common_clock(struct pci_dev *pdev)
+ {
+-	int pos, child_pos;
++	int pos, child_pos, i = 0;
+ 	u16 reg16 = 0;
+ 	struct pci_dev *child_dev;
+ 	int same_clock = 1;
+-
++	unsigned long start_jiffies;
++	u16 child_regs[8], parent_reg;
+ 	/*
+ 	 * all functions of a slot should have the same Slot Clock
+ 	 * Configuration, so just check one function
+@@ -191,16 +193,19 @@ static void pcie_aspm_configure_common_clock(struct pci_dev *pdev)
+ 		child_pos = pci_find_capability(child_dev, PCI_CAP_ID_EXP);
+ 		pci_read_config_word(child_dev, child_pos + PCI_EXP_LNKCTL,
+ 			&reg16);
++		child_regs[i] = reg16;
+ 		if (same_clock)
+ 			reg16 |= PCI_EXP_LNKCTL_CCC;
+ 		else
+ 			reg16 &= ~PCI_EXP_LNKCTL_CCC;
+ 		pci_write_config_word(child_dev, child_pos + PCI_EXP_LNKCTL,
+ 			reg16);
++		i++;
+ 	}
+ 
+ 	/* Configure upstream component */
+ 	pci_read_config_word(pdev, pos + PCI_EXP_LNKCTL, &reg16);
++	parent_reg = reg16;
+ 	if (same_clock)
+ 		reg16 |= PCI_EXP_LNKCTL_CCC;
+ 	else
+@@ -212,12 +217,30 @@ static void pcie_aspm_configure_common_clock(struct pci_dev *pdev)
+ 	pci_write_config_word(pdev, pos + PCI_EXP_LNKCTL, reg16);
+ 
+ 	/* Wait for link training end */
+-	while (1) {
++	/* break out after waiting for 1 second */
++	start_jiffies = jiffies;
++	while ((jiffies - start_jiffies) < HZ) {
+ 		pci_read_config_word(pdev, pos + PCI_EXP_LNKSTA, &reg16);
+ 		if (!(reg16 & PCI_EXP_LNKSTA_LT))
+ 			break;
+ 		cpu_relax();
+ 	}
++	/* training failed -> recover */
++	if ((jiffies - start_jiffies) >= HZ) {
++		dev_printk (KERN_ERR, &pdev->dev, "ASPM: Could not configure"
++			    " common clock\n");
++		i = 0;
++		list_for_each_entry(child_dev, &pdev->subordinate->devices,
++				    bus_list) {
++			child_pos = pci_find_capability(child_dev,
++							PCI_CAP_ID_EXP);
++			pci_write_config_word(child_dev,
++					      child_pos + PCI_EXP_LNKCTL,
++					      child_regs[i]);
++			i++;
++		}
++		pci_write_config_word(pdev, pos + PCI_EXP_LNKCTL, parent_reg);
++	}
+ }
+ 
+ /*
+diff --git a/drivers/pci/slot.c b/drivers/pci/slot.c
+index b703b09..e423fd9 100644
+--- a/drivers/pci/slot.c
++++ b/drivers/pci/slot.c
+@@ -243,6 +243,7 @@ placeholder:
+ 		 __func__, pci_domain_nr(parent), parent->number, slot_nr);
+ 
+ out:
++	kfree(slot_name);
+ 	up_write(&pci_bus_sem);
+ 	return slot;
+ err:
+diff --git a/drivers/pnp/base.h b/drivers/pnp/base.h
+index 9fd7bb9..7cc7bf5 100644
+--- a/drivers/pnp/base.h
++++ b/drivers/pnp/base.h
+@@ -147,7 +147,7 @@ char *pnp_resource_type_name(struct resource *res);
+ void dbg_pnp_show_resources(struct pnp_dev *dev, char *desc);
+ 
+ void pnp_free_resources(struct pnp_dev *dev);
+-int pnp_resource_type(struct resource *res);
++unsigned long pnp_resource_type(struct resource *res);
+ 
+ struct pnp_resource {
+ 	struct list_head list;
+diff --git a/drivers/pnp/quirks.c b/drivers/pnp/quirks.c
+index 0bdf9b8..d15e2b7 100644
+--- a/drivers/pnp/quirks.c
++++ b/drivers/pnp/quirks.c
+@@ -245,7 +245,7 @@ static void quirk_system_pci_resources(struct pnp_dev *dev)
+ 	 */
+ 	for_each_pci_dev(pdev) {
+ 		for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
+-			unsigned int type;
++			unsigned long type;
+ 
+ 			type = pci_resource_flags(pdev, i) &
+ 					(IORESOURCE_IO | IORESOURCE_MEM);
+diff --git a/drivers/pnp/resource.c b/drivers/pnp/resource.c
+index 4cfe3a1..dbae23a 100644
+--- a/drivers/pnp/resource.c
++++ b/drivers/pnp/resource.c
+@@ -467,14 +467,14 @@ int pnp_check_dma(struct pnp_dev *dev, struct resource *res)
+ #endif
+ }
+ 
+-int pnp_resource_type(struct resource *res)
++unsigned long pnp_resource_type(struct resource *res)
+ {
+ 	return res->flags & (IORESOURCE_IO  | IORESOURCE_MEM |
+ 			     IORESOURCE_IRQ | IORESOURCE_DMA);
+ }
+ 
+ struct resource *pnp_get_resource(struct pnp_dev *dev,
+-				  unsigned int type, unsigned int num)
++				  unsigned long type, unsigned int num)
+ {
+ 	struct pnp_resource *pnp_res;
+ 	struct resource *res;
+diff --git a/drivers/spi/spidev.c b/drivers/spi/spidev.c
+index e5e0cfe..bdc4d4e 100644
+--- a/drivers/spi/spidev.c
++++ b/drivers/spi/spidev.c
+@@ -598,7 +598,9 @@ static int spidev_probe(struct spi_device *spi)
+ 	}
+ 	mutex_unlock(&device_list_lock);
+ 
+-	if (status != 0)
++	if (status == 0)
++		spi_set_drvdata(spi, spidev);
++	else
+ 		kfree(spidev);
+ 
+ 	return status;
+diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
+index 73f8277..b205311 100644
+--- a/drivers/usb/serial/option.c
++++ b/drivers/usb/serial/option.c
+@@ -79,38 +79,36 @@ static int  option_send_setup(struct tty_struct *tty, struct usb_serial_port *po
+ #define OPTION_PRODUCT_VIPER			0x6600
+ #define OPTION_PRODUCT_VIPER_BUS		0x6601
+ #define OPTION_PRODUCT_GT_MAX_READY		0x6701
+-#define OPTION_PRODUCT_GT_MAX			0x6711
+ #define OPTION_PRODUCT_FUJI_MODEM_LIGHT		0x6721
+ #define OPTION_PRODUCT_FUJI_MODEM_GT		0x6741
+ #define OPTION_PRODUCT_FUJI_MODEM_EX		0x6761
+-#define OPTION_PRODUCT_FUJI_NETWORK_LIGHT	0x6731
+-#define OPTION_PRODUCT_FUJI_NETWORK_GT		0x6751
+-#define OPTION_PRODUCT_FUJI_NETWORK_EX		0x6771
+ #define OPTION_PRODUCT_KOI_MODEM		0x6800
+-#define OPTION_PRODUCT_KOI_NETWORK		0x6811
+ #define OPTION_PRODUCT_SCORPION_MODEM		0x6901
+-#define OPTION_PRODUCT_SCORPION_NETWORK		0x6911
+ #define OPTION_PRODUCT_ETNA_MODEM		0x7001
+-#define OPTION_PRODUCT_ETNA_NETWORK		0x7011
+ #define OPTION_PRODUCT_ETNA_MODEM_LITE		0x7021
+ #define OPTION_PRODUCT_ETNA_MODEM_GT		0x7041
+ #define OPTION_PRODUCT_ETNA_MODEM_EX		0x7061
+-#define OPTION_PRODUCT_ETNA_NETWORK_LITE	0x7031
+-#define OPTION_PRODUCT_ETNA_NETWORK_GT		0x7051
+-#define OPTION_PRODUCT_ETNA_NETWORK_EX		0x7071
+ #define OPTION_PRODUCT_ETNA_KOI_MODEM		0x7100
+-#define OPTION_PRODUCT_ETNA_KOI_NETWORK		0x7111
+ 
+ #define HUAWEI_VENDOR_ID			0x12D1
+ #define HUAWEI_PRODUCT_E600			0x1001
+ #define HUAWEI_PRODUCT_E220			0x1003
+ #define HUAWEI_PRODUCT_E220BIS			0x1004
+ #define HUAWEI_PRODUCT_E1401			0x1401
++#define HUAWEI_PRODUCT_E1402			0x1402
+ #define HUAWEI_PRODUCT_E1403			0x1403
++#define HUAWEI_PRODUCT_E1404			0x1404
+ #define HUAWEI_PRODUCT_E1405			0x1405
+ #define HUAWEI_PRODUCT_E1406			0x1406
++#define HUAWEI_PRODUCT_E1407			0x1407
+ #define HUAWEI_PRODUCT_E1408			0x1408
+ #define HUAWEI_PRODUCT_E1409			0x1409
++#define HUAWEI_PRODUCT_E140A			0x140A
++#define HUAWEI_PRODUCT_E140B			0x140B
++#define HUAWEI_PRODUCT_E140C			0x140C
++#define HUAWEI_PRODUCT_E140D			0x140D
++#define HUAWEI_PRODUCT_E140E			0x140E
++#define HUAWEI_PRODUCT_E140F			0x140F
+ #define HUAWEI_PRODUCT_E1410			0x1410
+ #define HUAWEI_PRODUCT_E1411			0x1411
+ #define HUAWEI_PRODUCT_E1412			0x1412
+@@ -121,9 +119,52 @@ static int  option_send_setup(struct tty_struct *tty, struct usb_serial_port *po
+ #define HUAWEI_PRODUCT_E1417			0x1417
+ #define HUAWEI_PRODUCT_E1418			0x1418
+ #define HUAWEI_PRODUCT_E1419			0x1419
++#define HUAWEI_PRODUCT_E141A			0x141A
++#define HUAWEI_PRODUCT_E141B			0x141B
++#define HUAWEI_PRODUCT_E141C			0x141C
++#define HUAWEI_PRODUCT_E141D			0x141D
++#define HUAWEI_PRODUCT_E141E			0x141E
++#define HUAWEI_PRODUCT_E141F			0x141F
++#define HUAWEI_PRODUCT_E1420			0x1420
++#define HUAWEI_PRODUCT_E1421			0x1421
++#define HUAWEI_PRODUCT_E1422			0x1422
++#define HUAWEI_PRODUCT_E1423			0x1423
++#define HUAWEI_PRODUCT_E1424			0x1424
++#define HUAWEI_PRODUCT_E1425			0x1425
++#define HUAWEI_PRODUCT_E1426			0x1426
++#define HUAWEI_PRODUCT_E1427			0x1427
++#define HUAWEI_PRODUCT_E1428			0x1428
++#define HUAWEI_PRODUCT_E1429			0x1429
++#define HUAWEI_PRODUCT_E142A			0x142A
++#define HUAWEI_PRODUCT_E142B			0x142B
++#define HUAWEI_PRODUCT_E142C			0x142C
++#define HUAWEI_PRODUCT_E142D			0x142D
++#define HUAWEI_PRODUCT_E142E			0x142E
++#define HUAWEI_PRODUCT_E142F			0x142F
++#define HUAWEI_PRODUCT_E1430			0x1430
++#define HUAWEI_PRODUCT_E1431			0x1431
++#define HUAWEI_PRODUCT_E1432			0x1432
++#define HUAWEI_PRODUCT_E1433			0x1433
++#define HUAWEI_PRODUCT_E1434			0x1434
++#define HUAWEI_PRODUCT_E1435			0x1435
++#define HUAWEI_PRODUCT_E1436			0x1436
++#define HUAWEI_PRODUCT_E1437			0x1437
++#define HUAWEI_PRODUCT_E1438			0x1438
++#define HUAWEI_PRODUCT_E1439			0x1439
++#define HUAWEI_PRODUCT_E143A			0x143A
++#define HUAWEI_PRODUCT_E143B			0x143B
++#define HUAWEI_PRODUCT_E143C			0x143C
++#define HUAWEI_PRODUCT_E143D			0x143D
++#define HUAWEI_PRODUCT_E143E			0x143E
++#define HUAWEI_PRODUCT_E143F			0x143F
+ 
+ #define NOVATELWIRELESS_VENDOR_ID		0x1410
+ 
++/* YISO PRODUCTS */
++
++#define YISO_VENDOR_ID				0x0EAB
++#define YISO_PRODUCT_U893			0xC893
++
+ /* MERLIN EVDO PRODUCTS */
+ #define NOVATELWIRELESS_PRODUCT_V640		0x1100
+ #define NOVATELWIRELESS_PRODUCT_V620		0x1110
+@@ -183,6 +224,7 @@ static int  option_send_setup(struct tty_struct *tty, struct usb_serial_port *po
+ #define ONDA_VENDOR_ID				0x19d2
+ #define ONDA_PRODUCT_MSA501HS			0x0001
+ #define ONDA_PRODUCT_ET502HS			0x0002
++#define ONDA_PRODUCT_MT503HS			0x0200
+ 
+ #define BANDRICH_VENDOR_ID			0x1A8D
+ #define BANDRICH_PRODUCT_C100_1			0x1002
+@@ -218,8 +260,19 @@ static int  option_send_setup(struct tty_struct *tty, struct usb_serial_port *po
+ /* ZTE PRODUCTS */
+ #define ZTE_VENDOR_ID				0x19d2
+ #define ZTE_PRODUCT_MF628			0x0015
++#define ZTE_PRODUCT_MF626			0x0031
+ #define ZTE_PRODUCT_CDMA_TECH			0xfffe
+ 
++/* Ericsson products */
++#define ERICSSON_VENDOR_ID			0x0bdb
++#define ERICSSON_PRODUCT_F3507G			0x1900
++
++/* Pantech products */
++#define PANTECH_VENDOR_ID			0x106c
++#define PANTECH_PRODUCT_PC5740			0x3701
++#define PANTECH_PRODUCT_PC5750			0x3702  /* PX-500 */
++#define PANTECH_PRODUCT_UM150			0x3711
++
+ static struct usb_device_id option_ids[] = {
+ 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) },
+ 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) },
+@@ -235,36 +288,34 @@ static struct usb_device_id option_ids[] = {
+ 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_VIPER) },
+ 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_VIPER_BUS) },
+ 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_GT_MAX_READY) },
+-	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_GT_MAX) },
+ 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_MODEM_LIGHT) },
+ 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_MODEM_GT) },
+ 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_MODEM_EX) },
+-	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_NETWORK_LIGHT) },
+-	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_NETWORK_GT) },
+-	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_NETWORK_EX) },
+ 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_KOI_MODEM) },
+-	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_KOI_NETWORK) },
+ 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_SCORPION_MODEM) },
+-	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_SCORPION_NETWORK) },
+ 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM) },
+-	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_NETWORK) },
+ 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM_LITE) },
+ 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM_GT) },
+ 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM_EX) },
+-	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_NETWORK_LITE) },
+-	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_NETWORK_GT) },
+-	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_NETWORK_EX) },
+ 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_KOI_MODEM) },
+-	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_KOI_NETWORK) },
+ 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600, 0xff, 0xff, 0xff) },
+ 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220, 0xff, 0xff, 0xff) },
+ 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220BIS, 0xff, 0xff, 0xff) },
+ 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1401, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1402, 0xff, 0xff, 0xff) },
+ 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1403, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1404, 0xff, 0xff, 0xff) },
+ 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1405, 0xff, 0xff, 0xff) },
+ 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1406, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1407, 0xff, 0xff, 0xff) },
+ 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1408, 0xff, 0xff, 0xff) },
+ 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1409, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140A, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140B, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140C, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140D, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140E, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140F, 0xff, 0xff, 0xff) },
+ 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1410, 0xff, 0xff, 0xff) },
+ 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1411, 0xff, 0xff, 0xff) },
+ 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1412, 0xff, 0xff, 0xff) },
+@@ -275,6 +326,44 @@ static struct usb_device_id option_ids[] = {
+ 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1417, 0xff, 0xff, 0xff) },
+ 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1418, 0xff, 0xff, 0xff) },
+ 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1419, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141A, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141B, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141C, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141D, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141E, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141F, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1420, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1421, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1422, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1423, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1424, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1425, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1426, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1427, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1428, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1429, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142A, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142B, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142C, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142D, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142E, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142F, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1430, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1431, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1432, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1433, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1434, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1435, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1436, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1437, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1438, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1439, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143A, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143B, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143C, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143D, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143E, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143F, 0xff, 0xff, 0xff) },
+ 	{ USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_9508) },
+ 	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V640) }, /* Novatel Merlin V640/XV620 */
+ 	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V620) }, /* Novatel Merlin V620/S620 */
+@@ -318,12 +407,48 @@ static struct usb_device_id option_ids[] = {
+ 	{ USB_DEVICE(DELL_VENDOR_ID, 0x8136) },	/* Dell Wireless HSDPA 5520 == Novatel Expedite EU860D */
+ 	{ USB_DEVICE(DELL_VENDOR_ID, 0x8137) },	/* Dell Wireless HSDPA 5520 */
+ 	{ USB_DEVICE(DELL_VENDOR_ID, 0x8138) },	/* Dell Wireless 5520 Voda I Mobile Broadband (3G HSDPA) Minicard */
+-	{ USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) },
++	{ USB_DEVICE(DELL_VENDOR_ID, 0x8147) },	/* Dell Wireless 5530 Mobile Broadband (3G HSPA) Mini-Card */
++	{ USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) },	/* ADU-E100, ADU-310 */
+ 	{ USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_500A) },
+ 	{ USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_620UW) },
+ 	{ 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(ONDA_VENDOR_ID, 0x0003) },
++	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0004) },
++	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0005) },
++	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0006) },
++	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0007) },
++	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0008) },
++	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0009) },
++	{ USB_DEVICE(ONDA_VENDOR_ID, 0x000a) },
++	{ USB_DEVICE(ONDA_VENDOR_ID, 0x000b) },
++	{ USB_DEVICE(ONDA_VENDOR_ID, 0x000c) },
++	{ USB_DEVICE(ONDA_VENDOR_ID, 0x000d) },
++	{ USB_DEVICE(ONDA_VENDOR_ID, 0x000e) },
++	{ USB_DEVICE(ONDA_VENDOR_ID, 0x000f) },
++	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0010) },
++	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0011) },
++	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0012) },
++	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0013) },
++	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0014) },
++	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0015) },
++	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0016) },
++	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0017) },
++	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0018) },
++	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0019) },
++	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0020) },
++	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0021) },
++	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0022) },
++	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0023) },
++	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0024) },
++	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0025) },
++	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0026) },
++	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0027) },
++	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0028) },
++	{ USB_DEVICE(ONDA_VENDOR_ID, 0x0029) },
++	{ USB_DEVICE(ONDA_VENDOR_ID, ONDA_PRODUCT_MT503HS) },
++	{ USB_DEVICE(YISO_VENDOR_ID, YISO_PRODUCT_U893) },
+ 	{ USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_1) },
+ 	{ USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_2) },
+ 	{ USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1004) },
+@@ -347,8 +472,13 @@ static struct usb_device_id option_ids[] = {
+ 	{ USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */
+ 	{ USB_DEVICE(MAXON_VENDOR_ID, 0x6280) }, /* BP3-USB & BP3-EXT HSDPA */
+ 	{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864E) },
++	{ USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_MF626) },
+ 	{ USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_MF628) },
+ 	{ USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_CDMA_TECH) },
++	{ USB_DEVICE(ERICSSON_VENDOR_ID, ERICSSON_PRODUCT_F3507G) },
++	{ USB_DEVICE(PANTECH_VENDOR_ID, PANTECH_PRODUCT_PC5740) },
++	{ USB_DEVICE(PANTECH_VENDOR_ID, PANTECH_PRODUCT_PC5750) },
++	{ USB_DEVICE(PANTECH_VENDOR_ID, PANTECH_PRODUCT_UM150) },
+ 	{ } /* Terminating entry */
+ };
+ MODULE_DEVICE_TABLE(usb, option_ids);
+diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h
+index ccebf89..e61f2bf 100644
+--- a/drivers/usb/storage/unusual_devs.h
++++ b/drivers/usb/storage/unusual_devs.h
+@@ -167,6 +167,13 @@ UNUSUAL_DEV(  0x0421, 0x005d, 0x0001, 0x0600,
+ 		US_SC_DEVICE, US_PR_DEVICE, NULL,
+ 		US_FL_FIX_CAPACITY ),
+ 
++/* Patch for Nokia 5310 capacity */
++UNUSUAL_DEV(  0x0421, 0x006a, 0x0000, 0x0591,
++		"Nokia",
++		"5310",
++		US_SC_DEVICE, US_PR_DEVICE, NULL,
++		US_FL_FIX_CAPACITY ),
++
+ /* Reported by Mario Rettig <mariorettig at web.de> */
+ UNUSUAL_DEV(  0x0421, 0x042e, 0x0100, 0x0100,
+ 		"Nokia",
+@@ -233,14 +240,14 @@ UNUSUAL_DEV(  0x0421, 0x0495, 0x0370, 0x0370,
+ 		US_FL_MAX_SECTORS_64 ),
+ 
+ /* Reported by Cedric Godin <cedric at belbone.be> */
+-UNUSUAL_DEV(  0x0421, 0x04b9, 0x0551, 0x0551,
++UNUSUAL_DEV(  0x0421, 0x04b9, 0x0500, 0x0551,
+ 		"Nokia",
+ 		"5300",
+ 		US_SC_DEVICE, US_PR_DEVICE, NULL,
+ 		US_FL_FIX_CAPACITY ),
+ 
+ /* Reported by Richard Nauber <RichardNauber at web.de> */
+-UNUSUAL_DEV(  0x0421, 0x04fa, 0x0601, 0x0601,
++UNUSUAL_DEV(  0x0421, 0x04fa, 0x0550, 0x0660,
+ 		"Nokia",
+ 		"6300",
+ 		US_SC_DEVICE, US_PR_DEVICE, NULL,
+@@ -253,6 +260,14 @@ UNUSUAL_DEV(  0x0421, 0x006a, 0x0000, 0x0591,
+ 	US_SC_DEVICE, US_PR_DEVICE, NULL,
+ 	US_FL_FIX_CAPACITY ),
+ 
++/* Submitted by Ricky Wong Yung Fei <evilbladewarrior at gmail.com> */
++/* Nokia 7610 Supernova - Too many sectors reported in usb storage mode */
++UNUSUAL_DEV(  0x0421, 0x00f5, 0x0000, 0x0470,
++	"Nokia",
++	"7610 Supernova",
++	US_SC_DEVICE, US_PR_DEVICE, NULL,
++	US_FL_FIX_CAPACITY ),
++
+ /* Reported by Olaf Hering <olh at suse.de> from novell bug #105878 */
+ UNUSUAL_DEV(  0x0424, 0x0fdc, 0x0210, 0x0210,
+ 		"SMSC",
+@@ -303,6 +318,18 @@ UNUSUAL_DEV(  0x045a, 0x5210, 0x0101, 0x0101,
+ 		US_SC_SCSI, US_PR_KARMA, rio_karma_init, 0),
+ #endif
+ 
++/* Reported by Tamas Kerecsen <kerecsen at bigfoot.com>
++ * Obviously the PROM has not been customized by the VAR;
++ * the Vendor and Product string descriptors are:
++ *	Generic Mass Storage (PROTOTYPE--Remember to change idVendor)
++ *	Generic Manufacturer (PROTOTYPE--Remember to change idVendor)
++ */
++UNUSUAL_DEV(  0x045e, 0xffff, 0x0000, 0x0000,
++		"Mitac",
++		"GPS",
++		US_SC_DEVICE, US_PR_DEVICE, NULL,
++		US_FL_MAX_SECTORS_64 ),
++
+ /*
+  * This virtual floppy is found in Sun equipment (x4600, x4200m2, etc.)
+  * Reported by Pete Zaitcev <zaitcev at redhat.com>
+@@ -333,6 +360,13 @@ UNUSUAL_DEV(  0x0482, 0x0103, 0x0100, 0x0100,
+ 		"Finecam S5",
+ 		US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_FIX_INQUIRY),
+ 
++/* Patch submitted by Jens Taprogge <jens.taprogge at taprogge.org> */
++UNUSUAL_DEV(  0x0482, 0x0107, 0x0100, 0x0100,
++		"Kyocera",
++		"CONTAX SL300R T*",
++		US_SC_DEVICE, US_PR_DEVICE, NULL,
++		US_FL_FIX_CAPACITY | US_FL_NOT_LOCKABLE),
++
+ /* Reported by Paul Stewart <stewart at wetlogic.net>
+  * This entry is needed because the device reports Sub=ff */
+ UNUSUAL_DEV(  0x04a4, 0x0004, 0x0001, 0x0001,
+@@ -355,6 +389,13 @@ UNUSUAL_DEV(  0x04b0, 0x0401, 0x0200, 0x0200,
+ 		US_SC_DEVICE, US_PR_DEVICE, NULL,
+ 		US_FL_FIX_CAPACITY),
+ 
++/* Reported by Tobias Kunze Briseno <t-linux at fictive.com> */
++UNUSUAL_DEV(  0x04b0, 0x0403, 0x0200, 0x0200,
++		"NIKON",
++		"NIKON DSC D2H",
++		US_SC_DEVICE, US_PR_DEVICE, NULL,
++		US_FL_FIX_CAPACITY),
++
+ /* Reported by Milinevsky Dmitry <niam.niam at gmail.com> */
+ UNUSUAL_DEV(  0x04b0, 0x0409, 0x0100, 0x0100,
+ 		"NIKON",
+@@ -411,6 +452,13 @@ UNUSUAL_DEV(  0x04b0, 0x0417, 0x0100, 0x0100,
+ 		US_SC_DEVICE, US_PR_DEVICE, NULL,
+ 		US_FL_FIX_CAPACITY),
+ 
++/* Reported by paul ready <lxtwin at homecall.co.uk> */
++UNUSUAL_DEV(  0x04b0, 0x0419, 0x0100, 0x0200,
++		"NIKON",
++		"NIKON DSC D300",
++		US_SC_DEVICE, US_PR_DEVICE, NULL,
++		US_FL_FIX_CAPACITY),
++
+ /* Reported by Doug Maxey (dwm at austin.ibm.com) */
+ UNUSUAL_DEV(  0x04b3, 0x4001, 0x0110, 0x0110,
+ 		"IBM",
+@@ -1635,97 +1683,332 @@ UNUSUAL_DEV(  0x1210, 0x0003, 0x0100, 0x0100,
+ /* Reported by fangxiaozhi <huananhu at huawei.com>
+  * This brings the HUAWEI data card devices into multi-port mode
+  */
+-UNUSUAL_DEV( 0x12d1, 0x1001, 0x0000, 0x0000,
++UNUSUAL_DEV(  0x12d1, 0x1001, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x1003, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x1004, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x1401, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x1402, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x1403, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x1404, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x1405, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x1406, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x1407, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x1408, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x1409, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x140A, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x140B, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x140C, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x140D, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x140E, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x140F, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x1410, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x1411, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x1412, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x1413, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x1414, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x1415, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x1416, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x1417, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x1418, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x1419, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x141A, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x141B, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x141C, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x141D, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x141E, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x141F, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x1420, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x1421, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x1422, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x1423, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x1424, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x1425, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x1426, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x1427, 0x0000, 0x0000,
+ 		"HUAWEI MOBILE",
+ 		"Mass Storage",
+ 		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
+ 		0),
+-UNUSUAL_DEV( 0x12d1, 0x1003, 0x0000, 0x0000,
++UNUSUAL_DEV(  0x12d1, 0x1428, 0x0000, 0x0000,
+ 		"HUAWEI MOBILE",
+ 		"Mass Storage",
+ 		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
+ 		0),
+-UNUSUAL_DEV( 0x12d1, 0x1004, 0x0000, 0x0000,
++UNUSUAL_DEV(  0x12d1, 0x1429, 0x0000, 0x0000,
+ 		"HUAWEI MOBILE",
+ 		"Mass Storage",
+ 		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
+ 		0),
+-UNUSUAL_DEV( 0x12d1, 0x1401, 0x0000, 0x0000,
++UNUSUAL_DEV(  0x12d1, 0x142A, 0x0000, 0x0000,
+ 		"HUAWEI MOBILE",
+ 		"Mass Storage",
+ 		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
+ 		0),
+-UNUSUAL_DEV( 0x12d1, 0x1403, 0x0000, 0x0000,
++UNUSUAL_DEV(  0x12d1, 0x142B, 0x0000, 0x0000,
+ 		"HUAWEI MOBILE",
+ 		"Mass Storage",
+ 		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
+ 		0),
+-UNUSUAL_DEV( 0x12d1, 0x1405, 0x0000, 0x0000,
++UNUSUAL_DEV(  0x12d1, 0x142C, 0x0000, 0x0000,
+ 		"HUAWEI MOBILE",
+ 		"Mass Storage",
+ 		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
+ 		0),
+-UNUSUAL_DEV( 0x12d1, 0x1406, 0x0000, 0x0000,
++UNUSUAL_DEV(  0x12d1, 0x142D, 0x0000, 0x0000,
+ 		"HUAWEI MOBILE",
+ 		"Mass Storage",
+ 		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
+ 		0),
+-UNUSUAL_DEV( 0x12d1, 0x1408, 0x0000, 0x0000,
++UNUSUAL_DEV(  0x12d1, 0x142E, 0x0000, 0x0000,
+ 		"HUAWEI MOBILE",
+ 		"Mass Storage",
+ 		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
+ 		0),
+-UNUSUAL_DEV( 0x12d1, 0x1409, 0x0000, 0x0000,
++UNUSUAL_DEV(  0x12d1, 0x142F, 0x0000, 0x0000,
+ 		"HUAWEI MOBILE",
+ 		"Mass Storage",
+ 		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
+ 		0),
+-UNUSUAL_DEV( 0x12d1, 0x1410, 0x0000, 0x0000,
++UNUSUAL_DEV(  0x12d1, 0x1430, 0x0000, 0x0000,
+ 		"HUAWEI MOBILE",
+ 		"Mass Storage",
+ 		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
+ 		0),
+-UNUSUAL_DEV( 0x12d1, 0x1411, 0x0000, 0x0000,
++UNUSUAL_DEV(  0x12d1, 0x1431, 0x0000, 0x0000,
+ 		"HUAWEI MOBILE",
+ 		"Mass Storage",
+ 		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
+ 		0),
+-UNUSUAL_DEV( 0x12d1, 0x1412, 0x0000, 0x0000,
++UNUSUAL_DEV(  0x12d1, 0x1432, 0x0000, 0x0000,
+ 		"HUAWEI MOBILE",
+ 		"Mass Storage",
+ 		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
+ 		0),
+-UNUSUAL_DEV( 0x12d1, 0x1413, 0x0000, 0x0000,
++UNUSUAL_DEV(  0x12d1, 0x1433, 0x0000, 0x0000,
+ 		"HUAWEI MOBILE",
+ 		"Mass Storage",
+ 		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
+ 		0),
+-UNUSUAL_DEV( 0x12d1, 0x1414, 0x0000, 0x0000,
++UNUSUAL_DEV(  0x12d1, 0x1434, 0x0000, 0x0000,
+ 		"HUAWEI MOBILE",
+ 		"Mass Storage",
+ 		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
+ 		0),
+-UNUSUAL_DEV( 0x12d1, 0x1415, 0x0000, 0x0000,
++UNUSUAL_DEV(  0x12d1, 0x1435, 0x0000, 0x0000,
+ 		"HUAWEI MOBILE",
+ 		"Mass Storage",
+ 		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
+ 		0),
+-UNUSUAL_DEV( 0x12d1, 0x1416, 0x0000, 0x0000,
++UNUSUAL_DEV(  0x12d1, 0x1436, 0x0000, 0x0000,
+ 		"HUAWEI MOBILE",
+ 		"Mass Storage",
+ 		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
+ 		0),
+-UNUSUAL_DEV( 0x12d1, 0x1417, 0x0000, 0x0000,
++UNUSUAL_DEV(  0x12d1, 0x1437, 0x0000, 0x0000,
+ 		"HUAWEI MOBILE",
+ 		"Mass Storage",
+ 		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
+ 		0),
+-UNUSUAL_DEV( 0x12d1, 0x1418, 0x0000, 0x0000,
++UNUSUAL_DEV(  0x12d1, 0x1438, 0x0000, 0x0000,
+ 		"HUAWEI MOBILE",
+ 		"Mass Storage",
+ 		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
+ 		0),
+-UNUSUAL_DEV( 0x12d1, 0x1419, 0x0000, 0x0000,
++UNUSUAL_DEV(  0x12d1, 0x1439, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x143A, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x143B, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x143C, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x143D, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x143E, 0x0000, 0x0000,
++		"HUAWEI MOBILE",
++		"Mass Storage",
++		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++		0),
++UNUSUAL_DEV(  0x12d1, 0x143F, 0x0000, 0x0000,
+ 		"HUAWEI MOBILE",
+ 		"Mass Storage",
+ 		US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
+@@ -1834,6 +2117,15 @@ UNUSUAL_DEV(  0x2770, 0x915d, 0x0010, 0x0010,
+ 		US_SC_DEVICE, US_PR_DEVICE, NULL,
+ 		US_FL_FIX_CAPACITY ),
+ 
++/* Reported by Frederic Marchal <frederic.marchal at wowcompany.com>
++ * Mio Moov 330
++ */
++UNUSUAL_DEV(  0x3340, 0xffff, 0x0000, 0x0000,
++		"Mitac",
++		"Mio DigiWalker USB Sync",
++		US_SC_DEVICE,US_PR_DEVICE,NULL,
++		US_FL_MAX_SECTORS_64 ),
++
+ /* Reported by Andrey Rahmatullin <wrar at altlinux.org> */
+ UNUSUAL_DEV(  0x4102, 0x1020, 0x0100,  0x0100,
+ 		"iRiver",
+diff --git a/drivers/watchdog/ib700wdt.c b/drivers/watchdog/ib700wdt.c
+index 05a2810..8782ec1 100644
+--- a/drivers/watchdog/ib700wdt.c
++++ b/drivers/watchdog/ib700wdt.c
+@@ -154,7 +154,7 @@ static int ibwdt_set_heartbeat(int t)
+ 		return -EINVAL;
+ 
+ 	for (i = 0x0F; i > -1; i--)
+-		if (wd_times[i] > t)
++		if (wd_times[i] >= t)
+ 			break;
+ 	wd_margin = i;
+ 	return 0;
+diff --git a/fs/binfmt_em86.c b/fs/binfmt_em86.c
+index f9c88d0..32fb00b 100644
+--- a/fs/binfmt_em86.c
++++ b/fs/binfmt_em86.c
+@@ -43,7 +43,7 @@ static int load_em86(struct linux_binprm *bprm,struct pt_regs *regs)
+ 			return -ENOEXEC;
+ 	}
+ 
+-	bprm->sh_bang = 1;	/* Well, the bang-shell is implicit... */
++	bprm->recursion_depth++; /* Well, the bang-shell is implicit... */
+ 	allow_write_access(bprm->file);
+ 	fput(bprm->file);
+ 	bprm->file = NULL;
+diff --git a/fs/binfmt_misc.c b/fs/binfmt_misc.c
+index 8d7e88e..f2744ab 100644
+--- a/fs/binfmt_misc.c
++++ b/fs/binfmt_misc.c
+@@ -117,7 +117,7 @@ static int load_misc_binary(struct linux_binprm *bprm, struct pt_regs *regs)
+ 		goto _ret;
+ 
+ 	retval = -ENOEXEC;
+-	if (bprm->misc_bang)
++	if (bprm->recursion_depth > BINPRM_MAX_RECURSION)
+ 		goto _ret;
+ 
+ 	/* to keep locking time low, we copy the interpreter string */
+@@ -197,7 +197,7 @@ static int load_misc_binary(struct linux_binprm *bprm, struct pt_regs *regs)
+ 	if (retval < 0)
+ 		goto _error;
+ 
+-	bprm->misc_bang = 1;
++	bprm->recursion_depth++;
+ 
+ 	retval = search_binary_handler (bprm, regs);
+ 	if (retval < 0)
+diff --git a/fs/binfmt_script.c b/fs/binfmt_script.c
+index 9e3963f..0834350 100644
+--- a/fs/binfmt_script.c
++++ b/fs/binfmt_script.c
+@@ -22,14 +22,15 @@ static int load_script(struct linux_binprm *bprm,struct pt_regs *regs)
+ 	char interp[BINPRM_BUF_SIZE];
+ 	int retval;
+ 
+-	if ((bprm->buf[0] != '#') || (bprm->buf[1] != '!') || (bprm->sh_bang)) 
++	if ((bprm->buf[0] != '#') || (bprm->buf[1] != '!') ||
++	    (bprm->recursion_depth > BINPRM_MAX_RECURSION))
+ 		return -ENOEXEC;
+ 	/*
+ 	 * This section does the #! interpretation.
+ 	 * Sorta complicated, but hopefully it will work.  -TYT
+ 	 */
+ 
+-	bprm->sh_bang = 1;
++	bprm->recursion_depth++;
+ 	allow_write_access(bprm->file);
+ 	fput(bprm->file);
+ 	bprm->file = NULL;
+diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
+index 6e2be4a..223647f 100644
+--- a/fs/cifs/connect.c
++++ b/fs/cifs/connect.c
+@@ -128,7 +128,7 @@ cifs_reconnect(struct TCP_Server_Info *server)
+ 	struct mid_q_entry *mid_entry;
+ 
+ 	spin_lock(&GlobalMid_Lock);
+-	if (kthread_should_stop()) {
++	if (server->tcpStatus == CifsExiting) {
+ 		/* the demux thread will exit normally
+ 		next time through the loop */
+ 		spin_unlock(&GlobalMid_Lock);
+@@ -182,7 +182,8 @@ cifs_reconnect(struct TCP_Server_Info *server)
+ 	spin_unlock(&GlobalMid_Lock);
+ 	up(&server->tcpSem);
+ 
+-	while ((!kthread_should_stop()) && (server->tcpStatus != CifsGood)) {
++	while ((server->tcpStatus != CifsExiting) &&
++	       (server->tcpStatus != CifsGood)) {
+ 		try_to_freeze();
+ 		if (server->addr.sockAddr6.sin6_family == AF_INET6) {
+ 			rc = ipv6_connect(&server->addr.sockAddr6,
+@@ -200,7 +201,7 @@ cifs_reconnect(struct TCP_Server_Info *server)
+ 		} else {
+ 			atomic_inc(&tcpSesReconnectCount);
+ 			spin_lock(&GlobalMid_Lock);
+-			if (!kthread_should_stop())
++			if (server->tcpStatus != CifsExiting)
+ 				server->tcpStatus = CifsGood;
+ 			server->sequence_number = 0;
+ 			spin_unlock(&GlobalMid_Lock);
+@@ -355,7 +356,7 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
+ 				GFP_KERNEL);
+ 
+ 	set_freezable();
+-	while (!kthread_should_stop()) {
++	while (server->tcpStatus != CifsExiting) {
+ 		if (try_to_freeze())
+ 			continue;
+ 		if (bigbuf == NULL) {
+@@ -396,7 +397,7 @@ incomplete_rcv:
+ 		    kernel_recvmsg(csocket, &smb_msg,
+ 				&iov, 1, pdu_length, 0 /* BB other flags? */);
+ 
+-		if (kthread_should_stop()) {
++		if (server->tcpStatus == CifsExiting) {
+ 			break;
+ 		} else if (server->tcpStatus == CifsNeedReconnect) {
+ 			cFYI(1, ("Reconnect after server stopped responding"));
+@@ -527,7 +528,7 @@ incomplete_rcv:
+ 		     total_read += length) {
+ 			length = kernel_recvmsg(csocket, &smb_msg, &iov, 1,
+ 						pdu_length - total_read, 0);
+-			if (kthread_should_stop() ||
++			if ((server->tcpStatus == CifsExiting) ||
+ 			    (length == -EINTR)) {
+ 				/* then will exit */
+ 				reconnect = 2;
+@@ -661,14 +662,6 @@ multi_t2_fnd:
+ 	spin_unlock(&GlobalMid_Lock);
+ 	wake_up_all(&server->response_q);
+ 
+-	/* don't exit until kthread_stop is called */
+-	set_current_state(TASK_UNINTERRUPTIBLE);
+-	while (!kthread_should_stop()) {
+-		schedule();
+-		set_current_state(TASK_UNINTERRUPTIBLE);
+-	}
+-	set_current_state(TASK_RUNNING);
+-
+ 	/* check if we have blocked requests that need to free */
+ 	/* Note that cifs_max_pending is normally 50, but
+ 	can be set at module install time to as little as two */
+@@ -764,6 +757,7 @@ multi_t2_fnd:
+ 	read_unlock(&cifs_tcp_ses_lock);
+ 
+ 	kfree(server->hostname);
++	task_to_wake = xchg(&server->tsk, NULL);
+ 	kfree(server);
+ 
+ 	length = atomic_dec_return(&tcpSesAllocCount);
+@@ -771,6 +765,16 @@ multi_t2_fnd:
+ 		mempool_resize(cifs_req_poolp, length + cifs_min_rcv,
+ 				GFP_KERNEL);
+ 
++	/* if server->tsk was NULL then wait for a signal before exiting */
++	if (!task_to_wake) {
++		set_current_state(TASK_INTERRUPTIBLE);
++		while (!signal_pending(current)) {
++			schedule();
++			set_current_state(TASK_INTERRUPTIBLE);
++		}
++		set_current_state(TASK_RUNNING);
++	}
++
+ 	return 0;
+ }
+ 
+@@ -2310,7 +2314,7 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
+ 	/* on error free sesinfo and tcon struct if needed */
+ mount_fail_check:
+ 	if (rc) {
+-		 /* If find_unc succeeded then rc == 0 so we can not end */
++		/* If find_unc succeeded then rc == 0 so we can not end */
+ 		/* up accidently freeing someone elses tcon struct */
+ 		if (tcon)
+ 			cifs_put_tcon(tcon);
+@@ -3715,8 +3719,10 @@ int cifs_setup_session(unsigned int xid, struct cifsSesInfo *pSesInfo,
+ 		cERROR(1, ("Send error in SessSetup = %d", rc));
+ 	} else {
+ 		cFYI(1, ("CIFS Session Established successfully"));
++			spin_lock(&GlobalMid_Lock);
+ 			pSesInfo->status = CifsGood;
+ 			pSesInfo->need_reconnect = false;
++			spin_unlock(&GlobalMid_Lock);
+ 	}
+ 
+ ss_err_exit:
+diff --git a/fs/exec.c b/fs/exec.c
+index cecee50..b266ace 100644
+--- a/fs/exec.c
++++ b/fs/exec.c
+@@ -1164,6 +1164,7 @@ EXPORT_SYMBOL(remove_arg_zero);
+  */
+ int search_binary_handler(struct linux_binprm *bprm,struct pt_regs *regs)
+ {
++	unsigned int depth = bprm->recursion_depth;
+ 	int try,retval;
+ 	struct linux_binfmt *fmt;
+ #ifdef __alpha__
+@@ -1224,8 +1225,15 @@ int search_binary_handler(struct linux_binprm *bprm,struct pt_regs *regs)
+ 				continue;
+ 			read_unlock(&binfmt_lock);
+ 			retval = fn(bprm, regs);
++			/*
++			 * Restore the depth counter to its starting value
++			 * in this call, so we don't have to rely on every
++			 * load_binary function to restore it on return.
++			 */
++			bprm->recursion_depth = depth;
+ 			if (retval >= 0) {
+-				tracehook_report_exec(fmt, bprm, regs);
++				if (depth == 0)
++					tracehook_report_exec(fmt, bprm, regs);
+ 				put_binfmt(fmt);
+ 				allow_write_access(bprm->file);
+ 				if (bprm->file)
+diff --git a/fs/fcntl.c b/fs/fcntl.c
+index ac4f7db..549daf8 100644
+--- a/fs/fcntl.c
++++ b/fs/fcntl.c
+@@ -19,6 +19,7 @@
+ #include <linux/signal.h>
+ #include <linux/rcupdate.h>
+ #include <linux/pid_namespace.h>
++#include <linux/smp_lock.h>
+ 
+ #include <asm/poll.h>
+ #include <asm/siginfo.h>
+@@ -175,6 +176,11 @@ static int setfl(int fd, struct file * filp, unsigned long arg)
+ 	if (error)
+ 		return error;
+ 
++	/*
++	 * We still need a lock here for now to keep multiple FASYNC calls
++	 * from racing with each other.
++	 */
++	lock_kernel();
+ 	if ((arg ^ filp->f_flags) & FASYNC) {
+ 		if (filp->f_op && filp->f_op->fasync) {
+ 			error = filp->f_op->fasync(fd, filp, (arg & FASYNC) != 0);
+@@ -185,6 +191,7 @@ static int setfl(int fd, struct file * filp, unsigned long arg)
+ 
+ 	filp->f_flags = (arg & SETFL_MASK) | (filp->f_flags & ~SETFL_MASK);
+  out:
++	unlock_kernel();
+ 	return error;
+ }
+ 
+diff --git a/fs/ioctl.c b/fs/ioctl.c
+index 7db32b3..612e0b2 100644
+--- a/fs/ioctl.c
++++ b/fs/ioctl.c
+@@ -123,11 +123,9 @@ static int ioctl_fioasync(unsigned int fd, struct file *filp,
+ 
+ 	/* Did FASYNC state change ? */
+ 	if ((flag ^ filp->f_flags) & FASYNC) {
+-		if (filp->f_op && filp->f_op->fasync) {
+-			lock_kernel();
++		if (filp->f_op && filp->f_op->fasync)
+ 			error = filp->f_op->fasync(fd, filp, on);
+-			unlock_kernel();
+-		} else
++		else
+ 			error = -ENOTTY;
+ 	}
+ 	if (error)
+@@ -163,11 +161,17 @@ int do_vfs_ioctl(struct file *filp, unsigned int fd, unsigned int cmd,
+ 		break;
+ 
+ 	case FIONBIO:
++		/* BKL needed to avoid races tweaking f_flags */
++		lock_kernel();
+ 		error = ioctl_fionbio(filp, argp);
++		unlock_kernel();
+ 		break;
+ 
+ 	case FIOASYNC:
++		/* BKL needed to avoid races tweaking f_flags */
++		lock_kernel();
+ 		error = ioctl_fioasync(fd, filp, argp);
++		unlock_kernel();
+ 		break;
+ 
+ 	case FIOQSIZE:
+diff --git a/fs/jbd/checkpoint.c b/fs/jbd/checkpoint.c
+index a5432bb..fe85219 100644
+--- a/fs/jbd/checkpoint.c
++++ b/fs/jbd/checkpoint.c
+@@ -93,7 +93,8 @@ static int __try_to_free_cp_buf(struct journal_head *jh)
+ 	int ret = 0;
+ 	struct buffer_head *bh = jh2bh(jh);
+ 
+-	if (jh->b_jlist == BJ_None && !buffer_locked(bh) && !buffer_dirty(bh)) {
++	if (jh->b_jlist == BJ_None && !buffer_locked(bh) &&
++	    !buffer_dirty(bh) && !buffer_write_io_error(bh)) {
+ 		JBUFFER_TRACE(jh, "remove from checkpoint list");
+ 		ret = __journal_remove_checkpoint(jh) + 1;
+ 		jbd_unlock_bh_state(bh);
+@@ -160,21 +161,25 @@ static void jbd_sync_bh(journal_t *journal, struct buffer_head *bh)
+  * buffers. Note that we take the buffers in the opposite ordering
+  * from the one in which they were submitted for IO.
+  *
++ * Return 0 on success, and return <0 if some buffers have failed
++ * to be written out.
++ *
+  * Called with j_list_lock held.
+  */
+-static void __wait_cp_io(journal_t *journal, transaction_t *transaction)
++static int __wait_cp_io(journal_t *journal, transaction_t *transaction)
+ {
+ 	struct journal_head *jh;
+ 	struct buffer_head *bh;
+ 	tid_t this_tid;
+ 	int released = 0;
++	int ret = 0;
+ 
+ 	this_tid = transaction->t_tid;
+ restart:
+ 	/* Did somebody clean up the transaction in the meanwhile? */
+ 	if (journal->j_checkpoint_transactions != transaction ||
+ 			transaction->t_tid != this_tid)
+-		return;
++		return ret;
+ 	while (!released && transaction->t_checkpoint_io_list) {
+ 		jh = transaction->t_checkpoint_io_list;
+ 		bh = jh2bh(jh);
+@@ -194,6 +199,9 @@ restart:
+ 			spin_lock(&journal->j_list_lock);
+ 			goto restart;
+ 		}
++		if (unlikely(buffer_write_io_error(bh)))
++			ret = -EIO;
++
+ 		/*
+ 		 * Now in whatever state the buffer currently is, we know that
+ 		 * it has been written out and so we can drop it from the list
+@@ -203,6 +211,8 @@ restart:
+ 		journal_remove_journal_head(bh);
+ 		__brelse(bh);
+ 	}
++
++	return ret;
+ }
+ 
+ #define NR_BATCH	64
+@@ -226,7 +236,8 @@ __flush_batch(journal_t *journal, struct buffer_head **bhs, int *batch_count)
+  * Try to flush one buffer from the checkpoint list to disk.
+  *
+  * Return 1 if something happened which requires us to abort the current
+- * scan of the checkpoint list.
++ * scan of the checkpoint list.  Return <0 if the buffer has failed to
++ * be written out.
+  *
+  * Called with j_list_lock held and drops it if 1 is returned
+  * Called under jbd_lock_bh_state(jh2bh(jh)), and drops it
+@@ -256,6 +267,9 @@ static int __process_buffer(journal_t *journal, struct journal_head *jh,
+ 		log_wait_commit(journal, tid);
+ 		ret = 1;
+ 	} else if (!buffer_dirty(bh)) {
++		ret = 1;
++		if (unlikely(buffer_write_io_error(bh)))
++			ret = -EIO;
+ 		J_ASSERT_JH(jh, !buffer_jbddirty(bh));
+ 		BUFFER_TRACE(bh, "remove from checkpoint");
+ 		__journal_remove_checkpoint(jh);
+@@ -263,7 +277,6 @@ static int __process_buffer(journal_t *journal, struct journal_head *jh,
+ 		jbd_unlock_bh_state(bh);
+ 		journal_remove_journal_head(bh);
+ 		__brelse(bh);
+-		ret = 1;
+ 	} else {
+ 		/*
+ 		 * Important: we are about to write the buffer, and
+@@ -295,6 +308,7 @@ static int __process_buffer(journal_t *journal, struct journal_head *jh,
+  * to disk. We submit larger chunks of data at once.
+  *
+  * The journal should be locked before calling this function.
++ * Called with j_checkpoint_mutex held.
+  */
+ int log_do_checkpoint(journal_t *journal)
+ {
+@@ -318,6 +332,7 @@ int log_do_checkpoint(journal_t *journal)
+ 	 * OK, we need to start writing disk blocks.  Take one transaction
+ 	 * and write it.
+ 	 */
++	result = 0;
+ 	spin_lock(&journal->j_list_lock);
+ 	if (!journal->j_checkpoint_transactions)
+ 		goto out;
+@@ -334,7 +349,7 @@ restart:
+ 		int batch_count = 0;
+ 		struct buffer_head *bhs[NR_BATCH];
+ 		struct journal_head *jh;
+-		int retry = 0;
++		int retry = 0, err;
+ 
+ 		while (!retry && transaction->t_checkpoint_list) {
+ 			struct buffer_head *bh;
+@@ -347,6 +362,8 @@ restart:
+ 				break;
+ 			}
+ 			retry = __process_buffer(journal, jh, bhs,&batch_count);
++			if (retry < 0 && !result)
++				result = retry;
+ 			if (!retry && (need_resched() ||
+ 				spin_needbreak(&journal->j_list_lock))) {
+ 				spin_unlock(&journal->j_list_lock);
+@@ -371,14 +388,18 @@ restart:
+ 		 * Now we have cleaned up the first transaction's checkpoint
+ 		 * list. Let's clean up the second one
+ 		 */
+-		__wait_cp_io(journal, transaction);
++		err = __wait_cp_io(journal, transaction);
++		if (!result)
++			result = err;
+ 	}
+ out:
+ 	spin_unlock(&journal->j_list_lock);
+-	result = cleanup_journal_tail(journal);
+ 	if (result < 0)
+-		return result;
+-	return 0;
++		journal_abort(journal, result);
++	else
++		result = cleanup_journal_tail(journal);
++
++	return (result < 0) ? result : 0;
+ }
+ 
+ /*
+@@ -394,8 +415,9 @@ out:
+  * This is the only part of the journaling code which really needs to be
+  * aware of transaction aborts.  Checkpointing involves writing to the
+  * main filesystem area rather than to the journal, so it can proceed
+- * even in abort state, but we must not update the journal superblock if
+- * we have an abort error outstanding.
++ * even in abort state, but we must not update the super block if
++ * checkpointing may have failed.  Otherwise, we would lose some metadata
++ * buffers which should be written-back to the filesystem.
+  */
+ 
+ int cleanup_journal_tail(journal_t *journal)
+@@ -404,6 +426,9 @@ int cleanup_journal_tail(journal_t *journal)
+ 	tid_t		first_tid;
+ 	unsigned long	blocknr, freed;
+ 
++	if (is_journal_aborted(journal))
++		return 1;
++
+ 	/* OK, work out the oldest transaction remaining in the log, and
+ 	 * the log block it starts at.
+ 	 *
+diff --git a/fs/jbd/journal.c b/fs/jbd/journal.c
+index aa7143a..9e4fa52 100644
+--- a/fs/jbd/journal.c
++++ b/fs/jbd/journal.c
+@@ -1121,9 +1121,12 @@ recovery_error:
+  *
+  * Release a journal_t structure once it is no longer in use by the
+  * journaled object.
++ * Return <0 if we couldn't clean up the journal.
+  */
+-void journal_destroy(journal_t *journal)
++int journal_destroy(journal_t *journal)
+ {
++	int err = 0;
++
+ 	/* Wait for the commit thread to wake up and die. */
+ 	journal_kill_thread(journal);
+ 
+@@ -1146,11 +1149,16 @@ void journal_destroy(journal_t *journal)
+ 	J_ASSERT(journal->j_checkpoint_transactions == NULL);
+ 	spin_unlock(&journal->j_list_lock);
+ 
+-	/* We can now mark the journal as empty. */
+-	journal->j_tail = 0;
+-	journal->j_tail_sequence = ++journal->j_transaction_sequence;
+ 	if (journal->j_sb_buffer) {
+-		journal_update_superblock(journal, 1);
++		if (!is_journal_aborted(journal)) {
++			/* We can now mark the journal as empty. */
++			journal->j_tail = 0;
++			journal->j_tail_sequence =
++				++journal->j_transaction_sequence;
++			journal_update_superblock(journal, 1);
++		} else {
++			err = -EIO;
++		}
+ 		brelse(journal->j_sb_buffer);
+ 	}
+ 
+@@ -1160,6 +1168,8 @@ void journal_destroy(journal_t *journal)
+ 		journal_destroy_revoke(journal);
+ 	kfree(journal->j_wbuf);
+ 	kfree(journal);
++
++	return err;
+ }
+ 
+ 
+@@ -1359,10 +1369,16 @@ int journal_flush(journal_t *journal)
+ 	spin_lock(&journal->j_list_lock);
+ 	while (!err && journal->j_checkpoint_transactions != NULL) {
+ 		spin_unlock(&journal->j_list_lock);
++		mutex_lock(&journal->j_checkpoint_mutex);
+ 		err = log_do_checkpoint(journal);
++		mutex_unlock(&journal->j_checkpoint_mutex);
+ 		spin_lock(&journal->j_list_lock);
+ 	}
+ 	spin_unlock(&journal->j_list_lock);
++
++	if (is_journal_aborted(journal))
++		return -EIO;
++
+ 	cleanup_journal_tail(journal);
+ 
+ 	/* Finally, mark the journal as really needing no recovery.
+@@ -1384,7 +1400,7 @@ int journal_flush(journal_t *journal)
+ 	J_ASSERT(journal->j_head == journal->j_tail);
+ 	J_ASSERT(journal->j_tail_sequence == journal->j_transaction_sequence);
+ 	spin_unlock(&journal->j_state_lock);
+-	return err;
++	return 0;
+ }
+ 
+ /**
+diff --git a/fs/jbd/recovery.c b/fs/jbd/recovery.c
+index 43bc5e5..db5e982 100644
+--- a/fs/jbd/recovery.c
++++ b/fs/jbd/recovery.c
+@@ -223,7 +223,7 @@ do {									\
+  */
+ int journal_recover(journal_t *journal)
+ {
+-	int			err;
++	int			err, err2;
+ 	journal_superblock_t *	sb;
+ 
+ 	struct recovery_info	info;
+@@ -261,7 +261,10 @@ int journal_recover(journal_t *journal)
+ 	journal->j_transaction_sequence = ++info.end_transaction;
+ 
+ 	journal_clear_revoke(journal);
+-	sync_blockdev(journal->j_fs_dev);
++	err2 = sync_blockdev(journal->j_fs_dev);
++	if (!err)
++		err = err2;
++
+ 	return err;
+ }
+ 
+diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
+index f3ada04..8b84227 100644
+--- a/fs/proc/task_mmu.c
++++ b/fs/proc/task_mmu.c
+@@ -563,9 +563,9 @@ static u64 swap_pte_to_pagemap_entry(pte_t pte)
+ 	return swp_type(e) | (swp_offset(e) << MAX_SWAPFILES_SHIFT);
+ }
+ 
+-static unsigned long pte_to_pagemap_entry(pte_t pte)
++static u64 pte_to_pagemap_entry(pte_t pte)
+ {
+-	unsigned long pme = 0;
++	u64 pme = 0;
+ 	if (is_swap_pte(pte))
+ 		pme = PM_PFRAME(swap_pte_to_pagemap_entry(pte))
+ 			| PM_PSHIFT(PAGE_SHIFT) | PM_SWAP;
+diff --git a/fs/xfs/xfs_rename.c b/fs/xfs/xfs_rename.c
+index d700dac..c903130 100644
+--- a/fs/xfs/xfs_rename.c
++++ b/fs/xfs/xfs_rename.c
+@@ -212,7 +212,7 @@ xfs_rename(
+ 	if (unlikely((target_dp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) &&
+ 		     (target_dp->i_d.di_projid != src_ip->i_d.di_projid))) {
+ 		error = XFS_ERROR(EXDEV);
+-		xfs_rename_unlock4(inodes, XFS_ILOCK_SHARED);
++		xfs_rename_unlock4(inodes, XFS_ILOCK_EXCL);
+ 		xfs_trans_cancel(tp, cancel_flags);
+ 		goto std_return;
+ 	}
+diff --git a/include/linux/binfmts.h b/include/linux/binfmts.h
+index 826f623..12413a1 100644
+--- a/include/linux/binfmts.h
++++ b/include/linux/binfmts.h
+@@ -36,6 +36,7 @@ struct linux_binprm{
+ 	unsigned long p; /* current top of mem */
+ 	unsigned int sh_bang:1,
+ 		     misc_bang:1;
++	unsigned int recursion_depth;
+ 	struct file * file;
+ 	int e_uid, e_gid;
+ 	kernel_cap_t cap_post_exec_permitted;
+@@ -58,6 +59,7 @@ struct linux_binprm{
+ #define BINPRM_FLAGS_EXECFD_BIT 1
+ #define BINPRM_FLAGS_EXECFD (1 << BINPRM_FLAGS_EXECFD_BIT)
+ 
++#define BINPRM_MAX_RECURSION 4
+ 
+ /*
+  * This structure defines the functions that are used to load the binary formats that
+diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
+index 53ea933..73f4532 100644
+--- a/include/linux/blkdev.h
++++ b/include/linux/blkdev.h
+@@ -623,6 +623,7 @@ extern unsigned long blk_max_low_pfn, blk_max_pfn;
+  * default timeout for SG_IO if none specified
+  */
+ #define BLK_DEFAULT_SG_TIMEOUT	(60 * HZ)
++#define BLK_MIN_SG_TIMEOUT	(7 * HZ)
+ 
+ #ifdef CONFIG_BOUNCE
+ extern int init_emergency_isa_pool(void);
+diff --git a/include/linux/jbd.h b/include/linux/jbd.h
+index 07a9b52..0be86be 100644
+--- a/include/linux/jbd.h
++++ b/include/linux/jbd.h
+@@ -908,7 +908,7 @@ extern int	   journal_set_features
+ 		   (journal_t *, unsigned long, unsigned long, unsigned long);
+ extern int	   journal_create     (journal_t *);
+ extern int	   journal_load       (journal_t *journal);
+-extern void	   journal_destroy    (journal_t *);
++extern int	   journal_destroy    (journal_t *);
+ extern int	   journal_recover    (journal_t *journal);
+ extern int	   journal_wipe       (journal_t *, int);
+ extern int	   journal_skip_recovery	(journal_t *);
+diff --git a/include/linux/pnp.h b/include/linux/pnp.h
+index be764e5..53b70fd 100644
+--- a/include/linux/pnp.h
++++ b/include/linux/pnp.h
+@@ -22,9 +22,11 @@ struct pnp_dev;
+  * Resource Management
+  */
+ #ifdef CONFIG_PNP
+-struct resource *pnp_get_resource(struct pnp_dev *, unsigned int, unsigned int);
++struct resource *pnp_get_resource(struct pnp_dev *dev, unsigned long type,
++				unsigned int num);
+ #else
+-static inline struct resource *pnp_get_resource(struct pnp_dev *dev, unsigned int type, unsigned int num)
++static inline struct resource *pnp_get_resource(struct pnp_dev *dev,
++			unsigned long type, unsigned int num)
+ {
+ 	return NULL;
+ }
+diff --git a/kernel/fork.c b/kernel/fork.c
+index 7ce2ebe..d8ad2c6 100644
+--- a/kernel/fork.c
++++ b/kernel/fork.c
+@@ -313,17 +313,20 @@ static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm)
+ 		file = tmp->vm_file;
+ 		if (file) {
+ 			struct inode *inode = file->f_path.dentry->d_inode;
++			struct address_space *mapping = file->f_mapping;
++
+ 			get_file(file);
+ 			if (tmp->vm_flags & VM_DENYWRITE)
+ 				atomic_dec(&inode->i_writecount);
+-
+-			/* insert tmp into the share list, just after mpnt */
+-			spin_lock(&file->f_mapping->i_mmap_lock);
++			spin_lock(&mapping->i_mmap_lock);
++			if (tmp->vm_flags & VM_SHARED)
++				mapping->i_mmap_writable++;
+ 			tmp->vm_truncate_count = mpnt->vm_truncate_count;
+-			flush_dcache_mmap_lock(file->f_mapping);
++			flush_dcache_mmap_lock(mapping);
++			/* insert tmp into the share list, just after mpnt */
+ 			vma_prio_tree_add(tmp, mpnt);
+-			flush_dcache_mmap_unlock(file->f_mapping);
+-			spin_unlock(&file->f_mapping->i_mmap_lock);
++			flush_dcache_mmap_unlock(mapping);
++			spin_unlock(&mapping->i_mmap_lock);
+ 		}
+ 
+ 		/*
+diff --git a/kernel/sched.c b/kernel/sched.c
+index a992cbe..92c0a70 100644
+--- a/kernel/sched.c
++++ b/kernel/sched.c
+@@ -6500,7 +6500,9 @@ migration_call(struct notifier_block *nfb, unsigned long action, void *hcpu)
+ 			req = list_entry(rq->migration_queue.next,
+ 					 struct migration_req, list);
+ 			list_del_init(&req->list);
++			spin_unlock_irq(&rq->lock);
+ 			complete(&req->done);
++			spin_lock_irq(&rq->lock);
+ 		}
+ 		spin_unlock_irq(&rq->lock);
+ 		break;
+@@ -6802,15 +6804,17 @@ cpu_attach_domain(struct sched_domain *sd, struct root_domain *rd, int cpu)
+ 	struct sched_domain *tmp;
+ 
+ 	/* Remove the sched domains which do not contribute to scheduling. */
+-	for (tmp = sd; tmp; tmp = tmp->parent) {
++	for (tmp = sd; tmp; ) {
+ 		struct sched_domain *parent = tmp->parent;
+ 		if (!parent)
+ 			break;
++
+ 		if (sd_parent_degenerate(tmp, parent)) {
+ 			tmp->parent = parent->parent;
+ 			if (parent->parent)
+ 				parent->parent->child = tmp;
+-		}
++		} else
++			tmp = tmp->parent;
+ 	}
+ 
+ 	if (sd && sd_degenerate(sd)) {
+diff --git a/net/atm/svc.c b/net/atm/svc.c
+index de1e4f2..8fb54dc 100644
+--- a/net/atm/svc.c
++++ b/net/atm/svc.c
+@@ -293,7 +293,10 @@ static int svc_listen(struct socket *sock,int backlog)
+ 		error = -EINVAL;
+ 		goto out;
+ 	}
+-	vcc_insert_socket(sk);
++	if (test_bit(ATM_VF_LISTEN, &vcc->flags)) {
++		error = -EADDRINUSE;
++		goto out;
++        }
+ 	set_bit(ATM_VF_WAITING, &vcc->flags);
+ 	prepare_to_wait(sk->sk_sleep, &wait, TASK_UNINTERRUPTIBLE);
+ 	sigd_enq(vcc,as_listen,NULL,NULL,&vcc->local);
+@@ -307,6 +310,7 @@ static int svc_listen(struct socket *sock,int backlog)
+ 		goto out;
+ 	}
+ 	set_bit(ATM_VF_LISTEN,&vcc->flags);
++	vcc_insert_socket(sk);
+ 	sk->sk_max_ack_backlog = backlog > 0 ? backlog : ATM_BACKLOG_DEFAULT;
+ 	error = -sk->sk_err;
+ out:
+diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
+index 57e26fa..915e6b7 100644
+--- a/net/ipv4/udp.c
++++ b/net/ipv4/udp.c
+@@ -302,7 +302,7 @@ static struct sock *__udp4_lib_lookup(struct net *net, __be32 saddr,
+ 	return result;
+ }
+ 
+-static inline struct sock *udp_v4_mcast_next(struct sock *sk,
++static inline struct sock *udp_v4_mcast_next(struct net *net, struct sock *sk,
+ 					     __be16 loc_port, __be32 loc_addr,
+ 					     __be16 rmt_port, __be32 rmt_addr,
+ 					     int dif)
+@@ -314,7 +314,8 @@ static inline struct sock *udp_v4_mcast_next(struct sock *sk,
+ 	sk_for_each_from(s, node) {
+ 		struct inet_sock *inet = inet_sk(s);
+ 
+-		if (s->sk_hash != hnum					||
++		if (!net_eq(sock_net(s), net)				||
++		    s->sk_hash != hnum					||
+ 		    (inet->daddr && inet->daddr != rmt_addr)		||
+ 		    (inet->dport != rmt_port && inet->dport)		||
+ 		    (inet->rcv_saddr && inet->rcv_saddr != loc_addr)	||
+@@ -1097,15 +1098,16 @@ static int __udp4_lib_mcast_deliver(struct net *net, struct sk_buff *skb,
+ 	read_lock(&udp_hash_lock);
+ 	sk = sk_head(&udptable[udp_hashfn(net, ntohs(uh->dest))]);
+ 	dif = skb->dev->ifindex;
+-	sk = udp_v4_mcast_next(sk, uh->dest, daddr, uh->source, saddr, dif);
++	sk = udp_v4_mcast_next(net, sk, uh->dest, daddr, uh->source, saddr, dif);
+ 	if (sk) {
+ 		struct sock *sknext = NULL;
+ 
+ 		do {
+ 			struct sk_buff *skb1 = skb;
+ 
+-			sknext = udp_v4_mcast_next(sk_next(sk), uh->dest, daddr,
+-						   uh->source, saddr, dif);
++			sknext = udp_v4_mcast_next(net, sk_next(sk), uh->dest,
++						   daddr, uh->source, saddr,
++						   dif);
+ 			if (sknext)
+ 				skb1 = skb_clone(skb, GFP_ATOMIC);
+ 
+diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c
+index a6aecf7..e53d101 100644
+--- a/net/ipv6/udp.c
++++ b/net/ipv6/udp.c
+@@ -313,7 +313,7 @@ drop:
+ 	return -1;
+ }
+ 
+-static struct sock *udp_v6_mcast_next(struct sock *sk,
++static struct sock *udp_v6_mcast_next(struct net *net, struct sock *sk,
+ 				      __be16 loc_port, struct in6_addr *loc_addr,
+ 				      __be16 rmt_port, struct in6_addr *rmt_addr,
+ 				      int dif)
+@@ -325,7 +325,7 @@ static struct sock *udp_v6_mcast_next(struct sock *sk,
+ 	sk_for_each_from(s, node) {
+ 		struct inet_sock *inet = inet_sk(s);
+ 
+-		if (sock_net(s) != sock_net(sk))
++		if (!net_eq(sock_net(s), net))
+ 			continue;
+ 
+ 		if (s->sk_hash == num && s->sk_family == PF_INET6) {
+@@ -368,14 +368,14 @@ static int __udp6_lib_mcast_deliver(struct net *net, struct sk_buff *skb,
+ 	read_lock(&udp_hash_lock);
+ 	sk = sk_head(&udptable[udp_hashfn(net, ntohs(uh->dest))]);
+ 	dif = inet6_iif(skb);
+-	sk = udp_v6_mcast_next(sk, uh->dest, daddr, uh->source, saddr, dif);
++	sk = udp_v6_mcast_next(net, sk, uh->dest, daddr, uh->source, saddr, dif);
+ 	if (!sk) {
+ 		kfree_skb(skb);
+ 		goto out;
+ 	}
+ 
+ 	sk2 = sk;
+-	while ((sk2 = udp_v6_mcast_next(sk_next(sk2), uh->dest, daddr,
++	while ((sk2 = udp_v6_mcast_next(net, sk_next(sk2), uh->dest, daddr,
+ 					uh->source, saddr, dif))) {
+ 		struct sk_buff *buff = skb_clone(skb, GFP_ATOMIC);
+ 		if (buff) {
+diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
+index b0785ef..8e66fe0 100644
+--- a/net/unix/af_unix.c
++++ b/net/unix/af_unix.c
+@@ -2230,7 +2230,7 @@ static int unix_net_init(struct net *net)
+ #endif
+ 	error = 0;
+ out:
+-	return 0;
++	return error;
+ }
+ 
+ static void unix_net_exit(struct net *net)
+diff --git a/sound/pci/emu10k1/emu10k1_main.c b/sound/pci/emu10k1/emu10k1_main.c
+index 2f283ea..de5ee8f 100644
+--- a/sound/pci/emu10k1/emu10k1_main.c
++++ b/sound/pci/emu10k1/emu10k1_main.c
+@@ -1464,6 +1464,7 @@ static struct snd_emu_chip_details emu_chip_details[] = {
+ 	 .ca0151_chip = 1,
+ 	 .spk71 = 1,
+ 	 .spdif_bug = 1,
++	 .invert_shared_spdif = 1,	/* digital/analog switch swapped */
+ 	 .ac97_chip = 1} ,
+ 	{.vendor = 0x1102, .device = 0x0004, .subsystem = 0x20021102,
+ 	 .driver = "Audigy2", .name = "Audigy 2 ZS [SB0350]", 
+@@ -1473,6 +1474,7 @@ static struct snd_emu_chip_details emu_chip_details[] = {
+ 	 .ca0151_chip = 1,
+ 	 .spk71 = 1,
+ 	 .spdif_bug = 1,
++	 .invert_shared_spdif = 1,	/* digital/analog switch swapped */
+ 	 .ac97_chip = 1} ,
+ 	{.vendor = 0x1102, .device = 0x0004, .subsystem = 0x20011102,
+ 	 .driver = "Audigy2", .name = "Audigy 2 ZS [2001]", 
+@@ -1482,6 +1484,7 @@ static struct snd_emu_chip_details emu_chip_details[] = {
+ 	 .ca0151_chip = 1,
+ 	 .spk71 = 1,
+ 	 .spdif_bug = 1,
++	 .invert_shared_spdif = 1,	/* digital/analog switch swapped */
+ 	 .ac97_chip = 1} ,
+ 	/* Audigy 2 */
+ 	/* Tested by James at superbug.co.uk 3rd July 2005 */
+diff --git a/sound/pci/hda/hda_proc.c b/sound/pci/hda/hda_proc.c
+index 1e5aff5..2fe4ea1 100644
+--- a/sound/pci/hda/hda_proc.c
++++ b/sound/pci/hda/hda_proc.c
+@@ -216,7 +216,7 @@ static void print_pin_caps(struct snd_info_buffer *buffer,
+ 	unsigned int caps, val;
+ 
+ 	caps = snd_hda_param_read(codec, nid, AC_PAR_PIN_CAP);
+-	snd_iprintf(buffer, "  Pincap 0x08%x:", caps);
++	snd_iprintf(buffer, "  Pincap 0x%08x:", caps);
+ 	if (caps & AC_PINCAP_IN)
+ 		snd_iprintf(buffer, " IN");
+ 	if (caps & AC_PINCAP_OUT)
+diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c
+index e8003d9..cb13307 100644
+--- a/sound/pci/hda/patch_analog.c
++++ b/sound/pci/hda/patch_analog.c
+@@ -2247,8 +2247,12 @@ static struct hda_verb ad1988_spdif_init_verbs[] = {
+ 
+ /* AD1989 has no ADC -> SPDIF route */
+ static struct hda_verb ad1989_spdif_init_verbs[] = {
+-	/* SPDIF out pin */
++	/* SPDIF-1 out pin */
++	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
+ 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x27}, /* 0dB */
++	/* SPDIF-2/HDMI out pin */
++	{0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
++	{0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x27}, /* 0dB */
+ 	{ }
+ };
+ 
+@@ -2868,6 +2872,7 @@ static struct snd_pci_quirk ad1988_cfg_tbl[] = {
+ 	SND_PCI_QUIRK(0x1043, 0x81ec, "Asus P5B-DLX", AD1988_6STACK_DIG),
+ 	SND_PCI_QUIRK(0x1043, 0x81f6, "Asus M2N-SLI", AD1988_6STACK_DIG),
+ 	SND_PCI_QUIRK(0x1043, 0x8277, "Asus P5K-E/WIFI-AP", AD1988_6STACK_DIG),
++	SND_PCI_QUIRK(0x1043, 0x8311, "Asus P5Q-Premium/Pro", AD1988_6STACK_DIG),
+ 	{}
+ };
+ 
+@@ -3842,6 +3847,9 @@ static const char *ad1884a_models[AD1884A_MODELS] = {
+ 
+ static struct snd_pci_quirk ad1884a_cfg_tbl[] = {
+ 	SND_PCI_QUIRK(0x103c, 0x3030, "HP", AD1884A_MOBILE),
++	SND_PCI_QUIRK(0x103c, 0x3056, "HP", AD1884A_MOBILE),
++	SND_PCI_QUIRK(0x103c, 0x30e7, "HP EliteBook 8530p", AD1884A_LAPTOP),
++	SND_PCI_QUIRK(0x103c, 0x3614, "HP 6730s", AD1884A_LAPTOP),
+ 	SND_PCI_QUIRK(0x17aa, 0x20ac, "Thinkpad X300", AD1884A_THINKPAD),
+ 	{}
+ };
+diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
+index 6602516..a1a3a34 100644
+--- a/sound/pci/hda/patch_realtek.c
++++ b/sound/pci/hda/patch_realtek.c
+@@ -100,6 +100,7 @@ enum {
+ 	ALC262_BENQ_T31,
+ 	ALC262_ULTRA,
+ 	ALC262_LENOVO_3000,
++	ALC262_NEC,
+ 	ALC262_AUTO,
+ 	ALC262_MODEL_LAST /* last tag */
+ };
+@@ -291,6 +292,13 @@ struct alc_spec {
+ 	/* for PLL fix */
+ 	hda_nid_t pll_nid;
+ 	unsigned int pll_coef_idx, pll_coef_bit;
++
++#ifdef SND_HDA_NEEDS_RESUME
++#define ALC_MAX_PINS	16
++	unsigned int num_pins;
++	hda_nid_t pin_nids[ALC_MAX_PINS];
++	unsigned int pin_cfgs[ALC_MAX_PINS];
++#endif
+ };
+ 
+ /*
+@@ -2722,6 +2730,64 @@ static void alc_free(struct hda_codec *codec)
+ 	codec->spec = NULL; /* to be sure */
+ }
+ 
++#ifdef SND_HDA_NEEDS_RESUME
++static void store_pin_configs(struct hda_codec *codec)
++{
++	struct alc_spec *spec = codec->spec;
++	hda_nid_t nid, end_nid;
++
++	end_nid = codec->start_nid + codec->num_nodes;
++	for (nid = codec->start_nid; nid < end_nid; nid++) {
++		unsigned int wid_caps = get_wcaps(codec, nid);
++		unsigned int wid_type =
++			(wid_caps & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT;
++		if (wid_type != AC_WID_PIN)
++			continue;
++		if (spec->num_pins >= ARRAY_SIZE(spec->pin_nids))
++			break;
++		spec->pin_nids[spec->num_pins] = nid;
++		spec->pin_cfgs[spec->num_pins] =
++			snd_hda_codec_read(codec, nid, 0,
++					   AC_VERB_GET_CONFIG_DEFAULT, 0);
++		spec->num_pins++;
++	}
++}
++
++static void resume_pin_configs(struct hda_codec *codec)
++{
++	struct alc_spec *spec = codec->spec;
++	int i;
++
++	for (i = 0; i < spec->num_pins; i++) {
++		hda_nid_t pin_nid = spec->pin_nids[i];
++		unsigned int pin_config = spec->pin_cfgs[i];
++		snd_hda_codec_write(codec, pin_nid, 0,
++				    AC_VERB_SET_CONFIG_DEFAULT_BYTES_0,
++				    pin_config & 0x000000ff);
++		snd_hda_codec_write(codec, pin_nid, 0,
++				    AC_VERB_SET_CONFIG_DEFAULT_BYTES_1,
++				    (pin_config & 0x0000ff00) >> 8);
++		snd_hda_codec_write(codec, pin_nid, 0,
++				    AC_VERB_SET_CONFIG_DEFAULT_BYTES_2,
++				    (pin_config & 0x00ff0000) >> 16);
++		snd_hda_codec_write(codec, pin_nid, 0,
++				    AC_VERB_SET_CONFIG_DEFAULT_BYTES_3,
++				    pin_config >> 24);
++	}
++}
++
++static int alc_resume(struct hda_codec *codec)
++{
++	resume_pin_configs(codec);
++	codec->patch_ops.init(codec);
++	snd_hda_codec_resume_amp(codec);
++	snd_hda_codec_resume_cache(codec);
++	return 0;
++}
++#else
++#define store_pin_configs(codec)
++#endif
++
+ /*
+  */
+ static struct hda_codec_ops alc_patch_ops = {
+@@ -2730,6 +2796,9 @@ static struct hda_codec_ops alc_patch_ops = {
+ 	.init = alc_init,
+ 	.free = alc_free,
+ 	.unsol_event = alc_unsol_event,
++#ifdef SND_HDA_NEEDS_RESUME
++	.resume = alc_resume,
++#endif
+ #ifdef CONFIG_SND_HDA_POWER_SAVE
+ 	.check_power_status = alc_check_power_status,
+ #endif
+@@ -3776,6 +3845,7 @@ static int alc880_parse_auto_config(struct hda_codec *codec)
+ 	spec->num_mux_defs = 1;
+ 	spec->input_mux = &spec->private_imux;
+ 
++	store_pin_configs(codec);
+ 	return 1;
+ }
+ 
+@@ -5124,6 +5194,7 @@ static int alc260_parse_auto_config(struct hda_codec *codec)
+ 	}
+ 	spec->num_mixers++;
+ 
++	store_pin_configs(codec);
+ 	return 1;
+ }
+ 
+@@ -6554,6 +6625,7 @@ static int patch_alc882(struct hda_codec *codec)
+ 			board_config = ALC885_MACPRO;
+ 			break;
+ 		case 0x106b1000: /* iMac 24 */
++		case 0x106b2800: /* AppleTV */
+ 			board_config = ALC885_IMAC24;
+ 			break;
+ 		case 0x106b00a1: /* Macbook (might be wrong - PCI SSID?) */
+@@ -6563,7 +6635,8 @@ static int patch_alc882(struct hda_codec *codec)
+ 			break;
+ 		default:
+ 			/* ALC889A is handled better as ALC888-compatible */
+-			if (codec->revision_id == 0x100103) {
++			if (codec->revision_id == 0x100101 ||
++			    codec->revision_id == 0x100103) {
+ 				alc_free(codec);
+ 				return patch_alc883(codec);
+ 			}
+@@ -7940,6 +8013,7 @@ static const char *alc883_models[ALC883_MODEL_LAST] = {
+ static struct snd_pci_quirk alc883_cfg_tbl[] = {
+ 	SND_PCI_QUIRK(0x1019, 0x6668, "ECS", ALC883_3ST_6ch_DIG),
+ 	SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_ACER_ASPIRE),
++	SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_ACER_ASPIRE),
+ 	SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_ACER_ASPIRE),
+ 	SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_ACER_ASPIRE),
+ 	SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_ACER_ASPIRE), 
+@@ -7990,6 +8064,7 @@ static struct snd_pci_quirk alc883_cfg_tbl[] = {
+ 	SND_PCI_QUIRK(0x17aa, 0x3bfc, "Lenovo NB0763", ALC883_LENOVO_NB0763),
+ 	SND_PCI_QUIRK(0x17aa, 0x3bfd, "Lenovo NB0763", ALC883_LENOVO_NB0763),
+ 	SND_PCI_QUIRK(0x17c0, 0x4071, "MEDION MD2", ALC883_MEDION_MD2),
++	SND_PCI_QUIRK(0x17c0, 0x4085, "MEDION MD96630", ALC888_LENOVO_MS7195_DIG),
+ 	SND_PCI_QUIRK(0x17f2, 0x5000, "Albatron KI690-AM2", ALC883_6ST_DIG),
+ 	SND_PCI_QUIRK(0x1991, 0x5625, "Haier W66", ALC883_HAIER_W66),
+ 	SND_PCI_QUIRK(0x8086, 0x0001, "DG33BUC", ALC883_3ST_6ch_INTEL),
+@@ -8948,6 +9023,41 @@ static void alc262_hippo1_unsol_event(struct hda_codec *codec,
+ }
+ 
+ /*
++ * nec model
++ *  0x15 = headphone
++ *  0x16 = internal speaker
++ *  0x18 = external mic
++ */
++
++static struct snd_kcontrol_new alc262_nec_mixer[] = {
++	HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
++	HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 0, 0x0, HDA_OUTPUT),
++
++	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
++	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
++	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
++
++	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
++	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
++	{ } /* end */
++};
++
++static struct hda_verb alc262_nec_verbs[] = {
++	/* Unmute Speaker */
++	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
++
++	/* Headphone */
++	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
++	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
++
++	/* External mic to headphone */
++	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
++	/* External mic to speaker */
++	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
++	{}
++};
++
++/*
+  * fujitsu model
+  *  0x14 = headphone/spdif-out, 0x15 = internal speaker,
+  *  0x1b = port replicator headphone out
+@@ -9693,6 +9803,7 @@ static int alc262_parse_auto_config(struct hda_codec *codec)
+ 	if (err < 0)
+ 		return err;
+ 
++	store_pin_configs(codec);
+ 	return 1;
+ }
+ 
+@@ -9731,11 +9842,13 @@ static const char *alc262_models[ALC262_MODEL_LAST] = {
+ 	[ALC262_SONY_ASSAMD]	= "sony-assamd",
+ 	[ALC262_ULTRA]		= "ultra",
+ 	[ALC262_LENOVO_3000]	= "lenovo-3000",
++	[ALC262_NEC]		= "nec",
+ 	[ALC262_AUTO]		= "auto",
+ };
+ 
+ static struct snd_pci_quirk alc262_cfg_tbl[] = {
+ 	SND_PCI_QUIRK(0x1002, 0x437b, "Hippo", ALC262_HIPPO),
++	SND_PCI_QUIRK(0x1033, 0x8895, "NEC Versa S9100", ALC262_NEC),
+ 	SND_PCI_QUIRK(0x103c, 0x12fe, "HP xw9400", ALC262_HP_BPC),
+ 	SND_PCI_QUIRK(0x103c, 0x12ff, "HP xw4550", ALC262_HP_BPC),
+ 	SND_PCI_QUIRK(0x103c, 0x1306, "HP xw8600", ALC262_HP_BPC),
+@@ -9946,6 +10059,16 @@ static struct alc_config_preset alc262_presets[] = {
+ 		.input_mux = &alc262_fujitsu_capture_source,
+ 		.unsol_event = alc262_lenovo_3000_unsol_event,
+ 	},
++	[ALC262_NEC] = {
++		.mixers = { alc262_nec_mixer },
++		.init_verbs = { alc262_nec_verbs },
++		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
++		.dac_nids = alc262_dac_nids,
++		.hp_nid = 0x03,
++		.num_channel_mode = ARRAY_SIZE(alc262_modes),
++		.channel_mode = alc262_modes,
++		.input_mux = &alc262_capture_source,
++	},
+ };
+ 
+ static int patch_alc262(struct hda_codec *codec)
+@@ -10712,6 +10835,7 @@ static int alc268_parse_auto_config(struct hda_codec *codec)
+ 	if (err < 0)
+ 		return err;
+ 
++	store_pin_configs(codec);
+ 	return 1;
+ }
+ 
+@@ -10758,6 +10882,7 @@ static struct snd_pci_quirk alc268_cfg_tbl[] = {
+ 	SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC268_3ST),
+ 	SND_PCI_QUIRK(0x1179, 0xff10, "TOSHIBA A205", ALC268_TOSHIBA),
+ 	SND_PCI_QUIRK(0x1179, 0xff50, "TOSHIBA A305", ALC268_TOSHIBA),
++	SND_PCI_QUIRK(0x1179, 0xff64, "TOSHIBA L305", ALC268_TOSHIBA),
+ 	SND_PCI_QUIRK(0x14c0, 0x0025, "COMPAL IFL90/JFL-92", ALC268_TOSHIBA),
+ 	SND_PCI_QUIRK(0x152d, 0x0763, "Diverse (CPR2000)", ALC268_ACER),
+ 	SND_PCI_QUIRK(0x152d, 0x0771, "Quanta IL1", ALC267_QUANTA_IL1),
+@@ -10990,6 +11115,14 @@ static hda_nid_t alc269_adc_nids[1] = {
+ 	0x08,
+ };
+ 
++static hda_nid_t alc269_capsrc_nids[1] = {
++	0x23,
++};
++
++/* NOTE: ADC2 (0x07) is connected from a recording *MIXER* (0x24),
++ *       not a mux!
++ */
++
+ static struct hda_input_mux alc269_eeepc_dmic_capture_source = {
+ 	.num_items = 2,
+ 	.items = {
+@@ -11356,6 +11489,10 @@ static int alc269_parse_auto_config(struct hda_codec *codec)
+ 	spec->init_verbs[spec->num_init_verbs++] = alc269_init_verbs;
+ 	spec->num_mux_defs = 1;
+ 	spec->input_mux = &spec->private_imux;
++	/* set default input source */
++	snd_hda_codec_write_cache(codec, alc269_capsrc_nids[0],
++				  0, AC_VERB_SET_CONNECT_SEL,
++				  spec->input_mux->items[0].index);
+ 
+ 	err = alc_auto_add_mic_boost(codec);
+ 	if (err < 0)
+@@ -11364,6 +11501,7 @@ static int alc269_parse_auto_config(struct hda_codec *codec)
+ 	spec->mixers[spec->num_mixers] = alc269_capture_mixer;
+ 	spec->num_mixers++;
+ 
++	store_pin_configs(codec);
+ 	return 1;
+ }
+ 
+@@ -11488,6 +11626,7 @@ static int patch_alc269(struct hda_codec *codec)
+ 
+ 	spec->adc_nids = alc269_adc_nids;
+ 	spec->num_adc_nids = ARRAY_SIZE(alc269_adc_nids);
++	spec->capsrc_nids = alc269_capsrc_nids;
+ 
+ 	codec->patch_ops = alc_patch_ops;
+ 	if (board_config == ALC269_AUTO)
+@@ -12431,6 +12570,7 @@ static int alc861_parse_auto_config(struct hda_codec *codec)
+ 	spec->mixers[spec->num_mixers] = alc861_capture_mixer;
+ 	spec->num_mixers++;
+ 
++	store_pin_configs(codec);
+ 	return 1;
+ }
+ 
+@@ -13542,6 +13682,7 @@ static int alc861vd_parse_auto_config(struct hda_codec *codec)
+ 	if (err < 0)
+ 		return err;
+ 
++	store_pin_configs(codec);
+ 	return 1;
+ }
+ 
+@@ -14789,6 +14930,8 @@ static int alc662_parse_auto_config(struct hda_codec *codec)
+ 
+ 	spec->mixers[spec->num_mixers] = alc662_capture_mixer;
+ 	spec->num_mixers++;
++
++	store_pin_configs(codec);
+ 	return 1;
+ }
+ 
+@@ -14846,6 +14989,9 @@ static int patch_alc662(struct hda_codec *codec)
+ 	if (codec->vendor_id == 0x10ec0663) {
+ 		spec->stream_name_analog = "ALC663 Analog";
+ 		spec->stream_name_digital = "ALC663 Digital";
++	} else if (codec->vendor_id == 0x10ec0272) {
++		spec->stream_name_analog = "ALC272 Analog";
++		spec->stream_name_digital = "ALC272 Digital";
+ 	} else {
+ 		spec->stream_name_analog = "ALC662 Analog";
+ 		spec->stream_name_digital = "ALC662 Digital";
+@@ -14883,6 +15029,7 @@ struct hda_codec_preset snd_hda_preset_realtek[] = {
+ 	{ .id = 0x10ec0267, .name = "ALC267", .patch = patch_alc268 },
+ 	{ .id = 0x10ec0268, .name = "ALC268", .patch = patch_alc268 },
+ 	{ .id = 0x10ec0269, .name = "ALC269", .patch = patch_alc269 },
++	{ .id = 0x10ec0272, .name = "ALC272", .patch = patch_alc662 },
+ 	{ .id = 0x10ec0861, .rev = 0x100340, .name = "ALC660",
+ 	  .patch = patch_alc861 },
+ 	{ .id = 0x10ec0660, .name = "ALC660-VD", .patch = patch_alc861vd },
+@@ -14896,9 +15043,12 @@ struct hda_codec_preset snd_hda_preset_realtek[] = {
+ 	{ .id = 0x10ec0880, .name = "ALC880", .patch = patch_alc880 },
+ 	{ .id = 0x10ec0882, .name = "ALC882", .patch = patch_alc882 },
+ 	{ .id = 0x10ec0883, .name = "ALC883", .patch = patch_alc883 },
++	{ .id = 0x10ec0885, .rev = 0x100101, .name = "ALC889A",
++	  .patch = patch_alc882 }, /* should be patch_alc883() in future */
+ 	{ .id = 0x10ec0885, .rev = 0x100103, .name = "ALC889A",
+ 	  .patch = patch_alc882 }, /* should be patch_alc883() in future */
+ 	{ .id = 0x10ec0885, .name = "ALC885", .patch = patch_alc882 },
++	{ .id = 0x10ec0887, .name = "ALC887", .patch = patch_alc883 },
+ 	{ .id = 0x10ec0888, .name = "ALC888", .patch = patch_alc883 },
+ 	{ .id = 0x10ec0889, .name = "ALC889", .patch = patch_alc883 },
+ 	{} /* terminator */
+diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c
+index 732ce13..1d96aed 100644
+--- a/sound/pci/hda/patch_sigmatel.c
++++ b/sound/pci/hda/patch_sigmatel.c
+@@ -105,6 +105,7 @@ enum {
+ 	STAC_MACBOOK_PRO_V2,
+ 	STAC_IMAC_INTEL,
+ 	STAC_IMAC_INTEL_20,
++	STAC_ECS_202,
+ 	STAC_922X_DELL_D81,
+ 	STAC_922X_DELL_D82,
+ 	STAC_922X_DELL_M81,
+@@ -547,8 +548,8 @@ static struct hda_verb dell_eq_core_init[] = {
+ 	{ 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xec},
+ 	/* setup audio connections */
+ 	{ 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00},
+-	{ 0x0a, AC_VERB_SET_CONNECT_SEL, 0x01},
+-	{ 0x0f, AC_VERB_SET_CONNECT_SEL, 0x02},
++	{ 0x0a, AC_VERB_SET_CONNECT_SEL, 0x02},
++	{ 0x0f, AC_VERB_SET_CONNECT_SEL, 0x01},
+ 	/* setup adcs to point to mixer */
+ 	{ 0x20, AC_VERB_SET_CONNECT_SEL, 0x0b},
+ 	{ 0x21, AC_VERB_SET_CONNECT_SEL, 0x0b},
+@@ -1310,7 +1311,7 @@ static struct snd_pci_quirk stac92hd73xx_cfg_tbl[] = {
+ 	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
+ 				"DFI LanParty", STAC_92HD73XX_REF),
+ 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0254,
+-				"unknown Dell", STAC_DELL_M6),
++				"Dell Studio 1535", STAC_DELL_M6),
+ 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0255,
+ 				"unknown Dell", STAC_DELL_M6),
+ 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0256,
+@@ -1323,6 +1324,8 @@ static struct snd_pci_quirk stac92hd73xx_cfg_tbl[] = {
+ 				"unknown Dell", STAC_DELL_M6),
+ 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0271,
+ 				"unknown Dell", STAC_DELL_M6),
++	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x029f,
++				"Dell Studio 15", STAC_DELL_M6),
+ 	{} /* terminator */
+ };
+ 
+@@ -1478,6 +1481,11 @@ static unsigned int intel_mac_v5_pin_configs[10] = {
+ 	0x400000fc, 0x400000fb,
+ };
+ 
++static unsigned int ecs202_pin_configs[10] = {
++	0x0221401f, 0x02a19020, 0x01a19020, 0x01114010,
++	0x408000f0, 0x01813022, 0x074510a0, 0x40c400f1,
++	0x9037012e, 0x40e000f2,
++};
+ 
+ static unsigned int *stac922x_brd_tbl[STAC_922X_MODELS] = {
+ 	[STAC_D945_REF] = ref922x_pin_configs,
+@@ -1496,6 +1504,7 @@ static unsigned int *stac922x_brd_tbl[STAC_922X_MODELS] = {
+ 	[STAC_MACBOOK_PRO_V2] = intel_mac_v3_pin_configs,
+ 	[STAC_IMAC_INTEL] = intel_mac_v2_pin_configs,
+ 	[STAC_IMAC_INTEL_20] = intel_mac_v3_pin_configs,
++	[STAC_ECS_202] = ecs202_pin_configs,
+ 	[STAC_922X_DELL_D81] = dell_922x_d81_pin_configs,
+ 	[STAC_922X_DELL_D82] = dell_922x_d82_pin_configs,	
+ 	[STAC_922X_DELL_M81] = dell_922x_m81_pin_configs,
+@@ -1519,6 +1528,7 @@ static const char *stac922x_models[STAC_922X_MODELS] = {
+ 	[STAC_MACBOOK_PRO_V2]	= "macbook-pro",
+ 	[STAC_IMAC_INTEL] = "imac-intel",
+ 	[STAC_IMAC_INTEL_20] = "imac-intel-20",
++	[STAC_ECS_202] = "ecs202",
+ 	[STAC_922X_DELL_D81] = "dell-d81",
+ 	[STAC_922X_DELL_D82] = "dell-d82",
+ 	[STAC_922X_DELL_M81] = "dell-m81",
+@@ -1605,6 +1615,33 @@ static struct snd_pci_quirk stac922x_cfg_tbl[] = {
+ 		      "unknown Dell", STAC_922X_DELL_D81),
+ 	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d7,
+ 		      "Dell XPS M1210", STAC_922X_DELL_M82),
++	/* ECS/PC Chips boards */
++	SND_PCI_QUIRK(0x1019, 0x2144,
++		      "ECS/PC chips", STAC_ECS_202),
++	SND_PCI_QUIRK(0x1019, 0x2608,
++		      "ECS/PC chips", STAC_ECS_202),
++	SND_PCI_QUIRK(0x1019, 0x2633,
++		      "ECS/PC chips P17G/1333", STAC_ECS_202),
++	SND_PCI_QUIRK(0x1019, 0x2811,
++		      "ECS/PC chips", STAC_ECS_202),
++	SND_PCI_QUIRK(0x1019, 0x2812,
++		      "ECS/PC chips", STAC_ECS_202),
++	SND_PCI_QUIRK(0x1019, 0x2813,
++		      "ECS/PC chips", STAC_ECS_202),
++	SND_PCI_QUIRK(0x1019, 0x2814,
++		      "ECS/PC chips", STAC_ECS_202),
++	SND_PCI_QUIRK(0x1019, 0x2815,
++		      "ECS/PC chips", STAC_ECS_202),
++	SND_PCI_QUIRK(0x1019, 0x2816,
++		      "ECS/PC chips", STAC_ECS_202),
++	SND_PCI_QUIRK(0x1019, 0x2817,
++		      "ECS/PC chips", STAC_ECS_202),
++	SND_PCI_QUIRK(0x1019, 0x2818,
++		      "ECS/PC chips", STAC_ECS_202),
++	SND_PCI_QUIRK(0x1019, 0x2819,
++		      "ECS/PC chips", STAC_ECS_202),
++	SND_PCI_QUIRK(0x1019, 0x2820,
++		      "ECS/PC chips", STAC_ECS_202),
+ 	{} /* terminator */
+ };
+ 
+@@ -2468,7 +2505,7 @@ static int stac92xx_auto_create_multi_out_ctls(struct hda_codec *codec,
+ 		}
+ 	}
+ 
+-	if (cfg->hp_outs > 1) {
++	if (cfg->hp_outs > 1 && cfg->line_out_type == AUTO_PIN_LINE_OUT) {
+ 		err = stac92xx_add_control(spec,
+ 			STAC_CTL_WIDGET_HP_SWITCH,
+ 			"Headphone as Line Out Switch", 0);

Modified: dists/trunk/linux-2.6/debian/patches/series/1~experimental.1
==============================================================================
--- dists/trunk/linux-2.6/debian/patches/series/1~experimental.1	(original)
+++ dists/trunk/linux-2.6/debian/patches/series/1~experimental.1	Mon Dec 15 09:53:45 2008
@@ -33,3 +33,4 @@
 + bugfix/all/stable/patch-2.6.27.6
 + bugfix/all/stable/patch-2.6.27.7
 + bugfix/all/stable/patch-2.6.27.8
++ bugfix/all/stable/patch-2.6.27.9



More information about the Kernel-svn-changes mailing list