mirror of
https://github.com/torvalds/linux.git
synced 2026-06-08 14:42:37 +02:00
Merge branch 'linux-linaro-lsk' into linux-linaro-lsk-android
This commit is contained in:
commit
4ed15484d2
|
|
@ -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.
|
||||
|
|
|
|||
2
Makefile
2
Makefile
|
|
@ -1,6 +1,6 @@
|
|||
VERSION = 3
|
||||
PATCHLEVEL = 10
|
||||
SUBLEVEL = 28
|
||||
SUBLEVEL = 29
|
||||
EXTRAVERSION =
|
||||
NAME = TOSSUG Baby Fish
|
||||
|
||||
|
|
|
|||
|
|
@ -101,7 +101,7 @@ static void sam9_smc_cs_read(void __iomem *base,
|
|||
/* Pulse register */
|
||||
val = __raw_readl(base + AT91_SMC_PULSE);
|
||||
|
||||
config->nwe_setup = val & AT91_SMC_NWEPULSE;
|
||||
config->nwe_pulse = val & AT91_SMC_NWEPULSE;
|
||||
config->ncs_write_pulse = (val & AT91_SMC_NCS_WRPULSE) >> 8;
|
||||
config->nrd_pulse = (val & AT91_SMC_NRDPULSE) >> 16;
|
||||
config->ncs_read_pulse = (val & AT91_SMC_NCS_RDPULSE) >> 24;
|
||||
|
|
|
|||
|
|
@ -637,10 +637,10 @@ static int build_body(struct jit_ctx *ctx)
|
|||
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);
|
||||
|
|
|
|||
|
|
@ -132,7 +132,6 @@ void mark_rodata_ro(void);
|
|||
static inline void *kmap(struct page *page)
|
||||
{
|
||||
might_sleep();
|
||||
flush_dcache_page(page);
|
||||
return page_address(page);
|
||||
}
|
||||
|
||||
|
|
@ -144,7 +143,6 @@ static inline void kunmap(struct page *page)
|
|||
static inline void *kmap_atomic(struct page *page)
|
||||
{
|
||||
pagefault_disable();
|
||||
flush_dcache_page(page);
|
||||
return page_address(page);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -29,7 +29,8 @@ struct page;
|
|||
void clear_page_asm(void *page);
|
||||
void copy_page_asm(void *to, void *from);
|
||||
#define clear_user_page(vto, vaddr, page) clear_page_asm(vto)
|
||||
#define copy_user_page(vto, vfrom, vaddr, page) copy_page_asm(vto, vfrom)
|
||||
void copy_user_page(void *vto, void *vfrom, unsigned long vaddr,
|
||||
struct page *pg);
|
||||
|
||||
/* #define CONFIG_PARISC_TMPALIAS */
|
||||
|
||||
|
|
|
|||
|
|
@ -388,6 +388,20 @@ void flush_kernel_dcache_page_addr(void *addr)
|
|||
}
|
||||
EXPORT_SYMBOL(flush_kernel_dcache_page_addr);
|
||||
|
||||
void copy_user_page(void *vto, void *vfrom, unsigned long vaddr,
|
||||
struct page *pg)
|
||||
{
|
||||
/* Copy using kernel mapping. No coherency is needed (all in
|
||||
kunmap) for the `to' page. However, the `from' page needs to
|
||||
be flushed through a mapping equivalent to the user mapping
|
||||
before it can be accessed through the kernel mapping. */
|
||||
preempt_disable();
|
||||
flush_dcache_page_asm(__pa(vfrom), vaddr);
|
||||
preempt_enable();
|
||||
copy_page_asm(vto, vfrom);
|
||||
}
|
||||
EXPORT_SYMBOL(copy_user_page);
|
||||
|
||||
void purge_tlb_entries(struct mm_struct *mm, unsigned long addr)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
|
|
|||
|
|
@ -22,7 +22,15 @@ struct device_node;
|
|||
|
||||
static inline int cpu_to_node(int cpu)
|
||||
{
|
||||
return numa_cpu_lookup_table[cpu];
|
||||
int nid;
|
||||
|
||||
nid = numa_cpu_lookup_table[cpu];
|
||||
|
||||
/*
|
||||
* During early boot, the numa-cpu lookup table might not have been
|
||||
* setup for all CPUs yet. In such cases, default to node 0.
|
||||
*/
|
||||
return (nid < 0) ? 0 : nid;
|
||||
}
|
||||
|
||||
#define parent_node(node) (node)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -82,10 +82,13 @@ void kvmppc_fast_vcpu_kick(struct kvm_vcpu *vcpu)
|
|||
|
||||
/* CPU points to the first thread of the core */
|
||||
if (cpu != me && cpu >= 0 && cpu < nr_cpu_ids) {
|
||||
#ifdef CONFIG_KVM_XICS
|
||||
int real_cpu = cpu + vcpu->arch.ptid;
|
||||
if (paca[real_cpu].kvm_hstate.xics_phys)
|
||||
xics_wake_cpu(real_cpu);
|
||||
else if (cpu_online(cpu))
|
||||
else
|
||||
#endif
|
||||
if (cpu_online(cpu))
|
||||
smp_send_reschedule(cpu);
|
||||
}
|
||||
put_cpu();
|
||||
|
|
@ -1090,7 +1093,9 @@ static void kvmppc_start_thread(struct kvm_vcpu *vcpu)
|
|||
smp_wmb();
|
||||
#if defined(CONFIG_PPC_ICP_NATIVE) && defined(CONFIG_SMP)
|
||||
if (vcpu->arch.ptid) {
|
||||
#ifdef CONFIG_KVM_XICS
|
||||
xics_wake_cpu(cpu);
|
||||
#endif
|
||||
++vc->n_woken;
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -127,7 +127,7 @@ static int kvmppc_e500_tlb_index(struct kvmppc_vcpu_e500 *vcpu_e500,
|
|||
}
|
||||
|
||||
static inline void kvmppc_e500_deliver_tlb_miss(struct kvm_vcpu *vcpu,
|
||||
unsigned int eaddr, int as)
|
||||
gva_t eaddr, int as)
|
||||
{
|
||||
struct kvmppc_vcpu_e500 *vcpu_e500 = to_e500(vcpu);
|
||||
unsigned int victim, tsized;
|
||||
|
|
|
|||
|
|
@ -31,6 +31,8 @@
|
|||
#include <asm/sparsemem.h>
|
||||
#include <asm/prom.h>
|
||||
#include <asm/smp.h>
|
||||
#include <asm/cputhreads.h>
|
||||
#include <asm/topology.h>
|
||||
#include <asm/firmware.h>
|
||||
#include <asm/paca.h>
|
||||
#include <asm/hvcall.h>
|
||||
|
|
@ -152,9 +154,22 @@ static void __init get_node_active_region(unsigned long pfn,
|
|||
}
|
||||
}
|
||||
|
||||
static void map_cpu_to_node(int cpu, int node)
|
||||
static void reset_numa_cpu_lookup_table(void)
|
||||
{
|
||||
unsigned int cpu;
|
||||
|
||||
for_each_possible_cpu(cpu)
|
||||
numa_cpu_lookup_table[cpu] = -1;
|
||||
}
|
||||
|
||||
static void update_numa_cpu_lookup_table(unsigned int cpu, int node)
|
||||
{
|
||||
numa_cpu_lookup_table[cpu] = node;
|
||||
}
|
||||
|
||||
static void map_cpu_to_node(int cpu, int node)
|
||||
{
|
||||
update_numa_cpu_lookup_table(cpu, node);
|
||||
|
||||
dbg("adding cpu %d to node %d\n", cpu, node);
|
||||
|
||||
|
|
@ -519,11 +534,24 @@ static int of_drconf_to_nid_single(struct of_drconf_cell *drmem,
|
|||
*/
|
||||
static int __cpuinit numa_setup_cpu(unsigned long lcpu)
|
||||
{
|
||||
int nid = 0;
|
||||
struct device_node *cpu = of_get_cpu_node(lcpu, NULL);
|
||||
int nid;
|
||||
struct device_node *cpu;
|
||||
|
||||
/*
|
||||
* If a valid cpu-to-node mapping is already available, use it
|
||||
* directly instead of querying the firmware, since it represents
|
||||
* the most recent mapping notified to us by the platform (eg: VPHN).
|
||||
*/
|
||||
if ((nid = numa_cpu_lookup_table[lcpu]) >= 0) {
|
||||
map_cpu_to_node(lcpu, nid);
|
||||
return nid;
|
||||
}
|
||||
|
||||
cpu = of_get_cpu_node(lcpu, NULL);
|
||||
|
||||
if (!cpu) {
|
||||
WARN_ON(1);
|
||||
nid = 0;
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
|
@ -1066,6 +1094,7 @@ void __init do_init_bootmem(void)
|
|||
*/
|
||||
setup_node_to_cpumask_map();
|
||||
|
||||
reset_numa_cpu_lookup_table();
|
||||
register_cpu_notifier(&ppc64_numa_nb);
|
||||
cpu_numa_callback(&ppc64_numa_nb, CPU_UP_PREPARE,
|
||||
(void *)(unsigned long)boot_cpuid);
|
||||
|
|
@ -1443,6 +1472,33 @@ static int update_cpu_topology(void *data)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int update_lookup_table(void *data)
|
||||
{
|
||||
struct topology_update_data *update;
|
||||
|
||||
if (!data)
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
* Upon topology update, the numa-cpu lookup table needs to be updated
|
||||
* for all threads in the core, including offline CPUs, to ensure that
|
||||
* future hotplug operations respect the cpu-to-node associativity
|
||||
* properly.
|
||||
*/
|
||||
for (update = data; update; update = update->next) {
|
||||
int nid, base, j;
|
||||
|
||||
nid = update->new_nid;
|
||||
base = cpu_first_thread_sibling(update->cpu);
|
||||
|
||||
for (j = 0; j < threads_per_core; j++) {
|
||||
update_numa_cpu_lookup_table(base + j, nid);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Update the node maps and sysfs entries for each cpu whose home node
|
||||
* has changed. Returns 1 when the topology has changed, and 0 otherwise.
|
||||
|
|
@ -1511,6 +1567,14 @@ int arch_update_cpu_topology(void)
|
|||
|
||||
stop_machine(update_cpu_topology, &updates[0], &updated_cpus);
|
||||
|
||||
/*
|
||||
* Update the numa-cpu lookup table with the new mappings, even for
|
||||
* offline CPUs. It is best to perform this update from the stop-
|
||||
* machine context.
|
||||
*/
|
||||
stop_machine(update_lookup_table, &updates[0],
|
||||
cpumask_of(raw_smp_processor_id()));
|
||||
|
||||
for (ud = &updates[0]; ud; ud = ud->next) {
|
||||
unregister_cpu_under_node(ud->cpu, ud->old_nid);
|
||||
register_cpu_under_node(ud->cpu, ud->new_nid);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -35,11 +35,11 @@ struct statfs {
|
|||
struct statfs64 {
|
||||
unsigned int f_type;
|
||||
unsigned int f_bsize;
|
||||
unsigned long f_blocks;
|
||||
unsigned long f_bfree;
|
||||
unsigned long f_bavail;
|
||||
unsigned long f_files;
|
||||
unsigned long f_ffree;
|
||||
unsigned long long f_blocks;
|
||||
unsigned long long f_bfree;
|
||||
unsigned long long f_bavail;
|
||||
unsigned long long f_files;
|
||||
unsigned long long f_ffree;
|
||||
__kernel_fsid_t f_fsid;
|
||||
unsigned int f_namelen;
|
||||
unsigned int f_frsize;
|
||||
|
|
|
|||
|
|
@ -130,7 +130,7 @@ static int __diag_virtio_hypercall(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) {
|
||||
|
|
|
|||
|
|
@ -335,14 +335,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;
|
||||
|
|
@ -352,16 +354,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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -179,6 +179,7 @@
|
|||
#define MSR_AMD64_PATCH_LOADER 0xc0010020
|
||||
#define MSR_AMD64_OSVW_ID_LENGTH 0xc0010140
|
||||
#define MSR_AMD64_OSVW_STATUS 0xc0010141
|
||||
#define MSR_AMD64_LS_CFG 0xc0011020
|
||||
#define MSR_AMD64_DC_CFG 0xc0011022
|
||||
#define MSR_AMD64_BU_CFG2 0xc001102a
|
||||
#define MSR_AMD64_IBSFETCHCTL 0xc0011030
|
||||
|
|
|
|||
|
|
@ -508,6 +508,16 @@ static void __cpuinit early_init_amd(struct cpuinfo_x86 *c)
|
|||
set_cpu_cap(c, X86_FEATURE_EXTD_APICID);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* F16h erratum 793, CVE-2013-6885 */
|
||||
if (c->x86 == 0x16 && c->x86_model <= 0xf) {
|
||||
u64 val;
|
||||
|
||||
rdmsrl(MSR_AMD64_LS_CFG, val);
|
||||
if (!(val & BIT(15)))
|
||||
wrmsrl(MSR_AMD64_LS_CFG, val | BIT(15));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static const int amd_erratum_383[];
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
|
|
@ -349,6 +350,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;
|
||||
|
|
@ -1369,7 +1366,7 @@ void kvm_lapic_set_base(struct kvm_vcpu *vcpu, u64 value)
|
|||
vcpu->arch.apic_base = value;
|
||||
|
||||
/* update jump label if enable bit changes */
|
||||
if ((vcpu->arch.apic_base ^ value) & MSR_IA32_APICBASE_ENABLE) {
|
||||
if ((old_value ^ value) & MSR_IA32_APICBASE_ENABLE) {
|
||||
if (value & MSR_IA32_APICBASE_ENABLE)
|
||||
static_key_slow_dec_deferred(&apic_hw_disabled);
|
||||
else
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -324,15 +324,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;
|
||||
|
|
|
|||
|
|
@ -438,7 +438,7 @@ void __init efi_reserve_boot_services(void)
|
|||
* - Not within any part of the kernel
|
||||
* - Not the bios reserved area
|
||||
*/
|
||||
if ((start+size >= __pa_symbol(_text)
|
||||
if ((start + size > __pa_symbol(_text)
|
||||
&& start <= __pa_symbol(_end)) ||
|
||||
!e820_all_mapped(start, start+size, E820_RAM) ||
|
||||
memblock_is_region_reserved(start, size)) {
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
{ }
|
||||
};
|
||||
|
|
|
|||
|
|
@ -112,12 +112,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;
|
||||
|
||||
|
|
@ -133,10 +135,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", },
|
||||
{},
|
||||
};
|
||||
|
|
|
|||
|
|
@ -410,6 +410,8 @@ static int recv_data(struct tpm_chip *chip, u8 *buf, size_t count)
|
|||
&chip->vendor.read_queue)
|
||||
== 0) {
|
||||
burstcnt = get_burstcount(chip);
|
||||
if (burstcnt < 0)
|
||||
return burstcnt;
|
||||
len = min_t(int, burstcnt, count - size);
|
||||
I2C_READ_DATA(client, TPM_DATA_FIFO, buf + size, len);
|
||||
size += len;
|
||||
|
|
@ -451,7 +453,8 @@ static irqreturn_t tpm_ioserirq_handler(int irq, void *dev_id)
|
|||
static int tpm_stm_i2c_send(struct tpm_chip *chip, unsigned char *buf,
|
||||
size_t len)
|
||||
{
|
||||
u32 status, burstcnt = 0, i, size;
|
||||
u32 status, i, size;
|
||||
int burstcnt = 0;
|
||||
int ret;
|
||||
u8 data;
|
||||
struct i2c_client *client;
|
||||
|
|
@ -482,6 +485,8 @@ static int tpm_stm_i2c_send(struct tpm_chip *chip, unsigned char *buf,
|
|||
|
||||
for (i = 0; i < len - 1;) {
|
||||
burstcnt = get_burstcount(chip);
|
||||
if (burstcnt < 0)
|
||||
return burstcnt;
|
||||
size = min_t(int, len - i - 1, burstcnt);
|
||||
ret = I2C_WRITE_DATA(client, TPM_DATA_FIFO, buf, size);
|
||||
if (ret < 0)
|
||||
|
|
|
|||
|
|
@ -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:"
|
||||
|
|
|
|||
|
|
@ -366,13 +366,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));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -211,6 +211,7 @@ static DEFINE_PCI_DEVICE_TABLE(k10temp_id_table) = {
|
|||
{ PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_CNB17H_F3) },
|
||||
{ PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_15H_NB_F3) },
|
||||
{ PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_15H_M10H_F3) },
|
||||
{ PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_15H_M30H_NB_F3) },
|
||||
{ PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_16H_NB_F3) },
|
||||
{}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -927,7 +927,7 @@ static void sort_key_next(struct btree_iter *iter,
|
|||
*i = iter->data[--iter->used];
|
||||
}
|
||||
|
||||
static void btree_sort_fixup(struct btree_iter *iter)
|
||||
static struct bkey *btree_sort_fixup(struct btree_iter *iter, struct bkey *tmp)
|
||||
{
|
||||
while (iter->used > 1) {
|
||||
struct btree_iter_set *top = iter->data, *i = top + 1;
|
||||
|
|
@ -955,9 +955,22 @@ static void btree_sort_fixup(struct btree_iter *iter)
|
|||
} else {
|
||||
/* can't happen because of comparison func */
|
||||
BUG_ON(!bkey_cmp(&START_KEY(top->k), &START_KEY(i->k)));
|
||||
bch_cut_back(&START_KEY(i->k), top->k);
|
||||
|
||||
if (bkey_cmp(i->k, top->k) < 0) {
|
||||
bkey_copy(tmp, top->k);
|
||||
|
||||
bch_cut_back(&START_KEY(i->k), tmp);
|
||||
bch_cut_front(i->k, top->k);
|
||||
heap_sift(iter, 0, btree_iter_cmp);
|
||||
|
||||
return tmp;
|
||||
} else {
|
||||
bch_cut_back(&START_KEY(i->k), top->k);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void btree_mergesort(struct btree *b, struct bset *out,
|
||||
|
|
@ -965,15 +978,20 @@ static void btree_mergesort(struct btree *b, struct bset *out,
|
|||
bool fixup, bool remove_stale)
|
||||
{
|
||||
struct bkey *k, *last = NULL;
|
||||
BKEY_PADDED(k) tmp;
|
||||
bool (*bad)(struct btree *, const struct bkey *) = remove_stale
|
||||
? bch_ptr_bad
|
||||
: bch_ptr_invalid;
|
||||
|
||||
while (!btree_iter_end(iter)) {
|
||||
if (fixup && !b->level)
|
||||
btree_sort_fixup(iter);
|
||||
k = btree_sort_fixup(iter, &tmp.k);
|
||||
else
|
||||
k = NULL;
|
||||
|
||||
if (!k)
|
||||
k = bch_btree_iter_next(iter);
|
||||
|
||||
k = bch_btree_iter_next(iter);
|
||||
if (bad(b, k))
|
||||
continue;
|
||||
|
||||
|
|
|
|||
|
|
@ -1893,6 +1893,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))
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -153,6 +153,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);
|
||||
|
|
@ -160,10 +161,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;
|
||||
|
|
@ -182,12 +180,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) {
|
||||
|
||||
|
|
|
|||
|
|
@ -1757,19 +1757,23 @@ s32 e1000e_phy_has_link_generic(struct e1000_hw *hw, u32 iterations,
|
|||
* it across the board.
|
||||
*/
|
||||
ret_val = e1e_rphy(hw, MII_BMSR, &phy_status);
|
||||
if (ret_val)
|
||||
if (ret_val) {
|
||||
/* If the first read fails, another entity may have
|
||||
* ownership of the resources, wait and try again to
|
||||
* see if they have relinquished the resources yet.
|
||||
*/
|
||||
udelay(usec_interval);
|
||||
if (usec_interval >= 1000)
|
||||
msleep(usec_interval / 1000);
|
||||
else
|
||||
udelay(usec_interval);
|
||||
}
|
||||
ret_val = e1e_rphy(hw, MII_BMSR, &phy_status);
|
||||
if (ret_val)
|
||||
break;
|
||||
if (phy_status & BMSR_LSTATUS)
|
||||
break;
|
||||
if (usec_interval >= 1000)
|
||||
mdelay(usec_interval / 1000);
|
||||
msleep(usec_interval / 1000);
|
||||
else
|
||||
udelay(usec_interval);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1611,6 +1611,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 */
|
||||
|
|
|
|||
|
|
@ -731,8 +731,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. */
|
||||
|
|
@ -809,6 +807,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. */
|
||||
|
|
|
|||
|
|
@ -2068,6 +2068,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);
|
||||
|
|
@ -2093,7 +2094,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,
|
||||
|
|
@ -2140,7 +2141,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);
|
||||
|
|
@ -2148,12 +2149,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,
|
||||
|
|
@ -2422,6 +2422,7 @@ static int b43_try_request_fw(struct b43_request_fw_context *ctx)
|
|||
|
||||
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)
|
||||
{
|
||||
|
|
@ -2473,6 +2474,10 @@ static void b43_request_firmware(struct work_struct *work)
|
|||
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:
|
||||
|
|
@ -4634,9 +4639,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. */
|
||||
|
|
@ -4779,9 +4781,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;
|
||||
|
||||
|
|
@ -5442,6 +5441,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);
|
||||
|
|
@ -5519,6 +5521,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:
|
||||
|
|
|
|||
|
|
@ -3919,6 +3919,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)
|
||||
|
|
|
|||
|
|
@ -131,6 +131,7 @@ const struct iwl_cfg iwl7260_2ac_cfg = {
|
|||
.ht_params = &iwl7000_ht_params,
|
||||
.nvm_ver = IWL7260_NVM_VERSION,
|
||||
.nvm_calib_ver = IWL7260_TX_POWER_VERSION,
|
||||
.host_interrupt_operation_mode = true,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwl7260_2n_cfg = {
|
||||
|
|
@ -140,6 +141,7 @@ const struct iwl_cfg iwl7260_2n_cfg = {
|
|||
.ht_params = &iwl7000_ht_params,
|
||||
.nvm_ver = IWL7260_NVM_VERSION,
|
||||
.nvm_calib_ver = IWL7260_TX_POWER_VERSION,
|
||||
.host_interrupt_operation_mode = true,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwl7260_n_cfg = {
|
||||
|
|
@ -149,6 +151,7 @@ const struct iwl_cfg iwl7260_n_cfg = {
|
|||
.ht_params = &iwl7000_ht_params,
|
||||
.nvm_ver = IWL7260_NVM_VERSION,
|
||||
.nvm_calib_ver = IWL7260_TX_POWER_VERSION,
|
||||
.host_interrupt_operation_mode = true,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwl3160_2ac_cfg = {
|
||||
|
|
@ -158,6 +161,7 @@ const struct iwl_cfg iwl3160_2ac_cfg = {
|
|||
.ht_params = &iwl7000_ht_params,
|
||||
.nvm_ver = IWL3160_NVM_VERSION,
|
||||
.nvm_calib_ver = IWL3160_TX_POWER_VERSION,
|
||||
.host_interrupt_operation_mode = true,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwl3160_2n_cfg = {
|
||||
|
|
@ -167,6 +171,7 @@ const struct iwl_cfg iwl3160_2n_cfg = {
|
|||
.ht_params = &iwl7000_ht_params,
|
||||
.nvm_ver = IWL3160_NVM_VERSION,
|
||||
.nvm_calib_ver = IWL3160_TX_POWER_VERSION,
|
||||
.host_interrupt_operation_mode = true,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwl3160_n_cfg = {
|
||||
|
|
@ -176,6 +181,7 @@ const struct iwl_cfg iwl3160_n_cfg = {
|
|||
.ht_params = &iwl7000_ht_params,
|
||||
.nvm_ver = IWL3160_NVM_VERSION,
|
||||
.nvm_calib_ver = IWL3160_TX_POWER_VERSION,
|
||||
.host_interrupt_operation_mode = true,
|
||||
};
|
||||
|
||||
MODULE_FIRMWARE(IWL7260_MODULE_FIRMWARE(IWL7260_UCODE_API_OK));
|
||||
|
|
|
|||
|
|
@ -241,6 +241,8 @@ struct iwl_eeprom_params {
|
|||
* @rx_with_siso_diversity: 1x1 device with rx antenna diversity
|
||||
* @internal_wimax_coex: internal wifi/wimax combo device
|
||||
* @temp_offset_v2: support v2 of temperature offset calibration
|
||||
* @host_interrupt_operation_mode: device needs host interrupt operation
|
||||
* mode set
|
||||
*
|
||||
* We enable the driver to be backward compatible wrt. hardware features.
|
||||
* API differences in uCode shouldn't be handled here but through TLVs
|
||||
|
|
@ -273,6 +275,7 @@ struct iwl_cfg {
|
|||
const bool rx_with_siso_diversity;
|
||||
const bool internal_wimax_coex;
|
||||
const bool temp_offset_v2;
|
||||
const bool host_interrupt_operation_mode;
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -463,13 +463,10 @@
|
|||
* the CSR_INT_COALESCING is an 8 bit register in 32-usec unit
|
||||
*
|
||||
* default interrupt coalescing timer is 64 x 32 = 2048 usecs
|
||||
* default interrupt coalescing calibration timer is 16 x 32 = 512 usecs
|
||||
*/
|
||||
#define IWL_HOST_INT_TIMEOUT_MAX (0xFF)
|
||||
#define IWL_HOST_INT_TIMEOUT_DEF (0x40)
|
||||
#define IWL_HOST_INT_TIMEOUT_MIN (0x0)
|
||||
#define IWL_HOST_INT_CALIB_TIMEOUT_MAX (0xFF)
|
||||
#define IWL_HOST_INT_CALIB_TIMEOUT_DEF (0x10)
|
||||
#define IWL_HOST_INT_CALIB_TIMEOUT_MIN (0x0)
|
||||
#define IWL_HOST_INT_OPER_MODE BIT(31)
|
||||
|
||||
#endif /* !__iwl_csr_h__ */
|
||||
|
|
|
|||
|
|
@ -260,4 +260,8 @@ static inline unsigned int SCD_QUEUE_STATUS_BITS(unsigned int chnl)
|
|||
|
||||
/*********************** END TX SCHEDULER *************************************/
|
||||
|
||||
/* Oscillator clock */
|
||||
#define OSC_CLK (0xa04068)
|
||||
#define OSC_CLK_FORCE_CONTROL (0x8)
|
||||
|
||||
#endif /* __iwl_prph_h__ */
|
||||
|
|
|
|||
|
|
@ -424,6 +424,7 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg,
|
|||
|
||||
out_unregister:
|
||||
ieee80211_unregister_hw(mvm->hw);
|
||||
iwl_mvm_leds_exit(mvm);
|
||||
out_free:
|
||||
iwl_phy_db_free(mvm->phy_db);
|
||||
kfree(mvm->scan_cmd);
|
||||
|
|
|
|||
|
|
@ -489,6 +489,10 @@ static void iwl_pcie_rx_hw_init(struct iwl_trans *trans, struct iwl_rxq *rxq)
|
|||
|
||||
/* Set interrupt coalescing timer to default (2048 usecs) */
|
||||
iwl_write8(trans, CSR_INT_COALESCING, IWL_HOST_INT_TIMEOUT_DEF);
|
||||
|
||||
/* W/A for interrupt coalescing bug in 7260 and 3160 */
|
||||
if (trans->cfg->host_interrupt_operation_mode)
|
||||
iwl_set_bit(trans, CSR_INT_COALESCING, IWL_HOST_INT_OPER_MODE);
|
||||
}
|
||||
|
||||
int iwl_pcie_rx_init(struct iwl_trans *trans)
|
||||
|
|
|
|||
|
|
@ -206,6 +206,22 @@ static int iwl_pcie_apm_init(struct iwl_trans *trans)
|
|||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
* Enable the oscillator to count wake up time for L1 exit. This
|
||||
* consumes slightly more power (100uA) - but allows to be sure
|
||||
* that we wake up from L1 on time.
|
||||
*
|
||||
* This looks weird: read twice the same register, discard the
|
||||
* value, set a bit, and yet again, read that same register
|
||||
* just to discard the value. But that's the way the hardware
|
||||
* seems to like it.
|
||||
*/
|
||||
iwl_read_prph(trans, OSC_CLK);
|
||||
iwl_read_prph(trans, OSC_CLK);
|
||||
iwl_set_bits_prph(trans, OSC_CLK, OSC_CLK_FORCE_CONTROL);
|
||||
iwl_read_prph(trans, OSC_CLK);
|
||||
iwl_read_prph(trans, OSC_CLK);
|
||||
|
||||
/*
|
||||
* Enable DMA clock and wait for it to stabilize.
|
||||
*
|
||||
|
|
@ -276,9 +292,6 @@ static int iwl_pcie_nic_init(struct iwl_trans *trans)
|
|||
spin_lock_irqsave(&trans_pcie->irq_lock, flags);
|
||||
iwl_pcie_apm_init(trans);
|
||||
|
||||
/* Set interrupt coalescing calibration timer to default (512 usecs) */
|
||||
iwl_write8(trans, CSR_INT_COALESCING, IWL_HOST_INT_CALIB_TIMEOUT_DEF);
|
||||
|
||||
spin_unlock_irqrestore(&trans_pcie->irq_lock, flags);
|
||||
|
||||
iwl_pcie_set_pwr(trans, false);
|
||||
|
|
|
|||
|
|
@ -228,7 +228,7 @@ enum MWIFIEX_802_11_PRIVACY_FILTER {
|
|||
|
||||
/* HW_SPEC fw_cap_info */
|
||||
|
||||
#define ISSUPP_11ACENABLED(fw_cap_info) (fw_cap_info & (BIT(13)|BIT(14)))
|
||||
#define ISSUPP_11ACENABLED(fw_cap_info) (fw_cap_info & (BIT(12)|BIT(13)))
|
||||
|
||||
#define GET_VHTCAP_CHWDSET(vht_cap_info) ((vht_cap_info >> 2) & 0x3)
|
||||
#define GET_VHTNSSMCS(mcs_mapset, nss) ((mcs_mapset >> (2 * (nss - 1))) & 0x3)
|
||||
|
|
|
|||
|
|
@ -1622,7 +1622,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;
|
||||
|
|
@ -1749,7 +1749,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
|
||||
|
|
|
|||
|
|
@ -1427,7 +1427,8 @@ void rtl_watchdog_wq_callback(void *data)
|
|||
/* if we can't recv beacon for 6s, we should
|
||||
* reconnect this AP
|
||||
*/
|
||||
if (rtlpriv->link_info.roam_times >= 3) {
|
||||
if ((rtlpriv->link_info.roam_times >= 3) &&
|
||||
!is_zero_ether_addr(rtlpriv->mac80211.bssid)) {
|
||||
RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
|
||||
"AP off, try to reconnect now\n");
|
||||
rtlpriv->link_info.roam_times = 0;
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
|
@ -184,6 +194,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,
|
||||
|
|
|
|||
|
|
@ -1078,7 +1078,7 @@ static void rtl88e_dm_txpower_tracking_callback_thermalmeter(struct ieee80211_hw
|
|||
rtldm->swing_flag_ofdm = true;
|
||||
}
|
||||
|
||||
if (rtldm->swing_idx_cck != rtldm->swing_idx_cck) {
|
||||
if (rtldm->swing_idx_cck_cur != rtldm->swing_idx_cck) {
|
||||
rtldm->swing_idx_cck_cur = rtldm->swing_idx_cck;
|
||||
rtldm->swing_flag_cck = true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -158,6 +158,42 @@ static const u8 cckswing_table_ch14[CCK_TABLE_SIZE][8] = {
|
|||
{0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00}
|
||||
};
|
||||
|
||||
static u32 power_index_reg[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a};
|
||||
|
||||
void dm_restorepowerindex(struct ieee80211_hw *hw)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
u8 index;
|
||||
|
||||
for (index = 0; index < 6; index++)
|
||||
rtl_write_byte(rtlpriv, power_index_reg[index],
|
||||
rtlpriv->dm.powerindex_backup[index]);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(dm_restorepowerindex);
|
||||
|
||||
void dm_writepowerindex(struct ieee80211_hw *hw, u8 value)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
u8 index;
|
||||
|
||||
for (index = 0; index < 6; index++)
|
||||
rtl_write_byte(rtlpriv, power_index_reg[index], value);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(dm_writepowerindex);
|
||||
|
||||
void dm_savepowerindex(struct ieee80211_hw *hw)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
u8 index;
|
||||
u8 tmp;
|
||||
|
||||
for (index = 0; index < 6; index++) {
|
||||
tmp = rtl_read_byte(rtlpriv, power_index_reg[index]);
|
||||
rtlpriv->dm.powerindex_backup[index] = tmp;
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(dm_savepowerindex);
|
||||
|
||||
static void rtl92c_dm_diginit(struct ieee80211_hw *hw)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
|
|
|
|||
|
|
@ -91,6 +91,17 @@
|
|||
#define TX_POWER_NEAR_FIELD_THRESH_LVL2 74
|
||||
#define TX_POWER_NEAR_FIELD_THRESH_LVL1 67
|
||||
|
||||
#define DYNAMIC_FUNC_DISABLE 0x0
|
||||
#define DYNAMIC_FUNC_DIG BIT(0)
|
||||
#define DYNAMIC_FUNC_HP BIT(1)
|
||||
#define DYNAMIC_FUNC_SS BIT(2) /*Tx Power Tracking*/
|
||||
#define DYNAMIC_FUNC_BT BIT(3)
|
||||
#define DYNAMIC_FUNC_ANT_DIV BIT(4)
|
||||
|
||||
#define RSSI_CCK 0
|
||||
#define RSSI_OFDM 1
|
||||
#define RSSI_DEFAULT 2
|
||||
|
||||
struct swat_t {
|
||||
u8 failure_cnt;
|
||||
u8 try_flag;
|
||||
|
|
@ -167,5 +178,8 @@ void rtl92c_phy_lc_calibrate(struct ieee80211_hw *hw);
|
|||
void rtl92c_phy_iq_calibrate(struct ieee80211_hw *hw, bool recovery);
|
||||
void rtl92c_dm_dynamic_txpower(struct ieee80211_hw *hw);
|
||||
void rtl92c_dm_bt_coexist(struct ieee80211_hw *hw);
|
||||
void dm_savepowerindex(struct ieee80211_hw *hw);
|
||||
void dm_writepowerindex(struct ieee80211_hw *hw, u8 value);
|
||||
void dm_restorepowerindex(struct ieee80211_hw *hw);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -101,6 +101,15 @@ void rtl92cu_dm_dynamic_txpower(struct ieee80211_hw *hw)
|
|||
"PHY_SetTxPowerLevel8192S() Channel = %d\n",
|
||||
rtlphy->current_channel);
|
||||
rtl92c_phy_set_txpower_level(hw, rtlphy->current_channel);
|
||||
if (rtlpriv->dm.dynamic_txhighpower_lvl ==
|
||||
TXHIGHPWRLEVEL_NORMAL)
|
||||
dm_restorepowerindex(hw);
|
||||
else if (rtlpriv->dm.dynamic_txhighpower_lvl ==
|
||||
TXHIGHPWRLEVEL_LEVEL1)
|
||||
dm_writepowerindex(hw, 0x14);
|
||||
else if (rtlpriv->dm.dynamic_txhighpower_lvl ==
|
||||
TXHIGHPWRLEVEL_LEVEL2)
|
||||
dm_writepowerindex(hw, 0x10);
|
||||
}
|
||||
|
||||
rtlpriv->dm.last_dtp_lvl = rtlpriv->dm.dynamic_txhighpower_lvl;
|
||||
|
|
|
|||
|
|
@ -30,3 +30,6 @@
|
|||
#include "../rtl8192ce/dm.h"
|
||||
|
||||
void rtl92cu_dm_dynamic_txpower(struct ieee80211_hw *hw);
|
||||
void dm_savepowerindex(struct ieee80211_hw *hw);
|
||||
void dm_writepowerindex(struct ieee80211_hw *hw, u8 value);
|
||||
void dm_restorepowerindex(struct ieee80211_hw *hw);
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
@ -107,7 +105,7 @@ void rtl92cu_phy_rf6052_set_cck_txpower(struct ieee80211_hw *hw,
|
|||
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,14 +71,21 @@ 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 err;
|
||||
}
|
||||
|
||||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -176,6 +176,7 @@ static void rtl_process_pwdb(struct ieee80211_hw *hw, struct rtl_stats *pstatus)
|
|||
struct rtl_sta_info *drv_priv = NULL;
|
||||
struct ieee80211_sta *sta = NULL;
|
||||
long undec_sm_pwdb;
|
||||
long undec_sm_cck;
|
||||
|
||||
rcu_read_lock();
|
||||
if (rtlpriv->mac80211.opmode != NL80211_IFTYPE_STATION)
|
||||
|
|
@ -185,12 +186,16 @@ static void rtl_process_pwdb(struct ieee80211_hw *hw, struct rtl_stats *pstatus)
|
|||
if (sta) {
|
||||
drv_priv = (struct rtl_sta_info *) sta->drv_priv;
|
||||
undec_sm_pwdb = drv_priv->rssi_stat.undec_sm_pwdb;
|
||||
undec_sm_cck = drv_priv->rssi_stat.undec_sm_cck;
|
||||
} else {
|
||||
undec_sm_pwdb = rtlpriv->dm.undec_sm_pwdb;
|
||||
undec_sm_cck = rtlpriv->dm.undec_sm_cck;
|
||||
}
|
||||
|
||||
if (undec_sm_pwdb < 0)
|
||||
undec_sm_pwdb = pstatus->rx_pwdb_all;
|
||||
if (undec_sm_cck < 0)
|
||||
undec_sm_cck = pstatus->rx_pwdb_all;
|
||||
if (pstatus->rx_pwdb_all > (u32) undec_sm_pwdb) {
|
||||
undec_sm_pwdb = (((undec_sm_pwdb) *
|
||||
(RX_SMOOTH_FACTOR - 1)) +
|
||||
|
|
@ -200,6 +205,15 @@ static void rtl_process_pwdb(struct ieee80211_hw *hw, struct rtl_stats *pstatus)
|
|||
undec_sm_pwdb = (((undec_sm_pwdb) * (RX_SMOOTH_FACTOR - 1)) +
|
||||
(pstatus->rx_pwdb_all)) / (RX_SMOOTH_FACTOR);
|
||||
}
|
||||
if (pstatus->rx_pwdb_all > (u32) undec_sm_cck) {
|
||||
undec_sm_cck = (((undec_sm_pwdb) *
|
||||
(RX_SMOOTH_FACTOR - 1)) +
|
||||
(pstatus->rx_pwdb_all)) / (RX_SMOOTH_FACTOR);
|
||||
undec_sm_cck = undec_sm_cck + 1;
|
||||
} else {
|
||||
undec_sm_pwdb = (((undec_sm_cck) * (RX_SMOOTH_FACTOR - 1)) +
|
||||
(pstatus->rx_pwdb_all)) / (RX_SMOOTH_FACTOR);
|
||||
}
|
||||
|
||||
if (sta) {
|
||||
drv_priv->rssi_stat.undec_sm_pwdb = undec_sm_pwdb;
|
||||
|
|
|
|||
|
|
@ -477,6 +477,8 @@ static void _rtl_usb_rx_process_agg(struct ieee80211_hw *hw,
|
|||
if (unicast)
|
||||
rtlpriv->link_info.num_rx_inperiod++;
|
||||
}
|
||||
/* static bcn for roaming */
|
||||
rtl_beacon_statistic(hw, skb);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -548,7 +550,7 @@ static void _rtl_rx_pre_process(struct ieee80211_hw *hw, struct sk_buff *skb)
|
|||
}
|
||||
}
|
||||
|
||||
#define __RX_SKB_MAX_QUEUED 32
|
||||
#define __RX_SKB_MAX_QUEUED 64
|
||||
|
||||
static void _rtl_rx_work(unsigned long param)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1035,6 +1035,7 @@ struct rtl_ht_agg {
|
|||
|
||||
struct rssi_sta {
|
||||
long undec_sm_pwdb;
|
||||
long undec_sm_cck;
|
||||
};
|
||||
|
||||
struct rtl_tid_data {
|
||||
|
|
@ -1325,8 +1326,10 @@ struct fast_ant_training {
|
|||
struct rtl_dm {
|
||||
/*PHY status for Dynamic Management */
|
||||
long entry_min_undec_sm_pwdb;
|
||||
long undec_sm_cck;
|
||||
long undec_sm_pwdb; /*out dm */
|
||||
long entry_max_undec_sm_pwdb;
|
||||
s32 ofdm_pkt_cnt;
|
||||
bool dm_initialgain_enable;
|
||||
bool dynamic_txpower_enable;
|
||||
bool current_turbo_edca;
|
||||
|
|
@ -1341,6 +1344,7 @@ struct rtl_dm {
|
|||
bool inform_fw_driverctrldm;
|
||||
bool current_mrc_switch;
|
||||
u8 txpowercount;
|
||||
u8 powerindex_backup[6];
|
||||
|
||||
u8 thermalvalue_rxgain;
|
||||
u8 thermalvalue_iqk;
|
||||
|
|
@ -1352,7 +1356,9 @@ struct rtl_dm {
|
|||
bool done_txpower;
|
||||
u8 dynamic_txhighpower_lvl; /*Tx high power level */
|
||||
u8 dm_flag; /*Indicate each dynamic mechanism's status. */
|
||||
u8 dm_flag_tmp;
|
||||
u8 dm_type;
|
||||
u8 dm_rssi_sel;
|
||||
u8 txpower_track_control;
|
||||
bool interrupt_migration;
|
||||
bool disable_tx_int;
|
||||
|
|
@ -1806,6 +1812,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;
|
||||
|
|
@ -1950,6 +1957,7 @@ struct dig_t {
|
|||
u8 pre_ccastate;
|
||||
u8 cur_ccasate;
|
||||
u8 large_fa_hit;
|
||||
u8 dig_dynamic_min;
|
||||
u8 forbidden_igi;
|
||||
u8 dig_state;
|
||||
u8 dig_highpwrstate;
|
||||
|
|
@ -2030,22 +2038,15 @@ struct rtl_priv {
|
|||
struct dig_t dm_digtable;
|
||||
struct ps_t dm_pstable;
|
||||
|
||||
/* section shared by individual drivers */
|
||||
union {
|
||||
struct { /* data buffer pointer for USB reads */
|
||||
__le32 *usb_data;
|
||||
int usb_data_index;
|
||||
bool initialized;
|
||||
};
|
||||
struct { /* section for 8723ae */
|
||||
bool reg_init; /* true if regs saved */
|
||||
u32 reg_874;
|
||||
u32 reg_c70;
|
||||
u32 reg_85c;
|
||||
u32 reg_a74;
|
||||
bool bt_operation_on;
|
||||
};
|
||||
};
|
||||
u32 reg_874;
|
||||
u32 reg_c70;
|
||||
u32 reg_85c;
|
||||
u32 reg_a74;
|
||||
bool reg_init; /* true if regs saved */
|
||||
bool bt_operation_on;
|
||||
__le32 *usb_data;
|
||||
int usb_data_index;
|
||||
bool initialized;
|
||||
bool enter_ps; /* true when entering PS */
|
||||
u8 rate_mask[5];
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
@ -386,6 +387,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);
|
||||
}
|
||||
|
|
@ -442,6 +444,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;
|
||||
|
|
@ -487,6 +490,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;
|
||||
|
|
@ -586,6 +590,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;
|
||||
|
|
@ -1115,10 +1120,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);
|
||||
|
|
@ -1127,78 +1133,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);
|
||||
}
|
||||
|
||||
|
|
@ -1333,6 +1296,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 */
|
||||
|
|
|
|||
|
|
@ -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},
|
||||
|
|
|
|||
|
|
@ -1754,12 +1754,6 @@ static int sunxi_pinctrl_gpio_get(struct gpio_chip *chip, unsigned offset)
|
|||
return val;
|
||||
}
|
||||
|
||||
static int sunxi_pinctrl_gpio_direction_output(struct gpio_chip *chip,
|
||||
unsigned offset, int value)
|
||||
{
|
||||
return pinctrl_gpio_direction_output(chip->base + offset);
|
||||
}
|
||||
|
||||
static void sunxi_pinctrl_gpio_set(struct gpio_chip *chip,
|
||||
unsigned offset, int value)
|
||||
{
|
||||
|
|
@ -1770,6 +1764,13 @@ static void sunxi_pinctrl_gpio_set(struct gpio_chip *chip,
|
|||
writel((value & DATA_PINS_MASK) << index, pctl->membase + reg);
|
||||
}
|
||||
|
||||
static int sunxi_pinctrl_gpio_direction_output(struct gpio_chip *chip,
|
||||
unsigned offset, int value)
|
||||
{
|
||||
sunxi_pinctrl_gpio_set(chip, offset, value);
|
||||
return pinctrl_gpio_direction_output(chip->base + offset);
|
||||
}
|
||||
|
||||
static int sunxi_pinctrl_gpio_of_xlate(struct gpio_chip *gc,
|
||||
const struct of_phandle_args *gpiospec,
|
||||
u32 *flags)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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 @@ bfad_read_firmware(struct pci_dev *pdev, u32 **bfi_image,
|
|||
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
|
||||
|
|
|
|||
|
|
@ -957,6 +957,10 @@ static void virtscsi_remove(struct virtio_device *vdev)
|
|||
#ifdef CONFIG_PM
|
||||
static int virtscsi_freeze(struct virtio_device *vdev)
|
||||
{
|
||||
struct Scsi_Host *sh = virtio_scsi_host(vdev);
|
||||
struct virtio_scsi *vscsi = shost_priv(sh);
|
||||
|
||||
unregister_hotcpu_notifier(&vscsi->nb);
|
||||
virtscsi_remove_vqs(vdev);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -965,8 +969,17 @@ static int virtscsi_restore(struct virtio_device *vdev)
|
|||
{
|
||||
struct Scsi_Host *sh = virtio_scsi_host(vdev);
|
||||
struct virtio_scsi *vscsi = shost_priv(sh);
|
||||
int err;
|
||||
|
||||
return virtscsi_init(vdev, vscsi);
|
||||
err = virtscsi_init(vdev, vscsi);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = register_hotcpu_notifier(&vscsi->nb);
|
||||
if (err)
|
||||
vdev->config->del_vqs(vdev);
|
||||
|
||||
return err;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -1466,7 +1466,6 @@ void BBvUpdatePreEDThreshold(struct vnt_private *pDevice, int bScanning)
|
|||
|
||||
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)
|
||||
|
|
@ -1609,7 +1608,6 @@ void BBvUpdatePreEDThreshold(struct vnt_private *pDevice, int bScanning)
|
|||
|
||||
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)
|
||||
|
|
@ -1761,7 +1759,6 @@ void BBvUpdatePreEDThreshold(struct vnt_private *pDevice, int bScanning)
|
|||
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)
|
||||
|
|
|
|||
|
|
@ -761,7 +761,7 @@ u64 CARDqGetNextTBTT(u64 qwTSF, u16 wBeaconInterval)
|
|||
|
||||
uBeaconInterval = wBeaconInterval * 1024;
|
||||
// Next TBTT = ((local_current_TSF / beacon_interval) + 1 ) * beacon_interval
|
||||
uLowNextTBTT = ((qwTSF & 0xffffffffU) >> 10) << 10;
|
||||
uLowNextTBTT = ((qwTSF & 0xffffffffULL) >> 10) << 10;
|
||||
uLowRemain = (uLowNextTBTT) % uBeaconInterval;
|
||||
uHighRemain = ((0x80000000 % uBeaconInterval) * 2 * (u32)(qwTSF >> 32))
|
||||
% uBeaconInterval;
|
||||
|
|
|
|||
|
|
@ -54,7 +54,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;
|
||||
|
|
@ -303,6 +303,9 @@ bool iscsit_check_np_match(
|
|||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Called with mutex np_lock held
|
||||
*/
|
||||
static struct iscsi_np *iscsit_get_np(
|
||||
struct __kernel_sockaddr_storage *sockaddr,
|
||||
int network_transport)
|
||||
|
|
@ -310,11 +313,10 @@ static struct iscsi_np *iscsit_get_np(
|
|||
struct iscsi_np *np;
|
||||
bool match;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
@ -326,13 +328,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;
|
||||
}
|
||||
|
|
@ -346,16 +346,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);
|
||||
}
|
||||
|
||||
|
|
@ -378,6 +384,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);
|
||||
}
|
||||
|
||||
|
|
@ -386,6 +393,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);
|
||||
}
|
||||
/*
|
||||
|
|
@ -396,10 +404,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_transport->name);
|
||||
|
|
@ -469,9 +477,9 @@ int iscsit_del_np(struct iscsi_np *np)
|
|||
|
||||
np->np_transport->iscsit_free_np(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_transport->name);
|
||||
|
|
|
|||
|
|
@ -2670,6 +2670,10 @@ static void serial8250_config_port(struct uart_port *port, int flags)
|
|||
if (port->type == PORT_16550A && port->iotype == UPIO_AU)
|
||||
up->bugs |= UART_BUG_NOMSR;
|
||||
|
||||
/* HW bugs may trigger IRQ while IIR == NO_INT */
|
||||
if (port->type == PORT_TEGRA)
|
||||
up->bugs |= UART_BUG_NOMSR;
|
||||
|
||||
if (port->type != PORT_UNKNOWN && flags & UART_CONFIG_IRQ)
|
||||
autoconfig_irq(up);
|
||||
|
||||
|
|
|
|||
|
|
@ -1260,10 +1260,10 @@ static int pci_quatech_init(struct pci_dev *dev)
|
|||
unsigned long base = pci_resource_start(dev, 0);
|
||||
if (base) {
|
||||
u32 tmp;
|
||||
outl(inl(base + 0x38), base + 0x38);
|
||||
outl(inl(base + 0x38) | 0x00002000, base + 0x38);
|
||||
tmp = inl(base + 0x3c);
|
||||
outl(tmp | 0x01000000, base + 0x3c);
|
||||
outl(tmp, base + 0x3c);
|
||||
outl(tmp &= ~0x01000000, base + 0x3c);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
|
@ -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
|
||||
|
|
@ -4139,6 +4140,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 },
|
||||
|
|
|
|||
|
|
@ -1022,12 +1022,24 @@ static int atmel_startup(struct uart_port *port)
|
|||
static void atmel_shutdown(struct uart_port *port)
|
||||
{
|
||||
struct atmel_uart_port *atmel_port = to_atmel_uart_port(port);
|
||||
|
||||
/*
|
||||
* Ensure everything is stopped.
|
||||
* Clear out any scheduled tasklets before
|
||||
* we destroy the buffers
|
||||
*/
|
||||
tasklet_kill(&atmel_port->tasklet);
|
||||
|
||||
/*
|
||||
* Ensure everything is stopped and
|
||||
* disable all interrupts, port and break condition.
|
||||
*/
|
||||
atmel_stop_rx(port);
|
||||
atmel_stop_tx(port);
|
||||
|
||||
UART_PUT_CR(port, ATMEL_US_RSTSTA);
|
||||
UART_PUT_IDR(port, -1);
|
||||
|
||||
|
||||
/*
|
||||
* Shut-down the DMA.
|
||||
*/
|
||||
|
|
@ -1053,12 +1065,6 @@ static void atmel_shutdown(struct uart_port *port)
|
|||
DMA_TO_DEVICE);
|
||||
}
|
||||
|
||||
/*
|
||||
* Disable all interrupts, port and break condition.
|
||||
*/
|
||||
UART_PUT_CR(port, ATMEL_US_RSTSTA);
|
||||
UART_PUT_IDR(port, -1);
|
||||
|
||||
/*
|
||||
* Free the interrupt
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -651,10 +651,6 @@ void usb_destroy_configuration(struct usb_device *dev)
|
|||
*
|
||||
* hub-only!! ... and only in reset path, or usb_new_device()
|
||||
* (used by real hubs and virtual root hubs)
|
||||
*
|
||||
* NOTE: if this is a WUSB device and is not authorized, we skip the
|
||||
* whole thing. A non-authorized USB device has no
|
||||
* configurations.
|
||||
*/
|
||||
int usb_get_configuration(struct usb_device *dev)
|
||||
{
|
||||
|
|
@ -666,8 +662,6 @@ int usb_get_configuration(struct usb_device *dev)
|
|||
struct usb_config_descriptor *desc;
|
||||
|
||||
cfgno = 0;
|
||||
if (dev->authorized == 0) /* Not really an error */
|
||||
goto out_not_authorized;
|
||||
result = -ENOMEM;
|
||||
if (ncfg > USB_MAXCONFIG) {
|
||||
dev_warn(ddev, "too many configurations: %d, "
|
||||
|
|
@ -751,7 +745,6 @@ int usb_get_configuration(struct usb_device *dev)
|
|||
|
||||
err:
|
||||
kfree(desc);
|
||||
out_not_authorized:
|
||||
dev->descriptor.bNumConfigurations = cfgno;
|
||||
err2:
|
||||
if (result == -ENOMEM)
|
||||
|
|
|
|||
|
|
@ -1605,7 +1605,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);
|
||||
|
|
@ -1620,11 +1620,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--;
|
||||
|
|
@ -2227,18 +2231,13 @@ static int usb_enumerate_device(struct usb_device *udev)
|
|||
return err;
|
||||
}
|
||||
}
|
||||
if (udev->wusb == 1 && udev->authorized == 0) {
|
||||
udev->product = kstrdup("n/a (unauthorized)", GFP_KERNEL);
|
||||
udev->manufacturer = kstrdup("n/a (unauthorized)", GFP_KERNEL);
|
||||
udev->serial = kstrdup("n/a (unauthorized)", GFP_KERNEL);
|
||||
}
|
||||
else {
|
||||
/* read the standard strings and cache them if present */
|
||||
udev->product = usb_cache_string(udev, udev->descriptor.iProduct);
|
||||
udev->manufacturer = usb_cache_string(udev,
|
||||
udev->descriptor.iManufacturer);
|
||||
udev->serial = usb_cache_string(udev, udev->descriptor.iSerialNumber);
|
||||
}
|
||||
|
||||
/* read the standard strings and cache them if present */
|
||||
udev->product = usb_cache_string(udev, udev->descriptor.iProduct);
|
||||
udev->manufacturer = usb_cache_string(udev,
|
||||
udev->descriptor.iManufacturer);
|
||||
udev->serial = usb_cache_string(udev, udev->descriptor.iSerialNumber);
|
||||
|
||||
err = usb_enumerate_device_otg(udev);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
|
@ -2417,16 +2416,6 @@ int usb_deauthorize_device(struct usb_device *usb_dev)
|
|||
usb_dev->authorized = 0;
|
||||
usb_set_configuration(usb_dev, -1);
|
||||
|
||||
kfree(usb_dev->product);
|
||||
usb_dev->product = kstrdup("n/a (unauthorized)", GFP_KERNEL);
|
||||
kfree(usb_dev->manufacturer);
|
||||
usb_dev->manufacturer = kstrdup("n/a (unauthorized)", GFP_KERNEL);
|
||||
kfree(usb_dev->serial);
|
||||
usb_dev->serial = kstrdup("n/a (unauthorized)", GFP_KERNEL);
|
||||
|
||||
usb_destroy_configuration(usb_dev);
|
||||
usb_dev->descriptor.bNumConfigurations = 0;
|
||||
|
||||
out_unauthorized:
|
||||
usb_unlock_device(usb_dev);
|
||||
return 0;
|
||||
|
|
@ -2454,17 +2443,7 @@ int usb_authorize_device(struct usb_device *usb_dev)
|
|||
goto error_device_descriptor;
|
||||
}
|
||||
|
||||
kfree(usb_dev->product);
|
||||
usb_dev->product = NULL;
|
||||
kfree(usb_dev->manufacturer);
|
||||
usb_dev->manufacturer = NULL;
|
||||
kfree(usb_dev->serial);
|
||||
usb_dev->serial = NULL;
|
||||
|
||||
usb_dev->authorized = 1;
|
||||
result = usb_enumerate_device(usb_dev);
|
||||
if (result < 0)
|
||||
goto error_enumerate;
|
||||
/* Choose and set the configuration. This registers the interfaces
|
||||
* with the driver core and lets interface drivers bind to them.
|
||||
*/
|
||||
|
|
@ -2480,7 +2459,6 @@ int usb_authorize_device(struct usb_device *usb_dev)
|
|||
}
|
||||
dev_info(&usb_dev->dev, "authorized to connect\n");
|
||||
|
||||
error_enumerate:
|
||||
error_device_descriptor:
|
||||
usb_autosuspend_device(usb_dev);
|
||||
error_autoresume:
|
||||
|
|
|
|||
|
|
@ -200,6 +200,7 @@ struct ehci_hcd { /* one per controller */
|
|||
unsigned has_synopsys_hc_bug:1; /* Synopsys HC */
|
||||
unsigned frame_index_bug:1; /* MosChip (AKA NetMos) */
|
||||
unsigned need_oc_pp_cycle:1; /* MPC834X port power */
|
||||
unsigned imx28_write_fix:1; /* For Freescale i.MX28 */
|
||||
|
||||
/* required for usb32 quirk */
|
||||
#define OHCI_CTRL_HCFS (3 << 6)
|
||||
|
|
@ -675,6 +676,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)
|
||||
{
|
||||
|
|
@ -683,7 +696,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 */
|
||||
|
|
|
|||
|
|
@ -2132,10 +2132,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;
|
||||
|
|
@ -2182,6 +2192,9 @@ static void ftdi_set_termios(struct tty_struct *tty,
|
|||
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,
|
||||
|
|
@ -280,10 +282,6 @@ static void pl2303_set_termios(struct tty_struct *tty,
|
|||
int baud_floor, baud_ceil;
|
||||
int k;
|
||||
|
||||
/* The PL2303 is reported 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 */
|
||||
|
||||
if (old_termios && !tty_termios_hw_change(&tty->termios, old_termios))
|
||||
return;
|
||||
|
||||
|
|
@ -422,10 +420,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);
|
||||
|
|
|
|||
|
|
@ -234,6 +234,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",
|
||||
|
|
|
|||
|
|
@ -7491,7 +7491,7 @@ int btrfs_drop_snapshot(struct btrfs_root *root,
|
|||
*/
|
||||
if (root_dropped == false)
|
||||
btrfs_add_dead_root(root);
|
||||
if (err)
|
||||
if (err && err != -EAGAIN)
|
||||
btrfs_std_error(root->fs_info, err);
|
||||
return err;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1528,6 +1528,12 @@ static noinline int btrfs_ioctl_snap_create_transid(struct file *file,
|
|||
printk(KERN_INFO "btrfs: Snapshot src from "
|
||||
"another FS\n");
|
||||
ret = -EINVAL;
|
||||
} else if (!inode_owner_or_capable(src_inode)) {
|
||||
/*
|
||||
* Subvolume creation is not restricted, but snapshots
|
||||
* are limited to own subvolumes only
|
||||
*/
|
||||
ret = -EPERM;
|
||||
} else {
|
||||
ret = btrfs_mksubvol(&file->f_path, name, namelen,
|
||||
BTRFS_I(src_inode)->root,
|
||||
|
|
|
|||
|
|
@ -1957,9 +1957,11 @@ void ext4_inline_data_truncate(struct inode *inode, int *has_inline)
|
|||
}
|
||||
|
||||
/* Clear the content within i_blocks. */
|
||||
if (i_size < EXT4_MIN_INLINE_DATA_SIZE)
|
||||
memset(ext4_raw_inode(&is.iloc)->i_block + i_size, 0,
|
||||
EXT4_MIN_INLINE_DATA_SIZE - i_size);
|
||||
if (i_size < EXT4_MIN_INLINE_DATA_SIZE) {
|
||||
void *p = (void *) ext4_raw_inode(&is.iloc)->i_block;
|
||||
memset(p + i_size, 0,
|
||||
EXT4_MIN_INLINE_DATA_SIZE - i_size);
|
||||
}
|
||||
|
||||
EXT4_I(inode)->i_inline_size = i_size <
|
||||
EXT4_MIN_INLINE_DATA_SIZE ?
|
||||
|
|
|
|||
|
|
@ -73,7 +73,7 @@ static inline int mnt_has_parent(struct mount *mnt)
|
|||
static inline int is_mounted(struct vfsmount *mnt)
|
||||
{
|
||||
/* neither detached nor internal? */
|
||||
return !IS_ERR_OR_NULL(real_mount(mnt));
|
||||
return !IS_ERR_OR_NULL(real_mount(mnt)->mnt_ns);
|
||||
}
|
||||
|
||||
extern struct mount *__lookup_mnt(struct vfsmount *, struct dentry *, int);
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@ struct hugepage_subpool *hugepage_new_subpool(long nr_blocks);
|
|||
void hugepage_put_subpool(struct hugepage_subpool *spool);
|
||||
|
||||
int PageHuge(struct page *page);
|
||||
int PageHeadHuge(struct page *page_head);
|
||||
|
||||
void reset_vma_resv_huge_pages(struct vm_area_struct *vma);
|
||||
int hugetlb_sysctl_handler(struct ctl_table *, int, void __user *, size_t *, loff_t *);
|
||||
|
|
@ -98,6 +99,11 @@ static inline int PageHuge(struct page *page)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline int PageHeadHuge(struct page *page_head)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void reset_vma_resv_huge_pages(struct vm_area_struct *vma)
|
||||
{
|
||||
}
|
||||
|
|
|
|||
|
|
@ -400,6 +400,8 @@ enum {
|
|||
ATA_HORKAGE_DUMP_ID = (1 << 16), /* dump IDENTIFY data */
|
||||
ATA_HORKAGE_MAX_SEC_LBA48 = (1 << 17), /* Set max sects to 65535 */
|
||||
ATA_HORKAGE_ATAPI_DMADIR = (1 << 18), /* device requires dmadir */
|
||||
ATA_HORKAGE_NOLPM = (1 << 20), /* don't use LPM */
|
||||
ATA_HORKAGE_WD_BROKEN_LPM = (1 << 21), /* some WDs have broken LPM */
|
||||
|
||||
/* DMA mask for user DMA control: User visible values; DO NOT
|
||||
renumber */
|
||||
|
|
|
|||
|
|
@ -48,7 +48,7 @@ STATIC int INIT gunzip(unsigned char *buf, int len,
|
|||
out_len = 0x8000; /* 32 K */
|
||||
out_buf = malloc(out_len);
|
||||
} else {
|
||||
out_len = 0x7fffffff; /* no limit */
|
||||
out_len = ((size_t)~0) - (size_t)out_buf; /* no limit */
|
||||
}
|
||||
if (!out_buf) {
|
||||
error("Out of memory while allocating output buffer");
|
||||
|
|
|
|||
17
mm/hugetlb.c
17
mm/hugetlb.c
|
|
@ -690,6 +690,23 @@ int PageHuge(struct page *page)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(PageHuge);
|
||||
|
||||
/*
|
||||
* PageHeadHuge() only returns true for hugetlbfs head page, but not for
|
||||
* normal or transparent huge pages.
|
||||
*/
|
||||
int PageHeadHuge(struct page *page_head)
|
||||
{
|
||||
compound_page_dtor *dtor;
|
||||
|
||||
if (!PageHead(page_head))
|
||||
return 0;
|
||||
|
||||
dtor = get_compound_page_dtor(page_head);
|
||||
|
||||
return dtor == free_huge_page;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(PageHeadHuge);
|
||||
|
||||
pgoff_t __basepage_index(struct page *page)
|
||||
{
|
||||
struct page *page_head = compound_head(page);
|
||||
|
|
|
|||
|
|
@ -2801,7 +2801,7 @@ int mpol_to_str(char *buffer, int maxlen, struct mempolicy *pol)
|
|||
*/
|
||||
VM_BUG_ON(maxlen < strlen("interleave") + strlen("relative") + 16);
|
||||
|
||||
if (!pol || pol == &default_policy)
|
||||
if (!pol || pol == &default_policy || (pol->flags & MPOL_F_MORON))
|
||||
mode = MPOL_DEFAULT;
|
||||
else
|
||||
mode = pol->mode;
|
||||
|
|
|
|||
143
mm/swap.c
143
mm/swap.c
|
|
@ -79,19 +79,6 @@ static void __put_compound_page(struct page *page)
|
|||
|
||||
static void put_compound_page(struct page *page)
|
||||
{
|
||||
/*
|
||||
* hugetlbfs pages cannot be split from under us. If this is a
|
||||
* hugetlbfs page, check refcount on head page and release the page if
|
||||
* the refcount becomes zero.
|
||||
*/
|
||||
if (PageHuge(page)) {
|
||||
page = compound_head(page);
|
||||
if (put_page_testzero(page))
|
||||
__put_compound_page(page);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (unlikely(PageTail(page))) {
|
||||
/* __split_huge_page_refcount can run under us */
|
||||
struct page *page_head = compound_trans_head(page);
|
||||
|
|
@ -108,14 +95,31 @@ static void put_compound_page(struct page *page)
|
|||
* still hot on arches that do not support
|
||||
* this_cpu_cmpxchg_double().
|
||||
*/
|
||||
if (PageSlab(page_head)) {
|
||||
if (PageTail(page)) {
|
||||
if (PageSlab(page_head) || PageHeadHuge(page_head)) {
|
||||
if (likely(PageTail(page))) {
|
||||
/*
|
||||
* __split_huge_page_refcount
|
||||
* cannot race here.
|
||||
*/
|
||||
VM_BUG_ON(!PageHead(page_head));
|
||||
atomic_dec(&page->_mapcount);
|
||||
if (put_page_testzero(page_head))
|
||||
VM_BUG_ON(1);
|
||||
|
||||
atomic_dec(&page->_mapcount);
|
||||
goto skip_lock_tail;
|
||||
if (put_page_testzero(page_head))
|
||||
__put_compound_page(page_head);
|
||||
return;
|
||||
} else
|
||||
/*
|
||||
* __split_huge_page_refcount
|
||||
* run before us, "page" was a
|
||||
* THP tail. The split
|
||||
* page_head has been freed
|
||||
* and reallocated as slab or
|
||||
* hugetlbfs page of smaller
|
||||
* order (only possible if
|
||||
* reallocated as slab on
|
||||
* x86).
|
||||
*/
|
||||
goto skip_lock;
|
||||
}
|
||||
/*
|
||||
|
|
@ -129,8 +133,27 @@ static void put_compound_page(struct page *page)
|
|||
/* __split_huge_page_refcount run before us */
|
||||
compound_unlock_irqrestore(page_head, flags);
|
||||
skip_lock:
|
||||
if (put_page_testzero(page_head))
|
||||
__put_single_page(page_head);
|
||||
if (put_page_testzero(page_head)) {
|
||||
/*
|
||||
* The head page may have been
|
||||
* freed and reallocated as a
|
||||
* compound page of smaller
|
||||
* order and then freed again.
|
||||
* All we know is that it
|
||||
* cannot have become: a THP
|
||||
* page, a compound page of
|
||||
* higher order, a tail page.
|
||||
* That is because we still
|
||||
* hold the refcount of the
|
||||
* split THP tail and
|
||||
* page_head was the THP head
|
||||
* before the split.
|
||||
*/
|
||||
if (PageHead(page_head))
|
||||
__put_compound_page(page_head);
|
||||
else
|
||||
__put_single_page(page_head);
|
||||
}
|
||||
out_put_single:
|
||||
if (put_page_testzero(page))
|
||||
__put_single_page(page);
|
||||
|
|
@ -152,7 +175,6 @@ static void put_compound_page(struct page *page)
|
|||
VM_BUG_ON(atomic_read(&page->_count) != 0);
|
||||
compound_unlock_irqrestore(page_head, flags);
|
||||
|
||||
skip_lock_tail:
|
||||
if (put_page_testzero(page_head)) {
|
||||
if (PageHead(page_head))
|
||||
__put_compound_page(page_head);
|
||||
|
|
@ -195,51 +217,52 @@ bool __get_page_tail(struct page *page)
|
|||
* proper PT lock that already serializes against
|
||||
* split_huge_page().
|
||||
*/
|
||||
unsigned long flags;
|
||||
bool got = false;
|
||||
struct page *page_head;
|
||||
struct page *page_head = compound_trans_head(page);
|
||||
|
||||
/*
|
||||
* If this is a hugetlbfs page it cannot be split under us. Simply
|
||||
* increment refcount for the head page.
|
||||
*/
|
||||
if (PageHuge(page)) {
|
||||
page_head = compound_head(page);
|
||||
atomic_inc(&page_head->_count);
|
||||
got = true;
|
||||
} else {
|
||||
unsigned long flags;
|
||||
|
||||
page_head = compound_trans_head(page);
|
||||
if (likely(page != page_head &&
|
||||
get_page_unless_zero(page_head))) {
|
||||
|
||||
/* Ref to put_compound_page() comment. */
|
||||
if (PageSlab(page_head)) {
|
||||
if (likely(PageTail(page))) {
|
||||
__get_page_tail_foll(page, false);
|
||||
return true;
|
||||
} else {
|
||||
put_page(page_head);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* page_head wasn't a dangling pointer but it
|
||||
* may not be a head page anymore by the time
|
||||
* we obtain the lock. That is ok as long as it
|
||||
* can't be freed from under us.
|
||||
*/
|
||||
flags = compound_lock_irqsave(page_head);
|
||||
/* here __split_huge_page_refcount won't run anymore */
|
||||
if (likely(page != page_head && get_page_unless_zero(page_head))) {
|
||||
/* Ref to put_compound_page() comment. */
|
||||
if (PageSlab(page_head) || PageHeadHuge(page_head)) {
|
||||
if (likely(PageTail(page))) {
|
||||
/*
|
||||
* This is a hugetlbfs page or a slab
|
||||
* page. __split_huge_page_refcount
|
||||
* cannot race here.
|
||||
*/
|
||||
VM_BUG_ON(!PageHead(page_head));
|
||||
__get_page_tail_foll(page, false);
|
||||
got = true;
|
||||
}
|
||||
compound_unlock_irqrestore(page_head, flags);
|
||||
if (unlikely(!got))
|
||||
return true;
|
||||
} else {
|
||||
/*
|
||||
* __split_huge_page_refcount run
|
||||
* before us, "page" was a THP
|
||||
* tail. The split page_head has been
|
||||
* freed and reallocated as slab or
|
||||
* hugetlbfs page of smaller order
|
||||
* (only possible if reallocated as
|
||||
* slab on x86).
|
||||
*/
|
||||
put_page(page_head);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* page_head wasn't a dangling pointer but it
|
||||
* may not be a head page anymore by the time
|
||||
* we obtain the lock. That is ok as long as it
|
||||
* can't be freed from under us.
|
||||
*/
|
||||
flags = compound_lock_irqsave(page_head);
|
||||
/* here __split_huge_page_refcount won't run anymore */
|
||||
if (likely(PageTail(page))) {
|
||||
__get_page_tail_foll(page, false);
|
||||
got = true;
|
||||
}
|
||||
compound_unlock_irqrestore(page_head, flags);
|
||||
if (unlikely(!got))
|
||||
put_page(page_head);
|
||||
}
|
||||
return got;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -780,21 +780,16 @@ asmlinkage long compat_sys_recvmmsg(int fd, struct compat_mmsghdr __user *mmsg,
|
|||
if (flags & MSG_CMSG_COMPAT)
|
||||
return -EINVAL;
|
||||
|
||||
if (COMPAT_USE_64BIT_TIME)
|
||||
return __sys_recvmmsg(fd, (struct mmsghdr __user *)mmsg, vlen,
|
||||
flags | MSG_CMSG_COMPAT,
|
||||
(struct timespec *) timeout);
|
||||
|
||||
if (timeout == NULL)
|
||||
return __sys_recvmmsg(fd, (struct mmsghdr __user *)mmsg, vlen,
|
||||
flags | MSG_CMSG_COMPAT, NULL);
|
||||
|
||||
if (get_compat_timespec(&ktspec, timeout))
|
||||
if (compat_get_timespec(&ktspec, timeout))
|
||||
return -EFAULT;
|
||||
|
||||
datagrams = __sys_recvmmsg(fd, (struct mmsghdr __user *)mmsg, vlen,
|
||||
flags | MSG_CMSG_COMPAT, &ktspec);
|
||||
if (datagrams > 0 && put_compat_timespec(&ktspec, timeout))
|
||||
if (datagrams > 0 && compat_put_timespec(&ktspec, timeout))
|
||||
datagrams = -EFAULT;
|
||||
|
||||
return datagrams;
|
||||
|
|
|
|||
|
|
@ -36,7 +36,6 @@
|
|||
#include <asm/uaccess.h>
|
||||
#include <asm/unaligned.h>
|
||||
#include <linux/filter.h>
|
||||
#include <linux/reciprocal_div.h>
|
||||
#include <linux/ratelimit.h>
|
||||
#include <linux/seccomp.h>
|
||||
#include <linux/if_vlan.h>
|
||||
|
|
@ -166,7 +165,7 @@ unsigned int sk_run_filter(const struct sk_buff *skb,
|
|||
A /= X;
|
||||
continue;
|
||||
case BPF_S_ALU_DIV_K:
|
||||
A = reciprocal_divide(A, K);
|
||||
A /= K;
|
||||
continue;
|
||||
case BPF_S_ALU_MOD_X:
|
||||
if (X == 0)
|
||||
|
|
@ -553,11 +552,6 @@ int sk_chk_filter(struct sock_filter *filter, unsigned int flen)
|
|||
/* Some instructions need special checks */
|
||||
switch (code) {
|
||||
case BPF_S_ALU_DIV_K:
|
||||
/* check for division by zero */
|
||||
if (ftest->k == 0)
|
||||
return -EINVAL;
|
||||
ftest->k = reciprocal_value(ftest->k);
|
||||
break;
|
||||
case BPF_S_ALU_MOD_K:
|
||||
/* check for division by zero */
|
||||
if (ftest->k == 0)
|
||||
|
|
@ -853,27 +847,7 @@ void sk_decode_filter(struct sock_filter *filt, struct sock_filter *to)
|
|||
to->code = decodes[code];
|
||||
to->jt = filt->jt;
|
||||
to->jf = filt->jf;
|
||||
|
||||
if (code == BPF_S_ALU_DIV_K) {
|
||||
/*
|
||||
* When loaded this rule user gave us X, which was
|
||||
* translated into R = r(X). Now we calculate the
|
||||
* RR = r(R) and report it back. If next time this
|
||||
* value is loaded and RRR = r(RR) is calculated
|
||||
* then the R == RRR will be true.
|
||||
*
|
||||
* One exception. X == 1 translates into R == 0 and
|
||||
* we can't calculate RR out of it with r().
|
||||
*/
|
||||
|
||||
if (filt->k == 0)
|
||||
to->k = 1;
|
||||
else
|
||||
to->k = reciprocal_value(filt->k);
|
||||
|
||||
BUG_ON(reciprocal_value(to->k) != filt->k);
|
||||
} else
|
||||
to->k = filt->k;
|
||||
to->k = filt->k;
|
||||
}
|
||||
|
||||
int sk_get_filter(struct sock *sk, struct sock_filter __user *ubuf, unsigned int len)
|
||||
|
|
|
|||
|
|
@ -224,8 +224,10 @@ static int ieee802154_add_iface(struct sk_buff *skb,
|
|||
|
||||
if (info->attrs[IEEE802154_ATTR_DEV_TYPE]) {
|
||||
type = nla_get_u8(info->attrs[IEEE802154_ATTR_DEV_TYPE]);
|
||||
if (type >= __IEEE802154_DEV_MAX)
|
||||
return -EINVAL;
|
||||
if (type >= __IEEE802154_DEV_MAX) {
|
||||
rc = -EINVAL;
|
||||
goto nla_put_failure;
|
||||
}
|
||||
}
|
||||
|
||||
dev = phy->add_iface(phy, devname, type);
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user