diff -druNp --no-dereference linux-libre-3.18.29-gnu/arch/arm/boot/dts/dra7.dtsi linux-libre-3.18.30-gnu/arch/arm/boot/dts/dra7.dtsi
--- linux-libre-3.18.29-gnu/arch/arm/boot/dts/dra7.dtsi	2016-03-17 14:09:52.000000000 -0400
+++ linux-libre-3.18.30-gnu/arch/arm/boot/dts/dra7.dtsi	2016-04-03 18:27:20.000000000 -0400
@@ -34,6 +34,8 @@
 		serial3 = &uart4;
 		serial4 = &uart5;
 		serial5 = &uart6;
+		ethernet0 = &cpsw_emac0;
+		ethernet1 = &cpsw_emac1;
 	};
 
 	timer {
@@ -1265,6 +1267,75 @@
 			ti,irqs-skip = <10 133 139 140>;
 			ti,irqs-safe-map = <0>;
 		};
+
+		mac: ethernet@4a100000 {
+			compatible = "ti,cpsw";
+			ti,hwmods = "gmac";
+			clocks = <&dpll_gmac_ck>, <&gmac_gmii_ref_clk_div>;
+			clock-names = "fck", "cpts";
+			cpdma_channels = <8>;
+			ale_entries = <1024>;
+			bd_ram_size = <0x2000>;
+			no_bd_ram = <0>;
+			rx_descs = <64>;
+			mac_control = <0x20>;
+			slaves = <2>;
+			active_slave = <0>;
+			cpts_clock_mult = <0x80000000>;
+			cpts_clock_shift = <29>;
+			reg = <0x48484000 0x1000
+			       0x48485200 0x2E00>;
+			#address-cells = <1>;
+			#size-cells = <1>;
+
+			/*
+			 * Do not allow gating of cpsw clock as workaround
+			 * for errata i877. Keeping internal clock disabled
+			 * causes the device switching characteristics
+			 * to degrade over time and eventually fail to meet
+			 * the data manual delay time/skew specs.
+			 */
+			ti,no-idle;
+
+			/*
+			 * rx_thresh_pend
+			 * rx_pend
+			 * tx_pend
+			 * misc_pend
+			 */
+			interrupts = <GIC_SPI 334 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 335 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 336 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 337 IRQ_TYPE_LEVEL_HIGH>;
+			ranges;
+			status = "disabled";
+
+			davinci_mdio: mdio@48485000 {
+				compatible = "ti,davinci_mdio";
+				#address-cells = <1>;
+				#size-cells = <0>;
+				ti,hwmods = "davinci_mdio";
+				bus_freq = <1000000>;
+				reg = <0x48485000 0x100>;
+			};
+
+			cpsw_emac0: slave@48480200 {
+				/* Filled in by U-Boot */
+				mac-address = [ 00 00 00 00 00 00 ];
+			};
+
+			cpsw_emac1: slave@48480300 {
+				/* Filled in by U-Boot */
+				mac-address = [ 00 00 00 00 00 00 ];
+			};
+
+			phy_sel: cpsw-phy-sel@4a002554 {
+				compatible = "ti,dra7xx-cpsw-phy-sel";
+				reg= <0x4a002554 0x4>;
+				reg-names = "gmii-sel";
+			};
+		};
+
 	};
 };
 
diff -druNp --no-dereference linux-libre-3.18.29-gnu/arch/arm64/kernel/Makefile linux-libre-3.18.30-gnu/arch/arm64/kernel/Makefile
--- linux-libre-3.18.29-gnu/arch/arm64/kernel/Makefile	2016-03-17 14:09:52.000000000 -0400
+++ linux-libre-3.18.30-gnu/arch/arm64/kernel/Makefile	2016-04-03 18:27:20.000000000 -0400
@@ -15,7 +15,7 @@ arm64-obj-y		:= cputable.o debug-monitor
 			   entry-fpsimd.o process.o ptrace.o setup.o signal.o	\
 			   sys.o stacktrace.o time.o traps.o io.o vdso.o	\
 			   hyp-stub.o psci.o cpu_ops.o insn.o return_address.o	\
-			   cpuinfo.o cpu_errata.o alternative.o
+			   cpuinfo.o cpu_errata.o alternative.o psci-call.o
 
 arm64-obj-$(CONFIG_COMPAT)		+= sys32.o kuser32.o signal32.o 	\
 					   sys_compat.o
