diff -druN linux-libre-3.4.3-gnu/arch/arm/mach-imx/crm-regs-imx5.h linux-libre-3.4.4-gnu/arch/arm/mach-imx/crm-regs-imx5.h
--- linux-libre-3.4.3-gnu/arch/arm/mach-imx/crm-regs-imx5.h	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/arch/arm/mach-imx/crm-regs-imx5.h	2012-06-22 14:37:50.000000000 -0400
@@ -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 -druN linux-libre-3.4.3-gnu/arch/arm/mach-imx/hotplug.c linux-libre-3.4.4-gnu/arch/arm/mach-imx/hotplug.c
--- linux-libre-3.4.3-gnu/arch/arm/mach-imx/hotplug.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/arch/arm/mach-imx/hotplug.c	2012-06-22 14:37:50.000000000 -0400
@@ -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 @@
 	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 @@
  */
 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 -druN linux-libre-3.4.3-gnu/arch/arm/mach-imx/mach-mx21ads.c linux-libre-3.4.4-gnu/arch/arm/mach-imx/mach-mx21ads.c
--- linux-libre-3.4.3-gnu/arch/arm/mach-imx/mach-mx21ads.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/arch/arm/mach-imx/mach-mx21ads.c	2012-06-22 14:37:50.000000000 -0400
@@ -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 -druN linux-libre-3.4.3-gnu/arch/powerpc/include/asm/hw_irq.h linux-libre-3.4.4-gnu/arch/powerpc/include/asm/hw_irq.h
--- linux-libre-3.4.3-gnu/arch/powerpc/include/asm/hw_irq.h	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/arch/powerpc/include/asm/hw_irq.h	2012-06-22 14:37:50.000000000 -0400
@@ -99,6 +99,9 @@
 	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 -druN linux-libre-3.4.3-gnu/arch/x86/xen/enlighten.c linux-libre-3.4.4-gnu/arch/x86/xen/enlighten.c
--- linux-libre-3.4.3-gnu/arch/x86/xen/enlighten.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/arch/x86/xen/enlighten.c	2012-06-22 14:37:50.000000000 -0400
@@ -207,6 +207,9 @@
 	       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 @@
 		*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 -druN linux-libre-3.4.3-gnu/drivers/char/hw_random/atmel-rng.c linux-libre-3.4.4-gnu/drivers/char/hw_random/atmel-rng.c
--- linux-libre-3.4.3-gnu/drivers/char/hw_random/atmel-rng.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/char/hw_random/atmel-rng.c	2012-06-22 14:37:50.000000000 -0400
@@ -34,7 +34,7 @@
 	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 -druN linux-libre-3.4.3-gnu/drivers/edac/i7core_edac.c linux-libre-3.4.4-gnu/drivers/edac/i7core_edac.c
--- linux-libre-3.4.3-gnu/drivers/edac/i7core_edac.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/edac/i7core_edac.c	2012-06-22 14:37:50.000000000 -0400
@@ -1932,12 +1932,6 @@
 	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 @@
 	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 @@
 	/* 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 @@
 
 	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 @@
 {
 	debugf2("MC: " __FILE__ ": %s()\n", __func__);
 	pci_unregister_driver(&i7core_driver);
+	mce_unregister_decode_chain(&i7_mce_dec);
 }
 
 module_init(i7core_init);
diff -druN linux-libre-3.4.3-gnu/drivers/edac/sb_edac.c linux-libre-3.4.4-gnu/drivers/edac/sb_edac.c
--- linux-libre-3.4.3-gnu/drivers/edac/sb_edac.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/edac/sb_edac.c	2012-06-22 14:37:50.000000000 -0400
@@ -599,7 +599,7 @@
 		pvt->is_close_pg = false;
 	}
 
-	pci_read_config_dword(pvt->pci_ta, RANK_CFG_A, &reg);
+	pci_read_config_dword(pvt->pci_ddrio, RANK_CFG_A, &reg);
 	if (IS_RDIMM_ENABLED(reg)) {
 		/* FIXME: Can also be LRDIMM */
 		debugf0("Memory is registered\n");
