mirror of
git://git.yoctoproject.org/linux-yocto.git
synced 2025-07-17 02:59:58 +02:00
Merge branch 'v5.13/standard/base' into v5.13/standard/preempt-rt/base
This commit is contained in:
commit
2014ed9cd5
11
Makefile
11
Makefile
|
@ -1,7 +1,7 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 5
|
||||
PATCHLEVEL = 13
|
||||
SUBLEVEL = 9
|
||||
SUBLEVEL = 10
|
||||
EXTRAVERSION =
|
||||
NAME = Opossums on Parade
|
||||
|
||||
|
@ -1366,6 +1366,15 @@ scripts_unifdef: scripts_basic
|
|||
$(Q)$(MAKE) $(build)=scripts scripts/unifdef
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Install
|
||||
|
||||
# Many distributions have the custom install script, /sbin/installkernel.
|
||||
# If DKMS is installed, 'make install' will eventually recuses back
|
||||
# to the this Makefile to build and install external modules.
|
||||
# Cancel sub_make_done so that options such as M=, V=, etc. are parsed.
|
||||
|
||||
install: sub_make_done :=
|
||||
|
||||
# Kernel selftest
|
||||
|
||||
PHONY += kselftest
|
||||
|
|
|
@ -582,7 +582,7 @@ void
|
|||
smp_send_stop(void)
|
||||
{
|
||||
cpumask_t to_whom;
|
||||
cpumask_copy(&to_whom, cpu_possible_mask);
|
||||
cpumask_copy(&to_whom, cpu_online_mask);
|
||||
cpumask_clear_cpu(smp_processor_id(), &to_whom);
|
||||
#ifdef DEBUG_IPI_MSG
|
||||
if (hard_smp_processor_id() != boot_cpu_id)
|
||||
|
|
|
@ -1595,7 +1595,7 @@
|
|||
compatible = "ti,am4372-d_can", "ti,am3352-d_can";
|
||||
reg = <0x0 0x2000>;
|
||||
clocks = <&dcan1_fck>;
|
||||
clock-name = "fck";
|
||||
clock-names = "fck";
|
||||
syscon-raminit = <&scm_conf 0x644 1>;
|
||||
interrupts = <GIC_SPI 49 IRQ_TYPE_LEVEL_HIGH>;
|
||||
status = "disabled";
|
||||
|
|
|
@ -388,13 +388,13 @@
|
|||
|
||||
pinctrl_power_button: powerbutgrp {
|
||||
fsl,pins = <
|
||||
MX53_PAD_SD2_DATA2__GPIO1_13 0x1e4
|
||||
MX53_PAD_SD2_DATA0__GPIO1_15 0x1e4
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_power_out: poweroutgrp {
|
||||
fsl,pins = <
|
||||
MX53_PAD_SD2_DATA0__GPIO1_15 0x1e4
|
||||
MX53_PAD_SD2_DATA2__GPIO1_13 0x1e4
|
||||
>;
|
||||
};
|
||||
|
||||
|
|
|
@ -54,7 +54,13 @@
|
|||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_microsom_enet_ar8035>;
|
||||
phy-mode = "rgmii-id";
|
||||
phy-reset-duration = <2>;
|
||||
|
||||
/*
|
||||
* The PHY seems to require a long-enough reset duration to avoid
|
||||
* some rare issues where the PHY gets stuck in an inconsistent and
|
||||
* non-functional state at boot-up. 10ms proved to be fine .
|
||||
*/
|
||||
phy-reset-duration = <10>;
|
||||
phy-reset-gpios = <&gpio4 15 GPIO_ACTIVE_LOW>;
|
||||
status = "okay";
|
||||
|
||||
|
|
|
@ -43,6 +43,7 @@
|
|||
assigned-clock-rates = <0>, <198000000>;
|
||||
cap-power-off-card;
|
||||
keep-power-in-suspend;
|
||||
max-frequency = <25000000>;
|
||||
mmc-pwrseq = <&wifi_pwrseq>;
|
||||
no-1-8-v;
|
||||
non-removable;
|
||||
|
|
|
@ -30,14 +30,6 @@
|
|||
regulator-max-microvolt = <5000000>;
|
||||
};
|
||||
|
||||
vdds_1v8_main: fixedregulator-vdds_1v8_main {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "vdds_1v8_main";
|
||||
vin-supply = <&smps7_reg>;
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
};
|
||||
|
||||
vmmcsd_fixed: fixedregulator-mmcsd {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "vmmcsd_fixed";
|
||||
|
@ -487,6 +479,7 @@
|
|||
regulator-boot-on;
|
||||
};
|
||||
|
||||
vdds_1v8_main:
|
||||
smps7_reg: smps7 {
|
||||
/* VDDS_1v8_OMAP over VDDS_1v8_MAIN */
|
||||
regulator-name = "smps7";
|
||||
|
|
|
@ -37,7 +37,7 @@
|
|||
poll-interval = <20>;
|
||||
|
||||
/*
|
||||
* The EXTi IRQ line 3 is shared with touchscreen and ethernet,
|
||||
* The EXTi IRQ line 3 is shared with ethernet,
|
||||
* so mark this as polled GPIO key.
|
||||
*/
|
||||
button-0 {
|
||||
|
@ -46,6 +46,16 @@
|
|||
gpios = <&gpiof 3 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
/*
|
||||
* The EXTi IRQ line 6 is shared with touchscreen,
|
||||
* so mark this as polled GPIO key.
|
||||
*/
|
||||
button-1 {
|
||||
label = "TA2-GPIO-B";
|
||||
linux,code = <KEY_B>;
|
||||
gpios = <&gpiod 6 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
/*
|
||||
* The EXTi IRQ line 0 is shared with PMIC,
|
||||
* so mark this as polled GPIO key.
|
||||
|
@ -60,13 +70,6 @@
|
|||
gpio-keys {
|
||||
compatible = "gpio-keys";
|
||||
|
||||
button-1 {
|
||||
label = "TA2-GPIO-B";
|
||||
linux,code = <KEY_B>;
|
||||
gpios = <&gpiod 6 GPIO_ACTIVE_LOW>;
|
||||
wakeup-source;
|
||||
};
|
||||
|
||||
button-3 {
|
||||
label = "TA4-GPIO-D";
|
||||
linux,code = <KEY_D>;
|
||||
|
@ -82,6 +85,7 @@
|
|||
label = "green:led5";
|
||||
gpios = <&gpioc 6 GPIO_ACTIVE_HIGH>;
|
||||
default-state = "off";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
led-1 {
|
||||
|
@ -185,8 +189,8 @@
|
|||
touchscreen@38 {
|
||||
compatible = "edt,edt-ft5406";
|
||||
reg = <0x38>;
|
||||
interrupt-parent = <&gpiog>;
|
||||
interrupts = <2 IRQ_TYPE_EDGE_FALLING>; /* GPIO E */
|
||||
interrupt-parent = <&gpioc>;
|
||||
interrupts = <6 IRQ_TYPE_EDGE_FALLING>; /* GPIO E */
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
@ -12,6 +12,8 @@
|
|||
aliases {
|
||||
ethernet0 = ðernet0;
|
||||
ethernet1 = &ksz8851;
|
||||
rtc0 = &hwrtc;
|
||||
rtc1 = &rtc;
|
||||
};
|
||||
|
||||
memory@c0000000 {
|
||||
|
@ -138,6 +140,7 @@
|
|||
reset-gpios = <&gpioh 3 GPIO_ACTIVE_LOW>;
|
||||
reset-assert-us = <500>;
|
||||
reset-deassert-us = <500>;
|
||||
smsc,disable-energy-detect;
|
||||
interrupt-parent = <&gpioi>;
|
||||
interrupts = <11 IRQ_TYPE_LEVEL_LOW>;
|
||||
};
|
||||
|
@ -248,7 +251,7 @@
|
|||
/delete-property/dmas;
|
||||
/delete-property/dma-names;
|
||||
|
||||
rtc@32 {
|
||||
hwrtc: rtc@32 {
|
||||
compatible = "microcrystal,rv8803";
|
||||
reg = <0x32>;
|
||||
};
|
||||
|
|
|
@ -103,6 +103,7 @@ struct mmdc_pmu {
|
|||
struct perf_event *mmdc_events[MMDC_NUM_COUNTERS];
|
||||
struct hlist_node node;
|
||||
struct fsl_mmdc_devtype_data *devtype_data;
|
||||
struct clk *mmdc_ipg_clk;
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -462,11 +463,14 @@ static int imx_mmdc_remove(struct platform_device *pdev)
|
|||
|
||||
cpuhp_state_remove_instance_nocalls(cpuhp_mmdc_state, &pmu_mmdc->node);
|
||||
perf_pmu_unregister(&pmu_mmdc->pmu);
|
||||
iounmap(pmu_mmdc->mmdc_base);
|
||||
clk_disable_unprepare(pmu_mmdc->mmdc_ipg_clk);
|
||||
kfree(pmu_mmdc);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int imx_mmdc_perf_init(struct platform_device *pdev, void __iomem *mmdc_base)
|
||||
static int imx_mmdc_perf_init(struct platform_device *pdev, void __iomem *mmdc_base,
|
||||
struct clk *mmdc_ipg_clk)
|
||||
{
|
||||
struct mmdc_pmu *pmu_mmdc;
|
||||
char *name;
|
||||
|
@ -494,6 +498,7 @@ static int imx_mmdc_perf_init(struct platform_device *pdev, void __iomem *mmdc_b
|
|||
}
|
||||
|
||||
mmdc_num = mmdc_pmu_init(pmu_mmdc, mmdc_base, &pdev->dev);
|
||||
pmu_mmdc->mmdc_ipg_clk = mmdc_ipg_clk;
|
||||
if (mmdc_num == 0)
|
||||
name = "mmdc";
|
||||
else
|
||||
|
@ -529,7 +534,7 @@ pmu_free:
|
|||
|
||||
#else
|
||||
#define imx_mmdc_remove NULL
|
||||
#define imx_mmdc_perf_init(pdev, mmdc_base) 0
|
||||
#define imx_mmdc_perf_init(pdev, mmdc_base, mmdc_ipg_clk) 0
|
||||
#endif
|
||||
|
||||
static int imx_mmdc_probe(struct platform_device *pdev)
|
||||
|
@ -567,7 +572,13 @@ static int imx_mmdc_probe(struct platform_device *pdev)
|
|||
val &= ~(1 << BP_MMDC_MAPSR_PSD);
|
||||
writel_relaxed(val, reg);
|
||||
|
||||
return imx_mmdc_perf_init(pdev, mmdc_base);
|
||||
err = imx_mmdc_perf_init(pdev, mmdc_base, mmdc_ipg_clk);
|
||||
if (err) {
|
||||
iounmap(mmdc_base);
|
||||
clk_disable_unprepare(mmdc_ipg_clk);
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
int imx_mmdc_get_ddr_type(void)
|
||||
|
|
|
@ -3776,6 +3776,7 @@ struct powerdomain *omap_hwmod_get_pwrdm(struct omap_hwmod *oh)
|
|||
struct omap_hwmod_ocp_if *oi;
|
||||
struct clockdomain *clkdm;
|
||||
struct clk_hw_omap *clk;
|
||||
struct clk_hw *hw;
|
||||
|
||||
if (!oh)
|
||||
return NULL;
|
||||
|
@ -3792,7 +3793,14 @@ struct powerdomain *omap_hwmod_get_pwrdm(struct omap_hwmod *oh)
|
|||
c = oi->_clk;
|
||||
}
|
||||
|
||||
clk = to_clk_hw_omap(__clk_get_hw(c));
|
||||
hw = __clk_get_hw(c);
|
||||
if (!hw)
|
||||
return NULL;
|
||||
|
||||
clk = to_clk_hw_omap(hw);
|
||||
if (!clk)
|
||||
return NULL;
|
||||
|
||||
clkdm = clk->clkdm;
|
||||
if (!clkdm)
|
||||
return NULL;
|
||||
|
|
|
@ -54,6 +54,7 @@
|
|||
|
||||
&mscc_felix_port0 {
|
||||
label = "swp0";
|
||||
managed = "in-band-status";
|
||||
phy-handle = <&phy0>;
|
||||
phy-mode = "sgmii";
|
||||
status = "okay";
|
||||
|
@ -61,6 +62,7 @@
|
|||
|
||||
&mscc_felix_port1 {
|
||||
label = "swp1";
|
||||
managed = "in-band-status";
|
||||
phy-handle = <&phy1>;
|
||||
phy-mode = "sgmii";
|
||||
status = "okay";
|
||||
|
|
|
@ -66,7 +66,7 @@
|
|||
};
|
||||
};
|
||||
|
||||
sysclk: clock-sysclk {
|
||||
sysclk: sysclk {
|
||||
compatible = "fixed-clock";
|
||||
#clock-cells = <0>;
|
||||
clock-frequency = <100000000>;
|
||||
|
|
|
@ -19,6 +19,8 @@
|
|||
aliases {
|
||||
spi0 = &spi0;
|
||||
ethernet1 = ð1;
|
||||
mmc0 = &sdhci0;
|
||||
mmc1 = &sdhci1;
|
||||
};
|
||||
|
||||
chosen {
|
||||
|
@ -119,6 +121,7 @@
|
|||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&i2c1_pins>;
|
||||
clock-frequency = <100000>;
|
||||
/delete-property/ mrvl,i2c-fast-mode;
|
||||
status = "okay";
|
||||
|
||||
rtc@6f {
|
||||
|
|
|
@ -320,7 +320,17 @@ static inline unsigned long kernel_stack_pointer(struct pt_regs *regs)
|
|||
|
||||
static inline unsigned long regs_return_value(struct pt_regs *regs)
|
||||
{
|
||||
return regs->regs[0];
|
||||
unsigned long val = regs->regs[0];
|
||||
|
||||
/*
|
||||
* Audit currently uses regs_return_value() instead of
|
||||
* syscall_get_return_value(). Apply the same sign-extension here until
|
||||
* audit is updated to use syscall_get_return_value().
|
||||
*/
|
||||
if (compat_user_mode(regs))
|
||||
val = sign_extend64(val, 31);
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
static inline void regs_set_return_value(struct pt_regs *regs, unsigned long rc)
|
||||
|
|
|
@ -29,24 +29,25 @@ static inline void syscall_rollback(struct task_struct *task,
|
|||
regs->regs[0] = regs->orig_x0;
|
||||
}
|
||||
|
||||
static inline long syscall_get_return_value(struct task_struct *task,
|
||||
struct pt_regs *regs)
|
||||
{
|
||||
unsigned long val = regs->regs[0];
|
||||
|
||||
if (is_compat_thread(task_thread_info(task)))
|
||||
val = sign_extend64(val, 31);
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
static inline long syscall_get_error(struct task_struct *task,
|
||||
struct pt_regs *regs)
|
||||
{
|
||||
unsigned long error = regs->regs[0];
|
||||
|
||||
if (is_compat_thread(task_thread_info(task)))
|
||||
error = sign_extend64(error, 31);
|
||||
unsigned long error = syscall_get_return_value(task, regs);
|
||||
|
||||
return IS_ERR_VALUE(error) ? error : 0;
|
||||
}
|
||||
|
||||
static inline long syscall_get_return_value(struct task_struct *task,
|
||||
struct pt_regs *regs)
|
||||
{
|
||||
return regs->regs[0];
|
||||
}
|
||||
|
||||
static inline void syscall_set_return_value(struct task_struct *task,
|
||||
struct pt_regs *regs,
|
||||
int error, long val)
|
||||
|
|
|
@ -1862,7 +1862,7 @@ void syscall_trace_exit(struct pt_regs *regs)
|
|||
audit_syscall_exit(regs);
|
||||
|
||||
if (flags & _TIF_SYSCALL_TRACEPOINT)
|
||||
trace_sys_exit(regs, regs_return_value(regs));
|
||||
trace_sys_exit(regs, syscall_get_return_value(current, regs));
|
||||
|
||||
if (flags & (_TIF_SYSCALL_TRACE | _TIF_SINGLESTEP))
|
||||
tracehook_report_syscall(regs, PTRACE_SYSCALL_EXIT);
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
#include <asm/unistd.h>
|
||||
#include <asm/fpsimd.h>
|
||||
#include <asm/ptrace.h>
|
||||
#include <asm/syscall.h>
|
||||
#include <asm/signal32.h>
|
||||
#include <asm/traps.h>
|
||||
#include <asm/vdso.h>
|
||||
|
@ -890,7 +891,7 @@ static void do_signal(struct pt_regs *regs)
|
|||
retval == -ERESTART_RESTARTBLOCK ||
|
||||
(retval == -ERESTARTSYS &&
|
||||
!(ksig.ka.sa.sa_flags & SA_RESTART)))) {
|
||||
regs->regs[0] = -EINTR;
|
||||
syscall_set_return_value(current, regs, -EINTR, 0);
|
||||
regs->pc = continue_addr;
|
||||
}
|
||||
|
||||
|
|
|
@ -220,7 +220,7 @@ void show_stack(struct task_struct *tsk, unsigned long *sp, const char *loglvl)
|
|||
|
||||
#ifdef CONFIG_STACKTRACE
|
||||
|
||||
noinline void arch_stack_walk(stack_trace_consume_fn consume_entry,
|
||||
noinline notrace void arch_stack_walk(stack_trace_consume_fn consume_entry,
|
||||
void *cookie, struct task_struct *task,
|
||||
struct pt_regs *regs)
|
||||
{
|
||||
|
|
|
@ -54,10 +54,7 @@ static void invoke_syscall(struct pt_regs *regs, unsigned int scno,
|
|||
ret = do_ni_syscall(regs, scno);
|
||||
}
|
||||
|
||||
if (is_compat_task())
|
||||
ret = lower_32_bits(ret);
|
||||
|
||||
regs->regs[0] = ret;
|
||||
syscall_set_return_value(current, regs, 0, ret);
|
||||
|
||||
/*
|
||||
* Ultimately, this value will get limited by KSTACK_OFFSET_MAX(),
|
||||
|
@ -115,7 +112,7 @@ static void el0_svc_common(struct pt_regs *regs, int scno, int sc_nr,
|
|||
* syscall. do_notify_resume() will send a signal to userspace
|
||||
* before the syscall is restarted.
|
||||
*/
|
||||
regs->regs[0] = -ERESTARTNOINTR;
|
||||
syscall_set_return_value(current, regs, -ERESTARTNOINTR, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -136,7 +133,7 @@ static void el0_svc_common(struct pt_regs *regs, int scno, int sc_nr,
|
|||
* anyway.
|
||||
*/
|
||||
if (scno == NO_SYSCALL)
|
||||
regs->regs[0] = -ENOSYS;
|
||||
syscall_set_return_value(current, regs, -ENOSYS, 0);
|
||||
scno = syscall_trace_enter(regs);
|
||||
if (scno == NO_SYSCALL)
|
||||
goto trace_exit;
|
||||
|
|
|
@ -321,7 +321,7 @@ KBUILD_LDFLAGS += -m $(ld-emul)
|
|||
|
||||
ifdef CONFIG_MIPS
|
||||
CHECKFLAGS += $(shell $(CC) $(KBUILD_CFLAGS) -dM -E -x c /dev/null | \
|
||||
egrep -vw '__GNUC_(|MINOR_|PATCHLEVEL_)_' | \
|
||||
egrep -vw '__GNUC_(MINOR_|PATCHLEVEL_)?_' | \
|
||||
sed -e "s/^\#define /-D'/" -e "s/ /'='/" -e "s/$$/'/" -e 's/\$$/&&/g')
|
||||
endif
|
||||
|
||||
|
|
|
@ -59,15 +59,20 @@ do { \
|
|||
|
||||
static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address)
|
||||
{
|
||||
pmd_t *pmd = NULL;
|
||||
pmd_t *pmd;
|
||||
struct page *pg;
|
||||
|
||||
pg = alloc_pages(GFP_KERNEL | __GFP_ACCOUNT, PMD_ORDER);
|
||||
if (pg) {
|
||||
pgtable_pmd_page_ctor(pg);
|
||||
pmd = (pmd_t *)page_address(pg);
|
||||
pmd_init((unsigned long)pmd, (unsigned long)invalid_pte_table);
|
||||
pg = alloc_pages(GFP_KERNEL_ACCOUNT, PMD_ORDER);
|
||||
if (!pg)
|
||||
return NULL;
|
||||
|
||||
if (!pgtable_pmd_page_ctor(pg)) {
|
||||
__free_pages(pg, PMD_ORDER);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
pmd = (pmd_t *)page_address(pg);
|
||||
pmd_init((unsigned long)pmd, (unsigned long)invalid_pte_table);
|
||||
return pmd;
|
||||
}
|
||||
|
||||
|
|
|
@ -47,7 +47,8 @@ static struct plat_serial8250_port uart8250_data[] = {
|
|||
.mapbase = 0x1f000900, /* The CBUS UART */
|
||||
.irq = MIPS_CPU_IRQ_BASE + MIPSCPU_INT_MB2,
|
||||
.uartclk = 3686400, /* Twice the usual clk! */
|
||||
.iotype = UPIO_MEM32,
|
||||
.iotype = IS_ENABLED(CONFIG_CPU_BIG_ENDIAN) ?
|
||||
UPIO_MEM32BE : UPIO_MEM32,
|
||||
.flags = CBUS_UART_FLAGS,
|
||||
.regshift = 3,
|
||||
},
|
||||
|
|
|
@ -489,6 +489,7 @@ config CC_HAVE_STACKPROTECTOR_TLS
|
|||
|
||||
config STACKPROTECTOR_PER_TASK
|
||||
def_bool y
|
||||
depends on !GCC_PLUGIN_RANDSTRUCT
|
||||
depends on STACKPROTECTOR && CC_HAVE_STACKPROTECTOR_TLS
|
||||
|
||||
config PHYS_RAM_BASE_FIXED
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
|
||||
memory@80000000 {
|
||||
device_type = "memory";
|
||||
reg = <0x0 0x80000000 0x2 0x00000000>;
|
||||
reg = <0x0 0x80000000 0x4 0x00000000>;
|
||||
};
|
||||
|
||||
soc {
|
||||
|
|
|
@ -27,7 +27,7 @@ void notrace walk_stackframe(struct task_struct *task, struct pt_regs *regs,
|
|||
fp = frame_pointer(regs);
|
||||
sp = user_stack_pointer(regs);
|
||||
pc = instruction_pointer(regs);
|
||||
} else if (task == current) {
|
||||
} else if (task == NULL || task == current) {
|
||||
fp = (unsigned long)__builtin_frame_address(1);
|
||||
sp = (unsigned long)__builtin_frame_address(0);
|
||||
pc = (unsigned long)__builtin_return_address(0);
|
||||
|
|
|
@ -1115,9 +1115,10 @@ void x86_pmu_stop(struct perf_event *event, int flags);
|
|||
|
||||
static inline void x86_pmu_disable_event(struct perf_event *event)
|
||||
{
|
||||
u64 disable_mask = __this_cpu_read(cpu_hw_events.perf_ctr_virt_mask);
|
||||
struct hw_perf_event *hwc = &event->hw;
|
||||
|
||||
wrmsrl(hwc->config_base, hwc->config);
|
||||
wrmsrl(hwc->config_base, hwc->config & ~disable_mask);
|
||||
|
||||
if (is_counter_pair(hwc))
|
||||
wrmsrl(x86_pmu_config_addr(hwc->idx + 1), 0);
|
||||
|
|
|
@ -1546,7 +1546,7 @@ static int is_empty_shadow_page(u64 *spt)
|
|||
* aggregate version in order to make the slab shrinker
|
||||
* faster
|
||||
*/
|
||||
static inline void kvm_mod_used_mmu_pages(struct kvm *kvm, unsigned long nr)
|
||||
static inline void kvm_mod_used_mmu_pages(struct kvm *kvm, long nr)
|
||||
{
|
||||
kvm->arch.n_used_mmu_pages += nr;
|
||||
percpu_counter_add(&kvm_total_used_mmu_pages, nr);
|
||||
|
|
|
@ -188,7 +188,7 @@ static void sev_asid_free(struct kvm_sev_info *sev)
|
|||
|
||||
for_each_possible_cpu(cpu) {
|
||||
sd = per_cpu(svm_data, cpu);
|
||||
sd->sev_vmcbs[pos] = NULL;
|
||||
sd->sev_vmcbs[sev->asid] = NULL;
|
||||
}
|
||||
|
||||
mutex_unlock(&sev_bitmap_lock);
|
||||
|
|
|
@ -4252,8 +4252,17 @@ static int kvm_cpu_accept_dm_intr(struct kvm_vcpu *vcpu)
|
|||
|
||||
static int kvm_vcpu_ready_for_interrupt_injection(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
return kvm_arch_interrupt_allowed(vcpu) &&
|
||||
kvm_cpu_accept_dm_intr(vcpu);
|
||||
/*
|
||||
* Do not cause an interrupt window exit if an exception
|
||||
* is pending or an event needs reinjection; userspace
|
||||
* might want to inject the interrupt manually using KVM_SET_REGS
|
||||
* or KVM_SET_SREGS. For that to work, we must be at an
|
||||
* instruction boundary and with no events half-injected.
|
||||
*/
|
||||
return (kvm_arch_interrupt_allowed(vcpu) &&
|
||||
kvm_cpu_accept_dm_intr(vcpu) &&
|
||||
!kvm_event_needs_reinjection(vcpu) &&
|
||||
!vcpu->arch.exception.pending);
|
||||
}
|
||||
|
||||
static int kvm_vcpu_ioctl_interrupt(struct kvm_vcpu *vcpu,
|
||||
|
|
|
@ -57,12 +57,12 @@ static const char * const sym_regex_kernel[S_NSYMTYPES] = {
|
|||
[S_REL] =
|
||||
"^(__init_(begin|end)|"
|
||||
"__x86_cpu_dev_(start|end)|"
|
||||
"(__parainstructions|__alt_instructions)(|_end)|"
|
||||
"(__iommu_table|__apicdrivers|__smp_locks)(|_end)|"
|
||||
"(__parainstructions|__alt_instructions)(_end)?|"
|
||||
"(__iommu_table|__apicdrivers|__smp_locks)(_end)?|"
|
||||
"__(start|end)_pci_.*|"
|
||||
"__(start|end)_builtin_fw|"
|
||||
"__(start|stop)___ksymtab(|_gpl)|"
|
||||
"__(start|stop)___kcrctab(|_gpl)|"
|
||||
"__(start|stop)___ksymtab(_gpl)?|"
|
||||
"__(start|stop)___kcrctab(_gpl)?|"
|
||||
"__(start|stop)___param|"
|
||||
"__(start|stop)___modver|"
|
||||
"__(start|stop)___bug_table|"
|
||||
|
|
|
@ -833,7 +833,11 @@ static ssize_t iolatency_set_limit(struct kernfs_open_file *of, char *buf,
|
|||
|
||||
enable = iolatency_set_min_lat_nsec(blkg, lat_val);
|
||||
if (enable) {
|
||||
WARN_ON_ONCE(!blk_get_queue(blkg->q));
|
||||
if (!blk_get_queue(blkg->q)) {
|
||||
ret = -ENODEV;
|
||||
goto out;
|
||||
}
|
||||
|
||||
blkg_get(blkg);
|
||||
}
|
||||
|
||||
|
|
|
@ -379,13 +379,6 @@ acpi_ns_repair_CID(struct acpi_evaluate_info *info,
|
|||
|
||||
(*element_ptr)->common.reference_count =
|
||||
original_ref_count;
|
||||
|
||||
/*
|
||||
* The original_element holds a reference from the package object
|
||||
* that represents _HID. Since a new element was created by _HID,
|
||||
* remove the reference from the _CID package.
|
||||
*/
|
||||
acpi_ut_remove_reference(original_element);
|
||||
}
|
||||
|
||||
element_ptr++;
|
||||
|
|
|
@ -637,6 +637,20 @@ unsigned int ata_sff_data_xfer32(struct ata_queued_cmd *qc, unsigned char *buf,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(ata_sff_data_xfer32);
|
||||
|
||||
static void ata_pio_xfer(struct ata_queued_cmd *qc, struct page *page,
|
||||
unsigned int offset, size_t xfer_size)
|
||||
{
|
||||
bool do_write = (qc->tf.flags & ATA_TFLAG_WRITE);
|
||||
unsigned char *buf;
|
||||
|
||||
buf = kmap_atomic(page);
|
||||
qc->ap->ops->sff_data_xfer(qc, buf + offset, xfer_size, do_write);
|
||||
kunmap_atomic(buf);
|
||||
|
||||
if (!do_write && !PageSlab(page))
|
||||
flush_dcache_page(page);
|
||||
}
|
||||
|
||||
/**
|
||||
* ata_pio_sector - Transfer a sector of data.
|
||||
* @qc: Command on going
|
||||
|
@ -648,11 +662,9 @@ EXPORT_SYMBOL_GPL(ata_sff_data_xfer32);
|
|||
*/
|
||||
static void ata_pio_sector(struct ata_queued_cmd *qc)
|
||||
{
|
||||
int do_write = (qc->tf.flags & ATA_TFLAG_WRITE);
|
||||
struct ata_port *ap = qc->ap;
|
||||
struct page *page;
|
||||
unsigned int offset;
|
||||
unsigned char *buf;
|
||||
|
||||
if (!qc->cursg) {
|
||||
qc->curbytes = qc->nbytes;
|
||||
|
@ -670,13 +682,20 @@ static void ata_pio_sector(struct ata_queued_cmd *qc)
|
|||
|
||||
DPRINTK("data %s\n", qc->tf.flags & ATA_TFLAG_WRITE ? "write" : "read");
|
||||
|
||||
/* do the actual data transfer */
|
||||
buf = kmap_atomic(page);
|
||||
ap->ops->sff_data_xfer(qc, buf + offset, qc->sect_size, do_write);
|
||||
kunmap_atomic(buf);
|
||||
/*
|
||||
* Split the transfer when it splits a page boundary. Note that the
|
||||
* split still has to be dword aligned like all ATA data transfers.
|
||||
*/
|
||||
WARN_ON_ONCE(offset % 4);
|
||||
if (offset + qc->sect_size > PAGE_SIZE) {
|
||||
unsigned int split_len = PAGE_SIZE - offset;
|
||||
|
||||
if (!do_write && !PageSlab(page))
|
||||
flush_dcache_page(page);
|
||||
ata_pio_xfer(qc, page, offset, split_len);
|
||||
ata_pio_xfer(qc, nth_page(page, 1), 0,
|
||||
qc->sect_size - split_len);
|
||||
} else {
|
||||
ata_pio_xfer(qc, page, offset, qc->sect_size);
|
||||
}
|
||||
|
||||
qc->curbytes += qc->sect_size;
|
||||
qc->cursg_ofs += qc->sect_size;
|
||||
|
|
|
@ -634,8 +634,6 @@ dev_groups_failed:
|
|||
else if (drv->remove)
|
||||
drv->remove(dev);
|
||||
probe_failed:
|
||||
kfree(dev->dma_range_map);
|
||||
dev->dma_range_map = NULL;
|
||||
if (dev->bus)
|
||||
blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
|
||||
BUS_NOTIFY_DRIVER_NOT_BOUND, dev);
|
||||
|
@ -643,6 +641,8 @@ pinctrl_bind_failed:
|
|||
device_links_no_driver(dev);
|
||||
devres_release_all(dev);
|
||||
arch_teardown_dma_ops(dev);
|
||||
kfree(dev->dma_range_map);
|
||||
dev->dma_range_map = NULL;
|
||||
driver_sysfs_remove(dev);
|
||||
dev->driver = NULL;
|
||||
dev_set_drvdata(dev, NULL);
|
||||
|
|
|
@ -89,12 +89,11 @@ static void __fw_load_abort(struct fw_priv *fw_priv)
|
|||
{
|
||||
/*
|
||||
* There is a small window in which user can write to 'loading'
|
||||
* between loading done and disappearance of 'loading'
|
||||
* between loading done/aborted and disappearance of 'loading'
|
||||
*/
|
||||
if (fw_sysfs_done(fw_priv))
|
||||
if (fw_state_is_aborted(fw_priv) || fw_sysfs_done(fw_priv))
|
||||
return;
|
||||
|
||||
list_del_init(&fw_priv->pending_list);
|
||||
fw_state_aborted(fw_priv);
|
||||
}
|
||||
|
||||
|
@ -280,7 +279,6 @@ static ssize_t firmware_loading_store(struct device *dev,
|
|||
* Same logic as fw_load_abort, only the DONE bit
|
||||
* is ignored and we set ABORT only on failure.
|
||||
*/
|
||||
list_del_init(&fw_priv->pending_list);
|
||||
if (rc) {
|
||||
fw_state_aborted(fw_priv);
|
||||
written = rc;
|
||||
|
@ -513,6 +511,11 @@ static int fw_load_sysfs_fallback(struct fw_sysfs *fw_sysfs, long timeout)
|
|||
}
|
||||
|
||||
mutex_lock(&fw_lock);
|
||||
if (fw_state_is_aborted(fw_priv)) {
|
||||
mutex_unlock(&fw_lock);
|
||||
retval = -EINTR;
|
||||
goto out;
|
||||
}
|
||||
list_add(&fw_priv->pending_list, &pending_fw_head);
|
||||
mutex_unlock(&fw_lock);
|
||||
|
||||
|
@ -535,11 +538,10 @@ static int fw_load_sysfs_fallback(struct fw_sysfs *fw_sysfs, long timeout)
|
|||
if (fw_state_is_aborted(fw_priv)) {
|
||||
if (retval == -ERESTARTSYS)
|
||||
retval = -EINTR;
|
||||
else
|
||||
retval = -EAGAIN;
|
||||
} else if (fw_priv->is_paged_buf && !fw_priv->data)
|
||||
retval = -ENOMEM;
|
||||
|
||||
out:
|
||||
device_del(f_dev);
|
||||
err_put_dev:
|
||||
put_device(f_dev);
|
||||
|
|
|
@ -117,8 +117,16 @@ static inline void __fw_state_set(struct fw_priv *fw_priv,
|
|||
|
||||
WRITE_ONCE(fw_st->status, status);
|
||||
|
||||
if (status == FW_STATUS_DONE || status == FW_STATUS_ABORTED)
|
||||
if (status == FW_STATUS_DONE || status == FW_STATUS_ABORTED) {
|
||||
#ifdef CONFIG_FW_LOADER_USER_HELPER
|
||||
/*
|
||||
* Doing this here ensures that the fw_priv is deleted from
|
||||
* the pending list in all abort/done paths.
|
||||
*/
|
||||
list_del_init(&fw_priv->pending_list);
|
||||
#endif
|
||||
complete_all(&fw_st->completion);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void fw_state_aborted(struct fw_priv *fw_priv)
|
||||
|
|
|
@ -783,8 +783,10 @@ static void fw_abort_batch_reqs(struct firmware *fw)
|
|||
return;
|
||||
|
||||
fw_priv = fw->priv;
|
||||
mutex_lock(&fw_lock);
|
||||
if (!fw_state_is_aborted(fw_priv))
|
||||
fw_state_aborted(fw_priv);
|
||||
mutex_unlock(&fw_lock);
|
||||
}
|
||||
|
||||
/* called from request_firmware() and request_firmware_work_func() */
|
||||
|
|
|
@ -100,6 +100,7 @@ static const char * const clock_names[SYSC_MAX_CLOCKS] = {
|
|||
* @cookie: data used by legacy platform callbacks
|
||||
* @name: name if available
|
||||
* @revision: interconnect target module revision
|
||||
* @reserved: target module is reserved and already in use
|
||||
* @enabled: sysc runtime enabled status
|
||||
* @needs_resume: runtime resume needed on resume from suspend
|
||||
* @child_needs_resume: runtime resume needed for child on resume from suspend
|
||||
|
@ -130,6 +131,7 @@ struct sysc {
|
|||
struct ti_sysc_cookie cookie;
|
||||
const char *name;
|
||||
u32 revision;
|
||||
unsigned int reserved:1;
|
||||
unsigned int enabled:1;
|
||||
unsigned int needs_resume:1;
|
||||
unsigned int child_needs_resume:1;
|
||||
|
@ -2951,6 +2953,8 @@ static int sysc_init_soc(struct sysc *ddata)
|
|||
case SOC_3430 ... SOC_3630:
|
||||
sysc_add_disabled(0x48304000); /* timer12 */
|
||||
break;
|
||||
case SOC_AM3:
|
||||
sysc_add_disabled(0x48310000); /* rng */
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -3093,8 +3097,8 @@ static int sysc_probe(struct platform_device *pdev)
|
|||
return error;
|
||||
|
||||
error = sysc_check_active_timer(ddata);
|
||||
if (error)
|
||||
return error;
|
||||
if (error == -EBUSY)
|
||||
ddata->reserved = true;
|
||||
|
||||
error = sysc_get_clocks(ddata);
|
||||
if (error)
|
||||
|
@ -3130,11 +3134,15 @@ static int sysc_probe(struct platform_device *pdev)
|
|||
sysc_show_registers(ddata);
|
||||
|
||||
ddata->dev->type = &sysc_device_type;
|
||||
error = of_platform_populate(ddata->dev->of_node, sysc_match_table,
|
||||
pdata ? pdata->auxdata : NULL,
|
||||
ddata->dev);
|
||||
if (error)
|
||||
goto err;
|
||||
|
||||
if (!ddata->reserved) {
|
||||
error = of_platform_populate(ddata->dev->of_node,
|
||||
sysc_match_table,
|
||||
pdata ? pdata->auxdata : NULL,
|
||||
ddata->dev);
|
||||
if (error)
|
||||
goto err;
|
||||
}
|
||||
|
||||
INIT_DELAYED_WORK(&ddata->idle_work, ti_sysc_idle);
|
||||
|
||||
|
|
|
@ -254,11 +254,11 @@ static int ftpm_tee_probe(struct device *dev)
|
|||
pvt_data->session = sess_arg.session;
|
||||
|
||||
/* Allocate dynamic shared memory with fTPM TA */
|
||||
pvt_data->shm = tee_shm_alloc(pvt_data->ctx,
|
||||
MAX_COMMAND_SIZE + MAX_RESPONSE_SIZE,
|
||||
TEE_SHM_MAPPED | TEE_SHM_DMA_BUF);
|
||||
pvt_data->shm = tee_shm_alloc_kernel_buf(pvt_data->ctx,
|
||||
MAX_COMMAND_SIZE +
|
||||
MAX_RESPONSE_SIZE);
|
||||
if (IS_ERR(pvt_data->shm)) {
|
||||
dev_err(dev, "%s: tee_shm_alloc failed\n", __func__);
|
||||
dev_err(dev, "%s: tee_shm_alloc_kernel_buf failed\n", __func__);
|
||||
rc = -ENOMEM;
|
||||
goto out_shm_alloc;
|
||||
}
|
||||
|
|
|
@ -92,13 +92,20 @@ int __must_check devm_clk_bulk_get_optional(struct device *dev, int num_clks,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(devm_clk_bulk_get_optional);
|
||||
|
||||
static void devm_clk_bulk_release_all(struct device *dev, void *res)
|
||||
{
|
||||
struct clk_bulk_devres *devres = res;
|
||||
|
||||
clk_bulk_put_all(devres->num_clks, devres->clks);
|
||||
}
|
||||
|
||||
int __must_check devm_clk_bulk_get_all(struct device *dev,
|
||||
struct clk_bulk_data **clks)
|
||||
{
|
||||
struct clk_bulk_devres *devres;
|
||||
int ret;
|
||||
|
||||
devres = devres_alloc(devm_clk_bulk_release,
|
||||
devres = devres_alloc(devm_clk_bulk_release_all,
|
||||
sizeof(*devres), GFP_KERNEL);
|
||||
if (!devres)
|
||||
return -ENOMEM;
|
||||
|
|
|
@ -526,7 +526,7 @@ struct stm32f4_pll {
|
|||
|
||||
struct stm32f4_pll_post_div_data {
|
||||
int idx;
|
||||
u8 pll_num;
|
||||
int pll_idx;
|
||||
const char *name;
|
||||
const char *parent;
|
||||
u8 flag;
|
||||
|
@ -557,13 +557,13 @@ static const struct clk_div_table post_divr_table[] = {
|
|||
|
||||
#define MAX_POST_DIV 3
|
||||
static const struct stm32f4_pll_post_div_data post_div_data[MAX_POST_DIV] = {
|
||||
{ CLK_I2SQ_PDIV, PLL_I2S, "plli2s-q-div", "plli2s-q",
|
||||
{ CLK_I2SQ_PDIV, PLL_VCO_I2S, "plli2s-q-div", "plli2s-q",
|
||||
CLK_SET_RATE_PARENT, STM32F4_RCC_DCKCFGR, 0, 5, 0, NULL},
|
||||
|
||||
{ CLK_SAIQ_PDIV, PLL_SAI, "pllsai-q-div", "pllsai-q",
|
||||
{ CLK_SAIQ_PDIV, PLL_VCO_SAI, "pllsai-q-div", "pllsai-q",
|
||||
CLK_SET_RATE_PARENT, STM32F4_RCC_DCKCFGR, 8, 5, 0, NULL },
|
||||
|
||||
{ NO_IDX, PLL_SAI, "pllsai-r-div", "pllsai-r", CLK_SET_RATE_PARENT,
|
||||
{ NO_IDX, PLL_VCO_SAI, "pllsai-r-div", "pllsai-r", CLK_SET_RATE_PARENT,
|
||||
STM32F4_RCC_DCKCFGR, 16, 2, 0, post_divr_table },
|
||||
};
|
||||
|
||||
|
@ -1774,7 +1774,7 @@ static void __init stm32f4_rcc_init(struct device_node *np)
|
|||
post_div->width,
|
||||
post_div->flag_div,
|
||||
post_div->div_table,
|
||||
clks[post_div->pll_num],
|
||||
clks[post_div->pll_idx],
|
||||
&stm32f4_clk_lock);
|
||||
|
||||
if (post_div->idx != NO_IDX)
|
||||
|
|
|
@ -194,6 +194,15 @@ static void clk_sdmmc_mux_disable(struct clk_hw *hw)
|
|||
gate_ops->disable(gate_hw);
|
||||
}
|
||||
|
||||
static void clk_sdmmc_mux_disable_unused(struct clk_hw *hw)
|
||||
{
|
||||
struct tegra_sdmmc_mux *sdmmc_mux = to_clk_sdmmc_mux(hw);
|
||||
const struct clk_ops *gate_ops = sdmmc_mux->gate_ops;
|
||||
struct clk_hw *gate_hw = &sdmmc_mux->gate.hw;
|
||||
|
||||
gate_ops->disable_unused(gate_hw);
|
||||
}
|
||||
|
||||
static void clk_sdmmc_mux_restore_context(struct clk_hw *hw)
|
||||
{
|
||||
struct clk_hw *parent = clk_hw_get_parent(hw);
|
||||
|
@ -218,6 +227,7 @@ static const struct clk_ops tegra_clk_sdmmc_mux_ops = {
|
|||
.is_enabled = clk_sdmmc_mux_is_enabled,
|
||||
.enable = clk_sdmmc_mux_enable,
|
||||
.disable = clk_sdmmc_mux_disable,
|
||||
.disable_unused = clk_sdmmc_mux_disable_unused,
|
||||
.restore_context = clk_sdmmc_mux_restore_context,
|
||||
};
|
||||
|
||||
|
|
|
@ -294,6 +294,14 @@ struct idxd_desc {
|
|||
struct idxd_wq *wq;
|
||||
};
|
||||
|
||||
/*
|
||||
* This is software defined error for the completion status. We overload the error code
|
||||
* that will never appear in completion status and only SWERR register.
|
||||
*/
|
||||
enum idxd_completion_status {
|
||||
IDXD_COMP_DESC_ABORT = 0xff,
|
||||
};
|
||||
|
||||
#define confdev_to_idxd(dev) container_of(dev, struct idxd_device, conf_dev)
|
||||
#define confdev_to_wq(dev) container_of(dev, struct idxd_wq, conf_dev)
|
||||
|
||||
|
@ -482,4 +490,10 @@ static inline void perfmon_init(void) {}
|
|||
static inline void perfmon_exit(void) {}
|
||||
#endif
|
||||
|
||||
static inline void complete_desc(struct idxd_desc *desc, enum idxd_complete_type reason)
|
||||
{
|
||||
idxd_dma_complete_txd(desc, reason);
|
||||
idxd_free_desc(desc->wq, desc);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -102,6 +102,8 @@ static int idxd_setup_interrupts(struct idxd_device *idxd)
|
|||
spin_lock_init(&idxd->irq_entries[i].list_lock);
|
||||
}
|
||||
|
||||
idxd_msix_perm_setup(idxd);
|
||||
|
||||
irq_entry = &idxd->irq_entries[0];
|
||||
rc = request_threaded_irq(irq_entry->vector, NULL, idxd_misc_thread,
|
||||
0, "idxd-misc", irq_entry);
|
||||
|
@ -148,7 +150,6 @@ static int idxd_setup_interrupts(struct idxd_device *idxd)
|
|||
}
|
||||
|
||||
idxd_unmask_error_interrupts(idxd);
|
||||
idxd_msix_perm_setup(idxd);
|
||||
return 0;
|
||||
|
||||
err_wq_irqs:
|
||||
|
@ -162,6 +163,7 @@ static int idxd_setup_interrupts(struct idxd_device *idxd)
|
|||
err_misc_irq:
|
||||
/* Disable error interrupt generation */
|
||||
idxd_mask_error_interrupts(idxd);
|
||||
idxd_msix_perm_clear(idxd);
|
||||
err_irq_entries:
|
||||
pci_free_irq_vectors(pdev);
|
||||
dev_err(dev, "No usable interrupts\n");
|
||||
|
@ -757,32 +759,40 @@ static void idxd_shutdown(struct pci_dev *pdev)
|
|||
for (i = 0; i < msixcnt; i++) {
|
||||
irq_entry = &idxd->irq_entries[i];
|
||||
synchronize_irq(irq_entry->vector);
|
||||
free_irq(irq_entry->vector, irq_entry);
|
||||
if (i == 0)
|
||||
continue;
|
||||
idxd_flush_pending_llist(irq_entry);
|
||||
idxd_flush_work_list(irq_entry);
|
||||
}
|
||||
|
||||
idxd_msix_perm_clear(idxd);
|
||||
idxd_release_int_handles(idxd);
|
||||
pci_free_irq_vectors(pdev);
|
||||
pci_iounmap(pdev, idxd->reg_base);
|
||||
pci_disable_device(pdev);
|
||||
destroy_workqueue(idxd->wq);
|
||||
flush_workqueue(idxd->wq);
|
||||
}
|
||||
|
||||
static void idxd_remove(struct pci_dev *pdev)
|
||||
{
|
||||
struct idxd_device *idxd = pci_get_drvdata(pdev);
|
||||
struct idxd_irq_entry *irq_entry;
|
||||
int msixcnt = pci_msix_vec_count(pdev);
|
||||
int i;
|
||||
|
||||
dev_dbg(&pdev->dev, "%s called\n", __func__);
|
||||
idxd_shutdown(pdev);
|
||||
if (device_pasid_enabled(idxd))
|
||||
idxd_disable_system_pasid(idxd);
|
||||
idxd_unregister_devices(idxd);
|
||||
perfmon_pmu_remove(idxd);
|
||||
|
||||
for (i = 0; i < msixcnt; i++) {
|
||||
irq_entry = &idxd->irq_entries[i];
|
||||
free_irq(irq_entry->vector, irq_entry);
|
||||
}
|
||||
idxd_msix_perm_clear(idxd);
|
||||
idxd_release_int_handles(idxd);
|
||||
pci_free_irq_vectors(pdev);
|
||||
pci_iounmap(pdev, idxd->reg_base);
|
||||
iommu_dev_disable_feature(&pdev->dev, IOMMU_DEV_FEAT_SVA);
|
||||
pci_disable_device(pdev);
|
||||
destroy_workqueue(idxd->wq);
|
||||
perfmon_pmu_remove(idxd);
|
||||
device_unregister(&idxd->conf_dev);
|
||||
}
|
||||
|
||||
static struct pci_driver idxd_pci_driver = {
|
||||
|
|
|
@ -245,12 +245,6 @@ static inline bool match_fault(struct idxd_desc *desc, u64 fault_addr)
|
|||
return false;
|
||||
}
|
||||
|
||||
static inline void complete_desc(struct idxd_desc *desc, enum idxd_complete_type reason)
|
||||
{
|
||||
idxd_dma_complete_txd(desc, reason);
|
||||
idxd_free_desc(desc->wq, desc);
|
||||
}
|
||||
|
||||
static int irq_process_pending_llist(struct idxd_irq_entry *irq_entry,
|
||||
enum irq_work_type wtype,
|
||||
int *processed, u64 data)
|
||||
|
@ -272,8 +266,16 @@ static int irq_process_pending_llist(struct idxd_irq_entry *irq_entry,
|
|||
reason = IDXD_COMPLETE_DEV_FAIL;
|
||||
|
||||
llist_for_each_entry_safe(desc, t, head, llnode) {
|
||||
if (desc->completion->status) {
|
||||
if ((desc->completion->status & DSA_COMP_STATUS_MASK) != DSA_COMP_SUCCESS)
|
||||
u8 status = desc->completion->status & DSA_COMP_STATUS_MASK;
|
||||
|
||||
if (status) {
|
||||
if (unlikely(status == IDXD_COMP_DESC_ABORT)) {
|
||||
complete_desc(desc, IDXD_COMPLETE_ABORT);
|
||||
(*processed)++;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (unlikely(status != DSA_COMP_SUCCESS))
|
||||
match_fault(desc, data);
|
||||
complete_desc(desc, reason);
|
||||
(*processed)++;
|
||||
|
@ -329,7 +331,14 @@ static int irq_process_work_list(struct idxd_irq_entry *irq_entry,
|
|||
spin_unlock_irqrestore(&irq_entry->list_lock, flags);
|
||||
|
||||
list_for_each_entry(desc, &flist, list) {
|
||||
if ((desc->completion->status & DSA_COMP_STATUS_MASK) != DSA_COMP_SUCCESS)
|
||||
u8 status = desc->completion->status & DSA_COMP_STATUS_MASK;
|
||||
|
||||
if (unlikely(status == IDXD_COMP_DESC_ABORT)) {
|
||||
complete_desc(desc, IDXD_COMPLETE_ABORT);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (unlikely(status != DSA_COMP_SUCCESS))
|
||||
match_fault(desc, data);
|
||||
complete_desc(desc, reason);
|
||||
}
|
||||
|
|
|
@ -25,11 +25,10 @@ static struct idxd_desc *__get_desc(struct idxd_wq *wq, int idx, int cpu)
|
|||
* Descriptor completion vectors are 1...N for MSIX. We will round
|
||||
* robin through the N vectors.
|
||||
*/
|
||||
wq->vec_ptr = (wq->vec_ptr % idxd->num_wq_irqs) + 1;
|
||||
wq->vec_ptr = desc->vector = (wq->vec_ptr % idxd->num_wq_irqs) + 1;
|
||||
if (!idxd->int_handles) {
|
||||
desc->hw->int_handle = wq->vec_ptr;
|
||||
} else {
|
||||
desc->vector = wq->vec_ptr;
|
||||
/*
|
||||
* int_handles are only for descriptor completion. However for device
|
||||
* MSIX enumeration, vec 0 is used for misc interrupts. Therefore even
|
||||
|
@ -88,9 +87,64 @@ void idxd_free_desc(struct idxd_wq *wq, struct idxd_desc *desc)
|
|||
sbitmap_queue_clear(&wq->sbq, desc->id, cpu);
|
||||
}
|
||||
|
||||
static struct idxd_desc *list_abort_desc(struct idxd_wq *wq, struct idxd_irq_entry *ie,
|
||||
struct idxd_desc *desc)
|
||||
{
|
||||
struct idxd_desc *d, *n;
|
||||
|
||||
lockdep_assert_held(&ie->list_lock);
|
||||
list_for_each_entry_safe(d, n, &ie->work_list, list) {
|
||||
if (d == desc) {
|
||||
list_del(&d->list);
|
||||
return d;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* At this point, the desc needs to be aborted is held by the completion
|
||||
* handler where it has taken it off the pending list but has not added to the
|
||||
* work list. It will be cleaned up by the interrupt handler when it sees the
|
||||
* IDXD_COMP_DESC_ABORT for completion status.
|
||||
*/
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void llist_abort_desc(struct idxd_wq *wq, struct idxd_irq_entry *ie,
|
||||
struct idxd_desc *desc)
|
||||
{
|
||||
struct idxd_desc *d, *t, *found = NULL;
|
||||
struct llist_node *head;
|
||||
unsigned long flags;
|
||||
|
||||
desc->completion->status = IDXD_COMP_DESC_ABORT;
|
||||
/*
|
||||
* Grab the list lock so it will block the irq thread handler. This allows the
|
||||
* abort code to locate the descriptor need to be aborted.
|
||||
*/
|
||||
spin_lock_irqsave(&ie->list_lock, flags);
|
||||
head = llist_del_all(&ie->pending_llist);
|
||||
if (head) {
|
||||
llist_for_each_entry_safe(d, t, head, llnode) {
|
||||
if (d == desc) {
|
||||
found = desc;
|
||||
continue;
|
||||
}
|
||||
list_add_tail(&desc->list, &ie->work_list);
|
||||
}
|
||||
}
|
||||
|
||||
if (!found)
|
||||
found = list_abort_desc(wq, ie, desc);
|
||||
spin_unlock_irqrestore(&ie->list_lock, flags);
|
||||
|
||||
if (found)
|
||||
complete_desc(found, IDXD_COMPLETE_ABORT);
|
||||
}
|
||||
|
||||
int idxd_submit_desc(struct idxd_wq *wq, struct idxd_desc *desc)
|
||||
{
|
||||
struct idxd_device *idxd = wq->idxd;
|
||||
struct idxd_irq_entry *ie = NULL;
|
||||
void __iomem *portal;
|
||||
int rc;
|
||||
|
||||
|
@ -108,6 +162,16 @@ int idxd_submit_desc(struct idxd_wq *wq, struct idxd_desc *desc)
|
|||
* even on UP because the recipient is a device.
|
||||
*/
|
||||
wmb();
|
||||
|
||||
/*
|
||||
* Pending the descriptor to the lockless list for the irq_entry
|
||||
* that we designated the descriptor to.
|
||||
*/
|
||||
if (desc->hw->flags & IDXD_OP_FLAG_RCI) {
|
||||
ie = &idxd->irq_entries[desc->vector];
|
||||
llist_add(&desc->llnode, &ie->pending_llist);
|
||||
}
|
||||
|
||||
if (wq_dedicated(wq)) {
|
||||
iosubmit_cmds512(portal, desc->hw, 1);
|
||||
} else {
|
||||
|
@ -118,29 +182,13 @@ int idxd_submit_desc(struct idxd_wq *wq, struct idxd_desc *desc)
|
|||
* device is not accepting descriptor at all.
|
||||
*/
|
||||
rc = enqcmds(portal, desc->hw);
|
||||
if (rc < 0)
|
||||
if (rc < 0) {
|
||||
if (ie)
|
||||
llist_abort_desc(wq, ie, desc);
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
|
||||
percpu_ref_put(&wq->wq_active);
|
||||
|
||||
/*
|
||||
* Pending the descriptor to the lockless list for the irq_entry
|
||||
* that we designated the descriptor to.
|
||||
*/
|
||||
if (desc->hw->flags & IDXD_OP_FLAG_RCI) {
|
||||
int vec;
|
||||
|
||||
/*
|
||||
* If the driver is on host kernel, it would be the value
|
||||
* assigned to interrupt handle, which is index for MSIX
|
||||
* vector. If it's guest then can't use the int_handle since
|
||||
* that is the index to IMS for the entire device. The guest
|
||||
* device local index will be used.
|
||||
*/
|
||||
vec = !idxd->int_handles ? desc->hw->int_handle : desc->vector;
|
||||
llist_add(&desc->llnode, &idxd->irq_entries[vec].pending_llist);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -1744,8 +1744,6 @@ void idxd_unregister_devices(struct idxd_device *idxd)
|
|||
|
||||
device_unregister(&group->conf_dev);
|
||||
}
|
||||
|
||||
device_unregister(&idxd->conf_dev);
|
||||
}
|
||||
|
||||
int idxd_register_bus_type(void)
|
||||
|
|
|
@ -812,6 +812,8 @@ static struct dma_async_tx_descriptor *imxdma_prep_slave_sg(
|
|||
dma_length += sg_dma_len(sg);
|
||||
}
|
||||
|
||||
imxdma_config_write(chan, &imxdmac->config, direction);
|
||||
|
||||
switch (imxdmac->word_size) {
|
||||
case DMA_SLAVE_BUSWIDTH_4_BYTES:
|
||||
if (sg_dma_len(sgl) & 3 || sgl->dma_address & 3)
|
||||
|
|
|
@ -1200,7 +1200,7 @@ static int stm32_dma_alloc_chan_resources(struct dma_chan *c)
|
|||
|
||||
chan->config_init = false;
|
||||
|
||||
ret = pm_runtime_get_sync(dmadev->ddev.dev);
|
||||
ret = pm_runtime_resume_and_get(dmadev->ddev.dev);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
|
@ -1470,7 +1470,7 @@ static int stm32_dma_suspend(struct device *dev)
|
|||
struct stm32_dma_device *dmadev = dev_get_drvdata(dev);
|
||||
int id, ret, scr;
|
||||
|
||||
ret = pm_runtime_get_sync(dev);
|
||||
ret = pm_runtime_resume_and_get(dev);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
|
|
|
@ -137,7 +137,7 @@ static void *stm32_dmamux_route_allocate(struct of_phandle_args *dma_spec,
|
|||
|
||||
/* Set dma request */
|
||||
spin_lock_irqsave(&dmamux->lock, flags);
|
||||
ret = pm_runtime_get_sync(&pdev->dev);
|
||||
ret = pm_runtime_resume_and_get(&pdev->dev);
|
||||
if (ret < 0) {
|
||||
spin_unlock_irqrestore(&dmamux->lock, flags);
|
||||
goto error;
|
||||
|
@ -336,7 +336,7 @@ static int stm32_dmamux_suspend(struct device *dev)
|
|||
struct stm32_dmamux_data *stm32_dmamux = platform_get_drvdata(pdev);
|
||||
int i, ret;
|
||||
|
||||
ret = pm_runtime_get_sync(dev);
|
||||
ret = pm_runtime_resume_and_get(dev);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
|
@ -361,7 +361,7 @@ static int stm32_dmamux_resume(struct device *dev)
|
|||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = pm_runtime_get_sync(dev);
|
||||
ret = pm_runtime_resume_and_get(dev);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
|
|
|
@ -209,8 +209,8 @@ static int uniphier_xdmac_chan_stop(struct uniphier_xdmac_chan *xc)
|
|||
writel(0, xc->reg_ch_base + XDMAC_TSS);
|
||||
|
||||
/* wait until transfer is stopped */
|
||||
return readl_poll_timeout(xc->reg_ch_base + XDMAC_STAT, val,
|
||||
!(val & XDMAC_STAT_TENF), 100, 1000);
|
||||
return readl_poll_timeout_atomic(xc->reg_ch_base + XDMAC_STAT, val,
|
||||
!(val & XDMAC_STAT_TENF), 100, 1000);
|
||||
}
|
||||
|
||||
/* xc->vc.lock must be held by caller */
|
||||
|
|
|
@ -953,6 +953,8 @@ static int fme_perf_offline_cpu(unsigned int cpu, struct hlist_node *node)
|
|||
return 0;
|
||||
|
||||
priv->cpu = target;
|
||||
perf_pmu_migrate_context(&priv->pmu, cpu, target);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -405,7 +405,7 @@ static int mpc8xxx_probe(struct platform_device *pdev)
|
|||
|
||||
ret = devm_request_irq(&pdev->dev, mpc8xxx_gc->irqn,
|
||||
mpc8xxx_gpio_irq_cascade,
|
||||
IRQF_SHARED, "gpio-cascade",
|
||||
IRQF_NO_THREAD | IRQF_SHARED, "gpio-cascade",
|
||||
mpc8xxx_gc);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev,
|
||||
|
|
|
@ -238,8 +238,8 @@ static int tqmx86_gpio_probe(struct platform_device *pdev)
|
|||
struct resource *res;
|
||||
int ret, irq;
|
||||
|
||||
irq = platform_get_irq(pdev, 0);
|
||||
if (irq < 0)
|
||||
irq = platform_get_irq_optional(pdev, 0);
|
||||
if (irq < 0 && irq != -ENXIO)
|
||||
return irq;
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_IO, 0);
|
||||
|
@ -278,7 +278,7 @@ static int tqmx86_gpio_probe(struct platform_device *pdev)
|
|||
|
||||
pm_runtime_enable(&pdev->dev);
|
||||
|
||||
if (irq) {
|
||||
if (irq > 0) {
|
||||
struct irq_chip *irq_chip = &gpio->irq_chip;
|
||||
u8 irq_status;
|
||||
|
||||
|
|
|
@ -904,7 +904,7 @@ void amdgpu_acpi_fini(struct amdgpu_device *adev)
|
|||
*/
|
||||
bool amdgpu_acpi_is_s0ix_supported(struct amdgpu_device *adev)
|
||||
{
|
||||
#if defined(CONFIG_AMD_PMC) || defined(CONFIG_AMD_PMC_MODULE)
|
||||
#if IS_ENABLED(CONFIG_AMD_PMC) && IS_ENABLED(CONFIG_PM_SLEEP)
|
||||
if (acpi_gbl_FADT.flags & ACPI_FADT_LOW_POWER_S0) {
|
||||
if (adev->flags & AMD_IS_APU)
|
||||
return pm_suspend_target_state == PM_SUSPEND_TO_IDLE;
|
||||
|
|
|
@ -1493,6 +1493,7 @@ static int dm_dmub_sw_init(struct amdgpu_device *adev)
|
|||
}
|
||||
|
||||
hdr = (const struct dmcub_firmware_header_v1_0 *)adev->dm.dmub_fw->data;
|
||||
adev->dm.dmcub_fw_version = le32_to_cpu(hdr->header.ucode_version);
|
||||
|
||||
if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
|
||||
adev->firmware.ucode[AMDGPU_UCODE_ID_DMCUB].ucode_id =
|
||||
|
@ -1506,7 +1507,6 @@ static int dm_dmub_sw_init(struct amdgpu_device *adev)
|
|||
adev->dm.dmcub_fw_version);
|
||||
}
|
||||
|
||||
adev->dm.dmcub_fw_version = le32_to_cpu(hdr->header.ucode_version);
|
||||
|
||||
adev->dm.dmub_srv = kzalloc(sizeof(*adev->dm.dmub_srv), GFP_KERNEL);
|
||||
dmub_srv = adev->dm.dmub_srv;
|
||||
|
@ -2367,9 +2367,9 @@ static void update_connector_ext_caps(struct amdgpu_dm_connector *aconnector)
|
|||
max_cll = conn_base->hdr_sink_metadata.hdmi_type1.max_cll;
|
||||
min_cll = conn_base->hdr_sink_metadata.hdmi_type1.min_cll;
|
||||
|
||||
if (caps->ext_caps->bits.oled == 1 ||
|
||||
if (caps->ext_caps->bits.oled == 1 /*||
|
||||
caps->ext_caps->bits.sdr_aux_backlight_control == 1 ||
|
||||
caps->ext_caps->bits.hdr_aux_backlight_control == 1)
|
||||
caps->ext_caps->bits.hdr_aux_backlight_control == 1*/)
|
||||
caps->aux_support = true;
|
||||
|
||||
if (amdgpu_backlight == 0)
|
||||
|
|
|
@ -139,7 +139,7 @@ void i915_globals_unpark(void)
|
|||
atomic_inc(&active);
|
||||
}
|
||||
|
||||
static void __exit __i915_globals_flush(void)
|
||||
static void __i915_globals_flush(void)
|
||||
{
|
||||
atomic_inc(&active); /* skip shrinking */
|
||||
|
||||
|
@ -149,7 +149,7 @@ static void __exit __i915_globals_flush(void)
|
|||
atomic_dec(&active);
|
||||
}
|
||||
|
||||
void __exit i915_globals_exit(void)
|
||||
void i915_globals_exit(void)
|
||||
{
|
||||
GEM_BUG_ON(atomic_read(&active));
|
||||
|
||||
|
|
|
@ -1168,6 +1168,7 @@ static int __init i915_init(void)
|
|||
err = pci_register_driver(&i915_pci_driver);
|
||||
if (err) {
|
||||
i915_pmu_exit();
|
||||
i915_globals_exit();
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
@ -416,7 +416,7 @@ static inline bool i915_mmio_reg_valid(i915_reg_t reg)
|
|||
#define GEN11_VECS_SFC_USAGE(engine) _MMIO((engine)->mmio_base + 0x2014)
|
||||
#define GEN11_VECS_SFC_USAGE_BIT (1 << 0)
|
||||
|
||||
#define GEN12_SFC_DONE(n) _MMIO(0x1cc00 + (n) * 0x100)
|
||||
#define GEN12_SFC_DONE(n) _MMIO(0x1cc000 + (n) * 0x1000)
|
||||
#define GEN12_SFC_DONE_MAX 4
|
||||
|
||||
#define RING_PP_DIR_BASE(base) _MMIO((base) + 0x228)
|
||||
|
|
|
@ -203,6 +203,7 @@ static irqreturn_t handle_lcd_irq(struct drm_device *dev)
|
|||
unsigned long status, val, val1;
|
||||
int plane_id, dma0_state, dma1_state;
|
||||
struct kmb_drm_private *kmb = to_kmb(dev);
|
||||
u32 ctrl = 0;
|
||||
|
||||
status = kmb_read_lcd(kmb, LCD_INT_STATUS);
|
||||
|
||||
|
@ -227,6 +228,19 @@ static irqreturn_t handle_lcd_irq(struct drm_device *dev)
|
|||
kmb_clr_bitmask_lcd(kmb, LCD_CONTROL,
|
||||
kmb->plane_status[plane_id].ctrl);
|
||||
|
||||
ctrl = kmb_read_lcd(kmb, LCD_CONTROL);
|
||||
if (!(ctrl & (LCD_CTRL_VL1_ENABLE |
|
||||
LCD_CTRL_VL2_ENABLE |
|
||||
LCD_CTRL_GL1_ENABLE |
|
||||
LCD_CTRL_GL2_ENABLE))) {
|
||||
/* If no LCD layers are using DMA,
|
||||
* then disable DMA pipelined AXI read
|
||||
* transactions.
|
||||
*/
|
||||
kmb_clr_bitmask_lcd(kmb, LCD_CONTROL,
|
||||
LCD_CTRL_PIPELINE_DMA);
|
||||
}
|
||||
|
||||
kmb->plane_status[plane_id].disable = false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -427,8 +427,14 @@ static void kmb_plane_atomic_update(struct drm_plane *plane,
|
|||
|
||||
kmb_set_bitmask_lcd(kmb, LCD_CONTROL, ctrl);
|
||||
|
||||
/* FIXME no doc on how to set output format,these values are
|
||||
* taken from the Myriadx tests
|
||||
/* Enable pipeline AXI read transactions for the DMA
|
||||
* after setting graphics layers. This must be done
|
||||
* in a separate write cycle.
|
||||
*/
|
||||
kmb_set_bitmask_lcd(kmb, LCD_CONTROL, LCD_CTRL_PIPELINE_DMA);
|
||||
|
||||
/* FIXME no doc on how to set output format, these values are taken
|
||||
* from the Myriadx tests
|
||||
*/
|
||||
out_format |= LCD_OUTF_FORMAT_RGB888;
|
||||
|
||||
|
@ -526,6 +532,11 @@ struct kmb_plane *kmb_plane_init(struct drm_device *drm)
|
|||
plane->id = i;
|
||||
}
|
||||
|
||||
/* Disable pipeline AXI read transactions for the DMA
|
||||
* prior to setting graphics layers
|
||||
*/
|
||||
kmb_clr_bitmask_lcd(kmb, LCD_CONTROL, LCD_CTRL_PIPELINE_DMA);
|
||||
|
||||
return primary;
|
||||
cleanup:
|
||||
drmm_kfree(drm, plane);
|
||||
|
|
|
@ -742,7 +742,7 @@ static int ft260_is_interface_enabled(struct hid_device *hdev)
|
|||
int ret;
|
||||
|
||||
ret = ft260_get_system_config(hdev, &cfg);
|
||||
if (ret)
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ft260_dbg("interface: 0x%02x\n", interface);
|
||||
|
@ -754,23 +754,16 @@ static int ft260_is_interface_enabled(struct hid_device *hdev)
|
|||
switch (cfg.chip_mode) {
|
||||
case FT260_MODE_ALL:
|
||||
case FT260_MODE_BOTH:
|
||||
if (interface == 1) {
|
||||
if (interface == 1)
|
||||
hid_info(hdev, "uart interface is not supported\n");
|
||||
return 0;
|
||||
}
|
||||
ret = 1;
|
||||
else
|
||||
ret = 1;
|
||||
break;
|
||||
case FT260_MODE_UART:
|
||||
if (interface == 0) {
|
||||
hid_info(hdev, "uart is unsupported on interface 0\n");
|
||||
ret = 0;
|
||||
}
|
||||
hid_info(hdev, "uart interface is not supported\n");
|
||||
break;
|
||||
case FT260_MODE_I2C:
|
||||
if (interface == 1) {
|
||||
hid_info(hdev, "i2c is unsupported on interface 1\n");
|
||||
ret = 0;
|
||||
}
|
||||
ret = 1;
|
||||
break;
|
||||
}
|
||||
return ret;
|
||||
|
@ -1004,11 +997,9 @@ err_hid_stop:
|
|||
|
||||
static void ft260_remove(struct hid_device *hdev)
|
||||
{
|
||||
int ret;
|
||||
struct ft260_device *dev = hid_get_drvdata(hdev);
|
||||
|
||||
ret = ft260_is_interface_enabled(hdev);
|
||||
if (ret <= 0)
|
||||
if (!dev)
|
||||
return;
|
||||
|
||||
sysfs_remove_group(&hdev->dev.kobj, &ft260_attr_group);
|
||||
|
|
|
@ -213,8 +213,10 @@ int hns_roce_cmd_use_events(struct hns_roce_dev *hr_dev)
|
|||
|
||||
hr_cmd->context =
|
||||
kcalloc(hr_cmd->max_cmds, sizeof(*hr_cmd->context), GFP_KERNEL);
|
||||
if (!hr_cmd->context)
|
||||
if (!hr_cmd->context) {
|
||||
hr_dev->cmd_mod = 0;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
for (i = 0; i < hr_cmd->max_cmds; ++i) {
|
||||
hr_cmd->context[i].token = i;
|
||||
|
@ -228,7 +230,6 @@ int hns_roce_cmd_use_events(struct hns_roce_dev *hr_dev)
|
|||
spin_lock_init(&hr_cmd->context_lock);
|
||||
|
||||
hr_cmd->use_events = 1;
|
||||
down(&hr_cmd->poll_sem);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -239,8 +240,6 @@ void hns_roce_cmd_use_polling(struct hns_roce_dev *hr_dev)
|
|||
|
||||
kfree(hr_cmd->context);
|
||||
hr_cmd->use_events = 0;
|
||||
|
||||
up(&hr_cmd->poll_sem);
|
||||
}
|
||||
|
||||
struct hns_roce_cmd_mailbox *
|
||||
|
|
|
@ -897,11 +897,9 @@ int hns_roce_init(struct hns_roce_dev *hr_dev)
|
|||
|
||||
if (hr_dev->cmd_mod) {
|
||||
ret = hns_roce_cmd_use_events(hr_dev);
|
||||
if (ret) {
|
||||
if (ret)
|
||||
dev_warn(dev,
|
||||
"Cmd event mode failed, set back to poll!\n");
|
||||
hns_roce_cmd_use_polling(hr_dev);
|
||||
}
|
||||
}
|
||||
|
||||
ret = hns_roce_init_hem(hr_dev);
|
||||
|
|
|
@ -530,8 +530,8 @@ static void __cache_work_func(struct mlx5_cache_ent *ent)
|
|||
*/
|
||||
spin_unlock_irq(&ent->lock);
|
||||
need_delay = need_resched() || someone_adding(cache) ||
|
||||
time_after(jiffies,
|
||||
READ_ONCE(cache->last_add) + 300 * HZ);
|
||||
!time_after(jiffies,
|
||||
READ_ONCE(cache->last_add) + 300 * HZ);
|
||||
spin_lock_irq(&ent->lock);
|
||||
if (ent->disabled)
|
||||
goto out;
|
||||
|
|
|
@ -403,7 +403,7 @@ struct icc_path *devm_of_icc_get(struct device *dev, const char *name)
|
|||
{
|
||||
struct icc_path **ptr, *path;
|
||||
|
||||
ptr = devres_alloc(devm_icc_release, sizeof(**ptr), GFP_KERNEL);
|
||||
ptr = devres_alloc(devm_icc_release, sizeof(*ptr), GFP_KERNEL);
|
||||
if (!ptr)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
|
@ -973,9 +973,14 @@ void icc_node_add(struct icc_node *node, struct icc_provider *provider)
|
|||
}
|
||||
node->avg_bw = node->init_avg;
|
||||
node->peak_bw = node->init_peak;
|
||||
|
||||
if (provider->pre_aggregate)
|
||||
provider->pre_aggregate(node);
|
||||
|
||||
if (provider->aggregate)
|
||||
provider->aggregate(node, 0, node->init_avg, node->init_peak,
|
||||
&node->avg_bw, &node->peak_bw);
|
||||
|
||||
provider->set(node, node);
|
||||
node->avg_bw = 0;
|
||||
node->peak_bw = 0;
|
||||
|
@ -1106,6 +1111,8 @@ void icc_sync_state(struct device *dev)
|
|||
dev_dbg(p->dev, "interconnect provider is in synced state\n");
|
||||
list_for_each_entry(n, &p->nodes, node_list) {
|
||||
if (n->init_avg || n->init_peak) {
|
||||
n->init_avg = 0;
|
||||
n->init_peak = 0;
|
||||
aggregate_requests(n);
|
||||
p->set(n, n);
|
||||
}
|
||||
|
|
|
@ -57,6 +57,11 @@ int qcom_icc_aggregate(struct icc_node *node, u32 tag, u32 avg_bw,
|
|||
qn->sum_avg[i] += avg_bw;
|
||||
qn->max_peak[i] = max_t(u32, qn->max_peak[i], peak_bw);
|
||||
}
|
||||
|
||||
if (node->init_avg || node->init_peak) {
|
||||
qn->sum_avg[i] = max_t(u64, qn->sum_avg[i], node->init_avg);
|
||||
qn->max_peak[i] = max_t(u64, qn->max_peak[i], node->init_peak);
|
||||
}
|
||||
}
|
||||
|
||||
*agg_avg += avg_bw;
|
||||
|
@ -79,7 +84,6 @@ EXPORT_SYMBOL_GPL(qcom_icc_aggregate);
|
|||
int qcom_icc_set(struct icc_node *src, struct icc_node *dst)
|
||||
{
|
||||
struct qcom_icc_provider *qp;
|
||||
struct qcom_icc_node *qn;
|
||||
struct icc_node *node;
|
||||
|
||||
if (!src)
|
||||
|
@ -88,12 +92,6 @@ int qcom_icc_set(struct icc_node *src, struct icc_node *dst)
|
|||
node = src;
|
||||
|
||||
qp = to_qcom_provider(node->provider);
|
||||
qn = node->data;
|
||||
|
||||
qn->sum_avg[QCOM_ICC_BUCKET_AMC] = max_t(u64, qn->sum_avg[QCOM_ICC_BUCKET_AMC],
|
||||
node->avg_bw);
|
||||
qn->max_peak[QCOM_ICC_BUCKET_AMC] = max_t(u64, qn->max_peak[QCOM_ICC_BUCKET_AMC],
|
||||
node->peak_bw);
|
||||
|
||||
qcom_icc_bcm_voter_commit(qp->voter);
|
||||
|
||||
|
|
|
@ -472,8 +472,6 @@ static void raid1_end_write_request(struct bio *bio)
|
|||
/*
|
||||
* When the device is faulty, it is not necessary to
|
||||
* handle write error.
|
||||
* For failfast, this is the only remaining device,
|
||||
* We need to retry the write without FailFast.
|
||||
*/
|
||||
if (!test_bit(Faulty, &rdev->flags))
|
||||
set_bit(R1BIO_WriteError, &r1_bio->state);
|
||||
|
|
|
@ -469,12 +469,12 @@ static void raid10_end_write_request(struct bio *bio)
|
|||
/*
|
||||
* When the device is faulty, it is not necessary to
|
||||
* handle write error.
|
||||
* For failfast, this is the only remaining device,
|
||||
* We need to retry the write without FailFast.
|
||||
*/
|
||||
if (!test_bit(Faulty, &rdev->flags))
|
||||
set_bit(R10BIO_WriteError, &r10_bio->state);
|
||||
else {
|
||||
/* Fail the request */
|
||||
set_bit(R10BIO_Degraded, &r10_bio->state);
|
||||
r10_bio->devs[slot].bio = NULL;
|
||||
to_put = bio;
|
||||
dec_rdev = 1;
|
||||
|
|
|
@ -1573,6 +1573,7 @@ int vb2_core_qbuf(struct vb2_queue *q, unsigned int index, void *pb,
|
|||
struct media_request *req)
|
||||
{
|
||||
struct vb2_buffer *vb;
|
||||
enum vb2_buffer_state orig_state;
|
||||
int ret;
|
||||
|
||||
if (q->error) {
|
||||
|
@ -1673,6 +1674,7 @@ int vb2_core_qbuf(struct vb2_queue *q, unsigned int index, void *pb,
|
|||
* Add to the queued buffers list, a buffer will stay on it until
|
||||
* dequeued in dqbuf.
|
||||
*/
|
||||
orig_state = vb->state;
|
||||
list_add_tail(&vb->queued_entry, &q->queued_list);
|
||||
q->queued_count++;
|
||||
q->waiting_for_buffers = false;
|
||||
|
@ -1703,8 +1705,17 @@ int vb2_core_qbuf(struct vb2_queue *q, unsigned int index, void *pb,
|
|||
if (q->streaming && !q->start_streaming_called &&
|
||||
q->queued_count >= q->min_buffers_needed) {
|
||||
ret = vb2_start_streaming(q);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
/*
|
||||
* Since vb2_core_qbuf will return with an error,
|
||||
* we should return it to state DEQUEUED since
|
||||
* the error indicates that the buffer wasn't queued.
|
||||
*/
|
||||
list_del(&vb->queued_entry);
|
||||
q->queued_count--;
|
||||
vb->state = orig_state;
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
dprintk(q, 2, "qbuf of buffer %d succeeded\n", vb->index);
|
||||
|
|
|
@ -37,7 +37,16 @@ static int rtl28xxu_ctrl_msg(struct dvb_usb_device *d, struct rtl28xxu_req *req)
|
|||
} else {
|
||||
/* read */
|
||||
requesttype = (USB_TYPE_VENDOR | USB_DIR_IN);
|
||||
pipe = usb_rcvctrlpipe(d->udev, 0);
|
||||
|
||||
/*
|
||||
* Zero-length transfers must use usb_sndctrlpipe() and
|
||||
* rtl28xxu_identify_state() uses a zero-length i2c read
|
||||
* command to determine the chip type.
|
||||
*/
|
||||
if (req->size)
|
||||
pipe = usb_rcvctrlpipe(d->udev, 0);
|
||||
else
|
||||
pipe = usb_sndctrlpipe(d->udev, 0);
|
||||
}
|
||||
|
||||
ret = usb_control_msg(d->udev, pipe, 0, requesttype, req->value,
|
||||
|
|
|
@ -837,16 +837,24 @@ static int ar9331_mdio_write(void *ctx, u32 reg, u32 val)
|
|||
return 0;
|
||||
}
|
||||
|
||||
ret = __ar9331_mdio_write(sbus, AR9331_SW_MDIO_PHY_MODE_REG, reg, val);
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
|
||||
/* In case of this switch we work with 32bit registers on top of 16bit
|
||||
* bus. Some registers (for example access to forwarding database) have
|
||||
* trigger bit on the first 16bit half of request, the result and
|
||||
* configuration of request in the second half.
|
||||
* To make it work properly, we should do the second part of transfer
|
||||
* before the first one is done.
|
||||
*/
|
||||
ret = __ar9331_mdio_write(sbus, AR9331_SW_MDIO_PHY_MODE_REG, reg + 2,
|
||||
val >> 16);
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
|
||||
ret = __ar9331_mdio_write(sbus, AR9331_SW_MDIO_PHY_MODE_REG, reg, val);
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
|
||||
return 0;
|
||||
|
||||
error:
|
||||
dev_err_ratelimited(&sbus->dev, "Bus error. Failed to write register.\n");
|
||||
return ret;
|
||||
|
|
|
@ -1308,10 +1308,11 @@ static int sja1105et_is_fdb_entry_in_bin(struct sja1105_private *priv, int bin,
|
|||
int sja1105et_fdb_add(struct dsa_switch *ds, int port,
|
||||
const unsigned char *addr, u16 vid)
|
||||
{
|
||||
struct sja1105_l2_lookup_entry l2_lookup = {0};
|
||||
struct sja1105_l2_lookup_entry l2_lookup = {0}, tmp;
|
||||
struct sja1105_private *priv = ds->priv;
|
||||
struct device *dev = ds->dev;
|
||||
int last_unused = -1;
|
||||
int start, end, i;
|
||||
int bin, way, rc;
|
||||
|
||||
bin = sja1105et_fdb_hash(priv, addr, vid);
|
||||
|
@ -1323,7 +1324,7 @@ int sja1105et_fdb_add(struct dsa_switch *ds, int port,
|
|||
* mask? If yes, we need to do nothing. If not, we need
|
||||
* to rewrite the entry by adding this port to it.
|
||||
*/
|
||||
if (l2_lookup.destports & BIT(port))
|
||||
if ((l2_lookup.destports & BIT(port)) && l2_lookup.lockeds)
|
||||
return 0;
|
||||
l2_lookup.destports |= BIT(port);
|
||||
} else {
|
||||
|
@ -1354,6 +1355,7 @@ int sja1105et_fdb_add(struct dsa_switch *ds, int port,
|
|||
index, NULL, false);
|
||||
}
|
||||
}
|
||||
l2_lookup.lockeds = true;
|
||||
l2_lookup.index = sja1105et_fdb_index(bin, way);
|
||||
|
||||
rc = sja1105_dynamic_config_write(priv, BLK_IDX_L2_LOOKUP,
|
||||
|
@ -1362,6 +1364,29 @@ int sja1105et_fdb_add(struct dsa_switch *ds, int port,
|
|||
if (rc < 0)
|
||||
return rc;
|
||||
|
||||
/* Invalidate a dynamically learned entry if that exists */
|
||||
start = sja1105et_fdb_index(bin, 0);
|
||||
end = sja1105et_fdb_index(bin, way);
|
||||
|
||||
for (i = start; i < end; i++) {
|
||||
rc = sja1105_dynamic_config_read(priv, BLK_IDX_L2_LOOKUP,
|
||||
i, &tmp);
|
||||
if (rc == -ENOENT)
|
||||
continue;
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
if (tmp.macaddr != ether_addr_to_u64(addr) || tmp.vlanid != vid)
|
||||
continue;
|
||||
|
||||
rc = sja1105_dynamic_config_write(priv, BLK_IDX_L2_LOOKUP,
|
||||
i, NULL, false);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
return sja1105_static_fdb_change(priv, port, &l2_lookup, true);
|
||||
}
|
||||
|
||||
|
@ -1403,32 +1428,30 @@ int sja1105et_fdb_del(struct dsa_switch *ds, int port,
|
|||
int sja1105pqrs_fdb_add(struct dsa_switch *ds, int port,
|
||||
const unsigned char *addr, u16 vid)
|
||||
{
|
||||
struct sja1105_l2_lookup_entry l2_lookup = {0};
|
||||
struct sja1105_l2_lookup_entry l2_lookup = {0}, tmp;
|
||||
struct sja1105_private *priv = ds->priv;
|
||||
int rc, i;
|
||||
|
||||
/* Search for an existing entry in the FDB table */
|
||||
l2_lookup.macaddr = ether_addr_to_u64(addr);
|
||||
l2_lookup.vlanid = vid;
|
||||
l2_lookup.iotag = SJA1105_S_TAG;
|
||||
l2_lookup.mask_macaddr = GENMASK_ULL(ETH_ALEN * 8 - 1, 0);
|
||||
if (priv->vlan_state != SJA1105_VLAN_UNAWARE) {
|
||||
l2_lookup.mask_vlanid = VLAN_VID_MASK;
|
||||
l2_lookup.mask_iotag = BIT(0);
|
||||
} else {
|
||||
l2_lookup.mask_vlanid = 0;
|
||||
l2_lookup.mask_iotag = 0;
|
||||
}
|
||||
l2_lookup.mask_vlanid = VLAN_VID_MASK;
|
||||
l2_lookup.destports = BIT(port);
|
||||
|
||||
tmp = l2_lookup;
|
||||
|
||||
rc = sja1105_dynamic_config_read(priv, BLK_IDX_L2_LOOKUP,
|
||||
SJA1105_SEARCH, &l2_lookup);
|
||||
if (rc == 0) {
|
||||
/* Found and this port is already in the entry's
|
||||
SJA1105_SEARCH, &tmp);
|
||||
if (rc == 0 && tmp.index != SJA1105_MAX_L2_LOOKUP_COUNT - 1) {
|
||||
/* Found a static entry and this port is already in the entry's
|
||||
* port mask => job done
|
||||
*/
|
||||
if (l2_lookup.destports & BIT(port))
|
||||
if ((tmp.destports & BIT(port)) && tmp.lockeds)
|
||||
return 0;
|
||||
|
||||
l2_lookup = tmp;
|
||||
|
||||
/* l2_lookup.index is populated by the switch in case it
|
||||
* found something.
|
||||
*/
|
||||
|
@ -1450,16 +1473,46 @@ int sja1105pqrs_fdb_add(struct dsa_switch *ds, int port,
|
|||
dev_err(ds->dev, "FDB is full, cannot add entry.\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
l2_lookup.lockeds = true;
|
||||
l2_lookup.index = i;
|
||||
|
||||
skip_finding_an_index:
|
||||
l2_lookup.lockeds = true;
|
||||
|
||||
rc = sja1105_dynamic_config_write(priv, BLK_IDX_L2_LOOKUP,
|
||||
l2_lookup.index, &l2_lookup,
|
||||
true);
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
|
||||
/* The switch learns dynamic entries and looks up the FDB left to
|
||||
* right. It is possible that our addition was concurrent with the
|
||||
* dynamic learning of the same address, so now that the static entry
|
||||
* has been installed, we are certain that address learning for this
|
||||
* particular address has been turned off, so the dynamic entry either
|
||||
* is in the FDB at an index smaller than the static one, or isn't (it
|
||||
* can also be at a larger index, but in that case it is inactive
|
||||
* because the static FDB entry will match first, and the dynamic one
|
||||
* will eventually age out). Search for a dynamically learned address
|
||||
* prior to our static one and invalidate it.
|
||||
*/
|
||||
tmp = l2_lookup;
|
||||
|
||||
rc = sja1105_dynamic_config_read(priv, BLK_IDX_L2_LOOKUP,
|
||||
SJA1105_SEARCH, &tmp);
|
||||
if (rc < 0) {
|
||||
dev_err(ds->dev,
|
||||
"port %d failed to read back entry for %pM vid %d: %pe\n",
|
||||
port, addr, vid, ERR_PTR(rc));
|
||||
return rc;
|
||||
}
|
||||
|
||||
if (tmp.index < l2_lookup.index) {
|
||||
rc = sja1105_dynamic_config_write(priv, BLK_IDX_L2_LOOKUP,
|
||||
tmp.index, NULL, false);
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
}
|
||||
|
||||
return sja1105_static_fdb_change(priv, port, &l2_lookup, true);
|
||||
}
|
||||
|
||||
|
@ -1473,15 +1526,8 @@ int sja1105pqrs_fdb_del(struct dsa_switch *ds, int port,
|
|||
|
||||
l2_lookup.macaddr = ether_addr_to_u64(addr);
|
||||
l2_lookup.vlanid = vid;
|
||||
l2_lookup.iotag = SJA1105_S_TAG;
|
||||
l2_lookup.mask_macaddr = GENMASK_ULL(ETH_ALEN * 8 - 1, 0);
|
||||
if (priv->vlan_state != SJA1105_VLAN_UNAWARE) {
|
||||
l2_lookup.mask_vlanid = VLAN_VID_MASK;
|
||||
l2_lookup.mask_iotag = BIT(0);
|
||||
} else {
|
||||
l2_lookup.mask_vlanid = 0;
|
||||
l2_lookup.mask_iotag = 0;
|
||||
}
|
||||
l2_lookup.mask_vlanid = VLAN_VID_MASK;
|
||||
l2_lookup.destports = BIT(port);
|
||||
|
||||
rc = sja1105_dynamic_config_read(priv, BLK_IDX_L2_LOOKUP,
|
||||
|
|
|
@ -2669,7 +2669,8 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode)
|
|||
}
|
||||
|
||||
/* Allocated memory for FW statistics */
|
||||
if (bnx2x_alloc_fw_stats_mem(bp))
|
||||
rc = bnx2x_alloc_fw_stats_mem(bp);
|
||||
if (rc)
|
||||
LOAD_ERROR_EXIT(bp, load_error0);
|
||||
|
||||
/* request pf to initialize status blocks */
|
||||
|
|
|
@ -3843,13 +3843,13 @@ fec_drv_remove(struct platform_device *pdev)
|
|||
if (of_phy_is_fixed_link(np))
|
||||
of_phy_deregister_fixed_link(np);
|
||||
of_node_put(fep->phy_node);
|
||||
free_netdev(ndev);
|
||||
|
||||
clk_disable_unprepare(fep->clk_ahb);
|
||||
clk_disable_unprepare(fep->clk_ipg);
|
||||
pm_runtime_put_noidle(&pdev->dev);
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
|
||||
free_netdev(ndev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -819,7 +819,7 @@ static int natsemi_probe1(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
printk(version);
|
||||
#endif
|
||||
|
||||
i = pci_enable_device(pdev);
|
||||
i = pcim_enable_device(pdev);
|
||||
if (i) return i;
|
||||
|
||||
/* natsemi has a non-standard PM control register
|
||||
|
@ -852,7 +852,7 @@ static int natsemi_probe1(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
ioaddr = ioremap(iostart, iosize);
|
||||
if (!ioaddr) {
|
||||
i = -ENOMEM;
|
||||
goto err_ioremap;
|
||||
goto err_pci_request_regions;
|
||||
}
|
||||
|
||||
/* Work around the dropped serial bit. */
|
||||
|
@ -974,9 +974,6 @@ static int natsemi_probe1(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
err_register_netdev:
|
||||
iounmap(ioaddr);
|
||||
|
||||
err_ioremap:
|
||||
pci_release_regions(pdev);
|
||||
|
||||
err_pci_request_regions:
|
||||
free_netdev(dev);
|
||||
return i;
|
||||
|
@ -3241,7 +3238,6 @@ static void natsemi_remove1(struct pci_dev *pdev)
|
|||
|
||||
NATSEMI_REMOVE_FILE(pdev, dspcfg_workaround);
|
||||
unregister_netdev (dev);
|
||||
pci_release_regions (pdev);
|
||||
iounmap(ioaddr);
|
||||
free_netdev (dev);
|
||||
}
|
||||
|
|
|
@ -3527,13 +3527,13 @@ static void vxge_device_unregister(struct __vxge_hw_device *hldev)
|
|||
|
||||
kfree(vdev->vpaths);
|
||||
|
||||
/* we are safe to free it now */
|
||||
free_netdev(dev);
|
||||
|
||||
vxge_debug_init(vdev->level_trace, "%s: ethernet device unregistered",
|
||||
buf);
|
||||
vxge_debug_entryexit(vdev->level_trace, "%s: %s:%d Exiting...", buf,
|
||||
__func__, __LINE__);
|
||||
|
||||
/* we are safe to free it now */
|
||||
free_netdev(dev);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -286,6 +286,8 @@ nfp_net_get_link_ksettings(struct net_device *netdev,
|
|||
|
||||
/* Init to unknowns */
|
||||
ethtool_link_ksettings_add_link_mode(cmd, supported, FIBRE);
|
||||
ethtool_link_ksettings_add_link_mode(cmd, supported, Pause);
|
||||
ethtool_link_ksettings_add_link_mode(cmd, advertising, Pause);
|
||||
cmd->base.port = PORT_OTHER;
|
||||
cmd->base.speed = SPEED_UNKNOWN;
|
||||
cmd->base.duplex = DUPLEX_UNKNOWN;
|
||||
|
|
|
@ -831,7 +831,7 @@ int qede_configure_vlan_filters(struct qede_dev *edev)
|
|||
int qede_vlan_rx_kill_vid(struct net_device *dev, __be16 proto, u16 vid)
|
||||
{
|
||||
struct qede_dev *edev = netdev_priv(dev);
|
||||
struct qede_vlan *vlan = NULL;
|
||||
struct qede_vlan *vlan;
|
||||
int rc = 0;
|
||||
|
||||
DP_VERBOSE(edev, NETIF_MSG_IFDOWN, "Removing vlan 0x%04x\n", vid);
|
||||
|
@ -842,7 +842,7 @@ int qede_vlan_rx_kill_vid(struct net_device *dev, __be16 proto, u16 vid)
|
|||
if (vlan->vid == vid)
|
||||
break;
|
||||
|
||||
if (!vlan || (vlan->vid != vid)) {
|
||||
if (list_entry_is_head(vlan, &edev->vlan_list, list)) {
|
||||
DP_VERBOSE(edev, (NETIF_MSG_IFUP | NETIF_MSG_IFDOWN),
|
||||
"Vlan isn't configured\n");
|
||||
goto out;
|
||||
|
|
|
@ -154,7 +154,7 @@ static int ql_wait_for_drvr_lock(struct ql3_adapter *qdev)
|
|||
"driver lock acquired\n");
|
||||
return 1;
|
||||
}
|
||||
ssleep(1);
|
||||
mdelay(1000);
|
||||
} while (++i < 10);
|
||||
|
||||
netdev_err(qdev->ndev, "Timed out waiting for driver lock...\n");
|
||||
|
@ -3274,7 +3274,7 @@ static int ql_adapter_reset(struct ql3_adapter *qdev)
|
|||
if ((value & ISP_CONTROL_SR) == 0)
|
||||
break;
|
||||
|
||||
ssleep(1);
|
||||
mdelay(1000);
|
||||
} while ((--max_wait_time));
|
||||
|
||||
/*
|
||||
|
@ -3310,7 +3310,7 @@ static int ql_adapter_reset(struct ql3_adapter *qdev)
|
|||
ispControlStatus);
|
||||
if ((value & ISP_CONTROL_FSR) == 0)
|
||||
break;
|
||||
ssleep(1);
|
||||
mdelay(1000);
|
||||
} while ((--max_wait_time));
|
||||
}
|
||||
if (max_wait_time == 0)
|
||||
|
|
|
@ -2060,8 +2060,12 @@ static void am65_cpsw_port_offload_fwd_mark_update(struct am65_cpsw_common *comm
|
|||
|
||||
for (i = 1; i <= common->port_num; i++) {
|
||||
struct am65_cpsw_port *port = am65_common_get_port(common, i);
|
||||
struct am65_cpsw_ndev_priv *priv = am65_ndev_to_priv(port->ndev);
|
||||
struct am65_cpsw_ndev_priv *priv;
|
||||
|
||||
if (!port->ndev)
|
||||
continue;
|
||||
|
||||
priv = am65_ndev_to_priv(port->ndev);
|
||||
priv->offload_fwd_mark = set_val;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -382,11 +382,11 @@ static int ksz8041_config_aneg(struct phy_device *phydev)
|
|||
}
|
||||
|
||||
static int ksz8051_ksz8795_match_phy_device(struct phy_device *phydev,
|
||||
const u32 ksz_phy_id)
|
||||
const bool ksz_8051)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if ((phydev->phy_id & MICREL_PHY_ID_MASK) != ksz_phy_id)
|
||||
if ((phydev->phy_id & MICREL_PHY_ID_MASK) != PHY_ID_KSZ8051)
|
||||
return 0;
|
||||
|
||||
ret = phy_read(phydev, MII_BMSR);
|
||||
|
@ -399,7 +399,7 @@ static int ksz8051_ksz8795_match_phy_device(struct phy_device *phydev,
|
|||
* the switch does not.
|
||||
*/
|
||||
ret &= BMSR_ERCAP;
|
||||
if (ksz_phy_id == PHY_ID_KSZ8051)
|
||||
if (ksz_8051)
|
||||
return ret;
|
||||
else
|
||||
return !ret;
|
||||
|
@ -407,7 +407,7 @@ static int ksz8051_ksz8795_match_phy_device(struct phy_device *phydev,
|
|||
|
||||
static int ksz8051_match_phy_device(struct phy_device *phydev)
|
||||
{
|
||||
return ksz8051_ksz8795_match_phy_device(phydev, PHY_ID_KSZ8051);
|
||||
return ksz8051_ksz8795_match_phy_device(phydev, true);
|
||||
}
|
||||
|
||||
static int ksz8081_config_init(struct phy_device *phydev)
|
||||
|
@ -435,7 +435,7 @@ static int ksz8061_config_init(struct phy_device *phydev)
|
|||
|
||||
static int ksz8795_match_phy_device(struct phy_device *phydev)
|
||||
{
|
||||
return ksz8051_ksz8795_match_phy_device(phydev, PHY_ID_KSZ87XX);
|
||||
return ksz8051_ksz8795_match_phy_device(phydev, false);
|
||||
}
|
||||
|
||||
static int ksz9021_load_values_from_of(struct phy_device *phydev,
|
||||
|
|
|
@ -735,12 +735,16 @@ static inline void disable_net_traffic(pegasus_t *pegasus)
|
|||
set_registers(pegasus, EthCtrl0, sizeof(tmp), &tmp);
|
||||
}
|
||||
|
||||
static inline void get_interrupt_interval(pegasus_t *pegasus)
|
||||
static inline int get_interrupt_interval(pegasus_t *pegasus)
|
||||
{
|
||||
u16 data;
|
||||
u8 interval;
|
||||
int ret;
|
||||
|
||||
ret = read_eprom_word(pegasus, 4, &data);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
read_eprom_word(pegasus, 4, &data);
|
||||
interval = data >> 8;
|
||||
if (pegasus->usb->speed != USB_SPEED_HIGH) {
|
||||
if (interval < 0x80) {
|
||||
|
@ -755,6 +759,8 @@ static inline void get_interrupt_interval(pegasus_t *pegasus)
|
|||
}
|
||||
}
|
||||
pegasus->intr_interval = interval;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void set_carrier(struct net_device *net)
|
||||
|
@ -1149,7 +1155,9 @@ static int pegasus_probe(struct usb_interface *intf,
|
|||
| NETIF_MSG_PROBE | NETIF_MSG_LINK);
|
||||
|
||||
pegasus->features = usb_dev_id[dev_index].private;
|
||||
get_interrupt_interval(pegasus);
|
||||
res = get_interrupt_interval(pegasus);
|
||||
if (res)
|
||||
goto out2;
|
||||
if (reset_mac(pegasus)) {
|
||||
dev_err(&intf->dev, "can't reset MAC\n");
|
||||
res = -EIO;
|
||||
|
|
|
@ -136,6 +136,29 @@ static struct ieee80211_supported_band band_5ghz = {
|
|||
/* Assigned at module init. Guaranteed locally-administered and unicast. */
|
||||
static u8 fake_router_bssid[ETH_ALEN] __ro_after_init = {};
|
||||
|
||||
static void virt_wifi_inform_bss(struct wiphy *wiphy)
|
||||
{
|
||||
u64 tsf = div_u64(ktime_get_boottime_ns(), 1000);
|
||||
struct cfg80211_bss *informed_bss;
|
||||
static const struct {
|
||||
u8 tag;
|
||||
u8 len;
|
||||
u8 ssid[8];
|
||||
} __packed ssid = {
|
||||
.tag = WLAN_EID_SSID,
|
||||
.len = 8,
|
||||
.ssid = "VirtWifi",
|
||||
};
|
||||
|
||||
informed_bss = cfg80211_inform_bss(wiphy, &channel_5ghz,
|
||||
CFG80211_BSS_FTYPE_PRESP,
|
||||
fake_router_bssid, tsf,
|
||||
WLAN_CAPABILITY_ESS, 0,
|
||||
(void *)&ssid, sizeof(ssid),
|
||||
DBM_TO_MBM(-50), GFP_KERNEL);
|
||||
cfg80211_put_bss(wiphy, informed_bss);
|
||||
}
|
||||
|
||||
/* Called with the rtnl lock held. */
|
||||
static int virt_wifi_scan(struct wiphy *wiphy,
|
||||
struct cfg80211_scan_request *request)
|
||||
|
@ -156,28 +179,13 @@ static int virt_wifi_scan(struct wiphy *wiphy,
|
|||
/* Acquires and releases the rdev BSS lock. */
|
||||
static void virt_wifi_scan_result(struct work_struct *work)
|
||||
{
|
||||
struct {
|
||||
u8 tag;
|
||||
u8 len;
|
||||
u8 ssid[8];
|
||||
} __packed ssid = {
|
||||
.tag = WLAN_EID_SSID, .len = 8, .ssid = "VirtWifi",
|
||||
};
|
||||
struct cfg80211_bss *informed_bss;
|
||||
struct virt_wifi_wiphy_priv *priv =
|
||||
container_of(work, struct virt_wifi_wiphy_priv,
|
||||
scan_result.work);
|
||||
struct wiphy *wiphy = priv_to_wiphy(priv);
|
||||
struct cfg80211_scan_info scan_info = { .aborted = false };
|
||||
u64 tsf = div_u64(ktime_get_boottime_ns(), 1000);
|
||||
|
||||
informed_bss = cfg80211_inform_bss(wiphy, &channel_5ghz,
|
||||
CFG80211_BSS_FTYPE_PRESP,
|
||||
fake_router_bssid, tsf,
|
||||
WLAN_CAPABILITY_ESS, 0,
|
||||
(void *)&ssid, sizeof(ssid),
|
||||
DBM_TO_MBM(-50), GFP_KERNEL);
|
||||
cfg80211_put_bss(wiphy, informed_bss);
|
||||
virt_wifi_inform_bss(wiphy);
|
||||
|
||||
/* Schedules work which acquires and releases the rtnl lock. */
|
||||
cfg80211_scan_done(priv->scan_request, &scan_info);
|
||||
|
@ -225,10 +233,12 @@ static int virt_wifi_connect(struct wiphy *wiphy, struct net_device *netdev,
|
|||
if (!could_schedule)
|
||||
return -EBUSY;
|
||||
|
||||
if (sme->bssid)
|
||||
if (sme->bssid) {
|
||||
ether_addr_copy(priv->connect_requested_bss, sme->bssid);
|
||||
else
|
||||
} else {
|
||||
virt_wifi_inform_bss(wiphy);
|
||||
eth_zero_addr(priv->connect_requested_bss);
|
||||
}
|
||||
|
||||
wiphy_debug(wiphy, "connect\n");
|
||||
|
||||
|
@ -241,11 +251,13 @@ static void virt_wifi_connect_complete(struct work_struct *work)
|
|||
struct virt_wifi_netdev_priv *priv =
|
||||
container_of(work, struct virt_wifi_netdev_priv, connect.work);
|
||||
u8 *requested_bss = priv->connect_requested_bss;
|
||||
bool has_addr = !is_zero_ether_addr(requested_bss);
|
||||
bool right_addr = ether_addr_equal(requested_bss, fake_router_bssid);
|
||||
u16 status = WLAN_STATUS_SUCCESS;
|
||||
|
||||
if (!priv->is_up || (has_addr && !right_addr))
|
||||
if (is_zero_ether_addr(requested_bss))
|
||||
requested_bss = NULL;
|
||||
|
||||
if (!priv->is_up || (requested_bss && !right_addr))
|
||||
status = WLAN_STATUS_UNSPECIFIED_FAILURE;
|
||||
else
|
||||
priv->is_connected = true;
|
||||
|
|
|
@ -112,6 +112,7 @@ static int i82092aa_pci_probe(struct pci_dev *dev,
|
|||
for (i = 0; i < socket_count; i++) {
|
||||
sockets[i].card_state = 1; /* 1 = present but empty */
|
||||
sockets[i].io_base = pci_resource_start(dev, 0);
|
||||
sockets[i].dev = dev;
|
||||
sockets[i].socket.features |= SS_CAP_PCCARD;
|
||||
sockets[i].socket.map_size = 0x1000;
|
||||
sockets[i].socket.irq_mask = 0;
|
||||
|
|
|
@ -141,6 +141,7 @@ static u8 gigabyte_wmi_detect_sensor_usability(struct wmi_device *wdev)
|
|||
|
||||
static const struct dmi_system_id gigabyte_wmi_known_working_platforms[] = {
|
||||
DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME("B550 AORUS ELITE"),
|
||||
DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME("B550 AORUS ELITE V2"),
|
||||
DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME("B550 GAMING X V2"),
|
||||
DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME("B550M AORUS PRO-P"),
|
||||
DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME("B550M DS3H"),
|
||||
|
|
|
@ -1004,15 +1004,23 @@ static unsigned char dasd_eckd_path_access(void *conf_data, int conf_len)
|
|||
static void dasd_eckd_store_conf_data(struct dasd_device *device,
|
||||
struct dasd_conf_data *conf_data, int chp)
|
||||
{
|
||||
struct dasd_eckd_private *private = device->private;
|
||||
struct channel_path_desc_fmt0 *chp_desc;
|
||||
struct subchannel_id sch_id;
|
||||
void *cdp;
|
||||
|
||||
ccw_device_get_schid(device->cdev, &sch_id);
|
||||
/*
|
||||
* path handling and read_conf allocate data
|
||||
* free it before replacing the pointer
|
||||
* also replace the old private->conf_data pointer
|
||||
* with the new one if this points to the same data
|
||||
*/
|
||||
kfree(device->path[chp].conf_data);
|
||||
cdp = device->path[chp].conf_data;
|
||||
if (private->conf_data == cdp) {
|
||||
private->conf_data = (void *)conf_data;
|
||||
dasd_eckd_identify_conf_parts(private);
|
||||
}
|
||||
ccw_device_get_schid(device->cdev, &sch_id);
|
||||
device->path[chp].conf_data = conf_data;
|
||||
device->path[chp].cssid = sch_id.cssid;
|
||||
device->path[chp].ssid = sch_id.ssid;
|
||||
|
@ -1020,6 +1028,7 @@ static void dasd_eckd_store_conf_data(struct dasd_device *device,
|
|||
if (chp_desc)
|
||||
device->path[chp].chpid = chp_desc->chpid;
|
||||
kfree(chp_desc);
|
||||
kfree(cdp);
|
||||
}
|
||||
|
||||
static void dasd_eckd_clear_conf_data(struct dasd_device *device)
|
||||
|
|
|
@ -804,6 +804,13 @@ static int ibmvfc_init_event_pool(struct ibmvfc_host *vhost,
|
|||
for (i = 0; i < size; ++i) {
|
||||
struct ibmvfc_event *evt = &pool->events[i];
|
||||
|
||||
/*
|
||||
* evt->active states
|
||||
* 1 = in flight
|
||||
* 0 = being completed
|
||||
* -1 = free/freed
|
||||
*/
|
||||
atomic_set(&evt->active, -1);
|
||||
atomic_set(&evt->free, 1);
|
||||
evt->crq.valid = 0x80;
|
||||
evt->crq.ioba = cpu_to_be64(pool->iu_token + (sizeof(*evt->xfer_iu) * i));
|
||||
|
@ -1014,6 +1021,7 @@ static void ibmvfc_free_event(struct ibmvfc_event *evt)
|
|||
|
||||
BUG_ON(!ibmvfc_valid_event(pool, evt));
|
||||
BUG_ON(atomic_inc_return(&evt->free) != 1);
|
||||
BUG_ON(atomic_dec_and_test(&evt->active));
|
||||
|
||||
spin_lock_irqsave(&evt->queue->l_lock, flags);
|
||||
list_add_tail(&evt->queue_list, &evt->queue->free);
|
||||
|
@ -1069,6 +1077,12 @@ static void ibmvfc_complete_purge(struct list_head *purge_list)
|
|||
**/
|
||||
static void ibmvfc_fail_request(struct ibmvfc_event *evt, int error_code)
|
||||
{
|
||||
/*
|
||||
* Anything we are failing should still be active. Otherwise, it
|
||||
* implies we already got a response for the command and are doing
|
||||
* something bad like double completing it.
|
||||
*/
|
||||
BUG_ON(!atomic_dec_and_test(&evt->active));
|
||||
if (evt->cmnd) {
|
||||
evt->cmnd->result = (error_code << 16);
|
||||
evt->done = ibmvfc_scsi_eh_done;
|
||||
|
@ -1720,6 +1734,7 @@ static int ibmvfc_send_event(struct ibmvfc_event *evt,
|
|||
|
||||
evt->done(evt);
|
||||
} else {
|
||||
atomic_set(&evt->active, 1);
|
||||
spin_unlock_irqrestore(&evt->queue->l_lock, flags);
|
||||
ibmvfc_trc_start(evt);
|
||||
}
|
||||
|
@ -3248,7 +3263,7 @@ static void ibmvfc_handle_crq(struct ibmvfc_crq *crq, struct ibmvfc_host *vhost,
|
|||
return;
|
||||
}
|
||||
|
||||
if (unlikely(atomic_read(&evt->free))) {
|
||||
if (unlikely(atomic_dec_if_positive(&evt->active))) {
|
||||
dev_err(vhost->dev, "Received duplicate correlation_token 0x%08llx!\n",
|
||||
crq->ioba);
|
||||
return;
|
||||
|
@ -3775,7 +3790,7 @@ static void ibmvfc_handle_scrq(struct ibmvfc_crq *crq, struct ibmvfc_host *vhost
|
|||
return;
|
||||
}
|
||||
|
||||
if (unlikely(atomic_read(&evt->free))) {
|
||||
if (unlikely(atomic_dec_if_positive(&evt->active))) {
|
||||
dev_err(vhost->dev, "Received duplicate correlation_token 0x%08llx!\n",
|
||||
crq->ioba);
|
||||
return;
|
||||
|
|
|
@ -744,6 +744,7 @@ struct ibmvfc_event {
|
|||
struct ibmvfc_target *tgt;
|
||||
struct scsi_cmnd *cmnd;
|
||||
atomic_t free;
|
||||
atomic_t active;
|
||||
union ibmvfc_iu *xfer_iu;
|
||||
void (*done)(struct ibmvfc_event *evt);
|
||||
void (*_done)(struct ibmvfc_event *evt);
|
||||
|
|
|
@ -221,7 +221,7 @@ static unsigned int sr_get_events(struct scsi_device *sdev)
|
|||
else if (med->media_event_code == 2)
|
||||
return DISK_EVENT_MEDIA_CHANGE;
|
||||
else if (med->media_event_code == 3)
|
||||
return DISK_EVENT_EJECT_REQUEST;
|
||||
return DISK_EVENT_MEDIA_CHANGE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -5,8 +5,6 @@
|
|||
|
||||
#include <linux/init.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/nvmem-consumer.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/sys_soc.h>
|
||||
|
@ -31,7 +29,7 @@
|
|||
|
||||
struct imx8_soc_data {
|
||||
char *name;
|
||||
u32 (*soc_revision)(struct device *dev);
|
||||
u32 (*soc_revision)(void);
|
||||
};
|
||||
|
||||
static u64 soc_uid;
|
||||
|
@ -52,7 +50,7 @@ static u32 imx8mq_soc_revision_from_atf(void)
|
|||
static inline u32 imx8mq_soc_revision_from_atf(void) { return 0; };
|
||||
#endif
|
||||
|
||||
static u32 __init imx8mq_soc_revision(struct device *dev)
|
||||
static u32 __init imx8mq_soc_revision(void)
|
||||
{
|
||||
struct device_node *np;
|
||||
void __iomem *ocotp_base;
|
||||
|
@ -77,20 +75,9 @@ static u32 __init imx8mq_soc_revision(struct device *dev)
|
|||
rev = REV_B1;
|
||||
}
|
||||
|
||||
if (dev) {
|
||||
int ret;
|
||||
|
||||
ret = nvmem_cell_read_u64(dev, "soc_unique_id", &soc_uid);
|
||||
if (ret) {
|
||||
iounmap(ocotp_base);
|
||||
of_node_put(np);
|
||||
return ret;
|
||||
}
|
||||
} else {
|
||||
soc_uid = readl_relaxed(ocotp_base + OCOTP_UID_HIGH);
|
||||
soc_uid <<= 32;
|
||||
soc_uid |= readl_relaxed(ocotp_base + OCOTP_UID_LOW);
|
||||
}
|
||||
soc_uid = readl_relaxed(ocotp_base + OCOTP_UID_HIGH);
|
||||
soc_uid <<= 32;
|
||||
soc_uid |= readl_relaxed(ocotp_base + OCOTP_UID_LOW);
|
||||
|
||||
iounmap(ocotp_base);
|
||||
of_node_put(np);
|
||||
|
@ -120,7 +107,7 @@ static void __init imx8mm_soc_uid(void)
|
|||
of_node_put(np);
|
||||
}
|
||||
|
||||
static u32 __init imx8mm_soc_revision(struct device *dev)
|
||||
static u32 __init imx8mm_soc_revision(void)
|
||||
{
|
||||
struct device_node *np;
|
||||
void __iomem *anatop_base;
|
||||
|
@ -138,15 +125,7 @@ static u32 __init imx8mm_soc_revision(struct device *dev)
|
|||
iounmap(anatop_base);
|
||||
of_node_put(np);
|
||||
|
||||
if (dev) {
|
||||
int ret;
|
||||
|
||||
ret = nvmem_cell_read_u64(dev, "soc_unique_id", &soc_uid);
|
||||
if (ret)
|
||||
return ret;
|
||||
} else {
|
||||
imx8mm_soc_uid();
|
||||
}
|
||||
imx8mm_soc_uid();
|
||||
|
||||
return rev;
|
||||
}
|
||||
|
@ -171,7 +150,7 @@ static const struct imx8_soc_data imx8mp_soc_data = {
|
|||
.soc_revision = imx8mm_soc_revision,
|
||||
};
|
||||
|
||||
static __maybe_unused const struct of_device_id imx8_machine_match[] = {
|
||||
static __maybe_unused const struct of_device_id imx8_soc_match[] = {
|
||||
{ .compatible = "fsl,imx8mq", .data = &imx8mq_soc_data, },
|
||||
{ .compatible = "fsl,imx8mm", .data = &imx8mm_soc_data, },
|
||||
{ .compatible = "fsl,imx8mn", .data = &imx8mn_soc_data, },
|
||||
|
@ -179,20 +158,12 @@ static __maybe_unused const struct of_device_id imx8_machine_match[] = {
|
|||
{ }
|
||||
};
|
||||
|
||||
static __maybe_unused const struct of_device_id imx8_soc_match[] = {
|
||||
{ .compatible = "fsl,imx8mq-soc", .data = &imx8mq_soc_data, },
|
||||
{ .compatible = "fsl,imx8mm-soc", .data = &imx8mm_soc_data, },
|
||||
{ .compatible = "fsl,imx8mn-soc", .data = &imx8mn_soc_data, },
|
||||
{ .compatible = "fsl,imx8mp-soc", .data = &imx8mp_soc_data, },
|
||||
{ }
|
||||
};
|
||||
|
||||
#define imx8_revision(soc_rev) \
|
||||
soc_rev ? \
|
||||
kasprintf(GFP_KERNEL, "%d.%d", (soc_rev >> 4) & 0xf, soc_rev & 0xf) : \
|
||||
"unknown"
|
||||
|
||||
static int imx8_soc_info(struct platform_device *pdev)
|
||||
static int __init imx8_soc_init(void)
|
||||
{
|
||||
struct soc_device_attribute *soc_dev_attr;
|
||||
struct soc_device *soc_dev;
|
||||
|
@ -211,10 +182,7 @@ static int imx8_soc_info(struct platform_device *pdev)
|
|||
if (ret)
|
||||
goto free_soc;
|
||||
|
||||
if (pdev)
|
||||
id = of_match_node(imx8_soc_match, pdev->dev.of_node);
|
||||
else
|
||||
id = of_match_node(imx8_machine_match, of_root);
|
||||
id = of_match_node(imx8_soc_match, of_root);
|
||||
if (!id) {
|
||||
ret = -ENODEV;
|
||||
goto free_soc;
|
||||
|
@ -223,16 +191,8 @@ static int imx8_soc_info(struct platform_device *pdev)
|
|||
data = id->data;
|
||||
if (data) {
|
||||
soc_dev_attr->soc_id = data->name;
|
||||
if (data->soc_revision) {
|
||||
if (pdev) {
|
||||
soc_rev = data->soc_revision(&pdev->dev);
|
||||
ret = soc_rev;
|
||||
if (ret < 0)
|
||||
goto free_soc;
|
||||
} else {
|
||||
soc_rev = data->soc_revision(NULL);
|
||||
}
|
||||
}
|
||||
if (data->soc_revision)
|
||||
soc_rev = data->soc_revision();
|
||||
}
|
||||
|
||||
soc_dev_attr->revision = imx8_revision(soc_rev);
|
||||
|
@ -270,24 +230,4 @@ free_soc:
|
|||
kfree(soc_dev_attr);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Retain device_initcall is for backward compatibility with DTS. */
|
||||
static int __init imx8_soc_init(void)
|
||||
{
|
||||
if (of_find_matching_node_and_match(NULL, imx8_soc_match, NULL))
|
||||
return 0;
|
||||
|
||||
return imx8_soc_info(NULL);
|
||||
}
|
||||
device_initcall(imx8_soc_init);
|
||||
|
||||
static struct platform_driver imx8_soc_info_driver = {
|
||||
.probe = imx8_soc_info,
|
||||
.driver = {
|
||||
.name = "imx8_soc_info",
|
||||
.of_match_table = imx8_soc_match,
|
||||
},
|
||||
};
|
||||
|
||||
module_platform_driver(imx8_soc_info_driver);
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
|
|
@ -690,8 +690,8 @@ static int ixp4xx_npe_probe(struct platform_device *pdev)
|
|||
|
||||
if (!(ixp4xx_read_feature_bits() &
|
||||
(IXP4XX_FEATURE_RESET_NPEA << i))) {
|
||||
dev_info(dev, "NPE%d at 0x%08x-0x%08x not available\n",
|
||||
i, res->start, res->end);
|
||||
dev_info(dev, "NPE%d at %pR not available\n",
|
||||
i, res);
|
||||
continue; /* NPE already disabled or not present */
|
||||
}
|
||||
npe->regs = devm_ioremap_resource(dev, res);
|
||||
|
@ -699,13 +699,12 @@ static int ixp4xx_npe_probe(struct platform_device *pdev)
|
|||
return PTR_ERR(npe->regs);
|
||||
|
||||
if (npe_reset(npe)) {
|
||||
dev_info(dev, "NPE%d at 0x%08x-0x%08x does not reset\n",
|
||||
i, res->start, res->end);
|
||||
dev_info(dev, "NPE%d at %pR does not reset\n",
|
||||
i, res);
|
||||
continue;
|
||||
}
|
||||
npe->valid = 1;
|
||||
dev_info(dev, "NPE%d at 0x%08x-0x%08x registered\n",
|
||||
i, res->start, res->end);
|
||||
dev_info(dev, "NPE%d at %pR registered\n", i, res);
|
||||
found++;
|
||||
}
|
||||
|
||||
|
|
|
@ -145,12 +145,12 @@ static irqreturn_t qmgr_irq1_a0(int irq, void *pdev)
|
|||
/* ACK - it may clear any bits so don't rely on it */
|
||||
__raw_writel(0xFFFFFFFF, &qmgr_regs->irqstat[0]);
|
||||
|
||||
en_bitmap = qmgr_regs->irqen[0];
|
||||
en_bitmap = __raw_readl(&qmgr_regs->irqen[0]);
|
||||
while (en_bitmap) {
|
||||
i = __fls(en_bitmap); /* number of the last "low" queue */
|
||||
en_bitmap &= ~BIT(i);
|
||||
src = qmgr_regs->irqsrc[i >> 3];
|
||||
stat = qmgr_regs->stat1[i >> 3];
|
||||
src = __raw_readl(&qmgr_regs->irqsrc[i >> 3]);
|
||||
stat = __raw_readl(&qmgr_regs->stat1[i >> 3]);
|
||||
if (src & 4) /* the IRQ condition is inverted */
|
||||
stat = ~stat;
|
||||
if (stat & BIT(src & 3)) {
|
||||
|
@ -170,7 +170,8 @@ static irqreturn_t qmgr_irq2_a0(int irq, void *pdev)
|
|||
/* ACK - it may clear any bits so don't rely on it */
|
||||
__raw_writel(0xFFFFFFFF, &qmgr_regs->irqstat[1]);
|
||||
|
||||
req_bitmap = qmgr_regs->irqen[1] & qmgr_regs->statne_h;
|
||||
req_bitmap = __raw_readl(&qmgr_regs->irqen[1]) &
|
||||
__raw_readl(&qmgr_regs->statne_h);
|
||||
while (req_bitmap) {
|
||||
i = __fls(req_bitmap); /* number of the last "high" queue */
|
||||
req_bitmap &= ~BIT(i);
|
||||
|
|
|
@ -505,8 +505,10 @@ static int mx51_ecspi_prepare_message(struct spi_imx_data *spi_imx,
|
|||
struct spi_message *msg)
|
||||
{
|
||||
struct spi_device *spi = msg->spi;
|
||||
struct spi_transfer *xfer;
|
||||
u32 ctrl = MX51_ECSPI_CTRL_ENABLE;
|
||||
u32 testreg;
|
||||
u32 min_speed_hz = ~0U;
|
||||
u32 testreg, delay;
|
||||
u32 cfg = readl(spi_imx->base + MX51_ECSPI_CONFIG);
|
||||
|
||||
/* set Master or Slave mode */
|
||||
|
@ -567,6 +569,35 @@ static int mx51_ecspi_prepare_message(struct spi_imx_data *spi_imx,
|
|||
|
||||
writel(cfg, spi_imx->base + MX51_ECSPI_CONFIG);
|
||||
|
||||
/*
|
||||
* Wait until the changes in the configuration register CONFIGREG
|
||||
* propagate into the hardware. It takes exactly one tick of the
|
||||
* SCLK clock, but we will wait two SCLK clock just to be sure. The
|
||||
* effect of the delay it takes for the hardware to apply changes
|
||||
* is noticable if the SCLK clock run very slow. In such a case, if
|
||||
* the polarity of SCLK should be inverted, the GPIO ChipSelect might
|
||||
* be asserted before the SCLK polarity changes, which would disrupt
|
||||
* the SPI communication as the device on the other end would consider
|
||||
* the change of SCLK polarity as a clock tick already.
|
||||
*
|
||||
* Because spi_imx->spi_bus_clk is only set in bitbang prepare_message
|
||||
* callback, iterate over all the transfers in spi_message, find the
|
||||
* one with lowest bus frequency, and use that bus frequency for the
|
||||
* delay calculation. In case all transfers have speed_hz == 0, then
|
||||
* min_speed_hz is ~0 and the resulting delay is zero.
|
||||
*/
|
||||
list_for_each_entry(xfer, &msg->transfers, transfer_list) {
|
||||
if (!xfer->speed_hz)
|
||||
continue;
|
||||
min_speed_hz = min(xfer->speed_hz, min_speed_hz);
|
||||
}
|
||||
|
||||
delay = (2 * 1000000) / min_speed_hz;
|
||||
if (likely(delay < 10)) /* SCLK is faster than 100 kHz */
|
||||
udelay(delay);
|
||||
else /* SCLK is _very_ slow */
|
||||
usleep_range(delay, delay + 10);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -574,7 +605,7 @@ static int mx51_ecspi_prepare_transfer(struct spi_imx_data *spi_imx,
|
|||
struct spi_device *spi)
|
||||
{
|
||||
u32 ctrl = readl(spi_imx->base + MX51_ECSPI_CTRL);
|
||||
u32 clk, delay;
|
||||
u32 clk;
|
||||
|
||||
/* Clear BL field and set the right value */
|
||||
ctrl &= ~MX51_ECSPI_CTRL_BL_MASK;
|
||||
|
@ -596,23 +627,6 @@ static int mx51_ecspi_prepare_transfer(struct spi_imx_data *spi_imx,
|
|||
|
||||
writel(ctrl, spi_imx->base + MX51_ECSPI_CTRL);
|
||||
|
||||
/*
|
||||
* Wait until the changes in the configuration register CONFIGREG
|
||||
* propagate into the hardware. It takes exactly one tick of the
|
||||
* SCLK clock, but we will wait two SCLK clock just to be sure. The
|
||||
* effect of the delay it takes for the hardware to apply changes
|
||||
* is noticable if the SCLK clock run very slow. In such a case, if
|
||||
* the polarity of SCLK should be inverted, the GPIO ChipSelect might
|
||||
* be asserted before the SCLK polarity changes, which would disrupt
|
||||
* the SPI communication as the device on the other end would consider
|
||||
* the change of SCLK polarity as a clock tick already.
|
||||
*/
|
||||
delay = (2 * 1000000) / clk;
|
||||
if (likely(delay < 10)) /* SCLK is faster than 100 kHz */
|
||||
udelay(delay);
|
||||
else /* SCLK is _very_ slow */
|
||||
usleep_range(delay, delay + 10);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -785,6 +785,8 @@ static int meson_spicc_remove(struct platform_device *pdev)
|
|||
clk_disable_unprepare(spicc->core);
|
||||
clk_disable_unprepare(spicc->pclk);
|
||||
|
||||
spi_master_put(spicc->master);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -29,21 +29,31 @@
|
|||
#define FWBUFF_ALIGN_SZ 512
|
||||
#define MAX_DUMP_FWSZ (48 * 1024)
|
||||
|
||||
static void rtl871x_load_fw_fail(struct _adapter *adapter)
|
||||
{
|
||||
struct usb_device *udev = adapter->dvobjpriv.pusbdev;
|
||||
struct device *dev = &udev->dev;
|
||||
struct device *parent = dev->parent;
|
||||
|
||||
complete(&adapter->rtl8712_fw_ready);
|
||||
|
||||
dev_err(&udev->dev, "r8712u: Firmware request failed\n");
|
||||
|
||||
if (parent)
|
||||
device_lock(parent);
|
||||
|
||||
device_release_driver(dev);
|
||||
|
||||
if (parent)
|
||||
device_unlock(parent);
|
||||
}
|
||||
|
||||
static void rtl871x_load_fw_cb(const struct firmware *firmware, void *context)
|
||||
{
|
||||
struct _adapter *adapter = context;
|
||||
|
||||
if (!firmware) {
|
||||
struct usb_device *udev = adapter->dvobjpriv.pusbdev;
|
||||
struct usb_interface *usb_intf = adapter->pusb_intf;
|
||||
|
||||
dev_err(&udev->dev, "r8712u: Firmware request failed\n");
|
||||
usb_put_dev(udev);
|
||||
usb_set_intfdata(usb_intf, NULL);
|
||||
r8712_free_drv_sw(adapter);
|
||||
adapter->dvobj_deinit(adapter);
|
||||
complete(&adapter->rtl8712_fw_ready);
|
||||
free_netdev(adapter->pnetdev);
|
||||
rtl871x_load_fw_fail(adapter);
|
||||
return;
|
||||
}
|
||||
adapter->fw = firmware;
|
||||
|
|
|
@ -1820,3 +1820,11 @@ void LedControl871x(struct _adapter *padapter, enum LED_CTL_MODE LedAction)
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void r8712_flush_led_works(struct _adapter *padapter)
|
||||
{
|
||||
struct led_priv *pledpriv = &padapter->ledpriv;
|
||||
|
||||
flush_work(&pledpriv->SwLed0.BlinkWorkItem);
|
||||
flush_work(&pledpriv->SwLed1.BlinkWorkItem);
|
||||
}
|
||||
|
|
|
@ -112,6 +112,7 @@ struct led_priv {
|
|||
void r8712_InitSwLeds(struct _adapter *padapter);
|
||||
void r8712_DeInitSwLeds(struct _adapter *padapter);
|
||||
void LedControl871x(struct _adapter *padapter, enum LED_CTL_MODE LedAction);
|
||||
void r8712_flush_led_works(struct _adapter *padapter);
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
@ -224,3 +224,11 @@ void r8712_unregister_cmd_alive(struct _adapter *padapter)
|
|||
}
|
||||
mutex_unlock(&pwrctrl->mutex_lock);
|
||||
}
|
||||
|
||||
void r8712_flush_rwctrl_works(struct _adapter *padapter)
|
||||
{
|
||||
struct pwrctrl_priv *pwrctrl = &padapter->pwrctrlpriv;
|
||||
|
||||
flush_work(&pwrctrl->SetPSModeWorkItem);
|
||||
flush_work(&pwrctrl->rpwm_workitem);
|
||||
}
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user