diff -druNp --no-dereference linux-libre-3.18.29-gnu/arch/arm64/kernel/psci.c linux-libre-3.18.30-gnu/arch/arm64/kernel/psci.c
--- linux-libre-3.18.29-gnu/arch/arm64/kernel/psci.c	2016-03-17 14:09:52.000000000 -0400
+++ linux-libre-3.18.30-gnu/arch/arm64/kernel/psci.c	2016-04-03 18:27:20.000000000 -0400
@@ -57,6 +57,9 @@ static struct psci_operations psci_ops;
 static int (*invoke_psci_fn)(u64, u64, u64, u64);
 typedef int (*psci_initcall_t)(const struct device_node *);
 
+asmlinkage int __invoke_psci_fn_hvc(u64, u64, u64, u64);
+asmlinkage int __invoke_psci_fn_smc(u64, u64, u64, u64);
+
 enum psci_function {
 	PSCI_FN_CPU_SUSPEND,
 	PSCI_FN_CPU_ON,
@@ -109,40 +112,6 @@ static void psci_power_state_unpack(u32
 			PSCI_0_2_POWER_STATE_AFFL_SHIFT;
 }
 
-/*
- * The following two functions are invoked via the invoke_psci_fn pointer
- * and will not be inlined, allowing us to piggyback on the AAPCS.
- */
-static noinline int __invoke_psci_fn_hvc(u64 function_id, u64 arg0, u64 arg1,
-					 u64 arg2)
-{
-	asm volatile(
-			__asmeq("%0", "x0")
-			__asmeq("%1", "x1")
-			__asmeq("%2", "x2")
-			__asmeq("%3", "x3")
-			"hvc	#0\n"
-		: "+r" (function_id)
-		: "r" (arg0), "r" (arg1), "r" (arg2));
-
-	return function_id;
-}
-
-static noinline int __invoke_psci_fn_smc(u64 function_id, u64 arg0, u64 arg1,
-					 u64 arg2)
-{
-	asm volatile(
-			__asmeq("%0", "x0")
-			__asmeq("%1", "x1")
-			__asmeq("%2", "x2")
-			__asmeq("%3", "x3")
-			"smc	#0\n"
-		: "+r" (function_id)
-		: "r" (arg0), "r" (arg1), "r" (arg2));
-
-	return function_id;
-}
-
 static int psci_get_version(void)
 {
 	int err;
diff -druNp --no-dereference linux-libre-3.18.29-gnu/arch/arm64/kernel/psci-call.S linux-libre-3.18.30-gnu/arch/arm64/kernel/psci-call.S
--- linux-libre-3.18.29-gnu/arch/arm64/kernel/psci-call.S	1969-12-31 19:00:00.000000000 -0500
+++ linux-libre-3.18.30-gnu/arch/arm64/kernel/psci-call.S	2016-04-03 18:27:20.000000000 -0400
@@ -0,0 +1,28 @@
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * Copyright (C) 2015 ARM Limited
+ *
+ * Author: Will Deacon <will.deacon@arm.com>
+ */
+
+#include <linux/linkage.h>
+
+/* int __invoke_psci_fn_hvc(u64 function_id, u64 arg0, u64 arg1, u64 arg2) */
+ENTRY(__invoke_psci_fn_hvc)
+	hvc	#0
+	ret
+ENDPROC(__invoke_psci_fn_hvc)
+
+/* int __invoke_psci_fn_smc(u64 function_id, u64 arg0, u64 arg1, u64 arg2) */
+ENTRY(__invoke_psci_fn_smc)
+	smc	#0
+	ret
+ENDPROC(__invoke_psci_fn_smc)
diff -druNp --no-dereference linux-libre-3.18.29-gnu/arch/mips/Kconfig linux-libre-3.18.30-gnu/arch/mips/Kconfig
--- linux-libre-3.18.29-gnu/arch/mips/Kconfig	2016-03-17 14:09:52.000000000 -0400
+++ linux-libre-3.18.30-gnu/arch/mips/Kconfig	2016-04-03 18:27:20.000000000 -0400
@@ -2048,7 +2048,7 @@ config MIPS_CMP
 
 config MIPS_CPS
 	bool "MIPS Coherent Processing System support"
-	depends on SYS_SUPPORTS_MIPS_CPS && !64BIT
+	depends on SYS_SUPPORTS_MIPS_CPS
 	select MIPS_CM
 	select MIPS_CPC
 	select MIPS_CPS_PM if HOTPLUG_CPU
diff -druNp --no-dereference linux-libre-3.18.29-gnu/arch/powerpc/kvm/book3s_hv_rmhandlers.S linux-libre-3.18.30-gnu/arch/powerpc/kvm/book3s_hv_rmhandlers.S
--- linux-libre-3.18.29-gnu/arch/powerpc/kvm/book3s_hv_rmhandlers.S	2016-03-17 14:09:52.000000000 -0400
+++ linux-libre-3.18.30-gnu/arch/powerpc/kvm/book3s_hv_rmhandlers.S	2016-04-03 18:27:20.000000000 -0400
@@ -1284,6 +1284,20 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S)
 	std	r6, VCPU_ACOP(r9)
 	stw	r7, VCPU_GUEST_PID(r9)
 	std	r8, VCPU_WORT(r9)
+	/*
+	 * Restore various registers to 0, where non-zero values
+	 * set by the guest could disrupt the host.
+	 */
+	li	r0, 0
+	mtspr	SPRN_IAMR, r0
+	mtspr	SPRN_CIABR, r0
+	mtspr	SPRN_DAWRX, r0
+	mtspr	SPRN_TCSCR, r0
+	mtspr	SPRN_WORT, r0
+	/* Set MMCRS to 1<<31 to freeze and disable the SPMC counters */
+	li	r0, 1
+	sldi	r0, r0, 31
+	mtspr	SPRN_MMCRS, r0
 8:
 
 	/* Save and reset AMR and UAMOR before turning on the MMU */
diff -druNp --no-dereference linux-libre-3.18.29-gnu/arch/x86/kvm/vmx.c linux-libre-3.18.30-gnu/arch/x86/kvm/vmx.c
--- linux-libre-3.18.29-gnu/arch/x86/kvm/vmx.c	2016-03-17 14:09:52.000000000 -0400
+++ linux-libre-3.18.30-gnu/arch/x86/kvm/vmx.c	2016-04-03 18:27:20.000000000 -0400
@@ -1600,6 +1600,13 @@ static void add_atomic_switch_msr(struct
 			return;
 		}
 		break;
+	case MSR_IA32_PEBS_ENABLE:
+		/* PEBS needs a quiescent period after being disabled (to write
+		 * a record).  Disabling PEBS through VMX MSR swapping doesn't
+		 * provide that period, so a CPU could write host's record into
+		 * guest's memory.
+		 */
+		wrmsrl(MSR_IA32_PEBS_ENABLE, 0);
 	}
 
 	for (i = 0; i < m->nr; ++i)