@@ -1669,8 +1669,6 @@
 	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 @@
 		goto fail0;
 	}
 
-	mce_register_decode_chain(&sbridge_mce_dec);
 	return 0;
 
 fail0:
@@ -1867,8 +1864,10 @@
 
 	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 @@
 {
 	debugf2("MC: " __FILE__ ": %s()\n", __func__);
 	pci_unregister_driver(&sbridge_driver);
+	mce_unregister_decode_chain(&sbridge_mce_dec);
 }
 
 module_init(sbridge_init);
diff -druN linux-libre-3.4.3-gnu/drivers/gpu/drm/i915/intel_dp.c linux-libre-3.4.4-gnu/drivers/gpu/drm/i915/intel_dp.c
--- linux-libre-3.4.3-gnu/drivers/gpu/drm/i915/intel_dp.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/gpu/drm/i915/intel_dp.c	2012-06-22 14:37:50.000000000 -0400
@@ -368,7 +368,7 @@
 	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 @@
 	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 -druN linux-libre-3.4.3-gnu/drivers/gpu/drm/radeon/evergreen.c linux-libre-3.4.4-gnu/drivers/gpu/drm/radeon/evergreen.c
--- linux-libre-3.4.3-gnu/drivers/gpu/drm/radeon/evergreen.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/gpu/drm/radeon/evergreen.c	2012-06-22 14:37:50.000000000 -0400
@@ -2210,6 +2210,9 @@
 	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 -druN linux-libre-3.4.3-gnu/drivers/gpu/drm/radeon/evergreend.h linux-libre-3.4.4-gnu/drivers/gpu/drm/radeon/evergreend.h
--- linux-libre-3.4.3-gnu/drivers/gpu/drm/radeon/evergreend.h	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/gpu/drm/radeon/evergreend.h	2012-06-22 14:37:50.000000000 -0400
@@ -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 -druN linux-libre-3.4.3-gnu/drivers/gpu/drm/radeon/r600.c linux-libre-3.4.4-gnu/drivers/gpu/drm/radeon/r600.c
--- linux-libre-3.4.3-gnu/drivers/gpu/drm/radeon/r600.c	2012-06-18 08:06:20.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/gpu/drm/radeon/r600.c	2012-06-22 20:37:46.000000000 -0400
@@ -1866,6 +1866,7 @@
 	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 -druN linux-libre-3.4.3-gnu/drivers/gpu/drm/radeon/r600d.h linux-libre-3.4.4-gnu/drivers/gpu/drm/radeon/r600d.h
--- linux-libre-3.4.3-gnu/drivers/gpu/drm/radeon/r600d.h	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/gpu/drm/radeon/r600d.h	2012-06-22 14:37:50.000000000 -0400
@@ -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 -druN linux-libre-3.4.3-gnu/drivers/gpu/drm/radeon/rv770.c linux-libre-3.4.4-gnu/drivers/gpu/drm/radeon/rv770.c
--- linux-libre-3.4.3-gnu/drivers/gpu/drm/radeon/rv770.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/gpu/drm/radeon/rv770.c	2012-06-22 14:37:50.000000000 -0400
@@ -782,6 +782,9 @@
 				       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 @@
 
 	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 -druN linux-libre-3.4.3-gnu/drivers/gpu/drm/radeon/rv770d.h linux-libre-3.4.4-gnu/drivers/gpu/drm/radeon/rv770d.h
--- linux-libre-3.4.3-gnu/drivers/gpu/drm/radeon/rv770d.h	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/gpu/drm/radeon/rv770d.h	2012-06-22 14:37:50.000000000 -0400
@@ -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 -druN linux-libre-3.4.3-gnu/drivers/gpu/drm/sis/sis_drv.c linux-libre-3.4.4-gnu/drivers/gpu/drm/sis/sis_drv.c
--- linux-libre-3.4.3-gnu/drivers/gpu/drm/sis/sis_drv.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/gpu/drm/sis/sis_drv.c	2012-06-22 14:37:50.000000000 -0400
@@ -47,9 +47,9 @@
 	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 -druN linux-libre-3.4.3-gnu/drivers/gpu/drm/udl/udl_drv.c linux-libre-3.4.4-gnu/drivers/gpu/drm/udl/udl_drv.c
