mirror of
https://github.com/torvalds/linux.git
synced 2024-11-07 12:41:55 +00:00
Merge branch 'perf/urgent' into perf/core, to pick up PMU driver fixes.
Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
commit
1111b680d3
@ -119,7 +119,7 @@ Optional Properties (for HDMI pins):
|
||||
Example:
|
||||
// pin controller node
|
||||
pinctrl@35004800 {
|
||||
compatible = "brcmbcm11351-pinctrl";
|
||||
compatible = "brcm,bcm11351-pinctrl";
|
||||
reg = <0x35004800 0x430>;
|
||||
|
||||
// pin configuration node
|
||||
|
@ -132,7 +132,7 @@ CONFIG_CRC_ITU_T=y
|
||||
CONFIG_CRC7=y
|
||||
CONFIG_XZ_DEC=y
|
||||
CONFIG_AVERAGE=y
|
||||
CONFIG_PINCTRL_CAPRI=y
|
||||
CONFIG_PINCTRL_BCM281XX=y
|
||||
CONFIG_WATCHDOG=y
|
||||
CONFIG_BCM_KONA_WDT=y
|
||||
CONFIG_BCM_KONA_WDT_DEBUG=y
|
||||
|
@ -259,7 +259,7 @@ start_ap:
|
||||
* Switch into virtual mode:
|
||||
*/
|
||||
movl r16=(IA64_PSR_IT|IA64_PSR_IC|IA64_PSR_DT|IA64_PSR_RT|IA64_PSR_DFH|IA64_PSR_BN \
|
||||
|IA64_PSR_DI|IA64_PSR_AC)
|
||||
|IA64_PSR_DI)
|
||||
;;
|
||||
mov cr.ipsr=r16
|
||||
movl r17=1f
|
||||
|
@ -58,7 +58,7 @@
|
||||
#include <asm/unistd.h>
|
||||
#include <asm/errno.h>
|
||||
|
||||
#if 1
|
||||
#if 0
|
||||
# define PSR_DEFAULT_BITS psr.ac
|
||||
#else
|
||||
# define PSR_DEFAULT_BITS 0
|
||||
|
@ -64,7 +64,7 @@
|
||||
#include "kvm_minstate.h"
|
||||
#include "vti.h"
|
||||
|
||||
#if 1
|
||||
#if 0
|
||||
# define PSR_DEFAULT_BITS psr.ac
|
||||
#else
|
||||
# define PSR_DEFAULT_BITS 0
|
||||
|
@ -31,4 +31,23 @@
|
||||
#define SIGP_STATUS_INCORRECT_STATE 0x00000200UL
|
||||
#define SIGP_STATUS_NOT_RUNNING 0x00000400UL
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
static inline int __pcpu_sigp(u16 addr, u8 order, u32 parm, u32 *status)
|
||||
{
|
||||
register unsigned int reg1 asm ("1") = parm;
|
||||
int cc;
|
||||
|
||||
asm volatile(
|
||||
" sigp %1,%2,0(%3)\n"
|
||||
" ipm %0\n"
|
||||
" srl %0,28\n"
|
||||
: "=d" (cc), "+d" (reg1) : "d" (addr), "a" (order) : "cc");
|
||||
if (status && cc == 1)
|
||||
*status = reg1;
|
||||
return cc;
|
||||
}
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#endif /* __S390_ASM_SIGP_H */
|
||||
|
@ -7,6 +7,8 @@
|
||||
#ifndef __ASM_SMP_H
|
||||
#define __ASM_SMP_H
|
||||
|
||||
#include <asm/sigp.h>
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
|
||||
#include <asm/lowcore.h>
|
||||
@ -50,9 +52,18 @@ static inline int smp_store_status(int cpu) { return 0; }
|
||||
static inline int smp_vcpu_scheduled(int cpu) { return 1; }
|
||||
static inline void smp_yield_cpu(int cpu) { }
|
||||
static inline void smp_yield(void) { }
|
||||
static inline void smp_stop_cpu(void) { }
|
||||
static inline void smp_fill_possible_mask(void) { }
|
||||
|
||||
static inline void smp_stop_cpu(void)
|
||||
{
|
||||
u16 pcpu = stap();
|
||||
|
||||
for (;;) {
|
||||
__pcpu_sigp(pcpu, SIGP_STOP, 0, NULL);
|
||||
cpu_relax();
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* CONFIG_SMP */
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
|
@ -282,7 +282,8 @@
|
||||
#define __NR_finit_module 344
|
||||
#define __NR_sched_setattr 345
|
||||
#define __NR_sched_getattr 346
|
||||
#define NR_syscalls 345
|
||||
#define __NR_renameat2 347
|
||||
#define NR_syscalls 348
|
||||
|
||||
/*
|
||||
* There are some system calls that are not present on 64 bit, some
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Compat sytem call wrappers.
|
||||
* Compat system call wrappers.
|
||||
*
|
||||
* Copyright IBM Corp. 2014
|
||||
*/
|
||||
@ -213,3 +213,4 @@ COMPAT_SYSCALL_WRAP5(kcmp, pid_t, pid1, pid_t, pid2, int, type, unsigned long, i
|
||||
COMPAT_SYSCALL_WRAP3(finit_module, int, fd, const char __user *, uargs, int, flags);
|
||||
COMPAT_SYSCALL_WRAP3(sched_setattr, pid_t, pid, struct sched_attr __user *, attr, unsigned int, flags);
|
||||
COMPAT_SYSCALL_WRAP4(sched_getattr, pid_t, pid, struct sched_attr __user *, attr, unsigned int, size, unsigned int, flags);
|
||||
COMPAT_SYSCALL_WRAP5(renameat2, int, olddfd, const char __user *, oldname, int, newdfd, const char __user *, newname, unsigned int, flags);
|
||||
|
@ -144,10 +144,10 @@ void show_registers(struct pt_regs *regs)
|
||||
char *mode;
|
||||
|
||||
mode = user_mode(regs) ? "User" : "Krnl";
|
||||
printk("%s PSW : %p %p (%pSR)\n",
|
||||
mode, (void *) regs->psw.mask,
|
||||
(void *) regs->psw.addr,
|
||||
(void *) regs->psw.addr);
|
||||
printk("%s PSW : %p %p", mode, (void *)regs->psw.mask, (void *)regs->psw.addr);
|
||||
if (!user_mode(regs))
|
||||
printk(" (%pSR)", (void *)regs->psw.addr);
|
||||
printk("\n");
|
||||
printk(" R:%x T:%x IO:%x EX:%x Key:%x M:%x W:%x "
|
||||
"P:%x AS:%x CC:%x PM:%x", mask_bits(regs, PSW_MASK_PER),
|
||||
mask_bits(regs, PSW_MASK_DAT), mask_bits(regs, PSW_MASK_IO),
|
||||
|
@ -64,7 +64,7 @@ void update_cr_regs(struct task_struct *task)
|
||||
if (task->thread.per_flags & PER_FLAG_NO_TE)
|
||||
cr_new &= ~(1UL << 55);
|
||||
if (cr_new != cr)
|
||||
__ctl_load(cr, 0, 0);
|
||||
__ctl_load(cr_new, 0, 0);
|
||||
/* Set or clear transaction execution TDC bits 62 and 63. */
|
||||
__ctl_store(cr, 2, 2);
|
||||
cr_new = cr & ~3UL;
|
||||
|
@ -1027,3 +1027,35 @@ void __init setup_arch(char **cmdline_p)
|
||||
/* Setup zfcpdump support */
|
||||
setup_zfcpdump();
|
||||
}
|
||||
|
||||
#ifdef CONFIG_32BIT
|
||||
static int no_removal_warning __initdata;
|
||||
|
||||
static int __init parse_no_removal_warning(char *str)
|
||||
{
|
||||
no_removal_warning = 1;
|
||||
return 0;
|
||||
}
|
||||
__setup("no_removal_warning", parse_no_removal_warning);
|
||||
|
||||
static int __init removal_warning(void)
|
||||
{
|
||||
if (no_removal_warning)
|
||||
return 0;
|
||||
printk(KERN_ALERT "\n\n");
|
||||
printk(KERN_CONT "Warning - you are using a 31 bit kernel!\n\n");
|
||||
printk(KERN_CONT "We plan to remove 31 bit kernel support from the kernel sources in March 2015.\n");
|
||||
printk(KERN_CONT "Currently we assume that nobody is using the 31 bit kernel on old 31 bit\n");
|
||||
printk(KERN_CONT "hardware anymore. If you think that the code should not be removed and also\n");
|
||||
printk(KERN_CONT "future versions of the Linux kernel should be able to run in 31 bit mode\n");
|
||||
printk(KERN_CONT "please let us know. Please write to:\n");
|
||||
printk(KERN_CONT "linux390@de.ibm.com (mail address) and/or\n");
|
||||
printk(KERN_CONT "linux-s390@vger.kernel.org (mailing list).\n\n");
|
||||
printk(KERN_CONT "Thank you!\n\n");
|
||||
printk(KERN_CONT "If this kernel runs on a 64 bit machine you may consider using a 64 bit kernel.\n");
|
||||
printk(KERN_CONT "This message can be disabled with the \"no_removal_warning\" kernel parameter.\n");
|
||||
schedule_timeout_uninterruptible(300 * HZ);
|
||||
return 0;
|
||||
}
|
||||
early_initcall(removal_warning);
|
||||
#endif
|
||||
|
@ -82,21 +82,6 @@ DEFINE_MUTEX(smp_cpu_state_mutex);
|
||||
/*
|
||||
* Signal processor helper functions.
|
||||
*/
|
||||
static inline int __pcpu_sigp(u16 addr, u8 order, u32 parm, u32 *status)
|
||||
{
|
||||
register unsigned int reg1 asm ("1") = parm;
|
||||
int cc;
|
||||
|
||||
asm volatile(
|
||||
" sigp %1,%2,0(%3)\n"
|
||||
" ipm %0\n"
|
||||
" srl %0,28\n"
|
||||
: "=d" (cc), "+d" (reg1) : "d" (addr), "a" (order) : "cc");
|
||||
if (status && cc == 1)
|
||||
*status = reg1;
|
||||
return cc;
|
||||
}
|
||||
|
||||
static inline int __pcpu_sigp_relax(u16 addr, u8 order, u32 parm, u32 *status)
|
||||
{
|
||||
int cc;
|
||||
|
@ -355,3 +355,4 @@ SYSCALL(sys_kcmp,sys_kcmp,compat_sys_kcmp)
|
||||
SYSCALL(sys_finit_module,sys_finit_module,compat_sys_finit_module)
|
||||
SYSCALL(sys_sched_setattr,sys_sched_setattr,compat_sys_sched_setattr) /* 345 */
|
||||
SYSCALL(sys_sched_getattr,sys_sched_getattr,compat_sys_sched_getattr)
|
||||
SYSCALL(sys_renameat2,sys_renameat2,compat_sys_renameat2)
|
||||
|
@ -338,9 +338,6 @@ static inline unsigned long strnlen_user_srst(const char __user *src,
|
||||
register unsigned long reg0 asm("0") = 0;
|
||||
unsigned long tmp1, tmp2;
|
||||
|
||||
if (unlikely(!size))
|
||||
return 0;
|
||||
update_primary_asce(current);
|
||||
asm volatile(
|
||||
" la %2,0(%1)\n"
|
||||
" la %3,0(%0,%1)\n"
|
||||
@ -359,6 +356,8 @@ static inline unsigned long strnlen_user_srst(const char __user *src,
|
||||
|
||||
unsigned long __strnlen_user(const char __user *src, unsigned long size)
|
||||
{
|
||||
if (unlikely(!size))
|
||||
return 0;
|
||||
update_primary_asce(current);
|
||||
return strnlen_user_srst(src, size);
|
||||
}
|
||||
|
@ -126,6 +126,133 @@ static inline int user_space_fault(struct pt_regs *regs)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int bad_address(void *p)
|
||||
{
|
||||
unsigned long dummy;
|
||||
|
||||
return probe_kernel_address((unsigned long *)p, dummy);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
static void dump_pagetable(unsigned long asce, unsigned long address)
|
||||
{
|
||||
unsigned long *table = __va(asce & PAGE_MASK);
|
||||
|
||||
pr_alert("AS:%016lx ", asce);
|
||||
switch (asce & _ASCE_TYPE_MASK) {
|
||||
case _ASCE_TYPE_REGION1:
|
||||
table = table + ((address >> 53) & 0x7ff);
|
||||
if (bad_address(table))
|
||||
goto bad;
|
||||
pr_cont("R1:%016lx ", *table);
|
||||
if (*table & _REGION_ENTRY_INVALID)
|
||||
goto out;
|
||||
table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN);
|
||||
/* fallthrough */
|
||||
case _ASCE_TYPE_REGION2:
|
||||
table = table + ((address >> 42) & 0x7ff);
|
||||
if (bad_address(table))
|
||||
goto bad;
|
||||
pr_cont("R2:%016lx ", *table);
|
||||
if (*table & _REGION_ENTRY_INVALID)
|
||||
goto out;
|
||||
table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN);
|
||||
/* fallthrough */
|
||||
case _ASCE_TYPE_REGION3:
|
||||
table = table + ((address >> 31) & 0x7ff);
|
||||
if (bad_address(table))
|
||||
goto bad;
|
||||
pr_cont("R3:%016lx ", *table);
|
||||
if (*table & (_REGION_ENTRY_INVALID | _REGION3_ENTRY_LARGE))
|
||||
goto out;
|
||||
table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN);
|
||||
/* fallthrough */
|
||||
case _ASCE_TYPE_SEGMENT:
|
||||
table = table + ((address >> 20) & 0x7ff);
|
||||
if (bad_address(table))
|
||||
goto bad;
|
||||
pr_cont(KERN_CONT "S:%016lx ", *table);
|
||||
if (*table & (_SEGMENT_ENTRY_INVALID | _SEGMENT_ENTRY_LARGE))
|
||||
goto out;
|
||||
table = (unsigned long *)(*table & _SEGMENT_ENTRY_ORIGIN);
|
||||
}
|
||||
table = table + ((address >> 12) & 0xff);
|
||||
if (bad_address(table))
|
||||
goto bad;
|
||||
pr_cont("P:%016lx ", *table);
|
||||
out:
|
||||
pr_cont("\n");
|
||||
return;
|
||||
bad:
|
||||
pr_cont("BAD\n");
|
||||
}
|
||||
|
||||
#else /* CONFIG_64BIT */
|
||||
|
||||
static void dump_pagetable(unsigned long asce, unsigned long address)
|
||||
{
|
||||
unsigned long *table = __va(asce & PAGE_MASK);
|
||||
|
||||
pr_alert("AS:%08lx ", asce);
|
||||
table = table + ((address >> 20) & 0x7ff);
|
||||
if (bad_address(table))
|
||||
goto bad;
|
||||
pr_cont("S:%08lx ", *table);
|
||||
if (*table & _SEGMENT_ENTRY_INVALID)
|
||||
goto out;
|
||||
table = (unsigned long *)(*table & _SEGMENT_ENTRY_ORIGIN);
|
||||
table = table + ((address >> 12) & 0xff);
|
||||
if (bad_address(table))
|
||||
goto bad;
|
||||
pr_cont("P:%08lx ", *table);
|
||||
out:
|
||||
pr_cont("\n");
|
||||
return;
|
||||
bad:
|
||||
pr_cont("BAD\n");
|
||||
}
|
||||
|
||||
#endif /* CONFIG_64BIT */
|
||||
|
||||
static void dump_fault_info(struct pt_regs *regs)
|
||||
{
|
||||
unsigned long asce;
|
||||
|
||||
pr_alert("Fault in ");
|
||||
switch (regs->int_parm_long & 3) {
|
||||
case 3:
|
||||
pr_cont("home space ");
|
||||
break;
|
||||
case 2:
|
||||
pr_cont("secondary space ");
|
||||
break;
|
||||
case 1:
|
||||
pr_cont("access register ");
|
||||
break;
|
||||
case 0:
|
||||
pr_cont("primary space ");
|
||||
break;
|
||||
}
|
||||
pr_cont("mode while using ");
|
||||
if (!user_space_fault(regs)) {
|
||||
asce = S390_lowcore.kernel_asce;
|
||||
pr_cont("kernel ");
|
||||
}
|
||||
#ifdef CONFIG_PGSTE
|
||||
else if ((current->flags & PF_VCPU) && S390_lowcore.gmap) {
|
||||
struct gmap *gmap = (struct gmap *)S390_lowcore.gmap;
|
||||
asce = gmap->asce;
|
||||
pr_cont("gmap ");
|
||||
}
|
||||
#endif
|
||||
else {
|
||||
asce = S390_lowcore.user_asce;
|
||||
pr_cont("user ");
|
||||
}
|
||||
pr_cont("ASCE.\n");
|
||||
dump_pagetable(asce, regs->int_parm_long & __FAIL_ADDR_MASK);
|
||||
}
|
||||
|
||||
static inline void report_user_fault(struct pt_regs *regs, long signr)
|
||||
{
|
||||
if ((task_pid_nr(current) > 1) && !show_unhandled_signals)
|
||||
@ -138,8 +265,9 @@ static inline void report_user_fault(struct pt_regs *regs, long signr)
|
||||
regs->int_code);
|
||||
print_vma_addr(KERN_CONT "in ", regs->psw.addr & PSW_ADDR_INSN);
|
||||
printk(KERN_CONT "\n");
|
||||
printk(KERN_ALERT "failing address: %lX\n",
|
||||
regs->int_parm_long & __FAIL_ADDR_MASK);
|
||||
printk(KERN_ALERT "failing address: %016lx TEID: %016lx\n",
|
||||
regs->int_parm_long & __FAIL_ADDR_MASK, regs->int_parm_long);
|
||||
dump_fault_info(regs);
|
||||
show_regs(regs);
|
||||
}
|
||||
|
||||
@ -177,11 +305,13 @@ static noinline void do_no_context(struct pt_regs *regs)
|
||||
address = regs->int_parm_long & __FAIL_ADDR_MASK;
|
||||
if (!user_space_fault(regs))
|
||||
printk(KERN_ALERT "Unable to handle kernel pointer dereference"
|
||||
" at virtual kernel address %p\n", (void *)address);
|
||||
" in virtual kernel address space\n");
|
||||
else
|
||||
printk(KERN_ALERT "Unable to handle kernel paging request"
|
||||
" at virtual user address %p\n", (void *)address);
|
||||
|
||||
" in virtual user address space\n");
|
||||
printk(KERN_ALERT "failing address: %016lx TEID: %016lx\n",
|
||||
regs->int_parm_long & __FAIL_ADDR_MASK, regs->int_parm_long);
|
||||
dump_fault_info(regs);
|
||||
die(regs, "Oops");
|
||||
do_exit(SIGKILL);
|
||||
}
|
||||
|
@ -250,8 +250,8 @@ archclean:
|
||||
PHONY += kvmconfig
|
||||
kvmconfig:
|
||||
$(if $(wildcard $(objtree)/.config),, $(error You need an existing .config for this target))
|
||||
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/kconfig/merge_config.sh -m -O $(objtree) $(objtree)/.config arch/x86/configs/kvm_guest.config
|
||||
$(Q)yes "" | $(MAKE) oldconfig
|
||||
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/kconfig/merge_config.sh -m -O $(objtree) $(objtree)/.config $(srctree)/arch/x86/configs/kvm_guest.config
|
||||
$(Q)yes "" | $(MAKE) -f $(srctree)/Makefile oldconfig
|
||||
|
||||
define archhelp
|
||||
echo '* bzImage - Compressed kernel image (arch/x86/boot/bzImage)'
|
||||
|
@ -60,7 +60,7 @@
|
||||
| X86_CR4_PSE | X86_CR4_PAE | X86_CR4_MCE \
|
||||
| X86_CR4_PGE | X86_CR4_PCE | X86_CR4_OSFXSR | X86_CR4_PCIDE \
|
||||
| X86_CR4_OSXSAVE | X86_CR4_SMEP | X86_CR4_FSGSBASE \
|
||||
| X86_CR4_OSXMMEXCPT | X86_CR4_VMXE))
|
||||
| X86_CR4_OSXMMEXCPT | X86_CR4_VMXE | X86_CR4_SMAP))
|
||||
|
||||
#define CR8_RESERVED_BITS (~(unsigned long)X86_CR8_TPR)
|
||||
|
||||
|
@ -535,6 +535,7 @@ static int rapl_cpu_prepare(int cpu)
|
||||
struct rapl_pmu *pmu = per_cpu(rapl_pmu, cpu);
|
||||
int phys_id = topology_physical_package_id(cpu);
|
||||
u64 ms;
|
||||
u64 msr_rapl_power_unit_bits;
|
||||
|
||||
if (pmu)
|
||||
return 0;
|
||||
@ -542,6 +543,9 @@ static int rapl_cpu_prepare(int cpu)
|
||||
if (phys_id < 0)
|
||||
return -1;
|
||||
|
||||
if (!rdmsrl_safe(MSR_RAPL_POWER_UNIT, &msr_rapl_power_unit_bits))
|
||||
return -1;
|
||||
|
||||
pmu = kzalloc_node(sizeof(*pmu), GFP_KERNEL, cpu_to_node(cpu));
|
||||
if (!pmu)
|
||||
return -1;
|
||||
@ -555,8 +559,7 @@ static int rapl_cpu_prepare(int cpu)
|
||||
*
|
||||
* we cache in local PMU instance
|
||||
*/
|
||||
rdmsrl(MSR_RAPL_POWER_UNIT, pmu->hw_unit);
|
||||
pmu->hw_unit = (pmu->hw_unit >> 8) & 0x1FULL;
|
||||
pmu->hw_unit = (msr_rapl_power_unit_bits >> 8) & 0x1FULL;
|
||||
pmu->pmu = &rapl_pmu_class;
|
||||
|
||||
/*
|
||||
@ -677,7 +680,9 @@ static int __init rapl_pmu_init(void)
|
||||
cpu_notifier_register_begin();
|
||||
|
||||
for_each_online_cpu(cpu) {
|
||||
rapl_cpu_prepare(cpu);
|
||||
ret = rapl_cpu_prepare(cpu);
|
||||
if (ret)
|
||||
goto out;
|
||||
rapl_cpu_init(cpu);
|
||||
}
|
||||
|
||||
@ -700,6 +705,7 @@ static int __init rapl_pmu_init(void)
|
||||
hweight32(rapl_cntr_mask),
|
||||
ktime_to_ms(pmu->timer_interval));
|
||||
|
||||
out:
|
||||
cpu_notifier_register_done();
|
||||
|
||||
return 0;
|
||||
|
@ -240,7 +240,7 @@ static u32 __init intel_stolen_base(int num, int slot, int func, size_t stolen_s
|
||||
return base;
|
||||
}
|
||||
|
||||
#define KB(x) ((x) * 1024)
|
||||
#define KB(x) ((x) * 1024UL)
|
||||
#define MB(x) (KB (KB (x)))
|
||||
#define GB(x) (MB (KB (x)))
|
||||
|
||||
|
@ -897,9 +897,10 @@ int __kprobes kprobe_fault_handler(struct pt_regs *regs, int trapnr)
|
||||
struct kprobe *cur = kprobe_running();
|
||||
struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
|
||||
|
||||
switch (kcb->kprobe_status) {
|
||||
case KPROBE_HIT_SS:
|
||||
case KPROBE_REENTER:
|
||||
if (unlikely(regs->ip == (unsigned long)cur->ainsn.insn)) {
|
||||
/* This must happen on single-stepping */
|
||||
WARN_ON(kcb->kprobe_status != KPROBE_HIT_SS &&
|
||||
kcb->kprobe_status != KPROBE_REENTER);
|
||||
/*
|
||||
* We are here because the instruction being single
|
||||
* stepped caused a page fault. We reset the current
|
||||
@ -914,9 +915,8 @@ int __kprobes kprobe_fault_handler(struct pt_regs *regs, int trapnr)
|
||||
else
|
||||
reset_current_kprobe();
|
||||
preempt_enable_no_resched();
|
||||
break;
|
||||
case KPROBE_HIT_ACTIVE:
|
||||
case KPROBE_HIT_SSDONE:
|
||||
} else if (kcb->kprobe_status == KPROBE_HIT_ACTIVE ||
|
||||
kcb->kprobe_status == KPROBE_HIT_SSDONE) {
|
||||
/*
|
||||
* We increment the nmissed count for accounting,
|
||||
* we can also use npre/npostfault count for accounting
|
||||
@ -945,10 +945,8 @@ int __kprobes kprobe_fault_handler(struct pt_regs *regs, int trapnr)
|
||||
* fixup routine could not handle it,
|
||||
* Let do_page_fault() fix it.
|
||||
*/
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -114,8 +114,8 @@ EXPORT_SYMBOL(machine_real_restart);
|
||||
*/
|
||||
static int __init set_pci_reboot(const struct dmi_system_id *d)
|
||||
{
|
||||
if (reboot_type != BOOT_CF9) {
|
||||
reboot_type = BOOT_CF9;
|
||||
if (reboot_type != BOOT_CF9_FORCE) {
|
||||
reboot_type = BOOT_CF9_FORCE;
|
||||
pr_info("%s series board detected. Selecting %s-method for reboots.\n",
|
||||
d->ident, "PCI");
|
||||
}
|
||||
@ -458,20 +458,23 @@ void __attribute__((weak)) mach_reboot_fixups(void)
|
||||
}
|
||||
|
||||
/*
|
||||
* Windows compatible x86 hardware expects the following on reboot:
|
||||
* To the best of our knowledge Windows compatible x86 hardware expects
|
||||
* the following on reboot:
|
||||
*
|
||||
* 1) If the FADT has the ACPI reboot register flag set, try it
|
||||
* 2) If still alive, write to the keyboard controller
|
||||
* 3) If still alive, write to the ACPI reboot register again
|
||||
* 4) If still alive, write to the keyboard controller again
|
||||
* 5) If still alive, call the EFI runtime service to reboot
|
||||
* 6) If still alive, write to the PCI IO port 0xCF9 to reboot
|
||||
* 7) If still alive, inform BIOS to do a proper reboot
|
||||
* 6) If no EFI runtime service, call the BIOS to do a reboot
|
||||
*
|
||||
* If the machine is still alive at this stage, it gives up. We default to
|
||||
* following the same pattern, except that if we're still alive after (7) we'll
|
||||
* try to force a triple fault and then cycle between hitting the keyboard
|
||||
* controller and doing that
|
||||
* We default to following the same pattern. We also have
|
||||
* two other reboot methods: 'triple fault' and 'PCI', which
|
||||
* can be triggered via the reboot= kernel boot option or
|
||||
* via quirks.
|
||||
*
|
||||
* This means that this function can never return, it can misbehave
|
||||
* by not rebooting properly and hanging.
|
||||
*/
|
||||
static void native_machine_emergency_restart(void)
|
||||
{
|
||||
@ -492,6 +495,11 @@ static void native_machine_emergency_restart(void)
|
||||
for (;;) {
|
||||
/* Could also try the reset bit in the Hammer NB */
|
||||
switch (reboot_type) {
|
||||
case BOOT_ACPI:
|
||||
acpi_reboot();
|
||||
reboot_type = BOOT_KBD;
|
||||
break;
|
||||
|
||||
case BOOT_KBD:
|
||||
mach_reboot_fixups(); /* For board specific fixups */
|
||||
|
||||
@ -509,43 +517,29 @@ static void native_machine_emergency_restart(void)
|
||||
}
|
||||
break;
|
||||
|
||||
case BOOT_TRIPLE:
|
||||
load_idt(&no_idt);
|
||||
__asm__ __volatile__("int3");
|
||||
|
||||
/* We're probably dead after this, but... */
|
||||
reboot_type = BOOT_KBD;
|
||||
break;
|
||||
|
||||
case BOOT_BIOS:
|
||||
machine_real_restart(MRR_BIOS);
|
||||
|
||||
/* We're probably dead after this, but... */
|
||||
reboot_type = BOOT_TRIPLE;
|
||||
break;
|
||||
|
||||
case BOOT_ACPI:
|
||||
acpi_reboot();
|
||||
reboot_type = BOOT_KBD;
|
||||
break;
|
||||
|
||||
case BOOT_EFI:
|
||||
if (efi_enabled(EFI_RUNTIME_SERVICES))
|
||||
efi.reset_system(reboot_mode == REBOOT_WARM ?
|
||||
EFI_RESET_WARM :
|
||||
EFI_RESET_COLD,
|
||||
EFI_SUCCESS, 0, NULL);
|
||||
reboot_type = BOOT_CF9_COND;
|
||||
reboot_type = BOOT_BIOS;
|
||||
break;
|
||||
|
||||
case BOOT_CF9:
|
||||
case BOOT_BIOS:
|
||||
machine_real_restart(MRR_BIOS);
|
||||
|
||||
/* We're probably dead after this, but... */
|
||||
reboot_type = BOOT_CF9_SAFE;
|
||||
break;
|
||||
|
||||
case BOOT_CF9_FORCE:
|
||||
port_cf9_safe = true;
|
||||
/* Fall through */
|
||||
|
||||
case BOOT_CF9_COND:
|
||||
case BOOT_CF9_SAFE:
|
||||
if (port_cf9_safe) {
|
||||
u8 reboot_code = reboot_mode == REBOOT_WARM ?
|
||||
0x06 : 0x0E;
|
||||
u8 reboot_code = reboot_mode == REBOOT_WARM ? 0x06 : 0x0E;
|
||||
u8 cf9 = inb(0xcf9) & ~reboot_code;
|
||||
outb(cf9|2, 0xcf9); /* Request hard reset */
|
||||
udelay(50);
|
||||
@ -553,7 +547,15 @@ static void native_machine_emergency_restart(void)
|
||||
outb(cf9|reboot_code, 0xcf9);
|
||||
udelay(50);
|
||||
}
|
||||
reboot_type = BOOT_BIOS;
|
||||
reboot_type = BOOT_TRIPLE;
|
||||
break;
|
||||
|
||||
case BOOT_TRIPLE:
|
||||
load_idt(&no_idt);
|
||||
__asm__ __volatile__("int3");
|
||||
|
||||
/* We're probably dead after this, but... */
|
||||
reboot_type = BOOT_KBD;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -308,7 +308,7 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function,
|
||||
const u32 kvm_supported_word9_x86_features =
|
||||
F(FSGSBASE) | F(BMI1) | F(HLE) | F(AVX2) | F(SMEP) |
|
||||
F(BMI2) | F(ERMS) | f_invpcid | F(RTM) | f_mpx | F(RDSEED) |
|
||||
F(ADX);
|
||||
F(ADX) | F(SMAP);
|
||||
|
||||
/* all calls to cpuid_count() should be made on the same cpu */
|
||||
get_cpu();
|
||||
|
@ -48,6 +48,14 @@ static inline bool guest_cpuid_has_smep(struct kvm_vcpu *vcpu)
|
||||
return best && (best->ebx & bit(X86_FEATURE_SMEP));
|
||||
}
|
||||
|
||||
static inline bool guest_cpuid_has_smap(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
struct kvm_cpuid_entry2 *best;
|
||||
|
||||
best = kvm_find_cpuid_entry(vcpu, 7, 0);
|
||||
return best && (best->ebx & bit(X86_FEATURE_SMAP));
|
||||
}
|
||||
|
||||
static inline bool guest_cpuid_has_fsgsbase(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
struct kvm_cpuid_entry2 *best;
|
||||
|
@ -3601,20 +3601,27 @@ static void reset_rsvds_bits_mask_ept(struct kvm_vcpu *vcpu,
|
||||
}
|
||||
}
|
||||
|
||||
static void update_permission_bitmask(struct kvm_vcpu *vcpu,
|
||||
void update_permission_bitmask(struct kvm_vcpu *vcpu,
|
||||
struct kvm_mmu *mmu, bool ept)
|
||||
{
|
||||
unsigned bit, byte, pfec;
|
||||
u8 map;
|
||||
bool fault, x, w, u, wf, uf, ff, smep;
|
||||
bool fault, x, w, u, wf, uf, ff, smapf, cr4_smap, cr4_smep, smap = 0;
|
||||
|
||||
smep = kvm_read_cr4_bits(vcpu, X86_CR4_SMEP);
|
||||
cr4_smep = kvm_read_cr4_bits(vcpu, X86_CR4_SMEP);
|
||||
cr4_smap = kvm_read_cr4_bits(vcpu, X86_CR4_SMAP);
|
||||
for (byte = 0; byte < ARRAY_SIZE(mmu->permissions); ++byte) {
|
||||
pfec = byte << 1;
|
||||
map = 0;
|
||||
wf = pfec & PFERR_WRITE_MASK;
|
||||
uf = pfec & PFERR_USER_MASK;
|
||||
ff = pfec & PFERR_FETCH_MASK;
|
||||
/*
|
||||
* PFERR_RSVD_MASK bit is set in PFEC if the access is not
|
||||
* subject to SMAP restrictions, and cleared otherwise. The
|
||||
* bit is only meaningful if the SMAP bit is set in CR4.
|
||||
*/
|
||||
smapf = !(pfec & PFERR_RSVD_MASK);
|
||||
for (bit = 0; bit < 8; ++bit) {
|
||||
x = bit & ACC_EXEC_MASK;
|
||||
w = bit & ACC_WRITE_MASK;
|
||||
@ -3626,12 +3633,33 @@ static void update_permission_bitmask(struct kvm_vcpu *vcpu,
|
||||
/* Allow supervisor writes if !cr0.wp */
|
||||
w |= !is_write_protection(vcpu) && !uf;
|
||||
/* Disallow supervisor fetches of user code if cr4.smep */
|
||||
x &= !(smep && u && !uf);
|
||||
x &= !(cr4_smep && u && !uf);
|
||||
|
||||
/*
|
||||
* SMAP:kernel-mode data accesses from user-mode
|
||||
* mappings should fault. A fault is considered
|
||||
* as a SMAP violation if all of the following
|
||||
* conditions are ture:
|
||||
* - X86_CR4_SMAP is set in CR4
|
||||
* - An user page is accessed
|
||||
* - Page fault in kernel mode
|
||||
* - if CPL = 3 or X86_EFLAGS_AC is clear
|
||||
*
|
||||
* Here, we cover the first three conditions.
|
||||
* The fourth is computed dynamically in
|
||||
* permission_fault() and is in smapf.
|
||||
*
|
||||
* Also, SMAP does not affect instruction
|
||||
* fetches, add the !ff check here to make it
|
||||
* clearer.
|
||||
*/
|
||||
smap = cr4_smap && u && !uf && !ff;
|
||||
} else
|
||||
/* Not really needed: no U/S accesses on ept */
|
||||
u = 1;
|
||||
|
||||
fault = (ff && !x) || (uf && !u) || (wf && !w);
|
||||
fault = (ff && !x) || (uf && !u) || (wf && !w) ||
|
||||
(smapf && smap);
|
||||
map |= fault << bit;
|
||||
}
|
||||
mmu->permissions[byte] = map;
|
||||
|
@ -44,11 +44,17 @@
|
||||
#define PT_DIRECTORY_LEVEL 2
|
||||
#define PT_PAGE_TABLE_LEVEL 1
|
||||
|
||||
#define PFERR_PRESENT_MASK (1U << 0)
|
||||
#define PFERR_WRITE_MASK (1U << 1)
|
||||
#define PFERR_USER_MASK (1U << 2)
|
||||
#define PFERR_RSVD_MASK (1U << 3)
|
||||
#define PFERR_FETCH_MASK (1U << 4)
|
||||
#define PFERR_PRESENT_BIT 0
|
||||
#define PFERR_WRITE_BIT 1
|
||||
#define PFERR_USER_BIT 2
|
||||
#define PFERR_RSVD_BIT 3
|
||||
#define PFERR_FETCH_BIT 4
|
||||
|
||||
#define PFERR_PRESENT_MASK (1U << PFERR_PRESENT_BIT)
|
||||
#define PFERR_WRITE_MASK (1U << PFERR_WRITE_BIT)
|
||||
#define PFERR_USER_MASK (1U << PFERR_USER_BIT)
|
||||
#define PFERR_RSVD_MASK (1U << PFERR_RSVD_BIT)
|
||||
#define PFERR_FETCH_MASK (1U << PFERR_FETCH_BIT)
|
||||
|
||||
int kvm_mmu_get_spte_hierarchy(struct kvm_vcpu *vcpu, u64 addr, u64 sptes[4]);
|
||||
void kvm_mmu_set_mmio_spte_mask(u64 mmio_mask);
|
||||
@ -73,6 +79,8 @@ int handle_mmio_page_fault_common(struct kvm_vcpu *vcpu, u64 addr, bool direct);
|
||||
void kvm_init_shadow_mmu(struct kvm_vcpu *vcpu, struct kvm_mmu *context);
|
||||
void kvm_init_shadow_ept_mmu(struct kvm_vcpu *vcpu, struct kvm_mmu *context,
|
||||
bool execonly);
|
||||
void update_permission_bitmask(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu,
|
||||
bool ept);
|
||||
|
||||
static inline unsigned int kvm_mmu_available_pages(struct kvm *kvm)
|
||||
{
|
||||
@ -110,10 +118,30 @@ static inline bool is_write_protection(struct kvm_vcpu *vcpu)
|
||||
* Will a fault with a given page-fault error code (pfec) cause a permission
|
||||
* fault with the given access (in ACC_* format)?
|
||||
*/
|
||||
static inline bool permission_fault(struct kvm_mmu *mmu, unsigned pte_access,
|
||||
unsigned pfec)
|
||||
static inline bool permission_fault(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu,
|
||||
unsigned pte_access, unsigned pfec)
|
||||
{
|
||||
return (mmu->permissions[pfec >> 1] >> pte_access) & 1;
|
||||
int cpl = kvm_x86_ops->get_cpl(vcpu);
|
||||
unsigned long rflags = kvm_x86_ops->get_rflags(vcpu);
|
||||
|
||||
/*
|
||||
* If CPL < 3, SMAP prevention are disabled if EFLAGS.AC = 1.
|
||||
*
|
||||
* If CPL = 3, SMAP applies to all supervisor-mode data accesses
|
||||
* (these are implicit supervisor accesses) regardless of the value
|
||||
* of EFLAGS.AC.
|
||||
*
|
||||
* This computes (cpl < 3) && (rflags & X86_EFLAGS_AC), leaving
|
||||
* the result in X86_EFLAGS_AC. We then insert it in place of
|
||||
* the PFERR_RSVD_MASK bit; this bit will always be zero in pfec,
|
||||
* but it will be one in index if SMAP checks are being overridden.
|
||||
* It is important to keep this branchless.
|
||||
*/
|
||||
unsigned long smap = (cpl - 3) & (rflags & X86_EFLAGS_AC);
|
||||
int index = (pfec >> 1) +
|
||||
(smap >> (X86_EFLAGS_AC_BIT - PFERR_RSVD_BIT + 1));
|
||||
|
||||
return (mmu->permissions[index] >> pte_access) & 1;
|
||||
}
|
||||
|
||||
void kvm_mmu_invalidate_zap_all_pages(struct kvm *kvm);
|
||||
|
@ -353,7 +353,7 @@ retry_walk:
|
||||
walker->ptes[walker->level - 1] = pte;
|
||||
} while (!is_last_gpte(mmu, walker->level, pte));
|
||||
|
||||
if (unlikely(permission_fault(mmu, pte_access, access))) {
|
||||
if (unlikely(permission_fault(vcpu, mmu, pte_access, access))) {
|
||||
errcode |= PFERR_PRESENT_MASK;
|
||||
goto error;
|
||||
}
|
||||
|
@ -3484,13 +3484,14 @@ static int vmx_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4)
|
||||
hw_cr4 &= ~X86_CR4_PAE;
|
||||
hw_cr4 |= X86_CR4_PSE;
|
||||
/*
|
||||
* SMEP is disabled if CPU is in non-paging mode in
|
||||
* hardware. However KVM always uses paging mode to
|
||||
* SMEP/SMAP is disabled if CPU is in non-paging mode
|
||||
* in hardware. However KVM always uses paging mode to
|
||||
* emulate guest non-paging mode with TDP.
|
||||
* To emulate this behavior, SMEP needs to be manually
|
||||
* disabled when guest switches to non-paging mode.
|
||||
* To emulate this behavior, SMEP/SMAP needs to be
|
||||
* manually disabled when guest switches to non-paging
|
||||
* mode.
|
||||
*/
|
||||
hw_cr4 &= ~X86_CR4_SMEP;
|
||||
hw_cr4 &= ~(X86_CR4_SMEP | X86_CR4_SMAP);
|
||||
} else if (!(cr4 & X86_CR4_PAE)) {
|
||||
hw_cr4 &= ~X86_CR4_PAE;
|
||||
}
|
||||
|
@ -652,6 +652,9 @@ int kvm_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4)
|
||||
if (!guest_cpuid_has_smep(vcpu) && (cr4 & X86_CR4_SMEP))
|
||||
return 1;
|
||||
|
||||
if (!guest_cpuid_has_smap(vcpu) && (cr4 & X86_CR4_SMAP))
|
||||
return 1;
|
||||
|
||||
if (!guest_cpuid_has_fsgsbase(vcpu) && (cr4 & X86_CR4_FSGSBASE))
|
||||
return 1;
|
||||
|
||||
@ -680,6 +683,9 @@ int kvm_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4)
|
||||
(!(cr4 & X86_CR4_PCIDE) && (old_cr4 & X86_CR4_PCIDE)))
|
||||
kvm_mmu_reset_context(vcpu);
|
||||
|
||||
if ((cr4 ^ old_cr4) & X86_CR4_SMAP)
|
||||
update_permission_bitmask(vcpu, vcpu->arch.walk_mmu, false);
|
||||
|
||||
if ((cr4 ^ old_cr4) & X86_CR4_OSXSAVE)
|
||||
kvm_update_cpuid(vcpu);
|
||||
|
||||
@ -1117,7 +1123,6 @@ static inline u64 get_kernel_ns(void)
|
||||
{
|
||||
struct timespec ts;
|
||||
|
||||
WARN_ON(preemptible());
|
||||
ktime_get_ts(&ts);
|
||||
monotonic_to_bootbased(&ts);
|
||||
return timespec_to_ns(&ts);
|
||||
@ -4164,7 +4169,8 @@ static int vcpu_mmio_gva_to_gpa(struct kvm_vcpu *vcpu, unsigned long gva,
|
||||
| (write ? PFERR_WRITE_MASK : 0);
|
||||
|
||||
if (vcpu_match_mmio_gva(vcpu, gva)
|
||||
&& !permission_fault(vcpu->arch.walk_mmu, vcpu->arch.access, access)) {
|
||||
&& !permission_fault(vcpu, vcpu->arch.walk_mmu,
|
||||
vcpu->arch.access, access)) {
|
||||
*gpa = vcpu->arch.mmio_gfn << PAGE_SHIFT |
|
||||
(gva & (PAGE_SIZE - 1));
|
||||
trace_vcpu_match_mmio(gva, *gpa, write, false);
|
||||
|
@ -54,5 +54,7 @@ syshdr-$(CONFIG_X86_64) += syscalls_64.h
|
||||
|
||||
targets += $(uapisyshdr-y) $(syshdr-y)
|
||||
|
||||
PHONY += all
|
||||
all: $(addprefix $(uapi)/,$(uapisyshdr-y))
|
||||
all: $(addprefix $(out)/,$(syshdr-y))
|
||||
@:
|
||||
|
@ -359,3 +359,4 @@
|
||||
350 i386 finit_module sys_finit_module
|
||||
351 i386 sched_setattr sys_sched_setattr
|
||||
352 i386 sched_getattr sys_sched_getattr
|
||||
353 i386 renameat2 sys_renameat2
|
||||
|
@ -40,4 +40,6 @@ $(obj)/insn_sanity.o: $(srctree)/arch/x86/lib/insn.c $(srctree)/arch/x86/lib/ina
|
||||
HOST_EXTRACFLAGS += -I$(srctree)/tools/include
|
||||
hostprogs-y += relocs
|
||||
relocs-objs := relocs_32.o relocs_64.o relocs_common.o
|
||||
PHONY += relocs
|
||||
relocs: $(obj)/relocs
|
||||
@:
|
||||
|
@ -61,18 +61,18 @@ static int bcm2835_rng_probe(struct platform_device *pdev)
|
||||
}
|
||||
bcm2835_rng_ops.priv = (unsigned long)rng_base;
|
||||
|
||||
/* set warm-up count & enable */
|
||||
__raw_writel(RNG_WARMUP_COUNT, rng_base + RNG_STATUS);
|
||||
__raw_writel(RNG_RBGEN, rng_base + RNG_CTRL);
|
||||
|
||||
/* register driver */
|
||||
err = hwrng_register(&bcm2835_rng_ops);
|
||||
if (err) {
|
||||
dev_err(dev, "hwrng registration failed\n");
|
||||
iounmap(rng_base);
|
||||
} else {
|
||||
} else
|
||||
dev_info(dev, "hwrng registered\n");
|
||||
|
||||
/* set warm-up count & enable */
|
||||
__raw_writel(RNG_WARMUP_COUNT, rng_base + RNG_STATUS);
|
||||
__raw_writel(RNG_RBGEN, rng_base + RNG_CTRL);
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include <linux/list.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/irqchip/chained_irq.h>
|
||||
#include <linux/irqdomain.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
@ -228,12 +229,17 @@ static int handle_one_vic(struct vic_device *vic, struct pt_regs *regs)
|
||||
static void vic_handle_irq_cascaded(unsigned int irq, struct irq_desc *desc)
|
||||
{
|
||||
u32 stat, hwirq;
|
||||
struct irq_chip *host_chip = irq_desc_get_chip(desc);
|
||||
struct vic_device *vic = irq_desc_get_handler_data(desc);
|
||||
|
||||
chained_irq_enter(host_chip, desc);
|
||||
|
||||
while ((stat = readl_relaxed(vic->base + VIC_IRQ_STATUS))) {
|
||||
hwirq = ffs(stat) - 1;
|
||||
generic_handle_irq(irq_find_mapping(vic->domain, hwirq));
|
||||
}
|
||||
|
||||
chained_irq_exit(host_chip, desc);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -8627,6 +8627,7 @@ bnx2_remove_one(struct pci_dev *pdev)
|
||||
pci_disable_device(pdev);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static int
|
||||
bnx2_suspend(struct device *device)
|
||||
{
|
||||
@ -8665,7 +8666,6 @@ bnx2_resume(struct device *device)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static SIMPLE_DEV_PM_OPS(bnx2_pm_ops, bnx2_suspend, bnx2_resume);
|
||||
#define BNX2_PM_OPS (&bnx2_pm_ops)
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
config NET_CADENCE
|
||||
bool "Cadence devices"
|
||||
depends on HAS_IOMEM
|
||||
depends on HAS_IOMEM && (ARM || AVR32 || COMPILE_TEST)
|
||||
default y
|
||||
---help---
|
||||
If you have a network (Ethernet) card belonging to this class, say Y.
|
||||
@ -22,7 +22,7 @@ if NET_CADENCE
|
||||
|
||||
config ARM_AT91_ETHER
|
||||
tristate "AT91RM9200 Ethernet support"
|
||||
depends on HAS_DMA
|
||||
depends on HAS_DMA && (ARCH_AT91RM9200 || COMPILE_TEST)
|
||||
select MACB
|
||||
---help---
|
||||
If you wish to compile a kernel for the AT91RM9200 and enable
|
||||
@ -30,7 +30,7 @@ config ARM_AT91_ETHER
|
||||
|
||||
config MACB
|
||||
tristate "Cadence MACB/GEM support"
|
||||
depends on HAS_DMA
|
||||
depends on HAS_DMA && (PLATFORM_AT32AP || ARCH_AT91 || ARCH_PICOXCELL || ARCH_ZYNQ || COMPILE_TEST)
|
||||
select PHYLIB
|
||||
---help---
|
||||
The Cadence MACB ethernet interface is found on many Atmel AT32 and
|
||||
|
@ -154,7 +154,7 @@ static int write_l2e(struct adapter *adap, struct l2t_entry *e, int sync)
|
||||
req->params = htons(L2T_W_PORT(e->lport) | L2T_W_NOREPLY(!sync));
|
||||
req->l2t_idx = htons(e->idx);
|
||||
req->vlan = htons(e->vlan);
|
||||
if (e->neigh)
|
||||
if (e->neigh && !(e->neigh->dev->flags & IFF_LOOPBACK))
|
||||
memcpy(e->dmac, e->neigh->ha, sizeof(e->dmac));
|
||||
memcpy(req->dst_mac, e->dmac, sizeof(req->dst_mac));
|
||||
|
||||
@ -394,6 +394,8 @@ struct l2t_entry *cxgb4_l2t_get(struct l2t_data *d, struct neighbour *neigh,
|
||||
if (e) {
|
||||
spin_lock(&e->lock); /* avoid race with t4_l2t_free */
|
||||
e->state = L2T_STATE_RESOLVING;
|
||||
if (neigh->dev->flags & IFF_LOOPBACK)
|
||||
memcpy(e->dmac, physdev->dev_addr, sizeof(e->dmac));
|
||||
memcpy(e->addr, addr, addr_len);
|
||||
e->ifindex = ifidx;
|
||||
e->hash = hash;
|
||||
|
@ -682,7 +682,7 @@ enum {
|
||||
SF_RD_ID = 0x9f, /* read ID */
|
||||
SF_ERASE_SECTOR = 0xd8, /* erase sector */
|
||||
|
||||
FW_MAX_SIZE = 512 * 1024,
|
||||
FW_MAX_SIZE = 16 * SF_SEC_SIZE,
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -374,6 +374,7 @@ enum vf_state {
|
||||
#define BE_FLAGS_NAPI_ENABLED (1 << 9)
|
||||
#define BE_FLAGS_QNQ_ASYNC_EVT_RCVD (1 << 11)
|
||||
#define BE_FLAGS_VXLAN_OFFLOADS (1 << 12)
|
||||
#define BE_FLAGS_SETUP_DONE (1 << 13)
|
||||
|
||||
#define BE_UC_PMAC_COUNT 30
|
||||
#define BE_VF_UC_PMAC_COUNT 2
|
||||
|
@ -2033,11 +2033,13 @@ static void be_tx_compl_clean(struct be_adapter *adapter)
|
||||
bool dummy_wrb;
|
||||
int i, pending_txqs;
|
||||
|
||||
/* Wait for a max of 200ms for all the tx-completions to arrive. */
|
||||
/* Stop polling for compls when HW has been silent for 10ms */
|
||||
do {
|
||||
pending_txqs = adapter->num_tx_qs;
|
||||
|
||||
for_all_tx_queues(adapter, txo, i) {
|
||||
cmpl = 0;
|
||||
num_wrbs = 0;
|
||||
txq = &txo->q;
|
||||
while ((txcp = be_tx_compl_get(&txo->cq))) {
|
||||
end_idx =
|
||||
@ -2050,14 +2052,13 @@ static void be_tx_compl_clean(struct be_adapter *adapter)
|
||||
if (cmpl) {
|
||||
be_cq_notify(adapter, txo->cq.id, false, cmpl);
|
||||
atomic_sub(num_wrbs, &txq->used);
|
||||
cmpl = 0;
|
||||
num_wrbs = 0;
|
||||
timeo = 0;
|
||||
}
|
||||
if (atomic_read(&txq->used) == 0)
|
||||
pending_txqs--;
|
||||
}
|
||||
|
||||
if (pending_txqs == 0 || ++timeo > 200)
|
||||
if (pending_txqs == 0 || ++timeo > 10 || be_hw_error(adapter))
|
||||
break;
|
||||
|
||||
mdelay(1);
|
||||
@ -2725,6 +2726,12 @@ static int be_close(struct net_device *netdev)
|
||||
struct be_eq_obj *eqo;
|
||||
int i;
|
||||
|
||||
/* This protection is needed as be_close() may be called even when the
|
||||
* adapter is in cleared state (after eeh perm failure)
|
||||
*/
|
||||
if (!(adapter->flags & BE_FLAGS_SETUP_DONE))
|
||||
return 0;
|
||||
|
||||
be_roce_dev_close(adapter);
|
||||
|
||||
if (adapter->flags & BE_FLAGS_NAPI_ENABLED) {
|
||||
@ -3055,6 +3062,7 @@ static int be_clear(struct be_adapter *adapter)
|
||||
be_clear_queues(adapter);
|
||||
|
||||
be_msix_disable(adapter);
|
||||
adapter->flags &= ~BE_FLAGS_SETUP_DONE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -3559,6 +3567,7 @@ static int be_setup(struct be_adapter *adapter)
|
||||
adapter->phy.fc_autoneg = 1;
|
||||
|
||||
be_schedule_worker(adapter);
|
||||
adapter->flags |= BE_FLAGS_SETUP_DONE;
|
||||
return 0;
|
||||
err:
|
||||
be_clear(adapter);
|
||||
|
@ -89,9 +89,8 @@
|
||||
#define MVNETA_TX_IN_PRGRS BIT(1)
|
||||
#define MVNETA_TX_FIFO_EMPTY BIT(8)
|
||||
#define MVNETA_RX_MIN_FRAME_SIZE 0x247c
|
||||
#define MVNETA_SERDES_CFG 0x24A0
|
||||
#define MVNETA_SGMII_SERDES_CFG 0x24A0
|
||||
#define MVNETA_SGMII_SERDES_PROTO 0x0cc7
|
||||
#define MVNETA_RGMII_SERDES_PROTO 0x0667
|
||||
#define MVNETA_TYPE_PRIO 0x24bc
|
||||
#define MVNETA_FORCE_UNI BIT(21)
|
||||
#define MVNETA_TXQ_CMD_1 0x24e4
|
||||
@ -712,6 +711,35 @@ static void mvneta_rxq_bm_disable(struct mvneta_port *pp,
|
||||
mvreg_write(pp, MVNETA_RXQ_CONFIG_REG(rxq->id), val);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Sets the RGMII Enable bit (RGMIIEn) in port MAC control register */
|
||||
static void mvneta_gmac_rgmii_set(struct mvneta_port *pp, int enable)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
val = mvreg_read(pp, MVNETA_GMAC_CTRL_2);
|
||||
|
||||
if (enable)
|
||||
val |= MVNETA_GMAC2_PORT_RGMII;
|
||||
else
|
||||
val &= ~MVNETA_GMAC2_PORT_RGMII;
|
||||
|
||||
mvreg_write(pp, MVNETA_GMAC_CTRL_2, val);
|
||||
}
|
||||
|
||||
/* Config SGMII port */
|
||||
static void mvneta_port_sgmii_config(struct mvneta_port *pp)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
val = mvreg_read(pp, MVNETA_GMAC_CTRL_2);
|
||||
val |= MVNETA_GMAC2_PCS_ENABLE;
|
||||
mvreg_write(pp, MVNETA_GMAC_CTRL_2, val);
|
||||
|
||||
mvreg_write(pp, MVNETA_SGMII_SERDES_CFG, MVNETA_SGMII_SERDES_PROTO);
|
||||
}
|
||||
|
||||
/* Start the Ethernet port RX and TX activity */
|
||||
static void mvneta_port_up(struct mvneta_port *pp)
|
||||
{
|
||||
@ -2729,15 +2757,12 @@ static void mvneta_port_power_up(struct mvneta_port *pp, int phy_mode)
|
||||
mvreg_write(pp, MVNETA_UNIT_INTR_CAUSE, 0);
|
||||
|
||||
if (phy_mode == PHY_INTERFACE_MODE_SGMII)
|
||||
mvreg_write(pp, MVNETA_SERDES_CFG, MVNETA_SGMII_SERDES_PROTO);
|
||||
else
|
||||
mvreg_write(pp, MVNETA_SERDES_CFG, MVNETA_RGMII_SERDES_PROTO);
|
||||
mvneta_port_sgmii_config(pp);
|
||||
|
||||
val = mvreg_read(pp, MVNETA_GMAC_CTRL_2);
|
||||
|
||||
val |= MVNETA_GMAC2_PCS_ENABLE | MVNETA_GMAC2_PORT_RGMII;
|
||||
mvneta_gmac_rgmii_set(pp, 1);
|
||||
|
||||
/* Cancel Port Reset */
|
||||
val = mvreg_read(pp, MVNETA_GMAC_CTRL_2);
|
||||
val &= ~MVNETA_GMAC2_PORT_RESET;
|
||||
mvreg_write(pp, MVNETA_GMAC_CTRL_2, val);
|
||||
|
||||
|
@ -2301,13 +2301,8 @@ static int __mlx4_init_one(struct pci_dev *pdev, int pci_dev_data)
|
||||
/* Allow large DMA segments, up to the firmware limit of 1 GB */
|
||||
dma_set_max_seg_size(&pdev->dev, 1024 * 1024 * 1024);
|
||||
|
||||
priv = kzalloc(sizeof(*priv), GFP_KERNEL);
|
||||
if (!priv) {
|
||||
err = -ENOMEM;
|
||||
goto err_release_regions;
|
||||
}
|
||||
|
||||
dev = &priv->dev;
|
||||
dev = pci_get_drvdata(pdev);
|
||||
priv = mlx4_priv(dev);
|
||||
dev->pdev = pdev;
|
||||
INIT_LIST_HEAD(&priv->ctx_list);
|
||||
spin_lock_init(&priv->ctx_lock);
|
||||
@ -2374,10 +2369,10 @@ static int __mlx4_init_one(struct pci_dev *pdev, int pci_dev_data)
|
||||
} else {
|
||||
atomic_inc(&pf_loading);
|
||||
err = pci_enable_sriov(pdev, total_vfs);
|
||||
atomic_dec(&pf_loading);
|
||||
if (err) {
|
||||
mlx4_err(dev, "Failed to enable SR-IOV, continuing without SR-IOV (err = %d).\n",
|
||||
err);
|
||||
atomic_dec(&pf_loading);
|
||||
err = 0;
|
||||
} else {
|
||||
mlx4_warn(dev, "Running in master mode\n");
|
||||
@ -2535,8 +2530,10 @@ slave_start:
|
||||
mlx4_sense_init(dev);
|
||||
mlx4_start_sense(dev);
|
||||
|
||||
priv->pci_dev_data = pci_dev_data;
|
||||
pci_set_drvdata(pdev, dev);
|
||||
priv->removed = 0;
|
||||
|
||||
if (mlx4_is_master(dev) && dev->num_vfs)
|
||||
atomic_dec(&pf_loading);
|
||||
|
||||
return 0;
|
||||
|
||||
@ -2588,6 +2585,9 @@ err_rel_own:
|
||||
if (!mlx4_is_slave(dev))
|
||||
mlx4_free_ownership(dev);
|
||||
|
||||
if (mlx4_is_master(dev) && dev->num_vfs)
|
||||
atomic_dec(&pf_loading);
|
||||
|
||||
kfree(priv->dev.dev_vfs);
|
||||
|
||||
err_free_dev:
|
||||
@ -2604,85 +2604,110 @@ err_disable_pdev:
|
||||
|
||||
static int mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
{
|
||||
struct mlx4_priv *priv;
|
||||
struct mlx4_dev *dev;
|
||||
|
||||
printk_once(KERN_INFO "%s", mlx4_version);
|
||||
|
||||
priv = kzalloc(sizeof(*priv), GFP_KERNEL);
|
||||
if (!priv)
|
||||
return -ENOMEM;
|
||||
|
||||
dev = &priv->dev;
|
||||
pci_set_drvdata(pdev, dev);
|
||||
priv->pci_dev_data = id->driver_data;
|
||||
|
||||
return __mlx4_init_one(pdev, id->driver_data);
|
||||
}
|
||||
|
||||
static void __mlx4_remove_one(struct pci_dev *pdev)
|
||||
{
|
||||
struct mlx4_dev *dev = pci_get_drvdata(pdev);
|
||||
struct mlx4_priv *priv = mlx4_priv(dev);
|
||||
int pci_dev_data;
|
||||
int p;
|
||||
|
||||
if (priv->removed)
|
||||
return;
|
||||
|
||||
pci_dev_data = priv->pci_dev_data;
|
||||
|
||||
/* in SRIOV it is not allowed to unload the pf's
|
||||
* driver while there are alive vf's */
|
||||
if (mlx4_is_master(dev) && mlx4_how_many_lives_vf(dev))
|
||||
printk(KERN_ERR "Removing PF when there are assigned VF's !!!\n");
|
||||
mlx4_stop_sense(dev);
|
||||
mlx4_unregister_device(dev);
|
||||
|
||||
for (p = 1; p <= dev->caps.num_ports; p++) {
|
||||
mlx4_cleanup_port_info(&priv->port[p]);
|
||||
mlx4_CLOSE_PORT(dev, p);
|
||||
}
|
||||
|
||||
if (mlx4_is_master(dev))
|
||||
mlx4_free_resource_tracker(dev,
|
||||
RES_TR_FREE_SLAVES_ONLY);
|
||||
|
||||
mlx4_cleanup_counters_table(dev);
|
||||
mlx4_cleanup_qp_table(dev);
|
||||
mlx4_cleanup_srq_table(dev);
|
||||
mlx4_cleanup_cq_table(dev);
|
||||
mlx4_cmd_use_polling(dev);
|
||||
mlx4_cleanup_eq_table(dev);
|
||||
mlx4_cleanup_mcg_table(dev);
|
||||
mlx4_cleanup_mr_table(dev);
|
||||
mlx4_cleanup_xrcd_table(dev);
|
||||
mlx4_cleanup_pd_table(dev);
|
||||
|
||||
if (mlx4_is_master(dev))
|
||||
mlx4_free_resource_tracker(dev,
|
||||
RES_TR_FREE_STRUCTS_ONLY);
|
||||
|
||||
iounmap(priv->kar);
|
||||
mlx4_uar_free(dev, &priv->driver_uar);
|
||||
mlx4_cleanup_uar_table(dev);
|
||||
if (!mlx4_is_slave(dev))
|
||||
mlx4_clear_steering(dev);
|
||||
mlx4_free_eq_table(dev);
|
||||
if (mlx4_is_master(dev))
|
||||
mlx4_multi_func_cleanup(dev);
|
||||
mlx4_close_hca(dev);
|
||||
if (mlx4_is_slave(dev))
|
||||
mlx4_multi_func_cleanup(dev);
|
||||
mlx4_cmd_cleanup(dev);
|
||||
|
||||
if (dev->flags & MLX4_FLAG_MSI_X)
|
||||
pci_disable_msix(pdev);
|
||||
if (dev->flags & MLX4_FLAG_SRIOV) {
|
||||
mlx4_warn(dev, "Disabling SR-IOV\n");
|
||||
pci_disable_sriov(pdev);
|
||||
dev->num_vfs = 0;
|
||||
}
|
||||
|
||||
if (!mlx4_is_slave(dev))
|
||||
mlx4_free_ownership(dev);
|
||||
|
||||
kfree(dev->caps.qp0_tunnel);
|
||||
kfree(dev->caps.qp0_proxy);
|
||||
kfree(dev->caps.qp1_tunnel);
|
||||
kfree(dev->caps.qp1_proxy);
|
||||
kfree(dev->dev_vfs);
|
||||
|
||||
pci_release_regions(pdev);
|
||||
pci_disable_device(pdev);
|
||||
memset(priv, 0, sizeof(*priv));
|
||||
priv->pci_dev_data = pci_dev_data;
|
||||
priv->removed = 1;
|
||||
}
|
||||
|
||||
static void mlx4_remove_one(struct pci_dev *pdev)
|
||||
{
|
||||
struct mlx4_dev *dev = pci_get_drvdata(pdev);
|
||||
struct mlx4_priv *priv = mlx4_priv(dev);
|
||||
int p;
|
||||
|
||||
if (dev) {
|
||||
/* in SRIOV it is not allowed to unload the pf's
|
||||
* driver while there are alive vf's */
|
||||
if (mlx4_is_master(dev)) {
|
||||
if (mlx4_how_many_lives_vf(dev))
|
||||
printk(KERN_ERR "Removing PF when there are assigned VF's !!!\n");
|
||||
}
|
||||
mlx4_stop_sense(dev);
|
||||
mlx4_unregister_device(dev);
|
||||
|
||||
for (p = 1; p <= dev->caps.num_ports; p++) {
|
||||
mlx4_cleanup_port_info(&priv->port[p]);
|
||||
mlx4_CLOSE_PORT(dev, p);
|
||||
}
|
||||
|
||||
if (mlx4_is_master(dev))
|
||||
mlx4_free_resource_tracker(dev,
|
||||
RES_TR_FREE_SLAVES_ONLY);
|
||||
|
||||
mlx4_cleanup_counters_table(dev);
|
||||
mlx4_cleanup_qp_table(dev);
|
||||
mlx4_cleanup_srq_table(dev);
|
||||
mlx4_cleanup_cq_table(dev);
|
||||
mlx4_cmd_use_polling(dev);
|
||||
mlx4_cleanup_eq_table(dev);
|
||||
mlx4_cleanup_mcg_table(dev);
|
||||
mlx4_cleanup_mr_table(dev);
|
||||
mlx4_cleanup_xrcd_table(dev);
|
||||
mlx4_cleanup_pd_table(dev);
|
||||
|
||||
if (mlx4_is_master(dev))
|
||||
mlx4_free_resource_tracker(dev,
|
||||
RES_TR_FREE_STRUCTS_ONLY);
|
||||
|
||||
iounmap(priv->kar);
|
||||
mlx4_uar_free(dev, &priv->driver_uar);
|
||||
mlx4_cleanup_uar_table(dev);
|
||||
if (!mlx4_is_slave(dev))
|
||||
mlx4_clear_steering(dev);
|
||||
mlx4_free_eq_table(dev);
|
||||
if (mlx4_is_master(dev))
|
||||
mlx4_multi_func_cleanup(dev);
|
||||
mlx4_close_hca(dev);
|
||||
if (mlx4_is_slave(dev))
|
||||
mlx4_multi_func_cleanup(dev);
|
||||
mlx4_cmd_cleanup(dev);
|
||||
|
||||
if (dev->flags & MLX4_FLAG_MSI_X)
|
||||
pci_disable_msix(pdev);
|
||||
if (dev->flags & MLX4_FLAG_SRIOV) {
|
||||
mlx4_warn(dev, "Disabling SR-IOV\n");
|
||||
pci_disable_sriov(pdev);
|
||||
}
|
||||
|
||||
if (!mlx4_is_slave(dev))
|
||||
mlx4_free_ownership(dev);
|
||||
|
||||
kfree(dev->caps.qp0_tunnel);
|
||||
kfree(dev->caps.qp0_proxy);
|
||||
kfree(dev->caps.qp1_tunnel);
|
||||
kfree(dev->caps.qp1_proxy);
|
||||
kfree(dev->dev_vfs);
|
||||
|
||||
kfree(priv);
|
||||
pci_release_regions(pdev);
|
||||
pci_disable_device(pdev);
|
||||
pci_set_drvdata(pdev, NULL);
|
||||
}
|
||||
__mlx4_remove_one(pdev);
|
||||
kfree(priv);
|
||||
pci_set_drvdata(pdev, NULL);
|
||||
}
|
||||
|
||||
int mlx4_restart_one(struct pci_dev *pdev)
|
||||
@ -2692,7 +2717,7 @@ int mlx4_restart_one(struct pci_dev *pdev)
|
||||
int pci_dev_data;
|
||||
|
||||
pci_dev_data = priv->pci_dev_data;
|
||||
mlx4_remove_one(pdev);
|
||||
__mlx4_remove_one(pdev);
|
||||
return __mlx4_init_one(pdev, pci_dev_data);
|
||||
}
|
||||
|
||||
@ -2747,7 +2772,7 @@ MODULE_DEVICE_TABLE(pci, mlx4_pci_table);
|
||||
static pci_ers_result_t mlx4_pci_err_detected(struct pci_dev *pdev,
|
||||
pci_channel_state_t state)
|
||||
{
|
||||
mlx4_remove_one(pdev);
|
||||
__mlx4_remove_one(pdev);
|
||||
|
||||
return state == pci_channel_io_perm_failure ?
|
||||
PCI_ERS_RESULT_DISCONNECT : PCI_ERS_RESULT_NEED_RESET;
|
||||
@ -2755,11 +2780,11 @@ static pci_ers_result_t mlx4_pci_err_detected(struct pci_dev *pdev,
|
||||
|
||||
static pci_ers_result_t mlx4_pci_slot_reset(struct pci_dev *pdev)
|
||||
{
|
||||
const struct pci_device_id *id;
|
||||
int ret;
|
||||
struct mlx4_dev *dev = pci_get_drvdata(pdev);
|
||||
struct mlx4_priv *priv = mlx4_priv(dev);
|
||||
int ret;
|
||||
|
||||
id = pci_match_id(mlx4_pci_table, pdev);
|
||||
ret = __mlx4_init_one(pdev, id->driver_data);
|
||||
ret = __mlx4_init_one(pdev, priv->pci_dev_data);
|
||||
|
||||
return ret ? PCI_ERS_RESULT_DISCONNECT : PCI_ERS_RESULT_RECOVERED;
|
||||
}
|
||||
|
@ -800,6 +800,7 @@ struct mlx4_priv {
|
||||
spinlock_t ctx_lock;
|
||||
|
||||
int pci_dev_data;
|
||||
int removed;
|
||||
|
||||
struct list_head pgdir_list;
|
||||
struct mutex pgdir_mutex;
|
||||
|
@ -2139,8 +2139,6 @@ static int qlcnic_83xx_get_nic_configuration(struct qlcnic_adapter *adapter)
|
||||
ahw->max_mac_filters = nic_info.max_mac_filters;
|
||||
ahw->max_mtu = nic_info.max_mtu;
|
||||
|
||||
adapter->max_tx_rings = ahw->max_tx_ques;
|
||||
adapter->max_sds_rings = ahw->max_rx_ques;
|
||||
/* eSwitch capability indicates vNIC mode.
|
||||
* vNIC and SRIOV are mutually exclusive operational modes.
|
||||
* If SR-IOV capability is detected, SR-IOV physical function
|
||||
@ -2161,6 +2159,7 @@ static int qlcnic_83xx_get_nic_configuration(struct qlcnic_adapter *adapter)
|
||||
int qlcnic_83xx_configure_opmode(struct qlcnic_adapter *adapter)
|
||||
{
|
||||
struct qlcnic_hardware_context *ahw = adapter->ahw;
|
||||
u16 max_sds_rings, max_tx_rings;
|
||||
int ret;
|
||||
|
||||
ret = qlcnic_83xx_get_nic_configuration(adapter);
|
||||
@ -2173,18 +2172,21 @@ int qlcnic_83xx_configure_opmode(struct qlcnic_adapter *adapter)
|
||||
if (qlcnic_83xx_config_vnic_opmode(adapter))
|
||||
return -EIO;
|
||||
|
||||
adapter->max_sds_rings = QLCNIC_MAX_VNIC_SDS_RINGS;
|
||||
adapter->max_tx_rings = QLCNIC_MAX_VNIC_TX_RINGS;
|
||||
max_sds_rings = QLCNIC_MAX_VNIC_SDS_RINGS;
|
||||
max_tx_rings = QLCNIC_MAX_VNIC_TX_RINGS;
|
||||
} else if (ret == QLC_83XX_DEFAULT_OPMODE) {
|
||||
ahw->nic_mode = QLCNIC_DEFAULT_MODE;
|
||||
adapter->nic_ops->init_driver = qlcnic_83xx_init_default_driver;
|
||||
ahw->idc.state_entry = qlcnic_83xx_idc_ready_state_entry;
|
||||
adapter->max_sds_rings = QLCNIC_MAX_SDS_RINGS;
|
||||
adapter->max_tx_rings = QLCNIC_MAX_TX_RINGS;
|
||||
max_sds_rings = QLCNIC_MAX_SDS_RINGS;
|
||||
max_tx_rings = QLCNIC_MAX_TX_RINGS;
|
||||
} else {
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
adapter->max_sds_rings = min(ahw->max_rx_ques, max_sds_rings);
|
||||
adapter->max_tx_rings = min(ahw->max_tx_ques, max_tx_rings);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -2348,15 +2350,16 @@ int qlcnic_83xx_init(struct qlcnic_adapter *adapter, int pci_using_dac)
|
||||
goto disable_intr;
|
||||
}
|
||||
|
||||
INIT_DELAYED_WORK(&adapter->idc_aen_work, qlcnic_83xx_idc_aen_work);
|
||||
|
||||
err = qlcnic_83xx_setup_mbx_intr(adapter);
|
||||
if (err)
|
||||
goto disable_mbx_intr;
|
||||
|
||||
qlcnic_83xx_clear_function_resources(adapter);
|
||||
|
||||
INIT_DELAYED_WORK(&adapter->idc_aen_work, qlcnic_83xx_idc_aen_work);
|
||||
|
||||
qlcnic_dcb_enable(adapter->dcb);
|
||||
qlcnic_83xx_initialize_nic(adapter, 1);
|
||||
qlcnic_dcb_get_info(adapter->dcb);
|
||||
|
||||
/* Configure default, SR-IOV or Virtual NIC mode of operation */
|
||||
err = qlcnic_83xx_configure_opmode(adapter);
|
||||
|
@ -883,8 +883,6 @@ int qlcnic_82xx_get_nic_info(struct qlcnic_adapter *adapter,
|
||||
npar_info->max_rx_ques = le16_to_cpu(nic_info->max_rx_ques);
|
||||
npar_info->capabilities = le32_to_cpu(nic_info->capabilities);
|
||||
npar_info->max_mtu = le16_to_cpu(nic_info->max_mtu);
|
||||
adapter->max_tx_rings = npar_info->max_tx_ques;
|
||||
adapter->max_sds_rings = npar_info->max_rx_ques;
|
||||
}
|
||||
|
||||
qlcnic_free_mbx_args(&cmd);
|
||||
@ -1356,6 +1354,7 @@ int qlcnic_config_switch_port(struct qlcnic_adapter *adapter,
|
||||
arg2 &= ~BIT_3;
|
||||
break;
|
||||
case QLCNIC_ADD_VLAN:
|
||||
arg1 &= ~(0x0ffff << 16);
|
||||
arg1 |= (BIT_2 | BIT_5);
|
||||
arg1 |= (esw_cfg->vlan_id << 16);
|
||||
break;
|
||||
|
@ -330,8 +330,6 @@ static int __qlcnic_dcb_attach(struct qlcnic_dcb *dcb)
|
||||
goto out_free_cfg;
|
||||
}
|
||||
|
||||
qlcnic_dcb_get_info(dcb);
|
||||
|
||||
return 0;
|
||||
out_free_cfg:
|
||||
kfree(dcb->cfg);
|
||||
|
@ -670,7 +670,7 @@ int qlcnic_setup_tss_rss_intr(struct qlcnic_adapter *adapter)
|
||||
else
|
||||
num_msix += adapter->drv_tx_rings;
|
||||
|
||||
if (adapter->drv_rss_rings > 0)
|
||||
if (adapter->drv_rss_rings > 0)
|
||||
num_msix += adapter->drv_rss_rings;
|
||||
else
|
||||
num_msix += adapter->drv_sds_rings;
|
||||
@ -686,19 +686,15 @@ int qlcnic_setup_tss_rss_intr(struct qlcnic_adapter *adapter)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
restore:
|
||||
for (vector = 0; vector < num_msix; vector++)
|
||||
adapter->msix_entries[vector].entry = vector;
|
||||
|
||||
restore:
|
||||
err = pci_enable_msix(pdev, adapter->msix_entries, num_msix);
|
||||
if (err == 0) {
|
||||
adapter->ahw->num_msix = num_msix;
|
||||
if (adapter->drv_tss_rings > 0)
|
||||
adapter->drv_tx_rings = adapter->drv_tss_rings;
|
||||
if (err > 0) {
|
||||
if (!adapter->drv_tss_rings && !adapter->drv_rss_rings)
|
||||
return -ENOSPC;
|
||||
|
||||
if (adapter->drv_rss_rings > 0)
|
||||
adapter->drv_sds_rings = adapter->drv_rss_rings;
|
||||
} else {
|
||||
netdev_info(adapter->netdev,
|
||||
"Unable to allocate %d MSI-X vectors, Available vectors %d\n",
|
||||
num_msix, err);
|
||||
@ -716,12 +712,20 @@ restore:
|
||||
"Restoring %d Tx, %d SDS rings for total %d vectors.\n",
|
||||
adapter->drv_tx_rings, adapter->drv_sds_rings,
|
||||
num_msix);
|
||||
goto restore;
|
||||
|
||||
err = -EIO;
|
||||
goto restore;
|
||||
} else if (err < 0) {
|
||||
return err;
|
||||
}
|
||||
|
||||
return err;
|
||||
adapter->ahw->num_msix = num_msix;
|
||||
if (adapter->drv_tss_rings > 0)
|
||||
adapter->drv_tx_rings = adapter->drv_tss_rings;
|
||||
|
||||
if (adapter->drv_rss_rings > 0)
|
||||
adapter->drv_sds_rings = adapter->drv_rss_rings;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int qlcnic_enable_msix(struct qlcnic_adapter *adapter, u32 num_msix)
|
||||
@ -2528,8 +2532,6 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
goto err_out_free_hw;
|
||||
}
|
||||
|
||||
qlcnic_dcb_enable(adapter->dcb);
|
||||
|
||||
if (qlcnic_read_mac_addr(adapter))
|
||||
dev_warn(&pdev->dev, "failed to read mac addr\n");
|
||||
|
||||
@ -2549,7 +2551,10 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
"Device does not support MSI interrupts\n");
|
||||
|
||||
if (qlcnic_82xx_check(adapter)) {
|
||||
qlcnic_dcb_enable(adapter->dcb);
|
||||
qlcnic_dcb_get_info(adapter->dcb);
|
||||
err = qlcnic_setup_intr(adapter);
|
||||
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "Failed to setup interrupt\n");
|
||||
goto err_out_disable_msi;
|
||||
|
@ -461,6 +461,16 @@ static int qlcnic_pci_sriov_disable(struct qlcnic_adapter *adapter)
|
||||
{
|
||||
struct net_device *netdev = adapter->netdev;
|
||||
|
||||
if (pci_vfs_assigned(adapter->pdev)) {
|
||||
netdev_err(adapter->netdev,
|
||||
"SR-IOV VFs belonging to port %d are assigned to VMs. SR-IOV can not be disabled on this port\n",
|
||||
adapter->portnum);
|
||||
netdev_info(adapter->netdev,
|
||||
"Please detach SR-IOV VFs belonging to port %d from VMs, and then try to disable SR-IOV on this port\n",
|
||||
adapter->portnum);
|
||||
return -EPERM;
|
||||
}
|
||||
|
||||
rtnl_lock();
|
||||
if (netif_running(netdev))
|
||||
__qlcnic_down(adapter, netdev);
|
||||
|
@ -354,7 +354,7 @@ int qlcnic_is_valid_nic_func(struct qlcnic_adapter *adapter, u8 pci_func)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < adapter->ahw->max_vnic_func; i++) {
|
||||
for (i = 0; i < adapter->ahw->total_nic_func; i++) {
|
||||
if (adapter->npars[i].pci_func == pci_func)
|
||||
return i;
|
||||
}
|
||||
@ -720,6 +720,7 @@ static ssize_t qlcnic_sysfs_read_npar_config(struct file *file,
|
||||
struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
|
||||
struct qlcnic_npar_func_cfg *np_cfg;
|
||||
struct qlcnic_info nic_info;
|
||||
u8 pci_func;
|
||||
int i, ret;
|
||||
u32 count;
|
||||
|
||||
@ -729,26 +730,28 @@ static ssize_t qlcnic_sysfs_read_npar_config(struct file *file,
|
||||
|
||||
count = size / sizeof(struct qlcnic_npar_func_cfg);
|
||||
for (i = 0; i < adapter->ahw->total_nic_func; i++) {
|
||||
if (qlcnic_is_valid_nic_func(adapter, i) < 0)
|
||||
continue;
|
||||
if (adapter->npars[i].pci_func >= count) {
|
||||
dev_dbg(dev, "%s: Total nic functions[%d], App sent function count[%d]\n",
|
||||
__func__, adapter->ahw->total_nic_func, count);
|
||||
continue;
|
||||
}
|
||||
ret = qlcnic_get_nic_info(adapter, &nic_info, i);
|
||||
if (ret)
|
||||
return ret;
|
||||
if (!adapter->npars[i].eswitch_status)
|
||||
continue;
|
||||
np_cfg[i].pci_func = i;
|
||||
np_cfg[i].op_mode = (u8)nic_info.op_mode;
|
||||
np_cfg[i].port_num = nic_info.phys_port;
|
||||
np_cfg[i].fw_capab = nic_info.capabilities;
|
||||
np_cfg[i].min_bw = nic_info.min_tx_bw;
|
||||
np_cfg[i].max_bw = nic_info.max_tx_bw;
|
||||
np_cfg[i].max_tx_queues = nic_info.max_tx_ques;
|
||||
np_cfg[i].max_rx_queues = nic_info.max_rx_ques;
|
||||
pci_func = adapter->npars[i].pci_func;
|
||||
if (qlcnic_is_valid_nic_func(adapter, pci_func) < 0)
|
||||
continue;
|
||||
ret = qlcnic_get_nic_info(adapter, &nic_info, pci_func);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
np_cfg[pci_func].pci_func = pci_func;
|
||||
np_cfg[pci_func].op_mode = (u8)nic_info.op_mode;
|
||||
np_cfg[pci_func].port_num = nic_info.phys_port;
|
||||
np_cfg[pci_func].fw_capab = nic_info.capabilities;
|
||||
np_cfg[pci_func].min_bw = nic_info.min_tx_bw;
|
||||
np_cfg[pci_func].max_bw = nic_info.max_tx_bw;
|
||||
np_cfg[pci_func].max_tx_queues = nic_info.max_tx_ques;
|
||||
np_cfg[pci_func].max_rx_queues = nic_info.max_rx_ques;
|
||||
}
|
||||
return size;
|
||||
}
|
||||
|
@ -365,7 +365,7 @@ __at86rf230_read_subreg(struct at86rf230_local *lp,
|
||||
dev_vdbg(&lp->spi->dev, "buf[1] = %02x\n", buf[1]);
|
||||
|
||||
if (status == 0)
|
||||
*data = buf[1];
|
||||
*data = (buf[1] & mask) >> shift;
|
||||
|
||||
return status;
|
||||
}
|
||||
@ -1025,14 +1025,6 @@ static int at86rf230_hw_init(struct at86rf230_local *lp)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
rc = at86rf230_read_subreg(lp, SR_AVDD_OK, &status);
|
||||
if (rc)
|
||||
return rc;
|
||||
if (!status) {
|
||||
dev_err(&lp->spi->dev, "AVDD error\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1755,8 +1755,8 @@ int vxlan_xmit_skb(struct vxlan_sock *vs,
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
return iptunnel_xmit(rt, skb, src, dst, IPPROTO_UDP, tos, ttl, df,
|
||||
false);
|
||||
return iptunnel_xmit(vs->sock->sk, rt, skb, src, dst, IPPROTO_UDP,
|
||||
tos, ttl, df, false);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(vxlan_xmit_skb);
|
||||
|
||||
|
@ -1521,11 +1521,7 @@ static int cosa_reset_and_read_id(struct cosa_data *cosa, char *idstring)
|
||||
cosa_putstatus(cosa, 0);
|
||||
cosa_getdata8(cosa);
|
||||
cosa_putstatus(cosa, SR_RST);
|
||||
#ifdef MODULE
|
||||
msleep(500);
|
||||
#else
|
||||
udelay(5*100000);
|
||||
#endif
|
||||
/* Disable all IRQs from the card */
|
||||
cosa_putstatus(cosa, 0);
|
||||
|
||||
|
@ -104,16 +104,16 @@ config PINCTRL_BCM2835
|
||||
select PINMUX
|
||||
select PINCONF
|
||||
|
||||
config PINCTRL_CAPRI
|
||||
bool "Broadcom Capri pinctrl driver"
|
||||
config PINCTRL_BCM281XX
|
||||
bool "Broadcom BCM281xx pinctrl driver"
|
||||
depends on OF
|
||||
select PINMUX
|
||||
select PINCONF
|
||||
select GENERIC_PINCONF
|
||||
select REGMAP_MMIO
|
||||
help
|
||||
Say Y here to support Broadcom Capri pinctrl driver, which is used for
|
||||
the BCM281xx SoC family, including BCM11130, BCM11140, BCM11351,
|
||||
Say Y here to support Broadcom BCM281xx pinctrl driver, which is used
|
||||
for the BCM281xx SoC family, including BCM11130, BCM11140, BCM11351,
|
||||
BCM28145, and BCM28155 SoCs. This driver requires the pinctrl
|
||||
framework. GPIO is provided by a separate GPIO driver.
|
||||
|
||||
|
@ -21,7 +21,7 @@ obj-$(CONFIG_PINCTRL_BF60x) += pinctrl-adi2-bf60x.o
|
||||
obj-$(CONFIG_PINCTRL_AT91) += pinctrl-at91.o
|
||||
obj-$(CONFIG_PINCTRL_BCM2835) += pinctrl-bcm2835.o
|
||||
obj-$(CONFIG_PINCTRL_BAYTRAIL) += pinctrl-baytrail.o
|
||||
obj-$(CONFIG_PINCTRL_CAPRI) += pinctrl-capri.o
|
||||
obj-$(CONFIG_PINCTRL_BCM281XX) += pinctrl-bcm281xx.o
|
||||
obj-$(CONFIG_PINCTRL_IMX) += pinctrl-imx.o
|
||||
obj-$(CONFIG_PINCTRL_IMX1_CORE) += pinctrl-imx1-core.o
|
||||
obj-$(CONFIG_PINCTRL_IMX27) += pinctrl-imx27.o
|
||||
|
1461
drivers/pinctrl/pinctrl-bcm281xx.c
Normal file
1461
drivers/pinctrl/pinctrl-bcm281xx.c
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -665,7 +665,10 @@ static void msm_gpio_irq_ack(struct irq_data *d)
|
||||
spin_lock_irqsave(&pctrl->lock, flags);
|
||||
|
||||
val = readl(pctrl->regs + g->intr_status_reg);
|
||||
val &= ~BIT(g->intr_status_bit);
|
||||
if (g->intr_ack_high)
|
||||
val |= BIT(g->intr_status_bit);
|
||||
else
|
||||
val &= ~BIT(g->intr_status_bit);
|
||||
writel(val, pctrl->regs + g->intr_status_reg);
|
||||
|
||||
if (test_bit(d->hwirq, pctrl->dual_edge_irqs))
|
||||
@ -744,6 +747,7 @@ static int msm_gpio_irq_set_type(struct irq_data *d, unsigned int type)
|
||||
break;
|
||||
case IRQ_TYPE_EDGE_BOTH:
|
||||
val |= BIT(g->intr_detection_bit);
|
||||
val |= BIT(g->intr_polarity_bit);
|
||||
break;
|
||||
case IRQ_TYPE_LEVEL_LOW:
|
||||
break;
|
||||
|
@ -84,6 +84,7 @@ struct msm_pingroup {
|
||||
|
||||
unsigned intr_enable_bit:5;
|
||||
unsigned intr_status_bit:5;
|
||||
unsigned intr_ack_high:1;
|
||||
|
||||
unsigned intr_target_bit:5;
|
||||
unsigned intr_raw_status_bit:5;
|
||||
|
@ -877,7 +877,6 @@ static void nmk_gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
|
||||
struct nmk_gpio_chip *nmk_chip = container_of(chip, struct nmk_gpio_chip, chip);
|
||||
u32 status;
|
||||
|
||||
pr_err("PLONK IRQ %d\n", irq);
|
||||
clk_enable(nmk_chip->clk);
|
||||
status = readl(nmk_chip->addr + NMK_GPIO_IS);
|
||||
clk_disable(nmk_chip->clk);
|
||||
|
@ -342,7 +342,7 @@ static const struct pinctrl_ops rockchip_pctrl_ops = {
|
||||
* @pin: pin to change
|
||||
* @mux: new mux function to set
|
||||
*/
|
||||
static void rockchip_set_mux(struct rockchip_pin_bank *bank, int pin, int mux)
|
||||
static int rockchip_set_mux(struct rockchip_pin_bank *bank, int pin, int mux)
|
||||
{
|
||||
struct rockchip_pinctrl *info = bank->drvdata;
|
||||
void __iomem *reg = info->reg_base + info->ctrl->mux_offset;
|
||||
@ -350,6 +350,20 @@ static void rockchip_set_mux(struct rockchip_pin_bank *bank, int pin, int mux)
|
||||
u8 bit;
|
||||
u32 data;
|
||||
|
||||
/*
|
||||
* The first 16 pins of rk3188_bank0 are always gpios and do not have
|
||||
* a mux register at all.
|
||||
*/
|
||||
if (bank->bank_type == RK3188_BANK0 && pin < 16) {
|
||||
if (mux != RK_FUNC_GPIO) {
|
||||
dev_err(info->dev,
|
||||
"pin %d only supports a gpio mux\n", pin);
|
||||
return -ENOTSUPP;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
dev_dbg(info->dev, "setting mux of GPIO%d-%d to %d\n",
|
||||
bank->bank_num, pin, mux);
|
||||
|
||||
@ -365,6 +379,8 @@ static void rockchip_set_mux(struct rockchip_pin_bank *bank, int pin, int mux)
|
||||
writel(data, reg);
|
||||
|
||||
spin_unlock_irqrestore(&bank->slock, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define RK2928_PULL_OFFSET 0x118
|
||||
@ -560,7 +576,7 @@ static int rockchip_pmx_enable(struct pinctrl_dev *pctldev, unsigned selector,
|
||||
const unsigned int *pins = info->groups[group].pins;
|
||||
const struct rockchip_pin_config *data = info->groups[group].data;
|
||||
struct rockchip_pin_bank *bank;
|
||||
int cnt;
|
||||
int cnt, ret = 0;
|
||||
|
||||
dev_dbg(info->dev, "enable function %s group %s\n",
|
||||
info->functions[selector].name, info->groups[group].name);
|
||||
@ -571,8 +587,18 @@ static int rockchip_pmx_enable(struct pinctrl_dev *pctldev, unsigned selector,
|
||||
*/
|
||||
for (cnt = 0; cnt < info->groups[group].npins; cnt++) {
|
||||
bank = pin_to_bank(info, pins[cnt]);
|
||||
rockchip_set_mux(bank, pins[cnt] - bank->pin_base,
|
||||
data[cnt].func);
|
||||
ret = rockchip_set_mux(bank, pins[cnt] - bank->pin_base,
|
||||
data[cnt].func);
|
||||
if (ret)
|
||||
break;
|
||||
}
|
||||
|
||||
if (ret) {
|
||||
/* revert the already done pin settings */
|
||||
for (cnt--; cnt >= 0; cnt--)
|
||||
rockchip_set_mux(bank, pins[cnt] - bank->pin_base, 0);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -607,7 +633,7 @@ static int rockchip_pmx_gpio_set_direction(struct pinctrl_dev *pctldev,
|
||||
struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
|
||||
struct rockchip_pin_bank *bank;
|
||||
struct gpio_chip *chip;
|
||||
int pin;
|
||||
int pin, ret;
|
||||
u32 data;
|
||||
|
||||
chip = range->gc;
|
||||
@ -617,7 +643,9 @@ static int rockchip_pmx_gpio_set_direction(struct pinctrl_dev *pctldev,
|
||||
dev_dbg(info->dev, "gpio_direction for pin %u as %s-%d to %s\n",
|
||||
offset, range->name, pin, input ? "input" : "output");
|
||||
|
||||
rockchip_set_mux(bank, pin, RK_FUNC_GPIO);
|
||||
ret = rockchip_set_mux(bank, pin, RK_FUNC_GPIO);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
data = readl_relaxed(bank->reg_base + GPIO_SWPORT_DDR);
|
||||
/* set bit to 1 for output, 0 for input */
|
||||
@ -1144,9 +1172,13 @@ static int rockchip_irq_set_type(struct irq_data *d, unsigned int type)
|
||||
u32 polarity;
|
||||
u32 level;
|
||||
u32 data;
|
||||
int ret;
|
||||
|
||||
/* make sure the pin is configured as gpio input */
|
||||
rockchip_set_mux(bank, d->hwirq, RK_FUNC_GPIO);
|
||||
ret = rockchip_set_mux(bank, d->hwirq, RK_FUNC_GPIO);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
data = readl_relaxed(bank->reg_base + GPIO_SWPORT_DDR);
|
||||
data &= ~mask;
|
||||
writel_relaxed(data, bank->reg_base + GPIO_SWPORT_DDR);
|
||||
@ -1534,7 +1566,7 @@ static struct rockchip_pin_ctrl rk3188_pin_ctrl = {
|
||||
.nr_banks = ARRAY_SIZE(rk3188_pin_banks),
|
||||
.label = "RK3188-GPIO",
|
||||
.type = RK3188,
|
||||
.mux_offset = 0x68,
|
||||
.mux_offset = 0x60,
|
||||
.pull_calc_reg = rk3188_calc_pull_reg_and_bit,
|
||||
};
|
||||
|
||||
|
@ -1252,7 +1252,7 @@ static __init int sclp_initcall(void)
|
||||
return rc;
|
||||
|
||||
sclp_pdev = platform_device_register_simple("sclp", -1, NULL, 0);
|
||||
rc = PTR_RET(sclp_pdev);
|
||||
rc = PTR_ERR_OR_ZERO(sclp_pdev);
|
||||
if (rc)
|
||||
goto fail_platform_driver_unregister;
|
||||
|
||||
|
@ -515,7 +515,7 @@ static int __init sclp_detect_standby_memory(void)
|
||||
if (rc)
|
||||
goto out;
|
||||
sclp_pdev = platform_device_register_simple("sclp_mem", -1, NULL, 0);
|
||||
rc = PTR_RET(sclp_pdev);
|
||||
rc = PTR_ERR_OR_ZERO(sclp_pdev);
|
||||
if (rc)
|
||||
goto out_driver;
|
||||
sclp_add_standby_memory();
|
||||
|
@ -97,15 +97,18 @@ static void sclp_vt220_pm_event_fn(struct sclp_register *reg,
|
||||
static int __sclp_vt220_emit(struct sclp_vt220_request *request);
|
||||
static void sclp_vt220_emit_current(void);
|
||||
|
||||
/* Registration structure for our interest in SCLP event buffers */
|
||||
/* Registration structure for SCLP output event buffers */
|
||||
static struct sclp_register sclp_vt220_register = {
|
||||
.send_mask = EVTYP_VT220MSG_MASK,
|
||||
.receive_mask = EVTYP_VT220MSG_MASK,
|
||||
.state_change_fn = NULL,
|
||||
.receiver_fn = sclp_vt220_receiver_fn,
|
||||
.pm_event_fn = sclp_vt220_pm_event_fn,
|
||||
};
|
||||
|
||||
/* Registration structure for SCLP input event buffers */
|
||||
static struct sclp_register sclp_vt220_register_input = {
|
||||
.receive_mask = EVTYP_VT220MSG_MASK,
|
||||
.receiver_fn = sclp_vt220_receiver_fn,
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* Put provided request buffer back into queue and check emit pending
|
||||
@ -715,9 +718,14 @@ static int __init sclp_vt220_tty_init(void)
|
||||
rc = tty_register_driver(driver);
|
||||
if (rc)
|
||||
goto out_init;
|
||||
rc = sclp_register(&sclp_vt220_register_input);
|
||||
if (rc)
|
||||
goto out_reg;
|
||||
sclp_vt220_driver = driver;
|
||||
return 0;
|
||||
|
||||
out_reg:
|
||||
tty_unregister_driver(driver);
|
||||
out_init:
|
||||
__sclp_vt220_cleanup();
|
||||
out_driver:
|
||||
|
@ -359,6 +359,8 @@ config FB_SA1100
|
||||
config FB_IMX
|
||||
tristate "Freescale i.MX1/21/25/27 LCD support"
|
||||
depends on FB && ARCH_MXC
|
||||
select BACKLIGHT_LCD_SUPPORT
|
||||
select LCD_CLASS_DEVICE
|
||||
select FB_CFB_FILLRECT
|
||||
select FB_CFB_COPYAREA
|
||||
select FB_CFB_IMAGEBLIT
|
||||
|
@ -49,13 +49,13 @@
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/gpio.h>
|
||||
|
||||
#include <asm/blackfin.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/dpmc.h>
|
||||
#include <asm/dma-mapping.h>
|
||||
#include <asm/dma.h>
|
||||
#include <asm/gpio.h>
|
||||
#include <asm/portmux.h>
|
||||
|
||||
#include <mach/bf54x-lq043.h>
|
||||
|
@ -663,15 +663,7 @@ static int fb_setcolreg(unsigned regno, unsigned red, unsigned green,
|
||||
(green << info->var.green.offset) |
|
||||
(blue << info->var.blue.offset);
|
||||
|
||||
switch (info->var.bits_per_pixel) {
|
||||
case 16:
|
||||
((u16 *) (info->pseudo_palette))[regno] = v;
|
||||
break;
|
||||
case 24:
|
||||
case 32:
|
||||
((u32 *) (info->pseudo_palette))[regno] = v;
|
||||
break;
|
||||
}
|
||||
((u32 *) (info->pseudo_palette))[regno] = v;
|
||||
if (palette[0] != 0x4000) {
|
||||
update_hw = 1;
|
||||
palette[0] = 0x4000;
|
||||
|
@ -101,6 +101,8 @@ static struct {
|
||||
void __iomem *base;
|
||||
|
||||
int irq;
|
||||
irq_handler_t user_handler;
|
||||
void *user_data;
|
||||
|
||||
unsigned long core_clk_rate;
|
||||
unsigned long tv_pclk_rate;
|
||||
@ -113,6 +115,8 @@ static struct {
|
||||
u32 ctx[DISPC_SZ_REGS / sizeof(u32)];
|
||||
|
||||
const struct dispc_features *feat;
|
||||
|
||||
bool is_enabled;
|
||||
} dispc;
|
||||
|
||||
enum omap_color_component {
|
||||
@ -141,12 +145,18 @@ enum mgr_reg_fields {
|
||||
DISPC_MGR_FLD_NUM,
|
||||
};
|
||||
|
||||
struct dispc_reg_field {
|
||||
u16 reg;
|
||||
u8 high;
|
||||
u8 low;
|
||||
};
|
||||
|
||||
static const struct {
|
||||
const char *name;
|
||||
u32 vsync_irq;
|
||||
u32 framedone_irq;
|
||||
u32 sync_lost_irq;
|
||||
struct reg_field reg_desc[DISPC_MGR_FLD_NUM];
|
||||
struct dispc_reg_field reg_desc[DISPC_MGR_FLD_NUM];
|
||||
} mgr_desc[] = {
|
||||
[OMAP_DSS_CHANNEL_LCD] = {
|
||||
.name = "LCD",
|
||||
@ -238,13 +248,13 @@ static inline u32 dispc_read_reg(const u16 idx)
|
||||
|
||||
static u32 mgr_fld_read(enum omap_channel channel, enum mgr_reg_fields regfld)
|
||||
{
|
||||
const struct reg_field rfld = mgr_desc[channel].reg_desc[regfld];
|
||||
const struct dispc_reg_field rfld = mgr_desc[channel].reg_desc[regfld];
|
||||
return REG_GET(rfld.reg, rfld.high, rfld.low);
|
||||
}
|
||||
|
||||
static void mgr_fld_write(enum omap_channel channel,
|
||||
enum mgr_reg_fields regfld, int val) {
|
||||
const struct reg_field rfld = mgr_desc[channel].reg_desc[regfld];
|
||||
const struct dispc_reg_field rfld = mgr_desc[channel].reg_desc[regfld];
|
||||
REG_FLD_MOD(rfld.reg, val, rfld.high, rfld.low);
|
||||
}
|
||||
|
||||
@ -3669,16 +3679,44 @@ static int __init dispc_init_features(struct platform_device *pdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static irqreturn_t dispc_irq_handler(int irq, void *arg)
|
||||
{
|
||||
if (!dispc.is_enabled)
|
||||
return IRQ_NONE;
|
||||
|
||||
return dispc.user_handler(irq, dispc.user_data);
|
||||
}
|
||||
|
||||
int dispc_request_irq(irq_handler_t handler, void *dev_id)
|
||||
{
|
||||
return devm_request_irq(&dispc.pdev->dev, dispc.irq, handler,
|
||||
IRQF_SHARED, "OMAP DISPC", dev_id);
|
||||
int r;
|
||||
|
||||
if (dispc.user_handler != NULL)
|
||||
return -EBUSY;
|
||||
|
||||
dispc.user_handler = handler;
|
||||
dispc.user_data = dev_id;
|
||||
|
||||
/* ensure the dispc_irq_handler sees the values above */
|
||||
smp_wmb();
|
||||
|
||||
r = devm_request_irq(&dispc.pdev->dev, dispc.irq, dispc_irq_handler,
|
||||
IRQF_SHARED, "OMAP DISPC", &dispc);
|
||||
if (r) {
|
||||
dispc.user_handler = NULL;
|
||||
dispc.user_data = NULL;
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
EXPORT_SYMBOL(dispc_request_irq);
|
||||
|
||||
void dispc_free_irq(void *dev_id)
|
||||
{
|
||||
devm_free_irq(&dispc.pdev->dev, dispc.irq, dev_id);
|
||||
devm_free_irq(&dispc.pdev->dev, dispc.irq, &dispc);
|
||||
|
||||
dispc.user_handler = NULL;
|
||||
dispc.user_data = NULL;
|
||||
}
|
||||
EXPORT_SYMBOL(dispc_free_irq);
|
||||
|
||||
@ -3750,6 +3788,12 @@ static int __exit omap_dispchw_remove(struct platform_device *pdev)
|
||||
|
||||
static int dispc_runtime_suspend(struct device *dev)
|
||||
{
|
||||
dispc.is_enabled = false;
|
||||
/* ensure the dispc_irq_handler sees the is_enabled value */
|
||||
smp_wmb();
|
||||
/* wait for current handler to finish before turning the DISPC off */
|
||||
synchronize_irq(dispc.irq);
|
||||
|
||||
dispc_save_context();
|
||||
|
||||
return 0;
|
||||
@ -3763,12 +3807,15 @@ static int dispc_runtime_resume(struct device *dev)
|
||||
* _omap_dispc_initial_config(). We can thus use it to detect if
|
||||
* we have lost register context.
|
||||
*/
|
||||
if (REG_GET(DISPC_CONFIG, 2, 1) == OMAP_DSS_LOAD_FRAME_ONLY)
|
||||
return 0;
|
||||
if (REG_GET(DISPC_CONFIG, 2, 1) != OMAP_DSS_LOAD_FRAME_ONLY) {
|
||||
_omap_dispc_initial_config();
|
||||
|
||||
_omap_dispc_initial_config();
|
||||
dispc_restore_context();
|
||||
}
|
||||
|
||||
dispc_restore_context();
|
||||
dispc.is_enabled = true;
|
||||
/* ensure the dispc_irq_handler sees the is_enabled value */
|
||||
smp_wmb();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -297,6 +297,8 @@ struct dsi_data {
|
||||
|
||||
int irq;
|
||||
|
||||
bool is_enabled;
|
||||
|
||||
struct clk *dss_clk;
|
||||
struct clk *sys_clk;
|
||||
|
||||
@ -795,6 +797,9 @@ static irqreturn_t omap_dsi_irq_handler(int irq, void *arg)
|
||||
dsidev = (struct platform_device *) arg;
|
||||
dsi = dsi_get_dsidrv_data(dsidev);
|
||||
|
||||
if (!dsi->is_enabled)
|
||||
return IRQ_NONE;
|
||||
|
||||
spin_lock(&dsi->irq_lock);
|
||||
|
||||
irqstatus = dsi_read_reg(dsidev, DSI_IRQSTATUS);
|
||||
@ -5671,6 +5676,15 @@ static int __exit omap_dsihw_remove(struct platform_device *dsidev)
|
||||
|
||||
static int dsi_runtime_suspend(struct device *dev)
|
||||
{
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
struct dsi_data *dsi = dsi_get_dsidrv_data(pdev);
|
||||
|
||||
dsi->is_enabled = false;
|
||||
/* ensure the irq handler sees the is_enabled value */
|
||||
smp_wmb();
|
||||
/* wait for current handler to finish before turning the DSI off */
|
||||
synchronize_irq(dsi->irq);
|
||||
|
||||
dispc_runtime_put();
|
||||
|
||||
return 0;
|
||||
@ -5678,12 +5692,18 @@ static int dsi_runtime_suspend(struct device *dev)
|
||||
|
||||
static int dsi_runtime_resume(struct device *dev)
|
||||
{
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
struct dsi_data *dsi = dsi_get_dsidrv_data(pdev);
|
||||
int r;
|
||||
|
||||
r = dispc_runtime_get();
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
dsi->is_enabled = true;
|
||||
/* ensure the irq handler sees the is_enabled value */
|
||||
smp_wmb();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -457,7 +457,7 @@ bool dss_div_calc(unsigned long pck, unsigned long fck_min,
|
||||
fckd_stop = max(DIV_ROUND_UP(prate * m, fck_hw_max), 1ul);
|
||||
|
||||
for (fckd = fckd_start; fckd >= fckd_stop; --fckd) {
|
||||
fck = prate / fckd * m;
|
||||
fck = DIV_ROUND_UP(prate, fckd) * m;
|
||||
|
||||
if (func(fck, data))
|
||||
return true;
|
||||
@ -506,7 +506,7 @@ static int dss_setup_default_clock(void)
|
||||
|
||||
fck_div = DIV_ROUND_UP(prate * dss.feat->dss_fck_multiplier,
|
||||
max_dss_fck);
|
||||
fck = prate / fck_div * dss.feat->dss_fck_multiplier;
|
||||
fck = DIV_ROUND_UP(prate, fck_div) * dss.feat->dss_fck_multiplier;
|
||||
}
|
||||
|
||||
r = dss_set_fck_rate(fck);
|
||||
|
@ -131,12 +131,6 @@ struct dsi_clock_info {
|
||||
u16 lp_clk_div;
|
||||
};
|
||||
|
||||
struct reg_field {
|
||||
u16 reg;
|
||||
u8 high;
|
||||
u8 low;
|
||||
};
|
||||
|
||||
struct dss_lcd_mgr_config {
|
||||
enum dss_io_pad_mode io_pad_mode;
|
||||
|
||||
|
@ -347,17 +347,17 @@ int hdmi_compute_acr(u32 pclk, u32 sample_freq, u32 *n, u32 *cts)
|
||||
case 96000:
|
||||
case 192000:
|
||||
if (deep_color == 125)
|
||||
if (pclk == 27027 || pclk == 74250)
|
||||
if (pclk == 27027000 || pclk == 74250000)
|
||||
deep_color_correct = true;
|
||||
if (deep_color == 150)
|
||||
if (pclk == 27027)
|
||||
if (pclk == 27027000)
|
||||
deep_color_correct = true;
|
||||
break;
|
||||
case 44100:
|
||||
case 88200:
|
||||
case 176400:
|
||||
if (deep_color == 125)
|
||||
if (pclk == 27027)
|
||||
if (pclk == 27027000)
|
||||
deep_color_correct = true;
|
||||
break;
|
||||
default:
|
||||
@ -418,7 +418,7 @@ int hdmi_compute_acr(u32 pclk, u32 sample_freq, u32 *n, u32 *cts)
|
||||
}
|
||||
}
|
||||
/* Calculate CTS. See HDMI 1.3a or 1.4a specifications */
|
||||
*cts = pclk * (*n / 128) * deep_color / (sample_freq / 10);
|
||||
*cts = (pclk/1000) * (*n / 128) * deep_color / (sample_freq / 10);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -220,7 +220,6 @@ enum {
|
||||
BPF_S_ANC_RXHASH,
|
||||
BPF_S_ANC_CPU,
|
||||
BPF_S_ANC_ALU_XOR_X,
|
||||
BPF_S_ANC_SECCOMP_LD_W,
|
||||
BPF_S_ANC_VLAN_TAG,
|
||||
BPF_S_ANC_VLAN_TAG_PRESENT,
|
||||
BPF_S_ANC_PAY_OFFSET,
|
||||
|
@ -87,7 +87,6 @@ int nf_ct_gre_keymap_add(struct nf_conn *ct, enum ip_conntrack_dir dir,
|
||||
/* delete keymap entries */
|
||||
void nf_ct_gre_keymap_destroy(struct nf_conn *ct);
|
||||
|
||||
void nf_ct_gre_keymap_flush(struct net *net);
|
||||
void nf_nat_need_gre(void);
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
@ -20,13 +20,13 @@ enum reboot_mode {
|
||||
extern enum reboot_mode reboot_mode;
|
||||
|
||||
enum reboot_type {
|
||||
BOOT_TRIPLE = 't',
|
||||
BOOT_KBD = 'k',
|
||||
BOOT_BIOS = 'b',
|
||||
BOOT_ACPI = 'a',
|
||||
BOOT_EFI = 'e',
|
||||
BOOT_CF9 = 'p',
|
||||
BOOT_CF9_COND = 'q',
|
||||
BOOT_TRIPLE = 't',
|
||||
BOOT_KBD = 'k',
|
||||
BOOT_BIOS = 'b',
|
||||
BOOT_ACPI = 'a',
|
||||
BOOT_EFI = 'e',
|
||||
BOOT_CF9_FORCE = 'p',
|
||||
BOOT_CF9_SAFE = 'q',
|
||||
};
|
||||
extern enum reboot_type reboot_type;
|
||||
|
||||
|
@ -45,7 +45,7 @@ struct dst_entry {
|
||||
void *__pad1;
|
||||
#endif
|
||||
int (*input)(struct sk_buff *);
|
||||
int (*output)(struct sk_buff *);
|
||||
int (*output)(struct sock *sk, struct sk_buff *skb);
|
||||
|
||||
unsigned short flags;
|
||||
#define DST_HOST 0x0001
|
||||
@ -367,7 +367,11 @@ static inline struct dst_entry *skb_dst_pop(struct sk_buff *skb)
|
||||
return child;
|
||||
}
|
||||
|
||||
int dst_discard(struct sk_buff *skb);
|
||||
int dst_discard_sk(struct sock *sk, struct sk_buff *skb);
|
||||
static inline int dst_discard(struct sk_buff *skb)
|
||||
{
|
||||
return dst_discard_sk(skb->sk, skb);
|
||||
}
|
||||
void *dst_alloc(struct dst_ops *ops, struct net_device *dev, int initial_ref,
|
||||
int initial_obsolete, unsigned short flags);
|
||||
void __dst_free(struct dst_entry *dst);
|
||||
@ -449,9 +453,13 @@ static inline void dst_set_expires(struct dst_entry *dst, int timeout)
|
||||
}
|
||||
|
||||
/* Output packet to network from transport. */
|
||||
static inline int dst_output_sk(struct sock *sk, struct sk_buff *skb)
|
||||
{
|
||||
return skb_dst(skb)->output(sk, skb);
|
||||
}
|
||||
static inline int dst_output(struct sk_buff *skb)
|
||||
{
|
||||
return skb_dst(skb)->output(skb);
|
||||
return dst_output_sk(skb->sk, skb);
|
||||
}
|
||||
|
||||
/* Input packet from network to transport. */
|
||||
|
@ -40,7 +40,7 @@ void inet6_csk_reqsk_queue_hash_add(struct sock *sk, struct request_sock *req,
|
||||
|
||||
void inet6_csk_addr2sockaddr(struct sock *sk, struct sockaddr *uaddr);
|
||||
|
||||
int inet6_csk_xmit(struct sk_buff *skb, struct flowi *fl);
|
||||
int inet6_csk_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl);
|
||||
|
||||
struct dst_entry *inet6_csk_update_pmtu(struct sock *sk, u32 mtu);
|
||||
#endif /* _INET6_CONNECTION_SOCK_H */
|
||||
|
@ -36,7 +36,7 @@ struct tcp_congestion_ops;
|
||||
* (i.e. things that depend on the address family)
|
||||
*/
|
||||
struct inet_connection_sock_af_ops {
|
||||
int (*queue_xmit)(struct sk_buff *skb, struct flowi *fl);
|
||||
int (*queue_xmit)(struct sock *sk, struct sk_buff *skb, struct flowi *fl);
|
||||
void (*send_check)(struct sock *sk, struct sk_buff *skb);
|
||||
int (*rebuild_header)(struct sock *sk);
|
||||
void (*sk_rx_dst_set)(struct sock *sk, const struct sk_buff *skb);
|
||||
|
@ -104,14 +104,19 @@ int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt,
|
||||
struct net_device *orig_dev);
|
||||
int ip_local_deliver(struct sk_buff *skb);
|
||||
int ip_mr_input(struct sk_buff *skb);
|
||||
int ip_output(struct sk_buff *skb);
|
||||
int ip_mc_output(struct sk_buff *skb);
|
||||
int ip_output(struct sock *sk, struct sk_buff *skb);
|
||||
int ip_mc_output(struct sock *sk, struct sk_buff *skb);
|
||||
int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *));
|
||||
int ip_do_nat(struct sk_buff *skb);
|
||||
void ip_send_check(struct iphdr *ip);
|
||||
int __ip_local_out(struct sk_buff *skb);
|
||||
int ip_local_out(struct sk_buff *skb);
|
||||
int ip_queue_xmit(struct sk_buff *skb, struct flowi *fl);
|
||||
int ip_local_out_sk(struct sock *sk, struct sk_buff *skb);
|
||||
static inline int ip_local_out(struct sk_buff *skb)
|
||||
{
|
||||
return ip_local_out_sk(skb->sk, skb);
|
||||
}
|
||||
|
||||
int ip_queue_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl);
|
||||
void ip_init(void);
|
||||
int ip_append_data(struct sock *sk, struct flowi4 *fl4,
|
||||
int getfrag(void *from, char *to, int offset, int len,
|
||||
|
@ -32,6 +32,11 @@ struct route_info {
|
||||
#define RT6_LOOKUP_F_SRCPREF_PUBLIC 0x00000010
|
||||
#define RT6_LOOKUP_F_SRCPREF_COA 0x00000020
|
||||
|
||||
/* We do not (yet ?) support IPv6 jumbograms (RFC 2675)
|
||||
* Unlike IPv4, hdr->seg_len doesn't include the IPv6 header
|
||||
*/
|
||||
#define IP6_MAX_MTU (0xFFFF + sizeof(struct ipv6hdr))
|
||||
|
||||
/*
|
||||
* rt6_srcprefs2flags() and rt6_flags2srcprefs() translate
|
||||
* between IPV6_ADDR_PREFERENCES socket option values
|
||||
|
@ -153,7 +153,7 @@ static inline u8 ip_tunnel_ecn_encap(u8 tos, const struct iphdr *iph,
|
||||
}
|
||||
|
||||
int iptunnel_pull_header(struct sk_buff *skb, int hdr_len, __be16 inner_proto);
|
||||
int iptunnel_xmit(struct rtable *rt, struct sk_buff *skb,
|
||||
int iptunnel_xmit(struct sock *sk, struct rtable *rt, struct sk_buff *skb,
|
||||
__be32 src, __be32 dst, __u8 proto,
|
||||
__u8 tos, __u8 ttl, __be16 df, bool xnet);
|
||||
|
||||
|
@ -731,7 +731,7 @@ struct dst_entry *ip6_blackhole_route(struct net *net,
|
||||
* skb processing functions
|
||||
*/
|
||||
|
||||
int ip6_output(struct sk_buff *skb);
|
||||
int ip6_output(struct sock *sk, struct sk_buff *skb);
|
||||
int ip6_forward(struct sk_buff *skb);
|
||||
int ip6_input(struct sk_buff *skb);
|
||||
int ip6_mc_input(struct sk_buff *skb);
|
||||
|
@ -13,6 +13,16 @@ struct nft_cmp_fast_expr {
|
||||
u8 len;
|
||||
};
|
||||
|
||||
/* Calculate the mask for the nft_cmp_fast expression. On big endian the
|
||||
* mask needs to include the *upper* bytes when interpreting that data as
|
||||
* something smaller than the full u32, therefore a cpu_to_le32 is done.
|
||||
*/
|
||||
static inline u32 nft_cmp_fast_mask(unsigned int len)
|
||||
{
|
||||
return cpu_to_le32(~0U >> (FIELD_SIZEOF(struct nft_cmp_fast_expr,
|
||||
data) * BITS_PER_BYTE - len));
|
||||
}
|
||||
|
||||
extern const struct nft_expr_ops nft_cmp_fast_ops;
|
||||
|
||||
int nft_cmp_module_init(void);
|
||||
|
@ -1653,6 +1653,17 @@ struct sctp_association {
|
||||
/* This is the last advertised value of rwnd over a SACK chunk. */
|
||||
__u32 a_rwnd;
|
||||
|
||||
/* Number of bytes by which the rwnd has slopped. The rwnd is allowed
|
||||
* to slop over a maximum of the association's frag_point.
|
||||
*/
|
||||
__u32 rwnd_over;
|
||||
|
||||
/* Keeps treack of rwnd pressure. This happens when we have
|
||||
* a window, but not recevie buffer (i.e small packets). This one
|
||||
* is releases slowly (1 PMTU at a time ).
|
||||
*/
|
||||
__u32 rwnd_press;
|
||||
|
||||
/* This is the sndbuf size in use for the association.
|
||||
* This corresponds to the sndbuf size for the association,
|
||||
* as specified in the sk->sndbuf.
|
||||
@ -1881,7 +1892,8 @@ void sctp_assoc_update(struct sctp_association *old,
|
||||
__u32 sctp_association_get_next_tsn(struct sctp_association *);
|
||||
|
||||
void sctp_assoc_sync_pmtu(struct sock *, struct sctp_association *);
|
||||
void sctp_assoc_rwnd_update(struct sctp_association *, bool);
|
||||
void sctp_assoc_rwnd_increase(struct sctp_association *, unsigned int);
|
||||
void sctp_assoc_rwnd_decrease(struct sctp_association *, unsigned int);
|
||||
void sctp_assoc_set_primary(struct sctp_association *,
|
||||
struct sctp_transport *);
|
||||
void sctp_assoc_del_nonprimary_peers(struct sctp_association *,
|
||||
|
@ -333,7 +333,7 @@ struct xfrm_state_afinfo {
|
||||
const xfrm_address_t *saddr);
|
||||
int (*tmpl_sort)(struct xfrm_tmpl **dst, struct xfrm_tmpl **src, int n);
|
||||
int (*state_sort)(struct xfrm_state **dst, struct xfrm_state **src, int n);
|
||||
int (*output)(struct sk_buff *skb);
|
||||
int (*output)(struct sock *sk, struct sk_buff *skb);
|
||||
int (*output_finish)(struct sk_buff *skb);
|
||||
int (*extract_input)(struct xfrm_state *x,
|
||||
struct sk_buff *skb);
|
||||
@ -1540,7 +1540,7 @@ static inline int xfrm4_rcv_spi(struct sk_buff *skb, int nexthdr, __be32 spi)
|
||||
|
||||
int xfrm4_extract_output(struct xfrm_state *x, struct sk_buff *skb);
|
||||
int xfrm4_prepare_output(struct xfrm_state *x, struct sk_buff *skb);
|
||||
int xfrm4_output(struct sk_buff *skb);
|
||||
int xfrm4_output(struct sock *sk, struct sk_buff *skb);
|
||||
int xfrm4_output_finish(struct sk_buff *skb);
|
||||
int xfrm4_rcv_cb(struct sk_buff *skb, u8 protocol, int err);
|
||||
int xfrm4_protocol_register(struct xfrm4_protocol *handler, unsigned char protocol);
|
||||
@ -1565,7 +1565,7 @@ __be32 xfrm6_tunnel_alloc_spi(struct net *net, xfrm_address_t *saddr);
|
||||
__be32 xfrm6_tunnel_spi_lookup(struct net *net, const xfrm_address_t *saddr);
|
||||
int xfrm6_extract_output(struct xfrm_state *x, struct sk_buff *skb);
|
||||
int xfrm6_prepare_output(struct xfrm_state *x, struct sk_buff *skb);
|
||||
int xfrm6_output(struct sk_buff *skb);
|
||||
int xfrm6_output(struct sock *sk, struct sk_buff *skb);
|
||||
int xfrm6_output_finish(struct sk_buff *skb);
|
||||
int xfrm6_find_1stfragopt(struct xfrm_state *x, struct sk_buff *skb,
|
||||
u8 **prevhdr);
|
||||
|
@ -71,18 +71,17 @@ void mutex_remove_waiter(struct mutex *lock, struct mutex_waiter *waiter,
|
||||
|
||||
void debug_mutex_unlock(struct mutex *lock)
|
||||
{
|
||||
if (unlikely(!debug_locks))
|
||||
return;
|
||||
if (likely(debug_locks)) {
|
||||
DEBUG_LOCKS_WARN_ON(lock->magic != lock);
|
||||
|
||||
DEBUG_LOCKS_WARN_ON(lock->magic != lock);
|
||||
if (!lock->owner)
|
||||
DEBUG_LOCKS_WARN_ON(!lock->owner);
|
||||
else
|
||||
DEBUG_LOCKS_WARN_ON(lock->owner != current);
|
||||
|
||||
if (!lock->owner)
|
||||
DEBUG_LOCKS_WARN_ON(!lock->owner);
|
||||
else
|
||||
DEBUG_LOCKS_WARN_ON(lock->owner != current);
|
||||
|
||||
DEBUG_LOCKS_WARN_ON(!lock->wait_list.prev && !lock->wait_list.next);
|
||||
mutex_clear_owner(lock);
|
||||
DEBUG_LOCKS_WARN_ON(!lock->wait_list.prev && !lock->wait_list.next);
|
||||
mutex_clear_owner(lock);
|
||||
}
|
||||
|
||||
/*
|
||||
* __mutex_slowpath_needs_to_unlock() is explicitly 0 for debug
|
||||
|
@ -69,18 +69,17 @@ static void populate_seccomp_data(struct seccomp_data *sd)
|
||||
{
|
||||
struct task_struct *task = current;
|
||||
struct pt_regs *regs = task_pt_regs(task);
|
||||
unsigned long args[6];
|
||||
|
||||
sd->nr = syscall_get_nr(task, regs);
|
||||
sd->arch = syscall_get_arch();
|
||||
|
||||
/* Unroll syscall_get_args to help gcc on arm. */
|
||||
syscall_get_arguments(task, regs, 0, 1, (unsigned long *) &sd->args[0]);
|
||||
syscall_get_arguments(task, regs, 1, 1, (unsigned long *) &sd->args[1]);
|
||||
syscall_get_arguments(task, regs, 2, 1, (unsigned long *) &sd->args[2]);
|
||||
syscall_get_arguments(task, regs, 3, 1, (unsigned long *) &sd->args[3]);
|
||||
syscall_get_arguments(task, regs, 4, 1, (unsigned long *) &sd->args[4]);
|
||||
syscall_get_arguments(task, regs, 5, 1, (unsigned long *) &sd->args[5]);
|
||||
|
||||
syscall_get_arguments(task, regs, 0, 6, args);
|
||||
sd->args[0] = args[0];
|
||||
sd->args[1] = args[1];
|
||||
sd->args[2] = args[2];
|
||||
sd->args[3] = args[3];
|
||||
sd->args[4] = args[4];
|
||||
sd->args[5] = args[5];
|
||||
sd->instruction_pointer = KSTK_EIP(task);
|
||||
}
|
||||
|
||||
|
@ -152,7 +152,7 @@ static u32 map_id_range_down(struct uid_gid_map *map, u32 id, u32 count)
|
||||
|
||||
/* Find the matching extent */
|
||||
extents = map->nr_extents;
|
||||
smp_read_barrier_depends();
|
||||
smp_rmb();
|
||||
for (idx = 0; idx < extents; idx++) {
|
||||
first = map->extent[idx].first;
|
||||
last = first + map->extent[idx].count - 1;
|
||||
@ -176,7 +176,7 @@ static u32 map_id_down(struct uid_gid_map *map, u32 id)
|
||||
|
||||
/* Find the matching extent */
|
||||
extents = map->nr_extents;
|
||||
smp_read_barrier_depends();
|
||||
smp_rmb();
|
||||
for (idx = 0; idx < extents; idx++) {
|
||||
first = map->extent[idx].first;
|
||||
last = first + map->extent[idx].count - 1;
|
||||
@ -199,7 +199,7 @@ static u32 map_id_up(struct uid_gid_map *map, u32 id)
|
||||
|
||||
/* Find the matching extent */
|
||||
extents = map->nr_extents;
|
||||
smp_read_barrier_depends();
|
||||
smp_rmb();
|
||||
for (idx = 0; idx < extents; idx++) {
|
||||
first = map->extent[idx].lower_first;
|
||||
last = first + map->extent[idx].count - 1;
|
||||
@ -615,9 +615,8 @@ static ssize_t map_write(struct file *file, const char __user *buf,
|
||||
* were written before the count of the extents.
|
||||
*
|
||||
* To achieve this smp_wmb() is used on guarantee the write
|
||||
* order and smp_read_barrier_depends() is guaranteed that we
|
||||
* don't have crazy architectures returning stale data.
|
||||
*
|
||||
* order and smp_rmb() is guaranteed that we don't have crazy
|
||||
* architectures returning stale data.
|
||||
*/
|
||||
mutex_lock(&id_map_mutex);
|
||||
|
||||
|
@ -2284,7 +2284,7 @@ EXPORT_SYMBOL(skb_checksum_help);
|
||||
__be16 skb_network_protocol(struct sk_buff *skb, int *depth)
|
||||
{
|
||||
__be16 type = skb->protocol;
|
||||
int vlan_depth = ETH_HLEN;
|
||||
int vlan_depth = skb->mac_len;
|
||||
|
||||
/* Tunnel gso handlers can set protocol to ethernet. */
|
||||
if (type == htons(ETH_P_TEB)) {
|
||||
|
@ -142,12 +142,12 @@ loop:
|
||||
mutex_unlock(&dst_gc_mutex);
|
||||
}
|
||||
|
||||
int dst_discard(struct sk_buff *skb)
|
||||
int dst_discard_sk(struct sock *sk, struct sk_buff *skb)
|
||||
{
|
||||
kfree_skb(skb);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(dst_discard);
|
||||
EXPORT_SYMBOL(dst_discard_sk);
|
||||
|
||||
const u32 dst_default_metrics[RTAX_MAX + 1] = {
|
||||
/* This initializer is needed to force linker to place this variable
|
||||
@ -184,7 +184,7 @@ void *dst_alloc(struct dst_ops *ops, struct net_device *dev,
|
||||
dst->xfrm = NULL;
|
||||
#endif
|
||||
dst->input = dst_discard;
|
||||
dst->output = dst_discard;
|
||||
dst->output = dst_discard_sk;
|
||||
dst->error = 0;
|
||||
dst->obsolete = initial_obsolete;
|
||||
dst->header_len = 0;
|
||||
@ -209,8 +209,10 @@ static void ___dst_free(struct dst_entry *dst)
|
||||
/* The first case (dev==NULL) is required, when
|
||||
protocol module is unloaded.
|
||||
*/
|
||||
if (dst->dev == NULL || !(dst->dev->flags&IFF_UP))
|
||||
dst->input = dst->output = dst_discard;
|
||||
if (dst->dev == NULL || !(dst->dev->flags&IFF_UP)) {
|
||||
dst->input = dst_discard;
|
||||
dst->output = dst_discard_sk;
|
||||
}
|
||||
dst->obsolete = DST_OBSOLETE_DEAD;
|
||||
}
|
||||
|
||||
@ -361,7 +363,8 @@ static void dst_ifdown(struct dst_entry *dst, struct net_device *dev,
|
||||
return;
|
||||
|
||||
if (!unregister) {
|
||||
dst->input = dst->output = dst_discard;
|
||||
dst->input = dst_discard;
|
||||
dst->output = dst_discard_sk;
|
||||
} else {
|
||||
dst->dev = dev_net(dst->dev)->loopback_dev;
|
||||
dev_hold(dst->dev);
|
||||
|
@ -600,6 +600,9 @@ static u64 __skb_get_nlattr(u64 ctx, u64 A, u64 X, u64 r4, u64 r5)
|
||||
if (skb_is_nonlinear(skb))
|
||||
return 0;
|
||||
|
||||
if (skb->len < sizeof(struct nlattr))
|
||||
return 0;
|
||||
|
||||
if (A > skb->len - sizeof(struct nlattr))
|
||||
return 0;
|
||||
|
||||
@ -618,11 +621,14 @@ static u64 __skb_get_nlattr_nest(u64 ctx, u64 A, u64 X, u64 r4, u64 r5)
|
||||
if (skb_is_nonlinear(skb))
|
||||
return 0;
|
||||
|
||||
if (skb->len < sizeof(struct nlattr))
|
||||
return 0;
|
||||
|
||||
if (A > skb->len - sizeof(struct nlattr))
|
||||
return 0;
|
||||
|
||||
nla = (struct nlattr *) &skb->data[A];
|
||||
if (nla->nla_len > A - skb->len)
|
||||
if (nla->nla_len > skb->len - A)
|
||||
return 0;
|
||||
|
||||
nla = nla_find_nested(nla, X);
|
||||
@ -1737,7 +1743,6 @@ void sk_decode_filter(struct sock_filter *filt, struct sock_filter *to)
|
||||
[BPF_S_ANC_RXHASH] = BPF_LD|BPF_B|BPF_ABS,
|
||||
[BPF_S_ANC_CPU] = BPF_LD|BPF_B|BPF_ABS,
|
||||
[BPF_S_ANC_ALU_XOR_X] = BPF_LD|BPF_B|BPF_ABS,
|
||||
[BPF_S_ANC_SECCOMP_LD_W] = BPF_LD|BPF_B|BPF_ABS,
|
||||
[BPF_S_ANC_VLAN_TAG] = BPF_LD|BPF_B|BPF_ABS,
|
||||
[BPF_S_ANC_VLAN_TAG_PRESENT] = BPF_LD|BPF_B|BPF_ABS,
|
||||
[BPF_S_ANC_PAY_OFFSET] = BPF_LD|BPF_B|BPF_ABS,
|
||||
|
@ -138,7 +138,7 @@ static int dccp_transmit_skb(struct sock *sk, struct sk_buff *skb)
|
||||
|
||||
DCCP_INC_STATS(DCCP_MIB_OUTSEGS);
|
||||
|
||||
err = icsk->icsk_af_ops->queue_xmit(skb, &inet->cork.fl);
|
||||
err = icsk->icsk_af_ops->queue_xmit(sk, skb, &inet->cork.fl);
|
||||
return net_xmit_eval(err);
|
||||
}
|
||||
return -ENOBUFS;
|
||||
|
@ -752,7 +752,7 @@ static int dn_to_neigh_output(struct sk_buff *skb)
|
||||
return n->output(n, skb);
|
||||
}
|
||||
|
||||
static int dn_output(struct sk_buff *skb)
|
||||
static int dn_output(struct sock *sk, struct sk_buff *skb)
|
||||
{
|
||||
struct dst_entry *dst = skb_dst(skb);
|
||||
struct dn_route *rt = (struct dn_route *)dst;
|
||||
@ -838,6 +838,18 @@ drop:
|
||||
* Used to catch bugs. This should never normally get
|
||||
* called.
|
||||
*/
|
||||
static int dn_rt_bug_sk(struct sock *sk, struct sk_buff *skb)
|
||||
{
|
||||
struct dn_skb_cb *cb = DN_SKB_CB(skb);
|
||||
|
||||
net_dbg_ratelimited("dn_rt_bug: skb from:%04x to:%04x\n",
|
||||
le16_to_cpu(cb->src), le16_to_cpu(cb->dst));
|
||||
|
||||
kfree_skb(skb);
|
||||
|
||||
return NET_RX_DROP;
|
||||
}
|
||||
|
||||
static int dn_rt_bug(struct sk_buff *skb)
|
||||
{
|
||||
struct dn_skb_cb *cb = DN_SKB_CB(skb);
|
||||
@ -1463,7 +1475,7 @@ make_route:
|
||||
|
||||
rt->n = neigh;
|
||||
rt->dst.lastuse = jiffies;
|
||||
rt->dst.output = dn_rt_bug;
|
||||
rt->dst.output = dn_rt_bug_sk;
|
||||
switch (res.type) {
|
||||
case RTN_UNICAST:
|
||||
rt->dst.input = dn_forward;
|
||||
|
@ -101,17 +101,17 @@ int __ip_local_out(struct sk_buff *skb)
|
||||
skb_dst(skb)->dev, dst_output);
|
||||
}
|
||||
|
||||
int ip_local_out(struct sk_buff *skb)
|
||||
int ip_local_out_sk(struct sock *sk, struct sk_buff *skb)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = __ip_local_out(skb);
|
||||
if (likely(err == 1))
|
||||
err = dst_output(skb);
|
||||
err = dst_output_sk(sk, skb);
|
||||
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ip_local_out);
|
||||
EXPORT_SYMBOL_GPL(ip_local_out_sk);
|
||||
|
||||
static inline int ip_select_ttl(struct inet_sock *inet, struct dst_entry *dst)
|
||||
{
|
||||
@ -226,9 +226,8 @@ static int ip_finish_output(struct sk_buff *skb)
|
||||
return ip_finish_output2(skb);
|
||||
}
|
||||
|
||||
int ip_mc_output(struct sk_buff *skb)
|
||||
int ip_mc_output(struct sock *sk, struct sk_buff *skb)
|
||||
{
|
||||
struct sock *sk = skb->sk;
|
||||
struct rtable *rt = skb_rtable(skb);
|
||||
struct net_device *dev = rt->dst.dev;
|
||||
|
||||
@ -287,7 +286,7 @@ int ip_mc_output(struct sk_buff *skb)
|
||||
!(IPCB(skb)->flags & IPSKB_REROUTED));
|
||||
}
|
||||
|
||||
int ip_output(struct sk_buff *skb)
|
||||
int ip_output(struct sock *sk, struct sk_buff *skb)
|
||||
{
|
||||
struct net_device *dev = skb_dst(skb)->dev;
|
||||
|
||||
@ -315,9 +314,9 @@ static void ip_copy_addrs(struct iphdr *iph, const struct flowi4 *fl4)
|
||||
sizeof(fl4->saddr) + sizeof(fl4->daddr));
|
||||
}
|
||||
|
||||
int ip_queue_xmit(struct sk_buff *skb, struct flowi *fl)
|
||||
/* Note: skb->sk can be different from sk, in case of tunnels */
|
||||
int ip_queue_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl)
|
||||
{
|
||||
struct sock *sk = skb->sk;
|
||||
struct inet_sock *inet = inet_sk(sk);
|
||||
struct ip_options_rcu *inet_opt;
|
||||
struct flowi4 *fl4;
|
||||
@ -389,6 +388,7 @@ packet_routed:
|
||||
ip_select_ident_more(skb, &rt->dst, sk,
|
||||
(skb_shinfo(skb)->gso_segs ?: 1) - 1);
|
||||
|
||||
/* TODO : should we use skb->sk here instead of sk ? */
|
||||
skb->priority = sk->sk_priority;
|
||||
skb->mark = sk->sk_mark;
|
||||
|
||||
|
@ -670,7 +670,7 @@ void ip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev,
|
||||
return;
|
||||
}
|
||||
|
||||
err = iptunnel_xmit(rt, skb, fl4.saddr, fl4.daddr, protocol,
|
||||
err = iptunnel_xmit(skb->sk, rt, skb, fl4.saddr, fl4.daddr, protocol,
|
||||
tos, ttl, df, !net_eq(tunnel->net, dev_net(dev)));
|
||||
iptunnel_xmit_stats(err, &dev->stats, dev->tstats);
|
||||
|
||||
|
@ -46,7 +46,7 @@
|
||||
#include <net/netns/generic.h>
|
||||
#include <net/rtnetlink.h>
|
||||
|
||||
int iptunnel_xmit(struct rtable *rt, struct sk_buff *skb,
|
||||
int iptunnel_xmit(struct sock *sk, struct rtable *rt, struct sk_buff *skb,
|
||||
__be32 src, __be32 dst, __u8 proto,
|
||||
__u8 tos, __u8 ttl, __be16 df, bool xnet)
|
||||
{
|
||||
@ -76,7 +76,7 @@ int iptunnel_xmit(struct rtable *rt, struct sk_buff *skb,
|
||||
iph->ttl = ttl;
|
||||
__ip_select_ident(iph, &rt->dst, (skb_shinfo(skb)->gso_segs ?: 1) - 1);
|
||||
|
||||
err = ip_local_out(skb);
|
||||
err = ip_local_out_sk(sk, skb);
|
||||
if (unlikely(net_xmit_eval(err)))
|
||||
pkt_len = 0;
|
||||
return pkt_len;
|
||||
|
@ -252,26 +252,33 @@ int ping_init_sock(struct sock *sk)
|
||||
{
|
||||
struct net *net = sock_net(sk);
|
||||
kgid_t group = current_egid();
|
||||
struct group_info *group_info = get_current_groups();
|
||||
int i, j, count = group_info->ngroups;
|
||||
struct group_info *group_info;
|
||||
int i, j, count;
|
||||
kgid_t low, high;
|
||||
int ret = 0;
|
||||
|
||||
inet_get_ping_group_range_net(net, &low, &high);
|
||||
if (gid_lte(low, group) && gid_lte(group, high))
|
||||
return 0;
|
||||
|
||||
group_info = get_current_groups();
|
||||
count = group_info->ngroups;
|
||||
for (i = 0; i < group_info->nblocks; i++) {
|
||||
int cp_count = min_t(int, NGROUPS_PER_BLOCK, count);
|
||||
for (j = 0; j < cp_count; j++) {
|
||||
kgid_t gid = group_info->blocks[i][j];
|
||||
if (gid_lte(low, gid) && gid_lte(gid, high))
|
||||
return 0;
|
||||
goto out_release_group;
|
||||
}
|
||||
|
||||
count -= cp_count;
|
||||
}
|
||||
|
||||
return -EACCES;
|
||||
ret = -EACCES;
|
||||
|
||||
out_release_group:
|
||||
put_group_info(group_info);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ping_init_sock);
|
||||
|
||||
|
@ -1129,7 +1129,7 @@ static void ipv4_link_failure(struct sk_buff *skb)
|
||||
dst_set_expires(&rt->dst, 0);
|
||||
}
|
||||
|
||||
static int ip_rt_bug(struct sk_buff *skb)
|
||||
static int ip_rt_bug(struct sock *sk, struct sk_buff *skb)
|
||||
{
|
||||
pr_debug("%s: %pI4 -> %pI4, %s\n",
|
||||
__func__, &ip_hdr(skb)->saddr, &ip_hdr(skb)->daddr,
|
||||
@ -2218,7 +2218,7 @@ struct dst_entry *ipv4_blackhole_route(struct net *net, struct dst_entry *dst_or
|
||||
|
||||
new->__use = 1;
|
||||
new->input = dst_discard;
|
||||
new->output = dst_discard;
|
||||
new->output = dst_discard_sk;
|
||||
|
||||
new->dev = ort->dst.dev;
|
||||
if (new->dev)
|
||||
@ -2357,7 +2357,7 @@ static int rt_fill_info(struct net *net, __be32 dst, __be32 src,
|
||||
}
|
||||
} else
|
||||
#endif
|
||||
if (nla_put_u32(skb, RTA_IIF, rt->rt_iif))
|
||||
if (nla_put_u32(skb, RTA_IIF, skb->dev->ifindex))
|
||||
goto nla_put_failure;
|
||||
}
|
||||
|
||||
|
@ -981,7 +981,7 @@ static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it,
|
||||
TCP_ADD_STATS(sock_net(sk), TCP_MIB_OUTSEGS,
|
||||
tcp_skb_pcount(skb));
|
||||
|
||||
err = icsk->icsk_af_ops->queue_xmit(skb, &inet->cork.fl);
|
||||
err = icsk->icsk_af_ops->queue_xmit(sk, skb, &inet->cork.fl);
|
||||
if (likely(err <= 0))
|
||||
return err;
|
||||
|
||||
|
@ -86,7 +86,7 @@ int xfrm4_output_finish(struct sk_buff *skb)
|
||||
return xfrm_output(skb);
|
||||
}
|
||||
|
||||
int xfrm4_output(struct sk_buff *skb)
|
||||
int xfrm4_output(struct sock *sk, struct sk_buff *skb)
|
||||
{
|
||||
struct dst_entry *dst = skb_dst(skb);
|
||||
struct xfrm_state *x = dst->xfrm;
|
||||
|
@ -224,9 +224,8 @@ static struct dst_entry *inet6_csk_route_socket(struct sock *sk,
|
||||
return dst;
|
||||
}
|
||||
|
||||
int inet6_csk_xmit(struct sk_buff *skb, struct flowi *fl_unused)
|
||||
int inet6_csk_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl_unused)
|
||||
{
|
||||
struct sock *sk = skb->sk;
|
||||
struct ipv6_pinfo *np = inet6_sk(sk);
|
||||
struct flowi6 fl6;
|
||||
struct dst_entry *dst;
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user