diff -druNp --no-dereference linux-libre-3.18.29-gnu/drivers/gpu/drm/radeon/radeon_pm.c linux-libre-3.18.30-gnu/drivers/gpu/drm/radeon/radeon_pm.c
--- linux-libre-3.18.29-gnu/drivers/gpu/drm/radeon/radeon_pm.c	2016-03-17 14:09:52.000000000 -0400
+++ linux-libre-3.18.30-gnu/drivers/gpu/drm/radeon/radeon_pm.c	2016-04-03 18:27:20.000000000 -0400
@@ -936,6 +936,8 @@ force:
 
 	/* update display watermarks based on new power state */
 	radeon_bandwidth_update(rdev);
+	/* update displays */
+	radeon_dpm_display_configuration_changed(rdev);
 
 	/* wait for the rings to drain */
 	for (i = 0; i < RADEON_NUM_RINGS; i++) {
@@ -952,9 +954,6 @@ force:
 
 	radeon_dpm_post_set_power_state(rdev);
 
-	/* update displays */
-	radeon_dpm_display_configuration_changed(rdev);
-
 	rdev->pm.dpm.current_active_crtcs = rdev->pm.dpm.new_active_crtcs;
 	rdev->pm.dpm.current_active_crtc_count = rdev->pm.dpm.new_active_crtc_count;
 	rdev->pm.dpm.single_display = single_display;
diff -druNp --no-dereference linux-libre-3.18.29-gnu/drivers/net/can/usb/gs_usb.c linux-libre-3.18.30-gnu/drivers/net/can/usb/gs_usb.c
--- linux-libre-3.18.29-gnu/drivers/net/can/usb/gs_usb.c	2016-03-17 14:09:52.000000000 -0400
+++ linux-libre-3.18.30-gnu/drivers/net/can/usb/gs_usb.c	2016-04-03 18:27:20.000000000 -0400
@@ -826,9 +826,8 @@ static struct gs_can *gs_make_candev(uns
 static void gs_destroy_candev(struct gs_can *dev)
 {
 	unregister_candev(dev->netdev);
-	free_candev(dev->netdev);
 	usb_kill_anchored_urbs(&dev->tx_submitted);
-	kfree(dev);
+	free_candev(dev->netdev);
 }
 
 static int gs_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
@@ -911,12 +910,15 @@ static int gs_usb_probe(struct usb_inter
 	for (i = 0; i < icount; i++) {
 		dev->canch[i] = gs_make_candev(i, intf);
 		if (IS_ERR_OR_NULL(dev->canch[i])) {
+			/* save error code to return later */
+			rc = PTR_ERR(dev->canch[i]);
+
 			/* on failure destroy previously created candevs */
 			icount = i;
-			for (i = 0; i < icount; i++) {
+			for (i = 0; i < icount; i++)
 				gs_destroy_candev(dev->canch[i]);
-				dev->canch[i] = NULL;
-			}
+
+			usb_kill_anchored_urbs(&dev->rx_submitted);
 			kfree(dev);
 			return rc;
 		}
@@ -937,16 +939,12 @@ static void gs_usb_disconnect(struct usb
 		return;
 	}
 
-	for (i = 0; i < GS_MAX_INTF; i++) {
-		struct gs_can *can = dev->canch[i];
-
-		if (!can)
-			continue;
-
-		gs_destroy_candev(can);
-	}
+	for (i = 0; i < GS_MAX_INTF; i++)
+		if (dev->canch[i])
+			gs_destroy_candev(dev->canch[i]);
 
 	usb_kill_anchored_urbs(&dev->rx_submitted);
+	kfree(dev);
 }
 
 static const struct usb_device_id gs_usb_table[] = {
diff -druNp --no-dereference linux-libre-3.18.29-gnu/drivers/net/wireless/iwlwifi/mvm/tx.c linux-libre-3.18.30-gnu/drivers/net/wireless/iwlwifi/mvm/tx.c
--- linux-libre-3.18.29-gnu/drivers/net/wireless/iwlwifi/mvm/tx.c	2016-03-17 14:09:52.000000000 -0400
+++ linux-libre-3.18.30-gnu/drivers/net/wireless/iwlwifi/mvm/tx.c	2016-04-03 18:27:20.000000000 -0400
@@ -359,6 +359,15 @@ int iwl_mvm_tx_skb_non_sta(struct iwl_mv
 		return -1;
 	}
 
+	/*
+	 * Increase the pending frames counter, so that later when a reply comes
+	 * in and the counter is decreased - we don't start getting negative
+	 * values.
+	 * Note that we don't need to make sure it isn't agg'd, since we're
+	 * TXing non-sta
+	 */
+	atomic_inc(&mvm->pending_frames[sta_id]);
+
 	return 0;
 }
 
diff -druNp --no-dereference linux-libre-3.18.29-gnu/drivers/target/target_core_tmr.c linux-libre-3.18.30-gnu/drivers/target/target_core_tmr.c
--- linux-libre-3.18.29-gnu/drivers/target/target_core_tmr.c	2016-03-17 14:09:52.000000000 -0400
+++ linux-libre-3.18.30-gnu/drivers/target/target_core_tmr.c	2016-04-03 18:27:20.000000000 -0400
@@ -181,7 +181,6 @@ void core_tmr_abort_task(
 
 		if (!__target_check_io_state(se_cmd, se_sess, 0)) {
 			spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags);
-			target_put_sess_cmd(se_cmd);
 			goto out;
 		}
 
diff -druNp --no-dereference linux-libre-3.18.29-gnu/fs/overlayfs/dir.c linux-libre-3.18.30-gnu/fs/overlayfs/dir.c
--- linux-libre-3.18.29-gnu/fs/overlayfs/dir.c	2016-03-17 14:09:52.000000000 -0400
+++ linux-libre-3.18.30-gnu/fs/overlayfs/dir.c	2016-04-03 18:27:20.000000000 -0400
@@ -595,7 +595,8 @@ static int ovl_remove_upper(struct dentr
 	 * sole user of this dentry.  Too tricky...  Just unhash for
 	 * now.
 	 */
-	d_drop(dentry);
+	if (!err)
+		d_drop(dentry);
 	mutex_unlock(&dir->i_mutex);
 
 	return err;
diff -druNp --no-dereference linux-libre-3.18.29-gnu/fs/overlayfs/inode.c linux-libre-3.18.30-gnu/fs/overlayfs/inode.c
--- linux-libre-3.18.29-gnu/fs/overlayfs/inode.c	2016-03-17 14:09:52.000000000 -0400
+++ linux-libre-3.18.30-gnu/fs/overlayfs/inode.c	2016-04-03 18:27:20.000000000 -0400
@@ -53,6 +53,8 @@ int ovl_setattr(struct dentry *dentry, s
 	if (upperdentry) {
 		mutex_lock(&upperdentry->d_inode->i_mutex);
 		err = notify_change(upperdentry, attr, NULL);
+		if (!err)
+			ovl_copyattr(upperdentry->d_inode, dentry->d_inode);
 		mutex_unlock(&upperdentry->d_inode->i_mutex);
 	} else {
 		err = ovl_copy_up_last(dentry, attr, false);
diff -druNp --no-dereference linux-libre-3.18.29-gnu/include/linux/tracepoint.h linux-libre-3.18.30-gnu/include/linux/tracepoint.h
--- linux-libre-3.18.29-gnu/include/linux/tracepoint.h	2016-03-17 14:09:52.000000000 -0400
+++ linux-libre-3.18.30-gnu/include/linux/tracepoint.h	2016-04-03 18:27:20.000000000 -0400
@@ -123,9 +123,6 @@ extern void syscall_unregfunc(void);
 		void *it_func;						\
 		void *__data;						\
 									\
-		if (!cpu_online(raw_smp_processor_id()))		\
-			return;						\
-									\
 		if (!(cond))						\
 			return;						\
 		prercu;							\
@@ -324,15 +321,19 @@ extern void syscall_unregfunc(void);
  * "void *__data, proto" as the callback prototype.
  */
 #define DECLARE_TRACE_NOARGS(name)					\
-		__DECLARE_TRACE(name, void, , 1, void *__data, __data)
+	__DECLARE_TRACE(name, void, ,					\
+			cpu_online(raw_smp_processor_id()),		\
+			void *__data, __data)
 
 #define DECLARE_TRACE(name, proto, args)				\
-		__DECLARE_TRACE(name, PARAMS(proto), PARAMS(args), 1,	\
-				PARAMS(void *__data, proto),		\
-				PARAMS(__data, args))
+	__DECLARE_TRACE(name, PARAMS(proto), PARAMS(args),		\
+			cpu_online(raw_smp_processor_id()),		\
+			PARAMS(void *__data, proto),			\
+			PARAMS(__data, args))
 
 #define DECLARE_TRACE_CONDITION(name, proto, args, cond)		\
-	__DECLARE_TRACE(name, PARAMS(proto), PARAMS(args), PARAMS(cond), \
+	__DECLARE_TRACE(name, PARAMS(proto), PARAMS(args),		\
+			cpu_online(raw_smp_processor_id()) && (PARAMS(cond)), \
 			PARAMS(void *__data, proto),			\
 			PARAMS(__data, args))
 
diff -druNp --no-dereference linux-libre-3.18.29-gnu/include/net/iw_handler.h linux-libre-3.18.30-gnu/include/net/iw_handler.h
--- linux-libre-3.18.29-gnu/include/net/iw_handler.h	2016-03-17 14:09:52.000000000 -0400
+++ linux-libre-3.18.30-gnu/include/net/iw_handler.h	2016-04-03 18:27:20.000000000 -0400
@@ -439,6 +439,12 @@ int dev_get_wireless_info(char *buffer,
 /* Send a single event to user space */
 void wireless_send_event(struct net_device *dev, unsigned int cmd,
 			 union iwreq_data *wrqu, const char *extra);
+#ifdef CONFIG_WEXT_CORE
+/* flush all previous wext events - if work is done from netdev notifiers */
+void wireless_nlevent_flush(void);
+#else
+static inline void wireless_nlevent_flush(void) {}
+#endif
 
 /* We may need a function to send a stream of events to user space.
  * More on that later... */
diff -druNp --no-dereference linux-libre-3.18.29-gnu/Makefile linux-libre-3.18.30-gnu/Makefile
--- linux-libre-3.18.29-gnu/Makefile	2016-03-18 04:54:23.000000000 -0400
+++ linux-libre-3.18.30-gnu/Makefile	2016-04-06 23:56:02.000000000 -0400
@@ -1,6 +1,6 @@
 VERSION = 3
 PATCHLEVEL = 18
-SUBLEVEL = 29
+SUBLEVEL = 30
 EXTRAVERSION =-gnu
 NAME = Diseased Newt
 
diff -druNp --no-dereference linux-libre-3.18.29-gnu/net/mac80211/agg-rx.c linux-libre-3.18.30-gnu/net/mac80211/agg-rx.c
--- linux-libre-3.18.29-gnu/net/mac80211/agg-rx.c	2016-03-17 14:09:52.000000000 -0400
+++ linux-libre-3.18.30-gnu/net/mac80211/agg-rx.c	2016-04-03 18:27:20.000000000 -0400
@@ -281,7 +281,7 @@ void __ieee80211_start_rx_ba_session(str
 	}
 
 	/* prepare A-MPDU MLME for Rx aggregation */
-	tid_agg_rx = kmalloc(sizeof(struct tid_ampdu_rx), GFP_KERNEL);
+	tid_agg_rx = kzalloc(sizeof(*tid_agg_rx), GFP_KERNEL);
 	if (!tid_agg_rx)
 		goto end;
 
diff -druNp --no-dereference linux-libre-3.18.29-gnu/net/mac80211/rc80211_minstrel_ht.c linux-libre-3.18.30-gnu/net/mac80211/rc80211_minstrel_ht.c
--- linux-libre-3.18.29-gnu/net/mac80211/rc80211_minstrel_ht.c	2016-03-17 14:09:52.000000000 -0400
+++ linux-libre-3.18.30-gnu/net/mac80211/rc80211_minstrel_ht.c	2016-04-03 18:27:20.000000000 -0400
@@ -557,7 +557,7 @@ minstrel_aggr_check(struct ieee80211_sta
 	if (skb_get_queue_mapping(skb) == IEEE80211_AC_VO)
 		return;
 
-	ieee80211_start_tx_ba_session(pubsta, tid, 5000);
+	ieee80211_start_tx_ba_session(pubsta, tid, 0);
 }
 
 static void
diff -druNp --no-dereference linux-libre-3.18.29-gnu/net/mac80211/rx.c linux-libre-3.18.30-gnu/net/mac80211/rx.c
--- linux-libre-3.18.29-gnu/net/mac80211/rx.c	2016-03-17 14:09:52.000000000 -0400
+++ linux-libre-3.18.30-gnu/net/mac80211/rx.c	2016-04-03 18:27:20.000000000 -0400
@@ -3171,6 +3171,7 @@ static bool prepare_for_handlers(struct
 				return false;
 			/* ignore action frames to TDLS-peers */
 			if (ieee80211_is_action(hdr->frame_control) &&
+			    !is_broadcast_ether_addr(bssid) &&
 			    !ether_addr_equal(bssid, hdr->addr1))
 				return false;
 		}
diff -druNp --no-dereference linux-libre-3.18.29-gnu/net/wireless/core.c linux-libre-3.18.30-gnu/net/wireless/core.c
--- linux-libre-3.18.29-gnu/net/wireless/core.c	2016-03-17 14:09:52.000000000 -0400
+++ linux-libre-3.18.30-gnu/net/wireless/core.c	2016-04-03 18:27:20.000000000 -0400
@@ -1039,6 +1039,8 @@ static int cfg80211_netdev_notifier_call
 		return NOTIFY_DONE;
 	}
 
+	wireless_nlevent_flush();
+
 	return NOTIFY_OK;
 }
 
diff -druNp --no-dereference linux-libre-3.18.29-gnu/net/wireless/wext-core.c linux-libre-3.18.30-gnu/net/wireless/wext-core.c
--- linux-libre-3.18.29-gnu/net/wireless/wext-core.c	2016-03-17 14:09:52.000000000 -0400
+++ linux-libre-3.18.30-gnu/net/wireless/wext-core.c	2016-04-03 18:27:20.000000000 -0400
@@ -342,6 +342,40 @@ static const int compat_event_type_size[
 
 /* IW event code */
 
+void wireless_nlevent_flush(void)
+{
+	struct sk_buff *skb;
+	struct net *net;
+
+	ASSERT_RTNL();
+
+	for_each_net(net) {
+		while ((skb = skb_dequeue(&net->wext_nlevents)))
+			rtnl_notify(skb, net, 0, RTNLGRP_LINK, NULL,
+				    GFP_KERNEL);
+	}
+}
+EXPORT_SYMBOL_GPL(wireless_nlevent_flush);
+
+static int wext_netdev_notifier_call(struct notifier_block *nb,
+				     unsigned long state, void *ptr)
+{
+	/*
+	 * When a netdev changes state in any way, flush all pending messages
+	 * to avoid them going out in a strange order, e.g. RTM_NEWLINK after
+	 * RTM_DELLINK, or with IFF_UP after without IFF_UP during dev_close()
+	 * or similar - all of which could otherwise happen due to delays from
+	 * schedule_work().
+	 */
+	wireless_nlevent_flush();
+
+	return NOTIFY_OK;
+}
+
+static struct notifier_block wext_netdev_notifier = {
+	.notifier_call = wext_netdev_notifier_call,
+};
+
 static int __net_init wext_pernet_init(struct net *net)
 {
 	skb_queue_head_init(&net->wext_nlevents);
@@ -360,7 +394,12 @@ static struct pernet_operations wext_per
 
 static int __init wireless_nlevent_init(void)
 {
-	return register_pernet_subsys(&wext_pernet_ops);
+	int err = register_pernet_subsys(&wext_pernet_ops);
+
+	if (err)
+		return err;
+
+	return register_netdevice_notifier(&wext_netdev_notifier);
 }
 
 subsys_initcall(wireless_nlevent_init);
@@ -368,17 +407,8 @@ subsys_initcall(wireless_nlevent_init);
 /* Process events generated by the wireless layer or the driver. */
 static void wireless_nlevent_process(struct work_struct *work)
 {
-	struct sk_buff *skb;
-	struct net *net;
-
 	rtnl_lock();
-
-	for_each_net(net) {
-		while ((skb = skb_dequeue(&net->wext_nlevents)))
-			rtnl_notify(skb, net, 0, RTNLGRP_LINK, NULL,
-				    GFP_KERNEL);
-	}
-
+	wireless_nlevent_flush();
 	rtnl_unlock();
 }
 
diff -druNp --no-dereference linux-libre-3.18.29-gnu/scripts/ld-version.sh linux-libre-3.18.30-gnu/scripts/ld-version.sh
--- linux-libre-3.18.29-gnu/scripts/ld-version.sh	2016-03-17 14:09:52.000000000 -0400
+++ linux-libre-3.18.30-gnu/scripts/ld-version.sh	2016-04-03 18:27:20.000000000 -0400
@@ -1,7 +1,7 @@
 #!/usr/bin/awk -f
 # extract linker version number from stdin and turn into single number
 	{
-	gsub(".*)", "");
+	gsub(".*\\)", "");
 	split($1,a, ".");
 	print a[1]*10000000 + a[2]*100000 + a[3]*10000 + a[4]*100 + a[5];
 	exit
diff -druNp --no-dereference linux-libre-3.18.29-gnu/sound/soc/codecs/wm8958-dsp2.c linux-libre-3.18.30-gnu/sound/soc/codecs/wm8958-dsp2.c
--- linux-libre-3.18.29-gnu/sound/soc/codecs/wm8958-dsp2.c	2016-03-18 05:14:30.000000000 -0400
+++ linux-libre-3.18.30-gnu/sound/soc/codecs/wm8958-dsp2.c	2016-04-07 00:15:09.000000000 -0400
@@ -459,7 +459,7 @@ static int wm8958_put_mbc_enum(struct sn
 	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
 	struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);
 	struct wm8994 *control = wm8994->wm8994;
-	int value = ucontrol->value.integer.value[0];
+	int value = ucontrol->value.enumerated.item[0];
 	int reg;
 
 	/* Don't allow on the fly reconfiguration */
@@ -549,7 +549,7 @@ static int wm8958_put_vss_enum(struct sn
 	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
 	struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);
 	struct wm8994 *control = wm8994->wm8994;
-	int value = ucontrol->value.integer.value[0];
+	int value = ucontrol->value.enumerated.item[0];
 	int reg;
 
 	/* Don't allow on the fly reconfiguration */
@@ -582,7 +582,7 @@ static int wm8958_put_vss_hpf_enum(struc
 	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
 	struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);
 	struct wm8994 *control = wm8994->wm8994;
-	int value = ucontrol->value.integer.value[0];
+	int value = ucontrol->value.enumerated.item[0];
 	int reg;
 
 	/* Don't allow on the fly reconfiguration */
@@ -749,7 +749,7 @@ static int wm8958_put_enh_eq_enum(struct
 	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
 	struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);
 	struct wm8994 *control = wm8994->wm8994;
-	int value = ucontrol->value.integer.value[0];
+	int value = ucontrol->value.enumerated.item[0];
 	int reg;
 
 	/* Don't allow on the fly reconfiguration */
diff -druNp --no-dereference linux-libre-3.18.29-gnu/sound/soc/codecs/wm8994.c linux-libre-3.18.30-gnu/sound/soc/codecs/wm8994.c
--- linux-libre-3.18.29-gnu/sound/soc/codecs/wm8994.c	2016-03-17 14:09:52.000000000 -0400
+++ linux-libre-3.18.30-gnu/sound/soc/codecs/wm8994.c	2016-04-03 18:27:20.000000000 -0400
@@ -360,7 +360,7 @@ static int wm8994_put_drc_enum(struct sn
 	struct wm8994 *control = wm8994->wm8994;
 	struct wm8994_pdata *pdata = &control->pdata;
 	int drc = wm8994_get_drc(kcontrol->id.name);
-	int value = ucontrol->value.integer.value[0];
+	int value = ucontrol->value.enumerated.item[0];
 
 	if (drc < 0)
 		return drc;
@@ -467,7 +467,7 @@ static int wm8994_put_retune_mobile_enum
 	struct wm8994 *control = wm8994->wm8994;
 	struct wm8994_pdata *pdata = &control->pdata;
 	int block = wm8994_get_retune_mobile_block(kcontrol->id.name);
-	int value = ucontrol->value.integer.value[0];
+	int value = ucontrol->value.enumerated.item[0];
 
 	if (block < 0)
 		return block;
diff -druNp --no-dereference linux-libre-3.18.29-gnu/sound/soc/codecs/wm_adsp.c linux-libre-3.18.30-gnu/sound/soc/codecs/wm_adsp.c
--- linux-libre-3.18.29-gnu/sound/soc/codecs/wm_adsp.c	2016-03-18 05:14:33.000000000 -0400
+++ linux-libre-3.18.30-gnu/sound/soc/codecs/wm_adsp.c	2016-04-07 00:15:12.000000000 -0400
@@ -246,7 +246,7 @@ static int wm_adsp_fw_get(struct snd_kco
 	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
 	struct wm_adsp *adsp = snd_soc_codec_get_drvdata(codec);
 
-	ucontrol->value.integer.value[0] = adsp[e->shift_l].fw;
+	ucontrol->value.enumerated.item[0] = adsp[e->shift_l].fw;
 
 	return 0;
 }
@@ -258,16 +258,16 @@ static int wm_adsp_fw_put(struct snd_kco
 	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
 	struct wm_adsp *adsp = snd_soc_codec_get_drvdata(codec);
 
-	if (ucontrol->value.integer.value[0] == adsp[e->shift_l].fw)
+	if (ucontrol->value.enumerated.item[0] == adsp[e->shift_l].fw)
 		return 0;
 
-	if (ucontrol->value.integer.value[0] >= WM_ADSP_NUM_FW)
+	if (ucontrol->value.enumerated.item[0] >= WM_ADSP_NUM_FW)
 		return -EINVAL;
 
 	if (adsp[e->shift_l].running)
 		return -EBUSY;
 
-	adsp[e->shift_l].fw = ucontrol->value.integer.value[0];
+	adsp[e->shift_l].fw = ucontrol->value.enumerated.item[0];
 
 	return 0;
 }