--- linux-libre-3.4.3-gnu/drivers/gpu/drm/udl/udl_drv.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/gpu/drm/udl/udl_drv.c	2012-06-22 14:37:50.000000000 -0400
@@ -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 -druN linux-libre-3.4.3-gnu/drivers/gpu/drm/via/via_map.c linux-libre-3.4.4-gnu/drivers/gpu/drm/via/via_map.c
--- linux-libre-3.4.3-gnu/drivers/gpu/drm/via/via_map.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/gpu/drm/via/via_map.c	2012-06-22 14:37:50.000000000 -0400
@@ -100,12 +100,11 @@
 	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 -druN linux-libre-3.4.3-gnu/drivers/net/ethernet/intel/e1000e/82571.c linux-libre-3.4.4-gnu/drivers/net/ethernet/intel/e1000e/82571.c
--- linux-libre-3.4.3-gnu/drivers/net/ethernet/intel/e1000e/82571.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/net/ethernet/intel/e1000e/82571.c	2012-06-22 14:37:50.000000000 -0400
@@ -2061,8 +2061,9 @@
 				  | 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 -druN linux-libre-3.4.3-gnu/drivers/net/ethernet/intel/e1000e/netdev.c linux-libre-3.4.4-gnu/drivers/net/ethernet/intel/e1000e/netdev.c
--- linux-libre-3.4.3-gnu/drivers/net/ethernet/intel/e1000e/netdev.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/net/ethernet/intel/e1000e/netdev.c	2012-06-22 14:37:50.000000000 -0400
@@ -5293,14 +5293,6 @@
 		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 -druN linux-libre-3.4.3-gnu/drivers/net/wireless/iwlwifi/iwl-6000.c linux-libre-3.4.4-gnu/drivers/net/wireless/iwlwifi/iwl-6000.c
--- linux-libre-3.4.3-gnu/drivers/net/wireless/iwlwifi/iwl-6000.c	2012-06-18 08:13:10.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/net/wireless/iwlwifi/iwl-6000.c	2012-06-22 20:44:19.000000000 -0400
@@ -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 "/*(DEBLOBBED)*/"
 #define IWL6000_MODULE_FIRMWARE(api) IWL6000_FW_PRE /*(DEBLOBBED)*/
@@ -425,9 +428,25 @@
 	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 -druN linux-libre-3.4.3-gnu/drivers/net/wireless/iwlwifi/iwl-eeprom.c linux-libre-3.4.4-gnu/drivers/net/wireless/iwlwifi/iwl-eeprom.c
--- linux-libre-3.4.3-gnu/drivers/net/wireless/iwlwifi/iwl-eeprom.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/net/wireless/iwlwifi/iwl-eeprom.c	2012-06-22 14:37:50.000000000 -0400
@@ -513,28 +513,28 @@
  * 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 @@
 				 ((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 -druN linux-libre-3.4.3-gnu/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c linux-libre-3.4.4-gnu/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c
--- linux-libre-3.4.3-gnu/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c	2012-06-22 14:37:50.000000000 -0400
@@ -430,9 +430,7 @@
 
 	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 -druN linux-libre-3.4.3-gnu/drivers/net/wireless/iwlwifi/iwl-trans-pcie-int.h linux-libre-3.4.4-gnu/drivers/net/wireless/iwlwifi/iwl-trans-pcie-int.h
--- linux-libre-3.4.3-gnu/drivers/net/wireless/iwlwifi/iwl-trans-pcie-int.h	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/net/wireless/iwlwifi/iwl-trans-pcie-int.h	2012-06-22 14:37:50.000000000 -0400
@@ -342,7 +342,7 @@
 				 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 -druN linux-libre-3.4.3-gnu/drivers/net/wireless/iwlwifi/iwl-trans-pcie-tx.c linux-libre-3.4.4-gnu/drivers/net/wireless/iwlwifi/iwl-trans-pcie-tx.c
--- linux-libre-3.4.3-gnu/drivers/net/wireless/iwlwifi/iwl-trans-pcie-tx.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/net/wireless/iwlwifi/iwl-trans-pcie-tx.c	2012-06-22 14:37:50.000000000 -0400
@@ -237,32 +237,38 @@
 	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 @@
 		 */
 		if (skb) {
 			iwl_op_mode_free_skb(trans->op_mode, skb);
-			txq->skbs[index] = NULL;
+			txq->skbs[idx] = NULL;
 		}
 	}
 }
