rpms/kernel/devel git-linus.diff, 1.9, 1.10 kernel.spec, 1.973, 1.974 linux-2.6-usb-fix-hcd-interrupt-disabling.patch, 1.1, NONE

Dave Jones davej at fedoraproject.org
Wed Sep 24 00:54:45 UTC 2008


Author: davej

Update of /cvs/pkgs/rpms/kernel/devel
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv23933

Modified Files:
	git-linus.diff kernel.spec 
Removed Files:
	linux-2.6-usb-fix-hcd-interrupt-disabling.patch 
Log Message:
Merge Linux-2.6 up to commit fb478da5ba69ecf40729ae8ab37ca406b1e5be48

git-linus.diff:

Index: git-linus.diff
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/devel/git-linus.diff,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- git-linus.diff	27 Aug 2008 00:40:32 -0000	1.9
+++ git-linus.diff	24 Sep 2008 00:54:42 -0000	1.10
@@ -0,0 +1,1757 @@
+diff --git a/Documentation/DMA-mapping.txt b/Documentation/DMA-mapping.txt
+index b463ecd..c74fec8 100644
+--- a/Documentation/DMA-mapping.txt
++++ b/Documentation/DMA-mapping.txt
+@@ -740,7 +740,7 @@ failure can be determined by:
+ 	dma_addr_t dma_handle;
+ 
+ 	dma_handle = pci_map_single(pdev, addr, size, direction);
+-	if (pci_dma_mapping_error(dma_handle)) {
++	if (pci_dma_mapping_error(pdev, dma_handle)) {
+ 		/*
+ 		 * reduce current DMA mapping usage,
+ 		 * delay and try again later or
+diff --git a/Documentation/sysctl/kernel.txt b/Documentation/sysctl/kernel.txt
+index 276a7e6..e1ff0d9 100644
+--- a/Documentation/sysctl/kernel.txt
++++ b/Documentation/sysctl/kernel.txt
+@@ -351,9 +351,10 @@ kernel.  This value defaults to SHMMAX.
+ 
+ softlockup_thresh:
+ 
+-This value can be used to lower the softlockup tolerance
+-threshold. The default threshold is 10s.  If a cpu is locked up
+-for 10s, the kernel complains.  Valid values are 1-60s.
++This value can be used to lower the softlockup tolerance threshold.  The
++default threshold is 60 seconds.  If a cpu is locked up for 60 seconds,
++the kernel complains.  Valid values are 1-60 seconds.  Setting this
++tunable to zero will disable the softlockup detection altogether.
+ 
+ ==============================================================
+ 
+diff --git a/Documentation/usb/anchors.txt b/Documentation/usb/anchors.txt
+index 7304bcf..5e6b64c 100644
+--- a/Documentation/usb/anchors.txt
++++ b/Documentation/usb/anchors.txt
+@@ -42,9 +42,21 @@ This function kills all URBs associated with an anchor. The URBs
+ are called in the reverse temporal order they were submitted.
+ This way no data can be reordered.
+ 
++usb_unlink_anchored_urbs()
++--------------------------
++
++This function unlinks all URBs associated with an anchor. The URBs
++are processed in the reverse temporal order they were submitted.
++This is similar to usb_kill_anchored_urbs(), but it will not sleep.
++Therefore no guarantee is made that the URBs have been unlinked when
++the call returns. They may be unlinked later but will be unlinked in
++finite time.
++
+ usb_wait_anchor_empty_timeout()
+ -------------------------------
+ 
+ This function waits for all URBs associated with an anchor to finish
+ or a timeout, whichever comes first. Its return value will tell you
+ whether the timeout was reached.
++
++
+diff --git a/MAINTAINERS b/MAINTAINERS
+index cad81a2..42ebbfd 100644
+--- a/MAINTAINERS
++++ b/MAINTAINERS
+@@ -3833,11 +3833,12 @@ S:	Maintained
+ 
+ SOUND - SOC LAYER / DYNAMIC AUDIO POWER MANAGEMENT
+ P:	Liam Girdwood
+-M:	liam.girdwood at wolfsonmicro.com
++M:	lrg at slimlogic.co.uk
+ P:	Mark Brown
+ M:	broonie at opensource.wolfsonmicro.com
+ T:	git opensource.wolfsonmicro.com/linux-2.6-asoc
+ L:	alsa-devel at alsa-project.org (subscribers-only)
++W:	http://alsa-project.org/main/index.php/ASoC
+ S:	Supported
+ 
+ SPI SUBSYSTEM
+diff --git a/arch/ia64/kernel/efi.c b/arch/ia64/kernel/efi.c
+index d45f215..51b75ce 100644
+--- a/arch/ia64/kernel/efi.c
++++ b/arch/ia64/kernel/efi.c
+@@ -1232,9 +1232,10 @@ efi_initialize_iomem_resources(struct resource *code_resource,
+ 				if (md->attribute & EFI_MEMORY_WP) {
+ 					name = "System ROM";
+ 					flags |= IORESOURCE_READONLY;
+-				} else {
++				} else if (md->attribute == EFI_MEMORY_UC)
++					name = "Uncached RAM";
++				else
+ 					name = "System RAM";
+-				}
+ 				break;
+ 
+ 			case EFI_ACPI_MEMORY_NVS:
+diff --git a/arch/ia64/kernel/setup.c b/arch/ia64/kernel/setup.c
+index c27d5b2..de636b2 100644
+--- a/arch/ia64/kernel/setup.c
++++ b/arch/ia64/kernel/setup.c
+@@ -616,7 +616,9 @@ setup_arch (char **cmdline_p)
+ 		ia64_mca_init();
+ 
+ 	platform_setup(cmdline_p);
++#ifndef CONFIG_IA64_HP_SIM
+ 	check_sal_cache_flush();
++#endif
+ 	paging_init();
+ }
+ 
+diff --git a/arch/sparc64/kernel/of_device.c b/arch/sparc64/kernel/of_device.c
+index f845f15..100ebd5 100644
+--- a/arch/sparc64/kernel/of_device.c
++++ b/arch/sparc64/kernel/of_device.c
+@@ -169,7 +169,7 @@ static unsigned long of_bus_default_get_flags(const u32 *addr, unsigned long fla
+ 
+ static int of_bus_pci_match(struct device_node *np)
+ {
+-	if (!strcmp(np->type, "pci") || !strcmp(np->type, "pciex")) {
++	if (!strcmp(np->name, "pci")) {
+ 		const char *model = of_get_property(np, "model", NULL);
+ 
+ 		if (model && !strcmp(model, "SUNW,simba"))
+@@ -200,7 +200,7 @@ static int of_bus_simba_match(struct device_node *np)
+ 	/* Treat PCI busses lacking ranges property just like
+ 	 * simba.
+ 	 */
+-	if (!strcmp(np->type, "pci") || !strcmp(np->type, "pciex")) {
++	if (!strcmp(np->name, "pci")) {
+ 		if (!of_find_property(np, "ranges", NULL))
+ 			return 1;
+ 	}
+@@ -429,7 +429,7 @@ static int __init use_1to1_mapping(struct device_node *pp)
+ 	 * it lacks a ranges property, and this will include
+ 	 * cases like Simba.
+ 	 */
+-	if (!strcmp(pp->type, "pci") || !strcmp(pp->type, "pciex"))
++	if (!strcmp(pp->name, "pci"))
+ 		return 0;
+ 
+ 	return 1;
+@@ -714,8 +714,7 @@ static unsigned int __init build_one_device_irq(struct of_device *op,
+ 				break;
+ 			}
+ 		} else {
+-			if (!strcmp(pp->type, "pci") ||
+-			    !strcmp(pp->type, "pciex")) {
++			if (!strcmp(pp->name, "pci")) {
+ 				unsigned int this_orig_irq = irq;
+ 
+ 				irq = pci_irq_swizzle(dp, pp, irq);
+diff --git a/arch/sparc64/kernel/pci.c b/arch/sparc64/kernel/pci.c
+index 5509619..80dad76 100644
+--- a/arch/sparc64/kernel/pci.c
++++ b/arch/sparc64/kernel/pci.c
+@@ -425,7 +425,7 @@ struct pci_dev *of_create_pci_dev(struct pci_pbm_info *pbm,
+ 	dev->current_state = 4;		/* unknown power state */
+ 	dev->error_state = pci_channel_io_normal;
+ 
+-	if (!strcmp(type, "pci") || !strcmp(type, "pciex")) {
++	if (!strcmp(node->name, "pci")) {
+ 		/* a PCI-PCI bridge */
+ 		dev->hdr_type = PCI_HEADER_TYPE_BRIDGE;
+ 		dev->rom_base_reg = PCI_ROM_ADDRESS1;
+diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c
+index 69b4d06..042fdc2 100644
+--- a/arch/x86/kernel/amd_iommu.c
++++ b/arch/x86/kernel/amd_iommu.c
+@@ -101,10 +101,10 @@ static int iommu_queue_command(struct amd_iommu *iommu, struct iommu_cmd *cmd)
+  */
+ static int iommu_completion_wait(struct amd_iommu *iommu)
+ {
+-	int ret, ready = 0;
++	int ret = 0, ready = 0;
+ 	unsigned status = 0;
+ 	struct iommu_cmd cmd;
+-	unsigned long i = 0;
++	unsigned long flags, i = 0;
+ 
+ 	memset(&cmd, 0, sizeof(cmd));
+ 	cmd.data[0] = CMD_COMPL_WAIT_INT_MASK;
+@@ -112,10 +112,12 @@ static int iommu_completion_wait(struct amd_iommu *iommu)
+ 
+ 	iommu->need_sync = 0;
+ 
+-	ret = iommu_queue_command(iommu, &cmd);
++	spin_lock_irqsave(&iommu->lock, flags);
++
++	ret = __iommu_queue_command(iommu, &cmd);
+ 
+ 	if (ret)
+-		return ret;
++		goto out;
+ 
+ 	while (!ready && (i < EXIT_LOOP_COUNT)) {
+ 		++i;
+@@ -130,6 +132,8 @@ static int iommu_completion_wait(struct amd_iommu *iommu)
+ 
+ 	if (unlikely((i == EXIT_LOOP_COUNT) && printk_ratelimit()))
+ 		printk(KERN_WARNING "AMD IOMMU: Completion wait loop failed\n");
++out:
++	spin_unlock_irqrestore(&iommu->lock, flags);
+ 
+ 	return 0;
+ }
+@@ -140,6 +144,7 @@ static int iommu_completion_wait(struct amd_iommu *iommu)
+ static int iommu_queue_inv_dev_entry(struct amd_iommu *iommu, u16 devid)
+ {
+ 	struct iommu_cmd cmd;
++	int ret;
+ 
+ 	BUG_ON(iommu == NULL);
+ 
+@@ -147,9 +152,11 @@ static int iommu_queue_inv_dev_entry(struct amd_iommu *iommu, u16 devid)
+ 	CMD_SET_TYPE(&cmd, CMD_INV_DEV_ENTRY);
+ 	cmd.data[0] = devid;
+ 
++	ret = iommu_queue_command(iommu, &cmd);
++
+ 	iommu->need_sync = 1;
+ 
+-	return iommu_queue_command(iommu, &cmd);
++	return ret;
+ }
+ 
+ /*
+@@ -159,6 +166,7 @@ static int iommu_queue_inv_iommu_pages(struct amd_iommu *iommu,
+ 		u64 address, u16 domid, int pde, int s)
+ {
+ 	struct iommu_cmd cmd;
++	int ret;
+ 
+ 	memset(&cmd, 0, sizeof(cmd));
+ 	address &= PAGE_MASK;
+@@ -171,9 +179,11 @@ static int iommu_queue_inv_iommu_pages(struct amd_iommu *iommu,
+ 	if (pde) /* PDE bit - we wan't flush everything not only the PTEs */
+ 		cmd.data[2] |= CMD_INV_IOMMU_PAGES_PDE_MASK;
+ 
++	ret = iommu_queue_command(iommu, &cmd);
++
+ 	iommu->need_sync = 1;
+ 
+-	return iommu_queue_command(iommu, &cmd);
++	return ret;
+ }
+ 
+ /*
+diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c
+index 7fc4d5b..876e918 100644
+--- a/arch/x86/kernel/process.c
++++ b/arch/x86/kernel/process.c
+@@ -246,6 +246,14 @@ static int __cpuinit check_c1e_idle(const struct cpuinfo_x86 *c)
+ 	return 1;
+ }
+ 
++static cpumask_t c1e_mask = CPU_MASK_NONE;
++static int c1e_detected;
++
++void c1e_remove_cpu(int cpu)
++{
++	cpu_clear(cpu, c1e_mask);
++}
++
+ /*
+  * C1E aware idle routine. We check for C1E active in the interrupt
+  * pending message MSR. If we detect C1E, then we handle it the same
+@@ -253,9 +261,6 @@ static int __cpuinit check_c1e_idle(const struct cpuinfo_x86 *c)
+  */
+ static void c1e_idle(void)
+ {
+-	static cpumask_t c1e_mask = CPU_MASK_NONE;
+-	static int c1e_detected;
+-
+ 	if (need_resched())
+ 		return;
+ 
+@@ -265,8 +270,10 @@ static void c1e_idle(void)
+ 		rdmsr(MSR_K8_INT_PENDING_MSG, lo, hi);
+ 		if (lo & K8_INTP_C1E_ACTIVE_MASK) {
+ 			c1e_detected = 1;
+-			mark_tsc_unstable("TSC halt in C1E");
+-			printk(KERN_INFO "System has C1E enabled\n");
++			if (!boot_cpu_has(X86_FEATURE_CONSTANT_TSC))
++				mark_tsc_unstable("TSC halt in AMD C1E");
++			printk(KERN_INFO "System has AMD C1E enabled\n");
++			set_cpu_cap(&boot_cpu_data, X86_FEATURE_AMDC1E);
+ 		}
+ 	}
+ 
+diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c
+index 3b7a1dd..4b3cfdf 100644
+--- a/arch/x86/kernel/process_32.c
++++ b/arch/x86/kernel/process_32.c
+@@ -88,6 +88,7 @@ static void cpu_exit_clear(void)
+ 	cpu_clear(cpu, cpu_callin_map);
+ 
+ 	numa_remove_cpu(cpu);
++	c1e_remove_cpu(cpu);
+ }
+ 
+ /* We don't actually take CPU down, just spin without interrupts. */
+diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c
+index 71553b6..e12e0e4 100644
+--- a/arch/x86/kernel/process_64.c
++++ b/arch/x86/kernel/process_64.c
+@@ -93,6 +93,8 @@ DECLARE_PER_CPU(int, cpu_state);
+ static inline void play_dead(void)
+ {
+ 	idle_task_exit();
++	c1e_remove_cpu(raw_smp_processor_id());
++
+ 	mb();
+ 	/* Ack it */
+ 	__get_cpu_var(cpu_state) = CPU_DEAD;
+diff --git a/arch/x86/kernel/vsmp_64.c b/arch/x86/kernel/vsmp_64.c
+index 0c029e8..7766d36 100644
+--- a/arch/x86/kernel/vsmp_64.c
++++ b/arch/x86/kernel/vsmp_64.c
+@@ -61,7 +61,7 @@ static void vsmp_irq_enable(void)
+ 	native_restore_fl((flags | X86_EFLAGS_IF) & (~X86_EFLAGS_AC));
+ }
+ 
+-static unsigned __init vsmp_patch(u8 type, u16 clobbers, void *ibuf,
++static unsigned __init_or_module vsmp_patch(u8 type, u16 clobbers, void *ibuf,
+ 				  unsigned long addr, unsigned len)
+ {
+ 	switch (type) {
+diff --git a/arch/x86/oprofile/nmi_int.c b/arch/x86/oprofile/nmi_int.c
+index 0227694..8a5f161 100644
+--- a/arch/x86/oprofile/nmi_int.c
++++ b/arch/x86/oprofile/nmi_int.c
+@@ -295,10 +295,12 @@ static void nmi_cpu_shutdown(void *dummy)
+ 
+ static void nmi_shutdown(void)
+ {
+-	struct op_msrs *msrs = &get_cpu_var(cpu_msrs);
++	struct op_msrs *msrs;
++
+ 	nmi_enabled = 0;
+ 	on_each_cpu(nmi_cpu_shutdown, NULL, 1);
+ 	unregister_die_notifier(&profile_exceptions_nb);
++	msrs = &get_cpu_var(cpu_msrs);
+ 	model->shutdown(msrs);
+ 	free_msrs();
+ 	put_cpu_var(cpu_msrs);
+diff --git a/drivers/net/wireless/ath9k/core.c b/drivers/net/wireless/ath9k/core.c
+index f6c4528..c049593 100644
+--- a/drivers/net/wireless/ath9k/core.c
++++ b/drivers/net/wireless/ath9k/core.c
+@@ -294,8 +294,6 @@ static int ath_stop(struct ath_softc *sc)
+ 	 * hardware is gone (invalid).
+ 	 */
+ 
+-	if (!sc->sc_invalid)
+-		ath9k_hw_set_interrupts(ah, 0);
+ 	ath_draintxq(sc, false);
+ 	if (!sc->sc_invalid) {
+ 		ath_stoprecv(sc);
+@@ -1336,6 +1334,8 @@ void ath_deinit(struct ath_softc *sc)
+ 
+ 	DPRINTF(sc, ATH_DBG_CONFIG, "%s\n", __func__);
+ 
++	tasklet_kill(&sc->intr_tq);
++	tasklet_kill(&sc->bcon_tasklet);
+ 	ath_stop(sc);
+ 	if (!sc->sc_invalid)
+ 		ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_AWAKE);
+diff --git a/drivers/net/wireless/ath9k/core.h b/drivers/net/wireless/ath9k/core.h
+index 4ee695b..2f84093 100644
+--- a/drivers/net/wireless/ath9k/core.h
++++ b/drivers/net/wireless/ath9k/core.h
+@@ -974,7 +974,6 @@ struct ath_softc {
+ 	u32 sc_keymax;		/* size of key cache */
+ 	DECLARE_BITMAP(sc_keymap, ATH_KEYMAX);	/* key use bit map */
+ 	u8 sc_splitmic;		/* split TKIP MIC keys */
+-	int sc_keytype;
+ 
+ 	/* RX */
+ 	struct list_head sc_rxbuf;
+diff --git a/drivers/net/wireless/ath9k/main.c b/drivers/net/wireless/ath9k/main.c
+index 99badf1..acebdf1 100644
+--- a/drivers/net/wireless/ath9k/main.c
++++ b/drivers/net/wireless/ath9k/main.c
+@@ -206,8 +206,6 @@ static int ath_key_config(struct ath_softc *sc,
+ 	if (!ret)
+ 		return -EIO;
+ 
+-	if (mac)
+-		sc->sc_keytype = hk.kv_type;
+ 	return 0;
+ }
+ 
+@@ -778,7 +776,6 @@ static int ath9k_set_key(struct ieee80211_hw *hw,
+ 	case DISABLE_KEY:
+ 		ath_key_delete(sc, key);
+ 		clear_bit(key->keyidx, sc->sc_keymap);
+-		sc->sc_keytype = ATH9K_CIPHER_CLR;
+ 		break;
+ 	default:
+ 		ret = -EINVAL;
+@@ -1414,10 +1411,17 @@ static void ath_pci_remove(struct pci_dev *pdev)
+ {
+ 	struct ieee80211_hw *hw = pci_get_drvdata(pdev);
+ 	struct ath_softc *sc = hw->priv;
++	enum ath9k_int status;
+ 
+-	if (pdev->irq)
++	if (pdev->irq) {
++		ath9k_hw_set_interrupts(sc->sc_ah, 0);
++		/* clear the ISR */
++		ath9k_hw_getisr(sc->sc_ah, &status);
++		sc->sc_invalid = 1;
+ 		free_irq(pdev->irq, sc);
++	}
+ 	ath_detach(sc);
++
+ 	pci_iounmap(pdev, sc->mem);
+ 	pci_release_region(pdev, 0);
+ 	pci_disable_device(pdev);
+diff --git a/drivers/net/wireless/ath9k/xmit.c b/drivers/net/wireless/ath9k/xmit.c
+index 550129f..8b332e1 100644
+--- a/drivers/net/wireless/ath9k/xmit.c
++++ b/drivers/net/wireless/ath9k/xmit.c
+@@ -315,11 +315,11 @@ static int ath_tx_prepare(struct ath_softc *sc,
+ 		txctl->keyix = tx_info->control.hw_key->hw_key_idx;
+ 		txctl->frmlen += tx_info->control.icv_len;
+ 
+-		if (sc->sc_keytype == ATH9K_CIPHER_WEP)
++		if (tx_info->control.hw_key->alg == ALG_WEP)
+ 			txctl->keytype = ATH9K_KEY_TYPE_WEP;
+-		else if (sc->sc_keytype == ATH9K_CIPHER_TKIP)
++		else if (tx_info->control.hw_key->alg == ALG_TKIP)
+ 			txctl->keytype = ATH9K_KEY_TYPE_TKIP;
+-		else if (sc->sc_keytype == ATH9K_CIPHER_AES_CCM)
++		else if (tx_info->control.hw_key->alg == ALG_CCMP)
+ 			txctl->keytype = ATH9K_KEY_TYPE_AES;
+ 	}
+ 
+diff --git a/drivers/net/wireless/zd1211rw/zd_usb.c b/drivers/net/wireless/zd1211rw/zd_usb.c
+index da8b743..a60ae86 100644
+--- a/drivers/net/wireless/zd1211rw/zd_usb.c
++++ b/drivers/net/wireless/zd1211rw/zd_usb.c
+@@ -58,6 +58,7 @@ static struct usb_device_id usb_ids[] = {
+ 	{ USB_DEVICE(0x0586, 0x3407), .driver_info = DEVICE_ZD1211 },
+ 	{ USB_DEVICE(0x129b, 0x1666), .driver_info = DEVICE_ZD1211 },
+ 	{ USB_DEVICE(0x157e, 0x300a), .driver_info = DEVICE_ZD1211 },
++	{ USB_DEVICE(0x0105, 0x145f), .driver_info = DEVICE_ZD1211 },
+ 	/* ZD1211B */
+ 	{ USB_DEVICE(0x0ace, 0x1215), .driver_info = DEVICE_ZD1211B },
+ 	{ USB_DEVICE(0x157e, 0x300d), .driver_info = DEVICE_ZD1211B },
+diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c
+index 9a7c9e1..851f5b8 100644
+--- a/drivers/pci/pcie/aspm.c
++++ b/drivers/pci/pcie/aspm.c
+@@ -527,7 +527,7 @@ static int pcie_aspm_sanity_check(struct pci_dev *pdev)
+ 		 */
+ 		pci_read_config_dword(child_dev, child_pos + PCI_EXP_DEVCAP,
+ 			&reg32);
+-		if (!(reg32 & PCI_EXP_DEVCAP_RBER && !aspm_force)) {
++		if (!(reg32 & PCI_EXP_DEVCAP_RBER) && !aspm_force) {
+ 			printk("Pre-1.1 PCIe device detected, "
+ 				"disable ASPM for %s. It can be enabled forcedly"
+ 				" with 'pcie_aspm=force'\n", pci_name(pdev));
+diff --git a/drivers/pci/search.c b/drivers/pci/search.c
+index 3b3b5f1..4edfc47 100644
+--- a/drivers/pci/search.c
++++ b/drivers/pci/search.c
+@@ -162,7 +162,7 @@ EXPORT_SYMBOL(pci_find_slot);
+  * time.
+  */
+ struct pci_dev *pci_find_device(unsigned int vendor, unsigned int device,
+-				const struct pci_dev *from)
++				struct pci_dev *from)
+ {
+ 	struct pci_dev *pdev;
+ 
+@@ -263,7 +263,7 @@ static int match_pci_dev_by_id(struct device *dev, void *data)
+  * this file.
+  */
+ static struct pci_dev *pci_get_dev_by_id(const struct pci_device_id *id,
+-					 const struct pci_dev *from)
++					 struct pci_dev *from)
+ {
+ 	struct device *dev;
+ 	struct device *dev_start = NULL;
+@@ -303,7 +303,7 @@ static struct pci_dev *pci_get_dev_by_id(const struct pci_device_id *id,
+  */
+ struct pci_dev *pci_get_subsys(unsigned int vendor, unsigned int device,
+ 			       unsigned int ss_vendor, unsigned int ss_device,
+-			       const struct pci_dev *from)
++			       struct pci_dev *from)
+ {
+ 	struct pci_dev *pdev;
+ 	struct pci_device_id *id;
+diff --git a/drivers/serial/atmel_serial.c b/drivers/serial/atmel_serial.c
+index 3a6da80..61fb8b6 100644
+--- a/drivers/serial/atmel_serial.c
++++ b/drivers/serial/atmel_serial.c
+@@ -131,7 +131,8 @@ struct atmel_uart_char {
+ struct atmel_uart_port {
+ 	struct uart_port	uart;		/* uart */
+ 	struct clk		*clk;		/* uart clock */
+-	unsigned short		suspended;	/* is port suspended? */
++	int			may_wakeup;	/* cached value of device_may_wakeup for times we need to disable it */
++	u32			backup_imr;	/* IMR saved during suspend */
+ 	int			break_active;	/* break being received */
+ 
+ 	short			use_dma_rx;	/* enable PDC receiver */
+@@ -984,8 +985,15 @@ static void atmel_serial_pm(struct uart_port *port, unsigned int state,
+ 		 * This is called on uart_open() or a resume event.
+ 		 */
+ 		clk_enable(atmel_port->clk);
++
++		/* re-enable interrupts if we disabled some on suspend */
++		UART_PUT_IER(port, atmel_port->backup_imr);
+ 		break;
+ 	case 3:
++		/* Back up the interrupt mask and disable all interrupts */
++		atmel_port->backup_imr = UART_GET_IMR(port);
++		UART_PUT_IDR(port, -1);
++
+ 		/*
+ 		 * Disable the peripheral clock for this serial port.
+ 		 * This is called on uart_close() or a suspend event.
+@@ -1475,13 +1483,12 @@ static int atmel_serial_suspend(struct platform_device *pdev,
+ 			cpu_relax();
+ 	}
+ 
+-	if (device_may_wakeup(&pdev->dev)
+-	    && !atmel_serial_clk_will_stop())
+-		enable_irq_wake(port->irq);
+-	else {
+-		uart_suspend_port(&atmel_uart, port);
+-		atmel_port->suspended = 1;
+-	}
++	/* we can not wake up if we're running on slow clock */
++	atmel_port->may_wakeup = device_may_wakeup(&pdev->dev);
++	if (atmel_serial_clk_will_stop())
++		device_set_wakeup_enable(&pdev->dev, 0);
++
++	uart_suspend_port(&atmel_uart, port);
+ 
+ 	return 0;
+ }
+@@ -1491,11 +1498,8 @@ static int atmel_serial_resume(struct platform_device *pdev)
+ 	struct uart_port *port = platform_get_drvdata(pdev);
+ 	struct atmel_uart_port *atmel_port = to_atmel_uart_port(port);
+ 
+-	if (atmel_port->suspended) {
+-		uart_resume_port(&atmel_uart, port);
+-		atmel_port->suspended = 0;
+-	} else
+-		disable_irq_wake(port->irq);
++	uart_resume_port(&atmel_uart, port);
++	device_set_wakeup_enable(&pdev->dev, atmel_port->may_wakeup);
+ 
+ 	return 0;
+ }
+@@ -1513,6 +1517,8 @@ static int __devinit atmel_serial_probe(struct platform_device *pdev)
+ 	BUILD_BUG_ON(!is_power_of_2(ATMEL_SERIAL_RINGSIZE));
+ 
+ 	port = &atmel_ports[pdev->id];
++	port->backup_imr = 0;
++
+ 	atmel_init_port(port, pdev);
+ 
+ 	if (!atmel_use_dma_rx(&port->uart)) {
+diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
+index 8abd4e5..8ab389d 100644
+--- a/drivers/usb/core/hcd.c
++++ b/drivers/usb/core/hcd.c
+@@ -1876,7 +1876,8 @@ int usb_add_hcd(struct usb_hcd *hcd,
+ 		 * with IRQF_SHARED. As usb_hcd_irq() will always disable
+ 		 * interrupts we can remove it here.
+ 		 */
+-		irqflags &= ~IRQF_DISABLED;
++		if (irqflags & IRQF_SHARED)
++			irqflags &= ~IRQF_DISABLED;
+ 
+ 		snprintf(hcd->irq_descr, sizeof(hcd->irq_descr), "%s:usb%d",
+ 				hcd->driver->description, hcd->self.busnum);
+diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
+index 6a5cb01..d999638 100644
+--- a/drivers/usb/core/hub.c
++++ b/drivers/usb/core/hub.c
+@@ -2683,35 +2683,17 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1,
+ 				USB_PORT_STAT_C_ENABLE);
+ #endif
+ 
+-	/* Try to use the debounce delay for protection against
+-	 * port-enable changes caused, for example, by EMI.
+-	 */
+-	if (portchange & (USB_PORT_STAT_C_CONNECTION |
+-				USB_PORT_STAT_C_ENABLE)) {
+-		status = hub_port_debounce(hub, port1);
+-		if (status < 0) {
+-			if (printk_ratelimit())
+-				dev_err (hub_dev, "connect-debounce failed, "
+-						"port %d disabled\n", port1);
+-			portstatus &= ~USB_PORT_STAT_CONNECTION;
+-		} else {
+-			portstatus = status;
+-		}
+-	}
+-
+ 	/* Try to resuscitate an existing device */
+ 	udev = hdev->children[port1-1];
+ 	if ((portstatus & USB_PORT_STAT_CONNECTION) && udev &&
+ 			udev->state != USB_STATE_NOTATTACHED) {
+-
+ 		usb_lock_device(udev);
+ 		if (portstatus & USB_PORT_STAT_ENABLE) {
+ 			status = 0;		/* Nothing to do */
+-		} else if (!udev->persist_enabled) {
+-			status = -ENODEV;	/* Mustn't resuscitate */
+ 
+ #ifdef CONFIG_USB_SUSPEND
+-		} else if (udev->state == USB_STATE_SUSPENDED) {
++		} else if (udev->state == USB_STATE_SUSPENDED &&
++				udev->persist_enabled) {
+ 			/* For a suspended device, treat this as a
+ 			 * remote wakeup event.
+ 			 */
+@@ -2726,7 +2708,7 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1,
+ #endif
+ 
+ 		} else {
+-			status = usb_reset_device(udev);
++			status = -ENODEV;	/* Don't resuscitate */
+ 		}
+ 		usb_unlock_device(udev);
+ 
+@@ -2741,6 +2723,19 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1,
+ 		usb_disconnect(&hdev->children[port1-1]);
+ 	clear_bit(port1, hub->change_bits);
+ 
++	if (portchange & (USB_PORT_STAT_C_CONNECTION |
++				USB_PORT_STAT_C_ENABLE)) {
++		status = hub_port_debounce(hub, port1);
++		if (status < 0) {
++			if (printk_ratelimit())
++				dev_err(hub_dev, "connect-debounce failed, "
++						"port %d disabled\n", port1);
++			portstatus &= ~USB_PORT_STAT_CONNECTION;
++		} else {
++			portstatus = status;
++		}
++	}
++
+ 	/* Return now if debouncing failed or nothing is connected */
+ 	if (!(portstatus & USB_PORT_STAT_CONNECTION)) {
+ 
+@@ -2748,7 +2743,7 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1,
+ 		if ((wHubCharacteristics & HUB_CHAR_LPSM) < 2
+ 				&& !(portstatus & (1 << USB_PORT_FEAT_POWER)))
+ 			set_port_feature(hdev, port1, USB_PORT_FEAT_POWER);
+- 
++
+ 		if (portstatus & USB_PORT_STAT_ENABLE)
+   			goto done;
+ 		return;
+diff --git a/drivers/usb/gadget/fsl_usb2_udc.c b/drivers/usb/gadget/fsl_usb2_udc.c
+index 1cfccf1..45ad556 100644
+--- a/drivers/usb/gadget/fsl_usb2_udc.c
++++ b/drivers/usb/gadget/fsl_usb2_udc.c
+@@ -223,7 +223,7 @@ static int dr_controller_setup(struct fsl_udc *udc)
+ 	fsl_writel(tmp, &dr_regs->endpointlistaddr);
+ 
+ 	VDBG("vir[qh_base] is %p phy[qh_base] is 0x%8x reg is 0x%8x",
+-		(int)udc->ep_qh, (int)tmp,
++		udc->ep_qh, (int)tmp,
+ 		fsl_readl(&dr_regs->endpointlistaddr));
+ 
+ 	/* Config PHY interface */
+diff --git a/drivers/usb/gadget/omap_udc.c b/drivers/usb/gadget/omap_udc.c
+index 574c538..bb54cca 100644
+--- a/drivers/usb/gadget/omap_udc.c
++++ b/drivers/usb/gadget/omap_udc.c
+@@ -787,7 +787,7 @@ static void dma_channel_claim(struct omap_ep *ep, unsigned channel)
+ 			omap_set_dma_dest_params(ep->lch,
+ 				OMAP_DMA_PORT_TIPB,
+ 				OMAP_DMA_AMODE_CONSTANT,
+-				(unsigned long) io_v2p(UDC_DATA_DMA),
++				UDC_DATA_DMA,
+ 				0, 0);
+ 		}
+ 	} else {
+@@ -804,7 +804,7 @@ static void dma_channel_claim(struct omap_ep *ep, unsigned channel)
+ 			omap_set_dma_src_params(ep->lch,
+ 				OMAP_DMA_PORT_TIPB,
+ 				OMAP_DMA_AMODE_CONSTANT,
+-				(unsigned long) io_v2p(UDC_DATA_DMA),
++				UDC_DATA_DMA,
+ 				0, 0);
+ 			/* EMIFF or SDRC */
+ 			omap_set_dma_dest_burst_mode(ep->lch,
+diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
+index d9d53f2..8409e07 100644
+--- a/drivers/usb/host/ehci-hcd.c
++++ b/drivers/usb/host/ehci-hcd.c
+@@ -145,16 +145,6 @@ static int handshake (struct ehci_hcd *ehci, void __iomem *ptr,
+ 	return -ETIMEDOUT;
+ }
+ 
+-static int handshake_on_error_set_halt(struct ehci_hcd *ehci, void __iomem *ptr,
+-				       u32 mask, u32 done, int usec)
+-{
+-	int error = handshake(ehci, ptr, mask, done, usec);
+-	if (error)
+-		ehci_to_hcd(ehci)->state = HC_STATE_HALT;
+-
+-	return error;
+-}
+-
+ /* force HC to halt state from unknown (EHCI spec section 2.3) */
+ static int ehci_halt (struct ehci_hcd *ehci)
+ {
+@@ -173,6 +163,22 @@ static int ehci_halt (struct ehci_hcd *ehci)
+ 			  STS_HALT, STS_HALT, 16 * 125);
+ }
+ 
++static int handshake_on_error_set_halt(struct ehci_hcd *ehci, void __iomem *ptr,
++				       u32 mask, u32 done, int usec)
++{
++	int error;
++
++	error = handshake(ehci, ptr, mask, done, usec);
++	if (error) {
++		ehci_halt(ehci);
++		ehci_to_hcd(ehci)->state = HC_STATE_HALT;
++		ehci_err(ehci, "force halt; handhake %p %08x %08x -> %d\n",
++			ptr, mask, done, error);
++	}
++
++	return error;
++}
++
+ /* put TDI/ARC silicon into EHCI mode */
+ static void tdi_reset (struct ehci_hcd *ehci)
+ {
+diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c
+index b7853c8..4a0c5a7 100644
+--- a/drivers/usb/host/ehci-sched.c
++++ b/drivers/usb/host/ehci-sched.c
+@@ -437,6 +437,9 @@ static int enable_periodic (struct ehci_hcd *ehci)
+ 	u32	cmd;
+ 	int	status;
+ 
++	if (ehci->periodic_sched++)
++		return 0;
++
+ 	/* did clearing PSE did take effect yet?
+ 	 * takes effect only at frame boundaries...
+ 	 */
+@@ -461,6 +464,9 @@ static int disable_periodic (struct ehci_hcd *ehci)
+ 	u32	cmd;
+ 	int	status;
+ 
++	if (--ehci->periodic_sched)
++		return 0;
++
+ 	/* did setting PSE not take effect yet?
+ 	 * takes effect only at frame boundaries...
+ 	 */
+@@ -544,13 +550,10 @@ static int qh_link_periodic (struct ehci_hcd *ehci, struct ehci_qh *qh)
+ 		: (qh->usecs * 8);
+ 
+ 	/* maybe enable periodic schedule processing */
+-	if (!ehci->periodic_sched++)
+-		return enable_periodic (ehci);
+-
+-	return 0;
++	return enable_periodic(ehci);
+ }
+ 
+-static void qh_unlink_periodic (struct ehci_hcd *ehci, struct ehci_qh *qh)
++static int qh_unlink_periodic(struct ehci_hcd *ehci, struct ehci_qh *qh)
+ {
+ 	unsigned	i;
+ 	unsigned	period;
+@@ -586,9 +589,7 @@ static void qh_unlink_periodic (struct ehci_hcd *ehci, struct ehci_qh *qh)
+ 	qh_put (qh);
+ 
+ 	/* maybe turn off periodic schedule */
+-	ehci->periodic_sched--;
+-	if (!ehci->periodic_sched)
+-		(void) disable_periodic (ehci);
++	return disable_periodic(ehci);
+ }
+ 
+ static void intr_deschedule (struct ehci_hcd *ehci, struct ehci_qh *qh)
+@@ -1562,9 +1563,7 @@ itd_link_urb (
+ 	urb->hcpriv = NULL;
+ 
+ 	timer_action (ehci, TIMER_IO_WATCHDOG);
+-	if (unlikely (!ehci->periodic_sched++))
+-		return enable_periodic (ehci);
+-	return 0;
++	return enable_periodic(ehci);
+ }
+ 
+ #define	ISO_ERRS (EHCI_ISOC_BUF_ERR | EHCI_ISOC_BABBLE | EHCI_ISOC_XACTERR)
+@@ -1642,7 +1641,7 @@ itd_complete (
+ 	ehci_urb_done(ehci, urb, 0);
+ 	retval = true;
+ 	urb = NULL;
+-	ehci->periodic_sched--;
++	(void) disable_periodic(ehci);
+ 	ehci_to_hcd(ehci)->self.bandwidth_isoc_reqs--;
+ 
+ 	if (unlikely (list_empty (&stream->td_list))) {
+@@ -1951,9 +1950,7 @@ sitd_link_urb (
+ 	urb->hcpriv = NULL;
+ 
+ 	timer_action (ehci, TIMER_IO_WATCHDOG);
+-	if (!ehci->periodic_sched++)
+-		return enable_periodic (ehci);
+-	return 0;
++	return enable_periodic(ehci);
+ }
+ 
+ /*-------------------------------------------------------------------------*/
+@@ -2019,7 +2016,7 @@ sitd_complete (
+ 	ehci_urb_done(ehci, urb, 0);
+ 	retval = true;
+ 	urb = NULL;
+-	ehci->periodic_sched--;
++	(void) disable_periodic(ehci);
+ 	ehci_to_hcd(ehci)->self.bandwidth_isoc_reqs--;
+ 
+ 	if (list_empty (&stream->td_list)) {
+@@ -2243,8 +2240,7 @@ restart:
+ 			if (unlikely (modified)) {
+ 				if (likely(ehci->periodic_sched > 0))
+ 					goto restart;
+-				/* maybe we can short-circuit this scan! */
+-				disable_periodic(ehci);
++				/* short-circuit this scan */
+ 				now_uframe = clock;
+ 				break;
+ 			}
+diff --git a/drivers/usb/musb/Kconfig b/drivers/usb/musb/Kconfig
+index a001748..58b2b8f 100644
+--- a/drivers/usb/musb/Kconfig
++++ b/drivers/usb/musb/Kconfig
+@@ -9,6 +9,7 @@ comment "Enable Host or Gadget support to see Inventra options"
+ # (M)HDRC = (Multipoint) Highspeed Dual-Role Controller
+ config USB_MUSB_HDRC
+ 	depends on (USB || USB_GADGET) && HAVE_CLK
++	depends on !SUPERH
+ 	select TWL4030_USB if MACH_OMAP_3430SDP
+ 	tristate 'Inventra Highspeed Dual Role Controller (TI, ...)'
+ 	help
+diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c
+index c5b8f02..128e949 100644
+--- a/drivers/usb/musb/musb_core.c
++++ b/drivers/usb/musb/musb_core.c
+@@ -100,8 +100,8 @@
+ #include <linux/io.h>
+ 
+ #ifdef	CONFIG_ARM
+-#include <asm/arch/hardware.h>
+-#include <asm/arch/memory.h>
++#include <mach/hardware.h>
++#include <mach/memory.h>
+ #include <asm/mach-types.h>
+ #endif
+ 
+diff --git a/drivers/usb/musb/omap2430.c b/drivers/usb/musb/omap2430.c
+index 298b22e..9d2dcb1 100644
+--- a/drivers/usb/musb/omap2430.c
++++ b/drivers/usb/musb/omap2430.c
+@@ -35,8 +35,8 @@
+ #include <linux/io.h>
+ 
+ #include <asm/mach-types.h>
+-#include <asm/arch/hardware.h>
+-#include <asm/arch/mux.h>
++#include <mach/hardware.h>
++#include <mach/mux.h>
+ 
+ #include "musb_core.h"
+ #include "omap2430.h"
+diff --git a/drivers/usb/musb/omap2430.h b/drivers/usb/musb/omap2430.h
+index 786a620..dc76707 100644
+--- a/drivers/usb/musb/omap2430.h
++++ b/drivers/usb/musb/omap2430.h
+@@ -11,8 +11,8 @@
+ #define __MUSB_OMAP243X_H__
+ 
+ #if defined(CONFIG_ARCH_OMAP2430) || defined(CONFIG_ARCH_OMAP3430)
+-#include <asm/arch/hardware.h>
+-#include <asm/arch/usb.h>
++#include <mach/hardware.h>
++#include <mach/usb.h>
+ 
+ /*
+  * OMAP2430-specific definitions
+diff --git a/drivers/usb/serial/cp2101.c b/drivers/usb/serial/cp2101.c
+index 442cba6..1279553 100644
+--- a/drivers/usb/serial/cp2101.c
++++ b/drivers/usb/serial/cp2101.c
+@@ -72,6 +72,7 @@ static struct usb_device_id id_table [] = {
+ 	{ USB_DEVICE(0x10C4, 0x80CA) }, /* Degree Controls Inc */
+ 	{ USB_DEVICE(0x10C4, 0x80DD) }, /* Tracient RFID */
+ 	{ USB_DEVICE(0x10C4, 0x80F6) }, /* Suunto sports instrument */
++	{ USB_DEVICE(0x10C4, 0x8115) }, /* Arygon NFC/Mifare Reader */
+ 	{ USB_DEVICE(0x10C4, 0x813D) }, /* Burnside Telecom Deskmobile */
+ 	{ USB_DEVICE(0x10C4, 0x814A) }, /* West Mountain Radio RIGblaster P&P */
+ 	{ USB_DEVICE(0x10C4, 0x814B) }, /* West Mountain Radio RIGtalk */
+@@ -83,6 +84,7 @@ static struct usb_device_id id_table [] = {
+ 	{ USB_DEVICE(0x10C4, 0x81E7) }, /* Aerocomm Radio */
+ 	{ USB_DEVICE(0x10C4, 0x8218) }, /* Lipowsky Industrie Elektronik GmbH, HARP-1 */
+ 	{ USB_DEVICE(0x10c4, 0x8293) }, /* Telegesys ETRX2USB */
++	{ USB_DEVICE(0x10C4, 0x8341) }, /* Siemens MC35PU GPRS Modem */
+ 	{ USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */
+ 	{ USB_DEVICE(0x10C4, 0xEA61) }, /* Silicon Labs factory default */
+ 	{ USB_DEVICE(0x10C4, 0xF001) }, /* Elan Digital Systems USBscope50 */
+@@ -93,6 +95,7 @@ static struct usb_device_id id_table [] = {
+ 	{ USB_DEVICE(0x13AD, 0x9999) }, /* Baltech card reader */
+ 	{ USB_DEVICE(0x166A, 0x0303) }, /* Clipsal 5500PCU C-Bus USB interface */
+ 	{ USB_DEVICE(0x16D6, 0x0001) }, /* Jablotron serial interface */
++	{ USB_DEVICE(0x18EF, 0xE00F) }, /* ELV USB-I2C-Interface */
+ 	{ } /* Terminating Entry */
+ };
+ 
+diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
+index 984f6ef..3dc93b5 100644
+--- a/drivers/usb/serial/ftdi_sio.c
++++ b/drivers/usb/serial/ftdi_sio.c
+@@ -654,6 +654,9 @@ static struct usb_device_id id_table_combined [] = {
+ 		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
+ 	{ USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID_USB60F) },
+ 	{ USB_DEVICE(FTDI_VID, FTDI_REU_TINY_PID) },
++	{ USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO4x4_PID) },
++	{ USB_DEVICE(FTDI_VID, FTDI_DOMINTELL_DGQG_PID) },
++	{ USB_DEVICE(FTDI_VID, FTDI_DOMINTELL_DUSB_PID) },
+ 	{ },					/* Optional parameter entry */
+ 	{ }					/* Terminating entry */
+ };
+diff --git a/drivers/usb/serial/ftdi_sio.h b/drivers/usb/serial/ftdi_sio.h
+index 382265b..8a5b6df 100644
+--- a/drivers/usb/serial/ftdi_sio.h
++++ b/drivers/usb/serial/ftdi_sio.h
+@@ -750,6 +750,7 @@
+ 
+ #define PAPOUCH_VID			0x5050	/* Vendor ID */
+ #define PAPOUCH_TMU_PID			0x0400	/* TMU USB Thermometer */
++#define PAPOUCH_QUIDO4x4_PID		0x0900	/* Quido 4/4 Module */
+ 
+ /*
+  * ACG Identification Technologies GmbH products (http://www.acg.de/).
+@@ -838,6 +839,10 @@
+ /* Rig Expert Ukraine devices */
+ #define FTDI_REU_TINY_PID		0xED22	/* RigExpert Tiny */
+ 
++/* Domintell products  http://www.domintell.com */
++#define FTDI_DOMINTELL_DGQG_PID	0xEF50	/* Master */
++#define FTDI_DOMINTELL_DUSB_PID	0xEF51	/* DUSB01 module */
++
+ /* Commands */
+ #define FTDI_SIO_RESET 		0 /* Reset the port */
+ #define FTDI_SIO_MODEM_CTRL 	1 /* Set the modem control register */
+diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
+index 9f9cd36..73f8277 100644
+--- a/drivers/usb/serial/option.c
++++ b/drivers/usb/serial/option.c
+@@ -218,6 +218,7 @@ 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_CDMA_TECH			0xfffe
+ 
+ static struct usb_device_id option_ids[] = {
+ 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) },
+@@ -347,6 +348,7 @@ static struct usb_device_id option_ids[] = {
+ 	{ 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_MF628) },
++	{ USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_CDMA_TECH) },
+ 	{ } /* Terminating entry */
+ };
+ MODULE_DEVICE_TABLE(usb, option_ids);
+diff --git a/drivers/usb/serial/sierra.c b/drivers/usb/serial/sierra.c
+index 7060337..ea1a103 100644
+--- a/drivers/usb/serial/sierra.c
++++ b/drivers/usb/serial/sierra.c
+@@ -14,7 +14,7 @@
+   Whom based his on the Keyspan driver by Hugh Blemings <hugh at blemings.org>
+ */
+ 
+-#define DRIVER_VERSION "v.1.2.13a"
++#define DRIVER_VERSION "v.1.3.2"
+ #define DRIVER_AUTHOR "Kevin Lloyd <klloyd at sierrawireless.com>"
+ #define DRIVER_DESC "USB Driver for Sierra Wireless USB modems"
+ 
+@@ -30,9 +30,6 @@
+ 
+ #define SWIMS_USB_REQUEST_SetPower	0x00
+ #define SWIMS_USB_REQUEST_SetNmea	0x07
+-#define SWIMS_USB_REQUEST_SetMode	0x0B
+-#define SWIMS_USB_REQUEST_GetSwocInfo	0x0A
+-#define SWIMS_SET_MODE_Modem		0x0001
+ 
+ /* per port private data */
+ #define N_IN_URB	4
+@@ -163,7 +160,7 @@ static struct usb_device_id id_table [] = {
+ 	{ USB_DEVICE(0x1199, 0x0017) },	/* Sierra Wireless EM5625 */
+ 	{ USB_DEVICE(0x1199, 0x0018) },	/* Sierra Wireless MC5720 */
+ 	{ USB_DEVICE(0x1199, 0x0218) },	/* Sierra Wireless MC5720 */
+-	{ USB_DEVICE(0x0f30, 0x1b1d) },	/* Sierra Wireless MC5720 */
++	{ USB_DEVICE(0x03f0, 0x1b1d) }, /* HP ev2200 a.k.a MC5720 */
+ 	{ USB_DEVICE(0x1199, 0x0020) },	/* Sierra Wireless MC5725 */
+ 	{ USB_DEVICE(0x1199, 0x0024) },	/* Sierra Wireless MC5727 */
+ 	{ USB_DEVICE(0x1199, 0x0220) },	/* Sierra Wireless MC5725 */
+@@ -175,6 +172,8 @@ static struct usb_device_id id_table [] = {
+ 	 /* Sierra Wireless Device */
+ 	{ USB_DEVICE_AND_INTERFACE_INFO(0x1199, 0x0025, 0xFF, 0xFF, 0xFF) },
+ 	{ USB_DEVICE(0x1199, 0x0026) }, /* Sierra Wireless Device */
++	{ USB_DEVICE(0x1199, 0x0027) }, /* Sierra Wireless Device */
++	{ USB_DEVICE(0x1199, 0x0028) }, /* Sierra Wireless Device */
+ 
+ 	{ USB_DEVICE(0x1199, 0x6802) },	/* Sierra Wireless MC8755 */
+ 	{ USB_DEVICE(0x1199, 0x6804) },	/* Sierra Wireless MC8755 */
+@@ -187,6 +186,7 @@ static struct usb_device_id id_table [] = {
+ 	{ USB_DEVICE(0x1199, 0x6821) },	/* Sierra Wireless AirCard 875U */
+ 	{ USB_DEVICE(0x1199, 0x6832) },	/* Sierra Wireless MC8780 */
+ 	{ USB_DEVICE(0x1199, 0x6833) },	/* Sierra Wireless MC8781 */
++	{ USB_DEVICE(0x1199, 0x683A) },	/* Sierra Wireless MC8785 */
+ 	{ USB_DEVICE(0x1199, 0x683B) },	/* Sierra Wireless MC8785 Composite */
+ 	{ USB_DEVICE(0x1199, 0x683C) },	/* Sierra Wireless MC8790 */
+ 	{ USB_DEVICE(0x1199, 0x683D) },	/* Sierra Wireless MC8790 */
+@@ -204,6 +204,8 @@ static struct usb_device_id id_table [] = {
+ 	/* Sierra Wireless Device */
+ 	{ USB_DEVICE_AND_INTERFACE_INFO(0x1199, 0x6890, 0xFF, 0xFF, 0xFF)},
+ 	/* Sierra Wireless Device */
++	{ USB_DEVICE_AND_INTERFACE_INFO(0x1199, 0x6891, 0xFF, 0xFF, 0xFF)},
++	/* Sierra Wireless Device */
+ 	{ USB_DEVICE_AND_INTERFACE_INFO(0x1199, 0x6892, 0xFF, 0xFF, 0xFF)},
+ 
+ 	{ USB_DEVICE(0x1199, 0x0112) }, /* Sierra Wireless AirCard 580 */
+diff --git a/drivers/usb/serial/ti_usb_3410_5052.c b/drivers/usb/serial/ti_usb_3410_5052.c
+index e39c779..9a3e495 100644
+--- a/drivers/usb/serial/ti_usb_3410_5052.c
++++ b/drivers/usb/serial/ti_usb_3410_5052.c
+@@ -1744,7 +1744,7 @@ static int ti_download_firmware(struct ti_device *tdev, int type)
+ 	if (buffer) {
+ 		memcpy(buffer, fw_p->data, fw_p->size);
+ 		memset(buffer + fw_p->size, 0xff, buffer_size - fw_p->size);
+-		ti_do_download(dev, pipe, buffer, fw_p->size);
++		status = ti_do_download(dev, pipe, buffer, fw_p->size);
+ 		kfree(buffer);
+ 	}
+ 	release_firmware(fw_p);
+diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c
+index b157c48..4f7f9e3 100644
+--- a/drivers/usb/serial/usb-serial.c
++++ b/drivers/usb/serial/usb-serial.c
+@@ -733,7 +733,9 @@ int usb_serial_probe(struct usb_interface *interface,
+ 	    ((le16_to_cpu(dev->descriptor.idVendor) == ATEN_VENDOR_ID) &&
+ 	     (le16_to_cpu(dev->descriptor.idProduct) == ATEN_PRODUCT_ID)) ||
+ 	    ((le16_to_cpu(dev->descriptor.idVendor) == ALCOR_VENDOR_ID) &&
+-	     (le16_to_cpu(dev->descriptor.idProduct) == ALCOR_PRODUCT_ID))) {
++	     (le16_to_cpu(dev->descriptor.idProduct) == ALCOR_PRODUCT_ID)) ||
++	    ((le16_to_cpu(dev->descriptor.idVendor) == SIEMENS_VENDOR_ID) &&
++	     (le16_to_cpu(dev->descriptor.idProduct) == SIEMENS_PRODUCT_ID_EF81))) {
+ 		if (interface != dev->actconfig->interface[0]) {
+ 			/* check out the endpoints of the other interface*/
+ 			iface_desc = dev->actconfig->interface[0]->cur_altsetting;
+diff --git a/drivers/usb/storage/Kconfig b/drivers/usb/storage/Kconfig
+index c760346..3d92496 100644
+--- a/drivers/usb/storage/Kconfig
++++ b/drivers/usb/storage/Kconfig
+@@ -146,18 +146,6 @@ config USB_STORAGE_KARMA
+ 	  on the resulting scsi device node returns the Karma to normal
+ 	  operation.
+ 
+-config USB_STORAGE_SIERRA
+-	bool "Sierra Wireless TRU-Install Feature Support"
+-	depends on USB_STORAGE
+-	help
+-	  Say Y here to include additional code to support Sierra Wireless
+-	  products with the TRU-Install feature (e.g., AC597E, AC881U).
+-
+-	  This code switches the Sierra Wireless device from being in
+-	  Mass Storage mode to Modem mode. It also has the ability to
+-	  support host software upgrades should full Linux support be added
+-	  to TRU-Install.
+-
+ config USB_STORAGE_CYPRESS_ATACB
+ 	bool "SAT emulation on Cypress USB/ATA Bridge with ATACB"
+ 	depends on USB_STORAGE
+diff --git a/drivers/usb/storage/Makefile b/drivers/usb/storage/Makefile
+index bc3415b..7f8beb5 100644
+--- a/drivers/usb/storage/Makefile
++++ b/drivers/usb/storage/Makefile
+@@ -21,11 +21,10 @@ usb-storage-obj-$(CONFIG_USB_STORAGE_JUMPSHOT)	+= jumpshot.o
+ usb-storage-obj-$(CONFIG_USB_STORAGE_ALAUDA)	+= alauda.o
+ usb-storage-obj-$(CONFIG_USB_STORAGE_ONETOUCH)	+= onetouch.o
+ usb-storage-obj-$(CONFIG_USB_STORAGE_KARMA)	+= karma.o
+-usb-storage-obj-$(CONFIG_USB_STORAGE_SIERRA)	+= sierra_ms.o
+ usb-storage-obj-$(CONFIG_USB_STORAGE_CYPRESS_ATACB) += cypress_atacb.o
+ 
+ usb-storage-objs :=	scsiglue.o protocol.o transport.o usb.o \
+-			initializers.o $(usb-storage-obj-y)
++			initializers.o sierra_ms.o $(usb-storage-obj-y)
+ 
+ ifneq ($(CONFIG_USB_LIBUSUAL),)
+ 	obj-$(CONFIG_USB)	+= libusual.o
+diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h
+index ba412e6..cd15547 100644
+--- a/drivers/usb/storage/unusual_devs.h
++++ b/drivers/usb/storage/unusual_devs.h
+@@ -160,6 +160,13 @@ UNUSUAL_DEV(  0x0421, 0x0019, 0x0592, 0x0592,
+ 		US_SC_DEVICE, US_PR_DEVICE, NULL,
+ 		US_FL_MAX_SECTORS_64 ),
+ 
++/* Reported by Filip Joelsson <filip at blueturtle.nu> */
++UNUSUAL_DEV(  0x0421, 0x005d, 0x0001, 0x0600,
++		"Nokia",
++		"Nokia 3110c",
++		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",
+@@ -232,6 +239,20 @@ UNUSUAL_DEV(  0x0421, 0x04b9, 0x0551, 0x0551,
+ 		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,
++		"Nokia",
++		"6300",
++		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 Olaf Hering <olh at suse.de> from novell bug #105878 */
+ UNUSUAL_DEV(  0x0424, 0x0fdc, 0x0210, 0x0210,
+ 		"SMSC",
+@@ -987,6 +1008,13 @@ UNUSUAL_DEV(  0x069b, 0x3004, 0x0001, 0x0001,
+ 		US_SC_DEVICE, US_PR_DEVICE, NULL,
+ 		US_FL_FIX_CAPACITY ),
+ 
++/* Reported by Adrian Pilchowiec <adi1981 at epf.pl> */
++UNUSUAL_DEV(  0x071b, 0x3203, 0x0000, 0x0000,
++		"RockChip",
++		"MP3",
++		US_SC_DEVICE, US_PR_DEVICE, NULL,
++		US_FL_NO_WP_DETECT | US_FL_MAX_SECTORS_64),
++
+ /* Reported by Massimiliano Ghilardi <massimiliano.ghilardi at gmail.com>
+  * This USB MP3/AVI player device fails and disconnects if more than 128
+  * sectors (64kB) are read/written in a single command, and may be present
+@@ -1576,7 +1604,6 @@ UNUSUAL_DEV(  0x10d6, 0x2200, 0x0100, 0x0100,
+ 		US_SC_DEVICE, US_PR_DEVICE, NULL,
+ 		0),
+ 
+-#ifdef CONFIG_USB_STORAGE_SIERRA
+ /* Reported by Kevin Lloyd <linux at sierrawireless.com>
+  * Entry is needed for the initializer function override,
+  * which instructs the device to load as a modem
+@@ -1587,7 +1614,6 @@ UNUSUAL_DEV(  0x1199, 0x0fff, 0x0000, 0x9999,
+ 		"USB MMC Storage",
+ 		US_SC_DEVICE, US_PR_DEVICE, sierra_ms_init,
+ 		0),
+-#endif
+ 
+ /* Reported by Jaco Kroon <jaco at kroon.co.za>
+  * The usb-storage module found on the Digitech GNX4 (and supposedly other
+diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c
+index 73679aa..27016fd 100644
+--- a/drivers/usb/storage/usb.c
++++ b/drivers/usb/storage/usb.c
+@@ -102,9 +102,7 @@
+ #ifdef CONFIG_USB_STORAGE_CYPRESS_ATACB
+ #include "cypress_atacb.h"
+ #endif
+-#ifdef CONFIG_USB_STORAGE_SIERRA
+ #include "sierra_ms.h"
+-#endif
+ 
+ /* Some informational data */
+ MODULE_AUTHOR("Matthew Dharm <mdharm-usb at one-eyed-alien.net>");
+diff --git a/drivers/watchdog/geodewdt.c b/drivers/watchdog/geodewdt.c
+index 614a5c7..6799a6d 100644
+--- a/drivers/watchdog/geodewdt.c
++++ b/drivers/watchdog/geodewdt.c
+@@ -130,8 +130,8 @@ static ssize_t geodewdt_write(struct file *file, const char __user *data,
+ 	return len;
+ }
+ 
+-static int geodewdt_ioctl(struct inode *inode, struct file *file,
+-				unsigned int cmd, unsigned long arg)
++static long geodewdt_ioctl(struct file *file, unsigned int cmd,
++				unsigned long arg)
+ {
+ 	void __user *argp = (void __user *)arg;
+ 	int __user *p = argp;
+@@ -198,7 +198,7 @@ static const struct file_operations geodewdt_fops = {
+ 	.owner          = THIS_MODULE,
+ 	.llseek         = no_llseek,
+ 	.write          = geodewdt_write,
+-	.ioctl          = geodewdt_ioctl,
++	.unlocked_ioctl = geodewdt_ioctl,
+ 	.open           = geodewdt_open,
+ 	.release        = geodewdt_release,
+ };
+diff --git a/drivers/watchdog/ibmasr.c b/drivers/watchdog/ibmasr.c
+index b82405c..89fcefc 100644
+--- a/drivers/watchdog/ibmasr.c
++++ b/drivers/watchdog/ibmasr.c
+@@ -85,7 +85,6 @@ static void __asr_toggle(void)
+ 
+ 	outb(reg & ~asr_toggle_mask, asr_write_addr);
+ 	reg = inb(asr_read_addr);
+-	spin_unlock(&asr_lock);
+ }
+ 
+ static void asr_toggle(void)
+diff --git a/drivers/watchdog/pnx4008_wdt.c b/drivers/watchdog/pnx4008_wdt.c
+index 0ed8416..6d9f3d4 100644
+--- a/drivers/watchdog/pnx4008_wdt.c
++++ b/drivers/watchdog/pnx4008_wdt.c
+@@ -173,8 +173,8 @@ static const struct watchdog_info ident = {
+ 	.identity = "PNX4008 Watchdog",
+ };
+ 
+-static long pnx4008_wdt_ioctl(struct inode *inode, struct file *file,
+-					unsigned int cmd, unsigned long arg)
++static long pnx4008_wdt_ioctl(struct file *file, unsigned int cmd,
++				unsigned long arg)
+ {
+ 	int ret = -ENOTTY;
+ 	int time;
+diff --git a/drivers/watchdog/rc32434_wdt.c b/drivers/watchdog/rc32434_wdt.c
+index 6756bcb..c9c73b6 100644
+--- a/drivers/watchdog/rc32434_wdt.c
++++ b/drivers/watchdog/rc32434_wdt.c
+@@ -182,8 +182,8 @@ static ssize_t rc32434_wdt_write(struct file *file, const char *data,
+ 	return 0;
+ }
+ 
+-static int rc32434_wdt_ioctl(struct inode *inode, struct file *file,
+-	unsigned int cmd, unsigned long arg)
++static long rc32434_wdt_ioctl(struct file *file, unsigned int cmd,
++				unsigned long arg)
+ {
+ 	void __user *argp = (void __user *)arg;
+ 	int new_timeout;
+@@ -242,7 +242,7 @@ static struct file_operations rc32434_wdt_fops = {
+ 	.owner		= THIS_MODULE,
+ 	.llseek		= no_llseek,
+ 	.write		= rc32434_wdt_write,
+-	.ioctl		= rc32434_wdt_ioctl,
++	.unlocked_ioctl	= rc32434_wdt_ioctl,
+ 	.open		= rc32434_wdt_open,
+ 	.release	= rc32434_wdt_release,
+ };
+diff --git a/drivers/watchdog/rdc321x_wdt.c b/drivers/watchdog/rdc321x_wdt.c
+index 9108efa..bf92802 100644
+--- a/drivers/watchdog/rdc321x_wdt.c
++++ b/drivers/watchdog/rdc321x_wdt.c
+@@ -144,8 +144,8 @@ static int rdc321x_wdt_release(struct inode *inode, struct file *file)
+ 	return 0;
+ }
+ 
+-static int rdc321x_wdt_ioctl(struct inode *inode, struct file *file,
+-				unsigned int cmd, unsigned long arg)
++static long rdc321x_wdt_ioctl(struct file *file, unsigned int cmd,
++				unsigned long arg)
+ {
+ 	void __user *argp = (void __user *)arg;
+ 	unsigned int value;
+@@ -204,7 +204,7 @@ static ssize_t rdc321x_wdt_write(struct file *file, const char __user *buf,
+ static const struct file_operations rdc321x_wdt_fops = {
+ 	.owner		= THIS_MODULE,
+ 	.llseek		= no_llseek,
+-	.ioctl		= rdc321x_wdt_ioctl,
++	.unlocked_ioctl	= rdc321x_wdt_ioctl,
+ 	.open		= rdc321x_wdt_open,
+ 	.write		= rdc321x_wdt_write,
+ 	.release	= rdc321x_wdt_release,
+diff --git a/drivers/watchdog/wdt285.c b/drivers/watchdog/wdt285.c
+index db362c3..191ea63 100644
+--- a/drivers/watchdog/wdt285.c
++++ b/drivers/watchdog/wdt285.c
+@@ -115,8 +115,8 @@ static int watchdog_release(struct inode *inode, struct file *file)
+ 	return 0;
+ }
+ 
+-static ssize_t watchdog_write(struct file *file, const char *data,
+-						size_t len, loff_t *ppos)
++static ssize_t watchdog_write(struct file *file, const char __user *data,
++			      size_t len, loff_t *ppos)
+ {
+ 	/*
+ 	 *	Refresh the timer.
+@@ -133,21 +133,22 @@ static const struct watchdog_info ident = {
+ };
+ 
+ static long watchdog_ioctl(struct file *file, unsigned int cmd,
+-							unsigned long arg)
++			   unsigned long arg)
+ {
+ 	unsigned int new_margin;
++	int __user *int_arg = (int __user *)arg;
+ 	int ret = -ENOTTY;
+ 
+ 	switch (cmd) {
+ 	case WDIOC_GETSUPPORT:
+ 		ret = 0;
+-		if (copy_to_user((void *)arg, &ident, sizeof(ident)))
++		if (copy_to_user((void __user *)arg, &ident, sizeof(ident)))
+ 			ret = -EFAULT;
+ 		break;
+ 
+ 	case WDIOC_GETSTATUS:
+ 	case WDIOC_GETBOOTSTATUS:
+-		ret = put_user(0, (int *)arg);
++		ret = put_user(0, int_arg);
+ 		break;
+ 
+ 	case WDIOC_KEEPALIVE:
+@@ -156,7 +157,7 @@ static long watchdog_ioctl(struct file *file, unsigned int cmd,
+ 		break;
+ 
+ 	case WDIOC_SETTIMEOUT:
+-		ret = get_user(new_margin, (int *)arg);
++		ret = get_user(new_margin, int_arg);
+ 		if (ret)
+ 			break;
+ 
+@@ -171,7 +172,7 @@ static long watchdog_ioctl(struct file *file, unsigned int cmd,
+ 		watchdog_ping();
+ 		/* Fall */
+ 	case WDIOC_GETTIMEOUT:
+-		ret = put_user(soft_margin, (int *)arg);
++		ret = put_user(soft_margin, int_arg);
+ 		break;
+ 	}
+ 	return ret;
+diff --git a/include/asm-x86/acpi.h b/include/asm-x86/acpi.h
+index 635d764..35d1743 100644
+--- a/include/asm-x86/acpi.h
++++ b/include/asm-x86/acpi.h
+@@ -140,6 +140,8 @@ static inline unsigned int acpi_processor_cstate_check(unsigned int max_cstate)
+ 	    boot_cpu_data.x86_model <= 0x05 &&
+ 	    boot_cpu_data.x86_mask < 0x0A)
+ 		return 1;
++	else if (boot_cpu_has(X86_FEATURE_AMDC1E))
++		return 1;
+ 	else
+ 		return max_cstate;
+ }
+diff --git a/include/asm-x86/cpufeature.h b/include/asm-x86/cpufeature.h
+index 9489283..cfcfb0a 100644
+--- a/include/asm-x86/cpufeature.h
++++ b/include/asm-x86/cpufeature.h
+@@ -81,6 +81,7 @@
+ #define X86_FEATURE_LFENCE_RDTSC (3*32+18) /* Lfence synchronizes RDTSC */
+ #define X86_FEATURE_11AP	(3*32+19) /* Bad local APIC aka 11AP */
+ #define X86_FEATURE_NOPL	(3*32+20) /* The NOPL (0F 1F) instructions */
++#define X86_FEATURE_AMDC1E	(3*32+21) /* AMD C1E detected */
+ 
+ /* Intel-defined CPU features, CPUID level 0x00000001 (ecx), word 4 */
+ #define X86_FEATURE_XMM3	(4*32+ 0) /* Streaming SIMD Extensions-3 */
+diff --git a/include/asm-x86/idle.h b/include/asm-x86/idle.h
+index d240e5b..cbb6491 100644
+--- a/include/asm-x86/idle.h
++++ b/include/asm-x86/idle.h
+@@ -10,4 +10,6 @@ void idle_notifier_register(struct notifier_block *n);
+ void enter_idle(void);
+ void exit_idle(void);
+ 
++void c1e_remove_cpu(int cpu);
++
+ #endif
+diff --git a/include/linux/pci.h b/include/linux/pci.h
+index c0e1400..98dc624 100644
+--- a/include/linux/pci.h
++++ b/include/linux/pci.h
+@@ -534,7 +534,7 @@ extern void pci_sort_breadthfirst(void);
+ #ifdef CONFIG_PCI_LEGACY
+ struct pci_dev __deprecated *pci_find_device(unsigned int vendor,
+ 					     unsigned int device,
+-					     const struct pci_dev *from);
++					     struct pci_dev *from);
+ struct pci_dev __deprecated *pci_find_slot(unsigned int bus,
+ 					   unsigned int devfn);
+ #endif /* CONFIG_PCI_LEGACY */
+@@ -550,7 +550,7 @@ struct pci_dev *pci_get_device(unsigned int vendor, unsigned int device,
+ 				struct pci_dev *from);
+ struct pci_dev *pci_get_subsys(unsigned int vendor, unsigned int device,
+ 				unsigned int ss_vendor, unsigned int ss_device,
+-				const struct pci_dev *from);
++				struct pci_dev *from);
+ struct pci_dev *pci_get_slot(struct pci_bus *bus, unsigned int devfn);
+ struct pci_dev *pci_get_bus_and_slot(unsigned int bus, unsigned int devfn);
+ struct pci_dev *pci_get_class(unsigned int class, struct pci_dev *from);
+@@ -816,7 +816,7 @@ _PCI_NOP_ALL(write,)
+ 
+ static inline struct pci_dev *pci_find_device(unsigned int vendor,
+ 					      unsigned int device,
+-					      const struct pci_dev *from)
++					      struct pci_dev *from)
+ {
+ 	return NULL;
+ }
+@@ -838,7 +838,7 @@ static inline struct pci_dev *pci_get_subsys(unsigned int vendor,
+ 					     unsigned int device,
+ 					     unsigned int ss_vendor,
+ 					     unsigned int ss_device,
+-					     const struct pci_dev *from)
++					     struct pci_dev *from)
+ {
+ 	return NULL;
+ }
+diff --git a/include/linux/smb.h b/include/linux/smb.h
+index caa43b2..82fefdd 100644
+--- a/include/linux/smb.h
++++ b/include/linux/smb.h
+@@ -11,7 +11,9 @@
+ 
+ #include <linux/types.h>
+ #include <linux/magic.h>
++#ifdef __KERNEL__
+ #include <linux/time.h>
++#endif
+ 
+ enum smb_protocol { 
+ 	SMB_PROTOCOL_NONE, 
+diff --git a/kernel/kexec.c b/kernel/kexec.c
+index 59f3f0d..aef2653 100644
+--- a/kernel/kexec.c
++++ b/kernel/kexec.c
+@@ -753,8 +753,14 @@ static struct page *kimage_alloc_page(struct kimage *image,
+ 			*old = addr | (*old & ~PAGE_MASK);
+ 
+ 			/* The old page I have found cannot be a
+-			 * destination page, so return it.
++			 * destination page, so return it if it's
++			 * gfp_flags honor the ones passed in.
+ 			 */
++			if (!(gfp_mask & __GFP_HIGHMEM) &&
++			    PageHighMem(old_page)) {
++				kimage_free_pages(old_page);
++				continue;
++			}
+ 			addr = old_addr;
+ 			page = old_page;
+ 			break;
+diff --git a/kernel/sched.c b/kernel/sched.c
+index 9889080..13dd2db 100644
+--- a/kernel/sched.c
++++ b/kernel/sched.c
+@@ -1087,7 +1087,7 @@ hotplug_hrtick(struct notifier_block *nfb, unsigned long action, void *hcpu)
+ 	return NOTIFY_DONE;
+ }
+ 
+-static void init_hrtick(void)
++static __init void init_hrtick(void)
+ {
+ 	hotcpu_notifier(hotplug_hrtick, 0);
+ }
+diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c
+index f1f3eee..bd70345 100644
+--- a/kernel/time/tick-broadcast.c
++++ b/kernel/time/tick-broadcast.c
+@@ -235,7 +235,7 @@ static void tick_do_broadcast_on_off(void *why)
+ 	case CLOCK_EVT_NOTIFY_BROADCAST_FORCE:
+ 		if (!cpu_isset(cpu, tick_broadcast_mask)) {
+ 			cpu_set(cpu, tick_broadcast_mask);
+-			if (td->mode == TICKDEV_MODE_PERIODIC)
++			if (bc->mode == TICKDEV_MODE_PERIODIC)
+ 				clockevents_shutdown(dev);
+ 		}
+ 		if (*reason == CLOCK_EVT_NOTIFY_BROADCAST_FORCE)
+@@ -245,7 +245,7 @@ static void tick_do_broadcast_on_off(void *why)
+ 		if (!tick_broadcast_force &&
+ 		    cpu_isset(cpu, tick_broadcast_mask)) {
+ 			cpu_clear(cpu, tick_broadcast_mask);
+-			if (td->mode == TICKDEV_MODE_PERIODIC)
++			if (bc->mode == TICKDEV_MODE_PERIODIC)
+ 				tick_setup_periodic(dev, 0);
+ 		}
+ 		break;
+@@ -575,4 +575,12 @@ void tick_shutdown_broadcast_oneshot(unsigned int *cpup)
+ 	spin_unlock_irqrestore(&tick_broadcast_lock, flags);
+ }
+ 
++/*
++ * Check, whether the broadcast device is in one shot mode
++ */
++int tick_broadcast_oneshot_active(void)
++{
++	return tick_broadcast_device.mode == TICKDEV_MODE_ONESHOT;
++}
++
+ #endif
+diff --git a/kernel/time/tick-common.c b/kernel/time/tick-common.c
+index 019315e..df12434 100644
+--- a/kernel/time/tick-common.c
++++ b/kernel/time/tick-common.c
+@@ -33,7 +33,7 @@ DEFINE_PER_CPU(struct tick_device, tick_cpu_device);
+  */
+ ktime_t tick_next_period;
+ ktime_t tick_period;
+-int tick_do_timer_cpu __read_mostly = -1;
++int tick_do_timer_cpu __read_mostly = TICK_DO_TIMER_BOOT;
+ DEFINE_SPINLOCK(tick_device_lock);
+ 
+ /*
+@@ -109,7 +109,8 @@ void tick_setup_periodic(struct clock_event_device *dev, int broadcast)
+ 	if (!tick_device_is_functional(dev))
+ 		return;
+ 
+-	if (dev->features & CLOCK_EVT_FEAT_PERIODIC) {
++	if ((dev->features & CLOCK_EVT_FEAT_PERIODIC) &&
++	    !tick_broadcast_oneshot_active()) {
+ 		clockevents_set_mode(dev, CLOCK_EVT_MODE_PERIODIC);
+ 	} else {
+ 		unsigned long seq;
+@@ -148,7 +149,7 @@ static void tick_setup_device(struct tick_device *td,
+ 		 * If no cpu took the do_timer update, assign it to
+ 		 * this cpu:
+ 		 */
+-		if (tick_do_timer_cpu == -1) {
++		if (tick_do_timer_cpu == TICK_DO_TIMER_BOOT) {
+ 			tick_do_timer_cpu = cpu;
+ 			tick_next_period = ktime_get();
+ 			tick_period = ktime_set(0, NSEC_PER_SEC / HZ);
+@@ -300,7 +301,8 @@ static void tick_shutdown(unsigned int *cpup)
+ 	if (*cpup == tick_do_timer_cpu) {
+ 		int cpu = first_cpu(cpu_online_map);
+ 
+-		tick_do_timer_cpu = (cpu != NR_CPUS) ? cpu : -1;
++		tick_do_timer_cpu = (cpu != NR_CPUS) ? cpu :
++			TICK_DO_TIMER_NONE;
+ 	}
+ 	spin_unlock_irqrestore(&tick_device_lock, flags);
+ }
+diff --git a/kernel/time/tick-internal.h b/kernel/time/tick-internal.h
+index 6e9db97..4692487 100644
+--- a/kernel/time/tick-internal.h
++++ b/kernel/time/tick-internal.h
+@@ -1,6 +1,10 @@
+ /*
+  * tick internal variable and functions used by low/high res code
+  */
++
++#define TICK_DO_TIMER_NONE	-1
++#define TICK_DO_TIMER_BOOT	-2
++
+ DECLARE_PER_CPU(struct tick_device, tick_cpu_device);
+ extern spinlock_t tick_device_lock;
+ extern ktime_t tick_next_period;
+@@ -31,6 +35,7 @@ extern void tick_broadcast_oneshot_control(unsigned long reason);
+ extern void tick_broadcast_switch_to_oneshot(void);
+ extern void tick_shutdown_broadcast_oneshot(unsigned int *cpup);
+ extern int tick_resume_broadcast_oneshot(struct clock_event_device *bc);
++extern int tick_broadcast_oneshot_active(void);
+ # else /* BROADCAST */
+ static inline void tick_broadcast_setup_oneshot(struct clock_event_device *bc)
+ {
+@@ -39,6 +44,7 @@ static inline void tick_broadcast_setup_oneshot(struct clock_event_device *bc)
+ static inline void tick_broadcast_oneshot_control(unsigned long reason) { }
+ static inline void tick_broadcast_switch_to_oneshot(void) { }
+ static inline void tick_shutdown_broadcast_oneshot(unsigned int *cpup) { }
++static inline int tick_broadcast_oneshot_active(void) { return 0; }
+ # endif /* !BROADCAST */
+ 
+ #else /* !ONESHOT */
+@@ -68,6 +74,7 @@ static inline int tick_resume_broadcast_oneshot(struct clock_event_device *bc)
+ {
+ 	return 0;
+ }
++static inline int tick_broadcast_oneshot_active(void) { return 0; }
+ #endif /* !TICK_ONESHOT */
+ 
+ /*
+diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c
+index a87b046..39019b3 100644
+--- a/kernel/time/tick-sched.c
++++ b/kernel/time/tick-sched.c
+@@ -75,6 +75,9 @@ static void tick_do_update_jiffies64(ktime_t now)
+ 							   incr * ticks);
+ 		}
+ 		do_timer(++ticks);
++
++		/* Keep the tick_next_period variable up to date */
++		tick_next_period = ktime_add(last_jiffies_update, tick_period);
+ 	}
+ 	write_sequnlock(&xtime_lock);
+ }
+@@ -221,7 +224,7 @@ void tick_nohz_stop_sched_tick(int inidle)
+ 	 */
+ 	if (unlikely(!cpu_online(cpu))) {
+ 		if (cpu == tick_do_timer_cpu)
+-			tick_do_timer_cpu = -1;
++			tick_do_timer_cpu = TICK_DO_TIMER_NONE;
+ 	}
+ 
+ 	if (unlikely(ts->nohz_mode == NOHZ_MODE_INACTIVE))
+@@ -303,7 +306,7 @@ void tick_nohz_stop_sched_tick(int inidle)
+ 		 * invoked.
+ 		 */
+ 		if (cpu == tick_do_timer_cpu)
+-			tick_do_timer_cpu = -1;
++			tick_do_timer_cpu = TICK_DO_TIMER_NONE;
+ 
+ 		ts->idle_sleeps++;
+ 
+@@ -468,7 +471,7 @@ static void tick_nohz_handler(struct clock_event_device *dev)
+ 	 * this duty, then the jiffies update is still serialized by
+ 	 * xtime_lock.
+ 	 */
+-	if (unlikely(tick_do_timer_cpu == -1))
++	if (unlikely(tick_do_timer_cpu == TICK_DO_TIMER_NONE))
+ 		tick_do_timer_cpu = cpu;
+ 
+ 	/* Check, if the jiffies need an update */
+@@ -570,7 +573,7 @@ static enum hrtimer_restart tick_sched_timer(struct hrtimer *timer)
+ 	 * this duty, then the jiffies update is still serialized by
+ 	 * xtime_lock.
+ 	 */
+-	if (unlikely(tick_do_timer_cpu == -1))
++	if (unlikely(tick_do_timer_cpu == TICK_DO_TIMER_NONE))
+ 		tick_do_timer_cpu = cpu;
+ #endif
+ 
+diff --git a/mm/memcontrol.c b/mm/memcontrol.c
+index 0f1f7a7..c0500e4 100644
+--- a/mm/memcontrol.c
++++ b/mm/memcontrol.c
+@@ -806,6 +806,7 @@ int mem_cgroup_shrink_usage(struct mm_struct *mm, gfp_t gfp_mask)
+ 
+ 	do {
+ 		progress = try_to_free_mem_cgroup_pages(mem, gfp_mask);
++		progress += res_counter_check_under_limit(&mem->res);
+ 	} while (!progress && --retry);
+ 
+ 	css_put(&mem->css);
+diff --git a/mm/tiny-shmem.c b/mm/tiny-shmem.c
+index ae532f5..d17cb6f 100644
+--- a/mm/tiny-shmem.c
++++ b/mm/tiny-shmem.c
+@@ -65,31 +65,25 @@ struct file *shmem_file_setup(char *name, loff_t size, unsigned long flags)
+ 	if (!dentry)
+ 		goto put_memory;
+ 
+-	error = -ENOSPC;
+-	inode = ramfs_get_inode(root->d_sb, S_IFREG | S_IRWXUGO, 0);
+-	if (!inode)
+-		goto put_dentry;
+-
+-	d_instantiate(dentry, inode);
+ 	error = -ENFILE;
+-	file = alloc_file(shm_mnt, dentry, FMODE_WRITE | FMODE_READ,
+-			&ramfs_file_operations);
++	file = get_empty_filp();
+ 	if (!file)
+ 		goto put_dentry;
+ 
+-	inode->i_nlink = 0;	/* It is unlinked */
+-
+-	/* notify everyone as to the change of file size */
+-	error = do_truncate(dentry, size, 0, file);
+-	if (error < 0)
++	error = -ENOSPC;
++	inode = ramfs_get_inode(root->d_sb, S_IFREG | S_IRWXUGO, 0);
++	if (!inode)
+ 		goto close_file;
+ 
++	d_instantiate(dentry, inode);
++	inode->i_size = size;
++	inode->i_nlink = 0;	/* It is unlinked */
++	init_file(file, shm_mnt, dentry, FMODE_WRITE | FMODE_READ,
++			&ramfs_file_operations);
+ 	return file;
+ 
+ close_file:
+ 	put_filp(file);
+-	return ERR_PTR(error);
+-
+ put_dentry:
+ 	dput(dentry);
+ put_memory:
+diff --git a/net/socket.c b/net/socket.c
+index 8ef8ba8..3e8d4e3 100644
+--- a/net/socket.c
++++ b/net/socket.c
+@@ -1511,6 +1511,7 @@ out_fd:
+ 	goto out_put;
+ }
+ 
++#if 0
+ #ifdef HAVE_SET_RESTORE_SIGMASK
+ asmlinkage long sys_paccept(int fd, struct sockaddr __user *upeer_sockaddr,
+ 			    int __user *upeer_addrlen,
+@@ -1564,6 +1565,7 @@ asmlinkage long sys_paccept(int fd, struct sockaddr __user *upeer_sockaddr,
+ 	return do_accept(fd, upeer_sockaddr, upeer_addrlen, flags);
+ }
+ #endif
++#endif
+ 
+ asmlinkage long sys_accept(int fd, struct sockaddr __user *upeer_sockaddr,
+ 			   int __user *upeer_addrlen)
+diff --git a/scripts/kernel-doc b/scripts/kernel-doc
+index ff787e6..44ee94d 100755
+--- a/scripts/kernel-doc
++++ b/scripts/kernel-doc
+@@ -781,6 +781,7 @@ sub output_struct_xml(%) {
+     print " <refsect1>\n";
+     print "  <title>Members</title>\n";
+ 
++    if ($#{$args{'parameterlist'}} >= 0) {
+     print "  <variablelist>\n";
+     foreach $parameter (@{$args{'parameterlist'}}) {
+       ($parameter =~ /^#/) && next;
+@@ -798,6 +799,9 @@ sub output_struct_xml(%) {
+       print "    </varlistentry>\n";
+     }
+     print "  </variablelist>\n";
++    } else {
++	print " <para>\n  None\n </para>\n";
++    }
+     print " </refsect1>\n";
+ 
+     output_section_xml(@_);
+diff --git a/sound/soc/at32/at32-pcm.c b/sound/soc/at32/at32-pcm.c
+index 435f1da..c83584f 100644
+--- a/sound/soc/at32/at32-pcm.c
++++ b/sound/soc/at32/at32-pcm.c
+@@ -434,7 +434,8 @@ static int at32_pcm_suspend(struct platform_device *pdev,
+ 	params = prtd->params;
+ 
+ 	/* Disable the PDC and save the PDC registers */
+-	ssc_writex(params->ssc->regs, PDC_PTCR, params->mask->pdc_disable);
++	ssc_writex(params->ssc->regs, ATMEL_PDC_PTCR,
++		   params->mask->pdc_disable);
+ 
+ 	prtd->pdc_xpr_save = ssc_readx(params->ssc->regs, params->pdc->xpr);
+ 	prtd->pdc_xcr_save = ssc_readx(params->ssc->regs, params->pdc->xcr);
+@@ -464,7 +465,7 @@ static int at32_pcm_resume(struct platform_device *pdev,
+ 	ssc_writex(params->ssc->regs, params->pdc->xnpr, prtd->pdc_xnpr_save);
+ 	ssc_writex(params->ssc->regs, params->pdc->xncr, prtd->pdc_xncr_save);
+ 
+-	ssc_writex(params->ssc->regs, PDC_PTCR, params->mask->pdc_enable);
++	ssc_writex(params->ssc->regs, ATMEL_PDC_PTCR, params->mask->pdc_enable);
+ 	return 0;
+ }
+ #else /* CONFIG_PM */


Index: kernel.spec
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/devel/kernel.spec,v
retrieving revision 1.973
retrieving revision 1.974
diff -u -r1.973 -r1.974
--- kernel.spec	23 Sep 2008 23:01:39 -0000	1.973
+++ kernel.spec	24 Sep 2008 00:54:44 -0000	1.974
@@ -634,8 +634,6 @@
 Patch2300: linux-2.6-usb-ehci-hcd-respect-nousb.patch
 # Fix HID usage descriptor on MS wireless desktop receiver
 Patch2301: linux-2.6-ms-wireless-receiver.patch
-# fix hang on boot on PS3
-Patch2302: linux-2.6-usb-fix-hcd-interrupt-disabling.patch
 
 # get rid of imacfb and make efifb work everywhere it was used
 Patch2600: linux-2.6-merge-efifb-imacfb.patch
@@ -980,7 +978,7 @@
   done
 %endif
 
-#ApplyPatch git-linus.diff
+ApplyPatch git-linus.diff
 
 # This patch adds a "make nonint_oldconfig" which is non-interactive and
 # also gives a list of missing options at the end. Useful for automated
@@ -1055,7 +1053,6 @@
 
 # USB
 ApplyPatch linux-2.6-usb-ehci-hcd-respect-nousb.patch
-ApplyPatch linux-2.6-usb-fix-hcd-interrupt-disabling.patch
 
 # ACPI
 
@@ -1759,6 +1756,9 @@
 
 %changelog
 * Tue Sep 23 2008 Dave Jones <davej at redhat.com>
+- Merge Linux-2.6 up to commit fb478da5ba69ecf40729ae8ab37ca406b1e5be48
+
+* Tue Sep 23 2008 Dave Jones <davej at redhat.com>
 - Disable E1000E driver until bz 459202 is solved.
 
 * Tue Sep 23 2008 Dave Airlie <airlied at redhat.com>


--- linux-2.6-usb-fix-hcd-interrupt-disabling.patch DELETED ---




More information about the fedora-extras-commits mailing list