Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts: drivers/net/wireless/iwlwifi/pcie/trans.c include/linux/inetdevice.h The inetdevice.h conflict involves moving the IPV4_DEVCONF values into a UAPI header, overlapping additions of some new entries. The iwlwifi conflict is a context overlap. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
b05930f5d1
@ -2953,7 +2953,7 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
||||
improve throughput, but will also increase the
|
||||
amount of memory reserved for use by the client.
|
||||
|
||||
swapaccount[=0|1]
|
||||
swapaccount=[0|1]
|
||||
[KNL] Enable accounting of swap in memory resource
|
||||
controller if no parameter or 1 is given or disable
|
||||
it if 0 is given (See Documentation/cgroups/memory.txt)
|
||||
|
10
MAINTAINERS
10
MAINTAINERS
@ -5884,7 +5884,7 @@ F: drivers/i2c/busses/i2c-omap.c
|
||||
F: include/linux/i2c-omap.h
|
||||
|
||||
OMAP DEVICE TREE SUPPORT
|
||||
M: Benoît Cousson <b-cousson@ti.com>
|
||||
M: Benoît Cousson <bcousson@baylibre.com>
|
||||
M: Tony Lindgren <tony@atomide.com>
|
||||
L: linux-omap@vger.kernel.org
|
||||
L: devicetree@vger.kernel.org
|
||||
@ -5964,14 +5964,14 @@ S: Maintained
|
||||
F: drivers/char/hw_random/omap-rng.c
|
||||
|
||||
OMAP HWMOD SUPPORT
|
||||
M: Benoît Cousson <b-cousson@ti.com>
|
||||
M: Benoît Cousson <bcousson@baylibre.com>
|
||||
M: Paul Walmsley <paul@pwsan.com>
|
||||
L: linux-omap@vger.kernel.org
|
||||
S: Maintained
|
||||
F: arch/arm/mach-omap2/omap_hwmod.*
|
||||
|
||||
OMAP HWMOD DATA FOR OMAP4-BASED DEVICES
|
||||
M: Benoît Cousson <b-cousson@ti.com>
|
||||
M: Benoît Cousson <bcousson@baylibre.com>
|
||||
L: linux-omap@vger.kernel.org
|
||||
S: Maintained
|
||||
F: arch/arm/mach-omap2/omap_hwmod_44xx_data.c
|
||||
@ -7367,7 +7367,6 @@ F: drivers/net/ethernet/sfc/
|
||||
|
||||
SGI GRU DRIVER
|
||||
M: Dimitri Sivanich <sivanich@sgi.com>
|
||||
M: Robin Holt <holt@sgi.com>
|
||||
S: Maintained
|
||||
F: drivers/misc/sgi-gru/
|
||||
|
||||
@ -7387,7 +7386,8 @@ S: Maintained for 2.6.
|
||||
F: Documentation/sgi-visws.txt
|
||||
|
||||
SGI XP/XPC/XPNET DRIVER
|
||||
M: Robin Holt <holt@sgi.com>
|
||||
M: Cliff Whickman <cpw@sgi.com>
|
||||
M: Robin Holt <robinmholt@gmail.com>
|
||||
S: Maintained
|
||||
F: drivers/misc/sgi-xp/
|
||||
|
||||
|
2
Makefile
2
Makefile
@ -1,7 +1,7 @@
|
||||
VERSION = 3
|
||||
PATCHLEVEL = 11
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc5
|
||||
EXTRAVERSION = -rc6
|
||||
NAME = Linux for Workgroups
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
@ -14,11 +14,11 @@
|
||||
compatible = "atmel,at91sam9n12ek", "atmel,at91sam9n12", "atmel,at91sam9";
|
||||
|
||||
chosen {
|
||||
bootargs = "mem=128M console=ttyS0,115200 root=/dev/mtdblock1 rw rootfstype=jffs2";
|
||||
bootargs = "console=ttyS0,115200 root=/dev/mtdblock1 rw rootfstype=jffs2";
|
||||
};
|
||||
|
||||
memory {
|
||||
reg = <0x20000000 0x10000000>;
|
||||
reg = <0x20000000 0x8000000>;
|
||||
};
|
||||
|
||||
clocks {
|
||||
|
@ -94,8 +94,9 @@
|
||||
|
||||
usb0: ohci@00600000 {
|
||||
status = "okay";
|
||||
num-ports = <2>;
|
||||
atmel,vbus-gpio = <&pioD 19 GPIO_ACTIVE_LOW
|
||||
num-ports = <3>;
|
||||
atmel,vbus-gpio = <0 /* &pioD 18 GPIO_ACTIVE_LOW *//* Activate to have access to port A */
|
||||
&pioD 19 GPIO_ACTIVE_LOW
|
||||
&pioD 20 GPIO_ACTIVE_LOW
|
||||
>;
|
||||
};
|
||||
|
@ -830,6 +830,8 @@
|
||||
regulator-max-microvolt = <5000000>;
|
||||
enable-active-high;
|
||||
gpio = <&gpio 24 0>; /* PD0 */
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -412,6 +412,8 @@
|
||||
regulator-max-microvolt = <5000000>;
|
||||
enable-active-high;
|
||||
gpio = <&gpio 170 0>; /* PV2 */
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -588,6 +588,8 @@
|
||||
regulator-max-microvolt = <5000000>;
|
||||
enable-active-high;
|
||||
gpio = <&tca6416 0 0>; /* GPIO_PMU0 */
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
};
|
||||
|
||||
vbus3_reg: regulator@3 {
|
||||
@ -598,6 +600,8 @@
|
||||
regulator-max-microvolt = <5000000>;
|
||||
enable-active-high;
|
||||
gpio = <&tca6416 1 0>; /* GPIO_PMU1 */
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -88,4 +88,7 @@ static inline u32 mpidr_hash_size(void)
|
||||
{
|
||||
return 1 << mpidr_hash.bits;
|
||||
}
|
||||
|
||||
extern int platform_can_cpu_hotplug(void);
|
||||
|
||||
#endif
|
||||
|
@ -107,7 +107,7 @@ static inline int arch_spin_trylock(arch_spinlock_t *lock)
|
||||
" subs %1, %0, %0, ror #16\n"
|
||||
" addeq %0, %0, %4\n"
|
||||
" strexeq %2, %0, [%3]"
|
||||
: "=&r" (slock), "=&r" (contended), "=r" (res)
|
||||
: "=&r" (slock), "=&r" (contended), "=&r" (res)
|
||||
: "r" (&lock->slock), "I" (1 << TICKET_SHIFT)
|
||||
: "cc");
|
||||
} while (res);
|
||||
@ -168,17 +168,20 @@ static inline void arch_write_lock(arch_rwlock_t *rw)
|
||||
|
||||
static inline int arch_write_trylock(arch_rwlock_t *rw)
|
||||
{
|
||||
unsigned long tmp;
|
||||
unsigned long contended, res;
|
||||
|
||||
__asm__ __volatile__(
|
||||
" ldrex %0, [%1]\n"
|
||||
" teq %0, #0\n"
|
||||
" strexeq %0, %2, [%1]"
|
||||
: "=&r" (tmp)
|
||||
: "r" (&rw->lock), "r" (0x80000000)
|
||||
: "cc");
|
||||
do {
|
||||
__asm__ __volatile__(
|
||||
" ldrex %0, [%2]\n"
|
||||
" mov %1, #0\n"
|
||||
" teq %0, #0\n"
|
||||
" strexeq %1, %3, [%2]"
|
||||
: "=&r" (contended), "=&r" (res)
|
||||
: "r" (&rw->lock), "r" (0x80000000)
|
||||
: "cc");
|
||||
} while (res);
|
||||
|
||||
if (tmp == 0) {
|
||||
if (!contended) {
|
||||
smp_mb();
|
||||
return 1;
|
||||
} else {
|
||||
@ -254,18 +257,26 @@ static inline void arch_read_unlock(arch_rwlock_t *rw)
|
||||
|
||||
static inline int arch_read_trylock(arch_rwlock_t *rw)
|
||||
{
|
||||
unsigned long tmp, tmp2 = 1;
|
||||
unsigned long contended, res;
|
||||
|
||||
__asm__ __volatile__(
|
||||
" ldrex %0, [%2]\n"
|
||||
" adds %0, %0, #1\n"
|
||||
" strexpl %1, %0, [%2]\n"
|
||||
: "=&r" (tmp), "+r" (tmp2)
|
||||
: "r" (&rw->lock)
|
||||
: "cc");
|
||||
do {
|
||||
__asm__ __volatile__(
|
||||
" ldrex %0, [%2]\n"
|
||||
" mov %1, #0\n"
|
||||
" adds %0, %0, #1\n"
|
||||
" strexpl %1, %0, [%2]"
|
||||
: "=&r" (contended), "=&r" (res)
|
||||
: "r" (&rw->lock)
|
||||
: "cc");
|
||||
} while (res);
|
||||
|
||||
smp_mb();
|
||||
return tmp2 == 0;
|
||||
/* If the lock is negative, then it is already held for write. */
|
||||
if (contended < 0x80000000) {
|
||||
smp_mb();
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* read_can_lock - would read_trylock() succeed? */
|
||||
|
@ -357,7 +357,8 @@ ENDPROC(__pabt_svc)
|
||||
.endm
|
||||
|
||||
.macro kuser_cmpxchg_check
|
||||
#if !defined(CONFIG_CPU_32v6K) && !defined(CONFIG_NEEDS_SYSCALL_FOR_CMPXCHG)
|
||||
#if !defined(CONFIG_CPU_32v6K) && defined(CONFIG_KUSER_HELPERS) && \
|
||||
!defined(CONFIG_NEEDS_SYSCALL_FOR_CMPXCHG)
|
||||
#ifndef CONFIG_MMU
|
||||
#warning "NPTL on non MMU needs fixing"
|
||||
#else
|
||||
|
@ -84,17 +84,13 @@ int show_fiq_list(struct seq_file *p, int prec)
|
||||
|
||||
void set_fiq_handler(void *start, unsigned int length)
|
||||
{
|
||||
#if defined(CONFIG_CPU_USE_DOMAINS)
|
||||
void *base = (void *)0xffff0000;
|
||||
#else
|
||||
void *base = vectors_page;
|
||||
#endif
|
||||
unsigned offset = FIQ_OFFSET;
|
||||
|
||||
memcpy(base + offset, start, length);
|
||||
if (!cache_is_vipt_nonaliasing())
|
||||
flush_icache_range(base + offset, offset + length);
|
||||
flush_icache_range(0xffff0000 + offset, 0xffff0000 + offset + length);
|
||||
if (!vectors_high())
|
||||
flush_icache_range(offset, offset + length);
|
||||
}
|
||||
|
||||
int claim_fiq(struct fiq_handler *f)
|
||||
|
@ -15,6 +15,7 @@
|
||||
#include <asm/mmu_context.h>
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/smp_plat.h>
|
||||
#include <asm/system_misc.h>
|
||||
|
||||
extern const unsigned char relocate_new_kernel[];
|
||||
@ -38,6 +39,14 @@ int machine_kexec_prepare(struct kimage *image)
|
||||
__be32 header;
|
||||
int i, err;
|
||||
|
||||
/*
|
||||
* Validate that if the current HW supports SMP, then the SW supports
|
||||
* and implements CPU hotplug for the current HW. If not, we won't be
|
||||
* able to kexec reliably, so fail the prepare operation.
|
||||
*/
|
||||
if (num_possible_cpus() > 1 && !platform_can_cpu_hotplug())
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
* No segment at default ATAGs address. try to locate
|
||||
* a dtb using magic.
|
||||
@ -134,10 +143,13 @@ void machine_kexec(struct kimage *image)
|
||||
unsigned long reboot_code_buffer_phys;
|
||||
void *reboot_code_buffer;
|
||||
|
||||
if (num_online_cpus() > 1) {
|
||||
pr_err("kexec: error: multiple CPUs still online\n");
|
||||
return;
|
||||
}
|
||||
/*
|
||||
* This can only happen if machine_shutdown() failed to disable some
|
||||
* CPU, and that can only happen if the checks in
|
||||
* machine_kexec_prepare() were not correct. If this fails, we can't
|
||||
* reliably kexec anyway, so BUG_ON is appropriate.
|
||||
*/
|
||||
BUG_ON(num_online_cpus() > 1);
|
||||
|
||||
page_list = image->head & PAGE_MASK;
|
||||
|
||||
|
@ -56,7 +56,7 @@ armpmu_map_hw_event(const unsigned (*event_map)[PERF_COUNT_HW_MAX], u64 config)
|
||||
int mapping;
|
||||
|
||||
if (config >= PERF_COUNT_HW_MAX)
|
||||
return -ENOENT;
|
||||
return -EINVAL;
|
||||
|
||||
mapping = (*event_map)[config];
|
||||
return mapping == HW_OP_UNSUPPORTED ? -ENOENT : mapping;
|
||||
@ -258,6 +258,9 @@ validate_event(struct pmu_hw_events *hw_events,
|
||||
struct arm_pmu *armpmu = to_arm_pmu(event->pmu);
|
||||
struct pmu *leader_pmu = event->group_leader->pmu;
|
||||
|
||||
if (is_software_event(event))
|
||||
return 1;
|
||||
|
||||
if (event->pmu != leader_pmu || event->state < PERF_EVENT_STATE_OFF)
|
||||
return 1;
|
||||
|
||||
|
@ -462,7 +462,7 @@ int in_gate_area_no_mm(unsigned long addr)
|
||||
{
|
||||
return in_gate_area(NULL, addr);
|
||||
}
|
||||
#define is_gate_vma(vma) ((vma) = &gate_vma)
|
||||
#define is_gate_vma(vma) ((vma) == &gate_vma)
|
||||
#else
|
||||
#define is_gate_vma(vma) 0
|
||||
#endif
|
||||
|
@ -145,6 +145,16 @@ int boot_secondary(unsigned int cpu, struct task_struct *idle)
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
int platform_can_cpu_hotplug(void)
|
||||
{
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
if (smp_ops.cpu_kill)
|
||||
return 1;
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
static void percpu_timer_stop(void);
|
||||
|
||||
|
@ -146,7 +146,11 @@ static bool pm_fake(struct kvm_vcpu *vcpu,
|
||||
#define access_pmintenclr pm_fake
|
||||
|
||||
/* Architected CP15 registers.
|
||||
* Important: Must be sorted ascending by CRn, CRM, Op1, Op2
|
||||
* CRn denotes the primary register number, but is copied to the CRm in the
|
||||
* user space API for 64-bit register access in line with the terminology used
|
||||
* in the ARM ARM.
|
||||
* Important: Must be sorted ascending by CRn, CRM, Op1, Op2 and with 64-bit
|
||||
* registers preceding 32-bit ones.
|
||||
*/
|
||||
static const struct coproc_reg cp15_regs[] = {
|
||||
/* CSSELR: swapped by interrupt.S. */
|
||||
@ -154,8 +158,8 @@ static const struct coproc_reg cp15_regs[] = {
|
||||
NULL, reset_unknown, c0_CSSELR },
|
||||
|
||||
/* TTBR0/TTBR1: swapped by interrupt.S. */
|
||||
{ CRm( 2), Op1( 0), is64, NULL, reset_unknown64, c2_TTBR0 },
|
||||
{ CRm( 2), Op1( 1), is64, NULL, reset_unknown64, c2_TTBR1 },
|
||||
{ CRm64( 2), Op1( 0), is64, NULL, reset_unknown64, c2_TTBR0 },
|
||||
{ CRm64( 2), Op1( 1), is64, NULL, reset_unknown64, c2_TTBR1 },
|
||||
|
||||
/* TTBCR: swapped by interrupt.S. */
|
||||
{ CRn( 2), CRm( 0), Op1( 0), Op2( 2), is32,
|
||||
@ -182,7 +186,7 @@ static const struct coproc_reg cp15_regs[] = {
|
||||
NULL, reset_unknown, c6_IFAR },
|
||||
|
||||
/* PAR swapped by interrupt.S */
|
||||
{ CRn( 7), Op1( 0), is64, NULL, reset_unknown64, c7_PAR },
|
||||
{ CRm64( 7), Op1( 0), is64, NULL, reset_unknown64, c7_PAR },
|
||||
|
||||
/*
|
||||
* DC{C,I,CI}SW operations:
|
||||
@ -399,12 +403,13 @@ static bool index_to_params(u64 id, struct coproc_params *params)
|
||||
| KVM_REG_ARM_OPC1_MASK))
|
||||
return false;
|
||||
params->is_64bit = true;
|
||||
params->CRm = ((id & KVM_REG_ARM_CRM_MASK)
|
||||
/* CRm to CRn: see cp15_to_index for details */
|
||||
params->CRn = ((id & KVM_REG_ARM_CRM_MASK)
|
||||
>> KVM_REG_ARM_CRM_SHIFT);
|
||||
params->Op1 = ((id & KVM_REG_ARM_OPC1_MASK)
|
||||
>> KVM_REG_ARM_OPC1_SHIFT);
|
||||
params->Op2 = 0;
|
||||
params->CRn = 0;
|
||||
params->CRm = 0;
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
@ -898,7 +903,14 @@ static u64 cp15_to_index(const struct coproc_reg *reg)
|
||||
if (reg->is_64) {
|
||||
val |= KVM_REG_SIZE_U64;
|
||||
val |= (reg->Op1 << KVM_REG_ARM_OPC1_SHIFT);
|
||||
val |= (reg->CRm << KVM_REG_ARM_CRM_SHIFT);
|
||||
/*
|
||||
* CRn always denotes the primary coproc. reg. nr. for the
|
||||
* in-kernel representation, but the user space API uses the
|
||||
* CRm for the encoding, because it is modelled after the
|
||||
* MRRC/MCRR instructions: see the ARM ARM rev. c page
|
||||
* B3-1445
|
||||
*/
|
||||
val |= (reg->CRn << KVM_REG_ARM_CRM_SHIFT);
|
||||
} else {
|
||||
val |= KVM_REG_SIZE_U32;
|
||||
val |= (reg->Op1 << KVM_REG_ARM_OPC1_SHIFT);
|
||||
|
@ -135,6 +135,8 @@ static inline int cmp_reg(const struct coproc_reg *i1,
|
||||
return -1;
|
||||
if (i1->CRn != i2->CRn)
|
||||
return i1->CRn - i2->CRn;
|
||||
if (i1->is_64 != i2->is_64)
|
||||
return i2->is_64 - i1->is_64;
|
||||
if (i1->CRm != i2->CRm)
|
||||
return i1->CRm - i2->CRm;
|
||||
if (i1->Op1 != i2->Op1)
|
||||
@ -145,6 +147,7 @@ static inline int cmp_reg(const struct coproc_reg *i1,
|
||||
|
||||
#define CRn(_x) .CRn = _x
|
||||
#define CRm(_x) .CRm = _x
|
||||
#define CRm64(_x) .CRn = _x, .CRm = 0
|
||||
#define Op1(_x) .Op1 = _x
|
||||
#define Op2(_x) .Op2 = _x
|
||||
#define is64 .is_64 = true
|
||||
|
@ -114,7 +114,11 @@ static bool access_l2ectlr(struct kvm_vcpu *vcpu,
|
||||
|
||||
/*
|
||||
* A15-specific CP15 registers.
|
||||
* Important: Must be sorted ascending by CRn, CRM, Op1, Op2
|
||||
* CRn denotes the primary register number, but is copied to the CRm in the
|
||||
* user space API for 64-bit register access in line with the terminology used
|
||||
* in the ARM ARM.
|
||||
* Important: Must be sorted ascending by CRn, CRM, Op1, Op2 and with 64-bit
|
||||
* registers preceding 32-bit ones.
|
||||
*/
|
||||
static const struct coproc_reg a15_regs[] = {
|
||||
/* MPIDR: we use VMPIDR for guest access. */
|
||||
|
@ -63,7 +63,8 @@ int kvm_handle_mmio_return(struct kvm_vcpu *vcpu, struct kvm_run *run)
|
||||
static int decode_hsr(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
|
||||
struct kvm_exit_mmio *mmio)
|
||||
{
|
||||
unsigned long rt, len;
|
||||
unsigned long rt;
|
||||
int len;
|
||||
bool is_write, sign_extend;
|
||||
|
||||
if (kvm_vcpu_dabt_isextabt(vcpu)) {
|
||||
|
@ -85,6 +85,12 @@ static void *mmu_memory_cache_alloc(struct kvm_mmu_memory_cache *mc)
|
||||
return p;
|
||||
}
|
||||
|
||||
static bool page_empty(void *ptr)
|
||||
{
|
||||
struct page *ptr_page = virt_to_page(ptr);
|
||||
return page_count(ptr_page) == 1;
|
||||
}
|
||||
|
||||
static void clear_pud_entry(struct kvm *kvm, pud_t *pud, phys_addr_t addr)
|
||||
{
|
||||
pmd_t *pmd_table = pmd_offset(pud, 0);
|
||||
@ -103,12 +109,6 @@ static void clear_pmd_entry(struct kvm *kvm, pmd_t *pmd, phys_addr_t addr)
|
||||
put_page(virt_to_page(pmd));
|
||||
}
|
||||
|
||||
static bool pmd_empty(pmd_t *pmd)
|
||||
{
|
||||
struct page *pmd_page = virt_to_page(pmd);
|
||||
return page_count(pmd_page) == 1;
|
||||
}
|
||||
|
||||
static void clear_pte_entry(struct kvm *kvm, pte_t *pte, phys_addr_t addr)
|
||||
{
|
||||
if (pte_present(*pte)) {
|
||||
@ -118,12 +118,6 @@ static void clear_pte_entry(struct kvm *kvm, pte_t *pte, phys_addr_t addr)
|
||||
}
|
||||
}
|
||||
|
||||
static bool pte_empty(pte_t *pte)
|
||||
{
|
||||
struct page *pte_page = virt_to_page(pte);
|
||||
return page_count(pte_page) == 1;
|
||||
}
|
||||
|
||||
static void unmap_range(struct kvm *kvm, pgd_t *pgdp,
|
||||
unsigned long long start, u64 size)
|
||||
{
|
||||
@ -132,37 +126,37 @@ static void unmap_range(struct kvm *kvm, pgd_t *pgdp,
|
||||
pmd_t *pmd;
|
||||
pte_t *pte;
|
||||
unsigned long long addr = start, end = start + size;
|
||||
u64 range;
|
||||
u64 next;
|
||||
|
||||
while (addr < end) {
|
||||
pgd = pgdp + pgd_index(addr);
|
||||
pud = pud_offset(pgd, addr);
|
||||
if (pud_none(*pud)) {
|
||||
addr += PUD_SIZE;
|
||||
addr = pud_addr_end(addr, end);
|
||||
continue;
|
||||
}
|
||||
|
||||
pmd = pmd_offset(pud, addr);
|
||||
if (pmd_none(*pmd)) {
|
||||
addr += PMD_SIZE;
|
||||
addr = pmd_addr_end(addr, end);
|
||||
continue;
|
||||
}
|
||||
|
||||
pte = pte_offset_kernel(pmd, addr);
|
||||
clear_pte_entry(kvm, pte, addr);
|
||||
range = PAGE_SIZE;
|
||||
next = addr + PAGE_SIZE;
|
||||
|
||||
/* If we emptied the pte, walk back up the ladder */
|
||||
if (pte_empty(pte)) {
|
||||
if (page_empty(pte)) {
|
||||
clear_pmd_entry(kvm, pmd, addr);
|
||||
range = PMD_SIZE;
|
||||
if (pmd_empty(pmd)) {
|
||||
next = pmd_addr_end(addr, end);
|
||||
if (page_empty(pmd) && !page_empty(pud)) {
|
||||
clear_pud_entry(kvm, pud, addr);
|
||||
range = PUD_SIZE;
|
||||
next = pud_addr_end(addr, end);
|
||||
}
|
||||
}
|
||||
|
||||
addr += range;
|
||||
addr = next;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -227,6 +227,8 @@ static struct clk_lookup periph_clocks_lookups[] = {
|
||||
CLKDEV_CON_DEV_ID("usart", "f8020000.serial", &usart1_clk),
|
||||
CLKDEV_CON_DEV_ID("usart", "f8024000.serial", &usart2_clk),
|
||||
CLKDEV_CON_DEV_ID("usart", "f8028000.serial", &usart3_clk),
|
||||
CLKDEV_CON_DEV_ID("usart", "f8040000.serial", &uart0_clk),
|
||||
CLKDEV_CON_DEV_ID("usart", "f8044000.serial", &uart1_clk),
|
||||
CLKDEV_CON_DEV_ID("t0_clk", "f8008000.timer", &tcb0_clk),
|
||||
CLKDEV_CON_DEV_ID("t0_clk", "f800c000.timer", &tcb0_clk),
|
||||
CLKDEV_CON_DEV_ID("mci_clk", "f0008000.mmc", &mmc0_clk),
|
||||
|
@ -75,6 +75,7 @@ static struct davinci_nand_pdata davinci_nand_data = {
|
||||
.parts = davinci_nand_partitions,
|
||||
.nr_parts = ARRAY_SIZE(davinci_nand_partitions),
|
||||
.ecc_mode = NAND_ECC_HW_SYNDROME,
|
||||
.ecc_bits = 4,
|
||||
.bbt_options = NAND_BBT_USE_FLASH,
|
||||
};
|
||||
|
||||
|
@ -153,6 +153,7 @@ static struct davinci_nand_pdata davinci_evm_nandflash_data = {
|
||||
.parts = davinci_evm_nandflash_partition,
|
||||
.nr_parts = ARRAY_SIZE(davinci_evm_nandflash_partition),
|
||||
.ecc_mode = NAND_ECC_HW,
|
||||
.ecc_bits = 1,
|
||||
.bbt_options = NAND_BBT_USE_FLASH,
|
||||
.timing = &davinci_evm_nandflash_timing,
|
||||
};
|
||||
|
@ -90,6 +90,7 @@ static struct davinci_nand_pdata davinci_nand_data = {
|
||||
.parts = davinci_nand_partitions,
|
||||
.nr_parts = ARRAY_SIZE(davinci_nand_partitions),
|
||||
.ecc_mode = NAND_ECC_HW,
|
||||
.ecc_bits = 1,
|
||||
.options = 0,
|
||||
};
|
||||
|
||||
|
@ -88,6 +88,7 @@ static struct davinci_nand_pdata davinci_ntosd2_nandflash_data = {
|
||||
.parts = davinci_ntosd2_nandflash_partition,
|
||||
.nr_parts = ARRAY_SIZE(davinci_ntosd2_nandflash_partition),
|
||||
.ecc_mode = NAND_ECC_HW,
|
||||
.ecc_bits = 1,
|
||||
.bbt_options = NAND_BBT_USE_FLASH,
|
||||
};
|
||||
|
||||
|
@ -122,11 +122,7 @@ static struct musb_hdrc_config musb_config = {
|
||||
};
|
||||
|
||||
static struct musb_hdrc_platform_data tusb_data = {
|
||||
#ifdef CONFIG_USB_GADGET_MUSB_HDRC
|
||||
.mode = MUSB_OTG,
|
||||
#else
|
||||
.mode = MUSB_HOST,
|
||||
#endif
|
||||
.set_power = tusb_set_power,
|
||||
.min_power = 25, /* x2 = 50 mA drawn from VBUS as peripheral */
|
||||
.power = 100, /* Max 100 mA VBUS for host mode */
|
||||
|
@ -85,7 +85,7 @@ static struct omap_board_mux board_mux[] __initdata = {
|
||||
|
||||
static struct omap_musb_board_data musb_board_data = {
|
||||
.interface_type = MUSB_INTERFACE_ULPI,
|
||||
.mode = MUSB_PERIPHERAL,
|
||||
.mode = MUSB_OTG,
|
||||
.power = 0,
|
||||
};
|
||||
|
||||
|
@ -38,11 +38,8 @@ static struct musb_hdrc_config musb_config = {
|
||||
};
|
||||
|
||||
static struct musb_hdrc_platform_data musb_plat = {
|
||||
#ifdef CONFIG_USB_GADGET_MUSB_HDRC
|
||||
.mode = MUSB_OTG,
|
||||
#else
|
||||
.mode = MUSB_HOST,
|
||||
#endif
|
||||
|
||||
/* .clock is set dynamically */
|
||||
.config = &musb_config,
|
||||
|
||||
|
@ -55,12 +55,13 @@ void __init s3c_init_cpu(unsigned long idcode,
|
||||
|
||||
printk("CPU %s (id 0x%08lx)\n", cpu->name, idcode);
|
||||
|
||||
if (cpu->map_io == NULL || cpu->init == NULL) {
|
||||
if (cpu->init == NULL) {
|
||||
printk(KERN_ERR "CPU %s support not enabled\n", cpu->name);
|
||||
panic("Unsupported Samsung CPU");
|
||||
}
|
||||
|
||||
cpu->map_io();
|
||||
if (cpu->map_io)
|
||||
cpu->map_io();
|
||||
}
|
||||
|
||||
/* s3c24xx_init_clocks
|
||||
|
@ -170,6 +170,7 @@ static void __init xen_percpu_init(void *unused)
|
||||
per_cpu(xen_vcpu, cpu) = vcpup;
|
||||
|
||||
enable_percpu_irq(xen_events_irq, 0);
|
||||
put_cpu();
|
||||
}
|
||||
|
||||
static void xen_restart(enum reboot_mode reboot_mode, const char *cmd)
|
||||
|
@ -42,14 +42,15 @@
|
||||
#define TPIDR_EL1 18 /* Thread ID, Privileged */
|
||||
#define AMAIR_EL1 19 /* Aux Memory Attribute Indirection Register */
|
||||
#define CNTKCTL_EL1 20 /* Timer Control Register (EL1) */
|
||||
#define PAR_EL1 21 /* Physical Address Register */
|
||||
/* 32bit specific registers. Keep them at the end of the range */
|
||||
#define DACR32_EL2 21 /* Domain Access Control Register */
|
||||
#define IFSR32_EL2 22 /* Instruction Fault Status Register */
|
||||
#define FPEXC32_EL2 23 /* Floating-Point Exception Control Register */
|
||||
#define DBGVCR32_EL2 24 /* Debug Vector Catch Register */
|
||||
#define TEECR32_EL1 25 /* ThumbEE Configuration Register */
|
||||
#define TEEHBR32_EL1 26 /* ThumbEE Handler Base Register */
|
||||
#define NR_SYS_REGS 27
|
||||
#define DACR32_EL2 22 /* Domain Access Control Register */
|
||||
#define IFSR32_EL2 23 /* Instruction Fault Status Register */
|
||||
#define FPEXC32_EL2 24 /* Floating-Point Exception Control Register */
|
||||
#define DBGVCR32_EL2 25 /* Debug Vector Catch Register */
|
||||
#define TEECR32_EL1 26 /* ThumbEE Configuration Register */
|
||||
#define TEEHBR32_EL1 27 /* ThumbEE Handler Base Register */
|
||||
#define NR_SYS_REGS 28
|
||||
|
||||
/* 32bit mapping */
|
||||
#define c0_MPIDR (MPIDR_EL1 * 2) /* MultiProcessor ID Register */
|
||||
@ -69,6 +70,8 @@
|
||||
#define c5_AIFSR (AFSR1_EL1 * 2) /* Auxiliary Instr Fault Status R */
|
||||
#define c6_DFAR (FAR_EL1 * 2) /* Data Fault Address Register */
|
||||
#define c6_IFAR (c6_DFAR + 1) /* Instruction Fault Address Register */
|
||||
#define c7_PAR (PAR_EL1 * 2) /* Physical Address Register */
|
||||
#define c7_PAR_high (c7_PAR + 1) /* PAR top 32 bits */
|
||||
#define c10_PRRR (MAIR_EL1 * 2) /* Primary Region Remap Register */
|
||||
#define c10_NMRR (c10_PRRR + 1) /* Normal Memory Remap Register */
|
||||
#define c12_VBAR (VBAR_EL1 * 2) /* Vector Base Address Register */
|
||||
|
@ -129,7 +129,7 @@ struct kvm_vcpu_arch {
|
||||
struct kvm_mmu_memory_cache mmu_page_cache;
|
||||
|
||||
/* Target CPU and feature flags */
|
||||
u32 target;
|
||||
int target;
|
||||
DECLARE_BITMAP(features, KVM_VCPU_MAX_FEATURES);
|
||||
|
||||
/* Detect first run of a vcpu */
|
||||
|
@ -107,7 +107,12 @@ armpmu_map_cache_event(const unsigned (*cache_map)
|
||||
static int
|
||||
armpmu_map_event(const unsigned (*event_map)[PERF_COUNT_HW_MAX], u64 config)
|
||||
{
|
||||
int mapping = (*event_map)[config];
|
||||
int mapping;
|
||||
|
||||
if (config >= PERF_COUNT_HW_MAX)
|
||||
return -EINVAL;
|
||||
|
||||
mapping = (*event_map)[config];
|
||||
return mapping == HW_OP_UNSUPPORTED ? -ENOENT : mapping;
|
||||
}
|
||||
|
||||
@ -317,6 +322,9 @@ validate_event(struct pmu_hw_events *hw_events,
|
||||
struct hw_perf_event fake_event = event->hw;
|
||||
struct pmu *leader_pmu = event->group_leader->pmu;
|
||||
|
||||
if (is_software_event(event))
|
||||
return 1;
|
||||
|
||||
if (event->pmu != leader_pmu || event->state <= PERF_EVENT_STATE_OFF)
|
||||
return 1;
|
||||
|
||||
|
@ -214,6 +214,7 @@ __kvm_hyp_code_start:
|
||||
mrs x21, tpidr_el1
|
||||
mrs x22, amair_el1
|
||||
mrs x23, cntkctl_el1
|
||||
mrs x24, par_el1
|
||||
|
||||
stp x4, x5, [x3]
|
||||
stp x6, x7, [x3, #16]
|
||||
@ -225,6 +226,7 @@ __kvm_hyp_code_start:
|
||||
stp x18, x19, [x3, #112]
|
||||
stp x20, x21, [x3, #128]
|
||||
stp x22, x23, [x3, #144]
|
||||
str x24, [x3, #160]
|
||||
.endm
|
||||
|
||||
.macro restore_sysregs
|
||||
@ -243,6 +245,7 @@ __kvm_hyp_code_start:
|
||||
ldp x18, x19, [x3, #112]
|
||||
ldp x20, x21, [x3, #128]
|
||||
ldp x22, x23, [x3, #144]
|
||||
ldr x24, [x3, #160]
|
||||
|
||||
msr vmpidr_el2, x4
|
||||
msr csselr_el1, x5
|
||||
@ -264,6 +267,7 @@ __kvm_hyp_code_start:
|
||||
msr tpidr_el1, x21
|
||||
msr amair_el1, x22
|
||||
msr cntkctl_el1, x23
|
||||
msr par_el1, x24
|
||||
.endm
|
||||
|
||||
.macro skip_32bit_state tmp, target
|
||||
@ -600,6 +604,8 @@ END(__kvm_vcpu_run)
|
||||
|
||||
// void __kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa);
|
||||
ENTRY(__kvm_tlb_flush_vmid_ipa)
|
||||
dsb ishst
|
||||
|
||||
kern_hyp_va x0
|
||||
ldr x2, [x0, #KVM_VTTBR]
|
||||
msr vttbr_el2, x2
|
||||
@ -621,6 +627,7 @@ ENTRY(__kvm_tlb_flush_vmid_ipa)
|
||||
ENDPROC(__kvm_tlb_flush_vmid_ipa)
|
||||
|
||||
ENTRY(__kvm_flush_vm_context)
|
||||
dsb ishst
|
||||
tlbi alle1is
|
||||
ic ialluis
|
||||
dsb sy
|
||||
@ -753,6 +760,10 @@ el1_trap:
|
||||
*/
|
||||
tbnz x1, #7, 1f // S1PTW is set
|
||||
|
||||
/* Preserve PAR_EL1 */
|
||||
mrs x3, par_el1
|
||||
push x3, xzr
|
||||
|
||||
/*
|
||||
* Permission fault, HPFAR_EL2 is invalid.
|
||||
* Resolve the IPA the hard way using the guest VA.
|
||||
@ -766,6 +777,8 @@ el1_trap:
|
||||
|
||||
/* Read result */
|
||||
mrs x3, par_el1
|
||||
pop x0, xzr // Restore PAR_EL1 from the stack
|
||||
msr par_el1, x0
|
||||
tbnz x3, #0, 3f // Bail out if we failed the translation
|
||||
ubfx x3, x3, #12, #36 // Extract IPA
|
||||
lsl x3, x3, #4 // and present it like HPFAR
|
||||
|
@ -211,6 +211,9 @@ static const struct sys_reg_desc sys_reg_descs[] = {
|
||||
/* FAR_EL1 */
|
||||
{ Op0(0b11), Op1(0b000), CRn(0b0110), CRm(0b0000), Op2(0b000),
|
||||
NULL, reset_unknown, FAR_EL1 },
|
||||
/* PAR_EL1 */
|
||||
{ Op0(0b11), Op1(0b000), CRn(0b0111), CRm(0b0100), Op2(0b000),
|
||||
NULL, reset_unknown, PAR_EL1 },
|
||||
|
||||
/* PMINTENSET_EL1 */
|
||||
{ Op0(0b11), Op1(0b000), CRn(0b1001), CRm(0b1110), Op2(0b001),
|
||||
|
@ -18,9 +18,11 @@
|
||||
#include <asm/machdep.h>
|
||||
#include <asm/natfeat.h>
|
||||
|
||||
extern long nf_get_id2(const char *feature_name);
|
||||
|
||||
asm("\n"
|
||||
" .global nf_get_id,nf_call\n"
|
||||
"nf_get_id:\n"
|
||||
" .global nf_get_id2,nf_call\n"
|
||||
"nf_get_id2:\n"
|
||||
" .short 0x7300\n"
|
||||
" rts\n"
|
||||
"nf_call:\n"
|
||||
@ -29,12 +31,25 @@ asm("\n"
|
||||
"1: moveq.l #0,%d0\n"
|
||||
" rts\n"
|
||||
" .section __ex_table,\"a\"\n"
|
||||
" .long nf_get_id,1b\n"
|
||||
" .long nf_get_id2,1b\n"
|
||||
" .long nf_call,1b\n"
|
||||
" .previous");
|
||||
EXPORT_SYMBOL_GPL(nf_get_id);
|
||||
EXPORT_SYMBOL_GPL(nf_call);
|
||||
|
||||
long nf_get_id(const char *feature_name)
|
||||
{
|
||||
/* feature_name may be in vmalloc()ed memory, so make a copy */
|
||||
char name_copy[32];
|
||||
size_t n;
|
||||
|
||||
n = strlcpy(name_copy, feature_name, sizeof(name_copy));
|
||||
if (n >= sizeof(name_copy))
|
||||
return 0;
|
||||
|
||||
return nf_get_id2(name_copy);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nf_get_id);
|
||||
|
||||
void nfprint(const char *fmt, ...)
|
||||
{
|
||||
static char buf[256];
|
||||
|
@ -15,16 +15,17 @@
|
||||
unsigned long long n64; \
|
||||
} __n; \
|
||||
unsigned long __rem, __upper; \
|
||||
unsigned long __base = (base); \
|
||||
\
|
||||
__n.n64 = (n); \
|
||||
if ((__upper = __n.n32[0])) { \
|
||||
asm ("divul.l %2,%1:%0" \
|
||||
: "=d" (__n.n32[0]), "=d" (__upper) \
|
||||
: "d" (base), "0" (__n.n32[0])); \
|
||||
: "=d" (__n.n32[0]), "=d" (__upper) \
|
||||
: "d" (__base), "0" (__n.n32[0])); \
|
||||
} \
|
||||
asm ("divu.l %2,%1:%0" \
|
||||
: "=d" (__n.n32[1]), "=d" (__rem) \
|
||||
: "d" (base), "1" (__upper), "0" (__n.n32[1])); \
|
||||
: "=d" (__n.n32[1]), "=d" (__rem) \
|
||||
: "d" (__base), "1" (__upper), "0" (__n.n32[1])); \
|
||||
(n) = __n.n64; \
|
||||
__rem; \
|
||||
})
|
||||
|
@ -803,6 +803,32 @@ static int isBranchInstr(struct pt_regs *regs, struct mm_decoded_insn dec_insn,
|
||||
dec_insn.next_pc_inc;
|
||||
return 1;
|
||||
break;
|
||||
#ifdef CONFIG_CPU_CAVIUM_OCTEON
|
||||
case lwc2_op: /* This is bbit0 on Octeon */
|
||||
if ((regs->regs[insn.i_format.rs] & (1ull<<insn.i_format.rt)) == 0)
|
||||
*contpc = regs->cp0_epc + 4 + (insn.i_format.simmediate << 2);
|
||||
else
|
||||
*contpc = regs->cp0_epc + 8;
|
||||
return 1;
|
||||
case ldc2_op: /* This is bbit032 on Octeon */
|
||||
if ((regs->regs[insn.i_format.rs] & (1ull<<(insn.i_format.rt + 32))) == 0)
|
||||
*contpc = regs->cp0_epc + 4 + (insn.i_format.simmediate << 2);
|
||||
else
|
||||
*contpc = regs->cp0_epc + 8;
|
||||
return 1;
|
||||
case swc2_op: /* This is bbit1 on Octeon */
|
||||
if (regs->regs[insn.i_format.rs] & (1ull<<insn.i_format.rt))
|
||||
*contpc = regs->cp0_epc + 4 + (insn.i_format.simmediate << 2);
|
||||
else
|
||||
*contpc = regs->cp0_epc + 8;
|
||||
return 1;
|
||||
case sdc2_op: /* This is bbit132 on Octeon */
|
||||
if (regs->regs[insn.i_format.rs] & (1ull<<(insn.i_format.rt + 32)))
|
||||
*contpc = regs->cp0_epc + 4 + (insn.i_format.simmediate << 2);
|
||||
else
|
||||
*contpc = regs->cp0_epc + 8;
|
||||
return 1;
|
||||
#endif
|
||||
case cop0_op:
|
||||
case cop1_op:
|
||||
case cop2_op:
|
||||
|
@ -32,7 +32,7 @@ struct mmu_gather {
|
||||
struct mm_struct *mm;
|
||||
struct mmu_table_batch *batch;
|
||||
unsigned int fullmm;
|
||||
unsigned long start, unsigned long end;
|
||||
unsigned long start, end;
|
||||
};
|
||||
|
||||
struct mmu_table_batch {
|
||||
|
@ -35,9 +35,9 @@ static void sanitize_boot_params(struct boot_params *boot_params)
|
||||
*/
|
||||
if (boot_params->sentinel) {
|
||||
/* fields in boot_params are left uninitialized, clear them */
|
||||
memset(&boot_params->olpc_ofw_header, 0,
|
||||
memset(&boot_params->ext_ramdisk_image, 0,
|
||||
(char *)&boot_params->efi_info -
|
||||
(char *)&boot_params->olpc_ofw_header);
|
||||
(char *)&boot_params->ext_ramdisk_image);
|
||||
memset(&boot_params->kbd_status, 0,
|
||||
(char *)&boot_params->hdr -
|
||||
(char *)&boot_params->kbd_status);
|
||||
|
@ -59,7 +59,7 @@ static inline u16 find_equiv_id(struct equiv_cpu_entry *equiv_cpu_table,
|
||||
|
||||
extern int __apply_microcode_amd(struct microcode_amd *mc_amd);
|
||||
extern int apply_microcode_amd(int cpu);
|
||||
extern enum ucode_state load_microcode_amd(int cpu, const u8 *data, size_t size);
|
||||
extern enum ucode_state load_microcode_amd(u8 family, const u8 *data, size_t size);
|
||||
|
||||
#ifdef CONFIG_MICROCODE_AMD_EARLY
|
||||
#ifdef CONFIG_X86_32
|
||||
|
@ -512,7 +512,7 @@ static void early_init_amd(struct cpuinfo_x86 *c)
|
||||
|
||||
static const int amd_erratum_383[];
|
||||
static const int amd_erratum_400[];
|
||||
static bool cpu_has_amd_erratum(const int *erratum);
|
||||
static bool cpu_has_amd_erratum(struct cpuinfo_x86 *cpu, const int *erratum);
|
||||
|
||||
static void init_amd(struct cpuinfo_x86 *c)
|
||||
{
|
||||
@ -729,11 +729,11 @@ static void init_amd(struct cpuinfo_x86 *c)
|
||||
value &= ~(1ULL << 24);
|
||||
wrmsrl_safe(MSR_AMD64_BU_CFG2, value);
|
||||
|
||||
if (cpu_has_amd_erratum(amd_erratum_383))
|
||||
if (cpu_has_amd_erratum(c, amd_erratum_383))
|
||||
set_cpu_bug(c, X86_BUG_AMD_TLB_MMATCH);
|
||||
}
|
||||
|
||||
if (cpu_has_amd_erratum(amd_erratum_400))
|
||||
if (cpu_has_amd_erratum(c, amd_erratum_400))
|
||||
set_cpu_bug(c, X86_BUG_AMD_APIC_C1E);
|
||||
|
||||
rdmsr_safe(MSR_AMD64_PATCH_LEVEL, &c->microcode, &dummy);
|
||||
@ -878,23 +878,13 @@ static const int amd_erratum_400[] =
|
||||
static const int amd_erratum_383[] =
|
||||
AMD_OSVW_ERRATUM(3, AMD_MODEL_RANGE(0x10, 0, 0, 0xff, 0xf));
|
||||
|
||||
static bool cpu_has_amd_erratum(const int *erratum)
|
||||
|
||||
static bool cpu_has_amd_erratum(struct cpuinfo_x86 *cpu, const int *erratum)
|
||||
{
|
||||
struct cpuinfo_x86 *cpu = __this_cpu_ptr(&cpu_info);
|
||||
int osvw_id = *erratum++;
|
||||
u32 range;
|
||||
u32 ms;
|
||||
|
||||
/*
|
||||
* If called early enough that current_cpu_data hasn't been initialized
|
||||
* yet, fall back to boot_cpu_data.
|
||||
*/
|
||||
if (cpu->x86 == 0)
|
||||
cpu = &boot_cpu_data;
|
||||
|
||||
if (cpu->x86_vendor != X86_VENDOR_AMD)
|
||||
return false;
|
||||
|
||||
if (osvw_id >= 0 && osvw_id < 65536 &&
|
||||
cpu_has(cpu, X86_FEATURE_OSVW)) {
|
||||
u64 osvw_len;
|
||||
|
@ -145,10 +145,9 @@ static int collect_cpu_info_amd(int cpu, struct cpu_signature *csig)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static unsigned int verify_patch_size(int cpu, u32 patch_size,
|
||||
static unsigned int verify_patch_size(u8 family, u32 patch_size,
|
||||
unsigned int size)
|
||||
{
|
||||
struct cpuinfo_x86 *c = &cpu_data(cpu);
|
||||
u32 max_size;
|
||||
|
||||
#define F1XH_MPB_MAX_SIZE 2048
|
||||
@ -156,7 +155,7 @@ static unsigned int verify_patch_size(int cpu, u32 patch_size,
|
||||
#define F15H_MPB_MAX_SIZE 4096
|
||||
#define F16H_MPB_MAX_SIZE 3458
|
||||
|
||||
switch (c->x86) {
|
||||
switch (family) {
|
||||
case 0x14:
|
||||
max_size = F14H_MPB_MAX_SIZE;
|
||||
break;
|
||||
@ -277,9 +276,8 @@ static void cleanup(void)
|
||||
* driver cannot continue functioning normally. In such cases, we tear
|
||||
* down everything we've used up so far and exit.
|
||||
*/
|
||||
static int verify_and_add_patch(unsigned int cpu, u8 *fw, unsigned int leftover)
|
||||
static int verify_and_add_patch(u8 family, u8 *fw, unsigned int leftover)
|
||||
{
|
||||
struct cpuinfo_x86 *c = &cpu_data(cpu);
|
||||
struct microcode_header_amd *mc_hdr;
|
||||
struct ucode_patch *patch;
|
||||
unsigned int patch_size, crnt_size, ret;
|
||||
@ -299,7 +297,7 @@ static int verify_and_add_patch(unsigned int cpu, u8 *fw, unsigned int leftover)
|
||||
|
||||
/* check if patch is for the current family */
|
||||
proc_fam = ((proc_fam >> 8) & 0xf) + ((proc_fam >> 20) & 0xff);
|
||||
if (proc_fam != c->x86)
|
||||
if (proc_fam != family)
|
||||
return crnt_size;
|
||||
|
||||
if (mc_hdr->nb_dev_id || mc_hdr->sb_dev_id) {
|
||||
@ -308,7 +306,7 @@ static int verify_and_add_patch(unsigned int cpu, u8 *fw, unsigned int leftover)
|
||||
return crnt_size;
|
||||
}
|
||||
|
||||
ret = verify_patch_size(cpu, patch_size, leftover);
|
||||
ret = verify_patch_size(family, patch_size, leftover);
|
||||
if (!ret) {
|
||||
pr_err("Patch-ID 0x%08x: size mismatch.\n", mc_hdr->patch_id);
|
||||
return crnt_size;
|
||||
@ -339,7 +337,8 @@ static int verify_and_add_patch(unsigned int cpu, u8 *fw, unsigned int leftover)
|
||||
return crnt_size;
|
||||
}
|
||||
|
||||
static enum ucode_state __load_microcode_amd(int cpu, const u8 *data, size_t size)
|
||||
static enum ucode_state __load_microcode_amd(u8 family, const u8 *data,
|
||||
size_t size)
|
||||
{
|
||||
enum ucode_state ret = UCODE_ERROR;
|
||||
unsigned int leftover;
|
||||
@ -362,7 +361,7 @@ static enum ucode_state __load_microcode_amd(int cpu, const u8 *data, size_t siz
|
||||
}
|
||||
|
||||
while (leftover) {
|
||||
crnt_size = verify_and_add_patch(cpu, fw, leftover);
|
||||
crnt_size = verify_and_add_patch(family, fw, leftover);
|
||||
if (crnt_size < 0)
|
||||
return ret;
|
||||
|
||||
@ -373,22 +372,22 @@ static enum ucode_state __load_microcode_amd(int cpu, const u8 *data, size_t siz
|
||||
return UCODE_OK;
|
||||
}
|
||||
|
||||
enum ucode_state load_microcode_amd(int cpu, const u8 *data, size_t size)
|
||||
enum ucode_state load_microcode_amd(u8 family, const u8 *data, size_t size)
|
||||
{
|
||||
enum ucode_state ret;
|
||||
|
||||
/* free old equiv table */
|
||||
free_equiv_cpu_table();
|
||||
|
||||
ret = __load_microcode_amd(cpu, data, size);
|
||||
ret = __load_microcode_amd(family, data, size);
|
||||
|
||||
if (ret != UCODE_OK)
|
||||
cleanup();
|
||||
|
||||
#if defined(CONFIG_MICROCODE_AMD_EARLY) && defined(CONFIG_X86_32)
|
||||
/* save BSP's matching patch for early load */
|
||||
if (cpu_data(cpu).cpu_index == boot_cpu_data.cpu_index) {
|
||||
struct ucode_patch *p = find_patch(cpu);
|
||||
if (cpu_data(smp_processor_id()).cpu_index == boot_cpu_data.cpu_index) {
|
||||
struct ucode_patch *p = find_patch(smp_processor_id());
|
||||
if (p) {
|
||||
memset(amd_bsp_mpb, 0, MPB_MAX_SIZE);
|
||||
memcpy(amd_bsp_mpb, p->data, min_t(u32, ksize(p->data),
|
||||
@ -441,7 +440,7 @@ static enum ucode_state request_microcode_amd(int cpu, struct device *device,
|
||||
goto fw_release;
|
||||
}
|
||||
|
||||
ret = load_microcode_amd(cpu, fw->data, fw->size);
|
||||
ret = load_microcode_amd(c->x86, fw->data, fw->size);
|
||||
|
||||
fw_release:
|
||||
release_firmware(fw);
|
||||
|
@ -238,25 +238,17 @@ static void __init collect_cpu_sig_on_bsp(void *arg)
|
||||
uci->cpu_sig.sig = cpuid_eax(0x00000001);
|
||||
}
|
||||
#else
|
||||
static void collect_cpu_info_amd_early(struct cpuinfo_x86 *c,
|
||||
struct ucode_cpu_info *uci)
|
||||
void load_ucode_amd_ap(void)
|
||||
{
|
||||
unsigned int cpu = smp_processor_id();
|
||||
struct ucode_cpu_info *uci = ucode_cpu_info + cpu;
|
||||
u32 rev, eax;
|
||||
|
||||
rdmsr(MSR_AMD64_PATCH_LEVEL, rev, eax);
|
||||
eax = cpuid_eax(0x00000001);
|
||||
|
||||
uci->cpu_sig.sig = eax;
|
||||
uci->cpu_sig.rev = rev;
|
||||
c->microcode = rev;
|
||||
c->x86 = ((eax >> 8) & 0xf) + ((eax >> 20) & 0xff);
|
||||
}
|
||||
|
||||
void load_ucode_amd_ap(void)
|
||||
{
|
||||
unsigned int cpu = smp_processor_id();
|
||||
|
||||
collect_cpu_info_amd_early(&cpu_data(cpu), ucode_cpu_info + cpu);
|
||||
uci->cpu_sig.sig = eax;
|
||||
|
||||
if (cpu && !ucode_loaded) {
|
||||
void *ucode;
|
||||
@ -265,8 +257,10 @@ void load_ucode_amd_ap(void)
|
||||
return;
|
||||
|
||||
ucode = (void *)(initrd_start + ucode_offset);
|
||||
if (load_microcode_amd(0, ucode, ucode_size) != UCODE_OK)
|
||||
eax = ((eax >> 8) & 0xf) + ((eax >> 20) & 0xff);
|
||||
if (load_microcode_amd(eax, ucode, ucode_size) != UCODE_OK)
|
||||
return;
|
||||
|
||||
ucode_loaded = true;
|
||||
}
|
||||
|
||||
@ -278,6 +272,8 @@ int __init save_microcode_in_initrd_amd(void)
|
||||
{
|
||||
enum ucode_state ret;
|
||||
void *ucode;
|
||||
u32 eax;
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
unsigned int bsp = boot_cpu_data.cpu_index;
|
||||
struct ucode_cpu_info *uci = ucode_cpu_info + bsp;
|
||||
@ -293,7 +289,10 @@ int __init save_microcode_in_initrd_amd(void)
|
||||
return 0;
|
||||
|
||||
ucode = (void *)(initrd_start + ucode_offset);
|
||||
ret = load_microcode_amd(0, ucode, ucode_size);
|
||||
eax = cpuid_eax(0x00000001);
|
||||
eax = ((eax >> 8) & 0xf) + ((eax >> 20) & 0xff);
|
||||
|
||||
ret = load_microcode_amd(eax, ucode, ucode_size);
|
||||
if (ret != UCODE_OK)
|
||||
return -EINVAL;
|
||||
|
||||
|
@ -101,7 +101,7 @@ static void find_start_end(unsigned long flags, unsigned long *begin,
|
||||
*begin = new_begin;
|
||||
}
|
||||
} else {
|
||||
*begin = mmap_legacy_base();
|
||||
*begin = current->mm->mmap_legacy_base;
|
||||
*end = TASK_SIZE;
|
||||
}
|
||||
}
|
||||
|
@ -98,7 +98,7 @@ static unsigned long mmap_base(void)
|
||||
* Bottom-up (legacy) layout on X86_32 did not support randomization, X86_64
|
||||
* does, but not when emulating X86_32
|
||||
*/
|
||||
unsigned long mmap_legacy_base(void)
|
||||
static unsigned long mmap_legacy_base(void)
|
||||
{
|
||||
if (mmap_is_ia32())
|
||||
return TASK_UNMAPPED_BASE;
|
||||
@ -112,11 +112,13 @@ unsigned long mmap_legacy_base(void)
|
||||
*/
|
||||
void arch_pick_mmap_layout(struct mm_struct *mm)
|
||||
{
|
||||
mm->mmap_legacy_base = mmap_legacy_base();
|
||||
mm->mmap_base = mmap_base();
|
||||
|
||||
if (mmap_is_legacy()) {
|
||||
mm->mmap_base = mmap_legacy_base();
|
||||
mm->mmap_base = mm->mmap_legacy_base;
|
||||
mm->get_unmapped_area = arch_get_unmapped_area;
|
||||
} else {
|
||||
mm->mmap_base = mmap_base();
|
||||
mm->get_unmapped_area = arch_get_unmapped_area_topdown;
|
||||
}
|
||||
}
|
||||
|
@ -313,6 +313,17 @@ static void xen_align_and_add_e820_region(u64 start, u64 size, int type)
|
||||
e820_add_region(start, end - start, type);
|
||||
}
|
||||
|
||||
void xen_ignore_unusable(struct e820entry *list, size_t map_size)
|
||||
{
|
||||
struct e820entry *entry;
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0, entry = list; i < map_size; i++, entry++) {
|
||||
if (entry->type == E820_UNUSABLE)
|
||||
entry->type = E820_RAM;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* machine_specific_memory_setup - Hook for machine specific memory setup.
|
||||
**/
|
||||
@ -353,6 +364,17 @@ char * __init xen_memory_setup(void)
|
||||
}
|
||||
BUG_ON(rc);
|
||||
|
||||
/*
|
||||
* Xen won't allow a 1:1 mapping to be created to UNUSABLE
|
||||
* regions, so if we're using the machine memory map leave the
|
||||
* region as RAM as it is in the pseudo-physical map.
|
||||
*
|
||||
* UNUSABLE regions in domUs are not handled and will need
|
||||
* a patch in the future.
|
||||
*/
|
||||
if (xen_initial_domain())
|
||||
xen_ignore_unusable(map, memmap.nr_entries);
|
||||
|
||||
/* Make sure the Xen-supplied memory map is well-ordered. */
|
||||
sanitize_e820_map(map, memmap.nr_entries, &memmap.nr_entries);
|
||||
|
||||
|
@ -694,8 +694,15 @@ static void __init xen_hvm_smp_prepare_cpus(unsigned int max_cpus)
|
||||
static int xen_hvm_cpu_up(unsigned int cpu, struct task_struct *tidle)
|
||||
{
|
||||
int rc;
|
||||
rc = native_cpu_up(cpu, tidle);
|
||||
WARN_ON (xen_smp_intr_init(cpu));
|
||||
/*
|
||||
* xen_smp_intr_init() needs to run before native_cpu_up()
|
||||
* so that IPI vectors are set up on the booting CPU before
|
||||
* it is marked online in native_cpu_up().
|
||||
*/
|
||||
rc = xen_smp_intr_init(cpu);
|
||||
WARN_ON(rc);
|
||||
if (!rc)
|
||||
rc = native_cpu_up(cpu, tidle);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -85,9 +85,17 @@ static void i915_gem_unmap_dma_buf(struct dma_buf_attachment *attachment,
|
||||
struct sg_table *sg,
|
||||
enum dma_data_direction dir)
|
||||
{
|
||||
struct drm_i915_gem_object *obj = attachment->dmabuf->priv;
|
||||
|
||||
mutex_lock(&obj->base.dev->struct_mutex);
|
||||
|
||||
dma_unmap_sg(attachment->dev, sg->sgl, sg->nents, dir);
|
||||
sg_free_table(sg);
|
||||
kfree(sg);
|
||||
|
||||
i915_gem_object_unpin_pages(obj);
|
||||
|
||||
mutex_unlock(&obj->base.dev->struct_mutex);
|
||||
}
|
||||
|
||||
static void i915_gem_dmabuf_release(struct dma_buf *dma_buf)
|
||||
|
@ -10042,6 +10042,8 @@ struct intel_display_error_state {
|
||||
|
||||
u32 power_well_driver;
|
||||
|
||||
int num_transcoders;
|
||||
|
||||
struct intel_cursor_error_state {
|
||||
u32 control;
|
||||
u32 position;
|
||||
@ -10050,16 +10052,7 @@ struct intel_display_error_state {
|
||||
} cursor[I915_MAX_PIPES];
|
||||
|
||||
struct intel_pipe_error_state {
|
||||
enum transcoder cpu_transcoder;
|
||||
u32 conf;
|
||||
u32 source;
|
||||
|
||||
u32 htotal;
|
||||
u32 hblank;
|
||||
u32 hsync;
|
||||
u32 vtotal;
|
||||
u32 vblank;
|
||||
u32 vsync;
|
||||
} pipe[I915_MAX_PIPES];
|
||||
|
||||
struct intel_plane_error_state {
|
||||
@ -10071,6 +10064,19 @@ struct intel_display_error_state {
|
||||
u32 surface;
|
||||
u32 tile_offset;
|
||||
} plane[I915_MAX_PIPES];
|
||||
|
||||
struct intel_transcoder_error_state {
|
||||
enum transcoder cpu_transcoder;
|
||||
|
||||
u32 conf;
|
||||
|
||||
u32 htotal;
|
||||
u32 hblank;
|
||||
u32 hsync;
|
||||
u32 vtotal;
|
||||
u32 vblank;
|
||||
u32 vsync;
|
||||
} transcoder[4];
|
||||
};
|
||||
|
||||
struct intel_display_error_state *
|
||||
@ -10078,9 +10084,17 @@ intel_display_capture_error_state(struct drm_device *dev)
|
||||
{
|
||||
drm_i915_private_t *dev_priv = dev->dev_private;
|
||||
struct intel_display_error_state *error;
|
||||
enum transcoder cpu_transcoder;
|
||||
int transcoders[] = {
|
||||
TRANSCODER_A,
|
||||
TRANSCODER_B,
|
||||
TRANSCODER_C,
|
||||
TRANSCODER_EDP,
|
||||
};
|
||||
int i;
|
||||
|
||||
if (INTEL_INFO(dev)->num_pipes == 0)
|
||||
return NULL;
|
||||
|
||||
error = kmalloc(sizeof(*error), GFP_ATOMIC);
|
||||
if (error == NULL)
|
||||
return NULL;
|
||||
@ -10089,9 +10103,6 @@ intel_display_capture_error_state(struct drm_device *dev)
|
||||
error->power_well_driver = I915_READ(HSW_PWR_WELL_DRIVER);
|
||||
|
||||
for_each_pipe(i) {
|
||||
cpu_transcoder = intel_pipe_to_cpu_transcoder(dev_priv, i);
|
||||
error->pipe[i].cpu_transcoder = cpu_transcoder;
|
||||
|
||||
if (INTEL_INFO(dev)->gen <= 6 || IS_VALLEYVIEW(dev)) {
|
||||
error->cursor[i].control = I915_READ(CURCNTR(i));
|
||||
error->cursor[i].position = I915_READ(CURPOS(i));
|
||||
@ -10115,14 +10126,25 @@ intel_display_capture_error_state(struct drm_device *dev)
|
||||
error->plane[i].tile_offset = I915_READ(DSPTILEOFF(i));
|
||||
}
|
||||
|
||||
error->pipe[i].conf = I915_READ(PIPECONF(cpu_transcoder));
|
||||
error->pipe[i].source = I915_READ(PIPESRC(i));
|
||||
error->pipe[i].htotal = I915_READ(HTOTAL(cpu_transcoder));
|
||||
error->pipe[i].hblank = I915_READ(HBLANK(cpu_transcoder));
|
||||
error->pipe[i].hsync = I915_READ(HSYNC(cpu_transcoder));
|
||||
error->pipe[i].vtotal = I915_READ(VTOTAL(cpu_transcoder));
|
||||
error->pipe[i].vblank = I915_READ(VBLANK(cpu_transcoder));
|
||||
error->pipe[i].vsync = I915_READ(VSYNC(cpu_transcoder));
|
||||
}
|
||||
|
||||
error->num_transcoders = INTEL_INFO(dev)->num_pipes;
|
||||
if (HAS_DDI(dev_priv->dev))
|
||||
error->num_transcoders++; /* Account for eDP. */
|
||||
|
||||
for (i = 0; i < error->num_transcoders; i++) {
|
||||
enum transcoder cpu_transcoder = transcoders[i];
|
||||
|
||||
error->transcoder[i].cpu_transcoder = cpu_transcoder;
|
||||
|
||||
error->transcoder[i].conf = I915_READ(PIPECONF(cpu_transcoder));
|
||||
error->transcoder[i].htotal = I915_READ(HTOTAL(cpu_transcoder));
|
||||
error->transcoder[i].hblank = I915_READ(HBLANK(cpu_transcoder));
|
||||
error->transcoder[i].hsync = I915_READ(HSYNC(cpu_transcoder));
|
||||
error->transcoder[i].vtotal = I915_READ(VTOTAL(cpu_transcoder));
|
||||
error->transcoder[i].vblank = I915_READ(VBLANK(cpu_transcoder));
|
||||
error->transcoder[i].vsync = I915_READ(VSYNC(cpu_transcoder));
|
||||
}
|
||||
|
||||
/* In the code above we read the registers without checking if the power
|
||||
@ -10144,22 +10166,16 @@ intel_display_print_error_state(struct drm_i915_error_state_buf *m,
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!error)
|
||||
return;
|
||||
|
||||
err_printf(m, "Num Pipes: %d\n", INTEL_INFO(dev)->num_pipes);
|
||||
if (HAS_POWER_WELL(dev))
|
||||
err_printf(m, "PWR_WELL_CTL2: %08x\n",
|
||||
error->power_well_driver);
|
||||
for_each_pipe(i) {
|
||||
err_printf(m, "Pipe [%d]:\n", i);
|
||||
err_printf(m, " CPU transcoder: %c\n",
|
||||
transcoder_name(error->pipe[i].cpu_transcoder));
|
||||
err_printf(m, " CONF: %08x\n", error->pipe[i].conf);
|
||||
err_printf(m, " SRC: %08x\n", error->pipe[i].source);
|
||||
err_printf(m, " HTOTAL: %08x\n", error->pipe[i].htotal);
|
||||
err_printf(m, " HBLANK: %08x\n", error->pipe[i].hblank);
|
||||
err_printf(m, " HSYNC: %08x\n", error->pipe[i].hsync);
|
||||
err_printf(m, " VTOTAL: %08x\n", error->pipe[i].vtotal);
|
||||
err_printf(m, " VBLANK: %08x\n", error->pipe[i].vblank);
|
||||
err_printf(m, " VSYNC: %08x\n", error->pipe[i].vsync);
|
||||
|
||||
err_printf(m, "Plane [%d]:\n", i);
|
||||
err_printf(m, " CNTR: %08x\n", error->plane[i].control);
|
||||
@ -10180,5 +10196,17 @@ intel_display_print_error_state(struct drm_i915_error_state_buf *m,
|
||||
err_printf(m, " POS: %08x\n", error->cursor[i].position);
|
||||
err_printf(m, " BASE: %08x\n", error->cursor[i].base);
|
||||
}
|
||||
|
||||
for (i = 0; i < error->num_transcoders; i++) {
|
||||
err_printf(m, " CPU transcoder: %c\n",
|
||||
transcoder_name(error->transcoder[i].cpu_transcoder));
|
||||
err_printf(m, " CONF: %08x\n", error->transcoder[i].conf);
|
||||
err_printf(m, " HTOTAL: %08x\n", error->transcoder[i].htotal);
|
||||
err_printf(m, " HBLANK: %08x\n", error->transcoder[i].hblank);
|
||||
err_printf(m, " HSYNC: %08x\n", error->transcoder[i].hsync);
|
||||
err_printf(m, " VTOTAL: %08x\n", error->transcoder[i].vtotal);
|
||||
err_printf(m, " VBLANK: %08x\n", error->transcoder[i].vblank);
|
||||
err_printf(m, " VSYNC: %08x\n", error->transcoder[i].vsync);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
@ -2163,7 +2163,7 @@ void cik_mm_wdoorbell(struct radeon_device *rdev, u32 offset, u32 v);
|
||||
WREG32(reg, tmp_); \
|
||||
} while (0)
|
||||
#define WREG32_AND(reg, and) WREG32_P(reg, 0, and)
|
||||
#define WREG32_OR(reg, or) WREG32_P(reg, or, ~or)
|
||||
#define WREG32_OR(reg, or) WREG32_P(reg, or, ~(or))
|
||||
#define WREG32_PLL_P(reg, val, mask) \
|
||||
do { \
|
||||
uint32_t tmp_ = RREG32_PLL(reg); \
|
||||
|
@ -356,6 +356,14 @@ static int radeon_uvd_cs_msg(struct radeon_cs_parser *p, struct radeon_bo *bo,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (bo->tbo.sync_obj) {
|
||||
r = radeon_fence_wait(bo->tbo.sync_obj, false);
|
||||
if (r) {
|
||||
DRM_ERROR("Failed waiting for UVD message (%d)!\n", r);
|
||||
return r;
|
||||
}
|
||||
}
|
||||
|
||||
r = radeon_bo_kmap(bo, &ptr);
|
||||
if (r) {
|
||||
DRM_ERROR("Failed mapping the UVD message (%d)!\n", r);
|
||||
|
@ -744,10 +744,10 @@ static void rv770_init_golden_registers(struct radeon_device *rdev)
|
||||
(const u32)ARRAY_SIZE(r7xx_golden_dyn_gpr_registers));
|
||||
radeon_program_register_sequence(rdev,
|
||||
rv730_golden_registers,
|
||||
(const u32)ARRAY_SIZE(rv770_golden_registers));
|
||||
(const u32)ARRAY_SIZE(rv730_golden_registers));
|
||||
radeon_program_register_sequence(rdev,
|
||||
rv730_mgcg_init,
|
||||
(const u32)ARRAY_SIZE(rv770_mgcg_init));
|
||||
(const u32)ARRAY_SIZE(rv730_mgcg_init));
|
||||
break;
|
||||
case CHIP_RV710:
|
||||
radeon_program_register_sequence(rdev,
|
||||
@ -758,18 +758,18 @@ static void rv770_init_golden_registers(struct radeon_device *rdev)
|
||||
(const u32)ARRAY_SIZE(r7xx_golden_dyn_gpr_registers));
|
||||
radeon_program_register_sequence(rdev,
|
||||
rv710_golden_registers,
|
||||
(const u32)ARRAY_SIZE(rv770_golden_registers));
|
||||
(const u32)ARRAY_SIZE(rv710_golden_registers));
|
||||
radeon_program_register_sequence(rdev,
|
||||
rv710_mgcg_init,
|
||||
(const u32)ARRAY_SIZE(rv770_mgcg_init));
|
||||
(const u32)ARRAY_SIZE(rv710_mgcg_init));
|
||||
break;
|
||||
case CHIP_RV740:
|
||||
radeon_program_register_sequence(rdev,
|
||||
rv740_golden_registers,
|
||||
(const u32)ARRAY_SIZE(rv770_golden_registers));
|
||||
(const u32)ARRAY_SIZE(rv740_golden_registers));
|
||||
radeon_program_register_sequence(rdev,
|
||||
rv740_mgcg_init,
|
||||
(const u32)ARRAY_SIZE(rv770_mgcg_init));
|
||||
(const u32)ARRAY_SIZE(rv740_mgcg_init));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -959,23 +959,21 @@ out:
|
||||
return r;
|
||||
}
|
||||
|
||||
static void remove_mapping(struct mq_policy *mq, dm_oblock_t oblock)
|
||||
static void mq_remove_mapping(struct dm_cache_policy *p, dm_oblock_t oblock)
|
||||
{
|
||||
struct entry *e = hash_lookup(mq, oblock);
|
||||
struct mq_policy *mq = to_mq_policy(p);
|
||||
struct entry *e;
|
||||
|
||||
mutex_lock(&mq->lock);
|
||||
|
||||
e = hash_lookup(mq, oblock);
|
||||
|
||||
BUG_ON(!e || !e->in_cache);
|
||||
|
||||
del(mq, e);
|
||||
e->in_cache = false;
|
||||
push(mq, e);
|
||||
}
|
||||
|
||||
static void mq_remove_mapping(struct dm_cache_policy *p, dm_oblock_t oblock)
|
||||
{
|
||||
struct mq_policy *mq = to_mq_policy(p);
|
||||
|
||||
mutex_lock(&mq->lock);
|
||||
remove_mapping(mq, oblock);
|
||||
mutex_unlock(&mq->lock);
|
||||
}
|
||||
|
||||
|
@ -1333,6 +1333,8 @@ enum {
|
||||
BNX2X_SP_RTNL_VFPF_CHANNEL_DOWN,
|
||||
BNX2X_SP_RTNL_RX_MODE,
|
||||
BNX2X_SP_RTNL_HYPERVISOR_VLAN,
|
||||
BNX2X_SP_RTNL_TX_STOP,
|
||||
BNX2X_SP_RTNL_TX_RESUME,
|
||||
};
|
||||
|
||||
struct bnx2x_prev_path_list {
|
||||
|
@ -30,10 +30,8 @@
|
||||
#include "bnx2x_dcb.h"
|
||||
|
||||
/* forward declarations of dcbx related functions */
|
||||
static int bnx2x_dcbx_stop_hw_tx(struct bnx2x *bp);
|
||||
static void bnx2x_pfc_set_pfc(struct bnx2x *bp);
|
||||
static void bnx2x_dcbx_update_ets_params(struct bnx2x *bp);
|
||||
static int bnx2x_dcbx_resume_hw_tx(struct bnx2x *bp);
|
||||
static void bnx2x_dcbx_get_ets_pri_pg_tbl(struct bnx2x *bp,
|
||||
u32 *set_configuration_ets_pg,
|
||||
u32 *pri_pg_tbl);
|
||||
@ -425,30 +423,52 @@ static void bnx2x_pfc_set_pfc(struct bnx2x *bp)
|
||||
bnx2x_pfc_clear(bp);
|
||||
}
|
||||
|
||||
static int bnx2x_dcbx_stop_hw_tx(struct bnx2x *bp)
|
||||
int bnx2x_dcbx_stop_hw_tx(struct bnx2x *bp)
|
||||
{
|
||||
struct bnx2x_func_state_params func_params = {NULL};
|
||||
int rc;
|
||||
|
||||
func_params.f_obj = &bp->func_obj;
|
||||
func_params.cmd = BNX2X_F_CMD_TX_STOP;
|
||||
|
||||
__set_bit(RAMROD_COMP_WAIT, &func_params.ramrod_flags);
|
||||
__set_bit(RAMROD_RETRY, &func_params.ramrod_flags);
|
||||
|
||||
DP(BNX2X_MSG_DCB, "STOP TRAFFIC\n");
|
||||
return bnx2x_func_state_change(bp, &func_params);
|
||||
|
||||
rc = bnx2x_func_state_change(bp, &func_params);
|
||||
if (rc) {
|
||||
BNX2X_ERR("Unable to hold traffic for HW configuration\n");
|
||||
bnx2x_panic();
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int bnx2x_dcbx_resume_hw_tx(struct bnx2x *bp)
|
||||
int bnx2x_dcbx_resume_hw_tx(struct bnx2x *bp)
|
||||
{
|
||||
struct bnx2x_func_state_params func_params = {NULL};
|
||||
struct bnx2x_func_tx_start_params *tx_params =
|
||||
&func_params.params.tx_start;
|
||||
int rc;
|
||||
|
||||
func_params.f_obj = &bp->func_obj;
|
||||
func_params.cmd = BNX2X_F_CMD_TX_START;
|
||||
|
||||
__set_bit(RAMROD_COMP_WAIT, &func_params.ramrod_flags);
|
||||
__set_bit(RAMROD_RETRY, &func_params.ramrod_flags);
|
||||
|
||||
bnx2x_dcbx_fw_struct(bp, tx_params);
|
||||
|
||||
DP(BNX2X_MSG_DCB, "START TRAFFIC\n");
|
||||
return bnx2x_func_state_change(bp, &func_params);
|
||||
|
||||
rc = bnx2x_func_state_change(bp, &func_params);
|
||||
if (rc) {
|
||||
BNX2X_ERR("Unable to resume traffic after HW configuration\n");
|
||||
bnx2x_panic();
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static void bnx2x_dcbx_2cos_limit_update_ets_config(struct bnx2x *bp)
|
||||
@ -744,7 +764,9 @@ void bnx2x_dcbx_set_params(struct bnx2x *bp, u32 state)
|
||||
if (IS_MF(bp))
|
||||
bnx2x_link_sync_notify(bp);
|
||||
|
||||
bnx2x_dcbx_stop_hw_tx(bp);
|
||||
set_bit(BNX2X_SP_RTNL_TX_STOP, &bp->sp_rtnl_state);
|
||||
|
||||
schedule_delayed_work(&bp->sp_rtnl_task, 0);
|
||||
|
||||
return;
|
||||
}
|
||||
@ -757,7 +779,9 @@ void bnx2x_dcbx_set_params(struct bnx2x *bp, u32 state)
|
||||
/* ets may affect cmng configuration: reinit it in hw */
|
||||
bnx2x_set_local_cmng(bp);
|
||||
|
||||
bnx2x_dcbx_resume_hw_tx(bp);
|
||||
set_bit(BNX2X_SP_RTNL_TX_RESUME, &bp->sp_rtnl_state);
|
||||
|
||||
schedule_delayed_work(&bp->sp_rtnl_task, 0);
|
||||
|
||||
return;
|
||||
case BNX2X_DCBX_STATE_TX_RELEASED:
|
||||
@ -2367,21 +2391,24 @@ static u8 bnx2x_dcbnl_get_featcfg(struct net_device *netdev, int featid,
|
||||
case DCB_FEATCFG_ATTR_PG:
|
||||
if (bp->dcbx_local_feat.ets.enabled)
|
||||
*flags |= DCB_FEATCFG_ENABLE;
|
||||
if (bp->dcbx_error & DCBX_LOCAL_ETS_ERROR)
|
||||
if (bp->dcbx_error & (DCBX_LOCAL_ETS_ERROR |
|
||||
DCBX_REMOTE_MIB_ERROR))
|
||||
*flags |= DCB_FEATCFG_ERROR;
|
||||
break;
|
||||
case DCB_FEATCFG_ATTR_PFC:
|
||||
if (bp->dcbx_local_feat.pfc.enabled)
|
||||
*flags |= DCB_FEATCFG_ENABLE;
|
||||
if (bp->dcbx_error & (DCBX_LOCAL_PFC_ERROR |
|
||||
DCBX_LOCAL_PFC_MISMATCH))
|
||||
DCBX_LOCAL_PFC_MISMATCH |
|
||||
DCBX_REMOTE_MIB_ERROR))
|
||||
*flags |= DCB_FEATCFG_ERROR;
|
||||
break;
|
||||
case DCB_FEATCFG_ATTR_APP:
|
||||
if (bp->dcbx_local_feat.app.enabled)
|
||||
*flags |= DCB_FEATCFG_ENABLE;
|
||||
if (bp->dcbx_error & (DCBX_LOCAL_APP_ERROR |
|
||||
DCBX_LOCAL_APP_MISMATCH))
|
||||
DCBX_LOCAL_APP_MISMATCH |
|
||||
DCBX_REMOTE_MIB_ERROR))
|
||||
*flags |= DCB_FEATCFG_ERROR;
|
||||
break;
|
||||
default:
|
||||
|
@ -199,4 +199,7 @@ extern const struct dcbnl_rtnl_ops bnx2x_dcbnl_ops;
|
||||
int bnx2x_dcbnl_update_applist(struct bnx2x *bp, bool delall);
|
||||
#endif /* BCM_DCBNL */
|
||||
|
||||
int bnx2x_dcbx_stop_hw_tx(struct bnx2x *bp);
|
||||
int bnx2x_dcbx_resume_hw_tx(struct bnx2x *bp);
|
||||
|
||||
#endif /* BNX2X_DCB_H */
|
||||
|
@ -2261,6 +2261,23 @@ static void bnx2x_set_requested_fc(struct bnx2x *bp)
|
||||
bp->link_params.req_fc_auto_adv = BNX2X_FLOW_CTRL_BOTH;
|
||||
}
|
||||
|
||||
static void bnx2x_init_dropless_fc(struct bnx2x *bp)
|
||||
{
|
||||
u32 pause_enabled = 0;
|
||||
|
||||
if (!CHIP_IS_E1(bp) && bp->dropless_fc && bp->link_vars.link_up) {
|
||||
if (bp->link_vars.flow_ctrl & BNX2X_FLOW_CTRL_TX)
|
||||
pause_enabled = 1;
|
||||
|
||||
REG_WR(bp, BAR_USTRORM_INTMEM +
|
||||
USTORM_ETH_PAUSE_ENABLED_OFFSET(BP_PORT(bp)),
|
||||
pause_enabled);
|
||||
}
|
||||
|
||||
DP(NETIF_MSG_IFUP | NETIF_MSG_LINK, "dropless_fc is %s\n",
|
||||
pause_enabled ? "enabled" : "disabled");
|
||||
}
|
||||
|
||||
int bnx2x_initial_phy_init(struct bnx2x *bp, int load_mode)
|
||||
{
|
||||
int rc, cfx_idx = bnx2x_get_link_cfg_idx(bp);
|
||||
@ -2294,6 +2311,8 @@ int bnx2x_initial_phy_init(struct bnx2x *bp, int load_mode)
|
||||
|
||||
bnx2x_release_phy_lock(bp);
|
||||
|
||||
bnx2x_init_dropless_fc(bp);
|
||||
|
||||
bnx2x_calc_fc_adv(bp);
|
||||
|
||||
if (bp->link_vars.link_up) {
|
||||
@ -2315,6 +2334,8 @@ void bnx2x_link_set(struct bnx2x *bp)
|
||||
bnx2x_phy_init(&bp->link_params, &bp->link_vars);
|
||||
bnx2x_release_phy_lock(bp);
|
||||
|
||||
bnx2x_init_dropless_fc(bp);
|
||||
|
||||
bnx2x_calc_fc_adv(bp);
|
||||
} else
|
||||
BNX2X_ERR("Bootcode is missing - can not set link\n");
|
||||
@ -2556,21 +2577,10 @@ static void bnx2x_link_attn(struct bnx2x *bp)
|
||||
|
||||
bnx2x_link_update(&bp->link_params, &bp->link_vars);
|
||||
|
||||
bnx2x_init_dropless_fc(bp);
|
||||
|
||||
if (bp->link_vars.link_up) {
|
||||
|
||||
/* dropless flow control */
|
||||
if (!CHIP_IS_E1(bp) && bp->dropless_fc) {
|
||||
int port = BP_PORT(bp);
|
||||
u32 pause_enabled = 0;
|
||||
|
||||
if (bp->link_vars.flow_ctrl & BNX2X_FLOW_CTRL_TX)
|
||||
pause_enabled = 1;
|
||||
|
||||
REG_WR(bp, BAR_USTRORM_INTMEM +
|
||||
USTORM_ETH_PAUSE_ENABLED_OFFSET(port),
|
||||
pause_enabled);
|
||||
}
|
||||
|
||||
if (bp->link_vars.mac_type != MAC_TYPE_EMAC) {
|
||||
struct host_port_stats *pstats;
|
||||
|
||||
@ -9643,6 +9653,12 @@ sp_rtnl_not_reset:
|
||||
&bp->sp_rtnl_state))
|
||||
bnx2x_pf_set_vfs_vlan(bp);
|
||||
|
||||
if (test_and_clear_bit(BNX2X_SP_RTNL_TX_STOP, &bp->sp_rtnl_state))
|
||||
bnx2x_dcbx_stop_hw_tx(bp);
|
||||
|
||||
if (test_and_clear_bit(BNX2X_SP_RTNL_TX_RESUME, &bp->sp_rtnl_state))
|
||||
bnx2x_dcbx_resume_hw_tx(bp);
|
||||
|
||||
/* work which needs rtnl lock not-taken (as it takes the lock itself and
|
||||
* can be called from other contexts as well)
|
||||
*/
|
||||
@ -11145,6 +11161,9 @@ static bool bnx2x_get_dropless_info(struct bnx2x *bp)
|
||||
int tmp;
|
||||
u32 cfg;
|
||||
|
||||
if (IS_VF(bp))
|
||||
return 0;
|
||||
|
||||
if (IS_MF(bp) && !CHIP_IS_E1x(bp)) {
|
||||
/* Take function: tmp = func */
|
||||
tmp = BP_ABS_FUNC(bp);
|
||||
|
@ -1755,11 +1755,8 @@ void bnx2x_iov_init_dq(struct bnx2x *bp)
|
||||
|
||||
void bnx2x_iov_init_dmae(struct bnx2x *bp)
|
||||
{
|
||||
DP(BNX2X_MSG_IOV, "SRIOV is %s\n", IS_SRIOV(bp) ? "ON" : "OFF");
|
||||
if (!IS_SRIOV(bp))
|
||||
return;
|
||||
|
||||
REG_WR(bp, DMAE_REG_BACKWARD_COMP_EN, 0);
|
||||
if (pci_find_ext_capability(bp->pdev, PCI_EXT_CAP_ID_SRIOV))
|
||||
REG_WR(bp, DMAE_REG_BACKWARD_COMP_EN, 0);
|
||||
}
|
||||
|
||||
static int bnx2x_vf_bus(struct bnx2x *bp, int vfid)
|
||||
@ -3092,8 +3089,9 @@ void bnx2x_disable_sriov(struct bnx2x *bp)
|
||||
pci_disable_sriov(bp->pdev);
|
||||
}
|
||||
|
||||
static int bnx2x_vf_ndo_sanity(struct bnx2x *bp, int vfidx,
|
||||
struct bnx2x_virtf *vf)
|
||||
static int bnx2x_vf_ndo_prep(struct bnx2x *bp, int vfidx,
|
||||
struct bnx2x_virtf **vf,
|
||||
struct pf_vf_bulletin_content **bulletin)
|
||||
{
|
||||
if (bp->state != BNX2X_STATE_OPEN) {
|
||||
BNX2X_ERR("vf ndo called though PF is down\n");
|
||||
@ -3111,12 +3109,22 @@ static int bnx2x_vf_ndo_sanity(struct bnx2x *bp, int vfidx,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!vf) {
|
||||
/* init members */
|
||||
*vf = BP_VF(bp, vfidx);
|
||||
*bulletin = BP_VF_BULLETIN(bp, vfidx);
|
||||
|
||||
if (!*vf) {
|
||||
BNX2X_ERR("vf ndo called but vf was null. vfidx was %d\n",
|
||||
vfidx);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!*bulletin) {
|
||||
BNX2X_ERR("vf ndo called but Bulletin Board struct is null. vfidx was %d\n",
|
||||
vfidx);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -3124,17 +3132,19 @@ int bnx2x_get_vf_config(struct net_device *dev, int vfidx,
|
||||
struct ifla_vf_info *ivi)
|
||||
{
|
||||
struct bnx2x *bp = netdev_priv(dev);
|
||||
struct bnx2x_virtf *vf = BP_VF(bp, vfidx);
|
||||
struct bnx2x_vlan_mac_obj *mac_obj = &bnx2x_vfq(vf, 0, mac_obj);
|
||||
struct bnx2x_vlan_mac_obj *vlan_obj = &bnx2x_vfq(vf, 0, vlan_obj);
|
||||
struct pf_vf_bulletin_content *bulletin = BP_VF_BULLETIN(bp, vfidx);
|
||||
struct bnx2x_virtf *vf = NULL;
|
||||
struct pf_vf_bulletin_content *bulletin = NULL;
|
||||
struct bnx2x_vlan_mac_obj *mac_obj;
|
||||
struct bnx2x_vlan_mac_obj *vlan_obj;
|
||||
int rc;
|
||||
|
||||
/* sanity */
|
||||
rc = bnx2x_vf_ndo_sanity(bp, vfidx, vf);
|
||||
/* sanity and init */
|
||||
rc = bnx2x_vf_ndo_prep(bp, vfidx, &vf, &bulletin);
|
||||
if (rc)
|
||||
return rc;
|
||||
if (!mac_obj || !vlan_obj || !bulletin) {
|
||||
mac_obj = &bnx2x_vfq(vf, 0, mac_obj);
|
||||
vlan_obj = &bnx2x_vfq(vf, 0, vlan_obj);
|
||||
if (!mac_obj || !vlan_obj) {
|
||||
BNX2X_ERR("VF partially initialized\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
@ -3191,11 +3201,11 @@ int bnx2x_set_vf_mac(struct net_device *dev, int vfidx, u8 *mac)
|
||||
{
|
||||
struct bnx2x *bp = netdev_priv(dev);
|
||||
int rc, q_logical_state;
|
||||
struct bnx2x_virtf *vf = BP_VF(bp, vfidx);
|
||||
struct pf_vf_bulletin_content *bulletin = BP_VF_BULLETIN(bp, vfidx);
|
||||
struct bnx2x_virtf *vf = NULL;
|
||||
struct pf_vf_bulletin_content *bulletin = NULL;
|
||||
|
||||
/* sanity */
|
||||
rc = bnx2x_vf_ndo_sanity(bp, vfidx, vf);
|
||||
/* sanity and init */
|
||||
rc = bnx2x_vf_ndo_prep(bp, vfidx, &vf, &bulletin);
|
||||
if (rc)
|
||||
return rc;
|
||||
if (!is_valid_ether_addr(mac)) {
|
||||
@ -3257,11 +3267,11 @@ int bnx2x_set_vf_vlan(struct net_device *dev, int vfidx, u16 vlan, u8 qos)
|
||||
{
|
||||
struct bnx2x *bp = netdev_priv(dev);
|
||||
int rc, q_logical_state;
|
||||
struct bnx2x_virtf *vf = BP_VF(bp, vfidx);
|
||||
struct pf_vf_bulletin_content *bulletin = BP_VF_BULLETIN(bp, vfidx);
|
||||
struct bnx2x_virtf *vf = NULL;
|
||||
struct pf_vf_bulletin_content *bulletin = NULL;
|
||||
|
||||
/* sanity */
|
||||
rc = bnx2x_vf_ndo_sanity(bp, vfidx, vf);
|
||||
/* sanity and init */
|
||||
rc = bnx2x_vf_ndo_prep(bp, vfidx, &vf, &bulletin);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
|
@ -2556,8 +2556,8 @@ static int be_close(struct net_device *netdev)
|
||||
/* Wait for all pending tx completions to arrive so that
|
||||
* all tx skbs are freed.
|
||||
*/
|
||||
be_tx_compl_clean(adapter);
|
||||
netif_tx_disable(netdev);
|
||||
be_tx_compl_clean(adapter);
|
||||
|
||||
be_rx_qs_destroy(adapter);
|
||||
|
||||
|
@ -7089,7 +7089,7 @@ rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
|
||||
RTL_W8(Cfg9346, Cfg9346_Unlock);
|
||||
RTL_W8(Config1, RTL_R8(Config1) | PMEnable);
|
||||
RTL_W8(Config5, RTL_R8(Config5) & PMEStatus);
|
||||
RTL_W8(Config5, RTL_R8(Config5) & (BWF | MWF | UWF | LanWake | PMEStatus));
|
||||
if ((RTL_R8(Config3) & (LinkUp | MagicPacket)) != 0)
|
||||
tp->features |= RTL_FEATURE_WOL;
|
||||
if ((RTL_R8(Config5) & (UWF | BWF | MWF)) != 0)
|
||||
|
@ -210,8 +210,7 @@ static int via_init_one(struct pci_dev *pcidev, const struct pci_device_id *id)
|
||||
pci_write_config_byte(pcidev,0x42,(bTmp | 0xf0));
|
||||
pci_write_config_byte(pcidev,0x5a,0xc0);
|
||||
WriteLPCReg(0x28, 0x70 );
|
||||
if (via_ircc_open(pcidev, &info, 0x3076) == 0)
|
||||
rc=0;
|
||||
rc = via_ircc_open(pcidev, &info, 0x3076);
|
||||
} else
|
||||
rc = -ENODEV; //IR not turn on
|
||||
} else { //Not VT1211
|
||||
@ -249,8 +248,7 @@ static int via_init_one(struct pci_dev *pcidev, const struct pci_device_id *id)
|
||||
info.irq=FirIRQ;
|
||||
info.dma=FirDRQ1;
|
||||
info.dma2=FirDRQ0;
|
||||
if (via_ircc_open(pcidev, &info, 0x3096) == 0)
|
||||
rc=0;
|
||||
rc = via_ircc_open(pcidev, &info, 0x3096);
|
||||
} else
|
||||
rc = -ENODEV; //IR not turn on !!!!!
|
||||
}//Not VT1211
|
||||
|
@ -68,6 +68,8 @@ static const struct proto_ops macvtap_socket_ops;
|
||||
#define TUN_OFFLOADS (NETIF_F_HW_CSUM | NETIF_F_TSO_ECN | NETIF_F_TSO | \
|
||||
NETIF_F_TSO6 | NETIF_F_UFO)
|
||||
#define RX_OFFLOADS (NETIF_F_GRO | NETIF_F_LRO)
|
||||
#define TAP_FEATURES (NETIF_F_GSO | NETIF_F_SG)
|
||||
|
||||
/*
|
||||
* RCU usage:
|
||||
* The macvtap_queue and the macvlan_dev are loosely coupled, the
|
||||
@ -278,7 +280,8 @@ static int macvtap_forward(struct net_device *dev, struct sk_buff *skb)
|
||||
{
|
||||
struct macvlan_dev *vlan = netdev_priv(dev);
|
||||
struct macvtap_queue *q = macvtap_get_queue(dev, skb);
|
||||
netdev_features_t features;
|
||||
netdev_features_t features = TAP_FEATURES;
|
||||
|
||||
if (!q)
|
||||
goto drop;
|
||||
|
||||
@ -287,9 +290,11 @@ static int macvtap_forward(struct net_device *dev, struct sk_buff *skb)
|
||||
|
||||
skb->dev = dev;
|
||||
/* Apply the forward feature mask so that we perform segmentation
|
||||
* according to users wishes.
|
||||
* according to users wishes. This only works if VNET_HDR is
|
||||
* enabled.
|
||||
*/
|
||||
features = netif_skb_features(skb) & vlan->tap_features;
|
||||
if (q->flags & IFF_VNET_HDR)
|
||||
features |= vlan->tap_features;
|
||||
if (netif_needs_gso(skb, features)) {
|
||||
struct sk_buff *segs = __skb_gso_segment(skb, features, false);
|
||||
|
||||
@ -961,8 +966,7 @@ static int set_offload(struct macvtap_queue *q, unsigned long arg)
|
||||
/* tap_features are the same as features on tun/tap and
|
||||
* reflect user expectations.
|
||||
*/
|
||||
vlan->tap_features = vlan->dev->features &
|
||||
(feature_mask | ~TUN_OFFLOADS);
|
||||
vlan->tap_features = feature_mask;
|
||||
vlan->set_features = features;
|
||||
netdev_update_features(vlan->dev);
|
||||
|
||||
@ -1058,10 +1062,6 @@ static long macvtap_ioctl(struct file *file, unsigned int cmd,
|
||||
TUN_F_TSO_ECN | TUN_F_UFO))
|
||||
return -EINVAL;
|
||||
|
||||
/* TODO: only accept frames with the features that
|
||||
got enabled for forwarded frames */
|
||||
if (!(q->flags & IFF_VNET_HDR))
|
||||
return -EINVAL;
|
||||
rtnl_lock();
|
||||
ret = set_offload(q, arg);
|
||||
rtnl_unlock();
|
||||
|
@ -23,7 +23,7 @@
|
||||
#define RTL821x_INER_INIT 0x6400
|
||||
#define RTL821x_INSR 0x13
|
||||
|
||||
#define RTL8211E_INER_LINK_STAT 0x10
|
||||
#define RTL8211E_INER_LINK_STATUS 0x400
|
||||
|
||||
MODULE_DESCRIPTION("Realtek PHY driver");
|
||||
MODULE_AUTHOR("Johnson Leung");
|
||||
@ -57,7 +57,7 @@ static int rtl8211e_config_intr(struct phy_device *phydev)
|
||||
|
||||
if (phydev->interrupts == PHY_INTERRUPT_ENABLED)
|
||||
err = phy_write(phydev, RTL821x_INER,
|
||||
RTL8211E_INER_LINK_STAT);
|
||||
RTL8211E_INER_LINK_STATUS);
|
||||
else
|
||||
err = phy_write(phydev, RTL821x_INER, 0);
|
||||
|
||||
|
@ -2816,13 +2816,16 @@ exit:
|
||||
static int hso_get_config_data(struct usb_interface *interface)
|
||||
{
|
||||
struct usb_device *usbdev = interface_to_usbdev(interface);
|
||||
u8 config_data[17];
|
||||
u8 *config_data = kmalloc(17, GFP_KERNEL);
|
||||
u32 if_num = interface->altsetting->desc.bInterfaceNumber;
|
||||
s32 result;
|
||||
|
||||
if (!config_data)
|
||||
return -ENOMEM;
|
||||
if (usb_control_msg(usbdev, usb_rcvctrlpipe(usbdev, 0),
|
||||
0x86, 0xC0, 0, 0, config_data, 17,
|
||||
USB_CTRL_SET_TIMEOUT) != 0x11) {
|
||||
kfree(config_data);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
@ -2873,6 +2876,7 @@ static int hso_get_config_data(struct usb_interface *interface)
|
||||
if (config_data[16] & 0x1)
|
||||
result |= HSO_INFO_CRC_BUG;
|
||||
|
||||
kfree(config_data);
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -2886,6 +2890,11 @@ static int hso_probe(struct usb_interface *interface,
|
||||
struct hso_shared_int *shared_int;
|
||||
struct hso_device *tmp_dev = NULL;
|
||||
|
||||
if (interface->cur_altsetting->desc.bInterfaceClass != 0xFF) {
|
||||
dev_err(&interface->dev, "Not our interface\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if_num = interface->altsetting->desc.bInterfaceNumber;
|
||||
|
||||
/* Get the interface/port specification from either driver_info or from
|
||||
@ -2895,10 +2904,6 @@ static int hso_probe(struct usb_interface *interface,
|
||||
else
|
||||
port_spec = hso_get_config_data(interface);
|
||||
|
||||
if (interface->cur_altsetting->desc.bInterfaceClass != 0xFF) {
|
||||
dev_err(&interface->dev, "Not our interface\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
/* Check if we need to switch to alt interfaces prior to port
|
||||
* configuration */
|
||||
if (interface->num_altsetting > 1)
|
||||
|
@ -523,9 +523,9 @@ static int prism2_ioctl_giwaplist(struct net_device *dev,
|
||||
|
||||
data->length = prism2_ap_get_sta_qual(local, addr, qual, IW_MAX_AP, 1);
|
||||
|
||||
memcpy(extra, &addr, sizeof(struct sockaddr) * data->length);
|
||||
memcpy(extra, addr, sizeof(struct sockaddr) * data->length);
|
||||
data->flags = 1; /* has quality information */
|
||||
memcpy(extra + sizeof(struct sockaddr) * data->length, &qual,
|
||||
memcpy(extra + sizeof(struct sockaddr) * data->length, qual,
|
||||
sizeof(struct iw_quality) * data->length);
|
||||
|
||||
kfree(addr);
|
||||
|
@ -1024,7 +1024,10 @@ void iwl_chswitch_done(struct iwl_priv *priv, bool is_success)
|
||||
if (test_bit(STATUS_EXIT_PENDING, &priv->status))
|
||||
return;
|
||||
|
||||
if (test_and_clear_bit(STATUS_CHANNEL_SWITCH_PENDING, &priv->status))
|
||||
if (!test_and_clear_bit(STATUS_CHANNEL_SWITCH_PENDING, &priv->status))
|
||||
return;
|
||||
|
||||
if (ctx->vif)
|
||||
ieee80211_chswitch_done(ctx->vif, is_success);
|
||||
}
|
||||
|
||||
|
@ -97,8 +97,6 @@
|
||||
|
||||
#define APMG_PCIDEV_STT_VAL_L1_ACT_DIS (0x00000800)
|
||||
|
||||
#define APMG_RTC_INT_STT_RFKILL (0x10000000)
|
||||
|
||||
/* Device system time */
|
||||
#define DEVICE_SYSTEM_TIME_REG 0xA0206C
|
||||
|
||||
|
@ -138,6 +138,20 @@ static void iwl_mvm_roc_finished(struct iwl_mvm *mvm)
|
||||
schedule_work(&mvm->roc_done_wk);
|
||||
}
|
||||
|
||||
static bool iwl_mvm_te_check_disconnect(struct iwl_mvm *mvm,
|
||||
struct ieee80211_vif *vif,
|
||||
const char *errmsg)
|
||||
{
|
||||
if (vif->type != NL80211_IFTYPE_STATION)
|
||||
return false;
|
||||
if (vif->bss_conf.assoc && vif->bss_conf.dtim_period)
|
||||
return false;
|
||||
if (errmsg)
|
||||
IWL_ERR(mvm, "%s\n", errmsg);
|
||||
ieee80211_connection_loss(vif);
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* Handles a FW notification for an event that is known to the driver.
|
||||
*
|
||||
@ -163,8 +177,13 @@ static void iwl_mvm_te_handle_notif(struct iwl_mvm *mvm,
|
||||
* P2P Device discoveribility, while there are other higher priority
|
||||
* events in the system).
|
||||
*/
|
||||
WARN_ONCE(!le32_to_cpu(notif->status),
|
||||
"Failed to schedule time event\n");
|
||||
if (WARN_ONCE(!le32_to_cpu(notif->status),
|
||||
"Failed to schedule time event\n")) {
|
||||
if (iwl_mvm_te_check_disconnect(mvm, te_data->vif, NULL)) {
|
||||
iwl_mvm_te_clear_data(mvm, te_data);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (le32_to_cpu(notif->action) & TE_NOTIF_HOST_EVENT_END) {
|
||||
IWL_DEBUG_TE(mvm,
|
||||
@ -180,14 +199,8 @@ static void iwl_mvm_te_handle_notif(struct iwl_mvm *mvm,
|
||||
* By now, we should have finished association
|
||||
* and know the dtim period.
|
||||
*/
|
||||
if (te_data->vif->type == NL80211_IFTYPE_STATION &&
|
||||
(!te_data->vif->bss_conf.assoc ||
|
||||
!te_data->vif->bss_conf.dtim_period)) {
|
||||
IWL_ERR(mvm,
|
||||
"No assocation and the time event is over already...\n");
|
||||
ieee80211_connection_loss(te_data->vif);
|
||||
}
|
||||
|
||||
iwl_mvm_te_check_disconnect(mvm, te_data->vif,
|
||||
"No assocation and the time event is over already...");
|
||||
iwl_mvm_te_clear_data(mvm, te_data);
|
||||
} else if (le32_to_cpu(notif->action) & TE_NOTIF_HOST_EVENT_START) {
|
||||
te_data->running = true;
|
||||
|
@ -888,14 +888,6 @@ irqreturn_t iwl_pcie_irq_handler(int irq, void *dev_id)
|
||||
|
||||
iwl_op_mode_hw_rf_kill(trans->op_mode, hw_rfkill);
|
||||
if (hw_rfkill) {
|
||||
/*
|
||||
* Clear the interrupt in APMG if the NIC is going down.
|
||||
* Note that when the NIC exits RFkill (else branch), we
|
||||
* can't access prph and the NIC will be reset in
|
||||
* start_hw anyway.
|
||||
*/
|
||||
iwl_write_prph(trans, APMG_RTC_INT_STT_REG,
|
||||
APMG_RTC_INT_STT_RFKILL);
|
||||
set_bit(STATUS_RFKILL, &trans_pcie->status);
|
||||
if (test_and_clear_bit(STATUS_HCMD_ACTIVE,
|
||||
&trans_pcie->status))
|
||||
|
@ -1416,6 +1416,11 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev,
|
||||
goto out_no_pci;
|
||||
}
|
||||
|
||||
/* W/A - seems to solve weird behavior. We need to remove this if we
|
||||
* don't want to stay in L1 all the time. This wastes a lot of power */
|
||||
pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1 |
|
||||
PCIE_LINK_STATE_CLKPM);
|
||||
|
||||
pci_set_master(pdev);
|
||||
|
||||
err = pci_set_dma_mask(pdev, DMA_BIT_MASK(36));
|
||||
|
@ -98,10 +98,12 @@ static int zd1201_fw_upload(struct usb_device *dev, int apfw)
|
||||
goto exit;
|
||||
|
||||
err = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), 0x4,
|
||||
USB_DIR_IN | 0x40, 0,0, &ret, sizeof(ret), ZD1201_FW_TIMEOUT);
|
||||
USB_DIR_IN | 0x40, 0, 0, buf, sizeof(ret), ZD1201_FW_TIMEOUT);
|
||||
if (err < 0)
|
||||
goto exit;
|
||||
|
||||
memcpy(&ret, buf, sizeof(ret));
|
||||
|
||||
if (ret & 0x80) {
|
||||
err = -EIO;
|
||||
goto exit;
|
||||
|
@ -392,6 +392,8 @@ static void __unflatten_device_tree(struct boot_param_header *blob,
|
||||
mem = (unsigned long)
|
||||
dt_alloc(size + 4, __alignof__(struct device_node));
|
||||
|
||||
memset((void *)mem, 0, size);
|
||||
|
||||
((__be32 *)mem)[size / 4] = cpu_to_be32(0xdeadbeef);
|
||||
|
||||
pr_debug(" unflattening %lx...\n", mem);
|
||||
|
@ -278,6 +278,7 @@ static int sunxi_pconf_group_set(struct pinctrl_dev *pctldev,
|
||||
{
|
||||
struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
|
||||
struct sunxi_pinctrl_group *g = &pctl->groups[group];
|
||||
unsigned long flags;
|
||||
u32 val, mask;
|
||||
u16 strength;
|
||||
u8 dlevel;
|
||||
@ -295,22 +296,35 @@ static int sunxi_pconf_group_set(struct pinctrl_dev *pctldev,
|
||||
* 3: 40mA
|
||||
*/
|
||||
dlevel = strength / 10 - 1;
|
||||
|
||||
spin_lock_irqsave(&pctl->lock, flags);
|
||||
|
||||
val = readl(pctl->membase + sunxi_dlevel_reg(g->pin));
|
||||
mask = DLEVEL_PINS_MASK << sunxi_dlevel_offset(g->pin);
|
||||
writel((val & ~mask) | dlevel << sunxi_dlevel_offset(g->pin),
|
||||
pctl->membase + sunxi_dlevel_reg(g->pin));
|
||||
|
||||
spin_unlock_irqrestore(&pctl->lock, flags);
|
||||
break;
|
||||
case PIN_CONFIG_BIAS_PULL_UP:
|
||||
spin_lock_irqsave(&pctl->lock, flags);
|
||||
|
||||
val = readl(pctl->membase + sunxi_pull_reg(g->pin));
|
||||
mask = PULL_PINS_MASK << sunxi_pull_offset(g->pin);
|
||||
writel((val & ~mask) | 1 << sunxi_pull_offset(g->pin),
|
||||
pctl->membase + sunxi_pull_reg(g->pin));
|
||||
|
||||
spin_unlock_irqrestore(&pctl->lock, flags);
|
||||
break;
|
||||
case PIN_CONFIG_BIAS_PULL_DOWN:
|
||||
spin_lock_irqsave(&pctl->lock, flags);
|
||||
|
||||
val = readl(pctl->membase + sunxi_pull_reg(g->pin));
|
||||
mask = PULL_PINS_MASK << sunxi_pull_offset(g->pin);
|
||||
writel((val & ~mask) | 2 << sunxi_pull_offset(g->pin),
|
||||
pctl->membase + sunxi_pull_reg(g->pin));
|
||||
|
||||
spin_unlock_irqrestore(&pctl->lock, flags);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@ -360,11 +374,17 @@ static void sunxi_pmx_set(struct pinctrl_dev *pctldev,
|
||||
u8 config)
|
||||
{
|
||||
struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
|
||||
unsigned long flags;
|
||||
u32 val, mask;
|
||||
|
||||
u32 val = readl(pctl->membase + sunxi_mux_reg(pin));
|
||||
u32 mask = MUX_PINS_MASK << sunxi_mux_offset(pin);
|
||||
spin_lock_irqsave(&pctl->lock, flags);
|
||||
|
||||
val = readl(pctl->membase + sunxi_mux_reg(pin));
|
||||
mask = MUX_PINS_MASK << sunxi_mux_offset(pin);
|
||||
writel((val & ~mask) | config << sunxi_mux_offset(pin),
|
||||
pctl->membase + sunxi_mux_reg(pin));
|
||||
|
||||
spin_unlock_irqrestore(&pctl->lock, flags);
|
||||
}
|
||||
|
||||
static int sunxi_pmx_enable(struct pinctrl_dev *pctldev,
|
||||
@ -464,8 +484,21 @@ static void sunxi_pinctrl_gpio_set(struct gpio_chip *chip,
|
||||
struct sunxi_pinctrl *pctl = dev_get_drvdata(chip->dev);
|
||||
u32 reg = sunxi_data_reg(offset);
|
||||
u8 index = sunxi_data_offset(offset);
|
||||
unsigned long flags;
|
||||
u32 regval;
|
||||
|
||||
writel((value & DATA_PINS_MASK) << index, pctl->membase + reg);
|
||||
spin_lock_irqsave(&pctl->lock, flags);
|
||||
|
||||
regval = readl(pctl->membase + reg);
|
||||
|
||||
if (value)
|
||||
regval |= BIT(index);
|
||||
else
|
||||
regval &= ~(BIT(index));
|
||||
|
||||
writel(regval, pctl->membase + reg);
|
||||
|
||||
spin_unlock_irqrestore(&pctl->lock, flags);
|
||||
}
|
||||
|
||||
static int sunxi_pinctrl_gpio_of_xlate(struct gpio_chip *gc,
|
||||
@ -526,6 +559,8 @@ static int sunxi_pinctrl_irq_set_type(struct irq_data *d,
|
||||
struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d);
|
||||
u32 reg = sunxi_irq_cfg_reg(d->hwirq);
|
||||
u8 index = sunxi_irq_cfg_offset(d->hwirq);
|
||||
unsigned long flags;
|
||||
u32 regval;
|
||||
u8 mode;
|
||||
|
||||
switch (type) {
|
||||
@ -548,7 +583,13 @@ static int sunxi_pinctrl_irq_set_type(struct irq_data *d,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
writel((mode & IRQ_CFG_IRQ_MASK) << index, pctl->membase + reg);
|
||||
spin_lock_irqsave(&pctl->lock, flags);
|
||||
|
||||
regval = readl(pctl->membase + reg);
|
||||
regval &= ~IRQ_CFG_IRQ_MASK;
|
||||
writel(regval | (mode << index), pctl->membase + reg);
|
||||
|
||||
spin_unlock_irqrestore(&pctl->lock, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -560,14 +601,19 @@ static void sunxi_pinctrl_irq_mask_ack(struct irq_data *d)
|
||||
u8 ctrl_idx = sunxi_irq_ctrl_offset(d->hwirq);
|
||||
u32 status_reg = sunxi_irq_status_reg(d->hwirq);
|
||||
u8 status_idx = sunxi_irq_status_offset(d->hwirq);
|
||||
unsigned long flags;
|
||||
u32 val;
|
||||
|
||||
spin_lock_irqsave(&pctl->lock, flags);
|
||||
|
||||
/* Mask the IRQ */
|
||||
val = readl(pctl->membase + ctrl_reg);
|
||||
writel(val & ~(1 << ctrl_idx), pctl->membase + ctrl_reg);
|
||||
|
||||
/* Clear the IRQ */
|
||||
writel(1 << status_idx, pctl->membase + status_reg);
|
||||
|
||||
spin_unlock_irqrestore(&pctl->lock, flags);
|
||||
}
|
||||
|
||||
static void sunxi_pinctrl_irq_mask(struct irq_data *d)
|
||||
@ -575,11 +621,16 @@ static void sunxi_pinctrl_irq_mask(struct irq_data *d)
|
||||
struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d);
|
||||
u32 reg = sunxi_irq_ctrl_reg(d->hwirq);
|
||||
u8 idx = sunxi_irq_ctrl_offset(d->hwirq);
|
||||
unsigned long flags;
|
||||
u32 val;
|
||||
|
||||
spin_lock_irqsave(&pctl->lock, flags);
|
||||
|
||||
/* Mask the IRQ */
|
||||
val = readl(pctl->membase + reg);
|
||||
writel(val & ~(1 << idx), pctl->membase + reg);
|
||||
|
||||
spin_unlock_irqrestore(&pctl->lock, flags);
|
||||
}
|
||||
|
||||
static void sunxi_pinctrl_irq_unmask(struct irq_data *d)
|
||||
@ -588,6 +639,7 @@ static void sunxi_pinctrl_irq_unmask(struct irq_data *d)
|
||||
struct sunxi_desc_function *func;
|
||||
u32 reg = sunxi_irq_ctrl_reg(d->hwirq);
|
||||
u8 idx = sunxi_irq_ctrl_offset(d->hwirq);
|
||||
unsigned long flags;
|
||||
u32 val;
|
||||
|
||||
func = sunxi_pinctrl_desc_find_function_by_pin(pctl,
|
||||
@ -597,9 +649,13 @@ static void sunxi_pinctrl_irq_unmask(struct irq_data *d)
|
||||
/* Change muxing to INT mode */
|
||||
sunxi_pmx_set(pctl->pctl_dev, pctl->irq_array[d->hwirq], func->muxval);
|
||||
|
||||
spin_lock_irqsave(&pctl->lock, flags);
|
||||
|
||||
/* Unmask the IRQ */
|
||||
val = readl(pctl->membase + reg);
|
||||
writel(val | (1 << idx), pctl->membase + reg);
|
||||
|
||||
spin_unlock_irqrestore(&pctl->lock, flags);
|
||||
}
|
||||
|
||||
static struct irq_chip sunxi_pinctrl_irq_chip = {
|
||||
@ -752,6 +808,8 @@ static int sunxi_pinctrl_probe(struct platform_device *pdev)
|
||||
return -ENOMEM;
|
||||
platform_set_drvdata(pdev, pctl);
|
||||
|
||||
spin_lock_init(&pctl->lock);
|
||||
|
||||
pctl->membase = of_iomap(node, 0);
|
||||
if (!pctl->membase)
|
||||
return -ENOMEM;
|
||||
|
@ -14,6 +14,7 @@
|
||||
#define __PINCTRL_SUNXI_H
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/spinlock.h>
|
||||
|
||||
#define PA_BASE 0
|
||||
#define PB_BASE 32
|
||||
@ -407,6 +408,7 @@ struct sunxi_pinctrl {
|
||||
unsigned ngroups;
|
||||
int irq;
|
||||
int irq_array[SUNXI_IRQ_NUMBER];
|
||||
spinlock_t lock;
|
||||
struct pinctrl_dev *pctl_dev;
|
||||
};
|
||||
|
||||
|
@ -330,7 +330,7 @@ static int __init olpc_ec_init_module(void)
|
||||
return platform_driver_register(&olpc_ec_plat_driver);
|
||||
}
|
||||
|
||||
module_init(olpc_ec_init_module);
|
||||
arch_initcall(olpc_ec_init_module);
|
||||
|
||||
MODULE_AUTHOR("Andres Salomon <dilinger@queued.net>");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -53,7 +53,6 @@ MODULE_ALIAS("wmi:5FB7F034-2C63-45e9-BE91-3D44E2C707E4");
|
||||
#define HPWMI_ALS_QUERY 0x3
|
||||
#define HPWMI_HARDWARE_QUERY 0x4
|
||||
#define HPWMI_WIRELESS_QUERY 0x5
|
||||
#define HPWMI_BIOS_QUERY 0x9
|
||||
#define HPWMI_HOTKEY_QUERY 0xc
|
||||
#define HPWMI_WIRELESS2_QUERY 0x1b
|
||||
#define HPWMI_POSTCODEERROR_QUERY 0x2a
|
||||
@ -293,19 +292,6 @@ static int hp_wmi_tablet_state(void)
|
||||
return (state & 0x4) ? 1 : 0;
|
||||
}
|
||||
|
||||
static int hp_wmi_enable_hotkeys(void)
|
||||
{
|
||||
int ret;
|
||||
int query = 0x6e;
|
||||
|
||||
ret = hp_wmi_perform_query(HPWMI_BIOS_QUERY, 1, &query, sizeof(query),
|
||||
0);
|
||||
|
||||
if (ret)
|
||||
return -EINVAL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int hp_wmi_set_block(void *data, bool blocked)
|
||||
{
|
||||
enum hp_wmi_radio r = (enum hp_wmi_radio) data;
|
||||
@ -1009,8 +995,6 @@ static int __init hp_wmi_init(void)
|
||||
err = hp_wmi_input_setup();
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
hp_wmi_enable_hotkeys();
|
||||
}
|
||||
|
||||
if (bios_capable) {
|
||||
|
@ -2440,7 +2440,10 @@ static ssize_t sony_nc_gfx_switch_status_show(struct device *dev,
|
||||
if (pos < 0)
|
||||
return pos;
|
||||
|
||||
return snprintf(buffer, PAGE_SIZE, "%s\n", pos ? "speed" : "stamina");
|
||||
return snprintf(buffer, PAGE_SIZE, "%s\n",
|
||||
pos == SPEED ? "speed" :
|
||||
pos == STAMINA ? "stamina" :
|
||||
pos == AUTO ? "auto" : "unknown");
|
||||
}
|
||||
|
||||
static int sony_nc_gfx_switch_setup(struct platform_device *pd,
|
||||
@ -4320,7 +4323,8 @@ static int sony_pic_add(struct acpi_device *device)
|
||||
goto err_free_resources;
|
||||
}
|
||||
|
||||
if (sonypi_compat_init())
|
||||
result = sonypi_compat_init();
|
||||
if (result)
|
||||
goto err_remove_input;
|
||||
|
||||
/* request io port */
|
||||
|
@ -348,7 +348,7 @@ static void init_evtchn_cpu_bindings(void)
|
||||
|
||||
for_each_possible_cpu(i)
|
||||
memset(per_cpu(cpu_evtchn_mask, i),
|
||||
(i == 0) ? ~0 : 0, sizeof(*per_cpu(cpu_evtchn_mask, i)));
|
||||
(i == 0) ? ~0 : 0, NR_EVENT_CHANNELS/8);
|
||||
}
|
||||
|
||||
static inline void clear_evtchn(int port)
|
||||
@ -1493,8 +1493,10 @@ void rebind_evtchn_irq(int evtchn, int irq)
|
||||
/* Rebind an evtchn so that it gets delivered to a specific cpu */
|
||||
static int rebind_irq_to_cpu(unsigned irq, unsigned tcpu)
|
||||
{
|
||||
struct shared_info *s = HYPERVISOR_shared_info;
|
||||
struct evtchn_bind_vcpu bind_vcpu;
|
||||
int evtchn = evtchn_from_irq(irq);
|
||||
int masked;
|
||||
|
||||
if (!VALID_EVTCHN(evtchn))
|
||||
return -1;
|
||||
@ -1510,6 +1512,12 @@ static int rebind_irq_to_cpu(unsigned irq, unsigned tcpu)
|
||||
bind_vcpu.port = evtchn;
|
||||
bind_vcpu.vcpu = tcpu;
|
||||
|
||||
/*
|
||||
* Mask the event while changing the VCPU binding to prevent
|
||||
* it being delivered on an unexpected VCPU.
|
||||
*/
|
||||
masked = sync_test_and_set_bit(evtchn, BM(s->evtchn_mask));
|
||||
|
||||
/*
|
||||
* If this fails, it usually just indicates that we're dealing with a
|
||||
* virq or IPI channel, which don't actually need to be rebound. Ignore
|
||||
@ -1518,6 +1526,9 @@ static int rebind_irq_to_cpu(unsigned irq, unsigned tcpu)
|
||||
if (HYPERVISOR_event_channel_op(EVTCHNOP_bind_vcpu, &bind_vcpu) >= 0)
|
||||
bind_evtchn_to_cpu(evtchn, tcpu);
|
||||
|
||||
if (!masked)
|
||||
unmask_evtchn(evtchn);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -2086,6 +2086,7 @@ extern int ext4_sync_inode(handle_t *, struct inode *);
|
||||
extern void ext4_dirty_inode(struct inode *, int);
|
||||
extern int ext4_change_inode_journal_flag(struct inode *, int);
|
||||
extern int ext4_get_inode_loc(struct inode *, struct ext4_iloc *);
|
||||
extern int ext4_inode_attach_jinode(struct inode *inode);
|
||||
extern int ext4_can_truncate(struct inode *inode);
|
||||
extern void ext4_truncate(struct inode *);
|
||||
extern int ext4_punch_hole(struct inode *inode, loff_t offset, loff_t length);
|
||||
|
@ -255,10 +255,10 @@ int __ext4_handle_dirty_metadata(const char *where, unsigned int line,
|
||||
set_buffer_prio(bh);
|
||||
if (ext4_handle_valid(handle)) {
|
||||
err = jbd2_journal_dirty_metadata(handle, bh);
|
||||
if (err) {
|
||||
/* Errors can only happen if there is a bug */
|
||||
handle->h_err = err;
|
||||
__ext4_journal_stop(where, line, handle);
|
||||
/* Errors can only happen if there is a bug */
|
||||
if (WARN_ON_ONCE(err)) {
|
||||
ext4_journal_abort_handle(where, line, __func__, bh,
|
||||
handle, err);
|
||||
}
|
||||
} else {
|
||||
if (inode)
|
||||
|
@ -219,7 +219,6 @@ static int ext4_file_open(struct inode * inode, struct file * filp)
|
||||
{
|
||||
struct super_block *sb = inode->i_sb;
|
||||
struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
|
||||
struct ext4_inode_info *ei = EXT4_I(inode);
|
||||
struct vfsmount *mnt = filp->f_path.mnt;
|
||||
struct path path;
|
||||
char buf[64], *cp;
|
||||
@ -259,22 +258,10 @@ static int ext4_file_open(struct inode * inode, struct file * filp)
|
||||
* Set up the jbd2_inode if we are opening the inode for
|
||||
* writing and the journal is present
|
||||
*/
|
||||
if (sbi->s_journal && !ei->jinode && (filp->f_mode & FMODE_WRITE)) {
|
||||
struct jbd2_inode *jinode = jbd2_alloc_inode(GFP_KERNEL);
|
||||
|
||||
spin_lock(&inode->i_lock);
|
||||
if (!ei->jinode) {
|
||||
if (!jinode) {
|
||||
spin_unlock(&inode->i_lock);
|
||||
return -ENOMEM;
|
||||
}
|
||||
ei->jinode = jinode;
|
||||
jbd2_journal_init_jbd_inode(ei->jinode, inode);
|
||||
jinode = NULL;
|
||||
}
|
||||
spin_unlock(&inode->i_lock);
|
||||
if (unlikely(jinode != NULL))
|
||||
jbd2_free_inode(jinode);
|
||||
if (filp->f_mode & FMODE_WRITE) {
|
||||
int ret = ext4_inode_attach_jinode(inode);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
return dquot_file_open(inode, filp);
|
||||
}
|
||||
|
@ -3533,6 +3533,18 @@ int ext4_punch_hole(struct inode *inode, loff_t offset, loff_t length)
|
||||
offset;
|
||||
}
|
||||
|
||||
if (offset & (sb->s_blocksize - 1) ||
|
||||
(offset + length) & (sb->s_blocksize - 1)) {
|
||||
/*
|
||||
* Attach jinode to inode for jbd2 if we do any zeroing of
|
||||
* partial block
|
||||
*/
|
||||
ret = ext4_inode_attach_jinode(inode);
|
||||
if (ret < 0)
|
||||
goto out_mutex;
|
||||
|
||||
}
|
||||
|
||||
first_block_offset = round_up(offset, sb->s_blocksize);
|
||||
last_block_offset = round_down((offset + length), sb->s_blocksize) - 1;
|
||||
|
||||
@ -3601,6 +3613,31 @@ out_mutex:
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ext4_inode_attach_jinode(struct inode *inode)
|
||||
{
|
||||
struct ext4_inode_info *ei = EXT4_I(inode);
|
||||
struct jbd2_inode *jinode;
|
||||
|
||||
if (ei->jinode || !EXT4_SB(inode->i_sb)->s_journal)
|
||||
return 0;
|
||||
|
||||
jinode = jbd2_alloc_inode(GFP_KERNEL);
|
||||
spin_lock(&inode->i_lock);
|
||||
if (!ei->jinode) {
|
||||
if (!jinode) {
|
||||
spin_unlock(&inode->i_lock);
|
||||
return -ENOMEM;
|
||||
}
|
||||
ei->jinode = jinode;
|
||||
jbd2_journal_init_jbd_inode(ei->jinode, inode);
|
||||
jinode = NULL;
|
||||
}
|
||||
spin_unlock(&inode->i_lock);
|
||||
if (unlikely(jinode != NULL))
|
||||
jbd2_free_inode(jinode);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* ext4_truncate()
|
||||
*
|
||||
@ -3661,6 +3698,12 @@ void ext4_truncate(struct inode *inode)
|
||||
return;
|
||||
}
|
||||
|
||||
/* If we zero-out tail of the page, we have to create jinode for jbd2 */
|
||||
if (inode->i_size & (inode->i_sb->s_blocksize - 1)) {
|
||||
if (ext4_inode_attach_jinode(inode) < 0)
|
||||
return;
|
||||
}
|
||||
|
||||
if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))
|
||||
credits = ext4_writepage_trans_blocks(inode);
|
||||
else
|
||||
|
@ -1838,14 +1838,14 @@ int __init gfs2_glock_init(void)
|
||||
|
||||
glock_workqueue = alloc_workqueue("glock_workqueue", WQ_MEM_RECLAIM |
|
||||
WQ_HIGHPRI | WQ_FREEZABLE, 0);
|
||||
if (IS_ERR(glock_workqueue))
|
||||
return PTR_ERR(glock_workqueue);
|
||||
if (!glock_workqueue)
|
||||
return -ENOMEM;
|
||||
gfs2_delete_workqueue = alloc_workqueue("delete_workqueue",
|
||||
WQ_MEM_RECLAIM | WQ_FREEZABLE,
|
||||
0);
|
||||
if (IS_ERR(gfs2_delete_workqueue)) {
|
||||
if (!gfs2_delete_workqueue) {
|
||||
destroy_workqueue(glock_workqueue);
|
||||
return PTR_ERR(gfs2_delete_workqueue);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
register_shrinker(&glock_shrinker);
|
||||
|
@ -47,7 +47,8 @@ static void gfs2_ail_error(struct gfs2_glock *gl, const struct buffer_head *bh)
|
||||
* None of the buffers should be dirty, locked, or pinned.
|
||||
*/
|
||||
|
||||
static void __gfs2_ail_flush(struct gfs2_glock *gl, bool fsync)
|
||||
static void __gfs2_ail_flush(struct gfs2_glock *gl, bool fsync,
|
||||
unsigned int nr_revokes)
|
||||
{
|
||||
struct gfs2_sbd *sdp = gl->gl_sbd;
|
||||
struct list_head *head = &gl->gl_ail_list;
|
||||
@ -57,7 +58,9 @@ static void __gfs2_ail_flush(struct gfs2_glock *gl, bool fsync)
|
||||
|
||||
gfs2_log_lock(sdp);
|
||||
spin_lock(&sdp->sd_ail_lock);
|
||||
list_for_each_entry_safe(bd, tmp, head, bd_ail_gl_list) {
|
||||
list_for_each_entry_safe_reverse(bd, tmp, head, bd_ail_gl_list) {
|
||||
if (nr_revokes == 0)
|
||||
break;
|
||||
bh = bd->bd_bh;
|
||||
if (bh->b_state & b_state) {
|
||||
if (fsync)
|
||||
@ -65,6 +68,7 @@ static void __gfs2_ail_flush(struct gfs2_glock *gl, bool fsync)
|
||||
gfs2_ail_error(gl, bh);
|
||||
}
|
||||
gfs2_trans_add_revoke(sdp, bd);
|
||||
nr_revokes--;
|
||||
}
|
||||
GLOCK_BUG_ON(gl, !fsync && atomic_read(&gl->gl_ail_count));
|
||||
spin_unlock(&sdp->sd_ail_lock);
|
||||
@ -91,7 +95,7 @@ static void gfs2_ail_empty_gl(struct gfs2_glock *gl)
|
||||
WARN_ON_ONCE(current->journal_info);
|
||||
current->journal_info = &tr;
|
||||
|
||||
__gfs2_ail_flush(gl, 0);
|
||||
__gfs2_ail_flush(gl, 0, tr.tr_revokes);
|
||||
|
||||
gfs2_trans_end(sdp);
|
||||
gfs2_log_flush(sdp, NULL);
|
||||
@ -101,15 +105,19 @@ void gfs2_ail_flush(struct gfs2_glock *gl, bool fsync)
|
||||
{
|
||||
struct gfs2_sbd *sdp = gl->gl_sbd;
|
||||
unsigned int revokes = atomic_read(&gl->gl_ail_count);
|
||||
unsigned int max_revokes = (sdp->sd_sb.sb_bsize - sizeof(struct gfs2_log_descriptor)) / sizeof(u64);
|
||||
int ret;
|
||||
|
||||
if (!revokes)
|
||||
return;
|
||||
|
||||
ret = gfs2_trans_begin(sdp, 0, revokes);
|
||||
while (revokes > max_revokes)
|
||||
max_revokes += (sdp->sd_sb.sb_bsize - sizeof(struct gfs2_meta_header)) / sizeof(u64);
|
||||
|
||||
ret = gfs2_trans_begin(sdp, 0, max_revokes);
|
||||
if (ret)
|
||||
return;
|
||||
__gfs2_ail_flush(gl, fsync);
|
||||
__gfs2_ail_flush(gl, fsync, max_revokes);
|
||||
gfs2_trans_end(sdp);
|
||||
gfs2_log_flush(sdp, NULL);
|
||||
}
|
||||
|
@ -594,7 +594,7 @@ static int gfs2_create_inode(struct inode *dir, struct dentry *dentry,
|
||||
}
|
||||
gfs2_glock_dq_uninit(ghs);
|
||||
if (IS_ERR(d))
|
||||
return PTR_RET(d);
|
||||
return PTR_ERR(d);
|
||||
return error;
|
||||
} else if (error != -ENOENT) {
|
||||
goto fail_gunlock;
|
||||
@ -1750,6 +1750,10 @@ static ssize_t gfs2_getxattr(struct dentry *dentry, const char *name,
|
||||
struct gfs2_holder gh;
|
||||
int ret;
|
||||
|
||||
/* For selinux during lookup */
|
||||
if (gfs2_glock_is_locked_by_me(ip->i_gl))
|
||||
return generic_getxattr(dentry, name, data, size);
|
||||
|
||||
gfs2_holder_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_ANY, &gh);
|
||||
ret = gfs2_glock_nq(&gh);
|
||||
if (ret == 0) {
|
||||
|
@ -155,7 +155,7 @@ static int __init init_gfs2_fs(void)
|
||||
goto fail_wq;
|
||||
|
||||
gfs2_control_wq = alloc_workqueue("gfs2_control",
|
||||
WQ_NON_REENTRANT | WQ_UNBOUND | WQ_FREEZABLE, 0);
|
||||
WQ_UNBOUND | WQ_FREEZABLE, 0);
|
||||
if (!gfs2_control_wq)
|
||||
goto fail_recovery;
|
||||
|
||||
|
@ -345,8 +345,7 @@ static void nilfs_end_bio_write(struct bio *bio, int err)
|
||||
|
||||
if (err == -EOPNOTSUPP) {
|
||||
set_bit(BIO_EOPNOTSUPP, &bio->bi_flags);
|
||||
bio_put(bio);
|
||||
/* to be detected by submit_seg_bio() */
|
||||
/* to be detected by nilfs_segbuf_submit_bio() */
|
||||
}
|
||||
|
||||
if (!uptodate)
|
||||
@ -377,12 +376,12 @@ static int nilfs_segbuf_submit_bio(struct nilfs_segment_buffer *segbuf,
|
||||
bio->bi_private = segbuf;
|
||||
bio_get(bio);
|
||||
submit_bio(mode, bio);
|
||||
segbuf->sb_nbio++;
|
||||
if (bio_flagged(bio, BIO_EOPNOTSUPP)) {
|
||||
bio_put(bio);
|
||||
err = -EOPNOTSUPP;
|
||||
goto failed;
|
||||
}
|
||||
segbuf->sb_nbio++;
|
||||
bio_put(bio);
|
||||
|
||||
wi->bio = NULL;
|
||||
|
@ -271,7 +271,7 @@ int proc_readdir_de(struct proc_dir_entry *de, struct file *file,
|
||||
de = next;
|
||||
} while (de);
|
||||
spin_unlock(&proc_subdir_lock);
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int proc_readdir(struct file *file, struct dir_context *ctx)
|
||||
|
@ -205,7 +205,9 @@ static struct dentry *proc_root_lookup(struct inode * dir, struct dentry * dentr
|
||||
static int proc_root_readdir(struct file *file, struct dir_context *ctx)
|
||||
{
|
||||
if (ctx->pos < FIRST_PROCESS_ENTRY) {
|
||||
proc_readdir(file, ctx);
|
||||
int error = proc_readdir(file, ctx);
|
||||
if (unlikely(error <= 0))
|
||||
return error;
|
||||
ctx->pos = FIRST_PROCESS_ENTRY;
|
||||
}
|
||||
|
||||
|
@ -5,47 +5,13 @@
|
||||
|
||||
#include <linux/bitmap.h>
|
||||
#include <linux/if.h>
|
||||
#include <linux/ip.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/rcupdate.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/sysctl.h>
|
||||
#include <linux/rtnetlink.h>
|
||||
|
||||
enum
|
||||
{
|
||||
IPV4_DEVCONF_FORWARDING=1,
|
||||
IPV4_DEVCONF_MC_FORWARDING,
|
||||
IPV4_DEVCONF_PROXY_ARP,
|
||||
IPV4_DEVCONF_ACCEPT_REDIRECTS,
|
||||
IPV4_DEVCONF_SECURE_REDIRECTS,
|
||||
IPV4_DEVCONF_SEND_REDIRECTS,
|
||||
IPV4_DEVCONF_SHARED_MEDIA,
|
||||
IPV4_DEVCONF_RP_FILTER,
|
||||
IPV4_DEVCONF_ACCEPT_SOURCE_ROUTE,
|
||||
IPV4_DEVCONF_BOOTP_RELAY,
|
||||
IPV4_DEVCONF_LOG_MARTIANS,
|
||||
IPV4_DEVCONF_TAG,
|
||||
IPV4_DEVCONF_ARPFILTER,
|
||||
IPV4_DEVCONF_MEDIUM_ID,
|
||||
IPV4_DEVCONF_FORCE_IGMP_VERSION,
|
||||
IPV4_DEVCONF_IGMPV2_UNSOLICITED_REPORT_INTERVAL,
|
||||
IPV4_DEVCONF_IGMPV3_UNSOLICITED_REPORT_INTERVAL,
|
||||
IPV4_DEVCONF_NOXFRM,
|
||||
IPV4_DEVCONF_NOPOLICY,
|
||||
IPV4_DEVCONF_ARP_ANNOUNCE,
|
||||
IPV4_DEVCONF_ARP_IGNORE,
|
||||
IPV4_DEVCONF_PROMOTE_SECONDARIES,
|
||||
IPV4_DEVCONF_ARP_ACCEPT,
|
||||
IPV4_DEVCONF_ARP_NOTIFY,
|
||||
IPV4_DEVCONF_ACCEPT_LOCAL,
|
||||
IPV4_DEVCONF_SRC_VMARK,
|
||||
IPV4_DEVCONF_PROXY_ARP_PVLAN,
|
||||
IPV4_DEVCONF_ROUTE_LOCALNET,
|
||||
__IPV4_DEVCONF_MAX
|
||||
};
|
||||
|
||||
#define IPV4_DEVCONF_MAX (__IPV4_DEVCONF_MAX - 1)
|
||||
|
||||
struct ipv4_devconf {
|
||||
void *sysctl;
|
||||
int data[IPV4_DEVCONF_MAX];
|
||||
|
@ -103,6 +103,7 @@ struct inet6_skb_parm {
|
||||
#define IP6SKB_FORWARDED 2
|
||||
#define IP6SKB_REROUTED 4
|
||||
#define IP6SKB_ROUTERALERT 8
|
||||
#define IP6SKB_FRAGMENTED 16
|
||||
};
|
||||
|
||||
#define IP6CB(skb) ((struct inet6_skb_parm*)((skb)->cb))
|
||||
|
@ -332,6 +332,7 @@ struct mm_struct {
|
||||
unsigned long pgoff, unsigned long flags);
|
||||
#endif
|
||||
unsigned long mmap_base; /* base of mmap area */
|
||||
unsigned long mmap_legacy_base; /* base of mmap area in bottom-up allocations */
|
||||
unsigned long task_size; /* size of task vm space */
|
||||
unsigned long highest_vm_end; /* highest vma end address */
|
||||
pgd_t * pgd;
|
||||
|
@ -314,7 +314,6 @@ struct nsproxy;
|
||||
struct user_namespace;
|
||||
|
||||
#ifdef CONFIG_MMU
|
||||
extern unsigned long mmap_legacy_base(void);
|
||||
extern void arch_pick_mmap_layout(struct mm_struct *mm);
|
||||
extern unsigned long
|
||||
arch_get_unmapped_area(struct file *, unsigned long, unsigned long,
|
||||
|
@ -135,6 +135,8 @@ extern void ip6_update_pmtu(struct sk_buff *skb, struct net *net, __be32 mtu,
|
||||
extern void ip6_sk_update_pmtu(struct sk_buff *skb, struct sock *sk,
|
||||
__be32 mtu);
|
||||
extern void ip6_redirect(struct sk_buff *skb, struct net *net, int oif, u32 mark);
|
||||
extern void ip6_redirect_no_header(struct sk_buff *skb, struct net *net, int oif,
|
||||
u32 mark);
|
||||
extern void ip6_sk_redirect(struct sk_buff *skb, struct sock *sk);
|
||||
|
||||
struct netlink_callback;
|
||||
|
@ -133,4 +133,40 @@ struct ip_beet_phdr {
|
||||
__u8 reserved;
|
||||
};
|
||||
|
||||
/* index values for the variables in ipv4_devconf */
|
||||
enum
|
||||
{
|
||||
IPV4_DEVCONF_FORWARDING=1,
|
||||
IPV4_DEVCONF_MC_FORWARDING,
|
||||
IPV4_DEVCONF_PROXY_ARP,
|
||||
IPV4_DEVCONF_ACCEPT_REDIRECTS,
|
||||
IPV4_DEVCONF_SECURE_REDIRECTS,
|
||||
IPV4_DEVCONF_SEND_REDIRECTS,
|
||||
IPV4_DEVCONF_SHARED_MEDIA,
|
||||
IPV4_DEVCONF_RP_FILTER,
|
||||
IPV4_DEVCONF_ACCEPT_SOURCE_ROUTE,
|
||||
IPV4_DEVCONF_BOOTP_RELAY,
|
||||
IPV4_DEVCONF_LOG_MARTIANS,
|
||||
IPV4_DEVCONF_TAG,
|
||||
IPV4_DEVCONF_ARPFILTER,
|
||||
IPV4_DEVCONF_MEDIUM_ID,
|
||||
IPV4_DEVCONF_NOXFRM,
|
||||
IPV4_DEVCONF_NOPOLICY,
|
||||
IPV4_DEVCONF_FORCE_IGMP_VERSION,
|
||||
IPV4_DEVCONF_ARP_ANNOUNCE,
|
||||
IPV4_DEVCONF_ARP_IGNORE,
|
||||
IPV4_DEVCONF_PROMOTE_SECONDARIES,
|
||||
IPV4_DEVCONF_ARP_ACCEPT,
|
||||
IPV4_DEVCONF_ARP_NOTIFY,
|
||||
IPV4_DEVCONF_ACCEPT_LOCAL,
|
||||
IPV4_DEVCONF_SRC_VMARK,
|
||||
IPV4_DEVCONF_PROXY_ARP_PVLAN,
|
||||
IPV4_DEVCONF_ROUTE_LOCALNET,
|
||||
IPV4_DEVCONF_IGMPV2_UNSOLICITED_REPORT_INTERVAL,
|
||||
IPV4_DEVCONF_IGMPV3_UNSOLICITED_REPORT_INTERVAL,
|
||||
__IPV4_DEVCONF_MAX
|
||||
};
|
||||
|
||||
#define IPV4_DEVCONF_MAX (__IPV4_DEVCONF_MAX - 1)
|
||||
|
||||
#endif /* _UAPI_LINUX_IP_H */
|
||||
|
@ -955,7 +955,7 @@ config MEMCG_SWAP_ENABLED
|
||||
Memory Resource Controller Swap Extension comes with its price in
|
||||
a bigger memory consumption. General purpose distribution kernels
|
||||
which want to enable the feature but keep it disabled by default
|
||||
and let the user enable it by swapaccount boot command line
|
||||
and let the user enable it by swapaccount=1 boot command line
|
||||
parameter should have this option unselected.
|
||||
For those who want to have the feature enabled by default should
|
||||
select this option (if, for some reason, they need to disable it
|
||||
|
@ -1608,11 +1608,13 @@ static int cpuset_write_u64(struct cgroup *cgrp, struct cftype *cft, u64 val)
|
||||
{
|
||||
struct cpuset *cs = cgroup_cs(cgrp);
|
||||
cpuset_filetype_t type = cft->private;
|
||||
int retval = -ENODEV;
|
||||
int retval = 0;
|
||||
|
||||
mutex_lock(&cpuset_mutex);
|
||||
if (!is_cpuset_online(cs))
|
||||
if (!is_cpuset_online(cs)) {
|
||||
retval = -ENODEV;
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
switch (type) {
|
||||
case FILE_CPU_EXCLUSIVE:
|
||||
|
@ -121,7 +121,7 @@ void __init setup_sched_clock(u32 (*read)(void), int bits, unsigned long rate)
|
||||
BUG_ON(bits > 32);
|
||||
WARN_ON(!irqs_disabled());
|
||||
read_sched_clock = read;
|
||||
sched_clock_mask = (1 << bits) - 1;
|
||||
sched_clock_mask = (1ULL << bits) - 1;
|
||||
cd.rate = rate;
|
||||
|
||||
/* calculate the mult/shift to convert counter ticks to ns. */
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user