mirror of
https://github.com/hardkernel/linux.git
synced 2026-03-24 19:40:21 +09:00
Merge tag 'v3.8.13.18' of git://kernel.ubuntu.com/ubuntu/linux into odroid-3.8.y
v3.8.13.18
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
* Marvell Orion SATA
|
||||
|
||||
Required Properties:
|
||||
- compatibility : "marvell,orion-sata"
|
||||
- compatibility : "marvell,orion-sata" or "marvell,armada-370-sata"
|
||||
- reg : Address range of controller
|
||||
- interrupts : Interrupt controller is using
|
||||
- nr-ports : Number of SATA ports in use.
|
||||
|
||||
@@ -1372,8 +1372,8 @@ may allocate from based on an estimation of its current memory and swap use.
|
||||
For example, if a task is using all allowed memory, its badness score will be
|
||||
1000. If it is using half of its allowed memory, its score will be 500.
|
||||
|
||||
There is an additional factor included in the badness score: root
|
||||
processes are given 3% extra memory over other tasks.
|
||||
There is an additional factor included in the badness score: the current memory
|
||||
and swap usage is discounted by 3% for root processes.
|
||||
|
||||
The amount of "allowed" memory depends on the context in which the oom killer
|
||||
was called. If it is due to the memory assigned to the allocating task's cpuset
|
||||
|
||||
2
Makefile
2
Makefile
@@ -1,7 +1,7 @@
|
||||
VERSION = 3
|
||||
PATCHLEVEL = 8
|
||||
SUBLEVEL = 13
|
||||
EXTRAVERSION = .17
|
||||
EXTRAVERSION = .18
|
||||
NAME = Remoralised Urchins Update
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
||||
@@ -373,6 +373,11 @@ csum_partial_copy_from_user(const void __user *src, void *dst, int len,
|
||||
__wsum
|
||||
csum_partial_copy_nocheck(const void *src, void *dst, int len, __wsum sum)
|
||||
{
|
||||
return csum_partial_copy_from_user((__force const void __user *)src,
|
||||
dst, len, sum, NULL);
|
||||
__wsum checksum;
|
||||
mm_segment_t oldfs = get_fs();
|
||||
set_fs(KERNEL_DS);
|
||||
checksum = csum_partial_copy_from_user((__force const void __user *)src,
|
||||
dst, len, sum, NULL);
|
||||
set_fs(oldfs);
|
||||
return checksum;
|
||||
}
|
||||
|
||||
@@ -79,8 +79,8 @@
|
||||
};
|
||||
|
||||
sata@d00a0000 {
|
||||
compatible = "marvell,orion-sata";
|
||||
reg = <0xd00a0000 0x2400>;
|
||||
compatible = "marvell,armada-370-sata";
|
||||
reg = <0xd00a0000 0x5000>;
|
||||
interrupts = <55>;
|
||||
clocks = <&gateclk 15>, <&gateclk 30>;
|
||||
clock-names = "0", "1";
|
||||
|
||||
@@ -630,10 +630,10 @@ load_ind:
|
||||
emit(ARM_MUL(r_A, r_A, r_X), ctx);
|
||||
break;
|
||||
case BPF_S_ALU_DIV_K:
|
||||
/* current k == reciprocal_value(userspace k) */
|
||||
if (k == 1)
|
||||
break;
|
||||
emit_mov_i(r_scratch, k, ctx);
|
||||
/* A = top 32 bits of the product */
|
||||
emit(ARM_UMULL(r_scratch, r_A, r_A, r_scratch), ctx);
|
||||
emit_udiv(r_A, r_A, r_scratch, ctx);
|
||||
break;
|
||||
case BPF_S_ALU_DIV_X:
|
||||
update_on_xread(ctx);
|
||||
|
||||
@@ -788,6 +788,9 @@ static void remove_cache_dir(struct cache_dir *cache_dir)
|
||||
{
|
||||
remove_index_dirs(cache_dir);
|
||||
|
||||
/* Remove cache dir from sysfs */
|
||||
kobject_del(cache_dir->kobj);
|
||||
|
||||
kobject_put(cache_dir->kobj);
|
||||
|
||||
kfree(cache_dir);
|
||||
|
||||
@@ -209,10 +209,11 @@ static int bpf_jit_build_body(struct sk_filter *fp, u32 *image,
|
||||
}
|
||||
PPC_DIVWU(r_A, r_A, r_X);
|
||||
break;
|
||||
case BPF_S_ALU_DIV_K: /* A = reciprocal_divide(A, K); */
|
||||
case BPF_S_ALU_DIV_K: /* A /= K */
|
||||
if (K == 1)
|
||||
break;
|
||||
PPC_LI32(r_scratch1, K);
|
||||
/* Top 32 bits of 64bit result -> A */
|
||||
PPC_MULHWU(r_A, r_A, r_scratch1);
|
||||
PPC_DIVWU(r_A, r_A, r_scratch1);
|
||||
break;
|
||||
case BPF_S_ALU_AND_X:
|
||||
ctx->seen |= SEEN_XREG;
|
||||
|
||||
@@ -106,7 +106,7 @@ static int __diag_ipl_functions(struct kvm_vcpu *vcpu)
|
||||
|
||||
int kvm_s390_handle_diag(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
int code = (vcpu->arch.sie_block->ipb & 0xfff0000) >> 16;
|
||||
int code = kvm_s390_get_base_disp_rs(vcpu) & 0xffff;
|
||||
|
||||
trace_kvm_s390_handle_diag(vcpu, code);
|
||||
switch (code) {
|
||||
|
||||
@@ -755,7 +755,7 @@ static int __guestcopy(struct kvm_vcpu *vcpu, u64 guestdest, void *from,
|
||||
* KVM_S390_STORE_STATUS_NOADDR: -> 0x1200 on 64 bit
|
||||
* KVM_S390_STORE_STATUS_PREFIXED: -> prefix
|
||||
*/
|
||||
int kvm_s390_vcpu_store_status(struct kvm_vcpu *vcpu, unsigned long addr)
|
||||
int kvm_s390_store_status_unloaded(struct kvm_vcpu *vcpu, unsigned long addr)
|
||||
{
|
||||
unsigned char archmode = 1;
|
||||
int prefix;
|
||||
@@ -773,14 +773,6 @@ int kvm_s390_vcpu_store_status(struct kvm_vcpu *vcpu, unsigned long addr)
|
||||
} else
|
||||
prefix = 0;
|
||||
|
||||
/*
|
||||
* The guest FPRS and ACRS are in the host FPRS/ACRS due to the lazy
|
||||
* copying in vcpu load/put. Lets update our copies before we save
|
||||
* it into the save area
|
||||
*/
|
||||
save_fp_regs(&vcpu->arch.guest_fpregs);
|
||||
save_access_regs(vcpu->run->s.regs.acrs);
|
||||
|
||||
if (__guestcopy(vcpu, addr + offsetof(struct save_area, fp_regs),
|
||||
vcpu->arch.guest_fpregs.fprs, 128, prefix))
|
||||
return -EFAULT;
|
||||
@@ -825,6 +817,19 @@ int kvm_s390_vcpu_store_status(struct kvm_vcpu *vcpu, unsigned long addr)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int kvm_s390_vcpu_store_status(struct kvm_vcpu *vcpu, unsigned long addr)
|
||||
{
|
||||
/*
|
||||
* The guest FPRS and ACRS are in the host FPRS/ACRS due to the lazy
|
||||
* copying in vcpu load/put. Lets update our copies before we save
|
||||
* it into the save area
|
||||
*/
|
||||
save_fp_regs(&vcpu->arch.guest_fpregs);
|
||||
save_access_regs(vcpu->run->s.regs.acrs);
|
||||
|
||||
return kvm_s390_store_status_unloaded(vcpu, addr);
|
||||
}
|
||||
|
||||
long kvm_arch_vcpu_ioctl(struct file *filp,
|
||||
unsigned int ioctl, unsigned long arg)
|
||||
{
|
||||
|
||||
@@ -85,8 +85,8 @@ int kvm_s390_handle_01(struct kvm_vcpu *vcpu);
|
||||
int kvm_s390_handle_sigp(struct kvm_vcpu *vcpu);
|
||||
|
||||
/* implemented in kvm-s390.c */
|
||||
int kvm_s390_vcpu_store_status(struct kvm_vcpu *vcpu,
|
||||
unsigned long addr);
|
||||
int kvm_s390_store_status_unloaded(struct kvm_vcpu *vcpu, unsigned long addr);
|
||||
int kvm_s390_vcpu_store_status(struct kvm_vcpu *vcpu, unsigned long addr);
|
||||
/* implemented in diag.c */
|
||||
int kvm_s390_handle_diag(struct kvm_vcpu *vcpu);
|
||||
|
||||
|
||||
@@ -130,6 +130,7 @@ unlock:
|
||||
static int __inject_sigp_stop(struct kvm_s390_local_interrupt *li, int action)
|
||||
{
|
||||
struct kvm_s390_interrupt_info *inti;
|
||||
int rc = SIGP_CC_ORDER_CODE_ACCEPTED;
|
||||
|
||||
inti = kzalloc(sizeof(*inti), GFP_ATOMIC);
|
||||
if (!inti)
|
||||
@@ -137,8 +138,12 @@ static int __inject_sigp_stop(struct kvm_s390_local_interrupt *li, int action)
|
||||
inti->type = KVM_S390_SIGP_STOP;
|
||||
|
||||
spin_lock_bh(&li->lock);
|
||||
if ((atomic_read(li->cpuflags) & CPUSTAT_STOPPED))
|
||||
if ((atomic_read(li->cpuflags) & CPUSTAT_STOPPED)) {
|
||||
kfree(inti);
|
||||
if ((action & ACTION_STORE_ON_STOP) != 0)
|
||||
rc = -ESHUTDOWN;
|
||||
goto out;
|
||||
}
|
||||
list_add_tail(&inti->list, &li->list);
|
||||
atomic_set(&li->active, 1);
|
||||
atomic_set_mask(CPUSTAT_STOP_INT, li->cpuflags);
|
||||
@@ -148,7 +153,7 @@ static int __inject_sigp_stop(struct kvm_s390_local_interrupt *li, int action)
|
||||
out:
|
||||
spin_unlock_bh(&li->lock);
|
||||
|
||||
return SIGP_CC_ORDER_CODE_ACCEPTED;
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int __sigp_stop(struct kvm_vcpu *vcpu, u16 cpu_addr, int action)
|
||||
@@ -172,6 +177,16 @@ static int __sigp_stop(struct kvm_vcpu *vcpu, u16 cpu_addr, int action)
|
||||
unlock:
|
||||
spin_unlock(&fi->lock);
|
||||
VCPU_EVENT(vcpu, 4, "sent sigp stop to cpu %x", cpu_addr);
|
||||
|
||||
if ((action & ACTION_STORE_ON_STOP) != 0 && rc == -ESHUTDOWN) {
|
||||
/* If the CPU has already been stopped, we still have
|
||||
* to save the status when doing stop-and-store. This
|
||||
* has to be done after unlocking all spinlocks. */
|
||||
struct kvm_vcpu *dst_vcpu = kvm_get_vcpu(vcpu->kvm, cpu_addr);
|
||||
rc = kvm_s390_store_status_unloaded(dst_vcpu,
|
||||
KVM_S390_STORE_STATUS_NOADDR);
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
@@ -332,14 +332,16 @@ static int bpf_jit_insn(struct bpf_jit *jit, struct sock_filter *filter,
|
||||
EMIT4_PCREL(0xa7840000, (jit->ret0_ip - jit->prg));
|
||||
/* lhi %r4,0 */
|
||||
EMIT4(0xa7480000);
|
||||
/* dr %r4,%r12 */
|
||||
EMIT2(0x1d4c);
|
||||
/* dlr %r4,%r12 */
|
||||
EMIT4(0xb997004c);
|
||||
break;
|
||||
case BPF_S_ALU_DIV_K: /* A = reciprocal_divide(A, K) */
|
||||
/* m %r4,<d(K)>(%r13) */
|
||||
EMIT4_DISP(0x5c40d000, EMIT_CONST(K));
|
||||
/* lr %r5,%r4 */
|
||||
EMIT2(0x1854);
|
||||
case BPF_S_ALU_DIV_K: /* A /= K */
|
||||
if (K == 1)
|
||||
break;
|
||||
/* lhi %r4,0 */
|
||||
EMIT4(0xa7480000);
|
||||
/* dl %r4,<d(K)>(%r13) */
|
||||
EMIT6_DISP(0xe340d000, 0x0097, EMIT_CONST(K));
|
||||
break;
|
||||
case BPF_S_ALU_MOD_X: /* A %= X */
|
||||
jit->seen |= SEEN_XREG | SEEN_RET0;
|
||||
@@ -349,16 +351,21 @@ static int bpf_jit_insn(struct bpf_jit *jit, struct sock_filter *filter,
|
||||
EMIT4_PCREL(0xa7840000, (jit->ret0_ip - jit->prg));
|
||||
/* lhi %r4,0 */
|
||||
EMIT4(0xa7480000);
|
||||
/* dr %r4,%r12 */
|
||||
EMIT2(0x1d4c);
|
||||
/* dlr %r4,%r12 */
|
||||
EMIT4(0xb997004c);
|
||||
/* lr %r5,%r4 */
|
||||
EMIT2(0x1854);
|
||||
break;
|
||||
case BPF_S_ALU_MOD_K: /* A %= K */
|
||||
if (K == 1) {
|
||||
/* lhi %r5,0 */
|
||||
EMIT4(0xa7580000);
|
||||
break;
|
||||
}
|
||||
/* lhi %r4,0 */
|
||||
EMIT4(0xa7480000);
|
||||
/* d %r4,<d(K)>(%r13) */
|
||||
EMIT4_DISP(0x5d40d000, EMIT_CONST(K));
|
||||
/* dl %r4,<d(K)>(%r13) */
|
||||
EMIT6_DISP(0xe340d000, 0x0097, EMIT_CONST(K));
|
||||
/* lr %r5,%r4 */
|
||||
EMIT2(0x1854);
|
||||
break;
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
#include <linux/kdebug.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/sched.h>
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/traps.h>
|
||||
|
||||
|
||||
@@ -497,9 +497,20 @@ void bpf_jit_compile(struct sk_filter *fp)
|
||||
case BPF_S_ALU_MUL_K: /* A *= K */
|
||||
emit_alu_K(MUL, K);
|
||||
break;
|
||||
case BPF_S_ALU_DIV_K: /* A /= K */
|
||||
emit_alu_K(MUL, K);
|
||||
emit_read_y(r_A);
|
||||
case BPF_S_ALU_DIV_K: /* A /= K with K != 0*/
|
||||
if (K == 1)
|
||||
break;
|
||||
emit_write_y(G0);
|
||||
#ifdef CONFIG_SPARC32
|
||||
/* The Sparc v8 architecture requires
|
||||
* three instructions between a %y
|
||||
* register write and the first use.
|
||||
*/
|
||||
emit_nop();
|
||||
emit_nop();
|
||||
emit_nop();
|
||||
#endif
|
||||
emit_alu_K(DIV, K);
|
||||
break;
|
||||
case BPF_S_ALU_DIV_X: /* A /= X; */
|
||||
emit_cmpi(r_X, 0);
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
|
||||
#include "irq.h"
|
||||
#include "i8254.h"
|
||||
#include "x86.h"
|
||||
|
||||
#ifndef CONFIG_X86_64
|
||||
#define mod_64(x, y) ((x) - (y) * div64_u64(x, y))
|
||||
@@ -350,6 +351,23 @@ static void create_pit_timer(struct kvm *kvm, u32 val, int is_period)
|
||||
atomic_set(&ps->pending, 0);
|
||||
ps->irq_ack = 1;
|
||||
|
||||
/*
|
||||
* Do not allow the guest to program periodic timers with small
|
||||
* interval, since the hrtimers are not throttled by the host
|
||||
* scheduler.
|
||||
*/
|
||||
if (ps->is_periodic) {
|
||||
s64 min_period = min_timer_period_us * 1000LL;
|
||||
|
||||
if (ps->period < min_period) {
|
||||
pr_info_ratelimited(
|
||||
"kvm: requested %lld ns "
|
||||
"i8254 timer period limited to %lld ns\n",
|
||||
ps->period, min_period);
|
||||
ps->period = min_period;
|
||||
}
|
||||
}
|
||||
|
||||
hrtimer_start(&ps->timer, ktime_add_ns(ktime_get(), interval),
|
||||
HRTIMER_MODE_ABS);
|
||||
}
|
||||
|
||||
@@ -71,9 +71,6 @@
|
||||
#define VEC_POS(v) ((v) & (32 - 1))
|
||||
#define REG_POS(v) (((v) >> 5) << 4)
|
||||
|
||||
static unsigned int min_timer_period_us = 500;
|
||||
module_param(min_timer_period_us, uint, S_IRUGO | S_IWUSR);
|
||||
|
||||
static inline void apic_set_reg(struct kvm_lapic *apic, int reg_off, u32 val)
|
||||
{
|
||||
*((u32 *) (apic->regs + reg_off)) = val;
|
||||
|
||||
@@ -94,6 +94,9 @@ EXPORT_SYMBOL_GPL(kvm_x86_ops);
|
||||
static bool ignore_msrs = 0;
|
||||
module_param(ignore_msrs, bool, S_IRUGO | S_IWUSR);
|
||||
|
||||
unsigned int min_timer_period_us = 500;
|
||||
module_param(min_timer_period_us, uint, S_IRUGO | S_IWUSR);
|
||||
|
||||
bool kvm_has_tsc_control;
|
||||
EXPORT_SYMBOL_GPL(kvm_has_tsc_control);
|
||||
u32 kvm_max_guest_tsc_khz;
|
||||
|
||||
@@ -124,5 +124,7 @@ int kvm_write_guest_virt_system(struct x86_emulate_ctxt *ctxt,
|
||||
|
||||
extern u64 host_xcr0;
|
||||
|
||||
extern unsigned int min_timer_period_us;
|
||||
|
||||
extern struct static_key kvm_no_apic_vcpu;
|
||||
#endif
|
||||
|
||||
@@ -303,15 +303,21 @@ void bpf_jit_compile(struct sk_filter *fp)
|
||||
EMIT2(0x89, 0xd0); /* mov %edx,%eax */
|
||||
break;
|
||||
case BPF_S_ALU_MOD_K: /* A %= K; */
|
||||
if (K == 1) {
|
||||
CLEAR_A();
|
||||
break;
|
||||
}
|
||||
EMIT2(0x31, 0xd2); /* xor %edx,%edx */
|
||||
EMIT1(0xb9);EMIT(K, 4); /* mov imm32,%ecx */
|
||||
EMIT2(0xf7, 0xf1); /* div %ecx */
|
||||
EMIT2(0x89, 0xd0); /* mov %edx,%eax */
|
||||
break;
|
||||
case BPF_S_ALU_DIV_K: /* A = reciprocal_divide(A, K); */
|
||||
EMIT3(0x48, 0x69, 0xc0); /* imul imm32,%rax,%rax */
|
||||
EMIT(K, 4);
|
||||
EMIT4(0x48, 0xc1, 0xe8, 0x20); /* shr $0x20,%rax */
|
||||
case BPF_S_ALU_DIV_K: /* A /= K */
|
||||
if (K == 1)
|
||||
break;
|
||||
EMIT2(0x31, 0xd2); /* xor %edx,%edx */
|
||||
EMIT1(0xb9);EMIT(K, 4); /* mov imm32,%ecx */
|
||||
EMIT2(0xf7, 0xf1); /* div %ecx */
|
||||
break;
|
||||
case BPF_S_ALU_AND_X:
|
||||
seen |= SEEN_XREG;
|
||||
|
||||
@@ -428,7 +428,7 @@ void __init efi_reserve_boot_services(void)
|
||||
* - Not within any part of the kernel
|
||||
* - Not the bios reserved area
|
||||
*/
|
||||
if ((start+size >= virt_to_phys(_text)
|
||||
if ((start + size > virt_to_phys(_text)
|
||||
&& start <= virt_to_phys(_end)) ||
|
||||
!e820_all_mapped(start, start+size, E820_RAM) ||
|
||||
memblock_is_region_reserved(start, size)) {
|
||||
|
||||
@@ -69,6 +69,80 @@ static int check_platform_magic(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool xen_has_pv_devices()
|
||||
{
|
||||
if (!xen_domain())
|
||||
return false;
|
||||
|
||||
/* PV domains always have them. */
|
||||
if (xen_pv_domain())
|
||||
return true;
|
||||
|
||||
/* And user has xen_platform_pci=0 set in guest config as
|
||||
* driver did not modify the value. */
|
||||
if (xen_platform_pci_unplug == 0)
|
||||
return false;
|
||||
|
||||
if (xen_platform_pci_unplug & XEN_UNPLUG_NEVER)
|
||||
return false;
|
||||
|
||||
if (xen_platform_pci_unplug & XEN_UNPLUG_ALL)
|
||||
return true;
|
||||
|
||||
/* This is an odd one - we are going to run legacy
|
||||
* and PV drivers at the same time. */
|
||||
if (xen_platform_pci_unplug & XEN_UNPLUG_UNNECESSARY)
|
||||
return true;
|
||||
|
||||
/* And the caller has to follow with xen_pv_{disk,nic}_devices
|
||||
* to be certain which driver can load. */
|
||||
return false;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(xen_has_pv_devices);
|
||||
|
||||
static bool __xen_has_pv_device(int state)
|
||||
{
|
||||
/* HVM domains might or might not */
|
||||
if (xen_hvm_domain() && (xen_platform_pci_unplug & state))
|
||||
return true;
|
||||
|
||||
return xen_has_pv_devices();
|
||||
}
|
||||
|
||||
bool xen_has_pv_nic_devices(void)
|
||||
{
|
||||
return __xen_has_pv_device(XEN_UNPLUG_ALL_NICS | XEN_UNPLUG_ALL);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(xen_has_pv_nic_devices);
|
||||
|
||||
bool xen_has_pv_disk_devices(void)
|
||||
{
|
||||
return __xen_has_pv_device(XEN_UNPLUG_ALL_IDE_DISKS |
|
||||
XEN_UNPLUG_AUX_IDE_DISKS | XEN_UNPLUG_ALL);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(xen_has_pv_disk_devices);
|
||||
|
||||
/*
|
||||
* This one is odd - it determines whether you want to run PV _and_
|
||||
* legacy (IDE) drivers together. This combination is only possible
|
||||
* under HVM.
|
||||
*/
|
||||
bool xen_has_pv_and_legacy_disk_devices(void)
|
||||
{
|
||||
if (!xen_domain())
|
||||
return false;
|
||||
|
||||
/* N.B. This is only ever used in HVM mode */
|
||||
if (xen_pv_domain())
|
||||
return false;
|
||||
|
||||
if (xen_platform_pci_unplug & XEN_UNPLUG_UNNECESSARY)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(xen_has_pv_and_legacy_disk_devices);
|
||||
|
||||
void xen_unplug_emulated_devices(void)
|
||||
{
|
||||
int r;
|
||||
|
||||
@@ -193,7 +193,7 @@ void platform_calibrate_ccount(void)
|
||||
* Ethernet -- OpenCores Ethernet MAC (ethoc driver)
|
||||
*/
|
||||
|
||||
static struct resource ethoc_res[] __initdata = {
|
||||
static struct resource ethoc_res[] = {
|
||||
[0] = { /* register space */
|
||||
.start = OETH_REGS_PADDR,
|
||||
.end = OETH_REGS_PADDR + OETH_REGS_SIZE - 1,
|
||||
@@ -211,7 +211,7 @@ static struct resource ethoc_res[] __initdata = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct ethoc_platform_data ethoc_pdata __initdata = {
|
||||
static struct ethoc_platform_data ethoc_pdata = {
|
||||
/*
|
||||
* The MAC address for these boards is 00:50:c2:13:6f:xx.
|
||||
* The last byte (here as zero) is read from the DIP switches on the
|
||||
@@ -221,7 +221,7 @@ static struct ethoc_platform_data ethoc_pdata __initdata = {
|
||||
.phy_id = -1,
|
||||
};
|
||||
|
||||
static struct platform_device ethoc_device __initdata = {
|
||||
static struct platform_device ethoc_device = {
|
||||
.name = "ethoc",
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(ethoc_res),
|
||||
@@ -235,13 +235,13 @@ static struct platform_device ethoc_device __initdata = {
|
||||
* UART
|
||||
*/
|
||||
|
||||
static struct resource serial_resource __initdata = {
|
||||
static struct resource serial_resource = {
|
||||
.start = DUART16552_PADDR,
|
||||
.end = DUART16552_PADDR + 0x1f,
|
||||
.flags = IORESOURCE_MEM,
|
||||
};
|
||||
|
||||
static struct plat_serial8250_port serial_platform_data[] __initdata = {
|
||||
static struct plat_serial8250_port serial_platform_data[] = {
|
||||
[0] = {
|
||||
.mapbase = DUART16552_PADDR,
|
||||
.irq = DUART16552_INTNUM,
|
||||
@@ -254,7 +254,7 @@ static struct plat_serial8250_port serial_platform_data[] __initdata = {
|
||||
{ },
|
||||
};
|
||||
|
||||
static struct platform_device xtavnet_uart __initdata = {
|
||||
static struct platform_device xtavnet_uart = {
|
||||
.name = "serial8250",
|
||||
.id = PLAT8250_DEV_PLATFORM,
|
||||
.dev = {
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
#ifdef CONFIG_X86
|
||||
#include <asm/mpspec.h>
|
||||
#endif
|
||||
@@ -976,6 +977,14 @@ void __init acpi_early_init(void)
|
||||
goto error0;
|
||||
}
|
||||
|
||||
/*
|
||||
* If the system is using ACPI then we can be reasonably
|
||||
* confident that any regulators are managed by the firmware
|
||||
* so tell the regulator core it has everything it needs to
|
||||
* know.
|
||||
*/
|
||||
regulator_has_full_constraints();
|
||||
|
||||
return;
|
||||
|
||||
error0:
|
||||
|
||||
@@ -2199,6 +2199,16 @@ int ata_dev_configure(struct ata_device *dev)
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
/* some WD SATA-1 drives have issues with LPM, turn on NOLPM for them */
|
||||
if ((dev->horkage & ATA_HORKAGE_WD_BROKEN_LPM) &&
|
||||
(id[ATA_ID_SATA_CAPABILITY] & 0xe) == 0x2)
|
||||
dev->horkage |= ATA_HORKAGE_NOLPM;
|
||||
|
||||
if (dev->horkage & ATA_HORKAGE_NOLPM) {
|
||||
ata_dev_warn(dev, "LPM support broken, forcing max_power\n");
|
||||
dev->link->ap->target_lpm_policy = ATA_LPM_MAX_POWER;
|
||||
}
|
||||
|
||||
/* let ACPI work its magic */
|
||||
rc = ata_acpi_on_devcfg(dev);
|
||||
if (rc)
|
||||
@@ -4189,6 +4199,23 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
|
||||
{ "PIONEER DVD-RW DVR-212D", NULL, ATA_HORKAGE_NOSETXFER },
|
||||
{ "PIONEER DVD-RW DVR-216D", NULL, ATA_HORKAGE_NOSETXFER },
|
||||
|
||||
/*
|
||||
* Some WD SATA-I drives spin up and down erratically when the link
|
||||
* is put into the slumber mode. We don't have full list of the
|
||||
* affected devices. Disable LPM if the device matches one of the
|
||||
* known prefixes and is SATA-1. As a side effect LPM partial is
|
||||
* lost too.
|
||||
*
|
||||
* https://bugzilla.kernel.org/show_bug.cgi?id=57211
|
||||
*/
|
||||
{ "WDC WD800JD-*", NULL, ATA_HORKAGE_WD_BROKEN_LPM },
|
||||
{ "WDC WD1200JD-*", NULL, ATA_HORKAGE_WD_BROKEN_LPM },
|
||||
{ "WDC WD1600JD-*", NULL, ATA_HORKAGE_WD_BROKEN_LPM },
|
||||
{ "WDC WD2000JD-*", NULL, ATA_HORKAGE_WD_BROKEN_LPM },
|
||||
{ "WDC WD2500JD-*", NULL, ATA_HORKAGE_WD_BROKEN_LPM },
|
||||
{ "WDC WD3000JD-*", NULL, ATA_HORKAGE_WD_BROKEN_LPM },
|
||||
{ "WDC WD3200JD-*", NULL, ATA_HORKAGE_WD_BROKEN_LPM },
|
||||
|
||||
/* End Marker */
|
||||
{ }
|
||||
};
|
||||
|
||||
@@ -111,12 +111,14 @@ static const char *ata_lpm_policy_names[] = {
|
||||
[ATA_LPM_MIN_POWER] = "min_power",
|
||||
};
|
||||
|
||||
static ssize_t ata_scsi_lpm_store(struct device *dev,
|
||||
static ssize_t ata_scsi_lpm_store(struct device *device,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct Scsi_Host *shost = class_to_shost(dev);
|
||||
struct Scsi_Host *shost = class_to_shost(device);
|
||||
struct ata_port *ap = ata_shost_to_port(shost);
|
||||
struct ata_link *link;
|
||||
struct ata_device *dev;
|
||||
enum ata_lpm_policy policy;
|
||||
unsigned long flags;
|
||||
|
||||
@@ -132,10 +134,20 @@ static ssize_t ata_scsi_lpm_store(struct device *dev,
|
||||
return -EINVAL;
|
||||
|
||||
spin_lock_irqsave(ap->lock, flags);
|
||||
|
||||
ata_for_each_link(link, ap, EDGE) {
|
||||
ata_for_each_dev(dev, &ap->link, ENABLED) {
|
||||
if (dev->horkage & ATA_HORKAGE_NOLPM) {
|
||||
count = -EOPNOTSUPP;
|
||||
goto out_unlock;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ap->target_lpm_policy = policy;
|
||||
ata_port_schedule_eh(ap);
|
||||
out_unlock:
|
||||
spin_unlock_irqrestore(ap->lock, flags);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
|
||||
@@ -304,6 +304,7 @@ enum {
|
||||
MV5_LTMODE = 0x30,
|
||||
MV5_PHY_CTL = 0x0C,
|
||||
SATA_IFCFG = 0x050,
|
||||
LP_PHY_CTL = 0x058,
|
||||
|
||||
MV_M2_PREAMP_MASK = 0x7e0,
|
||||
|
||||
@@ -431,6 +432,7 @@ enum {
|
||||
MV_HP_CUT_THROUGH = (1 << 10), /* can use EDMA cut-through */
|
||||
MV_HP_FLAG_SOC = (1 << 11), /* SystemOnChip, no PCI */
|
||||
MV_HP_QUIRK_LED_BLINK_EN = (1 << 12), /* is led blinking enabled? */
|
||||
MV_HP_FIX_LP_PHY_CTL = (1 << 13), /* fix speed in LP_PHY_CTL ? */
|
||||
|
||||
/* Port private flags (pp_flags) */
|
||||
MV_PP_FLAG_EDMA_EN = (1 << 0), /* is EDMA engine enabled? */
|
||||
@@ -1353,6 +1355,7 @@ static int mv_scr_write(struct ata_link *link, unsigned int sc_reg_in, u32 val)
|
||||
|
||||
if (ofs != 0xffffffffU) {
|
||||
void __iomem *addr = mv_ap_base(link->ap) + ofs;
|
||||
struct mv_host_priv *hpriv = link->ap->host->private_data;
|
||||
if (sc_reg_in == SCR_CONTROL) {
|
||||
/*
|
||||
* Workaround for 88SX60x1 FEr SATA#26:
|
||||
@@ -1369,6 +1372,18 @@ static int mv_scr_write(struct ata_link *link, unsigned int sc_reg_in, u32 val)
|
||||
*/
|
||||
if ((val & 0xf) == 1 || (readl(addr) & 0xf) == 1)
|
||||
val |= 0xf000;
|
||||
|
||||
if (hpriv->hp_flags & MV_HP_FIX_LP_PHY_CTL) {
|
||||
void __iomem *lp_phy_addr =
|
||||
mv_ap_base(link->ap) + LP_PHY_CTL;
|
||||
/*
|
||||
* Set PHY speed according to SControl speed.
|
||||
*/
|
||||
if ((val & 0xf0) == 0x10)
|
||||
writelfl(0x7, lp_phy_addr);
|
||||
else
|
||||
writelfl(0x227, lp_phy_addr);
|
||||
}
|
||||
}
|
||||
writelfl(val, addr);
|
||||
return 0;
|
||||
@@ -4111,6 +4126,15 @@ static int mv_platform_probe(struct platform_device *pdev)
|
||||
if (rc)
|
||||
goto err;
|
||||
|
||||
/*
|
||||
* To allow disk hotplug on Armada 370/XP SoCs, the PHY speed must be
|
||||
* updated in the LP_PHY_CTL register.
|
||||
*/
|
||||
if (pdev->dev.of_node &&
|
||||
of_device_is_compatible(pdev->dev.of_node,
|
||||
"marvell,armada-370-sata"))
|
||||
hpriv->hp_flags |= MV_HP_FIX_LP_PHY_CTL;
|
||||
|
||||
/* initialize adapter */
|
||||
rc = mv_init_host(host);
|
||||
if (rc)
|
||||
@@ -4216,6 +4240,7 @@ static int mv_platform_resume(struct platform_device *pdev)
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
static struct of_device_id mv_sata_dt_ids[] = {
|
||||
{ .compatible = "marvell,armada-370-sata", },
|
||||
{ .compatible = "marvell,orion-sata", },
|
||||
{},
|
||||
};
|
||||
|
||||
@@ -1129,7 +1129,7 @@ static int blkfront_probe(struct xenbus_device *dev,
|
||||
char *type;
|
||||
int len;
|
||||
/* no unplug has been done: do not hook devices != xen vbds */
|
||||
if (xen_platform_pci_unplug & XEN_UNPLUG_UNNECESSARY) {
|
||||
if (xen_has_pv_and_legacy_disk_devices()) {
|
||||
int major;
|
||||
|
||||
if (!VDEV_IS_EXTENDED(vdevice))
|
||||
@@ -1656,7 +1656,7 @@ static int __init xlblk_init(void)
|
||||
if (!xen_domain())
|
||||
return -ENODEV;
|
||||
|
||||
if (xen_hvm_domain() && !xen_platform_pci_unplug)
|
||||
if (!xen_has_pv_disk_devices())
|
||||
return -ENODEV;
|
||||
|
||||
if (register_blkdev(XENVBD_MAJOR, DEV_NAME)) {
|
||||
|
||||
@@ -172,7 +172,7 @@ static ssize_t tpm_store_ppi_request(struct device *dev,
|
||||
* is updated with function index from SUBREQ to SUBREQ2 since PPI
|
||||
* version 1.1
|
||||
*/
|
||||
if (strcmp(version, "1.1") == -1)
|
||||
if (strcmp(version, "1.1") < 0)
|
||||
params[2].integer.value = TPM_PPI_FN_SUBREQ;
|
||||
else
|
||||
params[2].integer.value = TPM_PPI_FN_SUBREQ2;
|
||||
@@ -182,7 +182,7 @@ static ssize_t tpm_store_ppi_request(struct device *dev,
|
||||
* string/package type. For PPI version 1.0 and 1.1, use buffer type
|
||||
* for compatibility, and use package type since 1.2 according to spec.
|
||||
*/
|
||||
if (strcmp(version, "1.2") == -1) {
|
||||
if (strcmp(version, "1.2") < 0) {
|
||||
params[3].type = ACPI_TYPE_BUFFER;
|
||||
params[3].buffer.length = sizeof(req);
|
||||
sscanf(buf, "%d", &req);
|
||||
@@ -248,7 +248,7 @@ static ssize_t tpm_show_ppi_transition_action(struct device *dev,
|
||||
* (e.g. Capella with PPI 1.0) need integer/string/buffer type, so for
|
||||
* compatibility, define params[3].type as buffer, if PPI version < 1.2
|
||||
*/
|
||||
if (strcmp(version, "1.2") == -1) {
|
||||
if (strcmp(version, "1.2") < 0) {
|
||||
params[3].type = ACPI_TYPE_BUFFER;
|
||||
params[3].buffer.length = 0;
|
||||
params[3].buffer.pointer = NULL;
|
||||
@@ -390,7 +390,7 @@ static ssize_t show_ppi_operations(char *buf, u32 start, u32 end)
|
||||
kfree(output.pointer);
|
||||
output.length = ACPI_ALLOCATE_BUFFER;
|
||||
output.pointer = NULL;
|
||||
if (strcmp(version, "1.2") == -1)
|
||||
if (strcmp(version, "1.2") < 0)
|
||||
return -EPERM;
|
||||
|
||||
params[2].integer.value = TPM_PPI_FN_GETOPR;
|
||||
|
||||
@@ -1182,9 +1182,11 @@ static int e752x_get_devs(struct pci_dev *pdev, int dev_idx,
|
||||
pvt->bridge_ck = pci_get_device(PCI_VENDOR_ID_INTEL,
|
||||
pvt->dev_info->err_dev, pvt->bridge_ck);
|
||||
|
||||
if (pvt->bridge_ck == NULL)
|
||||
if (pvt->bridge_ck == NULL) {
|
||||
pvt->bridge_ck = pci_scan_single_device(pdev->bus,
|
||||
PCI_DEVFN(0, 1));
|
||||
pci_dev_get(pvt->bridge_ck);
|
||||
}
|
||||
|
||||
if (pvt->bridge_ck == NULL) {
|
||||
e752x_printk(KERN_ERR, "error reporting device not found:"
|
||||
|
||||
@@ -50,7 +50,7 @@ static void ast_dirty_update(struct ast_fbdev *afbdev,
|
||||
struct ast_bo *bo;
|
||||
int src_offset, dst_offset;
|
||||
int bpp = (afbdev->afb.base.bits_per_pixel + 7)/8;
|
||||
int ret;
|
||||
int ret = -EBUSY;
|
||||
bool unmap = false;
|
||||
bool store_for_later = false;
|
||||
int x2, y2;
|
||||
@@ -64,7 +64,8 @@ static void ast_dirty_update(struct ast_fbdev *afbdev,
|
||||
* then the BO is being moved and we should
|
||||
* store up the damage until later.
|
||||
*/
|
||||
ret = ast_bo_reserve(bo, true);
|
||||
if (!drm_can_sleep())
|
||||
ret = ast_bo_reserve(bo, true);
|
||||
if (ret) {
|
||||
if (ret != -EBUSY)
|
||||
return;
|
||||
|
||||
@@ -24,7 +24,7 @@ static void cirrus_dirty_update(struct cirrus_fbdev *afbdev,
|
||||
struct cirrus_bo *bo;
|
||||
int src_offset, dst_offset;
|
||||
int bpp = (afbdev->gfb.base.bits_per_pixel + 7)/8;
|
||||
int ret;
|
||||
int ret = -EBUSY;
|
||||
bool unmap = false;
|
||||
bool store_for_later = false;
|
||||
int x2, y2;
|
||||
@@ -38,7 +38,8 @@ static void cirrus_dirty_update(struct cirrus_fbdev *afbdev,
|
||||
* then the BO is being moved and we should
|
||||
* store up the damage until later.
|
||||
*/
|
||||
ret = cirrus_bo_reserve(bo, true);
|
||||
if (!drm_can_sleep())
|
||||
ret = cirrus_bo_reserve(bo, true);
|
||||
if (ret) {
|
||||
if (ret != -EBUSY)
|
||||
return;
|
||||
|
||||
@@ -273,8 +273,8 @@ static int cirrus_crtc_mode_set(struct drm_crtc *crtc,
|
||||
sr07 |= 0x11;
|
||||
break;
|
||||
case 16:
|
||||
sr07 |= 0xc1;
|
||||
hdr = 0xc0;
|
||||
sr07 |= 0x17;
|
||||
hdr = 0xc1;
|
||||
break;
|
||||
case 24:
|
||||
sr07 |= 0x15;
|
||||
|
||||
@@ -1660,10 +1660,20 @@
|
||||
#define CRT_HOTPLUG_DETECT_VOLTAGE_475MV (1 << 2)
|
||||
|
||||
#define PORT_HOTPLUG_STAT 0x61114
|
||||
/* HDMI/DP bits are gen4+ */
|
||||
#define DPB_HOTPLUG_LIVE_STATUS (1 << 29)
|
||||
#define DPC_HOTPLUG_LIVE_STATUS (1 << 28)
|
||||
#define DPD_HOTPLUG_LIVE_STATUS (1 << 27)
|
||||
/*
|
||||
* HDMI/DP bits are gen4+
|
||||
*
|
||||
* WARNING: Bspec for hpd status bits on gen4 seems to be completely confused.
|
||||
* Please check the detailed lore in the commit message for for experimental
|
||||
* evidence.
|
||||
*/
|
||||
#define DPD_HOTPLUG_LIVE_STATUS_G4X (1 << 29)
|
||||
#define DPC_HOTPLUG_LIVE_STATUS_G4X (1 << 28)
|
||||
#define DPB_HOTPLUG_LIVE_STATUS_G4X (1 << 27)
|
||||
/* VLV DP/HDMI bits again match Bspec */
|
||||
#define DPD_HOTPLUG_LIVE_STATUS_VLV (1 << 27)
|
||||
#define DPC_HOTPLUG_LIVE_STATUS_VLV (1 << 28)
|
||||
#define DPB_HOTPLUG_LIVE_STATUS_VLV (1 << 29)
|
||||
#define DPD_HOTPLUG_INT_STATUS (3 << 21)
|
||||
#define DPC_HOTPLUG_INT_STATUS (3 << 19)
|
||||
#define DPB_HOTPLUG_INT_STATUS (3 << 17)
|
||||
|
||||
@@ -2247,18 +2247,34 @@ g4x_dp_detect(struct intel_dp *intel_dp)
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
uint32_t bit;
|
||||
|
||||
switch (intel_dp->output_reg) {
|
||||
case DP_B:
|
||||
bit = DPB_HOTPLUG_LIVE_STATUS;
|
||||
break;
|
||||
case DP_C:
|
||||
bit = DPC_HOTPLUG_LIVE_STATUS;
|
||||
break;
|
||||
case DP_D:
|
||||
bit = DPD_HOTPLUG_LIVE_STATUS;
|
||||
break;
|
||||
default:
|
||||
return connector_status_unknown;
|
||||
if (IS_VALLEYVIEW(dev)) {
|
||||
switch (intel_dp->output_reg) {
|
||||
case DP_B:
|
||||
bit = DPB_HOTPLUG_LIVE_STATUS_VLV;
|
||||
break;
|
||||
case DP_C:
|
||||
bit = DPC_HOTPLUG_LIVE_STATUS_VLV;
|
||||
break;
|
||||
case DP_D:
|
||||
bit = DPD_HOTPLUG_LIVE_STATUS_VLV;
|
||||
break;
|
||||
default:
|
||||
return connector_status_unknown;
|
||||
}
|
||||
} else {
|
||||
switch (intel_dp->output_reg) {
|
||||
case DP_B:
|
||||
bit = DPB_HOTPLUG_LIVE_STATUS_G4X;
|
||||
break;
|
||||
case DP_C:
|
||||
bit = DPC_HOTPLUG_LIVE_STATUS_G4X;
|
||||
break;
|
||||
case DP_D:
|
||||
bit = DPD_HOTPLUG_LIVE_STATUS_G4X;
|
||||
break;
|
||||
default:
|
||||
return connector_status_unknown;
|
||||
}
|
||||
}
|
||||
|
||||
if ((I915_READ(PORT_HOTPLUG_STAT) & bit) == 0)
|
||||
|
||||
@@ -26,7 +26,7 @@ static void mga_dirty_update(struct mga_fbdev *mfbdev,
|
||||
struct mgag200_bo *bo;
|
||||
int src_offset, dst_offset;
|
||||
int bpp = (mfbdev->mfb.base.bits_per_pixel + 7)/8;
|
||||
int ret;
|
||||
int ret = -EBUSY;
|
||||
bool unmap = false;
|
||||
bool store_for_later = false;
|
||||
int x2, y2;
|
||||
@@ -40,7 +40,8 @@ static void mga_dirty_update(struct mga_fbdev *mfbdev,
|
||||
* then the BO is being moved and we should
|
||||
* store up the damage until later.
|
||||
*/
|
||||
ret = mgag200_bo_reserve(bo, true);
|
||||
if (!drm_can_sleep())
|
||||
ret = mgag200_bo_reserve(bo, true);
|
||||
if (ret) {
|
||||
if (ret != -EBUSY)
|
||||
return;
|
||||
|
||||
@@ -349,13 +349,13 @@ static u16
|
||||
init_script(struct nouveau_bios *bios, int index)
|
||||
{
|
||||
struct nvbios_init init = { .bios = bios };
|
||||
u16 data;
|
||||
u16 bmp_ver = bmp_version(bios), data;
|
||||
|
||||
if (bmp_version(bios) && bmp_version(bios) < 0x0510) {
|
||||
if (index > 1)
|
||||
if (bmp_ver && bmp_ver < 0x0510) {
|
||||
if (index > 1 || bmp_ver < 0x0100)
|
||||
return 0x0000;
|
||||
|
||||
data = bios->bmp_offset + (bios->version.major < 2 ? 14 : 18);
|
||||
data = bios->bmp_offset + (bmp_ver < 0x0200 ? 14 : 18);
|
||||
return nv_ro16(bios, data + (index * 2));
|
||||
}
|
||||
|
||||
|
||||
@@ -938,11 +938,14 @@ static bool atombios_crtc_prepare_pll(struct drm_crtc *crtc, struct drm_display_
|
||||
radeon_atombios_get_ppll_ss_info(rdev,
|
||||
&radeon_crtc->ss,
|
||||
ATOM_DP_SS_ID1);
|
||||
} else
|
||||
} else {
|
||||
radeon_crtc->ss_enabled =
|
||||
radeon_atombios_get_ppll_ss_info(rdev,
|
||||
&radeon_crtc->ss,
|
||||
ATOM_DP_SS_ID1);
|
||||
}
|
||||
/* disable spread spectrum on DCE3 DP */
|
||||
radeon_crtc->ss_enabled = false;
|
||||
}
|
||||
break;
|
||||
case ATOM_ENCODER_MODE_LVDS:
|
||||
|
||||
@@ -970,7 +970,10 @@ static int evergreen_cs_track_check(struct radeon_cs_parser *p)
|
||||
if (track->cb_dirty) {
|
||||
tmp = track->cb_target_mask;
|
||||
for (i = 0; i < 8; i++) {
|
||||
if ((tmp >> (i * 4)) & 0xF) {
|
||||
u32 format = G_028C70_FORMAT(track->cb_color_info[i]);
|
||||
|
||||
if (format != V_028C70_COLOR_INVALID &&
|
||||
(tmp >> (i * 4)) & 0xF) {
|
||||
/* at least one component is enabled */
|
||||
if (track->cb_color_bo[i] == NULL) {
|
||||
dev_warn(p->dev, "%s:%d mask 0x%08X | 0x%08X no cb for %d\n",
|
||||
|
||||
@@ -889,13 +889,12 @@ void cayman_fence_ring_emit(struct radeon_device *rdev,
|
||||
{
|
||||
struct radeon_ring *ring = &rdev->ring[fence->ring];
|
||||
u64 addr = rdev->fence_drv[fence->ring].gpu_addr;
|
||||
u32 cp_coher_cntl = PACKET3_FULL_CACHE_ENA | PACKET3_TC_ACTION_ENA |
|
||||
PACKET3_SH_ACTION_ENA;
|
||||
|
||||
/* flush read cache over gart for this vmid */
|
||||
radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
|
||||
radeon_ring_write(ring, (CP_COHER_CNTL2 - PACKET3_SET_CONFIG_REG_START) >> 2);
|
||||
radeon_ring_write(ring, 0);
|
||||
radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3));
|
||||
radeon_ring_write(ring, PACKET3_TC_ACTION_ENA | PACKET3_SH_ACTION_ENA);
|
||||
radeon_ring_write(ring, PACKET3_ENGINE_ME | cp_coher_cntl);
|
||||
radeon_ring_write(ring, 0xFFFFFFFF);
|
||||
radeon_ring_write(ring, 0);
|
||||
radeon_ring_write(ring, 10); /* poll interval */
|
||||
@@ -911,6 +910,8 @@ void cayman_fence_ring_emit(struct radeon_device *rdev,
|
||||
void cayman_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
|
||||
{
|
||||
struct radeon_ring *ring = &rdev->ring[ib->ring];
|
||||
u32 cp_coher_cntl = PACKET3_FULL_CACHE_ENA | PACKET3_TC_ACTION_ENA |
|
||||
PACKET3_SH_ACTION_ENA;
|
||||
|
||||
/* set to DX10/11 mode */
|
||||
radeon_ring_write(ring, PACKET3(PACKET3_MODE_CONTROL, 0));
|
||||
@@ -935,14 +936,11 @@ void cayman_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
|
||||
(ib->vm ? (ib->vm->id << 24) : 0));
|
||||
|
||||
/* flush read cache over gart for this vmid */
|
||||
radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
|
||||
radeon_ring_write(ring, (CP_COHER_CNTL2 - PACKET3_SET_CONFIG_REG_START) >> 2);
|
||||
radeon_ring_write(ring, ib->vm ? ib->vm->id : 0);
|
||||
radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3));
|
||||
radeon_ring_write(ring, PACKET3_TC_ACTION_ENA | PACKET3_SH_ACTION_ENA);
|
||||
radeon_ring_write(ring, PACKET3_ENGINE_ME | cp_coher_cntl);
|
||||
radeon_ring_write(ring, 0xFFFFFFFF);
|
||||
radeon_ring_write(ring, 0);
|
||||
radeon_ring_write(ring, 10); /* poll interval */
|
||||
radeon_ring_write(ring, ((ib->vm ? ib->vm->id : 0) << 24) | 10); /* poll interval */
|
||||
}
|
||||
|
||||
static void cayman_cp_enable(struct radeon_device *rdev, bool enable)
|
||||
|
||||
@@ -556,6 +556,7 @@
|
||||
# define PACKET3_DB_ACTION_ENA (1 << 26)
|
||||
# define PACKET3_SH_ACTION_ENA (1 << 27)
|
||||
# define PACKET3_SX_ACTION_ENA (1 << 28)
|
||||
# define PACKET3_ENGINE_ME (1 << 31)
|
||||
#define PACKET3_ME_INITIALIZE 0x44
|
||||
#define PACKET3_ME_INITIALIZE_DEVICE_ID(x) ((x) << 16)
|
||||
#define PACKET3_COND_WRITE 0x45
|
||||
|
||||
@@ -2519,14 +2519,17 @@ void r600_fence_ring_emit(struct radeon_device *rdev,
|
||||
struct radeon_fence *fence)
|
||||
{
|
||||
struct radeon_ring *ring = &rdev->ring[fence->ring];
|
||||
u32 cp_coher_cntl = PACKET3_TC_ACTION_ENA | PACKET3_VC_ACTION_ENA |
|
||||
PACKET3_SH_ACTION_ENA;
|
||||
|
||||
if (rdev->family >= CHIP_RV770)
|
||||
cp_coher_cntl |= PACKET3_FULL_CACHE_ENA;
|
||||
|
||||
if (rdev->wb.use_event) {
|
||||
u64 addr = rdev->fence_drv[fence->ring].gpu_addr;
|
||||
/* flush read cache over gart */
|
||||
radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3));
|
||||
radeon_ring_write(ring, PACKET3_TC_ACTION_ENA |
|
||||
PACKET3_VC_ACTION_ENA |
|
||||
PACKET3_SH_ACTION_ENA);
|
||||
radeon_ring_write(ring, cp_coher_cntl);
|
||||
radeon_ring_write(ring, 0xFFFFFFFF);
|
||||
radeon_ring_write(ring, 0);
|
||||
radeon_ring_write(ring, 10); /* poll interval */
|
||||
@@ -2540,9 +2543,7 @@ void r600_fence_ring_emit(struct radeon_device *rdev,
|
||||
} else {
|
||||
/* flush read cache over gart */
|
||||
radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3));
|
||||
radeon_ring_write(ring, PACKET3_TC_ACTION_ENA |
|
||||
PACKET3_VC_ACTION_ENA |
|
||||
PACKET3_SH_ACTION_ENA);
|
||||
radeon_ring_write(ring, cp_coher_cntl);
|
||||
radeon_ring_write(ring, 0xFFFFFFFF);
|
||||
radeon_ring_write(ring, 0);
|
||||
radeon_ring_write(ring, 10); /* poll interval */
|
||||
|
||||
@@ -754,7 +754,10 @@ static int r600_cs_track_check(struct radeon_cs_parser *p)
|
||||
}
|
||||
|
||||
for (i = 0; i < 8; i++) {
|
||||
if ((tmp >> (i * 4)) & 0xF) {
|
||||
u32 format = G_0280A0_FORMAT(track->cb_color_info[i]);
|
||||
|
||||
if (format != V_0280A0_COLOR_INVALID &&
|
||||
(tmp >> (i * 4)) & 0xF) {
|
||||
/* at least one component is enabled */
|
||||
if (track->cb_color_bo[i] == NULL) {
|
||||
dev_warn(p->dev, "%s:%d mask 0x%08X | 0x%08X no cb for %d\n",
|
||||
|
||||
@@ -1220,6 +1220,7 @@
|
||||
# define PACKET3_CP_DMA_CMD_DAIC (1 << 29)
|
||||
#define PACKET3_SURFACE_SYNC 0x43
|
||||
# define PACKET3_CB0_DEST_BASE_ENA (1 << 6)
|
||||
# define PACKET3_FULL_CACHE_ENA (1 << 20) /* r7xx+ only */
|
||||
# define PACKET3_TC_ACTION_ENA (1 << 23)
|
||||
# define PACKET3_VC_ACTION_ENA (1 << 24)
|
||||
# define PACKET3_CB_ACTION_ENA (1 << 25)
|
||||
|
||||
@@ -2821,6 +2821,10 @@ void radeon_atom_initialize_bios_scratch_regs(struct drm_device *dev)
|
||||
/* tell the bios not to handle mode switching */
|
||||
bios_6_scratch |= ATOM_S6_ACC_BLOCK_DISPLAY_SWITCH;
|
||||
|
||||
/* clear the vbios dpms state */
|
||||
if (ASIC_IS_DCE4(rdev))
|
||||
bios_2_scratch &= ~ATOM_S2_DEVICE_DPMS_STATE;
|
||||
|
||||
if (rdev->family >= CHIP_R600) {
|
||||
WREG32(R600_BIOS_2_SCRATCH, bios_2_scratch);
|
||||
WREG32(R600_BIOS_6_SCRATCH, bios_6_scratch);
|
||||
|
||||
@@ -1020,6 +1020,9 @@ void radeon_i2c_destroy(struct radeon_i2c_chan *i2c)
|
||||
/* Add the default buses */
|
||||
void radeon_i2c_init(struct radeon_device *rdev)
|
||||
{
|
||||
if (radeon_hw_i2c)
|
||||
DRM_INFO("hw_i2c forced on, you may experience display detection problems!\n");
|
||||
|
||||
if (rdev->is_atom_bios)
|
||||
radeon_atombios_i2c_init(rdev);
|
||||
else
|
||||
|
||||
@@ -561,8 +561,10 @@ void radeon_pm_resume(struct radeon_device *rdev)
|
||||
rdev->pm.current_clock_mode_index = 0;
|
||||
rdev->pm.current_sclk = rdev->pm.default_sclk;
|
||||
rdev->pm.current_mclk = rdev->pm.default_mclk;
|
||||
rdev->pm.current_vddc = rdev->pm.power_state[rdev->pm.default_power_state_index].clock_info[0].voltage.voltage;
|
||||
rdev->pm.current_vddci = rdev->pm.power_state[rdev->pm.default_power_state_index].clock_info[0].voltage.vddci;
|
||||
if (rdev->pm.power_state) {
|
||||
rdev->pm.current_vddc = rdev->pm.power_state[rdev->pm.default_power_state_index].clock_info[0].voltage.voltage;
|
||||
rdev->pm.current_vddci = rdev->pm.power_state[rdev->pm.default_power_state_index].clock_info[0].voltage.vddci;
|
||||
}
|
||||
if (rdev->pm.pm_method == PM_METHOD_DYNPM
|
||||
&& rdev->pm.dynpm_state == DYNPM_STATE_SUSPENDED) {
|
||||
rdev->pm.dynpm_state = DYNPM_STATE_ACTIVE;
|
||||
|
||||
@@ -57,13 +57,20 @@ static void qib_ud_loopback(struct qib_qp *sqp, struct qib_swqe *swqe)
|
||||
struct qib_sge *sge;
|
||||
struct ib_wc wc;
|
||||
u32 length;
|
||||
enum ib_qp_type sqptype, dqptype;
|
||||
|
||||
qp = qib_lookup_qpn(ibp, swqe->wr.wr.ud.remote_qpn);
|
||||
if (!qp) {
|
||||
ibp->n_pkt_drops++;
|
||||
return;
|
||||
}
|
||||
if (qp->ibqp.qp_type != sqp->ibqp.qp_type ||
|
||||
|
||||
sqptype = sqp->ibqp.qp_type == IB_QPT_GSI ?
|
||||
IB_QPT_UD : sqp->ibqp.qp_type;
|
||||
dqptype = qp->ibqp.qp_type == IB_QPT_GSI ?
|
||||
IB_QPT_UD : qp->ibqp.qp_type;
|
||||
|
||||
if (dqptype != sqptype ||
|
||||
!(ib_qib_state_ops[qp->state] & QIB_PROCESS_RECV_OK)) {
|
||||
ibp->n_pkt_drops++;
|
||||
goto drop;
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
#include <xen/interface/io/fbif.h>
|
||||
#include <xen/interface/io/kbdif.h>
|
||||
#include <xen/xenbus.h>
|
||||
#include <xen/platform_pci.h>
|
||||
|
||||
struct xenkbd_info {
|
||||
struct input_dev *kbd;
|
||||
@@ -380,6 +381,9 @@ static int __init xenkbd_init(void)
|
||||
if (xen_initial_domain())
|
||||
return -ENODEV;
|
||||
|
||||
if (!xen_has_pv_devices())
|
||||
return -ENODEV;
|
||||
|
||||
return xenbus_register_frontend(&xenkbd_driver);
|
||||
}
|
||||
|
||||
|
||||
@@ -910,7 +910,7 @@ static void dma_pte_free_level(struct dmar_domain *domain, int level,
|
||||
|
||||
/* If range covers entire pagetable, free it */
|
||||
if (!(start_pfn > level_pfn ||
|
||||
last_pfn < level_pfn + level_size(level))) {
|
||||
last_pfn < level_pfn + level_size(level) - 1)) {
|
||||
dma_clear_pte(pte);
|
||||
domain_flush_cache(domain, pte, sizeof(*pte));
|
||||
free_pgtable_page(level_pte);
|
||||
|
||||
@@ -185,8 +185,12 @@ config MD_FAULTY
|
||||
|
||||
In unsure, say N.
|
||||
|
||||
config BLK_DEV_DM_BUILTIN
|
||||
boolean
|
||||
|
||||
config BLK_DEV_DM
|
||||
tristate "Device mapper support"
|
||||
select BLK_DEV_DM_BUILTIN
|
||||
---help---
|
||||
Device-mapper is a low level volume manager. It works by allowing
|
||||
people to specify mappings for ranges of logical sectors. Various
|
||||
|
||||
@@ -28,6 +28,7 @@ obj-$(CONFIG_MD_MULTIPATH) += multipath.o
|
||||
obj-$(CONFIG_MD_FAULTY) += faulty.o
|
||||
obj-$(CONFIG_BLK_DEV_MD) += md-mod.o
|
||||
obj-$(CONFIG_BLK_DEV_DM) += dm-mod.o
|
||||
obj-$(CONFIG_BLK_DEV_DM_BUILTIN) += dm-builtin.o
|
||||
obj-$(CONFIG_DM_BUFIO) += dm-bufio.o
|
||||
obj-$(CONFIG_DM_BIO_PRISON) += dm-bio-prison.o
|
||||
obj-$(CONFIG_DM_CRYPT) += dm-crypt.o
|
||||
|
||||
49
drivers/md/dm-builtin.c
Normal file
49
drivers/md/dm-builtin.c
Normal file
@@ -0,0 +1,49 @@
|
||||
#include <linux/export.h>
|
||||
#include "dm.h"
|
||||
|
||||
/*
|
||||
* The kobject release method must not be placed in the module itself,
|
||||
* otherwise we are subject to module unload races.
|
||||
*
|
||||
* The release method is called when the last reference to the kobject is
|
||||
* dropped. It may be called by any other kernel code that drops the last
|
||||
* reference.
|
||||
*
|
||||
* The release method suffers from module unload race. We may prevent the
|
||||
* module from being unloaded at the start of the release method (using
|
||||
* increased module reference count or synchronizing against the release
|
||||
* method), however there is no way to prevent the module from being
|
||||
* unloaded at the end of the release method.
|
||||
*
|
||||
* If this code were placed in the dm module, the following race may
|
||||
* happen:
|
||||
* 1. Some other process takes a reference to dm kobject
|
||||
* 2. The user issues ioctl function to unload the dm device
|
||||
* 3. dm_sysfs_exit calls kobject_put, however the object is not released
|
||||
* because of the other reference taken at step 1
|
||||
* 4. dm_sysfs_exit waits on the completion
|
||||
* 5. The other process that took the reference in step 1 drops it,
|
||||
* dm_kobject_release is called from this process
|
||||
* 6. dm_kobject_release calls complete()
|
||||
* 7. a reschedule happens before dm_kobject_release returns
|
||||
* 8. dm_sysfs_exit continues, the dm device is unloaded, module reference
|
||||
* count is decremented
|
||||
* 9. The user unloads the dm module
|
||||
* 10. The other process that was rescheduled in step 7 continues to run,
|
||||
* it is now executing code in unloaded module, so it crashes
|
||||
*
|
||||
* Note that if the process that takes the foreign reference to dm kobject
|
||||
* has a low priority and the system is sufficiently loaded with
|
||||
* higher-priority processes that prevent the low-priority process from
|
||||
* being scheduled long enough, this bug may really happen.
|
||||
*
|
||||
* In order to fix this module unload race, we place the release method
|
||||
* into a helper code that is compiled directly into the kernel.
|
||||
*/
|
||||
|
||||
void dm_kobject_release(struct kobject *kobj)
|
||||
{
|
||||
complete(dm_get_completion_from_kobject(kobj));
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(dm_kobject_release);
|
||||
@@ -86,6 +86,7 @@ static const struct sysfs_ops dm_sysfs_ops = {
|
||||
static struct kobj_type dm_ktype = {
|
||||
.sysfs_ops = &dm_sysfs_ops,
|
||||
.default_attrs = dm_attrs,
|
||||
.release = dm_kobject_release,
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -104,5 +105,7 @@ int dm_sysfs_init(struct mapped_device *md)
|
||||
*/
|
||||
void dm_sysfs_exit(struct mapped_device *md)
|
||||
{
|
||||
kobject_put(dm_kobject(md));
|
||||
struct kobject *kobj = dm_kobject(md);
|
||||
kobject_put(kobj);
|
||||
wait_for_completion(dm_get_completion_from_kobject(kobj));
|
||||
}
|
||||
|
||||
@@ -1349,6 +1349,12 @@ dm_thin_id dm_thin_dev_id(struct dm_thin_device *td)
|
||||
return td->id;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check whether @time (of block creation) is older than @td's last snapshot.
|
||||
* If so then the associated block is shared with the last snapshot device.
|
||||
* Any block on a device created *after* the device last got snapshotted is
|
||||
* necessarily not shared.
|
||||
*/
|
||||
static bool __snapshotted_since(struct dm_thin_device *td, uint32_t time)
|
||||
{
|
||||
return td->snapshotted_time > time;
|
||||
@@ -1458,6 +1464,20 @@ int dm_thin_remove_block(struct dm_thin_device *td, dm_block_t block)
|
||||
return r;
|
||||
}
|
||||
|
||||
int dm_pool_block_is_used(struct dm_pool_metadata *pmd, dm_block_t b, bool *result)
|
||||
{
|
||||
int r;
|
||||
uint32_t ref_count;
|
||||
|
||||
down_read(&pmd->root_lock);
|
||||
r = dm_sm_get_count(pmd->data_sm, b, &ref_count);
|
||||
if (!r)
|
||||
*result = (ref_count != 0);
|
||||
up_read(&pmd->root_lock);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
bool dm_thin_changed_this_transaction(struct dm_thin_device *td)
|
||||
{
|
||||
int r;
|
||||
|
||||
@@ -180,6 +180,8 @@ int dm_pool_get_data_block_size(struct dm_pool_metadata *pmd, sector_t *result);
|
||||
|
||||
int dm_pool_get_data_dev_size(struct dm_pool_metadata *pmd, dm_block_t *result);
|
||||
|
||||
int dm_pool_block_is_used(struct dm_pool_metadata *pmd, dm_block_t b, bool *result);
|
||||
|
||||
/*
|
||||
* Returns -ENOSPC if the new size is too small and already allocated
|
||||
* blocks would be lost.
|
||||
|
||||
@@ -440,6 +440,7 @@ struct dm_thin_new_mapping {
|
||||
unsigned quiesced:1;
|
||||
unsigned prepared:1;
|
||||
unsigned pass_discard:1;
|
||||
unsigned definitely_not_shared:1;
|
||||
|
||||
struct thin_c *tc;
|
||||
dm_block_t virt_block;
|
||||
@@ -610,7 +611,15 @@ static void process_prepared_discard_passdown(struct dm_thin_new_mapping *m)
|
||||
cell_defer_no_holder(tc, m->cell2);
|
||||
|
||||
if (m->pass_discard)
|
||||
remap_and_issue(tc, m->bio, m->data_block);
|
||||
if (m->definitely_not_shared)
|
||||
remap_and_issue(tc, m->bio, m->data_block);
|
||||
else {
|
||||
bool used = false;
|
||||
if (dm_pool_block_is_used(tc->pool->pmd, m->data_block, &used) || used)
|
||||
bio_endio(m->bio, 0);
|
||||
else
|
||||
remap_and_issue(tc, m->bio, m->data_block);
|
||||
}
|
||||
else
|
||||
bio_endio(m->bio, 0);
|
||||
|
||||
@@ -678,13 +687,17 @@ static int ensure_next_mapping(struct pool *pool)
|
||||
|
||||
static struct dm_thin_new_mapping *get_next_mapping(struct pool *pool)
|
||||
{
|
||||
struct dm_thin_new_mapping *r = pool->next_mapping;
|
||||
struct dm_thin_new_mapping *m = pool->next_mapping;
|
||||
|
||||
BUG_ON(!pool->next_mapping);
|
||||
|
||||
memset(m, 0, sizeof(struct dm_thin_new_mapping));
|
||||
INIT_LIST_HEAD(&m->list);
|
||||
m->bio = NULL;
|
||||
|
||||
pool->next_mapping = NULL;
|
||||
|
||||
return r;
|
||||
return m;
|
||||
}
|
||||
|
||||
static void schedule_copy(struct thin_c *tc, dm_block_t virt_block,
|
||||
@@ -696,15 +709,10 @@ static void schedule_copy(struct thin_c *tc, dm_block_t virt_block,
|
||||
struct pool *pool = tc->pool;
|
||||
struct dm_thin_new_mapping *m = get_next_mapping(pool);
|
||||
|
||||
INIT_LIST_HEAD(&m->list);
|
||||
m->quiesced = 0;
|
||||
m->prepared = 0;
|
||||
m->tc = tc;
|
||||
m->virt_block = virt_block;
|
||||
m->data_block = data_dest;
|
||||
m->cell = cell;
|
||||
m->err = 0;
|
||||
m->bio = NULL;
|
||||
|
||||
if (!dm_deferred_set_add_work(pool->shared_read_ds, &m->list))
|
||||
m->quiesced = 1;
|
||||
@@ -767,15 +775,12 @@ static void schedule_zero(struct thin_c *tc, dm_block_t virt_block,
|
||||
struct pool *pool = tc->pool;
|
||||
struct dm_thin_new_mapping *m = get_next_mapping(pool);
|
||||
|
||||
INIT_LIST_HEAD(&m->list);
|
||||
m->quiesced = 1;
|
||||
m->prepared = 0;
|
||||
m->tc = tc;
|
||||
m->virt_block = virt_block;
|
||||
m->data_block = data_block;
|
||||
m->cell = cell;
|
||||
m->err = 0;
|
||||
m->bio = NULL;
|
||||
|
||||
/*
|
||||
* If the whole block of data is being overwritten or we are not
|
||||
@@ -961,12 +966,12 @@ static void process_discard(struct thin_c *tc, struct bio *bio)
|
||||
*/
|
||||
m = get_next_mapping(pool);
|
||||
m->tc = tc;
|
||||
m->pass_discard = (!lookup_result.shared) && pool->pf.discard_passdown;
|
||||
m->pass_discard = pool->pf.discard_passdown;
|
||||
m->definitely_not_shared = !lookup_result.shared;
|
||||
m->virt_block = block;
|
||||
m->data_block = lookup_result.block;
|
||||
m->cell = cell;
|
||||
m->cell2 = cell2;
|
||||
m->err = 0;
|
||||
m->bio = bio;
|
||||
|
||||
if (!dm_deferred_set_add_work(pool->all_io_ds, &m->list)) {
|
||||
@@ -1303,15 +1308,16 @@ static enum pool_mode get_pool_mode(struct pool *pool)
|
||||
return pool->pf.mode;
|
||||
}
|
||||
|
||||
static void set_pool_mode(struct pool *pool, enum pool_mode mode)
|
||||
static void set_pool_mode(struct pool *pool, enum pool_mode new_mode)
|
||||
{
|
||||
int r;
|
||||
enum pool_mode old_mode = pool->pf.mode;
|
||||
|
||||
pool->pf.mode = mode;
|
||||
|
||||
switch (mode) {
|
||||
switch (new_mode) {
|
||||
case PM_FAIL:
|
||||
DMERR("switching pool to failure mode");
|
||||
if (old_mode != new_mode)
|
||||
DMERR("%s: switching pool to failure mode",
|
||||
dm_device_name(pool->pool_md));
|
||||
dm_pool_metadata_read_only(pool->pmd);
|
||||
pool->process_bio = process_bio_fail;
|
||||
pool->process_discard = process_bio_fail;
|
||||
@@ -1320,11 +1326,15 @@ static void set_pool_mode(struct pool *pool, enum pool_mode mode)
|
||||
break;
|
||||
|
||||
case PM_READ_ONLY:
|
||||
DMERR("switching pool to read-only mode");
|
||||
if (old_mode != new_mode)
|
||||
DMERR("%s: switching pool to read-only mode",
|
||||
dm_device_name(pool->pool_md));
|
||||
r = dm_pool_abort_metadata(pool->pmd);
|
||||
if (r) {
|
||||
DMERR("aborting transaction failed");
|
||||
set_pool_mode(pool, PM_FAIL);
|
||||
DMERR("%s: aborting transaction failed",
|
||||
dm_device_name(pool->pool_md));
|
||||
new_mode = PM_FAIL;
|
||||
set_pool_mode(pool, new_mode);
|
||||
} else {
|
||||
dm_pool_metadata_read_only(pool->pmd);
|
||||
pool->process_bio = process_bio_read_only;
|
||||
@@ -1335,6 +1345,9 @@ static void set_pool_mode(struct pool *pool, enum pool_mode mode)
|
||||
break;
|
||||
|
||||
case PM_WRITE:
|
||||
if (old_mode != new_mode)
|
||||
DMINFO("%s: switching pool to write mode",
|
||||
dm_device_name(pool->pool_md));
|
||||
dm_pool_metadata_read_write(pool->pmd);
|
||||
pool->process_bio = process_bio;
|
||||
pool->process_discard = process_discard;
|
||||
@@ -1342,6 +1355,8 @@ static void set_pool_mode(struct pool *pool, enum pool_mode mode)
|
||||
pool->process_prepared_discard = process_prepared_discard;
|
||||
break;
|
||||
}
|
||||
|
||||
pool->pf.mode = new_mode;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*/
|
||||
@@ -1551,6 +1566,17 @@ static int bind_control_target(struct pool *pool, struct dm_target *ti)
|
||||
enum pool_mode old_mode = pool->pf.mode;
|
||||
enum pool_mode new_mode = pt->adjusted_pf.mode;
|
||||
|
||||
/*
|
||||
* Don't change the pool's mode until set_pool_mode() below.
|
||||
* Otherwise the pool's process_* function pointers may
|
||||
* not match the desired pool mode.
|
||||
*/
|
||||
pt->adjusted_pf.mode = old_mode;
|
||||
|
||||
pool->ti = ti;
|
||||
pool->pf = pt->adjusted_pf;
|
||||
pool->low_water_blocks = pt->low_water_blocks;
|
||||
|
||||
/*
|
||||
* If we were in PM_FAIL mode, rollback of metadata failed. We're
|
||||
* not going to recover without a thin_repair. So we never let the
|
||||
@@ -1561,10 +1587,6 @@ static int bind_control_target(struct pool *pool, struct dm_target *ti)
|
||||
if (old_mode == PM_FAIL)
|
||||
new_mode = old_mode;
|
||||
|
||||
pool->ti = ti;
|
||||
pool->low_water_blocks = pt->low_water_blocks;
|
||||
pool->pf = pt->adjusted_pf;
|
||||
|
||||
set_pool_mode(pool, new_mode);
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -185,8 +185,8 @@ struct mapped_device {
|
||||
/* forced geometry settings */
|
||||
struct hd_geometry geometry;
|
||||
|
||||
/* sysfs handle */
|
||||
struct kobject kobj;
|
||||
/* kobject and completion */
|
||||
struct dm_kobject_holder kobj_holder;
|
||||
|
||||
/* zero-length flush that will be cloned and submitted to targets */
|
||||
struct bio flush_bio;
|
||||
@@ -1899,6 +1899,7 @@ static struct mapped_device *alloc_dev(int minor)
|
||||
init_waitqueue_head(&md->wait);
|
||||
INIT_WORK(&md->work, dm_wq_work);
|
||||
init_waitqueue_head(&md->eventq);
|
||||
init_completion(&md->kobj_holder.completion);
|
||||
|
||||
md->disk->major = _major;
|
||||
md->disk->first_minor = minor;
|
||||
@@ -2725,7 +2726,7 @@ EXPORT_SYMBOL_GPL(dm_disk);
|
||||
|
||||
struct kobject *dm_kobject(struct mapped_device *md)
|
||||
{
|
||||
return &md->kobj;
|
||||
return &md->kobj_holder.kobj;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -2736,9 +2737,7 @@ struct mapped_device *dm_get_from_kobject(struct kobject *kobj)
|
||||
{
|
||||
struct mapped_device *md;
|
||||
|
||||
md = container_of(kobj, struct mapped_device, kobj);
|
||||
if (&md->kobj != kobj)
|
||||
return NULL;
|
||||
md = container_of(kobj, struct mapped_device, kobj_holder.kobj);
|
||||
|
||||
if (test_bit(DMF_FREEING, &md->flags) ||
|
||||
dm_deleting_md(md))
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
#include <linux/list.h>
|
||||
#include <linux/blkdev.h>
|
||||
#include <linux/hdreg.h>
|
||||
#include <linux/completion.h>
|
||||
#include <linux/kobject.h>
|
||||
|
||||
/*
|
||||
* Suspend feature flags
|
||||
@@ -125,11 +127,26 @@ void dm_interface_exit(void);
|
||||
/*
|
||||
* sysfs interface
|
||||
*/
|
||||
struct dm_kobject_holder {
|
||||
struct kobject kobj;
|
||||
struct completion completion;
|
||||
};
|
||||
|
||||
static inline struct completion *dm_get_completion_from_kobject(struct kobject *kobj)
|
||||
{
|
||||
return &container_of(kobj, struct dm_kobject_holder, kobj)->completion;
|
||||
}
|
||||
|
||||
int dm_sysfs_init(struct mapped_device *md);
|
||||
void dm_sysfs_exit(struct mapped_device *md);
|
||||
struct kobject *dm_kobject(struct mapped_device *md);
|
||||
struct mapped_device *dm_get_from_kobject(struct kobject *kobj);
|
||||
|
||||
/*
|
||||
* The kobject helper
|
||||
*/
|
||||
void dm_kobject_release(struct kobject *kobj);
|
||||
|
||||
/*
|
||||
* Targets for linear and striped mappings
|
||||
*/
|
||||
|
||||
@@ -245,6 +245,10 @@ int sm_ll_extend(struct ll_disk *ll, dm_block_t extra_blocks)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/*
|
||||
* We need to set this before the dm_tm_new_block() call below.
|
||||
*/
|
||||
ll->nr_blocks = nr_blocks;
|
||||
for (i = old_blocks; i < blocks; i++) {
|
||||
struct dm_block *b;
|
||||
struct disk_index_entry idx;
|
||||
@@ -252,6 +256,7 @@ int sm_ll_extend(struct ll_disk *ll, dm_block_t extra_blocks)
|
||||
r = dm_tm_new_block(ll->tm, &dm_sm_bitmap_validator, &b);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
idx.blocknr = cpu_to_le64(dm_block_location(b));
|
||||
|
||||
r = dm_tm_unlock(ll->tm, b);
|
||||
@@ -266,7 +271,6 @@ int sm_ll_extend(struct ll_disk *ll, dm_block_t extra_blocks)
|
||||
return r;
|
||||
}
|
||||
|
||||
ll->nr_blocks = nr_blocks;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -1929,6 +1929,7 @@ static void raid5_end_write_request(struct bio *bi, int error)
|
||||
set_bit(R5_MadeGoodRepl, &sh->dev[i].flags);
|
||||
} else {
|
||||
if (!uptodate) {
|
||||
set_bit(STRIPE_DEGRADED, &sh->state);
|
||||
set_bit(WriteErrorSeen, &rdev->flags);
|
||||
set_bit(R5_WriteError, &sh->dev[i].flags);
|
||||
if (!test_and_set_bit(WantReplacement, &rdev->flags))
|
||||
|
||||
@@ -118,15 +118,10 @@ static u16 dib8000_i2c_read16(struct i2c_device *i2c, u16 reg)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static u16 dib8000_read_word(struct dib8000_state *state, u16 reg)
|
||||
static u16 __dib8000_read_word(struct dib8000_state *state, u16 reg)
|
||||
{
|
||||
u16 ret;
|
||||
|
||||
if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) {
|
||||
dprintk("could not acquire lock");
|
||||
return 0;
|
||||
}
|
||||
|
||||
state->i2c_write_buffer[0] = reg >> 8;
|
||||
state->i2c_write_buffer[1] = reg & 0xff;
|
||||
|
||||
@@ -144,6 +139,21 @@ static u16 dib8000_read_word(struct dib8000_state *state, u16 reg)
|
||||
dprintk("i2c read error on %d", reg);
|
||||
|
||||
ret = (state->i2c_read_buffer[0] << 8) | state->i2c_read_buffer[1];
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static u16 dib8000_read_word(struct dib8000_state *state, u16 reg)
|
||||
{
|
||||
u16 ret;
|
||||
|
||||
if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) {
|
||||
dprintk("could not acquire lock");
|
||||
return 0;
|
||||
}
|
||||
|
||||
ret = __dib8000_read_word(state, reg);
|
||||
|
||||
mutex_unlock(&state->i2c_buffer_lock);
|
||||
|
||||
return ret;
|
||||
@@ -153,8 +163,15 @@ static u32 dib8000_read32(struct dib8000_state *state, u16 reg)
|
||||
{
|
||||
u16 rw[2];
|
||||
|
||||
rw[0] = dib8000_read_word(state, reg + 0);
|
||||
rw[1] = dib8000_read_word(state, reg + 1);
|
||||
if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) {
|
||||
dprintk("could not acquire lock");
|
||||
return 0;
|
||||
}
|
||||
|
||||
rw[0] = __dib8000_read_word(state, reg + 0);
|
||||
rw[1] = __dib8000_read_word(state, reg + 1);
|
||||
|
||||
mutex_unlock(&state->i2c_buffer_lock);
|
||||
|
||||
return ((rw[0] << 16) | (rw[1]));
|
||||
}
|
||||
|
||||
@@ -176,21 +176,6 @@ unlock:
|
||||
mutex_unlock(&dev->mfc_mutex);
|
||||
}
|
||||
|
||||
static enum s5p_mfc_node_type s5p_mfc_get_node_type(struct file *file)
|
||||
{
|
||||
struct video_device *vdev = video_devdata(file);
|
||||
|
||||
if (!vdev) {
|
||||
mfc_err("failed to get video_device");
|
||||
return MFCNODE_INVALID;
|
||||
}
|
||||
if (vdev->index == 0)
|
||||
return MFCNODE_DECODER;
|
||||
else if (vdev->index == 1)
|
||||
return MFCNODE_ENCODER;
|
||||
return MFCNODE_INVALID;
|
||||
}
|
||||
|
||||
static void s5p_mfc_clear_int_flags(struct s5p_mfc_dev *dev)
|
||||
{
|
||||
mfc_write(dev, 0, S5P_FIMV_RISC_HOST_INT);
|
||||
@@ -700,6 +685,7 @@ irq_cleanup_hw:
|
||||
/* Open an MFC node */
|
||||
static int s5p_mfc_open(struct file *file)
|
||||
{
|
||||
struct video_device *vdev = video_devdata(file);
|
||||
struct s5p_mfc_dev *dev = video_drvdata(file);
|
||||
struct s5p_mfc_ctx *ctx = NULL;
|
||||
struct vb2_queue *q;
|
||||
@@ -737,7 +723,7 @@ static int s5p_mfc_open(struct file *file)
|
||||
/* Mark context as idle */
|
||||
clear_work_bit_irqsave(ctx);
|
||||
dev->ctx[ctx->num] = ctx;
|
||||
if (s5p_mfc_get_node_type(file) == MFCNODE_DECODER) {
|
||||
if (vdev == dev->vfd_dec) {
|
||||
ctx->type = MFCINST_DECODER;
|
||||
ctx->c_ops = get_dec_codec_ops();
|
||||
s5p_mfc_dec_init(ctx);
|
||||
@@ -747,7 +733,7 @@ static int s5p_mfc_open(struct file *file)
|
||||
mfc_err("Failed to setup mfc controls\n");
|
||||
goto err_ctrls_setup;
|
||||
}
|
||||
} else if (s5p_mfc_get_node_type(file) == MFCNODE_ENCODER) {
|
||||
} else if (vdev == dev->vfd_enc) {
|
||||
ctx->type = MFCINST_ENCODER;
|
||||
ctx->c_ops = get_enc_codec_ops();
|
||||
/* only for encoder */
|
||||
@@ -790,10 +776,10 @@ static int s5p_mfc_open(struct file *file)
|
||||
q = &ctx->vq_dst;
|
||||
q->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
|
||||
q->drv_priv = &ctx->fh;
|
||||
if (s5p_mfc_get_node_type(file) == MFCNODE_DECODER) {
|
||||
if (vdev == dev->vfd_dec) {
|
||||
q->io_modes = VB2_MMAP;
|
||||
q->ops = get_dec_queue_ops();
|
||||
} else if (s5p_mfc_get_node_type(file) == MFCNODE_ENCODER) {
|
||||
} else if (vdev == dev->vfd_enc) {
|
||||
q->io_modes = VB2_MMAP | VB2_USERPTR;
|
||||
q->ops = get_enc_queue_ops();
|
||||
} else {
|
||||
@@ -811,10 +797,10 @@ static int s5p_mfc_open(struct file *file)
|
||||
q->type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
|
||||
q->io_modes = VB2_MMAP;
|
||||
q->drv_priv = &ctx->fh;
|
||||
if (s5p_mfc_get_node_type(file) == MFCNODE_DECODER) {
|
||||
if (vdev == dev->vfd_dec) {
|
||||
q->io_modes = VB2_MMAP;
|
||||
q->ops = get_dec_queue_ops();
|
||||
} else if (s5p_mfc_get_node_type(file) == MFCNODE_ENCODER) {
|
||||
} else if (vdev == dev->vfd_enc) {
|
||||
q->io_modes = VB2_MMAP | VB2_USERPTR;
|
||||
q->ops = get_enc_queue_ops();
|
||||
} else {
|
||||
|
||||
@@ -112,15 +112,6 @@ enum s5p_mfc_fmt_type {
|
||||
MFC_FMT_RAW,
|
||||
};
|
||||
|
||||
/**
|
||||
* enum s5p_mfc_node_type - The type of an MFC device node.
|
||||
*/
|
||||
enum s5p_mfc_node_type {
|
||||
MFCNODE_INVALID = -1,
|
||||
MFCNODE_DECODER = 0,
|
||||
MFCNODE_ENCODER = 1,
|
||||
};
|
||||
|
||||
/**
|
||||
* enum s5p_mfc_inst_type - The type of an MFC instance.
|
||||
*/
|
||||
|
||||
@@ -445,6 +445,7 @@ static struct cxd2820r_config anysee_cxd2820r_config = {
|
||||
* IOD[0] ZL10353 1=enabled
|
||||
* IOE[0] tuner 0=enabled
|
||||
* tuner is behind ZL10353 I2C-gate
|
||||
* tuner is behind TDA10023 I2C-gate
|
||||
*
|
||||
* E7 TC VID=1c73 PID=861f HW=18 FW=0.7 AMTCI=0.5 "anysee-E7TC(LP)"
|
||||
* PCB: 508TC (rev0.6)
|
||||
@@ -960,7 +961,7 @@ static int anysee_tuner_attach(struct dvb_usb_adapter *adap)
|
||||
|
||||
if (fe && adap->fe[1]) {
|
||||
/* attach tuner for 2nd FE */
|
||||
fe = dvb_attach(dvb_pll_attach, adap->fe[0],
|
||||
fe = dvb_attach(dvb_pll_attach, adap->fe[1],
|
||||
(0xc0 >> 1), &d->i2c_adap,
|
||||
DVB_PLL_SAMSUNG_DTOS403IH102A);
|
||||
}
|
||||
|
||||
@@ -102,7 +102,7 @@ static int max77686_i2c_probe(struct i2c_client *i2c,
|
||||
max77686->irq_gpio = pdata->irq_gpio;
|
||||
max77686->irq = i2c->irq;
|
||||
|
||||
max77686->regmap = regmap_init_i2c(i2c, &max77686_regmap_config);
|
||||
max77686->regmap = devm_regmap_init_i2c(i2c, &max77686_regmap_config);
|
||||
if (IS_ERR(max77686->regmap)) {
|
||||
ret = PTR_ERR(max77686->regmap);
|
||||
dev_err(max77686->dev, "Failed to allocate register map: %d\n",
|
||||
|
||||
@@ -1181,11 +1181,22 @@ static void atmci_start_request(struct atmel_mci *host,
|
||||
iflags |= ATMCI_CMDRDY;
|
||||
cmd = mrq->cmd;
|
||||
cmdflags = atmci_prepare_command(slot->mmc, cmd);
|
||||
atmci_send_command(host, cmd, cmdflags);
|
||||
|
||||
/*
|
||||
* DMA transfer should be started before sending the command to avoid
|
||||
* unexpected errors especially for read operations in SDIO mode.
|
||||
* Unfortunately, in PDC mode, command has to be sent before starting
|
||||
* the transfer.
|
||||
*/
|
||||
if (host->submit_data != &atmci_submit_data_dma)
|
||||
atmci_send_command(host, cmd, cmdflags);
|
||||
|
||||
if (data)
|
||||
host->submit_data(host, data);
|
||||
|
||||
if (host->submit_data == &atmci_submit_data_dma)
|
||||
atmci_send_command(host, cmd, cmdflags);
|
||||
|
||||
if (mrq->stop) {
|
||||
host->stop_cmdr = atmci_prepare_command(slot->mmc, mrq->stop);
|
||||
host->stop_cmdr |= ATMCI_CMDR_STOP_XFER;
|
||||
|
||||
@@ -1768,12 +1768,12 @@ static int sdhci_execute_tuning(struct mmc_host *mmc, u32 opcode)
|
||||
unsigned long timeout;
|
||||
int err = 0;
|
||||
bool requires_tuning_nonuhs = false;
|
||||
unsigned long flags;
|
||||
|
||||
host = mmc_priv(mmc);
|
||||
|
||||
sdhci_runtime_pm_get(host);
|
||||
disable_irq(host->irq);
|
||||
spin_lock(&host->lock);
|
||||
spin_lock_irqsave(&host->lock, flags);
|
||||
|
||||
ctrl = sdhci_readw(host, SDHCI_HOST_CONTROL2);
|
||||
|
||||
@@ -1793,8 +1793,7 @@ static int sdhci_execute_tuning(struct mmc_host *mmc, u32 opcode)
|
||||
requires_tuning_nonuhs)
|
||||
ctrl |= SDHCI_CTRL_EXEC_TUNING;
|
||||
else {
|
||||
spin_unlock(&host->lock);
|
||||
enable_irq(host->irq);
|
||||
spin_unlock_irqrestore(&host->lock, flags);
|
||||
sdhci_runtime_pm_put(host);
|
||||
return 0;
|
||||
}
|
||||
@@ -1866,15 +1865,12 @@ static int sdhci_execute_tuning(struct mmc_host *mmc, u32 opcode)
|
||||
host->cmd = NULL;
|
||||
host->mrq = NULL;
|
||||
|
||||
spin_unlock(&host->lock);
|
||||
enable_irq(host->irq);
|
||||
|
||||
spin_unlock_irqrestore(&host->lock, flags);
|
||||
/* Wait for Buffer Read Ready interrupt */
|
||||
wait_event_interruptible_timeout(host->buf_ready_int,
|
||||
(host->tuning_done == 1),
|
||||
msecs_to_jiffies(50));
|
||||
disable_irq(host->irq);
|
||||
spin_lock(&host->lock);
|
||||
spin_lock_irqsave(&host->lock, flags);
|
||||
|
||||
if (!host->tuning_done) {
|
||||
pr_info(DRIVER_NAME ": Timeout waiting for "
|
||||
@@ -1948,8 +1944,7 @@ out:
|
||||
err = 0;
|
||||
|
||||
sdhci_clear_set_irqs(host, SDHCI_INT_DATA_AVAIL, ier);
|
||||
spin_unlock(&host->lock);
|
||||
enable_irq(host->irq);
|
||||
spin_unlock_irqrestore(&host->lock, flags);
|
||||
sdhci_runtime_pm_put(host);
|
||||
|
||||
return err;
|
||||
|
||||
@@ -665,7 +665,6 @@ static int mxc_nand_correct_data_v2_v3(struct mtd_info *mtd, u_char *dat,
|
||||
ecc_stat >>= 4;
|
||||
} while (--no_subpages);
|
||||
|
||||
mtd->ecc_stats.corrected += ret;
|
||||
pr_debug("%d Symbol Correctable RS-ECC Error\n", ret);
|
||||
|
||||
return ret;
|
||||
|
||||
@@ -126,6 +126,7 @@ static u16 bnx2x_free_tx_pkt(struct bnx2x *bp, struct bnx2x_fp_txdata *txdata,
|
||||
struct sk_buff *skb = tx_buf->skb;
|
||||
u16 bd_idx = TX_BD(tx_buf->first_bd), new_cons;
|
||||
int nbd;
|
||||
u16 split_bd_len = 0;
|
||||
|
||||
/* prefetch skb end pointer to speedup dev_kfree_skb() */
|
||||
prefetch(&skb->end);
|
||||
@@ -133,10 +134,7 @@ static u16 bnx2x_free_tx_pkt(struct bnx2x *bp, struct bnx2x_fp_txdata *txdata,
|
||||
DP(NETIF_MSG_TX_DONE, "fp[%d]: pkt_idx %d buff @(%p)->skb %p\n",
|
||||
txdata->txq_index, idx, tx_buf, skb);
|
||||
|
||||
/* unmap first bd */
|
||||
tx_start_bd = &txdata->tx_desc_ring[bd_idx].start_bd;
|
||||
dma_unmap_single(&bp->pdev->dev, BD_UNMAP_ADDR(tx_start_bd),
|
||||
BD_UNMAP_LEN(tx_start_bd), DMA_TO_DEVICE);
|
||||
|
||||
|
||||
nbd = le16_to_cpu(tx_start_bd->nbd) - 1;
|
||||
@@ -155,12 +153,19 @@ static u16 bnx2x_free_tx_pkt(struct bnx2x *bp, struct bnx2x_fp_txdata *txdata,
|
||||
--nbd;
|
||||
bd_idx = TX_BD(NEXT_TX_IDX(bd_idx));
|
||||
|
||||
/* ...and the TSO split header bd since they have no mapping */
|
||||
/* TSO headers+data bds share a common mapping. See bnx2x_tx_split() */
|
||||
if (tx_buf->flags & BNX2X_TSO_SPLIT_BD) {
|
||||
tx_data_bd = &txdata->tx_desc_ring[bd_idx].reg_bd;
|
||||
split_bd_len = BD_UNMAP_LEN(tx_data_bd);
|
||||
--nbd;
|
||||
bd_idx = TX_BD(NEXT_TX_IDX(bd_idx));
|
||||
}
|
||||
|
||||
/* unmap first bd */
|
||||
dma_unmap_single(&bp->pdev->dev, BD_UNMAP_ADDR(tx_start_bd),
|
||||
BD_UNMAP_LEN(tx_start_bd) + split_bd_len,
|
||||
DMA_TO_DEVICE);
|
||||
|
||||
/* now free frags */
|
||||
while (nbd > 0) {
|
||||
|
||||
|
||||
@@ -1600,6 +1600,7 @@ static void rhine_reset_task(struct work_struct *work)
|
||||
goto out_unlock;
|
||||
|
||||
napi_disable(&rp->napi);
|
||||
netif_tx_disable(dev);
|
||||
spin_lock_bh(&rp->lock);
|
||||
|
||||
/* clear all descriptors */
|
||||
|
||||
@@ -723,8 +723,6 @@ enum b43_firmware_file_type {
|
||||
struct b43_request_fw_context {
|
||||
/* The device we are requesting the fw for. */
|
||||
struct b43_wldev *dev;
|
||||
/* a completion event structure needed if this call is asynchronous */
|
||||
struct completion fw_load_complete;
|
||||
/* a pointer to the firmware object */
|
||||
const struct firmware *blob;
|
||||
/* The type of firmware to request. */
|
||||
@@ -801,6 +799,8 @@ enum {
|
||||
struct b43_wldev {
|
||||
struct b43_bus_dev *dev;
|
||||
struct b43_wl *wl;
|
||||
/* a completion event structure needed if this call is asynchronous */
|
||||
struct completion fw_load_complete;
|
||||
|
||||
/* The device initialization status.
|
||||
* Use b43_status() to query. */
|
||||
|
||||
@@ -2061,6 +2061,7 @@ void b43_do_release_fw(struct b43_firmware_file *fw)
|
||||
|
||||
static void b43_release_firmware(struct b43_wldev *dev)
|
||||
{
|
||||
complete(&dev->fw_load_complete);
|
||||
b43_do_release_fw(&dev->fw.ucode);
|
||||
b43_do_release_fw(&dev->fw.pcm);
|
||||
b43_do_release_fw(&dev->fw.initvals);
|
||||
@@ -2086,7 +2087,7 @@ static void b43_fw_cb(const struct firmware *firmware, void *context)
|
||||
struct b43_request_fw_context *ctx = context;
|
||||
|
||||
ctx->blob = firmware;
|
||||
complete(&ctx->fw_load_complete);
|
||||
complete(&ctx->dev->fw_load_complete);
|
||||
}
|
||||
|
||||
int b43_do_request_fw(struct b43_request_fw_context *ctx,
|
||||
@@ -2133,7 +2134,7 @@ int b43_do_request_fw(struct b43_request_fw_context *ctx,
|
||||
}
|
||||
if (async) {
|
||||
/* do this part asynchronously */
|
||||
init_completion(&ctx->fw_load_complete);
|
||||
init_completion(&ctx->dev->fw_load_complete);
|
||||
err = request_firmware_nowait(THIS_MODULE, 1, ctx->fwname,
|
||||
ctx->dev->dev->dev, GFP_KERNEL,
|
||||
ctx, b43_fw_cb);
|
||||
@@ -2141,12 +2142,11 @@ int b43_do_request_fw(struct b43_request_fw_context *ctx,
|
||||
pr_err("Unable to load firmware\n");
|
||||
return err;
|
||||
}
|
||||
/* stall here until fw ready */
|
||||
wait_for_completion(&ctx->fw_load_complete);
|
||||
wait_for_completion(&ctx->dev->fw_load_complete);
|
||||
if (ctx->blob)
|
||||
goto fw_ready;
|
||||
/* On some ARM systems, the async request will fail, but the next sync
|
||||
* request works. For this reason, we dall through here
|
||||
* request works. For this reason, we fall through here
|
||||
*/
|
||||
}
|
||||
err = request_firmware(&ctx->blob, ctx->fwname,
|
||||
@@ -2415,6 +2415,7 @@ error:
|
||||
|
||||
static int b43_one_core_attach(struct b43_bus_dev *dev, struct b43_wl *wl);
|
||||
static void b43_one_core_detach(struct b43_bus_dev *dev);
|
||||
static int b43_rng_init(struct b43_wl *wl);
|
||||
|
||||
static void b43_request_firmware(struct work_struct *work)
|
||||
{
|
||||
@@ -2466,6 +2467,10 @@ start_ieee80211:
|
||||
goto err_one_core_detach;
|
||||
wl->hw_registred = true;
|
||||
b43_leds_register(wl->current_dev);
|
||||
|
||||
/* Register HW RNG driver */
|
||||
b43_rng_init(wl);
|
||||
|
||||
goto out;
|
||||
|
||||
err_one_core_detach:
|
||||
@@ -4630,9 +4635,6 @@ static void b43_wireless_core_exit(struct b43_wldev *dev)
|
||||
if (!dev || b43_status(dev) != B43_STAT_INITIALIZED)
|
||||
return;
|
||||
|
||||
/* Unregister HW RNG driver */
|
||||
b43_rng_exit(dev->wl);
|
||||
|
||||
b43_set_status(dev, B43_STAT_UNINIT);
|
||||
|
||||
/* Stop the microcode PSM. */
|
||||
@@ -4775,9 +4777,6 @@ static int b43_wireless_core_init(struct b43_wldev *dev)
|
||||
|
||||
b43_set_status(dev, B43_STAT_INITIALIZED);
|
||||
|
||||
/* Register HW RNG driver */
|
||||
b43_rng_init(dev->wl);
|
||||
|
||||
out:
|
||||
return err;
|
||||
|
||||
@@ -5438,6 +5437,9 @@ static void b43_bcma_remove(struct bcma_device *core)
|
||||
|
||||
b43_one_core_detach(wldev->dev);
|
||||
|
||||
/* Unregister HW RNG driver */
|
||||
b43_rng_exit(wl);
|
||||
|
||||
b43_leds_unregister(wl);
|
||||
|
||||
ieee80211_free_hw(wl->hw);
|
||||
@@ -5515,6 +5517,9 @@ static void b43_ssb_remove(struct ssb_device *sdev)
|
||||
|
||||
b43_one_core_detach(dev);
|
||||
|
||||
/* Unregister HW RNG driver */
|
||||
b43_rng_exit(wl);
|
||||
|
||||
if (list_empty(&wl->devlist)) {
|
||||
b43_leds_unregister(wl);
|
||||
/* Last core on the chip unregistered.
|
||||
|
||||
@@ -821,10 +821,10 @@ void b43_rx(struct b43_wldev *dev, struct sk_buff *skb, const void *_rxhdr)
|
||||
* channel number in b43. */
|
||||
if (chanstat & B43_RX_CHAN_5GHZ) {
|
||||
status.band = IEEE80211_BAND_5GHZ;
|
||||
status.freq = b43_freq_to_channel_5ghz(chanid);
|
||||
status.freq = b43_channel_to_freq_5ghz(chanid);
|
||||
} else {
|
||||
status.band = IEEE80211_BAND_2GHZ;
|
||||
status.freq = b43_freq_to_channel_2ghz(chanid);
|
||||
status.freq = b43_channel_to_freq_2ghz(chanid);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -3918,6 +3918,7 @@ static void b43legacy_remove(struct ssb_device *dev)
|
||||
* as the ieee80211 unreg will destroy the workqueue. */
|
||||
cancel_work_sync(&wldev->restart_work);
|
||||
cancel_work_sync(&wl->firmware_load);
|
||||
complete(&wldev->fw_load_complete);
|
||||
|
||||
B43legacy_WARN_ON(!wl);
|
||||
if (!wldev->fw.ucode)
|
||||
|
||||
@@ -1618,7 +1618,7 @@ int mwifiex_ret_802_11_scan(struct mwifiex_private *priv,
|
||||
const u8 *ie_buf;
|
||||
size_t ie_len;
|
||||
u16 channel = 0;
|
||||
u64 fw_tsf = 0;
|
||||
__le64 fw_tsf = 0;
|
||||
u16 beacon_size = 0;
|
||||
u32 curr_bcn_bytes;
|
||||
u32 freq;
|
||||
@@ -1745,7 +1745,7 @@ int mwifiex_ret_802_11_scan(struct mwifiex_private *priv,
|
||||
ie_buf, ie_len, rssi, GFP_KERNEL);
|
||||
bss_priv = (struct mwifiex_bss_priv *)bss->priv;
|
||||
bss_priv->band = band;
|
||||
bss_priv->fw_tsf = fw_tsf;
|
||||
bss_priv->fw_tsf = le64_to_cpu(fw_tsf);
|
||||
if (priv->media_connected &&
|
||||
!memcmp(bssid,
|
||||
priv->curr_bss_params.bss_descriptor
|
||||
|
||||
@@ -46,10 +46,20 @@ void rtl_fw_cb(const struct firmware *firmware, void *context)
|
||||
"Firmware callback routine entered!\n");
|
||||
complete(&rtlpriv->firmware_loading_complete);
|
||||
if (!firmware) {
|
||||
if (rtlpriv->cfg->alt_fw_name) {
|
||||
err = request_firmware(&firmware,
|
||||
rtlpriv->cfg->alt_fw_name,
|
||||
rtlpriv->io.dev);
|
||||
pr_info("Loading alternative firmware %s\n",
|
||||
rtlpriv->cfg->alt_fw_name);
|
||||
if (!err)
|
||||
goto found_alt;
|
||||
}
|
||||
pr_err("Firmware %s not available\n", rtlpriv->cfg->fw_name);
|
||||
rtlpriv->max_fw_size = 0;
|
||||
return;
|
||||
}
|
||||
found_alt:
|
||||
if (firmware->size > rtlpriv->max_fw_size) {
|
||||
RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
|
||||
"Firmware is too big!\n");
|
||||
@@ -177,6 +187,7 @@ static int rtl_op_add_interface(struct ieee80211_hw *hw,
|
||||
rtlpriv->cfg->maps
|
||||
[RTL_IBSS_INT_MASKS]);
|
||||
}
|
||||
mac->link_state = MAC80211_LINKED;
|
||||
break;
|
||||
case NL80211_IFTYPE_ADHOC:
|
||||
RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD,
|
||||
|
||||
@@ -85,17 +85,15 @@ void rtl92cu_phy_rf6052_set_cck_txpower(struct ieee80211_hw *hw,
|
||||
if (mac->act_scanning) {
|
||||
tx_agc[RF90_PATH_A] = 0x3f3f3f3f;
|
||||
tx_agc[RF90_PATH_B] = 0x3f3f3f3f;
|
||||
if (turbo_scanoff) {
|
||||
for (idx1 = RF90_PATH_A; idx1 <= RF90_PATH_B; idx1++) {
|
||||
tx_agc[idx1] = ppowerlevel[idx1] |
|
||||
(ppowerlevel[idx1] << 8) |
|
||||
(ppowerlevel[idx1] << 16) |
|
||||
(ppowerlevel[idx1] << 24);
|
||||
if (rtlhal->interface == INTF_USB) {
|
||||
if (tx_agc[idx1] > 0x20 &&
|
||||
rtlefuse->external_pa)
|
||||
tx_agc[idx1] = 0x20;
|
||||
}
|
||||
for (idx1 = RF90_PATH_A; idx1 <= RF90_PATH_B; idx1++) {
|
||||
tx_agc[idx1] = ppowerlevel[idx1] |
|
||||
(ppowerlevel[idx1] << 8) |
|
||||
(ppowerlevel[idx1] << 16) |
|
||||
(ppowerlevel[idx1] << 24);
|
||||
if (rtlhal->interface == INTF_USB) {
|
||||
if (tx_agc[idx1] > 0x20 &&
|
||||
rtlefuse->external_pa)
|
||||
tx_agc[idx1] = 0x20;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@@ -104,10 +102,10 @@ void rtl92cu_phy_rf6052_set_cck_txpower(struct ieee80211_hw *hw,
|
||||
tx_agc[RF90_PATH_A] = 0x10101010;
|
||||
tx_agc[RF90_PATH_B] = 0x10101010;
|
||||
} else if (rtlpriv->dm.dynamic_txhighpower_lvl ==
|
||||
TXHIGHPWRLEVEL_LEVEL1) {
|
||||
TXHIGHPWRLEVEL_LEVEL2) {
|
||||
tx_agc[RF90_PATH_A] = 0x00000000;
|
||||
tx_agc[RF90_PATH_B] = 0x00000000;
|
||||
} else{
|
||||
} else {
|
||||
for (idx1 = RF90_PATH_A; idx1 <= RF90_PATH_B; idx1++) {
|
||||
tx_agc[idx1] = ppowerlevel[idx1] |
|
||||
(ppowerlevel[idx1] << 8) |
|
||||
@@ -373,7 +371,12 @@ static void _rtl92c_write_ofdm_power_reg(struct ieee80211_hw *hw,
|
||||
regoffset == RTXAGC_B_MCS07_MCS04)
|
||||
regoffset = 0xc98;
|
||||
for (i = 0; i < 3; i++) {
|
||||
writeVal = (writeVal > 6) ? (writeVal - 6) : 0;
|
||||
if (i != 2)
|
||||
writeVal = (writeVal > 8) ?
|
||||
(writeVal - 8) : 0;
|
||||
else
|
||||
writeVal = (writeVal > 6) ?
|
||||
(writeVal - 6) : 0;
|
||||
rtl_write_byte(rtlpriv, (u32)(regoffset + i),
|
||||
(u8)writeVal);
|
||||
}
|
||||
|
||||
@@ -49,6 +49,9 @@ MODULE_AUTHOR("Larry Finger <Larry.Finger@lwfinger.net>");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_DESCRIPTION("Realtek 8192C/8188C 802.11n USB wireless");
|
||||
MODULE_FIRMWARE("rtlwifi/rtl8192cufw.bin");
|
||||
MODULE_FIRMWARE("rtlwifi/rtl8192cufw_A.bin");
|
||||
MODULE_FIRMWARE("rtlwifi/rtl8192cufw_B.bin");
|
||||
MODULE_FIRMWARE("rtlwifi/rtl8192cufw_TMSC.bin");
|
||||
|
||||
static int rtl92cu_init_sw_vars(struct ieee80211_hw *hw)
|
||||
{
|
||||
@@ -68,15 +71,22 @@ static int rtl92cu_init_sw_vars(struct ieee80211_hw *hw)
|
||||
"Can't alloc buffer for fw\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (IS_VENDOR_UMC_A_CUT(rtlpriv->rtlhal.version) &&
|
||||
!IS_92C_SERIAL(rtlpriv->rtlhal.version)) {
|
||||
rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cufw_A.bin";
|
||||
} else if (IS_81xxC_VENDOR_UMC_B_CUT(rtlpriv->rtlhal.version)) {
|
||||
rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cufw_B.bin";
|
||||
} else {
|
||||
rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cufw_TMSC.bin";
|
||||
}
|
||||
/* provide name of alternative file */
|
||||
rtlpriv->cfg->alt_fw_name = "rtlwifi/rtl8192cufw.bin";
|
||||
pr_info("Loading firmware %s\n", rtlpriv->cfg->fw_name);
|
||||
rtlpriv->max_fw_size = 0x4000;
|
||||
err = request_firmware_nowait(THIS_MODULE, 1,
|
||||
rtlpriv->cfg->fw_name, rtlpriv->io.dev,
|
||||
GFP_KERNEL, hw, rtl_fw_cb);
|
||||
|
||||
|
||||
return 0;
|
||||
return err;
|
||||
}
|
||||
|
||||
static void rtl92cu_deinit_sw_vars(struct ieee80211_hw *hw)
|
||||
@@ -306,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, 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*/
|
||||
/* HP - Lite-On ,8188CUS Slim Combo */
|
||||
|
||||
@@ -1640,6 +1640,7 @@ struct rtl_hal_cfg {
|
||||
bool write_readback;
|
||||
char *name;
|
||||
char *fw_name;
|
||||
char *alt_fw_name;
|
||||
struct rtl_hal_ops *ops;
|
||||
struct rtl_mod_params *mod_params;
|
||||
struct rtl_hal_usbint_cfg *usb_interface_cfg;
|
||||
|
||||
@@ -107,6 +107,7 @@ struct netfront_info {
|
||||
} tx_skbs[NET_TX_RING_SIZE];
|
||||
grant_ref_t gref_tx_head;
|
||||
grant_ref_t grant_tx_ref[NET_TX_RING_SIZE];
|
||||
struct page *grant_tx_page[NET_TX_RING_SIZE];
|
||||
unsigned tx_skb_freelist;
|
||||
|
||||
spinlock_t rx_lock ____cacheline_aligned_in_smp;
|
||||
@@ -387,6 +388,7 @@ static void xennet_tx_buf_gc(struct net_device *dev)
|
||||
gnttab_release_grant_reference(
|
||||
&np->gref_tx_head, np->grant_tx_ref[id]);
|
||||
np->grant_tx_ref[id] = GRANT_INVALID_REF;
|
||||
np->grant_tx_page[id] = NULL;
|
||||
add_id_to_freelist(&np->tx_skb_freelist, np->tx_skbs, id);
|
||||
dev_kfree_skb_irq(skb);
|
||||
}
|
||||
@@ -443,6 +445,7 @@ static void xennet_make_frags(struct sk_buff *skb, struct net_device *dev,
|
||||
gnttab_grant_foreign_access_ref(ref, np->xbdev->otherend_id,
|
||||
mfn, GNTMAP_readonly);
|
||||
|
||||
np->grant_tx_page[id] = virt_to_page(data);
|
||||
tx->gref = np->grant_tx_ref[id] = ref;
|
||||
tx->offset = offset;
|
||||
tx->size = len;
|
||||
@@ -488,6 +491,7 @@ static void xennet_make_frags(struct sk_buff *skb, struct net_device *dev,
|
||||
np->xbdev->otherend_id,
|
||||
mfn, GNTMAP_readonly);
|
||||
|
||||
np->grant_tx_page[id] = page;
|
||||
tx->gref = np->grant_tx_ref[id] = ref;
|
||||
tx->offset = offset;
|
||||
tx->size = bytes;
|
||||
@@ -588,6 +592,7 @@ static int xennet_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
mfn = virt_to_mfn(data);
|
||||
gnttab_grant_foreign_access_ref(
|
||||
ref, np->xbdev->otherend_id, mfn, GNTMAP_readonly);
|
||||
np->grant_tx_page[id] = virt_to_page(data);
|
||||
tx->gref = np->grant_tx_ref[id] = ref;
|
||||
tx->offset = offset;
|
||||
tx->size = len;
|
||||
@@ -1126,10 +1131,11 @@ static void xennet_release_tx_bufs(struct netfront_info *np)
|
||||
continue;
|
||||
|
||||
skb = np->tx_skbs[i].skb;
|
||||
gnttab_end_foreign_access_ref(np->grant_tx_ref[i],
|
||||
GNTMAP_readonly);
|
||||
gnttab_release_grant_reference(&np->gref_tx_head,
|
||||
np->grant_tx_ref[i]);
|
||||
get_page(np->grant_tx_page[i]);
|
||||
gnttab_end_foreign_access(np->grant_tx_ref[i],
|
||||
GNTMAP_readonly,
|
||||
(unsigned long)page_address(np->grant_tx_page[i]));
|
||||
np->grant_tx_page[i] = NULL;
|
||||
np->grant_tx_ref[i] = GRANT_INVALID_REF;
|
||||
add_id_to_freelist(&np->tx_skb_freelist, np->tx_skbs, i);
|
||||
dev_kfree_skb_irq(skb);
|
||||
@@ -1138,78 +1144,35 @@ static void xennet_release_tx_bufs(struct netfront_info *np)
|
||||
|
||||
static void xennet_release_rx_bufs(struct netfront_info *np)
|
||||
{
|
||||
struct mmu_update *mmu = np->rx_mmu;
|
||||
struct multicall_entry *mcl = np->rx_mcl;
|
||||
struct sk_buff_head free_list;
|
||||
struct sk_buff *skb;
|
||||
unsigned long mfn;
|
||||
int xfer = 0, noxfer = 0, unused = 0;
|
||||
int id, ref;
|
||||
|
||||
dev_warn(&np->netdev->dev, "%s: fix me for copying receiver.\n",
|
||||
__func__);
|
||||
return;
|
||||
|
||||
skb_queue_head_init(&free_list);
|
||||
|
||||
spin_lock_bh(&np->rx_lock);
|
||||
|
||||
for (id = 0; id < NET_RX_RING_SIZE; id++) {
|
||||
ref = np->grant_rx_ref[id];
|
||||
if (ref == GRANT_INVALID_REF) {
|
||||
unused++;
|
||||
continue;
|
||||
}
|
||||
struct sk_buff *skb;
|
||||
struct page *page;
|
||||
|
||||
skb = np->rx_skbs[id];
|
||||
mfn = gnttab_end_foreign_transfer_ref(ref);
|
||||
gnttab_release_grant_reference(&np->gref_rx_head, ref);
|
||||
if (!skb)
|
||||
continue;
|
||||
|
||||
ref = np->grant_rx_ref[id];
|
||||
if (ref == GRANT_INVALID_REF)
|
||||
continue;
|
||||
|
||||
page = skb_frag_page(&skb_shinfo(skb)->frags[0]);
|
||||
|
||||
/* gnttab_end_foreign_access() needs a page ref until
|
||||
* foreign access is ended (which may be deferred).
|
||||
*/
|
||||
get_page(page);
|
||||
gnttab_end_foreign_access(ref, 0,
|
||||
(unsigned long)page_address(page));
|
||||
np->grant_rx_ref[id] = GRANT_INVALID_REF;
|
||||
|
||||
if (0 == mfn) {
|
||||
skb_shinfo(skb)->nr_frags = 0;
|
||||
dev_kfree_skb(skb);
|
||||
noxfer++;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!xen_feature(XENFEAT_auto_translated_physmap)) {
|
||||
/* Remap the page. */
|
||||
const struct page *page =
|
||||
skb_frag_page(&skb_shinfo(skb)->frags[0]);
|
||||
unsigned long pfn = page_to_pfn(page);
|
||||
void *vaddr = page_address(page);
|
||||
|
||||
MULTI_update_va_mapping(mcl, (unsigned long)vaddr,
|
||||
mfn_pte(mfn, PAGE_KERNEL),
|
||||
0);
|
||||
mcl++;
|
||||
mmu->ptr = ((u64)mfn << PAGE_SHIFT)
|
||||
| MMU_MACHPHYS_UPDATE;
|
||||
mmu->val = pfn;
|
||||
mmu++;
|
||||
|
||||
set_phys_to_machine(pfn, mfn);
|
||||
}
|
||||
__skb_queue_tail(&free_list, skb);
|
||||
xfer++;
|
||||
kfree_skb(skb);
|
||||
}
|
||||
|
||||
dev_info(&np->netdev->dev, "%s: %d xfer, %d noxfer, %d unused\n",
|
||||
__func__, xfer, noxfer, unused);
|
||||
|
||||
if (xfer) {
|
||||
if (!xen_feature(XENFEAT_auto_translated_physmap)) {
|
||||
/* Do all the remapping work and M2P updates. */
|
||||
MULTI_mmu_update(mcl, np->rx_mmu, mmu - np->rx_mmu,
|
||||
NULL, DOMID_SELF);
|
||||
mcl++;
|
||||
HYPERVISOR_multicall(np->rx_mcl, mcl - np->rx_mcl);
|
||||
}
|
||||
}
|
||||
|
||||
__skb_queue_purge(&free_list);
|
||||
|
||||
spin_unlock_bh(&np->rx_lock);
|
||||
}
|
||||
|
||||
@@ -1344,6 +1307,7 @@ static struct net_device *xennet_create_dev(struct xenbus_device *dev)
|
||||
for (i = 0; i < NET_RX_RING_SIZE; i++) {
|
||||
np->rx_skbs[i] = NULL;
|
||||
np->grant_rx_ref[i] = GRANT_INVALID_REF;
|
||||
np->grant_tx_page[i] = NULL;
|
||||
}
|
||||
|
||||
/* A grant for every tx ring slot */
|
||||
@@ -1994,7 +1958,7 @@ static int __init netif_init(void)
|
||||
if (!xen_domain())
|
||||
return -ENODEV;
|
||||
|
||||
if (xen_hvm_domain() && !xen_platform_pci_unplug)
|
||||
if (!xen_has_pv_nic_devices())
|
||||
return -ENODEV;
|
||||
|
||||
printk(KERN_INFO "Initialising Xen virtual ethernet driver.\n");
|
||||
|
||||
@@ -2596,8 +2596,6 @@ enum parport_pc_pci_cards {
|
||||
syba_2p_epp,
|
||||
syba_1p_ecp,
|
||||
titan_010l,
|
||||
titan_1284p1,
|
||||
titan_1284p2,
|
||||
avlab_1p,
|
||||
avlab_2p,
|
||||
oxsemi_952,
|
||||
@@ -2656,8 +2654,6 @@ static struct parport_pc_pci {
|
||||
/* syba_2p_epp AP138B */ { 2, { { 0, 0x078 }, { 0, 0x178 }, } },
|
||||
/* syba_1p_ecp W83787 */ { 1, { { 0, 0x078 }, } },
|
||||
/* titan_010l */ { 1, { { 3, -1 }, } },
|
||||
/* titan_1284p1 */ { 1, { { 0, 1 }, } },
|
||||
/* titan_1284p2 */ { 2, { { 0, 1 }, { 2, 3 }, } },
|
||||
/* avlab_1p */ { 1, { { 0, 1}, } },
|
||||
/* avlab_2p */ { 2, { { 0, 1}, { 2, 3 },} },
|
||||
/* The Oxford Semi cards are unusual: 954 doesn't support ECP,
|
||||
@@ -2673,8 +2669,8 @@ static struct parport_pc_pci {
|
||||
/* netmos_9705 */ { 1, { { 0, -1 }, } },
|
||||
/* netmos_9715 */ { 2, { { 0, 1 }, { 2, 3 },} },
|
||||
/* netmos_9755 */ { 2, { { 0, 1 }, { 2, 3 },} },
|
||||
/* netmos_9805 */ { 1, { { 0, -1 }, } },
|
||||
/* netmos_9815 */ { 2, { { 0, -1 }, { 2, -1 }, } },
|
||||
/* netmos_9805 */ { 1, { { 0, 1 }, } },
|
||||
/* netmos_9815 */ { 2, { { 0, 1 }, { 2, 3 }, } },
|
||||
/* netmos_9901 */ { 1, { { 0, -1 }, } },
|
||||
/* netmos_9865 */ { 1, { { 0, -1 }, } },
|
||||
/* quatech_sppxp100 */ { 1, { { 0, 1 }, } },
|
||||
@@ -2718,8 +2714,6 @@ static const struct pci_device_id parport_pc_pci_tbl[] = {
|
||||
PCI_ANY_ID, PCI_ANY_ID, 0, 0, syba_1p_ecp },
|
||||
{ PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_010L,
|
||||
PCI_ANY_ID, PCI_ANY_ID, 0, 0, titan_010l },
|
||||
{ 0x9710, 0x9805, 0x1000, 0x0010, 0, 0, titan_1284p1 },
|
||||
{ 0x9710, 0x9815, 0x1000, 0x0020, 0, 0, titan_1284p2 },
|
||||
/* PCI_VENDOR_ID_AVLAB/Intek21 has another bunch of cards ...*/
|
||||
/* AFAVLAB_TK9902 */
|
||||
{ 0x14db, 0x2120, PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_1p},
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/time.h>
|
||||
#include <xen/platform_pci.h>
|
||||
|
||||
#include <asm/xen/swiotlb-xen.h>
|
||||
#define INVALID_GRANT_REF (0)
|
||||
@@ -1138,6 +1139,9 @@ static int __init pcifront_init(void)
|
||||
if (!xen_pv_domain() || xen_initial_domain())
|
||||
return -ENODEV;
|
||||
|
||||
if (!xen_has_pv_devices())
|
||||
return -ENODEV;
|
||||
|
||||
pci_frontend_registrar(1 /* enable */);
|
||||
|
||||
return xenbus_register_frontend(&xenpci_driver);
|
||||
|
||||
@@ -77,6 +77,7 @@ static inline void delayed_sysfs_set(struct led_classdev *led_cdev,
|
||||
static struct acpi_device_id lis3lv02d_device_ids[] = {
|
||||
{"HPQ0004", 0}, /* HP Mobile Data Protection System PNP */
|
||||
{"HPQ6000", 0}, /* HP Mobile Data Protection System PNP */
|
||||
{"HPQ6007", 0}, /* HP Mobile Data Protection System PNP */
|
||||
{"", 0},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(acpi, lis3lv02d_device_ids);
|
||||
|
||||
@@ -34,11 +34,11 @@
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/log2.h>
|
||||
#include <linux/pm.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/dmi.h>
|
||||
|
||||
/* this is for "generic access to PC-style RTC" using CMOS_READ/CMOS_WRITE */
|
||||
#include <asm-generic/rtc.h>
|
||||
@@ -377,6 +377,51 @@ static int cmos_set_alarm(struct device *dev, struct rtc_wkalrm *t)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Do not disable RTC alarm on shutdown - workaround for b0rked BIOSes.
|
||||
*/
|
||||
static bool alarm_disable_quirk;
|
||||
|
||||
static int __init set_alarm_disable_quirk(const struct dmi_system_id *id)
|
||||
{
|
||||
alarm_disable_quirk = true;
|
||||
pr_info("rtc-cmos: BIOS has alarm-disable quirk. ");
|
||||
pr_info("RTC alarms disabled\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct dmi_system_id rtc_quirks[] __initconst = {
|
||||
/* https://bugzilla.novell.com/show_bug.cgi?id=805740 */
|
||||
{
|
||||
.callback = set_alarm_disable_quirk,
|
||||
.ident = "IBM Truman",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "4852570"),
|
||||
},
|
||||
},
|
||||
/* https://bugzilla.novell.com/show_bug.cgi?id=812592 */
|
||||
{
|
||||
.callback = set_alarm_disable_quirk,
|
||||
.ident = "Gigabyte GA-990XA-UD3",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR,
|
||||
"Gigabyte Technology Co., Ltd."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "GA-990XA-UD3"),
|
||||
},
|
||||
},
|
||||
/* http://permalink.gmane.org/gmane.linux.kernel/1604474 */
|
||||
{
|
||||
.callback = set_alarm_disable_quirk,
|
||||
.ident = "Toshiba Satellite L300",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Satellite L300"),
|
||||
},
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
static int cmos_alarm_irq_enable(struct device *dev, unsigned int enabled)
|
||||
{
|
||||
struct cmos_rtc *cmos = dev_get_drvdata(dev);
|
||||
@@ -385,6 +430,9 @@ static int cmos_alarm_irq_enable(struct device *dev, unsigned int enabled)
|
||||
if (!is_valid_irq(cmos->irq))
|
||||
return -EINVAL;
|
||||
|
||||
if (alarm_disable_quirk)
|
||||
return 0;
|
||||
|
||||
spin_lock_irqsave(&rtc_lock, flags);
|
||||
|
||||
if (enabled)
|
||||
@@ -1166,6 +1214,8 @@ static int __init cmos_init(void)
|
||||
platform_driver_registered = true;
|
||||
}
|
||||
|
||||
dmi_check_system(rtc_quirks);
|
||||
|
||||
if (retval == 0)
|
||||
return 0;
|
||||
|
||||
|
||||
@@ -51,7 +51,7 @@ static irqreturn_t max8907_irq_handler(int irq, void *data)
|
||||
{
|
||||
struct max8907_rtc *rtc = data;
|
||||
|
||||
regmap_update_bits(rtc->regmap, MAX8907_REG_ALARM0_CNTL, 0x7f, 0);
|
||||
regmap_write(rtc->regmap, MAX8907_REG_ALARM0_CNTL, 0);
|
||||
|
||||
rtc_update_irq(rtc->rtc_dev, 1, RTC_IRQF | RTC_AF);
|
||||
|
||||
@@ -64,7 +64,7 @@ static void regs_to_tm(u8 *regs, struct rtc_time *tm)
|
||||
bcd2bin(regs[RTC_YEAR1]) - 1900;
|
||||
tm->tm_mon = bcd2bin(regs[RTC_MONTH] & 0x1f) - 1;
|
||||
tm->tm_mday = bcd2bin(regs[RTC_DATE] & 0x3f);
|
||||
tm->tm_wday = (regs[RTC_WEEKDAY] & 0x07) - 1;
|
||||
tm->tm_wday = (regs[RTC_WEEKDAY] & 0x07);
|
||||
if (regs[RTC_HOUR] & HOUR_12) {
|
||||
tm->tm_hour = bcd2bin(regs[RTC_HOUR] & 0x01f);
|
||||
if (tm->tm_hour == 12)
|
||||
@@ -88,7 +88,7 @@ static void tm_to_regs(struct rtc_time *tm, u8 *regs)
|
||||
regs[RTC_YEAR1] = bin2bcd(low);
|
||||
regs[RTC_MONTH] = bin2bcd(tm->tm_mon + 1);
|
||||
regs[RTC_DATE] = bin2bcd(tm->tm_mday);
|
||||
regs[RTC_WEEKDAY] = tm->tm_wday + 1;
|
||||
regs[RTC_WEEKDAY] = tm->tm_wday;
|
||||
regs[RTC_HOUR] = bin2bcd(tm->tm_hour);
|
||||
regs[RTC_MIN] = bin2bcd(tm->tm_min);
|
||||
regs[RTC_SEC] = bin2bcd(tm->tm_sec);
|
||||
@@ -153,7 +153,7 @@ static int max8907_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
|
||||
tm_to_regs(&alrm->time, regs);
|
||||
|
||||
/* Disable alarm while we update the target time */
|
||||
ret = regmap_update_bits(rtc->regmap, MAX8907_REG_ALARM0_CNTL, 0x7f, 0);
|
||||
ret = regmap_write(rtc->regmap, MAX8907_REG_ALARM0_CNTL, 0);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
@@ -163,8 +163,7 @@ static int max8907_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
|
||||
return ret;
|
||||
|
||||
if (alrm->enabled)
|
||||
ret = regmap_update_bits(rtc->regmap, MAX8907_REG_ALARM0_CNTL,
|
||||
0x7f, 0x7f);
|
||||
ret = regmap_write(rtc->regmap, MAX8907_REG_ALARM0_CNTL, 0x77);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1824,7 +1824,7 @@ out:
|
||||
static u32 *
|
||||
bfad_load_fwimg(struct pci_dev *pdev)
|
||||
{
|
||||
if (pdev->device == BFA_PCI_DEVICE_ID_CT2) {
|
||||
if (bfa_asic_id_ct2(pdev->device)) {
|
||||
if (bfi_image_ct2_size == 0)
|
||||
bfad_read_firmware(pdev, &bfi_image_ct2,
|
||||
&bfi_image_ct2_size, BFAD_FW_FILE_CT2);
|
||||
@@ -1834,12 +1834,14 @@ bfad_load_fwimg(struct pci_dev *pdev)
|
||||
bfad_read_firmware(pdev, &bfi_image_ct,
|
||||
&bfi_image_ct_size, BFAD_FW_FILE_CT);
|
||||
return bfi_image_ct;
|
||||
} else {
|
||||
} else if (bfa_asic_id_cb(pdev->device)) {
|
||||
if (bfi_image_cb_size == 0)
|
||||
bfad_read_firmware(pdev, &bfi_image_cb,
|
||||
&bfi_image_cb_size, BFAD_FW_FILE_CB);
|
||||
return bfi_image_cb;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
@@ -358,6 +358,10 @@ static u8 key_2char2num(u8 hch, u8 lch)
|
||||
return (hex_to_bin(hch) << 4) | hex_to_bin(lch);
|
||||
}
|
||||
|
||||
static const struct device_type wlan_type = {
|
||||
.name = "wlan",
|
||||
};
|
||||
|
||||
/*
|
||||
* drv_init() - a device potentially for us
|
||||
*
|
||||
@@ -393,6 +397,7 @@ static int r871xu_drv_init(struct usb_interface *pusb_intf,
|
||||
padapter->pusb_intf = pusb_intf;
|
||||
usb_set_intfdata(pusb_intf, pnetdev);
|
||||
SET_NETDEV_DEV(pnetdev, &pusb_intf->dev);
|
||||
pnetdev->dev.type = &wlan_type;
|
||||
/* step 2. */
|
||||
padapter->dvobj_init = &r8712_usb_dvobj_init;
|
||||
padapter->dvobj_deinit = &r8712_usb_dvobj_deinit;
|
||||
|
||||
@@ -1634,7 +1634,6 @@ BBvUpdatePreEDThreshold(
|
||||
|
||||
if( bScanning )
|
||||
{ // need Max sensitivity //RSSI -69, -70,....
|
||||
if(pDevice->byBBPreEDIndex == 0) break;
|
||||
pDevice->byBBPreEDIndex = 0;
|
||||
ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xC9, 0x00); //CR201(0xC9)
|
||||
ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xCE, 0x30); //CR206(0xCE)
|
||||
@@ -1777,7 +1776,6 @@ BBvUpdatePreEDThreshold(
|
||||
|
||||
if( bScanning )
|
||||
{ // need Max sensitivity //RSSI -69, -70, ...
|
||||
if(pDevice->byBBPreEDIndex == 0) break;
|
||||
pDevice->byBBPreEDIndex = 0;
|
||||
ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xC9, 0x00); //CR201(0xC9)
|
||||
ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xCE, 0x24); //CR206(0xCE)
|
||||
@@ -1929,7 +1927,6 @@ BBvUpdatePreEDThreshold(
|
||||
case RF_VT3342A0: //RobertYu:20060627, testing table
|
||||
if( bScanning )
|
||||
{ // need Max sensitivity //RSSI -67, -68, ...
|
||||
if(pDevice->byBBPreEDIndex == 0) break;
|
||||
pDevice->byBBPreEDIndex = 0;
|
||||
ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xC9, 0x00); //CR201(0xC9)
|
||||
ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xCE, 0x38); //CR206(0xCE)
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
static LIST_HEAD(g_tiqn_list);
|
||||
static LIST_HEAD(g_np_list);
|
||||
static DEFINE_SPINLOCK(tiqn_lock);
|
||||
static DEFINE_SPINLOCK(np_lock);
|
||||
static DEFINE_MUTEX(np_lock);
|
||||
|
||||
static struct idr tiqn_idr;
|
||||
struct idr sess_idr;
|
||||
@@ -264,6 +264,9 @@ int iscsit_deaccess_np(struct iscsi_np *np, struct iscsi_portal_group *tpg)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Called with mutex np_lock held
|
||||
*/
|
||||
static struct iscsi_np *iscsit_get_np(
|
||||
struct __kernel_sockaddr_storage *sockaddr,
|
||||
int network_transport)
|
||||
@@ -274,11 +277,10 @@ static struct iscsi_np *iscsit_get_np(
|
||||
int ip_match = 0;
|
||||
u16 port;
|
||||
|
||||
spin_lock_bh(&np_lock);
|
||||
list_for_each_entry(np, &g_np_list, np_list) {
|
||||
spin_lock(&np->np_thread_lock);
|
||||
spin_lock_bh(&np->np_thread_lock);
|
||||
if (np->np_thread_state != ISCSI_NP_THREAD_ACTIVE) {
|
||||
spin_unlock(&np->np_thread_lock);
|
||||
spin_unlock_bh(&np->np_thread_lock);
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -311,13 +313,11 @@ static struct iscsi_np *iscsit_get_np(
|
||||
* while iscsi_tpg_add_network_portal() is called.
|
||||
*/
|
||||
np->np_exports++;
|
||||
spin_unlock(&np->np_thread_lock);
|
||||
spin_unlock_bh(&np_lock);
|
||||
spin_unlock_bh(&np->np_thread_lock);
|
||||
return np;
|
||||
}
|
||||
spin_unlock(&np->np_thread_lock);
|
||||
spin_unlock_bh(&np->np_thread_lock);
|
||||
}
|
||||
spin_unlock_bh(&np_lock);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
@@ -331,16 +331,22 @@ struct iscsi_np *iscsit_add_np(
|
||||
struct sockaddr_in6 *sock_in6;
|
||||
struct iscsi_np *np;
|
||||
int ret;
|
||||
|
||||
mutex_lock(&np_lock);
|
||||
|
||||
/*
|
||||
* Locate the existing struct iscsi_np if already active..
|
||||
*/
|
||||
np = iscsit_get_np(sockaddr, network_transport);
|
||||
if (np)
|
||||
if (np) {
|
||||
mutex_unlock(&np_lock);
|
||||
return np;
|
||||
}
|
||||
|
||||
np = kzalloc(sizeof(struct iscsi_np), GFP_KERNEL);
|
||||
if (!np) {
|
||||
pr_err("Unable to allocate memory for struct iscsi_np\n");
|
||||
mutex_unlock(&np_lock);
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
@@ -363,6 +369,7 @@ struct iscsi_np *iscsit_add_np(
|
||||
ret = iscsi_target_setup_login_socket(np, sockaddr);
|
||||
if (ret != 0) {
|
||||
kfree(np);
|
||||
mutex_unlock(&np_lock);
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
@@ -371,6 +378,7 @@ struct iscsi_np *iscsit_add_np(
|
||||
pr_err("Unable to create kthread: iscsi_np\n");
|
||||
ret = PTR_ERR(np->np_thread);
|
||||
kfree(np);
|
||||
mutex_unlock(&np_lock);
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
/*
|
||||
@@ -381,10 +389,10 @@ struct iscsi_np *iscsit_add_np(
|
||||
* point because iscsi_np has not been added to g_np_list yet.
|
||||
*/
|
||||
np->np_exports = 1;
|
||||
np->np_thread_state = ISCSI_NP_THREAD_ACTIVE;
|
||||
|
||||
spin_lock_bh(&np_lock);
|
||||
list_add_tail(&np->np_list, &g_np_list);
|
||||
spin_unlock_bh(&np_lock);
|
||||
mutex_unlock(&np_lock);
|
||||
|
||||
pr_debug("CORE[0] - Added Network Portal: %s:%hu on %s\n",
|
||||
np->np_ip, np->np_port, (np->np_network_transport == ISCSI_TCP) ?
|
||||
@@ -455,9 +463,9 @@ int iscsit_del_np(struct iscsi_np *np)
|
||||
}
|
||||
iscsit_del_np_comm(np);
|
||||
|
||||
spin_lock_bh(&np_lock);
|
||||
mutex_lock(&np_lock);
|
||||
list_del(&np->np_list);
|
||||
spin_unlock_bh(&np_lock);
|
||||
mutex_unlock(&np_lock);
|
||||
|
||||
pr_debug("CORE[0] - Removed Network Portal: %s:%hu on %s\n",
|
||||
np->np_ip, np->np_port, (np->np_network_transport == ISCSI_TCP) ?
|
||||
|
||||
@@ -1545,6 +1545,7 @@ pci_wch_ch353_setup(struct serial_private *priv,
|
||||
#define PCI_DEVICE_ID_TITAN_800E 0xA014
|
||||
#define PCI_DEVICE_ID_TITAN_200EI 0xA016
|
||||
#define PCI_DEVICE_ID_TITAN_200EISI 0xA017
|
||||
#define PCI_DEVICE_ID_TITAN_200V3 0xA306
|
||||
#define PCI_DEVICE_ID_TITAN_400V3 0xA310
|
||||
#define PCI_DEVICE_ID_TITAN_410V3 0xA312
|
||||
#define PCI_DEVICE_ID_TITAN_800V3 0xA314
|
||||
@@ -4110,6 +4111,9 @@ static struct pci_device_id serial_pci_tbl[] = {
|
||||
{ PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_200EISI,
|
||||
PCI_ANY_ID, PCI_ANY_ID, 0, 0,
|
||||
pbn_oxsemi_2_4000000 },
|
||||
{ PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_200V3,
|
||||
PCI_ANY_ID, PCI_ANY_ID, 0, 0,
|
||||
pbn_b0_bt_2_921600 },
|
||||
{ PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_400V3,
|
||||
PCI_ANY_ID, PCI_ANY_ID, 0, 0,
|
||||
pbn_b0_4_921600 },
|
||||
|
||||
@@ -1590,7 +1590,7 @@ static void hub_disconnect(struct usb_interface *intf)
|
||||
{
|
||||
struct usb_hub *hub = usb_get_intfdata(intf);
|
||||
struct usb_device *hdev = interface_to_usbdev(intf);
|
||||
int i;
|
||||
int port1;
|
||||
|
||||
/* Take the hub off the event list and don't let it be added again */
|
||||
spin_lock_irq(&hub_event_lock);
|
||||
@@ -1605,11 +1605,15 @@ static void hub_disconnect(struct usb_interface *intf)
|
||||
hub->error = 0;
|
||||
hub_quiesce(hub, HUB_DISCONNECT);
|
||||
|
||||
usb_set_intfdata (intf, NULL);
|
||||
/* Avoid races with recursively_mark_NOTATTACHED() */
|
||||
spin_lock_irq(&device_state_lock);
|
||||
port1 = hdev->maxchild;
|
||||
hdev->maxchild = 0;
|
||||
usb_set_intfdata(intf, NULL);
|
||||
spin_unlock_irq(&device_state_lock);
|
||||
|
||||
for (i = 0; i < hdev->maxchild; i++)
|
||||
usb_hub_remove_port_device(hub, i + 1);
|
||||
hub->hdev->maxchild = 0;
|
||||
for (; port1 > 0; --port1)
|
||||
usb_hub_remove_port_device(hub, port1);
|
||||
|
||||
if (hub->hdev->speed == USB_SPEED_HIGH)
|
||||
highspeed_hubs--;
|
||||
|
||||
@@ -200,6 +200,7 @@ struct ehci_hcd { /* one per controller */
|
||||
unsigned use_dummy_qh:1; /* AMD Frame List table quirk*/
|
||||
unsigned has_synopsys_hc_bug:1; /* Synopsys HC */
|
||||
unsigned frame_index_bug:1; /* MosChip (AKA NetMos) */
|
||||
unsigned imx28_write_fix:1; /* For Freescale i.MX28 */
|
||||
|
||||
/* required for usb32 quirk */
|
||||
#define OHCI_CTRL_HCFS (3 << 6)
|
||||
@@ -673,6 +674,18 @@ static inline unsigned int ehci_readl(const struct ehci_hcd *ehci,
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SOC_IMX28
|
||||
static inline void imx28_ehci_writel(const unsigned int val,
|
||||
volatile __u32 __iomem *addr)
|
||||
{
|
||||
__asm__ ("swp %0, %0, [%1]" : : "r"(val), "r"(addr));
|
||||
}
|
||||
#else
|
||||
static inline void imx28_ehci_writel(const unsigned int val,
|
||||
volatile __u32 __iomem *addr)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
static inline void ehci_writel(const struct ehci_hcd *ehci,
|
||||
const unsigned int val, __u32 __iomem *regs)
|
||||
{
|
||||
@@ -681,7 +694,10 @@ static inline void ehci_writel(const struct ehci_hcd *ehci,
|
||||
writel_be(val, regs) :
|
||||
writel(val, regs);
|
||||
#else
|
||||
writel(val, regs);
|
||||
if (ehci->imx28_write_fix)
|
||||
imx28_ehci_writel(val, regs);
|
||||
else
|
||||
writel(val, regs);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -315,6 +315,9 @@ static void xhci_cleanup_msix(struct xhci_hcd *xhci)
|
||||
struct usb_hcd *hcd = xhci_to_hcd(xhci);
|
||||
struct pci_dev *pdev = to_pci_dev(hcd->self.controller);
|
||||
|
||||
if (xhci->quirks & XHCI_PLAT)
|
||||
return;
|
||||
|
||||
xhci_free_irq(xhci);
|
||||
|
||||
if (xhci->msix_entries) {
|
||||
|
||||
@@ -63,7 +63,7 @@
|
||||
#define UART_DSR 0x20 /* data set ready - flow control - device to host */
|
||||
#define CONTROL_RTS 0x10 /* request to send - flow control - host to device */
|
||||
#define UART_CTS 0x10 /* clear to send - flow control - device to host */
|
||||
#define UART_RI 0x10 /* ring indicator - modem - device to host */
|
||||
#define UART_RI 0x80 /* ring indicator - modem - device to host */
|
||||
#define UART_CD 0x40 /* carrier detect - modem - device to host */
|
||||
#define CYP_ERROR 0x08 /* received from input report - device to host */
|
||||
/* Note - the below has nothing to do with the "feature report" reset */
|
||||
|
||||
@@ -2181,10 +2181,20 @@ static void ftdi_set_termios(struct tty_struct *tty,
|
||||
}
|
||||
|
||||
/*
|
||||
* All FTDI UART chips are limited to CS7/8. We won't pretend to
|
||||
* All FTDI UART chips are limited to CS7/8. We shouldn't pretend to
|
||||
* support CS5/6 and revert the CSIZE setting instead.
|
||||
*
|
||||
* CS5 however is used to control some smartcard readers which abuse
|
||||
* this limitation to switch modes. Original FTDI chips fall back to
|
||||
* eight data bits.
|
||||
*
|
||||
* TODO: Implement a quirk to only allow this with mentioned
|
||||
* readers. One I know of (Argolis Smartreader V1)
|
||||
* returns "USB smartcard server" as iInterface string.
|
||||
* The vendor didn't bother with a custom VID/PID of
|
||||
* course.
|
||||
*/
|
||||
if ((C_CSIZE(tty) != CS8) && (C_CSIZE(tty) != CS7)) {
|
||||
if (C_CSIZE(tty) == CS6) {
|
||||
dev_warn(ddev, "requested CSIZE setting not supported\n");
|
||||
|
||||
termios->c_cflag &= ~CSIZE;
|
||||
@@ -2231,6 +2241,9 @@ no_skip:
|
||||
urb_value |= FTDI_SIO_SET_DATA_PARITY_NONE;
|
||||
}
|
||||
switch (cflag & CSIZE) {
|
||||
case CS5:
|
||||
dev_dbg(ddev, "Setting CS5 quirk\n");
|
||||
break;
|
||||
case CS7:
|
||||
urb_value |= 7;
|
||||
dev_dbg(ddev, "Setting CS7\n");
|
||||
|
||||
@@ -320,6 +320,9 @@ static void option_instat_callback(struct urb *urb);
|
||||
* It seems to contain a Qualcomm QSC6240/6290 chipset */
|
||||
#define FOUR_G_SYSTEMS_PRODUCT_W14 0x9603
|
||||
|
||||
/* iBall 3.5G connect wireless modem */
|
||||
#define IBALL_3_5G_CONNECT 0x9605
|
||||
|
||||
/* Zoom */
|
||||
#define ZOOM_PRODUCT_4597 0x9607
|
||||
|
||||
@@ -1447,6 +1450,17 @@ static const struct usb_device_id option_ids[] = {
|
||||
.driver_info = (kernel_ulong_t)&net_intf3_blacklist },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0178, 0xff, 0xff, 0xff),
|
||||
.driver_info = (kernel_ulong_t)&net_intf3_blacklist },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffe9, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff8b, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff8c, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff8d, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff8e, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff8f, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff90, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff91, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff92, 0xff, 0xff, 0xff) },
|
||||
{ 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_MC2718, 0xff, 0xff, 0xff),
|
||||
@@ -1489,6 +1503,7 @@ static const struct usb_device_id option_ids[] = {
|
||||
.driver_info = (kernel_ulong_t)&four_g_w14_blacklist
|
||||
},
|
||||
{ USB_DEVICE(LONGCHEER_VENDOR_ID, ZOOM_PRODUCT_4597) },
|
||||
{ USB_DEVICE(LONGCHEER_VENDOR_ID, IBALL_3_5G_CONNECT) },
|
||||
{ USB_DEVICE(HAIER_VENDOR_ID, HAIER_PRODUCT_CE100) },
|
||||
/* Pirelli */
|
||||
{ USB_DEVICE_INTERFACE_CLASS(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_C100_1, 0xff) },
|
||||
|
||||
@@ -141,6 +141,8 @@ struct pl2303_private {
|
||||
spinlock_t lock;
|
||||
u8 line_control;
|
||||
u8 line_status;
|
||||
|
||||
u8 line_settings[7];
|
||||
};
|
||||
|
||||
static int pl2303_vendor_read(__u16 value, __u16 index,
|
||||
@@ -420,10 +422,29 @@ static void pl2303_set_termios(struct tty_struct *tty,
|
||||
dev_dbg(&port->dev, "parity = none\n");
|
||||
}
|
||||
|
||||
i = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
|
||||
SET_LINE_REQUEST, SET_LINE_REQUEST_TYPE,
|
||||
0, 0, buf, 7, 100);
|
||||
dev_dbg(&port->dev, "0x21:0x20:0:0 %d\n", i);
|
||||
/*
|
||||
* Some PL2303 are known to lose bytes if you change serial settings
|
||||
* even to the same values as before. Thus we actually need to filter
|
||||
* in this specific case.
|
||||
*
|
||||
* Note that the tty_termios_hw_change check above is not sufficient
|
||||
* as a previously requested baud rate may differ from the one
|
||||
* actually used (and stored in old_termios).
|
||||
*
|
||||
* NOTE: No additional locking needed for line_settings as it is
|
||||
* only used in set_termios, which is serialised against itself.
|
||||
*/
|
||||
if (!old_termios || memcmp(buf, priv->line_settings, 7)) {
|
||||
i = usb_control_msg(serial->dev,
|
||||
usb_sndctrlpipe(serial->dev, 0),
|
||||
SET_LINE_REQUEST, SET_LINE_REQUEST_TYPE,
|
||||
0, 0, buf, 7, 100);
|
||||
|
||||
dev_dbg(&port->dev, "0x21:0x20:0:0 %d\n", i);
|
||||
|
||||
if (i == 7)
|
||||
memcpy(priv->line_settings, buf, 7);
|
||||
}
|
||||
|
||||
/* change control lines if we are switching to or from B0 */
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
|
||||
@@ -226,6 +226,13 @@ UNUSUAL_DEV( 0x0421, 0x0495, 0x0370, 0x0370,
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_MAX_SECTORS_64 ),
|
||||
|
||||
/* Patch submitted by Mikhail Zolotaryov <lebon@lebon.org.ua> */
|
||||
UNUSUAL_DEV( 0x0421, 0x06aa, 0x1110, 0x1110,
|
||||
"Nokia",
|
||||
"502",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_MAX_SECTORS_64 ),
|
||||
|
||||
#ifdef NO_SDDR09
|
||||
UNUSUAL_DEV( 0x0436, 0x0005, 0x0100, 0x0100,
|
||||
"Microtech",
|
||||
|
||||
@@ -35,6 +35,7 @@
|
||||
#include <xen/interface/io/fbif.h>
|
||||
#include <xen/interface/io/protocols.h>
|
||||
#include <xen/xenbus.h>
|
||||
#include <xen/platform_pci.h>
|
||||
|
||||
struct xenfb_info {
|
||||
unsigned char *fb;
|
||||
@@ -699,6 +700,9 @@ static int __init xenfb_init(void)
|
||||
if (xen_initial_domain())
|
||||
return -ENODEV;
|
||||
|
||||
if (!xen_has_pv_devices())
|
||||
return -ENODEV;
|
||||
|
||||
return xenbus_register_frontend(&xenfb_driver);
|
||||
}
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user