Muehlenhoff has uploaded a new change for review. https://gerrit.wikimedia.org/r/225850
Change subject: Update to 3.19.8-ckt3 ...................................................................... Update to 3.19.8-ckt3 Change-Id: Iaaa1dd5fa4d31bf35f4f77b2506703ef363da0da --- M debian/changelog A debian/patches/bugfix/all/stable-3.19.8-ckt3.patch M debian/patches/series 3 files changed, 2,956 insertions(+), 2 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/operations/debs/linux refs/changes/50/225850/1 diff --git a/debian/changelog b/debian/changelog index 2043f91..b1b1bc9 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,7 +1,16 @@ +linux (3.19.3-7) jessie-wikimedia; urgency=medium + + * New upstream stable update: + http://kernel.ubuntu.com/stable/ChangeLog-3.19.8-ckt3 + -> CVE-2015-1420 (161f873b8913) + -> CVE-2015-4692 (ce40cd3fc7fa40a6119e5fe6c0f2bc0eb4541009) + + -- Moritz Muehlenhoff <mmuhlenh...@wikimedia.org> Mon, 20 Jul 2015 10:07:54 +0200 + linux (3.19.3-6) jessie-wikimedia; urgency=medium * New upstream stable update: - http://kernel.ubuntu.com/stable/ChangeLog-3.19.8-ckt1 + http://kernel.ubuntu.com/stable/ChangeLog-3.19.8-ckt2 -> CVE-2015-4001 (b1bb5b49373b61bf9d2c73a4d30058ba6f069e4c) -> CVE-2015-4002 (d114b9fe78c8d6fc6e70808c2092aa307c36dc8e, 9a59029bc218b48eff8b5d4dde5662fd79d3e1a8) diff --git a/debian/patches/bugfix/all/stable-3.19.8-ckt3.patch b/debian/patches/bugfix/all/stable-3.19.8-ckt3.patch new file mode 100644 index 0000000..5dcfc5c --- /dev/null +++ b/debian/patches/bugfix/all/stable-3.19.8-ckt3.patch @@ -0,0 +1,2945 @@ +diff --git a/Makefile b/Makefile +index 32d76f2..b2f65ac 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,7 +1,7 @@ + VERSION = 3 + PATCHLEVEL = 19 + SUBLEVEL = 8 +-EXTRAVERSION = -ckt2 ++EXTRAVERSION = -ckt3 + NAME = Sedated Swine + + # *DOCUMENTATION* +diff --git a/arch/arm/boot/dts/am335x-bone-common.dtsi b/arch/arm/boot/dts/am335x-bone-common.dtsi +index 2c6248d..7ecde1a 100644 +--- a/arch/arm/boot/dts/am335x-bone-common.dtsi ++++ b/arch/arm/boot/dts/am335x-bone-common.dtsi +@@ -223,6 +223,25 @@ + /include/ "tps65217.dtsi" + + &tps { ++ /* ++ * Configure pmic to enter OFF-state instead of SLEEP-state ("RTC-only ++ * mode") at poweroff. Most BeagleBone versions do not support RTC-only ++ * mode and risk hardware damage if this mode is entered. ++ * ++ * For details, see linux-omap mailing list May 2015 thread ++ * [PATCH] ARM: dts: am335x-bone* enable pmic-shutdown-controller ++ * In particular, messages: ++ * http://www.spinics.net/lists/linux-omap/msg118585.html ++ * http://www.spinics.net/lists/linux-omap/msg118615.html ++ * ++ * You can override this later with ++ * &tps { /delete-property/ ti,pmic-shutdown-controller; } ++ * if you want to use RTC-only mode and made sure you are not affected ++ * by the hardware problems. (Tip: double-check by performing a current ++ * measurement after shutdown: it should be less than 1 mA.) ++ */ ++ ti,pmic-shutdown-controller; ++ + regulators { + dcdc1_reg: regulator@0 { + regulator-name = "vdds_dpr"; +diff --git a/arch/arm/boot/dts/exynos4412-trats2.dts b/arch/arm/boot/dts/exynos4412-trats2.dts +index 29231b4..1ec4d33 100644 +--- a/arch/arm/boot/dts/exynos4412-trats2.dts ++++ b/arch/arm/boot/dts/exynos4412-trats2.dts +@@ -691,7 +691,7 @@ + + display-timings { + timing-0 { +- clock-frequency = <0>; ++ clock-frequency = <57153600>; + hactive = <720>; + vactive = <1280>; + hfront-porch = <5>; +diff --git a/arch/arm/boot/dts/imx27.dtsi b/arch/arm/boot/dts/imx27.dtsi +index 107d713..12ac5f7 100644 +--- a/arch/arm/boot/dts/imx27.dtsi ++++ b/arch/arm/boot/dts/imx27.dtsi +@@ -531,7 +531,7 @@ + + fec: ethernet@1002b000 { + compatible = "fsl,imx27-fec"; +- reg = <0x1002b000 0x4000>; ++ reg = <0x1002b000 0x1000>; + interrupts = <50>; + clocks = <&clks IMX27_CLK_FEC_IPG_GATE>, + <&clks IMX27_CLK_FEC_AHB_GATE>; +diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c +index 4e6ef89..7186382 100644 +--- a/arch/arm/mm/mmu.c ++++ b/arch/arm/mm/mmu.c +@@ -1112,22 +1112,22 @@ void __init sanity_check_meminfo(void) + } + + /* +- * Find the first non-section-aligned page, and point ++ * Find the first non-pmd-aligned page, and point + * memblock_limit at it. This relies on rounding the +- * limit down to be section-aligned, which happens at +- * the end of this function. ++ * limit down to be pmd-aligned, which happens at the ++ * end of this function. + * + * With this algorithm, the start or end of almost any +- * bank can be non-section-aligned. The only exception +- * is that the start of the bank 0 must be section- ++ * bank can be non-pmd-aligned. The only exception is ++ * that the start of the bank 0 must be section- + * aligned, since otherwise memory would need to be + * allocated when mapping the start of bank 0, which + * occurs before any free memory is mapped. + */ + if (!memblock_limit) { +- if (!IS_ALIGNED(block_start, SECTION_SIZE)) ++ if (!IS_ALIGNED(block_start, PMD_SIZE)) + memblock_limit = block_start; +- else if (!IS_ALIGNED(block_end, SECTION_SIZE)) ++ else if (!IS_ALIGNED(block_end, PMD_SIZE)) + memblock_limit = arm_lowmem_limit; + } + +@@ -1137,12 +1137,12 @@ void __init sanity_check_meminfo(void) + high_memory = __va(arm_lowmem_limit - 1) + 1; + + /* +- * Round the memblock limit down to a section size. This ++ * Round the memblock limit down to a pmd size. This + * helps to ensure that we will allocate memory from the +- * last full section, which should be mapped. ++ * last full pmd, which should be mapped. + */ + if (memblock_limit) +- memblock_limit = round_down(memblock_limit, SECTION_SIZE); ++ memblock_limit = round_down(memblock_limit, PMD_SIZE); + if (!memblock_limit) + memblock_limit = arm_lowmem_limit; + +diff --git a/arch/mips/kernel/irq.c b/arch/mips/kernel/irq.c +index d2bfbc2..be15e52 100644 +--- a/arch/mips/kernel/irq.c ++++ b/arch/mips/kernel/irq.c +@@ -109,7 +109,7 @@ void __init init_IRQ(void) + #endif + } + +-#ifdef DEBUG_STACKOVERFLOW ++#ifdef CONFIG_DEBUG_STACKOVERFLOW + static inline void check_stack_overflow(void) + { + unsigned long sp; +diff --git a/arch/mips/ralink/ill_acc.c b/arch/mips/ralink/ill_acc.c +index e20b02e..e10d10b 100644 +--- a/arch/mips/ralink/ill_acc.c ++++ b/arch/mips/ralink/ill_acc.c +@@ -41,7 +41,7 @@ static irqreturn_t ill_acc_irq_handler(int irq, void *_priv) + addr, (type >> ILL_ACC_OFF_S) & ILL_ACC_OFF_M, + type & ILL_ACC_LEN_M); + +- rt_memc_w32(REG_ILL_ACC_TYPE, REG_ILL_ACC_TYPE); ++ rt_memc_w32(ILL_INT_STATUS, REG_ILL_ACC_TYPE); + + return IRQ_HANDLED; + } +diff --git a/arch/x86/include/asm/segment.h b/arch/x86/include/asm/segment.h +index db257a5..69670ae 100644 +--- a/arch/x86/include/asm/segment.h ++++ b/arch/x86/include/asm/segment.h +@@ -200,10 +200,20 @@ + #define TLS_SIZE (GDT_ENTRY_TLS_ENTRIES * 8) + + #ifdef __KERNEL__ ++ ++/* ++ * early_idt_handler_array is an array of entry points referenced in the ++ * early IDT. For simplicity, it's a real array with one entry point ++ * every nine bytes. That leaves room for an optional 'push $0' if the ++ * vector has no error code (two bytes), a 'push $vector_number' (two ++ * bytes), and a jump to the common entry code (up to five bytes). ++ */ ++#define EARLY_IDT_HANDLER_SIZE 9 ++ + #ifndef __ASSEMBLY__ +-extern const char early_idt_handlers[NUM_EXCEPTION_VECTORS][2+2+5]; ++extern const char early_idt_handler_array[NUM_EXCEPTION_VECTORS][EARLY_IDT_HANDLER_SIZE]; + #ifdef CONFIG_TRACING +-#define trace_early_idt_handlers early_idt_handlers ++# define trace_early_idt_handler_array early_idt_handler_array + #endif + + /* +diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c +index d2c6116..1596e04 100644 +--- a/arch/x86/kernel/cpu/mcheck/mce.c ++++ b/arch/x86/kernel/cpu/mcheck/mce.c +@@ -706,6 +706,7 @@ static int mce_no_way_out(struct mce *m, char **msg, unsigned long *validp, + struct pt_regs *regs) + { + int i, ret = 0; ++ char *tmp; + + for (i = 0; i < mca_cfg.banks; i++) { + m->status = mce_rdmsrl(MSR_IA32_MCx_STATUS(i)); +@@ -714,9 +715,11 @@ static int mce_no_way_out(struct mce *m, char **msg, unsigned long *validp, + if (quirk_no_way_out) + quirk_no_way_out(i, m, regs); + } +- if (mce_severity(m, mca_cfg.tolerant, msg, true) >= +- MCE_PANIC_SEVERITY) ++ ++ if (mce_severity(m, mca_cfg.tolerant, &tmp, true) >= MCE_PANIC_SEVERITY) { ++ *msg = tmp; + ret = 1; ++ } + } + return ret; + } +diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c +index eda1a86..7823beb 100644 +--- a/arch/x86/kernel/head64.c ++++ b/arch/x86/kernel/head64.c +@@ -162,7 +162,7 @@ asmlinkage __visible void __init x86_64_start_kernel(char * real_mode_data) + clear_bss(); + + for (i = 0; i < NUM_EXCEPTION_VECTORS; i++) +- set_intr_gate(i, early_idt_handlers[i]); ++ set_intr_gate(i, early_idt_handler_array[i]); + load_idt((const struct desc_ptr *)&idt_descr); + + copy_bootdata(__va(real_mode_data)); +diff --git a/arch/x86/kernel/head_32.S b/arch/x86/kernel/head_32.S +index f36bd42..30a2aa3 100644 +--- a/arch/x86/kernel/head_32.S ++++ b/arch/x86/kernel/head_32.S +@@ -477,21 +477,22 @@ is486: + __INIT + setup_once: + /* +- * Set up a idt with 256 entries pointing to ignore_int, +- * interrupt gates. It doesn't actually load idt - that needs +- * to be done on each CPU. Interrupts are enabled elsewhere, +- * when we can be relatively sure everything is ok. ++ * Set up a idt with 256 interrupt gates that push zero if there ++ * is no error code and then jump to early_idt_handler_common. ++ * It doesn't actually load the idt - that needs to be done on ++ * each CPU. Interrupts are enabled elsewhere, when we can be ++ * relatively sure everything is ok. + */ + + movl $idt_table,%edi +- movl $early_idt_handlers,%eax ++ movl $early_idt_handler_array,%eax + movl $NUM_EXCEPTION_VECTORS,%ecx + 1: + movl %eax,(%edi) + movl %eax,4(%edi) + /* interrupt gate, dpl=0, present */ + movl $(0x8E000000 + __KERNEL_CS),2(%edi) +- addl $9,%eax ++ addl $EARLY_IDT_HANDLER_SIZE,%eax + addl $8,%edi + loop 1b + +@@ -523,26 +524,28 @@ setup_once: + andl $0,setup_once_ref /* Once is enough, thanks */ + ret + +-ENTRY(early_idt_handlers) ++ENTRY(early_idt_handler_array) + # 36(%esp) %eflags + # 32(%esp) %cs + # 28(%esp) %eip + # 24(%rsp) error code + i = 0 + .rept NUM_EXCEPTION_VECTORS +- .if (EXCEPTION_ERRCODE_MASK >> i) & 1 +- ASM_NOP2 +- .else ++ .ifeq (EXCEPTION_ERRCODE_MASK >> i) & 1 + pushl $0 # Dummy error code, to make stack frame uniform + .endif + pushl $i # 20(%esp) Vector number +- jmp early_idt_handler ++ jmp early_idt_handler_common + i = i + 1 ++ .fill early_idt_handler_array + i*EARLY_IDT_HANDLER_SIZE - ., 1, 0xcc + .endr +-ENDPROC(early_idt_handlers) ++ENDPROC(early_idt_handler_array) + +- /* This is global to keep gas from relaxing the jumps */ +-ENTRY(early_idt_handler) ++early_idt_handler_common: ++ /* ++ * The stack is the hardware frame, an error code or zero, and the ++ * vector number. ++ */ + cld + + cmpl $2,(%esp) # X86_TRAP_NMI +@@ -602,7 +605,7 @@ ex_entry: + is_nmi: + addl $8,%esp /* drop vector number and error code */ + iret +-ENDPROC(early_idt_handler) ++ENDPROC(early_idt_handler_common) + + /* This is the default interrupt "handler" :-) */ + ALIGN +diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S +index a468c0a..a2dc0ad 100644 +--- a/arch/x86/kernel/head_64.S ++++ b/arch/x86/kernel/head_64.S +@@ -321,26 +321,28 @@ bad_address: + jmp bad_address + + __INIT +- .globl early_idt_handlers +-early_idt_handlers: ++ENTRY(early_idt_handler_array) + # 104(%rsp) %rflags + # 96(%rsp) %cs + # 88(%rsp) %rip + # 80(%rsp) error code + i = 0 + .rept NUM_EXCEPTION_VECTORS +- .if (EXCEPTION_ERRCODE_MASK >> i) & 1 +- ASM_NOP2 +- .else ++ .ifeq (EXCEPTION_ERRCODE_MASK >> i) & 1 + pushq $0 # Dummy error code, to make stack frame uniform + .endif + pushq $i # 72(%rsp) Vector number +- jmp early_idt_handler ++ jmp early_idt_handler_common + i = i + 1 ++ .fill early_idt_handler_array + i*EARLY_IDT_HANDLER_SIZE - ., 1, 0xcc + .endr ++ENDPROC(early_idt_handler_array) + +-/* This is global to keep gas from relaxing the jumps */ +-ENTRY(early_idt_handler) ++early_idt_handler_common: ++ /* ++ * The stack is the hardware frame, an error code or zero, and the ++ * vector number. ++ */ + cld + + cmpl $2,(%rsp) # X86_TRAP_NMI +@@ -412,7 +414,7 @@ ENTRY(early_idt_handler) + is_nmi: + addq $16,%rsp # drop vector number and error code + INTERRUPT_RETURN +-ENDPROC(early_idt_handler) ++ENDPROC(early_idt_handler_common) + + __INITDATA + +diff --git a/arch/x86/kernel/i387.c b/arch/x86/kernel/i387.c +index a9a4229..ae0fdc8 100644 +--- a/arch/x86/kernel/i387.c ++++ b/arch/x86/kernel/i387.c +@@ -155,6 +155,21 @@ static void init_thread_xstate(void) + xstate_size = sizeof(struct i387_fxsave_struct); + else + xstate_size = sizeof(struct i387_fsave_struct); ++ ++ /* ++ * Quirk: we don't yet handle the XSAVES* instructions ++ * correctly, as we don't correctly convert between ++ * standard and compacted format when interfacing ++ * with user-space - so disable it for now. ++ * ++ * The difference is small: with recent CPUs the ++ * compacted format is only marginally smaller than ++ * the standard FPU state format. ++ * ++ * ( This is easy to backport while we are fixing ++ * XSAVES* support. ) ++ */ ++ setup_clear_cpu_cap(X86_FEATURE_XSAVES); + } + + /* +diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c +index d52dcf0..5ee4e1f 100644 +--- a/arch/x86/kvm/lapic.c ++++ b/arch/x86/kvm/lapic.c +@@ -1072,6 +1072,17 @@ static void update_divide_count(struct kvm_lapic *apic) + apic->divide_count); + } + ++static void apic_update_lvtt(struct kvm_lapic *apic) ++{ ++ u32 timer_mode = kvm_apic_get_reg(apic, APIC_LVTT) & ++ apic->lapic_timer.timer_mode_mask; ++ ++ if (apic->lapic_timer.timer_mode != timer_mode) { ++ apic->lapic_timer.timer_mode = timer_mode; ++ hrtimer_cancel(&apic->lapic_timer.timer); ++ } ++} ++ + static void apic_timer_expired(struct kvm_lapic *apic) + { + struct kvm_vcpu *vcpu = apic->vcpu; +@@ -1230,6 +1241,7 @@ static int apic_reg_write(struct kvm_lapic *apic, u32 reg, u32 val) + apic_set_reg(apic, APIC_LVTT + 0x10 * i, + lvt_val | APIC_LVT_MASKED); + } ++ apic_update_lvtt(apic); + atomic_set(&apic->lapic_timer.pending, 0); + + } +@@ -1262,20 +1274,13 @@ static int apic_reg_write(struct kvm_lapic *apic, u32 reg, u32 val) + + break; + +- case APIC_LVTT: { +- u32 timer_mode = val & apic->lapic_timer.timer_mode_mask; +- +- if (apic->lapic_timer.timer_mode != timer_mode) { +- apic->lapic_timer.timer_mode = timer_mode; +- hrtimer_cancel(&apic->lapic_timer.timer); +- } +- ++ case APIC_LVTT: + if (!kvm_apic_sw_enabled(apic)) + val |= APIC_LVT_MASKED; + val &= (apic_lvt_mask[0] | apic->lapic_timer.timer_mode_mask); + apic_set_reg(apic, APIC_LVTT, val); ++ apic_update_lvtt(apic); + break; +- } + + case APIC_TMICT: + if (apic_lvtt_tscdeadline(apic)) +@@ -1510,7 +1515,7 @@ void kvm_lapic_reset(struct kvm_vcpu *vcpu) + + for (i = 0; i < APIC_LVT_NUM; i++) + apic_set_reg(apic, APIC_LVTT + 0x10 * i, APIC_LVT_MASKED); +- apic->lapic_timer.timer_mode = 0; ++ apic_update_lvtt(apic); + apic_set_reg(apic, APIC_LVT0, + SET_APIC_DELIVERY_MODE(0, APIC_MODE_EXTINT)); + +@@ -1736,6 +1741,7 @@ void kvm_apic_post_state_restore(struct kvm_vcpu *vcpu, + + apic_update_ppr(apic); + hrtimer_cancel(&apic->lapic_timer.timer); ++ apic_update_lvtt(apic); + update_divide_count(apic); + start_apic_timer(apic); + apic->irr_pending = true; +diff --git a/arch/x86/kvm/lapic.h b/arch/x86/kvm/lapic.h +index c674fce..d3d6e92 100644 +--- a/arch/x86/kvm/lapic.h ++++ b/arch/x86/kvm/lapic.h +@@ -165,7 +165,7 @@ static inline u16 apic_logical_id(struct kvm_apic_map *map, u32 ldr) + + static inline bool kvm_apic_has_events(struct kvm_vcpu *vcpu) + { +- return vcpu->arch.apic->pending_events; ++ return kvm_vcpu_has_lapic(vcpu) && vcpu->arch.apic->pending_events; + } + + bool kvm_apic_pending_eoi(struct kvm_vcpu *vcpu, int vector); +diff --git a/block/genhd.c b/block/genhd.c +index 0a536dc..c2fb3f7 100644 +--- a/block/genhd.c ++++ b/block/genhd.c +@@ -422,9 +422,9 @@ int blk_alloc_devt(struct hd_struct *part, dev_t *devt) + /* allocate ext devt */ + idr_preload(GFP_KERNEL); + +- spin_lock(&ext_devt_lock); ++ spin_lock_bh(&ext_devt_lock); + idx = idr_alloc(&ext_devt_idr, part, 0, NR_EXT_DEVT, GFP_NOWAIT); +- spin_unlock(&ext_devt_lock); ++ spin_unlock_bh(&ext_devt_lock); + + idr_preload_end(); + if (idx < 0) +@@ -449,9 +449,9 @@ void blk_free_devt(dev_t devt) + return; + + if (MAJOR(devt) == BLOCK_EXT_MAJOR) { +- spin_lock(&ext_devt_lock); ++ spin_lock_bh(&ext_devt_lock); + idr_remove(&ext_devt_idr, blk_mangle_minor(MINOR(devt))); +- spin_unlock(&ext_devt_lock); ++ spin_unlock_bh(&ext_devt_lock); + } + } + +@@ -691,13 +691,13 @@ struct gendisk *get_gendisk(dev_t devt, int *partno) + } else { + struct hd_struct *part; + +- spin_lock(&ext_devt_lock); ++ spin_lock_bh(&ext_devt_lock); + part = idr_find(&ext_devt_idr, blk_mangle_minor(MINOR(devt))); + if (part && get_disk(part_to_disk(part))) { + *partno = part->partno; + disk = part_to_disk(part); + } +- spin_unlock(&ext_devt_lock); ++ spin_unlock_bh(&ext_devt_lock); + } + + return disk; +diff --git a/drivers/ata/ahci_mvebu.c b/drivers/ata/ahci_mvebu.c +index 64bb084..0f20074 100644 +--- a/drivers/ata/ahci_mvebu.c ++++ b/drivers/ata/ahci_mvebu.c +@@ -43,7 +43,7 @@ static void ahci_mvebu_mbus_config(struct ahci_host_priv *hpriv, + writel((cs->mbus_attr << 8) | + (dram->mbus_dram_target_id << 4) | 1, + hpriv->mmio + AHCI_WINDOW_CTRL(i)); +- writel(cs->base, hpriv->mmio + AHCI_WINDOW_BASE(i)); ++ writel(cs->base >> 16, hpriv->mmio + AHCI_WINDOW_BASE(i)); + writel(((cs->size - 1) & 0xffff0000), + hpriv->mmio + AHCI_WINDOW_SIZE(i)); + } +diff --git a/drivers/ata/pata_octeon_cf.c b/drivers/ata/pata_octeon_cf.c +index 80a8054..2724595 100644 +--- a/drivers/ata/pata_octeon_cf.c ++++ b/drivers/ata/pata_octeon_cf.c +@@ -1053,7 +1053,7 @@ static struct of_device_id octeon_cf_match[] = { + }, + {}, + }; +-MODULE_DEVICE_TABLE(of, octeon_i2c_match); ++MODULE_DEVICE_TABLE(of, octeon_cf_match); + + static struct platform_driver octeon_cf_driver = { + .probe = octeon_cf_probe, +diff --git a/drivers/base/cacheinfo.c b/drivers/base/cacheinfo.c +index 9c2ba1c..df0c66c 100644 +--- a/drivers/base/cacheinfo.c ++++ b/drivers/base/cacheinfo.c +@@ -179,7 +179,7 @@ static int detect_cache_attributes(unsigned int cpu) + { + int ret; + +- if (init_cache_level(cpu)) ++ if (init_cache_level(cpu) || !cache_leaves(cpu)) + return -ENOENT; + + per_cpu_cacheinfo(cpu) = kcalloc(cache_leaves(cpu), +diff --git a/drivers/clk/at91/clk-pll.c b/drivers/clk/at91/clk-pll.c +index 6ec79db..cbbe403 100644 +--- a/drivers/clk/at91/clk-pll.c ++++ b/drivers/clk/at91/clk-pll.c +@@ -173,8 +173,7 @@ static long clk_pll_get_best_div_mul(struct clk_pll *pll, unsigned long rate, + int i = 0; + + /* Check if parent_rate is a valid input rate */ +- if (parent_rate < characteristics->input.min || +- parent_rate > characteristics->input.max) ++ if (parent_rate < characteristics->input.min) + return -ERANGE; + + /* +@@ -187,6 +186,15 @@ static long clk_pll_get_best_div_mul(struct clk_pll *pll, unsigned long rate, + if (!mindiv) + mindiv = 1; + ++ if (parent_rate > characteristics->input.max) { ++ tmpdiv = DIV_ROUND_UP(parent_rate, characteristics->input.max); ++ if (tmpdiv > PLL_DIV_MAX) ++ return -ERANGE; ++ ++ if (tmpdiv > mindiv) ++ mindiv = tmpdiv; ++ } ++ + /* + * Calculate the maximum divider which is limited by PLL register + * layout (limited by the MUL or DIV field size). +diff --git a/drivers/clk/at91/pmc.h b/drivers/clk/at91/pmc.h +index 52d2041..af2c991 100644 +--- a/drivers/clk/at91/pmc.h ++++ b/drivers/clk/at91/pmc.h +@@ -120,7 +120,7 @@ extern void __init of_at91sam9x5_clk_smd_setup(struct device_node *np, + struct at91_pmc *pmc); + #endif + +-#if defined(CONFIG_HAVE_AT91_SMD) ++#if defined(CONFIG_HAVE_AT91_H32MX) + extern void __init of_sama5d4_clk_h32mx_setup(struct device_node *np, + struct at91_pmc *pmc); + #endif +diff --git a/drivers/crypto/caam/caamhash.c b/drivers/crypto/caam/caamhash.c +index f347ab7..08b0da2 100644 +--- a/drivers/crypto/caam/caamhash.c ++++ b/drivers/crypto/caam/caamhash.c +@@ -1543,6 +1543,8 @@ static int ahash_init(struct ahash_request *req) + + state->current_buf = 0; + state->buf_dma = 0; ++ state->buflen_0 = 0; ++ state->buflen_1 = 0; + + return 0; + } +diff --git a/drivers/crypto/caam/caamrng.c b/drivers/crypto/caam/caamrng.c +index ae31e55..a48dc25 100644 +--- a/drivers/crypto/caam/caamrng.c ++++ b/drivers/crypto/caam/caamrng.c +@@ -56,7 +56,7 @@ + + /* Buffer, its dma address and lock */ + struct buf_data { +- u8 buf[RN_BUF_SIZE]; ++ u8 buf[RN_BUF_SIZE] ____cacheline_aligned; + dma_addr_t addr; + struct completion filled; + u32 hw_desc[DESC_JOB_O_LEN]; +diff --git a/drivers/gpio/gpio-kempld.c b/drivers/gpio/gpio-kempld.c +index 443518f..a6b0def 100644 +--- a/drivers/gpio/gpio-kempld.c ++++ b/drivers/gpio/gpio-kempld.c +@@ -117,7 +117,7 @@ static int kempld_gpio_get_direction(struct gpio_chip *chip, unsigned offset) + = container_of(chip, struct kempld_gpio_data, chip); + struct kempld_device_data *pld = gpio->pld; + +- return kempld_gpio_get_bit(pld, KEMPLD_GPIO_DIR_NUM(offset), offset); ++ return !kempld_gpio_get_bit(pld, KEMPLD_GPIO_DIR_NUM(offset), offset); + } + + static int kempld_gpio_pincount(struct kempld_device_data *pld) +diff --git a/drivers/gpu/drm/drm_plane_helper.c b/drivers/gpu/drm/drm_plane_helper.c +index 18a1ac6..811902e 100644 +--- a/drivers/gpu/drm/drm_plane_helper.c ++++ b/drivers/gpu/drm/drm_plane_helper.c +@@ -454,6 +454,9 @@ int drm_plane_helper_commit(struct drm_plane *plane, + if (!crtc[i]) + continue; + ++ if (crtc[i]->cursor == plane) ++ continue; ++ + /* There's no other way to figure out whether the crtc is running. */ + ret = drm_crtc_vblank_get(crtc[i]); + if (ret == 0) { +diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c +index 00c8ee9..035a458 100644 +--- a/drivers/gpu/drm/i915/intel_dp.c ++++ b/drivers/gpu/drm/i915/intel_dp.c +@@ -880,10 +880,8 @@ intel_dp_aux_ch(struct intel_dp *intel_dp, + DP_AUX_CH_CTL_RECEIVE_ERROR)) + continue; + if (status & DP_AUX_CH_CTL_DONE) +- break; ++ goto done; + } +- if (status & DP_AUX_CH_CTL_DONE) +- break; + } + + if ((status & DP_AUX_CH_CTL_DONE) == 0) { +@@ -892,6 +890,7 @@ intel_dp_aux_ch(struct intel_dp *intel_dp, + goto out; + } + ++done: + /* Check for timeout or receive error. + * Timeouts occur when the sink is not connected + */ +diff --git a/drivers/gpu/drm/i915/intel_i2c.c b/drivers/gpu/drm/i915/intel_i2c.c +index 56e437e..ae62800 100644 +--- a/drivers/gpu/drm/i915/intel_i2c.c ++++ b/drivers/gpu/drm/i915/intel_i2c.c +@@ -435,7 +435,7 @@ gmbus_xfer(struct i2c_adapter *adapter, + struct intel_gmbus, + adapter); + struct drm_i915_private *dev_priv = bus->dev_priv; +- int i, reg_offset; ++ int i = 0, inc, try = 0, reg_offset; + int ret = 0; + + intel_aux_display_runtime_get(dev_priv); +@@ -448,12 +448,14 @@ gmbus_xfer(struct i2c_adapter *adapter, + + reg_offset = dev_priv->gpio_mmio_base; + ++retry: + I915_WRITE(GMBUS0 + reg_offset, bus->reg0); + +- for (i = 0; i < num; i++) { ++ for (; i < num; i += inc) { ++ inc = 1; + if (gmbus_is_index_read(msgs, i, num)) { + ret = gmbus_xfer_index_read(dev_priv, &msgs[i]); +- i += 1; /* set i to the index of the read xfer */ ++ inc = 2; /* an index read is two msgs */ + } else if (msgs[i].flags & I2C_M_RD) { + ret = gmbus_xfer_read(dev_priv, &msgs[i], 0); + } else { +@@ -525,6 +527,18 @@ clear_err: + adapter->name, msgs[i].addr, + (msgs[i].flags & I2C_M_RD) ? 'r' : 'w', msgs[i].len); + ++ /* ++ * Passive adapters sometimes NAK the first probe. Retry the first ++ * message once on -ENXIO for GMBUS transfers; the bit banging algorithm ++ * has retries internally. See also the retry loop in ++ * drm_do_probe_ddc_edid, which bails out on the first -ENXIO. ++ */ ++ if (ret == -ENXIO && i == 0 && try++ == 0) { ++ DRM_DEBUG_KMS("GMBUS [%s] NAK on first message, retry\n", ++ adapter->name); ++ goto retry; ++ } ++ + goto out; + + timeout: +diff --git a/drivers/gpu/drm/mgag200/mgag200_mode.c b/drivers/gpu/drm/mgag200/mgag200_mode.c +index 9872ba9..2ffeda3 100644 +--- a/drivers/gpu/drm/mgag200/mgag200_mode.c ++++ b/drivers/gpu/drm/mgag200/mgag200_mode.c +@@ -1526,6 +1526,11 @@ static int mga_vga_mode_valid(struct drm_connector *connector, + return MODE_BANDWIDTH; + } + ++ if ((mode->hdisplay % 8) != 0 || (mode->hsync_start % 8) != 0 || ++ (mode->hsync_end % 8) != 0 || (mode->htotal % 8) != 0) { ++ return MODE_H_ILLEGAL; ++ } ++ + if (mode->crtc_hdisplay > 2048 || mode->crtc_hsync_start > 4096 || + mode->crtc_hsync_end > 4096 || mode->crtc_htotal > 4096 || + mode->crtc_vdisplay > 2048 || mode->crtc_vsync_start > 4096 || +diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c +index 1afc0b4..9bd5611 100644 +--- a/drivers/gpu/drm/radeon/atombios_crtc.c ++++ b/drivers/gpu/drm/radeon/atombios_crtc.c +@@ -580,9 +580,6 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc, + else + radeon_crtc->pll_flags |= RADEON_PLL_PREFER_LOW_REF_DIV; + +- /* if there is no audio, set MINM_OVER_MAXP */ +- if (!drm_detect_monitor_audio(radeon_connector_edid(connector))) +- radeon_crtc->pll_flags |= RADEON_PLL_PREFER_MINM_OVER_MAXP; + if (rdev->family < CHIP_RV770) + radeon_crtc->pll_flags |= RADEON_PLL_PREFER_MINM_OVER_MAXP; + /* use frac fb div on APUs */ +diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c +index bd7519f..aa232fd 100644 +--- a/drivers/gpu/drm/radeon/radeon_device.c ++++ b/drivers/gpu/drm/radeon/radeon_device.c +@@ -1458,6 +1458,21 @@ int radeon_device_init(struct radeon_device *rdev, + if (r) + DRM_ERROR("ib ring test failed (%d).\n", r); + ++ /* ++ * Turks/Thames GPU will freeze whole laptop if DPM is not restarted ++ * after the CP ring have chew one packet at least. Hence here we stop ++ * and restart DPM after the radeon_ib_ring_tests(). ++ */ ++ if (rdev->pm.dpm_enabled && ++ (rdev->pm.pm_method == PM_METHOD_DPM) && ++ (rdev->family == CHIP_TURKS) && ++ (rdev->flags & RADEON_IS_MOBILITY)) { ++ mutex_lock(&rdev->pm.mutex); ++ radeon_dpm_disable(rdev); ++ radeon_dpm_enable(rdev); ++ mutex_unlock(&rdev->pm.mutex); ++ } ++ + if ((radeon_testing & 1)) { + if (rdev->accel_working) + radeon_test_moves(rdev); +diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c +index 686411e..b82f2dd 100644 +--- a/drivers/gpu/drm/radeon/radeon_kms.c ++++ b/drivers/gpu/drm/radeon/radeon_kms.c +@@ -547,6 +547,9 @@ static int radeon_info_ioctl(struct drm_device *dev, void *data, struct drm_file + else + *value = 1; + break; ++ case RADEON_INFO_VA_UNMAP_WORKING: ++ *value = true; ++ break; + default: + DRM_DEBUG_KMS("Invalid request %d\n", info->request); + return -EINVAL; +diff --git a/drivers/gpu/drm/radeon/radeon_vm.c b/drivers/gpu/drm/radeon/radeon_vm.c +index de42fc4..9c3377c 100644 +--- a/drivers/gpu/drm/radeon/radeon_vm.c ++++ b/drivers/gpu/drm/radeon/radeon_vm.c +@@ -458,14 +458,16 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev, + /* make sure object fit at this offset */ + eoffset = soffset + size; + if (soffset >= eoffset) { +- return -EINVAL; ++ r = -EINVAL; ++ goto error_unreserve; + } + + last_pfn = eoffset / RADEON_GPU_PAGE_SIZE; + if (last_pfn > rdev->vm_manager.max_pfn) { + dev_err(rdev->dev, "va above limit (0x%08X > 0x%08X)\n", + last_pfn, rdev->vm_manager.max_pfn); +- return -EINVAL; ++ r = -EINVAL; ++ goto error_unreserve; + } + + } else { +@@ -486,7 +488,8 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev, + "(bo %p 0x%010lx 0x%010lx)\n", bo_va->bo, + soffset, tmp->bo, tmp->it.start, tmp->it.last); + mutex_unlock(&vm->mutex); +- return -EINVAL; ++ r = -EINVAL; ++ goto error_unreserve; + } + } + +@@ -497,7 +500,8 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev, + tmp = kzalloc(sizeof(struct radeon_bo_va), GFP_KERNEL); + if (!tmp) { + mutex_unlock(&vm->mutex); +- return -ENOMEM; ++ r = -ENOMEM; ++ goto error_unreserve; + } + tmp->it.start = bo_va->it.start; + tmp->it.last = bo_va->it.last; +@@ -555,7 +559,6 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev, + r = radeon_vm_clear_bo(rdev, pt); + if (r) { + radeon_bo_unref(&pt); +- radeon_bo_reserve(bo_va->bo, false); + return r; + } + +@@ -575,6 +578,10 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev, + + mutex_unlock(&vm->mutex); + return 0; ++ ++error_unreserve: ++ radeon_bo_unreserve(bo_va->bo); ++ return r; + } + + /** +diff --git a/drivers/hv/hyperv_vmbus.h b/drivers/hv/hyperv_vmbus.h +index ce49de7..c386d8d 100644 +--- a/drivers/hv/hyperv_vmbus.h ++++ b/drivers/hv/hyperv_vmbus.h +@@ -49,17 +49,6 @@ enum hv_cpuid_function { + HVCPUID_IMPLEMENTATION_LIMITS = 0x40000005, + }; + +-#define HV_FEATURE_GUEST_CRASH_MSR_AVAILABLE 0x400 +- +-#define HV_X64_MSR_CRASH_P0 0x40000100 +-#define HV_X64_MSR_CRASH_P1 0x40000101 +-#define HV_X64_MSR_CRASH_P2 0x40000102 +-#define HV_X64_MSR_CRASH_P3 0x40000103 +-#define HV_X64_MSR_CRASH_P4 0x40000104 +-#define HV_X64_MSR_CRASH_CTL 0x40000105 +- +-#define HV_CRASH_CTL_CRASH_NOTIFY (1ULL << 63) +- + /* Define version of the synthetic interrupt controller. */ + #define HV_SYNIC_VERSION (1) + +diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c +index 3d2d710..4d6b269 100644 +--- a/drivers/hv/vmbus_drv.c ++++ b/drivers/hv/vmbus_drv.c +@@ -35,8 +35,6 @@ + #include <asm/hyperv.h> + #include <asm/hypervisor.h> + #include <asm/mshyperv.h> +-#include <linux/notifier.h> +-#include <linux/ptrace.h> + #include "hyperv_vmbus.h" + + static struct acpi_device *hv_acpi_dev; +@@ -45,31 +43,6 @@ static struct tasklet_struct msg_dpc; + static struct completion probe_event; + static int irq; + +- +-int hyperv_panic_event(struct notifier_block *nb, +- unsigned long event, void *ptr) +-{ +- struct pt_regs *regs; +- +- regs = current_pt_regs(); +- +- wrmsrl(HV_X64_MSR_CRASH_P0, regs->ip); +- wrmsrl(HV_X64_MSR_CRASH_P1, regs->ax); +- wrmsrl(HV_X64_MSR_CRASH_P2, regs->bx); +- wrmsrl(HV_X64_MSR_CRASH_P3, regs->cx); +- wrmsrl(HV_X64_MSR_CRASH_P4, regs->dx); +- +- /* +- * Let Hyper-V know there is crash data available +- */ +- wrmsrl(HV_X64_MSR_CRASH_CTL, HV_CRASH_CTL_CRASH_NOTIFY); +- return NOTIFY_DONE; +-} +- +-static struct notifier_block hyperv_panic_block = { +- .notifier_call = hyperv_panic_event, +-}; +- + struct resource hyperv_mmio = { + .name = "hyperv mmio", + .flags = IORESOURCE_MEM, +@@ -738,14 +711,6 @@ static int vmbus_bus_init(int irq) + if (ret) + goto err_alloc; + +- /* +- * Only register if the crash MSRs are available +- */ +- if (ms_hyperv.features & HV_FEATURE_GUEST_CRASH_MSR_AVAILABLE) { +- atomic_notifier_chain_register(&panic_notifier_list, +- &hyperv_panic_block); +- } +- + vmbus_request_offers(); + + return 0; +diff --git a/drivers/hwmon/nct6683.c b/drivers/hwmon/nct6683.c +index f3830db..37f0170 100644 +--- a/drivers/hwmon/nct6683.c ++++ b/drivers/hwmon/nct6683.c +@@ -439,6 +439,7 @@ nct6683_create_attr_group(struct device *dev, struct sensor_template_group *tg, + (*t)->dev_attr.attr.name, tg->base + i); + if ((*t)->s2) { + a2 = &su->u.a2; ++ sysfs_attr_init(&a2->dev_attr.attr); + a2->dev_attr.attr.name = su->name; + a2->nr = (*t)->u.s.nr + i; + a2->index = (*t)->u.s.index; +@@ -449,6 +450,7 @@ nct6683_create_attr_group(struct device *dev, struct sensor_template_group *tg, + *attrs = &a2->dev_attr.attr; + } else { + a = &su->u.a1; ++ sysfs_attr_init(&a->dev_attr.attr); + a->dev_attr.attr.name = su->name; + a->index = (*t)->u.index + i; + a->dev_attr.attr.mode = +diff --git a/drivers/hwmon/nct6775.c b/drivers/hwmon/nct6775.c +index 1be4117..0773930 100644 +--- a/drivers/hwmon/nct6775.c ++++ b/drivers/hwmon/nct6775.c +@@ -994,6 +994,7 @@ nct6775_create_attr_group(struct device *dev, struct sensor_template_group *tg, + (*t)->dev_attr.attr.name, tg->base + i); + if ((*t)->s2) { + a2 = &su->u.a2; ++ sysfs_attr_init(&a2->dev_attr.attr); + a2->dev_attr.attr.name = su->name; + a2->nr = (*t)->u.s.nr + i; + a2->index = (*t)->u.s.index; +@@ -1004,6 +1005,7 @@ nct6775_create_attr_group(struct device *dev, struct sensor_template_group *tg, + *attrs = &a2->dev_attr.attr; + } else { + a = &su->u.a1; ++ sysfs_attr_init(&a->dev_attr.attr); + a->dev_attr.attr.name = su->name; + a->index = (*t)->u.index + i; + a->dev_attr.attr.mode = +diff --git a/drivers/hwmon/ntc_thermistor.c b/drivers/hwmon/ntc_thermistor.c +index 112e4d4..6880011 100644 +--- a/drivers/hwmon/ntc_thermistor.c ++++ b/drivers/hwmon/ntc_thermistor.c +@@ -239,8 +239,10 @@ static struct ntc_thermistor_platform_data * + ntc_thermistor_parse_dt(struct platform_device *pdev) + { + struct iio_channel *chan; ++ enum iio_chan_type type; + struct device_node *np = pdev->dev.of_node; + struct ntc_thermistor_platform_data *pdata; ++ int ret; + + if (!np) + return NULL; +@@ -253,6 +255,13 @@ ntc_thermistor_parse_dt(struct platform_device *pdev) + if (IS_ERR(chan)) + return ERR_CAST(chan); + ++ ret = iio_get_channel_type(chan, &type); ++ if (ret < 0) ++ return ERR_PTR(ret); ++ ++ if (type != IIO_VOLTAGE) ++ return ERR_PTR(-EINVAL); ++ + if (of_property_read_u32(np, "pullup-uv", &pdata->pullup_uv)) + return ERR_PTR(-ENODEV); + if (of_property_read_u32(np, "pullup-ohm", &pdata->pullup_ohm)) +diff --git a/drivers/i2c/busses/i2c-hix5hd2.c b/drivers/i2c/busses/i2c-hix5hd2.c +index 8fe78d0..7c69664 100644 +--- a/drivers/i2c/busses/i2c-hix5hd2.c ++++ b/drivers/i2c/busses/i2c-hix5hd2.c +@@ -554,4 +554,4 @@ module_platform_driver(hix5hd2_i2c_driver); + MODULE_DESCRIPTION("Hix5hd2 I2C Bus driver"); + MODULE_AUTHOR("Wei Yan <sledge.yan...@huawei.com>"); + MODULE_LICENSE("GPL"); +-MODULE_ALIAS("platform:i2c-hix5hd2"); ++MODULE_ALIAS("platform:hix5hd2-i2c"); +diff --git a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c-s3c2410.c +index 958c8db..297e9c9 100644 +--- a/drivers/i2c/busses/i2c-s3c2410.c ++++ b/drivers/i2c/busses/i2c-s3c2410.c +@@ -1143,6 +1143,7 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev) + return -ENOMEM; + + i2c->quirks = s3c24xx_get_device_quirks(pdev); ++ i2c->sysreg = ERR_PTR(-ENOENT); + if (pdata) + memcpy(i2c->pdata, pdata, sizeof(*pdata)); + else +diff --git a/drivers/iio/adc/twl6030-gpadc.c b/drivers/iio/adc/twl6030-gpadc.c +index 89d8aa1..df12c57e 100644 +--- a/drivers/iio/adc/twl6030-gpadc.c ++++ b/drivers/iio/adc/twl6030-gpadc.c +@@ -1001,7 +1001,7 @@ static struct platform_driver twl6030_gpadc_driver = { + + module_platform_driver(twl6030_gpadc_driver); + +-MODULE_ALIAS("platform: " DRIVER_NAME); ++MODULE_ALIAS("platform:" DRIVER_NAME); + MODULE_AUTHOR("Balaji T K <balaj...@ti.com>"); + MODULE_AUTHOR("Graeme Gregory <g...@slimlogic.co.uk>"); + MODULE_AUTHOR("Oleksandr Kozaruk <oleksandr.koza...@ti.com"); +diff --git a/drivers/iio/imu/adis16400.h b/drivers/iio/imu/adis16400.h +index 0916bf6..73b189c 100644 +--- a/drivers/iio/imu/adis16400.h ++++ b/drivers/iio/imu/adis16400.h +@@ -139,6 +139,7 @@ + #define ADIS16400_NO_BURST BIT(1) + #define ADIS16400_HAS_SLOW_MODE BIT(2) + #define ADIS16400_HAS_SERIAL_NUMBER BIT(3) ++#define ADIS16400_BURST_DIAG_STAT BIT(4) + + struct adis16400_state; + +@@ -165,6 +166,7 @@ struct adis16400_state { + int filt_int; + + struct adis adis; ++ unsigned long avail_scan_mask[2]; + }; + + /* At the moment triggers are only used for ring buffer +diff --git a/drivers/iio/imu/adis16400_buffer.c b/drivers/iio/imu/adis16400_buffer.c +index 6e727ff..90c24a2 100644 +--- a/drivers/iio/imu/adis16400_buffer.c ++++ b/drivers/iio/imu/adis16400_buffer.c +@@ -18,7 +18,8 @@ int adis16400_update_scan_mode(struct iio_dev *indio_dev, + { + struct adis16400_state *st = iio_priv(indio_dev); + struct adis *adis = &st->adis; +- uint16_t *tx; ++ unsigned int burst_length; ++ u8 *tx; + + if (st->variant->flags & ADIS16400_NO_BURST) + return adis_update_scan_mode(indio_dev, scan_mask); +@@ -26,26 +27,29 @@ int adis16400_update_scan_mode(struct iio_dev *indio_dev, + kfree(adis->xfer); + kfree(adis->buffer); + ++ /* All but the timestamp channel */ ++ burst_length = (indio_dev->num_channels - 1) * sizeof(u16); ++ if (st->variant->flags & ADIS16400_BURST_DIAG_STAT) ++ burst_length += sizeof(u16); ++ + adis->xfer = kcalloc(2, sizeof(*adis->xfer), GFP_KERNEL); + if (!adis->xfer) + return -ENOMEM; + +- adis->buffer = kzalloc(indio_dev->scan_bytes + sizeof(u16), +- GFP_KERNEL); ++ adis->buffer = kzalloc(burst_length + sizeof(u16), GFP_KERNEL); + if (!adis->buffer) + return -ENOMEM; + +- tx = adis->buffer + indio_dev->scan_bytes; +- ++ tx = adis->buffer + burst_length; + tx[0] = ADIS_READ_REG(ADIS16400_GLOB_CMD); + tx[1] = 0; + + adis->xfer[0].tx_buf = tx; + adis->xfer[0].bits_per_word = 8; + adis->xfer[0].len = 2; +- adis->xfer[1].tx_buf = tx; ++ adis->xfer[1].rx_buf = adis->buffer; + adis->xfer[1].bits_per_word = 8; +- adis->xfer[1].len = indio_dev->scan_bytes; ++ adis->xfer[1].len = burst_length; + + spi_message_init(&adis->msg); + spi_message_add_tail(&adis->xfer[0], &adis->msg); +@@ -61,6 +65,7 @@ irqreturn_t adis16400_trigger_handler(int irq, void *p) + struct adis16400_state *st = iio_priv(indio_dev); + struct adis *adis = &st->adis; + u32 old_speed_hz = st->adis.spi->max_speed_hz; ++ void *buffer; + int ret; + + if (!adis->buffer) +@@ -81,7 +86,12 @@ irqreturn_t adis16400_trigger_handler(int irq, void *p) + spi_setup(st->adis.spi); + } + +- iio_push_to_buffers_with_timestamp(indio_dev, adis->buffer, ++ if (st->variant->flags & ADIS16400_BURST_DIAG_STAT) ++ buffer = adis->buffer + sizeof(u16); ++ else ++ buffer = adis->buffer; ++ ++ iio_push_to_buffers_with_timestamp(indio_dev, buffer, + pf->timestamp); + + iio_trigger_notify_done(indio_dev->trig); +diff --git a/drivers/iio/imu/adis16400_core.c b/drivers/iio/imu/adis16400_core.c +index fa795dc..2fd68f2 100644 +--- a/drivers/iio/imu/adis16400_core.c ++++ b/drivers/iio/imu/adis16400_core.c +@@ -405,6 +405,11 @@ static int adis16400_read_raw(struct iio_dev *indio_dev, + *val = st->variant->temp_scale_nano / 1000000; + *val2 = (st->variant->temp_scale_nano % 1000000); + return IIO_VAL_INT_PLUS_MICRO; ++ case IIO_PRESSURE: ++ /* 20 uBar = 0.002kPascal */ ++ *val = 0; ++ *val2 = 2000; ++ return IIO_VAL_INT_PLUS_MICRO; + default: + return -EINVAL; + } +@@ -454,10 +459,10 @@ static int adis16400_read_raw(struct iio_dev *indio_dev, + } + } + +-#define ADIS16400_VOLTAGE_CHAN(addr, bits, name, si) { \ ++#define ADIS16400_VOLTAGE_CHAN(addr, bits, name, si, chn) { \ + .type = IIO_VOLTAGE, \ + .indexed = 1, \ +- .channel = 0, \ ++ .channel = chn, \ + .extend_name = name, \ + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ + BIT(IIO_CHAN_INFO_SCALE), \ +@@ -474,10 +479,10 @@ static int adis16400_read_raw(struct iio_dev *indio_dev, + } + + #define ADIS16400_SUPPLY_CHAN(addr, bits) \ +- ADIS16400_VOLTAGE_CHAN(addr, bits, "supply", ADIS16400_SCAN_SUPPLY) ++ ADIS16400_VOLTAGE_CHAN(addr, bits, "supply", ADIS16400_SCAN_SUPPLY, 0) + + #define ADIS16400_AUX_ADC_CHAN(addr, bits) \ +- ADIS16400_VOLTAGE_CHAN(addr, bits, NULL, ADIS16400_SCAN_ADC) ++ ADIS16400_VOLTAGE_CHAN(addr, bits, NULL, ADIS16400_SCAN_ADC, 1) + + #define ADIS16400_GYRO_CHAN(mod, addr, bits) { \ + .type = IIO_ANGL_VEL, \ +@@ -773,7 +778,8 @@ static struct adis16400_chip_info adis16400_chips[] = { + .channels = adis16448_channels, + .num_channels = ARRAY_SIZE(adis16448_channels), + .flags = ADIS16400_HAS_PROD_ID | +- ADIS16400_HAS_SERIAL_NUMBER, ++ ADIS16400_HAS_SERIAL_NUMBER | ++ ADIS16400_BURST_DIAG_STAT, + .gyro_scale_micro = IIO_DEGREE_TO_RAD(10000), /* 0.01 deg/s */ + .accel_scale_micro = IIO_G_TO_M_S_2(833), /* 1/1200 g */ + .temp_scale_nano = 73860000, /* 0.07386 C */ +@@ -791,11 +797,6 @@ static const struct iio_info adis16400_info = { + .debugfs_reg_access = adis_debugfs_reg_access, + }; + +-static const unsigned long adis16400_burst_scan_mask[] = { +- ~0UL, +- 0, +-}; +- + static const char * const adis16400_status_error_msgs[] = { + [ADIS16400_DIAG_STAT_ZACCL_FAIL] = "Z-axis accelerometer self-test failure", + [ADIS16400_DIAG_STAT_YACCL_FAIL] = "Y-axis accelerometer self-test failure", +@@ -843,6 +844,20 @@ static const struct adis_data adis16400_data = { + BIT(ADIS16400_DIAG_STAT_POWER_LOW), + }; + ++static void adis16400_setup_chan_mask(struct adis16400_state *st) ++{ ++ const struct adis16400_chip_info *chip_info = st->variant; ++ unsigned i; ++ ++ for (i = 0; i < chip_info->num_channels; i++) { ++ const struct iio_chan_spec *ch = &chip_info->channels[i]; ++ ++ if (ch->scan_index >= 0 && ++ ch->scan_index != ADIS16400_SCAN_TIMESTAMP) ++ st->avail_scan_mask[0] |= BIT(ch->scan_index); ++ } ++} ++ + static int adis16400_probe(struct spi_device *spi) + { + struct adis16400_state *st; +@@ -866,8 +881,10 @@ static int adis16400_probe(struct spi_device *spi) + indio_dev->info = &adis16400_info; + indio_dev->modes = INDIO_DIRECT_MODE; + +- if (!(st->variant->flags & ADIS16400_NO_BURST)) +- indio_dev->available_scan_masks = adis16400_burst_scan_mask; ++ if (!(st->variant->flags & ADIS16400_NO_BURST)) { ++ adis16400_setup_chan_mask(st); ++ indio_dev->available_scan_masks = st->avail_scan_mask; ++ } + + ret = adis_init(&st->adis, indio_dev, spi, &adis16400_data); + if (ret) +diff --git a/drivers/infiniband/ulp/ipoib/ipoib_ib.c b/drivers/infiniband/ulp/ipoib/ipoib_ib.c +index 72626c34..cb02466 100644 +--- a/drivers/infiniband/ulp/ipoib/ipoib_ib.c ++++ b/drivers/infiniband/ulp/ipoib/ipoib_ib.c +@@ -659,6 +659,24 @@ void ipoib_reap_ah(struct work_struct *work) + round_jiffies_relative(HZ)); + } + ++static void ipoib_flush_ah(struct net_device *dev, int flush) ++{ ++ struct ipoib_dev_priv *priv = netdev_priv(dev); ++ ++ cancel_delayed_work(&priv->ah_reap_task); ++ if (flush) ++ flush_workqueue(ipoib_workqueue); ++ ipoib_reap_ah(&priv->ah_reap_task.work); ++} ++ ++static void ipoib_stop_ah(struct net_device *dev, int flush) ++{ ++ struct ipoib_dev_priv *priv = netdev_priv(dev); ++ ++ set_bit(IPOIB_STOP_REAPER, &priv->flags); ++ ipoib_flush_ah(dev, flush); ++} ++ + static void ipoib_ib_tx_timer_func(unsigned long ctx) + { + drain_tx_cq((struct net_device *)ctx); +@@ -877,24 +895,7 @@ timeout: + if (ib_modify_qp(priv->qp, &qp_attr, IB_QP_STATE)) + ipoib_warn(priv, "Failed to modify QP to RESET state\n"); + +- /* Wait for all AHs to be reaped */ +- set_bit(IPOIB_STOP_REAPER, &priv->flags); +- cancel_delayed_work(&priv->ah_reap_task); +- if (flush) +- flush_workqueue(ipoib_workqueue); +- +- begin = jiffies; +- +- while (!list_empty(&priv->dead_ahs)) { +- __ipoib_reap_ah(dev); +- +- if (time_after(jiffies, begin + HZ)) { +- ipoib_warn(priv, "timing out; will leak address handles\n"); +- break; +- } +- +- msleep(1); +- } ++ ipoib_flush_ah(dev, flush); + + ib_req_notify_cq(priv->recv_cq, IB_CQ_NEXT_COMP); + +@@ -1037,6 +1038,7 @@ static void __ipoib_ib_dev_flush(struct ipoib_dev_priv *priv, + if (level == IPOIB_FLUSH_LIGHT) { + ipoib_mark_paths_invalid(dev); + ipoib_mcast_dev_flush(dev); ++ ipoib_flush_ah(dev, 0); + } + + if (level >= IPOIB_FLUSH_NORMAL) +@@ -1100,6 +1102,14 @@ void ipoib_ib_dev_cleanup(struct net_device *dev) + ipoib_mcast_stop_thread(dev, 1); + ipoib_mcast_dev_flush(dev); + ++ /* ++ * All of our ah references aren't free until after ++ * ipoib_mcast_dev_flush(), ipoib_flush_paths, and ++ * the neighbor garbage collection is stopped and reaped. ++ * That should all be done now, so make a final ah flush. ++ */ ++ ipoib_stop_ah(dev, 1); ++ + ipoib_transport_dev_cleanup(dev); + } + +diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c +index 58b5aa3..002ff0d 100644 +--- a/drivers/infiniband/ulp/ipoib/ipoib_main.c ++++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c +@@ -1262,15 +1262,13 @@ int ipoib_dev_init(struct net_device *dev, struct ib_device *ca, int port) + { + struct ipoib_dev_priv *priv = netdev_priv(dev); + +- if (ipoib_neigh_hash_init(priv) < 0) +- goto out; + /* Allocate RX/TX "rings" to hold queued skbs */ + priv->rx_ring = kzalloc(ipoib_recvq_size * sizeof *priv->rx_ring, + GFP_KERNEL); + if (!priv->rx_ring) { + printk(KERN_WARNING "%s: failed to allocate RX ring (%d entries)\n", + ca->name, ipoib_recvq_size); +- goto out_neigh_hash_cleanup; ++ goto out; + } + + priv->tx_ring = vzalloc(ipoib_sendq_size * sizeof *priv->tx_ring); +@@ -1285,16 +1283,24 @@ int ipoib_dev_init(struct net_device *dev, struct ib_device *ca, int port) + if (ipoib_ib_dev_init(dev, ca, port)) + goto out_tx_ring_cleanup; + ++ /* ++ * Must be after ipoib_ib_dev_init so we can allocate a per ++ * device wq there and use it here ++ */ ++ if (ipoib_neigh_hash_init(priv) < 0) ++ goto out_dev_uninit; ++ + return 0; + ++out_dev_uninit: ++ ipoib_ib_dev_cleanup(dev); ++ + out_tx_ring_cleanup: + vfree(priv->tx_ring); + + out_rx_ring_cleanup: + kfree(priv->rx_ring); + +-out_neigh_hash_cleanup: +- ipoib_neigh_hash_uninit(dev); + out: + return -ENOMEM; + } +@@ -1317,6 +1323,12 @@ void ipoib_dev_cleanup(struct net_device *dev) + } + unregister_netdevice_many(&head); + ++ /* ++ * Must be before ipoib_ib_dev_cleanup or we delete an in use ++ * work queue ++ */ ++ ipoib_neigh_hash_uninit(dev); ++ + ipoib_ib_dev_cleanup(dev); + + kfree(priv->rx_ring); +@@ -1324,8 +1336,6 @@ void ipoib_dev_cleanup(struct net_device *dev) + + priv->rx_ring = NULL; + priv->tx_ring = NULL; +- +- ipoib_neigh_hash_uninit(dev); + } + + static const struct header_ops ipoib_header_ops = { +diff --git a/drivers/infiniband/ulp/isert/ib_isert.c b/drivers/infiniband/ulp/isert/ib_isert.c +index 0b57ba2..b7350d5 100644 +--- a/drivers/infiniband/ulp/isert/ib_isert.c ++++ b/drivers/infiniband/ulp/isert/ib_isert.c +@@ -65,6 +65,8 @@ static int + isert_rdma_accept(struct isert_conn *isert_conn); + struct rdma_cm_id *isert_setup_id(struct isert_np *isert_np); + ++static void isert_release_work(struct work_struct *work); ++ + static inline bool + isert_prot_cmd(struct isert_conn *conn, struct se_cmd *cmd) + { +@@ -604,6 +606,7 @@ isert_connect_request(struct rdma_cm_id *cma_id, struct rdma_cm_event *event) + mutex_init(&isert_conn->conn_mutex); + spin_lock_init(&isert_conn->conn_lock); + INIT_LIST_HEAD(&isert_conn->conn_fr_pool); ++ INIT_WORK(&isert_conn->release_work, isert_release_work); + + isert_conn->conn_cm_id = cma_id; + +@@ -863,6 +866,7 @@ isert_disconnected_handler(struct rdma_cm_id *cma_id, + { + struct isert_np *isert_np = cma_id->context; + struct isert_conn *isert_conn; ++ bool terminating = false; + + if (isert_np->np_cm_id == cma_id) + return isert_np_cma_handler(cma_id->context, event); +@@ -870,12 +874,25 @@ isert_disconnected_handler(struct rdma_cm_id *cma_id, + isert_conn = cma_id->qp->qp_context; + + mutex_lock(&isert_conn->conn_mutex); ++ terminating = (isert_conn->state == ISER_CONN_TERMINATING); + isert_conn_terminate(isert_conn); + mutex_unlock(&isert_conn->conn_mutex); + + isert_info("conn %p completing conn_wait\n", isert_conn); + complete(&isert_conn->conn_wait); + ++ if (terminating) ++ goto out; ++ ++ mutex_lock(&isert_np->np_accept_mutex); ++ if (!list_empty(&isert_conn->conn_accept_node)) { ++ list_del_init(&isert_conn->conn_accept_node); ++ isert_put_conn(isert_conn); ++ queue_work(isert_release_wq, &isert_conn->release_work); ++ } ++ mutex_unlock(&isert_np->np_accept_mutex); ++ ++out: + return 0; + } + +@@ -2303,7 +2320,6 @@ isert_build_rdma_wr(struct isert_conn *isert_conn, struct isert_cmd *isert_cmd, + page_off = offset % PAGE_SIZE; + + send_wr->sg_list = ib_sge; +- send_wr->num_sge = sg_nents; + send_wr->wr_id = (uintptr_t)&isert_cmd->tx_desc; + /* + * Perform mapping of TCM scatterlist memory ib_sge dma_addr. +@@ -2323,14 +2339,17 @@ isert_build_rdma_wr(struct isert_conn *isert_conn, struct isert_cmd *isert_cmd, + ib_sge->addr, ib_sge->length, ib_sge->lkey); + page_off = 0; + data_left -= ib_sge->length; ++ if (!data_left) ++ break; + ib_sge++; + isert_dbg("Incrementing ib_sge pointer to %p\n", ib_sge); + } + ++ send_wr->num_sge = ++i; + isert_dbg("Set outgoing sg_list: %p num_sg: %u from TCM SGLs\n", + send_wr->sg_list, send_wr->num_sge); + +- return sg_nents; ++ return send_wr->num_sge; + } + + static int +@@ -3290,7 +3309,6 @@ static void isert_wait_conn(struct iscsi_conn *conn) + isert_wait4flush(isert_conn); + isert_wait4logout(isert_conn); + +- INIT_WORK(&isert_conn->release_work, isert_release_work); + queue_work(isert_release_wq, &isert_conn->release_work); + } + +@@ -3298,6 +3316,7 @@ static void isert_free_conn(struct iscsi_conn *conn) + { + struct isert_conn *isert_conn = conn->context; + ++ isert_wait4flush(isert_conn); + isert_put_conn(isert_conn); + } + +diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c +index d88d73d..7dc514f 100644 +--- a/drivers/input/mouse/alps.c ++++ b/drivers/input/mouse/alps.c +@@ -1046,9 +1046,8 @@ static void alps_process_trackstick_packet_v7(struct psmouse *psmouse) + right = (packet[1] & 0x02) >> 1; + middle = (packet[1] & 0x04) >> 2; + +- /* Divide 2 since trackpoint's speed is too fast */ +- input_report_rel(dev2, REL_X, (char)x / 2); +- input_report_rel(dev2, REL_Y, -((char)y / 2)); ++ input_report_rel(dev2, REL_X, (char)x); ++ input_report_rel(dev2, REL_Y, -((char)y)); + + input_report_key(dev2, BTN_LEFT, left); + input_report_key(dev2, BTN_RIGHT, right); +diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c +index 79363b6..ce3d400 100644 +--- a/drivers/input/mouse/elantech.c ++++ b/drivers/input/mouse/elantech.c +@@ -1376,10 +1376,11 @@ static bool elantech_is_signature_valid(const unsigned char *param) + return true; + + /* +- * Some models have a revision higher then 20. Meaning param[2] may +- * be 10 or 20, skip the rates check for these. ++ * Some hw_version >= 4 models have a revision higher then 20. Meaning ++ * that param[2] may be 10 or 20, skip the rates check for these. + */ +- if (param[0] == 0x46 && (param[1] & 0xef) == 0x0f && param[2] < 40) ++ if ((param[0] & 0x0f) >= 0x06 && (param[1] & 0xaf) == 0x0f && ++ param[2] < 40) + return true; + + for (i = 0; i < ARRAY_SIZE(rates); i++) +@@ -1555,6 +1556,7 @@ static int elantech_set_properties(struct elantech_data *etd) + case 9: + case 10: + case 13: ++ case 14: + etd->hw_version = 4; + break; + default: +diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c +index 2176874..826ef3d 100644 +--- a/drivers/input/mouse/synaptics.c ++++ b/drivers/input/mouse/synaptics.c +@@ -148,6 +148,11 @@ static const struct min_max_quirk min_max_pnpid_table[] = { + 1024, 5112, 2024, 4832 + }, + { ++ (const char * const []){"LEN2000", NULL}, ++ {ANY_BOARD_ID, ANY_BOARD_ID}, ++ 1024, 5113, 2021, 4832 ++ }, ++ { + (const char * const []){"LEN2001", NULL}, + {ANY_BOARD_ID, ANY_BOARD_ID}, + 1024, 5022, 2508, 4832 +@@ -185,7 +190,7 @@ static const char * const topbuttonpad_pnp_ids[] = { + "LEN0047", + "LEN0048", + "LEN0049", +- "LEN2000", ++ "LEN2000", /* S540 */ + "LEN2001", /* Edge E431 */ + "LEN2002", /* Edge E531 */ + "LEN2003", +diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c +index 8dd078b..39b4dfd 100644 +--- a/drivers/iommu/intel-iommu.c ++++ b/drivers/iommu/intel-iommu.c +@@ -50,6 +50,7 @@ + #define CONTEXT_SIZE VTD_PAGE_SIZE + + #define IS_GFX_DEVICE(pdev) ((pdev->class >> 16) == PCI_BASE_CLASS_DISPLAY) ++#define IS_USB_DEVICE(pdev) ((pdev->class >> 8) == PCI_CLASS_SERIAL_USB) + #define IS_ISA_DEVICE(pdev) ((pdev->class >> 8) == PCI_CLASS_BRIDGE_ISA) + #define IS_AZALIA(pdev) ((pdev)->vendor == 0x8086 && (pdev)->device == 0x3a3e) + +@@ -680,6 +681,11 @@ static void domain_update_iommu_cap(struct dmar_domain *domain) + domain->iommu_superpage = domain_update_iommu_superpage(NULL); + } + ++static int iommu_dummy(struct device *dev) ++{ ++ return dev->archdata.iommu == DUMMY_DEVICE_DOMAIN_INFO; ++} ++ + static struct intel_iommu *device_to_iommu(struct device *dev, u8 *bus, u8 *devfn) + { + struct dmar_drhd_unit *drhd = NULL; +@@ -689,6 +695,9 @@ static struct intel_iommu *device_to_iommu(struct device *dev, u8 *bus, u8 *devf + u16 segment = 0; + int i; + ++ if (iommu_dummy(dev)) ++ return NULL; ++ + if (dev_is_pci(dev)) { + pdev = to_pci_dev(dev); + segment = pci_domain_nr(pdev->bus); +@@ -2561,6 +2570,10 @@ static bool device_has_rmrr(struct device *dev) + * In both cases we assume that PCI USB devices with RMRRs have them largely + * for historical reasons and that the RMRR space is not actively used post + * boot. This exclusion may change if vendors begin to abuse it. ++ * ++ * The same exception is made for graphics devices, with the requirement that ++ * any use of the RMRR regions will be torn down before assigning the device ++ * to a guest. + */ + static bool device_is_rmrr_locked(struct device *dev) + { +@@ -2570,7 +2583,7 @@ static bool device_is_rmrr_locked(struct device *dev) + if (dev_is_pci(dev)) { + struct pci_dev *pdev = to_pci_dev(dev); + +- if ((pdev->class >> 8) == PCI_CLASS_SERIAL_USB) ++ if (IS_USB_DEVICE(pdev) || IS_GFX_DEVICE(pdev)) + return false; + } + +@@ -2976,11 +2989,6 @@ static inline struct dmar_domain *get_valid_domain_for_dev(struct device *dev) + return __get_valid_domain_for_dev(dev); + } + +-static int iommu_dummy(struct device *dev) +-{ +- return dev->archdata.iommu == DUMMY_DEVICE_DOMAIN_INFO; +-} +- + /* Check if the dev needs to go through non-identity map and unmap process.*/ + static int iommu_no_mapping(struct device *dev) + { +diff --git a/drivers/irqchip/irq-sunxi-nmi.c b/drivers/irqchip/irq-sunxi-nmi.c +index 4a9ce5b..6b2b582 100644 +--- a/drivers/irqchip/irq-sunxi-nmi.c ++++ b/drivers/irqchip/irq-sunxi-nmi.c +@@ -104,7 +104,7 @@ static int sunxi_sc_nmi_set_type(struct irq_data *data, unsigned int flow_type) + irqd_set_trigger_type(data, flow_type); + irq_setup_alt_chip(data, flow_type); + +- for (i = 0; i <= gc->num_ct; i++, ct++) ++ for (i = 0; i < gc->num_ct; i++, ct++) + if (ct->type & flow_type) + ctrl_off = ct->regs.type; + +diff --git a/drivers/lguest/core.c b/drivers/lguest/core.c +index 6590558..ed70f1e 100644 +--- a/drivers/lguest/core.c ++++ b/drivers/lguest/core.c +@@ -173,7 +173,7 @@ static void unmap_switcher(void) + bool lguest_address_ok(const struct lguest *lg, + unsigned long addr, unsigned long len) + { +- return (addr+len) / PAGE_SIZE < lg->pfn_limit && (addr+len >= addr); ++ return addr+len <= lg->pfn_limit * PAGE_SIZE && (addr+len >= addr); + } + + /* +diff --git a/drivers/md/dm.c b/drivers/md/dm.c +index b71c600..a367a17 100644 +--- a/drivers/md/dm.c ++++ b/drivers/md/dm.c +@@ -1596,8 +1596,7 @@ static int dm_merge_bvec(struct request_queue *q, + struct mapped_device *md = q->queuedata; + struct dm_table *map = dm_get_live_table_fast(md); + struct dm_target *ti; +- sector_t max_sectors; +- int max_size = 0; ++ sector_t max_sectors, max_size = 0; + + if (unlikely(!map)) + goto out; +@@ -1612,8 +1611,16 @@ static int dm_merge_bvec(struct request_queue *q, + max_sectors = min(max_io_len(bvm->bi_sector, ti), + (sector_t) queue_max_sectors(q)); + max_size = (max_sectors << SECTOR_SHIFT) - bvm->bi_size; +- if (unlikely(max_size < 0)) /* this shouldn't _ever_ happen */ +- max_size = 0; ++ ++ /* ++ * FIXME: this stop-gap fix _must_ be cleaned up (by passing a sector_t ++ * to the targets' merge function since it holds sectors not bytes). ++ * Just doing this as an interim fix for stable@ because the more ++ * comprehensive cleanup of switching to sector_t will impact every ++ * DM target that implements a ->merge hook. ++ */ ++ if (max_size > INT_MAX) ++ max_size = INT_MAX; + + /* + * merge_bvec_fn() returns number of bytes +@@ -1621,7 +1628,7 @@ static int dm_merge_bvec(struct request_queue *q, + * max is precomputed maximal io size + */ + if (max_size && ti->type->merge) +- max_size = ti->type->merge(ti, bvm, biovec, max_size); ++ max_size = ti->type->merge(ti, bvm, biovec, (int) max_size); + /* + * If the target doesn't support merge method and some of the devices + * provided their merge_bvec method (we know this by looking for the +diff --git a/drivers/mfd/da9052-core.c b/drivers/mfd/da9052-core.c +index ae498b5..46e3840 100644 +--- a/drivers/mfd/da9052-core.c ++++ b/drivers/mfd/da9052-core.c +@@ -433,6 +433,10 @@ EXPORT_SYMBOL_GPL(da9052_adc_read_temp); + static const struct mfd_cell da9052_subdev_info[] = { + { + .name = "da9052-regulator", ++ .id = 0, ++ }, ++ { ++ .name = "da9052-regulator", + .id = 1, + }, + { +@@ -484,10 +488,6 @@ static const struct mfd_cell da9052_subdev_info[] = { + .id = 13, + }, + { +- .name = "da9052-regulator", +- .id = 14, +- }, +- { + .name = "da9052-onkey", + }, + { +diff --git a/drivers/net/ethernet/broadcom/genet/bcmmii.c b/drivers/net/ethernet/broadcom/genet/bcmmii.c +index 446889c..f2a8245 100644 +--- a/drivers/net/ethernet/broadcom/genet/bcmmii.c ++++ b/drivers/net/ethernet/broadcom/genet/bcmmii.c +@@ -288,9 +288,6 @@ int bcmgenet_mii_config(struct net_device *dev, bool init) + phy_name = "external RGMII (no delay)"; + else + phy_name = "external RGMII (TX delay)"; +- reg = bcmgenet_ext_readl(priv, EXT_RGMII_OOB_CTRL); +- reg |= RGMII_MODE_EN | id_mode_dis; +- bcmgenet_ext_writel(priv, reg, EXT_RGMII_OOB_CTRL); + bcmgenet_sys_writel(priv, + PORT_MODE_EXT_GPHY, SYS_PORT_CTRL); + break; +@@ -299,6 +296,15 @@ int bcmgenet_mii_config(struct net_device *dev, bool init) + return -EINVAL; + } + ++ /* This is an external PHY (xMII), so we need to enable the RGMII ++ * block for the interface to work ++ */ ++ if (priv->ext_phy) { ++ reg = bcmgenet_ext_readl(priv, EXT_RGMII_OOB_CTRL); ++ reg |= RGMII_MODE_EN | id_mode_dis; ++ bcmgenet_ext_writel(priv, reg, EXT_RGMII_OOB_CTRL); ++ } ++ + if (init) + dev_info(kdev, "configuring instance for %s\n", phy_name); + +diff --git a/drivers/net/phy/bcm7xxx.c b/drivers/net/phy/bcm7xxx.c +index 974ec45..a1ea2aa 100644 +--- a/drivers/net/phy/bcm7xxx.c ++++ b/drivers/net/phy/bcm7xxx.c +@@ -403,7 +403,7 @@ static struct phy_driver bcm7xxx_driver[] = { + .name = "Broadcom BCM7425", + .features = PHY_GBIT_FEATURES | + SUPPORTED_Pause | SUPPORTED_Asym_Pause, +- .flags = 0, ++ .flags = PHY_IS_INTERNAL, + .config_init = bcm7xxx_config_init, + .config_aneg = genphy_config_aneg, + .read_status = genphy_read_status, +diff --git a/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c b/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c +index 456944a..3afddf9 100644 +--- a/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c ++++ b/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c +@@ -510,11 +510,9 @@ static int brcmf_msgbuf_query_dcmd(struct brcmf_pub *drvr, int ifidx, + msgbuf->rx_pktids, + msgbuf->ioctl_resp_pktid); + if (msgbuf->ioctl_resp_ret_len != 0) { +- if (!skb) { +- brcmf_err("Invalid packet id idx recv'd %d\n", +- msgbuf->ioctl_resp_pktid); ++ if (!skb) + return -EBADF; +- } ++ + memcpy(buf, skb->data, (len < msgbuf->ioctl_resp_ret_len) ? + len : msgbuf->ioctl_resp_ret_len); + } +@@ -865,10 +863,8 @@ brcmf_msgbuf_process_txstatus(struct brcmf_msgbuf *msgbuf, void *buf) + flowid -= BRCMF_NROF_H2D_COMMON_MSGRINGS; + skb = brcmf_msgbuf_get_pktid(msgbuf->drvr->bus_if->dev, + msgbuf->tx_pktids, idx); +- if (!skb) { +- brcmf_err("Invalid packet id idx recv'd %d\n", idx); ++ if (!skb) + return; +- } + + set_bit(flowid, msgbuf->txstatus_done_map); + +@@ -1145,6 +1141,8 @@ brcmf_msgbuf_process_rx_complete(struct brcmf_msgbuf *msgbuf, void *buf) + + skb = brcmf_msgbuf_get_pktid(msgbuf->drvr->bus_if->dev, + msgbuf->rx_pktids, idx); ++ if (!skb) ++ return; + + if (data_offset) + skb_pull(skb, data_offset); +diff --git a/drivers/net/wireless/iwlwifi/mvm/d3.c b/drivers/net/wireless/iwlwifi/mvm/d3.c +index 744de26..185ff7b 100644 +--- a/drivers/net/wireless/iwlwifi/mvm/d3.c ++++ b/drivers/net/wireless/iwlwifi/mvm/d3.c +@@ -1711,8 +1711,10 @@ static void iwl_mvm_query_netdetect_reasons(struct iwl_mvm *mvm, + int i, j, n_matches, ret; + + fw_status = iwl_mvm_get_wakeup_status(mvm, vif); +- if (!IS_ERR_OR_NULL(fw_status)) ++ if (!IS_ERR_OR_NULL(fw_status)) { + reasons = le32_to_cpu(fw_status->wakeup_reasons); ++ kfree(fw_status); ++ } + + if (reasons & IWL_WOWLAN_WAKEUP_BY_RFKILL_DEASSERTED) + wakeup.rfkill_release = true; +@@ -1829,15 +1831,15 @@ static int __iwl_mvm_resume(struct iwl_mvm *mvm, bool test) + /* get the BSS vif pointer again */ + vif = iwl_mvm_get_bss_vif(mvm); + if (IS_ERR_OR_NULL(vif)) +- goto out_unlock; ++ goto err; + + ret = iwl_trans_d3_resume(mvm->trans, &d3_status, test); + if (ret) +- goto out_unlock; ++ goto err; + + if (d3_status != IWL_D3_STATUS_ALIVE) { + IWL_INFO(mvm, "Device was reset during suspend\n"); +- goto out_unlock; ++ goto err; + } + + /* query SRAM first in case we want event logging */ +@@ -1855,7 +1857,8 @@ static int __iwl_mvm_resume(struct iwl_mvm *mvm, bool test) + /* has unlocked the mutex, so skip that */ + goto out; + +- out_unlock: ++err: ++ iwl_mvm_free_nd(mvm); + mutex_unlock(&mvm->mutex); + + out: +diff --git a/drivers/of/dynamic.c b/drivers/of/dynamic.c +index 3351ef4..53826b8 100644 +--- a/drivers/of/dynamic.c ++++ b/drivers/of/dynamic.c +@@ -225,7 +225,7 @@ void __of_attach_node(struct device_node *np) + phandle = __of_get_property(np, "phandle", &sz); + if (!phandle) + phandle = __of_get_property(np, "linux,phandle", &sz); +- if (IS_ENABLED(PPC_PSERIES) && !phandle) ++ if (IS_ENABLED(CONFIG_PPC_PSERIES) && !phandle) + phandle = __of_get_property(np, "ibm,phandle", &sz); + np->phandle = (phandle && (sz >= 4)) ? be32_to_cpup(phandle) : 0; + +diff --git a/drivers/regulator/da9052-regulator.c b/drivers/regulator/da9052-regulator.c +index 8a4df7a..e628d4c 100644 +--- a/drivers/regulator/da9052-regulator.c ++++ b/drivers/regulator/da9052-regulator.c +@@ -394,6 +394,7 @@ static inline struct da9052_regulator_info *find_regulator_info(u8 chip_id, + + static int da9052_regulator_probe(struct platform_device *pdev) + { ++ const struct mfd_cell *cell = mfd_get_cell(pdev); + struct regulator_config config = { }; + struct da9052_regulator *regulator; + struct da9052 *da9052; +@@ -409,7 +410,7 @@ static int da9052_regulator_probe(struct platform_device *pdev) + regulator->da9052 = da9052; + + regulator->info = find_regulator_info(regulator->da9052->chip_id, +- pdev->id); ++ cell->id); + if (regulator->info == NULL) { + dev_err(&pdev->dev, "invalid regulator ID specified\n"); + return -EINVAL; +@@ -419,7 +420,7 @@ static int da9052_regulator_probe(struct platform_device *pdev) + config.driver_data = regulator; + config.regmap = da9052->regmap; + if (pdata && pdata->regulators) { +- config.init_data = pdata->regulators[pdev->id]; ++ config.init_data = pdata->regulators[cell->id]; + } else { + #ifdef CONFIG_OF + struct device_node *nproot = da9052->dev->of_node; +diff --git a/drivers/target/target_core_pscsi.c b/drivers/target/target_core_pscsi.c +index f6c954c..4073869 100644 +--- a/drivers/target/target_core_pscsi.c ++++ b/drivers/target/target_core_pscsi.c +@@ -521,6 +521,7 @@ static int pscsi_configure_device(struct se_device *dev) + " pdv_host_id: %d\n", pdv->pdv_host_id); + return -EINVAL; + } ++ pdv->pdv_lld_host = sh; + } + } else { + if (phv->phv_mode == PHV_VIRTUAL_HOST_ID) { +@@ -603,6 +604,8 @@ static void pscsi_free_device(struct se_device *dev) + if ((phv->phv_mode == PHV_LLD_SCSI_HOST_NO) && + (phv->phv_lld_host != NULL)) + scsi_host_put(phv->phv_lld_host); ++ else if (pdv->pdv_lld_host) ++ scsi_host_put(pdv->pdv_lld_host); + + if ((sd->type == TYPE_DISK) || (sd->type == TYPE_ROM)) + scsi_device_put(sd); +diff --git a/drivers/target/target_core_pscsi.h b/drivers/target/target_core_pscsi.h +index 1bd757d..820d305 100644 +--- a/drivers/target/target_core_pscsi.h ++++ b/drivers/target/target_core_pscsi.h +@@ -45,6 +45,7 @@ struct pscsi_dev_virt { + int pdv_lun_id; + struct block_device *pdv_bd; + struct scsi_device *pdv_sd; ++ struct Scsi_Host *pdv_lld_host; + } ____cacheline_aligned; + + typedef enum phv_modes { +diff --git a/drivers/tty/n_tty.c b/drivers/tty/n_tty.c +index f9d9ed3..3ecbd91 100644 +--- a/drivers/tty/n_tty.c ++++ b/drivers/tty/n_tty.c +@@ -161,6 +161,17 @@ static inline int tty_put_user(struct tty_struct *tty, unsigned char x, + return put_user(x, ptr); + } + ++static inline int tty_copy_to_user(struct tty_struct *tty, ++ void __user *to, ++ const void *from, ++ unsigned long n) ++{ ++ struct n_tty_data *ldata = tty->disc_data; ++ ++ tty_audit_add_data(tty, to, n, ldata->icanon); ++ return copy_to_user(to, from, n); ++} ++ + static int receive_room(struct tty_struct *tty) + { + struct n_tty_data *ldata = tty->disc_data; +@@ -2093,12 +2104,12 @@ static int canon_copy_from_read_buf(struct tty_struct *tty, + __func__, eol, found, n, c, size, more); + + if (n > size) { +- ret = copy_to_user(*b, read_buf_addr(ldata, tail), size); ++ ret = tty_copy_to_user(tty, *b, read_buf_addr(ldata, tail), size); + if (ret) + return -EFAULT; +- ret = copy_to_user(*b + size, ldata->read_buf, n - size); ++ ret = tty_copy_to_user(tty, *b + size, ldata->read_buf, n - size); + } else +- ret = copy_to_user(*b, read_buf_addr(ldata, tail), n); ++ ret = tty_copy_to_user(tty, *b, read_buf_addr(ldata, tail), n); + + if (ret) + return -EFAULT; +diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c +index 4c5e909..7c14e40 100644 +--- a/drivers/tty/serial/imx.c ++++ b/drivers/tty/serial/imx.c +@@ -907,6 +907,14 @@ static void dma_rx_callback(void *data) + + status = dmaengine_tx_status(chan, (dma_cookie_t)0, &state); + count = RX_BUF_SIZE - state.residue; ++ ++ if (readl(sport->port.membase + USR2) & USR2_IDLE) { ++ /* In condition [3] the SDMA counted up too early */ ++ count--; ++ ++ writel(USR2_IDLE, sport->port.membase + USR2); ++ } ++ + dev_dbg(sport->port.dev, "We get %d bytes.\n", count); + + if (count) { +diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h +index 4bb9aa6..192396c 100644 +--- a/drivers/usb/dwc3/core.h ++++ b/drivers/usb/dwc3/core.h +@@ -339,7 +339,7 @@ + #define DWC3_DGCMD_SET_ENDPOINT_NRDY 0x0c + #define DWC3_DGCMD_RUN_SOC_BUS_LOOPBACK 0x10 + +-#define DWC3_DGCMD_STATUS(n) (((n) >> 15) & 1) ++#define DWC3_DGCMD_STATUS(n) (((n) >> 12) & 0x0F) + #define DWC3_DGCMD_CMDACT (1 << 10) + #define DWC3_DGCMD_CMDIOC (1 << 8) + +@@ -355,7 +355,7 @@ + #define DWC3_DEPCMD_PARAM_SHIFT 16 + #define DWC3_DEPCMD_PARAM(x) ((x) << DWC3_DEPCMD_PARAM_SHIFT) + #define DWC3_DEPCMD_GET_RSC_IDX(x) (((x) >> DWC3_DEPCMD_PARAM_SHIFT) & 0x7f) +-#define DWC3_DEPCMD_STATUS(x) (((x) >> 15) & 1) ++#define DWC3_DEPCMD_STATUS(x) (((x) >> 12) & 0x0F) + #define DWC3_DEPCMD_HIPRI_FORCERM (1 << 11) + #define DWC3_DEPCMD_CMDACT (1 << 10) + #define DWC3_DEPCMD_CMDIOC (1 << 8) +diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c +index c50d8d2..ee1cc0f 100644 +--- a/drivers/usb/host/xhci.c ++++ b/drivers/usb/host/xhci.c +@@ -3686,18 +3686,21 @@ int xhci_alloc_dev(struct usb_hcd *hcd, struct usb_device *udev) + { + struct xhci_hcd *xhci = hcd_to_xhci(hcd); + unsigned long flags; +- int ret; ++ int ret, slot_id; + struct xhci_command *command; + + command = xhci_alloc_command(xhci, false, false, GFP_KERNEL); + if (!command) + return 0; + ++ /* xhci->slot_id and xhci->addr_dev are not thread-safe */ ++ mutex_lock(&xhci->mutex); + spin_lock_irqsave(&xhci->lock, flags); + command->completion = &xhci->addr_dev; + ret = xhci_queue_slot_control(xhci, command, TRB_ENABLE_SLOT, 0); + if (ret) { + spin_unlock_irqrestore(&xhci->lock, flags); ++ mutex_unlock(&xhci->mutex); + xhci_dbg(xhci, "FIXME: allocate a command ring segment\n"); + kfree(command); + return 0; +@@ -3706,8 +3709,10 @@ int xhci_alloc_dev(struct usb_hcd *hcd, struct usb_device *udev) + spin_unlock_irqrestore(&xhci->lock, flags); + + wait_for_completion(command->completion); ++ slot_id = xhci->slot_id; ++ mutex_unlock(&xhci->mutex); + +- if (!xhci->slot_id || command->status != COMP_SUCCESS) { ++ if (!slot_id || command->status != COMP_SUCCESS) { + xhci_err(xhci, "Error while assigning device slot ID\n"); + xhci_err(xhci, "Max number of devices this xHCI host supports is %u.\n", + HCS_MAX_SLOTS( +@@ -3732,11 +3737,11 @@ int xhci_alloc_dev(struct usb_hcd *hcd, struct usb_device *udev) + * xhci_discover_or_reset_device(), which may be called as part of + * mass storage driver error handling. + */ +- if (!xhci_alloc_virt_device(xhci, xhci->slot_id, udev, GFP_NOIO)) { ++ if (!xhci_alloc_virt_device(xhci, slot_id, udev, GFP_NOIO)) { + xhci_warn(xhci, "Could not allocate xHCI USB device data structures\n"); + goto disable_slot; + } +- udev->slot_id = xhci->slot_id; ++ udev->slot_id = slot_id; + + #ifndef CONFIG_USB_DEFAULT_PERSIST + /* +@@ -3782,12 +3787,15 @@ static int xhci_setup_device(struct usb_hcd *hcd, struct usb_device *udev, + struct xhci_slot_ctx *slot_ctx; + struct xhci_input_control_ctx *ctrl_ctx; + u64 temp_64; +- struct xhci_command *command; ++ struct xhci_command *command = NULL; ++ ++ mutex_lock(&xhci->mutex); + + if (!udev->slot_id) { + xhci_dbg_trace(xhci, trace_xhci_dbg_address, + "Bad Slot ID %d", udev->slot_id); +- return -EINVAL; ++ ret = -EINVAL; ++ goto out; + } + + virt_dev = xhci->devs[udev->slot_id]; +@@ -3800,7 +3808,8 @@ static int xhci_setup_device(struct usb_hcd *hcd, struct usb_device *udev, + */ + xhci_warn(xhci, "Virt dev invalid for slot_id 0x%x!\n", + udev->slot_id); +- return -EINVAL; ++ ret = -EINVAL; ++ goto out; + } + + if (setup == SETUP_CONTEXT_ONLY) { +@@ -3808,13 +3817,15 @@ static int xhci_setup_device(struct usb_hcd *hcd, struct usb_device *udev, + if (GET_SLOT_STATE(le32_to_cpu(slot_ctx->dev_state)) == + SLOT_STATE_DEFAULT) { + xhci_dbg(xhci, "Slot already in default state\n"); +- return 0; ++ goto out; + } + } + + command = xhci_alloc_command(xhci, false, false, GFP_KERNEL); +- if (!command) +- return -ENOMEM; ++ if (!command) { ++ ret = -ENOMEM; ++ goto out; ++ } + + command->in_ctx = virt_dev->in_ctx; + command->completion = &xhci->addr_dev; +@@ -3824,8 +3835,8 @@ static int xhci_setup_device(struct usb_hcd *hcd, struct usb_device *udev, + if (!ctrl_ctx) { + xhci_warn(xhci, "%s: Could not get input context, bad type.\n", + __func__); +- kfree(command); +- return -EINVAL; ++ ret = -EINVAL; ++ goto out; + } + /* + * If this is the first Set Address since device plug-in or +@@ -3852,8 +3863,7 @@ static int xhci_setup_device(struct usb_hcd *hcd, struct usb_device *udev, + spin_unlock_irqrestore(&xhci->lock, flags); + xhci_dbg_trace(xhci, trace_xhci_dbg_address, + "FIXME: allocate a command ring segment"); +- kfree(command); +- return ret; ++ goto out; + } + xhci_ring_cmd_db(xhci); + spin_unlock_irqrestore(&xhci->lock, flags); +@@ -3900,10 +3910,8 @@ static int xhci_setup_device(struct usb_hcd *hcd, struct usb_device *udev, + ret = -EINVAL; + break; + } +- if (ret) { +- kfree(command); +- return ret; +- } ++ if (ret) ++ goto out; + temp_64 = xhci_read_64(xhci, &xhci->op_regs->dcbaa_ptr); + xhci_dbg_trace(xhci, trace_xhci_dbg_address, + "Op regs DCBAA ptr = %#016llx", temp_64); +@@ -3936,8 +3944,10 @@ static int xhci_setup_device(struct usb_hcd *hcd, struct usb_device *udev, + xhci_dbg_trace(xhci, trace_xhci_dbg_address, + "Internal device address = %d", + le32_to_cpu(slot_ctx->dev_state) & DEV_ADDR_MASK); ++out: ++ mutex_unlock(&xhci->mutex); + kfree(command); +- return 0; ++ return ret; + } + + int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev) +@@ -4859,6 +4869,7 @@ int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quirks_t get_quirks) + return 0; + } + ++ mutex_init(&xhci->mutex); + xhci->cap_regs = hcd->regs; + xhci->op_regs = hcd->regs + + HC_LENGTH(readl(&xhci->cap_regs->hc_capbase)); +@@ -5011,4 +5022,12 @@ static int __init xhci_hcd_init(void) + BUILD_BUG_ON(sizeof(struct xhci_run_regs) != (8+8*128)*32/8); + return 0; + } ++ ++/* ++ * If an init function is provided, an exit function must also be provided ++ * to allow module unload. ++ */ ++static void __exit xhci_hcd_fini(void) { } ++ + module_init(xhci_hcd_init); ++module_exit(xhci_hcd_fini); +diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h +index 30d1f97..35a1eaf 100644 +--- a/drivers/usb/host/xhci.h ++++ b/drivers/usb/host/xhci.h +@@ -1497,6 +1497,8 @@ struct xhci_hcd { + struct list_head lpm_failed_devs; + + /* slot enabling and address device helpers */ ++ /* these are not thread safe so use mutex */ ++ struct mutex mutex; + struct completion addr_dev; + int slot_id; + /* For USB 3.0 LPM enable/disable. */ +diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c +index fa51858..f6cd868 100644 +--- a/drivers/usb/musb/musb_core.c ++++ b/drivers/usb/musb/musb_core.c +@@ -2023,13 +2023,7 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl) + if (musb->ops->quirks) + musb->io.quirks = musb->ops->quirks; + +- /* At least tusb6010 has it's own offsets.. */ +- if (musb->ops->ep_offset) +- musb->io.ep_offset = musb->ops->ep_offset; +- if (musb->ops->ep_select) +- musb->io.ep_select = musb->ops->ep_select; +- +- /* ..and some devices use indexed offset or flat offset */ ++ /* Most devices use indexed offset or flat offset */ + if (musb->io.quirks & MUSB_INDEXED_EP) { + musb->io.ep_offset = musb_indexed_ep_offset; + musb->io.ep_select = musb_indexed_ep_select; +@@ -2038,6 +2032,12 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl) + musb->io.ep_select = musb_flat_ep_select; + } + ++ /* At least tusb6010 has its own offsets */ ++ if (musb->ops->ep_offset) ++ musb->io.ep_offset = musb->ops->ep_offset; ++ if (musb->ops->ep_select) ++ musb->io.ep_select = musb->ops->ep_select; ++ + if (musb->ops->fifo_mode) + fifo_mode = musb->ops->fifo_mode; + else +diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c +index 9031750..ffd739e 100644 +--- a/drivers/usb/serial/cp210x.c ++++ b/drivers/usb/serial/cp210x.c +@@ -128,6 +128,7 @@ static const struct usb_device_id id_table[] = { + { USB_DEVICE(0x10C4, 0x8946) }, /* Ketra N1 Wireless Interface */ + { USB_DEVICE(0x10C4, 0x8977) }, /* CEL MeshWorks DevKit Device */ + { USB_DEVICE(0x10C4, 0x8998) }, /* KCF Technologies PRN */ ++ { USB_DEVICE(0x10C4, 0x8A2A) }, /* HubZ dual ZigBee and Z-Wave dongle */ + { USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */ + { USB_DEVICE(0x10C4, 0xEA61) }, /* Silicon Labs factory default */ + { USB_DEVICE(0x10C4, 0xEA70) }, /* Silicon Labs factory default */ +diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c +index 8eb68a3..4c8b3b8 100644 +--- a/drivers/usb/serial/ftdi_sio.c ++++ b/drivers/usb/serial/ftdi_sio.c +@@ -699,6 +699,7 @@ static const struct usb_device_id id_table_combined[] = { + { USB_DEVICE(XSENS_VID, XSENS_AWINDA_DONGLE_PID) }, + { USB_DEVICE(XSENS_VID, XSENS_AWINDA_STATION_PID) }, + { USB_DEVICE(XSENS_VID, XSENS_CONVERTER_PID) }, ++ { USB_DEVICE(XSENS_VID, XSENS_MTDEVBOARD_PID) }, + { USB_DEVICE(XSENS_VID, XSENS_MTW_PID) }, + { USB_DEVICE(FTDI_VID, FTDI_OMNI1509) }, + { USB_DEVICE(MOBILITY_VID, MOBILITY_USB_SERIAL_PID) }, +diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h +index 4e4f46f..792e054 100644 +--- a/drivers/usb/serial/ftdi_sio_ids.h ++++ b/drivers/usb/serial/ftdi_sio_ids.h +@@ -155,6 +155,7 @@ + #define XSENS_AWINDA_STATION_PID 0x0101 + #define XSENS_AWINDA_DONGLE_PID 0x0102 + #define XSENS_MTW_PID 0x0200 /* Xsens MTw */ ++#define XSENS_MTDEVBOARD_PID 0x0300 /* Motion Tracker Development Board */ + #define XSENS_CONVERTER_PID 0xD00D /* Xsens USB-serial converter */ + + /* Xsens devices using FTDI VID */ +diff --git a/drivers/virtio/virtio_pci_common.c b/drivers/virtio/virtio_pci_common.c +index 9756f21..ea75707 100644 +--- a/drivers/virtio/virtio_pci_common.c ++++ b/drivers/virtio/virtio_pci_common.c +@@ -415,6 +415,7 @@ int vp_set_vq_affinity(struct virtqueue *vq, int cpu) + if (cpu == -1) + irq_set_affinity_hint(irq, NULL); + else { ++ cpumask_clear(mask); + cpumask_set_cpu(cpu, mask); + irq_set_affinity_hint(irq, mask); + } +diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c +index d925f55..8081aba 100644 +--- a/fs/binfmt_elf.c ++++ b/fs/binfmt_elf.c +@@ -928,7 +928,7 @@ static int load_elf_binary(struct linux_binprm *bprm) + total_size = total_mapping_size(elf_phdata, + loc->elf_ex.e_phnum); + if (!total_size) { +- error = -EINVAL; ++ retval = -EINVAL; + goto out_free_dentry; + } + } +diff --git a/fs/dcache.c b/fs/dcache.c +index e368d4f..aa8ff8d 100644 +--- a/fs/dcache.c ++++ b/fs/dcache.c +@@ -1094,13 +1094,13 @@ ascend: + /* might go back up the wrong parent if we have had a rename. */ + if (need_seqretry(&rename_lock, seq)) + goto rename_retry; +- next = child->d_child.next; +- while (unlikely(child->d_flags & DCACHE_DENTRY_KILLED)) { ++ /* go into the first sibling still alive */ ++ do { ++ next = child->d_child.next; + if (next == &this_parent->d_subdirs) + goto ascend; + child = list_entry(next, struct dentry, d_child); +- next = next->next; +- } ++ } while (unlikely(child->d_flags & DCACHE_DENTRY_KILLED)); + rcu_read_unlock(); + goto resume; + } +diff --git a/fs/fhandle.c b/fs/fhandle.c +index 999ff5c..d59712d 100644 +--- a/fs/fhandle.c ++++ b/fs/fhandle.c +@@ -195,8 +195,9 @@ static int handle_to_path(int mountdirfd, struct file_handle __user *ufh, + goto out_err; + } + /* copy the full handle */ +- if (copy_from_user(handle, ufh, +- sizeof(struct file_handle) + ++ *handle = f_handle; ++ if (copy_from_user(&handle->f_handle, ++ &ufh->f_handle, + f_handle.handle_bytes)) { + retval = -EFAULT; + goto out_handle; +diff --git a/fs/omfs/inode.c b/fs/omfs/inode.c +index 138321b..454111a 100644 +--- a/fs/omfs/inode.c ++++ b/fs/omfs/inode.c +@@ -306,7 +306,8 @@ static const struct super_operations omfs_sops = { + */ + static int omfs_get_imap(struct super_block *sb) + { +- unsigned int bitmap_size, count, array_size; ++ unsigned int bitmap_size, array_size; ++ int count; + struct omfs_sb_info *sbi = OMFS_SB(sb); + struct buffer_head *bh; + unsigned long **ptr; +@@ -359,7 +360,7 @@ nomem: + } + + enum { +- Opt_uid, Opt_gid, Opt_umask, Opt_dmask, Opt_fmask ++ Opt_uid, Opt_gid, Opt_umask, Opt_dmask, Opt_fmask, Opt_err + }; + + static const match_table_t tokens = { +@@ -368,6 +369,7 @@ static const match_table_t tokens = { + {Opt_umask, "umask=%o"}, + {Opt_dmask, "dmask=%o"}, + {Opt_fmask, "fmask=%o"}, ++ {Opt_err, NULL}, + }; + + static int parse_options(char *options, struct omfs_sb_info *sbi) +diff --git a/fs/xfs/libxfs/xfs_attr_leaf.c b/fs/xfs/libxfs/xfs_attr_leaf.c +index 5d38e8b..7f7b183 100644 +--- a/fs/xfs/libxfs/xfs_attr_leaf.c ++++ b/fs/xfs/libxfs/xfs_attr_leaf.c +@@ -498,8 +498,8 @@ xfs_attr_shortform_add(xfs_da_args_t *args, int forkoff) + * After the last attribute is removed revert to original inode format, + * making all literal area available to the data fork once more. + */ +-STATIC void +-xfs_attr_fork_reset( ++void ++xfs_attr_fork_remove( + struct xfs_inode *ip, + struct xfs_trans *tp) + { +@@ -565,7 +565,7 @@ xfs_attr_shortform_remove(xfs_da_args_t *args) + (mp->m_flags & XFS_MOUNT_ATTR2) && + (dp->i_d.di_format != XFS_DINODE_FMT_BTREE) && + !(args->op_flags & XFS_DA_OP_ADDNAME)) { +- xfs_attr_fork_reset(dp, args->trans); ++ xfs_attr_fork_remove(dp, args->trans); + } else { + xfs_idata_realloc(dp, -size, XFS_ATTR_FORK); + dp->i_d.di_forkoff = xfs_attr_shortform_bytesfit(dp, totsize); +@@ -828,7 +828,7 @@ xfs_attr3_leaf_to_shortform( + if (forkoff == -1) { + ASSERT(dp->i_mount->m_flags & XFS_MOUNT_ATTR2); + ASSERT(dp->i_d.di_format != XFS_DINODE_FMT_BTREE); +- xfs_attr_fork_reset(dp, args->trans); ++ xfs_attr_fork_remove(dp, args->trans); + goto out; + } + +diff --git a/fs/xfs/libxfs/xfs_attr_leaf.h b/fs/xfs/libxfs/xfs_attr_leaf.h +index e2929da..4f3a60a 100644 +--- a/fs/xfs/libxfs/xfs_attr_leaf.h ++++ b/fs/xfs/libxfs/xfs_attr_leaf.h +@@ -53,7 +53,7 @@ int xfs_attr_shortform_remove(struct xfs_da_args *args); + int xfs_attr_shortform_list(struct xfs_attr_list_context *context); + int xfs_attr_shortform_allfit(struct xfs_buf *bp, struct xfs_inode *dp); + int xfs_attr_shortform_bytesfit(xfs_inode_t *dp, int bytes); +- ++void xfs_attr_fork_remove(struct xfs_inode *ip, struct xfs_trans *tp); + + /* + * Internal routines when attribute fork size == XFS_LBSIZE(mp). +diff --git a/fs/xfs/xfs_attr_inactive.c b/fs/xfs/xfs_attr_inactive.c +index 83af4c1..aa3e860 100644 +--- a/fs/xfs/xfs_attr_inactive.c ++++ b/fs/xfs/xfs_attr_inactive.c +@@ -379,23 +379,31 @@ xfs_attr3_root_inactive( + return error; + } + ++/* ++ * xfs_attr_inactive kills all traces of an attribute fork on an inode. It ++ * removes both the on-disk and in-memory inode fork. Note that this also has to ++ * handle the condition of inodes without attributes but with an attribute fork ++ * configured, so we can't use xfs_inode_hasattr() here. ++ * ++ * The in-memory attribute fork is removed even on error. ++ */ + int +-xfs_attr_inactive(xfs_inode_t *dp) ++xfs_attr_inactive( ++ struct xfs_inode *dp) + { +- xfs_trans_t *trans; +- xfs_mount_t *mp; +- int error; ++ struct xfs_trans *trans; ++ struct xfs_mount *mp; ++ int cancel_flags = 0; ++ int lock_mode = XFS_ILOCK_SHARED; ++ int error = 0; + + mp = dp->i_mount; + ASSERT(! XFS_NOT_DQATTACHED(mp, dp)); + +- xfs_ilock(dp, XFS_ILOCK_SHARED); +- if (!xfs_inode_hasattr(dp) || +- dp->i_d.di_aformat == XFS_DINODE_FMT_LOCAL) { +- xfs_iunlock(dp, XFS_ILOCK_SHARED); +- return 0; +- } +- xfs_iunlock(dp, XFS_ILOCK_SHARED); ++ xfs_ilock(dp, lock_mode); ++ if (!XFS_IFORK_Q(dp)) ++ goto out_destroy_fork; ++ xfs_iunlock(dp, lock_mode); + + /* + * Start our first transaction of the day. +@@ -407,13 +415,18 @@ xfs_attr_inactive(xfs_inode_t *dp) + * the inode in every transaction to let it float upward through + * the log. + */ ++ lock_mode = 0; + trans = xfs_trans_alloc(mp, XFS_TRANS_ATTRINVAL); + error = xfs_trans_reserve(trans, &M_RES(mp)->tr_attrinval, 0, 0); +- if (error) { +- xfs_trans_cancel(trans, 0); +- return error; +- } +- xfs_ilock(dp, XFS_ILOCK_EXCL); ++ if (error) ++ goto out_cancel; ++ ++ lock_mode = XFS_ILOCK_EXCL; ++ cancel_flags = XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT; ++ xfs_ilock(dp, lock_mode); ++ ++ if (!XFS_IFORK_Q(dp)) ++ goto out_cancel; + + /* + * No need to make quota reservations here. We expect to release some +@@ -422,28 +435,36 @@ xfs_attr_inactive(xfs_inode_t *dp) + xfs_trans_ijoin(trans, dp, 0); + + /* +- * Decide on what work routines to call based on the inode size. ++ * Invalidate and truncate the attribute fork extents. Make sure the ++ * fork actually has attributes as otherwise the invalidation has no ++ * blocks to read and returns an error. In this case, just do the fork ++ * removal below. + */ +- if (!xfs_inode_hasattr(dp) || +- dp->i_d.di_aformat == XFS_DINODE_FMT_LOCAL) { +- error = 0; +- goto out; ++ if (xfs_inode_hasattr(dp) && ++ dp->i_d.di_aformat != XFS_DINODE_FMT_LOCAL) { ++ error = xfs_attr3_root_inactive(&trans, dp); ++ if (error) ++ goto out_cancel; ++ ++ error = xfs_itruncate_extents(&trans, dp, XFS_ATTR_FORK, 0); ++ if (error) ++ goto out_cancel; + } +- error = xfs_attr3_root_inactive(&trans, dp); +- if (error) +- goto out; + +- error = xfs_itruncate_extents(&trans, dp, XFS_ATTR_FORK, 0); +- if (error) +- goto out; ++ /* Reset the attribute fork - this also destroys the in-core fork */ ++ xfs_attr_fork_remove(dp, trans); + + error = xfs_trans_commit(trans, XFS_TRANS_RELEASE_LOG_RES); +- xfs_iunlock(dp, XFS_ILOCK_EXCL); +- ++ xfs_iunlock(dp, lock_mode); + return error; + +-out: +- xfs_trans_cancel(trans, XFS_TRANS_RELEASE_LOG_RES|XFS_TRANS_ABORT); +- xfs_iunlock(dp, XFS_ILOCK_EXCL); ++out_cancel: ++ xfs_trans_cancel(trans, cancel_flags); ++out_destroy_fork: ++ /* kill the in-core attr fork before we drop the inode lock */ ++ if (dp->i_afp) ++ xfs_idestroy_fork(dp, XFS_ATTR_FORK); ++ if (lock_mode) ++ xfs_iunlock(dp, lock_mode); + return error; + } +diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c +index 3dd03af..cf4bf1f 100644 +--- a/fs/xfs/xfs_file.c ++++ b/fs/xfs/xfs_file.c +@@ -124,7 +124,7 @@ xfs_iozero( + status = 0; + } while (count); + +- return (-status); ++ return status; + } + + /* +diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c +index d745e1a..1b8451d 100644 +--- a/fs/xfs/xfs_inode.c ++++ b/fs/xfs/xfs_inode.c +@@ -1889,21 +1889,17 @@ xfs_inactive( + /* + * If there are attributes associated with the file then blow them away + * now. The code calls a routine that recursively deconstructs the +- * attribute fork. We need to just commit the current transaction +- * because we can't use it for xfs_attr_inactive(). ++ * attribute fork. If also blows away the in-core attribute fork. + */ +- if (ip->i_d.di_anextents > 0) { +- ASSERT(ip->i_d.di_forkoff != 0); +- ++ if (XFS_IFORK_Q(ip)) { + error = xfs_attr_inactive(ip); + if (error) + return; + } + +- if (ip->i_afp) +- xfs_idestroy_fork(ip, XFS_ATTR_FORK); +- ++ ASSERT(!ip->i_afp); + ASSERT(ip->i_d.di_anextents == 0); ++ ASSERT(ip->i_d.di_forkoff == 0); + + /* + * Free the inode. +diff --git a/include/linux/brcmphy.h b/include/linux/brcmphy.h +index 7ccd928..ac86f94 100644 +--- a/include/linux/brcmphy.h ++++ b/include/linux/brcmphy.h +@@ -16,7 +16,7 @@ + #define PHY_ID_BCM7250 0xae025280 + #define PHY_ID_BCM7364 0xae025260 + #define PHY_ID_BCM7366 0x600d8490 +-#define PHY_ID_BCM7425 0x03625e60 ++#define PHY_ID_BCM7425 0x600d86b0 + #define PHY_ID_BCM7429 0x600d8730 + #define PHY_ID_BCM7439 0x600d8480 + #define PHY_ID_BCM7445 0x600d8510 +diff --git a/include/uapi/drm/radeon_drm.h b/include/uapi/drm/radeon_drm.h +index 50d0fb4..76d2ede 100644 +--- a/include/uapi/drm/radeon_drm.h ++++ b/include/uapi/drm/radeon_drm.h +@@ -1034,6 +1034,7 @@ struct drm_radeon_cs { + #define RADEON_INFO_VRAM_USAGE 0x1e + #define RADEON_INFO_GTT_USAGE 0x1f + #define RADEON_INFO_ACTIVE_CU_COUNT 0x20 ++#define RADEON_INFO_VA_UNMAP_WORKING 0x25 + + struct drm_radeon_info { + uint32_t request; +diff --git a/kernel/module.c b/kernel/module.c +index d856e96..bc8d162 100644 +--- a/kernel/module.c ++++ b/kernel/module.c +@@ -3356,6 +3356,9 @@ static int load_module(struct load_info *info, const char __user *uargs, + module_bug_cleanup(mod); + mutex_unlock(&module_mutex); + ++ blocking_notifier_call_chain(&module_notify_list, ++ MODULE_STATE_GOING, mod); ++ + /* we can't deallocate the module until we clear memory protection */ + unset_module_init_ro_nx(mod); + unset_module_core_ro_nx(mod); +diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c +index fe331fc..44cfeb3 100644 +--- a/kernel/sched/fair.c ++++ b/kernel/sched/fair.c +@@ -2162,8 +2162,10 @@ void task_numa_work(struct callback_head *work) + vma = mm->mmap; + } + for (; vma; vma = vma->vm_next) { +- if (!vma_migratable(vma) || !vma_policy_mof(vma)) ++ if (!vma_migratable(vma) || !vma_policy_mof(vma) || ++ (vma->vm_flags & VM_MIXEDMAP)) { + continue; ++ } + + /* + * Shared library pages mapped by multiple processes are not +diff --git a/kernel/trace/ring_buffer_benchmark.c b/kernel/trace/ring_buffer_benchmark.c +index 3f9e328..728f99b 100644 +--- a/kernel/trace/ring_buffer_benchmark.c ++++ b/kernel/trace/ring_buffer_benchmark.c +@@ -452,7 +452,7 @@ static int __init ring_buffer_benchmark_init(void) + + if (producer_fifo >= 0) { + struct sched_param param = { +- .sched_priority = consumer_fifo ++ .sched_priority = producer_fifo + }; + sched_setscheduler(producer, SCHED_FIFO, ¶m); + } else +diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c +index ced69da..7f2e97c 100644 +--- a/kernel/trace/trace_events_filter.c ++++ b/kernel/trace/trace_events_filter.c +@@ -1369,19 +1369,26 @@ static int check_preds(struct filter_parse_state *ps) + { + int n_normal_preds = 0, n_logical_preds = 0; + struct postfix_elt *elt; ++ int cnt = 0; + + list_for_each_entry(elt, &ps->postfix, list) { +- if (elt->op == OP_NONE) ++ if (elt->op == OP_NONE) { ++ cnt++; + continue; ++ } + + if (elt->op == OP_AND || elt->op == OP_OR) { + n_logical_preds++; ++ cnt--; + continue; + } ++ if (elt->op != OP_NOT) ++ cnt--; + n_normal_preds++; ++ WARN_ON_ONCE(cnt < 0); + } + +- if (!n_normal_preds || n_logical_preds >= n_normal_preds) { ++ if (cnt != 1 || !n_normal_preds || n_logical_preds >= n_normal_preds) { + parse_error(ps, FILT_ERR_INVALID_FILTER, 0); + return -EINVAL; + } +diff --git a/lib/strnlen_user.c b/lib/strnlen_user.c +index a28df52..1164961 100644 +--- a/lib/strnlen_user.c ++++ b/lib/strnlen_user.c +@@ -57,7 +57,8 @@ static inline long do_strnlen_user(const char __user *src, unsigned long count, + return res + find_zero(data) + 1 - align; + } + res += sizeof(unsigned long); +- if (unlikely(max < sizeof(unsigned long))) ++ /* We already handled 'unsigned long' bytes. Did we do it all ? */ ++ if (unlikely(max <= sizeof(unsigned long))) + break; + max -= sizeof(unsigned long); + if (unlikely(__get_user(c,(unsigned long __user *)(src+res)))) +diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c +index 65842d6..93caba7 100644 +--- a/mm/memory_hotplug.c ++++ b/mm/memory_hotplug.c +@@ -1978,8 +1978,10 @@ void try_offline_node(int nid) + * wait_table may be allocated from boot memory, + * here only free if it's allocated by vmalloc. + */ +- if (is_vmalloc_addr(zone->wait_table)) ++ if (is_vmalloc_addr(zone->wait_table)) { + vfree(zone->wait_table); ++ zone->wait_table = NULL; ++ } + } + } + EXPORT_SYMBOL(try_offline_node); +diff --git a/net/bridge/br_fdb.c b/net/bridge/br_fdb.c +index 79f59c5..ed1e0fa 100644 +--- a/net/bridge/br_fdb.c ++++ b/net/bridge/br_fdb.c +@@ -569,7 +569,7 @@ void br_fdb_update(struct net_bridge *br, struct net_bridge_port *source, + fdb_notify(br, fdb, RTM_NEWNEIGH); + } + } else { +- spin_lock(&br->hash_lock); ++ spin_lock_bh(&br->hash_lock); + if (likely(!fdb_find(head, addr, vid))) { + fdb = fdb_create(head, source, addr, vid); + if (fdb) { +@@ -581,7 +581,7 @@ void br_fdb_update(struct net_bridge *br, struct net_bridge_port *source, + /* else we lose race and someone else inserts + * it first, don't bother updating + */ +- spin_unlock(&br->hash_lock); ++ spin_unlock_bh(&br->hash_lock); + } + } + +diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c +index b0aee78..c08f510 100644 +--- a/net/bridge/br_multicast.c ++++ b/net/bridge/br_multicast.c +@@ -1166,6 +1166,9 @@ static void br_multicast_add_router(struct net_bridge *br, + struct net_bridge_port *p; + struct hlist_node *slot = NULL; + ++ if (!hlist_unhashed(&port->rlist)) ++ return; ++ + hlist_for_each_entry(p, &br->router_list, rlist) { + if ((unsigned long) port >= (unsigned long) p) + break; +@@ -1193,12 +1196,8 @@ static void br_multicast_mark_router(struct net_bridge *br, + if (port->multicast_router != 1) + return; + +- if (!hlist_unhashed(&port->rlist)) +- goto timer; +- + br_multicast_add_router(br, port); + +-timer: + mod_timer(&port->multicast_router_timer, + now + br->multicast_querier_interval); + } +diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h +index fa7568c..5ab2b63 100644 +--- a/net/mac80211/ieee80211_i.h ++++ b/net/mac80211/ieee80211_i.h +@@ -204,6 +204,8 @@ enum ieee80211_packet_rx_flags { + * @IEEE80211_RX_CMNTR: received on cooked monitor already + * @IEEE80211_RX_BEACON_REPORTED: This frame was already reported + * to cfg80211_report_obss_beacon(). ++ * @IEEE80211_RX_REORDER_TIMER: this frame is released by the ++ * reorder buffer timeout timer, not the normal RX path + * + * These flags are used across handling multiple interfaces + * for a single frame. +@@ -211,6 +213,7 @@ enum ieee80211_packet_rx_flags { + enum ieee80211_rx_flags { + IEEE80211_RX_CMNTR = BIT(0), + IEEE80211_RX_BEACON_REPORTED = BIT(1), ++ IEEE80211_RX_REORDER_TIMER = BIT(2), + }; + + struct ieee80211_rx_data { +diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c +index 909913d..c218688 100644 +--- a/net/mac80211/rx.c ++++ b/net/mac80211/rx.c +@@ -2083,7 +2083,8 @@ ieee80211_deliver_skb(struct ieee80211_rx_data *rx) + /* deliver to local stack */ + skb->protocol = eth_type_trans(skb, dev); + memset(skb->cb, 0, sizeof(skb->cb)); +- if (rx->local->napi) ++ if (!(rx->flags & IEEE80211_RX_REORDER_TIMER) && ++ rx->local->napi) + napi_gro_receive(rx->local->napi, skb); + else + netif_receive_skb(skb); +@@ -3178,7 +3179,7 @@ void ieee80211_release_reorder_timeout(struct sta_info *sta, int tid) + /* This is OK -- must be QoS data frame */ + .security_idx = tid, + .seqno_idx = tid, +- .flags = 0, ++ .flags = IEEE80211_RX_REORDER_TIMER, + }; + struct tid_ampdu_rx *tid_agg_rx; + +diff --git a/net/wireless/wext-compat.c b/net/wireless/wext-compat.c +index 0f47948..d2c77d5 100644 +--- a/net/wireless/wext-compat.c ++++ b/net/wireless/wext-compat.c +@@ -1333,6 +1333,8 @@ static struct iw_statistics *cfg80211_wireless_stats(struct net_device *dev) + memcpy(bssid, wdev->current_bss->pub.bssid, ETH_ALEN); + wdev_unlock(wdev); + ++ memset(&sinfo, 0, sizeof(sinfo)); ++ + if (rdev_get_station(rdev, dev, bssid, &sinfo)) + return NULL; + +diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c +index de971b6..27348f0 100644 +--- a/net/xfrm/xfrm_state.c ++++ b/net/xfrm/xfrm_state.c +@@ -927,8 +927,8 @@ struct xfrm_state *xfrm_state_lookup_byspi(struct net *net, __be32 spi, + x->id.spi != spi) + continue; + +- spin_unlock_bh(&net->xfrm.xfrm_state_lock); + xfrm_state_hold(x); ++ spin_unlock_bh(&net->xfrm.xfrm_state_lock); + return x; + } + spin_unlock_bh(&net->xfrm.xfrm_state_lock); +diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c +index 84bed14..7f66dca 100644 +--- a/sound/pci/hda/hda_intel.c ++++ b/sound/pci/hda/hda_intel.c +@@ -2146,6 +2146,8 @@ static const struct pci_device_id azx_ids[] = { + .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS }, + { PCI_DEVICE(0x1002, 0xaab0), + .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS }, ++ { PCI_DEVICE(0x1002, 0xaac8), ++ .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS }, + /* VIA VT8251/VT8237A */ + { PCI_DEVICE(0x1106, 0x3288), + .driver_data = AZX_DRIVER_VIA | AZX_DCAPS_POSFIX_VIA }, +diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c +index 4cfab09..008f1e6 100644 +--- a/sound/pci/hda/patch_realtek.c ++++ b/sound/pci/hda/patch_realtek.c +@@ -2165,6 +2165,7 @@ static const struct hda_fixup alc882_fixups[] = { + static const struct snd_pci_quirk alc882_fixup_tbl[] = { + SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_FIXUP_ACER_EAPD), + SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_FIXUP_ACER_EAPD), ++ SND_PCI_QUIRK(0x1025, 0x0107, "Acer Aspire", ALC883_FIXUP_ACER_EAPD), + SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_FIXUP_ACER_EAPD), + SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_FIXUP_ACER_EAPD), + SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_FIXUP_ACER_EAPD), +diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c +index 87eff31..60b3100 100644 +--- a/sound/pci/hda/patch_sigmatel.c ++++ b/sound/pci/hda/patch_sigmatel.c +@@ -100,6 +100,7 @@ enum { + STAC_HP_ENVY_BASS, + STAC_HP_BNB13_EQ, + STAC_HP_ENVY_TS_BASS, ++ STAC_HP_ENVY_TS_DAC_BIND, + STAC_92HD83XXX_GPIO10_EAPD, + STAC_92HD83XXX_MODELS + }; +@@ -2170,6 +2171,22 @@ static void stac92hd83xxx_fixup_gpio10_eapd(struct hda_codec *codec, + spec->eapd_switch = 0; + } + ++static void hp_envy_ts_fixup_dac_bind(struct hda_codec *codec, ++ const struct hda_fixup *fix, ++ int action) ++{ ++ struct sigmatel_spec *spec = codec->spec; ++ static hda_nid_t preferred_pairs[] = { ++ 0xd, 0x13, ++ 0 ++ }; ++ ++ if (action != HDA_FIXUP_ACT_PRE_PROBE) ++ return; ++ ++ spec->gen.preferred_dacs = preferred_pairs; ++} ++ + static const struct hda_verb hp_bnb13_eq_verbs[] = { + /* 44.1KHz base */ + { 0x22, 0x7A6, 0x3E }, +@@ -2685,6 +2702,12 @@ static const struct hda_fixup stac92hd83xxx_fixups[] = { + {} + }, + }, ++ [STAC_HP_ENVY_TS_DAC_BIND] = { ++ .type = HDA_FIXUP_FUNC, ++ .v.func = hp_envy_ts_fixup_dac_bind, ++ .chained = true, ++ .chain_id = STAC_HP_ENVY_TS_BASS, ++ }, + [STAC_92HD83XXX_GPIO10_EAPD] = { + .type = HDA_FIXUP_FUNC, + .v.func = stac92hd83xxx_fixup_gpio10_eapd, +@@ -2763,6 +2786,8 @@ static const struct snd_pci_quirk stac92hd83xxx_fixup_tbl[] = { + "HP bNB13", STAC_HP_BNB13_EQ), + SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x190e, + "HP ENVY TS", STAC_HP_ENVY_TS_BASS), ++ SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1967, ++ "HP ENVY TS", STAC_HP_ENVY_TS_DAC_BIND), + SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1940, + "HP bNB13", STAC_HP_BNB13_EQ), + SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1941, +diff --git a/sound/pci/hda/thinkpad_helper.c b/sound/pci/hda/thinkpad_helper.c +index 2341fc3..6ba0b55 100644 +--- a/sound/pci/hda/thinkpad_helper.c ++++ b/sound/pci/hda/thinkpad_helper.c +@@ -72,7 +72,6 @@ static void hda_fixup_thinkpad_acpi(struct hda_codec *codec, + if (led_set_func(TPACPI_LED_MUTE, false) >= 0) { + old_vmaster_hook = spec->vmaster_mute.hook; + spec->vmaster_mute.hook = update_tpacpi_mute_led; +- spec->vmaster_mute_enum = 1; + removefunc = false; + } + if (led_set_func(TPACPI_LED_MICMUTE, false) >= 0) { +diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c +index 3e2ef61..8b7e391 100644 +--- a/sound/usb/mixer.c ++++ b/sound/usb/mixer.c +@@ -918,6 +918,7 @@ static void volume_control_quirks(struct usb_mixer_elem_info *cval, + case USB_ID(0x046d, 0x081d): /* HD Webcam c510 */ + case USB_ID(0x046d, 0x0825): /* HD Webcam c270 */ + case USB_ID(0x046d, 0x0826): /* HD Webcam c525 */ ++ case USB_ID(0x046d, 0x08ca): /* Logitech Quickcam Fusion */ + case USB_ID(0x046d, 0x0991): + /* Most audio usb devices lie about volume resolution. + * Most Logitech webcams have res = 384. +@@ -1582,12 +1583,6 @@ static int parse_audio_mixer_unit(struct mixer_build *state, int unitid, + unitid); + return -EINVAL; + } +- /* no bmControls field (e.g. Maya44) -> ignore */ +- if (desc->bLength <= 10 + input_pins) { +- usb_audio_dbg(state->chip, "MU %d has no bmControls field\n", +- unitid); +- return 0; +- } + + num_ins = 0; + ich = 0; +@@ -1595,6 +1590,9 @@ static int parse_audio_mixer_unit(struct mixer_build *state, int unitid, + err = parse_audio_unit(state, desc->baSourceID[pin]); + if (err < 0) + continue; ++ /* no bmControls field (e.g. Maya44) -> ignore */ ++ if (desc->bLength <= 10 + input_pins) ++ continue; + err = check_input_term(state, desc->baSourceID[pin], &iterm); + if (err < 0) + return err; +diff --git a/sound/usb/mixer_maps.c b/sound/usb/mixer_maps.c +index b703cb3..e5000da 100644 +--- a/sound/usb/mixer_maps.c ++++ b/sound/usb/mixer_maps.c +@@ -437,6 +437,11 @@ static struct usbmix_ctl_map usbmix_ctl_maps[] = { + .map = ebox44_map, + }, + { ++ /* MAYA44 USB+ */ ++ .id = USB_ID(0x2573, 0x0008), ++ .map = maya44_map, ++ }, ++ { + /* KEF X300A */ + .id = USB_ID(0x27ac, 0x1000), + .map = scms_usb3318_map, +diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c +index a0795ba..1b195af 100644 +--- a/sound/usb/quirks.c ++++ b/sound/usb/quirks.c +@@ -1253,8 +1253,9 @@ u64 snd_usb_interface_dsd_format_quirks(struct snd_usb_audio *chip, + if (fp->altsetting == 2) + return SNDRV_PCM_FMTBIT_DSD_U32_BE; + break; +- /* DIYINHK DSD DXD 384kHz USB to I2S/DSD */ +- case USB_ID(0x20b1, 0x2009): ++ ++ case USB_ID(0x20b1, 0x2009): /* DIYINHK DSD DXD 384kHz USB to I2S/DSD */ ++ case USB_ID(0x20b1, 0x2023): /* JLsounds I2SoverUSB */ + if (fp->altsetting == 3) + return SNDRV_PCM_FMTBIT_DSD_U32_BE; + break; +diff --git a/tools/vm/Makefile b/tools/vm/Makefile +index 93aadaf..ac884b6 100644 +--- a/tools/vm/Makefile ++++ b/tools/vm/Makefile +@@ -3,7 +3,7 @@ + TARGETS=page-types slabinfo page_owner_sort + + LIB_DIR = ../lib/api +-LIBS = $(LIB_DIR)/libapi.a ++LIBS = $(LIB_DIR)/libapikfs.a + + CC = $(CROSS_COMPILE)gcc + CFLAGS = -Wall -Wextra -I../lib/ diff --git a/debian/patches/series b/debian/patches/series index 0fbbcc6..0d85b11 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -79,4 +79,4 @@ bugfix/all/stable-3.19.8.patch bugfix/all/stable-3.19.8-ckt1.patch bugfix/all/stable-3.19.8-ckt2.patch - +bugfix/all/stable-3.19.8-ckt3.patch -- To view, visit https://gerrit.wikimedia.org/r/225850 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Iaaa1dd5fa4d31bf35f4f77b2506703ef363da0da Gerrit-PatchSet: 1 Gerrit-Project: operations/debs/linux Gerrit-Branch: master Gerrit-Owner: Muehlenhoff <mmuhlenh...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits