diff -druNp --no-dereference linux-libre-3.18.40-gnu/arch/arc/include/asm/entry.h linux-libre-3.18.41-gnu/arch/arc/include/asm/entry.h
--- linux-libre-3.18.40-gnu/arch/arc/include/asm/entry.h	2016-08-22 12:23:31.000000000 -0400
+++ linux-libre-3.18.41-gnu/arch/arc/include/asm/entry.h	2016-09-02 23:42:21.000000000 -0400
@@ -143,8 +143,6 @@
 	POP	r13
 .endm
 
-#define OFF_USER_R25_FROM_R24	(SZ_CALLEE_REGS + SZ_PT_REGS - 8)/4
-
 /*--------------------------------------------------------------
  * Collect User Mode callee regs as struct callee_regs - needed by
  * fork/do_signal/unaligned-access-emulation.
@@ -157,12 +155,13 @@
  *-------------------------------------------------------------*/
 .macro SAVE_CALLEE_SAVED_USER
 
+	mov	r12, sp		; save SP as ref to pt_regs
 	SAVE_R13_TO_R24
 
 #ifdef CONFIG_ARC_CURR_IN_REG
-	; Retrieve orig r25 and save it on stack
-	ld.as   r12, [sp, OFF_USER_R25_FROM_R24]
-	st.a    r12, [sp, -4]
+	; Retrieve orig r25 and save it with rest of callee_regs
+	ld	r12, [r12, PT_user_r25]
+	PUSH	r12
 #else
 	PUSH	r25
 #endif
@@ -209,12 +208,16 @@
 .macro RESTORE_CALLEE_SAVED_USER
 
 #ifdef CONFIG_ARC_CURR_IN_REG
-	ld.ab   r12, [sp, 4]
-	st.as   r12, [sp, OFF_USER_R25_FROM_R24]
+	POP	r12
 #else
 	POP	r25
 #endif
 	RESTORE_R24_TO_R13
+
+	; SP is back to start of pt_regs
+#ifdef CONFIG_ARC_CURR_IN_REG
+	st	r12, [sp, PT_user_r25]
+#endif
 .endm
 
 /*--------------------------------------------------------------
diff -druNp --no-dereference linux-libre-3.18.40-gnu/arch/arc/include/asm/irqflags.h linux-libre-3.18.41-gnu/arch/arc/include/asm/irqflags.h
--- linux-libre-3.18.40-gnu/arch/arc/include/asm/irqflags.h	2016-08-22 12:23:31.000000000 -0400
+++ linux-libre-3.18.41-gnu/arch/arc/include/asm/irqflags.h	2016-09-02 23:42:21.000000000 -0400
@@ -159,10 +159,10 @@ static inline int arch_irqs_disabled(voi
 .endm
 
 .macro IRQ_ENABLE  scratch
+	TRACE_ASM_IRQ_ENABLE
 	lr	\scratch, [status32]
 	or	\scratch, \scratch, (STATUS_E1_MASK | STATUS_E2_MASK)
 	flag	\scratch
-	TRACE_ASM_IRQ_ENABLE
 .endm
 
 #endif	/* __ASSEMBLY__ */
diff -druNp --no-dereference linux-libre-3.18.40-gnu/arch/arc/include/uapi/asm/elf.h linux-libre-3.18.41-gnu/arch/arc/include/uapi/asm/elf.h
--- linux-libre-3.18.40-gnu/arch/arc/include/uapi/asm/elf.h	2016-08-22 12:23:31.000000000 -0400
+++ linux-libre-3.18.41-gnu/arch/arc/include/uapi/asm/elf.h	2016-09-02 23:42:21.000000000 -0400
@@ -13,8 +13,15 @@
 
 /* Machine specific ELF Hdr flags */
 #define EF_ARC_OSABI_MSK	0x00000f00
-#define EF_ARC_OSABI_ORIG	0x00000000   /* MUST be zero for back-compat */
-#define EF_ARC_OSABI_CURRENT	0x00000300   /* v3 (no legacy syscalls) */
+
+#define EF_ARC_OSABI_V3		0x00000300   /* v3 (no legacy syscalls) */
+#define EF_ARC_OSABI_V4		0x00000400   /* v4 (64bit data any reg align) */
+
+#if __GNUC__ < 6
+#define EF_ARC_OSABI_CURRENT	EF_ARC_OSABI_V3
+#else
+#define EF_ARC_OSABI_CURRENT	EF_ARC_OSABI_V4
+#endif
 
 typedef unsigned long elf_greg_t;
 typedef unsigned long elf_fpregset_t;
diff -druNp --no-dereference linux-libre-3.18.40-gnu/arch/arc/kernel/arcksyms.c linux-libre-3.18.41-gnu/arch/arc/kernel/arcksyms.c
--- linux-libre-3.18.40-gnu/arch/arc/kernel/arcksyms.c	2016-08-22 12:23:31.000000000 -0400
+++ linux-libre-3.18.41-gnu/arch/arc/kernel/arcksyms.c	2016-09-02 23:42:21.000000000 -0400
@@ -28,6 +28,7 @@ extern void __muldf3(void);
 extern void __divdf3(void);
 extern void __floatunsidf(void);
 extern void __floatunsisf(void);
+extern void __udivdi3(void);
 
 EXPORT_SYMBOL(__ashldi3);
 EXPORT_SYMBOL(__ashrdi3);
@@ -45,6 +46,7 @@ EXPORT_SYMBOL(__muldf3);
 EXPORT_SYMBOL(__divdf3);
 EXPORT_SYMBOL(__floatunsidf);
 EXPORT_SYMBOL(__floatunsisf);
+EXPORT_SYMBOL(__udivdi3);
 
 /* ARC optimised assembler routines */
 EXPORT_SYMBOL(memset);
diff -druNp --no-dereference linux-libre-3.18.40-gnu/arch/arc/kernel/asm-offsets.c linux-libre-3.18.41-gnu/arch/arc/kernel/asm-offsets.c
--- linux-libre-3.18.40-gnu/arch/arc/kernel/asm-offsets.c	2016-08-22 12:23:31.000000000 -0400
+++ linux-libre-3.18.41-gnu/arch/arc/kernel/asm-offsets.c	2016-09-02 23:42:21.000000000 -0400
@@ -59,5 +59,7 @@ int main(void)
 
 	DEFINE(SZ_CALLEE_REGS, sizeof(struct callee_regs));
 	DEFINE(SZ_PT_REGS, sizeof(struct pt_regs));
+	DEFINE(PT_user_r25, offsetof(struct pt_regs, user_r25));
+
 	return 0;
 }