@@ -1100,7 +1106,7 @@
 
 		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 -druN linux-libre-3.4.3-gnu/drivers/pci/pci.c linux-libre-3.4.4-gnu/drivers/pci/pci.c
--- linux-libre-3.4.3-gnu/drivers/pci/pci.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/pci/pci.c	2012-06-22 14:37:50.000000000 -0400
@@ -1743,6 +1743,11 @@
 	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 -druN linux-libre-3.4.3-gnu/drivers/pci/quirks.c linux-libre-3.4.4-gnu/drivers/pci/quirks.c
--- linux-libre-3.4.3-gnu/drivers/pci/quirks.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/pci/quirks.c	2012-06-22 14:37:50.000000000 -0400
@@ -2917,6 +2917,32 @@
 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 -druN linux-libre-3.4.3-gnu/drivers/remoteproc/omap_remoteproc.c linux-libre-3.4.4-gnu/drivers/remoteproc/omap_remoteproc.c
--- linux-libre-3.4.3-gnu/drivers/remoteproc/omap_remoteproc.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/remoteproc/omap_remoteproc.c	2012-06-22 14:37:50.000000000 -0400
@@ -182,7 +182,7 @@
 
 	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 -druN linux-libre-3.4.3-gnu/drivers/remoteproc/remoteproc_core.c linux-libre-3.4.4-gnu/drivers/remoteproc/remoteproc_core.c
