diff -druNp --no-dereference linux-libre-4.4.116-gnu/arch/arm/boot/dts/s5pv210.dtsi linux-libre-4.4.117-gnu/arch/arm/boot/dts/s5pv210.dtsi
--- linux-libre-4.4.116-gnu/arch/arm/boot/dts/s5pv210.dtsi	2018-02-16 14:09:48.000000000 -0500
+++ linux-libre-4.4.117-gnu/arch/arm/boot/dts/s5pv210.dtsi	2018-02-22 09:45:02.000000000 -0500
@@ -461,6 +461,7 @@
 			compatible = "samsung,exynos4210-ohci";
 			reg = <0xec300000 0x100>;
 			interrupts = <23>;
+			interrupt-parent = <&vic1>;
 			clocks = <&clocks CLK_USB_HOST>;
 			clock-names = "usbhost";
 			#address-cells = <1>;
diff -druNp --no-dereference linux-libre-4.4.116-gnu/arch/arm/boot/dts/spear1310-evb.dts linux-libre-4.4.117-gnu/arch/arm/boot/dts/spear1310-evb.dts
--- linux-libre-4.4.116-gnu/arch/arm/boot/dts/spear1310-evb.dts	2018-02-16 14:09:48.000000000 -0500
+++ linux-libre-4.4.117-gnu/arch/arm/boot/dts/spear1310-evb.dts	2018-02-22 09:45:02.000000000 -0500
@@ -349,7 +349,7 @@
 			spi0: spi@e0100000 {
 				status = "okay";
 				num-cs = <3>;
-				cs-gpios = <&gpio1 7 0>, <&spics 0>, <&spics 1>;
+				cs-gpios = <&gpio1 7 0>, <&spics 0 0>, <&spics 1 0>;
 
 				stmpe610@0 {
 					compatible = "st,stmpe610";
diff -druNp --no-dereference linux-libre-4.4.116-gnu/arch/arm/boot/dts/spear1340.dtsi linux-libre-4.4.117-gnu/arch/arm/boot/dts/spear1340.dtsi
--- linux-libre-4.4.116-gnu/arch/arm/boot/dts/spear1340.dtsi	2018-02-16 14:09:48.000000000 -0500
+++ linux-libre-4.4.117-gnu/arch/arm/boot/dts/spear1340.dtsi	2018-02-22 09:45:02.000000000 -0500
@@ -141,8 +141,8 @@
 				reg = <0xb4100000 0x1000>;
 				interrupts = <0 105 0x4>;
 				status = "disabled";
-				dmas = <&dwdma0 0x600 0 0 1>, /* 0xC << 11 */
-					<&dwdma0 0x680 0 1 0>; /* 0xD << 7 */
+				dmas = <&dwdma0 12 0 1>,
+					<&dwdma0 13 1 0>;
 				dma-names = "tx", "rx";
 			};
 
diff -druNp --no-dereference linux-libre-4.4.116-gnu/arch/arm/boot/dts/spear13xx.dtsi linux-libre-4.4.117-gnu/arch/arm/boot/dts/spear13xx.dtsi
--- linux-libre-4.4.116-gnu/arch/arm/boot/dts/spear13xx.dtsi	2018-02-16 14:09:48.000000000 -0500
+++ linux-libre-4.4.117-gnu/arch/arm/boot/dts/spear13xx.dtsi	2018-02-22 09:45:02.000000000 -0500
@@ -100,7 +100,7 @@
 			reg = <0xb2800000 0x1000>;
 			interrupts = <0 29 0x4>;
 			status = "disabled";
-			dmas = <&dwdma0 0 0 0 0>;
+			dmas = <&dwdma0 0 0 0>;
 			dma-names = "data";
 		};
 
@@ -288,8 +288,8 @@
 				#size-cells = <0>;
 				interrupts = <0 31 0x4>;
 				status = "disabled";
-				dmas = <&dwdma0 0x2000 0 0 0>, /* 0x4 << 11 */
-					<&dwdma0 0x0280 0 0 0>;  /* 0x5 << 7 */
+				dmas = <&dwdma0 4 0 0>,
+					<&dwdma0 5 0 0>;
 				dma-names = "tx", "rx";
 			};
 
diff -druNp --no-dereference linux-libre-4.4.116-gnu/arch/arm/boot/dts/spear600.dtsi linux-libre-4.4.117-gnu/arch/arm/boot/dts/spear600.dtsi
--- linux-libre-4.4.116-gnu/arch/arm/boot/dts/spear600.dtsi	2018-02-16 14:09:48.000000000 -0500
+++ linux-libre-4.4.117-gnu/arch/arm/boot/dts/spear600.dtsi	2018-02-22 09:45:02.000000000 -0500
@@ -194,6 +194,7 @@
 			rtc@fc900000 {
 				compatible = "st,spear600-rtc";
 				reg = <0xfc900000 0x1000>;
+				interrupt-parent = <&vic0>;
 				interrupts = <10>;
 				status = "disabled";
 			};
diff -druNp --no-dereference linux-libre-4.4.116-gnu/arch/arm/boot/dts/stih407.dtsi linux-libre-4.4.117-gnu/arch/arm/boot/dts/stih407.dtsi
--- linux-libre-4.4.116-gnu/arch/arm/boot/dts/stih407.dtsi	2018-02-16 14:09:48.000000000 -0500
+++ linux-libre-4.4.117-gnu/arch/arm/boot/dts/stih407.dtsi	2018-02-22 09:45:02.000000000 -0500
@@ -8,6 +8,7 @@
  */
 #include "stih407-clock.dtsi"
 #include "stih407-family.dtsi"
