mirror of
https://github.com/hardkernel/linux.git
synced 2026-03-24 19:40:21 +09:00
Merge tag 'v3.10.56' of git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable into odroidxu3-3.10.y
This is the 3.10.56 stable release Conflicts: drivers/gpu/drm/i915/intel_ringbuffer.c drivers/md/dm-crypt.c drivers/usb/dwc3/core.c Change-Id: I54e3e7fca5a5466b788cac554abb7978de032ec0
This commit is contained in:
2
Makefile
2
Makefile
@@ -1,6 +1,6 @@
|
||||
VERSION = 3
|
||||
PATCHLEVEL = 10
|
||||
SUBLEVEL = 55
|
||||
SUBLEVEL = 56
|
||||
EXTRAVERSION =
|
||||
NAME = TOSSUG Baby Fish
|
||||
|
||||
|
||||
@@ -48,6 +48,8 @@ CONFIG_SERIAL_SIRFSOC=y
|
||||
CONFIG_SERIAL_SIRFSOC_CONSOLE=y
|
||||
CONFIG_SERIAL_VT8500=y
|
||||
CONFIG_SERIAL_VT8500_CONSOLE=y
|
||||
CONFIG_SERIAL_XILINX_PS_UART=y
|
||||
CONFIG_SERIAL_XILINX_PS_UART_CONSOLE=y
|
||||
CONFIG_IPMI_HANDLER=y
|
||||
CONFIG_IPMI_SI=y
|
||||
CONFIG_I2C=y
|
||||
|
||||
@@ -362,6 +362,16 @@ ENTRY(vector_swi)
|
||||
str r0, [sp, #S_OLD_R0] @ Save OLD_R0
|
||||
zero_fp
|
||||
|
||||
#ifdef CONFIG_ALIGNMENT_TRAP
|
||||
ldr ip, __cr_alignment
|
||||
ldr ip, [ip]
|
||||
mcr p15, 0, ip, c1, c0 @ update control register
|
||||
#endif
|
||||
|
||||
enable_irq
|
||||
ct_user_exit
|
||||
get_thread_info tsk
|
||||
|
||||
/*
|
||||
* Get the system call number.
|
||||
*/
|
||||
@@ -375,9 +385,9 @@ ENTRY(vector_swi)
|
||||
#ifdef CONFIG_ARM_THUMB
|
||||
tst r8, #PSR_T_BIT
|
||||
movne r10, #0 @ no thumb OABI emulation
|
||||
ldreq r10, [lr, #-4] @ get SWI instruction
|
||||
USER( ldreq r10, [lr, #-4] ) @ get SWI instruction
|
||||
#else
|
||||
ldr r10, [lr, #-4] @ get SWI instruction
|
||||
USER( ldr r10, [lr, #-4] ) @ get SWI instruction
|
||||
#endif
|
||||
#ifdef CONFIG_CPU_ENDIAN_BE8
|
||||
rev r10, r10 @ little endian instruction
|
||||
@@ -392,22 +402,13 @@ ENTRY(vector_swi)
|
||||
/* Legacy ABI only, possibly thumb mode. */
|
||||
tst r8, #PSR_T_BIT @ this is SPSR from save_user_regs
|
||||
addne scno, r7, #__NR_SYSCALL_BASE @ put OS number in
|
||||
ldreq scno, [lr, #-4]
|
||||
USER( ldreq scno, [lr, #-4] )
|
||||
|
||||
#else
|
||||
/* Legacy ABI only. */
|
||||
ldr scno, [lr, #-4] @ get SWI instruction
|
||||
USER( ldr scno, [lr, #-4] ) @ get SWI instruction
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ALIGNMENT_TRAP
|
||||
ldr ip, __cr_alignment
|
||||
ldr ip, [ip]
|
||||
mcr p15, 0, ip, c1, c0 @ update control register
|
||||
#endif
|
||||
enable_irq
|
||||
ct_user_exit
|
||||
|
||||
get_thread_info tsk
|
||||
adr tbl, sys_call_table @ load syscall table pointer
|
||||
|
||||
#if defined(CONFIG_OABI_COMPAT)
|
||||
@@ -442,6 +443,21 @@ local_restart:
|
||||
eor r0, scno, #__NR_SYSCALL_BASE @ put OS number back
|
||||
bcs arm_syscall
|
||||
b sys_ni_syscall @ not private func
|
||||
|
||||
#if defined(CONFIG_OABI_COMPAT) || !defined(CONFIG_AEABI)
|
||||
/*
|
||||
* We failed to handle a fault trying to access the page
|
||||
* containing the swi instruction, but we're not really in a
|
||||
* position to return -EFAULT. Instead, return back to the
|
||||
* instruction and re-enter the user fault handling path trying
|
||||
* to page it in. This will likely result in sending SEGV to the
|
||||
* current task.
|
||||
*/
|
||||
9001:
|
||||
sub lr, lr, #4
|
||||
str lr, [sp, #S_PC]
|
||||
b ret_fast_syscall
|
||||
#endif
|
||||
ENDPROC(vector_swi)
|
||||
|
||||
/*
|
||||
|
||||
@@ -163,7 +163,7 @@ static bool migrate_one_irq(struct irq_desc *desc)
|
||||
c = irq_data_get_irq_chip(d);
|
||||
if (!c->irq_set_affinity)
|
||||
pr_debug("IRQ%u: unable to set affinity\n", d->irq);
|
||||
else if (c->irq_set_affinity(d, affinity, true) == IRQ_SET_MASK_OK && ret)
|
||||
else if (c->irq_set_affinity(d, affinity, false) == IRQ_SET_MASK_OK && ret)
|
||||
cpumask_copy(d->affinity, affinity);
|
||||
|
||||
return ret;
|
||||
|
||||
@@ -14,10 +14,11 @@
|
||||
#include <asm/pgalloc.h>
|
||||
#include <asm/mmu_context.h>
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/fncpy.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/system_misc.h>
|
||||
|
||||
extern const unsigned char relocate_new_kernel[];
|
||||
extern void relocate_new_kernel(void);
|
||||
extern const unsigned int relocate_new_kernel_size;
|
||||
|
||||
extern unsigned long kexec_start_address;
|
||||
@@ -133,6 +134,8 @@ void machine_kexec(struct kimage *image)
|
||||
{
|
||||
unsigned long page_list;
|
||||
unsigned long reboot_code_buffer_phys;
|
||||
unsigned long reboot_entry = (unsigned long)relocate_new_kernel;
|
||||
unsigned long reboot_entry_phys;
|
||||
void *reboot_code_buffer;
|
||||
|
||||
if (num_online_cpus() > 1) {
|
||||
@@ -156,18 +159,18 @@ void machine_kexec(struct kimage *image)
|
||||
|
||||
|
||||
/* copy our kernel relocation code to the control code page */
|
||||
memcpy(reboot_code_buffer,
|
||||
relocate_new_kernel, relocate_new_kernel_size);
|
||||
reboot_entry = fncpy(reboot_code_buffer,
|
||||
reboot_entry,
|
||||
relocate_new_kernel_size);
|
||||
reboot_entry_phys = (unsigned long)reboot_entry +
|
||||
(reboot_code_buffer_phys - (unsigned long)reboot_code_buffer);
|
||||
|
||||
|
||||
flush_icache_range((unsigned long) reboot_code_buffer,
|
||||
(unsigned long) reboot_code_buffer + KEXEC_CONTROL_PAGE_SIZE);
|
||||
printk(KERN_INFO "Bye!\n");
|
||||
|
||||
if (kexec_reinit)
|
||||
kexec_reinit();
|
||||
|
||||
soft_restart(reboot_code_buffer_phys);
|
||||
soft_restart(reboot_entry_phys);
|
||||
}
|
||||
|
||||
void arch_crash_save_vmcoreinfo(void)
|
||||
|
||||
@@ -2,10 +2,12 @@
|
||||
* relocate_kernel.S - put the kernel image in place to boot
|
||||
*/
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/kexec.h>
|
||||
|
||||
.globl relocate_new_kernel
|
||||
relocate_new_kernel:
|
||||
.align 3 /* not needed for this code, but keeps fncpy() happy */
|
||||
|
||||
ENTRY(relocate_new_kernel)
|
||||
|
||||
ldr r0,kexec_indirection_page
|
||||
ldr r1,kexec_start_address
|
||||
@@ -79,6 +81,8 @@ kexec_mach_type:
|
||||
kexec_boot_atags:
|
||||
.long 0x0
|
||||
|
||||
ENDPROC(relocate_new_kernel)
|
||||
|
||||
relocate_new_kernel_end:
|
||||
|
||||
.globl relocate_new_kernel_size
|
||||
|
||||
@@ -17,12 +17,6 @@
|
||||
*/
|
||||
.align 5
|
||||
ENTRY(v6_early_abort)
|
||||
#ifdef CONFIG_CPU_V6
|
||||
sub r1, sp, #4 @ Get unused stack location
|
||||
strex r0, r1, [r1] @ Clear the exclusive monitor
|
||||
#elif defined(CONFIG_CPU_32v6K)
|
||||
clrex
|
||||
#endif
|
||||
mrc p15, 0, r1, c5, c0, 0 @ get FSR
|
||||
mrc p15, 0, r0, c6, c0, 0 @ get FAR
|
||||
/*
|
||||
|
||||
@@ -13,12 +13,6 @@
|
||||
*/
|
||||
.align 5
|
||||
ENTRY(v7_early_abort)
|
||||
/*
|
||||
* The effect of data aborts on on the exclusive access monitor are
|
||||
* UNPREDICTABLE. Do a CLREX to clear the state
|
||||
*/
|
||||
clrex
|
||||
|
||||
mrc p15, 0, r1, c5, c0, 0 @ get FSR
|
||||
mrc p15, 0, r0, c6, c0, 0 @ get FAR
|
||||
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
* This code is not portable to processors with late data abort handling.
|
||||
*/
|
||||
#define CODING_BITS(i) (i & 0x0e000000)
|
||||
#define COND_BITS(i) (i & 0xf0000000)
|
||||
|
||||
#define LDST_I_BIT(i) (i & (1 << 26)) /* Immediate constant */
|
||||
#define LDST_P_BIT(i) (i & (1 << 24)) /* Preindex */
|
||||
@@ -812,6 +813,8 @@ do_alignment(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
|
||||
break;
|
||||
|
||||
case 0x04000000: /* ldr or str immediate */
|
||||
if (COND_BITS(instr) == 0xf0000000) /* NEON VLDn, VSTn */
|
||||
goto bad;
|
||||
offset.un = OFFSET_BITS(instr);
|
||||
handler = do_alignment_ldrstr;
|
||||
break;
|
||||
|
||||
@@ -79,7 +79,6 @@ static inline void decode_ctrl_reg(u32 reg,
|
||||
*/
|
||||
#define ARM_MAX_BRP 16
|
||||
#define ARM_MAX_WRP 16
|
||||
#define ARM_MAX_HBP_SLOTS (ARM_MAX_BRP + ARM_MAX_WRP)
|
||||
|
||||
/* Virtual debug register bases. */
|
||||
#define AARCH64_DBG_REG_BVR 0
|
||||
|
||||
@@ -172,9 +172,27 @@ void exit_thread(void)
|
||||
{
|
||||
}
|
||||
|
||||
static void tls_thread_flush(void)
|
||||
{
|
||||
asm ("msr tpidr_el0, xzr");
|
||||
|
||||
if (is_compat_task()) {
|
||||
current->thread.tp_value = 0;
|
||||
|
||||
/*
|
||||
* We need to ensure ordering between the shadow state and the
|
||||
* hardware state, so that we don't corrupt the hardware state
|
||||
* with a stale shadow state during context switch.
|
||||
*/
|
||||
barrier();
|
||||
asm ("msr tpidrro_el0, xzr");
|
||||
}
|
||||
}
|
||||
|
||||
void flush_thread(void)
|
||||
{
|
||||
fpsimd_flush_thread();
|
||||
tls_thread_flush();
|
||||
flush_ptrace_hw_breakpoint(current);
|
||||
}
|
||||
|
||||
|
||||
@@ -103,7 +103,8 @@ static void ptrace_hbptriggered(struct perf_event *bp,
|
||||
break;
|
||||
}
|
||||
}
|
||||
for (i = ARM_MAX_BRP; i < ARM_MAX_HBP_SLOTS && !bp; ++i) {
|
||||
|
||||
for (i = 0; i < ARM_MAX_WRP; ++i) {
|
||||
if (current->thread.debug.hbp_watch[i] == bp) {
|
||||
info.si_errno = -((i << 1) + 1);
|
||||
break;
|
||||
|
||||
@@ -79,6 +79,12 @@ long compat_arm_syscall(struct pt_regs *regs)
|
||||
|
||||
case __ARM_NR_compat_set_tls:
|
||||
current->thread.tp_value = regs->regs[0];
|
||||
|
||||
/*
|
||||
* Protect against register corruption from context switch.
|
||||
* See comment in tls_thread_flush.
|
||||
*/
|
||||
barrier();
|
||||
asm ("msr tpidrro_el0, %0" : : "r" (regs->regs[0]));
|
||||
return 0;
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/string.h>
|
||||
|
||||
#include <asm/addrspace.h>
|
||||
|
||||
|
||||
@@ -123,7 +123,11 @@ NESTED(_mcount, PT_SIZE, ra)
|
||||
nop
|
||||
#endif
|
||||
b ftrace_stub
|
||||
#ifdef CONFIG_32BIT
|
||||
addiu sp, sp, 8
|
||||
#else
|
||||
nop
|
||||
#endif
|
||||
|
||||
static_trace:
|
||||
MCOUNT_SAVE_REGS
|
||||
@@ -133,6 +137,9 @@ static_trace:
|
||||
move a1, AT /* arg2: parent's return address */
|
||||
|
||||
MCOUNT_RESTORE_REGS
|
||||
#ifdef CONFIG_32BIT
|
||||
addiu sp, sp, 8
|
||||
#endif
|
||||
.globl ftrace_stub
|
||||
ftrace_stub:
|
||||
RETURN_BACK
|
||||
@@ -181,6 +188,11 @@ NESTED(ftrace_graph_caller, PT_SIZE, ra)
|
||||
jal prepare_ftrace_return
|
||||
nop
|
||||
MCOUNT_RESTORE_REGS
|
||||
#ifndef CONFIG_DYNAMIC_FTRACE
|
||||
#ifdef CONFIG_32BIT
|
||||
addiu sp, sp, 8
|
||||
#endif
|
||||
#endif
|
||||
RETURN_BACK
|
||||
END(ftrace_graph_caller)
|
||||
|
||||
|
||||
@@ -46,7 +46,12 @@ cflags-y := -pipe
|
||||
|
||||
# These flags should be implied by an hppa-linux configuration, but they
|
||||
# are not in gcc 3.2.
|
||||
cflags-y += -mno-space-regs -mfast-indirect-calls
|
||||
cflags-y += -mno-space-regs
|
||||
|
||||
# -mfast-indirect-calls is only relevant for 32-bit kernels.
|
||||
ifndef CONFIG_64BIT
|
||||
cflags-y += -mfast-indirect-calls
|
||||
endif
|
||||
|
||||
# Currently we save and restore fpregs on all kernel entry/interruption paths.
|
||||
# If that gets optimized, we might need to disable the use of fpregs in the
|
||||
|
||||
@@ -35,6 +35,12 @@
|
||||
STACK_FRAME_OVERHEAD + 288)
|
||||
#define STACK_FRAME_MARKER 12
|
||||
|
||||
#if defined(_CALL_ELF) && _CALL_ELF == 2
|
||||
#define STACK_FRAME_MIN_SIZE 32
|
||||
#else
|
||||
#define STACK_FRAME_MIN_SIZE STACK_FRAME_OVERHEAD
|
||||
#endif
|
||||
|
||||
/* Size of dummy stack frame allocated when calling signal handler. */
|
||||
#define __SIGNAL_FRAMESIZE 128
|
||||
#define __SIGNAL_FRAMESIZE32 64
|
||||
@@ -46,6 +52,7 @@
|
||||
#define STACK_FRAME_REGS_MARKER ASM_CONST(0x72656773)
|
||||
#define STACK_INT_FRAME_SIZE (sizeof(struct pt_regs) + STACK_FRAME_OVERHEAD)
|
||||
#define STACK_FRAME_MARKER 2
|
||||
#define STACK_FRAME_MIN_SIZE STACK_FRAME_OVERHEAD
|
||||
|
||||
/* Size of stack frame allocated when calling signal handler. */
|
||||
#define __SIGNAL_FRAMESIZE 64
|
||||
|
||||
@@ -35,7 +35,7 @@ static int valid_next_sp(unsigned long sp, unsigned long prev_sp)
|
||||
return 0; /* must be 16-byte aligned */
|
||||
if (!validate_sp(sp, current, STACK_FRAME_OVERHEAD))
|
||||
return 0;
|
||||
if (sp >= prev_sp + STACK_FRAME_OVERHEAD)
|
||||
if (sp >= prev_sp + STACK_FRAME_MIN_SIZE)
|
||||
return 1;
|
||||
/*
|
||||
* sp could decrease when we jump off an interrupt stack
|
||||
|
||||
@@ -123,14 +123,14 @@ enum fixed_addresses {
|
||||
__end_of_permanent_fixed_addresses,
|
||||
|
||||
/*
|
||||
* 256 temporary boot-time mappings, used by early_ioremap(),
|
||||
* 512 temporary boot-time mappings, used by early_ioremap(),
|
||||
* before ioremap() is functional.
|
||||
*
|
||||
* If necessary we round it up to the next 256 pages boundary so
|
||||
* If necessary we round it up to the next 512 pages boundary so
|
||||
* that we can have a single pgd entry and a single pte table:
|
||||
*/
|
||||
#define NR_FIX_BTMAPS 64
|
||||
#define FIX_BTMAPS_SLOTS 4
|
||||
#define FIX_BTMAPS_SLOTS 8
|
||||
#define TOTAL_FIX_BTMAPS (NR_FIX_BTMAPS * FIX_BTMAPS_SLOTS)
|
||||
FIX_BTMAP_END =
|
||||
(__end_of_permanent_fixed_addresses ^
|
||||
|
||||
@@ -1284,6 +1284,9 @@ static void remove_siblinginfo(int cpu)
|
||||
|
||||
for_each_cpu(sibling, cpu_sibling_mask(cpu))
|
||||
cpumask_clear_cpu(cpu, cpu_sibling_mask(sibling));
|
||||
for_each_cpu(sibling, cpu_llc_shared_mask(cpu))
|
||||
cpumask_clear_cpu(cpu, cpu_llc_shared_mask(sibling));
|
||||
cpumask_clear(cpu_llc_shared_mask(cpu));
|
||||
cpumask_clear(cpu_sibling_mask(cpu));
|
||||
cpumask_clear(cpu_core_mask(cpu));
|
||||
c->phys_proc_id = 0;
|
||||
|
||||
@@ -1196,20 +1196,37 @@ void kvm_write_tsc(struct kvm_vcpu *vcpu, struct msr_data *msr)
|
||||
elapsed = ns - kvm->arch.last_tsc_nsec;
|
||||
|
||||
if (vcpu->arch.virtual_tsc_khz) {
|
||||
int faulted = 0;
|
||||
|
||||
/* n.b - signed multiplication and division required */
|
||||
usdiff = data - kvm->arch.last_tsc_write;
|
||||
#ifdef CONFIG_X86_64
|
||||
usdiff = (usdiff * 1000) / vcpu->arch.virtual_tsc_khz;
|
||||
#else
|
||||
/* do_div() only does unsigned */
|
||||
asm("idivl %2; xor %%edx, %%edx"
|
||||
: "=A"(usdiff)
|
||||
: "A"(usdiff * 1000), "rm"(vcpu->arch.virtual_tsc_khz));
|
||||
asm("1: idivl %[divisor]\n"
|
||||
"2: xor %%edx, %%edx\n"
|
||||
" movl $0, %[faulted]\n"
|
||||
"3:\n"
|
||||
".section .fixup,\"ax\"\n"
|
||||
"4: movl $1, %[faulted]\n"
|
||||
" jmp 3b\n"
|
||||
".previous\n"
|
||||
|
||||
_ASM_EXTABLE(1b, 4b)
|
||||
|
||||
: "=A"(usdiff), [faulted] "=r" (faulted)
|
||||
: "A"(usdiff * 1000), [divisor] "rm"(vcpu->arch.virtual_tsc_khz));
|
||||
|
||||
#endif
|
||||
do_div(elapsed, 1000);
|
||||
usdiff -= elapsed;
|
||||
if (usdiff < 0)
|
||||
usdiff = -usdiff;
|
||||
|
||||
/* idivl overflow => difference is larger than USEC_PER_SEC */
|
||||
if (faulted)
|
||||
usdiff = USEC_PER_SEC;
|
||||
} else
|
||||
usdiff = USEC_PER_SEC; /* disable TSC match window below */
|
||||
|
||||
|
||||
@@ -68,7 +68,12 @@
|
||||
#define VMALLOC_START 0xC0000000
|
||||
#define VMALLOC_END 0xC7FEFFFF
|
||||
#define TLBTEMP_BASE_1 0xC7FF0000
|
||||
#define TLBTEMP_BASE_2 0xC7FF8000
|
||||
#define TLBTEMP_BASE_2 (TLBTEMP_BASE_1 + DCACHE_WAY_SIZE)
|
||||
#if 2 * DCACHE_WAY_SIZE > ICACHE_WAY_SIZE
|
||||
#define TLBTEMP_SIZE (2 * DCACHE_WAY_SIZE)
|
||||
#else
|
||||
#define TLBTEMP_SIZE ICACHE_WAY_SIZE
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Xtensa Linux config PTE layout (when present):
|
||||
|
||||
@@ -52,7 +52,12 @@
|
||||
*/
|
||||
.macro get_fs ad, sp
|
||||
GET_CURRENT(\ad,\sp)
|
||||
#if THREAD_CURRENT_DS > 1020
|
||||
addi \ad, \ad, TASK_THREAD
|
||||
l32i \ad, \ad, THREAD_CURRENT_DS - TASK_THREAD
|
||||
#else
|
||||
l32i \ad, \ad, THREAD_CURRENT_DS
|
||||
#endif
|
||||
.endm
|
||||
|
||||
/*
|
||||
|
||||
@@ -28,17 +28,17 @@
|
||||
#define TCSETSW 0x5403
|
||||
#define TCSETSF 0x5404
|
||||
|
||||
#define TCGETA _IOR('t', 23, struct termio)
|
||||
#define TCSETA _IOW('t', 24, struct termio)
|
||||
#define TCSETAW _IOW('t', 25, struct termio)
|
||||
#define TCSETAF _IOW('t', 28, struct termio)
|
||||
#define TCGETA 0x80127417 /* _IOR('t', 23, struct termio) */
|
||||
#define TCSETA 0x40127418 /* _IOW('t', 24, struct termio) */
|
||||
#define TCSETAW 0x40127419 /* _IOW('t', 25, struct termio) */
|
||||
#define TCSETAF 0x4012741C /* _IOW('t', 28, struct termio) */
|
||||
|
||||
#define TCSBRK _IO('t', 29)
|
||||
#define TCXONC _IO('t', 30)
|
||||
#define TCFLSH _IO('t', 31)
|
||||
|
||||
#define TIOCSWINSZ _IOW('t', 103, struct winsize)
|
||||
#define TIOCGWINSZ _IOR('t', 104, struct winsize)
|
||||
#define TIOCSWINSZ 0x40087467 /* _IOW('t', 103, struct winsize) */
|
||||
#define TIOCGWINSZ 0x80087468 /* _IOR('t', 104, struct winsize) */
|
||||
#define TIOCSTART _IO('t', 110) /* start output, like ^Q */
|
||||
#define TIOCSTOP _IO('t', 111) /* stop output, like ^S */
|
||||
#define TIOCOUTQ _IOR('t', 115, int) /* output queue size */
|
||||
@@ -88,7 +88,6 @@
|
||||
#define TIOCSETD _IOW('T', 35, int)
|
||||
#define TIOCGETD _IOR('T', 36, int)
|
||||
#define TCSBRKP _IOW('T', 37, int) /* Needed for POSIX tcsendbreak()*/
|
||||
#define TIOCTTYGSTRUCT _IOR('T', 38, struct tty_struct) /* For debugging only*/
|
||||
#define TIOCSBRK _IO('T', 39) /* BSD compatibility */
|
||||
#define TIOCCBRK _IO('T', 40) /* BSD compatibility */
|
||||
#define TIOCGSID _IOR('T', 41, pid_t) /* Return the session ID of FD*/
|
||||
@@ -114,8 +113,10 @@
|
||||
#define TIOCSERGETLSR _IOR('T', 89, unsigned int) /* Get line status reg. */
|
||||
/* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */
|
||||
# define TIOCSER_TEMT 0x01 /* Transmitter physically empty */
|
||||
#define TIOCSERGETMULTI _IOR('T', 90, struct serial_multiport_struct) /* Get multiport config */
|
||||
#define TIOCSERSETMULTI _IOW('T', 91, struct serial_multiport_struct) /* Set multiport config */
|
||||
#define TIOCSERGETMULTI 0x80a8545a /* Get multiport config */
|
||||
/* _IOR('T', 90, struct serial_multiport_struct) */
|
||||
#define TIOCSERSETMULTI 0x40a8545b /* Set multiport config */
|
||||
/* _IOW('T', 91, struct serial_multiport_struct) */
|
||||
|
||||
#define TIOCMIWAIT _IO('T', 92) /* wait for a change on serial input line(s) */
|
||||
#define TIOCGICOUNT 0x545D /* read serial port inline interrupt counts */
|
||||
|
||||
@@ -1121,9 +1121,8 @@ ENTRY(fast_syscall_xtensa)
|
||||
movi a7, 4 # sizeof(unsigned int)
|
||||
access_ok a3, a7, a0, a2, .Leac # a0: scratch reg, a2: sp
|
||||
|
||||
addi a6, a6, -1 # assuming SYS_XTENSA_ATOMIC_SET = 1
|
||||
_bgeui a6, SYS_XTENSA_COUNT - 1, .Lill
|
||||
_bnei a6, SYS_XTENSA_ATOMIC_CMP_SWP - 1, .Lnswp
|
||||
_bgeui a6, SYS_XTENSA_COUNT, .Lill
|
||||
_bnei a6, SYS_XTENSA_ATOMIC_CMP_SWP, .Lnswp
|
||||
|
||||
/* Fall through for ATOMIC_CMP_SWP. */
|
||||
|
||||
@@ -1135,27 +1134,26 @@ TRY s32i a5, a3, 0 # different, modify value
|
||||
l32i a7, a2, PT_AREG7 # restore a7
|
||||
l32i a0, a2, PT_AREG0 # restore a0
|
||||
movi a2, 1 # and return 1
|
||||
addi a6, a6, 1 # restore a6 (really necessary?)
|
||||
rfe
|
||||
|
||||
1: l32i a7, a2, PT_AREG7 # restore a7
|
||||
l32i a0, a2, PT_AREG0 # restore a0
|
||||
movi a2, 0 # return 0 (note that we cannot set
|
||||
addi a6, a6, 1 # restore a6 (really necessary?)
|
||||
rfe
|
||||
|
||||
.Lnswp: /* Atomic set, add, and exg_add. */
|
||||
|
||||
TRY l32i a7, a3, 0 # orig
|
||||
addi a6, a6, -SYS_XTENSA_ATOMIC_SET
|
||||
add a0, a4, a7 # + arg
|
||||
moveqz a0, a4, a6 # set
|
||||
addi a6, a6, SYS_XTENSA_ATOMIC_SET
|
||||
TRY s32i a0, a3, 0 # write new value
|
||||
|
||||
mov a0, a2
|
||||
mov a2, a7
|
||||
l32i a7, a0, PT_AREG7 # restore a7
|
||||
l32i a0, a0, PT_AREG0 # restore a0
|
||||
addi a6, a6, 1 # restore a6 (really necessary?)
|
||||
rfe
|
||||
|
||||
CATCH
|
||||
@@ -1164,7 +1162,7 @@ CATCH
|
||||
movi a2, -EFAULT
|
||||
rfe
|
||||
|
||||
.Lill: l32i a7, a2, PT_AREG0 # restore a7
|
||||
.Lill: l32i a7, a2, PT_AREG7 # restore a7
|
||||
l32i a0, a2, PT_AREG0 # restore a0
|
||||
movi a2, -EINVAL
|
||||
rfe
|
||||
@@ -1703,7 +1701,7 @@ ENTRY(fast_second_level_miss)
|
||||
rsr a0, excvaddr
|
||||
bltu a0, a3, 2f
|
||||
|
||||
addi a1, a0, -(2 << (DCACHE_ALIAS_ORDER + PAGE_SHIFT))
|
||||
addi a1, a0, -TLBTEMP_SIZE
|
||||
bgeu a1, a3, 2f
|
||||
|
||||
/* Check if we have to restore an ITLB mapping. */
|
||||
@@ -1961,7 +1959,6 @@ ENTRY(_switch_to)
|
||||
|
||||
entry a1, 16
|
||||
|
||||
mov a10, a2 # preserve 'prev' (a2)
|
||||
mov a11, a3 # and 'next' (a3)
|
||||
|
||||
l32i a4, a2, TASK_THREAD_INFO
|
||||
@@ -1969,8 +1966,14 @@ ENTRY(_switch_to)
|
||||
|
||||
save_xtregs_user a4 a6 a8 a9 a12 a13 THREAD_XTREGS_USER
|
||||
|
||||
s32i a0, a10, THREAD_RA # save return address
|
||||
s32i a1, a10, THREAD_SP # save stack pointer
|
||||
#if THREAD_RA > 1020 || THREAD_SP > 1020
|
||||
addi a10, a2, TASK_THREAD
|
||||
s32i a0, a10, THREAD_RA - TASK_THREAD # save return address
|
||||
s32i a1, a10, THREAD_SP - TASK_THREAD # save stack pointer
|
||||
#else
|
||||
s32i a0, a2, THREAD_RA # save return address
|
||||
s32i a1, a2, THREAD_SP # save stack pointer
|
||||
#endif
|
||||
|
||||
/* Disable ints while we manipulate the stack pointer. */
|
||||
|
||||
@@ -2011,7 +2014,6 @@ ENTRY(_switch_to)
|
||||
load_xtregs_user a5 a6 a8 a9 a12 a13 THREAD_XTREGS_USER
|
||||
|
||||
wsr a14, ps
|
||||
mov a2, a10 # return 'prev'
|
||||
rsync
|
||||
|
||||
retw
|
||||
|
||||
@@ -49,9 +49,8 @@ dma_alloc_coherent(struct device *dev,size_t size,dma_addr_t *handle,gfp_t flag)
|
||||
|
||||
/* We currently don't support coherent memory outside KSEG */
|
||||
|
||||
if (ret < XCHAL_KSEG_CACHED_VADDR
|
||||
|| ret >= XCHAL_KSEG_CACHED_VADDR + XCHAL_KSEG_SIZE)
|
||||
BUG();
|
||||
BUG_ON(ret < XCHAL_KSEG_CACHED_VADDR ||
|
||||
ret > XCHAL_KSEG_CACHED_VADDR + XCHAL_KSEG_SIZE - 1);
|
||||
|
||||
|
||||
if (ret != 0) {
|
||||
@@ -68,10 +67,11 @@ EXPORT_SYMBOL(dma_alloc_coherent);
|
||||
void dma_free_coherent(struct device *hwdev, size_t size,
|
||||
void *vaddr, dma_addr_t dma_handle)
|
||||
{
|
||||
long addr=(long)vaddr+XCHAL_KSEG_CACHED_VADDR-XCHAL_KSEG_BYPASS_VADDR;
|
||||
unsigned long addr = (unsigned long)vaddr +
|
||||
XCHAL_KSEG_CACHED_VADDR - XCHAL_KSEG_BYPASS_VADDR;
|
||||
|
||||
if (addr < 0 || addr >= XCHAL_KSEG_SIZE)
|
||||
BUG();
|
||||
BUG_ON(addr < XCHAL_KSEG_CACHED_VADDR ||
|
||||
addr > XCHAL_KSEG_CACHED_VADDR + XCHAL_KSEG_SIZE - 1);
|
||||
|
||||
free_pages(addr, get_order(size));
|
||||
}
|
||||
|
||||
@@ -1275,12 +1275,16 @@ __cfq_group_service_tree_add(struct cfq_rb_root *st, struct cfq_group *cfqg)
|
||||
static void
|
||||
cfq_update_group_weight(struct cfq_group *cfqg)
|
||||
{
|
||||
BUG_ON(!RB_EMPTY_NODE(&cfqg->rb_node));
|
||||
|
||||
if (cfqg->new_weight) {
|
||||
cfqg->weight = cfqg->new_weight;
|
||||
cfqg->new_weight = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
cfq_update_group_leaf_weight(struct cfq_group *cfqg)
|
||||
{
|
||||
BUG_ON(!RB_EMPTY_NODE(&cfqg->rb_node));
|
||||
|
||||
if (cfqg->new_leaf_weight) {
|
||||
cfqg->leaf_weight = cfqg->new_leaf_weight;
|
||||
@@ -1299,7 +1303,7 @@ cfq_group_service_tree_add(struct cfq_rb_root *st, struct cfq_group *cfqg)
|
||||
/* add to the service tree */
|
||||
BUG_ON(!RB_EMPTY_NODE(&cfqg->rb_node));
|
||||
|
||||
cfq_update_group_weight(cfqg);
|
||||
cfq_update_group_leaf_weight(cfqg);
|
||||
__cfq_group_service_tree_add(st, cfqg);
|
||||
|
||||
/*
|
||||
@@ -1323,6 +1327,7 @@ cfq_group_service_tree_add(struct cfq_rb_root *st, struct cfq_group *cfqg)
|
||||
*/
|
||||
while ((parent = cfqg_parent(pos))) {
|
||||
if (propagate) {
|
||||
cfq_update_group_weight(pos);
|
||||
propagate = !parent->nr_active++;
|
||||
parent->children_weight += pos->weight;
|
||||
}
|
||||
|
||||
@@ -28,10 +28,10 @@ struct kobject *block_depr;
|
||||
/* for extended dynamic devt allocation, currently only one major is used */
|
||||
#define NR_EXT_DEVT (1 << MINORBITS)
|
||||
|
||||
/* For extended devt allocation. ext_devt_mutex prevents look up
|
||||
/* For extended devt allocation. ext_devt_lock prevents look up
|
||||
* results from going away underneath its user.
|
||||
*/
|
||||
static DEFINE_MUTEX(ext_devt_mutex);
|
||||
static DEFINE_SPINLOCK(ext_devt_lock);
|
||||
static DEFINE_IDR(ext_devt_idr);
|
||||
|
||||
static struct device_type disk_type;
|
||||
@@ -420,9 +420,13 @@ int blk_alloc_devt(struct hd_struct *part, dev_t *devt)
|
||||
}
|
||||
|
||||
/* allocate ext devt */
|
||||
mutex_lock(&ext_devt_mutex);
|
||||
idx = idr_alloc(&ext_devt_idr, part, 0, NR_EXT_DEVT, GFP_KERNEL);
|
||||
mutex_unlock(&ext_devt_mutex);
|
||||
idr_preload(GFP_KERNEL);
|
||||
|
||||
spin_lock(&ext_devt_lock);
|
||||
idx = idr_alloc(&ext_devt_idr, part, 0, NR_EXT_DEVT, GFP_NOWAIT);
|
||||
spin_unlock(&ext_devt_lock);
|
||||
|
||||
idr_preload_end();
|
||||
if (idx < 0)
|
||||
return idx == -ENOSPC ? -EBUSY : idx;
|
||||
|
||||
@@ -441,15 +445,13 @@ int blk_alloc_devt(struct hd_struct *part, dev_t *devt)
|
||||
*/
|
||||
void blk_free_devt(dev_t devt)
|
||||
{
|
||||
might_sleep();
|
||||
|
||||
if (devt == MKDEV(0, 0))
|
||||
return;
|
||||
|
||||
if (MAJOR(devt) == BLOCK_EXT_MAJOR) {
|
||||
mutex_lock(&ext_devt_mutex);
|
||||
spin_lock(&ext_devt_lock);
|
||||
idr_remove(&ext_devt_idr, blk_mangle_minor(MINOR(devt)));
|
||||
mutex_unlock(&ext_devt_mutex);
|
||||
spin_unlock(&ext_devt_lock);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -665,7 +667,6 @@ void del_gendisk(struct gendisk *disk)
|
||||
sysfs_remove_link(block_depr, dev_name(disk_to_dev(disk)));
|
||||
pm_runtime_set_memalloc_noio(disk_to_dev(disk), false);
|
||||
device_del(disk_to_dev(disk));
|
||||
blk_free_devt(disk_to_dev(disk)->devt);
|
||||
}
|
||||
EXPORT_SYMBOL(del_gendisk);
|
||||
|
||||
@@ -690,13 +691,13 @@ struct gendisk *get_gendisk(dev_t devt, int *partno)
|
||||
} else {
|
||||
struct hd_struct *part;
|
||||
|
||||
mutex_lock(&ext_devt_mutex);
|
||||
spin_lock(&ext_devt_lock);
|
||||
part = idr_find(&ext_devt_idr, blk_mangle_minor(MINOR(devt)));
|
||||
if (part && get_disk(part_to_disk(part))) {
|
||||
*partno = part->partno;
|
||||
disk = part_to_disk(part);
|
||||
}
|
||||
mutex_unlock(&ext_devt_mutex);
|
||||
spin_unlock(&ext_devt_lock);
|
||||
}
|
||||
|
||||
return disk;
|
||||
@@ -1098,6 +1099,7 @@ static void disk_release(struct device *dev)
|
||||
{
|
||||
struct gendisk *disk = dev_to_disk(dev);
|
||||
|
||||
blk_free_devt(dev->devt);
|
||||
disk_release_events(disk);
|
||||
kfree(disk->random);
|
||||
disk_replace_part_tbl(disk, NULL);
|
||||
|
||||
@@ -211,6 +211,7 @@ static const struct attribute_group *part_attr_groups[] = {
|
||||
static void part_release(struct device *dev)
|
||||
{
|
||||
struct hd_struct *p = dev_to_part(dev);
|
||||
blk_free_devt(dev->devt);
|
||||
free_part_stats(p);
|
||||
free_part_info(p);
|
||||
kfree(p);
|
||||
@@ -264,7 +265,6 @@ void delete_partition(struct gendisk *disk, int partno)
|
||||
rcu_assign_pointer(ptbl->last_lookup, NULL);
|
||||
kobject_put(part->holder_dir);
|
||||
device_del(part_to_dev(part));
|
||||
blk_free_devt(part_devt(part));
|
||||
|
||||
hd_struct_put(part);
|
||||
}
|
||||
|
||||
@@ -254,6 +254,7 @@ struct acpi_create_field_info {
|
||||
u32 field_bit_position;
|
||||
u32 field_bit_length;
|
||||
u16 resource_length;
|
||||
u16 pin_number_index;
|
||||
u8 field_flags;
|
||||
u8 attribute;
|
||||
u8 field_type;
|
||||
|
||||
@@ -263,6 +263,7 @@ struct acpi_object_region_field {
|
||||
ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_FIELD_INFO u16 resource_length;
|
||||
union acpi_operand_object *region_obj; /* Containing op_region object */
|
||||
u8 *resource_buffer; /* resource_template for serial regions/fields */
|
||||
u16 pin_number_index; /* Index relative to previous Connection/Template */
|
||||
};
|
||||
|
||||
struct acpi_object_bank_field {
|
||||
|
||||
@@ -360,6 +360,7 @@ acpi_ds_get_field_names(struct acpi_create_field_info *info,
|
||||
*/
|
||||
info->resource_buffer = NULL;
|
||||
info->connection_node = NULL;
|
||||
info->pin_number_index = 0;
|
||||
|
||||
/*
|
||||
* A Connection() is either an actual resource descriptor (buffer)
|
||||
@@ -437,6 +438,7 @@ acpi_ds_get_field_names(struct acpi_create_field_info *info,
|
||||
}
|
||||
|
||||
info->field_bit_position += info->field_bit_length;
|
||||
info->pin_number_index++; /* Index relative to previous Connection() */
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
@@ -141,6 +141,7 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
|
||||
union acpi_operand_object *region_obj2;
|
||||
void *region_context = NULL;
|
||||
struct acpi_connection_info *context;
|
||||
acpi_physical_address address;
|
||||
|
||||
ACPI_FUNCTION_TRACE(ev_address_space_dispatch);
|
||||
|
||||
@@ -235,25 +236,23 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
|
||||
/* We have everything we need, we can invoke the address space handler */
|
||||
|
||||
handler = handler_desc->address_space.handler;
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
|
||||
"Handler %p (@%p) Address %8.8X%8.8X [%s]\n",
|
||||
®ion_obj->region.handler->address_space, handler,
|
||||
ACPI_FORMAT_NATIVE_UINT(region_obj->region.address +
|
||||
region_offset),
|
||||
acpi_ut_get_region_name(region_obj->region.
|
||||
space_id)));
|
||||
address = (region_obj->region.address + region_offset);
|
||||
|
||||
/*
|
||||
* Special handling for generic_serial_bus and general_purpose_io:
|
||||
* There are three extra parameters that must be passed to the
|
||||
* handler via the context:
|
||||
* 1) Connection buffer, a resource template from Connection() op.
|
||||
* 2) Length of the above buffer.
|
||||
* 3) Actual access length from the access_as() op.
|
||||
* 1) Connection buffer, a resource template from Connection() op
|
||||
* 2) Length of the above buffer
|
||||
* 3) Actual access length from the access_as() op
|
||||
*
|
||||
* In addition, for general_purpose_io, the Address and bit_width fields
|
||||
* are defined as follows:
|
||||
* 1) Address is the pin number index of the field (bit offset from
|
||||
* the previous Connection)
|
||||
* 2) bit_width is the actual bit length of the field (number of pins)
|
||||
*/
|
||||
if (((region_obj->region.space_id == ACPI_ADR_SPACE_GSBUS) ||
|
||||
(region_obj->region.space_id == ACPI_ADR_SPACE_GPIO)) &&
|
||||
if ((region_obj->region.space_id == ACPI_ADR_SPACE_GSBUS) &&
|
||||
context && field_obj) {
|
||||
|
||||
/* Get the Connection (resource_template) buffer */
|
||||
@@ -262,6 +261,24 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
|
||||
context->length = field_obj->field.resource_length;
|
||||
context->access_length = field_obj->field.access_length;
|
||||
}
|
||||
if ((region_obj->region.space_id == ACPI_ADR_SPACE_GPIO) &&
|
||||
context && field_obj) {
|
||||
|
||||
/* Get the Connection (resource_template) buffer */
|
||||
|
||||
context->connection = field_obj->field.resource_buffer;
|
||||
context->length = field_obj->field.resource_length;
|
||||
context->access_length = field_obj->field.access_length;
|
||||
address = field_obj->field.pin_number_index;
|
||||
bit_width = field_obj->field.bit_length;
|
||||
}
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
|
||||
"Handler %p (@%p) Address %8.8X%8.8X [%s]\n",
|
||||
®ion_obj->region.handler->address_space, handler,
|
||||
ACPI_FORMAT_NATIVE_UINT(address),
|
||||
acpi_ut_get_region_name(region_obj->region.
|
||||
space_id)));
|
||||
|
||||
if (!(handler_desc->address_space.handler_flags &
|
||||
ACPI_ADDR_HANDLER_DEFAULT_INSTALLED)) {
|
||||
@@ -275,9 +292,7 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
|
||||
|
||||
/* Call the handler */
|
||||
|
||||
status = handler(function,
|
||||
(region_obj->region.address + region_offset),
|
||||
bit_width, value, context,
|
||||
status = handler(function, address, bit_width, value, context,
|
||||
region_obj2->extra.region_context);
|
||||
|
||||
if (ACPI_FAILURE(status)) {
|
||||
|
||||
@@ -178,6 +178,37 @@ acpi_ex_read_data_from_field(struct acpi_walk_state *walk_state,
|
||||
buffer = &buffer_desc->integer.value;
|
||||
}
|
||||
|
||||
if ((obj_desc->common.type == ACPI_TYPE_LOCAL_REGION_FIELD) &&
|
||||
(obj_desc->field.region_obj->region.space_id ==
|
||||
ACPI_ADR_SPACE_GPIO)) {
|
||||
/*
|
||||
* For GPIO (general_purpose_io), the Address will be the bit offset
|
||||
* from the previous Connection() operator, making it effectively a
|
||||
* pin number index. The bit_length is the length of the field, which
|
||||
* is thus the number of pins.
|
||||
*/
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
|
||||
"GPIO FieldRead [FROM]: Pin %u Bits %u\n",
|
||||
obj_desc->field.pin_number_index,
|
||||
obj_desc->field.bit_length));
|
||||
|
||||
/* Lock entire transaction if requested */
|
||||
|
||||
acpi_ex_acquire_global_lock(obj_desc->common_field.field_flags);
|
||||
|
||||
/* Perform the write */
|
||||
|
||||
status = acpi_ex_access_region(obj_desc, 0,
|
||||
(u64 *)buffer, ACPI_READ);
|
||||
acpi_ex_release_global_lock(obj_desc->common_field.field_flags);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
acpi_ut_remove_reference(buffer_desc);
|
||||
} else {
|
||||
*ret_buffer_desc = buffer_desc;
|
||||
}
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
|
||||
"FieldRead [TO]: Obj %p, Type %X, Buf %p, ByteLen %X\n",
|
||||
obj_desc, obj_desc->common.type, buffer,
|
||||
@@ -325,6 +356,42 @@ acpi_ex_write_data_to_field(union acpi_operand_object *source_desc,
|
||||
|
||||
*result_desc = buffer_desc;
|
||||
return_ACPI_STATUS(status);
|
||||
} else if ((obj_desc->common.type == ACPI_TYPE_LOCAL_REGION_FIELD) &&
|
||||
(obj_desc->field.region_obj->region.space_id ==
|
||||
ACPI_ADR_SPACE_GPIO)) {
|
||||
/*
|
||||
* For GPIO (general_purpose_io), we will bypass the entire field
|
||||
* mechanism and handoff the bit address and bit width directly to
|
||||
* the handler. The Address will be the bit offset
|
||||
* from the previous Connection() operator, making it effectively a
|
||||
* pin number index. The bit_length is the length of the field, which
|
||||
* is thus the number of pins.
|
||||
*/
|
||||
if (source_desc->common.type != ACPI_TYPE_INTEGER) {
|
||||
return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
|
||||
}
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
|
||||
"GPIO FieldWrite [FROM]: (%s:%X), Val %.8X [TO]: Pin %u Bits %u\n",
|
||||
acpi_ut_get_type_name(source_desc->common.
|
||||
type),
|
||||
source_desc->common.type,
|
||||
(u32)source_desc->integer.value,
|
||||
obj_desc->field.pin_number_index,
|
||||
obj_desc->field.bit_length));
|
||||
|
||||
buffer = &source_desc->integer.value;
|
||||
|
||||
/* Lock entire transaction if requested */
|
||||
|
||||
acpi_ex_acquire_global_lock(obj_desc->common_field.field_flags);
|
||||
|
||||
/* Perform the write */
|
||||
|
||||
status = acpi_ex_access_region(obj_desc, 0,
|
||||
(u64 *)buffer, ACPI_WRITE);
|
||||
acpi_ex_release_global_lock(obj_desc->common_field.field_flags);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/* Get a pointer to the data to be written */
|
||||
|
||||
@@ -479,6 +479,8 @@ acpi_status acpi_ex_prep_field_value(struct acpi_create_field_info *info)
|
||||
obj_desc->field.resource_length = info->resource_length;
|
||||
}
|
||||
|
||||
obj_desc->field.pin_number_index = info->pin_number_index;
|
||||
|
||||
/* Allow full data read from EC address space */
|
||||
|
||||
if ((obj_desc->field.region_obj->region.space_id ==
|
||||
|
||||
@@ -304,6 +304,14 @@ static const struct pci_device_id ahci_pci_tbl[] = {
|
||||
{ PCI_VDEVICE(INTEL, 0x9c85), board_ahci }, /* Wildcat Point-LP RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x9c87), board_ahci }, /* Wildcat Point-LP RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x9c8f), board_ahci }, /* Wildcat Point-LP RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x8c82), board_ahci }, /* 9 Series AHCI */
|
||||
{ PCI_VDEVICE(INTEL, 0x8c83), board_ahci }, /* 9 Series AHCI */
|
||||
{ PCI_VDEVICE(INTEL, 0x8c84), board_ahci }, /* 9 Series RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x8c85), board_ahci }, /* 9 Series RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x8c86), board_ahci }, /* 9 Series RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x8c87), board_ahci }, /* 9 Series RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x8c8e), board_ahci }, /* 9 Series RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x8c8f), board_ahci }, /* 9 Series RAID */
|
||||
|
||||
/* JMicron 360/1/3/5/6, match class to avoid IDE function */
|
||||
{ PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
|
||||
@@ -441,6 +449,8 @@ static const struct pci_device_id ahci_pci_tbl[] = {
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x917a),
|
||||
.driver_data = board_ahci_yes_fbs }, /* 88se9172 */
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9172),
|
||||
.driver_data = board_ahci_yes_fbs }, /* 88se9182 */
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9182),
|
||||
.driver_data = board_ahci_yes_fbs }, /* 88se9172 */
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9192),
|
||||
.driver_data = board_ahci_yes_fbs }, /* 88se9172 on some Gigabyte */
|
||||
|
||||
@@ -340,6 +340,14 @@ static const struct pci_device_id piix_pci_tbl[] = {
|
||||
{ 0x8086, 0x0F21, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata_byt },
|
||||
/* SATA Controller IDE (Coleto Creek) */
|
||||
{ 0x8086, 0x23a6, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
|
||||
/* SATA Controller IDE (9 Series) */
|
||||
{ 0x8086, 0x8c88, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata_snb },
|
||||
/* SATA Controller IDE (9 Series) */
|
||||
{ 0x8086, 0x8c89, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata_snb },
|
||||
/* SATA Controller IDE (9 Series) */
|
||||
{ 0x8086, 0x8c80, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb },
|
||||
/* SATA Controller IDE (9 Series) */
|
||||
{ 0x8086, 0x8c81, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb },
|
||||
|
||||
{ } /* terminate list */
|
||||
};
|
||||
|
||||
@@ -586,7 +586,7 @@ static int scc_wait_after_reset(struct ata_link *link, unsigned int devmask,
|
||||
* Note: Original code is ata_bus_softreset().
|
||||
*/
|
||||
|
||||
static unsigned int scc_bus_softreset(struct ata_port *ap, unsigned int devmask,
|
||||
static int scc_bus_softreset(struct ata_port *ap, unsigned int devmask,
|
||||
unsigned long deadline)
|
||||
{
|
||||
struct ata_ioports *ioaddr = &ap->ioaddr;
|
||||
@@ -600,9 +600,7 @@ static unsigned int scc_bus_softreset(struct ata_port *ap, unsigned int devmask,
|
||||
udelay(20);
|
||||
out_be32(ioaddr->ctl_addr, ap->ctl);
|
||||
|
||||
scc_wait_after_reset(&ap->link, devmask, deadline);
|
||||
|
||||
return 0;
|
||||
return scc_wait_after_reset(&ap->link, devmask, deadline);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -619,7 +617,8 @@ static int scc_softreset(struct ata_link *link, unsigned int *classes,
|
||||
{
|
||||
struct ata_port *ap = link->ap;
|
||||
unsigned int slave_possible = ap->flags & ATA_FLAG_SLAVE_POSS;
|
||||
unsigned int devmask = 0, err_mask;
|
||||
unsigned int devmask = 0;
|
||||
int rc;
|
||||
u8 err;
|
||||
|
||||
DPRINTK("ENTER\n");
|
||||
@@ -635,9 +634,9 @@ static int scc_softreset(struct ata_link *link, unsigned int *classes,
|
||||
|
||||
/* issue bus reset */
|
||||
DPRINTK("about to softreset, devmask=%x\n", devmask);
|
||||
err_mask = scc_bus_softreset(ap, devmask, deadline);
|
||||
if (err_mask) {
|
||||
ata_port_err(ap, "SRST failed (err_mask=0x%x)\n", err_mask);
|
||||
rc = scc_bus_softreset(ap, devmask, deadline);
|
||||
if (rc) {
|
||||
ata_port_err(ap, "SRST failed (err_mask=0x%x)\n", rc);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
|
||||
@@ -114,7 +114,7 @@ bool regmap_readable(struct regmap *map, unsigned int reg)
|
||||
|
||||
bool regmap_volatile(struct regmap *map, unsigned int reg)
|
||||
{
|
||||
if (!regmap_readable(map, reg))
|
||||
if (!map->format.format_write && !regmap_readable(map, reg))
|
||||
return false;
|
||||
|
||||
if (map->volatile_reg)
|
||||
|
||||
@@ -104,7 +104,7 @@ static int ast_detect_chip(struct drm_device *dev)
|
||||
}
|
||||
ast->vga2_clone = false;
|
||||
} else {
|
||||
ast->chip = 2000;
|
||||
ast->chip = AST2000;
|
||||
DRM_INFO("AST 2000 detected\n");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1122,7 +1122,7 @@ init_vbt_defaults(struct drm_i915_private *dev_priv)
|
||||
}
|
||||
}
|
||||
|
||||
static int __init intel_no_opregion_vbt_callback(const struct dmi_system_id *id)
|
||||
static int intel_no_opregion_vbt_callback(const struct dmi_system_id *id)
|
||||
{
|
||||
DRM_DEBUG_KMS("Falling back to manually reading VBT from "
|
||||
"VBIOS ROM for %s\n",
|
||||
|
||||
@@ -775,7 +775,7 @@ static const struct drm_encoder_funcs intel_crt_enc_funcs = {
|
||||
.destroy = intel_encoder_destroy,
|
||||
};
|
||||
|
||||
static int __init intel_no_crt_dmi_callback(const struct dmi_system_id *id)
|
||||
static int intel_no_crt_dmi_callback(const struct dmi_system_id *id)
|
||||
{
|
||||
DRM_INFO("Skipping CRT initialization for %s\n", id->ident);
|
||||
return 1;
|
||||
|
||||
@@ -524,7 +524,7 @@ static const struct drm_encoder_funcs intel_lvds_enc_funcs = {
|
||||
.destroy = intel_encoder_destroy,
|
||||
};
|
||||
|
||||
static int __init intel_no_lvds_dmi_callback(const struct dmi_system_id *id)
|
||||
static int intel_no_lvds_dmi_callback(const struct dmi_system_id *id)
|
||||
{
|
||||
DRM_INFO("Skipping LVDS initialization for %s\n", id->ident);
|
||||
return 1;
|
||||
|
||||
@@ -516,6 +516,8 @@ static int init_ring_common(struct intel_engine_cs *ring)
|
||||
intel_ring_setup_status_page(ring);
|
||||
else
|
||||
ring_setup_phys_status_page(ring);
|
||||
/* Enforce ordering by reading HEAD register back */
|
||||
I915_READ_HEAD(ring);
|
||||
|
||||
/* Initialize the ring. This must happen _after_ we've cleared the ring
|
||||
* registers with the above sequence (the readback of the HEAD registers
|
||||
|
||||
@@ -854,6 +854,10 @@ intel_enable_tv(struct intel_encoder *encoder)
|
||||
struct drm_device *dev = encoder->base.dev;
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
|
||||
/* Prevents vblank waits from timing out in intel_tv_detect_type() */
|
||||
intel_wait_for_vblank(encoder->base.dev,
|
||||
to_intel_crtc(encoder->base.crtc)->pipe);
|
||||
|
||||
I915_WRITE(TV_CTL, I915_READ(TV_CTL) | TV_ENC_ENABLE);
|
||||
}
|
||||
|
||||
|
||||
@@ -447,6 +447,13 @@ static bool radeon_atom_apply_quirks(struct drm_device *dev,
|
||||
}
|
||||
}
|
||||
|
||||
/* Fujitsu D3003-S2 board lists DVI-I as DVI-I and VGA */
|
||||
if ((dev->pdev->device == 0x9805) &&
|
||||
(dev->pdev->subsystem_vendor == 0x1734) &&
|
||||
(dev->pdev->subsystem_device == 0x11bd)) {
|
||||
if (*connector_type == DRM_MODE_CONNECTOR_VGA)
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -1955,7 +1962,7 @@ static const char *thermal_controller_names[] = {
|
||||
"adm1032",
|
||||
"adm1030",
|
||||
"max6649",
|
||||
"lm64",
|
||||
"lm63", /* lm64 */
|
||||
"f75375",
|
||||
"asc7xxx",
|
||||
};
|
||||
@@ -1966,7 +1973,7 @@ static const char *pp_lib_thermal_controller_names[] = {
|
||||
"adm1032",
|
||||
"adm1030",
|
||||
"max6649",
|
||||
"lm64",
|
||||
"lm63", /* lm64 */
|
||||
"f75375",
|
||||
"RV6xx",
|
||||
"RV770",
|
||||
|
||||
@@ -122,6 +122,7 @@ static int tilcdc_unload(struct drm_device *dev)
|
||||
struct tilcdc_drm_private *priv = dev->dev_private;
|
||||
struct tilcdc_module *mod, *cur;
|
||||
|
||||
drm_fbdev_cma_fini(priv->fbdev);
|
||||
drm_kms_helper_poll_fini(dev);
|
||||
drm_mode_config_cleanup(dev);
|
||||
drm_vblank_cleanup(dev);
|
||||
@@ -628,10 +629,10 @@ static int __init tilcdc_drm_init(void)
|
||||
static void __exit tilcdc_drm_fini(void)
|
||||
{
|
||||
DBG("fini");
|
||||
tilcdc_tfp410_fini();
|
||||
tilcdc_slave_fini();
|
||||
tilcdc_panel_fini();
|
||||
platform_driver_unregister(&tilcdc_platform_driver);
|
||||
tilcdc_panel_fini();
|
||||
tilcdc_slave_fini();
|
||||
tilcdc_tfp410_fini();
|
||||
}
|
||||
|
||||
late_initcall(tilcdc_drm_init);
|
||||
|
||||
@@ -151,6 +151,7 @@ struct panel_connector {
|
||||
static void panel_connector_destroy(struct drm_connector *connector)
|
||||
{
|
||||
struct panel_connector *panel_connector = to_panel_connector(connector);
|
||||
drm_sysfs_connector_remove(connector);
|
||||
drm_connector_cleanup(connector);
|
||||
kfree(panel_connector);
|
||||
}
|
||||
@@ -285,10 +286,8 @@ static void panel_destroy(struct tilcdc_module *mod)
|
||||
{
|
||||
struct panel_module *panel_mod = to_panel_module(mod);
|
||||
|
||||
if (panel_mod->timings) {
|
||||
if (panel_mod->timings)
|
||||
display_timings_release(panel_mod->timings);
|
||||
kfree(panel_mod->timings);
|
||||
}
|
||||
|
||||
tilcdc_module_cleanup(mod);
|
||||
kfree(panel_mod->info);
|
||||
|
||||
@@ -166,6 +166,7 @@ struct slave_connector {
|
||||
static void slave_connector_destroy(struct drm_connector *connector)
|
||||
{
|
||||
struct slave_connector *slave_connector = to_slave_connector(connector);
|
||||
drm_sysfs_connector_remove(connector);
|
||||
drm_connector_cleanup(connector);
|
||||
kfree(slave_connector);
|
||||
}
|
||||
|
||||
@@ -167,6 +167,7 @@ struct tfp410_connector {
|
||||
static void tfp410_connector_destroy(struct drm_connector *connector)
|
||||
{
|
||||
struct tfp410_connector *tfp410_connector = to_tfp410_connector(connector);
|
||||
drm_sysfs_connector_remove(connector);
|
||||
drm_connector_cleanup(connector);
|
||||
kfree(tfp410_connector);
|
||||
}
|
||||
|
||||
@@ -1004,9 +1004,9 @@ EXPORT_SYMBOL_GPL(ttm_dma_unpopulate);
|
||||
static unsigned long
|
||||
ttm_dma_pool_shrink_scan(struct shrinker *shrink, struct shrink_control *sc)
|
||||
{
|
||||
static atomic_t start_pool = ATOMIC_INIT(0);
|
||||
static unsigned start_pool;
|
||||
unsigned idx = 0;
|
||||
unsigned pool_offset = atomic_add_return(1, &start_pool);
|
||||
unsigned pool_offset;
|
||||
unsigned shrink_pages = sc->nr_to_scan;
|
||||
struct device_pools *p;
|
||||
unsigned long freed = 0;
|
||||
@@ -1015,7 +1015,9 @@ ttm_dma_pool_shrink_scan(struct shrinker *shrink, struct shrink_control *sc)
|
||||
return SHRINK_STOP;
|
||||
|
||||
mutex_lock(&_manager->lock);
|
||||
pool_offset = pool_offset % _manager->npools;
|
||||
if (!_manager->npools)
|
||||
goto out;
|
||||
pool_offset = ++start_pool % _manager->npools;
|
||||
list_for_each_entry(p, &_manager->pools, pools) {
|
||||
unsigned nr_free;
|
||||
|
||||
@@ -1034,6 +1036,7 @@ ttm_dma_pool_shrink_scan(struct shrinker *shrink, struct shrink_control *sc)
|
||||
p->pool->dev_name, p->pool->name, current->pid,
|
||||
nr_free, shrink_pages);
|
||||
}
|
||||
out:
|
||||
mutex_unlock(&_manager->lock);
|
||||
return freed;
|
||||
}
|
||||
|
||||
@@ -180,8 +180,9 @@ void vmw_fifo_release(struct vmw_private *dev_priv, struct vmw_fifo_state *fifo)
|
||||
|
||||
mutex_lock(&dev_priv->hw_mutex);
|
||||
|
||||
vmw_write(dev_priv, SVGA_REG_SYNC, SVGA_SYNC_GENERIC);
|
||||
while (vmw_read(dev_priv, SVGA_REG_BUSY) != 0)
|
||||
vmw_write(dev_priv, SVGA_REG_SYNC, SVGA_SYNC_GENERIC);
|
||||
;
|
||||
|
||||
dev_priv->last_read_seqno = ioread32(fifo_mem + SVGA_FIFO_FENCE);
|
||||
|
||||
|
||||
@@ -679,7 +679,6 @@ static int logi_dj_raw_event(struct hid_device *hdev,
|
||||
struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
|
||||
struct dj_report *dj_report = (struct dj_report *) data;
|
||||
unsigned long flags;
|
||||
bool report_processed = false;
|
||||
|
||||
dbg_hid("%s, size:%d\n", __func__, size);
|
||||
|
||||
@@ -706,34 +705,42 @@ static int logi_dj_raw_event(struct hid_device *hdev,
|
||||
* device (via hid_input_report() ) and return 1 so hid-core does not do
|
||||
* anything else with it.
|
||||
*/
|
||||
|
||||
/* case 1) */
|
||||
if (data[0] != REPORT_ID_DJ_SHORT)
|
||||
return false;
|
||||
|
||||
if ((dj_report->device_index < DJ_DEVICE_INDEX_MIN) ||
|
||||
(dj_report->device_index > DJ_DEVICE_INDEX_MAX)) {
|
||||
dev_err(&hdev->dev, "%s: invalid device index:%d\n",
|
||||
/*
|
||||
* Device index is wrong, bail out.
|
||||
* This driver can ignore safely the receiver notifications,
|
||||
* so ignore those reports too.
|
||||
*/
|
||||
if (dj_report->device_index != DJ_RECEIVER_INDEX)
|
||||
dev_err(&hdev->dev, "%s: invalid device index:%d\n",
|
||||
__func__, dj_report->device_index);
|
||||
return false;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&djrcv_dev->lock, flags);
|
||||
if (dj_report->report_id == REPORT_ID_DJ_SHORT) {
|
||||
switch (dj_report->report_type) {
|
||||
case REPORT_TYPE_NOTIF_DEVICE_PAIRED:
|
||||
case REPORT_TYPE_NOTIF_DEVICE_UNPAIRED:
|
||||
logi_dj_recv_queue_notification(djrcv_dev, dj_report);
|
||||
break;
|
||||
case REPORT_TYPE_NOTIF_CONNECTION_STATUS:
|
||||
if (dj_report->report_params[CONNECTION_STATUS_PARAM_STATUS] ==
|
||||
STATUS_LINKLOSS) {
|
||||
logi_dj_recv_forward_null_report(djrcv_dev, dj_report);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
logi_dj_recv_forward_report(djrcv_dev, dj_report);
|
||||
switch (dj_report->report_type) {
|
||||
case REPORT_TYPE_NOTIF_DEVICE_PAIRED:
|
||||
case REPORT_TYPE_NOTIF_DEVICE_UNPAIRED:
|
||||
logi_dj_recv_queue_notification(djrcv_dev, dj_report);
|
||||
break;
|
||||
case REPORT_TYPE_NOTIF_CONNECTION_STATUS:
|
||||
if (dj_report->report_params[CONNECTION_STATUS_PARAM_STATUS] ==
|
||||
STATUS_LINKLOSS) {
|
||||
logi_dj_recv_forward_null_report(djrcv_dev, dj_report);
|
||||
}
|
||||
report_processed = true;
|
||||
break;
|
||||
default:
|
||||
logi_dj_recv_forward_report(djrcv_dev, dj_report);
|
||||
}
|
||||
spin_unlock_irqrestore(&djrcv_dev->lock, flags);
|
||||
|
||||
return report_processed;
|
||||
return true;
|
||||
}
|
||||
|
||||
static int logi_dj_probe(struct hid_device *hdev,
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
|
||||
#define DJ_MAX_PAIRED_DEVICES 6
|
||||
#define DJ_MAX_NUMBER_NOTIFICATIONS 8
|
||||
#define DJ_RECEIVER_INDEX 0
|
||||
#define DJ_DEVICE_INDEX_MIN 1
|
||||
#define DJ_DEVICE_INDEX_MAX 6
|
||||
|
||||
|
||||
@@ -290,6 +290,11 @@ static int magicmouse_raw_event(struct hid_device *hdev,
|
||||
if (size < 4 || ((size - 4) % 9) != 0)
|
||||
return 0;
|
||||
npoints = (size - 4) / 9;
|
||||
if (npoints > 15) {
|
||||
hid_warn(hdev, "invalid size value (%d) for TRACKPAD_REPORT_ID\n",
|
||||
size);
|
||||
return 0;
|
||||
}
|
||||
msc->ntouches = 0;
|
||||
for (ii = 0; ii < npoints; ii++)
|
||||
magicmouse_emit_touch(msc, ii, data + ii * 9 + 4);
|
||||
@@ -307,6 +312,11 @@ static int magicmouse_raw_event(struct hid_device *hdev,
|
||||
if (size < 6 || ((size - 6) % 8) != 0)
|
||||
return 0;
|
||||
npoints = (size - 6) / 8;
|
||||
if (npoints > 15) {
|
||||
hid_warn(hdev, "invalid size value (%d) for MOUSE_REPORT_ID\n",
|
||||
size);
|
||||
return 0;
|
||||
}
|
||||
msc->ntouches = 0;
|
||||
for (ii = 0; ii < npoints; ii++)
|
||||
magicmouse_emit_touch(msc, ii, data + ii * 8 + 6);
|
||||
|
||||
@@ -350,6 +350,12 @@ static int picolcd_raw_event(struct hid_device *hdev,
|
||||
if (!data)
|
||||
return 1;
|
||||
|
||||
if (size > 64) {
|
||||
hid_warn(hdev, "invalid size value (%d) for picolcd raw event\n",
|
||||
size);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (report->id == REPORT_KEY_STATE) {
|
||||
if (data->input_keys)
|
||||
ret = picolcd_raw_keypad(data, report, raw_data+1, size-1);
|
||||
|
||||
@@ -102,6 +102,7 @@ struct at91_twi_dev {
|
||||
unsigned twi_cwgr_reg;
|
||||
struct at91_twi_pdata *pdata;
|
||||
bool use_dma;
|
||||
bool recv_len_abort;
|
||||
struct at91_twi_dma dma;
|
||||
};
|
||||
|
||||
@@ -268,12 +269,24 @@ static void at91_twi_read_next_byte(struct at91_twi_dev *dev)
|
||||
*dev->buf = at91_twi_read(dev, AT91_TWI_RHR) & 0xff;
|
||||
--dev->buf_len;
|
||||
|
||||
/* return if aborting, we only needed to read RHR to clear RXRDY*/
|
||||
if (dev->recv_len_abort)
|
||||
return;
|
||||
|
||||
/* handle I2C_SMBUS_BLOCK_DATA */
|
||||
if (unlikely(dev->msg->flags & I2C_M_RECV_LEN)) {
|
||||
dev->msg->flags &= ~I2C_M_RECV_LEN;
|
||||
dev->buf_len += *dev->buf;
|
||||
dev->msg->len = dev->buf_len + 1;
|
||||
dev_dbg(dev->dev, "received block length %d\n", dev->buf_len);
|
||||
/* ensure length byte is a valid value */
|
||||
if (*dev->buf <= I2C_SMBUS_BLOCK_MAX && *dev->buf > 0) {
|
||||
dev->msg->flags &= ~I2C_M_RECV_LEN;
|
||||
dev->buf_len += *dev->buf;
|
||||
dev->msg->len = dev->buf_len + 1;
|
||||
dev_dbg(dev->dev, "received block length %d\n",
|
||||
dev->buf_len);
|
||||
} else {
|
||||
/* abort and send the stop by reading one more byte */
|
||||
dev->recv_len_abort = true;
|
||||
dev->buf_len = 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* send stop if second but last byte has been read */
|
||||
@@ -422,8 +435,8 @@ static int at91_do_twi_transfer(struct at91_twi_dev *dev)
|
||||
}
|
||||
}
|
||||
|
||||
ret = wait_for_completion_interruptible_timeout(&dev->cmd_complete,
|
||||
dev->adapter.timeout);
|
||||
ret = wait_for_completion_io_timeout(&dev->cmd_complete,
|
||||
dev->adapter.timeout);
|
||||
if (ret == 0) {
|
||||
dev_err(dev->dev, "controller timed out\n");
|
||||
at91_init_twi_bus(dev);
|
||||
@@ -445,6 +458,12 @@ static int at91_do_twi_transfer(struct at91_twi_dev *dev)
|
||||
ret = -EIO;
|
||||
goto error;
|
||||
}
|
||||
if (dev->recv_len_abort) {
|
||||
dev_err(dev->dev, "invalid smbus block length recvd\n");
|
||||
ret = -EPROTO;
|
||||
goto error;
|
||||
}
|
||||
|
||||
dev_dbg(dev->dev, "transfer complete\n");
|
||||
|
||||
return 0;
|
||||
@@ -501,6 +520,7 @@ static int at91_twi_xfer(struct i2c_adapter *adap, struct i2c_msg *msg, int num)
|
||||
dev->buf_len = m_start->len;
|
||||
dev->buf = m_start->buf;
|
||||
dev->msg = m_start;
|
||||
dev->recv_len_abort = false;
|
||||
|
||||
ret = at91_do_twi_transfer(dev);
|
||||
|
||||
|
||||
@@ -477,7 +477,7 @@ static int ad_sd_probe_trigger(struct iio_dev *indio_dev)
|
||||
goto error_free_irq;
|
||||
|
||||
/* select default trigger */
|
||||
indio_dev->trig = sigma_delta->trig;
|
||||
indio_dev->trig = iio_trigger_get(sigma_delta->trig);
|
||||
|
||||
return 0;
|
||||
|
||||
|
||||
@@ -49,7 +49,7 @@ int st_sensors_allocate_trigger(struct iio_dev *indio_dev,
|
||||
dev_err(&indio_dev->dev, "failed to register iio trigger.\n");
|
||||
goto iio_trigger_register_error;
|
||||
}
|
||||
indio_dev->trig = sdata->trig;
|
||||
indio_dev->trig = iio_trigger_get(sdata->trig);
|
||||
|
||||
return 0;
|
||||
|
||||
|
||||
@@ -135,7 +135,7 @@ int itg3200_probe_trigger(struct iio_dev *indio_dev)
|
||||
goto error_free_irq;
|
||||
|
||||
/* select default trigger */
|
||||
indio_dev->trig = st->trig;
|
||||
indio_dev->trig = iio_trigger_get(st->trig);
|
||||
|
||||
return 0;
|
||||
|
||||
|
||||
@@ -135,7 +135,7 @@ int inv_mpu6050_probe_trigger(struct iio_dev *indio_dev)
|
||||
ret = iio_trigger_register(st->trig);
|
||||
if (ret)
|
||||
goto error_free_irq;
|
||||
indio_dev->trig = st->trig;
|
||||
indio_dev->trig = iio_trigger_get(st->trig);
|
||||
|
||||
return 0;
|
||||
|
||||
|
||||
@@ -178,7 +178,7 @@ static struct iio_channel *of_iio_channel_get_by_name(struct device_node *np,
|
||||
index = of_property_match_string(np, "io-channel-names",
|
||||
name);
|
||||
chan = of_iio_channel_get(np, index);
|
||||
if (!IS_ERR(chan))
|
||||
if (!IS_ERR(chan) || PTR_ERR(chan) == -EPROBE_DEFER)
|
||||
break;
|
||||
else if (name && index >= 0) {
|
||||
pr_err("ERROR: could not get IIO channel %s:%s(%i)\n",
|
||||
|
||||
@@ -40,7 +40,8 @@
|
||||
#define ST_MAGN_FS_AVL_5600MG 5600
|
||||
#define ST_MAGN_FS_AVL_8000MG 8000
|
||||
#define ST_MAGN_FS_AVL_8100MG 8100
|
||||
#define ST_MAGN_FS_AVL_10000MG 10000
|
||||
#define ST_MAGN_FS_AVL_12000MG 12000
|
||||
#define ST_MAGN_FS_AVL_16000MG 16000
|
||||
|
||||
/* CUSTOM VALUES FOR SENSOR 1 */
|
||||
#define ST_MAGN_1_WAI_EXP 0x3c
|
||||
@@ -67,20 +68,20 @@
|
||||
#define ST_MAGN_1_FS_AVL_4700_VAL 0x05
|
||||
#define ST_MAGN_1_FS_AVL_5600_VAL 0x06
|
||||
#define ST_MAGN_1_FS_AVL_8100_VAL 0x07
|
||||
#define ST_MAGN_1_FS_AVL_1300_GAIN_XY 1100
|
||||
#define ST_MAGN_1_FS_AVL_1900_GAIN_XY 855
|
||||
#define ST_MAGN_1_FS_AVL_2500_GAIN_XY 670
|
||||
#define ST_MAGN_1_FS_AVL_4000_GAIN_XY 450
|
||||
#define ST_MAGN_1_FS_AVL_4700_GAIN_XY 400
|
||||
#define ST_MAGN_1_FS_AVL_5600_GAIN_XY 330
|
||||
#define ST_MAGN_1_FS_AVL_8100_GAIN_XY 230
|
||||
#define ST_MAGN_1_FS_AVL_1300_GAIN_Z 980
|
||||
#define ST_MAGN_1_FS_AVL_1900_GAIN_Z 760
|
||||
#define ST_MAGN_1_FS_AVL_2500_GAIN_Z 600
|
||||
#define ST_MAGN_1_FS_AVL_4000_GAIN_Z 400
|
||||
#define ST_MAGN_1_FS_AVL_4700_GAIN_Z 355
|
||||
#define ST_MAGN_1_FS_AVL_5600_GAIN_Z 295
|
||||
#define ST_MAGN_1_FS_AVL_8100_GAIN_Z 205
|
||||
#define ST_MAGN_1_FS_AVL_1300_GAIN_XY 909
|
||||
#define ST_MAGN_1_FS_AVL_1900_GAIN_XY 1169
|
||||
#define ST_MAGN_1_FS_AVL_2500_GAIN_XY 1492
|
||||
#define ST_MAGN_1_FS_AVL_4000_GAIN_XY 2222
|
||||
#define ST_MAGN_1_FS_AVL_4700_GAIN_XY 2500
|
||||
#define ST_MAGN_1_FS_AVL_5600_GAIN_XY 3030
|
||||
#define ST_MAGN_1_FS_AVL_8100_GAIN_XY 4347
|
||||
#define ST_MAGN_1_FS_AVL_1300_GAIN_Z 1020
|
||||
#define ST_MAGN_1_FS_AVL_1900_GAIN_Z 1315
|
||||
#define ST_MAGN_1_FS_AVL_2500_GAIN_Z 1666
|
||||
#define ST_MAGN_1_FS_AVL_4000_GAIN_Z 2500
|
||||
#define ST_MAGN_1_FS_AVL_4700_GAIN_Z 2816
|
||||
#define ST_MAGN_1_FS_AVL_5600_GAIN_Z 3389
|
||||
#define ST_MAGN_1_FS_AVL_8100_GAIN_Z 4878
|
||||
#define ST_MAGN_1_MULTIREAD_BIT false
|
||||
|
||||
/* CUSTOM VALUES FOR SENSOR 2 */
|
||||
@@ -103,10 +104,12 @@
|
||||
#define ST_MAGN_2_FS_MASK 0x60
|
||||
#define ST_MAGN_2_FS_AVL_4000_VAL 0x00
|
||||
#define ST_MAGN_2_FS_AVL_8000_VAL 0x01
|
||||
#define ST_MAGN_2_FS_AVL_10000_VAL 0x02
|
||||
#define ST_MAGN_2_FS_AVL_4000_GAIN 430
|
||||
#define ST_MAGN_2_FS_AVL_8000_GAIN 230
|
||||
#define ST_MAGN_2_FS_AVL_10000_GAIN 230
|
||||
#define ST_MAGN_2_FS_AVL_12000_VAL 0x02
|
||||
#define ST_MAGN_2_FS_AVL_16000_VAL 0x03
|
||||
#define ST_MAGN_2_FS_AVL_4000_GAIN 146
|
||||
#define ST_MAGN_2_FS_AVL_8000_GAIN 292
|
||||
#define ST_MAGN_2_FS_AVL_12000_GAIN 438
|
||||
#define ST_MAGN_2_FS_AVL_16000_GAIN 584
|
||||
#define ST_MAGN_2_MULTIREAD_BIT false
|
||||
#define ST_MAGN_2_OUT_X_L_ADDR 0x28
|
||||
#define ST_MAGN_2_OUT_Y_L_ADDR 0x2a
|
||||
@@ -252,9 +255,14 @@ static const struct st_sensors st_magn_sensors[] = {
|
||||
.gain = ST_MAGN_2_FS_AVL_8000_GAIN,
|
||||
},
|
||||
[2] = {
|
||||
.num = ST_MAGN_FS_AVL_10000MG,
|
||||
.value = ST_MAGN_2_FS_AVL_10000_VAL,
|
||||
.gain = ST_MAGN_2_FS_AVL_10000_GAIN,
|
||||
.num = ST_MAGN_FS_AVL_12000MG,
|
||||
.value = ST_MAGN_2_FS_AVL_12000_VAL,
|
||||
.gain = ST_MAGN_2_FS_AVL_12000_GAIN,
|
||||
},
|
||||
[3] = {
|
||||
.num = ST_MAGN_FS_AVL_16000MG,
|
||||
.value = ST_MAGN_2_FS_AVL_16000_VAL,
|
||||
.gain = ST_MAGN_2_FS_AVL_16000_GAIN,
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
@@ -404,7 +404,6 @@ isert_connect_request(struct rdma_cm_id *cma_id, struct rdma_cm_event *event)
|
||||
init_completion(&isert_conn->conn_wait);
|
||||
init_completion(&isert_conn->conn_wait_comp_err);
|
||||
kref_init(&isert_conn->conn_kref);
|
||||
kref_get(&isert_conn->conn_kref);
|
||||
mutex_init(&isert_conn->conn_mutex);
|
||||
|
||||
cma_id->context = isert_conn;
|
||||
@@ -530,7 +529,9 @@ isert_connect_release(struct isert_conn *isert_conn)
|
||||
static void
|
||||
isert_connected_handler(struct rdma_cm_id *cma_id)
|
||||
{
|
||||
return;
|
||||
struct isert_conn *isert_conn = cma_id->context;
|
||||
|
||||
kref_get(&isert_conn->conn_kref);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -582,7 +583,6 @@ isert_disconnect_work(struct work_struct *work)
|
||||
|
||||
wake_up:
|
||||
complete(&isert_conn->conn_wait);
|
||||
isert_put_conn(isert_conn);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -2265,6 +2265,7 @@ static void isert_wait_conn(struct iscsi_conn *conn)
|
||||
wait_for_completion(&isert_conn->conn_wait_comp_err);
|
||||
|
||||
wait_for_completion(&isert_conn->conn_wait);
|
||||
isert_put_conn(isert_conn);
|
||||
}
|
||||
|
||||
static void isert_free_conn(struct iscsi_conn *conn)
|
||||
|
||||
@@ -1791,14 +1791,6 @@ static const struct dmi_system_id atkbd_dmi_quirk_table[] __initconst = {
|
||||
{
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "LG Electronics"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "LW25-B7HV"),
|
||||
},
|
||||
.callback = atkbd_deactivate_fixup,
|
||||
},
|
||||
{
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "LG Electronics"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "P1-J273B"),
|
||||
},
|
||||
.callback = atkbd_deactivate_fixup,
|
||||
},
|
||||
|
||||
@@ -1223,6 +1223,13 @@ static bool elantech_is_signature_valid(const unsigned char *param)
|
||||
if (param[1] == 0)
|
||||
return true;
|
||||
|
||||
/*
|
||||
* Some models have a revision higher then 20. Meaning param[2] may
|
||||
* be 10 or 20, skip the rates check for these.
|
||||
*/
|
||||
if (param[0] == 0x46 && (param[1] & 0xef) == 0x0f && param[2] < 40)
|
||||
return true;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(rates); i++)
|
||||
if (param[2] == rates[i])
|
||||
return false;
|
||||
|
||||
@@ -549,10 +549,61 @@ static int synaptics_parse_hw_state(const unsigned char buf[],
|
||||
((buf[0] & 0x04) >> 1) |
|
||||
((buf[3] & 0x04) >> 2));
|
||||
|
||||
if ((SYN_CAP_ADV_GESTURE(priv->ext_cap_0c) ||
|
||||
SYN_CAP_IMAGE_SENSOR(priv->ext_cap_0c)) &&
|
||||
hw->w == 2) {
|
||||
synaptics_parse_agm(buf, priv, hw);
|
||||
return 1;
|
||||
}
|
||||
|
||||
hw->x = (((buf[3] & 0x10) << 8) |
|
||||
((buf[1] & 0x0f) << 8) |
|
||||
buf[4]);
|
||||
hw->y = (((buf[3] & 0x20) << 7) |
|
||||
((buf[1] & 0xf0) << 4) |
|
||||
buf[5]);
|
||||
hw->z = buf[2];
|
||||
|
||||
hw->left = (buf[0] & 0x01) ? 1 : 0;
|
||||
hw->right = (buf[0] & 0x02) ? 1 : 0;
|
||||
|
||||
if (SYN_CAP_CLICKPAD(priv->ext_cap_0c)) {
|
||||
if (SYN_CAP_FORCEPAD(priv->ext_cap_0c)) {
|
||||
/*
|
||||
* ForcePads, like Clickpads, use middle button
|
||||
* bits to report primary button clicks.
|
||||
* Unfortunately they report primary button not
|
||||
* only when user presses on the pad above certain
|
||||
* threshold, but also when there are more than one
|
||||
* finger on the touchpad, which interferes with
|
||||
* out multi-finger gestures.
|
||||
*/
|
||||
if (hw->z == 0) {
|
||||
/* No contacts */
|
||||
priv->press = priv->report_press = false;
|
||||
} else if (hw->w >= 4 && ((buf[0] ^ buf[3]) & 0x01)) {
|
||||
/*
|
||||
* Single-finger touch with pressure above
|
||||
* the threshold. If pressure stays long
|
||||
* enough, we'll start reporting primary
|
||||
* button. We rely on the device continuing
|
||||
* sending data even if finger does not
|
||||
* move.
|
||||
*/
|
||||
if (!priv->press) {
|
||||
priv->press_start = jiffies;
|
||||
priv->press = true;
|
||||
} else if (time_after(jiffies,
|
||||
priv->press_start +
|
||||
msecs_to_jiffies(50))) {
|
||||
priv->report_press = true;
|
||||
}
|
||||
} else {
|
||||
priv->press = false;
|
||||
}
|
||||
|
||||
hw->left = priv->report_press;
|
||||
|
||||
} else if (SYN_CAP_CLICKPAD(priv->ext_cap_0c)) {
|
||||
/*
|
||||
* Clickpad's button is transmitted as middle button,
|
||||
* however, since it is primary button, we will report
|
||||
@@ -571,21 +622,6 @@ static int synaptics_parse_hw_state(const unsigned char buf[],
|
||||
hw->down = ((buf[0] ^ buf[3]) & 0x02) ? 1 : 0;
|
||||
}
|
||||
|
||||
if ((SYN_CAP_ADV_GESTURE(priv->ext_cap_0c) ||
|
||||
SYN_CAP_IMAGE_SENSOR(priv->ext_cap_0c)) &&
|
||||
hw->w == 2) {
|
||||
synaptics_parse_agm(buf, priv, hw);
|
||||
return 1;
|
||||
}
|
||||
|
||||
hw->x = (((buf[3] & 0x10) << 8) |
|
||||
((buf[1] & 0x0f) << 8) |
|
||||
buf[4]);
|
||||
hw->y = (((buf[3] & 0x20) << 7) |
|
||||
((buf[1] & 0xf0) << 4) |
|
||||
buf[5]);
|
||||
hw->z = buf[2];
|
||||
|
||||
if (SYN_CAP_MULTI_BUTTON_NO(priv->ext_cap) &&
|
||||
((buf[0] ^ buf[3]) & 0x02)) {
|
||||
switch (SYN_CAP_MULTI_BUTTON_NO(priv->ext_cap) & ~0x01) {
|
||||
|
||||
@@ -78,6 +78,11 @@
|
||||
* 2 0x08 image sensor image sensor tracks 5 fingers, but only
|
||||
* reports 2.
|
||||
* 2 0x20 report min query 0x0f gives min coord reported
|
||||
* 2 0x80 forcepad forcepad is a variant of clickpad that
|
||||
* does not have physical buttons but rather
|
||||
* uses pressure above certain threshold to
|
||||
* report primary clicks. Forcepads also have
|
||||
* clickpad bit set.
|
||||
*/
|
||||
#define SYN_CAP_CLICKPAD(ex0c) ((ex0c) & 0x100000) /* 1-button ClickPad */
|
||||
#define SYN_CAP_CLICKPAD2BTN(ex0c) ((ex0c) & 0x000100) /* 2-button ClickPad */
|
||||
@@ -86,6 +91,7 @@
|
||||
#define SYN_CAP_ADV_GESTURE(ex0c) ((ex0c) & 0x080000)
|
||||
#define SYN_CAP_REDUCED_FILTERING(ex0c) ((ex0c) & 0x000400)
|
||||
#define SYN_CAP_IMAGE_SENSOR(ex0c) ((ex0c) & 0x000800)
|
||||
#define SYN_CAP_FORCEPAD(ex0c) ((ex0c) & 0x008000)
|
||||
|
||||
/* synaptics modes query bits */
|
||||
#define SYN_MODE_ABSOLUTE(m) ((m) & (1 << 7))
|
||||
@@ -177,6 +183,11 @@ struct synaptics_data {
|
||||
*/
|
||||
struct synaptics_hw_state agm;
|
||||
bool agm_pending; /* new AGM packet received */
|
||||
|
||||
/* ForcePad handling */
|
||||
unsigned long press_start;
|
||||
bool press;
|
||||
bool report_press;
|
||||
};
|
||||
|
||||
void synaptics_module_init(void);
|
||||
|
||||
@@ -458,6 +458,13 @@ static const struct dmi_system_id __initconst i8042_dmi_nomux_table[] = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv4 Notebook PC"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* Avatar AVIU-145A6 */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Intel"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "IC4I"),
|
||||
},
|
||||
},
|
||||
{ }
|
||||
};
|
||||
|
||||
@@ -601,6 +608,14 @@ static const struct dmi_system_id __initconst i8042_dmi_notimeout_table[] = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv4 Notebook PC"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* Fujitsu U574 laptop */
|
||||
/* https://bugzilla.kernel.org/show_bug.cgi?id=69731 */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK U574"),
|
||||
},
|
||||
},
|
||||
{ }
|
||||
};
|
||||
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/serio.h>
|
||||
#include <linux/tty.h>
|
||||
#include <linux/compat.h>
|
||||
|
||||
MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
|
||||
MODULE_DESCRIPTION("Input device TTY line discipline");
|
||||
@@ -196,29 +197,56 @@ static ssize_t serport_ldisc_read(struct tty_struct * tty, struct file * file, u
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void serport_set_type(struct tty_struct *tty, unsigned long type)
|
||||
{
|
||||
struct serport *serport = tty->disc_data;
|
||||
|
||||
serport->id.proto = type & 0x000000ff;
|
||||
serport->id.id = (type & 0x0000ff00) >> 8;
|
||||
serport->id.extra = (type & 0x00ff0000) >> 16;
|
||||
}
|
||||
|
||||
/*
|
||||
* serport_ldisc_ioctl() allows to set the port protocol, and device ID
|
||||
*/
|
||||
|
||||
static int serport_ldisc_ioctl(struct tty_struct * tty, struct file * file, unsigned int cmd, unsigned long arg)
|
||||
static int serport_ldisc_ioctl(struct tty_struct *tty, struct file *file,
|
||||
unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
struct serport *serport = (struct serport*) tty->disc_data;
|
||||
unsigned long type;
|
||||
|
||||
if (cmd == SPIOCSTYPE) {
|
||||
unsigned long type;
|
||||
|
||||
if (get_user(type, (unsigned long __user *) arg))
|
||||
return -EFAULT;
|
||||
|
||||
serport->id.proto = type & 0x000000ff;
|
||||
serport->id.id = (type & 0x0000ff00) >> 8;
|
||||
serport->id.extra = (type & 0x00ff0000) >> 16;
|
||||
|
||||
serport_set_type(tty, type);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
#define COMPAT_SPIOCSTYPE _IOW('q', 0x01, compat_ulong_t)
|
||||
static long serport_ldisc_compat_ioctl(struct tty_struct *tty,
|
||||
struct file *file,
|
||||
unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
if (cmd == COMPAT_SPIOCSTYPE) {
|
||||
void __user *uarg = compat_ptr(arg);
|
||||
compat_ulong_t compat_type;
|
||||
|
||||
if (get_user(compat_type, (compat_ulong_t __user *)uarg))
|
||||
return -EFAULT;
|
||||
|
||||
serport_set_type(tty, compat_type);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
#endif
|
||||
|
||||
static void serport_ldisc_write_wakeup(struct tty_struct * tty)
|
||||
{
|
||||
struct serport *serport = (struct serport *) tty->disc_data;
|
||||
@@ -241,6 +269,9 @@ static struct tty_ldisc_ops serport_ldisc = {
|
||||
.close = serport_ldisc_close,
|
||||
.read = serport_ldisc_read,
|
||||
.ioctl = serport_ldisc_ioctl,
|
||||
#ifdef CONFIG_COMPAT
|
||||
.compat_ioctl = serport_ldisc_compat_ioctl,
|
||||
#endif
|
||||
.receive_buf = serport_ldisc_receive,
|
||||
.write_wakeup = serport_ldisc_write_wakeup
|
||||
};
|
||||
|
||||
@@ -1599,6 +1599,7 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv)
|
||||
unsigned int key_size, opt_params;
|
||||
unsigned long long tmpll;
|
||||
int ret;
|
||||
size_t iv_size_padding;
|
||||
struct dm_arg_set as;
|
||||
const char *opt_string;
|
||||
char dummy;
|
||||
@@ -1634,19 +1635,30 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv)
|
||||
goto bad;
|
||||
}
|
||||
|
||||
if (cc->hw_fmp == 0) {
|
||||
cc->dmreq_start = sizeof(struct ablkcipher_request);
|
||||
cc->dmreq_start += crypto_ablkcipher_reqsize(any_tfm(cc));
|
||||
cc->dmreq_start = ALIGN(cc->dmreq_start, crypto_tfm_ctx_alignment());
|
||||
cc->dmreq_start += crypto_ablkcipher_alignmask(any_tfm(cc)) &
|
||||
~(crypto_tfm_ctx_alignment() - 1);
|
||||
|
||||
cc->req_pool = mempool_create_kmalloc_pool(MIN_IOS, cc->dmreq_start +
|
||||
sizeof(struct dm_crypt_request) + cc->iv_size);
|
||||
if (!cc->req_pool) {
|
||||
ti->error = "Cannot allocate crypt request mempool";
|
||||
goto bad;
|
||||
}
|
||||
cc->dmreq_start = sizeof(struct ablkcipher_request);
|
||||
cc->dmreq_start += crypto_ablkcipher_reqsize(any_tfm(cc));
|
||||
cc->dmreq_start = ALIGN(cc->dmreq_start, __alignof__(struct dm_crypt_request));
|
||||
|
||||
if (crypto_ablkcipher_alignmask(any_tfm(cc)) < CRYPTO_MINALIGN) {
|
||||
/* Allocate the padding exactly */
|
||||
iv_size_padding = -(cc->dmreq_start + sizeof(struct dm_crypt_request))
|
||||
& crypto_ablkcipher_alignmask(any_tfm(cc));
|
||||
} else {
|
||||
/*
|
||||
* If the cipher requires greater alignment than kmalloc
|
||||
* alignment, we don't know the exact position of the
|
||||
* initialization vector. We must assume worst case.
|
||||
*/
|
||||
iv_size_padding = crypto_ablkcipher_alignmask(any_tfm(cc));
|
||||
}
|
||||
|
||||
cc->req_pool = mempool_create_kmalloc_pool(MIN_IOS, cc->dmreq_start +
|
||||
sizeof(struct dm_crypt_request) + iv_size_padding + cc->iv_size);
|
||||
if (!cc->req_pool) {
|
||||
ti->error = "Cannot allocate crypt request mempool";
|
||||
goto bad;
|
||||
}
|
||||
|
||||
cc->page_pool = mempool_create_page_pool(MIN_POOL_PAGES, 0);
|
||||
if (!cc->page_pool) {
|
||||
|
||||
@@ -2051,7 +2051,7 @@ static void fix_read_error(struct r1conf *conf, int read_disk,
|
||||
d--;
|
||||
rdev = conf->mirrors[d].rdev;
|
||||
if (rdev &&
|
||||
test_bit(In_sync, &rdev->flags))
|
||||
!test_bit(Faulty, &rdev->flags))
|
||||
r1_sync_page_io(rdev, sect, s,
|
||||
conf->tmppage, WRITE);
|
||||
}
|
||||
@@ -2063,7 +2063,7 @@ static void fix_read_error(struct r1conf *conf, int read_disk,
|
||||
d--;
|
||||
rdev = conf->mirrors[d].rdev;
|
||||
if (rdev &&
|
||||
test_bit(In_sync, &rdev->flags)) {
|
||||
!test_bit(Faulty, &rdev->flags)) {
|
||||
if (r1_sync_page_io(rdev, sect, s,
|
||||
conf->tmppage, READ)) {
|
||||
atomic_add(s, &rdev->corrected_errors);
|
||||
|
||||
@@ -1092,6 +1092,7 @@ static int cx18_probe(struct pci_dev *pci_dev,
|
||||
setup.addr = ADDR_UNSET;
|
||||
setup.type = cx->options.tuner;
|
||||
setup.mode_mask = T_ANALOG_TV; /* matches TV tuners */
|
||||
setup.config = NULL;
|
||||
if (cx->options.radio > 0)
|
||||
setup.mode_mask |= T_RADIO;
|
||||
setup.tuner_callback = (setup.type == TUNER_XC2028) ?
|
||||
|
||||
@@ -293,6 +293,18 @@ failure:
|
||||
atomic_add(buffers_added, &(pool->available));
|
||||
}
|
||||
|
||||
/*
|
||||
* The final 8 bytes of the buffer list is a counter of frames dropped
|
||||
* because there was not a buffer in the buffer list capable of holding
|
||||
* the frame.
|
||||
*/
|
||||
static void ibmveth_update_rx_no_buffer(struct ibmveth_adapter *adapter)
|
||||
{
|
||||
__be64 *p = adapter->buffer_list_addr + 4096 - 8;
|
||||
|
||||
adapter->rx_no_buffer = be64_to_cpup(p);
|
||||
}
|
||||
|
||||
/* replenish routine */
|
||||
static void ibmveth_replenish_task(struct ibmveth_adapter *adapter)
|
||||
{
|
||||
@@ -308,8 +320,7 @@ static void ibmveth_replenish_task(struct ibmveth_adapter *adapter)
|
||||
ibmveth_replenish_buffer_pool(adapter, pool);
|
||||
}
|
||||
|
||||
adapter->rx_no_buffer = *(u64 *)(((char*)adapter->buffer_list_addr) +
|
||||
4096 - 8);
|
||||
ibmveth_update_rx_no_buffer(adapter);
|
||||
}
|
||||
|
||||
/* empty and free ana buffer pool - also used to do cleanup in error paths */
|
||||
@@ -689,8 +700,7 @@ static int ibmveth_close(struct net_device *netdev)
|
||||
|
||||
free_irq(netdev->irq, netdev);
|
||||
|
||||
adapter->rx_no_buffer = *(u64 *)(((char *)adapter->buffer_list_addr) +
|
||||
4096 - 8);
|
||||
ibmveth_update_rx_no_buffer(adapter);
|
||||
|
||||
ibmveth_cleanup(adapter);
|
||||
|
||||
|
||||
@@ -253,6 +253,7 @@ struct ar9170 {
|
||||
atomic_t rx_work_urbs;
|
||||
atomic_t rx_pool_urbs;
|
||||
kernel_ulong_t features;
|
||||
bool usb_ep_cmd_is_bulk;
|
||||
|
||||
/* firmware settings */
|
||||
struct completion fw_load_wait;
|
||||
|
||||
@@ -621,9 +621,16 @@ int __carl9170_exec_cmd(struct ar9170 *ar, struct carl9170_cmd *cmd,
|
||||
goto err_free;
|
||||
}
|
||||
|
||||
usb_fill_int_urb(urb, ar->udev, usb_sndintpipe(ar->udev,
|
||||
AR9170_USB_EP_CMD), cmd, cmd->hdr.len + 4,
|
||||
carl9170_usb_cmd_complete, ar, 1);
|
||||
if (ar->usb_ep_cmd_is_bulk)
|
||||
usb_fill_bulk_urb(urb, ar->udev,
|
||||
usb_sndbulkpipe(ar->udev, AR9170_USB_EP_CMD),
|
||||
cmd, cmd->hdr.len + 4,
|
||||
carl9170_usb_cmd_complete, ar);
|
||||
else
|
||||
usb_fill_int_urb(urb, ar->udev,
|
||||
usb_sndintpipe(ar->udev, AR9170_USB_EP_CMD),
|
||||
cmd, cmd->hdr.len + 4,
|
||||
carl9170_usb_cmd_complete, ar, 1);
|
||||
|
||||
if (free_buf)
|
||||
urb->transfer_flags |= URB_FREE_BUFFER;
|
||||
@@ -1032,9 +1039,10 @@ static void carl9170_usb_firmware_step2(const struct firmware *fw,
|
||||
static int carl9170_usb_probe(struct usb_interface *intf,
|
||||
const struct usb_device_id *id)
|
||||
{
|
||||
struct usb_endpoint_descriptor *ep;
|
||||
struct ar9170 *ar;
|
||||
struct usb_device *udev;
|
||||
int err;
|
||||
int i, err;
|
||||
|
||||
err = usb_reset_device(interface_to_usbdev(intf));
|
||||
if (err)
|
||||
@@ -1050,6 +1058,21 @@ static int carl9170_usb_probe(struct usb_interface *intf,
|
||||
ar->intf = intf;
|
||||
ar->features = id->driver_info;
|
||||
|
||||
/* We need to remember the type of endpoint 4 because it differs
|
||||
* between high- and full-speed configuration. The high-speed
|
||||
* configuration specifies it as interrupt and the full-speed
|
||||
* configuration as bulk endpoint. This information is required
|
||||
* later when sending urbs to that endpoint.
|
||||
*/
|
||||
for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; ++i) {
|
||||
ep = &intf->cur_altsetting->endpoint[i].desc;
|
||||
|
||||
if (usb_endpoint_num(ep) == AR9170_USB_EP_CMD &&
|
||||
usb_endpoint_dir_out(ep) &&
|
||||
usb_endpoint_type(ep) == USB_ENDPOINT_XFER_BULK)
|
||||
ar->usb_ep_cmd_is_bulk = true;
|
||||
}
|
||||
|
||||
usb_set_intfdata(intf, ar);
|
||||
SET_IEEE80211_DEV(ar->hw, &intf->dev);
|
||||
|
||||
|
||||
@@ -1072,6 +1072,13 @@ int iwlagn_commit_rxon(struct iwl_priv *priv, struct iwl_rxon_context *ctx)
|
||||
/* recalculate basic rates */
|
||||
iwl_calc_basic_rates(priv, ctx);
|
||||
|
||||
/*
|
||||
* force CTS-to-self frames protection if RTS-CTS is not preferred
|
||||
* one aggregation protection method
|
||||
*/
|
||||
if (!priv->hw_params.use_rts_for_aggregation)
|
||||
ctx->staging.flags |= RXON_FLG_SELF_CTS_EN;
|
||||
|
||||
if ((ctx->vif && ctx->vif->bss_conf.use_short_slot) ||
|
||||
!(ctx->staging.flags & RXON_FLG_BAND_24G_MSK))
|
||||
ctx->staging.flags |= RXON_FLG_SHORT_SLOT_MSK;
|
||||
@@ -1477,6 +1484,11 @@ void iwlagn_bss_info_changed(struct ieee80211_hw *hw,
|
||||
else
|
||||
ctx->staging.flags &= ~RXON_FLG_TGG_PROTECT_MSK;
|
||||
|
||||
if (bss_conf->use_cts_prot)
|
||||
ctx->staging.flags |= RXON_FLG_SELF_CTS_EN;
|
||||
else
|
||||
ctx->staging.flags &= ~RXON_FLG_SELF_CTS_EN;
|
||||
|
||||
memcpy(ctx->staging.bssid_addr, bss_conf->bssid, ETH_ALEN);
|
||||
|
||||
if (vif->type == NL80211_IFTYPE_AP ||
|
||||
|
||||
@@ -316,6 +316,7 @@ static struct usb_device_id rtl8192c_usb_ids[] = {
|
||||
{RTL_USB_DEVICE(0x0bda, 0x5088, rtl92cu_hal_cfg)}, /*Thinkware-CC&C*/
|
||||
{RTL_USB_DEVICE(0x0df6, 0x0052, rtl92cu_hal_cfg)}, /*Sitecom - Edimax*/
|
||||
{RTL_USB_DEVICE(0x0df6, 0x005c, rtl92cu_hal_cfg)}, /*Sitecom - Edimax*/
|
||||
{RTL_USB_DEVICE(0x0df6, 0x0070, rtl92cu_hal_cfg)}, /*Sitecom - 150N */
|
||||
{RTL_USB_DEVICE(0x0df6, 0x0077, rtl92cu_hal_cfg)}, /*Sitecom-WLA2100V2*/
|
||||
{RTL_USB_DEVICE(0x0eb0, 0x9071, rtl92cu_hal_cfg)}, /*NO Brand - Etop*/
|
||||
{RTL_USB_DEVICE(0x4856, 0x0091, rtl92cu_hal_cfg)}, /*NetweeN - Feixun*/
|
||||
|
||||
@@ -501,9 +501,13 @@ static void microread_target_discovered(struct nfc_hci_dev *hdev, u8 gate,
|
||||
targets->sens_res =
|
||||
be16_to_cpu(*(u16 *)&skb->data[MICROREAD_EMCF_A_ATQA]);
|
||||
targets->sel_res = skb->data[MICROREAD_EMCF_A_SAK];
|
||||
memcpy(targets->nfcid1, &skb->data[MICROREAD_EMCF_A_UID],
|
||||
skb->data[MICROREAD_EMCF_A_LEN]);
|
||||
targets->nfcid1_len = skb->data[MICROREAD_EMCF_A_LEN];
|
||||
if (targets->nfcid1_len > sizeof(targets->nfcid1)) {
|
||||
r = -EINVAL;
|
||||
goto exit_free;
|
||||
}
|
||||
memcpy(targets->nfcid1, &skb->data[MICROREAD_EMCF_A_UID],
|
||||
targets->nfcid1_len);
|
||||
break;
|
||||
case MICROREAD_GATE_ID_MREAD_ISO_A_3:
|
||||
targets->supported_protocols =
|
||||
@@ -511,9 +515,13 @@ static void microread_target_discovered(struct nfc_hci_dev *hdev, u8 gate,
|
||||
targets->sens_res =
|
||||
be16_to_cpu(*(u16 *)&skb->data[MICROREAD_EMCF_A3_ATQA]);
|
||||
targets->sel_res = skb->data[MICROREAD_EMCF_A3_SAK];
|
||||
memcpy(targets->nfcid1, &skb->data[MICROREAD_EMCF_A3_UID],
|
||||
skb->data[MICROREAD_EMCF_A3_LEN]);
|
||||
targets->nfcid1_len = skb->data[MICROREAD_EMCF_A3_LEN];
|
||||
if (targets->nfcid1_len > sizeof(targets->nfcid1)) {
|
||||
r = -EINVAL;
|
||||
goto exit_free;
|
||||
}
|
||||
memcpy(targets->nfcid1, &skb->data[MICROREAD_EMCF_A3_UID],
|
||||
targets->nfcid1_len);
|
||||
break;
|
||||
case MICROREAD_GATE_ID_MREAD_ISO_B:
|
||||
targets->supported_protocols = NFC_PROTO_ISO14443_B_MASK;
|
||||
|
||||
@@ -717,11 +717,21 @@ __iscsi_conn_send_pdu(struct iscsi_conn *conn, struct iscsi_hdr *hdr,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (data_size > ISCSI_DEF_MAX_RECV_SEG_LEN) {
|
||||
iscsi_conn_printk(KERN_ERR, conn, "Invalid buffer len of %u for login task. Max len is %u\n", data_size, ISCSI_DEF_MAX_RECV_SEG_LEN);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
task = conn->login_task;
|
||||
} else {
|
||||
if (session->state != ISCSI_STATE_LOGGED_IN)
|
||||
return NULL;
|
||||
|
||||
if (data_size != 0) {
|
||||
iscsi_conn_printk(KERN_ERR, conn, "Can not send data buffer of len %u for op 0x%x\n", data_size, opcode);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
BUG_ON(conn->c_stage == ISCSI_CONN_INITIAL_STAGE);
|
||||
BUG_ON(conn->c_stage == ISCSI_CONN_STOPPED);
|
||||
|
||||
|
||||
@@ -85,7 +85,7 @@ int ade7758_probe_trigger(struct iio_dev *indio_dev)
|
||||
ret = iio_trigger_register(st->trig);
|
||||
|
||||
/* select default trigger */
|
||||
indio_dev->trig = st->trig;
|
||||
indio_dev->trig = iio_trigger_get(st->trig);
|
||||
if (ret)
|
||||
goto error_free_irq;
|
||||
|
||||
|
||||
@@ -4453,6 +4453,7 @@ static void iscsit_logout_post_handler_diffcid(
|
||||
{
|
||||
struct iscsi_conn *l_conn;
|
||||
struct iscsi_session *sess = conn->sess;
|
||||
bool conn_found = false;
|
||||
|
||||
if (!sess)
|
||||
return;
|
||||
@@ -4461,12 +4462,13 @@ static void iscsit_logout_post_handler_diffcid(
|
||||
list_for_each_entry(l_conn, &sess->sess_conn_list, conn_list) {
|
||||
if (l_conn->cid == cid) {
|
||||
iscsit_inc_conn_usage_count(l_conn);
|
||||
conn_found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
spin_unlock_bh(&sess->conn_lock);
|
||||
|
||||
if (!l_conn)
|
||||
if (!conn_found)
|
||||
return;
|
||||
|
||||
if (l_conn->sock)
|
||||
|
||||
@@ -603,7 +603,7 @@ int iscsi_copy_param_list(
|
||||
param_list = kzalloc(sizeof(struct iscsi_param_list), GFP_KERNEL);
|
||||
if (!param_list) {
|
||||
pr_err("Unable to allocate memory for struct iscsi_param_list.\n");
|
||||
goto err_out;
|
||||
return -1;
|
||||
}
|
||||
INIT_LIST_HEAD(¶m_list->param_list);
|
||||
INIT_LIST_HEAD(¶m_list->extra_response_list);
|
||||
|
||||
@@ -192,21 +192,28 @@ int serial8250_request_dma(struct uart_8250_port *p)
|
||||
|
||||
dma->rx_buf = dma_alloc_coherent(dma->rxchan->device->dev, dma->rx_size,
|
||||
&dma->rx_addr, GFP_KERNEL);
|
||||
if (!dma->rx_buf) {
|
||||
dma_release_channel(dma->rxchan);
|
||||
dma_release_channel(dma->txchan);
|
||||
return -ENOMEM;
|
||||
}
|
||||
if (!dma->rx_buf)
|
||||
goto err;
|
||||
|
||||
/* TX buffer */
|
||||
dma->tx_addr = dma_map_single(dma->txchan->device->dev,
|
||||
p->port.state->xmit.buf,
|
||||
UART_XMIT_SIZE,
|
||||
DMA_TO_DEVICE);
|
||||
if (dma_mapping_error(dma->txchan->device->dev, dma->tx_addr)) {
|
||||
dma_free_coherent(dma->rxchan->device->dev, dma->rx_size,
|
||||
dma->rx_buf, dma->rx_addr);
|
||||
goto err;
|
||||
}
|
||||
|
||||
dev_dbg_ratelimited(p->port.dev, "got both dma channels\n");
|
||||
|
||||
return 0;
|
||||
err:
|
||||
dma_release_channel(dma->rxchan);
|
||||
dma_release_channel(dma->txchan);
|
||||
|
||||
return -ENOMEM;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(serial8250_request_dma);
|
||||
|
||||
|
||||
@@ -1165,7 +1165,8 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type)
|
||||
/* Tell khubd to disconnect the device or
|
||||
* check for a new connection
|
||||
*/
|
||||
if (udev || (portstatus & USB_PORT_STAT_CONNECTION))
|
||||
if (udev || (portstatus & USB_PORT_STAT_CONNECTION) ||
|
||||
(portstatus & USB_PORT_STAT_OVERCURRENT))
|
||||
set_bit(port1, hub->change_bits);
|
||||
|
||||
} else if (portstatus & USB_PORT_STAT_ENABLE) {
|
||||
@@ -4702,9 +4703,10 @@ static void hub_events(void)
|
||||
|
||||
hub = list_entry(tmp, struct usb_hub, event_list);
|
||||
kref_get(&hub->kref);
|
||||
hdev = hub->hdev;
|
||||
usb_get_dev(hdev);
|
||||
spin_unlock_irq(&hub_event_lock);
|
||||
|
||||
hdev = hub->hdev;
|
||||
hub_dev = hub->intfdev;
|
||||
intf = to_usb_interface(hub_dev);
|
||||
dev_dbg(hub_dev, "state %d ports %d chg %04x evt %04x\n",
|
||||
@@ -4919,6 +4921,7 @@ static void hub_events(void)
|
||||
usb_autopm_put_interface(intf);
|
||||
loop_disconnected:
|
||||
usb_unlock_device(hdev);
|
||||
usb_put_dev(hdev);
|
||||
kref_put(&hub->kref, hub_release);
|
||||
|
||||
} /* end while (1) */
|
||||
|
||||
@@ -649,8 +649,15 @@ static int dwc3_remove(struct platform_device *pdev)
|
||||
|
||||
dwc3_event_buffers_cleanup(dwc);
|
||||
dwc3_free_event_buffers(dwc);
|
||||
|
||||
usb_phy_set_suspend(dwc->usb2_phy, 1);
|
||||
usb_phy_set_suspend(dwc->usb3_phy, 1);
|
||||
|
||||
dwc3_core_exit(dwc);
|
||||
|
||||
pm_runtime_put_sync(&pdev->dev);
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -375,9 +375,9 @@ static int dwc3_omap_remove(struct platform_device *pdev)
|
||||
struct dwc3_omap *omap = platform_get_drvdata(pdev);
|
||||
|
||||
dwc3_omap_disable_irqs(omap);
|
||||
device_for_each_child(&pdev->dev, NULL, dwc3_omap_remove_core);
|
||||
pm_runtime_put_sync(&pdev->dev);
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
device_for_each_child(&pdev->dev, NULL, dwc3_omap_remove_core);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -972,8 +972,6 @@ rescan:
|
||||
}
|
||||
|
||||
qh->exception = 1;
|
||||
if (ehci->rh_state < EHCI_RH_RUNNING)
|
||||
qh->qh_state = QH_STATE_IDLE;
|
||||
switch (qh->qh_state) {
|
||||
case QH_STATE_LINKED:
|
||||
case QH_STATE_COMPLETING:
|
||||
|
||||
@@ -462,7 +462,8 @@ void xhci_test_and_clear_bit(struct xhci_hcd *xhci, __le32 __iomem **port_array,
|
||||
}
|
||||
|
||||
/* Updates Link Status for super Speed port */
|
||||
static void xhci_hub_report_link_state(u32 *status, u32 status_reg)
|
||||
static void xhci_hub_report_link_state(struct xhci_hcd *xhci,
|
||||
u32 *status, u32 status_reg)
|
||||
{
|
||||
u32 pls = status_reg & PORT_PLS_MASK;
|
||||
|
||||
@@ -501,7 +502,8 @@ static void xhci_hub_report_link_state(u32 *status, u32 status_reg)
|
||||
* in which sometimes the port enters compliance mode
|
||||
* caused by a delay on the host-device negotiation.
|
||||
*/
|
||||
if (pls == USB_SS_PORT_LS_COMP_MOD)
|
||||
if ((xhci->quirks & XHCI_COMP_MODE_QUIRK) &&
|
||||
(pls == USB_SS_PORT_LS_COMP_MOD))
|
||||
pls |= USB_PORT_STAT_CONNECTION;
|
||||
}
|
||||
|
||||
@@ -686,7 +688,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
|
||||
}
|
||||
/* Update Port Link State for super speed ports*/
|
||||
if (hcd->speed == HCD_USB3) {
|
||||
xhci_hub_report_link_state(&status, temp);
|
||||
xhci_hub_report_link_state(xhci, &status, temp);
|
||||
/*
|
||||
* Verify if all USB3 Ports Have entered U0 already.
|
||||
* Delete Compliance Mode Timer if so.
|
||||
|
||||
@@ -1795,7 +1795,7 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci)
|
||||
}
|
||||
|
||||
num_ports = HCS_MAX_PORTS(xhci->hcs_params1);
|
||||
for (i = 0; i < num_ports; i++) {
|
||||
for (i = 0; i < num_ports && xhci->rh_bw; i++) {
|
||||
struct xhci_interval_bw_table *bwt = &xhci->rh_bw[i].bw_table;
|
||||
for (j = 0; j < XHCI_MAX_INTERVAL; j++) {
|
||||
struct list_head *ep = &bwt->interval_bw[j].endpoints;
|
||||
|
||||
@@ -4407,13 +4407,21 @@ static int xhci_change_max_exit_latency(struct xhci_hcd *xhci,
|
||||
int ret;
|
||||
|
||||
spin_lock_irqsave(&xhci->lock, flags);
|
||||
if (max_exit_latency == xhci->devs[udev->slot_id]->current_mel) {
|
||||
|
||||
virt_dev = xhci->devs[udev->slot_id];
|
||||
|
||||
/*
|
||||
* virt_dev might not exists yet if xHC resumed from hibernate (S4) and
|
||||
* xHC was re-initialized. Exit latency will be set later after
|
||||
* hub_port_finish_reset() is done and xhci->devs[] are re-allocated
|
||||
*/
|
||||
|
||||
if (!virt_dev || max_exit_latency == virt_dev->current_mel) {
|
||||
spin_unlock_irqrestore(&xhci->lock, flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Attempt to issue an Evaluate Context command to change the MEL. */
|
||||
virt_dev = xhci->devs[udev->slot_id];
|
||||
command = xhci->lpm_command;
|
||||
xhci_slot_copy(xhci, command->in_ctx, virt_dev->out_ctx);
|
||||
spin_unlock_irqrestore(&xhci->lock, flags);
|
||||
|
||||
@@ -3248,6 +3248,7 @@ static const struct usb_device_id sisusb_table[] = {
|
||||
{ USB_DEVICE(0x0711, 0x0918) },
|
||||
{ USB_DEVICE(0x0711, 0x0920) },
|
||||
{ USB_DEVICE(0x0711, 0x0950) },
|
||||
{ USB_DEVICE(0x0711, 0x5200) },
|
||||
{ USB_DEVICE(0x182d, 0x021c) },
|
||||
{ USB_DEVICE(0x182d, 0x0269) },
|
||||
{ }
|
||||
|
||||
@@ -744,6 +744,7 @@ static struct usb_device_id id_table_combined [] = {
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_NDI_AURORA_SCU_PID),
|
||||
.driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
|
||||
{ USB_DEVICE(TELLDUS_VID, TELLDUS_TELLSTICK_PID) },
|
||||
{ USB_DEVICE(NOVITUS_VID, NOVITUS_BONO_E_PID) },
|
||||
{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_S03_PID) },
|
||||
{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_59_PID) },
|
||||
{ USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_57A_PID) },
|
||||
|
||||
@@ -836,6 +836,12 @@
|
||||
#define TELLDUS_VID 0x1781 /* Vendor ID */
|
||||
#define TELLDUS_TELLSTICK_PID 0x0C30 /* RF control dongle 433 MHz using FT232RL */
|
||||
|
||||
/*
|
||||
* NOVITUS printers
|
||||
*/
|
||||
#define NOVITUS_VID 0x1a28
|
||||
#define NOVITUS_BONO_E_PID 0x6010
|
||||
|
||||
/*
|
||||
* RT Systems programming cables for various ham radios
|
||||
*/
|
||||
|
||||
@@ -275,8 +275,12 @@ static void option_instat_callback(struct urb *urb);
|
||||
#define ZTE_PRODUCT_MF622 0x0001
|
||||
#define ZTE_PRODUCT_MF628 0x0015
|
||||
#define ZTE_PRODUCT_MF626 0x0031
|
||||
#define ZTE_PRODUCT_MC2718 0xffe8
|
||||
#define ZTE_PRODUCT_AC2726 0xfff1
|
||||
#define ZTE_PRODUCT_CDMA_TECH 0xfffe
|
||||
#define ZTE_PRODUCT_AC8710T 0xffff
|
||||
#define ZTE_PRODUCT_MC2718 0xffe8
|
||||
#define ZTE_PRODUCT_AD3812 0xffeb
|
||||
#define ZTE_PRODUCT_MC2716 0xffed
|
||||
|
||||
#define BENQ_VENDOR_ID 0x04a5
|
||||
#define BENQ_PRODUCT_H10 0x4068
|
||||
@@ -494,6 +498,10 @@ static void option_instat_callback(struct urb *urb);
|
||||
#define INOVIA_VENDOR_ID 0x20a6
|
||||
#define INOVIA_SEW858 0x1105
|
||||
|
||||
/* VIA Telecom */
|
||||
#define VIATELECOM_VENDOR_ID 0x15eb
|
||||
#define VIATELECOM_PRODUCT_CDS7 0x0001
|
||||
|
||||
/* some devices interfaces need special handling due to a number of reasons */
|
||||
enum option_blacklist_reason {
|
||||
OPTION_BLACKLIST_NONE = 0,
|
||||
@@ -527,10 +535,18 @@ static const struct option_blacklist_info zte_k3765_z_blacklist = {
|
||||
.reserved = BIT(4),
|
||||
};
|
||||
|
||||
static const struct option_blacklist_info zte_ad3812_z_blacklist = {
|
||||
.sendsetup = BIT(0) | BIT(1) | BIT(2),
|
||||
};
|
||||
|
||||
static const struct option_blacklist_info zte_mc2718_z_blacklist = {
|
||||
.sendsetup = BIT(1) | BIT(2) | BIT(3) | BIT(4),
|
||||
};
|
||||
|
||||
static const struct option_blacklist_info zte_mc2716_z_blacklist = {
|
||||
.sendsetup = BIT(1) | BIT(2) | BIT(3),
|
||||
};
|
||||
|
||||
static const struct option_blacklist_info huawei_cdc12_blacklist = {
|
||||
.reserved = BIT(1) | BIT(2),
|
||||
};
|
||||
@@ -1070,6 +1086,7 @@ static const struct usb_device_id option_ids[] = {
|
||||
{ USB_DEVICE_INTERFACE_CLASS(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1012, 0xff) },
|
||||
{ USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC650) },
|
||||
{ USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC680) },
|
||||
{ USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6000)}, /* ZTE AC8700 */
|
||||
{ USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */
|
||||
{ USB_DEVICE(QUALCOMM_VENDOR_ID, 0x0023)}, /* ONYX 3G device */
|
||||
{ USB_DEVICE(QUALCOMM_VENDOR_ID, 0x9000)}, /* SIMCom SIM5218 */
|
||||
@@ -1544,13 +1561,18 @@ static const struct usb_device_id option_ids[] = {
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff93, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff94, 0xff, 0xff, 0xff) },
|
||||
|
||||
/* NOTE: most ZTE CDMA devices should be driven by zte_ev, not option */
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_CDMA_TECH, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC2726, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC8710T, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MC2718, 0xff, 0xff, 0xff),
|
||||
.driver_info = (kernel_ulong_t)&zte_mc2718_z_blacklist },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AD3812, 0xff, 0xff, 0xff),
|
||||
.driver_info = (kernel_ulong_t)&zte_ad3812_z_blacklist },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MC2716, 0xff, 0xff, 0xff),
|
||||
.driver_info = (kernel_ulong_t)&zte_mc2716_z_blacklist },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x02, 0x01) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x02, 0x05) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x86, 0x10) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC2726, 0xff, 0xff, 0xff) },
|
||||
|
||||
{ USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_H10) },
|
||||
{ USB_DEVICE(DLINK_VENDOR_ID, DLINK_PRODUCT_DWM_652) },
|
||||
@@ -1724,6 +1746,7 @@ static const struct usb_device_id option_ids[] = {
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x3e01, 0xff, 0xff, 0xff) }, /* D-Link DWM-152/C1 */
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x3e02, 0xff, 0xff, 0xff) }, /* D-Link DWM-156/C1 */
|
||||
{ USB_DEVICE(INOVIA_VENDOR_ID, INOVIA_SEW858) },
|
||||
{ USB_DEVICE(VIATELECOM_VENDOR_ID, VIATELECOM_PRODUCT_CDS7) },
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
MODULE_DEVICE_TABLE(usb, option_ids);
|
||||
@@ -1917,6 +1940,8 @@ static void option_instat_callback(struct urb *urb)
|
||||
dev_dbg(dev, "%s: type %x req %x\n", __func__,
|
||||
req_pkt->bRequestType, req_pkt->bRequest);
|
||||
}
|
||||
} else if (status == -ENOENT || status == -ESHUTDOWN) {
|
||||
dev_dbg(dev, "%s: urb stopped: %d\n", __func__, status);
|
||||
} else
|
||||
dev_err(dev, "%s: error %d\n", __func__, status);
|
||||
|
||||
|
||||
@@ -47,6 +47,7 @@ static const struct usb_device_id id_table[] = {
|
||||
{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GPRS) },
|
||||
{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_HCR331) },
|
||||
{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_MOTOROLA) },
|
||||
{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_ZTEK) },
|
||||
{ USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) },
|
||||
{ USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID_RSAQ5) },
|
||||
{ USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID) },
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#define PL2303_PRODUCT_ID_GPRS 0x0609
|
||||
#define PL2303_PRODUCT_ID_HCR331 0x331a
|
||||
#define PL2303_PRODUCT_ID_MOTOROLA 0x0307
|
||||
#define PL2303_PRODUCT_ID_ZTEK 0xe1f1
|
||||
|
||||
#define ATEN_VENDOR_ID 0x0557
|
||||
#define ATEN_VENDOR_ID2 0x0547
|
||||
|
||||
@@ -282,14 +282,19 @@ static const struct usb_device_id id_table[] = {
|
||||
/* Sierra Wireless HSPA Non-Composite Device */
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(0x1199, 0x6892, 0xFF, 0xFF, 0xFF)},
|
||||
{ USB_DEVICE(0x1199, 0x6893) }, /* Sierra Wireless Device */
|
||||
{ USB_DEVICE(0x1199, 0x68A3), /* Sierra Wireless Direct IP modems */
|
||||
/* Sierra Wireless Direct IP modems */
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(0x1199, 0x68A3, 0xFF, 0xFF, 0xFF),
|
||||
.driver_info = (kernel_ulong_t)&direct_ip_interface_blacklist
|
||||
},
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(0x1199, 0x68AA, 0xFF, 0xFF, 0xFF),
|
||||
.driver_info = (kernel_ulong_t)&direct_ip_interface_blacklist
|
||||
},
|
||||
/* AT&T Direct IP LTE modems */
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(0x0F3D, 0x68AA, 0xFF, 0xFF, 0xFF),
|
||||
.driver_info = (kernel_ulong_t)&direct_ip_interface_blacklist
|
||||
},
|
||||
{ USB_DEVICE(0x0f3d, 0x68A3), /* Airprime/Sierra Wireless Direct IP modems */
|
||||
/* Airprime/Sierra Wireless Direct IP modems */
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(0x0F3D, 0x68A3, 0xFF, 0xFF, 0xFF),
|
||||
.driver_info = (kernel_ulong_t)&direct_ip_interface_blacklist
|
||||
},
|
||||
|
||||
|
||||
@@ -778,29 +778,39 @@ static int usb_serial_probe(struct usb_interface *interface,
|
||||
if (usb_endpoint_is_bulk_in(endpoint)) {
|
||||
/* we found a bulk in endpoint */
|
||||
dev_dbg(ddev, "found bulk in on endpoint %d\n", i);
|
||||
bulk_in_endpoint[num_bulk_in] = endpoint;
|
||||
++num_bulk_in;
|
||||
if (num_bulk_in < MAX_NUM_PORTS) {
|
||||
bulk_in_endpoint[num_bulk_in] = endpoint;
|
||||
++num_bulk_in;
|
||||
}
|
||||
}
|
||||
|
||||
if (usb_endpoint_is_bulk_out(endpoint)) {
|
||||
/* we found a bulk out endpoint */
|
||||
dev_dbg(ddev, "found bulk out on endpoint %d\n", i);
|
||||
bulk_out_endpoint[num_bulk_out] = endpoint;
|
||||
++num_bulk_out;
|
||||
if (num_bulk_out < MAX_NUM_PORTS) {
|
||||
bulk_out_endpoint[num_bulk_out] = endpoint;
|
||||
++num_bulk_out;
|
||||
}
|
||||
}
|
||||
|
||||
if (usb_endpoint_is_int_in(endpoint)) {
|
||||
/* we found a interrupt in endpoint */
|
||||
dev_dbg(ddev, "found interrupt in on endpoint %d\n", i);
|
||||
interrupt_in_endpoint[num_interrupt_in] = endpoint;
|
||||
++num_interrupt_in;
|
||||
if (num_interrupt_in < MAX_NUM_PORTS) {
|
||||
interrupt_in_endpoint[num_interrupt_in] =
|
||||
endpoint;
|
||||
++num_interrupt_in;
|
||||
}
|
||||
}
|
||||
|
||||
if (usb_endpoint_is_int_out(endpoint)) {
|
||||
/* we found an interrupt out endpoint */
|
||||
dev_dbg(ddev, "found interrupt out on endpoint %d\n", i);
|
||||
interrupt_out_endpoint[num_interrupt_out] = endpoint;
|
||||
++num_interrupt_out;
|
||||
if (num_interrupt_out < MAX_NUM_PORTS) {
|
||||
interrupt_out_endpoint[num_interrupt_out] =
|
||||
endpoint;
|
||||
++num_interrupt_out;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -823,8 +833,10 @@ static int usb_serial_probe(struct usb_interface *interface,
|
||||
if (usb_endpoint_is_int_in(endpoint)) {
|
||||
/* we found a interrupt in endpoint */
|
||||
dev_dbg(ddev, "found interrupt in for Prolific device on separate interface\n");
|
||||
interrupt_in_endpoint[num_interrupt_in] = endpoint;
|
||||
++num_interrupt_in;
|
||||
if (num_interrupt_in < MAX_NUM_PORTS) {
|
||||
interrupt_in_endpoint[num_interrupt_in] = endpoint;
|
||||
++num_interrupt_in;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -864,6 +876,11 @@ static int usb_serial_probe(struct usb_interface *interface,
|
||||
num_ports = type->num_ports;
|
||||
}
|
||||
|
||||
if (num_ports > MAX_NUM_PORTS) {
|
||||
dev_warn(ddev, "too many ports requested: %d\n", num_ports);
|
||||
num_ports = MAX_NUM_PORTS;
|
||||
}
|
||||
|
||||
serial->num_ports = num_ports;
|
||||
serial->num_bulk_in = num_bulk_in;
|
||||
serial->num_bulk_out = num_bulk_out;
|
||||
|
||||
@@ -273,28 +273,16 @@ static void zte_ev_usb_serial_close(struct usb_serial_port *port)
|
||||
}
|
||||
|
||||
static const struct usb_device_id id_table[] = {
|
||||
/* AC8710, AC8710T */
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xffff, 0xff, 0xff, 0xff) },
|
||||
/* AC8700 */
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xfffe, 0xff, 0xff, 0xff) },
|
||||
/* MG880 */
|
||||
{ USB_DEVICE(0x19d2, 0xfffd) },
|
||||
{ USB_DEVICE(0x19d2, 0xfffc) },
|
||||
{ USB_DEVICE(0x19d2, 0xfffb) },
|
||||
/* AC8710_V3 */
|
||||
{ USB_DEVICE(0x19d2, 0xffec) },
|
||||
{ USB_DEVICE(0x19d2, 0xffee) },
|
||||
{ USB_DEVICE(0x19d2, 0xfff6) },
|
||||
{ USB_DEVICE(0x19d2, 0xfff7) },
|
||||
{ USB_DEVICE(0x19d2, 0xfff8) },
|
||||
{ USB_DEVICE(0x19d2, 0xfff9) },
|
||||
{ USB_DEVICE(0x19d2, 0xffee) },
|
||||
/* AC2716, MC2716 */
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xffed, 0xff, 0xff, 0xff) },
|
||||
/* AD3812 */
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xffeb, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE(0x19d2, 0xffec) },
|
||||
{ USB_DEVICE(0x05C6, 0x3197) },
|
||||
{ USB_DEVICE(0x05C6, 0x6000) },
|
||||
{ USB_DEVICE(0x05C6, 0x9008) },
|
||||
{ USB_DEVICE(0x19d2, 0xfffb) },
|
||||
{ USB_DEVICE(0x19d2, 0xfffc) },
|
||||
/* MG880 */
|
||||
{ USB_DEVICE(0x19d2, 0xfffd) },
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(usb, id_table);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user