Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net

Conflicts:
	drivers/nfc/microread/mei.c
	net/netfilter/nfnetlink_queue_core.c

Pull in 'net' to get Eric Biederman's AF_UNIX fix, upon which
some cleanups are going to go on-top.

Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
David S. Miller 2013-04-07 18:37:01 -04:00
commit d978a6361a
135 changed files with 855 additions and 453 deletions

View File

@ -890,9 +890,8 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
enable_msi - Enable Message Signaled Interrupt (MSI) (default = off) enable_msi - Enable Message Signaled Interrupt (MSI) (default = off)
power_save - Automatic power-saving timeout (in second, 0 = power_save - Automatic power-saving timeout (in second, 0 =
disable) disable)
power_save_controller - Support runtime D3 of HD-audio controller power_save_controller - Reset HD-audio controller in power-saving mode
(-1 = on for supported chip (default), false = off, (default = on)
true = force to on even for unsupported hardware)
align_buffer_size - Force rounding of buffer/period sizes to multiples align_buffer_size - Force rounding of buffer/period sizes to multiples
of 128 bytes. This is more efficient in terms of memory of 128 bytes. This is more efficient in terms of memory
access but isn't required by the HDA spec and prevents access but isn't required by the HDA spec and prevents

View File

@ -6953,7 +6953,6 @@ F: drivers/scsi/st*
SCTP PROTOCOL SCTP PROTOCOL
M: Vlad Yasevich <vyasevich@gmail.com> M: Vlad Yasevich <vyasevich@gmail.com>
M: Sridhar Samudrala <sri@us.ibm.com>
M: Neil Horman <nhorman@tuxdriver.com> M: Neil Horman <nhorman@tuxdriver.com>
L: linux-sctp@vger.kernel.org L: linux-sctp@vger.kernel.org
W: http://lksctp.sourceforge.net W: http://lksctp.sourceforge.net

View File

@ -1183,9 +1183,9 @@ config ARM_NR_BANKS
default 8 default 8
config IWMMXT config IWMMXT
bool "Enable iWMMXt support" bool "Enable iWMMXt support" if !CPU_PJ4
depends on CPU_XSCALE || CPU_XSC3 || CPU_MOHAWK || CPU_PJ4 depends on CPU_XSCALE || CPU_XSC3 || CPU_MOHAWK || CPU_PJ4
default y if PXA27x || PXA3xx || ARCH_MMP default y if PXA27x || PXA3xx || ARCH_MMP || CPU_PJ4
help help
Enable support for iWMMXt context switching at run time if Enable support for iWMMXt context switching at run time if
running on a CPU that supports it. running on a CPU that supports it.
@ -1439,6 +1439,16 @@ config ARM_ERRATA_775420
to deadlock. This workaround puts DSB before executing ISB if to deadlock. This workaround puts DSB before executing ISB if
an abort may occur on cache maintenance. an abort may occur on cache maintenance.
config ARM_ERRATA_798181
bool "ARM errata: TLBI/DSB failure on Cortex-A15"
depends on CPU_V7 && SMP
help
On Cortex-A15 (r0p0..r3p2) the TLBI*IS/DSB operations are not
adequately shooting down all use of the old entries. This
option enables the Linux kernel workaround for this erratum
which sends an IPI to the CPUs that are running the same ASID
as the one being invalidated.
endmenu endmenu
source "arch/arm/common/Kconfig" source "arch/arm/common/Kconfig"

View File

@ -24,7 +24,7 @@ extern struct arm_delay_ops {
void (*delay)(unsigned long); void (*delay)(unsigned long);
void (*const_udelay)(unsigned long); void (*const_udelay)(unsigned long);
void (*udelay)(unsigned long); void (*udelay)(unsigned long);
bool const_clock; unsigned long ticks_per_jiffy;
} arm_delay_ops; } arm_delay_ops;
#define __delay(n) arm_delay_ops.delay(n) #define __delay(n) arm_delay_ops.delay(n)

View File

@ -41,6 +41,13 @@ extern void kunmap_high(struct page *page);
#endif #endif
#endif #endif
/*
* Needed to be able to broadcast the TLB invalidation for kmap.
*/
#ifdef CONFIG_ARM_ERRATA_798181
#undef ARCH_NEEDS_KMAP_HIGH_GET
#endif
#ifdef ARCH_NEEDS_KMAP_HIGH_GET #ifdef ARCH_NEEDS_KMAP_HIGH_GET
extern void *kmap_high_get(struct page *page); extern void *kmap_high_get(struct page *page);
#else #else

View File

@ -27,6 +27,8 @@ void __check_vmalloc_seq(struct mm_struct *mm);
void check_and_switch_context(struct mm_struct *mm, struct task_struct *tsk); void check_and_switch_context(struct mm_struct *mm, struct task_struct *tsk);
#define init_new_context(tsk,mm) ({ atomic64_set(&mm->context.id, 0); 0; }) #define init_new_context(tsk,mm) ({ atomic64_set(&mm->context.id, 0); 0; })
DECLARE_PER_CPU(atomic64_t, active_asids);
#else /* !CONFIG_CPU_HAS_ASID */ #else /* !CONFIG_CPU_HAS_ASID */
#ifdef CONFIG_MMU #ifdef CONFIG_MMU

View File

@ -450,6 +450,21 @@ static inline void local_flush_bp_all(void)
isb(); isb();
} }
#ifdef CONFIG_ARM_ERRATA_798181
static inline void dummy_flush_tlb_a15_erratum(void)
{
/*
* Dummy TLBIMVAIS. Using the unmapped address 0 and ASID 0.
*/
asm("mcr p15, 0, %0, c8, c3, 1" : : "r" (0));
dsb();
}
#else
static inline void dummy_flush_tlb_a15_erratum(void)
{
}
#endif
/* /*
* flush_pmd_entry * flush_pmd_entry
* *

View File

@ -276,7 +276,13 @@ ENDPROC(ftrace_graph_caller_old)
*/ */
.macro mcount_enter .macro mcount_enter
/*
* This pad compensates for the push {lr} at the call site. Note that we are
* unable to unwind through a function which does not otherwise save its lr.
*/
UNWIND(.pad #4)
stmdb sp!, {r0-r3, lr} stmdb sp!, {r0-r3, lr}
UNWIND(.save {r0-r3, lr})
.endm .endm
.macro mcount_get_lr reg .macro mcount_get_lr reg
@ -289,6 +295,7 @@ ENDPROC(ftrace_graph_caller_old)
.endm .endm
ENTRY(__gnu_mcount_nc) ENTRY(__gnu_mcount_nc)
UNWIND(.fnstart)
#ifdef CONFIG_DYNAMIC_FTRACE #ifdef CONFIG_DYNAMIC_FTRACE
mov ip, lr mov ip, lr
ldmia sp!, {lr} ldmia sp!, {lr}
@ -296,17 +303,22 @@ ENTRY(__gnu_mcount_nc)
#else #else
__mcount __mcount
#endif #endif
UNWIND(.fnend)
ENDPROC(__gnu_mcount_nc) ENDPROC(__gnu_mcount_nc)
#ifdef CONFIG_DYNAMIC_FTRACE #ifdef CONFIG_DYNAMIC_FTRACE
ENTRY(ftrace_caller) ENTRY(ftrace_caller)
UNWIND(.fnstart)
__ftrace_caller __ftrace_caller
UNWIND(.fnend)
ENDPROC(ftrace_caller) ENDPROC(ftrace_caller)
#endif #endif
#ifdef CONFIG_FUNCTION_GRAPH_TRACER #ifdef CONFIG_FUNCTION_GRAPH_TRACER
ENTRY(ftrace_graph_caller) ENTRY(ftrace_graph_caller)
UNWIND(.fnstart)
__ftrace_graph_caller __ftrace_graph_caller
UNWIND(.fnend)
ENDPROC(ftrace_graph_caller) ENDPROC(ftrace_graph_caller)
#endif #endif

View File

@ -267,7 +267,7 @@ __create_page_tables:
addne r6, r6, #1 << SECTION_SHIFT addne r6, r6, #1 << SECTION_SHIFT
strne r6, [r3] strne r6, [r3]
#if defined(CONFIG_LPAE) && defined(CONFIG_CPU_ENDIAN_BE8) #if defined(CONFIG_ARM_LPAE) && defined(CONFIG_CPU_ENDIAN_BE8)
sub r4, r4, #4 @ Fixup page table pointer sub r4, r4, #4 @ Fixup page table pointer
@ for 64-bit descriptors @ for 64-bit descriptors
#endif #endif

View File

@ -966,7 +966,7 @@ static void reset_ctrl_regs(void *unused)
} }
if (err) { if (err) {
pr_warning("CPU %d debug is powered down!\n", cpu); pr_warn_once("CPU %d debug is powered down!\n", cpu);
cpumask_or(&debug_err_mask, &debug_err_mask, cpumask_of(cpu)); cpumask_or(&debug_err_mask, &debug_err_mask, cpumask_of(cpu));
return; return;
} }
@ -987,7 +987,7 @@ clear_vcr:
isb(); isb();
if (cpumask_intersects(&debug_err_mask, cpumask_of(cpu))) { if (cpumask_intersects(&debug_err_mask, cpumask_of(cpu))) {
pr_warning("CPU %d failed to disable vector catch\n", cpu); pr_warn_once("CPU %d failed to disable vector catch\n", cpu);
return; return;
} }
@ -1007,7 +1007,7 @@ clear_vcr:
} }
if (cpumask_intersects(&debug_err_mask, cpumask_of(cpu))) { if (cpumask_intersects(&debug_err_mask, cpumask_of(cpu))) {
pr_warning("CPU %d failed to clear debug register pairs\n", cpu); pr_warn_once("CPU %d failed to clear debug register pairs\n", cpu);
return; return;
} }

View File

@ -353,6 +353,23 @@ void __init early_print(const char *str, ...)
printk("%s", buf); printk("%s", buf);
} }
static void __init cpuid_init_hwcaps(void)
{
unsigned int divide_instrs;
if (cpu_architecture() < CPU_ARCH_ARMv7)
return;
divide_instrs = (read_cpuid_ext(CPUID_EXT_ISAR0) & 0x0f000000) >> 24;
switch (divide_instrs) {
case 2:
elf_hwcap |= HWCAP_IDIVA;
case 1:
elf_hwcap |= HWCAP_IDIVT;
}
}
static void __init feat_v6_fixup(void) static void __init feat_v6_fixup(void)
{ {
int id = read_cpuid_id(); int id = read_cpuid_id();
@ -483,8 +500,11 @@ static void __init setup_processor(void)
snprintf(elf_platform, ELF_PLATFORM_SIZE, "%s%c", snprintf(elf_platform, ELF_PLATFORM_SIZE, "%s%c",
list->elf_name, ENDIANNESS); list->elf_name, ENDIANNESS);
elf_hwcap = list->elf_hwcap; elf_hwcap = list->elf_hwcap;
cpuid_init_hwcaps();
#ifndef CONFIG_ARM_THUMB #ifndef CONFIG_ARM_THUMB
elf_hwcap &= ~HWCAP_THUMB; elf_hwcap &= ~(HWCAP_THUMB | HWCAP_IDIVT);
#endif #endif
feat_v6_fixup(); feat_v6_fixup();
@ -524,7 +544,7 @@ int __init arm_add_memory(phys_addr_t start, phys_addr_t size)
size -= start & ~PAGE_MASK; size -= start & ~PAGE_MASK;
bank->start = PAGE_ALIGN(start); bank->start = PAGE_ALIGN(start);
#ifndef CONFIG_LPAE #ifndef CONFIG_ARM_LPAE
if (bank->start + size < bank->start) { if (bank->start + size < bank->start) {
printk(KERN_CRIT "Truncating memory at 0x%08llx to fit in " printk(KERN_CRIT "Truncating memory at 0x%08llx to fit in "
"32-bit physical address space\n", (long long)start); "32-bit physical address space\n", (long long)start);

View File

@ -673,9 +673,6 @@ static int cpufreq_callback(struct notifier_block *nb,
if (freq->flags & CPUFREQ_CONST_LOOPS) if (freq->flags & CPUFREQ_CONST_LOOPS)
return NOTIFY_OK; return NOTIFY_OK;
if (arm_delay_ops.const_clock)
return NOTIFY_OK;
if (!per_cpu(l_p_j_ref, cpu)) { if (!per_cpu(l_p_j_ref, cpu)) {
per_cpu(l_p_j_ref, cpu) = per_cpu(l_p_j_ref, cpu) =
per_cpu(cpu_data, cpu).loops_per_jiffy; per_cpu(cpu_data, cpu).loops_per_jiffy;

View File

@ -12,6 +12,7 @@
#include <asm/smp_plat.h> #include <asm/smp_plat.h>
#include <asm/tlbflush.h> #include <asm/tlbflush.h>
#include <asm/mmu_context.h>
/**********************************************************************/ /**********************************************************************/
@ -69,12 +70,72 @@ static inline void ipi_flush_bp_all(void *ignored)
local_flush_bp_all(); local_flush_bp_all();
} }
#ifdef CONFIG_ARM_ERRATA_798181
static int erratum_a15_798181(void)
{
unsigned int midr = read_cpuid_id();
/* Cortex-A15 r0p0..r3p2 affected */
if ((midr & 0xff0ffff0) != 0x410fc0f0 || midr > 0x413fc0f2)
return 0;
return 1;
}
#else
static int erratum_a15_798181(void)
{
return 0;
}
#endif
static void ipi_flush_tlb_a15_erratum(void *arg)
{
dmb();
}
static void broadcast_tlb_a15_erratum(void)
{
if (!erratum_a15_798181())
return;
dummy_flush_tlb_a15_erratum();
smp_call_function_many(cpu_online_mask, ipi_flush_tlb_a15_erratum,
NULL, 1);
}
static void broadcast_tlb_mm_a15_erratum(struct mm_struct *mm)
{
int cpu;
cpumask_t mask = { CPU_BITS_NONE };
if (!erratum_a15_798181())
return;
dummy_flush_tlb_a15_erratum();
for_each_online_cpu(cpu) {
if (cpu == smp_processor_id())
continue;
/*
* We only need to send an IPI if the other CPUs are running
* the same ASID as the one being invalidated. There is no
* need for locking around the active_asids check since the
* switch_mm() function has at least one dmb() (as required by
* this workaround) in case a context switch happens on
* another CPU after the condition below.
*/
if (atomic64_read(&mm->context.id) ==
atomic64_read(&per_cpu(active_asids, cpu)))
cpumask_set_cpu(cpu, &mask);
}
smp_call_function_many(&mask, ipi_flush_tlb_a15_erratum, NULL, 1);
}
void flush_tlb_all(void) void flush_tlb_all(void)
{ {
if (tlb_ops_need_broadcast()) if (tlb_ops_need_broadcast())
on_each_cpu(ipi_flush_tlb_all, NULL, 1); on_each_cpu(ipi_flush_tlb_all, NULL, 1);
else else
local_flush_tlb_all(); local_flush_tlb_all();
broadcast_tlb_a15_erratum();
} }
void flush_tlb_mm(struct mm_struct *mm) void flush_tlb_mm(struct mm_struct *mm)
@ -83,6 +144,7 @@ void flush_tlb_mm(struct mm_struct *mm)
on_each_cpu_mask(mm_cpumask(mm), ipi_flush_tlb_mm, mm, 1); on_each_cpu_mask(mm_cpumask(mm), ipi_flush_tlb_mm, mm, 1);
else else
local_flush_tlb_mm(mm); local_flush_tlb_mm(mm);
broadcast_tlb_mm_a15_erratum(mm);
} }
void flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr) void flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr)
@ -95,6 +157,7 @@ void flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr)
&ta, 1); &ta, 1);
} else } else
local_flush_tlb_page(vma, uaddr); local_flush_tlb_page(vma, uaddr);
broadcast_tlb_mm_a15_erratum(vma->vm_mm);
} }
void flush_tlb_kernel_page(unsigned long kaddr) void flush_tlb_kernel_page(unsigned long kaddr)
@ -105,6 +168,7 @@ void flush_tlb_kernel_page(unsigned long kaddr)
on_each_cpu(ipi_flush_tlb_kernel_page, &ta, 1); on_each_cpu(ipi_flush_tlb_kernel_page, &ta, 1);
} else } else
local_flush_tlb_kernel_page(kaddr); local_flush_tlb_kernel_page(kaddr);
broadcast_tlb_a15_erratum();
} }
void flush_tlb_range(struct vm_area_struct *vma, void flush_tlb_range(struct vm_area_struct *vma,
@ -119,6 +183,7 @@ void flush_tlb_range(struct vm_area_struct *vma,
&ta, 1); &ta, 1);
} else } else
local_flush_tlb_range(vma, start, end); local_flush_tlb_range(vma, start, end);
broadcast_tlb_mm_a15_erratum(vma->vm_mm);
} }
void flush_tlb_kernel_range(unsigned long start, unsigned long end) void flush_tlb_kernel_range(unsigned long start, unsigned long end)
@ -130,6 +195,7 @@ void flush_tlb_kernel_range(unsigned long start, unsigned long end)
on_each_cpu(ipi_flush_tlb_kernel_range, &ta, 1); on_each_cpu(ipi_flush_tlb_kernel_range, &ta, 1);
} else } else
local_flush_tlb_kernel_range(start, end); local_flush_tlb_kernel_range(start, end);
broadcast_tlb_a15_erratum();
} }
void flush_bp_all(void) void flush_bp_all(void)

View File

