mirror of
https://github.com/torvalds/linux.git
synced 2026-06-08 14:42:37 +02:00
Merge remote-tracking branch 'lts/linux-4.4.y' into linux-linaro-lsk-v4.4
This commit is contained in:
commit
d15d038418
|
|
@ -18,6 +18,7 @@ Required properties:
|
|||
"allwinner,sun4i-a10-cpu-clk" - for the CPU multiplexer clock
|
||||
"allwinner,sun4i-a10-axi-clk" - for the AXI clock
|
||||
"allwinner,sun8i-a23-axi-clk" - for the AXI clock on A23
|
||||
"allwinner,sun4i-a10-gates-clk" - for generic gates on all compatible SoCs
|
||||
"allwinner,sun4i-a10-axi-gates-clk" - for the AXI gates
|
||||
"allwinner,sun4i-a10-ahb-clk" - for the AHB clock
|
||||
"allwinner,sun5i-a13-ahb-clk" - for the AHB clock on A13
|
||||
|
|
@ -43,6 +44,7 @@ Required properties:
|
|||
"allwinner,sun6i-a31-apb0-gates-clk" - for the APB0 gates on A31
|
||||
"allwinner,sun7i-a20-apb0-gates-clk" - for the APB0 gates on A20
|
||||
"allwinner,sun8i-a23-apb0-gates-clk" - for the APB0 gates on A23
|
||||
"allwinner,sun8i-h3-apb0-gates-clk" - for the APB0 gates on H3
|
||||
"allwinner,sun9i-a80-apb0-gates-clk" - for the APB0 gates on A80
|
||||
"allwinner,sun4i-a10-apb1-clk" - for the APB1 clock
|
||||
"allwinner,sun9i-a80-apb1-clk" - for the APB1 bus clock on A80
|
||||
|
|
|
|||
2
Makefile
2
Makefile
|
|
@ -1,6 +1,6 @@
|
|||
VERSION = 4
|
||||
PATCHLEVEL = 4
|
||||
SUBLEVEL = 65
|
||||
SUBLEVEL = 68
|
||||
EXTRAVERSION =
|
||||
NAME = Blurry Fish Butt
|
||||
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@
|
|||
;
|
||||
; Now manually save: r12, sp, fp, gp, r25
|
||||
|
||||
PUSH r30
|
||||
PUSH r12
|
||||
|
||||
; Saving pt_regs->sp correctly requires some extra work due to the way
|
||||
|
|
@ -72,6 +73,7 @@
|
|||
POPAX AUX_USER_SP
|
||||
1:
|
||||
POP r12
|
||||
POP r30
|
||||
|
||||
.endm
|
||||
|
||||
|
|
|
|||
|
|
@ -84,7 +84,7 @@ struct pt_regs {
|
|||
unsigned long fp;
|
||||
unsigned long sp; /* user/kernel sp depending on where we came from */
|
||||
|
||||
unsigned long r12;
|
||||
unsigned long r12, r30;
|
||||
|
||||
/*------- Below list auto saved by h/w -----------*/
|
||||
unsigned long r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11;
|
||||
|
|
|
|||
|
|
@ -73,7 +73,6 @@ obj-$(CONFIG_IWMMXT) += iwmmxt.o
|
|||
obj-$(CONFIG_PERF_EVENTS) += perf_regs.o perf_callchain.o
|
||||
obj-$(CONFIG_HW_PERF_EVENTS) += perf_event_xscale.o perf_event_v6.o \
|
||||
perf_event_v7.o
|
||||
CFLAGS_pj4-cp0.o := -marm
|
||||
AFLAGS_iwmmxt.o := -Wa,-mcpu=iwmmxt
|
||||
obj-$(CONFIG_ARM_CPU_TOPOLOGY) += topology.o
|
||||
obj-$(CONFIG_VDSO) += vdso.o
|
||||
|
|
|
|||
|
|
@ -66,9 +66,13 @@ static void __init pj4_cp_access_write(u32 value)
|
|||
|
||||
__asm__ __volatile__ (
|
||||
"mcr p15, 0, %1, c1, c0, 2\n\t"
|
||||
#ifdef CONFIG_THUMB2_KERNEL
|
||||
"isb\n\t"
|
||||
#else
|
||||
"mrc p15, 0, %0, c1, c0, 2\n\t"
|
||||
"mov %0, %0\n\t"
|
||||
"sub pc, pc, #4\n\t"
|
||||
#endif
|
||||
: "=r" (temp) : "r" (value));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@
|
|||
|
||||
#include <linux/linkage.h>
|
||||
#include <linux/init.h>
|
||||
#include <asm/assembler.h>
|
||||
|
||||
#include "omap44xx.h"
|
||||
|
||||
|
|
@ -56,7 +57,7 @@ wait_2: ldr r2, =AUX_CORE_BOOT0_PA @ read from AuxCoreBoot0
|
|||
cmp r0, r4
|
||||
bne wait_2
|
||||
ldr r12, =API_HYP_ENTRY
|
||||
adr r0, hyp_boot
|
||||
badr r0, hyp_boot
|
||||
smc #0
|
||||
hyp_boot:
|
||||
b secondary_startup
|
||||
|
|
|
|||
|
|
@ -496,8 +496,7 @@ void __init omap_init_time(void)
|
|||
__omap_sync32k_timer_init(1, "timer_32k_ck", "ti,timer-alwon",
|
||||
2, "timer_sys_ck", NULL, false);
|
||||
|
||||
if (of_have_populated_dt())
|
||||
clocksource_probe();
|
||||
clocksource_probe();
|
||||
}
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_SOC_AM43XX)
|
||||
|
|
@ -505,6 +504,8 @@ void __init omap3_secure_sync32k_timer_init(void)
|
|||
{
|
||||
__omap_sync32k_timer_init(12, "secure_32k_fck", "ti,timer-secure",
|
||||
2, "timer_sys_ck", NULL, false);
|
||||
|
||||
clocksource_probe();
|
||||
}
|
||||
#endif /* CONFIG_ARCH_OMAP3 */
|
||||
|
||||
|
|
@ -513,6 +514,8 @@ void __init omap3_gptimer_timer_init(void)
|
|||
{
|
||||
__omap_sync32k_timer_init(2, "timer_sys_ck", NULL,
|
||||
1, "timer_sys_ck", "ti,timer-alwon", true);
|
||||
|
||||
clocksource_probe();
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -728,14 +728,14 @@ static int build_body(struct jit_ctx *ctx)
|
|||
int ret;
|
||||
|
||||
ret = build_insn(insn, ctx);
|
||||
|
||||
if (ctx->image == NULL)
|
||||
ctx->offset[i] = ctx->idx;
|
||||
|
||||
if (ret > 0) {
|
||||
i++;
|
||||
if (ctx->image == NULL)
|
||||
ctx->offset[i] = ctx->idx;
|
||||
continue;
|
||||
}
|
||||
if (ctx->image == NULL)
|
||||
ctx->offset[i] = ctx->idx;
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,12 +14,22 @@ static int crashing_cpu = -1;
|
|||
static cpumask_t cpus_in_crash = CPU_MASK_NONE;
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
static void crash_shutdown_secondary(void *ignore)
|
||||
static void crash_shutdown_secondary(void *passed_regs)
|
||||
{
|
||||
struct pt_regs *regs;
|
||||
struct pt_regs *regs = passed_regs;
|
||||
int cpu = smp_processor_id();
|
||||
|
||||
regs = task_pt_regs(current);
|
||||
/*
|
||||
* If we are passed registers, use those. Otherwise get the
|
||||
* regs from the last interrupt, which should be correct, as
|
||||
* we are in an interrupt. But if the regs are not there,
|
||||
* pull them from the top of the stack. They are probably
|
||||
* wrong, but we need something to keep from crashing again.
|
||||
*/
|
||||
if (!regs)
|
||||
regs = get_irq_regs();
|
||||
if (!regs)
|
||||
regs = task_pt_regs(current);
|
||||
|
||||
if (!cpu_online(cpu))
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -206,7 +206,7 @@ int arch_check_elf(void *_ehdr, bool has_interpreter,
|
|||
else if ((prog_req.fr1 && prog_req.frdefault) ||
|
||||
(prog_req.single && !prog_req.frdefault))
|
||||
/* Make sure 64-bit MIPS III/IV/64R1 will not pick FR1 */
|
||||
state->overall_fp_mode = ((current_cpu_data.fpu_id & MIPS_FPIR_F64) &&
|
||||
state->overall_fp_mode = ((raw_current_cpu_data.fpu_id & MIPS_FPIR_F64) &&
|
||||
cpu_has_mips_r2_r6) ?
|
||||
FP_FR1 : FP_FR0;
|
||||
else if (prog_req.fr1)
|
||||
|
|
|
|||
|
|
@ -244,9 +244,6 @@ static int compute_signal(int tt)
|
|||
void sleeping_thread_to_gdb_regs(unsigned long *gdb_regs, struct task_struct *p)
|
||||
{
|
||||
int reg;
|
||||
struct thread_info *ti = task_thread_info(p);
|
||||
unsigned long ksp = (unsigned long)ti + THREAD_SIZE - 32;
|
||||
struct pt_regs *regs = (struct pt_regs *)ksp - 1;
|
||||
#if (KGDB_GDB_REG_SIZE == 32)
|
||||
u32 *ptr = (u32 *)gdb_regs;
|
||||
#else
|
||||
|
|
@ -254,25 +251,46 @@ void sleeping_thread_to_gdb_regs(unsigned long *gdb_regs, struct task_struct *p)
|
|||
#endif
|
||||
|
||||
for (reg = 0; reg < 16; reg++)
|
||||
*(ptr++) = regs->regs[reg];
|
||||
*(ptr++) = 0;
|
||||
|
||||
/* S0 - S7 */
|
||||
for (reg = 16; reg < 24; reg++)
|
||||
*(ptr++) = regs->regs[reg];
|
||||
*(ptr++) = p->thread.reg16;
|
||||
*(ptr++) = p->thread.reg17;
|
||||
*(ptr++) = p->thread.reg18;
|
||||
*(ptr++) = p->thread.reg19;
|
||||
*(ptr++) = p->thread.reg20;
|
||||
*(ptr++) = p->thread.reg21;
|
||||
*(ptr++) = p->thread.reg22;
|
||||
*(ptr++) = p->thread.reg23;
|
||||
|
||||
for (reg = 24; reg < 28; reg++)
|
||||
*(ptr++) = 0;
|
||||
|
||||
/* GP, SP, FP, RA */
|
||||
for (reg = 28; reg < 32; reg++)
|
||||
*(ptr++) = regs->regs[reg];
|
||||
*(ptr++) = (long)p;
|
||||
*(ptr++) = p->thread.reg29;
|
||||
*(ptr++) = p->thread.reg30;
|
||||
*(ptr++) = p->thread.reg31;
|
||||
|
||||
*(ptr++) = regs->cp0_status;
|
||||
*(ptr++) = regs->lo;
|
||||
*(ptr++) = regs->hi;
|
||||
*(ptr++) = regs->cp0_badvaddr;
|
||||
*(ptr++) = regs->cp0_cause;
|
||||
*(ptr++) = regs->cp0_epc;
|
||||
*(ptr++) = p->thread.cp0_status;
|
||||
|
||||
/* lo, hi */
|
||||
*(ptr++) = 0;
|
||||
*(ptr++) = 0;
|
||||
|
||||
/*
|
||||
* BadVAddr, Cause
|
||||
* Ideally these would come from the last exception frame up the stack
|
||||
* but that requires unwinding, otherwise we can't know much for sure.
|
||||
*/
|
||||
*(ptr++) = 0;
|
||||
*(ptr++) = 0;
|
||||
|
||||
/*
|
||||
* PC
|
||||
* use return address (RA), i.e. the moment after return from resume()
|
||||
*/
|
||||
*(ptr++) = p->thread.reg31;
|
||||
}
|
||||
|
||||
void kgdb_arch_set_pc(struct pt_regs *regs, unsigned long pc)
|
||||
|
|
|
|||
|
|
@ -434,8 +434,8 @@ static int multu_func(struct pt_regs *regs, u32 ir)
|
|||
rs = regs->regs[MIPSInst_RS(ir)];
|
||||
res = (u64)rt * (u64)rs;
|
||||
rt = res;
|
||||
regs->lo = (s64)rt;
|
||||
regs->hi = (s64)(res >> 32);
|
||||
regs->lo = (s64)(s32)rt;
|
||||
regs->hi = (s64)(s32)(res >> 32);
|
||||
|
||||
MIPS_R2_STATS(muls);
|
||||
|
||||
|
|
@ -671,9 +671,9 @@ static int maddu_func(struct pt_regs *regs, u32 ir)
|
|||
res += ((((s64)rt) << 32) | (u32)rs);
|
||||
|
||||
rt = res;
|
||||
regs->lo = (s64)rt;
|
||||
regs->lo = (s64)(s32)rt;
|
||||
rs = res >> 32;
|
||||
regs->hi = (s64)rs;
|
||||
regs->hi = (s64)(s32)rs;
|
||||
|
||||
MIPS_R2_STATS(dsps);
|
||||
|
||||
|
|
@ -729,9 +729,9 @@ static int msubu_func(struct pt_regs *regs, u32 ir)
|
|||
res = ((((s64)rt) << 32) | (u32)rs) - res;
|
||||
|
||||
rt = res;
|
||||
regs->lo = (s64)rt;
|
||||
regs->lo = (s64)(s32)rt;
|
||||
rs = res >> 32;
|
||||
regs->hi = (s64)rs;
|
||||
regs->hi = (s64)(s32)rs;
|
||||
|
||||
MIPS_R2_STATS(dsps);
|
||||
|
||||
|
|
|
|||
|
|
@ -148,7 +148,7 @@ opal_tracepoint_entry:
|
|||
opal_tracepoint_return:
|
||||
std r3,STK_REG(R31)(r1)
|
||||
mr r4,r3
|
||||
ld r0,STK_REG(R23)(r1)
|
||||
ld r3,STK_REG(R23)(r1)
|
||||
bl __trace_opal_exit
|
||||
ld r3,STK_REG(R31)(r1)
|
||||
addi r1,r1,STACKFRAMESIZE
|
||||
|
|
|
|||
|
|
@ -668,6 +668,14 @@ static inline unsigned long pmd_pfn(pmd_t pmd)
|
|||
return pte_pfn(pte);
|
||||
}
|
||||
|
||||
#define __HAVE_ARCH_PMD_WRITE
|
||||
static inline unsigned long pmd_write(pmd_t pmd)
|
||||
{
|
||||
pte_t pte = __pte(pmd_val(pmd));
|
||||
|
||||
return pte_write(pte);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
|
||||
static inline unsigned long pmd_dirty(pmd_t pmd)
|
||||
{
|
||||
|
|
@ -683,13 +691,6 @@ static inline unsigned long pmd_young(pmd_t pmd)
|
|||
return pte_young(pte);
|
||||
}
|
||||
|
||||
static inline unsigned long pmd_write(pmd_t pmd)
|
||||
{
|
||||
pte_t pte = __pte(pmd_val(pmd));
|
||||
|
||||
return pte_write(pte);
|
||||
}
|
||||
|
||||
static inline unsigned long pmd_trans_huge(pmd_t pmd)
|
||||
{
|
||||
pte_t pte = __pte(pmd_val(pmd));
|
||||
|
|
|
|||
|
|
@ -1493,7 +1493,7 @@ bool kern_addr_valid(unsigned long addr)
|
|||
if ((long)addr < 0L) {
|
||||
unsigned long pa = __pa(addr);
|
||||
|
||||
if ((addr >> max_phys_bits) != 0UL)
|
||||
if ((pa >> max_phys_bits) != 0UL)
|
||||
return false;
|
||||
|
||||
return pfn_valid(pa >> PAGE_SHIFT);
|
||||
|
|
|
|||
|
|
@ -1875,6 +1875,7 @@ static struct irq_chip ioapic_chip __read_mostly = {
|
|||
.irq_ack = irq_chip_ack_parent,
|
||||
.irq_eoi = ioapic_ack_level,
|
||||
.irq_set_affinity = ioapic_set_affinity,
|
||||
.irq_retrigger = irq_chip_retrigger_hierarchy,
|
||||
.flags = IRQCHIP_SKIP_SET_WAKE,
|
||||
};
|
||||
|
||||
|
|
@ -1886,6 +1887,7 @@ static struct irq_chip ioapic_ir_chip __read_mostly = {
|
|||
.irq_ack = irq_chip_ack_parent,
|
||||
.irq_eoi = ioapic_ir_ack_level,
|
||||
.irq_set_affinity = ioapic_set_affinity,
|
||||
.irq_retrigger = irq_chip_retrigger_hierarchy,
|
||||
.flags = IRQCHIP_SKIP_SET_WAKE,
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -977,6 +977,18 @@ void prepare_ftrace_return(unsigned long self_addr, unsigned long *parent,
|
|||
unsigned long return_hooker = (unsigned long)
|
||||
&return_to_handler;
|
||||
|
||||
/*
|
||||
* When resuming from suspend-to-ram, this function can be indirectly
|
||||
* called from early CPU startup code while the CPU is in real mode,
|
||||
* which would fail miserably. Make sure the stack pointer is a
|
||||
* virtual address.
|
||||
*
|
||||
* This check isn't as accurate as virt_addr_valid(), but it should be
|
||||
* good enough for this purpose, and it's fast.
|
||||
*/
|
||||
if (unlikely((long)__builtin_frame_address(0) >= 0))
|
||||
return;
|
||||
|
||||
if (unlikely(ftrace_graph_is_dead()))
|
||||
return;
|
||||
|
||||
|
|
|
|||
|
|
@ -67,7 +67,7 @@
|
|||
#endif
|
||||
|
||||
/* Ensure if the instruction can be boostable */
|
||||
extern int can_boost(kprobe_opcode_t *instruction);
|
||||
extern int can_boost(kprobe_opcode_t *instruction, void *addr);
|
||||
/* Recover instruction if given address is probed */
|
||||
extern unsigned long recover_probed_instruction(kprobe_opcode_t *buf,
|
||||
unsigned long addr);
|
||||
|
|
|
|||
|
|
@ -163,12 +163,12 @@ NOKPROBE_SYMBOL(skip_prefixes);
|
|||
* Returns non-zero if opcode is boostable.
|
||||
* RIP relative instructions are adjusted at copying time in 64 bits mode
|
||||
*/
|
||||
int can_boost(kprobe_opcode_t *opcodes)
|
||||
int can_boost(kprobe_opcode_t *opcodes, void *addr)
|
||||
{
|
||||
kprobe_opcode_t opcode;
|
||||
kprobe_opcode_t *orig_opcodes = opcodes;
|
||||
|
||||
if (search_exception_tables((unsigned long)opcodes))
|
||||
if (search_exception_tables((unsigned long)addr))
|
||||
return 0; /* Page fault may occur on this address. */
|
||||
|
||||
retry:
|
||||
|
|
@ -413,7 +413,7 @@ static int arch_copy_kprobe(struct kprobe *p)
|
|||
* __copy_instruction can modify the displacement of the instruction,
|
||||
* but it doesn't affect boostable check.
|
||||
*/
|
||||
if (can_boost(p->ainsn.insn))
|
||||
if (can_boost(p->ainsn.insn, p->addr))
|
||||
p->ainsn.boostable = 0;
|
||||
else
|
||||
p->ainsn.boostable = -1;
|
||||
|
|
|
|||
|
|
@ -177,7 +177,7 @@ static int copy_optimized_instructions(u8 *dest, u8 *src)
|
|||
|
||||
while (len < RELATIVEJUMP_SIZE) {
|
||||
ret = __copy_instruction(dest + len, src + len);
|
||||
if (!ret || !can_boost(dest + len))
|
||||
if (!ret || !can_boost(dest + len, src + len))
|
||||
return -EINVAL;
|
||||
len += ret;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -296,7 +296,7 @@ static void iommu_free(struct iommu_table *tbl, dma_addr_t dma_addr,
|
|||
|
||||
/* were we called with bad_dma_address? */
|
||||
badend = DMA_ERROR_CODE + (EMERGENCY_PAGES * PAGE_SIZE);
|
||||
if (unlikely((dma_addr >= DMA_ERROR_CODE) && (dma_addr < badend))) {
|
||||
if (unlikely(dma_addr < badend)) {
|
||||
WARN(1, KERN_ERR "Calgary: driver tried unmapping bad DMA "
|
||||
"address 0x%Lx\n", dma_addr);
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -818,12 +818,6 @@ void kvm_cpuid(struct kvm_vcpu *vcpu, u32 *eax, u32 *ebx, u32 *ecx, u32 *edx)
|
|||
if (!best)
|
||||
best = check_cpuid_limit(vcpu, function, index);
|
||||
|
||||
/*
|
||||
* Perfmon not yet supported for L2 guest.
|
||||
*/
|
||||
if (is_guest_mode(vcpu) && function == 0xa)
|
||||
best = NULL;
|
||||
|
||||
if (best) {
|
||||
*eax = best->eax;
|
||||
*ebx = best->ebx;
|
||||
|
|
|
|||
|
|
@ -7754,8 +7754,6 @@ static bool nested_vmx_exit_handled(struct kvm_vcpu *vcpu)
|
|||
case EXIT_REASON_TASK_SWITCH:
|
||||
return true;
|
||||
case EXIT_REASON_CPUID:
|
||||
if (kvm_register_read(vcpu, VCPU_REGS_RAX) == 0xa)
|
||||
return false;
|
||||
return true;
|
||||
case EXIT_REASON_HLT:
|
||||
return nested_cpu_has(vmcs12, CPU_BASED_HLT_EXITING);
|
||||
|
|
@ -7840,6 +7838,9 @@ static bool nested_vmx_exit_handled(struct kvm_vcpu *vcpu)
|
|||
return nested_cpu_has2(vmcs12, SECONDARY_EXEC_XSAVES);
|
||||
case EXIT_REASON_PCOMMIT:
|
||||
return nested_cpu_has2(vmcs12, SECONDARY_EXEC_PCOMMIT);
|
||||
case EXIT_REASON_PML_FULL:
|
||||
/* We don't expose PML support to L1. */
|
||||
return false;
|
||||
default:
|
||||
return true;
|
||||
}
|
||||
|
|
@ -9759,6 +9760,18 @@ static void prepare_vmcs02(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12)
|
|||
|
||||
}
|
||||
|
||||
if (enable_pml) {
|
||||
/*
|
||||
* Conceptually we want to copy the PML address and index from
|
||||
* vmcs01 here, and then back to vmcs01 on nested vmexit. But,
|
||||
* since we always flush the log on each vmexit, this happens
|
||||
* to be equivalent to simply resetting the fields in vmcs02.
|
||||
*/
|
||||
ASSERT(vmx->pml_pg);
|
||||
vmcs_write64(PML_ADDRESS, page_to_phys(vmx->pml_pg));
|
||||
vmcs_write16(GUEST_PML_INDEX, PML_ENTITY_NUM - 1);
|
||||
}
|
||||
|
||||
if (nested_cpu_has_ept(vmcs12)) {
|
||||
kvm_mmu_unload(vcpu);
|
||||
nested_ept_init_mmu_context(vcpu);
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@
|
|||
#include <asm/intel-mid.h>
|
||||
#include <asm/io_apic.h>
|
||||
|
||||
#define TANGIER_EXT_TIMER0_MSI 15
|
||||
#define TANGIER_EXT_TIMER0_MSI 12
|
||||
|
||||
static struct platform_device wdt_dev = {
|
||||
.name = "intel_mid_wdt",
|
||||
|
|
|
|||
|
|
@ -343,11 +343,11 @@ static int xen_vcpuop_set_next_event(unsigned long delta,
|
|||
WARN_ON(!clockevent_state_oneshot(evt));
|
||||
|
||||
single.timeout_abs_ns = get_abs_timeout(delta);
|
||||
single.flags = VCPU_SSHOTTMR_future;
|
||||
/* Get an event anyway, even if the timeout is already expired */
|
||||
single.flags = 0;
|
||||
|
||||
ret = HYPERVISOR_vcpu_op(VCPUOP_set_singleshot_timer, cpu, &single);
|
||||
|
||||
BUG_ON(ret != 0 && ret != -ETIME);
|
||||
BUG_ON(ret != 0);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -417,7 +417,7 @@ void blk_integrity_register(struct gendisk *disk, struct blk_integrity *template
|
|||
bi->tuple_size = template->tuple_size;
|
||||
bi->tag_size = template->tag_size;
|
||||
|
||||
blk_integrity_revalidate(disk);
|
||||
disk->queue->backing_dev_info.capabilities |= BDI_CAP_STABLE_WRITES;
|
||||
}
|
||||
EXPORT_SYMBOL(blk_integrity_register);
|
||||
|
||||
|
|
@ -430,26 +430,11 @@ EXPORT_SYMBOL(blk_integrity_register);
|
|||
*/
|
||||
void blk_integrity_unregister(struct gendisk *disk)
|
||||
{
|
||||
blk_integrity_revalidate(disk);
|
||||
disk->queue->backing_dev_info.capabilities &= ~BDI_CAP_STABLE_WRITES;
|
||||
memset(&disk->queue->integrity, 0, sizeof(struct blk_integrity));
|
||||
}
|
||||
EXPORT_SYMBOL(blk_integrity_unregister);
|
||||
|
||||
void blk_integrity_revalidate(struct gendisk *disk)
|
||||
{
|
||||
struct blk_integrity *bi = &disk->queue->integrity;
|
||||
|
||||
if (!(disk->flags & GENHD_FL_UP))
|
||||
return;
|
||||
|
||||
if (bi->profile)
|
||||
disk->queue->backing_dev_info.capabilities |=
|
||||
BDI_CAP_STABLE_WRITES;
|
||||
else
|
||||
disk->queue->backing_dev_info.capabilities &=
|
||||
~BDI_CAP_STABLE_WRITES;
|
||||
}
|
||||
|
||||
void blk_integrity_add(struct gendisk *disk)
|
||||
{
|
||||
if (kobject_init_and_add(&disk->integrity_kobj, &integrity_ktype,
|
||||
|
|
|
|||
|
|
@ -435,7 +435,6 @@ int rescan_partitions(struct gendisk *disk, struct block_device *bdev)
|
|||
|
||||
if (disk->fops->revalidate_disk)
|
||||
disk->fops->revalidate_disk(disk);
|
||||
blk_integrity_revalidate(disk);
|
||||
check_disk_size_change(disk, bdev);
|
||||
bdev->bd_invalidated = 0;
|
||||
if (!get_capacity(disk) || !(state = check_partition(disk, bdev)))
|
||||
|
|
|
|||
|
|
@ -488,6 +488,8 @@ static int __test_aead(struct crypto_aead *tfm, int enc,
|
|||
aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
|
||||
tcrypt_complete, &result);
|
||||
|
||||
iv_len = crypto_aead_ivsize(tfm);
|
||||
|
||||
for (i = 0, j = 0; i < tcount; i++) {
|
||||
if (template[i].np)
|
||||
continue;
|
||||
|
|
@ -508,7 +510,6 @@ static int __test_aead(struct crypto_aead *tfm, int enc,
|
|||
|
||||
memcpy(input, template[i].input, template[i].ilen);
|
||||
memcpy(assoc, template[i].assoc, template[i].alen);
|
||||
iv_len = crypto_aead_ivsize(tfm);
|
||||
if (template[i].iv)
|
||||
memcpy(iv, template[i].iv, iv_len);
|
||||
else
|
||||
|
|
@ -617,7 +618,7 @@ static int __test_aead(struct crypto_aead *tfm, int enc,
|
|||
j++;
|
||||
|
||||
if (template[i].iv)
|
||||
memcpy(iv, template[i].iv, MAX_IVLEN);
|
||||
memcpy(iv, template[i].iv, iv_len);
|
||||
else
|
||||
memset(iv, 0, MAX_IVLEN);
|
||||
|
||||
|
|
|
|||
|
|
@ -479,8 +479,14 @@ void drbd_bm_cleanup(struct drbd_device *device)
|
|||
* this masks out the remaining bits.
|
||||
* Returns the number of bits cleared.
|
||||
*/
|
||||
#ifndef BITS_PER_PAGE
|
||||
#define BITS_PER_PAGE (1UL << (PAGE_SHIFT + 3))
|
||||
#define BITS_PER_PAGE_MASK (BITS_PER_PAGE - 1)
|
||||
#else
|
||||
# if BITS_PER_PAGE != (1UL << (PAGE_SHIFT + 3))
|
||||
# error "ambiguous BITS_PER_PAGE"
|
||||
# endif
|
||||
#endif
|
||||
#define BITS_PER_LONG_MASK (BITS_PER_LONG - 1)
|
||||
static int bm_clear_surplus(struct drbd_bitmap *b)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -78,7 +78,9 @@ obj-$(CONFIG_ARCH_TEGRA) += tegra/
|
|||
obj-$(CONFIG_ARCH_OMAP2PLUS) += ti/
|
||||
obj-$(CONFIG_ARCH_U8500) += ux500/
|
||||
obj-$(CONFIG_COMMON_CLK_VERSATILE) += versatile/
|
||||
ifeq ($(CONFIG_COMMON_CLK), y)
|
||||
obj-$(CONFIG_X86) += x86/
|
||||
endif
|
||||
obj-$(CONFIG_ARCH_ZX) += zte/
|
||||
obj-$(CONFIG_ARCH_ZYNQ) += zynq/
|
||||
obj-$(CONFIG_H8300) += h8300/
|
||||
|
|
|
|||
|
|
@ -98,6 +98,8 @@ static void __init sunxi_simple_gates_init(struct device_node *node)
|
|||
sunxi_simple_gates_setup(node, NULL, 0);
|
||||
}
|
||||
|
||||
CLK_OF_DECLARE(sun4i_a10_gates, "allwinner,sun4i-a10-gates-clk",
|
||||
sunxi_simple_gates_init);
|
||||
CLK_OF_DECLARE(sun4i_a10_apb0, "allwinner,sun4i-a10-apb0-gates-clk",
|
||||
sunxi_simple_gates_init);
|
||||
CLK_OF_DECLARE(sun4i_a10_apb1, "allwinner,sun4i-a10-apb1-gates-clk",
|
||||
|
|
|
|||
|
|
@ -2258,7 +2258,7 @@ static void kv_apply_state_adjust_rules(struct amdgpu_device *adev,
|
|||
if (pi->caps_stable_p_state) {
|
||||
stable_p_state_sclk = (max_limits->sclk * 75) / 100;
|
||||
|
||||
for (i = table->count - 1; i >= 0; i++) {
|
||||
for (i = table->count - 1; i >= 0; i--) {
|
||||
if (stable_p_state_sclk >= table->entries[i].clk) {
|
||||
stable_p_state_sclk = table->entries[i].clk;
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -66,8 +66,11 @@ static int ttm_bo_vm_fault_idle(struct ttm_buffer_object *bo,
|
|||
if (vmf->flags & FAULT_FLAG_RETRY_NOWAIT)
|
||||
goto out_unlock;
|
||||
|
||||
ttm_bo_reference(bo);
|
||||
up_read(&vma->vm_mm->mmap_sem);
|
||||
(void) ttm_bo_wait(bo, false, true, false);
|
||||
ttm_bo_unreserve(bo);
|
||||
ttm_bo_unref(&bo);
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
|
|
@ -114,8 +117,10 @@ static int ttm_bo_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
|
|||
|
||||
if (vmf->flags & FAULT_FLAG_ALLOW_RETRY) {
|
||||
if (!(vmf->flags & FAULT_FLAG_RETRY_NOWAIT)) {
|
||||
ttm_bo_reference(bo);
|
||||
up_read(&vma->vm_mm->mmap_sem);
|
||||
(void) ttm_bo_wait_unreserved(bo);
|
||||
ttm_bo_unref(&bo);
|
||||
}
|
||||
|
||||
return VM_FAULT_RETRY;
|
||||
|
|
@ -160,6 +165,13 @@ static int ttm_bo_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
|
|||
ret = ttm_bo_vm_fault_idle(bo, vma, vmf);
|
||||
if (unlikely(ret != 0)) {
|
||||
retval = ret;
|
||||
|
||||
if (retval == VM_FAULT_RETRY &&
|
||||
!(vmf->flags & FAULT_FLAG_RETRY_NOWAIT)) {
|
||||
/* The BO has already been unreserved. */
|
||||
return retval;
|
||||
}
|
||||
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -41,13 +41,13 @@
|
|||
|
||||
#include "qib.h"
|
||||
|
||||
#define BITS_PER_PAGE (PAGE_SIZE*BITS_PER_BYTE)
|
||||
#define BITS_PER_PAGE_MASK (BITS_PER_PAGE-1)
|
||||
#define RVT_BITS_PER_PAGE (PAGE_SIZE*BITS_PER_BYTE)
|
||||
#define RVT_BITS_PER_PAGE_MASK (RVT_BITS_PER_PAGE-1)
|
||||
|
||||
static inline unsigned mk_qpn(struct qib_qpn_table *qpt,
|
||||
struct qpn_map *map, unsigned off)
|
||||
{
|
||||
return (map - qpt->map) * BITS_PER_PAGE + off;
|
||||
return (map - qpt->map) * RVT_BITS_PER_PAGE + off;
|
||||
}
|
||||
|
||||
static inline unsigned find_next_offset(struct qib_qpn_table *qpt,
|
||||
|
|
@ -59,7 +59,7 @@ static inline unsigned find_next_offset(struct qib_qpn_table *qpt,
|
|||
if (((off & qpt->mask) >> 1) >= n)
|
||||
off = (off | qpt->mask) + 2;
|
||||
} else
|
||||
off = find_next_zero_bit(map->page, BITS_PER_PAGE, off);
|
||||
off = find_next_zero_bit(map->page, RVT_BITS_PER_PAGE, off);
|
||||
return off;
|
||||
}
|
||||
|
||||
|
|
@ -147,8 +147,8 @@ static int alloc_qpn(struct qib_devdata *dd, struct qib_qpn_table *qpt,
|
|||
qpn = 2;
|
||||
if (qpt->mask && ((qpn & qpt->mask) >> 1) >= dd->n_krcv_queues)
|
||||
qpn = (qpn | qpt->mask) + 2;
|
||||
offset = qpn & BITS_PER_PAGE_MASK;
|
||||
map = &qpt->map[qpn / BITS_PER_PAGE];
|
||||
offset = qpn & RVT_BITS_PER_PAGE_MASK;
|
||||
map = &qpt->map[qpn / RVT_BITS_PER_PAGE];
|
||||
max_scan = qpt->nmaps - !offset;
|
||||
for (i = 0;;) {
|
||||
if (unlikely(!map->page)) {
|
||||
|
|
@ -173,7 +173,7 @@ static int alloc_qpn(struct qib_devdata *dd, struct qib_qpn_table *qpt,
|
|||
* We just need to be sure we don't loop
|
||||
* forever.
|
||||
*/
|
||||
} while (offset < BITS_PER_PAGE && qpn < QPN_MAX);
|
||||
} while (offset < RVT_BITS_PER_PAGE && qpn < QPN_MAX);
|
||||
/*
|
||||
* In order to keep the number of pages allocated to a
|
||||
* minimum, we scan the all existing pages before increasing
|
||||
|
|
@ -204,9 +204,9 @@ static void free_qpn(struct qib_qpn_table *qpt, u32 qpn)
|
|||
{
|
||||
struct qpn_map *map;
|
||||
|
||||
map = qpt->map + qpn / BITS_PER_PAGE;
|
||||
map = qpt->map + qpn / RVT_BITS_PER_PAGE;
|
||||
if (map->page)
|
||||
clear_bit(qpn & BITS_PER_PAGE_MASK, map->page);
|
||||
clear_bit(qpn & RVT_BITS_PER_PAGE_MASK, map->page);
|
||||
}
|
||||
|
||||
static inline unsigned qpn_hash(struct qib_ibdev *dev, u32 qpn)
|
||||
|
|
|
|||
|
|
@ -685,6 +685,13 @@ static const struct dmi_system_id __initconst i8042_dmi_reset_table[] = {
|
|||
DMI_MATCH(DMI_PRODUCT_NAME, "20046"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* Clevo P650RS, 650RP6, Sager NP8152-S, and others */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Notebook"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "P65xRP"),
|
||||
},
|
||||
},
|
||||
{ }
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -296,15 +296,15 @@ static int ktd2692_parse_dt(struct ktd2692_context *led, struct device *dev,
|
|||
return -ENXIO;
|
||||
|
||||
led->ctrl_gpio = devm_gpiod_get(dev, "ctrl", GPIOD_ASIS);
|
||||
if (IS_ERR(led->ctrl_gpio)) {
|
||||
ret = PTR_ERR(led->ctrl_gpio);
|
||||
ret = PTR_ERR_OR_ZERO(led->ctrl_gpio);
|
||||
if (ret) {
|
||||
dev_err(dev, "cannot get ctrl-gpios %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
led->aux_gpio = devm_gpiod_get(dev, "aux", GPIOD_ASIS);
|
||||
if (IS_ERR(led->aux_gpio)) {
|
||||
ret = PTR_ERR(led->aux_gpio);
|
||||
ret = PTR_ERR_OR_ZERO(led->aux_gpio);
|
||||
if (ret) {
|
||||
dev_err(dev, "cannot get aux-gpios %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1843,7 +1843,7 @@ static int ctl_ioctl(uint command, struct dm_ioctl __user *user)
|
|||
if (r)
|
||||
goto out;
|
||||
|
||||
param->data_size = sizeof(*param);
|
||||
param->data_size = offsetof(struct dm_ioctl, data);
|
||||
r = fn(param, input_param_size);
|
||||
|
||||
if (unlikely(param->flags & DM_BUFFER_FULL_FLAG) &&
|
||||
|
|
|
|||
|
|
@ -570,7 +570,7 @@ static int read_balance(struct r1conf *conf, struct r1bio *r1_bio, int *max_sect
|
|||
if (best_dist_disk < 0) {
|
||||
if (is_badblock(rdev, this_sector, sectors,
|
||||
&first_bad, &bad_sectors)) {
|
||||
if (first_bad < this_sector)
|
||||
if (first_bad <= this_sector)
|
||||
/* Cannot use this */
|
||||
continue;
|
||||
best_good_sectors = first_bad - this_sector;
|
||||
|
|
|
|||
|
|
@ -1407,8 +1407,10 @@ static int xc2028_set_config(struct dvb_frontend *fe, void *priv_cfg)
|
|||
memcpy(&priv->ctrl, p, sizeof(priv->ctrl));
|
||||
if (p->fname) {
|
||||
priv->ctrl.fname = kstrdup(p->fname, GFP_KERNEL);
|
||||
if (priv->ctrl.fname == NULL)
|
||||
return -ENOMEM;
|
||||
if (priv->ctrl.fname == NULL) {
|
||||
rc = -ENOMEM;
|
||||
goto unlock;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -1440,6 +1442,7 @@ static int xc2028_set_config(struct dvb_frontend *fe, void *priv_cfg)
|
|||
} else
|
||||
priv->state = XC2028_WAITING_FIRMWARE;
|
||||
}
|
||||
unlock:
|
||||
mutex_unlock(&priv->lock);
|
||||
|
||||
return rc;
|
||||
|
|
|
|||
|
|
@ -111,6 +111,7 @@ config MTD_MAP_BANK_WIDTH_16
|
|||
|
||||
config MTD_MAP_BANK_WIDTH_32
|
||||
bool "Support 256-bit buswidth" if MTD_CFI_GEOMETRY
|
||||
select MTD_COMPLEX_MAPPINGS if HAS_IOMEM
|
||||
default n
|
||||
help
|
||||
If you wish to support CFI devices on a physical bus which is
|
||||
|
|
|
|||
|
|
@ -2473,7 +2473,8 @@ static int bnxt_alloc_ntp_fltrs(struct bnxt *bp)
|
|||
INIT_HLIST_HEAD(&bp->ntp_fltr_hash_tbl[i]);
|
||||
|
||||
bp->ntp_fltr_count = 0;
|
||||
bp->ntp_fltr_bmap = kzalloc(BITS_TO_LONGS(BNXT_NTP_FLTR_MAX_FLTR),
|
||||
bp->ntp_fltr_bmap = kcalloc(BITS_TO_LONGS(BNXT_NTP_FLTR_MAX_FLTR),
|
||||
sizeof(long),
|
||||
GFP_KERNEL);
|
||||
|
||||
if (!bp->ntp_fltr_bmap)
|
||||
|
|
|
|||
|
|
@ -12031,7 +12031,7 @@ static int tg3_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom,
|
|||
int ret;
|
||||
u32 offset, len, b_offset, odd_len;
|
||||
u8 *buf;
|
||||
__be32 start, end;
|
||||
__be32 start = 0, end;
|
||||
|
||||
if (tg3_flag(tp, NO_NVRAM) ||
|
||||
eeprom->magic != TG3_EEPROM_MAGIC)
|
||||
|
|
|
|||
|
|
@ -2823,7 +2823,7 @@ static int liquidio_xmit(struct sk_buff *skb, struct net_device *netdev)
|
|||
if (!g) {
|
||||
netif_info(lio, tx_err, lio->netdev,
|
||||
"Transmit scatter gather: glist null!\n");
|
||||
goto lio_xmit_failed;
|
||||
goto lio_xmit_dma_failed;
|
||||
}
|
||||
|
||||
cmdsetup.s.gather = 1;
|
||||
|
|
@ -2894,7 +2894,7 @@ static int liquidio_xmit(struct sk_buff *skb, struct net_device *netdev)
|
|||
else
|
||||
status = octnet_send_nic_data_pkt(oct, &ndata, xmit_more);
|
||||
if (status == IQ_SEND_FAILED)
|
||||
goto lio_xmit_failed;
|
||||
goto lio_xmit_dma_failed;
|
||||
|
||||
netif_info(lio, tx_queued, lio->netdev, "Transmit queued successfully\n");
|
||||
|
||||
|
|
@ -2908,12 +2908,13 @@ static int liquidio_xmit(struct sk_buff *skb, struct net_device *netdev)
|
|||
|
||||
return NETDEV_TX_OK;
|
||||
|
||||
lio_xmit_dma_failed:
|
||||
dma_unmap_single(&oct->pci_dev->dev, ndata.cmd.dptr,
|
||||
ndata.datasize, DMA_TO_DEVICE);
|
||||
lio_xmit_failed:
|
||||
stats->tx_dropped++;
|
||||
netif_info(lio, tx_err, lio->netdev, "IQ%d Transmit dropped:%llu\n",
|
||||
iq_no, stats->tx_dropped);
|
||||
dma_unmap_single(&oct->pci_dev->dev, ndata.cmd.dptr,
|
||||
ndata.datasize, DMA_TO_DEVICE);
|
||||
recv_buffer_free(skb);
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1110,6 +1110,7 @@ static int macvlan_port_create(struct net_device *dev)
|
|||
static void macvlan_port_destroy(struct net_device *dev)
|
||||
{
|
||||
struct macvlan_port *port = macvlan_port_get_rtnl(dev);
|
||||
struct sk_buff *skb;
|
||||
|
||||
dev->priv_flags &= ~IFF_MACVLAN_PORT;
|
||||
netdev_rx_handler_unregister(dev);
|
||||
|
|
@ -1118,7 +1119,15 @@ static void macvlan_port_destroy(struct net_device *dev)
|
|||
* but we need to cancel it and purge left skbs if any.
|
||||
*/
|
||||
cancel_work_sync(&port->bc_work);
|
||||
__skb_queue_purge(&port->bc_queue);
|
||||
|
||||
while ((skb = __skb_dequeue(&port->bc_queue))) {
|
||||
const struct macvlan_dev *src = MACVLAN_SKB_CB(skb)->src;
|
||||
|
||||
if (src)
|
||||
dev_put(src->dev);
|
||||
|
||||
kfree_skb(skb);
|
||||
}
|
||||
|
||||
kfree_rcu(port, rcu);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1436,8 +1436,6 @@ static bool dp83640_rxtstamp(struct phy_device *phydev,
|
|||
skb_info->tmo = jiffies + SKB_TIMESTAMP_TIMEOUT;
|
||||
skb_queue_tail(&dp83640->rx_queue, skb);
|
||||
schedule_delayed_work(&dp83640->ts_work, SKB_TIMESTAMP_TIMEOUT);
|
||||
} else {
|
||||
netif_rx_ni(skb);
|
||||
}
|
||||
|
||||
return true;
|
||||
|
|
|
|||
|
|
@ -538,7 +538,7 @@ void phy_stop_machine(struct phy_device *phydev)
|
|||
cancel_delayed_work_sync(&phydev->state_queue);
|
||||
|
||||
mutex_lock(&phydev->lock);
|
||||
if (phydev->state > PHY_UP)
|
||||
if (phydev->state > PHY_UP && phydev->state != PHY_HALTED)
|
||||
phydev->state = PHY_UP;
|
||||
mutex_unlock(&phydev->lock);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -211,7 +211,7 @@ static netdev_tx_t brcmf_netdev_start_xmit(struct sk_buff *skb,
|
|||
int ret;
|
||||
struct brcmf_if *ifp = netdev_priv(ndev);
|
||||
struct brcmf_pub *drvr = ifp->drvr;
|
||||
struct ethhdr *eh = (struct ethhdr *)(skb->data);
|
||||
struct ethhdr *eh;
|
||||
|
||||
brcmf_dbg(DATA, "Enter, idx=%d\n", ifp->bssidx);
|
||||
|
||||
|
|
@ -232,22 +232,13 @@ static netdev_tx_t brcmf_netdev_start_xmit(struct sk_buff *skb,
|
|||
goto done;
|
||||
}
|
||||
|
||||
/* Make sure there's enough room for any header */
|
||||
if (skb_headroom(skb) < drvr->hdrlen) {
|
||||
struct sk_buff *skb2;
|
||||
|
||||
brcmf_dbg(INFO, "%s: insufficient headroom\n",
|
||||
/* Make sure there's enough writable headroom*/
|
||||
ret = skb_cow_head(skb, drvr->hdrlen);
|
||||
if (ret < 0) {
|
||||
brcmf_err("%s: skb_cow_head failed\n",
|
||||
brcmf_ifname(drvr, ifp->bssidx));
|
||||
drvr->bus_if->tx_realloc++;
|
||||
skb2 = skb_realloc_headroom(skb, drvr->hdrlen);
|
||||
dev_kfree_skb(skb);
|
||||
skb = skb2;
|
||||
if (skb == NULL) {
|
||||
brcmf_err("%s: skb_realloc_headroom failed\n",
|
||||
brcmf_ifname(drvr, ifp->bssidx));
|
||||
ret = -ENOMEM;
|
||||
goto done;
|
||||
}
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* validate length for ether packet */
|
||||
|
|
@ -257,6 +248,8 @@ static netdev_tx_t brcmf_netdev_start_xmit(struct sk_buff *skb,
|
|||
goto done;
|
||||
}
|
||||
|
||||
eh = (struct ethhdr *)(skb->data);
|
||||
|
||||
if (eh->h_proto == htons(ETH_P_PAE))
|
||||
atomic_inc(&ifp->pend_8021x_cnt);
|
||||
|
||||
|
|
|
|||
|
|
@ -101,13 +101,6 @@ mwifiex_11n_form_amsdu_txpd(struct mwifiex_private *priv,
|
|||
{
|
||||
struct txpd *local_tx_pd;
|
||||
struct mwifiex_txinfo *tx_info = MWIFIEX_SKB_TXCB(skb);
|
||||
unsigned int pad;
|
||||
int headroom = (priv->adapter->iface_type ==
|
||||
MWIFIEX_USB) ? 0 : INTF_HEADER_LEN;
|
||||
|
||||
pad = ((void *)skb->data - sizeof(*local_tx_pd) -
|
||||
headroom - NULL) & (MWIFIEX_DMA_ALIGN_SZ - 1);
|
||||
skb_push(skb, pad);
|
||||
|
||||
skb_push(skb, sizeof(*local_tx_pd));
|
||||
|
||||
|
|
@ -121,12 +114,10 @@ mwifiex_11n_form_amsdu_txpd(struct mwifiex_private *priv,
|
|||
local_tx_pd->bss_num = priv->bss_num;
|
||||
local_tx_pd->bss_type = priv->bss_type;
|
||||
/* Always zero as the data is followed by struct txpd */
|
||||
local_tx_pd->tx_pkt_offset = cpu_to_le16(sizeof(struct txpd) +
|
||||
pad);
|
||||
local_tx_pd->tx_pkt_offset = cpu_to_le16(sizeof(struct txpd));
|
||||
local_tx_pd->tx_pkt_type = cpu_to_le16(PKT_TYPE_AMSDU);
|
||||
local_tx_pd->tx_pkt_length = cpu_to_le16(skb->len -
|
||||
sizeof(*local_tx_pd) -
|
||||
pad);
|
||||
sizeof(*local_tx_pd));
|
||||
|
||||
if (tx_info->flags & MWIFIEX_BUF_FLAG_TDLS_PKT)
|
||||
local_tx_pd->flags |= MWIFIEX_TXPD_FLAGS_TDLS_PACKET;
|
||||
|
|
@ -190,7 +181,11 @@ mwifiex_11n_aggregate_pkt(struct mwifiex_private *priv,
|
|||
ra_list_flags);
|
||||
return -1;
|
||||
}
|
||||
skb_reserve(skb_aggr, MWIFIEX_MIN_DATA_HEADER_LEN);
|
||||
|
||||
/* skb_aggr->data already 64 byte align, just reserve bus interface
|
||||
* header and txpd.
|
||||
*/
|
||||
skb_reserve(skb_aggr, headroom + sizeof(struct txpd));
|
||||
tx_info_aggr = MWIFIEX_SKB_TXCB(skb_aggr);
|
||||
|
||||
memset(tx_info_aggr, 0, sizeof(*tx_info_aggr));
|
||||
|
|
|
|||
|
|
@ -115,7 +115,8 @@ mwifiex_info_read(struct file *file, char __user *ubuf,
|
|||
if (GET_BSS_ROLE(priv) == MWIFIEX_BSS_ROLE_STA) {
|
||||
p += sprintf(p, "multicast_count=\"%d\"\n",
|
||||
netdev_mc_count(netdev));
|
||||
p += sprintf(p, "essid=\"%s\"\n", info.ssid.ssid);
|
||||
p += sprintf(p, "essid=\"%.*s\"\n", info.ssid.ssid_len,
|
||||
info.ssid.ssid);
|
||||
p += sprintf(p, "bssid=\"%pM\"\n", info.bssid);
|
||||
p += sprintf(p, "channel=\"%d\"\n", (int) info.bss_chan);
|
||||
p += sprintf(p, "country_code = \"%s\"\n", info.country_code);
|
||||
|
|
|
|||
|
|
@ -1098,8 +1098,6 @@ int mwifiex_set_encode(struct mwifiex_private *priv, struct key_params *kp,
|
|||
encrypt_key.is_rx_seq_valid = true;
|
||||
}
|
||||
} else {
|
||||
if (GET_BSS_ROLE(priv) == MWIFIEX_BSS_ROLE_UAP)
|
||||
return 0;
|
||||
encrypt_key.key_disable = true;
|
||||
if (mac_addr)
|
||||
memcpy(encrypt_key.mac_addr, mac_addr, ETH_ALEN);
|
||||
|
|
|
|||
|
|
@ -368,6 +368,7 @@ config PHY_QCOM_UFS
|
|||
config PHY_TUSB1210
|
||||
tristate "TI TUSB1210 ULPI PHY module"
|
||||
depends on USB_ULPI_BUS
|
||||
depends on EXTCON || !EXTCON # if EXTCON=m, this cannot be built-in
|
||||
select GENERIC_PHY
|
||||
help
|
||||
Support for TI TUSB1210 USB ULPI PHY.
|
||||
|
|
|
|||
|
|
@ -144,10 +144,7 @@
|
|||
* so the first read after a fault returns the latched value and subsequent
|
||||
* reads return the current value. In order to return the fault status
|
||||
* to the user, have the interrupt handler save the reg's value and retrieve
|
||||
* it in the appropriate health/status routine. Each routine has its own
|
||||
* flag indicating whether it should use the value stored by the last run
|
||||
* of the interrupt handler or do an actual reg read. That way each routine
|
||||
* can report back whatever fault may have occured.
|
||||
* it in the appropriate health/status routine.
|
||||
*/
|
||||
struct bq24190_dev_info {
|
||||
struct i2c_client *client;
|
||||
|
|
@ -159,10 +156,6 @@ struct bq24190_dev_info {
|
|||
unsigned int gpio_int;
|
||||
unsigned int irq;
|
||||
struct mutex f_reg_lock;
|
||||
bool first_time;
|
||||
bool charger_health_valid;
|
||||
bool battery_health_valid;
|
||||
bool battery_status_valid;
|
||||
u8 f_reg;
|
||||
u8 ss_reg;
|
||||
u8 watchdog;
|
||||
|
|
@ -636,21 +629,11 @@ static int bq24190_charger_get_health(struct bq24190_dev_info *bdi,
|
|||
union power_supply_propval *val)
|
||||
{
|
||||
u8 v;
|
||||
int health, ret;
|
||||
int health;
|
||||
|
||||
mutex_lock(&bdi->f_reg_lock);
|
||||
|
||||
if (bdi->charger_health_valid) {
|
||||
v = bdi->f_reg;
|
||||
bdi->charger_health_valid = false;
|
||||
mutex_unlock(&bdi->f_reg_lock);
|
||||
} else {
|
||||
mutex_unlock(&bdi->f_reg_lock);
|
||||
|
||||
ret = bq24190_read(bdi, BQ24190_REG_F, &v);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
v = bdi->f_reg;
|
||||
mutex_unlock(&bdi->f_reg_lock);
|
||||
|
||||
if (v & BQ24190_REG_F_BOOST_FAULT_MASK) {
|
||||
/*
|
||||
|
|
@ -937,18 +920,8 @@ static int bq24190_battery_get_status(struct bq24190_dev_info *bdi,
|
|||
int status, ret;
|
||||
|
||||
mutex_lock(&bdi->f_reg_lock);
|
||||
|
||||
if (bdi->battery_status_valid) {
|
||||
chrg_fault = bdi->f_reg;
|
||||
bdi->battery_status_valid = false;
|
||||
mutex_unlock(&bdi->f_reg_lock);
|
||||
} else {
|
||||
mutex_unlock(&bdi->f_reg_lock);
|
||||
|
||||
ret = bq24190_read(bdi, BQ24190_REG_F, &chrg_fault);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
chrg_fault = bdi->f_reg;
|
||||
mutex_unlock(&bdi->f_reg_lock);
|
||||
|
||||
chrg_fault &= BQ24190_REG_F_CHRG_FAULT_MASK;
|
||||
chrg_fault >>= BQ24190_REG_F_CHRG_FAULT_SHIFT;
|
||||
|
|
@ -996,21 +969,11 @@ static int bq24190_battery_get_health(struct bq24190_dev_info *bdi,
|
|||
union power_supply_propval *val)
|
||||
{
|
||||
u8 v;
|
||||
int health, ret;
|
||||
int health;
|
||||
|
||||
mutex_lock(&bdi->f_reg_lock);
|
||||
|
||||
if (bdi->battery_health_valid) {
|
||||
v = bdi->f_reg;
|
||||
bdi->battery_health_valid = false;
|
||||
mutex_unlock(&bdi->f_reg_lock);
|
||||
} else {
|
||||
mutex_unlock(&bdi->f_reg_lock);
|
||||
|
||||
ret = bq24190_read(bdi, BQ24190_REG_F, &v);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
v = bdi->f_reg;
|
||||
mutex_unlock(&bdi->f_reg_lock);
|
||||
|
||||
if (v & BQ24190_REG_F_BAT_FAULT_MASK) {
|
||||
health = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
|
||||
|
|
@ -1197,9 +1160,12 @@ static const struct power_supply_desc bq24190_battery_desc = {
|
|||
static irqreturn_t bq24190_irq_handler_thread(int irq, void *data)
|
||||
{
|
||||
struct bq24190_dev_info *bdi = data;
|
||||
bool alert_userspace = false;
|
||||
const u8 battery_mask_ss = BQ24190_REG_SS_CHRG_STAT_MASK;
|
||||
const u8 battery_mask_f = BQ24190_REG_F_BAT_FAULT_MASK
|
||||
| BQ24190_REG_F_NTC_FAULT_MASK;
|
||||
bool alert_charger = false, alert_battery = false;
|
||||
u8 ss_reg = 0, f_reg = 0;
|
||||
int ret;
|
||||
int i, ret;
|
||||
|
||||
pm_runtime_get_sync(bdi->dev);
|
||||
|
||||
|
|
@ -1209,6 +1175,32 @@ static irqreturn_t bq24190_irq_handler_thread(int irq, void *data)
|
|||
goto out;
|
||||
}
|
||||
|
||||
i = 0;
|
||||
do {
|
||||
ret = bq24190_read(bdi, BQ24190_REG_F, &f_reg);
|
||||
if (ret < 0) {
|
||||
dev_err(bdi->dev, "Can't read F reg: %d\n", ret);
|
||||
goto out;
|
||||
}
|
||||
} while (f_reg && ++i < 2);
|
||||
|
||||
if (f_reg != bdi->f_reg) {
|
||||
dev_info(bdi->dev,
|
||||
"Fault: boost %d, charge %d, battery %d, ntc %d\n",
|
||||
!!(f_reg & BQ24190_REG_F_BOOST_FAULT_MASK),
|
||||
!!(f_reg & BQ24190_REG_F_CHRG_FAULT_MASK),
|
||||
!!(f_reg & BQ24190_REG_F_BAT_FAULT_MASK),
|
||||
!!(f_reg & BQ24190_REG_F_NTC_FAULT_MASK));
|
||||
|
||||
mutex_lock(&bdi->f_reg_lock);
|
||||
if ((bdi->f_reg & battery_mask_f) != (f_reg & battery_mask_f))
|
||||
alert_battery = true;
|
||||
if ((bdi->f_reg & ~battery_mask_f) != (f_reg & ~battery_mask_f))
|
||||
alert_charger = true;
|
||||
bdi->f_reg = f_reg;
|
||||
mutex_unlock(&bdi->f_reg_lock);
|
||||
}
|
||||
|
||||
if (ss_reg != bdi->ss_reg) {
|
||||
/*
|
||||
* The device is in host mode so when PG_STAT goes from 1->0
|
||||
|
|
@ -1225,47 +1217,17 @@ static irqreturn_t bq24190_irq_handler_thread(int irq, void *data)
|
|||
ret);
|
||||
}
|
||||
|
||||
if ((bdi->ss_reg & battery_mask_ss) != (ss_reg & battery_mask_ss))
|
||||
alert_battery = true;
|
||||
if ((bdi->ss_reg & ~battery_mask_ss) != (ss_reg & ~battery_mask_ss))
|
||||
alert_charger = true;
|
||||
bdi->ss_reg = ss_reg;
|
||||
alert_userspace = true;
|
||||
}
|
||||
|
||||
mutex_lock(&bdi->f_reg_lock);
|
||||
|
||||
ret = bq24190_read(bdi, BQ24190_REG_F, &f_reg);
|
||||
if (ret < 0) {
|
||||
mutex_unlock(&bdi->f_reg_lock);
|
||||
dev_err(bdi->dev, "Can't read F reg: %d\n", ret);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (f_reg != bdi->f_reg) {
|
||||
bdi->f_reg = f_reg;
|
||||
bdi->charger_health_valid = true;
|
||||
bdi->battery_health_valid = true;
|
||||
bdi->battery_status_valid = true;
|
||||
|
||||
alert_userspace = true;
|
||||
}
|
||||
|
||||
mutex_unlock(&bdi->f_reg_lock);
|
||||
|
||||
/*
|
||||
* Sometimes bq24190 gives a steady trickle of interrupts even
|
||||
* though the watchdog timer is turned off and neither the STATUS
|
||||
* nor FAULT registers have changed. Weed out these sprurious
|
||||
* interrupts so userspace isn't alerted for no reason.
|
||||
* In addition, the chip always generates an interrupt after
|
||||
* register reset so we should ignore that one (the very first
|
||||
* interrupt received).
|
||||
*/
|
||||
if (alert_userspace) {
|
||||
if (!bdi->first_time) {
|
||||
power_supply_changed(bdi->charger);
|
||||
power_supply_changed(bdi->battery);
|
||||
} else {
|
||||
bdi->first_time = false;
|
||||
}
|
||||
}
|
||||
if (alert_charger)
|
||||
power_supply_changed(bdi->charger);
|
||||
if (alert_battery)
|
||||
power_supply_changed(bdi->battery);
|
||||
|
||||
out:
|
||||
pm_runtime_put_sync(bdi->dev);
|
||||
|
|
@ -1300,6 +1262,10 @@ static int bq24190_hw_init(struct bq24190_dev_info *bdi)
|
|||
goto out;
|
||||
|
||||
ret = bq24190_set_mode_host(bdi);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
ret = bq24190_read(bdi, BQ24190_REG_SS, &bdi->ss_reg);
|
||||
out:
|
||||
pm_runtime_put_sync(bdi->dev);
|
||||
return ret;
|
||||
|
|
@ -1375,10 +1341,8 @@ static int bq24190_probe(struct i2c_client *client,
|
|||
bdi->model = id->driver_data;
|
||||
strncpy(bdi->model_name, id->name, I2C_NAME_SIZE);
|
||||
mutex_init(&bdi->f_reg_lock);
|
||||
bdi->first_time = true;
|
||||
bdi->charger_health_valid = false;
|
||||
bdi->battery_health_valid = false;
|
||||
bdi->battery_status_valid = false;
|
||||
bdi->f_reg = 0;
|
||||
bdi->ss_reg = BQ24190_REG_SS_VBUS_STAT_MASK; /* impossible state */
|
||||
|
||||
i2c_set_clientdata(client, bdi);
|
||||
|
||||
|
|
@ -1392,22 +1356,13 @@ static int bq24190_probe(struct i2c_client *client,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = devm_request_threaded_irq(dev, bdi->irq, NULL,
|
||||
bq24190_irq_handler_thread,
|
||||
IRQF_TRIGGER_RISING | IRQF_ONESHOT,
|
||||
"bq24190-charger", bdi);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "Can't set up irq handler\n");
|
||||
goto out1;
|
||||
}
|
||||
|
||||
pm_runtime_enable(dev);
|
||||
pm_runtime_resume(dev);
|
||||
|
||||
ret = bq24190_hw_init(bdi);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "Hardware init failed\n");
|
||||
goto out2;
|
||||
goto out1;
|
||||
}
|
||||
|
||||
charger_cfg.drv_data = bdi;
|
||||
|
|
@ -1418,7 +1373,7 @@ static int bq24190_probe(struct i2c_client *client,
|
|||
if (IS_ERR(bdi->charger)) {
|
||||
dev_err(dev, "Can't register charger\n");
|
||||
ret = PTR_ERR(bdi->charger);
|
||||
goto out2;
|
||||
goto out1;
|
||||
}
|
||||
|
||||
battery_cfg.drv_data = bdi;
|
||||
|
|
@ -1427,24 +1382,34 @@ static int bq24190_probe(struct i2c_client *client,
|
|||
if (IS_ERR(bdi->battery)) {
|
||||
dev_err(dev, "Can't register battery\n");
|
||||
ret = PTR_ERR(bdi->battery);
|
||||
goto out3;
|
||||
goto out2;
|
||||
}
|
||||
|
||||
ret = bq24190_sysfs_create_group(bdi);
|
||||
if (ret) {
|
||||
dev_err(dev, "Can't create sysfs entries\n");
|
||||
goto out3;
|
||||
}
|
||||
|
||||
ret = devm_request_threaded_irq(dev, bdi->irq, NULL,
|
||||
bq24190_irq_handler_thread,
|
||||
IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
|
||||
"bq24190-charger", bdi);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "Can't set up irq handler\n");
|
||||
goto out4;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
out4:
|
||||
power_supply_unregister(bdi->battery);
|
||||
bq24190_sysfs_remove_group(bdi);
|
||||
out3:
|
||||
power_supply_unregister(bdi->charger);
|
||||
power_supply_unregister(bdi->battery);
|
||||
out2:
|
||||
pm_runtime_disable(dev);
|
||||
power_supply_unregister(bdi->charger);
|
||||
out1:
|
||||
pm_runtime_disable(dev);
|
||||
if (bdi->gpio_int)
|
||||
gpio_free(bdi->gpio_int);
|
||||
|
||||
|
|
@ -1488,12 +1453,13 @@ static int bq24190_pm_resume(struct device *dev)
|
|||
struct i2c_client *client = to_i2c_client(dev);
|
||||
struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
|
||||
|
||||
bdi->charger_health_valid = false;
|
||||
bdi->battery_health_valid = false;
|
||||
bdi->battery_status_valid = false;
|
||||
bdi->f_reg = 0;
|
||||
bdi->ss_reg = BQ24190_REG_SS_VBUS_STAT_MASK; /* impossible state */
|
||||
|
||||
pm_runtime_get_sync(bdi->dev);
|
||||
bq24190_register_reset(bdi);
|
||||
bq24190_set_mode_host(bdi);
|
||||
bq24190_read(bdi, BQ24190_REG_SS, &bdi->ss_reg);
|
||||
pm_runtime_put_sync(bdi->dev);
|
||||
|
||||
/* Things may have changed while suspended so alert upper layer */
|
||||
|
|
|
|||
|
|
@ -1519,6 +1519,7 @@ static int regulator_resolve_supply(struct regulator_dev *rdev)
|
|||
ret = regulator_enable(rdev->supply);
|
||||
if (ret < 0) {
|
||||
_regulator_put(rdev->supply);
|
||||
rdev->supply = NULL;
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1637,7 +1637,7 @@ config ATARI_SCSI_RESET_BOOT
|
|||
|
||||
config MAC_SCSI
|
||||
tristate "Macintosh NCR5380 SCSI"
|
||||
depends on MAC && SCSI=y
|
||||
depends on MAC && SCSI
|
||||
select SCSI_SPI_ATTRS
|
||||
help
|
||||
This is the NCR 5380 SCSI controller included on most of the 68030
|
||||
|
|
|
|||
|
|
@ -996,6 +996,8 @@ static int wait_port_online(__be64 __iomem *fc_regs, u32 delay_us, u32 nretry)
|
|||
do {
|
||||
msleep(delay_us / 1000);
|
||||
status = readq_be(&fc_regs[FC_MTIP_STATUS / 8]);
|
||||
if (status == U64_MAX)
|
||||
nretry /= 2;
|
||||
} while ((status & FC_MTIP_STATUS_MASK) != FC_MTIP_STATUS_ONLINE &&
|
||||
nretry--);
|
||||
|
||||
|
|
@ -1027,6 +1029,8 @@ static int wait_port_offline(__be64 __iomem *fc_regs, u32 delay_us, u32 nretry)
|
|||
do {
|
||||
msleep(delay_us / 1000);
|
||||
status = readq_be(&fc_regs[FC_MTIP_STATUS / 8]);
|
||||
if (status == U64_MAX)
|
||||
nretry /= 2;
|
||||
} while ((status & FC_MTIP_STATUS_MASK) != FC_MTIP_STATUS_OFFLINE &&
|
||||
nretry--);
|
||||
|
||||
|
|
@ -1137,7 +1141,7 @@ static const struct asyc_intr_info ainfo[] = {
|
|||
{SISL_ASTATUS_FC0_LOGI_F, "login failed", 0, CLR_FC_ERROR},
|
||||
{SISL_ASTATUS_FC0_LOGI_S, "login succeeded", 0, SCAN_HOST},
|
||||
{SISL_ASTATUS_FC0_LINK_DN, "link down", 0, 0},
|
||||
{SISL_ASTATUS_FC0_LINK_UP, "link up", 0, SCAN_HOST},
|
||||
{SISL_ASTATUS_FC0_LINK_UP, "link up", 0, 0},
|
||||
{SISL_ASTATUS_FC1_OTHER, "other error", 1, CLR_FC_ERROR | LINK_RESET},
|
||||
{SISL_ASTATUS_FC1_LOGO, "target initiated LOGO", 1, 0},
|
||||
{SISL_ASTATUS_FC1_CRC_T, "CRC threshold exceeded", 1, LINK_RESET},
|
||||
|
|
@ -1145,7 +1149,7 @@ static const struct asyc_intr_info ainfo[] = {
|
|||
{SISL_ASTATUS_FC1_LOGI_F, "login failed", 1, CLR_FC_ERROR},
|
||||
{SISL_ASTATUS_FC1_LOGI_S, "login succeeded", 1, SCAN_HOST},
|
||||
{SISL_ASTATUS_FC1_LINK_DN, "link down", 1, 0},
|
||||
{SISL_ASTATUS_FC1_LINK_UP, "link up", 1, SCAN_HOST},
|
||||
{SISL_ASTATUS_FC1_LINK_UP, "link up", 1, 0},
|
||||
{0x0, "", 0, 0} /* terminator */
|
||||
};
|
||||
|
||||
|
|
@ -1962,6 +1966,11 @@ static int cxlflash_eh_device_reset_handler(struct scsi_cmnd *scp)
|
|||
* cxlflash_eh_host_reset_handler() - reset the host adapter
|
||||
* @scp: SCSI command from stack identifying host.
|
||||
*
|
||||
* Following a reset, the state is evaluated again in case an EEH occurred
|
||||
* during the reset. In such a scenario, the host reset will either yield
|
||||
* until the EEH recovery is complete or return success or failure based
|
||||
* upon the current device state.
|
||||
*
|
||||
* Return:
|
||||
* SUCCESS as defined in scsi/scsi.h
|
||||
* FAILED as defined in scsi/scsi.h
|
||||
|
|
@ -1993,7 +2002,8 @@ static int cxlflash_eh_host_reset_handler(struct scsi_cmnd *scp)
|
|||
} else
|
||||
cfg->state = STATE_NORMAL;
|
||||
wake_up_all(&cfg->reset_waitq);
|
||||
break;
|
||||
ssleep(1);
|
||||
/* fall through */
|
||||
case STATE_RESET:
|
||||
wait_event(cfg->reset_waitq, cfg->state != STATE_RESET);
|
||||
if (cfg->state == STATE_NORMAL)
|
||||
|
|
@ -2534,6 +2544,9 @@ static void drain_ioctls(struct cxlflash_cfg *cfg)
|
|||
* @pdev: PCI device struct.
|
||||
* @state: PCI channel state.
|
||||
*
|
||||
* When an EEH occurs during an active reset, wait until the reset is
|
||||
* complete and then take action based upon the device state.
|
||||
*
|
||||
* Return: PCI_ERS_RESULT_NEED_RESET or PCI_ERS_RESULT_DISCONNECT
|
||||
*/
|
||||
static pci_ers_result_t cxlflash_pci_error_detected(struct pci_dev *pdev,
|
||||
|
|
@ -2547,6 +2560,10 @@ static pci_ers_result_t cxlflash_pci_error_detected(struct pci_dev *pdev,
|
|||
|
||||
switch (state) {
|
||||
case pci_channel_io_frozen:
|
||||
wait_event(cfg->reset_waitq, cfg->state != STATE_RESET);
|
||||
if (cfg->state == STATE_FAILTERM)
|
||||
return PCI_ERS_RESULT_DISCONNECT;
|
||||
|
||||
cfg->state = STATE_RESET;
|
||||
scsi_block_requests(cfg->host);
|
||||
drain_ioctls(cfg);
|
||||
|
|
|
|||
|
|
@ -3181,7 +3181,7 @@ static const struct {
|
|||
};
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
static void __init nbu2ss_drv_ep_init(struct nbu2ss_udc *udc)
|
||||
static void nbu2ss_drv_ep_init(struct nbu2ss_udc *udc)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
|
@ -3211,7 +3211,7 @@ static void __init nbu2ss_drv_ep_init(struct nbu2ss_udc *udc)
|
|||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
/* platform_driver */
|
||||
static int __init nbu2ss_drv_contest_init(
|
||||
static int nbu2ss_drv_contest_init(
|
||||
struct platform_device *pdev,
|
||||
struct nbu2ss_udc *udc)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1921,7 +1921,7 @@ static int ehca_set_pagebuf_user2(struct ehca_mr_pginfo *pginfo,
|
|||
u64 *kpage)
|
||||
{
|
||||
int ret = 0;
|
||||
u64 pgaddr, prev_pgaddr;
|
||||
u64 pgaddr, prev_pgaddr = 0;
|
||||
u32 j = 0;
|
||||
int kpages_per_hwpage = pginfo->hwpage_size / PAGE_SIZE;
|
||||
int nr_kpages = kpages_per_hwpage;
|
||||
|
|
@ -2417,6 +2417,7 @@ static int ehca_reg_bmap_mr_rpages(struct ehca_shca *shca,
|
|||
ehca_err(&shca->ib_device, "kpage alloc failed");
|
||||
return -ENOMEM;
|
||||
}
|
||||
hret = H_SUCCESS;
|
||||
for (top = 0; top < EHCA_MAP_ENTRIES; top++) {
|
||||
if (!ehca_bmap_valid(ehca_bmap->top[top]))
|
||||
continue;
|
||||
|
|
|
|||
|
|
@ -232,7 +232,7 @@ static int p80211_convert_to_ether(wlandevice_t *wlandev, struct sk_buff *skb)
|
|||
struct p80211_hdr_a3 *hdr;
|
||||
|
||||
hdr = (struct p80211_hdr_a3 *) skb->data;
|
||||
if (p80211_rx_typedrop(wlandev, hdr->fc))
|
||||
if (p80211_rx_typedrop(wlandev, le16_to_cpu(hdr->fc)))
|
||||
return CONV_TO_ETHER_SKIPPED;
|
||||
|
||||
/* perform mcast filtering: allow my local address through but reject
|
||||
|
|
|
|||
|
|
@ -1235,7 +1235,8 @@ static int omap8250_probe(struct platform_device *pdev)
|
|||
pm_runtime_put_autosuspend(&pdev->dev);
|
||||
return 0;
|
||||
err:
|
||||
pm_runtime_put(&pdev->dev);
|
||||
pm_runtime_dont_use_autosuspend(&pdev->dev);
|
||||
pm_runtime_put_sync(&pdev->dev);
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -1244,6 +1245,7 @@ static int omap8250_remove(struct platform_device *pdev)
|
|||
{
|
||||
struct omap8250_priv *priv = platform_get_drvdata(pdev);
|
||||
|
||||
pm_runtime_dont_use_autosuspend(&pdev->dev);
|
||||
pm_runtime_put_sync(&pdev->dev);
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
serial8250_unregister_port(priv->line);
|
||||
|
|
@ -1343,6 +1345,10 @@ static int omap8250_runtime_suspend(struct device *dev)
|
|||
struct omap8250_priv *priv = dev_get_drvdata(dev);
|
||||
struct uart_8250_port *up;
|
||||
|
||||
/* In case runtime-pm tries this before we are setup */
|
||||
if (!priv)
|
||||
return 0;
|
||||
|
||||
up = serial8250_get_port(priv->line);
|
||||
/*
|
||||
* When using 'no_console_suspend', the console UART must not be
|
||||
|
|
|
|||
|
|
@ -5850,17 +5850,15 @@ static pci_ers_result_t serial8250_io_slot_reset(struct pci_dev *dev)
|
|||
static void serial8250_io_resume(struct pci_dev *dev)
|
||||
{
|
||||
struct serial_private *priv = pci_get_drvdata(dev);
|
||||
const struct pciserial_board *board;
|
||||
struct serial_private *new;
|
||||
|
||||
if (!priv)
|
||||
return;
|
||||
|
||||
board = priv->board;
|
||||
kfree(priv);
|
||||
priv = pciserial_init_ports(dev, board);
|
||||
|
||||
if (!IS_ERR(priv)) {
|
||||
pci_set_drvdata(dev, priv);
|
||||
new = pciserial_init_ports(dev, priv->board);
|
||||
if (!IS_ERR(new)) {
|
||||
pci_set_drvdata(dev, new);
|
||||
kfree(priv);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -428,9 +428,6 @@ int hw_port_test_set(struct ci_hdrc *ci, u8 mode);
|
|||
|
||||
u8 hw_port_test_get(struct ci_hdrc *ci);
|
||||
|
||||
int hw_wait_reg(struct ci_hdrc *ci, enum ci_hw_regs reg, u32 mask,
|
||||
u32 value, unsigned int timeout_ms);
|
||||
|
||||
void ci_platform_configure(struct ci_hdrc *ci);
|
||||
|
||||
#endif /* __DRIVERS_USB_CHIPIDEA_CI_H */
|
||||
|
|
|
|||
|
|
@ -518,38 +518,6 @@ int hw_device_reset(struct ci_hdrc *ci)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* hw_wait_reg: wait the register value
|
||||
*
|
||||
* Sometimes, it needs to wait register value before going on.
|
||||
* Eg, when switch to device mode, the vbus value should be lower
|
||||
* than OTGSC_BSV before connects to host.
|
||||
*
|
||||
* @ci: the controller
|
||||
* @reg: register index
|
||||
* @mask: mast bit
|
||||
* @value: the bit value to wait
|
||||
* @timeout_ms: timeout in millisecond
|
||||
*
|
||||
* This function returns an error code if timeout
|
||||
*/
|
||||
int hw_wait_reg(struct ci_hdrc *ci, enum ci_hw_regs reg, u32 mask,
|
||||
u32 value, unsigned int timeout_ms)
|
||||
{
|
||||
unsigned long elapse = jiffies + msecs_to_jiffies(timeout_ms);
|
||||
|
||||
while (hw_read(ci, reg, mask) != value) {
|
||||
if (time_after(jiffies, elapse)) {
|
||||
dev_err(ci->dev, "timeout waiting for %08x in %d\n",
|
||||
mask, reg);
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
msleep(20);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static irqreturn_t ci_irq(int irq, void *data)
|
||||
{
|
||||
struct ci_hdrc *ci = data;
|
||||
|
|
|
|||
|
|
@ -44,12 +44,15 @@ u32 hw_read_otgsc(struct ci_hdrc *ci, u32 mask)
|
|||
else
|
||||
val &= ~OTGSC_BSVIS;
|
||||
|
||||
cable->changed = false;
|
||||
|
||||
if (cable->state)
|
||||
val |= OTGSC_BSV;
|
||||
else
|
||||
val &= ~OTGSC_BSV;
|
||||
|
||||
if (cable->enabled)
|
||||
val |= OTGSC_BSVIE;
|
||||
else
|
||||
val &= ~OTGSC_BSVIE;
|
||||
}
|
||||
|
||||
cable = &ci->platdata->id_extcon;
|
||||
|
|
@ -59,15 +62,18 @@ u32 hw_read_otgsc(struct ci_hdrc *ci, u32 mask)
|
|||
else
|
||||
val &= ~OTGSC_IDIS;
|
||||
|
||||
cable->changed = false;
|
||||
|
||||
if (cable->state)
|
||||
val |= OTGSC_ID;
|
||||
else
|
||||
val &= ~OTGSC_ID;
|
||||
|
||||
if (cable->enabled)
|
||||
val |= OTGSC_IDIE;
|
||||
else
|
||||
val &= ~OTGSC_IDIE;
|
||||
}
|
||||
|
||||
return val;
|
||||
return val & mask;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -77,6 +83,36 @@ u32 hw_read_otgsc(struct ci_hdrc *ci, u32 mask)
|
|||
*/
|
||||
void hw_write_otgsc(struct ci_hdrc *ci, u32 mask, u32 data)
|
||||
{
|
||||
struct ci_hdrc_cable *cable;
|
||||
|
||||
cable = &ci->platdata->vbus_extcon;
|
||||
if (!IS_ERR(cable->edev)) {
|
||||
if (data & mask & OTGSC_BSVIS)
|
||||
cable->changed = false;
|
||||
|
||||
/* Don't enable vbus interrupt if using external notifier */
|
||||
if (data & mask & OTGSC_BSVIE) {
|
||||
cable->enabled = true;
|
||||
data &= ~OTGSC_BSVIE;
|
||||
} else if (mask & OTGSC_BSVIE) {
|
||||
cable->enabled = false;
|
||||
}
|
||||
}
|
||||
|
||||
cable = &ci->platdata->id_extcon;
|
||||
if (!IS_ERR(cable->edev)) {
|
||||
if (data & mask & OTGSC_IDIS)
|
||||
cable->changed = false;
|
||||
|
||||
/* Don't enable id interrupt if using external notifier */
|
||||
if (data & mask & OTGSC_IDIE) {
|
||||
cable->enabled = true;
|
||||
data &= ~OTGSC_IDIE;
|
||||
} else if (mask & OTGSC_IDIE) {
|
||||
cable->enabled = false;
|
||||
}
|
||||
}
|
||||
|
||||
hw_write(ci, OP_OTGSC, mask | OTGSC_INT_STATUS_BITS, data);
|
||||
}
|
||||
|
||||
|
|
@ -104,7 +140,31 @@ void ci_handle_vbus_change(struct ci_hdrc *ci)
|
|||
usb_gadget_vbus_disconnect(&ci->gadget);
|
||||
}
|
||||
|
||||
#define CI_VBUS_STABLE_TIMEOUT_MS 5000
|
||||
/**
|
||||
* When we switch to device mode, the vbus value should be lower
|
||||
* than OTGSC_BSV before connecting to host.
|
||||
*
|
||||
* @ci: the controller
|
||||
*
|
||||
* This function returns an error code if timeout
|
||||
*/
|
||||
static int hw_wait_vbus_lower_bsv(struct ci_hdrc *ci)
|
||||
{
|
||||
unsigned long elapse = jiffies + msecs_to_jiffies(5000);
|
||||
u32 mask = OTGSC_BSV;
|
||||
|
||||
while (hw_read_otgsc(ci, mask)) {
|
||||
if (time_after(jiffies, elapse)) {
|
||||
dev_err(ci->dev, "timeout waiting for %08x in OTGSC\n",
|
||||
mask);
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
msleep(20);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void ci_handle_id_switch(struct ci_hdrc *ci)
|
||||
{
|
||||
enum ci_role role = ci_otg_role(ci);
|
||||
|
|
@ -116,9 +176,11 @@ static void ci_handle_id_switch(struct ci_hdrc *ci)
|
|||
ci_role_stop(ci);
|
||||
|
||||
if (role == CI_ROLE_GADGET)
|
||||
/* wait vbus lower than OTGSC_BSV */
|
||||
hw_wait_reg(ci, OP_OTGSC, OTGSC_BSV, 0,
|
||||
CI_VBUS_STABLE_TIMEOUT_MS);
|
||||
/*
|
||||
* wait vbus lower than OTGSC_BSV before connecting
|
||||
* to host
|
||||
*/
|
||||
hw_wait_vbus_lower_bsv(ci);
|
||||
|
||||
ci_role_start(ci, role);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -361,7 +361,9 @@ static int f_midi_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
|
|||
/* allocate a bunch of read buffers and queue them all at once. */
|
||||
for (i = 0; i < midi->qlen && err == 0; i++) {
|
||||
struct usb_request *req =
|
||||
midi_alloc_ep_req(midi->out_ep, midi->buflen);
|
||||
midi_alloc_ep_req(midi->out_ep,
|
||||
max_t(unsigned, midi->buflen,
|
||||
bulk_out_desc.wMaxPacketSize));
|
||||
if (req == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
|
|
|
|||
|
|
@ -77,10 +77,12 @@ static int exynos_ehci_get_phy(struct device *dev,
|
|||
if (IS_ERR(phy)) {
|
||||
ret = PTR_ERR(phy);
|
||||
if (ret == -EPROBE_DEFER) {
|
||||
of_node_put(child);
|
||||
return ret;
|
||||
} else if (ret != -ENOSYS && ret != -ENODEV) {
|
||||
dev_err(dev,
|
||||
"Error retrieving usb2 phy: %d\n", ret);
|
||||
of_node_put(child);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -66,10 +66,12 @@ static int exynos_ohci_get_phy(struct device *dev,
|
|||
if (IS_ERR(phy)) {
|
||||
ret = PTR_ERR(phy);
|
||||
if (ret == -EPROBE_DEFER) {
|
||||
of_node_put(child);
|
||||
return ret;
|
||||
} else if (ret != -ENOSYS && ret != -ENODEV) {
|
||||
dev_err(dev,
|
||||
"Error retrieving usb2 phy: %d\n", ret);
|
||||
of_node_put(child);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -373,23 +373,29 @@ static int ark3116_open(struct tty_struct *tty, struct usb_serial_port *port)
|
|||
dev_dbg(&port->dev,
|
||||
"%s - usb_serial_generic_open failed: %d\n",
|
||||
__func__, result);
|
||||
goto err_out;
|
||||
goto err_free;
|
||||
}
|
||||
|
||||
/* remove any data still left: also clears error state */
|
||||
ark3116_read_reg(serial, UART_RX, buf);
|
||||
|
||||
/* read modem status */
|
||||
priv->msr = ark3116_read_reg(serial, UART_MSR, buf);
|
||||
result = ark3116_read_reg(serial, UART_MSR, buf);
|
||||
if (result < 0)
|
||||
goto err_close;
|
||||
priv->msr = *buf;
|
||||
|
||||
/* read line status */
|
||||
priv->lsr = ark3116_read_reg(serial, UART_LSR, buf);
|
||||
result = ark3116_read_reg(serial, UART_LSR, buf);
|
||||
if (result < 0)
|
||||
goto err_close;
|
||||
priv->lsr = *buf;
|
||||
|
||||
result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
|
||||
if (result) {
|
||||
dev_err(&port->dev, "submit irq_in urb failed %d\n",
|
||||
result);
|
||||
ark3116_close(port);
|
||||
goto err_out;
|
||||
goto err_close;
|
||||
}
|
||||
|
||||
/* activate interrupts */
|
||||
|
|
@ -402,8 +408,15 @@ static int ark3116_open(struct tty_struct *tty, struct usb_serial_port *port)
|
|||
if (tty)
|
||||
ark3116_set_termios(tty, port, NULL);
|
||||
|
||||
err_out:
|
||||
kfree(buf);
|
||||
|
||||
return 0;
|
||||
|
||||
err_close:
|
||||
usb_serial_generic_close(port);
|
||||
err_free:
|
||||
kfree(buf);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1399,25 +1399,30 @@ static int digi_read_inb_callback(struct urb *urb)
|
|||
{
|
||||
struct usb_serial_port *port = urb->context;
|
||||
struct digi_port *priv = usb_get_serial_port_data(port);
|
||||
int opcode = ((unsigned char *)urb->transfer_buffer)[0];
|
||||
int len = ((unsigned char *)urb->transfer_buffer)[1];
|
||||
int port_status = ((unsigned char *)urb->transfer_buffer)[2];
|
||||
unsigned char *data = ((unsigned char *)urb->transfer_buffer) + 3;
|
||||
unsigned char *buf = urb->transfer_buffer;
|
||||
int opcode;
|
||||
int len;
|
||||
int port_status;
|
||||
unsigned char *data;
|
||||
int flag, throttled;
|
||||
int status = urb->status;
|
||||
|
||||
/* do not process callbacks on closed ports */
|
||||
/* but do continue the read chain */
|
||||
if (urb->status == -ENOENT)
|
||||
return 0;
|
||||
|
||||
/* short/multiple packet check */
|
||||
if (urb->actual_length < 2) {
|
||||
dev_warn(&port->dev, "short packet received\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
opcode = buf[0];
|
||||
len = buf[1];
|
||||
|
||||
if (urb->actual_length != len + 2) {
|
||||
dev_err(&port->dev, "%s: INCOMPLETE OR MULTIPLE PACKET, "
|
||||
"status=%d, port=%d, opcode=%d, len=%d, "
|
||||
"actual_length=%d, status=%d\n", __func__, status,
|
||||
priv->dp_port_num, opcode, len, urb->actual_length,
|
||||
port_status);
|
||||
dev_err(&port->dev, "malformed packet received: port=%d, opcode=%d, len=%d, actual_length=%u\n",
|
||||
priv->dp_port_num, opcode, len, urb->actual_length);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (opcode == DIGI_CMD_RECEIVE_DATA && len < 1) {
|
||||
dev_err(&port->dev, "malformed data packet received\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
|
@ -1431,6 +1436,9 @@ static int digi_read_inb_callback(struct urb *urb)
|
|||
|
||||
/* receive data */
|
||||
if (opcode == DIGI_CMD_RECEIVE_DATA) {
|
||||
port_status = buf[2];
|
||||
data = &buf[3];
|
||||
|
||||
/* get flag from port_status */
|
||||
flag = 0;
|
||||
|
||||
|
|
|
|||
|
|
@ -1439,10 +1439,13 @@ static int read_latency_timer(struct usb_serial_port *port)
|
|||
FTDI_SIO_GET_LATENCY_TIMER_REQUEST_TYPE,
|
||||
0, priv->interface,
|
||||
buf, 1, WDR_TIMEOUT);
|
||||
if (rv < 0)
|
||||
if (rv < 1) {
|
||||
dev_err(&port->dev, "Unable to read latency timer: %i\n", rv);
|
||||
else
|
||||
if (rv >= 0)
|
||||
rv = -EIO;
|
||||
} else {
|
||||
priv->latency = buf[0];
|
||||
}
|
||||
|
||||
kfree(buf);
|
||||
|
||||
|
|
|
|||
|
|
@ -492,20 +492,24 @@ static int get_epic_descriptor(struct edgeport_serial *ep)
|
|||
int result;
|
||||
struct usb_serial *serial = ep->serial;
|
||||
struct edgeport_product_info *product_info = &ep->product_info;
|
||||
struct edge_compatibility_descriptor *epic = &ep->epic_descriptor;
|
||||
struct edge_compatibility_descriptor *epic;
|
||||
struct edge_compatibility_bits *bits;
|
||||
struct device *dev = &serial->dev->dev;
|
||||
|
||||
ep->is_epic = 0;
|
||||
|
||||
epic = kmalloc(sizeof(*epic), GFP_KERNEL);
|
||||
if (!epic)
|
||||
return -ENOMEM;
|
||||
|
||||
result = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
|
||||
USB_REQUEST_ION_GET_EPIC_DESC,
|
||||
0xC0, 0x00, 0x00,
|
||||
&ep->epic_descriptor,
|
||||
sizeof(struct edge_compatibility_descriptor),
|
||||
epic, sizeof(*epic),
|
||||
300);
|
||||
|
||||
if (result > 0) {
|
||||
if (result == sizeof(*epic)) {
|
||||
ep->is_epic = 1;
|
||||
memcpy(&ep->epic_descriptor, epic, sizeof(*epic));
|
||||
memset(product_info, 0, sizeof(struct edgeport_product_info));
|
||||
|
||||
product_info->NumPorts = epic->NumPorts;
|
||||
|
|
@ -534,8 +538,16 @@ static int get_epic_descriptor(struct edgeport_serial *ep)
|
|||
dev_dbg(dev, " IOSPWriteLCR : %s\n", bits->IOSPWriteLCR ? "TRUE": "FALSE");
|
||||
dev_dbg(dev, " IOSPSetBaudRate : %s\n", bits->IOSPSetBaudRate ? "TRUE": "FALSE");
|
||||
dev_dbg(dev, " TrueEdgeport : %s\n", bits->TrueEdgeport ? "TRUE": "FALSE");
|
||||
|
||||
result = 0;
|
||||
} else if (result >= 0) {
|
||||
dev_warn(&serial->interface->dev, "short epic descriptor received: %d\n",
|
||||
result);
|
||||
result = -EIO;
|
||||
}
|
||||
|
||||
kfree(epic);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
|
@ -2097,8 +2109,7 @@ static int rom_write(struct usb_serial *serial, __u16 extAddr, __u16 addr,
|
|||
* rom_read
|
||||
* reads a number of bytes from the Edgeport device starting at the given
|
||||
* address.
|
||||
* If successful returns the number of bytes read, otherwise it returns
|
||||
* a negative error number of the problem.
|
||||
* Returns zero on success or a negative error number.
|
||||
****************************************************************************/
|
||||
static int rom_read(struct usb_serial *serial, __u16 extAddr,
|
||||
__u16 addr, __u16 length, __u8 *data)
|
||||
|
|
@ -2123,12 +2134,17 @@ static int rom_read(struct usb_serial *serial, __u16 extAddr,
|
|||
USB_REQUEST_ION_READ_ROM,
|
||||
0xC0, addr, extAddr, transfer_buffer,
|
||||
current_length, 300);
|
||||
if (result < 0)
|
||||
if (result < current_length) {
|
||||
if (result >= 0)
|
||||
result = -EIO;
|
||||
break;
|
||||
}
|
||||
memcpy(data, transfer_buffer, current_length);
|
||||
length -= current_length;
|
||||
addr += current_length;
|
||||
data += current_length;
|
||||
|
||||
result = 0;
|
||||
}
|
||||
|
||||
kfree(transfer_buffer);
|
||||
|
|
@ -2585,9 +2601,10 @@ static void get_manufacturing_desc(struct edgeport_serial *edge_serial)
|
|||
EDGE_MANUF_DESC_LEN,
|
||||
(__u8 *)(&edge_serial->manuf_descriptor));
|
||||
|
||||
if (response < 1)
|
||||
dev_err(dev, "error in getting manufacturer descriptor\n");
|
||||
else {
|
||||
if (response < 0) {
|
||||
dev_err(dev, "error in getting manufacturer descriptor: %d\n",
|
||||
response);
|
||||
} else {
|
||||
char string[30];
|
||||
dev_dbg(dev, "**Manufacturer Descriptor\n");
|
||||
dev_dbg(dev, " RomSize: %dK\n",
|
||||
|
|
@ -2644,9 +2661,10 @@ static void get_boot_desc(struct edgeport_serial *edge_serial)
|
|||
EDGE_BOOT_DESC_LEN,
|
||||
(__u8 *)(&edge_serial->boot_descriptor));
|
||||
|
||||
if (response < 1)
|
||||
dev_err(dev, "error in getting boot descriptor\n");
|
||||
else {
|
||||
if (response < 0) {
|
||||
dev_err(dev, "error in getting boot descriptor: %d\n",
|
||||
response);
|
||||
} else {
|
||||
dev_dbg(dev, "**Boot Descriptor:\n");
|
||||
dev_dbg(dev, " BootCodeLength: %d\n",
|
||||
le16_to_cpu(edge_serial->boot_descriptor.BootCodeLength));
|
||||
|
|
@ -2789,7 +2807,7 @@ static int edge_startup(struct usb_serial *serial)
|
|||
dev_info(&serial->dev->dev, "%s detected\n", edge_serial->name);
|
||||
|
||||
/* Read the epic descriptor */
|
||||
if (get_epic_descriptor(edge_serial) <= 0) {
|
||||
if (get_epic_descriptor(edge_serial) < 0) {
|
||||
/* memcpy descriptor to Supports structures */
|
||||
memcpy(&edge_serial->epic_descriptor.Supports, descriptor,
|
||||
sizeof(struct edge_compatibility_bits));
|
||||
|
|
|
|||
|
|
@ -139,6 +139,7 @@ static void keyspan_pda_rx_interrupt(struct urb *urb)
|
|||
{
|
||||
struct usb_serial_port *port = urb->context;
|
||||
unsigned char *data = urb->transfer_buffer;
|
||||
unsigned int len = urb->actual_length;
|
||||
int retval;
|
||||
int status = urb->status;
|
||||
struct keyspan_pda_private *priv;
|
||||
|
|
@ -159,18 +160,26 @@ static void keyspan_pda_rx_interrupt(struct urb *urb)
|
|||
goto exit;
|
||||
}
|
||||
|
||||
if (len < 1) {
|
||||
dev_warn(&port->dev, "short message received\n");
|
||||
goto exit;
|
||||
}
|
||||
|
||||
/* see if the message is data or a status interrupt */
|
||||
switch (data[0]) {
|
||||
case 0:
|
||||
/* rest of message is rx data */
|
||||
if (urb->actual_length) {
|
||||
tty_insert_flip_string(&port->port, data + 1,
|
||||
urb->actual_length - 1);
|
||||
tty_flip_buffer_push(&port->port);
|
||||
}
|
||||
if (len < 2)
|
||||
break;
|
||||
tty_insert_flip_string(&port->port, data + 1, len - 1);
|
||||
tty_flip_buffer_push(&port->port);
|
||||
break;
|
||||
case 1:
|
||||
/* status interrupt */
|
||||
if (len < 3) {
|
||||
dev_warn(&port->dev, "short interrupt message received\n");
|
||||
break;
|
||||
}
|
||||
dev_dbg(&port->dev, "rx int, d1=%d, d2=%d\n", data[1], data[2]);
|
||||
switch (data[1]) {
|
||||
case 1: /* modemline change */
|
||||
|
|
|
|||
|
|
@ -322,8 +322,12 @@ static int mct_u232_get_modem_stat(struct usb_serial_port *port,
|
|||
MCT_U232_GET_REQUEST_TYPE,
|
||||
0, 0, buf, MCT_U232_GET_MODEM_STAT_SIZE,
|
||||
WDR_TIMEOUT);
|
||||
if (rc < 0) {
|
||||
if (rc < MCT_U232_GET_MODEM_STAT_SIZE) {
|
||||
dev_err(&port->dev, "Get MODEM STATus failed (error = %d)\n", rc);
|
||||
|
||||
if (rc >= 0)
|
||||
rc = -EIO;
|
||||
|
||||
*msr = 0;
|
||||
} else {
|
||||
*msr = buf[0];
|
||||
|
|
|
|||
|
|
@ -188,22 +188,22 @@ static inline int qt2_setdevice(struct usb_device *dev, u8 *data)
|
|||
}
|
||||
|
||||
|
||||
static inline int qt2_getdevice(struct usb_device *dev, u8 *data)
|
||||
{
|
||||
return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
|
||||
QT_SET_GET_DEVICE, 0xc0, 0, 0,
|
||||
data, 3, QT2_USB_TIMEOUT);
|
||||
}
|
||||
|
||||
static inline int qt2_getregister(struct usb_device *dev,
|
||||
u8 uart,
|
||||
u8 reg,
|
||||
u8 *data)
|
||||
{
|
||||
return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
|
||||
QT_SET_GET_REGISTER, 0xc0, reg,
|
||||
uart, data, sizeof(*data), QT2_USB_TIMEOUT);
|
||||
int ret;
|
||||
|
||||
ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
|
||||
QT_SET_GET_REGISTER, 0xc0, reg,
|
||||
uart, data, sizeof(*data), QT2_USB_TIMEOUT);
|
||||
if (ret < sizeof(*data)) {
|
||||
if (ret >= 0)
|
||||
ret = -EIO;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline int qt2_setregister(struct usb_device *dev,
|
||||
|
|
@ -372,9 +372,11 @@ static int qt2_open(struct tty_struct *tty, struct usb_serial_port *port)
|
|||
0xc0, 0,
|
||||
device_port, data, 2, QT2_USB_TIMEOUT);
|
||||
|
||||
if (status < 0) {
|
||||
if (status < 2) {
|
||||
dev_err(&port->dev, "%s - open port failed %i\n", __func__,
|
||||
status);
|
||||
if (status >= 0)
|
||||
status = -EIO;
|
||||
kfree(data);
|
||||
return status;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -80,9 +80,17 @@ static inline int ssu100_setdevice(struct usb_device *dev, u8 *data)
|
|||
|
||||
static inline int ssu100_getdevice(struct usb_device *dev, u8 *data)
|
||||
{
|
||||
return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
|
||||
QT_SET_GET_DEVICE, 0xc0, 0, 0,
|
||||
data, 3, 300);
|
||||
int ret;
|
||||
|
||||
ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
|
||||
QT_SET_GET_DEVICE, 0xc0, 0, 0,
|
||||
data, 3, 300);
|
||||
if (ret < 3) {
|
||||
if (ret >= 0)
|
||||
ret = -EIO;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline int ssu100_getregister(struct usb_device *dev,
|
||||
|
|
@ -90,10 +98,17 @@ static inline int ssu100_getregister(struct usb_device *dev,
|
|||
unsigned short reg,
|
||||
u8 *data)
|
||||
{
|
||||
return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
|
||||
QT_SET_GET_REGISTER, 0xc0, reg,
|
||||
uart, data, sizeof(*data), 300);
|
||||
int ret;
|
||||
|
||||
ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
|
||||
QT_SET_GET_REGISTER, 0xc0, reg,
|
||||
uart, data, sizeof(*data), 300);
|
||||
if (ret < sizeof(*data)) {
|
||||
if (ret >= 0)
|
||||
ret = -EIO;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -289,8 +304,10 @@ static int ssu100_open(struct tty_struct *tty, struct usb_serial_port *port)
|
|||
QT_OPEN_CLOSE_CHANNEL,
|
||||
QT_TRANSFER_IN, 0x01,
|
||||
0, data, 2, 300);
|
||||
if (result < 0) {
|
||||
if (result < 2) {
|
||||
dev_dbg(&port->dev, "%s - open failed %i\n", __func__, result);
|
||||
if (result >= 0)
|
||||
result = -EIO;
|
||||
kfree(data);
|
||||
return result;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1352,13 +1352,10 @@ static int ti_command_out_sync(struct ti_device *tdev, __u8 command,
|
|||
(USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT),
|
||||
value, moduleid, data, size, 1000);
|
||||
|
||||
if (status == size)
|
||||
status = 0;
|
||||
if (status < 0)
|
||||
return status;
|
||||
|
||||
if (status > 0)
|
||||
status = -ECOMM;
|
||||
|
||||
return status;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1374,8 +1371,7 @@ static int ti_command_in_sync(struct ti_device *tdev, __u8 command,
|
|||
|
||||
if (status == size)
|
||||
status = 0;
|
||||
|
||||
if (status > 0)
|
||||
else if (status >= 0)
|
||||
status = -ECOMM;
|
||||
|
||||
return status;
|
||||
|
|
|
|||
|
|
@ -283,6 +283,7 @@ static int v9fs_xattr_set_acl(const struct xattr_handler *handler,
|
|||
case ACL_TYPE_ACCESS:
|
||||
if (acl) {
|
||||
struct iattr iattr;
|
||||
struct posix_acl *old_acl = acl;
|
||||
|
||||
retval = posix_acl_update_mode(inode, &iattr.ia_mode, &acl);
|
||||
if (retval)
|
||||
|
|
@ -293,6 +294,7 @@ static int v9fs_xattr_set_acl(const struct xattr_handler *handler,
|
|||
* by the mode bits. So don't
|
||||
* update ACL.
|
||||
*/
|
||||
posix_acl_release(old_acl);
|
||||
value = NULL;
|
||||
size = 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1098,7 +1098,6 @@ int revalidate_disk(struct gendisk *disk)
|
|||
|
||||
if (disk->fops->revalidate_disk)
|
||||
ret = disk->fops->revalidate_disk(disk);
|
||||
blk_integrity_revalidate(disk);
|
||||
bdev = bdget_disk(disk, 0);
|
||||
if (!bdev)
|
||||
return ret;
|
||||
|
|
|
|||
|
|
@ -227,6 +227,7 @@ struct smb_version_operations {
|
|||
/* verify the message */
|
||||
int (*check_message)(char *, unsigned int);
|
||||
bool (*is_oplock_break)(char *, struct TCP_Server_Info *);
|
||||
int (*handle_cancelled_mid)(char *, struct TCP_Server_Info *);
|
||||
void (*downgrade_oplock)(struct TCP_Server_Info *,
|
||||
struct cifsInodeInfo *, bool);
|
||||
/* process transaction2 response */
|
||||
|
|
@ -1289,12 +1290,19 @@ struct mid_q_entry {
|
|||
void *callback_data; /* general purpose pointer for callback */
|
||||
void *resp_buf; /* pointer to received SMB header */
|
||||
int mid_state; /* wish this were enum but can not pass to wait_event */
|
||||
unsigned int mid_flags;
|
||||
__le16 command; /* smb command code */
|
||||
bool large_buf:1; /* if valid response, is pointer to large buf */
|
||||
bool multiRsp:1; /* multiple trans2 responses for one request */
|
||||
bool multiEnd:1; /* both received */
|
||||
};
|
||||
|
||||
struct close_cancelled_open {
|
||||
struct cifs_fid fid;
|
||||
struct cifs_tcon *tcon;
|
||||
struct work_struct work;
|
||||
};
|
||||
|
||||
/* Make code in transport.c a little cleaner by moving
|
||||
update of optional stats into function below */
|
||||
#ifdef CONFIG_CIFS_STATS2
|
||||
|
|
@ -1426,6 +1434,9 @@ static inline void free_dfs_info_array(struct dfs_info3_param *param,
|
|||
#define MID_RESPONSE_MALFORMED 0x10
|
||||
#define MID_SHUTDOWN 0x20
|
||||
|
||||
/* Flags */
|
||||
#define MID_WAIT_CANCELLED 1 /* Cancelled while waiting for response */
|
||||
|
||||
/* Types of response buffer returned from SendReceive2 */
|
||||
#define CIFS_NO_BUFFER 0 /* Response buffer not returned */
|
||||
#define CIFS_SMALL_BUFFER 1
|
||||
|
|
|
|||
|
|
@ -1424,6 +1424,8 @@ cifs_readv_discard(struct TCP_Server_Info *server, struct mid_q_entry *mid)
|
|||
|
||||
length = discard_remaining_data(server);
|
||||
dequeue_mid(mid, rdata->result);
|
||||
mid->resp_buf = server->smallbuf;
|
||||
server->smallbuf = NULL;
|
||||
return length;
|
||||
}
|
||||
|
||||
|
|
@ -1538,6 +1540,8 @@ cifs_readv_receive(struct TCP_Server_Info *server, struct mid_q_entry *mid)
|
|||
return cifs_readv_discard(server, mid);
|
||||
|
||||
dequeue_mid(mid, false);
|
||||
mid->resp_buf = server->smallbuf;
|
||||
server->smallbuf = NULL;
|
||||
return length;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -924,10 +924,19 @@ cifs_demultiplex_thread(void *p)
|
|||
|
||||
server->lstrp = jiffies;
|
||||
if (mid_entry != NULL) {
|
||||
if ((mid_entry->mid_flags & MID_WAIT_CANCELLED) &&
|
||||
mid_entry->mid_state == MID_RESPONSE_RECEIVED &&
|
||||
server->ops->handle_cancelled_mid)
|
||||
server->ops->handle_cancelled_mid(
|
||||
mid_entry->resp_buf,
|
||||
server);
|
||||
|
||||
if (!mid_entry->multiRsp || mid_entry->multiEnd)
|
||||
mid_entry->callback(mid_entry);
|
||||
} else if (!server->ops->is_oplock_break ||
|
||||
!server->ops->is_oplock_break(buf, server)) {
|
||||
} else if (server->ops->is_oplock_break &&
|
||||
server->ops->is_oplock_break(buf, server)) {
|
||||
cifs_dbg(FYI, "Received oplock break\n");
|
||||
} else {
|
||||
cifs_dbg(VFS, "No task to wake, unknown frame received! NumMids %d\n",
|
||||
atomic_read(&midCount));
|
||||
cifs_dump_mem("Received Data is: ", buf,
|
||||
|
|
|
|||
|
|
@ -630,3 +630,47 @@ smb2_is_valid_oplock_break(char *buffer, struct TCP_Server_Info *server)
|
|||
cifs_dbg(FYI, "Can not process oplock break for non-existent connection\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
void
|
||||
smb2_cancelled_close_fid(struct work_struct *work)
|
||||
{
|
||||
struct close_cancelled_open *cancelled = container_of(work,
|
||||
struct close_cancelled_open, work);
|
||||
|
||||
cifs_dbg(VFS, "Close unmatched open\n");
|
||||
|
||||
SMB2_close(0, cancelled->tcon, cancelled->fid.persistent_fid,
|
||||
cancelled->fid.volatile_fid);
|
||||
cifs_put_tcon(cancelled->tcon);
|
||||
kfree(cancelled);
|
||||
}
|
||||
|
||||
int
|
||||
smb2_handle_cancelled_mid(char *buffer, struct TCP_Server_Info *server)
|
||||
{
|
||||
struct smb2_hdr *hdr = (struct smb2_hdr *)buffer;
|
||||
struct smb2_create_rsp *rsp = (struct smb2_create_rsp *)buffer;
|
||||
struct cifs_tcon *tcon;
|
||||
struct close_cancelled_open *cancelled;
|
||||
|
||||
if (hdr->Command != SMB2_CREATE || hdr->Status != STATUS_SUCCESS)
|
||||
return 0;
|
||||
|
||||
cancelled = kzalloc(sizeof(*cancelled), GFP_KERNEL);
|
||||
if (!cancelled)
|
||||
return -ENOMEM;
|
||||
|
||||
tcon = smb2_find_smb_tcon(server, hdr->SessionId, hdr->TreeId);
|
||||
if (!tcon) {
|
||||
kfree(cancelled);
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
cancelled->fid.persistent_fid = rsp->PersistentFileId;
|
||||
cancelled->fid.volatile_fid = rsp->VolatileFileId;
|
||||
cancelled->tcon = tcon;
|
||||
INIT_WORK(&cancelled->work, smb2_cancelled_close_fid);
|
||||
queue_work(cifsiod_wq, &cancelled->work);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1511,6 +1511,7 @@ struct smb_version_operations smb20_operations = {
|
|||
.clear_stats = smb2_clear_stats,
|
||||
.print_stats = smb2_print_stats,
|
||||
.is_oplock_break = smb2_is_valid_oplock_break,
|
||||
.handle_cancelled_mid = smb2_handle_cancelled_mid,
|
||||
.downgrade_oplock = smb2_downgrade_oplock,
|
||||
.need_neg = smb2_need_neg,
|
||||
.negotiate = smb2_negotiate,
|
||||
|
|
@ -1589,6 +1590,7 @@ struct smb_version_operations smb21_operations = {
|
|||
.clear_stats = smb2_clear_stats,
|
||||
.print_stats = smb2_print_stats,
|
||||
.is_oplock_break = smb2_is_valid_oplock_break,
|
||||
.handle_cancelled_mid = smb2_handle_cancelled_mid,
|
||||
.downgrade_oplock = smb2_downgrade_oplock,
|
||||
.need_neg = smb2_need_neg,
|
||||
.negotiate = smb2_negotiate,
|
||||
|
|
@ -1670,6 +1672,7 @@ struct smb_version_operations smb30_operations = {
|
|||
.print_stats = smb2_print_stats,
|
||||
.dump_share_caps = smb2_dump_share_caps,
|
||||
.is_oplock_break = smb2_is_valid_oplock_break,
|
||||
.handle_cancelled_mid = smb2_handle_cancelled_mid,
|
||||
.downgrade_oplock = smb2_downgrade_oplock,
|
||||
.need_neg = smb2_need_neg,
|
||||
.negotiate = smb2_negotiate,
|
||||
|
|
@ -1757,6 +1760,7 @@ struct smb_version_operations smb311_operations = {
|
|||
.print_stats = smb2_print_stats,
|
||||
.dump_share_caps = smb2_dump_share_caps,
|
||||
.is_oplock_break = smb2_is_valid_oplock_break,
|
||||
.handle_cancelled_mid = smb2_handle_cancelled_mid,
|
||||
.downgrade_oplock = smb2_downgrade_oplock,
|
||||
.need_neg = smb2_need_neg,
|
||||
.negotiate = smb2_negotiate,
|
||||
|
|
|
|||
|
|
@ -47,6 +47,10 @@ extern struct mid_q_entry *smb2_setup_request(struct cifs_ses *ses,
|
|||
struct smb_rqst *rqst);
|
||||
extern struct mid_q_entry *smb2_setup_async_request(
|
||||
struct TCP_Server_Info *server, struct smb_rqst *rqst);
|
||||
extern struct cifs_ses *smb2_find_smb_ses(struct TCP_Server_Info *server,
|
||||
__u64 ses_id);
|
||||
extern struct cifs_tcon *smb2_find_smb_tcon(struct TCP_Server_Info *server,
|
||||
__u64 ses_id, __u32 tid);
|
||||
extern int smb2_calc_signature(struct smb_rqst *rqst,
|
||||
struct TCP_Server_Info *server);
|
||||
extern int smb3_calc_signature(struct smb_rqst *rqst,
|
||||
|
|
@ -157,6 +161,9 @@ extern int SMB2_set_compression(const unsigned int xid, struct cifs_tcon *tcon,
|
|||
extern int SMB2_oplock_break(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
const u64 persistent_fid, const u64 volatile_fid,
|
||||
const __u8 oplock_level);
|
||||
extern int smb2_handle_cancelled_mid(char *buffer,
|
||||
struct TCP_Server_Info *server);
|
||||
void smb2_cancelled_close_fid(struct work_struct *work);
|
||||
extern int SMB2_QFS_info(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
u64 persistent_file_id, u64 volatile_file_id,
|
||||
struct kstatfs *FSData);
|
||||
|
|
|
|||
|
|
@ -115,22 +115,68 @@ smb3_crypto_shash_allocate(struct TCP_Server_Info *server)
|
|||
}
|
||||
|
||||
static struct cifs_ses *
|
||||
smb2_find_smb_ses(struct smb2_hdr *smb2hdr, struct TCP_Server_Info *server)
|
||||
smb2_find_smb_ses_unlocked(struct TCP_Server_Info *server, __u64 ses_id)
|
||||
{
|
||||
struct cifs_ses *ses;
|
||||
|
||||
spin_lock(&cifs_tcp_ses_lock);
|
||||
list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
|
||||
if (ses->Suid != smb2hdr->SessionId)
|
||||
if (ses->Suid != ses_id)
|
||||
continue;
|
||||
spin_unlock(&cifs_tcp_ses_lock);
|
||||
return ses;
|
||||
}
|
||||
spin_unlock(&cifs_tcp_ses_lock);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct cifs_ses *
|
||||
smb2_find_smb_ses(struct TCP_Server_Info *server, __u64 ses_id)
|
||||
{
|
||||
struct cifs_ses *ses;
|
||||
|
||||
spin_lock(&cifs_tcp_ses_lock);
|
||||
ses = smb2_find_smb_ses_unlocked(server, ses_id);
|
||||
spin_unlock(&cifs_tcp_ses_lock);
|
||||
|
||||
return ses;
|
||||
}
|
||||
|
||||
static struct cifs_tcon *
|
||||
smb2_find_smb_sess_tcon_unlocked(struct cifs_ses *ses, __u32 tid)
|
||||
{
|
||||
struct cifs_tcon *tcon;
|
||||
|
||||
list_for_each_entry(tcon, &ses->tcon_list, tcon_list) {
|
||||
if (tcon->tid != tid)
|
||||
continue;
|
||||
++tcon->tc_count;
|
||||
return tcon;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Obtain tcon corresponding to the tid in the given
|
||||
* cifs_ses
|
||||
*/
|
||||
|
||||
struct cifs_tcon *
|
||||
smb2_find_smb_tcon(struct TCP_Server_Info *server, __u64 ses_id, __u32 tid)
|
||||
{
|
||||
struct cifs_ses *ses;
|
||||
struct cifs_tcon *tcon;
|
||||
|
||||
spin_lock(&cifs_tcp_ses_lock);
|
||||
ses = smb2_find_smb_ses_unlocked(server, ses_id);
|
||||
if (!ses) {
|
||||
spin_unlock(&cifs_tcp_ses_lock);
|
||||
return NULL;
|
||||
}
|
||||
tcon = smb2_find_smb_sess_tcon_unlocked(ses, tid);
|
||||
spin_unlock(&cifs_tcp_ses_lock);
|
||||
|
||||
return tcon;
|
||||
}
|
||||
|
||||
int
|
||||
smb2_calc_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server)
|
||||
|
|
@ -143,7 +189,7 @@ smb2_calc_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server)
|
|||
struct smb2_hdr *smb2_pdu = (struct smb2_hdr *)iov[0].iov_base;
|
||||
struct cifs_ses *ses;
|
||||
|
||||
ses = smb2_find_smb_ses(smb2_pdu, server);
|
||||
ses = smb2_find_smb_ses(server, smb2_pdu->SessionId);
|
||||
if (!ses) {
|
||||
cifs_dbg(VFS, "%s: Could not find session\n", __func__);
|
||||
return 0;
|
||||
|
|
@ -314,7 +360,7 @@ smb3_calc_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server)
|
|||
struct smb2_hdr *smb2_pdu = (struct smb2_hdr *)iov[0].iov_base;
|
||||
struct cifs_ses *ses;
|
||||
|
||||
ses = smb2_find_smb_ses(smb2_pdu, server);
|
||||
ses = smb2_find_smb_ses(server, smb2_pdu->SessionId);
|
||||
if (!ses) {
|
||||
cifs_dbg(VFS, "%s: Could not find session\n", __func__);
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -786,9 +786,11 @@ SendReceive2(const unsigned int xid, struct cifs_ses *ses,
|
|||
|
||||
rc = wait_for_response(ses->server, midQ);
|
||||
if (rc != 0) {
|
||||
cifs_dbg(FYI, "Cancelling wait for mid %llu\n", midQ->mid);
|
||||
send_cancel(ses->server, buf, midQ);
|
||||
spin_lock(&GlobalMid_Lock);
|
||||
if (midQ->mid_state == MID_REQUEST_SUBMITTED) {
|
||||
midQ->mid_flags |= MID_WAIT_CANCELLED;
|
||||
midQ->callback = DeleteMidQEntry;
|
||||
spin_unlock(&GlobalMid_Lock);
|
||||
cifs_small_buf_release(buf);
|
||||
|
|
|
|||
|
|
@ -34,6 +34,7 @@
|
|||
#include <linux/random.h>
|
||||
#include <linux/scatterlist.h>
|
||||
#include <linux/spinlock_types.h>
|
||||
#include <linux/namei.h>
|
||||
|
||||
#include "ext4_extents.h"
|
||||
#include "xattr.h"
|
||||
|
|
@ -469,3 +470,61 @@ uint32_t ext4_validate_encryption_key_size(uint32_t mode, uint32_t size)
|
|||
return size;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Validate dentries for encrypted directories to make sure we aren't
|
||||
* potentially caching stale data after a key has been added or
|
||||
* removed.
|
||||
*/
|
||||
static int ext4_d_revalidate(struct dentry *dentry, unsigned int flags)
|
||||
{
|
||||
struct dentry *dir;
|
||||
struct ext4_crypt_info *ci;
|
||||
int dir_has_key, cached_with_key;
|
||||
|
||||
if (flags & LOOKUP_RCU)
|
||||
return -ECHILD;
|
||||
|
||||
dir = dget_parent(dentry);
|
||||
if (!ext4_encrypted_inode(d_inode(dir))) {
|
||||
dput(dir);
|
||||
return 0;
|
||||
}
|
||||
ci = EXT4_I(d_inode(dir))->i_crypt_info;
|
||||
|
||||
/* this should eventually be an flag in d_flags */
|
||||
cached_with_key = dentry->d_fsdata != NULL;
|
||||
dir_has_key = (ci != NULL);
|
||||
dput(dir);
|
||||
|
||||
/*
|
||||
* If the dentry was cached without the key, and it is a
|
||||
* negative dentry, it might be a valid name. We can't check
|
||||
* if the key has since been made available due to locking
|
||||
* reasons, so we fail the validation so ext4_lookup() can do
|
||||
* this check.
|
||||
*
|
||||
* We also fail the validation if the dentry was created with
|
||||
* the key present, but we no longer have the key, or vice versa.
|
||||
*/
|
||||
if ((!cached_with_key && d_is_negative(dentry)) ||
|
||||
(!cached_with_key && dir_has_key) ||
|
||||
(cached_with_key && !dir_has_key)) {
|
||||
#if 0 /* Revalidation debug */
|
||||
char buf[80];
|
||||
char *cp = simple_dname(dentry, buf, sizeof(buf));
|
||||
|
||||
if (IS_ERR(cp))
|
||||
cp = (char *) "???";
|
||||
pr_err("revalidate: %s %p %d %d %d\n", cp, dentry->d_fsdata,
|
||||
cached_with_key, d_is_negative(dentry),
|
||||
dir_has_key);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
const struct dentry_operations ext4_encrypted_d_ops = {
|
||||
.d_revalidate = ext4_d_revalidate,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -111,6 +111,12 @@ static int ext4_readdir(struct file *file, struct dir_context *ctx)
|
|||
int dir_has_error = 0;
|
||||
struct ext4_str fname_crypto_str = {.name = NULL, .len = 0};
|
||||
|
||||
if (ext4_encrypted_inode(inode)) {
|
||||
err = ext4_get_encryption_info(inode);
|
||||
if (err && err != -ENOKEY)
|
||||
return err;
|
||||
}
|
||||
|
||||
if (is_dx_dir(inode)) {
|
||||
err = ext4_dx_readdir(file, ctx);
|
||||
if (err != ERR_BAD_DX_DIR) {
|
||||
|
|
|
|||
|
|
@ -2268,6 +2268,7 @@ struct page *ext4_encrypt(struct inode *inode,
|
|||
struct page *plaintext_page);
|
||||
int ext4_decrypt(struct page *page);
|
||||
int ext4_encrypted_zeroout(struct inode *inode, struct ext4_extent *ex);
|
||||
extern const struct dentry_operations ext4_encrypted_d_ops;
|
||||
|
||||
#ifdef CONFIG_EXT4_FS_ENCRYPTION
|
||||
int ext4_init_crypto(void);
|
||||
|
|
|
|||
|
|
@ -622,6 +622,9 @@ long ext4_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
|||
struct ext4_encryption_policy policy;
|
||||
int err = 0;
|
||||
|
||||
if (!ext4_has_feature_encrypt(sb))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (copy_from_user(&policy,
|
||||
(struct ext4_encryption_policy __user *)arg,
|
||||
sizeof(policy))) {
|
||||
|
|
|
|||
|
|
@ -1557,6 +1557,24 @@ static struct dentry *ext4_lookup(struct inode *dir, struct dentry *dentry, unsi
|
|||
struct ext4_dir_entry_2 *de;
|
||||
struct buffer_head *bh;
|
||||
|
||||
if (ext4_encrypted_inode(dir)) {
|
||||
int res = ext4_get_encryption_info(dir);
|
||||
|
||||
/*
|
||||
* This should be a properly defined flag for
|
||||
* dentry->d_flags when we uplift this to the VFS.
|
||||
* d_fsdata is set to (void *) 1 if if the dentry is
|
||||
* created while the directory was encrypted and we
|
||||
* don't have access to the key.
|
||||
*/
|
||||
dentry->d_fsdata = NULL;
|
||||
if (ext4_encryption_info(dir))
|
||||
dentry->d_fsdata = (void *) 1;
|
||||
d_set_d_op(dentry, &ext4_encrypted_d_ops);
|
||||
if (res && res != -ENOKEY)
|
||||
return ERR_PTR(res);
|
||||
}
|
||||
|
||||
if (dentry->d_name.len > EXT4_NAME_LEN)
|
||||
return ERR_PTR(-ENAMETOOLONG);
|
||||
|
||||
|
|
|
|||
|
|
@ -233,6 +233,27 @@ ext4_xattr_check_block(struct inode *inode, struct buffer_head *bh)
|
|||
return error;
|
||||
}
|
||||
|
||||
static int
|
||||
__xattr_check_inode(struct inode *inode, struct ext4_xattr_ibody_header *header,
|
||||
void *end, const char *function, unsigned int line)
|
||||
{
|
||||
struct ext4_xattr_entry *entry = IFIRST(header);
|
||||
int error = -EFSCORRUPTED;
|
||||
|
||||
if (((void *) header >= end) ||
|
||||
(header->h_magic != le32_to_cpu(EXT4_XATTR_MAGIC)))
|
||||
goto errout;
|
||||
error = ext4_xattr_check_names(entry, end, entry);
|
||||
errout:
|
||||
if (error)
|
||||
__ext4_error_inode(inode, function, line, 0,
|
||||
"corrupted in-inode xattr");
|
||||
return error;
|
||||
}
|
||||
|
||||
#define xattr_check_inode(inode, header, end) \
|
||||
__xattr_check_inode((inode), (header), (end), __func__, __LINE__)
|
||||
|
||||
static inline int
|
||||
ext4_xattr_check_entry(struct ext4_xattr_entry *entry, size_t size)
|
||||
{
|
||||
|
|
@ -344,7 +365,7 @@ ext4_xattr_ibody_get(struct inode *inode, int name_index, const char *name,
|
|||
header = IHDR(inode, raw_inode);
|
||||
entry = IFIRST(header);
|
||||
end = (void *)raw_inode + EXT4_SB(inode->i_sb)->s_inode_size;
|
||||
error = ext4_xattr_check_names(entry, end, entry);
|
||||
error = xattr_check_inode(inode, header, end);
|
||||
if (error)
|
||||
goto cleanup;
|
||||
error = ext4_xattr_find_entry(&entry, name_index, name,
|
||||
|
|
@ -475,7 +496,7 @@ ext4_xattr_ibody_list(struct dentry *dentry, char *buffer, size_t buffer_size)
|
|||
raw_inode = ext4_raw_inode(&iloc);
|
||||
header = IHDR(inode, raw_inode);
|
||||
end = (void *)raw_inode + EXT4_SB(inode->i_sb)->s_inode_size;
|
||||
error = ext4_xattr_check_names(IFIRST(header), end, IFIRST(header));
|
||||
error = xattr_check_inode(inode, header, end);
|
||||
if (error)
|
||||
goto cleanup;
|
||||
error = ext4_xattr_list_entries(dentry, IFIRST(header),
|
||||
|
|
@ -991,8 +1012,7 @@ int ext4_xattr_ibody_find(struct inode *inode, struct ext4_xattr_info *i,
|
|||
is->s.here = is->s.first;
|
||||
is->s.end = (void *)raw_inode + EXT4_SB(inode->i_sb)->s_inode_size;
|
||||
if (ext4_test_inode_state(inode, EXT4_STATE_XATTR)) {
|
||||
error = ext4_xattr_check_names(IFIRST(header), is->s.end,
|
||||
IFIRST(header));
|
||||
error = xattr_check_inode(inode, header, is->s.end);
|
||||
if (error)
|
||||
return error;
|
||||
/* Find the named attribute. */
|
||||
|
|
@ -1293,6 +1313,10 @@ int ext4_expand_extra_isize_ea(struct inode *inode, int new_extra_isize,
|
|||
last = entry;
|
||||
total_ino = sizeof(struct ext4_xattr_ibody_header);
|
||||
|
||||
error = xattr_check_inode(inode, header, end);
|
||||
if (error)
|
||||
goto cleanup;
|
||||
|
||||
free = ext4_xattr_free_space(last, &min_offs, base, &total_ino);
|
||||
if (free >= isize_diff) {
|
||||
entry = IFIRST(header);
|
||||
|
|
|
|||
105
fs/f2fs/super.c
105
fs/f2fs/super.c
|
|
@ -918,6 +918,79 @@ static loff_t max_file_size(unsigned bits)
|
|||
return result;
|
||||
}
|
||||
|
||||
static inline bool sanity_check_area_boundary(struct super_block *sb,
|
||||
struct f2fs_super_block *raw_super)
|
||||
{
|
||||
u32 segment0_blkaddr = le32_to_cpu(raw_super->segment0_blkaddr);
|
||||
u32 cp_blkaddr = le32_to_cpu(raw_super->cp_blkaddr);
|
||||
u32 sit_blkaddr = le32_to_cpu(raw_super->sit_blkaddr);
|
||||
u32 nat_blkaddr = le32_to_cpu(raw_super->nat_blkaddr);
|
||||
u32 ssa_blkaddr = le32_to_cpu(raw_super->ssa_blkaddr);
|
||||
u32 main_blkaddr = le32_to_cpu(raw_super->main_blkaddr);
|
||||
u32 segment_count_ckpt = le32_to_cpu(raw_super->segment_count_ckpt);
|
||||
u32 segment_count_sit = le32_to_cpu(raw_super->segment_count_sit);
|
||||
u32 segment_count_nat = le32_to_cpu(raw_super->segment_count_nat);
|
||||
u32 segment_count_ssa = le32_to_cpu(raw_super->segment_count_ssa);
|
||||
u32 segment_count_main = le32_to_cpu(raw_super->segment_count_main);
|
||||
u32 segment_count = le32_to_cpu(raw_super->segment_count);
|
||||
u32 log_blocks_per_seg = le32_to_cpu(raw_super->log_blocks_per_seg);
|
||||
|
||||
if (segment0_blkaddr != cp_blkaddr) {
|
||||
f2fs_msg(sb, KERN_INFO,
|
||||
"Mismatch start address, segment0(%u) cp_blkaddr(%u)",
|
||||
segment0_blkaddr, cp_blkaddr);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (cp_blkaddr + (segment_count_ckpt << log_blocks_per_seg) !=
|
||||
sit_blkaddr) {
|
||||
f2fs_msg(sb, KERN_INFO,
|
||||
"Wrong CP boundary, start(%u) end(%u) blocks(%u)",
|
||||
cp_blkaddr, sit_blkaddr,
|
||||
segment_count_ckpt << log_blocks_per_seg);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (sit_blkaddr + (segment_count_sit << log_blocks_per_seg) !=
|
||||
nat_blkaddr) {
|
||||
f2fs_msg(sb, KERN_INFO,
|
||||
"Wrong SIT boundary, start(%u) end(%u) blocks(%u)",
|
||||
sit_blkaddr, nat_blkaddr,
|
||||
segment_count_sit << log_blocks_per_seg);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (nat_blkaddr + (segment_count_nat << log_blocks_per_seg) !=
|
||||
ssa_blkaddr) {
|
||||
f2fs_msg(sb, KERN_INFO,
|
||||
"Wrong NAT boundary, start(%u) end(%u) blocks(%u)",
|
||||
nat_blkaddr, ssa_blkaddr,
|
||||
segment_count_nat << log_blocks_per_seg);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (ssa_blkaddr + (segment_count_ssa << log_blocks_per_seg) !=
|
||||
main_blkaddr) {
|
||||
f2fs_msg(sb, KERN_INFO,
|
||||
"Wrong SSA boundary, start(%u) end(%u) blocks(%u)",
|
||||
ssa_blkaddr, main_blkaddr,
|
||||
segment_count_ssa << log_blocks_per_seg);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (main_blkaddr + (segment_count_main << log_blocks_per_seg) !=
|
||||
segment0_blkaddr + (segment_count << log_blocks_per_seg)) {
|
||||
f2fs_msg(sb, KERN_INFO,
|
||||
"Wrong MAIN_AREA boundary, start(%u) end(%u) blocks(%u)",
|
||||
main_blkaddr,
|
||||
segment0_blkaddr + (segment_count << log_blocks_per_seg),
|
||||
segment_count_main << log_blocks_per_seg);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static int sanity_check_raw_super(struct super_block *sb,
|
||||
struct f2fs_super_block *raw_super)
|
||||
{
|
||||
|
|
@ -947,6 +1020,14 @@ static int sanity_check_raw_super(struct super_block *sb,
|
|||
return 1;
|
||||
}
|
||||
|
||||
/* check log blocks per segment */
|
||||
if (le32_to_cpu(raw_super->log_blocks_per_seg) != 9) {
|
||||
f2fs_msg(sb, KERN_INFO,
|
||||
"Invalid log blocks per segment (%u)\n",
|
||||
le32_to_cpu(raw_super->log_blocks_per_seg));
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Currently, support 512/1024/2048/4096 bytes sector size */
|
||||
if (le32_to_cpu(raw_super->log_sectorsize) >
|
||||
F2FS_MAX_LOG_SECTOR_SIZE ||
|
||||
|
|
@ -965,6 +1046,30 @@ static int sanity_check_raw_super(struct super_block *sb,
|
|||
le32_to_cpu(raw_super->log_sectorsize));
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* check reserved ino info */
|
||||
if (le32_to_cpu(raw_super->node_ino) != 1 ||
|
||||
le32_to_cpu(raw_super->meta_ino) != 2 ||
|
||||
le32_to_cpu(raw_super->root_ino) != 3) {
|
||||
f2fs_msg(sb, KERN_INFO,
|
||||
"Invalid Fs Meta Ino: node(%u) meta(%u) root(%u)",
|
||||
le32_to_cpu(raw_super->node_ino),
|
||||
le32_to_cpu(raw_super->meta_ino),
|
||||
le32_to_cpu(raw_super->root_ino));
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (le32_to_cpu(raw_super->segment_count) > F2FS_MAX_SEGMENT) {
|
||||
f2fs_msg(sb, KERN_INFO,
|
||||
"Invalid segment count (%u)",
|
||||
le32_to_cpu(raw_super->segment_count));
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* check CP/SIT/NAT/SSA/MAIN_AREA area boundary */
|
||||
if (sanity_check_area_boundary(sb, raw_super))
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -358,6 +358,7 @@ nfs3svc_decode_writeargs(struct svc_rqst *rqstp, __be32 *p,
|
|||
{
|
||||
unsigned int len, v, hdr, dlen;
|
||||
u32 max_blocksize = svc_max_payload(rqstp);
|
||||
struct kvec *head = rqstp->rq_arg.head;
|
||||
|
||||
p = decode_fh(p, &args->fh);
|
||||
if (!p)
|
||||
|
|
@ -367,6 +368,8 @@ nfs3svc_decode_writeargs(struct svc_rqst *rqstp, __be32 *p,
|
|||
args->count = ntohl(*p++);
|
||||
args->stable = ntohl(*p++);
|
||||
len = args->len = ntohl(*p++);
|
||||
if ((void *)p > head->iov_base + head->iov_len)
|
||||
return 0;
|
||||
/*
|
||||
* The count must equal the amount of data passed.
|
||||
*/
|
||||
|
|
@ -377,9 +380,8 @@ nfs3svc_decode_writeargs(struct svc_rqst *rqstp, __be32 *p,
|
|||
* Check to make sure that we got the right number of
|
||||
* bytes.
|
||||
*/
|
||||
hdr = (void*)p - rqstp->rq_arg.head[0].iov_base;
|
||||
dlen = rqstp->rq_arg.head[0].iov_len + rqstp->rq_arg.page_len
|
||||
- hdr;
|
||||
hdr = (void*)p - head->iov_base;
|
||||
dlen = head->iov_len + rqstp->rq_arg.page_len - hdr;
|
||||
/*
|
||||
* Round the length of the data which was specified up to
|
||||
* the next multiple of XDR units and then compare that
|
||||
|
|
@ -396,7 +398,7 @@ nfs3svc_decode_writeargs(struct svc_rqst *rqstp, __be32 *p,
|
|||
len = args->len = max_blocksize;
|
||||
}
|
||||
rqstp->rq_vec[0].iov_base = (void*)p;
|
||||
rqstp->rq_vec[0].iov_len = rqstp->rq_arg.head[0].iov_len - hdr;
|
||||
rqstp->rq_vec[0].iov_len = head->iov_len - hdr;
|
||||
v = 0;
|
||||
while (len > rqstp->rq_vec[v].iov_len) {
|
||||
len -= rqstp->rq_vec[v].iov_len;
|
||||
|
|
@ -471,6 +473,8 @@ nfs3svc_decode_symlinkargs(struct svc_rqst *rqstp, __be32 *p,
|
|||
/* first copy and check from the first page */
|
||||
old = (char*)p;
|
||||
vec = &rqstp->rq_arg.head[0];
|
||||
if ((void *)old > vec->iov_base + vec->iov_len)
|
||||
return 0;
|
||||
avail = vec->iov_len - (old - (char*)vec->iov_base);
|
||||
while (len && avail && *old) {
|
||||
*new++ = *old++;
|
||||
|
|
|
|||
|
|
@ -656,6 +656,37 @@ static __be32 map_new_errors(u32 vers, __be32 nfserr)
|
|||
return nfserr;
|
||||
}
|
||||
|
||||
/*
|
||||
* A write procedure can have a large argument, and a read procedure can
|
||||
* have a large reply, but no NFSv2 or NFSv3 procedure has argument and
|
||||
* reply that can both be larger than a page. The xdr code has taken
|
||||
* advantage of this assumption to be a sloppy about bounds checking in
|
||||
* some cases. Pending a rewrite of the NFSv2/v3 xdr code to fix that
|
||||
* problem, we enforce these assumptions here:
|
||||
*/
|
||||
static bool nfs_request_too_big(struct svc_rqst *rqstp,
|
||||
struct svc_procedure *proc)
|
||||
{
|
||||
/*
|
||||
* The ACL code has more careful bounds-checking and is not
|
||||
* susceptible to this problem:
|
||||
*/
|
||||
if (rqstp->rq_prog != NFS_PROGRAM)
|
||||
return false;
|
||||
/*
|
||||
* Ditto NFSv4 (which can in theory have argument and reply both
|
||||
* more than a page):
|
||||
*/
|
||||
if (rqstp->rq_vers >= 4)
|
||||
return false;
|
||||
/* The reply will be small, we're OK: */
|
||||
if (proc->pc_xdrressize > 0 &&
|
||||
proc->pc_xdrressize < XDR_QUADLEN(PAGE_SIZE))
|
||||
return false;
|
||||
|
||||
return rqstp->rq_arg.len > PAGE_SIZE;
|
||||
}
|
||||
|
||||
int
|
||||
nfsd_dispatch(struct svc_rqst *rqstp, __be32 *statp)
|
||||
{
|
||||
|
|
@ -668,6 +699,11 @@ nfsd_dispatch(struct svc_rqst *rqstp, __be32 *statp)
|
|||
rqstp->rq_vers, rqstp->rq_proc);
|
||||
proc = rqstp->rq_procinfo;
|
||||
|
||||
if (nfs_request_too_big(rqstp, proc)) {
|
||||
dprintk("nfsd: NFSv%d argument too large\n", rqstp->rq_vers);
|
||||
*statp = rpc_garbage_args;
|
||||
return 1;
|
||||
}
|
||||
/*
|
||||
* Give the xdr decoder a chance to change this if it wants
|
||||
* (necessary in the NFSv4.0 compound case)
|
||||
|
|
|
|||
|
|
@ -280,6 +280,7 @@ nfssvc_decode_writeargs(struct svc_rqst *rqstp, __be32 *p,
|
|||
struct nfsd_writeargs *args)
|
||||
{
|
||||
unsigned int len, hdr, dlen;
|
||||
struct kvec *head = rqstp->rq_arg.head;
|
||||
int v;
|
||||
|
||||
p = decode_fh(p, &args->fh);
|
||||
|
|
@ -300,9 +301,10 @@ nfssvc_decode_writeargs(struct svc_rqst *rqstp, __be32 *p,
|
|||
* Check to make sure that we got the right number of
|
||||
* bytes.
|
||||
*/
|
||||
hdr = (void*)p - rqstp->rq_arg.head[0].iov_base;
|
||||
dlen = rqstp->rq_arg.head[0].iov_len + rqstp->rq_arg.page_len
|
||||
- hdr;
|
||||
hdr = (void*)p - head->iov_base;
|
||||
if (hdr > head->iov_len)
|
||||
return 0;
|
||||
dlen = head->iov_len + rqstp->rq_arg.page_len - hdr;
|
||||
|
||||
/*
|
||||
* Round the length of the data which was specified up to
|
||||
|
|
@ -316,7 +318,7 @@ nfssvc_decode_writeargs(struct svc_rqst *rqstp, __be32 *p,
|
|||
return 0;
|
||||
|
||||
rqstp->rq_vec[0].iov_base = (void*)p;
|
||||
rqstp->rq_vec[0].iov_len = rqstp->rq_arg.head[0].iov_len - hdr;
|
||||
rqstp->rq_vec[0].iov_len = head->iov_len - hdr;
|
||||
v = 0;
|
||||
while (len > rqstp->rq_vec[v].iov_len) {
|
||||
len -= rqstp->rq_vec[v].iov_len;
|
||||
|
|
|
|||
17
fs/timerfd.c
17
fs/timerfd.c
|
|
@ -40,6 +40,7 @@ struct timerfd_ctx {
|
|||
short unsigned settime_flags; /* to show in fdinfo */
|
||||
struct rcu_head rcu;
|
||||
struct list_head clist;
|
||||
spinlock_t cancel_lock;
|
||||
bool might_cancel;
|
||||
};
|
||||
|
||||
|
|
@ -112,7 +113,7 @@ void timerfd_clock_was_set(void)
|
|||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
static void timerfd_remove_cancel(struct timerfd_ctx *ctx)
|
||||
static void __timerfd_remove_cancel(struct timerfd_ctx *ctx)
|
||||
{
|
||||
if (ctx->might_cancel) {
|
||||
ctx->might_cancel = false;
|
||||
|
|
@ -122,6 +123,13 @@ static void timerfd_remove_cancel(struct timerfd_ctx *ctx)
|
|||
}
|
||||
}
|
||||
|
||||
static void timerfd_remove_cancel(struct timerfd_ctx *ctx)
|
||||
{
|
||||
spin_lock(&ctx->cancel_lock);
|
||||
__timerfd_remove_cancel(ctx);
|
||||
spin_unlock(&ctx->cancel_lock);
|
||||
}
|
||||
|
||||
static bool timerfd_canceled(struct timerfd_ctx *ctx)
|
||||
{
|
||||
if (!ctx->might_cancel || ctx->moffs.tv64 != KTIME_MAX)
|
||||
|
|
@ -132,6 +140,7 @@ static bool timerfd_canceled(struct timerfd_ctx *ctx)
|
|||
|
||||
static void timerfd_setup_cancel(struct timerfd_ctx *ctx, int flags)
|
||||
{
|
||||
spin_lock(&ctx->cancel_lock);
|
||||
if ((ctx->clockid == CLOCK_REALTIME ||
|
||||
ctx->clockid == CLOCK_REALTIME_ALARM) &&
|
||||
(flags & TFD_TIMER_ABSTIME) && (flags & TFD_TIMER_CANCEL_ON_SET)) {
|
||||
|
|
@ -141,9 +150,10 @@ static void timerfd_setup_cancel(struct timerfd_ctx *ctx, int flags)
|
|||
list_add_rcu(&ctx->clist, &cancel_list);
|
||||
spin_unlock(&cancel_lock);
|
||||
}
|
||||
} else if (ctx->might_cancel) {
|
||||
timerfd_remove_cancel(ctx);
|
||||
} else {
|
||||
__timerfd_remove_cancel(ctx);
|
||||
}
|
||||
spin_unlock(&ctx->cancel_lock);
|
||||
}
|
||||
|
||||
static ktime_t timerfd_get_remaining(struct timerfd_ctx *ctx)
|
||||
|
|
@ -395,6 +405,7 @@ SYSCALL_DEFINE2(timerfd_create, int, clockid, int, flags)
|
|||
return -ENOMEM;
|
||||
|
||||
init_waitqueue_head(&ctx->wqh);
|
||||
spin_lock_init(&ctx->cancel_lock);
|
||||
ctx->clockid = clockid;
|
||||
|
||||
if (isalarm(ctx))
|
||||
|
|
|
|||
|
|
@ -283,6 +283,12 @@ struct f2fs_nat_block {
|
|||
#define SIT_VBLOCK_MAP_SIZE 64
|
||||
#define SIT_ENTRY_PER_BLOCK (PAGE_CACHE_SIZE / sizeof(struct f2fs_sit_entry))
|
||||
|
||||
/*
|
||||
* F2FS uses 4 bytes to represent block address. As a result, supported size of
|
||||
* disk is 16 TB and it equals to 16 * 1024 * 1024 / 2 segments.
|
||||
*/
|
||||
#define F2FS_MAX_SEGMENT ((16 * 1024 * 1024) / 2)
|
||||
|
||||
/*
|
||||
* Note that f2fs_sit_entry->vblocks has the following bit-field information.
|
||||
* [15:10] : allocation type such as CURSEG_XXXX_TYPE
|
||||
|
|
|
|||
|
|
@ -742,11 +742,9 @@ static inline void part_nr_sects_write(struct hd_struct *part, sector_t size)
|
|||
#if defined(CONFIG_BLK_DEV_INTEGRITY)
|
||||
extern void blk_integrity_add(struct gendisk *);
|
||||
extern void blk_integrity_del(struct gendisk *);
|
||||
extern void blk_integrity_revalidate(struct gendisk *);
|
||||
#else /* CONFIG_BLK_DEV_INTEGRITY */
|
||||
static inline void blk_integrity_add(struct gendisk *disk) { }
|
||||
static inline void blk_integrity_del(struct gendisk *disk) { }
|
||||
static inline void blk_integrity_revalidate(struct gendisk *disk) { }
|
||||
#endif /* CONFIG_BLK_DEV_INTEGRITY */
|
||||
|
||||
#else /* CONFIG_BLOCK */
|
||||
|
|
|
|||
|
|
@ -122,18 +122,13 @@
|
|||
#endif
|
||||
|
||||
#ifdef CONFIG_MTD_MAP_BANK_WIDTH_32
|
||||
# ifdef map_bankwidth
|
||||
# undef map_bankwidth
|
||||
# define map_bankwidth(map) ((map)->bankwidth)
|
||||
# undef map_bankwidth_is_large
|
||||
# define map_bankwidth_is_large(map) (map_bankwidth(map) > BITS_PER_LONG/8)
|
||||
# undef map_words
|
||||
# define map_words(map) map_calc_words(map)
|
||||
# else
|
||||
# define map_bankwidth(map) 32
|
||||
# define map_bankwidth_is_large(map) (1)
|
||||
# define map_words(map) map_calc_words(map)
|
||||
# endif
|
||||
/* always use indirect access for 256-bit to preserve kernel stack */
|
||||
# undef map_bankwidth
|
||||
# define map_bankwidth(map) ((map)->bankwidth)
|
||||
# undef map_bankwidth_is_large
|
||||
# define map_bankwidth_is_large(map) (map_bankwidth(map) > BITS_PER_LONG/8)
|
||||
# undef map_words
|
||||
# define map_words(map) map_calc_words(map)
|
||||
#define map_bankwidth_is_32(map) (map_bankwidth(map) == 32)
|
||||
#undef MAX_MAP_BANKWIDTH
|
||||
#define MAX_MAP_BANKWIDTH 32
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user