--- linux-libre-3.4.3-gnu/drivers/remoteproc/remoteproc_core.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/remoteproc/remoteproc_core.c	2012-06-22 14:37:50.000000000 -0400
@@ -247,7 +247,7 @@
 		}
 
 		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 @@
 		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 @@
 
 	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 @@
 
 	/* 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 -druN linux-libre-3.4.3-gnu/drivers/scsi/mpt2sas/mpt2sas_base.c linux-libre-3.4.4-gnu/drivers/scsi/mpt2sas/mpt2sas_base.c
--- linux-libre-3.4.3-gnu/drivers/scsi/mpt2sas/mpt2sas_base.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/scsi/mpt2sas/mpt2sas_base.c	2012-06-22 14:37:50.000000000 -0400
@@ -1785,7 +1785,7 @@
 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 -druN linux-libre-3.4.3-gnu/drivers/target/target_core_alua.c linux-libre-3.4.4-gnu/drivers/target/target_core_alua.c
--- linux-libre-3.4.3-gnu/drivers/target/target_core_alua.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/target/target_core_alua.c	2012-06-22 14:37:50.000000000 -0400
@@ -351,9 +351,11 @@
 
 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 -druN linux-libre-3.4.3-gnu/drivers/tty/hvc/hvc_xen.c linux-libre-3.4.4-gnu/drivers/tty/hvc/hvc_xen.c
--- linux-libre-3.4.3-gnu/drivers/tty/hvc/hvc_xen.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/tty/hvc/hvc_xen.c	2012-06-22 14:37:50.000000000 -0400
@@ -214,24 +214,24 @@
 	/* 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 @@
 	spin_unlock(&xencons_lock);
 
 	return 0;
+err:
+	kfree(info);
+	return -ENODEV;
 }
 
 static int xen_pv_console_init(void)
diff -druN linux-libre-3.4.3-gnu/drivers/usb/class/cdc-acm.c linux-libre-3.4.4-gnu/drivers/usb/class/cdc-acm.c
--- linux-libre-3.4.3-gnu/drivers/usb/class/cdc-acm.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/usb/class/cdc-acm.c	2012-06-22 14:37:50.000000000 -0400
@@ -567,6 +567,14 @@
 
 	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 -druN linux-libre-3.4.3-gnu/drivers/usb/class/cdc-wdm.c linux-libre-3.4.4-gnu/drivers/usb/class/cdc-wdm.c
--- linux-libre-3.4.3-gnu/drivers/usb/class/cdc-wdm.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/usb/class/cdc-wdm.c	2012-06-22 14:37:50.000000000 -0400
@@ -55,6 +55,15 @@
 		.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 -druN linux-libre-3.4.3-gnu/drivers/usb/core/hcd-pci.c linux-libre-3.4.4-gnu/drivers/usb/core/hcd-pci.c
--- linux-libre-3.4.3-gnu/drivers/usb/core/hcd-pci.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/usb/core/hcd-pci.c	2012-06-22 14:37:50.000000000 -0400
@@ -493,15 +493,6 @@
 
 	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 -druN linux-libre-3.4.3-gnu/drivers/usb/core/message.c linux-libre-3.4.4-gnu/drivers/usb/core/message.c
--- linux-libre-3.4.3-gnu/drivers/usb/core/message.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/usb/core/message.c	2012-06-22 14:37:50.000000000 -0400
@@ -1803,7 +1803,6 @@
 		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 @@
 		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 -druN linux-libre-3.4.3-gnu/drivers/usb/host/ehci-hcd.c linux-libre-3.4.4-gnu/drivers/usb/host/ehci-hcd.c
--- linux-libre-3.4.3-gnu/drivers/usb/host/ehci-hcd.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/usb/host/ehci-hcd.c	2012-06-22 14:37:50.000000000 -0400
@@ -671,7 +671,9 @@
 	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 -druN linux-libre-3.4.3-gnu/drivers/usb/host/ehci-pci.c linux-libre-3.4.4-gnu/drivers/usb/host/ehci-pci.c
--- linux-libre-3.4.3-gnu/drivers/usb/host/ehci-pci.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/usb/host/ehci-pci.c	2012-06-22 14:37:50.000000000 -0400
@@ -144,14 +144,6 @@
 			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 -druN linux-libre-3.4.3-gnu/drivers/usb/host/xhci.c linux-libre-3.4.4-gnu/drivers/usb/host/xhci.c
--- linux-libre-3.4.3-gnu/drivers/usb/host/xhci.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/usb/host/xhci.c	2012-06-22 14:37:50.000000000 -0400
@@ -795,8 +795,8 @@
 	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 @@
 		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 -druN linux-libre-3.4.3-gnu/drivers/usb/host/xhci-mem.c linux-libre-3.4.4-gnu/drivers/usb/host/xhci-mem.c
--- linux-libre-3.4.3-gnu/drivers/usb/host/xhci-mem.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/usb/host/xhci-mem.c	2012-06-22 14:37:50.000000000 -0400
@@ -793,10 +793,9 @@
 		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 @@
 	}
 
 	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 @@
 {
 	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 @@
 	}
 	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 -druN linux-libre-3.4.3-gnu/drivers/usb/musb/davinci.c linux-libre-3.4.4-gnu/drivers/usb/musb/davinci.c
--- linux-libre-3.4.3-gnu/drivers/usb/musb/davinci.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/usb/musb/davinci.c	2012-06-22 14:37:50.000000000 -0400
@@ -34,6 +34,7 @@
 #include <linux/dma-mapping.h>
 
 #include <mach/cputype.h>
+#include <mach/hardware.h>
 
 #include <asm/mach-types.h>
 
diff -druN linux-libre-3.4.3-gnu/drivers/usb/musb/davinci.h linux-libre-3.4.4-gnu/drivers/usb/musb/davinci.h
--- linux-libre-3.4.3-gnu/drivers/usb/musb/davinci.h	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/usb/musb/davinci.h	2012-06-22 14:37:50.000000000 -0400
@@ -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 -druN linux-libre-3.4.3-gnu/drivers/usb/musb/musb_gadget.c linux-libre-3.4.4-gnu/drivers/usb/musb/musb_gadget.c
--- linux-libre-3.4.3-gnu/drivers/usb/musb/musb_gadget.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/usb/musb/musb_gadget.c	2012-06-22 14:37:50.000000000 -0400
@@ -1232,6 +1232,7 @@
 	}
 
 	musb_ep->desc = NULL;
+	musb_ep->end_point.desc = NULL;
 
 	/* abort all pending DMA and requests */
 	nuke(musb_ep, -ESHUTDOWN);