@ -883,8 +883,7 @@ static bool vgic_queue_irq(struct kvm_vcpu *vcpu, u8 sgi_source_id, int irq)
lr, irq, vgic_cpu->vgic_lr[lr]); lr, irq, vgic_cpu->vgic_lr[lr]);
BUG_ON(!test_bit(lr, vgic_cpu->lr_used)); BUG_ON(!test_bit(lr, vgic_cpu->lr_used));
vgic_cpu->vgic_lr[lr] |= GICH_LR_PENDING_BIT; vgic_cpu->vgic_lr[lr] |= GICH_LR_PENDING_BIT;
return true;
goto out;
} }
/* Try to use another LR for this interrupt */ /* Try to use another LR for this interrupt */
@ -898,7 +897,6 @@ static bool vgic_queue_irq(struct kvm_vcpu *vcpu, u8 sgi_source_id, int irq)
vgic_cpu->vgic_irq_lr_map[irq] = lr; vgic_cpu->vgic_irq_lr_map[irq] = lr;
set_bit(lr, vgic_cpu->lr_used); set_bit(lr, vgic_cpu->lr_used);
out:
if (!vgic_irq_is_edge(vcpu, irq)) if (!vgic_irq_is_edge(vcpu, irq))
vgic_cpu->vgic_lr[lr] |= GICH_LR_EOI; vgic_cpu->vgic_lr[lr] |= GICH_LR_EOI;
@ -1018,21 +1016,6 @@ static bool vgic_process_maintenance(struct kvm_vcpu *vcpu)
kvm_debug("MISR = %08x\n", vgic_cpu->vgic_misr); kvm_debug("MISR = %08x\n", vgic_cpu->vgic_misr);
/*
* We do not need to take the distributor lock here, since the only
* action we perform is clearing the irq_active_bit for an EOIed
* level interrupt. There is a potential race with
* the queuing of an interrupt in __kvm_vgic_flush_hwstate(), where we
* check if the interrupt is already active. Two possibilities:
*
* - The queuing is occurring on the same vcpu: cannot happen,
* as we're already in the context of this vcpu, and
* executing the handler
* - The interrupt has been migrated to another vcpu, and we
* ignore this interrupt for this run. Big deal. It is still
* pending though, and will get considered when this vcpu
* exits.
*/
if (vgic_cpu->vgic_misr & GICH_MISR_EOI) { if (vgic_cpu->vgic_misr & GICH_MISR_EOI) {
/* /*
* Some level interrupts have been EOIed. Clear their * Some level interrupts have been EOIed. Clear their
@ -1054,6 +1037,13 @@ static bool vgic_process_maintenance(struct kvm_vcpu *vcpu)
} else { } else {
vgic_cpu_irq_clear(vcpu, irq); vgic_cpu_irq_clear(vcpu, irq);
} }
/*
* Despite being EOIed, the LR may not have
* been marked as empty.
*/
set_bit(lr, (unsigned long *)vgic_cpu->vgic_elrsr);
vgic_cpu->vgic_lr[lr] &= ~GICH_LR_ACTIVE_BIT;
} }
} }
@ -1064,9 +1054,8 @@ static bool vgic_process_maintenance(struct kvm_vcpu *vcpu)
} }
/* /*
* Sync back the VGIC state after a guest run. We do not really touch * Sync back the VGIC state after a guest run. The distributor lock is
* the distributor here (the irq_pending_on_cpu bit is safe to set), * needed so we don't get preempted in the middle of the state processing.
* so there is no need for taking its lock.
*/ */
static void __kvm_vgic_sync_hwstate(struct kvm_vcpu *vcpu) static void __kvm_vgic_sync_hwstate(struct kvm_vcpu *vcpu)
{ {
@ -1112,10 +1101,14 @@ void kvm_vgic_flush_hwstate(struct kvm_vcpu *vcpu)
void kvm_vgic_sync_hwstate(struct kvm_vcpu *vcpu) void kvm_vgic_sync_hwstate(struct kvm_vcpu *vcpu)
{ {
struct vgic_dist *dist = &vcpu->kvm->arch.vgic;
if (!irqchip_in_kernel(vcpu->kvm)) if (!irqchip_in_kernel(vcpu->kvm))
return; return;
spin_lock(&dist->lock);
__kvm_vgic_sync_hwstate(vcpu); __kvm_vgic_sync_hwstate(vcpu);
spin_unlock(&dist->lock);
} }
int kvm_vgic_vcpu_pending_irq(struct kvm_vcpu *vcpu) int kvm_vgic_vcpu_pending_irq(struct kvm_vcpu *vcpu)

View File

@ -58,7 +58,7 @@ static void __timer_delay(unsigned long cycles)
static void __timer_const_udelay(unsigned long xloops) static void __timer_const_udelay(unsigned long xloops)
{ {
unsigned long long loops = xloops; unsigned long long loops = xloops;
loops *= loops_per_jiffy; loops *= arm_delay_ops.ticks_per_jiffy;
__timer_delay(loops >> UDELAY_SHIFT); __timer_delay(loops >> UDELAY_SHIFT);
} }
@ -73,11 +73,13 @@ void __init register_current_timer_delay(const struct delay_timer *timer)
pr_info("Switching to timer-based delay loop\n"); pr_info("Switching to timer-based delay loop\n");
delay_timer = timer; delay_timer = timer;
lpj_fine = timer->freq / HZ; lpj_fine = timer->freq / HZ;
loops_per_jiffy = lpj_fine;
/* cpufreq may scale loops_per_jiffy, so keep a private copy */
arm_delay_ops.ticks_per_jiffy = lpj_fine;
arm_delay_ops.delay = __timer_delay; arm_delay_ops.delay = __timer_delay;
arm_delay_ops.const_udelay = __timer_const_udelay; arm_delay_ops.const_udelay = __timer_const_udelay;
arm_delay_ops.udelay = __timer_udelay; arm_delay_ops.udelay = __timer_udelay;
arm_delay_ops.const_clock = true;
delay_calibrated = true; delay_calibrated = true;
} else { } else {
pr_info("Ignoring duplicate/late registration of read_current_timer delay\n"); pr_info("Ignoring duplicate/late registration of read_current_timer delay\n");

View File

@ -299,7 +299,7 @@ static void l2x0_unlock(u32 cache_id)
int lockregs; int lockregs;
int i; int i;
switch (cache_id) { switch (cache_id & L2X0_CACHE_ID_PART_MASK) {
case L2X0_CACHE_ID_PART_L310: case L2X0_CACHE_ID_PART_L310:
lockregs = 8; lockregs = 8;
break; break;
@ -333,15 +333,14 @@ void __init l2x0_init(void __iomem *base, u32 aux_val, u32 aux_mask)
if (cache_id_part_number_from_dt) if (cache_id_part_number_from_dt)
cache_id = cache_id_part_number_from_dt; cache_id = cache_id_part_number_from_dt;
else else
cache_id = readl_relaxed(l2x0_base + L2X0_CACHE_ID) cache_id = readl_relaxed(l2x0_base + L2X0_CACHE_ID);
& L2X0_CACHE_ID_PART_MASK;
aux = readl_relaxed(l2x0_base + L2X0_AUX_CTRL); aux = readl_relaxed(l2x0_base + L2X0_AUX_CTRL);
aux &= aux_mask; aux &= aux_mask;
aux |= aux_val; aux |= aux_val;
/* Determine the number of ways */ /* Determine the number of ways */
switch (cache_id) { switch (cache_id & L2X0_CACHE_ID_PART_MASK) {
case L2X0_CACHE_ID_PART_L310: case L2X0_CACHE_ID_PART_L310:
if (aux & (1 << 16)) if (aux & (1 << 16))
ways = 16; ways = 16;
@ -725,7 +724,6 @@ static const struct l2x0_of_data pl310_data = {
.flush_all = l2x0_flush_all, .flush_all = l2x0_flush_all,
.inv_all = l2x0_inv_all, .inv_all = l2x0_inv_all,
.disable = l2x0_disable, .disable = l2x0_disable,
.set_debug = pl310_set_debug,
}, },
}; };
@ -814,9 +812,8 @@ int __init l2x0_of_init(u32 aux_val, u32 aux_mask)
data->save(); data->save();
of_init = true; of_init = true;
l2x0_init(l2x0_base, aux_val, aux_mask);
memcpy(&outer_cache, &data->outer_cache, sizeof(outer_cache)); memcpy(&outer_cache, &data->outer_cache, sizeof(outer_cache));
l2x0_init(l2x0_base, aux_val, aux_mask);
return 0; return 0;
} }

View File

@ -48,7 +48,7 @@ static DEFINE_RAW_SPINLOCK(cpu_asid_lock);
static atomic64_t asid_generation = ATOMIC64_INIT(ASID_FIRST_VERSION); static atomic64_t asid_generation = ATOMIC64_INIT(ASID_FIRST_VERSION);
static DECLARE_BITMAP(asid_map, NUM_USER_ASIDS); static DECLARE_BITMAP(asid_map, NUM_USER_ASIDS);
static DEFINE_PER_CPU(atomic64_t, active_asids); DEFINE_PER_CPU(atomic64_t, active_asids);
static DEFINE_PER_CPU(u64, reserved_asids); static DEFINE_PER_CPU(u64, reserved_asids);
static cpumask_t tlb_flush_pending; static cpumask_t tlb_flush_pending;
@ -215,6 +215,7 @@ void check_and_switch_context(struct mm_struct *mm, struct task_struct *tsk)
if (cpumask_test_and_clear_cpu(cpu, &tlb_flush_pending)) { if (cpumask_test_and_clear_cpu(cpu, &tlb_flush_pending)) {
local_flush_bp_all(); local_flush_bp_all();
local_flush_tlb_all(); local_flush_tlb_all();
dummy_flush_tlb_a15_erratum();
} }
atomic64_set(&per_cpu(active_asids, cpu), asid); atomic64_set(&per_cpu(active_asids, cpu), asid);

View File

@ -598,39 +598,60 @@ static void __init alloc_init_pte(pmd_t *pmd, unsigned long addr,
} while (pte++, addr += PAGE_SIZE, addr != end); } while (pte++, addr += PAGE_SIZE, addr != end);
} }
static void __init alloc_init_section(pud_t *pud, unsigned long addr, static void __init map_init_section(pmd_t *pmd, unsigned long addr,
unsigned long end, phys_addr_t phys,
const struct mem_type *type)
{
#ifndef CONFIG_ARM_LPAE
/*
* In classic MMU format, puds and pmds are folded in to
* the pgds. pmd_offset gives the PGD entry. PGDs refer to a
* group of L1 entries making up one logical pointer to
* an L2 table (2MB), where as PMDs refer to the individual
* L1 entries (1MB). Hence increment to get the correct
* offset for odd 1MB sections.
* (See arch/arm/include/asm/pgtable-2level.h)
*/
if (addr & SECTION_SIZE)
pmd++;
#endif
do {
*pmd = __pmd(phys | type->prot_sect);
phys += SECTION_SIZE;
} while (pmd++, addr += SECTION_SIZE, addr != end);
flush_pmd_entry(pmd);
}
static void __init alloc_init_pmd(pud_t *pud, unsigned long addr,
unsigned long end, phys_addr_t phys, unsigned long end, phys_addr_t phys,
const struct mem_type *type) const struct mem_type *type)
{ {
pmd_t *pmd = pmd_offset(pud, addr); pmd_t *pmd = pmd_offset(pud, addr);
unsigned long next;
/* do {
* Try a section mapping - end, addr and phys must all be aligned
* to a section boundary. Note that PMDs refer to the individual
* L1 entries, whereas PGDs refer to a group of L1 entries making
* up one logical pointer to an L2 table.
*/
if (type->prot_sect && ((addr | end | phys) & ~SECTION_MASK) == 0) {
pmd_t *p = pmd;
#ifndef CONFIG_ARM_LPAE
if (addr & SECTION_SIZE)
pmd++;
#endif
do {
*pmd = __pmd(phys | type->prot_sect);
phys += SECTION_SIZE;
} while (pmd++, addr += SECTION_SIZE, addr != end);
flush_pmd_entry(p);
} else {
/* /*
* No need to loop; pte's aren't interested in the * With LPAE, we must loop over to map
* individual L1 entries. * all the pmds for the given range.
*/ */
alloc_init_pte(pmd, addr, end, __phys_to_pfn(phys), type); next = pmd_addr_end(addr, end);
}
/*
* Try a section mapping - addr, next and phys must all be
* aligned to a section boundary.
*/
if (type->prot_sect &&
((addr | next | phys) & ~SECTION_MASK) == 0) {
map_init_section(pmd, addr, next, phys, type);
} else {
alloc_init_pte(pmd, addr, next,
__phys_to_pfn(phys), type);
}
phys += next - addr;
} while (pmd++, addr = next, addr != end);
} }
static void __init alloc_init_pud(pgd_t *pgd, unsigned long addr, static void __init alloc_init_pud(pgd_t *pgd, unsigned long addr,
@ -641,7 +662,7 @@ static void __init alloc_init_pud(pgd_t *pgd, unsigned long addr,
do { do {
next = pud_addr_end(addr, end); next = pud_addr_end(addr, end);
alloc_init_section(pud, addr, next, phys, type); alloc_init_pmd(pud, addr, next, phys, type);
phys += next - addr; phys += next - addr;
} while (pud++, addr = next, addr != end); } while (pud++, addr = next, addr != end);
} }

View File

@ -420,7 +420,7 @@ __v7_pj4b_proc_info:
__v7_ca7mp_proc_info: __v7_ca7mp_proc_info:
.long 0x410fc070 .long 0x410fc070
.long 0xff0ffff0 .long 0xff0ffff0
__v7_proc __v7_ca7mp_setup, hwcaps = HWCAP_IDIV __v7_proc __v7_ca7mp_setup
.size __v7_ca7mp_proc_info, . - __v7_ca7mp_proc_info .size __v7_ca7mp_proc_info, . - __v7_ca7mp_proc_info
/* /*
@ -430,9 +430,24 @@ __v7_ca7mp_proc_info:
__v7_ca15mp_proc_info: __v7_ca15mp_proc_info:
.long 0x410fc0f0 .long 0x410fc0f0
.long 0xff0ffff0 .long 0xff0ffff0
__v7_proc __v7_ca15mp_setup, hwcaps = HWCAP_IDIV __v7_proc __v7_ca15mp_setup
.size __v7_ca15mp_proc_info, . - __v7_ca15mp_proc_info .size __v7_ca15mp_proc_info, . - __v7_ca15mp_proc_info
/*
* Qualcomm Inc. Krait processors.
*/
.type __krait_proc_info, #object
__krait_proc_info:
.long 0x510f0400 @ Required ID value
.long 0xff0ffc00 @ Mask for ID
/*
* Some Krait processors don't indicate support for SDIV and UDIV
* instructions in the ARM instruction set, even though they actually
* do support them.
*/
__v7_proc __v7_setup, hwcaps = HWCAP_IDIV
.size __krait_proc_info, . - __krait_proc_info
/* /*
* Match any ARMv7 processor core. * Match any ARMv7 processor core.
*/ */

View File

@ -657,7 +657,7 @@ config SNI_RM
bool "SNI RM200/300/400" bool "SNI RM200/300/400"
select FW_ARC if CPU_LITTLE_ENDIAN select FW_ARC if CPU_LITTLE_ENDIAN
select FW_ARC32 if CPU_LITTLE_ENDIAN select FW_ARC32 if CPU_LITTLE_ENDIAN
select SNIPROM if CPU_BIG_ENDIAN select FW_SNIPROM if CPU_BIG_ENDIAN
select ARCH_MAY_HAVE_PC_FDC select ARCH_MAY_HAVE_PC_FDC
select BOOT_ELF32 select BOOT_ELF32
select CEVT_R4K select CEVT_R4K
@ -1144,7 +1144,7 @@ config DEFAULT_SGI_PARTITION
config FW_ARC32 config FW_ARC32
bool bool
config SNIPROM config FW_SNIPROM
bool bool
config BOOT_ELF32 config BOOT_ELF32

View File

@ -174,7 +174,10 @@ static int octeon_kexec_prepare(struct kimage *image)
static void octeon_generic_shutdown(void) static void octeon_generic_shutdown(void)
{ {
int cpu, i; int i;
#ifdef CONFIG_SMP
int cpu;
#endif
struct cvmx_bootmem_desc *bootmem_desc; struct cvmx_bootmem_desc *bootmem_desc;
void *named_block_array_ptr; void *named_block_array_ptr;

View File

@ -72,6 +72,12 @@ typedef unsigned long old_sigset_t; /* at least 32 bits */
* *
* SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single
* Unix names RESETHAND and NODEFER respectively. * Unix names RESETHAND and NODEFER respectively.
*
* SA_RESTORER used to be defined as 0x04000000 but only the O32 ABI ever
* supported its use and no libc was using it, so the entire sa-restorer
* functionality was removed with lmo commit 39bffc12c3580ab for 2.5.48
* retaining only the SA_RESTORER definition as a reminder to avoid
* accidental reuse of the mask bit.
*/ */
#define SA_ONSTACK 0x08000000 #define SA_ONSTACK 0x08000000
#define SA_RESETHAND 0x80000000 #define SA_RESETHAND 0x80000000
@ -84,8 +90,6 @@ typedef unsigned long old_sigset_t; /* at least 32 bits */
#define SA_NOMASK SA_NODEFER #define SA_NOMASK SA_NODEFER
#define SA_ONESHOT SA_RESETHAND #define SA_ONESHOT SA_RESETHAND
#define SA_RESTORER 0x04000000 /* Only for o32 */
#define MINSIGSTKSZ 2048 #define MINSIGSTKSZ 2048
#define SIGSTKSZ 8192 #define SIGSTKSZ 8192

View File

@ -1227,10 +1227,8 @@ __cpuinit void cpu_probe(void)
if (c->options & MIPS_CPU_FPU) { if (c->options & MIPS_CPU_FPU) {
c->fpu_id = cpu_get_fpu_id(); c->fpu_id = cpu_get_fpu_id();
if (c->isa_level == MIPS_CPU_ISA_M32R1 || if (c->isa_level & (MIPS_CPU_ISA_M32R1 | MIPS_CPU_ISA_M32R2 |
c->isa_level == MIPS_CPU_ISA_M32R2 || MIPS_CPU_ISA_M64R1 | MIPS_CPU_ISA_M64R2)) {
c->isa_level == MIPS_CPU_ISA_M64R1 ||
c->isa_level == MIPS_CPU_ISA_M64R2) {
if (c->fpu_id & MIPS_FPIR_3D) if (c->fpu_id & MIPS_FPIR_3D)
c->ases |= MIPS_ASE_MIPS3D; c->ases |= MIPS_ASE_MIPS3D;
} }

View File

@ -46,10 +46,9 @@
PTR_L a5, PT_R9(sp) PTR_L a5, PT_R9(sp)
PTR_L a6, PT_R10(sp) PTR_L a6, PT_R10(sp)
PTR_L a7, PT_R11(sp) PTR_L a7, PT_R11(sp)
#else
PTR_ADDIU sp, PT_SIZE
#endif #endif
.endm PTR_ADDIU sp, PT_SIZE
.endm
.macro RETURN_BACK .macro RETURN_BACK
jr ra jr ra
@ -68,7 +67,11 @@ NESTED(ftrace_caller, PT_SIZE, ra)
.globl _mcount .globl _mcount
_mcount: _mcount:
b ftrace_stub b ftrace_stub
addiu sp,sp,8 #ifdef CONFIG_32BIT
addiu sp,sp,8
#else
nop
#endif
/* When tracing is activated, it calls ftrace_caller+8 (aka here) */ /* When tracing is activated, it calls ftrace_caller+8 (aka here) */
lw t1, function_trace_stop lw t1, function_trace_stop

View File

@ -1571,7 +1571,7 @@ void __cpuinit per_cpu_trap_init(bool is_boot_cpu)
#ifdef CONFIG_64BIT #ifdef CONFIG_64BIT
status_set |= ST0_FR|ST0_KX|ST0_SX|ST0_UX; status_set |= ST0_FR|ST0_KX|ST0_SX|ST0_UX;
#endif #endif
if (current_cpu_data.isa_level == MIPS_CPU_ISA_IV) if (current_cpu_data.isa_level & MIPS_CPU_ISA_IV)
status_set |= ST0_XX; status_set |= ST0_XX;
if (cpu_has_dsp) if (cpu_has_dsp)
status_set |= ST0_MX; status_set |= ST0_MX;

View File

@ -1247,10 +1247,8 @@ static void __cpuinit setup_scache(void)
return; return;
default: default:
if (c->isa_level == MIPS_CPU_ISA_M32R1 || if (c->isa_level & (MIPS_CPU_ISA_M32R1 | MIPS_CPU_ISA_M32R2 |
c->isa_level == MIPS_CPU_ISA_M32R2 || MIPS_CPU_ISA_M64R1 | MIPS_CPU_ISA_M64R2)) {
c->isa_level == MIPS_CPU_ISA_M64R1 ||
c->isa_level == MIPS_CPU_ISA_M64R2) {
#ifdef CONFIG_MIPS_CPU_SCACHE #ifdef CONFIG_MIPS_CPU_SCACHE
if (mips_sc_init ()) { if (mips_sc_init ()) {
scache_size = c->scache.ways * c->scache.sets * c->scache.linesz; scache_size = c->scache.ways * c->scache.sets * c->scache.linesz;

View File

@ -98,10 +98,8 @@ static inline int __init mips_sc_probe(void)
c->scache.flags |= MIPS_CACHE_NOT_PRESENT; c->scache.flags |= MIPS_CACHE_NOT_PRESENT;
/* Ignore anything but MIPSxx processors */ /* Ignore anything but MIPSxx processors */
if (c->isa_level != MIPS_CPU_ISA_M32R1 && if (!(c->isa_level & (MIPS_CPU_ISA_M32R1 | MIPS_CPU_ISA_M32R2 |
c->isa_level != MIPS_CPU_ISA_M32R2 && MIPS_CPU_ISA_M64R1 | MIPS_CPU_ISA_M64R2)))
c->isa_level != MIPS_CPU_ISA_M64R1 &&
c->isa_level != MIPS_CPU_ISA_M64R2)
return 0; return 0;
/* Does this MIPS32/MIPS64 CPU have a config2 register? */ /* Does this MIPS32/MIPS64 CPU have a config2 register? */

View File

@ -19,7 +19,7 @@
#include <asm/mach-au1x00/au1000.h> #include <asm/mach-au1x00/au1000.h>
#include <asm/tlbmisc.h> #include <asm/tlbmisc.h>
#ifdef CONFIG_DEBUG_PCI #ifdef CONFIG_PCI_DEBUG
#define DBG(x...) printk(KERN_DEBUG x) #define DBG(x...) printk(KERN_DEBUG x)
#else #else
#define DBG(x...) do {} while (0) #define DBG(x...) do {} while (0)
@ -162,7 +162,7 @@ static int config_access(unsigned char access_type, struct pci_bus *bus,
if (status & (1 << 29)) { if (status & (1 << 29)) {
*data = 0xffffffff; *data = 0xffffffff;
error = -1; error = -1;
DBG("alchemy-pci: master abort on cfg access %d bus %d dev %d", DBG("alchemy-pci: master abort on cfg access %d bus %d dev %d\n",
access_type, bus->number, device); access_type, bus->number, device);
} else if ((status >> 28) & 0xf) { } else if ((status >> 28) & 0xf) {
DBG("alchemy-pci: PCI ERR detected: dev %d, status %lx\n", DBG("alchemy-pci: PCI ERR detected: dev %d, status %lx\n",

View File

@ -344,6 +344,7 @@ extern unsigned long MODULES_END;
#define _REGION3_ENTRY_CO 0x100 /* change-recording override */ #define _REGION3_ENTRY_CO 0x100 /* change-recording override */
/* Bits in the segment table entry */ /* Bits in the segment table entry */
#define _SEGMENT_ENTRY_ORIGIN_LARGE ~0xfffffUL /* large page address */
#define _SEGMENT_ENTRY_ORIGIN ~0x7ffUL/* segment table origin */ #define _SEGMENT_ENTRY_ORIGIN ~0x7ffUL/* segment table origin */
#define _SEGMENT_ENTRY_RO 0x200 /* page protection bit */ #define _SEGMENT_ENTRY_RO 0x200 /* page protection bit */
#define _SEGMENT_ENTRY_INV 0x20 /* invalid segment table entry */ #define _SEGMENT_ENTRY_INV 0x20 /* invalid segment table entry */
@ -1531,7 +1532,8 @@ extern int s390_enable_sie(void);
/* /*
* No page table caches to initialise * No page table caches to initialise
*/ */
#define pgtable_cache_init() do { } while (0) static inline void pgtable_cache_init(void) { }
static inline void check_pgt_cache(void) { }
#include <asm-generic/pgtable.h> #include <asm-generic/pgtable.h>

View File

@ -77,42 +77,69 @@ static size_t copy_in_kernel(size_t count, void __user *to,
* >= -4095 (IS_ERR_VALUE(x) returns true), a fault has occured and the address * >= -4095 (IS_ERR_VALUE(x) returns true), a fault has occured and the address
* contains the (negative) exception code. * contains the (negative) exception code.
*/ */
static __always_inline unsigned long follow_table(struct mm_struct *mm, #ifdef CONFIG_64BIT
unsigned long addr, int write) static unsigned long follow_table(struct mm_struct *mm,
unsigned long address, int write)
{ {
pgd_t *pgd; unsigned long *table = (unsigned long *)__pa(mm->pgd);
pud_t *pud;
pmd_t *pmd;
pte_t *ptep;
pgd = pgd_offset(mm, addr); switch (mm->context.asce_bits & _ASCE_TYPE_MASK) {
if (pgd_none(*pgd) || unlikely(pgd_bad(*pgd))) case _ASCE_TYPE_REGION1:
return -0x3aUL; table = table + ((address >> 53) & 0x7ff);
if (unlikely(*table & _REGION_ENTRY_INV))
pud = pud_offset(pgd, addr); return -0x39UL;
if (pud_none(*pud) || unlikely(pud_bad(*pud))) table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN);
return -0x3bUL; case _ASCE_TYPE_REGION2:
table = table + ((address >> 42) & 0x7ff);
pmd = pmd_offset(pud, addr); if (unlikely(*table & _REGION_ENTRY_INV))
if (pmd_none(*pmd)) return -0x3aUL;
return -0x10UL; table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN);
if (pmd_large(*pmd)) { case _ASCE_TYPE_REGION3:
if (write && (pmd_val(*pmd) & _SEGMENT_ENTRY_RO)) table = table + ((address >> 31) & 0x7ff);
return -0x04UL; if (unlikely(*table & _REGION_ENTRY_INV))
return (pmd_val(*pmd) & HPAGE_MASK) + (addr & ~HPAGE_MASK); return -0x3bUL;
table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN);
case _ASCE_TYPE_SEGMENT:
table = table + ((address >> 20) & 0x7ff);
if (unlikely(*table & _SEGMENT_ENTRY_INV))
return -0x10UL;
if (unlikely(*table & _SEGMENT_ENTRY_LARGE)) {
if (write && (*table & _SEGMENT_ENTRY_RO))
return -0x04UL;
return (*table & _SEGMENT_ENTRY_ORIGIN_LARGE) +
(address & ~_SEGMENT_ENTRY_ORIGIN_LARGE);
}
table = (unsigned long *)(*table & _SEGMENT_ENTRY_ORIGIN);
} }
if (unlikely(pmd_bad(*pmd))) table = table + ((address >> 12) & 0xff);
return -0x10UL; if (unlikely(*table & _PAGE_INVALID))
ptep = pte_offset_map(pmd, addr);
if (!pte_present(*ptep))
return -0x11UL; return -0x11UL;
if (write && (!pte_write(*ptep) || !pte_dirty(*ptep))) if (write && (*table & _PAGE_RO))
return -0x04UL; return -0x04UL;
return (*table & PAGE_MASK) + (address & ~PAGE_MASK);
return (pte_val(*ptep) & PAGE_MASK) + (addr & ~PAGE_MASK);
} }
#else /* CONFIG_64BIT */
static unsigned long follow_table(struct mm_struct *mm,
unsigned long address, int write)
{
unsigned long *table = (unsigned long *)__pa(mm->pgd);
table = table + ((address >> 20) & 0x7ff);
if (unlikely(*table & _SEGMENT_ENTRY_INV))
return -0x10UL;
table = (unsigned long *)(*table & _SEGMENT_ENTRY_ORIGIN);
table = table + ((address >> 12) & 0xff);
if (unlikely(*table & _PAGE_INVALID))
return -0x11UL;
if (write && (*table & _PAGE_RO))
return -0x04UL;
return (*table & PAGE_MASK) + (address & ~PAGE_MASK);
}
#endif /* CONFIG_64BIT */
static __always_inline size_t __user_copy_pt(unsigned long uaddr, void *kptr, static __always_inline size_t __user_copy_pt(unsigned long uaddr, void *kptr,
size_t n, int write_user) size_t n, int write_user)
{ {
@ -197,7 +224,7 @@ size_t copy_to_user_pt(size_t n, void __user *to, const void *from)
static size_t clear_user_pt(size_t n, void __user *to) static size_t clear_user_pt(size_t n, void __user *to)
{ {
void *zpage = &empty_zero_page; void *zpage = (void *) empty_zero_page;
long done, size, ret; long done, size, ret;
done = 0; done = 0;

View File

@ -396,7 +396,7 @@ config ACPI_CUSTOM_METHOD
config ACPI_BGRT config ACPI_BGRT
bool "Boottime Graphics Resource Table support" bool "Boottime Graphics Resource Table support"
depends on EFI depends on EFI && X86
help help
This driver adds support for exposing the ACPI Boottime Graphics This driver adds support for exposing the ACPI Boottime Graphics
Resource Table, which allows the operating system to obtain Resource Table, which allows the operating system to obtain

View File

@ -90,7 +90,7 @@ void acpi_i2c_register_devices(struct i2c_adapter *adapter)
acpi_handle handle; acpi_handle handle;
acpi_status status; acpi_status status;
handle = ACPI_HANDLE(&adapter->dev); handle = ACPI_HANDLE(adapter->dev.parent);
if (!handle) if (!handle)
return; return;

View File

@ -66,7 +66,8 @@ module_param(latency_factor, uint, 0644);
static DEFINE_PER_CPU(struct cpuidle_device *, acpi_cpuidle_device); static DEFINE_PER_CPU(struct cpuidle_device *, acpi_cpuidle_device);
static struct acpi_processor_cx *acpi_cstate[CPUIDLE_STATE_MAX]; static DEFINE_PER_CPU(struct acpi_processor_cx * [CPUIDLE_STATE_MAX],
acpi_cstate);
static int disabled_by_idle_boot_param(void) static int disabled_by_idle_boot_param(void)
{ {
@ -722,7 +723,7 @@ static int acpi_idle_enter_c1(struct cpuidle_device *dev,
struct cpuidle_driver *drv, int index) struct cpuidle_driver *drv, int index)
{ {
struct acpi_processor *pr; struct acpi_processor *pr;
struct acpi_processor_cx *cx = acpi_cstate[index]; struct acpi_processor_cx *cx = per_cpu(acpi_cstate[index], dev->cpu);
pr = __this_cpu_read(processors); pr = __this_cpu_read(processors);
@ -745,7 +746,7 @@ static int acpi_idle_enter_c1(struct cpuidle_device *dev,
*/ */
static int acpi_idle_play_dead(struct cpuidle_device *dev, int index) static int acpi_idle_play_dead(struct cpuidle_device *dev, int index)
{ {
struct acpi_processor_cx *cx = acpi_cstate[index]; struct acpi_processor_cx *cx = per_cpu(acpi_cstate[index], dev->cpu);
ACPI_FLUSH_CPU_CACHE(); ACPI_FLUSH_CPU_CACHE();
@ -775,7 +776,7 @@ static int acpi_idle_enter_simple(struct cpuidle_device *dev,
struct cpuidle_driver *drv, int index) struct cpuidle_driver *drv, int index)
{ {
struct acpi_processor *pr; struct acpi_processor *pr;
struct acpi_processor_cx *cx = acpi_cstate[index]; struct acpi_processor_cx *cx = per_cpu(acpi_cstate[index], dev->cpu);
pr = __this_cpu_read(processors); pr = __this_cpu_read(processors);
@ -833,7 +834,7 @@ static int acpi_idle_enter_bm(struct cpuidle_device *dev,
struct cpuidle_driver *drv, int index) struct cpuidle_driver *drv, int index)
{ {
struct acpi_processor *pr; struct acpi_processor *pr;
struct acpi_processor_cx *cx = acpi_cstate[index]; struct acpi_processor_cx *cx = per_cpu(acpi_cstate[index], dev->cpu);
pr = __this_cpu_read(processors); pr = __this_cpu_read(processors);
@ -960,7 +961,7 @@ static int acpi_processor_setup_cpuidle_cx(struct acpi_processor *pr,
!(acpi_gbl_FADT.flags & ACPI_FADT_C2_MP_SUPPORTED)) !(acpi_gbl_FADT.flags & ACPI_FADT_C2_MP_SUPPORTED))
continue; continue;
#endif #endif
acpi_cstate[count] = cx; per_cpu(acpi_cstate[count], dev->cpu) = cx;
count++; count++;
if (count == CPUIDLE_STATE_MAX) if (count == CPUIDLE_STATE_MAX)

View File

@ -46,6 +46,7 @@
#include "power.h" #include "power.h"
static DEFINE_MUTEX(dev_pm_qos_mtx); static DEFINE_MUTEX(dev_pm_qos_mtx);
static DEFINE_MUTEX(dev_pm_qos_sysfs_mtx);
static BLOCKING_NOTIFIER_HEAD(dev_pm_notifiers); static BLOCKING_NOTIFIER_HEAD(dev_pm_notifiers);
@ -216,12 +217,17 @@ void dev_pm_qos_constraints_destroy(struct device *dev)
struct pm_qos_constraints *c; struct pm_qos_constraints *c;
struct pm_qos_flags *f; struct pm_qos_flags *f;
mutex_lock(&dev_pm_qos_mtx); mutex_lock(&dev_pm_qos_sysfs_mtx);
/* /*
* If the device's PM QoS resume latency limit or PM QoS flags have been * If the device's PM QoS resume latency limit or PM QoS flags have been
* exposed to user space, they have to be hidden at this point. * exposed to user space, they have to be hidden at this point.
*/ */
pm_qos_sysfs_remove_latency(dev);
pm_qos_sysfs_remove_flags(dev);
mutex_lock(&dev_pm_qos_mtx);
__dev_pm_qos_hide_latency_limit(dev); __dev_pm_qos_hide_latency_limit(dev);
__dev_pm_qos_hide_flags(dev); __dev_pm_qos_hide_flags(dev);
@ -254,6 +260,8 @@ void dev_pm_qos_constraints_destroy(struct device *dev)
out: out:
mutex_unlock(&dev_pm_qos_mtx); mutex_unlock(&dev_pm_qos_mtx);
mutex_unlock(&dev_pm_qos_sysfs_mtx);
} }
/** /**
@ -558,6 +566,14 @@ static void __dev_pm_qos_drop_user_request(struct device *dev,
kfree(req); kfree(req);
} }
static void dev_pm_qos_drop_user_request(struct device *dev,
enum dev_pm_qos_req_type type)
{
mutex_lock(&dev_pm_qos_mtx);
__dev_pm_qos_drop_user_request(dev, type);
mutex_unlock(&dev_pm_qos_mtx);
}
/** /**
* dev_pm_qos_expose_latency_limit - Expose PM QoS latency limit to user space. * dev_pm_qos_expose_latency_limit - Expose PM QoS latency limit to user space.
* @dev: Device whose PM QoS latency limit is to be exposed to user space. * @dev: Device whose PM QoS latency limit is to be exposed to user space.
@ -581,6 +597,8 @@ int dev_pm_qos_expose_latency_limit(struct device *dev, s32 value)
return ret; return ret;
} }
mutex_lock(&dev_pm_qos_sysfs_mtx);
mutex_lock(&dev_pm_qos_mtx); mutex_lock(&dev_pm_qos_mtx);
if (IS_ERR_OR_NULL(dev->power.qos)) if (IS_ERR_OR_NULL(dev->power.qos))
@ -591,26 +609,27 @@ int dev_pm_qos_expose_latency_limit(struct device *dev, s32 value)
if (ret < 0) { if (ret < 0) {
__dev_pm_qos_remove_request(req); __dev_pm_qos_remove_request(req);
kfree(req); kfree(req);
mutex_unlock(&dev_pm_qos_mtx);
goto out; goto out;
} }
dev->power.qos->latency_req = req; dev->power.qos->latency_req = req;
mutex_unlock(&dev_pm_qos_mtx);
ret = pm_qos_sysfs_add_latency(dev); ret = pm_qos_sysfs_add_latency(dev);
if (ret) if (ret)
__dev_pm_qos_drop_user_request(dev, DEV_PM_QOS_LATENCY); dev_pm_qos_drop_user_request(dev, DEV_PM_QOS_LATENCY);
out: out:
mutex_unlock(&dev_pm_qos_mtx); mutex_unlock(&dev_pm_qos_sysfs_mtx);
return ret; return ret;
} }
EXPORT_SYMBOL_GPL(dev_pm_qos_expose_latency_limit); EXPORT_SYMBOL_GPL(dev_pm_qos_expose_latency_limit);
static void __dev_pm_qos_hide_latency_limit(struct device *dev) static void __dev_pm_qos_hide_latency_limit(struct device *dev)
{ {
if (!IS_ERR_OR_NULL(dev->power.qos) && dev->power.qos->latency_req) { if (!IS_ERR_OR_NULL(dev->power.qos) && dev->power.qos->latency_req)
pm_qos_sysfs_remove_latency(dev);
__dev_pm_qos_drop_user_request(dev, DEV_PM_QOS_LATENCY); __dev_pm_qos_drop_user_request(dev, DEV_PM_QOS_LATENCY);
}
} }
/** /**
@ -619,9 +638,15 @@ static void __dev_pm_qos_hide_latency_limit(struct device *dev)
*/ */
void dev_pm_qos_hide_latency_limit(struct device *dev) void dev_pm_qos_hide_latency_limit(struct device *dev)
{ {
mutex_lock(&dev_pm_qos_sysfs_mtx);
pm_qos_sysfs_remove_latency(dev);
mutex_lock(&dev_pm_qos_mtx); mutex_lock(&dev_pm_qos_mtx);
__dev_pm_qos_hide_latency_limit(dev); __dev_pm_qos_hide_latency_limit(dev);
mutex_unlock(&dev_pm_qos_mtx); mutex_unlock(&dev_pm_qos_mtx);
mutex_unlock(&dev_pm_qos_sysfs_mtx);
} }
EXPORT_SYMBOL_GPL(dev_pm_qos_hide_latency_limit); EXPORT_SYMBOL_GPL(dev_pm_qos_hide_latency_limit);
@ -649,6 +674,8 @@ int dev_pm_qos_expose_flags(struct device *dev, s32 val)
} }
pm_runtime_get_sync(dev); pm_runtime_get_sync(dev);
mutex_lock(&dev_pm_qos_sysfs_mtx);
mutex_lock(&dev_pm_qos_mtx); mutex_lock(&dev_pm_qos_mtx);
if (IS_ERR_OR_NULL(dev->power.qos)) if (IS_ERR_OR_NULL(dev->power.qos))
@ -659,16 +686,19 @@ int dev_pm_qos_expose_flags(struct device *dev, s32 val)
if (ret < 0) { if (ret < 0) {
__dev_pm_qos_remove_request(req); __dev_pm_qos_remove_request(req);
kfree(req); kfree(req);
mutex_unlock(&dev_pm_qos_mtx);
goto out; goto out;
} }
dev->power.qos->flags_req = req; dev->power.qos->flags_req = req;
mutex_unlock(&dev_pm_qos_mtx);
ret = pm_qos_sysfs_add_flags(dev); ret = pm_qos_sysfs_add_flags(dev);
if (ret) if (ret)
__dev_pm_qos_drop_user_request(dev, DEV_PM_QOS_FLAGS); dev_pm_qos_drop_user_request(dev, DEV_PM_QOS_FLAGS);
out: out:
mutex_unlock(&dev_pm_qos_mtx); mutex_unlock(&dev_pm_qos_sysfs_mtx);
pm_runtime_put(dev); pm_runtime_put(dev);
return ret; return ret;
} }
@ -676,10 +706,8 @@ EXPORT_SYMBOL_GPL(dev_pm_qos_expose_flags);
static void __dev_pm_qos_hide_flags(struct device *dev) static void __dev_pm_qos_hide_flags(struct device *dev)
{ {
if (!IS_ERR_OR_NULL(dev->power.qos) && dev->power.qos->flags_req) { if (!IS_ERR_OR_NULL(dev->power.qos) && dev->power.qos->flags_req)
pm_qos_sysfs_remove_flags(dev);
__dev_pm_qos_drop_user_request(dev, DEV_PM_QOS_FLAGS); __dev_pm_qos_drop_user_request(dev, DEV_PM_QOS_FLAGS);
}
} }
/** /**
@ -689,9 +717,15 @@ static void __dev_pm_qos_hide_flags(struct device *dev)
void dev_pm_qos_hide_flags(struct device *dev) void dev_pm_qos_hide_flags(struct device *dev)
{ {
pm_runtime_get_sync(dev); pm_runtime_get_sync(dev);
mutex_lock(&dev_pm_qos_sysfs_mtx);
pm_qos_sysfs_remove_flags(dev);
mutex_lock(&dev_pm_qos_mtx); mutex_lock(&dev_pm_qos_mtx);
__dev_pm_qos_hide_flags(dev); __dev_pm_qos_hide_flags(dev);
mutex_unlock(&dev_pm_qos_mtx); mutex_unlock(&dev_pm_qos_mtx);
mutex_unlock(&dev_pm_qos_sysfs_mtx);
pm_runtime_put(dev); pm_runtime_put(dev);
} }
EXPORT_SYMBOL_GPL(dev_pm_qos_hide_flags); EXPORT_SYMBOL_GPL(dev_pm_qos_hide_flags);

View File

@ -178,10 +178,16 @@ static struct cpufreq_driver cpu0_cpufreq_driver = {
static int cpu0_cpufreq_probe(struct platform_device *pdev) static int cpu0_cpufreq_probe(struct platform_device *pdev)
{ {
struct device_node *np; struct device_node *np, *parent;
int ret; int ret;
for_each_child_of_node(of_find_node_by_path("/cpus"), np) { parent = of_find_node_by_path("/cpus");
if (!parent) {
pr_err("failed to find OF /cpus\n");
return -ENOENT;
}
for_each_child_of_node(parent, np) {
if (of_get_property(np, "operating-points", NULL)) if (of_get_property(np, "operating-points", NULL))
break; break;
} }

View File

@ -14,8 +14,8 @@
* published by the Free Software Foundation. * published by the Free Software Foundation.
*/ */
#ifndef _CPUFREQ_GOVERNER_H #ifndef _CPUFREQ_GOVERNOR_H
#define _CPUFREQ_GOVERNER_H #define _CPUFREQ_GOVERNOR_H
#include <linux/cpufreq.h> #include <linux/cpufreq.h>
#include <linux/kobject.h> #include <linux/kobject.h>
@ -175,4 +175,4 @@ bool need_load_eval(struct cpu_dbs_common_info *cdbs,
unsigned int sampling_rate); unsigned int sampling_rate);
int cpufreq_governor_dbs(struct dbs_data *dbs_data, int cpufreq_governor_dbs(struct dbs_data *dbs_data,
struct cpufreq_policy *policy, unsigned int event); struct cpufreq_policy *policy, unsigned int event);
#endif /* _CPUFREQ_GOVERNER_H */ #endif /* _CPUFREQ_GOVERNOR_H */

View File

@ -83,6 +83,7 @@ config INTEL_IOP_ADMA
config DW_DMAC config DW_DMAC
tristate "Synopsys DesignWare AHB DMA support" tristate "Synopsys DesignWare AHB DMA support"
depends on GENERIC_HARDIRQS
select DMA_ENGINE select DMA_ENGINE
default y if CPU_AT32AP7000 default y if CPU_AT32AP7000
help help

View File

@ -214,7 +214,7 @@ static int ichx_gpio_request(struct gpio_chip *chip, unsigned nr)
* If it can't be trusted, assume that the pin can be used as a GPIO. * If it can't be trusted, assume that the pin can be used as a GPIO.
*/ */
if (ichx_priv.desc->use_sel_ignore[nr / 32] & (1 << (nr & 0x1f))) if (ichx_priv.desc->use_sel_ignore[nr / 32] & (1 << (nr & 0x1f)))
return 1; return 0;
return ichx_read_bit(GPIO_USE_SEL, nr) ? 0 : -ENODEV; return ichx_read_bit(GPIO_USE_SEL, nr) ? 0 : -ENODEV;
} }

View File

@ -307,11 +307,15 @@ static const struct irq_domain_ops stmpe_gpio_irq_simple_ops = {
.xlate = irq_domain_xlate_twocell, .xlate = irq_domain_xlate_twocell,
}; };
static int stmpe_gpio_irq_init(struct stmpe_gpio *stmpe_gpio) static int stmpe_gpio_irq_init(struct stmpe_gpio *stmpe_gpio,
struct device_node *np)
{ {
int base = stmpe_gpio->irq_base; int base = 0;
stmpe_gpio->domain = irq_domain_add_simple(NULL, if (!np)
base = stmpe_gpio->irq_base;
stmpe_gpio->domain = irq_domain_add_simple(np,
stmpe_gpio->chip.ngpio, base, stmpe_gpio->chip.ngpio, base,
&stmpe_gpio_irq_simple_ops, stmpe_gpio); &stmpe_gpio_irq_simple_ops, stmpe_gpio);
if (!stmpe_gpio->domain) { if (!stmpe_gpio->domain) {
@ -346,6 +350,9 @@ static int stmpe_gpio_probe(struct platform_device *pdev)
stmpe_gpio->chip = template_chip; stmpe_gpio->chip = template_chip;
stmpe_gpio->chip.ngpio = stmpe->num_gpios; stmpe_gpio->chip.ngpio = stmpe->num_gpios;
stmpe_gpio->chip.dev = &pdev->dev; stmpe_gpio->chip.dev = &pdev->dev;
#ifdef CONFIG_OF
stmpe_gpio->chip.of_node = np;
#endif
stmpe_gpio->chip.base = pdata ? pdata->gpio_base : -1; stmpe_gpio->chip.base = pdata ? pdata->gpio_base : -1;
if (pdata) if (pdata)
@ -366,7 +373,7 @@ static int stmpe_gpio_probe(struct platform_device *pdev)
goto out_free; goto out_free;
if (irq >= 0) { if (irq >= 0) {
ret = stmpe_gpio_irq_init(stmpe_gpio); ret = stmpe_gpio_irq_init(stmpe_gpio, np);
if (ret) if (ret)
goto out_disable; goto out_disable;

View File

@ -2077,7 +2077,6 @@ static const struct hid_device_id hid_ignore_list[] = {
{ HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_HYBRID) }, { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_HYBRID) },
{ HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_HEATCONTROL) }, { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_HEATCONTROL) },
{ HID_USB_DEVICE(USB_VENDOR_ID_MADCATZ, USB_DEVICE_ID_MADCATZ_BEATPAD) }, { HID_USB_DEVICE(USB_VENDOR_ID_MADCATZ, USB_DEVICE_ID_MADCATZ_BEATPAD) },
{ HID_USB_DEVICE(USB_VENDOR_ID_MASTERKIT, USB_DEVICE_ID_MASTERKIT_MA901RADIO) },
{ HID_USB_DEVICE(USB_VENDOR_ID_MCC, USB_DEVICE_ID_MCC_PMD1024LS) }, { HID_USB_DEVICE(USB_VENDOR_ID_MCC, USB_DEVICE_ID_MCC_PMD1024LS) },
{ HID_USB_DEVICE(USB_VENDOR_ID_MCC, USB_DEVICE_ID_MCC_PMD1208LS) }, { HID_USB_DEVICE(USB_VENDOR_ID_MCC, USB_DEVICE_ID_MCC_PMD1208LS) },
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICKIT1) }, { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICKIT1) },
@ -2244,6 +2243,18 @@ bool hid_ignore(struct hid_device *hdev)
hdev->product <= USB_DEVICE_ID_VELLEMAN_K8061_LAST)) hdev->product <= USB_DEVICE_ID_VELLEMAN_K8061_LAST))
return true; return true;
break; break;
case USB_VENDOR_ID_ATMEL_V_USB:
/* Masterkit MA901 usb radio based on Atmel tiny85 chip and
* it has the same USB ID as many Atmel V-USB devices. This
* usb radio is handled by radio-ma901.c driver so we want
* ignore the hid. Check the name, bus, product and ignore
* if we have MA901 usb radio.
*/
if (hdev->product == USB_DEVICE_ID_ATMEL_V_USB &&
hdev->bus == BUS_USB &&
strncmp(hdev->name, "www.masterkit.ru MA901", 22) == 0)
return true;
break;
} }
if (hdev->type == HID_TYPE_USBMOUSE && if (hdev->type == HID_TYPE_USBMOUSE &&

View File

@ -158,6 +158,8 @@
#define USB_VENDOR_ID_ATMEL 0x03eb #define USB_VENDOR_ID_ATMEL 0x03eb
#define USB_DEVICE_ID_ATMEL_MULTITOUCH 0x211c #define USB_DEVICE_ID_ATMEL_MULTITOUCH 0x211c
#define USB_DEVICE_ID_ATMEL_MXT_DIGITIZER 0x2118 #define USB_DEVICE_ID_ATMEL_MXT_DIGITIZER 0x2118
#define USB_VENDOR_ID_ATMEL_V_USB 0x16c0
#define USB_DEVICE_ID_ATMEL_V_USB 0x05df
#define USB_VENDOR_ID_AUREAL 0x0755 #define USB_VENDOR_ID_AUREAL 0x0755
#define USB_DEVICE_ID_AUREAL_W01RN 0x2626 #define USB_DEVICE_ID_AUREAL_W01RN 0x2626
@ -557,9 +559,6 @@
#define USB_VENDOR_ID_MADCATZ 0x0738 #define USB_VENDOR_ID_MADCATZ 0x0738
#define USB_DEVICE_ID_MADCATZ_BEATPAD 0x4540 #define USB_DEVICE_ID_MADCATZ_BEATPAD 0x4540
#define USB_VENDOR_ID_MASTERKIT 0x16c0
#define USB_DEVICE_ID_MASTERKIT_MA901RADIO 0x05df
#define USB_VENDOR_ID_MCC 0x09db #define USB_VENDOR_ID_MCC 0x09db
#define USB_DEVICE_ID_MCC_PMD1024LS 0x0076 #define USB_DEVICE_ID_MCC_PMD1024LS 0x0076
#define USB_DEVICE_ID_MCC_PMD1208LS 0x007a #define USB_DEVICE_ID_MCC_PMD1208LS 0x007a

View File

@ -462,6 +462,21 @@ static int magicmouse_input_mapping(struct hid_device *hdev,
return 0; return 0;
} }
static void magicmouse_input_configured(struct hid_device *hdev,
struct hid_input *hi)
{
struct magicmouse_sc *msc = hid_get_drvdata(hdev);
int ret = magicmouse_setup_input(msc->input, hdev);
if (ret) {
hid_err(hdev, "magicmouse setup input failed (%d)\n", ret);
/* clean msc->input to notify probe() of the failure */
msc->input = NULL;
}
}
static int magicmouse_probe(struct hid_device *hdev, static int magicmouse_probe(struct hid_device *hdev,
const struct hid_device_id *id) const struct hid_device_id *id)
{ {
@ -493,15 +508,10 @@ static int magicmouse_probe(struct hid_device *hdev,
goto err_free; goto err_free;
} }
/* We do this after hid-input is done parsing reports so that if (!msc->input) {
* hid-input uses the most natural button and axis IDs. hid_err(hdev, "magicmouse input not registered\n");
*/ ret = -ENOMEM;
if (msc->input) { goto err_stop_hw;
ret = magicmouse_setup_input(msc->input, hdev);
if (ret) {
hid_err(hdev, "magicmouse setup input failed (%d)\n", ret);
goto err_stop_hw;
}
} }
if (id->product == USB_DEVICE_ID_APPLE_MAGICMOUSE) if (id->product == USB_DEVICE_ID_APPLE_MAGICMOUSE)
@ -568,6 +578,7 @@ static struct hid_driver magicmouse_driver = {
.remove = magicmouse_remove, .remove = magicmouse_remove,
.raw_event = magicmouse_raw_event, .raw_event = magicmouse_raw_event,
.input_mapping = magicmouse_input_mapping, .input_mapping = magicmouse_input_mapping,
.input_configured = magicmouse_input_configured,
}; };
module_hid_driver(magicmouse_driver); module_hid_driver(magicmouse_driver);

View File

@ -182,7 +182,6 @@ static int dw_i2c_probe(struct platform_device *pdev)
adap->algo = &i2c_dw_algo; adap->algo = &i2c_dw_algo;
adap->dev.parent = &pdev->dev; adap->dev.parent = &pdev->dev;
adap->dev.of_node = pdev->dev.of_node; adap->dev.of_node = pdev->dev.of_node;
ACPI_HANDLE_SET(&adap->dev, ACPI_HANDLE(&pdev->dev));
r = i2c_add_numbered_adapter(adap); r = i2c_add_numbered_adapter(adap);
if (r) { if (r) {

View File

@ -44,7 +44,7 @@
#include "qib.h" #include "qib.h"
#include "qib_7220.h" #include "qib_7220.h"
#define SD7220_FW_NAME "intel/sd7220.fw" #define SD7220_FW_NAME "qlogic/sd7220.fw"
MODULE_FIRMWARE(SD7220_FW_NAME); MODULE_FIRMWARE(SD7220_FW_NAME);
/* /*

View File

@ -204,7 +204,7 @@ config VIDEO_SAMSUNG_EXYNOS_GSC
config VIDEO_SH_VEU config VIDEO_SH_VEU
tristate "SuperH VEU mem2mem video processing driver" tristate "SuperH VEU mem2mem video processing driver"
depends on VIDEO_DEV && VIDEO_V4L2 depends on VIDEO_DEV && VIDEO_V4L2 && GENERIC_HARDIRQS
select VIDEOBUF2_DMA_CONTIG select VIDEOBUF2_DMA_CONTIG
select V4L2_MEM2MEM_DEV select V4L2_MEM2MEM_DEV
help help

View File

@ -347,9 +347,20 @@ static void usb_ma901radio_release(struct v4l2_device *v4l2_dev)
static int usb_ma901radio_probe(struct usb_interface *intf, static int usb_ma901radio_probe(struct usb_interface *intf,
const struct usb_device_id *id) const struct usb_device_id *id)
{ {
struct usb_device *dev = interface_to_usbdev(intf);
struct ma901radio_device *radio; struct ma901radio_device *radio;
int retval = 0; int retval = 0;
/* Masterkit MA901 usb radio has the same USB ID as many others
* Atmel V-USB devices. Let's make additional checks to be sure
* that this is our device.
*/
if (dev->product && dev->manufacturer &&
(strncmp(dev->product, "MA901", 5) != 0
|| strncmp(dev->manufacturer, "www.masterkit.ru", 16) != 0))
return -ENODEV;
radio = kzalloc(sizeof(struct ma901radio_device), GFP_KERNEL); radio = kzalloc(sizeof(struct ma901radio_device), GFP_KERNEL);
if (!radio) { if (!radio) {
dev_err(&intf->dev, "kzalloc for ma901radio_device failed\n"); dev_err(&intf->dev, "kzalloc for ma901radio_device failed\n");

View File

@ -4901,8 +4901,8 @@ static void __exit bonding_exit(void)
bond_destroy_debugfs(); bond_destroy_debugfs();
rtnl_link_unregister(&bond_link_ops);
unregister_pernet_subsys(&bond_net_ops); unregister_pernet_subsys(&bond_net_ops);
rtnl_link_unregister(&bond_link_ops);
#ifdef CONFIG_NET_POLL_CONTROLLER #ifdef CONFIG_NET_POLL_CONTROLLER
/* /*

View File

@ -186,7 +186,7 @@ struct atl1e_tpd_desc {
/* how about 0x2000 */ /* how about 0x2000 */
#define MAX_TX_BUF_LEN 0x2000 #define MAX_TX_BUF_LEN 0x2000
#define MAX_TX_BUF_SHIFT 13 #define MAX_TX_BUF_SHIFT 13
/*#define MAX_TX_BUF_LEN 0x3000 */ #define MAX_TSO_SEG_SIZE 0x3c00
/* rrs word 1 bit 0:31 */ /* rrs word 1 bit 0:31 */
#define RRS_RX_CSUM_MASK 0xFFFF #define RRS_RX_CSUM_MASK 0xFFFF

View File

@ -2327,6 +2327,7 @@ static int atl1e_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
INIT_WORK(&adapter->reset_task, atl1e_reset_task); INIT_WORK(&adapter->reset_task, atl1e_reset_task);
INIT_WORK(&adapter->link_chg_task, atl1e_link_chg_task); INIT_WORK(&adapter->link_chg_task, atl1e_link_chg_task);
netif_set_gso_max_size(netdev, MAX_TSO_SEG_SIZE);
err = register_netdev(netdev); err = register_netdev(netdev);
if (err) { if (err) {
netdev_err(netdev, "register netdevice failed\n"); netdev_err(netdev, "register netdevice failed\n");

View File

@ -13481,13 +13481,7 @@ static void bnx2x_check_kr2_wa(struct link_params *params,
{ {
struct bnx2x *bp = params->bp; struct bnx2x *bp = params->bp;
u16 base_page, next_page, not_kr2_device, lane; u16 base_page, next_page, not_kr2_device, lane;
int sigdet = bnx2x_warpcore_get_sigdet(phy, params); int sigdet;
if (!sigdet) {
if (!(vars->link_attr_sync & LINK_ATTR_SYNC_KR2_ENABLE))
bnx2x_kr2_recovery(params, vars, phy);
return;
}
/* Once KR2 was disabled, wait 5 seconds before checking KR2 recovery /* Once KR2 was disabled, wait 5 seconds before checking KR2 recovery
* Since some switches tend to reinit the AN process and clear the * Since some switches tend to reinit the AN process and clear the
@ -13498,6 +13492,16 @@ static void bnx2x_check_kr2_wa(struct link_params *params,
vars->check_kr2_recovery_cnt--; vars->check_kr2_recovery_cnt--;
return; return;
} }
sigdet = bnx2x_warpcore_get_sigdet(phy, params);
if (!sigdet) {
if (!(vars->link_attr_sync & LINK_ATTR_SYNC_KR2_ENABLE)) {
bnx2x_kr2_recovery(params, vars, phy);
DP(NETIF_MSG_LINK, "No sigdet\n");
}
return;
}
lane = bnx2x_get_warpcore_lane(phy, params); lane = bnx2x_get_warpcore_lane(phy, params);
CL22_WR_OVER_CL45(bp, phy, MDIO_REG_BANK_AER_BLOCK, CL22_WR_OVER_CL45(bp, phy, MDIO_REG_BANK_AER_BLOCK,
MDIO_AER_BLOCK_AER_REG, lane); MDIO_AER_BLOCK_AER_REG, lane);

View File

@ -7882,12 +7882,19 @@ static int __init ixgbe_init_module(void)
ixgbe_dbg_init(); ixgbe_dbg_init();
#endif /* CONFIG_DEBUG_FS */ #endif /* CONFIG_DEBUG_FS */
ret = pci_register_driver(&ixgbe_driver);
if (ret) {
#ifdef CONFIG_DEBUG_FS
ixgbe_dbg_exit();
#endif /* CONFIG_DEBUG_FS */
return ret;
}
#ifdef CONFIG_IXGBE_DCA #ifdef CONFIG_IXGBE_DCA
dca_register_notify(&dca_notifier); dca_register_notify(&dca_notifier);
#endif #endif
ret = pci_register_driver(&ixgbe_driver); return 0;
return ret;
} }
module_init(ixgbe_init_module); module_init(ixgbe_init_module);

View File

@ -3872,6 +3872,30 @@ static void rtl_init_mdio_ops(struct rtl8169_private *tp)
} }
} }
static void rtl_speed_down(struct rtl8169_private *tp)
{
u32 adv;
int lpa;
rtl_writephy(tp, 0x1f, 0x0000);
lpa = rtl_readphy(tp, MII_LPA);
if (lpa & (LPA_10HALF | LPA_10FULL))
adv = ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full;
else if (lpa & (LPA_100HALF | LPA_100FULL))
adv = ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full |
ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full;
else
adv = ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full |
ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full |
(tp->mii.supports_gmii ?
ADVERTISED_1000baseT_Half |
ADVERTISED_1000baseT_Full : 0);
rtl8169_set_speed(tp->dev, AUTONEG_ENABLE, SPEED_1000, DUPLEX_FULL,
adv);
}
static void rtl_wol_suspend_quirk(struct rtl8169_private *tp) static void rtl_wol_suspend_quirk(struct rtl8169_private *tp)
{ {
void __iomem *ioaddr = tp->mmio_addr; void __iomem *ioaddr = tp->mmio_addr;
@ -3904,9 +3928,7 @@ static bool rtl_wol_pll_power_down(struct rtl8169_private *tp)
if (!(__rtl8169_get_wol(tp) & WAKE_ANY)) if (!(__rtl8169_get_wol(tp) & WAKE_ANY))
return false; return false;
rtl_writephy(tp, 0x1f, 0x0000); rtl_speed_down(tp);
rtl_writephy(tp, MII_BMCR, 0x0000);
rtl_wol_suspend_quirk(tp); rtl_wol_suspend_quirk(tp);
return true; return true;

View File

@ -1419,6 +1419,14 @@ void iwlagn_bss_info_changed(struct ieee80211_hw *hw,
mutex_lock(&priv->mutex); mutex_lock(&priv->mutex);
if (changes & BSS_CHANGED_IDLE && bss_conf->idle) {
/*
* If we go idle, then clearly no "passive-no-rx"
* workaround is needed any more, this is a reset.
*/
iwlagn_lift_passive_no_rx(priv);
}
if (unlikely(!iwl_is_ready(priv))) { if (unlikely(!iwl_is_ready(priv))) {
IWL_DEBUG_MAC80211(priv, "leave - not ready\n"); IWL_DEBUG_MAC80211(priv, "leave - not ready\n");
mutex_unlock(&priv->mutex); mutex_unlock(&priv->mutex);
@ -1450,16 +1458,6 @@ void iwlagn_bss_info_changed(struct ieee80211_hw *hw,
priv->timestamp = bss_conf->sync_tsf; priv->timestamp = bss_conf->sync_tsf;
ctx->staging.filter_flags |= RXON_FILTER_ASSOC_MSK; ctx->staging.filter_flags |= RXON_FILTER_ASSOC_MSK;
} else { } else {
/*
* If we disassociate while there are pending
* frames, just wake up the queues and let the
* frames "escape" ... This shouldn't really
* be happening to start with, but we should
* not get stuck in this case either since it
* can happen if userspace gets confused.
*/
iwlagn_lift_passive_no_rx(priv);
ctx->staging.filter_flags &= ~RXON_FILTER_ASSOC_MSK; ctx->staging.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
if (ctx->ctxid == IWL_RXON_CTX_BSS) if (ctx->ctxid == IWL_RXON_CTX_BSS)

View File

@ -1193,7 +1193,7 @@ int iwlagn_rx_reply_tx(struct iwl_priv *priv, struct iwl_rx_cmd_buffer *rxb,
memset(&info->status, 0, sizeof(info->status)); memset(&info->status, 0, sizeof(info->status));
if (status == TX_STATUS_FAIL_PASSIVE_NO_RX && if (status == TX_STATUS_FAIL_PASSIVE_NO_RX &&
iwl_is_associated_ctx(ctx) && ctx->vif && ctx->vif &&
ctx->vif->type == NL80211_IFTYPE_STATION) { ctx->vif->type == NL80211_IFTYPE_STATION) {
/* block and stop all queues */ /* block and stop all queues */
priv->passive_no_rx = true; priv->passive_no_rx = true;

View File

@ -1892,7 +1892,8 @@ mwifiex_cfg80211_scan(struct wiphy *wiphy,
} }
} }
for (i = 0; i < request->n_channels; i++) { for (i = 0; i < min_t(u32, request->n_channels,
MWIFIEX_USER_SCAN_CHAN_MAX); i++) {
chan = request->channels[i]; chan = request->channels[i];
priv->user_scan_cfg->chan_list[i].chan_number = chan->hw_value; priv->user_scan_cfg->chan_list[i].chan_number = chan->hw_value;
priv->user_scan_cfg->chan_list[i].radio_type = chan->band; priv->user_scan_cfg->chan_list[i].radio_type = chan->band;

View File

@ -22,7 +22,7 @@
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/mei_bus.h> #include <linux/mei_cl_bus.h>
#include <linux/nfc.h> #include <linux/nfc.h>
#include <net/nfc/hci.h> #include <net/nfc/hci.h>
@ -32,9 +32,6 @@
#define MICROREAD_DRIVER_NAME "microread" #define MICROREAD_DRIVER_NAME "microread"
#define MICROREAD_UUID UUID_LE(0x0bb17a78, 0x2a8e, 0x4c50, 0x94, \
0xd4, 0x50, 0x26, 0x67, 0x23, 0x77, 0x5c)
struct mei_nfc_hdr { struct mei_nfc_hdr {
u8 cmd; u8 cmd;
u8 status; u8 status;
@ -48,7 +45,7 @@ struct mei_nfc_hdr {
#define MEI_NFC_MAX_READ (MEI_NFC_HEADER_SIZE + MEI_NFC_MAX_HCI_PAYLOAD) #define MEI_NFC_MAX_READ (MEI_NFC_HEADER_SIZE + MEI_NFC_MAX_HCI_PAYLOAD)
struct microread_mei_phy { struct microread_mei_phy {
struct mei_device *device; struct mei_cl_device *device;
struct nfc_hci_dev *hdev; struct nfc_hci_dev *hdev;
int powered; int powered;
@ -105,14 +102,14 @@ static int microread_mei_write(void *phy_id, struct sk_buff *skb)
MEI_DUMP_SKB_OUT("mei frame sent", skb); MEI_DUMP_SKB_OUT("mei frame sent", skb);
r = mei_send(phy->device, skb->data, skb->len); r = mei_cl_send(phy->device, skb->data, skb->len);
if (r > 0) if (r > 0)
r = 0; r = 0;
return r; return r;
} }
static void microread_event_cb(struct mei_device *device, u32 events, static void microread_event_cb(struct mei_cl_device *device, u32 events,
void *context) void *context)
{ {
struct microread_mei_phy *phy = context; struct microread_mei_phy *phy = context;
@ -120,7 +117,7 @@ static void microread_event_cb(struct mei_device *device, u32 events,
if (phy->hard_fault != 0) if (phy->hard_fault != 0)
return; return;
if (events & BIT(MEI_EVENT_RX)) { if (events & BIT(MEI_CL_EVENT_RX)) {
struct sk_buff *skb; struct sk_buff *skb;
int reply_size; int reply_size;
@ -128,7 +125,7 @@ static void microread_event_cb(struct mei_device *device, u32 events,
if (!skb) if (!skb)
return; return;
reply_size = mei_recv(device, skb->data, MEI_NFC_MAX_READ); reply_size = mei_cl_recv(device, skb->data, MEI_NFC_MAX_READ);
if (reply_size < MEI_NFC_HEADER_SIZE) { if (reply_size < MEI_NFC_HEADER_SIZE) {
kfree(skb); kfree(skb);
return; return;
@ -149,8 +146,8 @@ static struct nfc_phy_ops mei_phy_ops = {
.disable = microread_mei_disable, .disable = microread_mei_disable,
}; };
static int microread_mei_probe(struct mei_device *device, static int microread_mei_probe(struct mei_cl_device *device,
const struct mei_id *id) const struct mei_cl_device_id *id)
{ {
struct microread_mei_phy *phy; struct microread_mei_phy *phy;
int r; int r;
@ -164,9 +161,9 @@ static int microread_mei_probe(struct mei_device *device,
} }
phy->device = device; phy->device = device;
mei_set_clientdata(device, phy); mei_cl_set_drvdata(device, phy);
r = mei_register_event_cb(device, microread_event_cb, phy); r = mei_cl_register_event_cb(device, microread_event_cb, phy);
if (r) { if (r) {
pr_err(MICROREAD_DRIVER_NAME ": event cb registration failed\n"); pr_err(MICROREAD_DRIVER_NAME ": event cb registration failed\n");
goto err_out; goto err_out;
@ -186,9 +183,9 @@ err_out:
return r; return r;
} }
static int microread_mei_remove(struct mei_device *device) static int microread_mei_remove(struct mei_cl_device *device)
{ {
struct microread_mei_phy *phy = mei_get_clientdata(device); struct microread_mei_phy *phy = mei_cl_get_drvdata(device);
pr_info("Removing microread\n"); pr_info("Removing microread\n");
@ -202,16 +199,15 @@ static int microread_mei_remove(struct mei_device *device)
return 0; return 0;
} }
static struct mei_id microread_mei_tbl[] = { static struct mei_cl_device_id microread_mei_tbl[] = {
{ MICROREAD_DRIVER_NAME, MICROREAD_UUID }, { MICROREAD_DRIVER_NAME },
/* required last entry */ /* required last entry */
{ } { }
}; };
MODULE_DEVICE_TABLE(mei, microread_mei_tbl); MODULE_DEVICE_TABLE(mei, microread_mei_tbl);
static struct mei_driver microread_driver = { static struct mei_cl_driver microread_driver = {
.id_table = microread_mei_tbl, .id_table = microread_mei_tbl,
.name = MICROREAD_DRIVER_NAME, .name = MICROREAD_DRIVER_NAME,
@ -225,7 +221,7 @@ static int microread_mei_init(void)
pr_debug(DRIVER_DESC ": %s\n", __func__); pr_debug(DRIVER_DESC ": %s\n", __func__);
r = mei_driver_register(&microread_driver); r = mei_cl_driver_register(&microread_driver);
if (r) { if (r) {
pr_err(MICROREAD_DRIVER_NAME ": driver registration failed\n"); pr_err(MICROREAD_DRIVER_NAME ": driver registration failed\n");
return r; return r;
@ -236,7 +232,7 @@ static int microread_mei_init(void)
static void microread_mei_exit(void) static void microread_mei_exit(void)
{ {
mei_driver_unregister(&microread_driver); mei_cl_driver_unregister(&microread_driver);
} }
module_init(microread_mei_init); module_init(microread_mei_init);

View File

@ -44,7 +44,6 @@ static DECLARE_COMPLETION(at91_rtc_updated);
static unsigned int at91_alarm_year = AT91_RTC_EPOCH; static unsigned int at91_alarm_year = AT91_RTC_EPOCH;
static void __iomem *at91_rtc_regs; static void __iomem *at91_rtc_regs;
static int irq; static int irq;
static u32 at91_rtc_imr;
/* /*
* Decode time/date into rtc_time structure * Decode time/date into rtc_time structure
@ -109,11 +108,9 @@ static int at91_rtc_settime(struct device *dev, struct rtc_time *tm)
cr = at91_rtc_read(AT91_RTC_CR); cr = at91_rtc_read(AT91_RTC_CR);
at91_rtc_write(AT91_RTC_CR, cr | AT91_RTC_UPDCAL | AT91_RTC_UPDTIM); at91_rtc_write(AT91_RTC_CR, cr | AT91_RTC_UPDCAL | AT91_RTC_UPDTIM);
at91_rtc_imr |= AT91_RTC_ACKUPD;
at91_rtc_write(AT91_RTC_IER, AT91_RTC_ACKUPD); at91_rtc_write(AT91_RTC_IER, AT91_RTC_ACKUPD);
wait_for_completion(&at91_rtc_updated); /* wait for ACKUPD interrupt */ wait_for_completion(&at91_rtc_updated); /* wait for ACKUPD interrupt */
at91_rtc_write(AT91_RTC_IDR, AT91_RTC_ACKUPD); at91_rtc_write(AT91_RTC_IDR, AT91_RTC_ACKUPD);
at91_rtc_imr &= ~AT91_RTC_ACKUPD;
at91_rtc_write(AT91_RTC_TIMR, at91_rtc_write(AT91_RTC_TIMR,
bin2bcd(tm->tm_sec) << 0 bin2bcd(tm->tm_sec) << 0
@ -145,7 +142,7 @@ static int at91_rtc_readalarm(struct device *dev, struct rtc_wkalrm *alrm)
tm->tm_yday = rtc_year_days(tm->tm_mday, tm->tm_mon, tm->tm_year); tm->tm_yday = rtc_year_days(tm->tm_mday, tm->tm_mon, tm->tm_year);
tm->tm_year = at91_alarm_year - 1900; tm->tm_year = at91_alarm_year - 1900;
alrm->enabled = (at91_rtc_imr & AT91_RTC_ALARM) alrm->enabled = (at91_rtc_read(AT91_RTC_IMR) & AT91_RTC_ALARM)
? 1 : 0; ? 1 : 0;
dev_dbg(dev, "%s(): %4d-%02d-%02d %02d:%02d:%02d\n", __func__, dev_dbg(dev, "%s(): %4d-%02d-%02d %02d:%02d:%02d\n", __func__,
@ -171,7 +168,6 @@ static int at91_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm)
tm.tm_sec = alrm->time.tm_sec; tm.tm_sec = alrm->time.tm_sec;
at91_rtc_write(AT91_RTC_IDR, AT91_RTC_ALARM); at91_rtc_write(AT91_RTC_IDR, AT91_RTC_ALARM);
at91_rtc_imr &= ~AT91_RTC_ALARM;
at91_rtc_write(AT91_RTC_TIMALR, at91_rtc_write(AT91_RTC_TIMALR,
bin2bcd(tm.tm_sec) << 0 bin2bcd(tm.tm_sec) << 0
| bin2bcd(tm.tm_min) << 8 | bin2bcd(tm.tm_min) << 8
@ -184,7 +180,6 @@ static int at91_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm)
if (alrm->enabled) { if (alrm->enabled) {
at91_rtc_write(AT91_RTC_SCCR, AT91_RTC_ALARM); at91_rtc_write(AT91_RTC_SCCR, AT91_RTC_ALARM);
at91_rtc_imr |= AT91_RTC_ALARM;
at91_rtc_write(AT91_RTC_IER, AT91_RTC_ALARM); at91_rtc_write(AT91_RTC_IER, AT91_RTC_ALARM);
} }
@ -201,12 +196,9 @@ static int at91_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled)
if (enabled) { if (enabled) {
at91_rtc_write(AT91_RTC_SCCR, AT91_RTC_ALARM); at91_rtc_write(AT91_RTC_SCCR, AT91_RTC_ALARM);
at91_rtc_imr |= AT91_RTC_ALARM;
at91_rtc_write(AT91_RTC_IER, AT91_RTC_ALARM); at91_rtc_write(AT91_RTC_IER, AT91_RTC_ALARM);
} else { } else
at91_rtc_write(AT91_RTC_IDR, AT91_RTC_ALARM); at91_rtc_write(AT91_RTC_IDR, AT91_RTC_ALARM);
at91_rtc_imr &= ~AT91_RTC_ALARM;
}
return 0; return 0;
} }
@ -215,10 +207,12 @@ static int at91_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled)
*/ */
static int at91_rtc_proc(struct device *dev, struct seq_file *seq) static int at91_rtc_proc(struct device *dev, struct seq_file *seq)
{ {
unsigned long imr = at91_rtc_read(AT91_RTC_IMR);
seq_printf(seq, "update_IRQ\t: %s\n", seq_printf(seq, "update_IRQ\t: %s\n",
(at91_rtc_imr & AT91_RTC_ACKUPD) ? "yes" : "no"); (imr & AT91_RTC_ACKUPD) ? "yes" : "no");
seq_printf(seq, "periodic_IRQ\t: %s\n", seq_printf(seq, "periodic_IRQ\t: %s\n",
(at91_rtc_imr & AT91_RTC_SECEV) ? "yes" : "no"); (imr & AT91_RTC_SECEV) ? "yes" : "no");
return 0; return 0;
} }
@ -233,7 +227,7 @@ static irqreturn_t at91_rtc_interrupt(int irq, void *dev_id)
unsigned int rtsr; unsigned int rtsr;
unsigned long events = 0; unsigned long events = 0;
rtsr = at91_rtc_read(AT91_RTC_SR) & at91_rtc_imr; rtsr = at91_rtc_read(AT91_RTC_SR) & at91_rtc_read(AT91_RTC_IMR);
if (rtsr) { /* this interrupt is shared! Is it ours? */ if (rtsr) { /* this interrupt is shared! Is it ours? */
if (rtsr & AT91_RTC_ALARM) if (rtsr & AT91_RTC_ALARM)
events |= (RTC_AF | RTC_IRQF); events |= (RTC_AF | RTC_IRQF);
@ -297,7 +291,6 @@ static int __init at91_rtc_probe(struct platform_device *pdev)
at91_rtc_write(AT91_RTC_IDR, AT91_RTC_ACKUPD | AT91_RTC_ALARM | at91_rtc_write(AT91_RTC_IDR, AT91_RTC_ACKUPD | AT91_RTC_ALARM |
AT91_RTC_SECEV | AT91_RTC_TIMEV | AT91_RTC_SECEV | AT91_RTC_TIMEV |
AT91_RTC_CALEV); AT91_RTC_CALEV);
at91_rtc_imr = 0;
ret = request_irq(irq, at91_rtc_interrupt, ret = request_irq(irq, at91_rtc_interrupt,
IRQF_SHARED, IRQF_SHARED,
@ -336,7 +329,6 @@ static int __exit at91_rtc_remove(struct platform_device *pdev)
at91_rtc_write(AT91_RTC_IDR, AT91_RTC_ACKUPD | AT91_RTC_ALARM | at91_rtc_write(AT91_RTC_IDR, AT91_RTC_ACKUPD | AT91_RTC_ALARM |
AT91_RTC_SECEV | AT91_RTC_TIMEV | AT91_RTC_SECEV | AT91_RTC_TIMEV |
AT91_RTC_CALEV); AT91_RTC_CALEV);
at91_rtc_imr = 0;
free_irq(irq, pdev); free_irq(irq, pdev);
rtc_device_unregister(rtc); rtc_device_unregister(rtc);
@ -349,35 +341,31 @@ static int __exit at91_rtc_remove(struct platform_device *pdev)
/* AT91RM9200 RTC Power management control */ /* AT91RM9200 RTC Power management control */
static u32 at91_rtc_bkpimr; static u32 at91_rtc_imr;
static int at91_rtc_suspend(struct device *dev) static int at91_rtc_suspend(struct device *dev)
{ {
/* this IRQ is shared with DBGU and other hardware which isn't /* this IRQ is shared with DBGU and other hardware which isn't
* necessarily doing PM like we are... * necessarily doing PM like we are...
*/ */
at91_rtc_bkpimr = at91_rtc_imr & (AT91_RTC_ALARM|AT91_RTC_SECEV); at91_rtc_imr = at91_rtc_read(AT91_RTC_IMR)
if (at91_rtc_bkpimr) { & (AT91_RTC_ALARM|AT91_RTC_SECEV);
if (device_may_wakeup(dev)) { if (at91_rtc_imr) {
if (device_may_wakeup(dev))
enable_irq_wake(irq); enable_irq_wake(irq);
} else { else
at91_rtc_write(AT91_RTC_IDR, at91_rtc_bkpimr); at91_rtc_write(AT91_RTC_IDR, at91_rtc_imr);
at91_rtc_imr &= ~at91_rtc_bkpimr; }
}
}
return 0; return 0;
} }
static int at91_rtc_resume(struct device *dev) static int at91_rtc_resume(struct device *dev)
{ {
if (at91_rtc_bkpimr) { if (at91_rtc_imr) {
if (device_may_wakeup(dev)) { if (device_may_wakeup(dev))
disable_irq_wake(irq); disable_irq_wake(irq);
} else { else
at91_rtc_imr |= at91_rtc_bkpimr; at91_rtc_write(AT91_RTC_IER, at91_rtc_imr);
at91_rtc_write(AT91_RTC_IER, at91_rtc_bkpimr);
}
} }
return 0; return 0;
} }

View File

@ -64,6 +64,7 @@
#define AT91_RTC_SCCR 0x1c /* Status Clear Command Register */ #define AT91_RTC_SCCR 0x1c /* Status Clear Command Register */
#define AT91_RTC_IER 0x20 /* Interrupt Enable Register */ #define AT91_RTC_IER 0x20 /* Interrupt Enable Register */
#define AT91_RTC_IDR 0x24 /* Interrupt Disable Register */ #define AT91_RTC_IDR 0x24 /* Interrupt Disable Register */
#define AT91_RTC_IMR 0x28 /* Interrupt Mask Register */
#define AT91_RTC_VER 0x2c /* Valid Entry Register */ #define AT91_RTC_VER 0x2c /* Valid Entry Register */
#define AT91_RTC_NVTIM (1 << 0) /* Non valid Time */ #define AT91_RTC_NVTIM (1 << 0) /* Non valid Time */

View File

@ -307,7 +307,7 @@ static void scm_blk_handle_error(struct scm_request *scmrq)
case EQC_WR_PROHIBIT: case EQC_WR_PROHIBIT:
spin_lock_irqsave(&bdev->lock, flags); spin_lock_irqsave(&bdev->lock, flags);
if (bdev->state != SCM_WR_PROHIBIT) if (bdev->state != SCM_WR_PROHIBIT)
pr_info("%lu: Write access to the SCM increment is suspended\n", pr_info("%lx: Write access to the SCM increment is suspended\n",
(unsigned long) bdev->scmdev->address); (unsigned long) bdev->scmdev->address);
bdev->state = SCM_WR_PROHIBIT; bdev->state = SCM_WR_PROHIBIT;
spin_unlock_irqrestore(&bdev->lock, flags); spin_unlock_irqrestore(&bdev->lock, flags);
@ -445,7 +445,7 @@ void scm_blk_set_available(struct scm_blk_dev *bdev)
spin_lock_irqsave(&bdev->lock, flags); spin_lock_irqsave(&bdev->lock, flags);
if (bdev->state == SCM_WR_PROHIBIT) if (bdev->state == SCM_WR_PROHIBIT)
pr_info("%lu: Write access to the SCM increment is restored\n", pr_info("%lx: Write access to the SCM increment is restored\n",
(unsigned long) bdev->scmdev->address); (unsigned long) bdev->scmdev->address);
bdev->state = SCM_OPER; bdev->state = SCM_OPER;
spin_unlock_irqrestore(&bdev->lock, flags); spin_unlock_irqrestore(&bdev->lock, flags);
@ -463,12 +463,15 @@ static int __init scm_blk_init(void)
goto out; goto out;
scm_major = ret; scm_major = ret;
if (scm_alloc_rqs(nr_requests)) ret = scm_alloc_rqs(nr_requests);
if (ret)
goto out_unreg; goto out_unreg;
scm_debug = debug_register("scm_log", 16, 1, 16); scm_debug = debug_register("scm_log", 16, 1, 16);
if (!scm_debug) if (!scm_debug) {
ret = -ENOMEM;
goto out_free; goto out_free;
}
debug_register_view(scm_debug, &debug_hex_ascii_view); debug_register_view(scm_debug, &debug_hex_ascii_view);
debug_set_level(scm_debug, 2); debug_set_level(scm_debug, 2);

View File

@ -19,7 +19,7 @@ static void scm_notify(struct scm_device *scmdev, enum scm_event event)
switch (event) { switch (event) {
case SCM_CHANGE: case SCM_CHANGE:
pr_info("%lu: The capabilities of the SCM increment changed\n", pr_info("%lx: The capabilities of the SCM increment changed\n",
(unsigned long) scmdev->address); (unsigned long) scmdev->address);
SCM_LOG(2, "State changed"); SCM_LOG(2, "State changed");
SCM_LOG_STATE(2, scmdev); SCM_LOG_STATE(2, scmdev);

View File

@ -915,7 +915,7 @@ static int tty3270_install(struct tty_driver *driver, struct tty_struct *tty)
int i, rc; int i, rc;
/* Check if the tty3270 is already there. */ /* Check if the tty3270 is already there. */
view = raw3270_find_view(&tty3270_fn, tty->index); view = raw3270_find_view(&tty3270_fn, tty->index + RAW3270_FIRSTMINOR);
if (!IS_ERR(view)) { if (!IS_ERR(view)) {
tp = container_of(view, struct tty3270, view); tp = container_of(view, struct tty3270, view);
tty->driver_data = tp; tty->driver_data = tp;
@ -927,15 +927,16 @@ static int tty3270_install(struct tty_driver *driver, struct tty_struct *tty)
tp->inattr = TF_INPUT; tp->inattr = TF_INPUT;
return tty_port_install(&tp->port, driver, tty); return tty_port_install(&tp->port, driver, tty);
} }
if (tty3270_max_index < tty->index) if (tty3270_max_index < tty->index + 1)
tty3270_max_index = tty->index; tty3270_max_index = tty->index + 1;
/* Allocate tty3270 structure on first open. */ /* Allocate tty3270 structure on first open. */
tp = tty3270_alloc_view(); tp = tty3270_alloc_view();
if (IS_ERR(tp)) if (IS_ERR(tp))
return PTR_ERR(tp); return PTR_ERR(tp);
rc = raw3270_add_view(&tp->view, &tty3270_fn, tty->index); rc = raw3270_add_view(&tp->view, &tty3270_fn,
tty->index + RAW3270_FIRSTMINOR);
if (rc) { if (rc) {
tty3270_free_view(tp); tty3270_free_view(tp);
return rc; return rc;
@ -1846,12 +1847,12 @@ static const struct tty_operations tty3270_ops = {
void tty3270_create_cb(int minor) void tty3270_create_cb(int minor)
{ {
tty_register_device(tty3270_driver, minor, NULL); tty_register_device(tty3270_driver, minor - RAW3270_FIRSTMINOR, NULL);
} }
void tty3270_destroy_cb(int minor) void tty3270_destroy_cb(int minor)
{ {
tty_unregister_device(tty3270_driver, minor); tty_unregister_device(tty3270_driver, minor - RAW3270_FIRSTMINOR);
} }
struct raw3270_notifier tty3270_notifier = struct raw3270_notifier tty3270_notifier =
@ -1884,7 +1885,8 @@ static int __init tty3270_init(void)
driver->driver_name = "tty3270"; driver->driver_name = "tty3270";
driver->name = "3270/tty"; driver->name = "3270/tty";
driver->major = IBM_TTY3270_MAJOR; driver->major = IBM_TTY3270_MAJOR;
driver->minor_start = 0; driver->minor_start = RAW3270_FIRSTMINOR;
driver->name_base = RAW3270_FIRSTMINOR;
driver->type = TTY_DRIVER_TYPE_SYSTEM; driver->type = TTY_DRIVER_TYPE_SYSTEM;
driver->subtype = SYSTEM_TYPE_TTY; driver->subtype = SYSTEM_TYPE_TTY;
driver->init_termios = tty_std_termios; driver->init_termios = tty_std_termios;

View File

@ -55,6 +55,7 @@ comment "SPI Master Controller Drivers"
config SPI_ALTERA config SPI_ALTERA
tristate "Altera SPI Controller" tristate "Altera SPI Controller"
depends on GENERIC_HARDIRQS
select SPI_BITBANG select SPI_BITBANG
help help
This is the driver for the Altera SPI Controller. This is the driver for the Altera SPI Controller.
@ -310,7 +311,7 @@ config SPI_PXA2XX_DMA
config SPI_PXA2XX config SPI_PXA2XX
tristate "PXA2xx SSP SPI master" tristate "PXA2xx SSP SPI master"
depends on ARCH_PXA || PCI || ACPI depends on (ARCH_PXA || PCI || ACPI) && GENERIC_HARDIRQS
select PXA_SSP if ARCH_PXA select PXA_SSP if ARCH_PXA
help help
This enables using a PXA2xx or Sodaville SSP port as a SPI master This enables using a PXA2xx or Sodaville SSP port as a SPI master

View File

@ -152,7 +152,6 @@ static void bcm63xx_spi_setup_transfer(struct spi_device *spi,
static int bcm63xx_spi_setup(struct spi_device *spi) static int bcm63xx_spi_setup(struct spi_device *spi)
{ {
struct bcm63xx_spi *bs; struct bcm63xx_spi *bs;
int ret;
bs = spi_master_get_devdata(spi->master); bs = spi_master_get_devdata(spi->master);
@ -490,7 +489,7 @@ static int bcm63xx_spi_probe(struct platform_device *pdev)
default: default:
dev_err(dev, "unsupported MSG_CTL width: %d\n", dev_err(dev, "unsupported MSG_CTL width: %d\n",
bs->msg_ctl_width); bs->msg_ctl_width);
goto out_clk_disable; goto out_err;
} }
/* Initialize hardware */ /* Initialize hardware */

View File

@ -164,7 +164,7 @@ static int mpc512x_psc_spi_transfer_rxtx(struct spi_device *spi,
for (i = count; i > 0; i--) { for (i = count; i > 0; i--) {
data = tx_buf ? *tx_buf++ : 0; data = tx_buf ? *tx_buf++ : 0;
if (len == EOFBYTE) if (len == EOFBYTE && t->cs_change)
setbits32(&fifo->txcmd, MPC512x_PSC_FIFO_EOF); setbits32(&fifo->txcmd, MPC512x_PSC_FIFO_EOF);
out_8(&fifo->txdata_8, data); out_8(&fifo->txdata_8, data);
len--; len--;

View File

@ -1168,7 +1168,6 @@ static int pxa2xx_spi_probe(struct platform_device *pdev)
master->dev.parent = &pdev->dev; master->dev.parent = &pdev->dev;
master->dev.of_node = pdev->dev.of_node; master->dev.of_node = pdev->dev.of_node;
ACPI_HANDLE_SET(&master->dev, ACPI_HANDLE(&pdev->dev));
/* the spi->mode bits understood by this driver: */ /* the spi->mode bits understood by this driver: */
master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH | SPI_LOOP; master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH | SPI_LOOP;

View File

@ -994,25 +994,30 @@ static irqreturn_t s3c64xx_spi_irq(int irq, void *data)
{ {
struct s3c64xx_spi_driver_data *sdd = data; struct s3c64xx_spi_driver_data *sdd = data;
struct spi_master *spi = sdd->master; struct spi_master *spi = sdd->master;
unsigned int val; unsigned int val, clr = 0;
val = readl(sdd->regs + S3C64XX_SPI_PENDING_CLR); val = readl(sdd->regs + S3C64XX_SPI_STATUS);
val &= S3C64XX_SPI_PND_RX_OVERRUN_CLR | if (val & S3C64XX_SPI_ST_RX_OVERRUN_ERR) {
S3C64XX_SPI_PND_RX_UNDERRUN_CLR | clr = S3C64XX_SPI_PND_RX_OVERRUN_CLR;
S3C64XX_SPI_PND_TX_OVERRUN_CLR |
S3C64XX_SPI_PND_TX_UNDERRUN_CLR;
writel(val, sdd->regs + S3C64XX_SPI_PENDING_CLR);
if (val & S3C64XX_SPI_PND_RX_OVERRUN_CLR)
dev_err(&spi->dev, "RX overrun\n"); dev_err(&spi->dev, "RX overrun\n");
if (val & S3C64XX_SPI_PND_RX_UNDERRUN_CLR) }
if (val & S3C64XX_SPI_ST_RX_UNDERRUN_ERR) {
clr |= S3C64XX_SPI_PND_RX_UNDERRUN_CLR;
dev_err(&spi->dev, "RX underrun\n"); dev_err(&spi->dev, "RX underrun\n");
if (val & S3C64XX_SPI_PND_TX_OVERRUN_CLR) }
if (val & S3C64XX_SPI_ST_TX_OVERRUN_ERR) {
clr |= S3C64XX_SPI_PND_TX_OVERRUN_CLR;
dev_err(&spi->dev, "TX overrun\n"); dev_err(&spi->dev, "TX overrun\n");
if (val & S3C64XX_SPI_PND_TX_UNDERRUN_CLR) }
if (val & S3C64XX_SPI_ST_TX_UNDERRUN_ERR) {
clr |= S3C64XX_SPI_PND_TX_UNDERRUN_CLR;
dev_err(&spi->dev, "TX underrun\n"); dev_err(&spi->dev, "TX underrun\n");
}
/* Clear the pending irq by setting and then clearing it */
writel(clr, sdd->regs + S3C64XX_SPI_PENDING_CLR);
writel(0, sdd->regs + S3C64XX_SPI_PENDING_CLR);
return IRQ_HANDLED; return IRQ_HANDLED;
} }
@ -1036,9 +1041,13 @@ static void s3c64xx_spi_hwinit(struct s3c64xx_spi_driver_data *sdd, int channel)
writel(0, regs + S3C64XX_SPI_MODE_CFG); writel(0, regs + S3C64XX_SPI_MODE_CFG);
writel(0, regs + S3C64XX_SPI_PACKET_CNT); writel(0, regs + S3C64XX_SPI_PACKET_CNT);
/* Clear any irq pending bits */ /* Clear any irq pending bits, should set and clear the bits */
writel(readl(regs + S3C64XX_SPI_PENDING_CLR), val = S3C64XX_SPI_PND_RX_OVERRUN_CLR |
regs + S3C64XX_SPI_PENDING_CLR); S3C64XX_SPI_PND_RX_UNDERRUN_CLR |
S3C64XX_SPI_PND_TX_OVERRUN_CLR |
S3C64XX_SPI_PND_TX_UNDERRUN_CLR;
writel(val, regs + S3C64XX_SPI_PENDING_CLR);
writel(0, regs + S3C64XX_SPI_PENDING_CLR);
writel(0, regs + S3C64XX_SPI_SWAP_CFG); writel(0, regs + S3C64XX_SPI_SWAP_CFG);

View File

@ -858,21 +858,6 @@ static int tegra_slink_setup(struct spi_device *spi)
return 0; return 0;
} }
static int tegra_slink_prepare_transfer(struct spi_master *master)
{
struct tegra_slink_data *tspi = spi_master_get_devdata(master);
return pm_runtime_get_sync(tspi->dev);
}
static int tegra_slink_unprepare_transfer(struct spi_master *master)
{
struct tegra_slink_data *tspi = spi_master_get_devdata(master);
pm_runtime_put(tspi->dev);
return 0;
}
static int tegra_slink_transfer_one_message(struct spi_master *master, static int tegra_slink_transfer_one_message(struct spi_master *master,
struct spi_message *msg) struct spi_message *msg)
{ {
@ -885,6 +870,12 @@ static int tegra_slink_transfer_one_message(struct spi_master *master,
msg->status = 0; msg->status = 0;
msg->actual_length = 0; msg->actual_length = 0;
ret = pm_runtime_get_sync(tspi->dev);
if (ret < 0) {
dev_err(tspi->dev, "runtime get failed: %d\n", ret);
goto done;
}
single_xfer = list_is_singular(&msg->transfers); single_xfer = list_is_singular(&msg->transfers);
list_for_each_entry(xfer, &msg->transfers, transfer_list) { list_for_each_entry(xfer, &msg->transfers, transfer_list) {
INIT_COMPLETION(tspi->xfer_completion); INIT_COMPLETION(tspi->xfer_completion);
@ -921,6 +912,8 @@ static int tegra_slink_transfer_one_message(struct spi_master *master,
exit: exit:
tegra_slink_writel(tspi, tspi->def_command_reg, SLINK_COMMAND); tegra_slink_writel(tspi, tspi->def_command_reg, SLINK_COMMAND);
tegra_slink_writel(tspi, tspi->def_command2_reg, SLINK_COMMAND2); tegra_slink_writel(tspi, tspi->def_command2_reg, SLINK_COMMAND2);
pm_runtime_put(tspi->dev);
done:
msg->status = ret; msg->status = ret;
spi_finalize_current_message(master); spi_finalize_current_message(master);
return ret; return ret;
@ -1148,9 +1141,7 @@ static int tegra_slink_probe(struct platform_device *pdev)
/* the spi->mode bits understood by this driver: */ /* the spi->mode bits understood by this driver: */
master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH; master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH;
master->setup = tegra_slink_setup; master->setup = tegra_slink_setup;
master->prepare_transfer_hardware = tegra_slink_prepare_transfer;
master->transfer_one_message = tegra_slink_transfer_one_message; master->transfer_one_message = tegra_slink_transfer_one_message;
master->unprepare_transfer_hardware = tegra_slink_unprepare_transfer;
master->num_chipselect = MAX_CHIP_SELECT; master->num_chipselect = MAX_CHIP_SELECT;
master->bus_num = -1; master->bus_num = -1;

View File

@ -543,17 +543,16 @@ static void spi_pump_messages(struct kthread_work *work)
/* Lock queue and check for queue work */ /* Lock queue and check for queue work */
spin_lock_irqsave(&master->queue_lock, flags); spin_lock_irqsave(&master->queue_lock, flags);
if (list_empty(&master->queue) || !master->running) { if (list_empty(&master->queue) || !master->running) {
if (master->busy && master->unprepare_transfer_hardware) { if (!master->busy) {
ret = master->unprepare_transfer_hardware(master); spin_unlock_irqrestore(&master->queue_lock, flags);
if (ret) { return;
spin_unlock_irqrestore(&master->queue_lock, flags);
dev_err(&master->dev,
"failed to unprepare transfer hardware\n");
return;
}
} }
master->busy = false; master->busy = false;
spin_unlock_irqrestore(&master->queue_lock, flags); spin_unlock_irqrestore(&master->queue_lock, flags);
if (master->unprepare_transfer_hardware &&
master->unprepare_transfer_hardware(master))
dev_err(&master->dev,
"failed to unprepare transfer hardware\n");
return; return;
} }
@ -984,7 +983,7 @@ static void acpi_register_spi_devices(struct spi_master *master)
acpi_status status; acpi_status status;
acpi_handle handle; acpi_handle handle;
handle = ACPI_HANDLE(&master->dev); handle = ACPI_HANDLE(master->dev.parent);
if (!handle) if (!handle)
return; return;

View File

@ -67,7 +67,6 @@ static void usb_port_device_release(struct device *dev)
{ {
struct usb_port *port_dev = to_usb_port(dev); struct usb_port *port_dev = to_usb_port(dev);
dev_pm_qos_hide_flags(dev);
kfree(port_dev); kfree(port_dev);
} }

View File

@ -1400,7 +1400,7 @@ int fb_videomode_from_videomode(const struct videomode *vm,
fbmode->vmode = 0; fbmode->vmode = 0;
if (vm->dmt_flags & VESA_DMT_HSYNC_HIGH) if (vm->dmt_flags & VESA_DMT_HSYNC_HIGH)
fbmode->sync |= FB_SYNC_HOR_HIGH_ACT; fbmode->sync |= FB_SYNC_HOR_HIGH_ACT;
if (vm->dmt_flags & VESA_DMT_HSYNC_HIGH) if (vm->dmt_flags & VESA_DMT_VSYNC_HIGH)
fbmode->sync |= FB_SYNC_VERT_HIGH_ACT; fbmode->sync |= FB_SYNC_VERT_HIGH_ACT;
if (vm->data_flags & DISPLAY_FLAGS_INTERLACED) if (vm->data_flags & DISPLAY_FLAGS_INTERLACED)
fbmode->vmode |= FB_VMODE_INTERLACED; fbmode->vmode |= FB_VMODE_INTERLACED;

View File

@ -1973,7 +1973,8 @@ static int uvesafb_init(void)
err = -ENOMEM; err = -ENOMEM;
if (err) { if (err) {
platform_device_put(uvesafb_device); if (uvesafb_device)
platform_device_put(uvesafb_device);
platform_driver_unregister(&uvesafb_driver); platform_driver_unregister(&uvesafb_driver);
cn_del_callback(&uvesafb_cn_id); cn_del_callback(&uvesafb_cn_id);
return err; return err;

View File

@ -82,7 +82,7 @@ fw-shipped-$(CONFIG_SCSI_ADVANSYS) += advansys/mcode.bin advansys/38C1600.bin \
fw-shipped-$(CONFIG_SCSI_QLOGIC_1280) += qlogic/1040.bin qlogic/1280.bin \ fw-shipped-$(CONFIG_SCSI_QLOGIC_1280) += qlogic/1040.bin qlogic/1280.bin \
qlogic/12160.bin qlogic/12160.bin
fw-shipped-$(CONFIG_SCSI_QLOGICPTI) += qlogic/isp1000.bin fw-shipped-$(CONFIG_SCSI_QLOGICPTI) += qlogic/isp1000.bin
fw-shipped-$(CONFIG_INFINIBAND_QIB) += intel/sd7220.fw fw-shipped-$(CONFIG_INFINIBAND_QIB) += qlogic/sd7220.fw
fw-shipped-$(CONFIG_SND_KORG1212) += korg/k1212.dsp fw-shipped-$(CONFIG_SND_KORG1212) += korg/k1212.dsp
fw-shipped-$(CONFIG_SND_MAESTRO3) += ess/maestro3_assp_kernel.fw \ fw-shipped-$(CONFIG_SND_MAESTRO3) += ess/maestro3_assp_kernel.fw \
ess/maestro3_assp_minisrc.fw ess/maestro3_assp_minisrc.fw

View File

@ -2999,20 +2999,23 @@ static int ext4_split_extent_at(handle_t *handle,
if (split_flag & EXT4_EXT_DATA_VALID1) { if (split_flag & EXT4_EXT_DATA_VALID1) {
err = ext4_ext_zeroout(inode, ex2); err = ext4_ext_zeroout(inode, ex2);
zero_ex.ee_block = ex2->ee_block; zero_ex.ee_block = ex2->ee_block;
zero_ex.ee_len = ext4_ext_get_actual_len(ex2); zero_ex.ee_len = cpu_to_le16(
ext4_ext_get_actual_len(ex2));
ext4_ext_store_pblock(&zero_ex, ext4_ext_store_pblock(&zero_ex,
ext4_ext_pblock(ex2)); ext4_ext_pblock(ex2));
} else { } else {
err = ext4_ext_zeroout(inode, ex); err = ext4_ext_zeroout(inode, ex);
zero_ex.ee_block = ex->ee_block; zero_ex.ee_block = ex->ee_block;
zero_ex.ee_len = ext4_ext_get_actual_len(ex); zero_ex.ee_len = cpu_to_le16(
ext4_ext_get_actual_len(ex));
ext4_ext_store_pblock(&zero_ex, ext4_ext_store_pblock(&zero_ex,
ext4_ext_pblock(ex)); ext4_ext_pblock(ex));
} }
} else { } else {
err = ext4_ext_zeroout(inode, &orig_ex); err = ext4_ext_zeroout(inode, &orig_ex);
zero_ex.ee_block = orig_ex.ee_block; zero_ex.ee_block = orig_ex.ee_block;
zero_ex.ee_len = ext4_ext_get_actual_len(&orig_ex); zero_ex.ee_len = cpu_to_le16(
ext4_ext_get_actual_len(&orig_ex));
ext4_ext_store_pblock(&zero_ex, ext4_ext_store_pblock(&zero_ex,
ext4_ext_pblock(&orig_ex)); ext4_ext_pblock(&orig_ex));
} }
@ -3272,7 +3275,7 @@ static int ext4_ext_convert_to_initialized(handle_t *handle,
if (err) if (err)
goto out; goto out;
zero_ex.ee_block = ex->ee_block; zero_ex.ee_block = ex->ee_block;
zero_ex.ee_len = ext4_ext_get_actual_len(ex); zero_ex.ee_len = cpu_to_le16(ext4_ext_get_actual_len(ex));
ext4_ext_store_pblock(&zero_ex, ext4_ext_pblock(ex)); ext4_ext_store_pblock(&zero_ex, ext4_ext_pblock(ex));
err = ext4_ext_get_access(handle, inode, path + depth); err = ext4_ext_get_access(handle, inode, path + depth);

View File

@ -1539,9 +1539,9 @@ static int free_hole_blocks(handle_t *handle, struct inode *inode,
blk = *i_data; blk = *i_data;
if (level > 0) { if (level > 0) {
ext4_lblk_t first2; ext4_lblk_t first2;
bh = sb_bread(inode->i_sb, blk); bh = sb_bread(inode->i_sb, le32_to_cpu(blk));
if (!bh) { if (!bh) {
EXT4_ERROR_INODE_BLOCK(inode, blk, EXT4_ERROR_INODE_BLOCK(inode, le32_to_cpu(blk),
"Read failure"); "Read failure");
return -EIO; return -EIO;
} }

View File

@ -923,8 +923,11 @@ static int gfs2_lock(struct file *file, int cmd, struct file_lock *fl)
cmd = F_SETLK; cmd = F_SETLK;
fl->fl_type = F_UNLCK; fl->fl_type = F_UNLCK;
} }
if (unlikely(test_bit(SDF_SHUTDOWN, &sdp->sd_flags))) if (unlikely(test_bit(SDF_SHUTDOWN, &sdp->sd_flags))) {
if (fl->fl_type == F_UNLCK)
posix_lock_file_wait(file, fl);
return -EIO; return -EIO;
}
if (IS_GETLK(cmd)) if (IS_GETLK(cmd))
return dlm_posix_get(ls->ls_dlm, ip->i_no_addr, file, fl); return dlm_posix_get(ls->ls_dlm, ip->i_no_addr, file, fl);
else if (fl->fl_type == F_UNLCK) else if (fl->fl_type == F_UNLCK)

View File

@ -588,6 +588,7 @@ struct lm_lockstruct {
struct dlm_lksb ls_control_lksb; /* control_lock */ struct dlm_lksb ls_control_lksb; /* control_lock */
char ls_control_lvb[GDLM_LVB_SIZE]; /* control_lock lvb */ char ls_control_lvb[GDLM_LVB_SIZE]; /* control_lock lvb */
struct completion ls_sync_wait; /* {control,mounted}_{lock,unlock} */ struct completion ls_sync_wait; /* {control,mounted}_{lock,unlock} */
char *ls_lvb_bits;
spinlock_t ls_recover_spin; /* protects following fields */ spinlock_t ls_recover_spin; /* protects following fields */
unsigned long ls_recover_flags; /* DFL_ */ unsigned long ls_recover_flags; /* DFL_ */

View File

@ -483,12 +483,8 @@ static void control_lvb_write(struct lm_lockstruct *ls, uint32_t lvb_gen,
static int all_jid_bits_clear(char *lvb) static int all_jid_bits_clear(char *lvb)
{ {
int i; return !memchr_inv(lvb + JID_BITMAP_OFFSET, 0,
for (i = JID_BITMAP_OFFSET; i < GDLM_LVB_SIZE; i++) { GDLM_LVB_SIZE - JID_BITMAP_OFFSET);
if (lvb[i])
return 0;
}
return 1;
} }
static void sync_wait_cb(void *arg) static void sync_wait_cb(void *arg)
@ -580,7 +576,6 @@ static void gfs2_control_func(struct work_struct *work)
{ {
struct gfs2_sbd *sdp = container_of(work, struct gfs2_sbd, sd_control_work.work); struct gfs2_sbd *sdp = container_of(work, struct gfs2_sbd, sd_control_work.work);
struct lm_lockstruct *ls = &sdp->sd_lockstruct; struct lm_lockstruct *ls = &sdp->sd_lockstruct;
char lvb_bits[GDLM_LVB_SIZE];
uint32_t block_gen, start_gen, lvb_gen, flags; uint32_t block_gen, start_gen, lvb_gen, flags;
int recover_set = 0; int recover_set = 0;
int write_lvb = 0; int write_lvb = 0;
@ -634,7 +629,7 @@ static void gfs2_control_func(struct work_struct *work)
return; return;
} }
control_lvb_read(ls, &lvb_gen, lvb_bits); control_lvb_read(ls, &lvb_gen, ls->ls_lvb_bits);
spin_lock(&ls->ls_recover_spin); spin_lock(&ls->ls_recover_spin);
if (block_gen != ls->ls_recover_block || if (block_gen != ls->ls_recover_block ||
@ -664,10 +659,10 @@ static void gfs2_control_func(struct work_struct *work)
ls->ls_recover_result[i] = 0; ls->ls_recover_result[i] = 0;
if (!test_bit_le(i, lvb_bits + JID_BITMAP_OFFSET)) if (!test_bit_le(i, ls->ls_lvb_bits + JID_BITMAP_OFFSET))
continue; continue;
__clear_bit_le(i, lvb_bits + JID_BITMAP_OFFSET); __clear_bit_le(i, ls->ls_lvb_bits + JID_BITMAP_OFFSET);
write_lvb = 1; write_lvb = 1;
} }
} }
@ -691,7 +686,7 @@ static void gfs2_control_func(struct work_struct *work)
continue; continue;
if (ls->ls_recover_submit[i] < start_gen) { if (ls->ls_recover_submit[i] < start_gen) {
ls->ls_recover_submit[i] = 0; ls->ls_recover_submit[i] = 0;
__set_bit_le(i, lvb_bits + JID_BITMAP_OFFSET); __set_bit_le(i, ls->ls_lvb_bits + JID_BITMAP_OFFSET);
} }
} }
/* even if there are no bits to set, we need to write the /* even if there are no bits to set, we need to write the
@ -705,7 +700,7 @@ static void gfs2_control_func(struct work_struct *work)
spin_unlock(&ls->ls_recover_spin); spin_unlock(&ls->ls_recover_spin);
if (write_lvb) { if (write_lvb) {
control_lvb_write(ls, start_gen, lvb_bits); control_lvb_write(ls, start_gen, ls->ls_lvb_bits);
flags = DLM_LKF_CONVERT | DLM_LKF_VALBLK; flags = DLM_LKF_CONVERT | DLM_LKF_VALBLK;
} else { } else {
flags = DLM_LKF_CONVERT; flags = DLM_LKF_CONVERT;
@ -725,7 +720,7 @@ static void gfs2_control_func(struct work_struct *work)
*/ */
for (i = 0; i < recover_size; i++) { for (i = 0; i < recover_size; i++) {
if (test_bit_le(i, lvb_bits + JID_BITMAP_OFFSET)) { if (test_bit_le(i, ls->ls_lvb_bits + JID_BITMAP_OFFSET)) {
fs_info(sdp, "recover generation %u jid %d\n", fs_info(sdp, "recover generation %u jid %d\n",
start_gen, i); start_gen, i);
gfs2_recover_set(sdp, i); gfs2_recover_set(sdp, i);
@ -758,7 +753,6 @@ static void gfs2_control_func(struct work_struct *work)
static int control_mount(struct gfs2_sbd *sdp) static int control_mount(struct gfs2_sbd *sdp)
{ {
struct lm_lockstruct *ls = &sdp->sd_lockstruct; struct lm_lockstruct *ls = &sdp->sd_lockstruct;
char lvb_bits[GDLM_LVB_SIZE];
uint32_t start_gen, block_gen, mount_gen, lvb_gen; uint32_t start_gen, block_gen, mount_gen, lvb_gen;
int mounted_mode; int mounted_mode;
int retries = 0; int retries = 0;
@ -857,7 +851,7 @@ locks_done:
* lvb_gen will be non-zero. * lvb_gen will be non-zero.
*/ */
control_lvb_read(ls, &lvb_gen, lvb_bits); control_lvb_read(ls, &lvb_gen, ls->ls_lvb_bits);
if (lvb_gen == 0xFFFFFFFF) { if (lvb_gen == 0xFFFFFFFF) {
/* special value to force mount attempts to fail */ /* special value to force mount attempts to fail */
@ -887,7 +881,7 @@ locks_done:
* and all lvb bits to be clear (no pending journal recoveries.) * and all lvb bits to be clear (no pending journal recoveries.)
*/ */
if (!all_jid_bits_clear(lvb_bits)) { if (!all_jid_bits_clear(ls->ls_lvb_bits)) {
/* journals need recovery, wait until all are clear */ /* journals need recovery, wait until all are clear */
fs_info(sdp, "control_mount wait for journal recovery\n"); fs_info(sdp, "control_mount wait for journal recovery\n");
goto restart; goto restart;
@ -949,7 +943,6 @@ static int dlm_recovery_wait(void *word)
static int control_first_done(struct gfs2_sbd *sdp) static int control_first_done(struct gfs2_sbd *sdp)
{ {
struct lm_lockstruct *ls = &sdp->sd_lockstruct; struct lm_lockstruct *ls = &sdp->sd_lockstruct;
char lvb_bits[GDLM_LVB_SIZE];
uint32_t start_gen, block_gen; uint32_t start_gen, block_gen;
int error; int error;
@ -991,8 +984,8 @@ restart:
memset(ls->ls_recover_result, 0, ls->ls_recover_size*sizeof(uint32_t)); memset(ls->ls_recover_result, 0, ls->ls_recover_size*sizeof(uint32_t));
spin_unlock(&ls->ls_recover_spin); spin_unlock(&ls->ls_recover_spin);
memset(lvb_bits, 0, sizeof(lvb_bits)); memset(ls->ls_lvb_bits, 0, GDLM_LVB_SIZE);
control_lvb_write(ls, start_gen, lvb_bits); control_lvb_write(ls, start_gen, ls->ls_lvb_bits);
error = mounted_lock(sdp, DLM_LOCK_PR, DLM_LKF_CONVERT); error = mounted_lock(sdp, DLM_LOCK_PR, DLM_LKF_CONVERT);
if (error) if (error)
@ -1022,6 +1015,12 @@ static int set_recover_size(struct gfs2_sbd *sdp, struct dlm_slot *slots,
uint32_t old_size, new_size; uint32_t old_size, new_size;
int i, max_jid; int i, max_jid;
if (!ls->ls_lvb_bits) {
ls->ls_lvb_bits = kzalloc(GDLM_LVB_SIZE, GFP_NOFS);
if (!ls->ls_lvb_bits)
return -ENOMEM;
}
max_jid = 0; max_jid = 0;
for (i = 0; i < num_slots; i++) { for (i = 0; i < num_slots; i++) {
if (max_jid < slots[i].slot - 1) if (max_jid < slots[i].slot - 1)
@ -1057,6 +1056,7 @@ static int set_recover_size(struct gfs2_sbd *sdp, struct dlm_slot *slots,
static void free_recover_size(struct lm_lockstruct *ls) static void free_recover_size(struct lm_lockstruct *ls)
{ {
kfree(ls->ls_lvb_bits);
kfree(ls->ls_recover_submit); kfree(ls->ls_recover_submit);
kfree(ls->ls_recover_result); kfree(ls->ls_recover_result);
ls->ls_recover_submit = NULL; ls->ls_recover_submit = NULL;
@ -1205,6 +1205,7 @@ static int gdlm_mount(struct gfs2_sbd *sdp, const char *table)
ls->ls_recover_size = 0; ls->ls_recover_size = 0;
ls->ls_recover_submit = NULL; ls->ls_recover_submit = NULL;
ls->ls_recover_result = NULL; ls->ls_recover_result = NULL;
ls->ls_lvb_bits = NULL;
error = set_recover_size(sdp, NULL, 0); error = set_recover_size(sdp, NULL, 0);
if (error) if (error)

View File

@ -576,7 +576,7 @@ int gfs2_rs_alloc(struct gfs2_inode *ip)
RB_CLEAR_NODE(&ip->i_res->rs_node); RB_CLEAR_NODE(&ip->i_res->rs_node);
out: out:
up_write(&ip->i_rw_mutex); up_write(&ip->i_rw_mutex);
return 0; return error;
} }
static void dump_rs(struct seq_file *seq, const struct gfs2_blkreserv *rs) static void dump_rs(struct seq_file *seq, const struct gfs2_blkreserv *rs)
@ -1181,12 +1181,9 @@ int gfs2_rgrp_send_discards(struct gfs2_sbd *sdp, u64 offset,
const struct gfs2_bitmap *bi, unsigned minlen, u64 *ptrimmed) const struct gfs2_bitmap *bi, unsigned minlen, u64 *ptrimmed)
{ {
struct super_block *sb = sdp->sd_vfs; struct super_block *sb = sdp->sd_vfs;
struct block_device *bdev = sb->s_bdev;
const unsigned int sects_per_blk = sdp->sd_sb.sb_bsize /
bdev_logical_block_size(sb->s_bdev);
u64 blk; u64 blk;
sector_t start = 0; sector_t start = 0;
sector_t nr_sects = 0; sector_t nr_blks = 0;
int rv; int rv;
unsigned int x; unsigned int x;
u32 trimmed = 0; u32 trimmed = 0;
@ -1206,35 +1203,34 @@ int gfs2_rgrp_send_discards(struct gfs2_sbd *sdp, u64 offset,
if (diff == 0) if (diff == 0)
continue; continue;
blk = offset + ((bi->bi_start + x) * GFS2_NBBY); blk = offset + ((bi->bi_start + x) * GFS2_NBBY);
blk *= sects_per_blk; /* convert to sectors */
while(diff) { while(diff) {
if (diff & 1) { if (diff & 1) {
if (nr_sects == 0) if (nr_blks == 0)
goto start_new_extent; goto start_new_extent;
if ((start + nr_sects) != blk) { if ((start + nr_blks) != blk) {
if (nr_sects >= minlen) { if (nr_blks >= minlen) {
rv = blkdev_issue_discard(bdev, rv = sb_issue_discard(sb,
start, nr_sects, start, nr_blks,
GFP_NOFS, 0); GFP_NOFS, 0);
if (rv) if (rv)
goto fail; goto fail;
trimmed += nr_sects; trimmed += nr_blks;
} }
nr_sects = 0; nr_blks = 0;
start_new_extent: start_new_extent:
start = blk; start = blk;
} }
nr_sects += sects_per_blk; nr_blks++;
} }
diff >>= 2; diff >>= 2;
blk += sects_per_blk; blk++;
} }
} }
if (nr_sects >= minlen) { if (nr_blks >= minlen) {
rv = blkdev_issue_discard(bdev, start, nr_sects, GFP_NOFS, 0); rv = sb_issue_discard(sb, start, nr_blks, GFP_NOFS, 0);
if (rv) if (rv)
goto fail; goto fail;
trimmed += nr_sects; trimmed += nr_blks;
} }
if (ptrimmed) if (ptrimmed)
*ptrimmed = trimmed; *ptrimmed = trimmed;

View File

@ -187,8 +187,8 @@ fill_with_dentries(void *buf, const char *name, int namelen, loff_t offset,
if (dbuf->count == ARRAY_SIZE(dbuf->dentries)) if (dbuf->count == ARRAY_SIZE(dbuf->dentries))
return -ENOSPC; return -ENOSPC;
if (name[0] == '.' && (name[1] == '\0' || if (name[0] == '.' && (namelen < 2 ||
(name[1] == '.' && name[2] == '\0'))) (namelen == 2 && name[1] == '.')))
return 0; return 0;
dentry = lookup_one_len(name, dbuf->xadir, namelen); dentry = lookup_one_len(name, dbuf->xadir, namelen);

View File

@ -1568,6 +1568,12 @@ static int ubifs_remount_rw(struct ubifs_info *c)
c->remounting_rw = 1; c->remounting_rw = 1;
c->ro_mount = 0; c->ro_mount = 0;
if (c->space_fixup) {
err = ubifs_fixup_free_space(c);
if (err)
return err;
}
err = check_free_space(c); err = check_free_space(c);
if (err) if (err)
goto out; goto out;
@ -1684,12 +1690,6 @@ static int ubifs_remount_rw(struct ubifs_info *c)
err = dbg_check_space_info(c); err = dbg_check_space_info(c);
} }
if (c->space_fixup) {
err = ubifs_fixup_free_space(c);
if (err)
goto out;
}
mutex_unlock(&c->umount_mutex); mutex_unlock(&c->umount_mutex);
return err; return err;

View File

@ -213,7 +213,7 @@ struct devfreq_simple_ondemand_data {
#endif #endif
#else /* !CONFIG_PM_DEVFREQ */ #else /* !CONFIG_PM_DEVFREQ */
static struct devfreq *devfreq_add_device(struct device *dev, static inline struct devfreq *devfreq_add_device(struct device *dev,
struct devfreq_dev_profile *profile, struct devfreq_dev_profile *profile,
const char *governor_name, const char *governor_name,
void *data) void *data)
@ -221,34 +221,34 @@ static struct devfreq *devfreq_add_device(struct device *dev,
return NULL; return NULL;
} }
static int devfreq_remove_device(struct devfreq *devfreq) static inline int devfreq_remove_device(struct devfreq *devfreq)
{ {
return 0; return 0;
} }
static int devfreq_suspend_device(struct devfreq *devfreq) static inline int devfreq_suspend_device(struct devfreq *devfreq)
{ {
return 0; return 0;
} }
static int devfreq_resume_device(struct devfreq *devfreq) static inline int devfreq_resume_device(struct devfreq *devfreq)
{ {
return 0; return 0;
} }
static struct opp *devfreq_recommended_opp(struct device *dev, static inline struct opp *devfreq_recommended_opp(struct device *dev,
unsigned long *freq, u32 flags) unsigned long *freq, u32 flags)
{ {
return -EINVAL; return ERR_PTR(-EINVAL);
} }
static int devfreq_register_opp_notifier(struct device *dev, static inline int devfreq_register_opp_notifier(struct device *dev,
struct devfreq *devfreq) struct devfreq *devfreq)
{ {
return -EINVAL; return -EINVAL;
} }
static int devfreq_unregister_opp_notifier(struct device *dev, static inline int devfreq_unregister_opp_notifier(struct device *dev,
struct devfreq *devfreq) struct devfreq *devfreq)
{ {
return -EINVAL; return -EINVAL;

View File

@ -208,9 +208,9 @@ struct netdev_hw_addr {
#define NETDEV_HW_ADDR_T_SLAVE 3 #define NETDEV_HW_ADDR_T_SLAVE 3
#define NETDEV_HW_ADDR_T_UNICAST 4 #define NETDEV_HW_ADDR_T_UNICAST 4
#define NETDEV_HW_ADDR_T_MULTICAST 5 #define NETDEV_HW_ADDR_T_MULTICAST 5
bool synced;
bool global_use; bool global_use;
int refcount; int refcount;
int synced;
struct rcu_head rcu_head; struct rcu_head rcu_head;
}; };

View File

@ -2726,6 +2726,13 @@ static inline void nf_reset(struct sk_buff *skb)
#endif #endif
} }
static inline void nf_reset_trace(struct sk_buff *skb)
{
#if IS_ENABLED(CONFIG_NETFILTER_XT_TARGET_TRACE)
skb->nf_trace = 0;
#endif
}
/* Note: This doesn't put any conntrack and bridge info in dst. */ /* Note: This doesn't put any conntrack and bridge info in dst. */
static inline void __nf_copy(struct sk_buff *dst, const struct sk_buff *src) static inline void __nf_copy(struct sk_buff *dst, const struct sk_buff *src)
{ {

0
include/sound/max98090.h Executable file → Normal file
View File

View File

@ -488,6 +488,7 @@ struct snd_soc_dapm_path {
/* status */ /* status */
u32 connect:1; /* source and sink widgets are connected */ u32 connect:1; /* source and sink widgets are connected */
u32 walked:1; /* path has been walked */ u32 walked:1; /* path has been walked */
u32 walking:1; /* path is in the process of being walked */
u32 weak:1; /* path ignored for power management */ u32 weak:1; /* path ignored for power management */
int (*connected)(struct snd_soc_dapm_widget *source, int (*connected)(struct snd_soc_dapm_widget *source,

View File

@ -1940,7 +1940,7 @@ struct vm_area_struct *find_vma(struct mm_struct *mm, unsigned long addr)
/* Check the cache first. */ /* Check the cache first. */
/* (Cache hit rate is typically around 35%.) */ /* (Cache hit rate is typically around 35%.) */
vma = mm->mmap_cache; vma = ACCESS_ONCE(mm->mmap_cache);
if (!(vma && vma->vm_end > addr && vma->vm_start <= addr)) { if (!(vma && vma->vm_end > addr && vma->vm_start <= addr)) {
struct rb_node *rb_node; struct rb_node *rb_node;

View File

@ -821,7 +821,7 @@ struct vm_area_struct *find_vma(struct mm_struct *mm, unsigned long addr)
struct vm_area_struct *vma; struct vm_area_struct *vma;
/* check the cache first */ /* check the cache first */
vma = mm->mmap_cache; vma = ACCESS_ONCE(mm->mmap_cache);
if (vma && vma->vm_start <= addr && vma->vm_end > addr) if (vma && vma->vm_start <= addr && vma->vm_end > addr)
return vma; return vma;

View File

@ -531,6 +531,8 @@ int vcc_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg,
struct sk_buff *skb; struct sk_buff *skb;
int copied, error = -EINVAL; int copied, error = -EINVAL;
msg->msg_namelen = 0;
if (sock->state != SS_CONNECTED) if (sock->state != SS_CONNECTED)
return -ENOTCONN; return -ENOTCONN;

View File

@ -1642,6 +1642,7 @@ static int ax25_recvmsg(struct kiocb *iocb, struct socket *sock,
ax25_address src; ax25_address src;
const unsigned char *mac = skb_mac_header(skb); const unsigned char *mac = skb_mac_header(skb);
memset(sax, 0, sizeof(struct full_sockaddr_ax25));
ax25_addr_parse(mac + 1, skb->data - mac - 1, &src, NULL, ax25_addr_parse(mac + 1, skb->data - mac - 1, &src, NULL,
&digi, NULL, NULL); &digi, NULL, NULL);
sax->sax25_family = AF_AX25; sax->sax25_family = AF_AX25;

View File

@ -230,6 +230,8 @@ int bt_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
if (flags & (MSG_OOB)) if (flags & (MSG_OOB))
return -EOPNOTSUPP; return -EOPNOTSUPP;
msg->msg_namelen = 0;
skb = skb_recv_datagram(sk, flags, noblock, &err); skb = skb_recv_datagram(sk, flags, noblock, &err);
if (!skb) { if (!skb) {
if (sk->sk_shutdown & RCV_SHUTDOWN) if (sk->sk_shutdown & RCV_SHUTDOWN)
@ -237,8 +239,6 @@ int bt_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
return err; return err;
} }
msg->msg_namelen = 0;
copied = skb->len; copied = skb->len;
if (len < copied) { if (len < copied) {
msg->msg_flags |= MSG_TRUNC; msg->msg_flags |= MSG_TRUNC;

View File

@ -608,6 +608,7 @@ static int rfcomm_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
if (test_and_clear_bit(RFCOMM_DEFER_SETUP, &d->flags)) { if (test_and_clear_bit(RFCOMM_DEFER_SETUP, &d->flags)) {
rfcomm_dlc_accept(d); rfcomm_dlc_accept(d);
msg->msg_namelen = 0;
return 0; return 0;
} }

View File

@ -665,6 +665,7 @@ static int sco_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) { test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) {
hci_conn_accept(pi->conn->hcon, 0); hci_conn_accept(pi->conn->hcon, 0);
sk->sk_state = BT_CONFIG; sk->sk_state = BT_CONFIG;
msg->msg_namelen = 0;
release_sock(sk); release_sock(sk);
return 0; return 0;

View File

@ -286,6 +286,8 @@ static int caif_seqpkt_recvmsg(struct kiocb *iocb, struct socket *sock,
if (m->msg_flags&MSG_OOB) if (m->msg_flags&MSG_OOB)
goto read_error; goto read_error;
m->msg_namelen = 0;
skb = skb_recv_datagram(sk, flags, 0 , &ret); skb = skb_recv_datagram(sk, flags, 0 , &ret);
if (!skb) if (!skb)
goto read_error; goto read_error;

View File

@ -1639,6 +1639,7 @@ int dev_forward_skb(struct net_device *dev, struct sk_buff *skb)
skb->mark = 0; skb->mark = 0;
secpath_reset(skb); secpath_reset(skb);
nf_reset(skb); nf_reset(skb);
nf_reset_trace(skb);
return netif_rx(skb); return netif_rx(skb);
} }
EXPORT_SYMBOL_GPL(dev_forward_skb); EXPORT_SYMBOL_GPL(dev_forward_skb);

View File

@ -37,7 +37,7 @@ static int __hw_addr_create_ex(struct netdev_hw_addr_list *list,
ha->type = addr_type; ha->type = addr_type;
ha->refcount = 1; ha->refcount = 1;
ha->global_use = global; ha->global_use = global;
ha->synced = false; ha->synced = 0;
list_add_tail_rcu(&ha->list, &list->list); list_add_tail_rcu(&ha->list, &list->list);
list->count++; list->count++;
@ -165,7 +165,7 @@ int __hw_addr_sync(struct netdev_hw_addr_list *to_list,
addr_len, ha->type); addr_len, ha->type);
if (err) if (err)
break; break;
ha->synced = true; ha->synced++;
ha->refcount++; ha->refcount++;
} else if (ha->refcount == 1) { } else if (ha->refcount == 1) {
__hw_addr_del(to_list, ha->addr, addr_len, ha->type); __hw_addr_del(to_list, ha->addr, addr_len, ha->type);
@ -186,7 +186,7 @@ void __hw_addr_unsync(struct netdev_hw_addr_list *to_list,
if (ha->synced) { if (ha->synced) {
__hw_addr_del(to_list, ha->addr, __hw_addr_del(to_list, ha->addr,
addr_len, ha->type); addr_len, ha->type);
ha->synced = false; ha->synced--;
__hw_addr_del(from_list, ha->addr, __hw_addr_del(from_list, ha->addr,
addr_len, ha->type); addr_len, ha->type);
} }

View File

@ -802,8 +802,10 @@ static int inet_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh)
if (nlh->nlmsg_flags & NLM_F_EXCL || if (nlh->nlmsg_flags & NLM_F_EXCL ||
!(nlh->nlmsg_flags & NLM_F_REPLACE)) !(nlh->nlmsg_flags & NLM_F_REPLACE))
return -EEXIST; return -EEXIST;
ifa = ifa_existing;
set_ifa_lifetime(ifa_existing, valid_lft, prefered_lft); set_ifa_lifetime(ifa, valid_lft, prefered_lft);
rtmsg_ifa(RTM_NEWADDR, ifa, nlh, NETLINK_CB(skb).portid);
blocking_notifier_call_chain(&inetaddr_chain, NETDEV_UP, ifa);
} }
return 0; return 0;
} }

View File

@ -52,7 +52,7 @@ static bool ip6t_npt_map_pfx(const struct ip6t_npt_tginfo *npt,
if (pfx_len - i >= 32) if (pfx_len - i >= 32)
mask = 0; mask = 0;
else else
mask = htonl(~((1 << (pfx_len - i)) - 1)); mask = htonl((1 << (i - pfx_len + 32)) - 1);
idx = i / 32; idx = i / 32;
addr->s6_addr32[idx] &= mask; addr->s6_addr32[idx] &= mask;

View File

@ -386,6 +386,7 @@ static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
if (dst) if (dst)
dst->ops->redirect(dst, sk, skb); dst->ops->redirect(dst, sk, skb);
goto out;
} }
if (type == ICMPV6_PKT_TOOBIG) { if (type == ICMPV6_PKT_TOOBIG) {

View File

@ -1386,6 +1386,8 @@ static int irda_recvmsg_dgram(struct kiocb *iocb, struct socket *sock,
IRDA_DEBUG(4, "%s()\n", __func__); IRDA_DEBUG(4, "%s()\n", __func__);
msg->msg_namelen = 0;
skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT, skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT,
flags & MSG_DONTWAIT, &err); flags & MSG_DONTWAIT, &err);
if (!skb) if (!skb)

Some files were not shown because too many files have changed in this diff Show More