+#include <dt-bindings/gpio/gpio.h>
 / {
 	soc {
 		sti-display-subsystem {
@@ -112,7 +113,7 @@
 					 <&clk_s_d2_quadfs 0>,
 					 <&clk_s_d2_quadfs 1>;
 
-				hdmi,hpd-gpio = <&pio5 3>;
+				hdmi,hpd-gpio = <&pio5 3 GPIO_ACTIVE_LOW>;
 				reset-names = "hdmi";
 				resets = <&softreset STIH407_HDMI_TX_PHY_SOFTRESET>;
 				ddc = <&hdmiddc>;
diff -druNp --no-dereference linux-libre-4.4.116-gnu/arch/arm/boot/dts/stih410.dtsi linux-libre-4.4.117-gnu/arch/arm/boot/dts/stih410.dtsi
--- linux-libre-4.4.116-gnu/arch/arm/boot/dts/stih410.dtsi	2018-02-16 14:09:48.000000000 -0500
+++ linux-libre-4.4.117-gnu/arch/arm/boot/dts/stih410.dtsi	2018-02-22 09:45:02.000000000 -0500
@@ -9,6 +9,7 @@
 #include "stih410-clock.dtsi"
 #include "stih407-family.dtsi"
 #include "stih410-pinctrl.dtsi"
+#include <dt-bindings/gpio/gpio.h>
 / {
 	aliases {
 		bdisp0 = &bdisp0;
@@ -203,7 +204,7 @@
 					 <&clk_s_d2_quadfs 0>,
 					 <&clk_s_d2_quadfs 1>;
 
-				hdmi,hpd-gpio = <&pio5 3>;
+				hdmi,hpd-gpio = <&pio5 3 GPIO_ACTIVE_LOW>;
 				reset-names = "hdmi";
 				resets = <&softreset STIH407_HDMI_TX_PHY_SOFTRESET>;
 				ddc = <&hdmiddc>;
diff -druNp --no-dereference linux-libre-4.4.116-gnu/arch/arm/mach-pxa/tosa-bt.c linux-libre-4.4.117-gnu/arch/arm/mach-pxa/tosa-bt.c
--- linux-libre-4.4.116-gnu/arch/arm/mach-pxa/tosa-bt.c	2018-02-16 14:09:48.000000000 -0500
+++ linux-libre-4.4.117-gnu/arch/arm/mach-pxa/tosa-bt.c	2018-02-22 09:45:02.000000000 -0500
@@ -132,3 +132,7 @@ static struct platform_driver tosa_bt_dr
 	},
 };
 module_platform_driver(tosa_bt_driver);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Dmitry Baryshkov");
+MODULE_DESCRIPTION("Bluetooth built-in chip control");
diff -druNp --no-dereference linux-libre-4.4.116-gnu/arch/s390/kernel/compat_linux.c linux-libre-4.4.117-gnu/arch/s390/kernel/compat_linux.c
--- linux-libre-4.4.116-gnu/arch/s390/kernel/compat_linux.c	2018-02-16 14:09:48.000000000 -0500
+++ linux-libre-4.4.117-gnu/arch/s390/kernel/compat_linux.c	2018-02-22 09:45:02.000000000 -0500
@@ -110,7 +110,7 @@ COMPAT_SYSCALL_DEFINE2(s390_setregid16,
 
 COMPAT_SYSCALL_DEFINE1(s390_setgid16, u16, gid)
 {
-	return sys_setgid((gid_t)gid);
+	return sys_setgid(low2highgid(gid));
 }
 
 COMPAT_SYSCALL_DEFINE2(s390_setreuid16, u16, ruid, u16, euid)
@@ -120,7 +120,7 @@ COMPAT_SYSCALL_DEFINE2(s390_setreuid16,
 
 COMPAT_SYSCALL_DEFINE1(s390_setuid16, u16, uid)
 {
-	return sys_setuid((uid_t)uid);
+	return sys_setuid(low2highuid(uid));
 }
 
 COMPAT_SYSCALL_DEFINE3(s390_setresuid16, u16, ruid, u16, euid, u16, suid)
@@ -173,12 +173,12 @@ COMPAT_SYSCALL_DEFINE3(s390_getresgid16,
 
 COMPAT_SYSCALL_DEFINE1(s390_setfsuid16, u16, uid)
 {
-	return sys_setfsuid((uid_t)uid);
+	return sys_setfsuid(low2highuid(uid));
 }
 
 COMPAT_SYSCALL_DEFINE1(s390_setfsgid16, u16, gid)
 {
-	return sys_setfsgid((gid_t)gid);
+	return sys_setfsgid(low2highgid(gid));
 }
 
 static int groups16_to_user(u16 __user *grouplist, struct group_info *group_info)
diff -druNp --no-dereference linux-libre-4.4.116-gnu/arch/x86/include/asm/processor.h linux-libre-4.4.117-gnu/arch/x86/include/asm/processor.h
--- linux-libre-4.4.116-gnu/arch/x86/include/asm/processor.h	2018-02-16 14:09:48.000000000 -0500
+++ linux-libre-4.4.117-gnu/arch/x86/include/asm/processor.h	2018-02-22 09:45:02.000000000 -0500
@@ -113,7 +113,7 @@ struct cpuinfo_x86 {
 	char			x86_vendor_id[16];
 	char			x86_model_id[64];
 	/* in KB - valid for CPUS which support this call: */
-	int			x86_cache_size;
+	unsigned int		x86_cache_size;
 	int			x86_cache_alignment;	/* In bytes */
 	/* Cache QoS architectural values: */
 	int			x86_cache_max_rmid;	/* max index */
diff -druNp --no-dereference linux-libre-4.4.116-gnu/arch/x86/kernel/cpu/common.c linux-libre-4.4.117-gnu/arch/x86/kernel/cpu/common.c
--- linux-libre-4.4.116-gnu/arch/x86/kernel/cpu/common.c	2018-02-16 14:09:48.000000000 -0500
+++ linux-libre-4.4.117-gnu/arch/x86/kernel/cpu/common.c	2018-02-22 09:45:02.000000000 -0500
@@ -955,7 +955,7 @@ static void identify_cpu(struct cpuinfo_
 	int i;
 
 	c->loops_per_jiffy = loops_per_jiffy;
-	c->x86_cache_size = -1;
+	c->x86_cache_size = 0;
 	c->x86_vendor = X86_VENDOR_UNKNOWN;
 	c->x86_model = c->x86_mask = 0;	/* So far unknown... */
 	c->x86_vendor_id[0] = '\0'; /* Unset */
diff -druNp --no-dereference linux-libre-4.4.116-gnu/arch/x86/kernel/cpu/microcode/intel.c linux-libre-4.4.117-gnu/arch/x86/kernel/cpu/microcode/intel.c
--- linux-libre-4.4.116-gnu/arch/x86/kernel/cpu/microcode/intel.c	2018-02-17 10:07:09.000000000 -0500
+++ linux-libre-4.4.117-gnu/arch/x86/kernel/cpu/microcode/intel.c	2018-02-23 10:42:46.000000000 -0500
@@ -1075,7 +1075,7 @@ static struct microcode_ops microcode_in
 
 static int __init calc_llc_size_per_core(struct cpuinfo_x86 *c)
 {
-	u64 llc_size = c->x86_cache_size * 1024;
+	u64 llc_size = c->x86_cache_size * 1024ULL;
 
 	do_div(llc_size, c->x86_max_cores);
 
diff -druNp --no-dereference linux-libre-4.4.116-gnu/arch/x86/kernel/cpu/proc.c linux-libre-4.4.117-gnu/arch/x86/kernel/cpu/proc.c
--- linux-libre-4.4.116-gnu/arch/x86/kernel/cpu/proc.c	2018-02-16 14:09:48.000000000 -0500
+++ linux-libre-4.4.117-gnu/arch/x86/kernel/cpu/proc.c	2018-02-22 09:45:02.000000000 -0500
@@ -87,8 +87,8 @@ static int show_cpuinfo(struct seq_file
 	}
 
 	/* Cache size */
-	if (c->x86_cache_size >= 0)
-		seq_printf(m, "cache size\t: %d KB\n", c->x86_cache_size);
+	if (c->x86_cache_size)
+		seq_printf(m, "cache size\t: %u KB\n", c->x86_cache_size);
 
 	show_cpuinfo_core(m, c, cpu);
 	show_cpuinfo_misc(m, c);
diff -druNp --no-dereference linux-libre-4.4.116-gnu/arch/x86/kvm/mmu.c linux-libre-4.4.117-gnu/arch/x86/kvm/mmu.c
--- linux-libre-4.4.116-gnu/arch/x86/kvm/mmu.c	2018-02-16 14:09:48.000000000 -0500
+++ linux-libre-4.4.117-gnu/arch/x86/kvm/mmu.c	2018-02-22 09:45:02.000000000 -0500
@@ -4503,7 +4503,7 @@ void kvm_mmu_setup(struct kvm_vcpu *vcpu
 typedef bool (*slot_level_handler) (struct kvm *kvm, unsigned long *rmap);
 
 /* The caller should hold mmu-lock before calling this function. */
-static bool
+static __always_inline bool
 slot_handle_level_range(struct kvm *kvm, struct kvm_memory_slot *memslot,
 			slot_level_handler fn, int start_level, int end_level,
 			gfn_t start_gfn, gfn_t end_gfn, bool lock_flush_tlb)
@@ -4533,7 +4533,7 @@ slot_handle_level_range(struct kvm *kvm,
 	return flush;
 }
 
-static bool
+static __always_inline bool
 slot_handle_level(struct kvm *kvm, struct kvm_memory_slot *memslot,
 		  slot_level_handler fn, int start_level, int end_level,
 		  bool lock_flush_tlb)
@@ -4544,7 +4544,7 @@ slot_handle_level(struct kvm *kvm, struc
 			lock_flush_tlb);
 }
 
-static bool
+static __always_inline bool
 slot_handle_all_level(struct kvm *kvm, struct kvm_memory_slot *memslot,
 		      slot_level_handler fn, bool lock_flush_tlb)
 {
@@ -4552,7 +4552,7 @@ slot_handle_all_level(struct kvm *kvm, s
 				 PT_MAX_HUGEPAGE_LEVEL, lock_flush_tlb);
 }
 
-static bool
+static __always_inline bool
 slot_handle_large_level(struct kvm *kvm, struct kvm_memory_slot *memslot,
 			slot_level_handler fn, bool lock_flush_tlb)
 {
@@ -4560,7 +4560,7 @@ slot_handle_large_level(struct kvm *kvm,
 				 PT_MAX_HUGEPAGE_LEVEL, lock_flush_tlb);
 }
 
-static bool
+static __always_inline bool
 slot_handle_leaf(struct kvm *kvm, struct kvm_memory_slot *memslot,
 		 slot_level_handler fn, bool lock_flush_tlb)
 {
diff -druNp --no-dereference linux-libre-4.4.116-gnu/Documentation/devicetree/bindings/dma/snps-dma.txt linux-libre-4.4.117-gnu/Documentation/devicetree/bindings/dma/snps-dma.txt
--- linux-libre-4.4.116-gnu/Documentation/devicetree/bindings/dma/snps-dma.txt	2018-02-16 14:09:48.000000000 -0500
+++ linux-libre-4.4.117-gnu/Documentation/devicetree/bindings/dma/snps-dma.txt	2018-02-22 09:45:02.000000000 -0500
@@ -58,6 +58,6 @@ Example:
 		interrupts = <0 35 0x4>;
 		status = "disabled";
 		dmas = <&dmahost 12 0 1>,
-			<&dmahost 13 0 1 0>;
+			<&dmahost 13 1 0>;
 		dma-names = "rx", "rx";
 	};
diff -druNp --no-dereference linux-libre-4.4.116-gnu/Documentation/filesystems/ext4.txt linux-libre-4.4.117-gnu/Documentation/filesystems/ext4.txt
--- linux-libre-4.4.116-gnu/Documentation/filesystems/ext4.txt	2018-02-16 14:09:48.000000000 -0500
+++ linux-libre-4.4.117-gnu/Documentation/filesystems/ext4.txt	2018-02-22 09:45:02.000000000 -0500
@@ -233,7 +233,7 @@ data_err=ignore(*)	Just print an error m
 data_err=abort		Abort the journal if an error occurs in a file
 			data buffer in ordered mode.
 
-grpid			Give objects the same group ID as their creator.
+grpid			New objects have the group ID of their parent.
 bsdgroups
 
 nogrpid		(*)	New objects have the group ID of their creator.
diff -druNp --no-dereference linux-libre-4.4.116-gnu/drivers/devfreq/devfreq.c linux-libre-4.4.117-gnu/drivers/devfreq/devfreq.c
--- linux-libre-4.4.116-gnu/drivers/devfreq/devfreq.c	2018-02-16 14:09:48.000000000 -0500
+++ linux-libre-4.4.117-gnu/drivers/devfreq/devfreq.c	2018-02-22 09:45:02.000000000 -0500
@@ -583,7 +583,7 @@ struct devfreq *devm_devfreq_add_device(
 	devfreq = devfreq_add_device(dev, profile, governor_name, data);
 	if (IS_ERR(devfreq)) {
 		devres_free(ptr);
-		return ERR_PTR(-ENOMEM);
+		return devfreq;
 	}
 
 	*ptr = devfreq;
diff -druNp --no-dereference linux-libre-4.4.116-gnu/drivers/gpu/drm/radeon/radeon_uvd.c linux-libre-4.4.117-gnu/drivers/gpu/drm/radeon/radeon_uvd.c
--- linux-libre-4.4.116-gnu/drivers/gpu/drm/radeon/radeon_uvd.c	2018-02-17 10:11:09.000000000 -0500
+++ linux-libre-4.4.117-gnu/drivers/gpu/drm/radeon/radeon_uvd.c	2018-02-23 10:46:37.000000000 -0500
@@ -939,7 +939,7 @@ int radeon_uvd_calc_upll_dividers(struct
 		/* calc dclk divider with current vco freq */
 		dclk_div = radeon_uvd_calc_upll_post_div(vco_freq, dclk,
 							 pd_min, pd_even);
-		if (vclk_div > pd_max)
+		if (dclk_div > pd_max)
 			break; /* vco is too big, it has to stop */
 
 		/* calc score with current vco freq */
diff -druNp --no-dereference linux-libre-4.4.116-gnu/drivers/infiniband/hw/mlx4/main.c linux-libre-4.4.117-gnu/drivers/infiniband/hw/mlx4/main.c
--- linux-libre-4.4.116-gnu/drivers/infiniband/hw/mlx4/main.c	2018-02-16 14:09:48.000000000 -0500
+++ linux-libre-4.4.117-gnu/drivers/infiniband/hw/mlx4/main.c	2018-02-22 09:45:02.000000000 -0500
@@ -2483,9 +2483,8 @@ err_steer_free_bitmap:
 	kfree(ibdev->ib_uc_qpns_bitmap);
 
 err_steer_qp_release:
-	if (ibdev->steering_support == MLX4_STEERING_MODE_DEVICE_MANAGED)
-		mlx4_qp_release_range(dev, ibdev->steer_qpn_base,
-				      ibdev->steer_qpn_count);
+	mlx4_qp_release_range(dev, ibdev->steer_qpn_base,
+			      ibdev->steer_qpn_count);
 err_counter:
 	for (i = 0; i < ibdev->num_ports; ++i)
 		mlx4_ib_delete_counters_table(ibdev, &ibdev->counters_table[i]);
@@ -2586,11 +2585,9 @@ static void mlx4_ib_remove(struct mlx4_d
 		ibdev->iboe.nb.notifier_call = NULL;
 	}
 
-	if (ibdev->steering_support == MLX4_STEERING_MODE_DEVICE_MANAGED) {
-		mlx4_qp_release_range(dev, ibdev->steer_qpn_base,
-				      ibdev->steer_qpn_count);
-		kfree(ibdev->ib_uc_qpns_bitmap);
-	}
+	mlx4_qp_release_range(dev, ibdev->steer_qpn_base,
+			      ibdev->steer_qpn_count);
+	kfree(ibdev->ib_uc_qpns_bitmap);
 
 	iounmap(ibdev->uar_map);
 	for (p = 0; p < ibdev->num_ports; ++p)
diff -druNp --no-dereference linux-libre-4.4.116-gnu/drivers/md/dm.c linux-libre-4.4.117-gnu/drivers/md/dm.c
--- linux-libre-4.4.116-gnu/drivers/md/dm.c	2018-02-16 14:09:48.000000000 -0500
+++ linux-libre-4.4.117-gnu/drivers/md/dm.c	2018-02-22 09:45:02.000000000 -0500
@@ -974,7 +974,8 @@ static void dec_pending(struct dm_io *io
 		} else {
 			/* done with normal IO or empty flush */
 			trace_block_bio_complete(md->queue, bio, io_error);
-			bio->bi_error = io_error;
+			if (io_error)
+				bio->bi_error = io_error;
 			bio_endio(bio);
 		}
 	}
diff -druNp --no-dereference linux-libre-4.4.116-gnu/drivers/media/tuners/r820t.c linux-libre-4.4.117-gnu/drivers/media/tuners/r820t.c
--- linux-libre-4.4.116-gnu/drivers/media/tuners/r820t.c	2018-02-16 14:09:48.000000000 -0500
+++ linux-libre-4.4.117-gnu/drivers/media/tuners/r820t.c	2018-02-22 09:45:02.000000000 -0500
@@ -410,9 +410,11 @@ static int r820t_write(struct r820t_priv
 	return 0;
 }
 
-static int r820t_write_reg(struct r820t_priv *priv, u8 reg, u8 val)
+static inline int r820t_write_reg(struct r820t_priv *priv, u8 reg, u8 val)
 {
-	return r820t_write(priv, reg, &val, 1);
+	u8 tmp = val; /* work around GCC PR81715 with asan-stack=1 */
+
+	return r820t_write(priv, reg, &tmp, 1);
 }
 
 static int r820t_read_cache_reg(struct r820t_priv *priv, int reg)
@@ -425,17 +427,18 @@ static int r820t_read_cache_reg(struct r
 		return -EINVAL;
 }
 
-static int r820t_write_reg_mask(struct r820t_priv *priv, u8 reg, u8 val,
+static inline int r820t_write_reg_mask(struct r820t_priv *priv, u8 reg, u8 val,
 				u8 bit_mask)
 {
+	u8 tmp = val;
 	int rc = r820t_read_cache_reg(priv, reg);
 
 	if (rc < 0)
 		return rc;
 
-	val = (rc & ~bit_mask) | (val & bit_mask);
+	tmp = (rc & ~bit_mask) | (tmp & bit_mask);
 
-	return r820t_write(priv, reg, &val, 1);
+	return r820t_write(priv, reg, &tmp, 1);
 }
 
 static int r820t_read(struct r820t_priv *priv, u8 reg, u8 *val, int len)
diff -druNp --no-dereference linux-libre-4.4.116-gnu/drivers/net/ethernet/marvell/mvpp2.c linux-libre-4.4.117-gnu/drivers/net/ethernet/marvell/mvpp2.c
--- linux-libre-4.4.116-gnu/drivers/net/ethernet/marvell/mvpp2.c	2018-02-16 14:09:48.000000000 -0500
+++ linux-libre-4.4.117-gnu/drivers/net/ethernet/marvell/mvpp2.c	2018-02-22 09:45:02.000000000 -0500
@@ -5666,6 +5666,7 @@ static void mvpp2_set_rx_mode(struct net
 	int id = port->id;
 	bool allmulti = dev->flags & IFF_ALLMULTI;
 
+retry:
 	mvpp2_prs_mac_promisc_set(priv, id, dev->flags & IFF_PROMISC);
 	mvpp2_prs_mac_multi_set(priv, id, MVPP2_PE_MAC_MC_ALL, allmulti);
 	mvpp2_prs_mac_multi_set(priv, id, MVPP2_PE_MAC_MC_IP6, allmulti);
@@ -5673,9 +5674,13 @@ static void mvpp2_set_rx_mode(struct net
 	/* Remove all port->id's mcast enries */
 	mvpp2_prs_mcast_del_all(priv, id);
 
-	if (allmulti && !netdev_mc_empty(dev)) {
-		netdev_for_each_mc_addr(ha, dev)
-			mvpp2_prs_mac_da_accept(priv, id, ha->addr, true);
+	if (!allmulti) {
+		netdev_for_each_mc_addr(ha, dev) {
+			if (mvpp2_prs_mac_da_accept(priv, id, ha->addr, true)) {
+				allmulti = true;
+				goto retry;
+			}
+		}
 	}
 }
 
diff -druNp --no-dereference linux-libre-4.4.116-gnu/drivers/net/ethernet/mellanox/mlx4/qp.c linux-libre-4.4.117-gnu/drivers/net/ethernet/mellanox/mlx4/qp.c
--- linux-libre-4.4.116-gnu/drivers/net/ethernet/mellanox/mlx4/qp.c	2018-02-16 14:09:48.000000000 -0500
+++ linux-libre-4.4.117-gnu/drivers/net/ethernet/mellanox/mlx4/qp.c	2018-02-22 09:45:02.000000000 -0500
@@ -280,6 +280,9 @@ void mlx4_qp_release_range(struct mlx4_d
 	u64 in_param = 0;
 	int err;
 
+	if (!cnt)
+		return;
+
 	if (mlx4_is_mfunc(dev)) {
 		set_param_l(&in_param, base_qpn);
 		set_param_h(&in_param, cnt);
diff -druNp --no-dereference linux-libre-4.4.116-gnu/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/hw.c linux-libre-4.4.117-gnu/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/hw.c
--- linux-libre-4.4.116-gnu/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/hw.c	2018-02-16 14:09:48.000000000 -0500
+++ linux-libre-4.4.117-gnu/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/hw.c	2018-02-22 09:45:02.000000000 -0500
@@ -1127,7 +1127,7 @@ static u8 _rtl8821ae_dbi_read(struct rtl
 	}
 	if (0 == tmp) {
 		read_addr = REG_DBI_RDATA + addr % 4;
-		ret = rtl_read_word(rtlpriv, read_addr);
+		ret = rtl_read_byte(rtlpriv, read_addr);
 	}
 	return ret;
 }
@@ -1169,7 +1169,8 @@ static void _rtl8821ae_enable_aspm_back_
 	}
 
 	tmp = _rtl8821ae_dbi_read(rtlpriv, 0x70f);
-	_rtl8821ae_dbi_write(rtlpriv, 0x70f, tmp | BIT(7));
+	_rtl8821ae_dbi_write(rtlpriv, 0x70f, tmp | BIT(7) |
+			     ASPM_L1_LATENCY << 3);
 
 	tmp = _rtl8821ae_dbi_read(rtlpriv, 0x719);
 	_rtl8821ae_dbi_write(rtlpriv, 0x719, tmp | BIT(3) | BIT(4));
diff -druNp --no-dereference linux-libre-4.4.116-gnu/drivers/net/wireless/realtek/rtlwifi/wifi.h linux-libre-4.4.117-gnu/drivers/net/wireless/realtek/rtlwifi/wifi.h
--- linux-libre-4.4.116-gnu/drivers/net/wireless/realtek/rtlwifi/wifi.h	2018-02-16 14:09:48.000000000 -0500
+++ linux-libre-4.4.117-gnu/drivers/net/wireless/realtek/rtlwifi/wifi.h	2018-02-22 09:45:02.000000000 -0500
@@ -99,6 +99,7 @@
 #define RTL_USB_MAX_RX_COUNT			100
 #define QBSS_LOAD_SIZE				5
 #define MAX_WMMELE_LENGTH			64
+#define ASPM_L1_LATENCY				7
 
 #define TOTAL_CAM_ENTRY				32
 
diff -druNp --no-dereference linux-libre-4.4.116-gnu/drivers/rtc/rtc-opal.c linux-libre-4.4.117-gnu/drivers/rtc/rtc-opal.c
--- linux-libre-4.4.116-gnu/drivers/rtc/rtc-opal.c	2018-02-16 14:09:48.000000000 -0500
+++ linux-libre-4.4.117-gnu/drivers/rtc/rtc-opal.c	2018-02-22 09:45:02.000000000 -0500
@@ -58,6 +58,7 @@ static void tm_to_opal(struct rtc_time *
 static int opal_get_rtc_time(struct device *dev, struct rtc_time *tm)
 {
 	long rc = OPAL_BUSY;
+	int retries = 10;
 	u32 y_m_d;
 	u64 h_m_s_ms;
 	__be32 __y_m_d;
@@ -67,8 +68,11 @@ static int opal_get_rtc_time(struct devi
 		rc = opal_rtc_read(&__y_m_d, &__h_m_s_ms);
 		if (rc == OPAL_BUSY_EVENT)
 			opal_poll_events(NULL);
-		else
+		else if (retries-- && (rc == OPAL_HARDWARE
+				       || rc == OPAL_INTERNAL_ERROR))
 			msleep(10);
+		else if (rc != OPAL_BUSY && rc != OPAL_BUSY_EVENT)
+			break;
 	}
 
 	if (rc != OPAL_SUCCESS)
@@ -84,6 +88,7 @@ static int opal_get_rtc_time(struct devi
 static int opal_set_rtc_time(struct device *dev, struct rtc_time *tm)
 {
 	long rc = OPAL_BUSY;
+	int retries = 10;
 	u32 y_m_d = 0;
 	u64 h_m_s_ms = 0;
 
@@ -92,8 +97,11 @@ static int opal_set_rtc_time(struct devi
 		rc = opal_rtc_write(y_m_d, h_m_s_ms);
 		if (rc == OPAL_BUSY_EVENT)
 			opal_poll_events(NULL);
-		else
+		else if (retries-- && (rc == OPAL_HARDWARE
+				       || rc == OPAL_INTERNAL_ERROR))
 			msleep(10);
+		else if (rc != OPAL_BUSY && rc != OPAL_BUSY_EVENT)
+			break;
 	}
 
 	return rc == OPAL_SUCCESS ? 0 : -EIO;
diff -druNp --no-dereference linux-libre-4.4.116-gnu/drivers/video/console/dummycon.c linux-libre-4.4.117-gnu/drivers/video/console/dummycon.c
--- linux-libre-4.4.116-gnu/drivers/video/console/dummycon.c	2018-02-16 14:09:48.000000000 -0500
+++ linux-libre-4.4.117-gnu/drivers/video/console/dummycon.c	2018-02-22 09:45:02.000000000 -0500
@@ -68,7 +68,6 @@ const struct consw dummy_con = {
     .con_switch =	DUMMY,
     .con_blank =	DUMMY,
     .con_font_set =	DUMMY,
-    .con_font_get =	DUMMY,
     .con_font_default =	DUMMY,
     .con_font_copy =	DUMMY,
     .con_set_palette =	DUMMY,
diff -druNp --no-dereference linux-libre-4.4.116-gnu/drivers/video/fbdev/atmel_lcdfb.c linux-libre-4.4.117-gnu/drivers/video/fbdev/atmel_lcdfb.c
--- linux-libre-4.4.116-gnu/drivers/video/fbdev/atmel_lcdfb.c	2018-02-16 14:09:48.000000000 -0500
+++ linux-libre-4.4.117-gnu/drivers/video/fbdev/atmel_lcdfb.c	2018-02-22 09:45:02.000000000 -0500
@@ -1120,7 +1120,7 @@ static int atmel_lcdfb_of_init(struct at
 		goto put_display_node;
 	}
 
-	timings_np = of_find_node_by_name(display_np, "display-timings");
+	timings_np = of_get_child_by_name(display_np, "display-timings");
 	if (!timings_np) {
 		dev_err(dev, "failed to find display-timings node\n");
 		ret = -ENODEV;
@@ -1141,6 +1141,12 @@ static int atmel_lcdfb_of_init(struct at
 		fb_add_videomode(&fb_vm, &info->modelist);
 	}
 
+	/*
+	 * FIXME: Make sure we are not referencing any fields in display_np
+	 * and timings_np and drop our references to them before returning to
+	 * avoid leaking the nodes on probe deferral and driver unbind.
+	 */
+
 	return 0;
 
 put_timings_node:
diff -druNp --no-dereference linux-libre-4.4.116-gnu/fs/btrfs/inode.c linux-libre-4.4.117-gnu/fs/btrfs/inode.c
--- linux-libre-4.4.116-gnu/fs/btrfs/inode.c	2018-02-16 14:09:48.000000000 -0500
+++ linux-libre-4.4.117-gnu/fs/btrfs/inode.c	2018-02-22 09:45:02.000000000 -0500
@@ -1292,8 +1292,11 @@ next_slot:
 		leaf = path->nodes[0];
 		if (path->slots[0] >= btrfs_header_nritems(leaf)) {
 			ret = btrfs_next_leaf(root, path);
-			if (ret < 0)
+			if (ret < 0) {
+				if (cow_start != (u64)-1)
+					cur_offset = cow_start;
 				goto error;
+			}
 			if (ret > 0)
 				break;
 			leaf = path->nodes[0];
diff -druNp --no-dereference linux-libre-4.4.116-gnu/fs/btrfs/tree-log.c linux-libre-4.4.117-gnu/fs/btrfs/tree-log.c
--- linux-libre-4.4.116-gnu/fs/btrfs/tree-log.c	2018-02-16 14:09:48.000000000 -0500
+++ linux-libre-4.4.117-gnu/fs/btrfs/tree-log.c	2018-02-22 09:45:02.000000000 -0500
@@ -26,6 +26,7 @@
 #include "print-tree.h"
 #include "backref.h"
 #include "hash.h"
+#include "inode-map.h"
 
 /* magic values for the inode_only field in btrfs_log_inode:
  *
@@ -2445,6 +2446,9 @@ static noinline int walk_down_log_tree(s
 							next);
 					btrfs_wait_tree_block_writeback(next);
 					btrfs_tree_unlock(next);
+				} else {
+					if (test_and_clear_bit(EXTENT_BUFFER_DIRTY, &next->bflags))
+						clear_extent_buffer_dirty(next);
 				}
 
 				WARN_ON(root_owner !=
@@ -2524,6 +2528,9 @@ static noinline int walk_up_log_tree(str
 							next);
 					btrfs_wait_tree_block_writeback(next);
 					btrfs_tree_unlock(next);
+				} else {
+					if (test_and_clear_bit(EXTENT_BUFFER_DIRTY, &next->bflags))
+						clear_extent_buffer_dirty(next);
 				}
 
 				WARN_ON(root_owner != BTRFS_TREE_LOG_OBJECTID);
@@ -2600,6 +2607,9 @@ static int walk_log_tree(struct btrfs_tr
 				clean_tree_block(trans, log->fs_info, next);
 				btrfs_wait_tree_block_writeback(next);
 				btrfs_tree_unlock(next);
+			} else {
+				if (test_and_clear_bit(EXTENT_BUFFER_DIRTY, &next->bflags))
+					clear_extent_buffer_dirty(next);
 			}
 
 			WARN_ON(log->root_key.objectid !=
@@ -5514,6 +5524,23 @@ again:
 						      path);
 		}
 
+		if (!ret && wc.stage == LOG_WALK_REPLAY_ALL) {
+			struct btrfs_root *root = wc.replay_dest;
+
+			btrfs_release_path(path);
+
+			/*
+			 * We have just replayed everything, and the highest
+			 * objectid of fs roots probably has changed in case
+			 * some inode_item's got replayed.
+			 *
+			 * root->objectid_mutex is not acquired as log replay
+			 * could only happen during mount.
+			 */
+			ret = btrfs_find_highest_objectid(root,
+						  &root->highest_objectid);
+		}
+
 		key.offset = found_key.offset - 1;
 		wc.replay_dest->log_root = NULL;
 		free_extent_buffer(log->node);
diff -druNp --no-dereference linux-libre-4.4.116-gnu/fs/ext4/super.c linux-libre-4.4.117-gnu/fs/ext4/super.c
--- linux-libre-4.4.116-gnu/fs/ext4/super.c	2018-02-16 14:09:48.000000000 -0500
+++ linux-libre-4.4.117-gnu/fs/ext4/super.c	2018-02-22 09:45:02.000000000 -0500
@@ -688,6 +688,7 @@ __acquires(bitlock)
 	}
 
 	ext4_unlock_group(sb, grp);
+	ext4_commit_super(sb, 1);
 	ext4_handle_error(sb);
 	/*
 	 * We only get here in the ERRORS_RO case; relocking the group
diff -druNp --no-dereference linux-libre-4.4.116-gnu/fs/namei.c linux-libre-4.4.117-gnu/fs/namei.c
--- linux-libre-4.4.116-gnu/fs/namei.c	2018-02-16 14:09:48.000000000 -0500
+++ linux-libre-4.4.117-gnu/fs/namei.c	2018-02-22 09:45:02.000000000 -0500
@@ -2000,6 +2000,9 @@ static const char *path_init(struct name
 	int retval = 0;
 	const char *s = nd->name->name;
 
+	if (!*s)
+		flags &= ~LOOKUP_RCU;
+
 	nd->last_type = LAST_ROOT; /* if there are only slashes... */
 	nd->flags = flags | LOOKUP_JUMPED | LOOKUP_PARENT;
 	nd->depth = 0;
diff -druNp --no-dereference linux-libre-4.4.116-gnu/include/linux/kaiser.h linux-libre-4.4.117-gnu/include/linux/kaiser.h
--- linux-libre-4.4.116-gnu/include/linux/kaiser.h	2018-02-16 14:09:48.000000000 -0500
+++ linux-libre-4.4.117-gnu/include/linux/kaiser.h	2018-02-22 09:45:02.000000000 -0500
@@ -32,7 +32,7 @@ static inline void kaiser_init(void)
 {
 }
 static inline int kaiser_add_mapping(unsigned long addr,
-				     unsigned long size, unsigned long flags)
+				     unsigned long size, u64 flags)
 {
 	return 0;
 }
diff -druNp --no-dereference linux-libre-4.4.116-gnu/Makefile linux-libre-4.4.117-gnu/Makefile
--- linux-libre-4.4.116-gnu/Makefile	2018-02-17 10:07:00.000000000 -0500
+++ linux-libre-4.4.117-gnu/Makefile	2018-02-23 10:42:33.000000000 -0500
@@ -1,6 +1,6 @@
 VERSION = 4
 PATCHLEVEL = 4
-SUBLEVEL = 116
+SUBLEVEL = 117
 EXTRAVERSION = -gnu
 NAME = Blurry Fish Butt
 
diff -druNp --no-dereference linux-libre-4.4.116-gnu/mm/memory.c linux-libre-4.4.117-gnu/mm/memory.c
--- linux-libre-4.4.116-gnu/mm/memory.c	2018-02-16 14:09:48.000000000 -0500
+++ linux-libre-4.4.117-gnu/mm/memory.c	2018-02-22 09:45:02.000000000 -0500
@@ -72,7 +72,7 @@
 
 #include "internal.h"
 
-#ifdef LAST_CPUPID_NOT_IN_PAGE_FLAGS
+#if defined(LAST_CPUPID_NOT_IN_PAGE_FLAGS) && !defined(CONFIG_COMPILE_TEST)
 #warning Unfortunate NUMA and NUMA Balancing config, growing page-frame for last_cpupid.
 #endif
 
diff -druNp --no-dereference linux-libre-4.4.116-gnu/sound/core/seq/seq_clientmgr.c linux-libre-4.4.117-gnu/sound/core/seq/seq_clientmgr.c
--- linux-libre-4.4.116-gnu/sound/core/seq/seq_clientmgr.c	2018-02-16 14:09:48.000000000 -0500
+++ linux-libre-4.4.117-gnu/sound/core/seq/seq_clientmgr.c	2018-02-22 09:45:02.000000000 -0500
@@ -1012,7 +1012,7 @@ static ssize_t snd_seq_write(struct file
 {
 	struct snd_seq_client *client = file->private_data;
 	int written = 0, len;
-	int err = -EINVAL;
+	int err;
 	struct snd_seq_event event;
 
 	if (!(snd_seq_file_flags(file) & SNDRV_SEQ_LFLG_OUTPUT))
@@ -1027,11 +1027,15 @@ static ssize_t snd_seq_write(struct file
 
 	/* allocate the pool now if the pool is not allocated yet */ 
 	if (client->pool->size > 0 && !snd_seq_write_pool_allocated(client)) {
-		if (snd_seq_pool_init(client->pool) < 0)
+		mutex_lock(&client->ioctl_mutex);
+		err = snd_seq_pool_init(client->pool);
+		mutex_unlock(&client->ioctl_mutex);
+		if (err < 0)
 			return -ENOMEM;
 	}
 
 	/* only process whole events */
+	err = -EINVAL;
 	while (count >= sizeof(struct snd_seq_event)) {
 		/* Read in the event header from the user */
 		len = sizeof(event);
@@ -2196,7 +2200,6 @@ static int snd_seq_do_ioctl(struct snd_s
 			    void __user *arg)
 {
 	struct seq_ioctl_table *p;
-	int ret;
 
 	switch (cmd) {
 	case SNDRV_SEQ_IOCTL_PVERSION:
@@ -2210,12 +2213,8 @@ static int snd_seq_do_ioctl(struct snd_s
 	if (! arg)
 		return -EFAULT;
 	for (p = ioctl_tables; p->cmd; p++) {
-		if (p->cmd == cmd) {
-			mutex_lock(&client->ioctl_mutex);
-			ret = p->func(client, arg);
-			mutex_unlock(&client->ioctl_mutex);
-			return ret;
-		}
+		if (p->cmd == cmd)
+			return p->func(client, arg);
 	}
 	pr_debug("ALSA: seq unknown ioctl() 0x%x (type='%c', number=0x%02x)\n",
 		   cmd, _IOC_TYPE(cmd), _IOC_NR(cmd));
@@ -2226,11 +2225,15 @@ static int snd_seq_do_ioctl(struct snd_s
 static long snd_seq_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 {
 	struct snd_seq_client *client = file->private_data;
+	long ret;
 
 	if (snd_BUG_ON(!client))
 		return -ENXIO;
 		
-	return snd_seq_do_ioctl(client, cmd, (void __user *) arg);
+	mutex_lock(&client->ioctl_mutex);
+	ret = snd_seq_do_ioctl(client, cmd, (void __user *) arg);
+	mutex_unlock(&client->ioctl_mutex);
+	return ret;
 }
 
 #ifdef CONFIG_COMPAT
diff -druNp --no-dereference linux-libre-4.4.116-gnu/sound/pci/hda/patch_realtek.c linux-libre-4.4.117-gnu/sound/pci/hda/patch_realtek.c
--- linux-libre-4.4.116-gnu/sound/pci/hda/patch_realtek.c	2018-02-16 14:09:48.000000000 -0500
+++ linux-libre-4.4.117-gnu/sound/pci/hda/patch_realtek.c	2018-02-22 09:45:02.000000000 -0500
@@ -3130,6 +3130,19 @@ static void alc269_fixup_pincfg_no_hp_to
 		spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
 }
 
+static void alc269_fixup_pincfg_U7x7_headset_mic(struct hda_codec *codec,
+						 const struct hda_fixup *fix,
+						 int action)
+{
+	unsigned int cfg_headphone = snd_hda_codec_get_pincfg(codec, 0x21);
+	unsigned int cfg_headset_mic = snd_hda_codec_get_pincfg(codec, 0x19);
+
+	if (cfg_headphone && cfg_headset_mic == 0x411111f0)
+		snd_hda_codec_set_pincfg(codec, 0x19,
+			(cfg_headphone & ~AC_DEFCFG_DEVICE) |
+			(AC_JACK_MIC_IN << AC_DEFCFG_DEVICE_SHIFT));
+}
+
 static void alc269_fixup_hweq(struct hda_codec *codec,
 			       const struct hda_fixup *fix, int action)
 {
@@ -4782,6 +4795,7 @@ enum {
 	ALC269_FIXUP_LIFEBOOK_EXTMIC,
 	ALC269_FIXUP_LIFEBOOK_HP_PIN,
 	ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT,
+	ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC,
 	ALC269_FIXUP_AMIC,
 	ALC269_FIXUP_DMIC,
 	ALC269VB_FIXUP_AMIC,
@@ -4972,6 +4986,10 @@ static const struct hda_fixup alc269_fix
 		.type = HDA_FIXUP_FUNC,
 		.v.func = alc269_fixup_pincfg_no_hp_to_lineout,
 	},
+	[ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC] = {
+		.type = HDA_FIXUP_FUNC,
+		.v.func = alc269_fixup_pincfg_U7x7_headset_mic,
+	},
 	[ALC269_FIXUP_AMIC] = {
 		.type = HDA_FIXUP_PINS,
 		.v.pins = (const struct hda_pintbl[]) {
@@ -5687,6 +5705,7 @@ static const struct snd_pci_quirk alc269
 	SND_PCI_QUIRK(0x10cf, 0x159f, "Lifebook E780", ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT),
 	SND_PCI_QUIRK(0x10cf, 0x15dc, "Lifebook T731", ALC269_FIXUP_LIFEBOOK_HP_PIN),
 	SND_PCI_QUIRK(0x10cf, 0x1757, "Lifebook E752", ALC269_FIXUP_LIFEBOOK_HP_PIN),
+	SND_PCI_QUIRK(0x10cf, 0x1629, "Lifebook U7x7", ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC),
 	SND_PCI_QUIRK(0x10cf, 0x1845, "Lifebook U904", ALC269_FIXUP_LIFEBOOK_EXTMIC),
 	SND_PCI_QUIRK(0x144d, 0xc109, "Samsung Ativ book 9 (NP900X3G)", ALC269_FIXUP_INV_DMIC),
 	SND_PCI_QUIRK(0x1458, 0xfa53, "Gigabyte BXBT-2807", ALC283_FIXUP_BXBT2807_MIC),
@@ -5976,6 +5995,11 @@ static const struct snd_hda_pin_quirk al
 		{0x14, 0x90170110},
 		{0x21, 0x02211020}),
 	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
+		{0x12, 0x90a60130},
+		{0x14, 0x90170110},
+		{0x14, 0x01011020},
+		{0x21, 0x0221101f}),
+	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
 		ALC256_STANDARD_PINS),
 	SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC280_FIXUP_HP_GPIO4,
 		{0x12, 0x90a60130},
@@ -6031,6 +6055,10 @@ static const struct snd_hda_pin_quirk al
 		{0x12, 0x90a60120},
 		{0x14, 0x90170110},
 		{0x21, 0x0321101f}),
+	SND_HDA_PIN_QUIRK(0x10ec0289, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
+		{0x12, 0xb7a60130},
+		{0x14, 0x90170110},
+		{0x21, 0x04211020}),
 	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
 		ALC290_STANDARD_PINS,
 		{0x15, 0x04211040},
diff -druNp --no-dereference linux-libre-4.4.116-gnu/sound/usb/mixer.c linux-libre-4.4.117-gnu/sound/usb/mixer.c
--- linux-libre-4.4.116-gnu/sound/usb/mixer.c	2018-02-16 14:09:48.000000000 -0500
+++ linux-libre-4.4.117-gnu/sound/usb/mixer.c	2018-02-22 09:45:02.000000000 -0500
@@ -343,17 +343,20 @@ static int get_ctl_value_v2(struct usb_m
 			    int validx, int *value_ret)
 {
 	struct snd_usb_audio *chip = cval->head.mixer->chip;
-	unsigned char buf[4 + 3 * sizeof(__u32)]; /* enough space for one range */
+	/* enough space for one range */
+	unsigned char buf[sizeof(__u16) + 3 * sizeof(__u32)];
 	unsigned char *val;
-	int idx = 0, ret, size;
+	int idx = 0, ret, val_size, size;
 	__u8 bRequest;
 
+	val_size = uac2_ctl_value_size(cval->val_type);
+
 	if (request == UAC_GET_CUR) {
 		bRequest = UAC2_CS_CUR;
-		size = uac2_ctl_value_size(cval->val_type);
+		size = val_size;
 	} else {
 		bRequest = UAC2_CS_RANGE;
-		size = sizeof(buf);
+		size = sizeof(__u16) + 3 * val_size;
 	}
 
 	memset(buf, 0, sizeof(buf));
@@ -386,16 +389,17 @@ error:
 		val = buf + sizeof(__u16);
 		break;
 	case UAC_GET_MAX:
-		val = buf + sizeof(__u16) * 2;
+		val = buf + sizeof(__u16) + val_size;
 		break;
 	case UAC_GET_RES:
-		val = buf + sizeof(__u16) * 3;
+		val = buf + sizeof(__u16) + val_size * 2;
 		break;
 	default:
 		return -EINVAL;
 	}
 
-	*value_ret = convert_signed_value(cval, snd_usb_combine_bytes(val, sizeof(__u16)));
+	*value_ret = convert_signed_value(cval,
+					  snd_usb_combine_bytes(val, val_size));
 
 	return 0;
 }
diff -druNp --no-dereference linux-libre-4.4.116-gnu/sound/usb/pcm.c linux-libre-4.4.117-gnu/sound/usb/pcm.c
--- linux-libre-4.4.116-gnu/sound/usb/pcm.c	2018-02-16 14:09:48.000000000 -0500
+++ linux-libre-4.4.117-gnu/sound/usb/pcm.c	2018-02-22 09:45:02.000000000 -0500
@@ -348,6 +348,15 @@ static int set_sync_ep_implicit_fb_quirk
 
 		alts = &iface->altsetting[1];
 		goto add_sync_ep;
+	case USB_ID(0x1397, 0x0002):
+		ep = 0x81;
+		iface = usb_ifnum_to_if(dev, 1);
+
+		if (!iface || iface->num_altsetting == 0)
+			return -EINVAL;
+
+		alts = &iface->altsetting[1];
+		goto add_sync_ep;
 	}
 	if (attr == USB_ENDPOINT_SYNC_ASYNC &&
 	    altsd->bInterfaceClass == USB_CLASS_VENDOR_SPEC &&
