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,
+ ®32);
+- 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