mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-04-17 11:54:00 +00:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
This commit is contained in:
commit
fdae5f37a8
37 changed files with 180 additions and 105 deletions
1
.mailmap
1
.mailmap
|
@ -102,6 +102,7 @@ Leonid I Ananiev <leonid.i.ananiev@intel.com>
|
||||||
Linas Vepstas <linas@austin.ibm.com>
|
Linas Vepstas <linas@austin.ibm.com>
|
||||||
Linus Lüssing <linus.luessing@c0d3.blue> <linus.luessing@web.de>
|
Linus Lüssing <linus.luessing@c0d3.blue> <linus.luessing@web.de>
|
||||||
Linus Lüssing <linus.luessing@c0d3.blue> <linus.luessing@ascom.ch>
|
Linus Lüssing <linus.luessing@c0d3.blue> <linus.luessing@ascom.ch>
|
||||||
|
Maciej W. Rozycki <macro@mips.com> <macro@imgtec.com>
|
||||||
Marcin Nowakowski <marcin.nowakowski@mips.com> <marcin.nowakowski@imgtec.com>
|
Marcin Nowakowski <marcin.nowakowski@mips.com> <marcin.nowakowski@imgtec.com>
|
||||||
Mark Brown <broonie@sirena.org.uk>
|
Mark Brown <broonie@sirena.org.uk>
|
||||||
Martin Kepplinger <martink@posteo.de> <martin.kepplinger@theobroma-systems.com>
|
Martin Kepplinger <martink@posteo.de> <martin.kepplinger@theobroma-systems.com>
|
||||||
|
|
9
CREDITS
9
CREDITS
|
@ -2113,6 +2113,10 @@ S: J. Obrechtstr 23
|
||||||
S: NL-5216 GP 's-Hertogenbosch
|
S: NL-5216 GP 's-Hertogenbosch
|
||||||
S: The Netherlands
|
S: The Netherlands
|
||||||
|
|
||||||
|
N: Ashley Lai
|
||||||
|
E: ashleydlai@gmail.com
|
||||||
|
D: IBM VTPM driver
|
||||||
|
|
||||||
N: Savio Lam
|
N: Savio Lam
|
||||||
E: lam836@cs.cuhk.hk
|
E: lam836@cs.cuhk.hk
|
||||||
D: Author of the dialog utility, foundation
|
D: Author of the dialog utility, foundation
|
||||||
|
@ -3333,6 +3337,10 @@ S: Braunschweiger Strasse 79
|
||||||
S: 31134 Hildesheim
|
S: 31134 Hildesheim
|
||||||
S: Germany
|
S: Germany
|
||||||
|
|
||||||
|
N: Marcel Selhorst
|
||||||
|
E: tpmdd@selhorst.net
|
||||||
|
D: TPM driver
|
||||||
|
|
||||||
N: Darren Senn
|
N: Darren Senn
|
||||||
E: sinster@darkwater.com
|
E: sinster@darkwater.com
|
||||||
D: Whatever I notice needs doing (so far: itimers, /proc)
|
D: Whatever I notice needs doing (so far: itimers, /proc)
|
||||||
|
@ -4128,7 +4136,6 @@ D: MD driver
|
||||||
D: EISA/sysfs subsystem
|
D: EISA/sysfs subsystem
|
||||||
S: France
|
S: France
|
||||||
|
|
||||||
|
|
||||||
# Don't add your name here, unless you really _are_ after Marc
|
# Don't add your name here, unless you really _are_ after Marc
|
||||||
# alphabetically. Leonard used to be very proud of being the
|
# alphabetically. Leonard used to be very proud of being the
|
||||||
# last entry, and he'll get positively pissed if he can't even
|
# last entry, and he'll get positively pissed if he can't even
|
||||||
|
|
25
MAINTAINERS
25
MAINTAINERS
|
@ -10349,7 +10349,6 @@ F: drivers/pci/host/vmd.c
|
||||||
|
|
||||||
PCI DRIVER FOR MICROSEMI SWITCHTEC
|
PCI DRIVER FOR MICROSEMI SWITCHTEC
|
||||||
M: Kurt Schwemmer <kurt.schwemmer@microsemi.com>
|
M: Kurt Schwemmer <kurt.schwemmer@microsemi.com>
|
||||||
M: Stephen Bates <stephen.bates@microsemi.com>
|
|
||||||
M: Logan Gunthorpe <logang@deltatee.com>
|
M: Logan Gunthorpe <logang@deltatee.com>
|
||||||
L: linux-pci@vger.kernel.org
|
L: linux-pci@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
@ -10414,6 +10413,7 @@ F: drivers/pci/dwc/*keystone*
|
||||||
|
|
||||||
PCI ENDPOINT SUBSYSTEM
|
PCI ENDPOINT SUBSYSTEM
|
||||||
M: Kishon Vijay Abraham I <kishon@ti.com>
|
M: Kishon Vijay Abraham I <kishon@ti.com>
|
||||||
|
M: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
|
||||||
L: linux-pci@vger.kernel.org
|
L: linux-pci@vger.kernel.org
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/kishon/pci-endpoint.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/kishon/pci-endpoint.git
|
||||||
S: Supported
|
S: Supported
|
||||||
|
@ -10465,6 +10465,15 @@ F: include/linux/pci*
|
||||||
F: arch/x86/pci/
|
F: arch/x86/pci/
|
||||||
F: arch/x86/kernel/quirks.c
|
F: arch/x86/kernel/quirks.c
|
||||||
|
|
||||||
|
PCI NATIVE HOST BRIDGE AND ENDPOINT DRIVERS
|
||||||
|
M: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
|
||||||
|
L: linux-pci@vger.kernel.org
|
||||||
|
Q: http://patchwork.ozlabs.org/project/linux-pci/list/
|
||||||
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/lpieralisi/pci.git/
|
||||||
|
S: Supported
|
||||||
|
F: drivers/pci/host/
|
||||||
|
F: drivers/pci/dwc/
|
||||||
|
|
||||||
PCIE DRIVER FOR AXIS ARTPEC
|
PCIE DRIVER FOR AXIS ARTPEC
|
||||||
M: Niklas Cassel <niklas.cassel@axis.com>
|
M: Niklas Cassel <niklas.cassel@axis.com>
|
||||||
M: Jesper Nilsson <jesper.nilsson@axis.com>
|
M: Jesper Nilsson <jesper.nilsson@axis.com>
|
||||||
|
@ -10484,7 +10493,6 @@ F: drivers/pci/host/pci-thunder-*
|
||||||
|
|
||||||
PCIE DRIVER FOR HISILICON
|
PCIE DRIVER FOR HISILICON
|
||||||
M: Zhou Wang <wangzhou1@hisilicon.com>
|
M: Zhou Wang <wangzhou1@hisilicon.com>
|
||||||
M: Gabriele Paoloni <gabriele.paoloni@huawei.com>
|
|
||||||
L: linux-pci@vger.kernel.org
|
L: linux-pci@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: Documentation/devicetree/bindings/pci/hisilicon-pcie.txt
|
F: Documentation/devicetree/bindings/pci/hisilicon-pcie.txt
|
||||||
|
@ -13621,23 +13629,14 @@ F: drivers/platform/x86/toshiba-wmi.c
|
||||||
|
|
||||||
TPM DEVICE DRIVER
|
TPM DEVICE DRIVER
|
||||||
M: Peter Huewe <peterhuewe@gmx.de>
|
M: Peter Huewe <peterhuewe@gmx.de>
|
||||||
M: Marcel Selhorst <tpmdd@selhorst.net>
|
|
||||||
M: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
|
M: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
|
||||||
R: Jason Gunthorpe <jgunthorpe@obsidianresearch.com>
|
R: Jason Gunthorpe <jgunthorpe@obsidianresearch.com>
|
||||||
W: http://tpmdd.sourceforge.net
|
L: linux-integrity@vger.kernel.org
|
||||||
L: tpmdd-devel@lists.sourceforge.net (moderated for non-subscribers)
|
Q: https://patchwork.kernel.org/project/linux-integrity/list/
|
||||||
Q: https://patchwork.kernel.org/project/tpmdd-devel/list/
|
|
||||||
T: git git://git.infradead.org/users/jjs/linux-tpmdd.git
|
T: git git://git.infradead.org/users/jjs/linux-tpmdd.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/char/tpm/
|
F: drivers/char/tpm/
|
||||||
|
|
||||||
TPM IBM_VTPM DEVICE DRIVER
|
|
||||||
M: Ashley Lai <ashleydlai@gmail.com>
|
|
||||||
W: http://tpmdd.sourceforge.net
|
|
||||||
L: tpmdd-devel@lists.sourceforge.net (moderated for non-subscribers)
|
|
||||||
S: Maintained
|
|
||||||
F: drivers/char/tpm/tpm_ibmvtpm*
|
|
||||||
|
|
||||||
TRACING
|
TRACING
|
||||||
M: Steven Rostedt <rostedt@goodmis.org>
|
M: Steven Rostedt <rostedt@goodmis.org>
|
||||||
M: Ingo Molnar <mingo@redhat.com>
|
M: Ingo Molnar <mingo@redhat.com>
|
||||||
|
|
|
@ -154,30 +154,26 @@ static void dump_mem(const char *lvl, const char *str, unsigned long bottom,
|
||||||
set_fs(fs);
|
set_fs(fs);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dump_instr(const char *lvl, struct pt_regs *regs)
|
static void __dump_instr(const char *lvl, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
unsigned long addr = instruction_pointer(regs);
|
unsigned long addr = instruction_pointer(regs);
|
||||||
const int thumb = thumb_mode(regs);
|
const int thumb = thumb_mode(regs);
|
||||||
const int width = thumb ? 4 : 8;
|
const int width = thumb ? 4 : 8;
|
||||||
mm_segment_t fs;
|
|
||||||
char str[sizeof("00000000 ") * 5 + 2 + 1], *p = str;
|
char str[sizeof("00000000 ") * 5 + 2 + 1], *p = str;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We need to switch to kernel mode so that we can use __get_user
|
* Note that we now dump the code first, just in case the backtrace
|
||||||
* to safely read from kernel space. Note that we now dump the
|
* kills us.
|
||||||
* code first, just in case the backtrace kills us.
|
|
||||||
*/
|
*/
|
||||||
fs = get_fs();
|
|
||||||
set_fs(KERNEL_DS);
|
|
||||||
|
|
||||||
for (i = -4; i < 1 + !!thumb; i++) {
|
for (i = -4; i < 1 + !!thumb; i++) {
|
||||||
unsigned int val, bad;
|
unsigned int val, bad;
|
||||||
|
|
||||||
if (thumb)
|
if (thumb)
|
||||||
bad = __get_user(val, &((u16 *)addr)[i]);
|
bad = get_user(val, &((u16 *)addr)[i]);
|
||||||
else
|
else
|
||||||
bad = __get_user(val, &((u32 *)addr)[i]);
|
bad = get_user(val, &((u32 *)addr)[i]);
|
||||||
|
|
||||||
if (!bad)
|
if (!bad)
|
||||||
p += sprintf(p, i == 0 ? "(%0*x) " : "%0*x ",
|
p += sprintf(p, i == 0 ? "(%0*x) " : "%0*x ",
|
||||||
|
@ -188,8 +184,20 @@ static void dump_instr(const char *lvl, struct pt_regs *regs)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
printk("%sCode: %s\n", lvl, str);
|
printk("%sCode: %s\n", lvl, str);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void dump_instr(const char *lvl, struct pt_regs *regs)
|
||||||
|
{
|
||||||
|
mm_segment_t fs;
|
||||||
|
|
||||||
|
if (!user_mode(regs)) {
|
||||||
|
fs = get_fs();
|
||||||
|
set_fs(KERNEL_DS);
|
||||||
|
__dump_instr(lvl, regs);
|
||||||
set_fs(fs);
|
set_fs(fs);
|
||||||
|
} else {
|
||||||
|
__dump_instr(lvl, regs);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_ARM_UNWIND
|
#ifdef CONFIG_ARM_UNWIND
|
||||||
|
|
|
@ -575,6 +575,7 @@ static int __init ar7_register_uarts(void)
|
||||||
uart_port.type = PORT_AR7;
|
uart_port.type = PORT_AR7;
|
||||||
uart_port.uartclk = clk_get_rate(bus_clk) / 2;
|
uart_port.uartclk = clk_get_rate(bus_clk) / 2;
|
||||||
uart_port.iotype = UPIO_MEM32;
|
uart_port.iotype = UPIO_MEM32;
|
||||||
|
uart_port.flags = UPF_FIXED_TYPE;
|
||||||
uart_port.regshift = 2;
|
uart_port.regshift = 2;
|
||||||
|
|
||||||
uart_port.line = 0;
|
uart_port.line = 0;
|
||||||
|
@ -653,6 +654,10 @@ static int __init ar7_register_devices(void)
|
||||||
u32 val;
|
u32 val;
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
|
res = ar7_gpio_init();
|
||||||
|
if (res)
|
||||||
|
pr_warn("unable to register gpios: %d\n", res);
|
||||||
|
|
||||||
res = ar7_register_uarts();
|
res = ar7_register_uarts();
|
||||||
if (res)
|
if (res)
|
||||||
pr_err("unable to setup uart(s): %d\n", res);
|
pr_err("unable to setup uart(s): %d\n", res);
|
||||||
|
|
|
@ -246,8 +246,6 @@ void __init prom_init(void)
|
||||||
ar7_init_cmdline(fw_arg0, (char **)fw_arg1);
|
ar7_init_cmdline(fw_arg0, (char **)fw_arg1);
|
||||||
ar7_init_env((struct env_var *)fw_arg2);
|
ar7_init_env((struct env_var *)fw_arg2);
|
||||||
console_config();
|
console_config();
|
||||||
|
|
||||||
ar7_gpio_init();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#define PORT(offset) (KSEG1ADDR(AR7_REGS_UART0 + (offset * 4)))
|
#define PORT(offset) (KSEG1ADDR(AR7_REGS_UART0 + (offset * 4)))
|
||||||
|
|
|
@ -591,11 +591,11 @@ void __init bmips_cpu_setup(void)
|
||||||
|
|
||||||
/* Flush and enable RAC */
|
/* Flush and enable RAC */
|
||||||
cfg = __raw_readl(cbr + BMIPS_RAC_CONFIG);
|
cfg = __raw_readl(cbr + BMIPS_RAC_CONFIG);
|
||||||
__raw_writel(cfg | 0x100, BMIPS_RAC_CONFIG);
|
__raw_writel(cfg | 0x100, cbr + BMIPS_RAC_CONFIG);
|
||||||
__raw_readl(cbr + BMIPS_RAC_CONFIG);
|
__raw_readl(cbr + BMIPS_RAC_CONFIG);
|
||||||
|
|
||||||
cfg = __raw_readl(cbr + BMIPS_RAC_CONFIG);
|
cfg = __raw_readl(cbr + BMIPS_RAC_CONFIG);
|
||||||
__raw_writel(cfg | 0xf, BMIPS_RAC_CONFIG);
|
__raw_writel(cfg | 0xf, cbr + BMIPS_RAC_CONFIG);
|
||||||
__raw_readl(cbr + BMIPS_RAC_CONFIG);
|
__raw_readl(cbr + BMIPS_RAC_CONFIG);
|
||||||
|
|
||||||
cfg = __raw_readl(cbr + BMIPS_RAC_ADDRESS_RANGE);
|
cfg = __raw_readl(cbr + BMIPS_RAC_ADDRESS_RANGE);
|
||||||
|
|
|
@ -646,6 +646,16 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu,
|
||||||
hnow_v = hpte_new_to_old_v(hnow_v, hnow_r);
|
hnow_v = hpte_new_to_old_v(hnow_v, hnow_r);
|
||||||
hnow_r = hpte_new_to_old_r(hnow_r);
|
hnow_r = hpte_new_to_old_r(hnow_r);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If the HPT is being resized, don't update the HPTE,
|
||||||
|
* instead let the guest retry after the resize operation is complete.
|
||||||
|
* The synchronization for hpte_setup_done test vs. set is provided
|
||||||
|
* by the HPTE lock.
|
||||||
|
*/
|
||||||
|
if (!kvm->arch.hpte_setup_done)
|
||||||
|
goto out_unlock;
|
||||||
|
|
||||||
if ((hnow_v & ~HPTE_V_HVLOCK) != hpte[0] || hnow_r != hpte[1] ||
|
if ((hnow_v & ~HPTE_V_HVLOCK) != hpte[0] || hnow_r != hpte[1] ||
|
||||||
rev->guest_rpte != hpte[2])
|
rev->guest_rpte != hpte[2])
|
||||||
/* HPTE has been changed under us; let the guest retry */
|
/* HPTE has been changed under us; let the guest retry */
|
||||||
|
|
|
@ -2705,11 +2705,14 @@ static noinline void kvmppc_run_core(struct kvmppc_vcore *vc)
|
||||||
* Hard-disable interrupts, and check resched flag and signals.
|
* Hard-disable interrupts, and check resched flag and signals.
|
||||||
* If we need to reschedule or deliver a signal, clean up
|
* If we need to reschedule or deliver a signal, clean up
|
||||||
* and return without going into the guest(s).
|
* and return without going into the guest(s).
|
||||||
|
* If the hpte_setup_done flag has been cleared, don't go into the
|
||||||
|
* guest because that means a HPT resize operation is in progress.
|
||||||
*/
|
*/
|
||||||
local_irq_disable();
|
local_irq_disable();
|
||||||
hard_irq_disable();
|
hard_irq_disable();
|
||||||
if (lazy_irq_pending() || need_resched() ||
|
if (lazy_irq_pending() || need_resched() ||
|
||||||
recheck_signals(&core_info)) {
|
recheck_signals(&core_info) ||
|
||||||
|
(!kvm_is_radix(vc->kvm) && !vc->kvm->arch.hpte_setup_done)) {
|
||||||
local_irq_enable();
|
local_irq_enable();
|
||||||
vc->vcore_state = VCORE_INACTIVE;
|
vc->vcore_state = VCORE_INACTIVE;
|
||||||
/* Unlock all except the primary vcore */
|
/* Unlock all except the primary vcore */
|
||||||
|
@ -3078,7 +3081,7 @@ out:
|
||||||
|
|
||||||
static int kvmppc_run_vcpu(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu)
|
static int kvmppc_run_vcpu(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
int n_ceded, i;
|
int n_ceded, i, r;
|
||||||
struct kvmppc_vcore *vc;
|
struct kvmppc_vcore *vc;
|
||||||
struct kvm_vcpu *v;
|
struct kvm_vcpu *v;
|
||||||
|
|
||||||
|
@ -3132,6 +3135,20 @@ static int kvmppc_run_vcpu(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu)
|
||||||
|
|
||||||
while (vcpu->arch.state == KVMPPC_VCPU_RUNNABLE &&
|
while (vcpu->arch.state == KVMPPC_VCPU_RUNNABLE &&
|
||||||
!signal_pending(current)) {
|
!signal_pending(current)) {
|
||||||
|
/* See if the HPT and VRMA are ready to go */
|
||||||
|
if (!kvm_is_radix(vcpu->kvm) &&
|
||||||
|
!vcpu->kvm->arch.hpte_setup_done) {
|
||||||
|
spin_unlock(&vc->lock);
|
||||||
|
r = kvmppc_hv_setup_htab_rma(vcpu);
|
||||||
|
spin_lock(&vc->lock);
|
||||||
|
if (r) {
|
||||||
|
kvm_run->exit_reason = KVM_EXIT_FAIL_ENTRY;
|
||||||
|
kvm_run->fail_entry.hardware_entry_failure_reason = 0;
|
||||||
|
vcpu->arch.ret = r;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (vc->vcore_state == VCORE_PREEMPT && vc->runner == NULL)
|
if (vc->vcore_state == VCORE_PREEMPT && vc->runner == NULL)
|
||||||
kvmppc_vcore_end_preempt(vc);
|
kvmppc_vcore_end_preempt(vc);
|
||||||
|
|
||||||
|
@ -3249,13 +3266,6 @@ static int kvmppc_vcpu_run_hv(struct kvm_run *run, struct kvm_vcpu *vcpu)
|
||||||
/* Order vcpus_running vs. hpte_setup_done, see kvmppc_alloc_reset_hpt */
|
/* Order vcpus_running vs. hpte_setup_done, see kvmppc_alloc_reset_hpt */
|
||||||
smp_mb();
|
smp_mb();
|
||||||
|
|
||||||
/* On the first time here, set up HTAB and VRMA */
|
|
||||||
if (!kvm_is_radix(vcpu->kvm) && !vcpu->kvm->arch.hpte_setup_done) {
|
|
||||||
r = kvmppc_hv_setup_htab_rma(vcpu);
|
|
||||||
if (r)
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
flush_all_to_thread(current);
|
flush_all_to_thread(current);
|
||||||
|
|
||||||
/* Save userspace EBB and other register values */
|
/* Save userspace EBB and other register values */
|
||||||
|
@ -3303,7 +3313,6 @@ static int kvmppc_vcpu_run_hv(struct kvm_run *run, struct kvm_vcpu *vcpu)
|
||||||
}
|
}
|
||||||
mtspr(SPRN_VRSAVE, user_vrsave);
|
mtspr(SPRN_VRSAVE, user_vrsave);
|
||||||
|
|
||||||
out:
|
|
||||||
vcpu->arch.state = KVMPPC_VCPU_NOTREADY;
|
vcpu->arch.state = KVMPPC_VCPU_NOTREADY;
|
||||||
atomic_dec(&vcpu->kvm->arch.vcpus_running);
|
atomic_dec(&vcpu->kvm->arch.vcpus_running);
|
||||||
return r;
|
return r;
|
||||||
|
|
|
@ -22,7 +22,7 @@ obj-y += common.o
|
||||||
obj-y += rdrand.o
|
obj-y += rdrand.o
|
||||||
obj-y += match.o
|
obj-y += match.o
|
||||||
obj-y += bugs.o
|
obj-y += bugs.o
|
||||||
obj-y += aperfmperf.o
|
obj-$(CONFIG_CPU_FREQ) += aperfmperf.o
|
||||||
|
|
||||||
obj-$(CONFIG_PROC_FS) += proc.o
|
obj-$(CONFIG_PROC_FS) += proc.o
|
||||||
obj-$(CONFIG_X86_FEATURE_NAMES) += capflags.o powerflags.o
|
obj-$(CONFIG_X86_FEATURE_NAMES) += capflags.o powerflags.o
|
||||||
|
|
|
@ -42,6 +42,10 @@ static void aperfmperf_snapshot_khz(void *dummy)
|
||||||
s64 time_delta = ktime_ms_delta(now, s->time);
|
s64 time_delta = ktime_ms_delta(now, s->time);
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
|
/* Don't bother re-computing within the cache threshold time. */
|
||||||
|
if (time_delta < APERFMPERF_CACHE_THRESHOLD_MS)
|
||||||
|
return;
|
||||||
|
|
||||||
local_irq_save(flags);
|
local_irq_save(flags);
|
||||||
rdmsrl(MSR_IA32_APERF, aperf);
|
rdmsrl(MSR_IA32_APERF, aperf);
|
||||||
rdmsrl(MSR_IA32_MPERF, mperf);
|
rdmsrl(MSR_IA32_MPERF, mperf);
|
||||||
|
@ -70,7 +74,6 @@ static void aperfmperf_snapshot_khz(void *dummy)
|
||||||
|
|
||||||
unsigned int arch_freq_get_on_cpu(int cpu)
|
unsigned int arch_freq_get_on_cpu(int cpu)
|
||||||
{
|
{
|
||||||
s64 time_delta;
|
|
||||||
unsigned int khz;
|
unsigned int khz;
|
||||||
|
|
||||||
if (!cpu_khz)
|
if (!cpu_khz)
|
||||||
|
@ -79,12 +82,6 @@ unsigned int arch_freq_get_on_cpu(int cpu)
|
||||||
if (!static_cpu_has(X86_FEATURE_APERFMPERF))
|
if (!static_cpu_has(X86_FEATURE_APERFMPERF))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* Don't bother re-computing within the cache threshold time. */
|
|
||||||
time_delta = ktime_ms_delta(ktime_get(), per_cpu(samples.time, cpu));
|
|
||||||
khz = per_cpu(samples.khz, cpu);
|
|
||||||
if (khz && time_delta < APERFMPERF_CACHE_THRESHOLD_MS)
|
|
||||||
return khz;
|
|
||||||
|
|
||||||
smp_call_function_single(cpu, aperfmperf_snapshot_khz, NULL, 1);
|
smp_call_function_single(cpu, aperfmperf_snapshot_khz, NULL, 1);
|
||||||
khz = per_cpu(samples.khz, cpu);
|
khz = per_cpu(samples.khz, cpu);
|
||||||
if (khz)
|
if (khz)
|
||||||
|
|
|
@ -78,10 +78,8 @@ static int show_cpuinfo(struct seq_file *m, void *v)
|
||||||
seq_printf(m, "microcode\t: 0x%x\n", c->microcode);
|
seq_printf(m, "microcode\t: 0x%x\n", c->microcode);
|
||||||
|
|
||||||
if (cpu_has(c, X86_FEATURE_TSC)) {
|
if (cpu_has(c, X86_FEATURE_TSC)) {
|
||||||
unsigned int freq = arch_freq_get_on_cpu(cpu);
|
unsigned int freq = cpufreq_quick_get(cpu);
|
||||||
|
|
||||||
if (!freq)
|
|
||||||
freq = cpufreq_quick_get(cpu);
|
|
||||||
if (!freq)
|
if (!freq)
|
||||||
freq = cpu_khz;
|
freq = cpu_khz;
|
||||||
seq_printf(m, "cpu MHz\t\t: %u.%03u\n",
|
seq_printf(m, "cpu MHz\t\t: %u.%03u\n",
|
||||||
|
|
|
@ -2692,7 +2692,7 @@ static int rbd_img_obj_parent_read_full(struct rbd_obj_request *obj_request)
|
||||||
* from the parent.
|
* from the parent.
|
||||||
*/
|
*/
|
||||||
page_count = (u32)calc_pages_for(0, length);
|
page_count = (u32)calc_pages_for(0, length);
|
||||||
pages = ceph_alloc_page_vector(page_count, GFP_KERNEL);
|
pages = ceph_alloc_page_vector(page_count, GFP_NOIO);
|
||||||
if (IS_ERR(pages)) {
|
if (IS_ERR(pages)) {
|
||||||
result = PTR_ERR(pages);
|
result = PTR_ERR(pages);
|
||||||
pages = NULL;
|
pages = NULL;
|
||||||
|
@ -2827,7 +2827,7 @@ static int rbd_img_obj_exists_submit(struct rbd_obj_request *obj_request)
|
||||||
*/
|
*/
|
||||||
size = sizeof (__le64) + sizeof (__le32) + sizeof (__le32);
|
size = sizeof (__le64) + sizeof (__le32) + sizeof (__le32);
|
||||||
page_count = (u32)calc_pages_for(0, size);
|
page_count = (u32)calc_pages_for(0, size);
|
||||||
pages = ceph_alloc_page_vector(page_count, GFP_KERNEL);
|
pages = ceph_alloc_page_vector(page_count, GFP_NOIO);
|
||||||
if (IS_ERR(pages)) {
|
if (IS_ERR(pages)) {
|
||||||
ret = PTR_ERR(pages);
|
ret = PTR_ERR(pages);
|
||||||
goto fail_stat_request;
|
goto fail_stat_request;
|
||||||
|
|
|
@ -2094,6 +2094,11 @@ get_fence_array(struct drm_i915_gem_execbuffer2 *args,
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (fence.flags & __I915_EXEC_FENCE_UNKNOWN_FLAGS) {
|
||||||
|
err = -EINVAL;
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
syncobj = drm_syncobj_find(file, fence.handle);
|
syncobj = drm_syncobj_find(file, fence.handle);
|
||||||
if (!syncobj) {
|
if (!syncobj) {
|
||||||
DRM_DEBUG("Invalid syncobj handle provided\n");
|
DRM_DEBUG("Invalid syncobj handle provided\n");
|
||||||
|
@ -2101,6 +2106,9 @@ get_fence_array(struct drm_i915_gem_execbuffer2 *args,
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BUILD_BUG_ON(~(ARCH_KMALLOC_MINALIGN - 1) &
|
||||||
|
~__I915_EXEC_FENCE_UNKNOWN_FLAGS);
|
||||||
|
|
||||||
fences[n] = ptr_pack_bits(syncobj, fence.flags, 2);
|
fences[n] = ptr_pack_bits(syncobj, fence.flags, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -832,10 +832,14 @@ static void gen8_ppgtt_clear_4lvl(struct i915_address_space *vm,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct sgt_dma {
|
static inline struct sgt_dma {
|
||||||
struct scatterlist *sg;
|
struct scatterlist *sg;
|
||||||
dma_addr_t dma, max;
|
dma_addr_t dma, max;
|
||||||
};
|
} sgt_dma(struct i915_vma *vma) {
|
||||||
|
struct scatterlist *sg = vma->pages->sgl;
|
||||||
|
dma_addr_t addr = sg_dma_address(sg);
|
||||||
|
return (struct sgt_dma) { sg, addr, addr + sg->length };
|
||||||
|
}
|
||||||
|
|
||||||
struct gen8_insert_pte {
|
struct gen8_insert_pte {
|
||||||
u16 pml4e;
|
u16 pml4e;
|
||||||
|
@ -916,11 +920,7 @@ static void gen8_ppgtt_insert_3lvl(struct i915_address_space *vm,
|
||||||
u32 unused)
|
u32 unused)
|
||||||
{
|
{
|
||||||
struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
|
struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
|
||||||
struct sgt_dma iter = {
|
struct sgt_dma iter = sgt_dma(vma);
|
||||||
.sg = vma->pages->sgl,
|
|
||||||
.dma = sg_dma_address(iter.sg),
|
|
||||||
.max = iter.dma + iter.sg->length,
|
|
||||||
};
|
|
||||||
struct gen8_insert_pte idx = gen8_insert_pte(vma->node.start);
|
struct gen8_insert_pte idx = gen8_insert_pte(vma->node.start);
|
||||||
|
|
||||||
gen8_ppgtt_insert_pte_entries(ppgtt, &ppgtt->pdp, &iter, &idx,
|
gen8_ppgtt_insert_pte_entries(ppgtt, &ppgtt->pdp, &iter, &idx,
|
||||||
|
@ -933,11 +933,7 @@ static void gen8_ppgtt_insert_4lvl(struct i915_address_space *vm,
|
||||||
u32 unused)
|
u32 unused)
|
||||||
{
|
{
|
||||||
struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
|
struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
|
||||||
struct sgt_dma iter = {
|
struct sgt_dma iter = sgt_dma(vma);
|
||||||
.sg = vma->pages->sgl,
|
|
||||||
.dma = sg_dma_address(iter.sg),
|
|
||||||
.max = iter.dma + iter.sg->length,
|
|
||||||
};
|
|
||||||
struct i915_page_directory_pointer **pdps = ppgtt->pml4.pdps;
|
struct i915_page_directory_pointer **pdps = ppgtt->pml4.pdps;
|
||||||
struct gen8_insert_pte idx = gen8_insert_pte(vma->node.start);
|
struct gen8_insert_pte idx = gen8_insert_pte(vma->node.start);
|
||||||
|
|
||||||
|
@ -1632,13 +1628,10 @@ static void gen6_ppgtt_insert_entries(struct i915_address_space *vm,
|
||||||
unsigned act_pt = first_entry / GEN6_PTES;
|
unsigned act_pt = first_entry / GEN6_PTES;
|
||||||
unsigned act_pte = first_entry % GEN6_PTES;
|
unsigned act_pte = first_entry % GEN6_PTES;
|
||||||
const u32 pte_encode = vm->pte_encode(0, cache_level, flags);
|
const u32 pte_encode = vm->pte_encode(0, cache_level, flags);
|
||||||
struct sgt_dma iter;
|
struct sgt_dma iter = sgt_dma(vma);
|
||||||
gen6_pte_t *vaddr;
|
gen6_pte_t *vaddr;
|
||||||
|
|
||||||
vaddr = kmap_atomic_px(ppgtt->pd.page_table[act_pt]);
|
vaddr = kmap_atomic_px(ppgtt->pd.page_table[act_pt]);
|
||||||
iter.sg = vma->pages->sgl;
|
|
||||||
iter.dma = sg_dma_address(iter.sg);
|
|
||||||
iter.max = iter.dma + iter.sg->length;
|
|
||||||
do {
|
do {
|
||||||
vaddr[act_pte] = pte_encode | GEN6_PTE_ADDR_ENCODE(iter.dma);
|
vaddr[act_pte] = pte_encode | GEN6_PTE_ADDR_ENCODE(iter.dma);
|
||||||
|
|
||||||
|
|
|
@ -721,7 +721,7 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
|
||||||
* allocation taken by fbdev
|
* allocation taken by fbdev
|
||||||
*/
|
*/
|
||||||
if (!(dev_priv->capabilities & SVGA_CAP_3D))
|
if (!(dev_priv->capabilities & SVGA_CAP_3D))
|
||||||
mem_size *= 2;
|
mem_size *= 3;
|
||||||
|
|
||||||
dev_priv->max_mob_pages = mem_size * 1024 / PAGE_SIZE;
|
dev_priv->max_mob_pages = mem_size * 1024 / PAGE_SIZE;
|
||||||
dev_priv->prim_bb_mem =
|
dev_priv->prim_bb_mem =
|
||||||
|
|
|
@ -224,7 +224,7 @@ out:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct dma_fence_ops vmw_fence_ops = {
|
static const struct dma_fence_ops vmw_fence_ops = {
|
||||||
.get_driver_name = vmw_fence_get_driver_name,
|
.get_driver_name = vmw_fence_get_driver_name,
|
||||||
.get_timeline_name = vmw_fence_get_timeline_name,
|
.get_timeline_name = vmw_fence_get_timeline_name,
|
||||||
.enable_signaling = vmw_fence_enable_signaling,
|
.enable_signaling = vmw_fence_enable_signaling,
|
||||||
|
|
|
@ -1258,6 +1258,7 @@ static const struct acpi_device_id elan_acpi_id[] = {
|
||||||
{ "ELAN0605", 0 },
|
{ "ELAN0605", 0 },
|
||||||
{ "ELAN0609", 0 },
|
{ "ELAN0609", 0 },
|
||||||
{ "ELAN060B", 0 },
|
{ "ELAN060B", 0 },
|
||||||
|
{ "ELAN060C", 0 },
|
||||||
{ "ELAN0611", 0 },
|
{ "ELAN0611", 0 },
|
||||||
{ "ELAN1000", 0 },
|
{ "ELAN1000", 0 },
|
||||||
{ }
|
{ }
|
||||||
|
|
|
@ -312,7 +312,7 @@ static int rmi_smb_probe(struct i2c_client *client,
|
||||||
rmi_smb->xport.dev = &client->dev;
|
rmi_smb->xport.dev = &client->dev;
|
||||||
rmi_smb->xport.pdata = *pdata;
|
rmi_smb->xport.pdata = *pdata;
|
||||||
rmi_smb->xport.pdata.irq = client->irq;
|
rmi_smb->xport.pdata.irq = client->irq;
|
||||||
rmi_smb->xport.proto_name = "smb2";
|
rmi_smb->xport.proto_name = "smb";
|
||||||
rmi_smb->xport.ops = &rmi_smb_ops;
|
rmi_smb->xport.ops = &rmi_smb_ops;
|
||||||
|
|
||||||
smbus_version = rmi_smb_get_version(rmi_smb);
|
smbus_version = rmi_smb_get_version(rmi_smb);
|
||||||
|
@ -322,7 +322,7 @@ static int rmi_smb_probe(struct i2c_client *client,
|
||||||
rmi_dbg(RMI_DEBUG_XPORT, &client->dev, "Smbus version is %d",
|
rmi_dbg(RMI_DEBUG_XPORT, &client->dev, "Smbus version is %d",
|
||||||
smbus_version);
|
smbus_version);
|
||||||
|
|
||||||
if (smbus_version != 2) {
|
if (smbus_version != 2 && smbus_version != 3) {
|
||||||
dev_err(&client->dev, "Unrecognized SMB version %d\n",
|
dev_err(&client->dev, "Unrecognized SMB version %d\n",
|
||||||
smbus_version);
|
smbus_version);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
|
@ -531,6 +531,7 @@ int tsc200x_probe(struct device *dev, int irq, const struct input_id *tsc_id,
|
||||||
|
|
||||||
input_set_drvdata(input_dev, ts);
|
input_set_drvdata(input_dev, ts);
|
||||||
|
|
||||||
|
__set_bit(INPUT_PROP_DIRECT, input_dev->propbit);
|
||||||
input_set_capability(input_dev, EV_KEY, BTN_TOUCH);
|
input_set_capability(input_dev, EV_KEY, BTN_TOUCH);
|
||||||
|
|
||||||
input_set_abs_params(input_dev, ABS_X,
|
input_set_abs_params(input_dev, ABS_X,
|
||||||
|
|
|
@ -178,7 +178,6 @@ static int c_can_pci_probe(struct pci_dev *pdev,
|
||||||
break;
|
break;
|
||||||
case BOSCH_D_CAN:
|
case BOSCH_D_CAN:
|
||||||
priv->regs = reg_map_d_can;
|
priv->regs = reg_map_d_can;
|
||||||
priv->can.ctrlmode_supported |= CAN_CTRLMODE_3_SAMPLES;
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
|
|
|
@ -320,7 +320,6 @@ static int c_can_plat_probe(struct platform_device *pdev)
|
||||||
break;
|
break;
|
||||||
case BOSCH_D_CAN:
|
case BOSCH_D_CAN:
|
||||||
priv->regs = reg_map_d_can;
|
priv->regs = reg_map_d_can;
|
||||||
priv->can.ctrlmode_supported |= CAN_CTRLMODE_3_SAMPLES;
|
|
||||||
priv->read_reg = c_can_plat_read_reg_aligned_to_16bit;
|
priv->read_reg = c_can_plat_read_reg_aligned_to_16bit;
|
||||||
priv->write_reg = c_can_plat_write_reg_aligned_to_16bit;
|
priv->write_reg = c_can_plat_write_reg_aligned_to_16bit;
|
||||||
priv->read_reg32 = d_can_plat_read_reg32;
|
priv->read_reg32 = d_can_plat_read_reg32;
|
||||||
|
|
|
@ -670,9 +670,9 @@ static void ifi_canfd_set_bittiming(struct net_device *ndev)
|
||||||
priv->base + IFI_CANFD_FTIME);
|
priv->base + IFI_CANFD_FTIME);
|
||||||
|
|
||||||
/* Configure transmitter delay */
|
/* Configure transmitter delay */
|
||||||
tdc = (dbt->brp * (dbt->phase_seg1 + 1)) & IFI_CANFD_TDELAY_MASK;
|
tdc = dbt->brp * (dbt->prop_seg + dbt->phase_seg1);
|
||||||
writel(IFI_CANFD_TDELAY_EN | IFI_CANFD_TDELAY_ABS | tdc,
|
tdc &= IFI_CANFD_TDELAY_MASK;
|
||||||
priv->base + IFI_CANFD_TDELAY);
|
writel(IFI_CANFD_TDELAY_EN | tdc, priv->base + IFI_CANFD_TDELAY);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ifi_canfd_set_filter(struct net_device *ndev, const u32 id,
|
static void ifi_canfd_set_filter(struct net_device *ndev, const u32 id,
|
||||||
|
|
|
@ -29,14 +29,19 @@
|
||||||
#include "peak_canfd_user.h"
|
#include "peak_canfd_user.h"
|
||||||
|
|
||||||
MODULE_AUTHOR("Stephane Grosjean <s.grosjean@peak-system.com>");
|
MODULE_AUTHOR("Stephane Grosjean <s.grosjean@peak-system.com>");
|
||||||
MODULE_DESCRIPTION("Socket-CAN driver for PEAK PCAN PCIe FD family cards");
|
MODULE_DESCRIPTION("Socket-CAN driver for PEAK PCAN PCIe/M.2 FD family cards");
|
||||||
MODULE_SUPPORTED_DEVICE("PEAK PCAN PCIe FD CAN cards");
|
MODULE_SUPPORTED_DEVICE("PEAK PCAN PCIe/M.2 FD CAN cards");
|
||||||
MODULE_LICENSE("GPL v2");
|
MODULE_LICENSE("GPL v2");
|
||||||
|
|
||||||
#define PCIEFD_DRV_NAME "peak_pciefd"
|
#define PCIEFD_DRV_NAME "peak_pciefd"
|
||||||
|
|
||||||
#define PEAK_PCI_VENDOR_ID 0x001c /* The PCI device and vendor IDs */
|
#define PEAK_PCI_VENDOR_ID 0x001c /* The PCI device and vendor IDs */
|
||||||
#define PEAK_PCIEFD_ID 0x0013 /* for PCIe slot cards */
|
#define PEAK_PCIEFD_ID 0x0013 /* for PCIe slot cards */
|
||||||
|
#define PCAN_CPCIEFD_ID 0x0014 /* for Compact-PCI Serial slot cards */
|
||||||
|
#define PCAN_PCIE104FD_ID 0x0017 /* for PCIe-104 Express slot cards */
|
||||||
|
#define PCAN_MINIPCIEFD_ID 0x0018 /* for mini-PCIe slot cards */
|
||||||
|
#define PCAN_PCIEFD_OEM_ID 0x0019 /* for PCIe slot OEM cards */
|
||||||
|
#define PCAN_M2_ID 0x001a /* for M2 slot cards */
|
||||||
|
|
||||||
/* PEAK PCIe board access description */
|
/* PEAK PCIe board access description */
|
||||||
#define PCIEFD_BAR0_SIZE (64 * 1024)
|
#define PCIEFD_BAR0_SIZE (64 * 1024)
|
||||||
|
@ -203,6 +208,11 @@ struct pciefd_board {
|
||||||
/* supported device ids. */
|
/* supported device ids. */
|
||||||
static const struct pci_device_id peak_pciefd_tbl[] = {
|
static const struct pci_device_id peak_pciefd_tbl[] = {
|
||||||
{PEAK_PCI_VENDOR_ID, PEAK_PCIEFD_ID, PCI_ANY_ID, PCI_ANY_ID,},
|
{PEAK_PCI_VENDOR_ID, PEAK_PCIEFD_ID, PCI_ANY_ID, PCI_ANY_ID,},
|
||||||
|
{PEAK_PCI_VENDOR_ID, PCAN_CPCIEFD_ID, PCI_ANY_ID, PCI_ANY_ID,},
|
||||||
|
{PEAK_PCI_VENDOR_ID, PCAN_PCIE104FD_ID, PCI_ANY_ID, PCI_ANY_ID,},
|
||||||
|
{PEAK_PCI_VENDOR_ID, PCAN_MINIPCIEFD_ID, PCI_ANY_ID, PCI_ANY_ID,},
|
||||||
|
{PEAK_PCI_VENDOR_ID, PCAN_PCIEFD_OEM_ID, PCI_ANY_ID, PCI_ANY_ID,},
|
||||||
|
{PEAK_PCI_VENDOR_ID, PCAN_M2_ID, PCI_ANY_ID, PCI_ANY_ID,},
|
||||||
{0,}
|
{0,}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -539,6 +539,13 @@ static int sun4i_can_err(struct net_device *dev, u8 isrc, u8 status)
|
||||||
}
|
}
|
||||||
stats->rx_over_errors++;
|
stats->rx_over_errors++;
|
||||||
stats->rx_errors++;
|
stats->rx_errors++;
|
||||||
|
|
||||||
|
/* reset the CAN IP by entering reset mode
|
||||||
|
* ignoring timeout error
|
||||||
|
*/
|
||||||
|
set_reset_mode(dev);
|
||||||
|
set_normal_mode(dev);
|
||||||
|
|
||||||
/* clear bit */
|
/* clear bit */
|
||||||
sun4i_can_write_cmdreg(priv, SUN4I_CMD_CLEAR_OR_FLAG);
|
sun4i_can_write_cmdreg(priv, SUN4I_CMD_CLEAR_OR_FLAG);
|
||||||
}
|
}
|
||||||
|
@ -653,8 +660,9 @@ static irqreturn_t sun4i_can_interrupt(int irq, void *dev_id)
|
||||||
netif_wake_queue(dev);
|
netif_wake_queue(dev);
|
||||||
can_led_event(dev, CAN_LED_EVENT_TX);
|
can_led_event(dev, CAN_LED_EVENT_TX);
|
||||||
}
|
}
|
||||||
if (isrc & SUN4I_INT_RBUF_VLD) {
|
if ((isrc & SUN4I_INT_RBUF_VLD) &&
|
||||||
/* receive interrupt */
|
!(isrc & SUN4I_INT_DATA_OR)) {
|
||||||
|
/* receive interrupt - don't read if overrun occurred */
|
||||||
while (status & SUN4I_STA_RBUF_RDY) {
|
while (status & SUN4I_STA_RBUF_RDY) {
|
||||||
/* RX buffer is not empty */
|
/* RX buffer is not empty */
|
||||||
sun4i_can_rx(dev);
|
sun4i_can_rx(dev);
|
||||||
|
|
|
@ -93,7 +93,7 @@ static void delayed_event_release(struct mlx5_device_context *dev_ctx,
|
||||||
list_splice_init(&priv->waiting_events_list, &temp);
|
list_splice_init(&priv->waiting_events_list, &temp);
|
||||||
if (!dev_ctx->context)
|
if (!dev_ctx->context)
|
||||||
goto out;
|
goto out;
|
||||||
list_for_each_entry_safe(de, n, &priv->waiting_events_list, list)
|
list_for_each_entry_safe(de, n, &temp, list)
|
||||||
dev_ctx->intf->event(dev, dev_ctx->context, de->event, de->param);
|
dev_ctx->intf->event(dev, dev_ctx->context, de->event, de->param);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|
|
@ -68,7 +68,7 @@
|
||||||
#define MLX5E_PARAMS_DEFAULT_LOG_RQ_SIZE 0xa
|
#define MLX5E_PARAMS_DEFAULT_LOG_RQ_SIZE 0xa
|
||||||
#define MLX5E_PARAMS_MAXIMUM_LOG_RQ_SIZE 0xd
|
#define MLX5E_PARAMS_MAXIMUM_LOG_RQ_SIZE 0xd
|
||||||
|
|
||||||
#define MLX5E_PARAMS_MINIMUM_LOG_RQ_SIZE_MPW 0x1
|
#define MLX5E_PARAMS_MINIMUM_LOG_RQ_SIZE_MPW 0x2
|
||||||
#define MLX5E_PARAMS_DEFAULT_LOG_RQ_SIZE_MPW 0x3
|
#define MLX5E_PARAMS_DEFAULT_LOG_RQ_SIZE_MPW 0x3
|
||||||
#define MLX5E_PARAMS_MAXIMUM_LOG_RQ_SIZE_MPW 0x6
|
#define MLX5E_PARAMS_MAXIMUM_LOG_RQ_SIZE_MPW 0x6
|
||||||
|
|
||||||
|
|
|
@ -216,22 +216,20 @@ static inline bool mlx5e_rx_cache_get(struct mlx5e_rq *rq,
|
||||||
static inline int mlx5e_page_alloc_mapped(struct mlx5e_rq *rq,
|
static inline int mlx5e_page_alloc_mapped(struct mlx5e_rq *rq,
|
||||||
struct mlx5e_dma_info *dma_info)
|
struct mlx5e_dma_info *dma_info)
|
||||||
{
|
{
|
||||||
struct page *page;
|
|
||||||
|
|
||||||
if (mlx5e_rx_cache_get(rq, dma_info))
|
if (mlx5e_rx_cache_get(rq, dma_info))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
page = dev_alloc_pages(rq->buff.page_order);
|
dma_info->page = dev_alloc_pages(rq->buff.page_order);
|
||||||
if (unlikely(!page))
|
if (unlikely(!dma_info->page))
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
dma_info->addr = dma_map_page(rq->pdev, page, 0,
|
dma_info->addr = dma_map_page(rq->pdev, dma_info->page, 0,
|
||||||
RQ_PAGE_SIZE(rq), rq->buff.map_dir);
|
RQ_PAGE_SIZE(rq), rq->buff.map_dir);
|
||||||
if (unlikely(dma_mapping_error(rq->pdev, dma_info->addr))) {
|
if (unlikely(dma_mapping_error(rq->pdev, dma_info->addr))) {
|
||||||
put_page(page);
|
put_page(dma_info->page);
|
||||||
|
dma_info->page = NULL;
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
dma_info->page = page;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,7 +49,7 @@ int mlx5e_napi_poll(struct napi_struct *napi, int budget)
|
||||||
struct mlx5e_channel *c = container_of(napi, struct mlx5e_channel,
|
struct mlx5e_channel *c = container_of(napi, struct mlx5e_channel,
|
||||||
napi);
|
napi);
|
||||||
bool busy = false;
|
bool busy = false;
|
||||||
int work_done;
|
int work_done = 0;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < c->num_tc; i++)
|
for (i = 0; i < c->num_tc; i++)
|
||||||
|
@ -58,15 +58,17 @@ int mlx5e_napi_poll(struct napi_struct *napi, int budget)
|
||||||
if (c->xdp)
|
if (c->xdp)
|
||||||
busy |= mlx5e_poll_xdpsq_cq(&c->rq.xdpsq.cq);
|
busy |= mlx5e_poll_xdpsq_cq(&c->rq.xdpsq.cq);
|
||||||
|
|
||||||
|
if (likely(budget)) { /* budget=0 means: don't poll rx rings */
|
||||||
work_done = mlx5e_poll_rx_cq(&c->rq.cq, budget);
|
work_done = mlx5e_poll_rx_cq(&c->rq.cq, budget);
|
||||||
busy |= work_done == budget;
|
busy |= work_done == budget;
|
||||||
|
}
|
||||||
|
|
||||||
busy |= c->rq.post_wqes(&c->rq);
|
busy |= c->rq.post_wqes(&c->rq);
|
||||||
|
|
||||||
if (busy) {
|
if (busy) {
|
||||||
if (likely(mlx5e_channel_no_affinity_change(c)))
|
if (likely(mlx5e_channel_no_affinity_change(c)))
|
||||||
return budget;
|
return budget;
|
||||||
if (work_done == budget)
|
if (budget && work_done == budget)
|
||||||
work_done--;
|
work_done--;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1486,9 +1486,16 @@ static int mlx5_try_fast_unload(struct mlx5_core_dev *dev)
|
||||||
return -EAGAIN;
|
return -EAGAIN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Panic tear down fw command will stop the PCI bus communication
|
||||||
|
* with the HCA, so the health polll is no longer needed.
|
||||||
|
*/
|
||||||
|
mlx5_drain_health_wq(dev);
|
||||||
|
mlx5_stop_health_poll(dev);
|
||||||
|
|
||||||
ret = mlx5_cmd_force_teardown_hca(dev);
|
ret = mlx5_cmd_force_teardown_hca(dev);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
mlx5_core_dbg(dev, "Firmware couldn't do fast unload error: %d\n", ret);
|
mlx5_core_dbg(dev, "Firmware couldn't do fast unload error: %d\n", ret);
|
||||||
|
mlx5_start_health_poll(dev);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -213,6 +213,11 @@ static inline struct ctl_table_header *register_sysctl_paths(
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline struct ctl_table_header *register_sysctl(const char *path, struct ctl_table *table)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static inline void unregister_sysctl_table(struct ctl_table_header * table)
|
static inline void unregister_sysctl_table(struct ctl_table_header * table)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
|
@ -829,6 +829,7 @@ struct drm_i915_gem_exec_fence {
|
||||||
|
|
||||||
#define I915_EXEC_FENCE_WAIT (1<<0)
|
#define I915_EXEC_FENCE_WAIT (1<<0)
|
||||||
#define I915_EXEC_FENCE_SIGNAL (1<<1)
|
#define I915_EXEC_FENCE_SIGNAL (1<<1)
|
||||||
|
#define __I915_EXEC_FENCE_UNKNOWN_FLAGS (-(I915_EXEC_FENCE_SIGNAL << 1))
|
||||||
__u32 flags;
|
__u32 flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -379,6 +379,9 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event,
|
||||||
dev->name);
|
dev->name);
|
||||||
vlan_vid_add(dev, htons(ETH_P_8021Q), 0);
|
vlan_vid_add(dev, htons(ETH_P_8021Q), 0);
|
||||||
}
|
}
|
||||||
|
if (event == NETDEV_DOWN &&
|
||||||
|
(dev->features & NETIF_F_HW_VLAN_CTAG_FILTER))
|
||||||
|
vlan_vid_del(dev, htons(ETH_P_8021Q), 0);
|
||||||
|
|
||||||
vlan_info = rtnl_dereference(dev->vlan_info);
|
vlan_info = rtnl_dereference(dev->vlan_info);
|
||||||
if (!vlan_info)
|
if (!vlan_info)
|
||||||
|
@ -426,9 +429,6 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event,
|
||||||
struct net_device *tmp;
|
struct net_device *tmp;
|
||||||
LIST_HEAD(close_list);
|
LIST_HEAD(close_list);
|
||||||
|
|
||||||
if (dev->features & NETIF_F_HW_VLAN_CTAG_FILTER)
|
|
||||||
vlan_vid_del(dev, htons(ETH_P_8021Q), 0);
|
|
||||||
|
|
||||||
/* Put all VLANs for this dev in the down state too. */
|
/* Put all VLANs for this dev in the down state too. */
|
||||||
vlan_group_for_each_dev(grp, i, vlandev) {
|
vlan_group_for_each_dev(grp, i, vlandev) {
|
||||||
flgs = vlandev->flags;
|
flgs = vlandev->flags;
|
||||||
|
|
|
@ -133,6 +133,8 @@ static int dsa_switch_mdb_add(struct dsa_switch *ds,
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
for_each_set_bit(port, group, ds->num_ports)
|
for_each_set_bit(port, group, ds->num_ports)
|
||||||
|
@ -180,6 +182,8 @@ static int dsa_switch_vlan_add(struct dsa_switch *ds,
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
for_each_set_bit(port, members, ds->num_ports)
|
for_each_set_bit(port, members, ds->num_ports)
|
||||||
|
|
|
@ -2554,7 +2554,6 @@ void tcp_simple_retransmit(struct sock *sk)
|
||||||
struct tcp_sock *tp = tcp_sk(sk);
|
struct tcp_sock *tp = tcp_sk(sk);
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
unsigned int mss = tcp_current_mss(sk);
|
unsigned int mss = tcp_current_mss(sk);
|
||||||
u32 prior_lost = tp->lost_out;
|
|
||||||
|
|
||||||
skb_rbtree_walk(skb, &sk->tcp_rtx_queue) {
|
skb_rbtree_walk(skb, &sk->tcp_rtx_queue) {
|
||||||
if (tcp_skb_seglen(skb) > mss &&
|
if (tcp_skb_seglen(skb) > mss &&
|
||||||
|
@ -2569,7 +2568,7 @@ void tcp_simple_retransmit(struct sock *sk)
|
||||||
|
|
||||||
tcp_clear_retrans_hints_partial(tp);
|
tcp_clear_retrans_hints_partial(tp);
|
||||||
|
|
||||||
if (prior_lost == tp->lost_out)
|
if (!tp->lost_out)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (tcp_is_reno(tp))
|
if (tcp_is_reno(tp))
|
||||||
|
|
|
@ -149,11 +149,19 @@ struct sk_buff *tcp_gso_segment(struct sk_buff *skb,
|
||||||
* is freed by GSO engine
|
* is freed by GSO engine
|
||||||
*/
|
*/
|
||||||
if (copy_destructor) {
|
if (copy_destructor) {
|
||||||
|
int delta;
|
||||||
|
|
||||||
swap(gso_skb->sk, skb->sk);
|
swap(gso_skb->sk, skb->sk);
|
||||||
swap(gso_skb->destructor, skb->destructor);
|
swap(gso_skb->destructor, skb->destructor);
|
||||||
sum_truesize += skb->truesize;
|
sum_truesize += skb->truesize;
|
||||||
refcount_add(sum_truesize - gso_skb->truesize,
|
delta = sum_truesize - gso_skb->truesize;
|
||||||
&skb->sk->sk_wmem_alloc);
|
/* In some pathological cases, delta can be negative.
|
||||||
|
* We need to either use refcount_add() or refcount_sub_and_test()
|
||||||
|
*/
|
||||||
|
if (likely(delta >= 0))
|
||||||
|
refcount_add(delta, &skb->sk->sk_wmem_alloc);
|
||||||
|
else
|
||||||
|
WARN_ON_ONCE(refcount_sub_and_test(-delta, &skb->sk->sk_wmem_alloc));
|
||||||
}
|
}
|
||||||
|
|
||||||
delta = htonl(oldlen + (skb_tail_pointer(skb) -
|
delta = htonl(oldlen + (skb_tail_pointer(skb) -
|
||||||
|
|
|
@ -410,14 +410,14 @@ void rds_ib_recv_refill(struct rds_connection *conn, int prefill, gfp_t gfp)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* XXX when can this fail? */
|
rdsdebug("recv %p ibinc %p page %p addr %lu\n", recv,
|
||||||
ret = ib_post_recv(ic->i_cm_id->qp, &recv->r_wr, &failed_wr);
|
|
||||||
rdsdebug("recv %p ibinc %p page %p addr %lu ret %d\n", recv,
|
|
||||||
recv->r_ibinc, sg_page(&recv->r_frag->f_sg),
|
recv->r_ibinc, sg_page(&recv->r_frag->f_sg),
|
||||||
(long) ib_sg_dma_address(
|
(long) ib_sg_dma_address(
|
||||||
ic->i_cm_id->device,
|
ic->i_cm_id->device,
|
||||||
&recv->r_frag->f_sg),
|
&recv->r_frag->f_sg));
|
||||||
ret);
|
|
||||||
|
/* XXX when can this fail? */
|
||||||
|
ret = ib_post_recv(ic->i_cm_id->qp, &recv->r_wr, &failed_wr);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
rds_ib_conn_error(conn, "recv post on "
|
rds_ib_conn_error(conn, "recv post on "
|
||||||
"%pI4 returned %d, disconnecting and "
|
"%pI4 returned %d, disconnecting and "
|
||||||
|
|
Loading…
Add table
Reference in a new issue