diff -druNp --no-dereference linux-libre-3.18.40-gnu/arch/arc/kernel/process.c linux-libre-3.18.41-gnu/arch/arc/kernel/process.c
--- linux-libre-3.18.40-gnu/arch/arc/kernel/process.c	2016-08-22 12:23:31.000000000 -0400
+++ linux-libre-3.18.41-gnu/arch/arc/kernel/process.c	2016-09-02 23:42:21.000000000 -0400
@@ -223,7 +223,7 @@ int elf_check_arch(const struct elf32_hd
 		return 0;
 
 	eflags = x->e_flags;
-	if ((eflags & EF_ARC_OSABI_MSK) < EF_ARC_OSABI_CURRENT) {
+	if ((eflags & EF_ARC_OSABI_MSK) != EF_ARC_OSABI_CURRENT) {
 		pr_err("ABI mismatch - you need newer toolchain\n");
 		force_sigsegv(SIGSEGV, current);
 		return 0;
diff -druNp --no-dereference linux-libre-3.18.40-gnu/arch/arc/kernel/setup.c linux-libre-3.18.41-gnu/arch/arc/kernel/setup.c
--- linux-libre-3.18.40-gnu/arch/arc/kernel/setup.c	2016-08-22 12:23:31.000000000 -0400
+++ linux-libre-3.18.41-gnu/arch/arc/kernel/setup.c	2016-09-02 23:42:21.000000000 -0400
@@ -234,8 +234,10 @@ static char *arc_extn_mumbojumbo(int cpu
 			       cpu->dccm.base_addr, TO_KB(cpu->dccm.sz),
 			       cpu->iccm.base_addr, TO_KB(cpu->iccm.sz));
 
-	n += scnprintf(buf + n, len - n,
-		       "OS ABI [v3]\t: no-legacy-syscalls\n");
+	n += scnprintf(buf + n, len - n, "OS ABI [v%d]\t: %s\n",
+			EF_ARC_OSABI_CURRENT >> 8,
+			EF_ARC_OSABI_CURRENT == EF_ARC_OSABI_V3 ?
+			"no-legacy-syscalls" : "64-bit data any register aligned");
 
 	return buf;
 }
diff -druNp --no-dereference linux-libre-3.18.40-gnu/arch/arc/mm/cache_arc700.c linux-libre-3.18.41-gnu/arch/arc/mm/cache_arc700.c
--- linux-libre-3.18.40-gnu/arch/arc/mm/cache_arc700.c	2016-08-22 12:23:31.000000000 -0400
+++ linux-libre-3.18.41-gnu/arch/arc/mm/cache_arc700.c	2016-09-02 23:42:21.000000000 -0400
@@ -155,6 +155,15 @@ void arc_cache_init(void)
 
 	printk(arc_cache_mumbojumbo(0, str, sizeof(str)));
 
+	/*
+	 * Only master CPU needs to execute rest of function:
+	 *  - Assume SMP so all cores will have same cache config so
+	 *    any geomtry checks will be same for all
+	 *  - IOC setup / dma callbacks only need to be setup once
+	 */
+	if (cpu)
+		return;
+
 	if (IS_ENABLED(CONFIG_ARC_HAS_ICACHE)) {
 		struct cpuinfo_arc_cache *ic = &cpuinfo_arc700[cpu].icache;
 
diff -druNp --no-dereference linux-libre-3.18.40-gnu/arch/parisc/include/uapi/asm/errno.h linux-libre-3.18.41-gnu/arch/parisc/include/uapi/asm/errno.h
--- linux-libre-3.18.40-gnu/arch/parisc/include/uapi/asm/errno.h	2016-08-22 12:23:31.000000000 -0400
+++ linux-libre-3.18.41-gnu/arch/parisc/include/uapi/asm/errno.h	2016-09-02 23:42:21.000000000 -0400
@@ -97,10 +97,10 @@
 #define	ENOTCONN	235	/* Transport endpoint is not connected */
 #define	ESHUTDOWN	236	/* Cannot send after transport endpoint shutdown */
 #define	ETOOMANYREFS	237	/* Too many references: cannot splice */
-#define EREFUSED	ECONNREFUSED	/* for HP's NFS apparently */
 #define	ETIMEDOUT	238	/* Connection timed out */
 #define	ECONNREFUSED	239	/* Connection refused */
-#define EREMOTERELEASE	240	/* Remote peer released connection */
+#define	EREFUSED	ECONNREFUSED	/* for HP's NFS apparently */
+#define	EREMOTERELEASE	240	/* Remote peer released connection */
 #define	EHOSTDOWN	241	/* Host is down */
 #define	EHOSTUNREACH	242	/* No route to host */
 
diff -druNp --no-dereference linux-libre-3.18.40-gnu/arch/powerpc/kernel/eeh.c linux-libre-3.18.41-gnu/arch/powerpc/kernel/eeh.c
--- linux-libre-3.18.40-gnu/arch/powerpc/kernel/eeh.c	2016-08-22 12:23:31.000000000 -0400
+++ linux-libre-3.18.41-gnu/arch/powerpc/kernel/eeh.c	2016-09-02 23:42:21.000000000 -0400
@@ -646,7 +646,7 @@ int eeh_pci_enable(struct eeh_pe *pe, in
 	/* Check if the request is finished successfully */
 	if (active_flag) {
 		rc = eeh_ops->wait_state(pe, PCI_BUS_RESET_WAIT_MSEC);
-		if (rc <= 0)
+		if (rc < 0)
 			return rc;
 
 		if (rc & active_flag)
diff -druNp --no-dereference linux-libre-3.18.40-gnu/drivers/clocksource/sun4i_timer.c linux-libre-3.18.41-gnu/drivers/clocksource/sun4i_timer.c
--- linux-libre-3.18.40-gnu/drivers/clocksource/sun4i_timer.c	2016-08-22 12:23:31.000000000 -0400
+++ linux-libre-3.18.41-gnu/drivers/clocksource/sun4i_timer.c	2016-09-02 23:42:21.000000000 -0400
@@ -120,12 +120,16 @@ static struct clock_event_device sun4i_c
 	.set_next_event = sun4i_clkevt_next_event,
 };
 
+static void sun4i_timer_clear_interrupt(void)
+{
+	writel(TIMER_IRQ_EN(0), timer_base + TIMER_IRQ_ST_REG);
+}
 
 static irqreturn_t sun4i_timer_interrupt(int irq, void *dev_id)
 {
 	struct clock_event_device *evt = (struct clock_event_device *)dev_id;
 
-	writel(0x1, timer_base + TIMER_IRQ_ST_REG);
+	sun4i_timer_clear_interrupt();
 	evt->event_handler(evt);
 
 	return IRQ_HANDLED;
@@ -182,6 +186,9 @@ static void __init sun4i_timer_init(stru
 	/* Make sure timer is stopped before playing with interrupts */
 	sun4i_clkevt_time_stop(0);
 
+	/* clear timer0 interrupt */
+	sun4i_timer_clear_interrupt();
+
 	sun4i_clockevent.cpumask = cpu_possible_mask;
 	sun4i_clockevent.irq = irq;
 
diff -druNp --no-dereference linux-libre-3.18.40-gnu/drivers/crypto/caam/caamhash.c linux-libre-3.18.41-gnu/drivers/crypto/caam/caamhash.c
--- linux-libre-3.18.40-gnu/drivers/crypto/caam/caamhash.c	2016-08-22 12:23:31.000000000 -0400
+++ linux-libre-3.18.41-gnu/drivers/crypto/caam/caamhash.c	2016-09-02 23:42:21.000000000 -0400
@@ -1861,6 +1861,7 @@ caam_hash_alloc(struct caam_hash_templat
 			 template->name);
 		snprintf(alg->cra_driver_name, CRYPTO_MAX_ALG_NAME, "%s",
 			 template->driver_name);
+		t_alg->ahash_alg.setkey = NULL;
 	}
 	alg->cra_module = THIS_MODULE;
 	alg->cra_init = caam_hash_cra_init;
diff -druNp --no-dereference linux-libre-3.18.40-gnu/drivers/gpio/Kconfig linux-libre-3.18.41-gnu/drivers/gpio/Kconfig
--- linux-libre-3.18.40-gnu/drivers/gpio/Kconfig	2016-08-22 12:23:31.000000000 -0400
+++ linux-libre-3.18.41-gnu/drivers/gpio/Kconfig	2016-09-02 23:42:21.000000000 -0400
@@ -50,6 +50,7 @@ config GPIO_DEVRES
 config OF_GPIO
 	def_bool y
 	depends on OF
+	depends on HAS_IOMEM
 
 config GPIO_ACPI
 	def_bool y
diff -druNp --no-dereference linux-libre-3.18.40-gnu/drivers/gpu/drm/drm_crtc.c linux-libre-3.18.41-gnu/drivers/gpu/drm/drm_crtc.c
--- linux-libre-3.18.40-gnu/drivers/gpu/drm/drm_crtc.c	2016-08-22 12:23:31.000000000 -0400
+++ linux-libre-3.18.41-gnu/drivers/gpu/drm/drm_crtc.c	2016-09-02 23:42:21.000000000 -0400
@@ -4583,6 +4583,9 @@ int drm_mode_page_flip_ioctl(struct drm_
 	unsigned long flags;
 	int ret = -EINVAL;
 
+	if (!drm_core_check_feature(dev, DRIVER_MODESET))
+		return -EINVAL;
+
 	if (page_flip->flags & ~DRM_MODE_PAGE_FLIP_FLAGS ||
 	    page_flip->reserved != 0)
 		return -EINVAL;
diff -druNp --no-dereference linux-libre-3.18.40-gnu/drivers/gpu/drm/i915/i915_gem_gtt.c linux-libre-3.18.41-gnu/drivers/gpu/drm/i915/i915_gem_gtt.c
--- linux-libre-3.18.40-gnu/drivers/gpu/drm/i915/i915_gem_gtt.c	2016-08-22 12:23:31.000000000 -0400
+++ linux-libre-3.18.41-gnu/drivers/gpu/drm/i915/i915_gem_gtt.c	2016-09-02 23:42:21.000000000 -0400
@@ -1745,6 +1745,7 @@ void i915_global_gtt_cleanup(struct drm_
 		struct i915_hw_ppgtt *ppgtt = dev_priv->mm.aliasing_ppgtt;
 
 		ppgtt->base.cleanup(&ppgtt->base);
+		kfree(ppgtt);
 	}
 
 	if (drm_mm_initialized(&vm->mm)) {
diff -druNp --no-dereference linux-libre-3.18.40-gnu/drivers/gpu/drm/radeon/atombios_crtc.c linux-libre-3.18.41-gnu/drivers/gpu/drm/radeon/atombios_crtc.c
--- linux-libre-3.18.40-gnu/drivers/gpu/drm/radeon/atombios_crtc.c	2016-08-22 12:23:31.000000000 -0400
+++ linux-libre-3.18.41-gnu/drivers/gpu/drm/radeon/atombios_crtc.c	2016-09-02 23:42:21.000000000 -0400
@@ -586,7 +586,8 @@ static u32 atombios_adjust_pll(struct dr
 		if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE61(rdev) || ASIC_IS_DCE8(rdev))
 			radeon_crtc->pll_flags |= RADEON_PLL_USE_FRAC_FB_DIV;
 		/* use frac fb div on RS780/RS880 */
-		if ((rdev->family == CHIP_RS780) || (rdev->family == CHIP_RS880))
+		if (((rdev->family == CHIP_RS780) || (rdev->family == CHIP_RS880))
+		    && !radeon_crtc->ss_enabled)
 			radeon_crtc->pll_flags |= RADEON_PLL_USE_FRAC_FB_DIV;
 		if (ASIC_IS_DCE32(rdev) && mode->clock > 165000)
 			radeon_crtc->pll_flags |= RADEON_PLL_USE_FRAC_FB_DIV;
@@ -616,7 +617,9 @@ static u32 atombios_adjust_pll(struct dr
 			if (radeon_crtc->ss.refdiv) {
 				radeon_crtc->pll_flags |= RADEON_PLL_USE_REF_DIV;
 				radeon_crtc->pll_reference_div = radeon_crtc->ss.refdiv;
-				if (ASIC_IS_AVIVO(rdev))
+				if (ASIC_IS_AVIVO(rdev) &&
+				    rdev->family != CHIP_RS780 &&
+				    rdev->family != CHIP_RS880)
 					radeon_crtc->pll_flags |= RADEON_PLL_USE_FRAC_FB_DIV;
 			}
 		}
diff -druNp --no-dereference linux-libre-3.18.40-gnu/drivers/gpu/drm/radeon/radeon_ttm.c linux-libre-3.18.41-gnu/drivers/gpu/drm/radeon/radeon_ttm.c
--- linux-libre-3.18.40-gnu/drivers/gpu/drm/radeon/radeon_ttm.c	2016-08-22 12:23:31.000000000 -0400
+++ linux-libre-3.18.41-gnu/drivers/gpu/drm/radeon/radeon_ttm.c	2016-09-02 23:42:21.000000000 -0400
@@ -240,8 +240,8 @@ static int radeon_move_blit(struct ttm_b
 
 	rdev = radeon_get_rdev(bo->bdev);
 	ridx = radeon_copy_ring_index(rdev);
-	old_start = old_mem->start << PAGE_SHIFT;
-	new_start = new_mem->start << PAGE_SHIFT;
+	old_start = (u64)old_mem->start << PAGE_SHIFT;
+	new_start = (u64)new_mem->start << PAGE_SHIFT;
 
 	switch (old_mem->mem_type) {
 	case TTM_PL_VRAM:
diff -druNp --no-dereference linux-libre-3.18.40-gnu/drivers/input/keyboard/tegra-kbc.c linux-libre-3.18.41-gnu/drivers/input/keyboard/tegra-kbc.c
--- linux-libre-3.18.40-gnu/drivers/input/keyboard/tegra-kbc.c	2016-08-22 12:23:31.000000000 -0400
+++ linux-libre-3.18.41-gnu/drivers/input/keyboard/tegra-kbc.c	2016-09-02 23:42:21.000000000 -0400
@@ -376,7 +376,7 @@ static int tegra_kbc_start(struct tegra_
 	/* Reset the KBC controller to clear all previous status.*/
 	reset_control_assert(kbc->rst);
 	udelay(100);
-	reset_control_assert(kbc->rst);
+	reset_control_deassert(kbc->rst);
 	udelay(100);
 
 	tegra_kbc_config_pins(kbc);
diff -druNp --no-dereference linux-libre-3.18.40-gnu/drivers/input/serio/i8042.c linux-libre-3.18.41-gnu/drivers/input/serio/i8042.c
--- linux-libre-3.18.40-gnu/drivers/input/serio/i8042.c	2016-08-22 12:23:31.000000000 -0400
+++ linux-libre-3.18.41-gnu/drivers/input/serio/i8042.c	2016-09-02 23:42:21.000000000 -0400
@@ -1258,6 +1258,7 @@ static int __init i8042_create_aux_port(
 	serio->write		= i8042_aux_write;
 	serio->start		= i8042_start;
 	serio->stop		= i8042_stop;
+	serio->ps2_cmd_mutex	= &i8042_mutex;
 	serio->port_data	= port;
 	serio->dev.parent	= &i8042_platform_device->dev;
 	if (idx < 0) {
diff -druNp --no-dereference linux-libre-3.18.40-gnu/drivers/md/bcache/super.c linux-libre-3.18.41-gnu/drivers/md/bcache/super.c
--- linux-libre-3.18.40-gnu/drivers/md/bcache/super.c	2016-08-22 12:23:31.000000000 -0400
+++ linux-libre-3.18.41-gnu/drivers/md/bcache/super.c	2016-09-02 23:42:21.000000000 -0400
@@ -1851,7 +1851,7 @@ static int cache_alloc(struct cache_sb *
 	free = roundup_pow_of_two(ca->sb.nbuckets) >> 10;
 
 	if (!init_fifo(&ca->free[RESERVE_BTREE], 8, GFP_KERNEL) ||
-	    !init_fifo(&ca->free[RESERVE_PRIO], prio_buckets(ca), GFP_KERNEL) ||
+	    !init_fifo_exact(&ca->free[RESERVE_PRIO], prio_buckets(ca), GFP_KERNEL) ||
 	    !init_fifo(&ca->free[RESERVE_MOVINGGC], free, GFP_KERNEL) ||
 	    !init_fifo(&ca->free[RESERVE_NONE], free, GFP_KERNEL) ||
 	    !init_fifo(&ca->free_inc,	free << 2, GFP_KERNEL) ||
@@ -1876,7 +1876,7 @@ static int register_cache(struct cache_s
 				struct block_device *bdev, struct cache *ca)
 {
 	char name[BDEVNAME_SIZE];
-	const char *err = NULL;
+	const char *err = NULL; /* must be set for any error case */
 	int ret = 0;
 
 	memcpy(&ca->sb, sb, sizeof(struct cache_sb));
@@ -1893,8 +1893,13 @@ static int register_cache(struct cache_s
 		ca->discard = CACHE_DISCARD(&ca->sb);
 
 	ret = cache_alloc(sb, ca);
-	if (ret != 0)
+	if (ret != 0) {
+		if (ret == -ENOMEM)
+			err = "cache_alloc(): -ENOMEM";
+		else
+			err = "cache_alloc(): unknown error";
 		goto err;
+	}
 
 	if (kobject_add(&ca->kobj, &part_to_dev(bdev->bd_part)->kobj, "bcache")) {
 		err = "error calling kobject_add";
diff -druNp --no-dereference linux-libre-3.18.40-gnu/drivers/md/dm-flakey.c linux-libre-3.18.41-gnu/drivers/md/dm-flakey.c
--- linux-libre-3.18.40-gnu/drivers/md/dm-flakey.c	2016-08-22 12:23:31.000000000 -0400
+++ linux-libre-3.18.41-gnu/drivers/md/dm-flakey.c	2016-09-02 23:42:21.000000000 -0400
@@ -287,15 +287,13 @@ static int flakey_map(struct dm_target *
 		pb->bio_submitted = true;
 
 		/*
-		 * Map reads as normal only if corrupt_bio_byte set.
+		 * Error reads if neither corrupt_bio_byte or drop_writes are set.
+		 * Otherwise, flakey_end_io() will decide if the reads should be modified.
 		 */
 		if (bio_data_dir(bio) == READ) {
-			/* If flags were specified, only corrupt those that match. */
-			if (fc->corrupt_bio_byte && (fc->corrupt_bio_rw == READ) &&
-			    all_corrupt_bio_flags_match(bio, fc))
-				goto map_bio;
-			else
+			if (!fc->corrupt_bio_byte && !test_bit(DROP_WRITES, &fc->flags))
 				return -EIO;
+			goto map_bio;
 		}
 
 		/*
@@ -332,14 +330,21 @@ static int flakey_end_io(struct dm_targe
 	struct flakey_c *fc = ti->private;
 	struct per_bio_data *pb = dm_per_bio_data(bio, sizeof(struct per_bio_data));
 
-	/*
-	 * Corrupt successful READs while in down state.
-	 */
 	if (!error && pb->bio_submitted && (bio_data_dir(bio) == READ)) {
-		if (fc->corrupt_bio_byte)
+		if (fc->corrupt_bio_byte && (fc->corrupt_bio_rw == READ) &&
+		    all_corrupt_bio_flags_match(bio, fc)) {
+			/*
+			 * Corrupt successful matching READs while in down state.
+			 */
 			corrupt_bio_data(bio, fc);
-		else
+
+		} else if (!test_bit(DROP_WRITES, &fc->flags)) {
+			/*
+			 * Error read during the down_interval if drop_writes
+			 * wasn't configured.
+			 */
 			return -EIO;
+		}
 	}
 
 	return error;
diff -druNp --no-dereference linux-libre-3.18.40-gnu/drivers/net/ethernet/freescale/fec_main.c linux-libre-3.18.41-gnu/drivers/net/ethernet/freescale/fec_main.c
--- linux-libre-3.18.40-gnu/drivers/net/ethernet/freescale/fec_main.c	2016-08-22 12:23:31.000000000 -0400
+++ linux-libre-3.18.41-gnu/drivers/net/ethernet/freescale/fec_main.c	2016-09-02 23:42:21.000000000 -0400
@@ -3166,6 +3166,7 @@ fec_probe(struct platform_device *pdev)
 	/* setup board info structure */
 	fep = netdev_priv(ndev);
 
+	fep->netdev = ndev;
 	fep->num_rx_queues = num_rx_qs;
 	fep->num_tx_queues = num_tx_qs;
 
diff -druNp --no-dereference linux-libre-3.18.40-gnu/drivers/pci/pci-sysfs.c linux-libre-3.18.41-gnu/drivers/pci/pci-sysfs.c
--- linux-libre-3.18.40-gnu/drivers/pci/pci-sysfs.c	2016-08-22 12:23:31.000000000 -0400
+++ linux-libre-3.18.41-gnu/drivers/pci/pci-sysfs.c	2016-09-02 23:42:21.000000000 -0400
@@ -1363,10 +1363,10 @@ int __must_check pci_create_sysfs_dev_fi
 	if (!sysfs_initialized)
 		return -EACCES;
 
-	if (pdev->cfg_size < PCI_CFG_SPACE_EXP_SIZE)
-		retval = sysfs_create_bin_file(&pdev->dev.kobj, &pci_config_attr);
-	else
+	if (pdev->cfg_size > PCI_CFG_SPACE_SIZE)
 		retval = sysfs_create_bin_file(&pdev->dev.kobj, &pcie_config_attr);
+	else
+		retval = sysfs_create_bin_file(&pdev->dev.kobj, &pci_config_attr);
 	if (retval)
 		goto err;
 
@@ -1418,10 +1418,10 @@ err_rom_file:
 err_resource_files:
 	pci_remove_resource_files(pdev);
 err_config_file:
-	if (pdev->cfg_size < PCI_CFG_SPACE_EXP_SIZE)
-		sysfs_remove_bin_file(&pdev->dev.kobj, &pci_config_attr);
-	else
+	if (pdev->cfg_size > PCI_CFG_SPACE_SIZE)
 		sysfs_remove_bin_file(&pdev->dev.kobj, &pcie_config_attr);
+	else
+		sysfs_remove_bin_file(&pdev->dev.kobj, &pci_config_attr);
 err:
 	return retval;
 }
@@ -1455,10 +1455,10 @@ void pci_remove_sysfs_dev_files(struct p
 
 	pci_remove_capabilities_sysfs(pdev);
 
-	if (pdev->cfg_size < PCI_CFG_SPACE_EXP_SIZE)
-		sysfs_remove_bin_file(&pdev->dev.kobj, &pci_config_attr);
-	else
+	if (pdev->cfg_size > PCI_CFG_SPACE_SIZE)
 		sysfs_remove_bin_file(&pdev->dev.kobj, &pcie_config_attr);
+	else
+		sysfs_remove_bin_file(&pdev->dev.kobj, &pci_config_attr);
 
 	pci_remove_resource_files(pdev);
 
diff -druNp --no-dereference linux-libre-3.18.40-gnu/drivers/pci/quirks.c linux-libre-3.18.41-gnu/drivers/pci/quirks.c
--- linux-libre-3.18.40-gnu/drivers/pci/quirks.c	2016-08-22 12:23:31.000000000 -0400
+++ linux-libre-3.18.41-gnu/drivers/pci/quirks.c	2016-09-02 23:42:21.000000000 -0400
@@ -288,6 +288,18 @@ static void quirk_citrine(struct pci_dev
 }
 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_IBM,	PCI_DEVICE_ID_IBM_CITRINE,	quirk_citrine);
 
+/*
+ * This chip can cause bus lockups if config addresses above 0x600
+ * are read or written.
+ */
+static void quirk_nfp6000(struct pci_dev *dev)
+{
+	dev->cfg_size = 0x600;
+}
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NETRONOME,	PCI_DEVICE_ID_NETRONOME_NFP4000,	quirk_nfp6000);
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NETRONOME,	PCI_DEVICE_ID_NETRONOME_NFP6000,	quirk_nfp6000);
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NETRONOME,	PCI_DEVICE_ID_NETRONOME_NFP6000_VF,	quirk_nfp6000);
+
 /*  On IBM Crocodile ipr SAS adapters, expand BAR to system page size */
 static void quirk_extend_bar_to_page(struct pci_dev *dev)
 {
diff -druNp --no-dereference linux-libre-3.18.40-gnu/drivers/s390/block/dasd.c linux-libre-3.18.41-gnu/drivers/s390/block/dasd.c
--- linux-libre-3.18.40-gnu/drivers/s390/block/dasd.c	2016-08-22 12:23:31.000000000 -0400
+++ linux-libre-3.18.41-gnu/drivers/s390/block/dasd.c	2016-09-02 23:42:21.000000000 -0400
@@ -1621,9 +1621,18 @@ void dasd_int_handler(struct ccw_device
 	unsigned long long now;
 	int expires;
 
+	cqr = (struct dasd_ccw_req *) intparm;
 	if (IS_ERR(irb)) {
 		switch (PTR_ERR(irb)) {
 		case -EIO:
+			if (cqr && cqr->status == DASD_CQR_CLEAR_PENDING) {
+				device = (struct dasd_device *) cqr->startdev;
+				cqr->status = DASD_CQR_CLEARED;
+				dasd_device_clear_timer(device);
+				wake_up(&dasd_flush_wq);
+				dasd_schedule_device_bh(device);
+				return;
+			}
 			break;
 		case -ETIMEDOUT:
 			DBF_EVENT_DEVID(DBF_WARNING, cdev, "%s: "
@@ -1639,7 +1648,6 @@ void dasd_int_handler(struct ccw_device
 	}
 
 	now = get_tod_clock();
-	cqr = (struct dasd_ccw_req *) intparm;
 	/* check for conditions that should be handled immediately */
 	if (!cqr ||
 	    !(scsw_dstat(&irb->scsw) == (DEV_STAT_CHN_END | DEV_STAT_DEV_END) &&
diff -druNp --no-dereference linux-libre-3.18.40-gnu/drivers/scsi/aacraid/commctrl.c linux-libre-3.18.41-gnu/drivers/scsi/aacraid/commctrl.c
--- linux-libre-3.18.40-gnu/drivers/scsi/aacraid/commctrl.c	2016-08-22 12:23:31.000000000 -0400
+++ linux-libre-3.18.41-gnu/drivers/scsi/aacraid/commctrl.c	2016-09-02 23:42:21.000000000 -0400
@@ -63,7 +63,7 @@ static int ioctl_send_fib(struct aac_dev
 	struct fib *fibptr;
 	struct hw_fib * hw_fib = (struct hw_fib *)0;
 	dma_addr_t hw_fib_pa = (dma_addr_t)0LL;
-	unsigned size;
+	unsigned int size, osize;
 	int retval;
 
 	if (dev->in_reset) {
@@ -87,7 +87,8 @@ static int ioctl_send_fib(struct aac_dev
 	 *	will not overrun the buffer when we copy the memory. Return
 	 *	an error if we would.
 	 */
-	size = le16_to_cpu(kfib->header.Size) + sizeof(struct aac_fibhdr);
+	osize = size = le16_to_cpu(kfib->header.Size) +
+		sizeof(struct aac_fibhdr);
 	if (size < le16_to_cpu(kfib->header.SenderSize))
 		size = le16_to_cpu(kfib->header.SenderSize);
 	if (size > dev->max_fib_size) {
@@ -118,6 +119,14 @@ static int ioctl_send_fib(struct aac_dev
 		goto cleanup;
 	}
 
+	/* Sanity check the second copy */
+	if ((osize != le16_to_cpu(kfib->header.Size) +
+		sizeof(struct aac_fibhdr))
+		|| (size < le16_to_cpu(kfib->header.SenderSize))) {
+		retval = -EINVAL;
+		goto cleanup;
+	}
+
 	if (kfib->header.Command == cpu_to_le16(TakeABreakPt)) {
 		aac_adapter_interrupt(dev);
 		/*
diff -druNp --no-dereference linux-libre-3.18.40-gnu/drivers/usb/class/cdc-acm.c linux-libre-3.18.41-gnu/drivers/usb/class/cdc-acm.c
--- linux-libre-3.18.40-gnu/drivers/usb/class/cdc-acm.c	2016-08-22 12:23:31.000000000 -0400
+++ linux-libre-3.18.41-gnu/drivers/usb/class/cdc-acm.c	2016-09-02 23:42:21.000000000 -0400
@@ -1342,7 +1342,6 @@ made_compressed_probe:
 	spin_lock_init(&acm->write_lock);
 	spin_lock_init(&acm->read_lock);
 	mutex_init(&acm->mutex);
-	acm->rx_endpoint = usb_rcvbulkpipe(usb_dev, epread->bEndpointAddress);
 	acm->is_int_ep = usb_endpoint_xfer_int(epread);
 	if (acm->is_int_ep)
 		acm->bInterval = epread->bInterval;
@@ -1392,14 +1391,14 @@ made_compressed_probe:
 		urb->transfer_dma = rb->dma;
 		if (acm->is_int_ep) {
 			usb_fill_int_urb(urb, acm->dev,
-					 acm->rx_endpoint,
+					 usb_rcvintpipe(usb_dev, epread->bEndpointAddress),
 					 rb->base,
 					 acm->readsize,
 					 acm_read_bulk_callback, rb,
 					 acm->bInterval);
 		} else {
 			usb_fill_bulk_urb(urb, acm->dev,
-					  acm->rx_endpoint,
+					  usb_rcvbulkpipe(usb_dev, epread->bEndpointAddress),
 					  rb->base,
 					  acm->readsize,
 					  acm_read_bulk_callback, rb);
diff -druNp --no-dereference linux-libre-3.18.40-gnu/drivers/usb/class/cdc-acm.h linux-libre-3.18.41-gnu/drivers/usb/class/cdc-acm.h
--- linux-libre-3.18.40-gnu/drivers/usb/class/cdc-acm.h	2016-08-22 12:23:31.000000000 -0400
+++ linux-libre-3.18.41-gnu/drivers/usb/class/cdc-acm.h	2016-09-02 23:42:21.000000000 -0400
@@ -95,7 +95,6 @@ struct acm {
 	struct urb *read_urbs[ACM_NR];
 	struct acm_rb read_buffers[ACM_NR];
 	int rx_buflimit;
-	int rx_endpoint;
 	spinlock_t read_lock;
 	int write_used;					/* number of non-empty write buffers */
 	int transmitting;
diff -druNp --no-dereference linux-libre-3.18.40-gnu/drivers/usb/core/hub.c linux-libre-3.18.41-gnu/drivers/usb/core/hub.c
--- linux-libre-3.18.40-gnu/drivers/usb/core/hub.c	2016-08-22 12:23:31.000000000 -0400
+++ linux-libre-3.18.41-gnu/drivers/usb/core/hub.c	2016-09-02 23:42:21.000000000 -0400
@@ -1298,8 +1298,6 @@ static void hub_quiesce(struct usb_hub *
 	struct usb_device *hdev = hub->hdev;
 	int i;
 
-	cancel_delayed_work_sync(&hub->init_work);
-
 	/* hub_wq and related activity won't re-trigger */
 	hub->quiescing = 1;
 
diff -druNp --no-dereference linux-libre-3.18.40-gnu/drivers/usb/dwc3/gadget.c linux-libre-3.18.41-gnu/drivers/usb/dwc3/gadget.c
--- linux-libre-3.18.40-gnu/drivers/usb/dwc3/gadget.c	2016-08-22 12:23:31.000000000 -0400
+++ linux-libre-3.18.41-gnu/drivers/usb/dwc3/gadget.c	2016-09-02 23:42:21.000000000 -0400
@@ -1802,7 +1802,8 @@ static void dwc3_gadget_free_endpoints(s
 
 static int __dwc3_cleanup_done_trbs(struct dwc3 *dwc, struct dwc3_ep *dep,
 		struct dwc3_request *req, struct dwc3_trb *trb,
-		const struct dwc3_event_depevt *event, int status)
+		const struct dwc3_event_depevt *event, int status,
+		int chain)
 {
 	unsigned int		count;
 	unsigned int		s_pkt = 0;
@@ -1810,6 +1811,19 @@ static int __dwc3_cleanup_done_trbs(stru
 
 	trace_dwc3_complete_trb(dep, trb);
 
+	/*
+	 * If we're in the middle of series of chained TRBs and we
+	 * receive a short transfer along the way, DWC3 will skip
+	 * through all TRBs including the last TRB in the chain (the
+	 * where CHN bit is zero. DWC3 will also avoid clearing HWO
+	 * bit and SW has to do it manually.
+	 *
+	 * We're going to do that here to avoid problems of HW trying
+	 * to use bogus TRBs for transfers.
+	 */
+	if (chain && (trb->ctrl & DWC3_TRB_CTRL_HWO))
+		trb->ctrl &= ~DWC3_TRB_CTRL_HWO;
+
 	if ((trb->ctrl & DWC3_TRB_CTRL_HWO) && status != -ESHUTDOWN)
 		/*
 		 * We continue despite the error. There is not much we
@@ -1821,6 +1835,7 @@ static int __dwc3_cleanup_done_trbs(stru
 		 */
 		dev_err(dwc->dev, "%s's TRB (%p) still owned by HW\n",
 				dep->name, trb);
+
 	count = trb->size & DWC3_TRB_SIZE_MASK;
 
 	if (dep->direction) {
@@ -1858,15 +1873,7 @@ static int __dwc3_cleanup_done_trbs(stru
 			s_pkt = 1;
 	}
 
-	/*
-	 * We assume here we will always receive the entire data block
-	 * which we should receive. Meaning, if we program RX to
-	 * receive 4K but we receive only 2K, we assume that's all we
-	 * should receive and we simply bounce the request back to the
-	 * gadget driver for further processing.
-	 */
-	req->request.actual += req->request.length - count;
-	if (s_pkt)
+	if (s_pkt && !chain)
 		return 1;
 	if ((event->status & DEPEVT_STATUS_LST) &&
 			(trb->ctrl & (DWC3_TRB_CTRL_LST |
@@ -1885,14 +1892,19 @@ static int dwc3_cleanup_done_reqs(struct
 	struct dwc3_trb		*trb;
 	unsigned int		slot;
 	unsigned int		i;
+	int			count = 0;
 	int			ret;
 
 	do {
+		int chain;
+
 		req = next_request(&dep->req_queued);
 		if (!req) {
 			WARN_ON_ONCE(1);
 			return 1;
 		}
+
+		chain = req->request.num_mapped_sgs > 0;
 		i = 0;
 		do {
 			slot = req->start_slot + i;
@@ -1901,13 +1913,22 @@ static int dwc3_cleanup_done_reqs(struct
 				slot++;
 			slot %= DWC3_TRB_NUM;
 			trb = &dep->trb_pool[slot];
+			count += trb->size & DWC3_TRB_SIZE_MASK;
 
 			ret = __dwc3_cleanup_done_trbs(dwc, dep, req, trb,
-					event, status);
+					event, status, chain);
 			if (ret)
 				break;
 		}while (++i < req->request.num_mapped_sgs);
 
+		/*
+		 * We assume here we will always receive the entire data block
+		 * which we should receive. Meaning, if we program RX to
+		 * receive 4K but we receive only 2K, we assume that's all we
+		 * should receive and we simply bounce the request back to the
+		 * gadget driver for further processing.
+		 */
+		req->request.actual += req->request.length - count;
 		dwc3_gadget_giveback(dep, req, status);
 
 		if (ret)
diff -druNp --no-dereference linux-libre-3.18.40-gnu/drivers/usb/host/xhci-hub.c linux-libre-3.18.41-gnu/drivers/usb/host/xhci-hub.c
--- linux-libre-3.18.40-gnu/drivers/usb/host/xhci-hub.c	2016-08-22 12:23:31.000000000 -0400
+++ linux-libre-3.18.41-gnu/drivers/usb/host/xhci-hub.c	2016-09-02 23:42:21.000000000 -0400
@@ -276,6 +276,9 @@ static int xhci_stop_device(struct xhci_
 
 	ret = 0;
 	virt_dev = xhci->devs[slot_id];
+	if (!virt_dev)
+		return -ENODEV;
+
 	cmd = xhci_alloc_command(xhci, false, true, GFP_NOIO);
 	if (!cmd) {
 		xhci_dbg(xhci, "Couldn't allocate command structure.\n");
diff -druNp --no-dereference linux-libre-3.18.40-gnu/drivers/usb/host/xhci-ring.c linux-libre-3.18.41-gnu/drivers/usb/host/xhci-ring.c
--- linux-libre-3.18.40-gnu/drivers/usb/host/xhci-ring.c	2016-08-22 12:23:31.000000000 -0400
+++ linux-libre-3.18.41-gnu/drivers/usb/host/xhci-ring.c	2016-09-02 23:42:21.000000000 -0400
@@ -1324,12 +1324,6 @@ static void handle_cmd_completion(struct
 
 	cmd = list_entry(xhci->cmd_list.next, struct xhci_command, cmd_list);
 
-	if (cmd->command_trb != xhci->cmd_ring->dequeue) {
-		xhci_err(xhci,
-			 "Command completion event does not match command\n");
-		return;
-	}
-
 	del_timer(&xhci->cmd_timer);
 
 	trace_xhci_cmd_completion(cmd_trb, (struct xhci_generic_trb *) event);
@@ -1341,6 +1335,13 @@ static void handle_cmd_completion(struct
 		xhci_handle_stopped_cmd_ring(xhci, cmd);
 		return;
 	}
+
+	if (cmd->command_trb != xhci->cmd_ring->dequeue) {
+		xhci_err(xhci,
+			 "Command completion event does not match command\n");
+		return;
+	}
+
 	/*
 	 * Host aborted the command ring, check if the current command was
 	 * supposed to be aborted, otherwise continue normally.
diff -druNp --no-dereference linux-libre-3.18.40-gnu/drivers/usb/misc/usbtest.c linux-libre-3.18.41-gnu/drivers/usb/misc/usbtest.c
--- linux-libre-3.18.40-gnu/drivers/usb/misc/usbtest.c	2016-08-22 12:23:31.000000000 -0400
+++ linux-libre-3.18.41-gnu/drivers/usb/misc/usbtest.c	2016-09-02 23:42:21.000000000 -0400
@@ -545,7 +545,6 @@ static void sg_timeout(unsigned long _re
 {
 	struct usb_sg_request	*req = (struct usb_sg_request *) _req;
 
-	req->status = -ETIMEDOUT;
 	usb_sg_cancel(req);
 }
 
@@ -576,8 +575,10 @@ static int perform_sglist(
 		mod_timer(&sg_timer, jiffies +
 				msecs_to_jiffies(SIMPLE_IO_TIMEOUT));
 		usb_sg_wait(req);
-		del_timer_sync(&sg_timer);
-		retval = req->status;
+		if (!del_timer_sync(&sg_timer))
+			retval = -ETIMEDOUT;
+		else
+			retval = req->status;
 
 		/* FIXME check resulting data pattern */
 
diff -druNp --no-dereference linux-libre-3.18.40-gnu/drivers/usb/serial/ftdi_sio.c linux-libre-3.18.41-gnu/drivers/usb/serial/ftdi_sio.c
--- linux-libre-3.18.40-gnu/drivers/usb/serial/ftdi_sio.c	2016-08-22 12:23:31.000000000 -0400
+++ linux-libre-3.18.41-gnu/drivers/usb/serial/ftdi_sio.c	2016-09-02 23:42:21.000000000 -0400
@@ -648,6 +648,8 @@ static const struct usb_device_id id_tab
 	{ USB_DEVICE(FTDI_VID, FTDI_ELV_TFD128_PID) },
 	{ USB_DEVICE(FTDI_VID, FTDI_ELV_FM3RX_PID) },
 	{ USB_DEVICE(FTDI_VID, FTDI_ELV_WS777_PID) },
+	{ USB_DEVICE(FTDI_VID, FTDI_PALMSENS_PID) },
+	{ USB_DEVICE(FTDI_VID, FTDI_IVIUM_XSTAT_PID) },
 	{ USB_DEVICE(FTDI_VID, LINX_SDMUSBQSS_PID) },
 	{ USB_DEVICE(FTDI_VID, LINX_MASTERDEVEL2_PID) },
 	{ USB_DEVICE(FTDI_VID, LINX_FUTURE_0_PID) },
@@ -1008,6 +1010,7 @@ static const struct usb_device_id id_tab
 	{ USB_DEVICE(ICPDAS_VID, ICPDAS_I7560U_PID) },
 	{ USB_DEVICE(ICPDAS_VID, ICPDAS_I7561U_PID) },
 	{ USB_DEVICE(ICPDAS_VID, ICPDAS_I7563U_PID) },
+	{ USB_DEVICE(WICED_VID, WICED_USB20706V2_PID) },
 	{ }					/* Terminating entry */
 };
 
diff -druNp --no-dereference linux-libre-3.18.40-gnu/drivers/usb/serial/ftdi_sio_ids.h linux-libre-3.18.41-gnu/drivers/usb/serial/ftdi_sio_ids.h
--- linux-libre-3.18.40-gnu/drivers/usb/serial/ftdi_sio_ids.h	2016-08-22 12:23:31.000000000 -0400
+++ linux-libre-3.18.41-gnu/drivers/usb/serial/ftdi_sio_ids.h	2016-09-02 23:42:21.000000000 -0400
@@ -406,6 +406,12 @@
 #define FTDI_4N_GALAXY_DE_3_PID	0xF3C2
 
 /*
+ * Ivium Technologies product IDs
+ */
+#define FTDI_PALMSENS_PID	0xf440
+#define FTDI_IVIUM_XSTAT_PID	0xf441
+
+/*
  * Linx Technologies product ids
  */
 #define LINX_SDMUSBQSS_PID	0xF448	/* Linx SDM-USB-QS-S */
@@ -673,6 +679,12 @@
 #define INTREPID_NEOVI_PID	0x0701
 
 /*
+ * WICED USB UART
+ */
+#define WICED_VID		0x0A5C
+#define WICED_USB20706V2_PID	0x6422
+
+/*
  * Definitions for ID TECH (www.idt-net.com) devices
  */
 #define IDTECH_VID		0x0ACD	/* ID TECH Vendor ID */
diff -druNp --no-dereference linux-libre-3.18.40-gnu/drivers/usb/serial/option.c linux-libre-3.18.41-gnu/drivers/usb/serial/option.c
--- linux-libre-3.18.40-gnu/drivers/usb/serial/option.c	2016-08-22 12:23:31.000000000 -0400
+++ linux-libre-3.18.41-gnu/drivers/usb/serial/option.c	2016-09-02 23:42:21.000000000 -0400
@@ -276,6 +276,12 @@ static void option_instat_callback(struc
 #define TELIT_PRODUCT_LE920			0x1200
 #define TELIT_PRODUCT_LE910			0x1201
 #define TELIT_PRODUCT_LE910_USBCFG4		0x1206
+#define TELIT_PRODUCT_LE920A4_1207		0x1207
+#define TELIT_PRODUCT_LE920A4_1208		0x1208
+#define TELIT_PRODUCT_LE920A4_1211		0x1211
+#define TELIT_PRODUCT_LE920A4_1212		0x1212
+#define TELIT_PRODUCT_LE920A4_1213		0x1213
+#define TELIT_PRODUCT_LE920A4_1214		0x1214
 
 /* ZTE PRODUCTS */
 #define ZTE_VENDOR_ID				0x19d2
@@ -637,6 +643,11 @@ static const struct option_blacklist_inf
 	.reserved = BIT(8) | BIT(10) | BIT(11),
 };
 
+static const struct option_blacklist_info telit_le920a4_blacklist_1 = {
+	.sendsetup = BIT(0),
+	.reserved = BIT(1),
+};
+
 static const struct option_blacklist_info telit_le922_blacklist_usbcfg0 = {
 	.sendsetup = BIT(2),
 	.reserved = BIT(0) | BIT(1) | BIT(3),
@@ -1215,6 +1226,16 @@ static const struct usb_device_id option
 		.driver_info = (kernel_ulong_t)&telit_le922_blacklist_usbcfg3 },
 	{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE920),
 		.driver_info = (kernel_ulong_t)&telit_le920_blacklist },
+	{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE920A4_1207) },
+	{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE920A4_1208),
+		.driver_info = (kernel_ulong_t)&telit_le920a4_blacklist_1 },
+	{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE920A4_1211),
+		.driver_info = (kernel_ulong_t)&telit_le922_blacklist_usbcfg3 },
+	{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE920A4_1212),
+		.driver_info = (kernel_ulong_t)&telit_le920a4_blacklist_1 },
+	{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, TELIT_PRODUCT_LE920A4_1213, 0xff) },
+	{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE920A4_1214),
+		.driver_info = (kernel_ulong_t)&telit_le922_blacklist_usbcfg3 },
 	{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MF622, 0xff, 0xff, 0xff) }, /* ZTE WCDMA products */
 	{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0002, 0xff, 0xff, 0xff),
 		.driver_info = (kernel_ulong_t)&net_intf1_blacklist },
@@ -1975,6 +1996,7 @@ static const struct usb_device_id option
 	  .driver_info = (kernel_ulong_t)&net_intf4_blacklist },
 	{ USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x3e01, 0xff, 0xff, 0xff) }, /* D-Link DWM-152/C1 */
 	{ USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x3e02, 0xff, 0xff, 0xff) }, /* D-Link DWM-156/C1 */
+	{ USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x7e11, 0xff, 0xff, 0xff) }, /* D-Link DWM-156/A3 */
 	{ USB_DEVICE_INTERFACE_CLASS(0x2020, 0x4000, 0xff) },                /* OLICARD300 - MT6225 */
 	{ USB_DEVICE(INOVIA_VENDOR_ID, INOVIA_SEW858) },
 	{ USB_DEVICE(VIATELECOM_VENDOR_ID, VIATELECOM_PRODUCT_CDS7) },
diff -druNp --no-dereference linux-libre-3.18.40-gnu/drivers/usb/serial/usb-serial.c linux-libre-3.18.41-gnu/drivers/usb/serial/usb-serial.c
--- linux-libre-3.18.40-gnu/drivers/usb/serial/usb-serial.c	2016-08-22 12:23:31.000000000 -0400
+++ linux-libre-3.18.41-gnu/drivers/usb/serial/usb-serial.c	2016-09-02 23:42:21.000000000 -0400
@@ -1416,7 +1416,7 @@ int usb_serial_register_drivers(struct u
 
 	rc = usb_register(udriver);
 	if (rc)
-		return rc;
+		goto failed_usb_register;
 
 	for (sd = serial_drivers; *sd; ++sd) {
 		(*sd)->usb_driver = udriver;
@@ -1434,6 +1434,8 @@ int usb_serial_register_drivers(struct u
 	while (sd-- > serial_drivers)
 		usb_serial_deregister(*sd);
 	usb_deregister(udriver);
+failed_usb_register:
+	kfree(udriver);
 	return rc;
 }
 EXPORT_SYMBOL_GPL(usb_serial_register_drivers);
diff -druNp --no-dereference linux-libre-3.18.40-gnu/drivers/xen/xenbus/xenbus_dev_frontend.c linux-libre-3.18.41-gnu/drivers/xen/xenbus/xenbus_dev_frontend.c
--- linux-libre-3.18.40-gnu/drivers/xen/xenbus/xenbus_dev_frontend.c	2016-08-22 12:23:31.000000000 -0400
+++ linux-libre-3.18.41-gnu/drivers/xen/xenbus/xenbus_dev_frontend.c	2016-09-02 23:42:21.000000000 -0400
@@ -316,7 +316,7 @@ static int xenbus_write_transaction(unsi
 			rc = -ENOMEM;
 			goto out;
 		}
-	} else {
+	} else if (msg_type == XS_TRANSACTION_END) {
 		list_for_each_entry(trans, &u->transactions, list)
 			if (trans->handle.id == u->u.msg.tx_id)
 				break;
diff -druNp --no-dereference linux-libre-3.18.40-gnu/fs/seq_file.c linux-libre-3.18.41-gnu/fs/seq_file.c
--- linux-libre-3.18.40-gnu/fs/seq_file.c	2016-08-22 12:23:31.000000000 -0400
+++ linux-libre-3.18.41-gnu/fs/seq_file.c	2016-09-02 23:42:21.000000000 -0400
@@ -219,8 +219,10 @@ ssize_t seq_read(struct file *file, char
 		size -= n;
 		buf += n;
 		copied += n;
-		if (!m->count)
+		if (!m->count) {
+			m->from = 0;
 			m->index++;
+		}
 		if (!size)
 			goto Done;
 	}
diff -druNp --no-dereference linux-libre-3.18.40-gnu/fs/ubifs/tnc_commit.c linux-libre-3.18.41-gnu/fs/ubifs/tnc_commit.c
--- linux-libre-3.18.40-gnu/fs/ubifs/tnc_commit.c	2016-08-22 12:23:31.000000000 -0400
+++ linux-libre-3.18.41-gnu/fs/ubifs/tnc_commit.c	2016-09-02 23:42:21.000000000 -0400
@@ -370,7 +370,7 @@ static int layout_in_gaps(struct ubifs_i
 
 	p = c->gap_lebs;
 	do {
-		ubifs_assert(p < c->gap_lebs + sizeof(int) * c->lst.idx_lebs);
+		ubifs_assert(p < c->gap_lebs + c->lst.idx_lebs);
 		written = layout_leb_in_gaps(c, p);
 		if (written < 0) {
 			err = written;
diff -druNp --no-dereference linux-libre-3.18.40-gnu/include/linux/pci_ids.h linux-libre-3.18.41-gnu/include/linux/pci_ids.h
--- linux-libre-3.18.40-gnu/include/linux/pci_ids.h	2016-08-22 12:23:31.000000000 -0400
+++ linux-libre-3.18.41-gnu/include/linux/pci_ids.h	2016-09-02 23:42:21.000000000 -0400
@@ -2478,6 +2478,13 @@
 #define PCI_DEVICE_ID_KORENIX_JETCARDF2	0x1700
 #define PCI_DEVICE_ID_KORENIX_JETCARDF3	0x17ff
 
+#define PCI_VENDOR_ID_NETRONOME		0x19ee
+#define PCI_DEVICE_ID_NETRONOME_NFP3200	0x3200
+#define PCI_DEVICE_ID_NETRONOME_NFP3240	0x3240
+#define PCI_DEVICE_ID_NETRONOME_NFP4000	0x4000
+#define PCI_DEVICE_ID_NETRONOME_NFP6000	0x6000
+#define PCI_DEVICE_ID_NETRONOME_NFP6000_VF	0x6003
+
 #define PCI_VENDOR_ID_QMI		0x1a32
 
 #define PCI_VENDOR_ID_AZWAVE		0x1a3b
diff -druNp --no-dereference linux-libre-3.18.40-gnu/kernel/events/uprobes.c linux-libre-3.18.41-gnu/kernel/events/uprobes.c
--- linux-libre-3.18.40-gnu/kernel/events/uprobes.c	2016-08-22 12:23:31.000000000 -0400
+++ linux-libre-3.18.41-gnu/kernel/events/uprobes.c	2016-09-02 23:42:21.000000000 -0400
@@ -179,8 +179,10 @@ static int __replace_page(struct vm_area
 	mmu_notifier_invalidate_range_start(mm, mmun_start, mmun_end);
 	err = -EAGAIN;
 	ptep = page_check_address(page, mm, addr, &ptl, 0);
-	if (!ptep)
+	if (!ptep) {
+		mem_cgroup_cancel_charge(kpage, memcg);
 		goto unlock;
+	}
 
 	get_page(kpage);
 	page_add_new_anon_rmap(kpage, vma, addr);
@@ -207,7 +209,6 @@ static int __replace_page(struct vm_area
 
 	err = 0;
  unlock:
-	mem_cgroup_cancel_charge(kpage, memcg);
 	mmu_notifier_invalidate_range_end(mm, mmun_start, mmun_end);
 	unlock_page(page);
 	return err;
diff -druNp --no-dereference linux-libre-3.18.40-gnu/kernel/time/timekeeping_debug.c linux-libre-3.18.41-gnu/kernel/time/timekeeping_debug.c
--- linux-libre-3.18.40-gnu/kernel/time/timekeeping_debug.c	2016-08-22 12:23:31.000000000 -0400
+++ linux-libre-3.18.41-gnu/kernel/time/timekeeping_debug.c	2016-09-02 23:42:21.000000000 -0400
@@ -23,7 +23,9 @@
 
 #include "timekeeping_internal.h"
 
-static unsigned int sleep_time_bin[32] = {0};
+#define NUM_BINS 32
+
+static unsigned int sleep_time_bin[NUM_BINS] = {0};
 
 static int tk_debug_show_sleep_time(struct seq_file *s, void *data)
 {
@@ -69,6 +71,9 @@ late_initcall(tk_debug_sleep_time_init);
 
 void tk_debug_account_sleep_time(struct timespec64 *t)
 {
-	sleep_time_bin[fls(t->tv_sec)]++;
+	/* Cap bin index so we don't overflow the array */
+	int bin = min(fls(t->tv_sec), NUM_BINS-1);
+
+	sleep_time_bin[bin]++;
 }
 
diff -druNp --no-dereference linux-libre-3.18.40-gnu/Makefile linux-libre-3.18.41-gnu/Makefile
--- linux-libre-3.18.40-gnu/Makefile	2016-08-23 12:11:51.000000000 -0400
+++ linux-libre-3.18.41-gnu/Makefile	2016-09-05 21:49:03.000000000 -0400
@@ -1,6 +1,6 @@
 VERSION = 3
 PATCHLEVEL = 18
-SUBLEVEL = 40
+SUBLEVEL = 41
 EXTRAVERSION =-gnu
 NAME = Diseased Newt
 
diff -druNp --no-dereference linux-libre-3.18.40-gnu/net/ipv4/tcp_input.c linux-libre-3.18.41-gnu/net/ipv4/tcp_input.c
--- linux-libre-3.18.40-gnu/net/ipv4/tcp_input.c	2016-08-22 12:23:31.000000000 -0400
+++ linux-libre-3.18.41-gnu/net/ipv4/tcp_input.c	2016-09-02 23:42:21.000000000 -0400
@@ -88,7 +88,7 @@ int sysctl_tcp_adv_win_scale __read_most
 EXPORT_SYMBOL(sysctl_tcp_adv_win_scale);
 
 /* rfc5961 challenge ack rate limiting */
-int sysctl_tcp_challenge_ack_limit = 100;
+int sysctl_tcp_challenge_ack_limit = 1000;
 
 int sysctl_tcp_stdurg __read_mostly;
 int sysctl_tcp_rfc1337 __read_mostly;
@@ -3324,13 +3324,18 @@ static void tcp_send_challenge_ack(struc
 	/* unprotected vars, we dont care of overwrites */
 	static u32 challenge_timestamp;
 	static unsigned int challenge_count;
-	u32 now = jiffies / HZ;
+	u32 count, now = jiffies / HZ;
 
 	if (now != challenge_timestamp) {
+		u32 half = (sysctl_tcp_challenge_ack_limit + 1) >> 1;
+
 		challenge_timestamp = now;
-		challenge_count = 0;
+		WRITE_ONCE(challenge_count, half +
+			   prandom_u32_max(sysctl_tcp_challenge_ack_limit));
 	}
-	if (++challenge_count <= sysctl_tcp_challenge_ack_limit) {
+	count = READ_ONCE(challenge_count);
+	if (count > 0) {
+		WRITE_ONCE(challenge_count, count - 1);
 		NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPCHALLENGEACK);
 		tcp_send_ack(sk);
 	}
diff -druNp --no-dereference linux-libre-3.18.40-gnu/net/mac80211/cfg.c linux-libre-3.18.41-gnu/net/mac80211/cfg.c
--- linux-libre-3.18.40-gnu/net/mac80211/cfg.c	2016-08-22 12:23:31.000000000 -0400
+++ linux-libre-3.18.41-gnu/net/mac80211/cfg.c	2016-09-02 23:42:21.000000000 -0400
@@ -865,7 +865,7 @@ static int ieee80211_stop_ap(struct wiph
 
 	/* free all potentially still buffered bcast frames */
 	local->total_ps_buffered -= skb_queue_len(&sdata->u.ap.ps.bc_buf);
-	skb_queue_purge(&sdata->u.ap.ps.bc_buf);
+	ieee80211_purge_tx_queue(&local->hw, &sdata->u.ap.ps.bc_buf);
 
 	mutex_lock(&local->mtx);
 	ieee80211_vif_copy_chanctx_to_vlans(sdata, true);
diff -druNp --no-dereference linux-libre-3.18.40-gnu/net/mac80211/tx.c linux-libre-3.18.41-gnu/net/mac80211/tx.c
--- linux-libre-3.18.40-gnu/net/mac80211/tx.c	2016-08-22 12:23:31.000000000 -0400
+++ linux-libre-3.18.41-gnu/net/mac80211/tx.c	2016-09-02 23:42:21.000000000 -0400
@@ -353,7 +353,7 @@ static void purge_old_ps_buffers(struct
 		skb = skb_dequeue(&ps->bc_buf);
 		if (skb) {
 			purged++;
-			dev_kfree_skb(skb);
+			ieee80211_free_txskb(&local->hw, skb);
 		}
 		total += skb_queue_len(&ps->bc_buf);
 	}
@@ -436,7 +436,7 @@ ieee80211_tx_h_multicast_ps_buf(struct i
 	if (skb_queue_len(&ps->bc_buf) >= AP_MAX_BC_BUFFER) {
 		ps_dbg(tx->sdata,
 		       "BC TX buffer full - dropping the oldest frame\n");
-		dev_kfree_skb(skb_dequeue(&ps->bc_buf));
+		ieee80211_free_txskb(&tx->local->hw, skb_dequeue(&ps->bc_buf));
 	} else
 		tx->local->total_ps_buffered++;
 
@@ -2999,7 +2999,7 @@ ieee80211_get_buffered_bc(struct ieee802
 			sdata = IEEE80211_DEV_TO_SUB_IF(skb->dev);
 		if (!ieee80211_tx_prepare(sdata, &tx, skb))
 			break;
-		dev_kfree_skb_any(skb);
+		ieee80211_free_txskb(hw, skb);
 	}
 
 	info = IEEE80211_SKB_CB(skb);