diff -druN linux-libre-3.4.3-gnu/drivers/usb/serial/cp210x.c linux-libre-3.4.4-gnu/drivers/usb/serial/cp210x.c
--- linux-libre-3.4.3-gnu/drivers/usb/serial/cp210x.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/usb/serial/cp210x.c	2012-06-22 14:37:50.000000000 -0400
@@ -82,6 +82,7 @@
 	{ 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 -druN linux-libre-3.4.3-gnu/drivers/usb/serial/ftdi_sio.c linux-libre-3.4.4-gnu/drivers/usb/serial/ftdi_sio.c
--- linux-libre-3.4.3-gnu/drivers/usb/serial/ftdi_sio.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/usb/serial/ftdi_sio.c	2012-06-22 14:37:50.000000000 -0400
@@ -737,6 +737,7 @@
 	{ 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 -druN linux-libre-3.4.3-gnu/drivers/usb/serial/ftdi_sio_ids.h linux-libre-3.4.4-gnu/drivers/usb/serial/ftdi_sio_ids.h
--- linux-libre-3.4.3-gnu/drivers/usb/serial/ftdi_sio_ids.h	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/usb/serial/ftdi_sio_ids.h	2012-06-22 14:37:50.000000000 -0400
@@ -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 -druN linux-libre-3.4.3-gnu/drivers/usb/serial/mct_u232.c linux-libre-3.4.4-gnu/drivers/usb/serial/mct_u232.c
--- linux-libre-3.4.3-gnu/drivers/usb/serial/mct_u232.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/usb/serial/mct_u232.c	2012-06-22 14:37:50.000000000 -0400
@@ -317,13 +317,16 @@
 			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 -druN linux-libre-3.4.3-gnu/drivers/usb/serial/mos7840.c linux-libre-3.4.4-gnu/drivers/usb/serial/mos7840.c
--- linux-libre-3.4.3-gnu/drivers/usb/serial/mos7840.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/usb/serial/mos7840.c	2012-06-22 14:37:50.000000000 -0400
@@ -206,7 +206,7 @@
 	{}			/* 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 -druN linux-libre-3.4.3-gnu/drivers/usb/serial/option.c linux-libre-3.4.4-gnu/drivers/usb/serial/option.c
--- linux-libre-3.4.3-gnu/drivers/usb/serial/option.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/usb/serial/option.c	2012-06-22 14:37:50.000000000 -0400
@@ -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 @@
 #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 @@
 #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 @@
 #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 @@
 #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_CWU582			0x261F
+#define YUGA_PRODUCT_CWU583			0x262F
 
-#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_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			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_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 @@
 	{ 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 @@
 	{ 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 @@
 	.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 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 @@
 	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 @@
 	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 -druN linux-libre-3.4.3-gnu/drivers/usb/serial/qcserial.c linux-libre-3.4.4-gnu/drivers/usb/serial/qcserial.c
--- linux-libre-3.4.3-gnu/drivers/usb/serial/qcserial.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/usb/serial/qcserial.c	2012-06-22 14:37:50.000000000 -0400
@@ -105,7 +105,13 @@
 	{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 -druN linux-libre-3.4.3-gnu/drivers/usb/serial/sierra.c linux-libre-3.4.4-gnu/drivers/usb/serial/sierra.c
--- linux-libre-3.4.3-gnu/drivers/usb/serial/sierra.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/usb/serial/sierra.c	2012-06-22 14:37:50.000000000 -0400
@@ -304,6 +304,10 @@
 	{ 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 -druN linux-libre-3.4.3-gnu/drivers/usb/serial/usb-serial.c linux-libre-3.4.4-gnu/drivers/usb/serial/usb-serial.c
--- linux-libre-3.4.3-gnu/drivers/usb/serial/usb-serial.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/usb/serial/usb-serial.c	2012-06-22 14:37:50.000000000 -0400
@@ -670,12 +670,14 @@
 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 -druN linux-libre-3.4.3-gnu/drivers/usb/storage/unusual_devs.h linux-libre-3.4.4-gnu/drivers/usb/storage/unusual_devs.h
--- linux-libre-3.4.3-gnu/drivers/usb/storage/unusual_devs.h	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/drivers/usb/storage/unusual_devs.h	2012-06-22 14:37:50.000000000 -0400
@@ -1107,6 +1107,13 @@
 		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 -druN linux-libre-3.4.3-gnu/fs/hfsplus/ioctl.c linux-libre-3.4.4-gnu/fs/hfsplus/ioctl.c
--- linux-libre-3.4.3-gnu/fs/hfsplus/ioctl.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/fs/hfsplus/ioctl.c	2012-06-22 14:37:50.000000000 -0400
@@ -31,6 +31,7 @@
 	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 @@
 	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 -druN linux-libre-3.4.3-gnu/fs/hfsplus/wrapper.c linux-libre-3.4.4-gnu/fs/hfsplus/wrapper.c
--- linux-libre-3.4.3-gnu/fs/hfsplus/wrapper.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/fs/hfsplus/wrapper.c	2012-06-22 14:37:50.000000000 -0400
@@ -56,7 +56,7 @@
 	DECLARE_COMPLETION_ONSTACK(wait);
 	struct bio *bio;
 	int ret = 0;
-	unsigned int io_size;
+	u64 io_size;
 	loff_t start;
 	int offset;
 
diff -druN linux-libre-3.4.3-gnu/fs/nfs/nfs4proc.c linux-libre-3.4.4-gnu/fs/nfs/nfs4proc.c
--- linux-libre-3.4.3-gnu/fs/nfs/nfs4proc.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/fs/nfs/nfs4proc.c	2012-06-22 14:37:50.000000000 -0400
@@ -1861,6 +1861,7 @@
 	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 -druN linux-libre-3.4.3-gnu/fs/nfsd/nfs4state.c linux-libre-3.4.4-gnu/fs/nfsd/nfs4state.c
--- linux-libre-3.4.3-gnu/fs/nfsd/nfs4state.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/fs/nfsd/nfs4state.c	2012-06-22 14:37:50.000000000 -0400
@@ -862,7 +862,7 @@
 	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 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 -druN linux-libre-3.4.3-gnu/include/linux/pci.h linux-libre-3.4.4-gnu/include/linux/pci.h
--- linux-libre-3.4.3-gnu/include/linux/pci.h	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/include/linux/pci.h	2012-06-22 14:37:50.000000000 -0400
@@ -176,6 +176,8 @@
 	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 -druN linux-libre-3.4.3-gnu/include/linux/swapops.h linux-libre-3.4.4-gnu/include/linux/swapops.h
--- linux-libre-3.4.3-gnu/include/linux/swapops.h	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/include/linux/swapops.h	2012-06-22 14:37:50.000000000 -0400
@@ -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 -druN linux-libre-3.4.3-gnu/include/linux/usb/hcd.h linux-libre-3.4.4-gnu/include/linux/usb/hcd.h
--- linux-libre-3.4.3-gnu/include/linux/usb/hcd.h	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/include/linux/usb/hcd.h	2012-06-22 14:37:50.000000000 -0400
@@ -126,8 +126,6 @@
 	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 -druN linux-libre-3.4.3-gnu/kernel/panic.c linux-libre-3.4.4-gnu/kernel/panic.c
--- linux-libre-3.4.3-gnu/kernel/panic.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/kernel/panic.c	2012-06-22 14:37:50.000000000 -0400
@@ -108,8 +108,6 @@
 	 */
 	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 @@
 	 */
 	smp_send_stop();
 
+	kmsg_dump(KMSG_DUMP_PANIC);
+
 	atomic_notifier_call_chain(&panic_notifier_list, 0, buf);
 
 	bust_spinlocks(0);
diff -druN linux-libre-3.4.3-gnu/kernel/time/ntp.c linux-libre-3.4.4-gnu/kernel/time/ntp.c
--- linux-libre-3.4.3-gnu/kernel/time/ntp.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/kernel/time/ntp.c	2012-06-22 14:37:50.000000000 -0400
@@ -412,6 +412,7 @@
 		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 @@
 		}
 		break;
 	case TIME_OOP:
-		time_tai++;
 		time_state = TIME_WAIT;
 		break;
 
diff -druN linux-libre-3.4.3-gnu/kernel/trace/trace.c linux-libre-3.4.4-gnu/kernel/trace/trace.c
--- linux-libre-3.4.3-gnu/kernel/trace/trace.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/kernel/trace/trace.c	2012-06-22 14:37:50.000000000 -0400
@@ -383,7 +383,7 @@
 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 -druN linux-libre-3.4.3-gnu/Makefile linux-libre-3.4.4-gnu/Makefile
--- linux-libre-3.4.3-gnu/Makefile	2012-06-18 08:05:17.000000000 -0400
+++ linux-libre-3.4.4-gnu/Makefile	2012-06-22 20:36:48.000000000 -0400
@@ -1,6 +1,6 @@
 VERSION = 3
 PATCHLEVEL = 4
-SUBLEVEL = 3
+SUBLEVEL = 4
 EXTRAVERSION =-gnu
 NAME = Saber-toothed Squirrel
 
diff -druN linux-libre-3.4.3-gnu/mm/swapfile.c linux-libre-3.4.4-gnu/mm/swapfile.c
--- linux-libre-3.4.3-gnu/mm/swapfile.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/mm/swapfile.c	2012-06-22 14:37:50.000000000 -0400
@@ -1924,24 +1924,20 @@
 
 	/*
 	 * 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 -druN linux-libre-3.4.3-gnu/net/9p/trans_virtio.c linux-libre-3.4.4-gnu/net/9p/trans_virtio.c
--- linux-libre-3.4.3-gnu/net/9p/trans_virtio.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/net/9p/trans_virtio.c	2012-06-22 14:37:50.000000000 -0400
@@ -192,10 +192,10 @@
 		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 -druN linux-libre-3.4.3-gnu/net/sunrpc/rpc_pipe.c linux-libre-3.4.4-gnu/net/sunrpc/rpc_pipe.c
--- linux-libre-3.4.3-gnu/net/sunrpc/rpc_pipe.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/net/sunrpc/rpc_pipe.c	2012-06-22 14:37:50.000000000 -0400
@@ -71,7 +71,9 @@
 		msg->errno = err;
 		destroy_msg(msg);
 	} while (!list_empty(head));
-	wake_up(waitq);
+
+	if (waitq)
+		wake_up(waitq);
 }
 
 static void
@@ -91,11 +93,9 @@
 	}
 	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 -druN linux-libre-3.4.3-gnu/net/sunrpc/svc.c linux-libre-3.4.4-gnu/net/sunrpc/svc.c
--- linux-libre-3.4.3-gnu/net/sunrpc/svc.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/net/sunrpc/svc.c	2012-06-22 14:37:50.000000000 -0400
@@ -1379,7 +1379,8 @@
 						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 -druN linux-libre-3.4.3-gnu/sound/soc/codecs/wm8904.c linux-libre-3.4.4-gnu/sound/soc/codecs/wm8904.c
--- linux-libre-3.4.3-gnu/sound/soc/codecs/wm8904.c	2012-06-17 14:21:44.000000000 -0400
+++ linux-libre-3.4.4-gnu/sound/soc/codecs/wm8904.c	2012-06-22 14:37:50.000000000 -0400
@@ -2084,7 +2084,6 @@
 {
 	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 @@
 			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
