lkml.org 
[lkml]   [2012]   [Jun]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    SubjectRe: [ 00/69] 3.2.21-stable review
    From
    Date
    diff --git a/Makefile b/Makefile
    index c7e9cc4..59b96e7 100644
    --- a/Makefile
    +++ b/Makefile
    @@ -1,7 +1,7 @@
    VERSION = 3
    PATCHLEVEL = 2
    -SUBLEVEL = 20
    -EXTRAVERSION =
    +SUBLEVEL = 21
    +EXTRAVERSION = -rc1
    NAME = Saber-toothed Squirrel

    # *DOCUMENTATION*
    diff --git a/arch/arm/mach-imx/hotplug.c b/arch/arm/mach-imx/hotplug.c
    index 89493ab..20ed2d5 100644
    --- a/arch/arm/mach-imx/hotplug.c
    +++ b/arch/arm/mach-imx/hotplug.c
    @@ -12,6 +12,7 @@

    #include <linux/errno.h>
    #include <asm/cacheflush.h>
    +#include <asm/cp15.h>
    #include <mach/common.h>

    int platform_cpu_kill(unsigned int cpu)
    @@ -19,6 +20,44 @@ int platform_cpu_kill(unsigned int cpu)
    return 1;
    }

    +static inline void cpu_enter_lowpower(void)
    +{
    + unsigned int v;
    +
    + flush_cache_all();
    + asm volatile(
    + "mcr p15, 0, %1, c7, c5, 0\n"
    + " mcr p15, 0, %1, c7, c10, 4\n"
    + /*
    + * Turn off coherency
    + */
    + " mrc p15, 0, %0, c1, c0, 1\n"
    + " bic %0, %0, %3\n"
    + " mcr p15, 0, %0, c1, c0, 1\n"
    + " mrc p15, 0, %0, c1, c0, 0\n"
    + " bic %0, %0, %2\n"
    + " mcr p15, 0, %0, c1, c0, 0\n"
    + : "=&r" (v)
    + : "r" (0), "Ir" (CR_C), "Ir" (0x40)
    + : "cc");
    +}
    +
    +static inline void cpu_leave_lowpower(void)
    +{
    + unsigned int v;
    +
    + asm volatile(
    + "mrc p15, 0, %0, c1, c0, 0\n"
    + " orr %0, %0, %1\n"
    + " mcr p15, 0, %0, c1, c0, 0\n"
    + " mrc p15, 0, %0, c1, c0, 1\n"
    + " orr %0, %0, %2\n"
    + " mcr p15, 0, %0, c1, c0, 1\n"
    + : "=&r" (v)
    + : "Ir" (CR_C), "Ir" (0x40)
    + : "cc");
    +}
    +
    /*
    * platform-specific code to shutdown a CPU
    *
    @@ -26,9 +65,10 @@ int platform_cpu_kill(unsigned int cpu)
    */
    void platform_cpu_die(unsigned int cpu)
    {
    - flush_cache_all();
    + cpu_enter_lowpower();
    imx_enable_cpu(cpu, false);
    cpu_do_idle();
    + cpu_leave_lowpower();

    /* We should never return from idle */
    panic("cpu %d unexpectedly exit from shutdown\n", cpu);
    diff --git a/arch/arm/mach-imx/mach-mx21ads.c b/arch/arm/mach-imx/mach-mx21ads.c
    index 25f8402..ad994b3 100644
    --- a/arch/arm/mach-imx/mach-mx21ads.c
    +++ b/arch/arm/mach-imx/mach-mx21ads.c
    @@ -32,7 +32,7 @@
    * Memory-mapped I/O on MX21ADS base board
    */
    #define MX21ADS_MMIO_BASE_ADDR 0xf5000000
    -#define MX21ADS_MMIO_SIZE SZ_16M
    +#define MX21ADS_MMIO_SIZE 0xc00000

    #define MX21ADS_REG_ADDR(offset) (void __force __iomem *) \
    (MX21ADS_MMIO_BASE_ADDR + (offset))
    diff --git a/arch/arm/mach-mx5/crm_regs.h b/arch/arm/mach-mx5/crm_regs.h
    index 5e11ba7..5e3f1f0 100644
    --- a/arch/arm/mach-mx5/crm_regs.h
    +++ b/arch/arm/mach-mx5/crm_regs.h
    @@ -23,7 +23,7 @@
    #define MX53_DPLL1_BASE MX53_IO_ADDRESS(MX53_PLL1_BASE_ADDR)
    #define MX53_DPLL2_BASE MX53_IO_ADDRESS(MX53_PLL2_BASE_ADDR)
    #define MX53_DPLL3_BASE MX53_IO_ADDRESS(MX53_PLL3_BASE_ADDR)
    -#define MX53_DPLL4_BASE MX53_IO_ADDRESS(MX53_PLL3_BASE_ADDR)
    +#define MX53_DPLL4_BASE MX53_IO_ADDRESS(MX53_PLL4_BASE_ADDR)

    /* PLL Register Offsets */
    #define MXC_PLL_DP_CTL 0x00
    diff --git a/arch/powerpc/kernel/module_32.c b/arch/powerpc/kernel/module_32.c
    index 0b6d796..2e3200c 100644
    --- a/arch/powerpc/kernel/module_32.c
    +++ b/arch/powerpc/kernel/module_32.c
    @@ -176,8 +176,8 @@ int module_frob_arch_sections(Elf32_Ehdr *hdr,

    static inline int entry_matches(struct ppc_plt_entry *entry, Elf32_Addr val)
    {
    - if (entry->jump[0] == 0x3d600000 + ((val + 0x8000) >> 16)
    - && entry->jump[1] == 0x396b0000 + (val & 0xffff))
    + if (entry->jump[0] == 0x3d800000 + ((val + 0x8000) >> 16)
    + && entry->jump[1] == 0x398c0000 + (val & 0xffff))
    return 1;
    return 0;
    }
    @@ -204,10 +204,9 @@ static uint32_t do_plt_call(void *location,
    entry++;
    }

    - /* Stolen from Paul Mackerras as well... */
    - entry->jump[0] = 0x3d600000+((val+0x8000)>>16); /* lis r11,sym@ha */
    - entry->jump[1] = 0x396b0000 + (val&0xffff); /* addi r11,r11,sym@l*/
    - entry->jump[2] = 0x7d6903a6; /* mtctr r11 */
    + entry->jump[0] = 0x3d800000+((val+0x8000)>>16); /* lis r12,sym@ha */
    + entry->jump[1] = 0x398c0000 + (val&0xffff); /* addi r12,r12,sym@l*/
    + entry->jump[2] = 0x7d8903a6; /* mtctr r12 */
    entry->jump[3] = 0x4e800420; /* bctr */

    DEBUGP("Initialized plt for 0x%x at %p\n", val, entry);
    diff --git a/arch/x86/crypto/aesni-intel_asm.S b/arch/x86/crypto/aesni-intel_asm.S
    index be6d9e3..3470624 100644
    --- a/arch/x86/crypto/aesni-intel_asm.S
    +++ b/arch/x86/crypto/aesni-intel_asm.S
    @@ -2460,10 +2460,12 @@ ENTRY(aesni_cbc_dec)
    pxor IN3, STATE4
    movaps IN4, IV
    #else
    - pxor (INP), STATE2
    - pxor 0x10(INP), STATE3
    pxor IN1, STATE4
    movaps IN2, IV
    + movups (INP), IN1
    + pxor IN1, STATE2
    + movups 0x10(INP), IN2
    + pxor IN2, STATE3
    #endif
    movups STATE1, (OUTP)
    movups STATE2, 0x10(OUTP)
    diff --git a/arch/x86/include/asm/uv/uv_bau.h b/arch/x86/include/asm/uv/uv_bau.h
    index 1b82f7e..679229f 100644
    --- a/arch/x86/include/asm/uv/uv_bau.h
    +++ b/arch/x86/include/asm/uv/uv_bau.h
    @@ -149,7 +149,6 @@
    /* 4 bits of software ack period */
    #define UV2_ACK_MASK 0x7UL
    #define UV2_ACK_UNITS_SHFT 3
    -#define UV2_LEG_SHFT UV2H_LB_BAU_MISC_CONTROL_USE_LEGACY_DESCRIPTOR_FORMATS_SHFT
    #define UV2_EXT_SHFT UV2H_LB_BAU_MISC_CONTROL_ENABLE_EXTENDED_SB_STATUS_SHFT

    /*
    diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c
    index 0bab2b1..3524e1f 100644
    --- a/arch/x86/kernel/cpu/amd.c
    +++ b/arch/x86/kernel/cpu/amd.c
    @@ -571,6 +571,24 @@ static void __cpuinit init_amd(struct cpuinfo_x86 *c)
    }
    }

    + /* re-enable TopologyExtensions if switched off by BIOS */
    + if ((c->x86 == 0x15) &&
    + (c->x86_model >= 0x10) && (c->x86_model <= 0x1f) &&
    + !cpu_has(c, X86_FEATURE_TOPOEXT)) {
    + u64 val;
    +
    + if (!rdmsrl_amd_safe(0xc0011005, &val)) {
    + val |= 1ULL << 54;
    + wrmsrl_amd_safe(0xc0011005, val);
    + rdmsrl(0xc0011005, val);
    + if (val & (1ULL << 54)) {
    + set_cpu_cap(c, X86_FEATURE_TOPOEXT);
    + printk(KERN_INFO FW_INFO "CPU: Re-enabling "
    + "disabled Topology Extensions Support\n");
    + }
    + }
    + }
    +
    cpu_detect_cache_sizes(c);

    /* Multi core CPU? */
    diff --git a/arch/x86/kernel/cpu/mcheck/mce_amd.c b/arch/x86/kernel/cpu/mcheck/mce_amd.c
    index f547421..445a61c 100644
    --- a/arch/x86/kernel/cpu/mcheck/mce_amd.c
    +++ b/arch/x86/kernel/cpu/mcheck/mce_amd.c
    @@ -52,6 +52,7 @@ struct threshold_block {
    unsigned int cpu;
    u32 address;
    u16 interrupt_enable;
    + bool interrupt_capable;
    u16 threshold_limit;
    struct kobject kobj;
    struct list_head miscj;
    @@ -86,6 +87,21 @@ struct thresh_restart {
    u16 old_limit;
    };

    +static bool lvt_interrupt_supported(unsigned int bank, u32 msr_high_bits)
    +{
    + /*
    + * bank 4 supports APIC LVT interrupts implicitly since forever.
    + */
    + if (bank == 4)
    + return true;
    +
    + /*
    + * IntP: interrupt present; if this bit is set, the thresholding
    + * bank can generate APIC LVT interrupts
    + */
    + return msr_high_bits & BIT(28);
    +}
    +
    static int lvt_off_valid(struct threshold_block *b, int apic, u32 lo, u32 hi)
    {
    int msr = (hi & MASK_LVTOFF_HI) >> 20;
    @@ -107,8 +123,10 @@ static int lvt_off_valid(struct threshold_block *b, int apic, u32 lo, u32 hi)
    return 1;
    };

    -/* must be called with correct cpu affinity */
    -/* Called via smp_call_function_single() */
    +/*
    + * Called via smp_call_function_single(), must be called with correct
    + * cpu affinity.
    + */
    static void threshold_restart_bank(void *_tr)
    {
    struct thresh_restart *tr = _tr;
    @@ -131,6 +149,12 @@ static void threshold_restart_bank(void *_tr)
    (new_count & THRESHOLD_MAX);
    }

    + /* clear IntType */
    + hi &= ~MASK_INT_TYPE_HI;
    +
    + if (!tr->b->interrupt_capable)
    + goto done;
    +
    if (tr->set_lvt_off) {
    if (lvt_off_valid(tr->b, tr->lvt_off, lo, hi)) {
    /* set new lvt offset */
    @@ -139,9 +163,10 @@ static void threshold_restart_bank(void *_tr)
    }
    }

    - tr->b->interrupt_enable ?
    - (hi = (hi & ~MASK_INT_TYPE_HI) | INT_TYPE_APIC) :
    - (hi &= ~MASK_INT_TYPE_HI);
    + if (tr->b->interrupt_enable)
    + hi |= INT_TYPE_APIC;
    +
    + done:

    hi |= MASK_COUNT_EN_HI;
    wrmsr(tr->b->address, lo, hi);
    @@ -206,14 +231,18 @@ void mce_amd_feature_init(struct cpuinfo_x86 *c)
    if (shared_bank[bank] && c->cpu_core_id)
    break;
    #endif
    - offset = setup_APIC_mce(offset,
    - (high & MASK_LVTOFF_HI) >> 20);

    memset(&b, 0, sizeof(b));
    - b.cpu = cpu;
    - b.bank = bank;
    - b.block = block;
    - b.address = address;
    + b.cpu = cpu;
    + b.bank = bank;
    + b.block = block;
    + b.address = address;
    + b.interrupt_capable = lvt_interrupt_supported(bank, high);
    +
    + if (b.interrupt_capable) {
    + int new = (high & MASK_LVTOFF_HI) >> 20;
    + offset = setup_APIC_mce(offset, new);
    + }

    mce_threshold_block_init(&b, offset);
    mce_threshold_vector = amd_threshold_interrupt;
    @@ -313,6 +342,9 @@ store_interrupt_enable(struct threshold_block *b, const char *buf, size_t size)
    struct thresh_restart tr;
    unsigned long new;

    + if (!b->interrupt_capable)
    + return -EINVAL;
    +
    if (strict_strtoul(buf, 0, &new) < 0)
    return -EINVAL;

    @@ -471,6 +503,7 @@ static __cpuinit int allocate_threshold_blocks(unsigned int cpu,
    b->cpu = cpu;
    b->address = address;
    b->interrupt_enable = 0;
    + b->interrupt_capable = lvt_interrupt_supported(bank, high);
    b->threshold_limit = THRESHOLD_MAX;

    INIT_LIST_HEAD(&b->miscj);
    diff --git a/arch/x86/platform/uv/tlb_uv.c b/arch/x86/platform/uv/tlb_uv.c
    index 81aee5a..29a69550 100644
    --- a/arch/x86/platform/uv/tlb_uv.c
    +++ b/arch/x86/platform/uv/tlb_uv.c
    @@ -1304,7 +1304,6 @@ static void __init enable_timeouts(void)
    */
    mmr_image |= (1L << SOFTACK_MSHIFT);
    if (is_uv2_hub()) {
    - mmr_image &= ~(1L << UV2_LEG_SHFT);
    mmr_image |= (1L << UV2_EXT_SHFT);
    }
    write_mmr_misc_control(pnode, mmr_image);
    diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
    index cca659e..44d4393 100644
    --- a/arch/x86/xen/enlighten.c
    +++ b/arch/x86/xen/enlighten.c
    @@ -198,6 +198,9 @@ static void __init xen_banner(void)
    xen_feature(XENFEAT_mmu_pt_update_preserve_ad) ? " (preserve-AD)" : "");
    }

    +#define CPUID_THERM_POWER_LEAF 6
    +#define APERFMPERF_PRESENT 0
    +
    static __read_mostly unsigned int cpuid_leaf1_edx_mask = ~0;
    static __read_mostly unsigned int cpuid_leaf1_ecx_mask = ~0;

    @@ -218,6 +221,11 @@ static void xen_cpuid(unsigned int *ax, unsigned int *bx,
    maskedx = cpuid_leaf1_edx_mask;
    break;

    + case CPUID_THERM_POWER_LEAF:
    + /* Disabling APERFMPERF for kernel usage */
    + maskecx = ~(1 << APERFMPERF_PRESENT);
    + break;
    +
    case 0xb:
    /* Suppress extended topology stuff */
    maskebx = 0;
    diff --git a/drivers/char/agp/intel-agp.c b/drivers/char/agp/intel-agp.c
    index b427711..58b49d1 100644
    --- a/drivers/char/agp/intel-agp.c
    +++ b/drivers/char/agp/intel-agp.c
    @@ -897,6 +897,7 @@ static struct pci_device_id agp_intel_pci_table[] = {
    ID(PCI_DEVICE_ID_INTEL_B43_HB),
    ID(PCI_DEVICE_ID_INTEL_B43_1_HB),
    ID(PCI_DEVICE_ID_INTEL_IRONLAKE_D_HB),
    + ID(PCI_DEVICE_ID_INTEL_IRONLAKE_D2_HB),
    ID(PCI_DEVICE_ID_INTEL_IRONLAKE_M_HB),
    ID(PCI_DEVICE_ID_INTEL_IRONLAKE_MA_HB),
    ID(PCI_DEVICE_ID_INTEL_IRONLAKE_MC2_HB),
    diff --git a/drivers/char/agp/intel-agp.h b/drivers/char/agp/intel-agp.h
    index 5da67f1..6f24604 100644
    --- a/drivers/char/agp/intel-agp.h
    +++ b/drivers/char/agp/intel-agp.h
    @@ -211,6 +211,7 @@
    #define PCI_DEVICE_ID_INTEL_G41_HB 0x2E30
    #define PCI_DEVICE_ID_INTEL_G41_IG 0x2E32
    #define PCI_DEVICE_ID_INTEL_IRONLAKE_D_HB 0x0040
    +#define PCI_DEVICE_ID_INTEL_IRONLAKE_D2_HB 0x0069
    #define PCI_DEVICE_ID_INTEL_IRONLAKE_D_IG 0x0042
    #define PCI_DEVICE_ID_INTEL_IRONLAKE_M_HB 0x0044
    #define PCI_DEVICE_ID_INTEL_IRONLAKE_MA_HB 0x0062
    diff --git a/drivers/char/hw_random/atmel-rng.c b/drivers/char/hw_random/atmel-rng.c
    index 241df2e..0477982 100644
    --- a/drivers/char/hw_random/atmel-rng.c
    +++ b/drivers/char/hw_random/atmel-rng.c
    @@ -36,6 +36,13 @@ static int atmel_trng_read(struct hwrng *rng, void *buf, size_t max,
    /* data ready? */
    if (readl(trng->base + TRNG_ODATA) & 1) {
    *data = readl(trng->base + TRNG_ODATA);
    + /*
    + ensure data ready is only set again AFTER the next data
    + word is ready in case it got set between checking ISR
    + and reading ODATA, so we don't risk re-reading the
    + same word
    + */
    + readl(trng->base + TRNG_ISR);
    return 4;
    } else
    return 0;
    diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
    index d0f8830..3a1bfd7 100644
    --- a/drivers/gpu/drm/i915/i915_drv.c
    +++ b/drivers/gpu/drm/i915/i915_drv.c
    @@ -214,6 +214,7 @@ static const struct intel_device_info intel_sandybridge_d_info = {
    .need_gfx_hws = 1, .has_hotplug = 1,
    .has_bsd_ring = 1,
    .has_blt_ring = 1,
    + .has_force_wake = 1,
    };

    static const struct intel_device_info intel_sandybridge_m_info = {
    @@ -222,6 +223,7 @@ static const struct intel_device_info intel_sandybridge_m_info = {
    .has_fbc = 1,
    .has_bsd_ring = 1,
    .has_blt_ring = 1,
    + .has_force_wake = 1,
    };

    static const struct intel_device_info intel_ivybridge_d_info = {
    @@ -229,6 +231,7 @@ static const struct intel_device_info intel_ivybridge_d_info = {
    .need_gfx_hws = 1, .has_hotplug = 1,
    .has_bsd_ring = 1,
    .has_blt_ring = 1,
    + .has_force_wake = 1,
    };

    static const struct intel_device_info intel_ivybridge_m_info = {
    @@ -237,6 +240,7 @@ static const struct intel_device_info intel_ivybridge_m_info = {
    .has_fbc = 0, /* FBC is not enabled on Ivybridge mobile yet */
    .has_bsd_ring = 1,
    .has_blt_ring = 1,
    + .has_force_wake = 1,
    };

    static const struct pci_device_id pciidlist[] = { /* aka */
    @@ -939,7 +943,7 @@ MODULE_LICENSE("GPL and additional rights");

    /* We give fast paths for the really cool registers */
    #define NEEDS_FORCE_WAKE(dev_priv, reg) \
    - (((dev_priv)->info->gen >= 6) && \
    + ((HAS_FORCE_WAKE((dev_priv)->dev)) && \
    ((reg) < 0x40000) && \
    ((reg) != FORCEWAKE) && \
    ((reg) != ECOBUS))
    diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
    index ae294a0..d62c731 100644
    --- a/drivers/gpu/drm/i915/i915_drv.h
    +++ b/drivers/gpu/drm/i915/i915_drv.h
    @@ -244,6 +244,7 @@ struct intel_device_info {
    u8 is_broadwater:1;
    u8 is_crestline:1;
    u8 is_ivybridge:1;
    + u8 has_force_wake:1;
    u8 has_fbc:1;
    u8 has_pipe_cxsr:1;
    u8 has_hotplug:1;
    @@ -1001,6 +1002,8 @@ struct drm_i915_file_private {
    #define HAS_PCH_CPT(dev) (INTEL_PCH_TYPE(dev) == PCH_CPT)
    #define HAS_PCH_IBX(dev) (INTEL_PCH_TYPE(dev) == PCH_IBX)

    +#define HAS_FORCE_WAKE(dev) (INTEL_INFO(dev)->has_force_wake)
    +
    #include "i915_trace.h"

    extern struct drm_ioctl_desc i915_ioctls[];
    diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
    index 06ec1e5..fd53122 100644
    --- a/drivers/gpu/drm/i915/i915_reg.h
    +++ b/drivers/gpu/drm/i915/i915_reg.h
    @@ -164,6 +164,14 @@
    #define MI_DISPLAY_FLIP MI_INSTR(0x14, 2)
    #define MI_DISPLAY_FLIP_I915 MI_INSTR(0x14, 1)
    #define MI_DISPLAY_FLIP_PLANE(n) ((n) << 20)
    +/* IVB has funny definitions for which plane to flip. */
    +#define MI_DISPLAY_FLIP_IVB_PLANE_A (0 << 19)
    +#define MI_DISPLAY_FLIP_IVB_PLANE_B (1 << 19)
    +#define MI_DISPLAY_FLIP_IVB_SPRITE_A (2 << 19)
    +#define MI_DISPLAY_FLIP_IVB_SPRITE_B (3 << 19)
    +#define MI_DISPLAY_FLIP_IVB_PLANE_C (4 << 19)
    +#define MI_DISPLAY_FLIP_IVB_SPRITE_C (5 << 19)
    +
    #define MI_SET_CONTEXT MI_INSTR(0x18, 0)
    #define MI_MM_SPACE_GTT (1<<8)
    #define MI_MM_SPACE_PHYSICAL (0<<8)
    diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
    index 4720397..5c1cdb8 100644
    --- a/drivers/gpu/drm/i915/intel_display.c
    +++ b/drivers/gpu/drm/i915/intel_display.c
    @@ -7009,14 +7009,14 @@ static int intel_gen2_queue_flip(struct drm_device *dev,

    ret = intel_pin_and_fence_fb_obj(dev, obj, LP_RING(dev_priv));
    if (ret)
    - goto out;
    + goto err;

    /* Offset into the new buffer for cases of shared fbs between CRTCs */
    offset = crtc->y * fb->pitch + crtc->x * fb->bits_per_pixel/8;

    ret = BEGIN_LP_RING(6);
    if (ret)
    - goto out;
    + goto err_unpin;

    /* Can't queue multiple flips, so wait for the previous
    * one to finish before executing the next.
    @@ -7033,7 +7033,11 @@ static int intel_gen2_queue_flip(struct drm_device *dev,
    OUT_RING(obj->gtt_offset + offset);
    OUT_RING(MI_NOOP);
    ADVANCE_LP_RING();
    -out:
    + return 0;
    +
    +err_unpin:
    + i915_gem_object_unpin(obj);
    +err:
    return ret;
    }

    @@ -7050,14 +7054,14 @@ static int intel_gen3_queue_flip(struct drm_device *dev,

    ret = intel_pin_and_fence_fb_obj(dev, obj, LP_RING(dev_priv));
    if (ret)
    - goto out;
    + goto err;

    /* Offset into the new buffer for cases of shared fbs between CRTCs */
    offset = crtc->y * fb->pitch + crtc->x * fb->bits_per_pixel/8;

    ret = BEGIN_LP_RING(6);
    if (ret)
    - goto out;
    + goto err_unpin;

    if (intel_crtc->plane)
    flip_mask = MI_WAIT_FOR_PLANE_B_FLIP;
    @@ -7072,7 +7076,11 @@ static int intel_gen3_queue_flip(struct drm_device *dev,
    OUT_RING(MI_NOOP);

    ADVANCE_LP_RING();
    -out:
    + return 0;
    +
    +err_unpin:
    + i915_gem_object_unpin(obj);
    +err:
    return ret;
    }

    @@ -7088,11 +7096,11 @@ static int intel_gen4_queue_flip(struct drm_device *dev,

    ret = intel_pin_and_fence_fb_obj(dev, obj, LP_RING(dev_priv));
    if (ret)
    - goto out;
    + goto err;

    ret = BEGIN_LP_RING(4);
    if (ret)
    - goto out;
    + goto err_unpin;

    /* i965+ uses the linear or tiled offsets from the
    * Display Registers (which do not change across a page-flip)
    @@ -7111,7 +7119,11 @@ static int intel_gen4_queue_flip(struct drm_device *dev,
    pipesrc = I915_READ(PIPESRC(intel_crtc->pipe)) & 0x0fff0fff;
    OUT_RING(pf | pipesrc);
    ADVANCE_LP_RING();
    -out:
    + return 0;
    +
    +err_unpin:
    + i915_gem_object_unpin(obj);
    +err:
    return ret;
    }

    @@ -7127,11 +7139,11 @@ static int intel_gen6_queue_flip(struct drm_device *dev,

    ret = intel_pin_and_fence_fb_obj(dev, obj, LP_RING(dev_priv));
    if (ret)
    - goto out;
    + goto err;

    ret = BEGIN_LP_RING(4);
    if (ret)
    - goto out;
    + goto err_unpin;

    OUT_RING(MI_DISPLAY_FLIP |
    MI_DISPLAY_FLIP_PLANE(intel_crtc->plane));
    @@ -7142,7 +7154,11 @@ static int intel_gen6_queue_flip(struct drm_device *dev,
    pipesrc = I915_READ(PIPESRC(intel_crtc->pipe)) & 0x0fff0fff;
    OUT_RING(pf | pipesrc);
    ADVANCE_LP_RING();
    -out:
    + return 0;
    +
    +err_unpin:
    + i915_gem_object_unpin(obj);
    +err:
    return ret;
    }

    @@ -7160,22 +7176,43 @@ static int intel_gen7_queue_flip(struct drm_device *dev,
    struct drm_i915_private *dev_priv = dev->dev_private;
    struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
    struct intel_ring_buffer *ring = &dev_priv->ring[BCS];
    + uint32_t plane_bit = 0;
    int ret;

    ret = intel_pin_and_fence_fb_obj(dev, obj, ring);
    if (ret)
    - goto out;
    + goto err;
    +
    + switch(intel_crtc->plane) {
    + case PLANE_A:
    + plane_bit = MI_DISPLAY_FLIP_IVB_PLANE_A;
    + break;
    + case PLANE_B:
    + plane_bit = MI_DISPLAY_FLIP_IVB_PLANE_B;
    + break;
    + case PLANE_C:
    + plane_bit = MI_DISPLAY_FLIP_IVB_PLANE_C;
    + break;
    + default:
    + WARN_ONCE(1, "unknown plane in flip command\n");
    + ret = -ENODEV;
    + goto err;
    + }

    ret = intel_ring_begin(ring, 4);
    if (ret)
    - goto out;
    + goto err_unpin;

    - intel_ring_emit(ring, MI_DISPLAY_FLIP_I915 | (intel_crtc->plane << 19));
    + intel_ring_emit(ring, MI_DISPLAY_FLIP_I915 | plane_bit);
    intel_ring_emit(ring, (fb->pitch | obj->tiling_mode));
    intel_ring_emit(ring, (obj->gtt_offset));
    intel_ring_emit(ring, (MI_NOOP));
    intel_ring_advance(ring);
    -out:
    + return 0;
    +
    +err_unpin:
    + i915_gem_object_unpin(obj);
    +err:
    return ret;
    }

    diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c
    index 62f9ac5..933e66b 100644
    --- a/drivers/gpu/drm/i915/intel_ringbuffer.c
    +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
    @@ -263,10 +263,15 @@ u32 intel_ring_get_active_head(struct intel_ring_buffer *ring)

    static int init_ring_common(struct intel_ring_buffer *ring)
    {
    - drm_i915_private_t *dev_priv = ring->dev->dev_private;
    + struct drm_device *dev = ring->dev;
    + drm_i915_private_t *dev_priv = dev->dev_private;
    struct drm_i915_gem_object *obj = ring->obj;
    + int ret = 0;
    u32 head;

    + if (HAS_FORCE_WAKE(dev))
    + gen6_gt_force_wake_get(dev_priv);
    +
    /* Stop the ring if it's running. */
    I915_WRITE_CTL(ring, 0);
    I915_WRITE_HEAD(ring, 0);
    @@ -314,7 +319,8 @@ static int init_ring_common(struct intel_ring_buffer *ring)
    I915_READ_HEAD(ring),
    I915_READ_TAIL(ring),
    I915_READ_START(ring));
    - return -EIO;
    + ret = -EIO;
    + goto out;
    }

    if (!drm_core_check_feature(ring->dev, DRIVER_MODESET))
    @@ -325,7 +331,11 @@ static int init_ring_common(struct intel_ring_buffer *ring)
    ring->space = ring_space(ring);
    }

    - return 0;
    +out:
    + if (HAS_FORCE_WAKE(dev))
    + gen6_gt_force_wake_put(dev_priv);
    +
    + return ret;
    }

    static int
    @@ -1045,6 +1055,10 @@ int intel_init_ring_buffer(struct drm_device *dev,
    if (ret)
    goto err_unref;

    + ret = i915_gem_object_set_to_gtt_domain(obj, true);
    + if (ret)
    + goto err_unpin;
    +
    ring->map.size = ring->size;
    ring->map.offset = dev->agp->base + obj->gtt_offset;
    ring->map.type = 0;
    diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c b/drivers/gpu/drm/nouveau/nouveau_connector.c
    index cea6696..1e72db5 100644
    --- a/drivers/gpu/drm/nouveau/nouveau_connector.c
    +++ b/drivers/gpu/drm/nouveau/nouveau_connector.c
    @@ -602,6 +602,55 @@ nouveau_connector_scaler_modes_add(struct drm_connector *connector)
    return modes;
    }

    +static void
    +nouveau_connector_detect_depth(struct drm_connector *connector)
    +{
    + struct drm_nouveau_private *dev_priv = connector->dev->dev_private;
    + struct nouveau_connector *nv_connector = nouveau_connector(connector);
    + struct nouveau_encoder *nv_encoder = nv_connector->detected_encoder;
    + struct nvbios *bios = &dev_priv->vbios;
    + struct drm_display_mode *mode = nv_connector->native_mode;
    + bool duallink;
    +
    + /* if the edid is feeling nice enough to provide this info, use it */
    + if (nv_connector->edid && connector->display_info.bpc)
    + return;
    +
    + /* EDID 1.4 is *supposed* to be supported on eDP, but, Apple... */
    + if (nv_connector->dcb->type == DCB_CONNECTOR_eDP) {
    + connector->display_info.bpc = 6;
    + return;
    + }
    +
    + /* we're out of options unless we're LVDS, default to 8bpc */
    + if (nv_encoder->dcb->type != OUTPUT_LVDS) {
    + connector->display_info.bpc = 8;
    + return;
    + }
    +
    + connector->display_info.bpc = 6;
    +
    + /* LVDS: panel straps */
    + if (bios->fp_no_ddc) {
    + if (bios->fp.if_is_24bit)
    + connector->display_info.bpc = 8;
    + return;
    + }
    +
    + /* LVDS: DDC panel, need to first determine the number of links to
    + * know which if_is_24bit flag to check...
    + */
    + if (nv_connector->edid &&
    + nv_connector->dcb->type == DCB_CONNECTOR_LVDS_SPWG)
    + duallink = ((u8 *)nv_connector->edid)[121] == 2;
    + else
    + duallink = mode->clock >= bios->fp.duallink_transition_clk;
    +
    + if ((!duallink && (bios->fp.strapless_is_24bit & 1)) ||
    + ( duallink && (bios->fp.strapless_is_24bit & 2)))
    + connector->display_info.bpc = 8;
    +}
    +
    static int
    nouveau_connector_get_modes(struct drm_connector *connector)
    {
    @@ -646,6 +695,12 @@ nouveau_connector_get_modes(struct drm_connector *connector)
    ret = 1;
    }

    + /* Attempt to determine display colour depth, this has to happen after
    + * we've determined the "native" mode for LVDS, as the VBIOS tables
    + * require us to compare against a pixel clock in some cases..
    + */
    + nouveau_connector_detect_depth(connector);
    +
    if (nv_encoder->dcb->type == OUTPUT_TV)
    ret = get_slave_funcs(encoder)->get_modes(encoder, connector);

    diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c
    index dac178b..931f4df 100644
    --- a/drivers/gpu/drm/radeon/evergreen.c
    +++ b/drivers/gpu/drm/radeon/evergreen.c
    @@ -2148,6 +2148,9 @@ static void evergreen_gpu_init(struct radeon_device *rdev)
    smx_dc_ctl0 |= NUMBER_OF_SETS(rdev->config.evergreen.sx_num_of_sets);
    WREG32(SMX_DC_CTL0, smx_dc_ctl0);

    + if (rdev->family <= CHIP_SUMO2)
    + WREG32(SMX_SAR_CTL0, 0x00010000);
    +
    WREG32(SX_EXPORT_BUFFER_SIZES, (COLOR_BUFFER_SIZE((rdev->config.evergreen.sx_max_export_size / 4) - 1) |
    POSITION_BUFFER_SIZE((rdev->config.evergreen.sx_max_export_pos_size / 4) - 1) |
    SMX_BUFFER_SIZE((rdev->config.evergreen.sx_max_export_smx_size / 4) - 1)));
    diff --git a/drivers/gpu/drm/radeon/evergreend.h b/drivers/gpu/drm/radeon/evergreend.h
    index 0128445..6ecd23f 100644
    --- a/drivers/gpu/drm/radeon/evergreend.h
    +++ b/drivers/gpu/drm/radeon/evergreend.h
    @@ -270,6 +270,7 @@
    #define SCRATCH_UMSK 0x8540
    #define SCRATCH_ADDR 0x8544

    +#define SMX_SAR_CTL0 0xA008
    #define SMX_DC_CTL0 0xA020
    #define USE_HASH_FUNCTION (1 << 0)
    #define NUMBER_OF_SETS(x) ((x) << 1)
    diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
    index 9cdda0b..bdfa82a 100644
    --- a/drivers/gpu/drm/radeon/r600.c
    +++ b/drivers/gpu/drm/radeon/r600.c
    @@ -1905,6 +1905,7 @@ void r600_gpu_init(struct radeon_device *rdev)
    WREG32(PA_CL_ENHANCE, (CLIP_VTX_REORDER_ENA |
    NUM_CLIP_SEQ(3)));
    WREG32(PA_SC_ENHANCE, FORCE_EOV_MAX_CLK_CNT(4095));
    + WREG32(VC_ENHANCE, 0);
    }


    diff --git a/drivers/gpu/drm/radeon/r600d.h b/drivers/gpu/drm/radeon/r600d.h
    index bfe1b5d..d4d23a8d 100644
    --- a/drivers/gpu/drm/radeon/r600d.h
    +++ b/drivers/gpu/drm/radeon/r600d.h
    @@ -461,6 +461,7 @@
    #define TC_L2_SIZE(x) ((x)<<5)
    #define L2_DISABLE_LATE_HIT (1<<9)

    +#define VC_ENHANCE 0x9714

    #define VGT_CACHE_INVALIDATION 0x88C4
    #define CACHE_INVALIDATION(x) ((x)<<0)
    diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c
    index e36ba7f..cc79449 100644
    --- a/drivers/gpu/drm/radeon/rv770.c
    +++ b/drivers/gpu/drm/radeon/rv770.c
    @@ -782,6 +782,9 @@ static void rv770_gpu_init(struct radeon_device *rdev)
    ACK_FLUSH_CTL(3) |
    SYNC_FLUSH_CTL));

    + if (rdev->family != CHIP_RV770)
    + WREG32(SMX_SAR_CTL0, 0x00003f3f);
    +
    db_debug3 = RREG32(DB_DEBUG3);
    db_debug3 &= ~DB_CLK_OFF_DELAY(0x1f);
    switch (rdev->family) {
    @@ -960,7 +963,7 @@ static void rv770_gpu_init(struct radeon_device *rdev)

    WREG32(PA_CL_ENHANCE, (CLIP_VTX_REORDER_ENA |
    NUM_CLIP_SEQ(3)));
    -
    + WREG32(VC_ENHANCE, 0);
    }

    void r700_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc)
    diff --git a/drivers/gpu/drm/radeon/rv770d.h b/drivers/gpu/drm/radeon/rv770d.h
    index 7538092..7095a71 100644
    --- a/drivers/gpu/drm/radeon/rv770d.h
    +++ b/drivers/gpu/drm/radeon/rv770d.h
    @@ -208,6 +208,7 @@
    #define SCRATCH_UMSK 0x8540
    #define SCRATCH_ADDR 0x8544

    +#define SMX_SAR_CTL0 0xA008
    #define SMX_DC_CTL0 0xA020
    #define USE_HASH_FUNCTION (1 << 0)
    #define CACHE_DEPTH(x) ((x) << 1)
    @@ -307,6 +308,8 @@
    #define TCP_CNTL 0x9610
    #define TCP_CHAN_STEER 0x9614

    +#define VC_ENHANCE 0x9714
    +
    #define VGT_CACHE_INVALIDATION 0x88C4
    #define CACHE_INVALIDATION(x) ((x)<<0)
    #define VC_ONLY 0
    diff --git a/drivers/hwmon/fam15h_power.c b/drivers/hwmon/fam15h_power.c
    index 9a4c3ab..e8e18ca 100644
    --- a/drivers/hwmon/fam15h_power.c
    +++ b/drivers/hwmon/fam15h_power.c
    @@ -61,14 +61,14 @@ static ssize_t show_power(struct device *dev,
    REG_TDP_RUNNING_AVERAGE, &val);
    running_avg_capture = (val >> 4) & 0x3fffff;
    running_avg_capture = sign_extend32(running_avg_capture, 21);
    - running_avg_range = val & 0xf;
    + running_avg_range = (val & 0xf) + 1;

    pci_bus_read_config_dword(f4->bus, PCI_DEVFN(PCI_SLOT(f4->devfn), 5),
    REG_TDP_LIMIT3, &val);

    tdp_limit = val >> 16;
    - curr_pwr_watts = tdp_limit + data->base_tdp -
    - (s32)(running_avg_capture >> (running_avg_range + 1));
    + curr_pwr_watts = (tdp_limit + data->base_tdp) << running_avg_range;
    + curr_pwr_watts -= running_avg_capture;
    curr_pwr_watts *= data->tdp_to_watts;

    /*
    @@ -78,7 +78,7 @@ static ssize_t show_power(struct device *dev,
    * scaling factor 1/(2^16). For conversion we use
    * (10^6)/(2^16) = 15625/(2^10)
    */
    - curr_pwr_watts = (curr_pwr_watts * 15625) >> 10;
    + curr_pwr_watts = (curr_pwr_watts * 15625) >> (10 + running_avg_range);
    return sprintf(buf, "%u\n", (unsigned int) curr_pwr_watts);
    }
    static DEVICE_ATTR(power1_input, S_IRUGO, show_power, NULL);
    diff --git a/drivers/net/can/c_can/c_can.c b/drivers/net/can/c_can/c_can.c
    index 536bda0..8dc84d6 100644
    --- a/drivers/net/can/c_can/c_can.c
    +++ b/drivers/net/can/c_can/c_can.c
    @@ -686,7 +686,7 @@ static int c_can_get_berr_counter(const struct net_device *dev,
    *
    * We iterate from priv->tx_echo to priv->tx_next and check if the
    * packet has been transmitted, echo it back to the CAN framework.
    - * If we discover a not yet transmitted package, stop looking for more.
    + * If we discover a not yet transmitted packet, stop looking for more.
    */
    static void c_can_do_tx(struct net_device *dev)
    {
    @@ -698,7 +698,7 @@ static void c_can_do_tx(struct net_device *dev)
    for (/* nix */; (priv->tx_next - priv->tx_echo) > 0; priv->tx_echo++) {
    msg_obj_no = get_tx_echo_msg_obj(priv);
    val = c_can_read_reg32(priv, &priv->regs->txrqst1);
    - if (!(val & (1 << msg_obj_no))) {
    + if (!(val & (1 << (msg_obj_no - 1)))) {
    can_get_echo_skb(dev,
    msg_obj_no - C_CAN_MSG_OBJ_TX_FIRST);
    stats->tx_bytes += priv->read_reg(priv,
    @@ -706,6 +706,8 @@ static void c_can_do_tx(struct net_device *dev)
    & IF_MCONT_DLC_MASK;
    stats->tx_packets++;
    c_can_inval_msg_object(dev, 0, msg_obj_no);
    + } else {
    + break;
    }
    }

    @@ -950,7 +952,7 @@ static int c_can_poll(struct napi_struct *napi, int quota)
    struct net_device *dev = napi->dev;
    struct c_can_priv *priv = netdev_priv(dev);

    - irqstatus = priv->read_reg(priv, &priv->regs->interrupt);
    + irqstatus = priv->irqstatus;
    if (!irqstatus)
    goto end;

    @@ -1028,12 +1030,11 @@ end:

    static irqreturn_t c_can_isr(int irq, void *dev_id)
    {
    - u16 irqstatus;
    struct net_device *dev = (struct net_device *)dev_id;
    struct c_can_priv *priv = netdev_priv(dev);

    - irqstatus = priv->read_reg(priv, &priv->regs->interrupt);
    - if (!irqstatus)
    + priv->irqstatus = priv->read_reg(priv, &priv->regs->interrupt);
    + if (!priv->irqstatus)
    return IRQ_NONE;

    /* disable all interrupts and schedule the NAPI */
    @@ -1063,10 +1064,11 @@ static int c_can_open(struct net_device *dev)
    goto exit_irq_fail;
    }

    + napi_enable(&priv->napi);
    +
    /* start the c_can controller */
    c_can_start(dev);

    - napi_enable(&priv->napi);
    netif_start_queue(dev);

    return 0;
    diff --git a/drivers/net/can/c_can/c_can.h b/drivers/net/can/c_can/c_can.h
    index 9b7fbef..5f32d34 100644
    --- a/drivers/net/can/c_can/c_can.h
    +++ b/drivers/net/can/c_can/c_can.h
    @@ -76,6 +76,7 @@ struct c_can_priv {
    unsigned int tx_next;
    unsigned int tx_echo;
    void *priv; /* for board-specific data */
    + u16 irqstatus;
    };

    struct net_device *alloc_c_can_dev(void);
    diff --git a/drivers/net/usb/sierra_net.c b/drivers/net/usb/sierra_net.c
    index ed1b432..864448b 100644
    --- a/drivers/net/usb/sierra_net.c
    +++ b/drivers/net/usb/sierra_net.c
    @@ -943,7 +943,7 @@ struct sk_buff *sierra_net_tx_fixup(struct usbnet *dev, struct sk_buff *skb,
    }

    static const u8 sierra_net_ifnum_list[] = { 7, 10, 11 };
    -static const struct sierra_net_info_data sierra_net_info_data_68A3 = {
    +static const struct sierra_net_info_data sierra_net_info_data_direct_ip = {
    .rx_urb_size = 8 * 1024,
    .whitelist = {
    .infolen = ARRAY_SIZE(sierra_net_ifnum_list),
    @@ -951,7 +951,7 @@ static const struct sierra_net_info_data sierra_net_info_data_68A3 = {
    }
    };

    -static const struct driver_info sierra_net_info_68A3 = {
    +static const struct driver_info sierra_net_info_direct_ip = {
    .description = "Sierra Wireless USB-to-WWAN Modem",
    .flags = FLAG_WWAN | FLAG_SEND_ZLP,
    .bind = sierra_net_bind,
    @@ -959,12 +959,18 @@ static const struct driver_info sierra_net_info_68A3 = {
    .status = sierra_net_status,
    .rx_fixup = sierra_net_rx_fixup,
    .tx_fixup = sierra_net_tx_fixup,
    - .data = (unsigned long)&sierra_net_info_data_68A3,
    + .data = (unsigned long)&sierra_net_info_data_direct_ip,
    };

    static const struct usb_device_id products[] = {
    {USB_DEVICE(0x1199, 0x68A3), /* Sierra Wireless USB-to-WWAN modem */
    - .driver_info = (unsigned long) &sierra_net_info_68A3},
    + .driver_info = (unsigned long) &sierra_net_info_direct_ip},
    + {USB_DEVICE(0x0F3D, 0x68A3), /* AT&T Direct IP modem */
    + .driver_info = (unsigned long) &sierra_net_info_direct_ip},
    + {USB_DEVICE(0x1199, 0x68AA), /* Sierra Wireless Direct IP LTE modem */
    + .driver_info = (unsigned long) &sierra_net_info_direct_ip},
    + {USB_DEVICE(0x0F3D, 0x68AA), /* AT&T Direct IP LTE modem */
    + .driver_info = (unsigned long) &sierra_net_info_direct_ip},

    {}, /* last item */
    };
    diff --git a/drivers/net/wireless/iwlwifi/iwl-6000.c b/drivers/net/wireless/iwlwifi/iwl-6000.c
    index 0b9f797..9b6b010 100644
    --- a/drivers/net/wireless/iwlwifi/iwl-6000.c
    +++ b/drivers/net/wireless/iwlwifi/iwl-6000.c
    @@ -49,17 +49,20 @@
    #define IWL6000_UCODE_API_MAX 6
    #define IWL6050_UCODE_API_MAX 5
    #define IWL6000G2_UCODE_API_MAX 6
    +#define IWL6035_UCODE_API_MAX 6

    /* Oldest version we won't warn about */
    #define IWL6000_UCODE_API_OK 4
    #define IWL6000G2_UCODE_API_OK 5
    #define IWL6050_UCODE_API_OK 5
    #define IWL6000G2B_UCODE_API_OK 6
    +#define IWL6035_UCODE_API_OK 6

    /* Lowest firmware API version supported */
    #define IWL6000_UCODE_API_MIN 4
    #define IWL6050_UCODE_API_MIN 4
    -#define IWL6000G2_UCODE_API_MIN 4
    +#define IWL6000G2_UCODE_API_MIN 5
    +#define IWL6035_UCODE_API_MIN 6

    #define IWL6000_FW_PRE "iwlwifi-6000-"
    #define IWL6000_MODULE_FIRMWARE(api) IWL6000_FW_PRE __stringify(api) ".ucode"
    @@ -436,9 +439,24 @@ struct iwl_cfg iwl6030_2bg_cfg = {
    IWL_DEVICE_6030,
    };

    +#define IWL_DEVICE_6035 \
    + .fw_name_pre = IWL6030_FW_PRE, \
    + .ucode_api_max = IWL6035_UCODE_API_MAX, \
    + .ucode_api_ok = IWL6035_UCODE_API_OK, \
    + .ucode_api_min = IWL6035_UCODE_API_MIN, \
    + .eeprom_ver = EEPROM_6030_EEPROM_VERSION, \
    + .eeprom_calib_ver = EEPROM_6030_TX_POWER_VERSION, \
    + .lib = &iwl6030_lib, \
    + .base_params = &iwl6000_g2_base_params, \
    + .bt_params = &iwl6000_bt_params, \
    + .need_dc_calib = true, \
    + .need_temp_offset_calib = true, \
    + .led_mode = IWL_LED_RF_STATE, \
    + .adv_pm = true
    +
    struct iwl_cfg iwl6035_2agn_cfg = {
    .name = "6035 Series 2x2 AGN/BT",
    - IWL_DEVICE_6030,
    + IWL_DEVICE_6035,
    .ht_params = &iwl6000_ht_params,
    };

    diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-sta.c b/drivers/net/wireless/iwlwifi/iwl-agn-sta.c
    index 5cfb3d1..ccf1524 100644
    --- a/drivers/net/wireless/iwlwifi/iwl-agn-sta.c
    +++ b/drivers/net/wireless/iwlwifi/iwl-agn-sta.c
    @@ -1245,7 +1245,7 @@ int iwl_remove_dynamic_key(struct iwl_priv *priv,
    key_flags |= STA_KEY_MULTICAST_MSK;

    sta_cmd.key.key_flags = key_flags;
    - sta_cmd.key.key_offset = WEP_INVALID_OFFSET;
    + sta_cmd.key.key_offset = keyconf->hw_key_idx;
    sta_cmd.sta.modify_mask = STA_MODIFY_KEY_MASK;
    sta_cmd.mode = STA_CONTROL_MODIFY_MSK;

    diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
    index d7d2512..16cdd12 100644
    --- a/drivers/net/wireless/iwlwifi/iwl-agn.c
    +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
    @@ -1696,6 +1696,7 @@ static int iwlagn_mac_setup_register(struct iwl_priv *priv,
    WIPHY_FLAG_DISABLE_BEACON_HINTS |
    WIPHY_FLAG_IBSS_RSN;

    +#ifdef CONFIG_PM_SLEEP
    if (priv->ucode_wowlan.code.len && device_can_wakeup(bus(priv)->dev)) {
    hw->wiphy->wowlan.flags = WIPHY_WOWLAN_MAGIC_PKT |
    WIPHY_WOWLAN_DISCONNECT |
    @@ -1712,6 +1713,7 @@ static int iwlagn_mac_setup_register(struct iwl_priv *priv,
    hw->wiphy->wowlan.pattern_max_len =
    IWLAGN_WOWLAN_MAX_PATTERN_LEN;
    }
    +#endif

    if (iwlagn_mod_params.power_save)
    hw->wiphy->flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT;
    @@ -1739,6 +1741,7 @@ static int iwlagn_mac_setup_register(struct iwl_priv *priv,
    ret = ieee80211_register_hw(priv->hw);
    if (ret) {
    IWL_ERR(priv, "Failed to register hw (error %d)\n", ret);
    + iwl_leds_exit(priv);
    return ret;
    }
    priv->mac80211_registered = 1;
    diff --git a/drivers/net/wireless/iwlwifi/iwl-prph.h b/drivers/net/wireless/iwlwifi/iwl-prph.h
    index d9b089e..0683006 100644
    --- a/drivers/net/wireless/iwlwifi/iwl-prph.h
    +++ b/drivers/net/wireless/iwlwifi/iwl-prph.h
    @@ -228,6 +228,7 @@
    #define SCD_TXFACT (SCD_BASE + 0x10)
    #define SCD_ACTIVE (SCD_BASE + 0x14)
    #define SCD_QUEUECHAIN_SEL (SCD_BASE + 0xe8)
    +#define SCD_CHAINEXT_EN (SCD_BASE + 0x244)
    #define SCD_AGGR_SEL (SCD_BASE + 0x248)
    #define SCD_INTERRUPT_MASK (SCD_BASE + 0x108)

    diff --git a/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c b/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c
    index 5f17ab8..2f201cf 100644
    --- a/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c
    +++ b/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c
    @@ -868,6 +868,11 @@ static void iwl_trans_pcie_tx_start(struct iwl_trans *trans)
    iwl_write_prph(bus(trans), SCD_DRAM_BASE_ADDR,
    trans_pcie->scd_bc_tbls.dma >> 10);

    + /* The chain extension of the SCD doesn't work well. This feature is
    + * enabled by default by the HW, so we need to disable it manually.
    + */
    + iwl_write_prph(trans, SCD_CHAINEXT_EN, 0);
    +
    /* Enable DMA channel */
    for (chan = 0; chan < FH_TCSR_CHNL_NUM ; chan++)
    iwl_write_direct32(bus(trans), FH_TCSR_CHNL_TX_CONFIG_REG(chan),
    diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h
    index 99ff12d..c778164 100644
    --- a/drivers/net/wireless/rt2x00/rt2x00.h
    +++ b/drivers/net/wireless/rt2x00/rt2x00.h
    @@ -390,8 +390,7 @@ struct rt2x00_intf {
    * for hardware which doesn't support hardware
    * sequence counting.
    */
    - spinlock_t seqlock;
    - u16 seqno;
    + atomic_t seqno;
    };

    static inline struct rt2x00_intf* vif_to_intf(struct ieee80211_vif *vif)
    diff --git a/drivers/net/wireless/rt2x00/rt2x00mac.c b/drivers/net/wireless/rt2x00/rt2x00mac.c
    index 373dae1..921da9a 100644
    --- a/drivers/net/wireless/rt2x00/rt2x00mac.c
    +++ b/drivers/net/wireless/rt2x00/rt2x00mac.c
    @@ -277,7 +277,6 @@ int rt2x00mac_add_interface(struct ieee80211_hw *hw,
    else
    rt2x00dev->intf_sta_count++;

    - spin_lock_init(&intf->seqlock);
    mutex_init(&intf->beacon_skb_mutex);
    intf->beacon = entry;

    diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c
    index 9b1b2b7..50f92d5 100644
    --- a/drivers/net/wireless/rt2x00/rt2x00queue.c
    +++ b/drivers/net/wireless/rt2x00/rt2x00queue.c
    @@ -207,6 +207,7 @@ static void rt2x00queue_create_tx_descriptor_seq(struct rt2x00_dev *rt2x00dev,
    struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
    struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
    struct rt2x00_intf *intf = vif_to_intf(tx_info->control.vif);
    + u16 seqno;

    if (!(tx_info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ))
    return;
    @@ -227,15 +228,13 @@ static void rt2x00queue_create_tx_descriptor_seq(struct rt2x00_dev *rt2x00dev,
    * sequence counting per-frame, since those will override the
    * sequence counter given by mac80211.
    */
    - spin_lock(&intf->seqlock);
    -
    if (test_bit(ENTRY_TXD_FIRST_FRAGMENT, &txdesc->flags))
    - intf->seqno += 0x10;
    - hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG);
    - hdr->seq_ctrl |= cpu_to_le16(intf->seqno);
    -
    - spin_unlock(&intf->seqlock);
    + seqno = atomic_add_return(0x10, &intf->seqno);
    + else
    + seqno = atomic_read(&intf->seqno);

    + hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG);
    + hdr->seq_ctrl |= cpu_to_le16(seqno);
    }

    static void rt2x00queue_create_tx_descriptor_plcp(struct rt2x00_dev *rt2x00dev,
    diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
    index 6d4a531..e5b75eb 100644
    --- a/drivers/pci/pci.c
    +++ b/drivers/pci/pci.c
    @@ -1689,6 +1689,11 @@ int pci_prepare_to_sleep(struct pci_dev *dev)
    if (target_state == PCI_POWER_ERROR)
    return -EIO;

    + /* Some devices mustn't be in D3 during system sleep */
    + if (target_state == PCI_D3hot &&
    + (dev->dev_flags & PCI_DEV_FLAGS_NO_D3_DURING_SLEEP))
    + return 0;
    +
    pci_enable_wake(dev, target_state, device_may_wakeup(&dev->dev));

    error = pci_set_power_state(dev, target_state);
    diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
    index 78fda9c..3c56fec 100644
    --- a/drivers/pci/quirks.c
    +++ b/drivers/pci/quirks.c
    @@ -2940,6 +2940,32 @@ static void __devinit disable_igfx_irq(struct pci_dev *dev)
    DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x0102, disable_igfx_irq);
    DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x010a, disable_igfx_irq);

    +/*
    + * The Intel 6 Series/C200 Series chipset's EHCI controllers on many
    + * ASUS motherboards will cause memory corruption or a system crash
    + * if they are in D3 while the system is put into S3 sleep.
    + */
    +static void __devinit asus_ehci_no_d3(struct pci_dev *dev)
    +{
    + const char *sys_info;
    + static const char good_Asus_board[] = "P8Z68-V";
    +
    + if (dev->dev_flags & PCI_DEV_FLAGS_NO_D3_DURING_SLEEP)
    + return;
    + if (dev->subsystem_vendor != PCI_VENDOR_ID_ASUSTEK)
    + return;
    + sys_info = dmi_get_system_info(DMI_BOARD_NAME);
    + if (sys_info && memcmp(sys_info, good_Asus_board,
    + sizeof(good_Asus_board) - 1) == 0)
    + return;
    +
    + dev_info(&dev->dev, "broken D3 during system sleep on ASUS\n");
    + dev->dev_flags |= PCI_DEV_FLAGS_NO_D3_DURING_SLEEP;
    + device_set_wakeup_capable(&dev->dev, false);
    +}
    +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1c26, asus_ehci_no_d3);
    +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1c2d, asus_ehci_no_d3);
    +
    static void pci_do_fixups(struct pci_dev *dev, struct pci_fixup *f,
    struct pci_fixup *end)
    {
    diff --git a/drivers/scsi/mpt2sas/mpt2sas_base.c b/drivers/scsi/mpt2sas/mpt2sas_base.c
    index ac336e1..e903077 100644
    --- a/drivers/scsi/mpt2sas/mpt2sas_base.c
    +++ b/drivers/scsi/mpt2sas/mpt2sas_base.c
    @@ -1739,7 +1739,7 @@ static inline void _base_writeq(__u64 b, volatile void __iomem *addr,
    static inline u8
    _base_get_msix_index(struct MPT2SAS_ADAPTER *ioc)
    {
    - return ioc->cpu_msix_table[smp_processor_id()];
    + return ioc->cpu_msix_table[raw_smp_processor_id()];
    }

    /**
    diff --git a/drivers/target/target_core_alua.c b/drivers/target/target_core_alua.c
    index 5b05744..0364ca2 100644
    --- a/drivers/target/target_core_alua.c
    +++ b/drivers/target/target_core_alua.c
    @@ -352,9 +352,11 @@ int target_emulate_set_target_port_groups(struct se_task *task)

    out:
    transport_kunmap_data_sg(cmd);
    - task->task_scsi_status = GOOD;
    - transport_complete_task(task, 1);
    - return 0;
    + if (!rc) {
    + task->task_scsi_status = GOOD;
    + transport_complete_task(task, 1);
    + }
    + return rc;
    }

    static inline int core_alua_state_nonoptimized(
    diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
    index e61d9c4..1094469 100644
    --- a/drivers/usb/class/cdc-acm.c
    +++ b/drivers/usb/class/cdc-acm.c
    @@ -498,6 +498,14 @@ static int acm_tty_open(struct tty_struct *tty, struct file *filp)

    usb_autopm_put_interface(acm->control);

    + /*
    + * Unthrottle device in case the TTY was closed while throttled.
    + */
    + spin_lock_irq(&acm->read_lock);
    + acm->throttled = 0;
    + acm->throttle_req = 0;
    + spin_unlock_irq(&acm->read_lock);
    +
    if (acm_submit_read_urbs(acm, GFP_KERNEL))
    goto bail_out;

    diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c
    index 554ac90..1bc00a2 100644
    --- a/drivers/usb/class/cdc-wdm.c
    +++ b/drivers/usb/class/cdc-wdm.c
    @@ -31,6 +31,8 @@
    #define DRIVER_AUTHOR "Oliver Neukum"
    #define DRIVER_DESC "USB Abstract Control Model driver for USB WCM Device Management"

    +#define HUAWEI_VENDOR_ID 0x12D1
    +
    static const struct usb_device_id wdm_ids[] = {
    {
    .match_flags = USB_DEVICE_ID_MATCH_INT_CLASS |
    @@ -38,6 +40,29 @@ static const struct usb_device_id wdm_ids[] = {
    .bInterfaceClass = USB_CLASS_COMM,
    .bInterfaceSubClass = USB_CDC_SUBCLASS_DMM
    },
    + {
    + /*
    + * Huawei E392, E398 and possibly other Qualcomm based modems
    + * embed the Qualcomm QMI protocol inside CDC on CDC ECM like
    + * control interfaces. Userspace access to this is required
    + * to configure the accompanying data interface
    + */
    + .match_flags = USB_DEVICE_ID_MATCH_VENDOR |
    + USB_DEVICE_ID_MATCH_INT_INFO,
    + .idVendor = HUAWEI_VENDOR_ID,
    + .bInterfaceClass = USB_CLASS_VENDOR_SPEC,
    + .bInterfaceSubClass = 1,
    + .bInterfaceProtocol = 9, /* NOTE: CDC ECM control interface! */
    + },
    + {
    + /* Vodafone/Huawei K5005 (12d1:14c8) and similar modems */
    + .match_flags = USB_DEVICE_ID_MATCH_VENDOR |
    + USB_DEVICE_ID_MATCH_INT_INFO,
    + .idVendor = HUAWEI_VENDOR_ID,
    + .bInterfaceClass = USB_CLASS_VENDOR_SPEC,
    + .bInterfaceSubClass = 1,
    + .bInterfaceProtocol = 57, /* NOTE: CDC ECM control interface! */
    + },
    { }
    };

    diff --git a/drivers/usb/core/hcd-pci.c b/drivers/usb/core/hcd-pci.c
    index 5f1404a..61d08dd 100644
    --- a/drivers/usb/core/hcd-pci.c
    +++ b/drivers/usb/core/hcd-pci.c
    @@ -495,15 +495,6 @@ static int hcd_pci_suspend_noirq(struct device *dev)

    pci_save_state(pci_dev);

    - /*
    - * Some systems crash if an EHCI controller is in D3 during
    - * a sleep transition. We have to leave such controllers in D0.
    - */
    - if (hcd->broken_pci_sleep) {
    - dev_dbg(dev, "Staying in PCI D0\n");
    - return retval;
    - }
    -
    /* If the root hub is dead rather than suspended, disallow remote
    * wakeup. usb_hc_died() should ensure that both hosts are marked as
    * dying, so we only need to check the primary roothub.
    diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c
    index ca717da..ef116a5 100644
    --- a/drivers/usb/core/message.c
    +++ b/drivers/usb/core/message.c
    @@ -1803,7 +1803,6 @@ free_interfaces:
    intfc = cp->intf_cache[i];
    intf->altsetting = intfc->altsetting;
    intf->num_altsetting = intfc->num_altsetting;
    - intf->intf_assoc = find_iad(dev, cp, i);
    kref_get(&intfc->ref);

    alt = usb_altnum_to_altsetting(intf, 0);
    @@ -1816,6 +1815,8 @@ free_interfaces:
    if (!alt)
    alt = &intf->altsetting[0];

    + intf->intf_assoc =
    + find_iad(dev, cp, alt->desc.bInterfaceNumber);
    intf->cur_altsetting = alt;
    usb_enable_interface(dev, intf, true);
    intf->dev.parent = &dev->dev;
    diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
    index da2f711..339be10 100644
    --- a/drivers/usb/host/ehci-hcd.c
    +++ b/drivers/usb/host/ehci-hcd.c
    @@ -620,6 +620,9 @@ static int ehci_init(struct usb_hcd *hcd)
    hw = ehci->async->hw;
    hw->hw_next = QH_NEXT(ehci, ehci->async->qh_dma);
    hw->hw_info1 = cpu_to_hc32(ehci, QH_HEAD);
    +#if defined(CONFIG_PPC_PS3)
    + hw->hw_info1 |= cpu_to_hc32(ehci, (1 << 7)); /* I = 1 */
    +#endif
    hw->hw_token = cpu_to_hc32(ehci, QTD_STS_HALT);
    hw->hw_qtd_next = EHCI_LIST_END(ehci);
    ehci->async->qh_state = QH_STATE_LINKED;
    diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c
    index ee85e81..a79e64b 100644
    --- a/drivers/usb/host/ehci-pci.c
    +++ b/drivers/usb/host/ehci-pci.c
    @@ -144,14 +144,6 @@ static int ehci_pci_setup(struct usb_hcd *hcd)
    hcd->has_tt = 1;
    tdi_reset(ehci);
    }
    - if (pdev->subsystem_vendor == PCI_VENDOR_ID_ASUSTEK) {
    - /* EHCI #1 or #2 on 6 Series/C200 Series chipset */
    - if (pdev->device == 0x1c26 || pdev->device == 0x1c2d) {
    - ehci_info(ehci, "broken D3 during system sleep on ASUS\n");
    - hcd->broken_pci_sleep = 1;
    - device_set_wakeup_capable(&pdev->dev, false);
    - }
    - }
    break;
    case PCI_VENDOR_ID_TDI:
    if (pdev->device == PCI_DEVICE_ID_TDI_EHCI) {
    diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c
    index 4232e868..a40ab98 100644
    --- a/drivers/usb/host/xhci-mem.c
    +++ b/drivers/usb/host/xhci-mem.c
    @@ -693,10 +693,9 @@ static void xhci_free_tt_info(struct xhci_hcd *xhci,
    struct xhci_virt_device *virt_dev,
    int slot_id)
    {
    - struct list_head *tt;
    struct list_head *tt_list_head;
    - struct list_head *tt_next;
    - struct xhci_tt_bw_info *tt_info;
    + struct xhci_tt_bw_info *tt_info, *next;
    + bool slot_found = false;

    /* If the device never made it past the Set Address stage,
    * it may not have the real_port set correctly.
    @@ -708,34 +707,16 @@ static void xhci_free_tt_info(struct xhci_hcd *xhci,
    }

    tt_list_head = &(xhci->rh_bw[virt_dev->real_port - 1].tts);
    - if (list_empty(tt_list_head))
    - return;
    -
    - list_for_each(tt, tt_list_head) {
    - tt_info = list_entry(tt, struct xhci_tt_bw_info, tt_list);
    - if (tt_info->slot_id == slot_id)
    + list_for_each_entry_safe(tt_info, next, tt_list_head, tt_list) {
    + /* Multi-TT hubs will have more than one entry */
    + if (tt_info->slot_id == slot_id) {
    + slot_found = true;
    + list_del(&tt_info->tt_list);
    + kfree(tt_info);
    + } else if (slot_found) {
    break;
    + }
    }
    - /* Cautionary measure in case the hub was disconnected before we
    - * stored the TT information.
    - */
    - if (tt_info->slot_id != slot_id)
    - return;
    -
    - tt_next = tt->next;
    - tt_info = list_entry(tt, struct xhci_tt_bw_info,
    - tt_list);
    - /* Multi-TT hubs will have more than one entry */
    - do {
    - list_del(tt);
    - kfree(tt_info);
    - tt = tt_next;
    - if (list_empty(tt_list_head))
    - break;
    - tt_next = tt->next;
    - tt_info = list_entry(tt, struct xhci_tt_bw_info,
    - tt_list);
    - } while (tt_info->slot_id == slot_id);
    }

    int xhci_alloc_tt_info(struct xhci_hcd *xhci,
    @@ -1699,17 +1680,9 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci)
    {
    struct pci_dev *pdev = to_pci_dev(xhci_to_hcd(xhci)->self.controller);
    struct dev_info *dev_info, *next;
    - struct list_head *tt_list_head;
    - struct list_head *tt;
    - struct list_head *endpoints;
    - struct list_head *ep, *q;
    - struct xhci_tt_bw_info *tt_info;
    - struct xhci_interval_bw_table *bwt;
    - struct xhci_virt_ep *virt_ep;
    -
    unsigned long flags;
    int size;
    - int i;
    + int i, j, num_ports;

    /* Free the Event Ring Segment Table and the actual Event Ring */
    size = sizeof(struct xhci_erst_entry)*(xhci->erst.num_entries);
    @@ -1766,21 +1739,22 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci)
    }
    spin_unlock_irqrestore(&xhci->lock, flags);

    - bwt = &xhci->rh_bw->bw_table;
    - for (i = 0; i < XHCI_MAX_INTERVAL; i++) {
    - endpoints = &bwt->interval_bw[i].endpoints;
    - list_for_each_safe(ep, q, endpoints) {
    - virt_ep = list_entry(ep, struct xhci_virt_ep, bw_endpoint_list);
    - list_del(&virt_ep->bw_endpoint_list);
    - kfree(virt_ep);
    + num_ports = HCS_MAX_PORTS(xhci->hcs_params1);
    + for (i = 0; i < num_ports; i++) {
    + struct xhci_interval_bw_table *bwt = &xhci->rh_bw[i].bw_table;
    + for (j = 0; j < XHCI_MAX_INTERVAL; j++) {
    + struct list_head *ep = &bwt->interval_bw[j].endpoints;
    + while (!list_empty(ep))
    + list_del_init(ep->next);
    }
    }

    - tt_list_head = &xhci->rh_bw->tts;
    - list_for_each_safe(tt, q, tt_list_head) {
    - tt_info = list_entry(tt, struct xhci_tt_bw_info, tt_list);
    - list_del(tt);
    - kfree(tt_info);
    + for (i = 0; i < num_ports; i++) {
    + struct xhci_tt_bw_info *tt, *n;
    + list_for_each_entry_safe(tt, n, &xhci->rh_bw[i].tts, tt_list) {
    + list_del(&tt->tt_list);
    + kfree(tt);
    + }
    }

    xhci->num_usb2_ports = 0;
    diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
    index 4c00606..05f82e9 100644
    --- a/drivers/usb/host/xhci.c
    +++ b/drivers/usb/host/xhci.c
    @@ -783,8 +783,8 @@ int xhci_suspend(struct xhci_hcd *xhci)
    command = xhci_readl(xhci, &xhci->op_regs->command);
    command |= CMD_CSS;
    xhci_writel(xhci, command, &xhci->op_regs->command);
    - if (handshake(xhci, &xhci->op_regs->status, STS_SAVE, 0, 10*100)) {
    - xhci_warn(xhci, "WARN: xHC CMD_CSS timeout\n");
    + if (handshake(xhci, &xhci->op_regs->status, STS_SAVE, 0, 10 * 1000)) {
    + xhci_warn(xhci, "WARN: xHC save state timeout\n");
    spin_unlock_irq(&xhci->lock);
    return -ETIMEDOUT;
    }
    @@ -836,8 +836,8 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)
    command |= CMD_CRS;
    xhci_writel(xhci, command, &xhci->op_regs->command);
    if (handshake(xhci, &xhci->op_regs->status,
    - STS_RESTORE, 0, 10*100)) {
    - xhci_dbg(xhci, "WARN: xHC CMD_CSS timeout\n");
    + STS_RESTORE, 0, 10 * 1000)) {
    + xhci_warn(xhci, "WARN: xHC restore state timeout\n");
    spin_unlock_irq(&xhci->lock);
    return -ETIMEDOUT;
    }
    diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c
    index c860597..9c8845a 100644
    --- a/drivers/usb/musb/musb_gadget.c
    +++ b/drivers/usb/musb/musb_gadget.c
    @@ -1234,6 +1234,7 @@ static int musb_gadget_disable(struct usb_ep *ep)
    }

    musb_ep->desc = NULL;
    + musb_ep->end_point.desc = NULL;

    /* abort all pending DMA and requests */
    nuke(musb_ep, -ESHUTDOWN);
    diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c
    index f2c57e0..aa0c43f 100644
    --- a/drivers/usb/serial/cp210x.c
    +++ b/drivers/usb/serial/cp210x.c
    @@ -82,6 +82,7 @@ static const struct usb_device_id id_table[] = {
    { USB_DEVICE(0x10C4, 0x8066) }, /* Argussoft In-System Programmer */
    { USB_DEVICE(0x10C4, 0x806F) }, /* IMS USB to RS422 Converter Cable */
    { USB_DEVICE(0x10C4, 0x807A) }, /* Crumb128 board */
    + { USB_DEVICE(0x10C4, 0x80C4) }, /* Cygnal Integrated Products, Inc., Optris infrared thermometer */
    { USB_DEVICE(0x10C4, 0x80CA) }, /* Degree Controls Inc */
    { USB_DEVICE(0x10C4, 0x80DD) }, /* Tracient RFID */
    { USB_DEVICE(0x10C4, 0x80F6) }, /* Suunto sports instrument */
    diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
    index 450bdfe..4045e39 100644
    --- a/drivers/usb/serial/ftdi_sio.c
    +++ b/drivers/usb/serial/ftdi_sio.c
    @@ -737,6 +737,7 @@ static struct usb_device_id id_table_combined [] = {
    { USB_DEVICE(TELLDUS_VID, TELLDUS_TELLSTICK_PID) },
    { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_SERIAL_VX7_PID) },
    { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_CT29B_PID) },
    + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_RTS01_PID) },
    { USB_DEVICE(FTDI_VID, FTDI_MAXSTREAM_PID) },
    { USB_DEVICE(FTDI_VID, FTDI_PHI_FISCO_PID) },
    { USB_DEVICE(TML_VID, TML_USB_SERIAL_PID) },
    diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h
    index 219b199..d27d7d7 100644
    --- a/drivers/usb/serial/ftdi_sio_ids.h
    +++ b/drivers/usb/serial/ftdi_sio_ids.h
    @@ -784,6 +784,7 @@
    #define RTSYSTEMS_VID 0x2100 /* Vendor ID */
    #define RTSYSTEMS_SERIAL_VX7_PID 0x9e52 /* Serial converter for VX-7 Radios using FT232RL */
    #define RTSYSTEMS_CT29B_PID 0x9e54 /* CT29B Radio Cable */
    +#define RTSYSTEMS_RTS01_PID 0x9e57 /* USB-RTS01 Radio Cable */


    /*
    diff --git a/drivers/usb/serial/mct_u232.c b/drivers/usb/serial/mct_u232.c
    index ba0d287..42de17b 100644
    --- a/drivers/usb/serial/mct_u232.c
    +++ b/drivers/usb/serial/mct_u232.c
    @@ -359,13 +359,16 @@ static int mct_u232_set_modem_ctrl(struct usb_serial *serial,
    MCT_U232_SET_REQUEST_TYPE,
    0, 0, buf, MCT_U232_SET_MODEM_CTRL_SIZE,
    WDR_TIMEOUT);
    - if (rc < 0)
    - dev_err(&serial->dev->dev,
    - "Set MODEM CTRL 0x%x failed (error = %d)\n", mcr, rc);
    + kfree(buf);
    +
    dbg("set_modem_ctrl: state=0x%x ==> mcr=0x%x", control_state, mcr);

    - kfree(buf);
    - return rc;
    + if (rc < 0) {
    + dev_err(&serial->dev->dev,
    + "Set MODEM CTRL 0x%x failed (error = %d)\n", mcr, rc);
    + return rc;
    + }
    + return 0;
    } /* mct_u232_set_modem_ctrl */

    static int mct_u232_get_modem_stat(struct usb_serial *serial,
    diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
    index cbe3451..ce02457 100644
    --- a/drivers/usb/serial/option.c
    +++ b/drivers/usb/serial/option.c
    @@ -47,6 +47,7 @@
    /* Function prototypes */
    static int option_probe(struct usb_serial *serial,
    const struct usb_device_id *id);
    +static void option_release(struct usb_serial *serial);
    static int option_send_setup(struct usb_serial_port *port);
    static void option_instat_callback(struct urb *urb);

    @@ -150,6 +151,7 @@ static void option_instat_callback(struct urb *urb);
    #define HUAWEI_PRODUCT_E14AC 0x14AC
    #define HUAWEI_PRODUCT_K3806 0x14AE
    #define HUAWEI_PRODUCT_K4605 0x14C6
    +#define HUAWEI_PRODUCT_K5005 0x14C8
    #define HUAWEI_PRODUCT_K3770 0x14C9
    #define HUAWEI_PRODUCT_K3771 0x14CA
    #define HUAWEI_PRODUCT_K4510 0x14CB
    @@ -425,7 +427,7 @@ static void option_instat_callback(struct urb *urb);
    #define SAMSUNG_VENDOR_ID 0x04e8
    #define SAMSUNG_PRODUCT_GT_B3730 0x6889

    -/* YUGA products www.yuga-info.com*/
    +/* YUGA products www.yuga-info.com gavin.kx@qq.com */
    #define YUGA_VENDOR_ID 0x257A
    #define YUGA_PRODUCT_CEM600 0x1601
    #define YUGA_PRODUCT_CEM610 0x1602
    @@ -442,6 +444,8 @@ static void option_instat_callback(struct urb *urb);
    #define YUGA_PRODUCT_CEU516 0x160C
    #define YUGA_PRODUCT_CEU528 0x160D
    #define YUGA_PRODUCT_CEU526 0x160F
    +#define YUGA_PRODUCT_CEU881 0x161F
    +#define YUGA_PRODUCT_CEU882 0x162F

    #define YUGA_PRODUCT_CWM600 0x2601
    #define YUGA_PRODUCT_CWM610 0x2602
    @@ -457,23 +461,26 @@ static void option_instat_callback(struct urb *urb);
    #define YUGA_PRODUCT_CWU518 0x260B
    #define YUGA_PRODUCT_CWU516 0x260C
    #define YUGA_PRODUCT_CWU528 0x260D
    +#define YUGA_PRODUCT_CWU581 0x260E
    #define YUGA_PRODUCT_CWU526 0x260F
    -
    -#define YUGA_PRODUCT_CLM600 0x2601
    -#define YUGA_PRODUCT_CLM610 0x2602
    -#define YUGA_PRODUCT_CLM500 0x2603
    -#define YUGA_PRODUCT_CLM510 0x2604
    -#define YUGA_PRODUCT_CLM800 0x2605
    -#define YUGA_PRODUCT_CLM900 0x2606
    -
    -#define YUGA_PRODUCT_CLU718 0x2607
    -#define YUGA_PRODUCT_CLU716 0x2608
    -#define YUGA_PRODUCT_CLU728 0x2609
    -#define YUGA_PRODUCT_CLU726 0x260A
    -#define YUGA_PRODUCT_CLU518 0x260B
    -#define YUGA_PRODUCT_CLU516 0x260C
    -#define YUGA_PRODUCT_CLU528 0x260D
    -#define YUGA_PRODUCT_CLU526 0x260F
    +#define YUGA_PRODUCT_CWU582 0x261F
    +#define YUGA_PRODUCT_CWU583 0x262F
    +
    +#define YUGA_PRODUCT_CLM600 0x3601
    +#define YUGA_PRODUCT_CLM610 0x3602
    +#define YUGA_PRODUCT_CLM500 0x3603
    +#define YUGA_PRODUCT_CLM510 0x3604
    +#define YUGA_PRODUCT_CLM800 0x3605
    +#define YUGA_PRODUCT_CLM900 0x3606
    +
    +#define YUGA_PRODUCT_CLU718 0x3607
    +#define YUGA_PRODUCT_CLU716 0x3608
    +#define YUGA_PRODUCT_CLU728 0x3609
    +#define YUGA_PRODUCT_CLU726 0x360A
    +#define YUGA_PRODUCT_CLU518 0x360B
    +#define YUGA_PRODUCT_CLU516 0x360C
    +#define YUGA_PRODUCT_CLU528 0x360D
    +#define YUGA_PRODUCT_CLU526 0x360F

    /* Viettel products */
    #define VIETTEL_VENDOR_ID 0x2262
    @@ -666,6 +673,11 @@ static const struct usb_device_id option_ids[] = {
    { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3806, 0xff, 0xff, 0xff) },
    { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4605, 0xff, 0xff, 0xff),
    .driver_info = (kernel_ulong_t) &huawei_cdc12_blacklist },
    + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4605, 0xff, 0x01, 0x31) },
    + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4605, 0xff, 0x01, 0x32) },
    + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K5005, 0xff, 0x01, 0x31) },
    + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K5005, 0xff, 0x01, 0x32) },
    + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K5005, 0xff, 0x01, 0x33) },
    { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3770, 0xff, 0x02, 0x31) },
    { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3770, 0xff, 0x02, 0x32) },
    { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3771, 0xff, 0x02, 0x31) },
    @@ -1207,6 +1219,11 @@ static const struct usb_device_id option_ids[] = {
    { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CLU516) },
    { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CLU528) },
    { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CLU526) },
    + { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CEU881) },
    + { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CEU882) },
    + { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CWU581) },
    + { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CWU582) },
    + { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CWU583) },
    { USB_DEVICE_AND_INTERFACE_INFO(VIETTEL_VENDOR_ID, VIETTEL_PRODUCT_VT1000, 0xff, 0xff, 0xff) },
    { USB_DEVICE_AND_INTERFACE_INFO(ZD_VENDOR_ID, ZD_PRODUCT_7000, 0xff, 0xff, 0xff) },
    { USB_DEVICE(LG_VENDOR_ID, LG_PRODUCT_L02C) }, /* docomo L-02C modem */
    @@ -1257,7 +1274,7 @@ static struct usb_serial_driver option_1port_device = {
    .ioctl = usb_wwan_ioctl,
    .attach = usb_wwan_startup,
    .disconnect = usb_wwan_disconnect,
    - .release = usb_wwan_release,
    + .release = option_release,
    .read_int_callback = option_instat_callback,
    #ifdef CONFIG_PM
    .suspend = usb_wwan_suspend,
    @@ -1267,35 +1284,6 @@ static struct usb_serial_driver option_1port_device = {

    static int debug;

    -/* per port private data */
    -
    -#define N_IN_URB 4
    -#define N_OUT_URB 4
    -#define IN_BUFLEN 4096
    -#define OUT_BUFLEN 4096
    -
    -struct option_port_private {
    - /* Input endpoints and buffer for this port */
    - struct urb *in_urbs[N_IN_URB];
    - u8 *in_buffer[N_IN_URB];
    - /* Output endpoints and buffer for this port */
    - struct urb *out_urbs[N_OUT_URB];
    - u8 *out_buffer[N_OUT_URB];
    - unsigned long out_busy; /* Bit vector of URBs in use */
    - int opened;
    - struct usb_anchor delayed;
    -
    - /* Settings for the port */
    - int rts_state; /* Handshaking pins (outputs) */
    - int dtr_state;
    - int cts_state; /* Handshaking pins (inputs) */
    - int dsr_state;
    - int dcd_state;
    - int ri_state;
    -
    - unsigned long tx_start_time[N_OUT_URB];
    -};
    -
    /* Functions used by new usb-serial code. */
    static int __init option_init(void)
    {
    @@ -1393,12 +1381,22 @@ static int option_probe(struct usb_serial *serial,
    return 0;
    }

    +static void option_release(struct usb_serial *serial)
    +{
    + struct usb_wwan_intf_private *priv = usb_get_serial_data(serial);
    +
    + usb_wwan_release(serial);
    +
    + kfree(priv);
    +}
    +
    static void option_instat_callback(struct urb *urb)
    {
    int err;
    int status = urb->status;
    struct usb_serial_port *port = urb->context;
    - struct option_port_private *portdata = usb_get_serial_port_data(port);
    + struct usb_wwan_port_private *portdata =
    + usb_get_serial_port_data(port);

    dbg("%s", __func__);
    dbg("%s: urb %p port %p has data %p", __func__, urb, port, portdata);
    @@ -1459,7 +1457,7 @@ static int option_send_setup(struct usb_serial_port *port)
    struct usb_serial *serial = port->serial;
    struct usb_wwan_intf_private *intfdata =
    (struct usb_wwan_intf_private *) serial->private;
    - struct option_port_private *portdata;
    + struct usb_wwan_port_private *portdata;
    int ifNum = serial->interface->cur_altsetting->desc.bInterfaceNumber;
    int val = 0;
    dbg("%s", __func__);
    diff --git a/drivers/usb/serial/qcserial.c b/drivers/usb/serial/qcserial.c
    index 3187d8b..6634477 100644
    --- a/drivers/usb/serial/qcserial.c
    +++ b/drivers/usb/serial/qcserial.c
    @@ -105,7 +105,13 @@ static const struct usb_device_id id_table[] = {
    {USB_DEVICE(0x1410, 0xa021)}, /* Novatel Gobi 3000 Composite */
    {USB_DEVICE(0x413c, 0x8193)}, /* Dell Gobi 3000 QDL */
    {USB_DEVICE(0x413c, 0x8194)}, /* Dell Gobi 3000 Composite */
    + {USB_DEVICE(0x1199, 0x9010)}, /* Sierra Wireless Gobi 3000 QDL */
    + {USB_DEVICE(0x1199, 0x9012)}, /* Sierra Wireless Gobi 3000 QDL */
    {USB_DEVICE(0x1199, 0x9013)}, /* Sierra Wireless Gobi 3000 Modem device (MC8355) */
    + {USB_DEVICE(0x1199, 0x9014)}, /* Sierra Wireless Gobi 3000 QDL */
    + {USB_DEVICE(0x1199, 0x9015)}, /* Sierra Wireless Gobi 3000 Modem device */
    + {USB_DEVICE(0x1199, 0x9018)}, /* Sierra Wireless Gobi 3000 QDL */
    + {USB_DEVICE(0x1199, 0x9019)}, /* Sierra Wireless Gobi 3000 Modem device */
    {USB_DEVICE(0x12D1, 0x14F0)}, /* Sony Gobi 3000 QDL */
    {USB_DEVICE(0x12D1, 0x14F1)}, /* Sony Gobi 3000 Composite */
    { } /* Terminating entry */
    diff --git a/drivers/usb/serial/sierra.c b/drivers/usb/serial/sierra.c
    index e093585..535d087 100644
    --- a/drivers/usb/serial/sierra.c
    +++ b/drivers/usb/serial/sierra.c
    @@ -304,6 +304,10 @@ static const struct usb_device_id id_table[] = {
    { USB_DEVICE(0x1199, 0x68A3), /* Sierra Wireless Direct IP modems */
    .driver_info = (kernel_ulong_t)&direct_ip_interface_blacklist
    },
    + /* AT&T Direct IP LTE modems */
    + { USB_DEVICE_AND_INTERFACE_INFO(0x0F3D, 0x68AA, 0xFF, 0xFF, 0xFF),
    + .driver_info = (kernel_ulong_t)&direct_ip_interface_blacklist
    + },
    { USB_DEVICE(0x0f3d, 0x68A3), /* Airprime/Sierra Wireless Direct IP modems */
    .driver_info = (kernel_ulong_t)&direct_ip_interface_blacklist
    },
    diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c
    index 38d7ebd..8bea45c 100644
    --- a/drivers/usb/serial/usb-serial.c
    +++ b/drivers/usb/serial/usb-serial.c
    @@ -669,12 +669,14 @@ exit:
    static struct usb_serial_driver *search_serial_device(
    struct usb_interface *iface)
    {
    - const struct usb_device_id *id;
    + const struct usb_device_id *id = NULL;
    struct usb_serial_driver *drv;
    + struct usb_driver *driver = to_usb_driver(iface->dev.driver);

    /* Check if the usb id matches a known device */
    list_for_each_entry(drv, &usb_serial_driver_list, driver_list) {
    - id = get_iface_id(drv, iface);
    + if (drv->usb_driver == driver)
    + id = get_iface_id(drv, iface);
    if (id)
    return drv;
    }
    diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h
    index 591f57f..6dcb5c4 100644
    --- a/drivers/usb/storage/unusual_devs.h
    +++ b/drivers/usb/storage/unusual_devs.h
    @@ -1107,6 +1107,13 @@ UNUSUAL_DEV( 0x090a, 0x1200, 0x0000, 0x9999,
    USB_SC_RBC, USB_PR_BULK, NULL,
    0 ),

    +/* Feiya QDI U2 DISK, reported by Hans de Goede <hdegoede@redhat.com> */
    +UNUSUAL_DEV( 0x090c, 0x1000, 0x0000, 0xffff,
    + "Feiya",
    + "QDI U2 DISK",
    + USB_SC_DEVICE, USB_PR_DEVICE, NULL,
    + US_FL_NO_READ_CAPACITY_16 ),
    +
    /* aeb */
    UNUSUAL_DEV( 0x090c, 0x1132, 0x0000, 0xffff,
    "Feiya",
    diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c
    index 9f63e49..5ef7afb 100644
    --- a/fs/fuse/dir.c
    +++ b/fs/fuse/dir.c
    @@ -858,6 +858,7 @@ int fuse_update_attributes(struct inode *inode, struct kstat *stat,
    if (stat) {
    generic_fillattr(inode, stat);
    stat->mode = fi->orig_i_mode;
    + stat->ino = fi->orig_ino;
    }
    }

    diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h
    index cf6db0a..89c4a58 100644
    --- a/fs/fuse/fuse_i.h
    +++ b/fs/fuse/fuse_i.h
    @@ -82,6 +82,9 @@ struct fuse_inode {
    preserve the original mode */
    mode_t orig_i_mode;

    + /** 64 bit inode number */
    + u64 orig_ino;
    +
    /** Version of last attribute change */
    u64 attr_version;

    diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c
    index aa83109..1f82d95 100644
    --- a/fs/fuse/inode.c
    +++ b/fs/fuse/inode.c
    @@ -91,6 +91,7 @@ static struct inode *fuse_alloc_inode(struct super_block *sb)
    fi->nlookup = 0;
    fi->attr_version = 0;
    fi->writectr = 0;
    + fi->orig_ino = 0;
    INIT_LIST_HEAD(&fi->write_files);
    INIT_LIST_HEAD(&fi->queued_writes);
    INIT_LIST_HEAD(&fi->writepages);
    @@ -140,6 +141,18 @@ static int fuse_remount_fs(struct super_block *sb, int *flags, char *data)
    return 0;
    }

    +/*
    + * ino_t is 32-bits on 32-bit arch. We have to squash the 64-bit value down
    + * so that it will fit.
    + */
    +static ino_t fuse_squash_ino(u64 ino64)
    +{
    + ino_t ino = (ino_t) ino64;
    + if (sizeof(ino_t) < sizeof(u64))
    + ino ^= ino64 >> (sizeof(u64) - sizeof(ino_t)) * 8;
    + return ino;
    +}
    +
    void fuse_change_attributes_common(struct inode *inode, struct fuse_attr *attr,
    u64 attr_valid)
    {
    @@ -149,7 +162,7 @@ void fuse_change_attributes_common(struct inode *inode, struct fuse_attr *attr,
    fi->attr_version = ++fc->attr_version;
    fi->i_time = attr_valid;

    - inode->i_ino = attr->ino;
    + inode->i_ino = fuse_squash_ino(attr->ino);
    inode->i_mode = (inode->i_mode & S_IFMT) | (attr->mode & 07777);
    set_nlink(inode, attr->nlink);
    inode->i_uid = attr->uid;
    @@ -175,6 +188,8 @@ void fuse_change_attributes_common(struct inode *inode, struct fuse_attr *attr,
    fi->orig_i_mode = inode->i_mode;
    if (!(fc->flags & FUSE_DEFAULT_PERMISSIONS))
    inode->i_mode &= ~S_ISVTX;
    +
    + fi->orig_ino = attr->ino;
    }

    void fuse_change_attributes(struct inode *inode, struct fuse_attr *attr,
    diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
    index a3cae5d..8000459 100644
    --- a/fs/nfs/nfs4proc.c
    +++ b/fs/nfs/nfs4proc.c
    @@ -1825,6 +1825,7 @@ static struct nfs4_state *nfs4_do_open(struct inode *dir, struct dentry *dentry,
    struct nfs4_state *res;
    int status;

    + fmode &= FMODE_READ|FMODE_WRITE;
    do {
    status = _nfs4_do_open(dir, dentry, fmode, flags, sattr, cred, &res);
    if (status == 0)
    diff --git a/include/linux/pci.h b/include/linux/pci.h
    index 7cda65b..c0cfa0d 100644
    --- a/include/linux/pci.h
    +++ b/include/linux/pci.h
    @@ -176,6 +176,8 @@ enum pci_dev_flags {
    PCI_DEV_FLAGS_NO_D3 = (__force pci_dev_flags_t) 2,
    /* Provide indication device is assigned by a Virtual Machine Manager */
    PCI_DEV_FLAGS_ASSIGNED = (__force pci_dev_flags_t) 4,
    + /* Device causes system crash if in D3 during S3 sleep */
    + PCI_DEV_FLAGS_NO_D3_DURING_SLEEP = (__force pci_dev_flags_t) 8,
    };

    enum pci_irq_reroute_variant {
    diff --git a/include/linux/swapops.h b/include/linux/swapops.h
    index 2189d3f..d6955607 100644
    --- a/include/linux/swapops.h
    +++ b/include/linux/swapops.h
    @@ -8,13 +8,15 @@
    * get good packing density in that tree, so the index should be dense in
    * the low-order bits.
    *
    - * We arrange the `type' and `offset' fields so that `type' is at the five
    + * We arrange the `type' and `offset' fields so that `type' is at the seven
    * high-order bits of the swp_entry_t and `offset' is right-aligned in the
    - * remaining bits.
    + * remaining bits. Although `type' itself needs only five bits, we allow for
    + * shmem/tmpfs to shift it all up a further two bits: see swp_to_radix_entry().
    *
    * swp_entry_t's are *never* stored anywhere in their arch-dependent format.
    */
    -#define SWP_TYPE_SHIFT(e) (sizeof(e.val) * 8 - MAX_SWAPFILES_SHIFT)
    +#define SWP_TYPE_SHIFT(e) ((sizeof(e.val) * 8) - \
    + (MAX_SWAPFILES_SHIFT + RADIX_TREE_EXCEPTIONAL_SHIFT))
    #define SWP_OFFSET_MASK(e) ((1UL << SWP_TYPE_SHIFT(e)) - 1)

    /*
    diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h
    index 64cec8d..03354d5 100644
    --- a/include/linux/usb/hcd.h
    +++ b/include/linux/usb/hcd.h
    @@ -128,8 +128,6 @@ struct usb_hcd {
    unsigned wireless:1; /* Wireless USB HCD */
    unsigned authorized_default:1;
    unsigned has_tt:1; /* Integrated TT in root hub */
    - unsigned broken_pci_sleep:1; /* Don't put the
    - controller in PCI-D3 for system sleep */

    int irq; /* irq allocated */
    void __iomem *regs; /* device memory/io */
    diff --git a/kernel/sched.c b/kernel/sched.c
    index 299f55c..576a27f 100644
    --- a/kernel/sched.c
    +++ b/kernel/sched.c
    @@ -7429,11 +7429,8 @@ int sched_domain_level_max;

    static int __init setup_relax_domain_level(char *str)
    {
    - unsigned long val;
    -
    - val = simple_strtoul(str, NULL, 0);
    - if (val < sched_domain_level_max)
    - default_relax_domain_level = val;
    + if (kstrtoint(str, 0, &default_relax_domain_level))
    + pr_warn("Unable to set relax_domain_level\n");

    return 1;
    }
    @@ -7636,7 +7633,6 @@ struct sched_domain *build_sched_domain(struct sched_domain_topology_level *tl,
    if (!sd)
    return child;

    - set_domain_attribute(sd, attr);
    cpumask_and(sched_domain_span(sd), cpu_map, tl->mask(cpu));
    if (child) {
    sd->level = child->level + 1;
    @@ -7644,6 +7640,7 @@ struct sched_domain *build_sched_domain(struct sched_domain_topology_level *tl,
    child->parent = sd;
    }
    sd->child = child;
    + set_domain_attribute(sd, attr);

    return sd;
    }
    diff --git a/mm/swapfile.c b/mm/swapfile.c
    index d3955f2..fad1830 100644
    --- a/mm/swapfile.c
    +++ b/mm/swapfile.c
    @@ -1921,24 +1921,20 @@ static unsigned long read_swap_header(struct swap_info_struct *p,

    /*
    * Find out how many pages are allowed for a single swap
    - * device. There are three limiting factors: 1) the number
    + * device. There are two limiting factors: 1) the number
    * of bits for the swap offset in the swp_entry_t type, and
    * 2) the number of bits in the swap pte as defined by the
    - * the different architectures, and 3) the number of free bits
    - * in an exceptional radix_tree entry. In order to find the
    + * different architectures. In order to find the
    * largest possible bit mask, a swap entry with swap type 0
    * and swap offset ~0UL is created, encoded to a swap pte,
    * decoded to a swp_entry_t again, and finally the swap
    * offset is extracted. This will mask all the bits from
    * the initial ~0UL mask that can't be encoded in either
    * the swp_entry_t or the architecture definition of a
    - * swap pte. Then the same is done for a radix_tree entry.
    + * swap pte.
    */
    maxpages = swp_offset(pte_to_swp_entry(
    - swp_entry_to_pte(swp_entry(0, ~0UL))));
    - maxpages = swp_offset(radix_to_swp_entry(
    - swp_to_radix_entry(swp_entry(0, maxpages)))) + 1;
    -
    + swp_entry_to_pte(swp_entry(0, ~0UL)))) + 1;
    if (maxpages > swap_header->info.last_page) {
    maxpages = swap_header->info.last_page + 1;
    /* p->max is an unsigned int: don't overflow it */
    diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c
    index 30d7355..f4ddf34 100644
    --- a/net/mac80211/iface.c
    +++ b/net/mac80211/iface.c
    @@ -495,6 +495,18 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
    ieee80211_configure_filter(local);
    break;
    default:
    + mutex_lock(&local->mtx);
    + if (local->hw_roc_dev == sdata->dev &&
    + local->hw_roc_channel) {
    + /* ignore return value since this is racy */
    + drv_cancel_remain_on_channel(local);
    + ieee80211_queue_work(&local->hw, &local->hw_roc_done);
    + }
    + mutex_unlock(&local->mtx);
    +
    + flush_work(&local->hw_roc_start);
    + flush_work(&local->hw_roc_done);
    +
    flush_work(&sdata->work);
    /*
    * When we get here, the interface is marked down.
    diff --git a/net/mac80211/offchannel.c b/net/mac80211/offchannel.c
    index 1b239be..db2c215 100644
    --- a/net/mac80211/offchannel.c
    +++ b/net/mac80211/offchannel.c
    @@ -246,6 +246,22 @@ static void ieee80211_hw_roc_done(struct work_struct *work)
    return;
    }

    + /* was never transmitted */
    + if (local->hw_roc_skb) {
    + u64 cookie;
    +
    + cookie = local->hw_roc_cookie ^ 2;
    +
    + cfg80211_mgmt_tx_status(local->hw_roc_dev, cookie,
    + local->hw_roc_skb->data,
    + local->hw_roc_skb->len, false,
    + GFP_KERNEL);
    +
    + kfree_skb(local->hw_roc_skb);
    + local->hw_roc_skb = NULL;
    + local->hw_roc_skb_for_status = NULL;
    + }
    +
    if (!local->hw_roc_for_tx)
    cfg80211_remain_on_channel_expired(local->hw_roc_dev,
    local->hw_roc_cookie,
    diff --git a/net/sunrpc/svc.c b/net/sunrpc/svc.c
    index d4ad50e..c80c162 100644
    --- a/net/sunrpc/svc.c
    +++ b/net/sunrpc/svc.c
    @@ -1358,7 +1358,8 @@ bc_svc_process(struct svc_serv *serv, struct rpc_rqst *req,
    sizeof(req->rq_snd_buf));
    return bc_send(req);
    } else {
    - /* Nothing to do to drop request */
    + /* drop request */
    + xprt_free_bc_request(req);
    return 0;
    }
    }
    diff --git a/net/wireless/util.c b/net/wireless/util.c
    index 8bf8902..d38815d 100644
    --- a/net/wireless/util.c
    +++ b/net/wireless/util.c
    @@ -943,6 +943,7 @@ int cfg80211_can_change_interface(struct cfg80211_registered_device *rdev,
    enum nl80211_iftype iftype)
    {
    struct wireless_dev *wdev_iter;
    + u32 used_iftypes = BIT(iftype);
    int num[NUM_NL80211_IFTYPES];
    int total = 1;
    int i, j;
    @@ -976,12 +977,14 @@ int cfg80211_can_change_interface(struct cfg80211_registered_device *rdev,

    num[wdev_iter->iftype]++;
    total++;
    + used_iftypes |= BIT(wdev_iter->iftype);
    }
    mutex_unlock(&rdev->devlist_mtx);

    for (i = 0; i < rdev->wiphy.n_iface_combinations; i++) {
    const struct ieee80211_iface_combination *c;
    struct ieee80211_iface_limit *limits;
    + u32 all_iftypes = 0;

    c = &rdev->wiphy.iface_combinations[i];

    @@ -996,6 +999,7 @@ int cfg80211_can_change_interface(struct cfg80211_registered_device *rdev,
    if (rdev->wiphy.software_iftypes & BIT(iftype))
    continue;
    for (j = 0; j < c->n_limits; j++) {
    + all_iftypes |= limits[j].types;
    if (!(limits[j].types & BIT(iftype)))
    continue;
    if (limits[j].max < num[iftype])
    @@ -1003,7 +1007,20 @@ int cfg80211_can_change_interface(struct cfg80211_registered_device *rdev,
    limits[j].max -= num[iftype];
    }
    }
    - /* yay, it fits */
    +
    + /*
    + * Finally check that all iftypes that we're currently
    + * using are actually part of this combination. If they
    + * aren't then we can't use this combination and have
    + * to continue to the next.
    + */
    + if ((all_iftypes & used_iftypes) != used_iftypes)
    + goto cont;
    +
    + /*
    + * This combination covered all interface types and
    + * supported the requested numbers, so we're good.
    + */
    kfree(limits);
    return 0;
    cont:
    diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h
    index 71f6744..78b2223 100644
    --- a/sound/pci/hda/hda_codec.h
    +++ b/sound/pci/hda/hda_codec.h
    @@ -858,6 +858,7 @@ struct hda_codec {
    unsigned int pins_shutup:1; /* pins are shut up */
    unsigned int no_trigger_sense:1; /* don't trigger at pin-sensing */
    unsigned int ignore_misc_bit:1; /* ignore MISC_NO_PRESENCE bit */
    + unsigned int no_jack_detect:1; /* Machine has no jack-detection */
    #ifdef CONFIG_SND_HDA_POWER_SAVE
    unsigned int power_on :1; /* current (global) power-state */
    unsigned int power_transition :1; /* power-state in transition */
    diff --git a/sound/pci/hda/hda_local.h b/sound/pci/hda/hda_local.h
    index 368f0c5..c78b753 100644
    --- a/sound/pci/hda/hda_local.h
    +++ b/sound/pci/hda/hda_local.h
    @@ -515,6 +515,8 @@ int snd_hda_jack_detect(struct hda_codec *codec, hda_nid_t nid);

    static inline bool is_jack_detectable(struct hda_codec *codec, hda_nid_t nid)
    {
    + if (codec->no_jack_detect)
    + return false;
    if (!(snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_PRES_DETECT))
    return false;
    if (!codec->ignore_misc_bit &&
    diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
    index 0bc5a46..0005bde 100644
    --- a/sound/pci/hda/patch_realtek.c
    +++ b/sound/pci/hda/patch_realtek.c
    @@ -5278,8 +5278,10 @@ static const struct hda_amp_list alc861_loopbacks[] = {

    /* Pin config fixes */
    enum {
    - PINFIX_FSC_AMILO_PI1505,
    - PINFIX_ASUS_A6RP,
    + ALC861_FIXUP_FSC_AMILO_PI1505,
    + ALC861_FIXUP_AMP_VREF_0F,
    + ALC861_FIXUP_NO_JACK_DETECT,
    + ALC861_FIXUP_ASUS_A6RP,
    };

    /* On some laptops, VREF of pin 0x0f is abused for controlling the main amp */
    @@ -5301,8 +5303,16 @@ static void alc861_fixup_asus_amp_vref_0f(struct hda_codec *codec,
    spec->keep_vref_in_automute = 1;
    }

    +/* suppress the jack-detection */
    +static void alc_fixup_no_jack_detect(struct hda_codec *codec,
    + const struct alc_fixup *fix, int action)
    +{
    + if (action == ALC_FIXUP_ACT_PRE_PROBE)
    + codec->no_jack_detect = 1;
    +}
    +
    static const struct alc_fixup alc861_fixups[] = {
    - [PINFIX_FSC_AMILO_PI1505] = {
    + [ALC861_FIXUP_FSC_AMILO_PI1505] = {
    .type = ALC_FIXUP_PINS,
    .v.pins = (const struct alc_pincfg[]) {
    { 0x0b, 0x0221101f }, /* HP */
    @@ -5310,16 +5320,29 @@ static const struct alc_fixup alc861_fixups[] = {
    { }
    }
    },
    - [PINFIX_ASUS_A6RP] = {
    + [ALC861_FIXUP_AMP_VREF_0F] = {
    .type = ALC_FIXUP_FUNC,
    .v.func = alc861_fixup_asus_amp_vref_0f,
    },
    + [ALC861_FIXUP_NO_JACK_DETECT] = {
    + .type = ALC_FIXUP_FUNC,
    + .v.func = alc_fixup_no_jack_detect,
    + },
    + [ALC861_FIXUP_ASUS_A6RP] = {
    + .type = ALC_FIXUP_FUNC,
    + .v.func = alc861_fixup_asus_amp_vref_0f,
    + .chained = true,
    + .chain_id = ALC861_FIXUP_NO_JACK_DETECT,
    + }
    };

    static const struct snd_pci_quirk alc861_fixup_tbl[] = {
    - SND_PCI_QUIRK_VENDOR(0x1043, "ASUS laptop", PINFIX_ASUS_A6RP),
    - SND_PCI_QUIRK(0x1584, 0x2b01, "Haier W18", PINFIX_ASUS_A6RP),
    - SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", PINFIX_FSC_AMILO_PI1505),
    + SND_PCI_QUIRK(0x1043, 0x1393, "ASUS A6Rp", ALC861_FIXUP_ASUS_A6RP),
    + SND_PCI_QUIRK_VENDOR(0x1043, "ASUS laptop", ALC861_FIXUP_AMP_VREF_0F),
    + SND_PCI_QUIRK(0x1462, 0x7254, "HP DX2200", ALC861_FIXUP_NO_JACK_DETECT),
    + SND_PCI_QUIRK(0x1584, 0x2b01, "Haier W18", ALC861_FIXUP_AMP_VREF_0F),
    + SND_PCI_QUIRK(0x1584, 0x0000, "Uniwill ECS M31EI", ALC861_FIXUP_AMP_VREF_0F),
    + SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", ALC861_FIXUP_FSC_AMILO_PI1505),
    {}
    };

    @@ -5571,6 +5594,8 @@ enum {
    ALC662_FIXUP_ASUS_MODE6,
    ALC662_FIXUP_ASUS_MODE7,
    ALC662_FIXUP_ASUS_MODE8,
    + ALC662_FIXUP_NO_JACK_DETECT,
    + ALC662_FIXUP_ZOTAC_Z68,
    };

    static const struct alc_fixup alc662_fixups[] = {
    @@ -5716,6 +5741,17 @@ static const struct alc_fixup alc662_fixups[] = {
    .chained = true,
    .chain_id = ALC662_FIXUP_SKU_IGNORE
    },
    + [ALC662_FIXUP_NO_JACK_DETECT] = {
    + .type = ALC_FIXUP_FUNC,
    + .v.func = alc_fixup_no_jack_detect,
    + },
    + [ALC662_FIXUP_ZOTAC_Z68] = {
    + .type = ALC_FIXUP_PINS,
    + .v.pins = (const struct alc_pincfg[]) {
    + { 0x1b, 0x02214020 }, /* Front HP */
    + { }
    + }
    + },
    };

    static const struct snd_pci_quirk alc662_fixup_tbl[] = {
    @@ -5724,10 +5760,12 @@ static const struct snd_pci_quirk alc662_fixup_tbl[] = {
    SND_PCI_QUIRK(0x1025, 0x031c, "Gateway NV79", ALC662_FIXUP_SKU_IGNORE),
    SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE),
    SND_PCI_QUIRK(0x103c, 0x1632, "HP RP5800", ALC662_FIXUP_HP_RP5800),
    + SND_PCI_QUIRK(0x1043, 0x8469, "ASUS mobo", ALC662_FIXUP_NO_JACK_DETECT),
    SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_FIXUP_ASUS_MODE2),
    SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD),
    SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD),
    SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD),
    + SND_PCI_QUIRK(0x19da, 0xa130, "Zotac Z68", ALC662_FIXUP_ZOTAC_Z68),
    SND_PCI_QUIRK(0x1b35, 0x2206, "CZC P10T", ALC662_FIXUP_CZC_P10T),

    #if 0
    diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c
    index 3e7aa22..de61b8a 100644
    --- a/sound/soc/codecs/wm8994.c
    +++ b/sound/soc/codecs/wm8994.c
    @@ -41,6 +41,39 @@
    #define WM8994_NUM_DRC 3
    #define WM8994_NUM_EQ 3

    +static struct {
    + unsigned int reg;
    + unsigned int mask;
    +} wm8994_vu_bits[] = {
    + { WM8994_LEFT_LINE_INPUT_1_2_VOLUME, WM8994_IN1_VU },
    + { WM8994_RIGHT_LINE_INPUT_1_2_VOLUME, WM8994_IN1_VU },
    + { WM8994_LEFT_LINE_INPUT_3_4_VOLUME, WM8994_IN2_VU },
    + { WM8994_RIGHT_LINE_INPUT_3_4_VOLUME, WM8994_IN2_VU },
    + { WM8994_SPEAKER_VOLUME_LEFT, WM8994_SPKOUT_VU },
    + { WM8994_SPEAKER_VOLUME_RIGHT, WM8994_SPKOUT_VU },
    + { WM8994_LEFT_OUTPUT_VOLUME, WM8994_HPOUT1_VU },
    + { WM8994_RIGHT_OUTPUT_VOLUME, WM8994_HPOUT1_VU },
    + { WM8994_LEFT_OPGA_VOLUME, WM8994_MIXOUT_VU },
    + { WM8994_RIGHT_OPGA_VOLUME, WM8994_MIXOUT_VU },
    +
    + { WM8994_AIF1_DAC1_LEFT_VOLUME, WM8994_AIF1DAC1_VU },
    + { WM8994_AIF1_DAC1_RIGHT_VOLUME, WM8994_AIF1DAC1_VU },
    + { WM8994_AIF1_DAC2_LEFT_VOLUME, WM8994_AIF1DAC2_VU },
    + { WM8994_AIF1_DAC2_RIGHT_VOLUME, WM8994_AIF1DAC2_VU },
    + { WM8994_AIF2_DAC_LEFT_VOLUME, WM8994_AIF2DAC_VU },
    + { WM8994_AIF2_DAC_RIGHT_VOLUME, WM8994_AIF2DAC_VU },
    + { WM8994_AIF1_ADC1_LEFT_VOLUME, WM8994_AIF1ADC1_VU },
    + { WM8994_AIF1_ADC1_RIGHT_VOLUME, WM8994_AIF1ADC1_VU },
    + { WM8994_AIF1_ADC2_LEFT_VOLUME, WM8994_AIF1ADC2_VU },
    + { WM8994_AIF1_ADC2_RIGHT_VOLUME, WM8994_AIF1ADC2_VU },
    + { WM8994_AIF2_ADC_LEFT_VOLUME, WM8994_AIF2ADC_VU },
    + { WM8994_AIF2_ADC_RIGHT_VOLUME, WM8994_AIF1ADC2_VU },
    + { WM8994_DAC1_LEFT_VOLUME, WM8994_DAC1_VU },
    + { WM8994_DAC1_RIGHT_VOLUME, WM8994_DAC1_VU },
    + { WM8994_DAC2_LEFT_VOLUME, WM8994_DAC2_VU },
    + { WM8994_DAC2_RIGHT_VOLUME, WM8994_DAC2_VU },
    +};
    +
    static int wm8994_drc_base[] = {
    WM8994_AIF1_DRC1_1,
    WM8994_AIF1_DRC2_1,
    @@ -889,6 +922,7 @@ static int aif1clk_ev(struct snd_soc_dapm_widget *w,
    struct snd_soc_codec *codec = w->codec;
    struct wm8994 *control = codec->control_data;
    int mask = WM8994_AIF1DAC1L_ENA | WM8994_AIF1DAC1R_ENA;
    + int i;
    int dac;
    int adc;
    int val;
    @@ -947,6 +981,13 @@ static int aif1clk_ev(struct snd_soc_dapm_widget *w,
    WM8994_AIF1DAC2L_ENA);
    break;

    + case SND_SOC_DAPM_POST_PMU:
    + for (i = 0; i < ARRAY_SIZE(wm8994_vu_bits); i++)
    + snd_soc_write(codec, wm8994_vu_bits[i].reg,
    + snd_soc_read(codec,
    + wm8994_vu_bits[i].reg));
    + break;
    +
    case SND_SOC_DAPM_PRE_PMD:
    case SND_SOC_DAPM_POST_PMD:
    snd_soc_update_bits(codec, WM8994_POWER_MANAGEMENT_5,
    @@ -972,6 +1013,7 @@ static int aif2clk_ev(struct snd_soc_dapm_widget *w,
    struct snd_kcontrol *kcontrol, int event)
    {
    struct snd_soc_codec *codec = w->codec;
    + int i;
    int dac;
    int adc;
    int val;
    @@ -1022,6 +1064,13 @@ static int aif2clk_ev(struct snd_soc_dapm_widget *w,
    WM8994_AIF2DACR_ENA);
    break;

    + case SND_SOC_DAPM_POST_PMU:
    + for (i = 0; i < ARRAY_SIZE(wm8994_vu_bits); i++)
    + snd_soc_write(codec, wm8994_vu_bits[i].reg,
    + snd_soc_read(codec,
    + wm8994_vu_bits[i].reg));
    + break;
    +
    case SND_SOC_DAPM_PRE_PMD:
    case SND_SOC_DAPM_POST_PMD:
    snd_soc_update_bits(codec, WM8994_POWER_MANAGEMENT_5,
    @@ -1090,17 +1139,19 @@ static int late_enable_ev(struct snd_soc_dapm_widget *w,
    switch (event) {
    case SND_SOC_DAPM_PRE_PMU:
    if (wm8994->aif1clk_enable) {
    - aif1clk_ev(w, kcontrol, event);
    + aif1clk_ev(w, kcontrol, SND_SOC_DAPM_PRE_PMU);
    snd_soc_update_bits(codec, WM8994_AIF1_CLOCKING_1,
    WM8994_AIF1CLK_ENA_MASK,
    WM8994_AIF1CLK_ENA);
    + aif1clk_ev(w, kcontrol, SND_SOC_DAPM_POST_PMU);
    wm8994->aif1clk_enable = 0;
    }
    if (wm8994->aif2clk_enable) {
    - aif2clk_ev(w, kcontrol, event);
    + aif2clk_ev(w, kcontrol, SND_SOC_DAPM_PRE_PMU);
    snd_soc_update_bits(codec, WM8994_AIF2_CLOCKING_1,
    WM8994_AIF2CLK_ENA_MASK,
    WM8994_AIF2CLK_ENA);
    + aif2clk_ev(w, kcontrol, SND_SOC_DAPM_POST_PMU);
    wm8994->aif2clk_enable = 0;
    }
    break;
    @@ -1121,15 +1172,17 @@ static int late_disable_ev(struct snd_soc_dapm_widget *w,
    switch (event) {
    case SND_SOC_DAPM_POST_PMD:
    if (wm8994->aif1clk_disable) {
    + aif1clk_ev(w, kcontrol, SND_SOC_DAPM_PRE_PMD);
    snd_soc_update_bits(codec, WM8994_AIF1_CLOCKING_1,
    WM8994_AIF1CLK_ENA_MASK, 0);
    - aif1clk_ev(w, kcontrol, event);
    + aif1clk_ev(w, kcontrol, SND_SOC_DAPM_POST_PMD);
    wm8994->aif1clk_disable = 0;
    }
    if (wm8994->aif2clk_disable) {
    + aif2clk_ev(w, kcontrol, SND_SOC_DAPM_PRE_PMD);
    snd_soc_update_bits(codec, WM8994_AIF2_CLOCKING_1,
    WM8994_AIF2CLK_ENA_MASK, 0);
    - aif2clk_ev(w, kcontrol, event);
    + aif2clk_ev(w, kcontrol, SND_SOC_DAPM_POST_PMD);
    wm8994->aif2clk_disable = 0;
    }
    break;
    @@ -1466,9 +1519,11 @@ SND_SOC_DAPM_POST("Late Disable PGA", late_disable_ev)

    static const struct snd_soc_dapm_widget wm8994_lateclk_widgets[] = {
    SND_SOC_DAPM_SUPPLY("AIF1CLK", WM8994_AIF1_CLOCKING_1, 0, 0, aif1clk_ev,
    - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD),
    + SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
    + SND_SOC_DAPM_PRE_PMD),
    SND_SOC_DAPM_SUPPLY("AIF2CLK", WM8994_AIF2_CLOCKING_1, 0, 0, aif2clk_ev,
    - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD),
    + SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
    + SND_SOC_DAPM_PRE_PMD),
    SND_SOC_DAPM_PGA("Direct Voice", SND_SOC_NOPM, 0, 0, NULL, 0),
    SND_SOC_DAPM_MIXER("SPKL", WM8994_POWER_MANAGEMENT_3, 8, 0,
    left_speaker_mixer, ARRAY_SIZE(left_speaker_mixer)),
    @@ -3482,39 +3537,11 @@ static int wm8994_codec_probe(struct snd_soc_codec *codec)

    wm8994_set_bias_level(codec, SND_SOC_BIAS_STANDBY);

    - /* Latch volume updates (right only; we always do left then right). */
    - snd_soc_update_bits(codec, WM8994_AIF1_DAC1_LEFT_VOLUME,
    - WM8994_AIF1DAC1_VU, WM8994_AIF1DAC1_VU);
    - snd_soc_update_bits(codec, WM8994_AIF1_DAC1_RIGHT_VOLUME,
    - WM8994_AIF1DAC1_VU, WM8994_AIF1DAC1_VU);
    - snd_soc_update_bits(codec, WM8994_AIF1_DAC2_LEFT_VOLUME,
    - WM8994_AIF1DAC2_VU, WM8994_AIF1DAC2_VU);
    - snd_soc_update_bits(codec, WM8994_AIF1_DAC2_RIGHT_VOLUME,
    - WM8994_AIF1DAC2_VU, WM8994_AIF1DAC2_VU);
    - snd_soc_update_bits(codec, WM8994_AIF2_DAC_LEFT_VOLUME,
    - WM8994_AIF2DAC_VU, WM8994_AIF2DAC_VU);
    - snd_soc_update_bits(codec, WM8994_AIF2_DAC_RIGHT_VOLUME,
    - WM8994_AIF2DAC_VU, WM8994_AIF2DAC_VU);
    - snd_soc_update_bits(codec, WM8994_AIF1_ADC1_LEFT_VOLUME,
    - WM8994_AIF1ADC1_VU, WM8994_AIF1ADC1_VU);
    - snd_soc_update_bits(codec, WM8994_AIF1_ADC1_RIGHT_VOLUME,
    - WM8994_AIF1ADC1_VU, WM8994_AIF1ADC1_VU);
    - snd_soc_update_bits(codec, WM8994_AIF1_ADC2_LEFT_VOLUME,
    - WM8994_AIF1ADC2_VU, WM8994_AIF1ADC2_VU);
    - snd_soc_update_bits(codec, WM8994_AIF1_ADC2_RIGHT_VOLUME,
    - WM8994_AIF1ADC2_VU, WM8994_AIF1ADC2_VU);
    - snd_soc_update_bits(codec, WM8994_AIF2_ADC_LEFT_VOLUME,
    - WM8994_AIF2ADC_VU, WM8994_AIF1ADC2_VU);
    - snd_soc_update_bits(codec, WM8994_AIF2_ADC_RIGHT_VOLUME,
    - WM8994_AIF2ADC_VU, WM8994_AIF1ADC2_VU);
    - snd_soc_update_bits(codec, WM8994_DAC1_LEFT_VOLUME,
    - WM8994_DAC1_VU, WM8994_DAC1_VU);
    - snd_soc_update_bits(codec, WM8994_DAC1_RIGHT_VOLUME,
    - WM8994_DAC1_VU, WM8994_DAC1_VU);
    - snd_soc_update_bits(codec, WM8994_DAC2_LEFT_VOLUME,
    - WM8994_DAC2_VU, WM8994_DAC2_VU);
    - snd_soc_update_bits(codec, WM8994_DAC2_RIGHT_VOLUME,
    - WM8994_DAC2_VU, WM8994_DAC2_VU);
    + /* Latch volume update bits */
    + for (i = 0; i < ARRAY_SIZE(wm8994_vu_bits); i++)
    + snd_soc_update_bits(codec, wm8994_vu_bits[i].reg,
    + wm8994_vu_bits[i].mask,
    + wm8994_vu_bits[i].mask);

    /* Set the low bit of the 3D stereo depth so TLV matches */
    snd_soc_update_bits(codec, WM8994_AIF1_DAC1_FILTERS_2,

    --
    Ben Hutchings
    Time is nature's way of making sure that everything doesn't happen at once.
    [unhandled content-type:application/pgp-signature]
    \
     
     \ /
      Last update: 2012-06-17 21:41    [W:0.231 / U:0.240 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site