* [gentoo-commits] linux-patches r2168 - genpatches-2.6/trunk/3.4
@ 2012-06-22 22:57 Mike Pagano (mpagano)
0 siblings, 0 replies; only message in thread
From: Mike Pagano (mpagano) @ 2012-06-22 22:57 UTC (permalink / raw
To: gentoo-commits
Author: mpagano
Date: 2012-06-22 22:57:51 +0000 (Fri, 22 Jun 2012)
New Revision: 2168
Added:
genpatches-2.6/trunk/3.4/1003_linux-3.4.4.patch
Modified:
genpatches-2.6/trunk/3.4/0000_README
Log:
Linux patch 3.4.4
Modified: genpatches-2.6/trunk/3.4/0000_README
===================================================================
--- genpatches-2.6/trunk/3.4/0000_README 2012-06-21 23:49:16 UTC (rev 2167)
+++ genpatches-2.6/trunk/3.4/0000_README 2012-06-22 22:57:51 UTC (rev 2168)
@@ -51,6 +51,10 @@
From: http://www.kernel.org
Desc: Linux 3.4.3
+Patch: 1003_linux-3.4.4.patch
+From: http://www.kernel.org
+Desc: Linux 3.4.4
+
Patch: 1900_cifs-double-delim-check.patch
From: http://bugzillafiles.novell.org/attachment.cgi?id=494407
Desc: Patch to properly parse cifs mount options
Added: genpatches-2.6/trunk/3.4/1003_linux-3.4.4.patch
===================================================================
--- genpatches-2.6/trunk/3.4/1003_linux-3.4.4.patch (rev 0)
+++ genpatches-2.6/trunk/3.4/1003_linux-3.4.4.patch 2012-06-22 22:57:51 UTC (rev 2168)
@@ -0,0 +1,1804 @@
+diff --git a/Makefile b/Makefile
+index a0804c6..058320d 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,6 +1,6 @@
+ VERSION = 3
+ PATCHLEVEL = 4
+-SUBLEVEL = 3
++SUBLEVEL = 4
+ EXTRAVERSION =
+ NAME = Saber-toothed Squirrel
+
+diff --git a/arch/arm/mach-imx/crm-regs-imx5.h b/arch/arm/mach-imx/crm-regs-imx5.h
+index 5e11ba7..5e3f1f0 100644
+--- a/arch/arm/mach-imx/crm-regs-imx5.h
++++ b/arch/arm/mach-imx/crm-regs-imx5.h
+@@ -23,7 +23,7 @@
+ #define MX53_DPLL1_BASE MX53_IO_ADDRESS(MX53_PLL1_BASE_ADDR)
+ #define MX53_DPLL2_BASE MX53_IO_ADDRESS(MX53_PLL2_BASE_ADDR)
+ #define MX53_DPLL3_BASE MX53_IO_ADDRESS(MX53_PLL3_BASE_ADDR)
+-#define MX53_DPLL4_BASE MX53_IO_ADDRESS(MX53_PLL3_BASE_ADDR)
++#define MX53_DPLL4_BASE MX53_IO_ADDRESS(MX53_PLL4_BASE_ADDR)
+
+ /* PLL Register Offsets */
+ #define MXC_PLL_DP_CTL 0x00
+diff --git a/arch/arm/mach-imx/hotplug.c b/arch/arm/mach-imx/hotplug.c
+index 89493ab..20ed2d5 100644
+--- a/arch/arm/mach-imx/hotplug.c
++++ b/arch/arm/mach-imx/hotplug.c
+@@ -12,6 +12,7 @@
+
+ #include <linux/errno.h>
+ #include <asm/cacheflush.h>
++#include <asm/cp15.h>
+ #include <mach/common.h>
+
+ int platform_cpu_kill(unsigned int cpu)
+@@ -19,6 +20,44 @@ int platform_cpu_kill(unsigned int cpu)
+ return 1;
+ }
+
++static inline void cpu_enter_lowpower(void)
++{
++ unsigned int v;
++
++ flush_cache_all();
++ asm volatile(
++ "mcr p15, 0, %1, c7, c5, 0\n"
++ " mcr p15, 0, %1, c7, c10, 4\n"
++ /*
++ * Turn off coherency
++ */
++ " mrc p15, 0, %0, c1, c0, 1\n"
++ " bic %0, %0, %3\n"
++ " mcr p15, 0, %0, c1, c0, 1\n"
++ " mrc p15, 0, %0, c1, c0, 0\n"
++ " bic %0, %0, %2\n"
++ " mcr p15, 0, %0, c1, c0, 0\n"
++ : "=&r" (v)
++ : "r" (0), "Ir" (CR_C), "Ir" (0x40)
++ : "cc");
++}
++
++static inline void cpu_leave_lowpower(void)
++{
++ unsigned int v;
++
++ asm volatile(
++ "mrc p15, 0, %0, c1, c0, 0\n"
++ " orr %0, %0, %1\n"
++ " mcr p15, 0, %0, c1, c0, 0\n"
++ " mrc p15, 0, %0, c1, c0, 1\n"
++ " orr %0, %0, %2\n"
++ " mcr p15, 0, %0, c1, c0, 1\n"
++ : "=&r" (v)
++ : "Ir" (CR_C), "Ir" (0x40)
++ : "cc");
++}
++
+ /*
+ * platform-specific code to shutdown a CPU
+ *
+@@ -26,9 +65,10 @@ int platform_cpu_kill(unsigned int cpu)
+ */
+ void platform_cpu_die(unsigned int cpu)
+ {
+- flush_cache_all();
++ cpu_enter_lowpower();
+ imx_enable_cpu(cpu, false);
+ cpu_do_idle();
++ cpu_leave_lowpower();
+
+ /* We should never return from idle */
+ panic("cpu %d unexpectedly exit from shutdown\n", cpu);
+diff --git a/arch/arm/mach-imx/mach-mx21ads.c b/arch/arm/mach-imx/mach-mx21ads.c
+index e432d4a..4460d25 100644
+--- a/arch/arm/mach-imx/mach-mx21ads.c
++++ b/arch/arm/mach-imx/mach-mx21ads.c
+@@ -32,7 +32,7 @@
+ * Memory-mapped I/O on MX21ADS base board
+ */
+ #define MX21ADS_MMIO_BASE_ADDR 0xf5000000
+-#define MX21ADS_MMIO_SIZE SZ_16M
++#define MX21ADS_MMIO_SIZE 0xc00000
+
+ #define MX21ADS_REG_ADDR(offset) (void __force __iomem *) \
+ (MX21ADS_MMIO_BASE_ADDR + (offset))
+diff --git a/arch/powerpc/include/asm/hw_irq.h b/arch/powerpc/include/asm/hw_irq.h
+index 51010bf..102abd6 100644
+--- a/arch/powerpc/include/asm/hw_irq.h
++++ b/arch/powerpc/include/asm/hw_irq.h
+@@ -99,6 +99,9 @@ static inline void hard_irq_disable(void)
+ get_paca()->irq_happened |= PACA_IRQ_HARD_DIS;
+ }
+
++/* include/linux/interrupt.h needs hard_irq_disable to be a macro */
++#define hard_irq_disable hard_irq_disable
++
+ /*
+ * This is called by asynchronous interrupts to conditionally
+ * re-enable hard interrupts when soft-disabled after having
+diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
+index 6c7f1e8..40edfc3 100644
+--- a/arch/x86/xen/enlighten.c
++++ b/arch/x86/xen/enlighten.c
+@@ -207,6 +207,9 @@ static void __init xen_banner(void)
+ xen_feature(XENFEAT_mmu_pt_update_preserve_ad) ? " (preserve-AD)" : "");
+ }
+
++#define CPUID_THERM_POWER_LEAF 6
++#define APERFMPERF_PRESENT 0
++
+ static __read_mostly unsigned int cpuid_leaf1_edx_mask = ~0;
+ static __read_mostly unsigned int cpuid_leaf1_ecx_mask = ~0;
+
+@@ -240,6 +243,11 @@ static void xen_cpuid(unsigned int *ax, unsigned int *bx,
+ *dx = cpuid_leaf5_edx_val;
+ return;
+
++ case CPUID_THERM_POWER_LEAF:
++ /* Disabling APERFMPERF for kernel usage */
++ maskecx = ~(1 << APERFMPERF_PRESENT);
++ break;
++
+ case 0xb:
+ /* Suppress extended topology stuff */
+ maskebx = 0;
+diff --git a/drivers/char/hw_random/atmel-rng.c b/drivers/char/hw_random/atmel-rng.c
+index 6289f0e..731c904 100644
+--- a/drivers/char/hw_random/atmel-rng.c
++++ b/drivers/char/hw_random/atmel-rng.c
+@@ -34,7 +34,7 @@ static int atmel_trng_read(struct hwrng *rng, void *buf, size_t max,
+ u32 *data = buf;
+
+ /* data ready? */
+- if (readl(trng->base + TRNG_ODATA) & 1) {
++ if (readl(trng->base + TRNG_ISR) & 1) {
+ *data = readl(trng->base + TRNG_ODATA);
+ /*
+ ensure data ready is only set again AFTER the next data
+diff --git a/drivers/edac/i7core_edac.c b/drivers/edac/i7core_edac.c
+index 85226cc..0fe2277 100644
+--- a/drivers/edac/i7core_edac.c
++++ b/drivers/edac/i7core_edac.c
+@@ -1932,12 +1932,6 @@ static int i7core_mce_check_error(struct notifier_block *nb, unsigned long val,
+ if (mce->bank != 8)
+ return NOTIFY_DONE;
+
+-#ifdef CONFIG_SMP
+- /* Only handle if it is the right mc controller */
+- if (mce->socketid != pvt->i7core_dev->socket)
+- return NOTIFY_DONE;
+-#endif
+-
+ smp_rmb();
+ if ((pvt->mce_out + 1) % MCE_LOG_LEN == pvt->mce_in) {
+ smp_wmb();
+@@ -2234,8 +2228,6 @@ static void i7core_unregister_mci(struct i7core_dev *i7core_dev)
+ if (pvt->enable_scrub)
+ disable_sdram_scrub_setting(mci);
+
+- mce_unregister_decode_chain(&i7_mce_dec);
+-
+ /* Disable EDAC polling */
+ i7core_pci_ctl_release(pvt);
+
+@@ -2336,8 +2328,6 @@ static int i7core_register_mci(struct i7core_dev *i7core_dev)
+ /* DCLK for scrub rate setting */
+ pvt->dclk_freq = get_dclk_freq();
+
+- mce_register_decode_chain(&i7_mce_dec);
+-
+ return 0;
+
+ fail0:
+@@ -2481,8 +2471,10 @@ static int __init i7core_init(void)
+
+ pci_rc = pci_register_driver(&i7core_driver);
+
+- if (pci_rc >= 0)
++ if (pci_rc >= 0) {
++ mce_register_decode_chain(&i7_mce_dec);
+ return 0;
++ }
+
+ i7core_printk(KERN_ERR, "Failed to register device with error %d.\n",
+ pci_rc);
+@@ -2498,6 +2490,7 @@ static void __exit i7core_exit(void)
+ {
+ debugf2("MC: " __FILE__ ": %s()\n", __func__);
+ pci_unregister_driver(&i7core_driver);
++ mce_unregister_decode_chain(&i7_mce_dec);
+ }
+
+ module_init(i7core_init);
+diff --git a/drivers/edac/sb_edac.c b/drivers/edac/sb_edac.c
+index a203536..0f9552d 100644
+--- a/drivers/edac/sb_edac.c
++++ b/drivers/edac/sb_edac.c
+@@ -599,7 +599,7 @@ static int get_dimm_config(const struct mem_ctl_info *mci)
+ pvt->is_close_pg = false;
+ }
+
+- pci_read_config_dword(pvt->pci_ta, RANK_CFG_A, ®);
++ pci_read_config_dword(pvt->pci_ddrio, RANK_CFG_A, ®);
+ if (IS_RDIMM_ENABLED(reg)) {
+ /* FIXME: Can also be LRDIMM */
+ debugf0("Memory is registered\n");
+@@ -1669,8 +1669,6 @@ static void sbridge_unregister_mci(struct sbridge_dev *sbridge_dev)
+ debugf0("MC: " __FILE__ ": %s(): mci = %p, dev = %p\n",
+ __func__, mci, &sbridge_dev->pdev[0]->dev);
+
+- mce_unregister_decode_chain(&sbridge_mce_dec);
+-
+ /* Remove MC sysfs nodes */
+ edac_mc_del_mc(mci->dev);
+
+@@ -1738,7 +1736,6 @@ static int sbridge_register_mci(struct sbridge_dev *sbridge_dev)
+ goto fail0;
+ }
+
+- mce_register_decode_chain(&sbridge_mce_dec);
+ return 0;
+
+ fail0:
+@@ -1867,8 +1864,10 @@ static int __init sbridge_init(void)
+
+ pci_rc = pci_register_driver(&sbridge_driver);
+
+- if (pci_rc >= 0)
++ if (pci_rc >= 0) {
++ mce_register_decode_chain(&sbridge_mce_dec);
+ return 0;
++ }
+
+ sbridge_printk(KERN_ERR, "Failed to register device with error %d.\n",
+ pci_rc);
+@@ -1884,6 +1883,7 @@ static void __exit sbridge_exit(void)
+ {
+ debugf2("MC: " __FILE__ ": %s()\n", __func__);
+ pci_unregister_driver(&sbridge_driver);
++ mce_unregister_decode_chain(&sbridge_mce_dec);
+ }
+
+ module_init(sbridge_init);
+diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
+index 1d19408..6862421 100644
+--- a/drivers/gpu/drm/i915/intel_dp.c
++++ b/drivers/gpu/drm/i915/intel_dp.c
+@@ -368,7 +368,7 @@ intel_dp_aux_ch(struct intel_dp *intel_dp,
+ int recv_bytes;
+ uint32_t status;
+ uint32_t aux_clock_divider;
+- int try, precharge = 5;
++ int try, precharge;
+
+ intel_dp_check_edp(intel_dp);
+ /* The clock divider is based off the hrawclk,
+@@ -388,6 +388,11 @@ intel_dp_aux_ch(struct intel_dp *intel_dp,
+ else
+ aux_clock_divider = intel_hrawclk(dev) / 2;
+
++ if (IS_GEN6(dev))
++ precharge = 3;
++ else
++ precharge = 5;
++
+ /* Try to wait for any previous AUX channel activity */
+ for (try = 0; try < 3; try++) {
+ status = I915_READ(ch_ctl);
+diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c
+index 51e8d08..e72c03f 100644
+--- a/drivers/gpu/drm/radeon/evergreen.c
++++ b/drivers/gpu/drm/radeon/evergreen.c
+@@ -2210,6 +2210,9 @@ static void evergreen_gpu_init(struct radeon_device *rdev)
+ smx_dc_ctl0 |= NUMBER_OF_SETS(rdev->config.evergreen.sx_num_of_sets);
+ WREG32(SMX_DC_CTL0, smx_dc_ctl0);
+
++ if (rdev->family <= CHIP_SUMO2)
++ WREG32(SMX_SAR_CTL0, 0x00010000);
++
+ WREG32(SX_EXPORT_BUFFER_SIZES, (COLOR_BUFFER_SIZE((rdev->config.evergreen.sx_max_export_size / 4) - 1) |
+ POSITION_BUFFER_SIZE((rdev->config.evergreen.sx_max_export_pos_size / 4) - 1) |
+ SMX_BUFFER_SIZE((rdev->config.evergreen.sx_max_export_smx_size / 4) - 1)));
+diff --git a/drivers/gpu/drm/radeon/evergreend.h b/drivers/gpu/drm/radeon/evergreend.h
+index a5b88aa..f62ccd3 100644
+--- a/drivers/gpu/drm/radeon/evergreend.h
++++ b/drivers/gpu/drm/radeon/evergreend.h
+@@ -273,6 +273,7 @@
+ #define SCRATCH_UMSK 0x8540
+ #define SCRATCH_ADDR 0x8544
+
++#define SMX_SAR_CTL0 0xA008
+ #define SMX_DC_CTL0 0xA020
+ #define USE_HASH_FUNCTION (1 << 0)
+ #define NUMBER_OF_SETS(x) ((x) << 1)
+diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
+index c8187c4..b1ff9cc 100644
+--- a/drivers/gpu/drm/radeon/r600.c
++++ b/drivers/gpu/drm/radeon/r600.c
+@@ -1906,6 +1906,7 @@ void r600_gpu_init(struct radeon_device *rdev)
+ WREG32(PA_CL_ENHANCE, (CLIP_VTX_REORDER_ENA |
+ NUM_CLIP_SEQ(3)));
+ WREG32(PA_SC_ENHANCE, FORCE_EOV_MAX_CLK_CNT(4095));
++ WREG32(VC_ENHANCE, 0);
+ }
+
+
+diff --git a/drivers/gpu/drm/radeon/r600d.h b/drivers/gpu/drm/radeon/r600d.h
+index 59f9c99..12ceb82 100644
+--- a/drivers/gpu/drm/radeon/r600d.h
++++ b/drivers/gpu/drm/radeon/r600d.h
+@@ -483,6 +483,7 @@
+ #define TC_L2_SIZE(x) ((x)<<5)
+ #define L2_DISABLE_LATE_HIT (1<<9)
+
++#define VC_ENHANCE 0x9714
+
+ #define VGT_CACHE_INVALIDATION 0x88C4
+ #define CACHE_INVALIDATION(x) ((x)<<0)
+diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c
+index 80a292b..591040b 100644
+--- a/drivers/gpu/drm/radeon/rv770.c
++++ b/drivers/gpu/drm/radeon/rv770.c
+@@ -782,6 +782,9 @@ static void rv770_gpu_init(struct radeon_device *rdev)
+ ACK_FLUSH_CTL(3) |
+ SYNC_FLUSH_CTL));
+
++ if (rdev->family != CHIP_RV770)
++ WREG32(SMX_SAR_CTL0, 0x00003f3f);
++
+ db_debug3 = RREG32(DB_DEBUG3);
+ db_debug3 &= ~DB_CLK_OFF_DELAY(0x1f);
+ switch (rdev->family) {
+@@ -960,7 +963,7 @@ static void rv770_gpu_init(struct radeon_device *rdev)
+
+ WREG32(PA_CL_ENHANCE, (CLIP_VTX_REORDER_ENA |
+ NUM_CLIP_SEQ(3)));
+-
++ WREG32(VC_ENHANCE, 0);
+ }
+
+ void r700_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc)
+diff --git a/drivers/gpu/drm/radeon/rv770d.h b/drivers/gpu/drm/radeon/rv770d.h
+index 7538092..7095a71 100644
+--- a/drivers/gpu/drm/radeon/rv770d.h
++++ b/drivers/gpu/drm/radeon/rv770d.h
+@@ -208,6 +208,7 @@
+ #define SCRATCH_UMSK 0x8540
+ #define SCRATCH_ADDR 0x8544
+
++#define SMX_SAR_CTL0 0xA008
+ #define SMX_DC_CTL0 0xA020
+ #define USE_HASH_FUNCTION (1 << 0)
+ #define CACHE_DEPTH(x) ((x) << 1)
+@@ -307,6 +308,8 @@
+ #define TCP_CNTL 0x9610
+ #define TCP_CHAN_STEER 0x9614
+
++#define VC_ENHANCE 0x9714
++
+ #define VGT_CACHE_INVALIDATION 0x88C4
+ #define CACHE_INVALIDATION(x) ((x)<<0)
+ #define VC_ONLY 0
+diff --git a/drivers/gpu/drm/sis/sis_drv.c b/drivers/gpu/drm/sis/sis_drv.c
+index 30d98d1..dd14cd1 100644
+--- a/drivers/gpu/drm/sis/sis_drv.c
++++ b/drivers/gpu/drm/sis/sis_drv.c
+@@ -47,9 +47,9 @@ static int sis_driver_load(struct drm_device *dev, unsigned long chipset)
+ if (dev_priv == NULL)
+ return -ENOMEM;
+
++ idr_init(&dev_priv->object_idr);
+ dev->dev_private = (void *)dev_priv;
+ dev_priv->chipset = chipset;
+- idr_init(&dev->object_name_idr);
+
+ return 0;
+ }
+diff --git a/drivers/gpu/drm/udl/udl_drv.c b/drivers/gpu/drm/udl/udl_drv.c
+index 5367390..08eff0d 100644
+--- a/drivers/gpu/drm/udl/udl_drv.c
++++ b/drivers/gpu/drm/udl/udl_drv.c
+@@ -13,8 +13,21 @@
+
+ static struct drm_driver driver;
+
++/*
++ * There are many DisplayLink-based graphics products, all with unique PIDs.
++ * So we match on DisplayLink's VID + Vendor-Defined Interface Class (0xff)
++ * We also require a match on SubClass (0x00) and Protocol (0x00),
++ * which is compatible with all known USB 2.0 era graphics chips and firmware,
++ * but allows DisplayLink to increment those for any future incompatible chips
++ */
+ static struct usb_device_id id_table[] = {
+- {.idVendor = 0x17e9, .match_flags = USB_DEVICE_ID_MATCH_VENDOR,},
++ {.idVendor = 0x17e9, .bInterfaceClass = 0xff,
++ .bInterfaceSubClass = 0x00,
++ .bInterfaceProtocol = 0x00,
++ .match_flags = USB_DEVICE_ID_MATCH_VENDOR |
++ USB_DEVICE_ID_MATCH_INT_CLASS |
++ USB_DEVICE_ID_MATCH_INT_SUBCLASS |
++ USB_DEVICE_ID_MATCH_INT_PROTOCOL,},
+ {},
+ };
+ MODULE_DEVICE_TABLE(usb, id_table);
+diff --git a/drivers/gpu/drm/via/via_map.c b/drivers/gpu/drm/via/via_map.c
+index 1f18225..c126182 100644
+--- a/drivers/gpu/drm/via/via_map.c
++++ b/drivers/gpu/drm/via/via_map.c
+@@ -100,12 +100,11 @@ int via_driver_load(struct drm_device *dev, unsigned long chipset)
+ if (dev_priv == NULL)
+ return -ENOMEM;
+
++ idr_init(&dev_priv->object_idr);
+ dev->dev_private = (void *)dev_priv;
+
+ dev_priv->chipset = chipset;
+
+- idr_init(&dev->object_name_idr);
+-
+ pci_set_master(dev->pdev);
+
+ ret = drm_vblank_init(dev, 1);
+diff --git a/drivers/net/ethernet/intel/e1000e/82571.c b/drivers/net/ethernet/intel/e1000e/82571.c
+index b3fdc69..c6d95f2 100644
+--- a/drivers/net/ethernet/intel/e1000e/82571.c
++++ b/drivers/net/ethernet/intel/e1000e/82571.c
+@@ -2061,8 +2061,9 @@ const struct e1000_info e1000_82574_info = {
+ | FLAG_HAS_SMART_POWER_DOWN
+ | FLAG_HAS_AMT
+ | FLAG_HAS_CTRLEXT_ON_LOAD,
+- .flags2 = FLAG2_CHECK_PHY_HANG
++ .flags2 = FLAG2_CHECK_PHY_HANG
+ | FLAG2_DISABLE_ASPM_L0S
++ | FLAG2_DISABLE_ASPM_L1
+ | FLAG2_NO_DISABLE_RX,
+ .pba = 32,
+ .max_hw_frame_size = DEFAULT_JUMBO,
+diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c
+index 9520a6a..00e961e 100644
+--- a/drivers/net/ethernet/intel/e1000e/netdev.c
++++ b/drivers/net/ethernet/intel/e1000e/netdev.c
+@@ -5293,14 +5293,6 @@ static int e1000_change_mtu(struct net_device *netdev, int new_mtu)
+ return -EINVAL;
+ }
+
+- /* 82573 Errata 17 */
+- if (((adapter->hw.mac.type == e1000_82573) ||
+- (adapter->hw.mac.type == e1000_82574)) &&
+- (max_frame > ETH_FRAME_LEN + ETH_FCS_LEN)) {
+- adapter->flags2 |= FLAG2_DISABLE_ASPM_L1;
+- e1000e_disable_aspm(adapter->pdev, PCIE_LINK_STATE_L1);
+- }
+-
+ while (test_and_set_bit(__E1000_RESETTING, &adapter->state))
+ usleep_range(1000, 2000);
+ /* e1000e_down -> e1000e_reset dependent on max_frame_size & mtu */
+diff --git a/drivers/net/wireless/iwlwifi/iwl-6000.c b/drivers/net/wireless/iwlwifi/iwl-6000.c
+index 9f71b85..c0cfa4e 100644
+--- a/drivers/net/wireless/iwlwifi/iwl-6000.c
++++ b/drivers/net/wireless/iwlwifi/iwl-6000.c
+@@ -49,17 +49,20 @@
+ #define IWL6000_UCODE_API_MAX 6
+ #define IWL6050_UCODE_API_MAX 5
+ #define IWL6000G2_UCODE_API_MAX 6
++#define IWL6035_UCODE_API_MAX 6
+
+ /* Oldest version we won't warn about */
+ #define IWL6000_UCODE_API_OK 4
+ #define IWL6000G2_UCODE_API_OK 5
+ #define IWL6050_UCODE_API_OK 5
+ #define IWL6000G2B_UCODE_API_OK 6
++#define IWL6035_UCODE_API_OK 6
+
+ /* Lowest firmware API version supported */
+ #define IWL6000_UCODE_API_MIN 4
+ #define IWL6050_UCODE_API_MIN 4
+-#define IWL6000G2_UCODE_API_MIN 4
++#define IWL6000G2_UCODE_API_MIN 5
++#define IWL6035_UCODE_API_MIN 6
+
+ #define IWL6000_FW_PRE "iwlwifi-6000-"
+ #define IWL6000_MODULE_FIRMWARE(api) IWL6000_FW_PRE __stringify(api) ".ucode"
+@@ -425,9 +428,25 @@ const struct iwl_cfg iwl6030_2bg_cfg = {
+ IWL_DEVICE_6030,
+ };
+
++#define IWL_DEVICE_6035 \
++ .fw_name_pre = IWL6030_FW_PRE, \
++ .ucode_api_max = IWL6035_UCODE_API_MAX, \
++ .ucode_api_ok = IWL6035_UCODE_API_OK, \
++ .ucode_api_min = IWL6035_UCODE_API_MIN, \
++ .max_inst_size = IWL60_RTC_INST_SIZE, \
++ .max_data_size = IWL60_RTC_DATA_SIZE, \
++ .eeprom_ver = EEPROM_6030_EEPROM_VERSION, \
++ .eeprom_calib_ver = EEPROM_6030_TX_POWER_VERSION, \
++ .lib = &iwl6030_lib, \
++ .base_params = &iwl6000_g2_base_params, \
++ .bt_params = &iwl6000_bt_params, \
++ .need_temp_offset_calib = true, \
++ .led_mode = IWL_LED_RF_STATE, \
++ .adv_pm = true
++
+ const struct iwl_cfg iwl6035_2agn_cfg = {
+ .name = "Intel(R) Centrino(R) Advanced-N 6235 AGN",
+- IWL_DEVICE_6030,
++ IWL_DEVICE_6035,
+ .ht_params = &iwl6000_ht_params,
+ };
+
+diff --git a/drivers/net/wireless/iwlwifi/iwl-eeprom.c b/drivers/net/wireless/iwlwifi/iwl-eeprom.c
+index 23cea42..79dddc4 100644
+--- a/drivers/net/wireless/iwlwifi/iwl-eeprom.c
++++ b/drivers/net/wireless/iwlwifi/iwl-eeprom.c
+@@ -513,28 +513,28 @@ static int iwl_find_otp_image(struct iwl_trans *trans,
+ * iwl_get_max_txpower_avg - get the highest tx power from all chains.
+ * find the highest tx power from all chains for the channel
+ */
+-static s8 iwl_get_max_txpower_avg(const struct iwl_cfg *cfg,
++static s8 iwl_get_max_txpower_avg(struct iwl_priv *priv,
+ struct iwl_eeprom_enhanced_txpwr *enhanced_txpower,
+ int element, s8 *max_txpower_in_half_dbm)
+ {
+ s8 max_txpower_avg = 0; /* (dBm) */
+
+ /* Take the highest tx power from any valid chains */
+- if ((cfg->valid_tx_ant & ANT_A) &&
++ if ((hw_params(priv).valid_tx_ant & ANT_A) &&
+ (enhanced_txpower[element].chain_a_max > max_txpower_avg))
+ max_txpower_avg = enhanced_txpower[element].chain_a_max;
+- if ((cfg->valid_tx_ant & ANT_B) &&
++ if ((hw_params(priv).valid_tx_ant & ANT_B) &&
+ (enhanced_txpower[element].chain_b_max > max_txpower_avg))
+ max_txpower_avg = enhanced_txpower[element].chain_b_max;
+- if ((cfg->valid_tx_ant & ANT_C) &&
++ if ((hw_params(priv).valid_tx_ant & ANT_C) &&
+ (enhanced_txpower[element].chain_c_max > max_txpower_avg))
+ max_txpower_avg = enhanced_txpower[element].chain_c_max;
+- if (((cfg->valid_tx_ant == ANT_AB) |
+- (cfg->valid_tx_ant == ANT_BC) |
+- (cfg->valid_tx_ant == ANT_AC)) &&
++ if (((hw_params(priv).valid_tx_ant == ANT_AB) |
++ (hw_params(priv).valid_tx_ant == ANT_BC) |
++ (hw_params(priv).valid_tx_ant == ANT_AC)) &&
+ (enhanced_txpower[element].mimo2_max > max_txpower_avg))
+ max_txpower_avg = enhanced_txpower[element].mimo2_max;
+- if ((cfg->valid_tx_ant == ANT_ABC) &&
++ if ((hw_params(priv).valid_tx_ant == ANT_ABC) &&
+ (enhanced_txpower[element].mimo3_max > max_txpower_avg))
+ max_txpower_avg = enhanced_txpower[element].mimo3_max;
+
+@@ -637,7 +637,7 @@ static void iwl_eeprom_enhanced_txpower(struct iwl_priv *priv)
+ ((txp->delta_20_in_40 & 0xf0) >> 4),
+ (txp->delta_20_in_40 & 0x0f));
+
+- max_txp_avg = iwl_get_max_txpower_avg(cfg(priv), txp_array, idx,
++ max_txp_avg = iwl_get_max_txpower_avg(priv, txp_array, idx,
+ &max_txp_avg_halfdbm);
+
+ /*
+diff --git a/drivers/net/wireless/iwlwifi/iwl-trans-pcie-int.h b/drivers/net/wireless/iwlwifi/iwl-trans-pcie-int.h
+index 1c2fe87..3b844b7 100644
+--- a/drivers/net/wireless/iwlwifi/iwl-trans-pcie-int.h
++++ b/drivers/net/wireless/iwlwifi/iwl-trans-pcie-int.h
+@@ -342,7 +342,7 @@ void iwl_trans_pcie_tx_agg_setup(struct iwl_trans *trans,
+ enum iwl_rxon_context_id ctx,
+ int sta_id, int tid, int frame_limit, u16 ssn);
+ void iwlagn_txq_free_tfd(struct iwl_trans *trans, struct iwl_tx_queue *txq,
+- int index, enum dma_data_direction dma_dir);
++ enum dma_data_direction dma_dir);
+ int iwl_tx_queue_reclaim(struct iwl_trans *trans, int txq_id, int index,
+ struct sk_buff_head *skbs);
+ int iwl_queue_space(const struct iwl_queue *q);
+diff --git a/drivers/net/wireless/iwlwifi/iwl-trans-pcie-tx.c b/drivers/net/wireless/iwlwifi/iwl-trans-pcie-tx.c
+index e92972f..d7964b1 100644
+--- a/drivers/net/wireless/iwlwifi/iwl-trans-pcie-tx.c
++++ b/drivers/net/wireless/iwlwifi/iwl-trans-pcie-tx.c
+@@ -237,32 +237,38 @@ static void iwlagn_unmap_tfd(struct iwl_trans *trans, struct iwl_cmd_meta *meta,
+ for (i = 1; i < num_tbs; i++)
+ dma_unmap_single(trans->dev, iwl_tfd_tb_get_addr(tfd, i),
+ iwl_tfd_tb_get_len(tfd, i), dma_dir);
++
++ tfd->num_tbs = 0;
+ }
+
+ /**
+ * iwlagn_txq_free_tfd - Free all chunks referenced by TFD [txq->q.read_ptr]
+ * @trans - transport private data
+ * @txq - tx queue
+- * @index - the index of the TFD to be freed
+- *@dma_dir - the direction of the DMA mapping
++ * @dma_dir - the direction of the DMA mapping
+ *
+ * Does NOT advance any TFD circular buffer read/write indexes
+ * Does NOT free the TFD itself (which is within circular buffer)
+ */
+ void iwlagn_txq_free_tfd(struct iwl_trans *trans, struct iwl_tx_queue *txq,
+- int index, enum dma_data_direction dma_dir)
++ enum dma_data_direction dma_dir)
+ {
+ struct iwl_tfd *tfd_tmp = txq->tfds;
+
++ /* rd_ptr is bounded by n_bd and idx is bounded by n_window */
++ int rd_ptr = txq->q.read_ptr;
++ int idx = get_cmd_index(&txq->q, rd_ptr);
++
+ lockdep_assert_held(&txq->lock);
+
+- iwlagn_unmap_tfd(trans, &txq->meta[index], &tfd_tmp[index], dma_dir);
++ /* We have only q->n_window txq->entries, but we use q->n_bd tfds */
++ iwlagn_unmap_tfd(trans, &txq->meta[idx], &tfd_tmp[rd_ptr], dma_dir);
+
+ /* free SKB */
+ if (txq->skbs) {
+ struct sk_buff *skb;
+
+- skb = txq->skbs[index];
++ skb = txq->skbs[idx];
+
+ /* Can be called from irqs-disabled context
+ * If skb is not NULL, it means that the whole queue is being
+@@ -270,7 +276,7 @@ void iwlagn_txq_free_tfd(struct iwl_trans *trans, struct iwl_tx_queue *txq,
+ */
+ if (skb) {
+ iwl_op_mode_free_skb(trans->op_mode, skb);
+- txq->skbs[index] = NULL;
++ txq->skbs[idx] = NULL;
+ }
+ }
+ }
+@@ -1100,7 +1106,7 @@ int iwl_tx_queue_reclaim(struct iwl_trans *trans, int txq_id, int index,
+
+ iwlagn_txq_inval_byte_cnt_tbl(trans, txq);
+
+- iwlagn_txq_free_tfd(trans, txq, txq->q.read_ptr, DMA_TO_DEVICE);
++ iwlagn_txq_free_tfd(trans, txq, DMA_TO_DEVICE);
+ freed++;
+ }
+ return freed;
+diff --git a/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c b/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c
+index 66df016..6eac984 100644
+--- a/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c
++++ b/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c
+@@ -430,9 +430,7 @@ static void iwl_tx_queue_unmap(struct iwl_trans *trans, int txq_id)
+
+ spin_lock_bh(&txq->lock);
+ while (q->write_ptr != q->read_ptr) {
+- /* The read_ptr needs to bound by q->n_window */
+- iwlagn_txq_free_tfd(trans, txq, get_cmd_index(q, q->read_ptr),
+- dma_dir);
++ iwlagn_txq_free_tfd(trans, txq, dma_dir);
+ q->read_ptr = iwl_queue_inc_wrap(q->read_ptr, q->n_bd);
+ }
+ spin_unlock_bh(&txq->lock);
+diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
+index 111569c..f597a1a 100644
+--- a/drivers/pci/pci.c
++++ b/drivers/pci/pci.c
+@@ -1743,6 +1743,11 @@ int pci_prepare_to_sleep(struct pci_dev *dev)
+ if (target_state == PCI_POWER_ERROR)
+ return -EIO;
+
++ /* Some devices mustn't be in D3 during system sleep */
++ if (target_state == PCI_D3hot &&
++ (dev->dev_flags & PCI_DEV_FLAGS_NO_D3_DURING_SLEEP))
++ return 0;
++
+ pci_enable_wake(dev, target_state, device_may_wakeup(&dev->dev));
+
+ error = pci_set_power_state(dev, target_state);
+diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
+index 4bf7102..bf33f0b 100644
+--- a/drivers/pci/quirks.c
++++ b/drivers/pci/quirks.c
+@@ -2917,6 +2917,32 @@ static void __devinit disable_igfx_irq(struct pci_dev *dev)
+ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x0102, disable_igfx_irq);
+ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x010a, disable_igfx_irq);
+
++/*
++ * The Intel 6 Series/C200 Series chipset's EHCI controllers on many
++ * ASUS motherboards will cause memory corruption or a system crash
++ * if they are in D3 while the system is put into S3 sleep.
++ */
++static void __devinit asus_ehci_no_d3(struct pci_dev *dev)
++{
++ const char *sys_info;
++ static const char good_Asus_board[] = "P8Z68-V";
++
++ if (dev->dev_flags & PCI_DEV_FLAGS_NO_D3_DURING_SLEEP)
++ return;
++ if (dev->subsystem_vendor != PCI_VENDOR_ID_ASUSTEK)
++ return;
++ sys_info = dmi_get_system_info(DMI_BOARD_NAME);
++ if (sys_info && memcmp(sys_info, good_Asus_board,
++ sizeof(good_Asus_board) - 1) == 0)
++ return;
++
++ dev_info(&dev->dev, "broken D3 during system sleep on ASUS\n");
++ dev->dev_flags |= PCI_DEV_FLAGS_NO_D3_DURING_SLEEP;
++ device_set_wakeup_capable(&dev->dev, false);
++}
++DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1c26, asus_ehci_no_d3);
++DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1c2d, asus_ehci_no_d3);
++
+ static void pci_do_fixups(struct pci_dev *dev, struct pci_fixup *f,
+ struct pci_fixup *end)
+ {
+diff --git a/drivers/remoteproc/omap_remoteproc.c b/drivers/remoteproc/omap_remoteproc.c
+index 69425c4..de138e3 100644
+--- a/drivers/remoteproc/omap_remoteproc.c
++++ b/drivers/remoteproc/omap_remoteproc.c
+@@ -182,7 +182,7 @@ static int __devinit omap_rproc_probe(struct platform_device *pdev)
+
+ ret = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32));
+ if (ret) {
+- dev_err(pdev->dev.parent, "dma_set_coherent_mask: %d\n", ret);
++ dev_err(&pdev->dev, "dma_set_coherent_mask: %d\n", ret);
+ return ret;
+ }
+
+diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c
+index e756a0d..7591b97 100644
+--- a/drivers/remoteproc/remoteproc_core.c
++++ b/drivers/remoteproc/remoteproc_core.c
+@@ -247,7 +247,7 @@ rproc_load_segments(struct rproc *rproc, const u8 *elf_data, size_t len)
+ }
+
+ if (offset + filesz > len) {
+- dev_err(dev, "truncated fw: need 0x%x avail 0x%x\n",
++ dev_err(dev, "truncated fw: need 0x%x avail 0x%zx\n",
+ offset + filesz, len);
+ ret = -EINVAL;
+ break;
+@@ -934,7 +934,7 @@ static void rproc_resource_cleanup(struct rproc *rproc)
+ unmapped = iommu_unmap(rproc->domain, entry->da, entry->len);
+ if (unmapped != entry->len) {
+ /* nothing much to do besides complaining */
+- dev_err(dev, "failed to unmap %u/%u\n", entry->len,
++ dev_err(dev, "failed to unmap %u/%zu\n", entry->len,
+ unmapped);
+ }
+
+@@ -1020,7 +1020,7 @@ static int rproc_fw_boot(struct rproc *rproc, const struct firmware *fw)
+
+ ehdr = (struct elf32_hdr *)fw->data;
+
+- dev_info(dev, "Booting fw image %s, size %d\n", name, fw->size);
++ dev_info(dev, "Booting fw image %s, size %zd\n", name, fw->size);
+
+ /*
+ * if enabling an IOMMU isn't relevant for this rproc, this is
+@@ -1041,8 +1041,10 @@ static int rproc_fw_boot(struct rproc *rproc, const struct firmware *fw)
+
+ /* look for the resource table */
+ table = rproc_find_rsc_table(rproc, fw->data, fw->size, &tablesz);
+- if (!table)
++ if (!table) {
++ ret = -EINVAL;
+ goto clean_up;
++ }
+
+ /* handle fw resources which are required to boot rproc */
+ ret = rproc_handle_boot_rsc(rproc, table, tablesz);
+diff --git a/drivers/scsi/mpt2sas/mpt2sas_base.c b/drivers/scsi/mpt2sas/mpt2sas_base.c
+index 1808478..3f03342 100644
+--- a/drivers/scsi/mpt2sas/mpt2sas_base.c
++++ b/drivers/scsi/mpt2sas/mpt2sas_base.c
+@@ -1785,7 +1785,7 @@ static inline void _base_writeq(__u64 b, volatile void __iomem *addr,
+ static inline u8
+ _base_get_msix_index(struct MPT2SAS_ADAPTER *ioc)
+ {
+- return ioc->cpu_msix_table[smp_processor_id()];
++ return ioc->cpu_msix_table[raw_smp_processor_id()];
+ }
+
+ /**
+diff --git a/drivers/target/target_core_alua.c b/drivers/target/target_core_alua.c
+index c7746a3..f30e124 100644
+--- a/drivers/target/target_core_alua.c
++++ b/drivers/target/target_core_alua.c
+@@ -351,9 +351,11 @@ int target_emulate_set_target_port_groups(struct se_task *task)
+
+ out:
+ transport_kunmap_data_sg(cmd);
+- task->task_scsi_status = GOOD;
+- transport_complete_task(task, 1);
+- return 0;
++ if (!rc) {
++ task->task_scsi_status = GOOD;
++ transport_complete_task(task, 1);
++ }
++ return rc;
+ }
+
+ static inline int core_alua_state_nonoptimized(
+diff --git a/drivers/tty/hvc/hvc_xen.c b/drivers/tty/hvc/hvc_xen.c
+index d3d91da..944eaeb 100644
+--- a/drivers/tty/hvc/hvc_xen.c
++++ b/drivers/tty/hvc/hvc_xen.c
+@@ -214,24 +214,24 @@ static int xen_hvm_console_init(void)
+ /* already configured */
+ if (info->intf != NULL)
+ return 0;
+-
++ /*
++ * If the toolstack (or the hypervisor) hasn't set these values, the
++ * default value is 0. Even though mfn = 0 and evtchn = 0 are
++ * theoretically correct values, in practice they never are and they
++ * mean that a legacy toolstack hasn't initialized the pv console correctly.
++ */
+ r = hvm_get_parameter(HVM_PARAM_CONSOLE_EVTCHN, &v);
+- if (r < 0) {
+- kfree(info);
+- return -ENODEV;
+- }
++ if (r < 0 || v == 0)
++ goto err;
+ info->evtchn = v;
+- hvm_get_parameter(HVM_PARAM_CONSOLE_PFN, &v);
+- if (r < 0) {
+- kfree(info);
+- return -ENODEV;
+- }
++ v = 0;
++ r = hvm_get_parameter(HVM_PARAM_CONSOLE_PFN, &v);
++ if (r < 0 || v == 0)
++ goto err;
+ mfn = v;
+ info->intf = ioremap(mfn << PAGE_SHIFT, PAGE_SIZE);
+- if (info->intf == NULL) {
+- kfree(info);
+- return -ENODEV;
+- }
++ if (info->intf == NULL)
++ goto err;
+ info->vtermno = HVC_COOKIE;
+
+ spin_lock(&xencons_lock);
+@@ -239,6 +239,9 @@ static int xen_hvm_console_init(void)
+ spin_unlock(&xencons_lock);
+
+ return 0;
++err:
++ kfree(info);
++ return -ENODEV;
+ }
+
+ static int xen_pv_console_init(void)
+diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
+index b32ccb4..640cf79 100644
+--- a/drivers/usb/class/cdc-acm.c
++++ b/drivers/usb/class/cdc-acm.c
+@@ -567,6 +567,14 @@ static int acm_port_activate(struct tty_port *port, struct tty_struct *tty)
+
+ usb_autopm_put_interface(acm->control);
+
++ /*
++ * Unthrottle device in case the TTY was closed while throttled.
++ */
++ spin_lock_irq(&acm->read_lock);
++ acm->throttled = 0;
++ acm->throttle_req = 0;
++ spin_unlock_irq(&acm->read_lock);
++
+ if (acm_submit_read_urbs(acm, GFP_KERNEL))
+ goto error_submit_read_urbs;
+
+diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c
+index 4c8321e..83d14bf 100644
+--- a/drivers/usb/class/cdc-wdm.c
++++ b/drivers/usb/class/cdc-wdm.c
+@@ -55,6 +55,15 @@ static const struct usb_device_id wdm_ids[] = {
+ .bInterfaceSubClass = 1,
+ .bInterfaceProtocol = 9, /* NOTE: CDC ECM control interface! */
+ },
++ {
++ /* Vodafone/Huawei K5005 (12d1:14c8) and similar modems */
++ .match_flags = USB_DEVICE_ID_MATCH_VENDOR |
++ USB_DEVICE_ID_MATCH_INT_INFO,
++ .idVendor = HUAWEI_VENDOR_ID,
++ .bInterfaceClass = USB_CLASS_VENDOR_SPEC,
++ .bInterfaceSubClass = 1,
++ .bInterfaceProtocol = 57, /* NOTE: CDC ECM control interface! */
++ },
+ { }
+ };
+
+diff --git a/drivers/usb/core/hcd-pci.c b/drivers/usb/core/hcd-pci.c
+index 57ed9e4..622b4a4 100644
+--- a/drivers/usb/core/hcd-pci.c
++++ b/drivers/usb/core/hcd-pci.c
+@@ -493,15 +493,6 @@ static int hcd_pci_suspend_noirq(struct device *dev)
+
+ pci_save_state(pci_dev);
+
+- /*
+- * Some systems crash if an EHCI controller is in D3 during
+- * a sleep transition. We have to leave such controllers in D0.
+- */
+- if (hcd->broken_pci_sleep) {
+- dev_dbg(dev, "Staying in PCI D0\n");
+- return retval;
+- }
+-
+ /* If the root hub is dead rather than suspended, disallow remote
+ * wakeup. usb_hc_died() should ensure that both hosts are marked as
+ * dying, so we only need to check the primary roothub.
+diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c
+index ca717da..ef116a5 100644
+--- a/drivers/usb/core/message.c
++++ b/drivers/usb/core/message.c
+@@ -1803,7 +1803,6 @@ free_interfaces:
+ intfc = cp->intf_cache[i];
+ intf->altsetting = intfc->altsetting;
+ intf->num_altsetting = intfc->num_altsetting;
+- intf->intf_assoc = find_iad(dev, cp, i);
+ kref_get(&intfc->ref);
+
+ alt = usb_altnum_to_altsetting(intf, 0);
+@@ -1816,6 +1815,8 @@ free_interfaces:
+ if (!alt)
+ alt = &intf->altsetting[0];
+
++ intf->intf_assoc =
++ find_iad(dev, cp, alt->desc.bInterfaceNumber);
+ intf->cur_altsetting = alt;
+ usb_enable_interface(dev, intf, true);
+ intf->dev.parent = &dev->dev;
+diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
+index 4a3bc5b..bb73df6 100644
+--- a/drivers/usb/host/ehci-hcd.c
++++ b/drivers/usb/host/ehci-hcd.c
+@@ -671,7 +671,9 @@ static int ehci_init(struct usb_hcd *hcd)
+ hw = ehci->async->hw;
+ hw->hw_next = QH_NEXT(ehci, ehci->async->qh_dma);
+ hw->hw_info1 = cpu_to_hc32(ehci, QH_HEAD);
++#if defined(CONFIG_PPC_PS3)
+ hw->hw_info1 |= cpu_to_hc32(ehci, (1 << 7)); /* I = 1 */
++#endif
+ hw->hw_token = cpu_to_hc32(ehci, QTD_STS_HALT);
+ hw->hw_qtd_next = EHCI_LIST_END(ehci);
+ ehci->async->qh_state = QH_STATE_LINKED;
+diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c
+index bc94d7b..1234817 100644
+--- a/drivers/usb/host/ehci-pci.c
++++ b/drivers/usb/host/ehci-pci.c
+@@ -144,14 +144,6 @@ static int ehci_pci_setup(struct usb_hcd *hcd)
+ hcd->has_tt = 1;
+ tdi_reset(ehci);
+ }
+- if (pdev->subsystem_vendor == PCI_VENDOR_ID_ASUSTEK) {
+- /* EHCI #1 or #2 on 6 Series/C200 Series chipset */
+- if (pdev->device == 0x1c26 || pdev->device == 0x1c2d) {
+- ehci_info(ehci, "broken D3 during system sleep on ASUS\n");
+- hcd->broken_pci_sleep = 1;
+- device_set_wakeup_capable(&pdev->dev, false);
+- }
+- }
+ break;
+ case PCI_VENDOR_ID_TDI:
+ if (pdev->device == PCI_DEVICE_ID_TDI_EHCI) {
+diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c
+index 497ed77..6b90824 100644
+--- a/drivers/usb/host/xhci-mem.c
++++ b/drivers/usb/host/xhci-mem.c
+@@ -793,10 +793,9 @@ static void xhci_free_tt_info(struct xhci_hcd *xhci,
+ struct xhci_virt_device *virt_dev,
+ int slot_id)
+ {
+- struct list_head *tt;
+ struct list_head *tt_list_head;
+- struct list_head *tt_next;
+- struct xhci_tt_bw_info *tt_info;
++ struct xhci_tt_bw_info *tt_info, *next;
++ bool slot_found = false;
+
+ /* If the device never made it past the Set Address stage,
+ * it may not have the real_port set correctly.
+@@ -808,34 +807,16 @@ static void xhci_free_tt_info(struct xhci_hcd *xhci,
+ }
+
+ tt_list_head = &(xhci->rh_bw[virt_dev->real_port - 1].tts);
+- if (list_empty(tt_list_head))
+- return;
+-
+- list_for_each(tt, tt_list_head) {
+- tt_info = list_entry(tt, struct xhci_tt_bw_info, tt_list);
+- if (tt_info->slot_id == slot_id)
++ list_for_each_entry_safe(tt_info, next, tt_list_head, tt_list) {
++ /* Multi-TT hubs will have more than one entry */
++ if (tt_info->slot_id == slot_id) {
++ slot_found = true;
++ list_del(&tt_info->tt_list);
++ kfree(tt_info);
++ } else if (slot_found) {
+ break;
++ }
+ }
+- /* Cautionary measure in case the hub was disconnected before we
+- * stored the TT information.
+- */
+- if (tt_info->slot_id != slot_id)
+- return;
+-
+- tt_next = tt->next;
+- tt_info = list_entry(tt, struct xhci_tt_bw_info,
+- tt_list);
+- /* Multi-TT hubs will have more than one entry */
+- do {
+- list_del(tt);
+- kfree(tt_info);
+- tt = tt_next;
+- if (list_empty(tt_list_head))
+- break;
+- tt_next = tt->next;
+- tt_info = list_entry(tt, struct xhci_tt_bw_info,
+- tt_list);
+- } while (tt_info->slot_id == slot_id);
+ }
+
+ int xhci_alloc_tt_info(struct xhci_hcd *xhci,
+@@ -1791,17 +1772,9 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci)
+ {
+ struct pci_dev *pdev = to_pci_dev(xhci_to_hcd(xhci)->self.controller);
+ struct dev_info *dev_info, *next;
+- struct list_head *tt_list_head;
+- struct list_head *tt;
+- struct list_head *endpoints;
+- struct list_head *ep, *q;
+- struct xhci_tt_bw_info *tt_info;
+- struct xhci_interval_bw_table *bwt;
+- struct xhci_virt_ep *virt_ep;
+-
+ unsigned long flags;
+ int size;
+- int i;
++ int i, j, num_ports;
+
+ /* Free the Event Ring Segment Table and the actual Event Ring */
+ size = sizeof(struct xhci_erst_entry)*(xhci->erst.num_entries);
+@@ -1858,21 +1831,22 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci)
+ }
+ spin_unlock_irqrestore(&xhci->lock, flags);
+
+- bwt = &xhci->rh_bw->bw_table;
+- for (i = 0; i < XHCI_MAX_INTERVAL; i++) {
+- endpoints = &bwt->interval_bw[i].endpoints;
+- list_for_each_safe(ep, q, endpoints) {
+- virt_ep = list_entry(ep, struct xhci_virt_ep, bw_endpoint_list);
+- list_del(&virt_ep->bw_endpoint_list);
+- kfree(virt_ep);
++ num_ports = HCS_MAX_PORTS(xhci->hcs_params1);
++ for (i = 0; i < num_ports; i++) {
++ struct xhci_interval_bw_table *bwt = &xhci->rh_bw[i].bw_table;
++ for (j = 0; j < XHCI_MAX_INTERVAL; j++) {
++ struct list_head *ep = &bwt->interval_bw[j].endpoints;
++ while (!list_empty(ep))
++ list_del_init(ep->next);
+ }
+ }
+
+- tt_list_head = &xhci->rh_bw->tts;
+- list_for_each_safe(tt, q, tt_list_head) {
+- tt_info = list_entry(tt, struct xhci_tt_bw_info, tt_list);
+- list_del(tt);
+- kfree(tt_info);
++ for (i = 0; i < num_ports; i++) {
++ struct xhci_tt_bw_info *tt, *n;
++ list_for_each_entry_safe(tt, n, &xhci->rh_bw[i].tts, tt_list) {
++ list_del(&tt->tt_list);
++ kfree(tt);
++ }
+ }
+
+ xhci->num_usb2_ports = 0;
+diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
+index 5910048..9248d49 100644
+--- a/drivers/usb/host/xhci.c
++++ b/drivers/usb/host/xhci.c
+@@ -795,8 +795,8 @@ int xhci_suspend(struct xhci_hcd *xhci)
+ command = xhci_readl(xhci, &xhci->op_regs->command);
+ command |= CMD_CSS;
+ xhci_writel(xhci, command, &xhci->op_regs->command);
+- if (handshake(xhci, &xhci->op_regs->status, STS_SAVE, 0, 10*100)) {
+- xhci_warn(xhci, "WARN: xHC CMD_CSS timeout\n");
++ if (handshake(xhci, &xhci->op_regs->status, STS_SAVE, 0, 10 * 1000)) {
++ xhci_warn(xhci, "WARN: xHC save state timeout\n");
+ spin_unlock_irq(&xhci->lock);
+ return -ETIMEDOUT;
+ }
+@@ -848,8 +848,8 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)
+ command |= CMD_CRS;
+ xhci_writel(xhci, command, &xhci->op_regs->command);
+ if (handshake(xhci, &xhci->op_regs->status,
+- STS_RESTORE, 0, 10*100)) {
+- xhci_dbg(xhci, "WARN: xHC CMD_CSS timeout\n");
++ STS_RESTORE, 0, 10 * 1000)) {
++ xhci_warn(xhci, "WARN: xHC restore state timeout\n");
+ spin_unlock_irq(&xhci->lock);
+ return -ETIMEDOUT;
+ }
+diff --git a/drivers/usb/musb/davinci.c b/drivers/usb/musb/davinci.c
+index 768b4b5..9d63ba4 100644
+--- a/drivers/usb/musb/davinci.c
++++ b/drivers/usb/musb/davinci.c
+@@ -34,6 +34,7 @@
+ #include <linux/dma-mapping.h>
+
+ #include <mach/cputype.h>
++#include <mach/hardware.h>
+
+ #include <asm/mach-types.h>
+
+diff --git a/drivers/usb/musb/davinci.h b/drivers/usb/musb/davinci.h
+index 046c844..371baa0 100644
+--- a/drivers/usb/musb/davinci.h
++++ b/drivers/usb/musb/davinci.h
+@@ -15,7 +15,7 @@
+ */
+
+ /* Integrated highspeed/otg PHY */
+-#define USBPHY_CTL_PADDR (DAVINCI_SYSTEM_MODULE_BASE + 0x34)
++#define USBPHY_CTL_PADDR 0x01c40034
+ #define USBPHY_DATAPOL BIT(11) /* (dm355) switch D+/D- */
+ #define USBPHY_PHYCLKGD BIT(8)
+ #define USBPHY_SESNDEN BIT(7) /* v(sess_end) comparator */
+@@ -27,7 +27,7 @@
+ #define USBPHY_OTGPDWN BIT(1)
+ #define USBPHY_PHYPDWN BIT(0)
+
+-#define DM355_DEEPSLEEP_PADDR (DAVINCI_SYSTEM_MODULE_BASE + 0x48)
++#define DM355_DEEPSLEEP_PADDR 0x01c40048
+ #define DRVVBUS_FORCE BIT(2)
+ #define DRVVBUS_OVERRIDE BIT(1)
+
+diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c
+index f42c29b..95918da 100644
+--- a/drivers/usb/musb/musb_gadget.c
++++ b/drivers/usb/musb/musb_gadget.c
+@@ -1232,6 +1232,7 @@ static int musb_gadget_disable(struct usb_ep *ep)
+ }
+
+ musb_ep->desc = NULL;
++ musb_ep->end_point.desc = NULL;
+
+ /* abort all pending DMA and requests */
+ nuke(musb_ep, -ESHUTDOWN);
+diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c
+index ec30f95..95de9c0 100644
+--- a/drivers/usb/serial/cp210x.c
++++ b/drivers/usb/serial/cp210x.c
+@@ -82,6 +82,7 @@ static const struct usb_device_id id_table[] = {
+ { USB_DEVICE(0x10C4, 0x8066) }, /* Argussoft In-System Programmer */
+ { USB_DEVICE(0x10C4, 0x806F) }, /* IMS USB to RS422 Converter Cable */
+ { USB_DEVICE(0x10C4, 0x807A) }, /* Crumb128 board */
++ { USB_DEVICE(0x10C4, 0x80C4) }, /* Cygnal Integrated Products, Inc., Optris infrared thermometer */
+ { USB_DEVICE(0x10C4, 0x80CA) }, /* Degree Controls Inc */
+ { USB_DEVICE(0x10C4, 0x80DD) }, /* Tracient RFID */
+ { USB_DEVICE(0x10C4, 0x80F6) }, /* Suunto sports instrument */
+diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
+index 95bba99..53e3e2c 100644
+--- a/drivers/usb/serial/ftdi_sio.c
++++ b/drivers/usb/serial/ftdi_sio.c
+@@ -737,6 +737,7 @@ static struct usb_device_id id_table_combined [] = {
+ { USB_DEVICE(TELLDUS_VID, TELLDUS_TELLSTICK_PID) },
+ { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_SERIAL_VX7_PID) },
+ { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_CT29B_PID) },
++ { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_RTS01_PID) },
+ { USB_DEVICE(FTDI_VID, FTDI_MAXSTREAM_PID) },
+ { USB_DEVICE(FTDI_VID, FTDI_PHI_FISCO_PID) },
+ { USB_DEVICE(TML_VID, TML_USB_SERIAL_PID) },
+diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h
+index f3c7c78..5661c7e 100644
+--- a/drivers/usb/serial/ftdi_sio_ids.h
++++ b/drivers/usb/serial/ftdi_sio_ids.h
+@@ -784,6 +784,7 @@
+ #define RTSYSTEMS_VID 0x2100 /* Vendor ID */
+ #define RTSYSTEMS_SERIAL_VX7_PID 0x9e52 /* Serial converter for VX-7 Radios using FT232RL */
+ #define RTSYSTEMS_CT29B_PID 0x9e54 /* CT29B Radio Cable */
++#define RTSYSTEMS_RTS01_PID 0x9e57 /* USB-RTS01 Radio Cable */
+
+
+ /*
+diff --git a/drivers/usb/serial/mct_u232.c b/drivers/usb/serial/mct_u232.c
+index 6edd261..ef4d7ad 100644
+--- a/drivers/usb/serial/mct_u232.c
++++ b/drivers/usb/serial/mct_u232.c
+@@ -317,13 +317,16 @@ static int mct_u232_set_modem_ctrl(struct usb_serial *serial,
+ MCT_U232_SET_REQUEST_TYPE,
+ 0, 0, buf, MCT_U232_SET_MODEM_CTRL_SIZE,
+ WDR_TIMEOUT);
+- if (rc < 0)
+- dev_err(&serial->dev->dev,
+- "Set MODEM CTRL 0x%x failed (error = %d)\n", mcr, rc);
++ kfree(buf);
++
+ dbg("set_modem_ctrl: state=0x%x ==> mcr=0x%x", control_state, mcr);
+
+- kfree(buf);
+- return rc;
++ if (rc < 0) {
++ dev_err(&serial->dev->dev,
++ "Set MODEM CTRL 0x%x failed (error = %d)\n", mcr, rc);
++ return rc;
++ }
++ return 0;
+ } /* mct_u232_set_modem_ctrl */
+
+ static int mct_u232_get_modem_stat(struct usb_serial *serial,
+diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c
+index c526550..62739ff 100644
+--- a/drivers/usb/serial/mos7840.c
++++ b/drivers/usb/serial/mos7840.c
+@@ -206,7 +206,7 @@ static const struct usb_device_id moschip_port_id_table[] = {
+ {} /* terminating entry */
+ };
+
+-static const struct usb_device_id moschip_id_table_combined[] __devinitconst = {
++static const struct usb_device_id moschip_id_table_combined[] = {
+ {USB_DEVICE(USB_VENDOR_ID_MOSCHIP, MOSCHIP_DEVICE_ID_7840)},
+ {USB_DEVICE(USB_VENDOR_ID_MOSCHIP, MOSCHIP_DEVICE_ID_7820)},
+ {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USO9ML2_2)},
+diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
+index f4465cc..2706d8a 100644
+--- a/drivers/usb/serial/option.c
++++ b/drivers/usb/serial/option.c
+@@ -47,6 +47,7 @@
+ /* Function prototypes */
+ static int option_probe(struct usb_serial *serial,
+ const struct usb_device_id *id);
++static void option_release(struct usb_serial *serial);
+ static int option_send_setup(struct usb_serial_port *port);
+ static void option_instat_callback(struct urb *urb);
+
+@@ -150,6 +151,7 @@ static void option_instat_callback(struct urb *urb);
+ #define HUAWEI_PRODUCT_E14AC 0x14AC
+ #define HUAWEI_PRODUCT_K3806 0x14AE
+ #define HUAWEI_PRODUCT_K4605 0x14C6
++#define HUAWEI_PRODUCT_K5005 0x14C8
+ #define HUAWEI_PRODUCT_K3770 0x14C9
+ #define HUAWEI_PRODUCT_K3771 0x14CA
+ #define HUAWEI_PRODUCT_K4510 0x14CB
+@@ -425,7 +427,7 @@ static void option_instat_callback(struct urb *urb);
+ #define SAMSUNG_VENDOR_ID 0x04e8
+ #define SAMSUNG_PRODUCT_GT_B3730 0x6889
+
+-/* YUGA products www.yuga-info.com*/
++/* YUGA products www.yuga-info.com gavin.kx@qq.com */
+ #define YUGA_VENDOR_ID 0x257A
+ #define YUGA_PRODUCT_CEM600 0x1601
+ #define YUGA_PRODUCT_CEM610 0x1602
+@@ -442,6 +444,8 @@ static void option_instat_callback(struct urb *urb);
+ #define YUGA_PRODUCT_CEU516 0x160C
+ #define YUGA_PRODUCT_CEU528 0x160D
+ #define YUGA_PRODUCT_CEU526 0x160F
++#define YUGA_PRODUCT_CEU881 0x161F
++#define YUGA_PRODUCT_CEU882 0x162F
+
+ #define YUGA_PRODUCT_CWM600 0x2601
+ #define YUGA_PRODUCT_CWM610 0x2602
+@@ -457,23 +461,26 @@ static void option_instat_callback(struct urb *urb);
+ #define YUGA_PRODUCT_CWU518 0x260B
+ #define YUGA_PRODUCT_CWU516 0x260C
+ #define YUGA_PRODUCT_CWU528 0x260D
++#define YUGA_PRODUCT_CWU581 0x260E
+ #define YUGA_PRODUCT_CWU526 0x260F
+-
+-#define YUGA_PRODUCT_CLM600 0x2601
+-#define YUGA_PRODUCT_CLM610 0x2602
+-#define YUGA_PRODUCT_CLM500 0x2603
+-#define YUGA_PRODUCT_CLM510 0x2604
+-#define YUGA_PRODUCT_CLM800 0x2605
+-#define YUGA_PRODUCT_CLM900 0x2606
+-
+-#define YUGA_PRODUCT_CLU718 0x2607
+-#define YUGA_PRODUCT_CLU716 0x2608
+-#define YUGA_PRODUCT_CLU728 0x2609
+-#define YUGA_PRODUCT_CLU726 0x260A
+-#define YUGA_PRODUCT_CLU518 0x260B
+-#define YUGA_PRODUCT_CLU516 0x260C
+-#define YUGA_PRODUCT_CLU528 0x260D
+-#define YUGA_PRODUCT_CLU526 0x260F
++#define YUGA_PRODUCT_CWU582 0x261F
++#define YUGA_PRODUCT_CWU583 0x262F
++
++#define YUGA_PRODUCT_CLM600 0x3601
++#define YUGA_PRODUCT_CLM610 0x3602
++#define YUGA_PRODUCT_CLM500 0x3603
++#define YUGA_PRODUCT_CLM510 0x3604
++#define YUGA_PRODUCT_CLM800 0x3605
++#define YUGA_PRODUCT_CLM900 0x3606
++
++#define YUGA_PRODUCT_CLU718 0x3607
++#define YUGA_PRODUCT_CLU716 0x3608
++#define YUGA_PRODUCT_CLU728 0x3609
++#define YUGA_PRODUCT_CLU726 0x360A
++#define YUGA_PRODUCT_CLU518 0x360B
++#define YUGA_PRODUCT_CLU516 0x360C
++#define YUGA_PRODUCT_CLU528 0x360D
++#define YUGA_PRODUCT_CLU526 0x360F
+
+ /* Viettel products */
+ #define VIETTEL_VENDOR_ID 0x2262
+@@ -666,6 +673,11 @@ static const struct usb_device_id option_ids[] = {
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3806, 0xff, 0xff, 0xff) },
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4605, 0xff, 0xff, 0xff),
+ .driver_info = (kernel_ulong_t) &huawei_cdc12_blacklist },
++ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4605, 0xff, 0x01, 0x31) },
++ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4605, 0xff, 0x01, 0x32) },
++ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K5005, 0xff, 0x01, 0x31) },
++ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K5005, 0xff, 0x01, 0x32) },
++ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K5005, 0xff, 0x01, 0x33) },
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3770, 0xff, 0x02, 0x31) },
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3770, 0xff, 0x02, 0x32) },
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3771, 0xff, 0x02, 0x31) },
+@@ -1209,6 +1221,11 @@ static const struct usb_device_id option_ids[] = {
+ { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CLU516) },
+ { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CLU528) },
+ { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CLU526) },
++ { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CEU881) },
++ { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CEU882) },
++ { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CWU581) },
++ { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CWU582) },
++ { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CWU583) },
+ { USB_DEVICE_AND_INTERFACE_INFO(VIETTEL_VENDOR_ID, VIETTEL_PRODUCT_VT1000, 0xff, 0xff, 0xff) },
+ { USB_DEVICE_AND_INTERFACE_INFO(ZD_VENDOR_ID, ZD_PRODUCT_7000, 0xff, 0xff, 0xff) },
+ { USB_DEVICE(LG_VENDOR_ID, LG_PRODUCT_L02C) }, /* docomo L-02C modem */
+@@ -1257,7 +1274,7 @@ static struct usb_serial_driver option_1port_device = {
+ .ioctl = usb_wwan_ioctl,
+ .attach = usb_wwan_startup,
+ .disconnect = usb_wwan_disconnect,
+- .release = usb_wwan_release,
++ .release = option_release,
+ .read_int_callback = option_instat_callback,
+ #ifdef CONFIG_PM
+ .suspend = usb_wwan_suspend,
+@@ -1271,35 +1288,6 @@ static struct usb_serial_driver * const serial_drivers[] = {
+
+ static bool debug;
+
+-/* per port private data */
+-
+-#define N_IN_URB 4
+-#define N_OUT_URB 4
+-#define IN_BUFLEN 4096
+-#define OUT_BUFLEN 4096
+-
+-struct option_port_private {
+- /* Input endpoints and buffer for this port */
+- struct urb *in_urbs[N_IN_URB];
+- u8 *in_buffer[N_IN_URB];
+- /* Output endpoints and buffer for this port */
+- struct urb *out_urbs[N_OUT_URB];
+- u8 *out_buffer[N_OUT_URB];
+- unsigned long out_busy; /* Bit vector of URBs in use */
+- int opened;
+- struct usb_anchor delayed;
+-
+- /* Settings for the port */
+- int rts_state; /* Handshaking pins (outputs) */
+- int dtr_state;
+- int cts_state; /* Handshaking pins (inputs) */
+- int dsr_state;
+- int dcd_state;
+- int ri_state;
+-
+- unsigned long tx_start_time[N_OUT_URB];
+-};
+-
+ module_usb_serial_driver(option_driver, serial_drivers);
+
+ static bool is_blacklisted(const u8 ifnum, enum option_blacklist_reason reason,
+@@ -1368,12 +1356,22 @@ static int option_probe(struct usb_serial *serial,
+ return 0;
+ }
+
++static void option_release(struct usb_serial *serial)
++{
++ struct usb_wwan_intf_private *priv = usb_get_serial_data(serial);
++
++ usb_wwan_release(serial);
++
++ kfree(priv);
++}
++
+ static void option_instat_callback(struct urb *urb)
+ {
+ int err;
+ int status = urb->status;
+ struct usb_serial_port *port = urb->context;
+- struct option_port_private *portdata = usb_get_serial_port_data(port);
++ struct usb_wwan_port_private *portdata =
++ usb_get_serial_port_data(port);
+
+ dbg("%s", __func__);
+ dbg("%s: urb %p port %p has data %p", __func__, urb, port, portdata);
+@@ -1434,7 +1432,7 @@ static int option_send_setup(struct usb_serial_port *port)
+ struct usb_serial *serial = port->serial;
+ struct usb_wwan_intf_private *intfdata =
+ (struct usb_wwan_intf_private *) serial->private;
+- struct option_port_private *portdata;
++ struct usb_wwan_port_private *portdata;
+ int ifNum = serial->interface->cur_altsetting->desc.bInterfaceNumber;
+ int val = 0;
+ dbg("%s", __func__);
+diff --git a/drivers/usb/serial/qcserial.c b/drivers/usb/serial/qcserial.c
+index 0206b10..50b5371 100644
+--- a/drivers/usb/serial/qcserial.c
++++ b/drivers/usb/serial/qcserial.c
+@@ -105,7 +105,13 @@ static const struct usb_device_id id_table[] = {
+ {USB_DEVICE(0x1410, 0xa021)}, /* Novatel Gobi 3000 Composite */
+ {USB_DEVICE(0x413c, 0x8193)}, /* Dell Gobi 3000 QDL */
+ {USB_DEVICE(0x413c, 0x8194)}, /* Dell Gobi 3000 Composite */
++ {USB_DEVICE(0x1199, 0x9010)}, /* Sierra Wireless Gobi 3000 QDL */
++ {USB_DEVICE(0x1199, 0x9012)}, /* Sierra Wireless Gobi 3000 QDL */
+ {USB_DEVICE(0x1199, 0x9013)}, /* Sierra Wireless Gobi 3000 Modem device (MC8355) */
++ {USB_DEVICE(0x1199, 0x9014)}, /* Sierra Wireless Gobi 3000 QDL */
++ {USB_DEVICE(0x1199, 0x9015)}, /* Sierra Wireless Gobi 3000 Modem device */
++ {USB_DEVICE(0x1199, 0x9018)}, /* Sierra Wireless Gobi 3000 QDL */
++ {USB_DEVICE(0x1199, 0x9019)}, /* Sierra Wireless Gobi 3000 Modem device */
+ {USB_DEVICE(0x12D1, 0x14F0)}, /* Sony Gobi 3000 QDL */
+ {USB_DEVICE(0x12D1, 0x14F1)}, /* Sony Gobi 3000 Composite */
+ { } /* Terminating entry */
+diff --git a/drivers/usb/serial/sierra.c b/drivers/usb/serial/sierra.c
+index 8c8bf80..449bf6d 100644
+--- a/drivers/usb/serial/sierra.c
++++ b/drivers/usb/serial/sierra.c
+@@ -304,6 +304,10 @@ static const struct usb_device_id id_table[] = {
+ { USB_DEVICE(0x1199, 0x68A3), /* Sierra Wireless Direct IP modems */
+ .driver_info = (kernel_ulong_t)&direct_ip_interface_blacklist
+ },
++ /* AT&T Direct IP LTE modems */
++ { USB_DEVICE_AND_INTERFACE_INFO(0x0F3D, 0x68AA, 0xFF, 0xFF, 0xFF),
++ .driver_info = (kernel_ulong_t)&direct_ip_interface_blacklist
++ },
+ { USB_DEVICE(0x0f3d, 0x68A3), /* Airprime/Sierra Wireless Direct IP modems */
+ .driver_info = (kernel_ulong_t)&direct_ip_interface_blacklist
+ },
+diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c
+index 6933355..bcf2617 100644
+--- a/drivers/usb/serial/usb-serial.c
++++ b/drivers/usb/serial/usb-serial.c
+@@ -670,12 +670,14 @@ exit:
+ static struct usb_serial_driver *search_serial_device(
+ struct usb_interface *iface)
+ {
+- const struct usb_device_id *id;
++ const struct usb_device_id *id = NULL;
+ struct usb_serial_driver *drv;
++ struct usb_driver *driver = to_usb_driver(iface->dev.driver);
+
+ /* Check if the usb id matches a known device */
+ list_for_each_entry(drv, &usb_serial_driver_list, driver_list) {
+- id = get_iface_id(drv, iface);
++ if (drv->usb_driver == driver)
++ id = get_iface_id(drv, iface);
+ if (id)
+ return drv;
+ }
+diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h
+index 8f3cbb8..f4d3e1a 100644
+--- a/drivers/usb/storage/unusual_devs.h
++++ b/drivers/usb/storage/unusual_devs.h
+@@ -1107,6 +1107,13 @@ UNUSUAL_DEV( 0x090a, 0x1200, 0x0000, 0x9999,
+ USB_SC_RBC, USB_PR_BULK, NULL,
+ 0 ),
+
++/* Feiya QDI U2 DISK, reported by Hans de Goede <hdegoede@redhat.com> */
++UNUSUAL_DEV( 0x090c, 0x1000, 0x0000, 0xffff,
++ "Feiya",
++ "QDI U2 DISK",
++ USB_SC_DEVICE, USB_PR_DEVICE, NULL,
++ US_FL_NO_READ_CAPACITY_16 ),
++
+ /* aeb */
+ UNUSUAL_DEV( 0x090c, 0x1132, 0x0000, 0xffff,
+ "Feiya",
+diff --git a/fs/hfsplus/ioctl.c b/fs/hfsplus/ioctl.c
+index c640ba5..09addc8 100644
+--- a/fs/hfsplus/ioctl.c
++++ b/fs/hfsplus/ioctl.c
+@@ -31,6 +31,7 @@ static int hfsplus_ioctl_bless(struct file *file, int __user *user_flags)
+ struct hfsplus_sb_info *sbi = HFSPLUS_SB(inode->i_sb);
+ struct hfsplus_vh *vh = sbi->s_vhdr;
+ struct hfsplus_vh *bvh = sbi->s_backup_vhdr;
++ u32 cnid = (unsigned long)dentry->d_fsdata;
+
+ if (!capable(CAP_SYS_ADMIN))
+ return -EPERM;
+@@ -41,8 +42,12 @@ static int hfsplus_ioctl_bless(struct file *file, int __user *user_flags)
+ vh->finder_info[0] = bvh->finder_info[0] =
+ cpu_to_be32(parent_ino(dentry));
+
+- /* Bootloader */
+- vh->finder_info[1] = bvh->finder_info[1] = cpu_to_be32(inode->i_ino);
++ /*
++ * Bootloader. Just using the inode here breaks in the case of
++ * hard links - the firmware wants the ID of the hard link file,
++ * but the inode points at the indirect inode
++ */
++ vh->finder_info[1] = bvh->finder_info[1] = cpu_to_be32(cnid);
+
+ /* Per spec, the OS X system folder - same as finder_info[0] here */
+ vh->finder_info[5] = bvh->finder_info[5] =
+diff --git a/fs/hfsplus/wrapper.c b/fs/hfsplus/wrapper.c
+index 7daf4b8..90effcc 100644
+--- a/fs/hfsplus/wrapper.c
++++ b/fs/hfsplus/wrapper.c
+@@ -56,7 +56,7 @@ int hfsplus_submit_bio(struct super_block *sb, sector_t sector,
+ DECLARE_COMPLETION_ONSTACK(wait);
+ struct bio *bio;
+ int ret = 0;
+- unsigned int io_size;
++ u64 io_size;
+ loff_t start;
+ int offset;
+
+diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
+index e9b1eb7..d60c2d8 100644
+--- a/fs/nfs/nfs4proc.c
++++ b/fs/nfs/nfs4proc.c
+@@ -1861,6 +1861,7 @@ static struct nfs4_state *nfs4_do_open(struct inode *dir, struct dentry *dentry,
+ struct nfs4_state *res;
+ int status;
+
++ fmode &= FMODE_READ|FMODE_WRITE;
+ do {
+ status = _nfs4_do_open(dir, dentry, fmode, flags, sattr, cred, &res);
+ if (status == 0)
+diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
+index 7f71c69..e79c24e 100644
+--- a/fs/nfsd/nfs4state.c
++++ b/fs/nfsd/nfs4state.c
+@@ -862,7 +862,7 @@ static void free_session(struct kref *kref)
+ struct nfsd4_session *ses;
+ int mem;
+
+- BUG_ON(!spin_is_locked(&client_lock));
++ lockdep_assert_held(&client_lock);
+ ses = container_of(kref, struct nfsd4_session, se_ref);
+ nfsd4_del_conns(ses);
+ spin_lock(&nfsd_drc_lock);
+@@ -1041,7 +1041,7 @@ static struct nfs4_client *alloc_client(struct xdr_netobj name)
+ static inline void
+ free_client(struct nfs4_client *clp)
+ {
+- BUG_ON(!spin_is_locked(&client_lock));
++ lockdep_assert_held(&client_lock);
+ while (!list_empty(&clp->cl_sessions)) {
+ struct nfsd4_session *ses;
+ ses = list_entry(clp->cl_sessions.next, struct nfsd4_session,
+diff --git a/include/linux/pci.h b/include/linux/pci.h
+index e444f5b..8b2921a 100644
+--- a/include/linux/pci.h
++++ b/include/linux/pci.h
+@@ -176,6 +176,8 @@ enum pci_dev_flags {
+ PCI_DEV_FLAGS_NO_D3 = (__force pci_dev_flags_t) 2,
+ /* Provide indication device is assigned by a Virtual Machine Manager */
+ PCI_DEV_FLAGS_ASSIGNED = (__force pci_dev_flags_t) 4,
++ /* Device causes system crash if in D3 during S3 sleep */
++ PCI_DEV_FLAGS_NO_D3_DURING_SLEEP = (__force pci_dev_flags_t) 8,
+ };
+
+ enum pci_irq_reroute_variant {
+diff --git a/include/linux/swapops.h b/include/linux/swapops.h
+index 792d16d..47ead51 100644
+--- a/include/linux/swapops.h
++++ b/include/linux/swapops.h
+@@ -9,13 +9,15 @@
+ * get good packing density in that tree, so the index should be dense in
+ * the low-order bits.
+ *
+- * We arrange the `type' and `offset' fields so that `type' is at the five
++ * We arrange the `type' and `offset' fields so that `type' is at the seven
+ * high-order bits of the swp_entry_t and `offset' is right-aligned in the
+- * remaining bits.
++ * remaining bits. Although `type' itself needs only five bits, we allow for
++ * shmem/tmpfs to shift it all up a further two bits: see swp_to_radix_entry().
+ *
+ * swp_entry_t's are *never* stored anywhere in their arch-dependent format.
+ */
+-#define SWP_TYPE_SHIFT(e) (sizeof(e.val) * 8 - MAX_SWAPFILES_SHIFT)
++#define SWP_TYPE_SHIFT(e) ((sizeof(e.val) * 8) - \
++ (MAX_SWAPFILES_SHIFT + RADIX_TREE_EXCEPTIONAL_SHIFT))
+ #define SWP_OFFSET_MASK(e) ((1UL << SWP_TYPE_SHIFT(e)) - 1)
+
+ /*
+diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h
+index d28cc78..5de4157 100644
+--- a/include/linux/usb/hcd.h
++++ b/include/linux/usb/hcd.h
+@@ -126,8 +126,6 @@ struct usb_hcd {
+ unsigned wireless:1; /* Wireless USB HCD */
+ unsigned authorized_default:1;
+ unsigned has_tt:1; /* Integrated TT in root hub */
+- unsigned broken_pci_sleep:1; /* Don't put the
+- controller in PCI-D3 for system sleep */
+
+ unsigned int irq; /* irq allocated */
+ void __iomem *regs; /* device memory/io */
+diff --git a/kernel/panic.c b/kernel/panic.c
+index 8ed89a1..9ed023b 100644
+--- a/kernel/panic.c
++++ b/kernel/panic.c
+@@ -108,8 +108,6 @@ void panic(const char *fmt, ...)
+ */
+ crash_kexec(NULL);
+
+- kmsg_dump(KMSG_DUMP_PANIC);
+-
+ /*
+ * Note smp_send_stop is the usual smp shutdown function, which
+ * unfortunately means it may not be hardened to work in a panic
+@@ -117,6 +115,8 @@ void panic(const char *fmt, ...)
+ */
+ smp_send_stop();
+
++ kmsg_dump(KMSG_DUMP_PANIC);
++
+ atomic_notifier_call_chain(&panic_notifier_list, 0, buf);
+
+ bust_spinlocks(0);
+diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c
+index f03fd83..e8c8671 100644
+--- a/kernel/time/ntp.c
++++ b/kernel/time/ntp.c
+@@ -412,6 +412,7 @@ int second_overflow(unsigned long secs)
+ if (secs % 86400 == 0) {
+ leap = -1;
+ time_state = TIME_OOP;
++ time_tai++;
+ printk(KERN_NOTICE
+ "Clock: inserting leap second 23:59:60 UTC\n");
+ }
+@@ -426,7 +427,6 @@ int second_overflow(unsigned long secs)
+ }
+ break;
+ case TIME_OOP:
+- time_tai++;
+ time_state = TIME_WAIT;
+ break;
+
+diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
+index 2a22255..464a96f 100644
+--- a/kernel/trace/trace.c
++++ b/kernel/trace/trace.c
+@@ -383,7 +383,7 @@ EXPORT_SYMBOL_GPL(tracing_on);
+ void tracing_off(void)
+ {
+ if (global_trace.buffer)
+- ring_buffer_record_on(global_trace.buffer);
++ ring_buffer_record_off(global_trace.buffer);
+ /*
+ * This flag is only looked at when buffers haven't been
+ * allocated yet. We don't really care about the race
+diff --git a/mm/swapfile.c b/mm/swapfile.c
+index fafc26d..38186d9 100644
+--- a/mm/swapfile.c
++++ b/mm/swapfile.c
+@@ -1924,24 +1924,20 @@ static unsigned long read_swap_header(struct swap_info_struct *p,
+
+ /*
+ * Find out how many pages are allowed for a single swap
+- * device. There are three limiting factors: 1) the number
++ * device. There are two limiting factors: 1) the number
+ * of bits for the swap offset in the swp_entry_t type, and
+ * 2) the number of bits in the swap pte as defined by the
+- * the different architectures, and 3) the number of free bits
+- * in an exceptional radix_tree entry. In order to find the
++ * different architectures. In order to find the
+ * largest possible bit mask, a swap entry with swap type 0
+ * and swap offset ~0UL is created, encoded to a swap pte,
+ * decoded to a swp_entry_t again, and finally the swap
+ * offset is extracted. This will mask all the bits from
+ * the initial ~0UL mask that can't be encoded in either
+ * the swp_entry_t or the architecture definition of a
+- * swap pte. Then the same is done for a radix_tree entry.
++ * swap pte.
+ */
+ maxpages = swp_offset(pte_to_swp_entry(
+- swp_entry_to_pte(swp_entry(0, ~0UL))));
+- maxpages = swp_offset(radix_to_swp_entry(
+- swp_to_radix_entry(swp_entry(0, maxpages)))) + 1;
+-
++ swp_entry_to_pte(swp_entry(0, ~0UL)))) + 1;
+ if (maxpages > swap_header->info.last_page) {
+ maxpages = swap_header->info.last_page + 1;
+ /* p->max is an unsigned int: don't overflow it */
+diff --git a/net/9p/trans_virtio.c b/net/9p/trans_virtio.c
+index 3d43206..052d343 100644
+--- a/net/9p/trans_virtio.c
++++ b/net/9p/trans_virtio.c
+@@ -192,10 +192,10 @@ static int pack_sg_list(struct scatterlist *sg, int start,
+ s = rest_of_page(data);
+ if (s > count)
+ s = count;
++ BUG_ON(index > limit);
+ sg_set_buf(&sg[index++], data, s);
+ count -= s;
+ data += s;
+- BUG_ON(index > limit);
+ }
+
+ return index-start;
+diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c
+index 3b62cf2..faa078f 100644
+--- a/net/sunrpc/rpc_pipe.c
++++ b/net/sunrpc/rpc_pipe.c
+@@ -71,7 +71,9 @@ static void rpc_purge_list(wait_queue_head_t *waitq, struct list_head *head,
+ msg->errno = err;
+ destroy_msg(msg);
+ } while (!list_empty(head));
+- wake_up(waitq);
++
++ if (waitq)
++ wake_up(waitq);
+ }
+
+ static void
+@@ -91,11 +93,9 @@ rpc_timeout_upcall_queue(struct work_struct *work)
+ }
+ dentry = dget(pipe->dentry);
+ spin_unlock(&pipe->lock);
+- if (dentry) {
+- rpc_purge_list(&RPC_I(dentry->d_inode)->waitq,
+- &free_list, destroy_msg, -ETIMEDOUT);
+- dput(dentry);
+- }
++ rpc_purge_list(dentry ? &RPC_I(dentry->d_inode)->waitq : NULL,
++ &free_list, destroy_msg, -ETIMEDOUT);
++ dput(dentry);
+ }
+
+ ssize_t rpc_pipe_generic_upcall(struct file *filp, struct rpc_pipe_msg *msg,
+diff --git a/net/sunrpc/svc.c b/net/sunrpc/svc.c
+index 4153846..234ee39 100644
+--- a/net/sunrpc/svc.c
++++ b/net/sunrpc/svc.c
+@@ -1379,7 +1379,8 @@ bc_svc_process(struct svc_serv *serv, struct rpc_rqst *req,
+ sizeof(req->rq_snd_buf));
+ return bc_send(req);
+ } else {
+- /* Nothing to do to drop request */
++ /* drop request */
++ xprt_free_bc_request(req);
+ return 0;
+ }
+ }
+diff --git a/sound/soc/codecs/wm8904.c b/sound/soc/codecs/wm8904.c
+index 65d525d..4e190b5 100644
+--- a/sound/soc/codecs/wm8904.c
++++ b/sound/soc/codecs/wm8904.c
+@@ -2084,7 +2084,6 @@ static int wm8904_probe(struct snd_soc_codec *codec)
+ {
+ struct wm8904_priv *wm8904 = snd_soc_codec_get_drvdata(codec);
+ struct wm8904_pdata *pdata = wm8904->pdata;
+- u16 *reg_cache = codec->reg_cache;
+ int ret, i;
+
+ codec->cache_sync = 1;
+@@ -2180,14 +2179,18 @@ static int wm8904_probe(struct snd_soc_codec *codec)
+ if (!pdata->gpio_cfg[i])
+ continue;
+
+- reg_cache[WM8904_GPIO_CONTROL_1 + i]
+- = pdata->gpio_cfg[i] & 0xffff;
++ regmap_update_bits(wm8904->regmap,
++ WM8904_GPIO_CONTROL_1 + i,
++ 0xffff,
++ pdata->gpio_cfg[i]);
+ }
+
+ /* Zero is the default value for these anyway */
+ for (i = 0; i < WM8904_MIC_REGS; i++)
+- reg_cache[WM8904_MIC_BIAS_CONTROL_0 + i]
+- = pdata->mic_cfg[i];
++ regmap_update_bits(wm8904->regmap,
++ WM8904_MIC_BIAS_CONTROL_0 + i,
++ 0xffff,
++ pdata->mic_cfg[i]);
+ }
+
+ /* Set Class W by default - this will be managed by the Class
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2012-06-22 22:58 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-06-22 22:57 [gentoo-commits] linux-patches r2168 - genpatches-2.6/trunk/3.4 Mike Pagano (mpagano)
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox